claude-flow-novice 1.6.1 → 1.6.2
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/.claude/agents/cfn-loop/product-owner.md +54 -4
- package/.claude/commands/cfn-claude-sync.md +303 -0
- package/.claude/commands/cfn-loop-epic.md +290 -0
- package/.claude/commands/cfn-loop-single.md +168 -0
- package/.claude/commands/cfn-loop-sprints.md +384 -0
- package/.claude/commands/cfn-loop.md +180 -0
- package/.claude/commands/metrics-summary.md +58 -0
- package/.claude/commands/parse-epic.md +357 -0
- package/.claude/settings.json +4 -4
- package/.claude/settings.local.json +9 -2
- package/.claude-flow-novice/.claude/agents/cfn-loop/product-owner.md +792 -0
- package/.claude-flow-novice/dist/mcp/server.js +21 -2
- package/.claude-flow-novice/dist/src/api/claude-client.js +138 -3
- package/.claude-flow-novice/dist/src/api/claude-client.js.map +1 -1
- package/.claude-flow-novice/dist/src/cfn-loop/phase-orchestrator-example.js +1 -1
- package/.claude-flow-novice/dist/src/cfn-loop/scope-control.js +247 -0
- package/.claude-flow-novice/dist/src/cfn-loop/scope-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js +32 -15
- package/.claude-flow-novice/dist/src/cli/commands/swarm.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/commands/transparency.js +455 -0
- package/.claude-flow-novice/dist/src/cli/commands/transparency.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/simple-commands/init/templates/CLAUDE.md +129 -13
- package/.claude-flow-novice/dist/src/components/visualizations/index.js +9 -0
- package/.claude-flow-novice/dist/src/components/visualizations/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js +462 -0
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js +248 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js +287 -0
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/distributed-consensus.js +68 -9
- package/.claude-flow-novice/dist/src/coordination/distributed-consensus.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/feature-flags.js +166 -0
- package/.claude-flow-novice/dist/src/coordination/feature-flags.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/queen-agent.js +18 -4
- package/.claude-flow-novice/dist/src/coordination/queen-agent.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/role-assignment.js +6 -110
- package/.claude-flow-novice/dist/src/coordination/role-assignment.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/cache/artifact-cache-optimizer.js +632 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/artifact-cache-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/index.js +11 -0
- package/.claude-flow-novice/dist/src/coordination/v2/cache/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/checkpoints/checkpoint-compressor.js +318 -0
- package/.claude-flow-novice/dist/src/coordination/v2/checkpoints/checkpoint-compressor.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.example.js +364 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.js +492 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/cascading-shutdown.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/hierarchical-coordinator.js +786 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/hierarchical-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/parent-child-manager.js +342 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/parent-child-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/swarm-coordinator-v2.js +601 -0
- package/.claude-flow-novice/dist/src/coordination/v2/coordinators/swarm-coordinator-v2.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/help-request-metrics.js +211 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/help-request-metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/index.js +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/message-broker.js +365 -6
- package/.claude-flow-novice/dist/src/coordination/v2/core/message-broker.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/resource-manager-safe.js +478 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/resource-manager-safe.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine-config.js +5 -2
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine-config.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine.js +189 -0
- package/.claude-flow-novice/dist/src/coordination/v2/core/state-machine.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/deadlock-detector.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/deadlock-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/index.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/resource-manager.js +669 -0
- package/.claude-flow-novice/dist/src/coordination/v2/deadlock/resource-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/artifact-storage.js +451 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/artifact-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/cycle-detector.js +271 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/cycle-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-graph.js +335 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-graph.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-manager.js +439 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-request.js +92 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/dependency-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/index.js +21 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/topological-sort.js +223 -0
- package/.claude-flow-novice/dist/src/coordination/v2/dependency/topological-sort.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-coordinator.js +436 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-matcher.js +278 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-matcher.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request-handler.js +317 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request.js +273 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/help-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/index.js +15 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/waiting-agent-pool.js +512 -0
- package/.claude-flow-novice/dist/src/coordination/v2/help-system/waiting-agent-pool.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/index.js +6 -0
- package/.claude-flow-novice/dist/src/coordination/v2/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/integration/help-deadlock-integration.js +557 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/help-deadlock-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.example.js +212 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.js +552 -0
- package/.claude-flow-novice/dist/src/coordination/v2/integration/message-bus-completion-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/dependency-storage.js +367 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/dependency-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/index.js +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/memory/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channel.js +371 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/dependency-channel.js +355 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/dependency-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/help-channel.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/help-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/state-channel.js +295 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/state-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/task-channel.js +411 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/channels/task-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-bus.js +387 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-persistence.js +589 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-persistence.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-router.js +444 -0
- package/.claude-flow-novice/dist/src/coordination/v2/messaging/message-router.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/checkpoint-manager.js +29 -8
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/checkpoint-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/help-coordinator.js +470 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/hierarchical-background-integration.js +450 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/hierarchical-background-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/index.js +5 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/multi-level-control.js +545 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/multi-level-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-controller.js +44 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-controller.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-message-integration.js +415 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/query-message-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/session-pool-optimizer.js +615 -0
- package/.claude-flow-novice/dist/src/coordination/v2/sdk/session-pool-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/security/payload-validator.js +259 -0
- package/.claude-flow-novice/dist/src/coordination/v2/security/payload-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/index.js +17 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-integration.js +357 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-system.js +679 -0
- package/.claude-flow-novice/dist/src/coordination/v2/transparency/transparency-system.js.map +1 -0
- package/.claude-flow-novice/dist/src/core/agent-manager.js +30 -0
- package/.claude-flow-novice/dist/src/core/agent-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/mcp/server.js +21 -2
- package/.claude-flow-novice/dist/src/mcp/server.js.map +1 -1
- package/.claude-flow-novice/dist/src/observability/metrics-counter.js +268 -0
- package/.claude-flow-novice/dist/src/observability/metrics-counter.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/metrics-storage.js +265 -0
- package/.claude-flow-novice/dist/src/observability/metrics-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/observability/telemetry.js +26 -0
- package/.claude-flow-novice/dist/src/observability/telemetry.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/tiered-router.js +64 -10
- package/.claude-flow-novice/dist/src/providers/tiered-router.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/zai-provider.js +196 -97
- package/.claude-flow-novice/dist/src/providers/zai-provider.js.map +1 -1
- package/.claude-flow-novice/dist/src/slash-commands/cfn-claude-sync.js +533 -0
- package/.claude-flow-novice/dist/src/slash-commands/index.js +5 -0
- package/.claude-flow-novice/dist/src/slash-commands/metrics-summary-class.js +74 -0
- package/.claude-flow-novice/dist/src/slash-commands/metrics-summary.js +335 -0
- package/.claude-flow-novice/dist/src/slash-commands/register-all-commands.js +12 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression-demo.js +96 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression-demo.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression.js +406 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-compression.js.map +1 -0
- package/.claude-flow-novice/dist/src/verification/checkpoint-manager.js +35 -5
- package/.claude-flow-novice/dist/src/verification/checkpoint-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/web/api/config/api-config.js +186 -0
- package/.claude-flow-novice/dist/src/web/api/config/api-config.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/auth.js +205 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/auth.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/cache.js +262 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/cache.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/error-handler.js +250 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/error-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/request-logger.js +217 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/request-logger.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/validation.js +325 -0
- package/.claude-flow-novice/dist/src/web/api/middleware/validation.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/events.js +465 -0
- package/.claude-flow-novice/dist/src/web/api/routes/events.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/hierarchy.js +302 -0
- package/.claude-flow-novice/dist/src/web/api/routes/hierarchy.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/index.js +14 -0
- package/.claude-flow-novice/dist/src/web/api/routes/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/metrics.js +561 -0
- package/.claude-flow-novice/dist/src/web/api/routes/metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/routes/status.js +450 -0
- package/.claude-flow-novice/dist/src/web/api/routes/status.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/api/server.js +451 -0
- package/.claude-flow-novice/dist/src/web/api/server.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/hooks/useWebSocket.js +385 -0
- package/.claude-flow-novice/dist/src/web/dashboard/hooks/useWebSocket.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/index.js +87 -0
- package/.claude-flow-novice/dist/src/web/dashboard/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/web/dashboard/types.js +6 -0
- package/.claude-flow-novice/dist/src/web/dashboard/types.js.map +1 -0
- package/.claude-flow-novice/metrics.db +0 -0
- package/.claude-flow-novice/metrics.db-shm +0 -0
- package/.claude-flow-novice/metrics.db-wal +0 -0
- package/CLAUDE.md +29 -0
- package/README.md +27 -0
- package/config/hooks/post-edit-pipeline.js +36 -2
- package/examples/metrics-counter-demo.ts +106 -0
- package/examples/persistent-metrics-demo.ts +83 -0
- package/examples/phase-5-multi-level-control.ts +282 -0
- package/examples/session-pool-optimizer-example.ts +311 -0
- package/package.json +15 -3
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/test-provider-routing.cjs +228 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +29 -0
- package/src/observability/metrics-counter.ts +347 -0
- package/src/observability/metrics-storage.ts +356 -0
- package/src/observability/telemetry.ts +658 -0
- package/src/slash-commands/cfn-claude-sync.js +533 -0
- package/src/slash-commands/index.js +5 -0
- package/src/slash-commands/metrics-summary-class.js +74 -0
- package/src/slash-commands/metrics-summary.js +335 -0
- package/src/slash-commands/register-all-commands.js +12 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Coordination V2 - Message Router (Channel-Based)
|
|
3
|
+
*
|
|
4
|
+
* Priority queue-based message router for channel abstraction.
|
|
5
|
+
* Routes messages to channels with fairness guarantees and ordering preservation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Priority queue routing (high priority messages delivered first)
|
|
9
|
+
* - Channel-based isolation (4 specialized channels)
|
|
10
|
+
* - Fairness guarantees (prevent channel starvation)
|
|
11
|
+
* - Message ordering per channel (FIFO within channel)
|
|
12
|
+
* - Backpressure coordination across channels
|
|
13
|
+
*
|
|
14
|
+
* @module coordination/v2/messaging/message-router
|
|
15
|
+
*/ import { PriorityQueue } from '../utils/priority-queue.js';
|
|
16
|
+
import { Channel, BackpressurePolicy } from './channel.js';
|
|
17
|
+
import { EventEmitter } from 'events';
|
|
18
|
+
/**
|
|
19
|
+
* Channel type enumeration.
|
|
20
|
+
* Defines the 4 specialized channels for agent coordination.
|
|
21
|
+
*/ export var ChannelType = /*#__PURE__*/ function(ChannelType) {
|
|
22
|
+
/** Coordination messages (agent status, lifecycle) */ ChannelType["COORDINATION"] = "coordination";
|
|
23
|
+
/** Task execution messages (task assignment, completion) */ ChannelType["TASK"] = "task";
|
|
24
|
+
/** Help system messages (help requests, matches) */ ChannelType["HELP"] = "help";
|
|
25
|
+
/** Event notifications (system events, alerts) */ ChannelType["EVENT"] = "event";
|
|
26
|
+
return ChannelType;
|
|
27
|
+
}({});
|
|
28
|
+
/**
|
|
29
|
+
* Router events.
|
|
30
|
+
*/ export var RouterEvent = /*#__PURE__*/ function(RouterEvent) {
|
|
31
|
+
/** Message routed to channel */ RouterEvent["MESSAGE_ROUTED"] = "message-routed";
|
|
32
|
+
/** Message dropped (no matching route) */ RouterEvent["MESSAGE_DROPPED"] = "message-dropped";
|
|
33
|
+
/** Backpressure threshold exceeded */ RouterEvent["BACKPRESSURE"] = "backpressure";
|
|
34
|
+
/** Router error */ RouterEvent["ERROR"] = "error";
|
|
35
|
+
return RouterEvent;
|
|
36
|
+
}({});
|
|
37
|
+
/**
|
|
38
|
+
* MessageRouter - Priority queue routing with channel isolation.
|
|
39
|
+
*
|
|
40
|
+
* Routes messages to specialized channels based on topic patterns,
|
|
41
|
+
* with priority queue ordering and fairness guarantees to prevent
|
|
42
|
+
* channel starvation.
|
|
43
|
+
*
|
|
44
|
+
* Architecture:
|
|
45
|
+
* - Global priority queue (all incoming messages)
|
|
46
|
+
* - 4 specialized channels (coordination, task, help, event)
|
|
47
|
+
* - Round-robin fairness scheduler
|
|
48
|
+
* - Per-channel FIFO ordering
|
|
49
|
+
*
|
|
50
|
+
* Performance:
|
|
51
|
+
* - route(): O(log n) for priority queue + O(1) channel lookup
|
|
52
|
+
* - processQueue(): O(k * q) where k = channel count, q = fairness quantum
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const router = new MessageRouter({
|
|
57
|
+
* enableFairness: true,
|
|
58
|
+
* fairnessQuantum: 10
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* // Route messages
|
|
62
|
+
* router.route({
|
|
63
|
+
* id: 'msg-1',
|
|
64
|
+
* topic: 'agent.status',
|
|
65
|
+
* payload: { agentId: 'agent-1', status: 'online' },
|
|
66
|
+
* priority: 5,
|
|
67
|
+
* timestamp: Date.now()
|
|
68
|
+
* });
|
|
69
|
+
*
|
|
70
|
+
* // Process router queue
|
|
71
|
+
* await router.processQueue();
|
|
72
|
+
* ```
|
|
73
|
+
*/ export class MessageRouter extends EventEmitter {
|
|
74
|
+
/** Configuration */ config;
|
|
75
|
+
/** Priority queue for incoming messages */ incomingQueue;
|
|
76
|
+
/** Channel instances by type */ channels;
|
|
77
|
+
/** Routing rules (pattern -> channel type) */ routingRules;
|
|
78
|
+
/** Statistics tracking */ stats;
|
|
79
|
+
/** Fairness scheduler state (last channel processed) */ fairnessState;
|
|
80
|
+
/** Processing lock */ isProcessing;
|
|
81
|
+
constructor(config = {}){
|
|
82
|
+
super();
|
|
83
|
+
this.config = {
|
|
84
|
+
channels: config.channels ?? {},
|
|
85
|
+
customRules: config.customRules ?? [],
|
|
86
|
+
enableFairness: config.enableFairness ?? true,
|
|
87
|
+
fairnessQuantum: config.fairnessQuantum ?? 10,
|
|
88
|
+
maxPendingMessages: config.maxPendingMessages ?? 5000
|
|
89
|
+
};
|
|
90
|
+
this.incomingQueue = new PriorityQueue();
|
|
91
|
+
this.channels = new Map();
|
|
92
|
+
this.routingRules = [];
|
|
93
|
+
this.isProcessing = false;
|
|
94
|
+
this.stats = {
|
|
95
|
+
totalRouted: 0,
|
|
96
|
+
totalDropped: 0,
|
|
97
|
+
messagesByChannel: new Map(),
|
|
98
|
+
routingLatencies: []
|
|
99
|
+
};
|
|
100
|
+
this.fairnessState = {
|
|
101
|
+
lastChannelIndex: -1,
|
|
102
|
+
channelOrder: [
|
|
103
|
+
"coordination",
|
|
104
|
+
"task",
|
|
105
|
+
"help",
|
|
106
|
+
"event"
|
|
107
|
+
]
|
|
108
|
+
};
|
|
109
|
+
this.initializeChannels();
|
|
110
|
+
this.initializeRoutingRules();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Initialize the 4 specialized channels.
|
|
114
|
+
*/ initializeChannels() {
|
|
115
|
+
// Coordination channel (agent status, lifecycle)
|
|
116
|
+
this.channels.set("coordination", new Channel({
|
|
117
|
+
channelId: 'coordination',
|
|
118
|
+
name: 'Coordination Channel',
|
|
119
|
+
capacity: 1000,
|
|
120
|
+
backpressurePolicy: BackpressurePolicy.DROP_OLDEST,
|
|
121
|
+
priority: 8,
|
|
122
|
+
...this.config.channels["coordination"]
|
|
123
|
+
}));
|
|
124
|
+
// Task channel (task execution, completion)
|
|
125
|
+
this.channels.set("task", new Channel({
|
|
126
|
+
channelId: 'task',
|
|
127
|
+
name: 'Task Channel',
|
|
128
|
+
capacity: 2000,
|
|
129
|
+
backpressurePolicy: BackpressurePolicy.DROP_OLDEST,
|
|
130
|
+
priority: 7,
|
|
131
|
+
...this.config.channels["task"]
|
|
132
|
+
}));
|
|
133
|
+
// Help channel (help requests, matching)
|
|
134
|
+
this.channels.set("help", new Channel({
|
|
135
|
+
channelId: 'help',
|
|
136
|
+
name: 'Help Channel',
|
|
137
|
+
capacity: 500,
|
|
138
|
+
backpressurePolicy: BackpressurePolicy.DROP_NEWEST,
|
|
139
|
+
priority: 9,
|
|
140
|
+
...this.config.channels["help"]
|
|
141
|
+
}));
|
|
142
|
+
// Event channel (notifications, alerts)
|
|
143
|
+
this.channels.set("event", new Channel({
|
|
144
|
+
channelId: 'event',
|
|
145
|
+
name: 'Event Channel',
|
|
146
|
+
capacity: 1500,
|
|
147
|
+
backpressurePolicy: BackpressurePolicy.DROP_OLDEST,
|
|
148
|
+
priority: 5,
|
|
149
|
+
...this.config.channels["event"]
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Initialize default routing rules.
|
|
154
|
+
*/ initializeRoutingRules() {
|
|
155
|
+
// Add custom rules first (higher priority)
|
|
156
|
+
this.routingRules.push(...this.config.customRules);
|
|
157
|
+
// Default routing rules (pattern matching)
|
|
158
|
+
const defaultRules = [
|
|
159
|
+
// Coordination patterns
|
|
160
|
+
{
|
|
161
|
+
pattern: 'agent.*',
|
|
162
|
+
channelType: "coordination",
|
|
163
|
+
priority: 100
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
pattern: 'coordinator.*',
|
|
167
|
+
channelType: "coordination",
|
|
168
|
+
priority: 100
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
pattern: 'session.*',
|
|
172
|
+
channelType: "coordination",
|
|
173
|
+
priority: 100
|
|
174
|
+
},
|
|
175
|
+
// Task patterns
|
|
176
|
+
{
|
|
177
|
+
pattern: 'task.*',
|
|
178
|
+
channelType: "task",
|
|
179
|
+
priority: 90
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
pattern: 'job.*',
|
|
183
|
+
channelType: "task",
|
|
184
|
+
priority: 90
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
pattern: 'execution.*',
|
|
188
|
+
channelType: "task",
|
|
189
|
+
priority: 90
|
|
190
|
+
},
|
|
191
|
+
// Help patterns
|
|
192
|
+
{
|
|
193
|
+
pattern: 'help.*',
|
|
194
|
+
channelType: "help",
|
|
195
|
+
priority: 95
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
pattern: 'assistance.*',
|
|
199
|
+
channelType: "help",
|
|
200
|
+
priority: 95
|
|
201
|
+
},
|
|
202
|
+
// Event patterns (catch-all)
|
|
203
|
+
{
|
|
204
|
+
pattern: '*',
|
|
205
|
+
channelType: "event",
|
|
206
|
+
priority: 0
|
|
207
|
+
}
|
|
208
|
+
];
|
|
209
|
+
this.routingRules.push(...defaultRules);
|
|
210
|
+
// Sort by priority (highest first)
|
|
211
|
+
this.routingRules.sort((a, b)=>b.priority - a.priority);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Route a message to appropriate channel.
|
|
215
|
+
*
|
|
216
|
+
* @param message - Message to route
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```typescript
|
|
220
|
+
* router.route({
|
|
221
|
+
* id: 'msg-1',
|
|
222
|
+
* topic: 'task.completed',
|
|
223
|
+
* payload: { taskId: 'task-1', result: 'success' },
|
|
224
|
+
* priority: 5,
|
|
225
|
+
* timestamp: Date.now()
|
|
226
|
+
* });
|
|
227
|
+
* ```
|
|
228
|
+
*/ route(message) {
|
|
229
|
+
// Check backpressure threshold
|
|
230
|
+
if (this.incomingQueue.size() >= this.config.maxPendingMessages) {
|
|
231
|
+
this.stats.totalDropped++;
|
|
232
|
+
this.emit("backpressure", {
|
|
233
|
+
pendingMessages: this.incomingQueue.size(),
|
|
234
|
+
maxPending: this.config.maxPendingMessages,
|
|
235
|
+
droppedMessageId: message.id
|
|
236
|
+
});
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
// Add to priority queue
|
|
240
|
+
this.incomingQueue.enqueue(message, message.priority);
|
|
241
|
+
// Auto-process if not already processing
|
|
242
|
+
if (!this.isProcessing) {
|
|
243
|
+
setImmediate(()=>this.processQueue());
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Process incoming message queue and route to channels.
|
|
248
|
+
*
|
|
249
|
+
* @returns Number of messages routed
|
|
250
|
+
*/ async processQueue() {
|
|
251
|
+
if (this.isProcessing) {
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
this.isProcessing = true;
|
|
255
|
+
let routedCount = 0;
|
|
256
|
+
try {
|
|
257
|
+
// Route all pending messages
|
|
258
|
+
while(!this.incomingQueue.isEmpty()){
|
|
259
|
+
const message = this.incomingQueue.dequeue();
|
|
260
|
+
if (!message) break;
|
|
261
|
+
const startTime = performance.now();
|
|
262
|
+
// Find matching channel
|
|
263
|
+
const channelType = this.findChannelForMessage(message);
|
|
264
|
+
if (!channelType) {
|
|
265
|
+
// No matching rule - drop message
|
|
266
|
+
this.stats.totalDropped++;
|
|
267
|
+
this.emit("message-dropped", {
|
|
268
|
+
messageId: message.id,
|
|
269
|
+
topic: message.topic,
|
|
270
|
+
reason: 'no-matching-route'
|
|
271
|
+
});
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
// Route to channel
|
|
275
|
+
const channel = this.channels.get(channelType);
|
|
276
|
+
if (channel) {
|
|
277
|
+
channel.publish(message);
|
|
278
|
+
routedCount++;
|
|
279
|
+
// Update statistics
|
|
280
|
+
this.stats.totalRouted++;
|
|
281
|
+
this.stats.messagesByChannel.set(channelType, (this.stats.messagesByChannel.get(channelType) ?? 0) + 1);
|
|
282
|
+
const latency = performance.now() - startTime;
|
|
283
|
+
this.stats.routingLatencies.push(latency);
|
|
284
|
+
// Keep only last 1000 latencies
|
|
285
|
+
if (this.stats.routingLatencies.length > 1000) {
|
|
286
|
+
this.stats.routingLatencies.shift();
|
|
287
|
+
}
|
|
288
|
+
this.emit("message-routed", {
|
|
289
|
+
messageId: message.id,
|
|
290
|
+
topic: message.topic,
|
|
291
|
+
channelType,
|
|
292
|
+
latencyMs: latency
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Process channels with fairness guarantees
|
|
297
|
+
if (this.config.enableFairness) {
|
|
298
|
+
await this.processFairScheduler();
|
|
299
|
+
} else {
|
|
300
|
+
// Process all channels in priority order
|
|
301
|
+
await this.processAllChannels();
|
|
302
|
+
}
|
|
303
|
+
} finally{
|
|
304
|
+
this.isProcessing = false;
|
|
305
|
+
}
|
|
306
|
+
return routedCount;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Find appropriate channel for message based on routing rules.
|
|
310
|
+
*
|
|
311
|
+
* @param message - Message to route
|
|
312
|
+
* @returns Channel type or null if no match
|
|
313
|
+
*/ findChannelForMessage(message) {
|
|
314
|
+
for (const rule of this.routingRules){
|
|
315
|
+
if (this.matchesPattern(message.topic, rule.pattern)) {
|
|
316
|
+
return rule.channelType;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Match topic against pattern (supports * wildcard).
|
|
323
|
+
*
|
|
324
|
+
* @param topic - Message topic
|
|
325
|
+
* @param pattern - Pattern with wildcards
|
|
326
|
+
* @returns True if topic matches pattern
|
|
327
|
+
*/ matchesPattern(topic, pattern) {
|
|
328
|
+
if (pattern === '*') {
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
const regexPattern = pattern.replace(/\./g, '\\.').replace(/\*/g, '.*');
|
|
332
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
333
|
+
return regex.test(topic);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Process channels with fairness scheduler.
|
|
337
|
+
* Round-robin with quantum-based processing.
|
|
338
|
+
*/ async processFairScheduler() {
|
|
339
|
+
const quantum = this.config.fairnessQuantum;
|
|
340
|
+
// Process each channel in round-robin order
|
|
341
|
+
for(let i = 0; i < this.fairnessState.channelOrder.length; i++){
|
|
342
|
+
const channelType = this.fairnessState.channelOrder[i];
|
|
343
|
+
const channel = this.channels.get(channelType);
|
|
344
|
+
if (channel && channel.getBufferSize() > 0) {
|
|
345
|
+
// Process up to quantum messages from this channel
|
|
346
|
+
let processed = 0;
|
|
347
|
+
while(processed < quantum && channel.getBufferSize() > 0){
|
|
348
|
+
await channel.processBuffer();
|
|
349
|
+
processed++;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Process all channels in priority order (no fairness).
|
|
356
|
+
*/ async processAllChannels() {
|
|
357
|
+
// Get channels sorted by priority (highest first)
|
|
358
|
+
const sortedChannels = Array.from(this.channels.entries()).sort(([, a], [, b])=>b.priority - a.priority);
|
|
359
|
+
for (const [, channel] of sortedChannels){
|
|
360
|
+
await channel.processBuffer();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Get channel by type.
|
|
365
|
+
*
|
|
366
|
+
* @param channelType - Channel type
|
|
367
|
+
* @returns Channel instance or undefined
|
|
368
|
+
*/ getChannel(channelType) {
|
|
369
|
+
return this.channels.get(channelType);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get all channels.
|
|
373
|
+
*
|
|
374
|
+
* @returns Map of channel type to channel instance
|
|
375
|
+
*/ getAllChannels() {
|
|
376
|
+
return new Map(this.channels);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get router statistics.
|
|
380
|
+
*
|
|
381
|
+
* @returns Router statistics
|
|
382
|
+
*/ getStats() {
|
|
383
|
+
const avgRoutingLatencyMs = this.stats.routingLatencies.length > 0 ? this.stats.routingLatencies.reduce((sum, l)=>sum + l, 0) / this.stats.routingLatencies.length : 0;
|
|
384
|
+
const messagesByChannel = {
|
|
385
|
+
["coordination"]: this.stats.messagesByChannel.get("coordination") ?? 0,
|
|
386
|
+
["task"]: this.stats.messagesByChannel.get("task") ?? 0,
|
|
387
|
+
["help"]: this.stats.messagesByChannel.get("help") ?? 0,
|
|
388
|
+
["event"]: this.stats.messagesByChannel.get("event") ?? 0
|
|
389
|
+
};
|
|
390
|
+
const channelStats = {};
|
|
391
|
+
for (const type of Object.values(ChannelType)){
|
|
392
|
+
const channel = this.channels.get(type);
|
|
393
|
+
if (channel) {
|
|
394
|
+
const stats = channel.getStats();
|
|
395
|
+
channelStats[type] = {
|
|
396
|
+
buffered: stats.currentBufferSize,
|
|
397
|
+
delivered: stats.totalDelivered,
|
|
398
|
+
dropped: stats.totalDropped,
|
|
399
|
+
subscribers: stats.totalSubscriptions
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return {
|
|
404
|
+
totalRouted: this.stats.totalRouted,
|
|
405
|
+
totalDropped: this.stats.totalDropped,
|
|
406
|
+
messagesByChannel,
|
|
407
|
+
pendingMessages: this.incomingQueue.size(),
|
|
408
|
+
avgRoutingLatencyMs,
|
|
409
|
+
channelStats
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Clear all channels and reset router.
|
|
414
|
+
*/ clear() {
|
|
415
|
+
this.incomingQueue.clear();
|
|
416
|
+
for (const type of Object.values(ChannelType)){
|
|
417
|
+
const channel = this.channels.get(type);
|
|
418
|
+
if (channel) {
|
|
419
|
+
channel.clearBuffer();
|
|
420
|
+
channel.resetStats();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
this.stats = {
|
|
424
|
+
totalRouted: 0,
|
|
425
|
+
totalDropped: 0,
|
|
426
|
+
messagesByChannel: new Map(),
|
|
427
|
+
routingLatencies: []
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Shutdown router and close all channels.
|
|
432
|
+
*/ shutdown() {
|
|
433
|
+
this.clear();
|
|
434
|
+
for (const type of Object.values(ChannelType)){
|
|
435
|
+
const channel = this.channels.get(type);
|
|
436
|
+
if (channel) {
|
|
437
|
+
channel.close();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
this.removeAllListeners();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
//# sourceMappingURL=message-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/coordination/v2/messaging/message-router.ts"],"names":["PriorityQueue","Channel","BackpressurePolicy","EventEmitter","ChannelType","RouterEvent","MessageRouter","config","incomingQueue","channels","routingRules","stats","fairnessState","isProcessing","customRules","enableFairness","fairnessQuantum","maxPendingMessages","Map","totalRouted","totalDropped","messagesByChannel","routingLatencies","lastChannelIndex","channelOrder","initializeChannels","initializeRoutingRules","set","channelId","name","capacity","backpressurePolicy","DROP_OLDEST","priority","DROP_NEWEST","push","defaultRules","pattern","channelType","sort","a","b","route","message","size","emit","pendingMessages","maxPending","droppedMessageId","id","enqueue","setImmediate","processQueue","routedCount","isEmpty","dequeue","startTime","performance","now","findChannelForMessage","messageId","topic","reason","channel","get","publish","latency","length","shift","latencyMs","processFairScheduler","processAllChannels","rule","matchesPattern","regexPattern","replace","regex","RegExp","test","quantum","i","getBufferSize","processed","processBuffer","sortedChannels","Array","from","entries","getChannel","getAllChannels","getStats","avgRoutingLatencyMs","reduce","sum","l","channelStats","type","Object","values","buffered","currentBufferSize","delivered","totalDelivered","dropped","subscribers","totalSubscriptions","clear","clearBuffer","resetStats","shutdown","close","removeAllListeners"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { promises as fs } from 'fs';
|
|
|
13
13
|
import * as path from 'path';
|
|
14
14
|
import * as msgpack from 'msgpack-lite';
|
|
15
15
|
import { AgentState } from '../types/sdk.js';
|
|
16
|
+
import { CheckpointCompressor } from '../checkpoints/checkpoint-compressor.js';
|
|
16
17
|
export class CheckpointManager {
|
|
17
18
|
MAX_IN_MEMORY_CHECKPOINTS = 100;
|
|
18
19
|
checkpoints = new Map();
|
|
@@ -31,9 +32,11 @@ export class CheckpointManager {
|
|
|
31
32
|
retentionHours = 24;
|
|
32
33
|
restoredCheckpoints = new Set();
|
|
33
34
|
maxCheckpointAge = 3600000;
|
|
35
|
+
compressor;
|
|
34
36
|
constructor(storagePath = '.claude-flow/checkpoints/v2', retentionHours = 24){
|
|
35
37
|
this.storagePath = storagePath;
|
|
36
38
|
this.retentionHours = retentionHours;
|
|
39
|
+
this.compressor = new CheckpointCompressor();
|
|
37
40
|
this.metrics = {
|
|
38
41
|
totalCheckpoints: 0,
|
|
39
42
|
totalRestores: 0,
|
|
@@ -76,12 +79,15 @@ export class CheckpointManager {
|
|
|
76
79
|
const startTime = performance.now();
|
|
77
80
|
const checkpointId = this.generateCheckpointId(sessionId, messageUUID);
|
|
78
81
|
const timestamp = Date.now();
|
|
79
|
-
//
|
|
80
|
-
const
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
const
|
|
82
|
+
// Get previous checkpoint for delta compression
|
|
83
|
+
const previousCheckpointData = this.getLatestCheckpointData(sessionId);
|
|
84
|
+
const previousCheckpointId = previousCheckpointData?.id;
|
|
85
|
+
// Use multi-layer compression: MessagePack + Delta + Gzip
|
|
86
|
+
const compressionResult = await this.compressor.compress(stateSnapshot, sessionId, previousCheckpointId);
|
|
87
|
+
const compressedBuffer = compressionResult.compressedBuffer;
|
|
88
|
+
const compressedSize = compressionResult.compressedSize;
|
|
89
|
+
const uncompressedSize = compressionResult.uncompressedSize;
|
|
90
|
+
const compressionRatio = compressionResult.compressionRatio;
|
|
85
91
|
// Calculate checksum for integrity verification
|
|
86
92
|
const checksum = this.calculateChecksum(stateSnapshot);
|
|
87
93
|
const checkpoint = {
|
|
@@ -299,7 +305,8 @@ export class CheckpointManager {
|
|
|
299
305
|
const now = Date.now();
|
|
300
306
|
const retentionMs = this.retentionHours * 60 * 60 * 1000;
|
|
301
307
|
let deletedCount = 0;
|
|
302
|
-
|
|
308
|
+
const entries = Array.from(this.checkpoints.entries());
|
|
309
|
+
for (const [checkpointId, checkpoint] of entries){
|
|
303
310
|
const age = now - checkpoint.timestamp;
|
|
304
311
|
if (age > retentionMs) {
|
|
305
312
|
await this.deleteCheckpoint(checkpointId);
|
|
@@ -318,6 +325,19 @@ export class CheckpointManager {
|
|
|
318
325
|
};
|
|
319
326
|
}
|
|
320
327
|
/**
|
|
328
|
+
* Get compression details for a specific checkpoint (for testing)
|
|
329
|
+
*/ getCheckpointCompressionDetails(checkpointId) {
|
|
330
|
+
const checkpoint = this.checkpoints.get(checkpointId);
|
|
331
|
+
if (!checkpoint) {
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
compressedSize: checkpoint.compressedSize,
|
|
336
|
+
uncompressedSize: checkpoint.uncompressedSize,
|
|
337
|
+
compressionRatio: 1 - checkpoint.compressedSize / checkpoint.uncompressedSize
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
321
341
|
* Enable/disable auto-checkpointing
|
|
322
342
|
*/ setAutoCheckpointEnabled(enabled) {
|
|
323
343
|
this.autoCheckpointEnabled = enabled;
|
|
@@ -806,7 +826,8 @@ export class CheckpointManager {
|
|
|
806
826
|
*/ getMemoryStats() {
|
|
807
827
|
const now = Date.now();
|
|
808
828
|
let oldestAge = 0;
|
|
809
|
-
|
|
829
|
+
const values = Array.from(this.checkpoints.values());
|
|
830
|
+
for (const checkpoint of values){
|
|
810
831
|
const age = now - checkpoint.timestamp;
|
|
811
832
|
oldestAge = Math.max(oldestAge, age);
|
|
812
833
|
}
|