claude-flow-novice 1.6.4 → 1.6.6
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/commands/parse-epic.js +180 -0
- package/.claude/settings.local.json +2 -1
- package/.claude-flow-novice/dist/mcp/mcp-server-novice.js +37 -2
- package/.claude-flow-novice/dist/mcp/mcp-server-sdk.js +45 -0
- package/.claude-flow-novice/dist/mcp/transports/base.js +5 -0
- package/.claude-flow-novice/dist/mcp/transports/base.js.map +1 -0
- package/.claude-flow-novice/dist/mcp/transports/http.js +414 -0
- package/.claude-flow-novice/dist/mcp/transports/http.js.map +1 -0
- package/.claude-flow-novice/dist/mcp/transports/stdio.js +217 -0
- package/.claude-flow-novice/dist/mcp/transports/stdio.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/commands/parse-epic.js +129 -0
- package/.claude-flow-novice/dist/src/cli/commands/parse-epic.js.map +1 -0
- package/.claude-flow-novice/dist/src/cli/index.js +3 -0
- package/.claude-flow-novice/dist/src/cli/index.js.map +1 -1
- package/.claude-flow-novice/dist/src/cli/utils/epic-parser.js +266 -0
- package/.claude-flow-novice/dist/src/cli/utils/epic-parser.js.map +1 -0
- package/.claude-flow-novice/dist/src/communication/message-bus.js +105 -2
- package/.claude-flow-novice/dist/src/communication/message-bus.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js +1 -1
- package/.claude-flow-novice/dist/src/coordination/adapters/v1-coordinator-adapter.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/cache/artifact-cache-optimizer.js +632 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/cache/artifact-cache-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/cache/index.js +11 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/cache/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/checkpoints/checkpoint-compressor.js +318 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/checkpoints/checkpoint-compressor.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/completion-detector.js +234 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/completion-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/hierarchical-detector.js +347 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/hierarchical-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/index.js +13 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/lamport-clock.js +173 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/lamport-clock.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/mesh-detector.js +526 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/mesh-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/sdk-completion-detector.js +443 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/sdk-completion-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/swarm-shutdown.js +366 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/completion/swarm-shutdown.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinator-factory.js +287 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinator-factory.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/cascading-shutdown.example.js +364 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/cascading-shutdown.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/cascading-shutdown.js +492 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/cascading-shutdown.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/hierarchical-coordinator.js +786 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/hierarchical-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/parent-child-manager.js +342 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/parent-child-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/swarm-coordinator-v2.js +601 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/coordinators/swarm-coordinator-v2.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/agent-state.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/agent-state.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dead-letter-queue.js +413 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dead-letter-queue.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dependency-graph.js +471 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dependency-graph.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dependency-node.js +379 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dependency-node.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dependency-resolver.js +335 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/dependency-resolver.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/help-request-metrics.js +211 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/help-request-metrics.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/index.js +33 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/message-broker.js +920 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/message-broker.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/message-router.js +385 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/message-router.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/message.js +138 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/message.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/resource-manager-safe.js +478 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/resource-manager-safe.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/state-machine-config.js +358 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/state-machine-config.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/state-machine.js +588 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/state-machine.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/state-transition.js +153 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/state-transition.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/task-scheduler.js +360 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/task-scheduler.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/topic-manager.js +337 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/core/topic-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/deadlock/deadlock-detector.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/deadlock/deadlock-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/deadlock/index.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/deadlock/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/deadlock/resource-manager.js +669 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/deadlock/resource-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/artifact-storage.js +451 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/artifact-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/cycle-detector.js +271 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/cycle-detector.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/dependency-graph.js +335 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/dependency-graph.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/dependency-manager.js +439 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/dependency-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/dependency-request.js +92 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/dependency-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/index.js +21 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/topological-sort.js +223 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/dependency/topological-sort.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-coordinator.js +436 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-matcher.js +278 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-matcher.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-request-handler.js +317 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-request-handler.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-request.js +273 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/help-request.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/index.js +15 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/waiting-agent-pool.js +512 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/help-system/waiting-agent-pool.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/index.js +67 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/help-deadlock-integration.js +557 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/help-deadlock-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/message-bus-completion-integration.example.js +212 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/message-bus-completion-integration.example.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/message-bus-completion-integration.js +552 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/message-bus-completion-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/state-machine-integration.js +635 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/integration/state-machine-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/IArtifactStorage.js +28 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/IArtifactStorage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/ICoordinator.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/ICoordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/ISessionStore.js +25 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/ISessionStore.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/interfaces/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/artifact-adapter.js +308 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/artifact-adapter.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/completion-storage.js +439 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/completion-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/dependency-graph-storage.js +540 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/dependency-graph-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/dependency-storage.js +367 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/dependency-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/message-storage.js +518 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/message-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/state-storage.js +377 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/memory/state-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channel.js +371 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/dependency-channel.js +355 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/dependency-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/help-channel.js +424 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/help-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/index.js +16 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/state-channel.js +295 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/state-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/task-channel.js +411 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/channels/task-channel.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/index.js +14 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/message-bus.js +387 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/message-bus.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/message-persistence.js +589 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/message-persistence.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/message-router.js +444 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/messaging/message-router.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/artifact-storage.js +560 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/artifact-storage.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/background-orchestrator.js +335 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/background-orchestrator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/bash-output-monitor.js +104 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/bash-output-monitor.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/checkpoint-manager.js +847 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/checkpoint-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/help-coordinator.js +470 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/help-coordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/hierarchical-background-integration.js +450 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/hierarchical-background-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/index.js +13 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/message-bus-integration.js +625 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/message-bus-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/multi-level-control.js +545 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/multi-level-control.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/query-controller.js +740 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/query-controller.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/query-message-integration.js +415 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/query-message-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/session-pool-optimizer.js +615 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/session-pool-optimizer.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/state-machine-integration.js +547 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/state-machine-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/state-sdk-integration.js +342 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/sdk/state-sdk-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/security/payload-validator.js +259 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/security/payload-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/framework-registry.js +273 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/framework-registry.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/index.js +8 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/truth-config-manager.js +310 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/truth-config-manager.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/truth-validator.js +218 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/truth/truth-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/types/sdk.js +9 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/types/sdk.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/utils/index.js +6 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/utils/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/utils/priority-queue.js +145 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/utils/priority-queue.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/utils/sdk-helpers.js +122 -0
- package/.claude-flow-novice/dist/src/coordination/archives/v2-sdk-typescript/v2/utils/sdk-helpers.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/config-translator.js +17 -43
- package/.claude-flow-novice/dist/src/coordination/config-translator.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js +34 -76
- package/.claude-flow-novice/dist/src/coordination/coordination-toggle.js.map +1 -1
- package/.claude-flow-novice/dist/src/coordination/shared/core/agent-state.js +172 -0
- package/.claude-flow-novice/dist/src/coordination/shared/core/agent-state.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/core/index.js +7 -0
- package/.claude-flow-novice/dist/src/coordination/shared/core/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/index.js +19 -0
- package/.claude-flow-novice/dist/src/coordination/shared/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/interfaces/ICoordinator.js +24 -0
- package/.claude-flow-novice/dist/src/coordination/shared/interfaces/ICoordinator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/interfaces/index.js +7 -0
- package/.claude-flow-novice/dist/src/coordination/shared/interfaces/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/message-broker.js +920 -0
- package/.claude-flow-novice/dist/src/coordination/shared/message-broker.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/message.js +138 -0
- package/.claude-flow-novice/dist/src/coordination/shared/message.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/security/payload-validator.js +259 -0
- package/.claude-flow-novice/dist/src/coordination/shared/security/payload-validator.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/index.js +17 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/interfaces/transparency-system.js +19 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/interfaces/transparency-system.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/transparency-integration.js +357 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/transparency-integration.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/transparency-system.js +679 -0
- package/.claude-flow-novice/dist/src/coordination/shared/transparency/transparency-system.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/types/index.js +7 -0
- package/.claude-flow-novice/dist/src/coordination/shared/types/index.js.map +1 -0
- package/.claude-flow-novice/dist/src/coordination/shared/types/sdk.js +10 -0
- package/.claude-flow-novice/dist/src/coordination/shared/types/sdk.js.map +1 -0
- package/.claude-flow-novice/dist/src/feature-flags/core/FeatureFlagManager.js +52 -2
- package/.claude-flow-novice/dist/src/feature-flags/core/FeatureFlagManager.js.map +1 -1
- package/.claude-flow-novice/dist/src/mcp/mcp-server-novice.js +37 -2
- package/.claude-flow-novice/dist/src/mcp/session-manager.js +3 -1
- package/.claude-flow-novice/dist/src/mcp/session-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/providers/provider-manager.js +36 -3
- package/.claude-flow-novice/dist/src/providers/provider-manager.js.map +1 -1
- package/.claude-flow-novice/dist/src/utils/markdown-sanitizer.js +65 -41
- package/.claude-flow-novice/dist/src/utils/markdown-sanitizer.js.map +1 -1
- package/.claude-flow-novice/dist/src/web/api/server.js +1 -1
- package/.claude-flow-novice/dist/src/web/api/server.js.map +1 -1
- package/.claude-flow-novice/dist/src/workflows/progressive-rollout-manager.js +30 -0
- package/.claude-flow-novice/dist/src/workflows/progressive-rollout-manager.js.map +1 -1
- package/.claude-flow-novice/metrics.db-shm +0 -0
- package/.claude-flow-novice/metrics.db-wal +0 -0
- package/config/.env.example +178 -0
- package/config/DEPLOYMENT_GUIDE.md +692 -0
- package/config/README-CONFIG.md +331 -0
- package/config/coordination-config.sh +327 -0
- package/config/docker/env.development +53 -0
- package/config/docker/env.production +83 -0
- package/config/docker/env.staging +70 -0
- package/config/k8s/configmap-development.yaml +60 -0
- package/config/k8s/configmap-production.yaml +85 -0
- package/config/k8s/configmap-staging.yaml +76 -0
- package/config/k8s/secret-production.yaml +62 -0
- package/config/k8s/secret-staging.yaml +36 -0
- package/package.json +2 -2
- package/scripts/monitoring/alert-monitor.sh +220 -0
- package/scripts/monitoring/dashboards/rate-limiting-dashboard.json +211 -0
- package/scripts/monitoring/quick-test-alerting.sh +118 -0
- package/scripts/monitoring/quick-test-rate-limiting.sh +206 -0
- package/scripts/monitoring/rate-limiting-monitor.sh +380 -0
- package/scripts/monitoring/view-alerts.sh +307 -0
- package/scripts/test-zai-api.cjs +2 -2
- package/src/slash-commands/parse-epic.js +1 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Coordination V2 - State Machine SDK Integration
|
|
3
|
+
*
|
|
4
|
+
* Integrates SessionManager with state machine lifecycle events.
|
|
5
|
+
* Provides auto-checkpoint on state transitions, event broadcasting,
|
|
6
|
+
* and message UUID tracking for recovery.
|
|
7
|
+
*
|
|
8
|
+
* @module coordination/v2/sdk/state-sdk-integration
|
|
9
|
+
*/ import { EventEmitter } from 'node:events';
|
|
10
|
+
import { STATE_TRANSITIONS } from '../core/state-machine-config.js';
|
|
11
|
+
/**
|
|
12
|
+
* StateSDKIntegration - Connects state machine with SDK session management
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - Auto-checkpoint creation on state transitions (<500ms budget)
|
|
16
|
+
* - Event broadcasting to all sessions (<50ms latency)
|
|
17
|
+
* - Message UUID tracking for checkpoint recovery
|
|
18
|
+
* - Zero failures in event listener system
|
|
19
|
+
*/ export class StateSDKIntegration extends EventEmitter {
|
|
20
|
+
checkpointManager;
|
|
21
|
+
queryController;
|
|
22
|
+
config;
|
|
23
|
+
metrics;
|
|
24
|
+
sessions = new Map();
|
|
25
|
+
messageUUIDIndex = new Map();
|
|
26
|
+
lastCheckpointTime = new Map();
|
|
27
|
+
initialized = false;
|
|
28
|
+
constructor(checkpointManager, queryController, config = {}){
|
|
29
|
+
super();
|
|
30
|
+
this.checkpointManager = checkpointManager;
|
|
31
|
+
this.queryController = queryController;
|
|
32
|
+
this.config = {
|
|
33
|
+
checkpointTimeoutMs: config.checkpointTimeoutMs ?? 500,
|
|
34
|
+
eventBroadcastTimeoutMs: config.eventBroadcastTimeoutMs ?? 50,
|
|
35
|
+
enableAutoCheckpoint: config.enableAutoCheckpoint ?? true,
|
|
36
|
+
checkpointThrottleMs: config.checkpointThrottleMs ?? 100
|
|
37
|
+
};
|
|
38
|
+
this.metrics = this.initializeMetrics();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Initialize the integration system
|
|
42
|
+
*/ async initialize() {
|
|
43
|
+
if (this.initialized) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Initialize checkpoint manager
|
|
47
|
+
await this.checkpointManager.initialize();
|
|
48
|
+
// Initialize query controller
|
|
49
|
+
await this.queryController.initialize();
|
|
50
|
+
// Set up event listeners
|
|
51
|
+
this.setupEventListeners();
|
|
52
|
+
this.initialized = true;
|
|
53
|
+
console.log('✅ StateSDKIntegration initialized');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Handle state transition event from state machine
|
|
57
|
+
* Creates checkpoint, broadcasts event, tracks UUID
|
|
58
|
+
*/ async onStateTransition(event) {
|
|
59
|
+
if (!this.initialized) {
|
|
60
|
+
throw new Error('StateSDKIntegration not initialized');
|
|
61
|
+
}
|
|
62
|
+
const startTime = performance.now();
|
|
63
|
+
try {
|
|
64
|
+
// Validate transition is allowed by canonical matrix
|
|
65
|
+
const validTransitions = STATE_TRANSITIONS[event.fromState];
|
|
66
|
+
if (!validTransitions?.includes(event.toState)) {
|
|
67
|
+
const error = new Error(`Invalid state transition: ${event.fromState} → ${event.toState}. ` + `Valid transitions from ${event.fromState}: ${validTransitions?.join(', ') || 'none'}`);
|
|
68
|
+
this.metrics.broadcastFailures++;
|
|
69
|
+
console.error('❌ State transition validation failed:', error.message);
|
|
70
|
+
this.emit('state:transition:error', {
|
|
71
|
+
event,
|
|
72
|
+
error
|
|
73
|
+
});
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
// Get session for agent
|
|
77
|
+
const session = await this.getOrCreateSession(event.agentId);
|
|
78
|
+
// Create checkpoint before state change (if enabled and not throttled)
|
|
79
|
+
let checkpoint = null;
|
|
80
|
+
if (this.config.enableAutoCheckpoint && this.shouldCreateCheckpoint(event.agentId)) {
|
|
81
|
+
checkpoint = await this.createCheckpointForTransition(event, session);
|
|
82
|
+
}
|
|
83
|
+
// Broadcast state change to all sessions
|
|
84
|
+
const eventData = {
|
|
85
|
+
agentId: event.agentId,
|
|
86
|
+
sessionId: session.sessionId,
|
|
87
|
+
from: event.fromState,
|
|
88
|
+
to: event.toState,
|
|
89
|
+
checkpointUUID: checkpoint?.messageUUID,
|
|
90
|
+
checkpointId: checkpoint?.id,
|
|
91
|
+
timestamp: new Date(),
|
|
92
|
+
metadata: event.metadata
|
|
93
|
+
};
|
|
94
|
+
await this.broadcastStateChange(eventData);
|
|
95
|
+
// Track message UUID for recovery
|
|
96
|
+
if (checkpoint) {
|
|
97
|
+
await this.trackMessageUUID(event.agentId, checkpoint.messageUUID);
|
|
98
|
+
}
|
|
99
|
+
// Update metrics
|
|
100
|
+
this.metrics.totalStateTransitions++;
|
|
101
|
+
const totalTime = performance.now() - startTime;
|
|
102
|
+
// Verify performance budget
|
|
103
|
+
if (totalTime > this.config.checkpointTimeoutMs) {
|
|
104
|
+
console.warn(`⚠️ State transition processing exceeded budget: ${totalTime.toFixed(2)}ms (target: ${this.config.checkpointTimeoutMs}ms)`);
|
|
105
|
+
}
|
|
106
|
+
this.emit('state:transition:complete', eventData);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
this.metrics.checkpointFailures++;
|
|
109
|
+
console.error('❌ State transition processing failed:', error);
|
|
110
|
+
this.emit('state:transition:error', {
|
|
111
|
+
event,
|
|
112
|
+
error
|
|
113
|
+
});
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create checkpoint for state transition
|
|
119
|
+
*/ async createCheckpointForTransition(event, session) {
|
|
120
|
+
const startTime = performance.now();
|
|
121
|
+
try {
|
|
122
|
+
// Generate message UUID for checkpoint
|
|
123
|
+
const messageUUID = this.generateMessageUUID(event.agentId, event.toState);
|
|
124
|
+
// Create state snapshot
|
|
125
|
+
const stateSnapshot = {
|
|
126
|
+
agentId: event.agentId,
|
|
127
|
+
sessionId: session.sessionId,
|
|
128
|
+
state: event.toState,
|
|
129
|
+
previousState: event.fromState,
|
|
130
|
+
transitionType: event.type,
|
|
131
|
+
timestamp: Date.now(),
|
|
132
|
+
metadata: event.metadata
|
|
133
|
+
};
|
|
134
|
+
// Create checkpoint via CheckpointManager
|
|
135
|
+
const checkpointId = await this.checkpointManager.createCheckpoint(session.sessionId, event.agentId, messageUUID, event.toState, stateSnapshot, {
|
|
136
|
+
reason: `State transition: ${event.fromState} -> ${event.toState}`,
|
|
137
|
+
autoCheckpoint: true,
|
|
138
|
+
context: event.metadata
|
|
139
|
+
});
|
|
140
|
+
const checkpoint = {
|
|
141
|
+
id: checkpointId,
|
|
142
|
+
sessionId: session.sessionId,
|
|
143
|
+
agentId: event.agentId,
|
|
144
|
+
messageUUID,
|
|
145
|
+
state: event.toState,
|
|
146
|
+
timestamp: new Date(),
|
|
147
|
+
metadata: {
|
|
148
|
+
reason: `State transition: ${event.fromState} -> ${event.toState}`,
|
|
149
|
+
autoCheckpoint: true,
|
|
150
|
+
context: event.metadata
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
// Update metrics
|
|
154
|
+
const checkpointTime = performance.now() - startTime;
|
|
155
|
+
this.metrics.totalCheckpointsCreated++;
|
|
156
|
+
this.metrics.averageCheckpointTimeMs = (this.metrics.averageCheckpointTimeMs * (this.metrics.totalCheckpointsCreated - 1) + checkpointTime) / this.metrics.totalCheckpointsCreated;
|
|
157
|
+
// Update throttle tracking
|
|
158
|
+
this.lastCheckpointTime.set(event.agentId, Date.now());
|
|
159
|
+
// Verify performance target
|
|
160
|
+
if (checkpointTime > this.config.checkpointTimeoutMs) {
|
|
161
|
+
console.warn(`⚠️ Checkpoint creation exceeded budget: ${checkpointTime.toFixed(2)}ms (target: ${this.config.checkpointTimeoutMs}ms)`);
|
|
162
|
+
}
|
|
163
|
+
return checkpoint;
|
|
164
|
+
} catch (error) {
|
|
165
|
+
this.metrics.checkpointFailures++;
|
|
166
|
+
console.error('❌ Checkpoint creation failed:', error);
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Broadcast state change event to all registered sessions
|
|
172
|
+
*/ async broadcastStateChange(eventData) {
|
|
173
|
+
const startTime = performance.now();
|
|
174
|
+
try {
|
|
175
|
+
// Emit event to all listeners
|
|
176
|
+
this.emit('state_change', eventData);
|
|
177
|
+
// Broadcast via QueryController (if sessions are registered)
|
|
178
|
+
const activeSessions = this.queryController.getActiveSessions();
|
|
179
|
+
for (const session of activeSessions){
|
|
180
|
+
// Skip the session that triggered the event
|
|
181
|
+
if (session.agentId === eventData.agentId) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Update session metadata with latest state change
|
|
185
|
+
session.metadata.lastStateChange = eventData;
|
|
186
|
+
}
|
|
187
|
+
// Update metrics
|
|
188
|
+
const broadcastTime = performance.now() - startTime;
|
|
189
|
+
this.metrics.totalEventsBroadcast++;
|
|
190
|
+
this.metrics.averageEventBroadcastTimeMs = (this.metrics.averageEventBroadcastTimeMs * (this.metrics.totalEventsBroadcast - 1) + broadcastTime) / this.metrics.totalEventsBroadcast;
|
|
191
|
+
// Verify performance target
|
|
192
|
+
if (broadcastTime > this.config.eventBroadcastTimeoutMs) {
|
|
193
|
+
console.warn(`⚠️ Event broadcast exceeded latency target: ${broadcastTime.toFixed(2)}ms (target: ${this.config.eventBroadcastTimeoutMs}ms)`);
|
|
194
|
+
}
|
|
195
|
+
} catch (error) {
|
|
196
|
+
this.metrics.broadcastFailures++;
|
|
197
|
+
console.error('❌ Event broadcast failed:', error);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Track message UUID for checkpoint recovery
|
|
203
|
+
*/ async trackMessageUUID(agentId, messageUUID) {
|
|
204
|
+
this.messageUUIDIndex.set(messageUUID, agentId);
|
|
205
|
+
this.metrics.messageUUIDsTracked++;
|
|
206
|
+
// Store in session metadata
|
|
207
|
+
const session = this.sessions.get(agentId);
|
|
208
|
+
if (session) {
|
|
209
|
+
session.currentMessageUUID = messageUUID;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Resume session from message UUID checkpoint
|
|
214
|
+
*/ async resumeSessionAt(messageUUID) {
|
|
215
|
+
const agentId = this.messageUUIDIndex.get(messageUUID);
|
|
216
|
+
if (!agentId) {
|
|
217
|
+
throw new Error(`No agent found for message UUID: ${messageUUID}`);
|
|
218
|
+
}
|
|
219
|
+
const session = this.sessions.get(agentId);
|
|
220
|
+
if (!session) {
|
|
221
|
+
throw new Error(`No session found for agent: ${agentId}`);
|
|
222
|
+
}
|
|
223
|
+
// Resume via QueryController
|
|
224
|
+
await this.queryController.resumeSessionAt(session.sessionId, messageUUID);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get or create session for agent
|
|
228
|
+
*/ async getOrCreateSession(agentId) {
|
|
229
|
+
let session = this.sessions.get(agentId);
|
|
230
|
+
if (!session) {
|
|
231
|
+
// Check if session exists in QueryController
|
|
232
|
+
const sessionId = `session_${agentId}_${Date.now()}`;
|
|
233
|
+
session = this.queryController.registerSession(agentId, sessionId);
|
|
234
|
+
this.sessions.set(agentId, session);
|
|
235
|
+
}
|
|
236
|
+
return session;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if checkpoint should be created (throttling)
|
|
240
|
+
*/ shouldCreateCheckpoint(agentId) {
|
|
241
|
+
const lastTime = this.lastCheckpointTime.get(agentId);
|
|
242
|
+
if (!lastTime) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
const elapsed = Date.now() - lastTime;
|
|
246
|
+
return elapsed >= this.config.checkpointThrottleMs;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Generate message UUID for checkpoint
|
|
250
|
+
*/ generateMessageUUID(agentId, state) {
|
|
251
|
+
const timestamp = Date.now();
|
|
252
|
+
const random = Math.random().toString(36).substring(2, 10);
|
|
253
|
+
return `msg_${agentId}_${state}_${timestamp}_${random}`;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Set up event listeners for error handling
|
|
257
|
+
*/ setupEventListeners() {
|
|
258
|
+
// Query controller is an EventEmitter and can emit errors
|
|
259
|
+
this.queryController.on('error', (error)=>{
|
|
260
|
+
this.metrics.broadcastFailures++;
|
|
261
|
+
console.error('❌ QueryController error:', error);
|
|
262
|
+
this.emit('error', {
|
|
263
|
+
source: 'query-controller',
|
|
264
|
+
error
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
// Note: CheckpointManager is not an EventEmitter
|
|
268
|
+
// Error handling is done via try-catch in onStateTransition
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Register session for state change notifications
|
|
272
|
+
*/ registerSession(session) {
|
|
273
|
+
this.sessions.set(session.agentId, session);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Unregister session
|
|
277
|
+
*/ unregisterSession(agentId) {
|
|
278
|
+
this.sessions.delete(agentId);
|
|
279
|
+
this.lastCheckpointTime.delete(agentId);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get integration metrics
|
|
283
|
+
*/ getMetrics() {
|
|
284
|
+
return {
|
|
285
|
+
...this.metrics
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get checkpoint by message UUID
|
|
290
|
+
*/ async getCheckpointByMessageUUID(messageUUID) {
|
|
291
|
+
const checkpoint = await this.checkpointManager.getCheckpointByMessageUUID(messageUUID);
|
|
292
|
+
if (!checkpoint) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
id: checkpoint.id,
|
|
297
|
+
sessionId: checkpoint.sessionId,
|
|
298
|
+
agentId: checkpoint.agentId,
|
|
299
|
+
messageUUID: checkpoint.messageUUID,
|
|
300
|
+
state: checkpoint.state,
|
|
301
|
+
timestamp: checkpoint.timestamp,
|
|
302
|
+
metadata: checkpoint.metadata
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Enable/disable auto-checkpoint
|
|
307
|
+
*/ setAutoCheckpointEnabled(enabled) {
|
|
308
|
+
this.config.enableAutoCheckpoint = enabled;
|
|
309
|
+
console.log(`Auto-checkpoint ${enabled ? 'enabled' : 'disabled'}`);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Check if integration is ready
|
|
313
|
+
*/ isReady() {
|
|
314
|
+
return this.initialized;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Cleanup resources
|
|
318
|
+
*/ async cleanup() {
|
|
319
|
+
this.sessions.clear();
|
|
320
|
+
this.messageUUIDIndex.clear();
|
|
321
|
+
this.lastCheckpointTime.clear();
|
|
322
|
+
this.removeAllListeners();
|
|
323
|
+
this.initialized = false;
|
|
324
|
+
console.log('✅ StateSDKIntegration cleaned up');
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Initialize metrics
|
|
328
|
+
*/ initializeMetrics() {
|
|
329
|
+
return {
|
|
330
|
+
totalStateTransitions: 0,
|
|
331
|
+
totalCheckpointsCreated: 0,
|
|
332
|
+
totalEventsBroadcast: 0,
|
|
333
|
+
averageCheckpointTimeMs: 0,
|
|
334
|
+
averageEventBroadcastTimeMs: 0,
|
|
335
|
+
checkpointFailures: 0,
|
|
336
|
+
broadcastFailures: 0,
|
|
337
|
+
messageUUIDsTracked: 0
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
//# sourceMappingURL=state-sdk-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/coordination/archives/v2-sdk-typescript/v2/sdk/state-sdk-integration.ts"],"names":["EventEmitter","STATE_TRANSITIONS","StateSDKIntegration","checkpointManager","queryController","config","metrics","sessions","Map","messageUUIDIndex","lastCheckpointTime","initialized","checkpointTimeoutMs","eventBroadcastTimeoutMs","enableAutoCheckpoint","checkpointThrottleMs","initializeMetrics","initialize","setupEventListeners","console","log","onStateTransition","event","Error","startTime","performance","now","validTransitions","fromState","includes","toState","error","join","broadcastFailures","message","emit","session","getOrCreateSession","agentId","checkpoint","shouldCreateCheckpoint","createCheckpointForTransition","eventData","sessionId","from","to","checkpointUUID","messageUUID","checkpointId","id","timestamp","Date","metadata","broadcastStateChange","trackMessageUUID","totalStateTransitions","totalTime","warn","toFixed","checkpointFailures","generateMessageUUID","stateSnapshot","state","previousState","transitionType","type","createCheckpoint","reason","autoCheckpoint","context","checkpointTime","totalCheckpointsCreated","averageCheckpointTimeMs","set","activeSessions","getActiveSessions","lastStateChange","broadcastTime","totalEventsBroadcast","averageEventBroadcastTimeMs","messageUUIDsTracked","get","currentMessageUUID","resumeSessionAt","registerSession","lastTime","elapsed","random","Math","toString","substring","on","source","unregisterSession","delete","getMetrics","getCheckpointByMessageUUID","setAutoCheckpointEnabled","enabled","isReady","cleanup","clear","removeAllListeners"],"mappings":"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"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload Validator - SEC-INJ-001 Mitigation
|
|
3
|
+
*
|
|
4
|
+
* Validates and sanitizes message payloads to prevent:
|
|
5
|
+
* - Prototype pollution attacks
|
|
6
|
+
* - Code injection via eval/Function
|
|
7
|
+
* - Memory bombs (deeply nested objects)
|
|
8
|
+
* - Oversized payloads
|
|
9
|
+
*
|
|
10
|
+
* @module coordination/v2/security/payload-validator
|
|
11
|
+
*/ /**
|
|
12
|
+
* Payload validation rule configuration.
|
|
13
|
+
*/ /**
|
|
14
|
+
* Payload validation error.
|
|
15
|
+
*/ export class PayloadValidationError extends Error {
|
|
16
|
+
constructor(message){
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = 'PayloadValidationError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Payload Validator Implementation.
|
|
23
|
+
*
|
|
24
|
+
* Provides comprehensive validation and sanitization of message payloads
|
|
25
|
+
* to prevent injection attacks and resource exhaustion.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const validator = new PayloadValidator({
|
|
30
|
+
* maxDepth: 5,
|
|
31
|
+
* maxSize: 1024 * 1024,
|
|
32
|
+
* forbiddenKeys: ['__proto__', 'constructor', 'prototype'],
|
|
33
|
+
* allowedTypes: ['string', 'number', 'boolean', 'object', 'array']
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* const result = validator.validate(userPayload);
|
|
37
|
+
* if (!result.valid) {
|
|
38
|
+
* throw new Error(`Validation failed: ${result.errors.join(', ')}`);
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* const sanitized = validator.sanitize(userPayload);
|
|
42
|
+
* ```
|
|
43
|
+
*/ export class PayloadValidator {
|
|
44
|
+
rules;
|
|
45
|
+
/**
|
|
46
|
+
* Default validation rules (secure defaults).
|
|
47
|
+
*/ static DEFAULT_RULES = {
|
|
48
|
+
maxDepth: 5,
|
|
49
|
+
maxSize: 1024 * 1024,
|
|
50
|
+
allowedTypes: [
|
|
51
|
+
'string',
|
|
52
|
+
'number',
|
|
53
|
+
'boolean',
|
|
54
|
+
'object',
|
|
55
|
+
'array',
|
|
56
|
+
'null'
|
|
57
|
+
],
|
|
58
|
+
forbiddenKeys: [
|
|
59
|
+
'__proto__',
|
|
60
|
+
'constructor',
|
|
61
|
+
'prototype',
|
|
62
|
+
'eval',
|
|
63
|
+
'Function'
|
|
64
|
+
]
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Creates a new payload validator.
|
|
68
|
+
*
|
|
69
|
+
* @param rules - Validation rules (uses secure defaults if not provided)
|
|
70
|
+
*/ constructor(rules){
|
|
71
|
+
this.rules = {
|
|
72
|
+
...PayloadValidator.DEFAULT_RULES,
|
|
73
|
+
...rules
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validates a payload against configured rules.
|
|
78
|
+
*
|
|
79
|
+
* @param payload - Payload to validate
|
|
80
|
+
* @returns Validation result with errors if any
|
|
81
|
+
*/ validate(payload) {
|
|
82
|
+
const errors = [];
|
|
83
|
+
try {
|
|
84
|
+
// SEC-INJ-001-BYPASS: Check for prototype chain pollution BEFORE serialization
|
|
85
|
+
// Object literals with __proto__ can pollute the prototype chain before validation runs
|
|
86
|
+
if (typeof payload === 'object' && payload !== null) {
|
|
87
|
+
const proto = Object.getPrototypeOf(payload);
|
|
88
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
89
|
+
errors.push(`Prototype pollution detected: object has modified prototype chain`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// SEC-INJ-001: Check payload size
|
|
93
|
+
const serialized = JSON.stringify(payload);
|
|
94
|
+
const size = Buffer.byteLength(serialized, 'utf8');
|
|
95
|
+
if (size > this.rules.maxSize) {
|
|
96
|
+
errors.push(`Payload size ${size} bytes exceeds maximum ${this.rules.maxSize} bytes`);
|
|
97
|
+
}
|
|
98
|
+
// SEC-INJ-001: Check object depth
|
|
99
|
+
const depth = this.getObjectDepth(payload);
|
|
100
|
+
if (depth > this.rules.maxDepth) {
|
|
101
|
+
errors.push(`Payload depth ${depth} exceeds maximum depth ${this.rules.maxDepth}`);
|
|
102
|
+
}
|
|
103
|
+
// SEC-INJ-001: Check for forbidden keys (prototype pollution vectors)
|
|
104
|
+
const allKeys = this.getAllKeys(payload);
|
|
105
|
+
const foundForbidden = allKeys.filter((key)=>this.rules.forbiddenKeys.includes(key));
|
|
106
|
+
if (foundForbidden.length > 0) {
|
|
107
|
+
errors.push(`Forbidden keys detected: ${foundForbidden.join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
// SEC-INJ-001: Check for dangerous type patterns
|
|
110
|
+
const typeErrors = this.validateTypes(payload);
|
|
111
|
+
errors.push(...typeErrors);
|
|
112
|
+
return {
|
|
113
|
+
valid: errors.length === 0,
|
|
114
|
+
errors,
|
|
115
|
+
depth,
|
|
116
|
+
size
|
|
117
|
+
};
|
|
118
|
+
} catch (error) {
|
|
119
|
+
// Catch circular reference or serialization errors
|
|
120
|
+
return {
|
|
121
|
+
valid: false,
|
|
122
|
+
errors: [
|
|
123
|
+
`Validation error: ${error instanceof Error ? error.message : String(error)}`
|
|
124
|
+
]
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Sanitizes a payload by removing dangerous keys and normalizing structure.
|
|
130
|
+
*
|
|
131
|
+
* Creates a deep clone with prototype chain stripped to prevent pollution attacks.
|
|
132
|
+
*
|
|
133
|
+
* @param payload - Payload to sanitize
|
|
134
|
+
* @returns Sanitized payload (deep frozen)
|
|
135
|
+
*/ sanitize(payload) {
|
|
136
|
+
if (payload === null || payload === undefined) {
|
|
137
|
+
return payload;
|
|
138
|
+
}
|
|
139
|
+
// SEC-INJ-001: JSON round-trip removes prototype chain and functions
|
|
140
|
+
const serialized = JSON.stringify(payload);
|
|
141
|
+
const parsed = JSON.parse(serialized);
|
|
142
|
+
// SEC-INJ-001: Remove forbidden keys recursively
|
|
143
|
+
const cleaned = this.removeForbiddenKeys(parsed);
|
|
144
|
+
// SEC-INJ-001: Deep freeze to prevent modification
|
|
145
|
+
return this.deepFreeze(cleaned);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Gets the maximum depth of an object.
|
|
149
|
+
*
|
|
150
|
+
* @param obj - Object to measure
|
|
151
|
+
* @param currentDepth - Current recursion depth (internal)
|
|
152
|
+
* @returns Maximum nesting depth
|
|
153
|
+
*/ getObjectDepth(obj, currentDepth = 0) {
|
|
154
|
+
if (obj === null || typeof obj !== 'object') {
|
|
155
|
+
return currentDepth;
|
|
156
|
+
}
|
|
157
|
+
if (Array.isArray(obj)) {
|
|
158
|
+
if (obj.length === 0) return currentDepth + 1;
|
|
159
|
+
return Math.max(...obj.map((item)=>this.getObjectDepth(item, currentDepth + 1)));
|
|
160
|
+
}
|
|
161
|
+
const keys = Object.keys(obj);
|
|
162
|
+
if (keys.length === 0) return currentDepth + 1;
|
|
163
|
+
return Math.max(...keys.map((key)=>this.getObjectDepth(obj[key], currentDepth + 1)));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Extracts all keys from an object recursively.
|
|
167
|
+
*
|
|
168
|
+
* @param obj - Object to extract keys from
|
|
169
|
+
* @returns Array of all keys (including nested)
|
|
170
|
+
*/ getAllKeys(obj) {
|
|
171
|
+
if (obj === null || typeof obj !== 'object') {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
const keys = [];
|
|
175
|
+
if (Array.isArray(obj)) {
|
|
176
|
+
obj.forEach((item)=>{
|
|
177
|
+
keys.push(...this.getAllKeys(item));
|
|
178
|
+
});
|
|
179
|
+
} else {
|
|
180
|
+
// FIX SEC-INJ-001: Use getOwnPropertyNames + getOwnPropertySymbols
|
|
181
|
+
// to detect non-enumerable properties like __proto__, constructor
|
|
182
|
+
const propertyNames = Object.getOwnPropertyNames(obj);
|
|
183
|
+
const propertySymbols = Object.getOwnPropertySymbols(obj);
|
|
184
|
+
propertyNames.forEach((key)=>{
|
|
185
|
+
keys.push(key);
|
|
186
|
+
keys.push(...this.getAllKeys(obj[key]));
|
|
187
|
+
});
|
|
188
|
+
// Include symbol properties for comprehensive coverage
|
|
189
|
+
propertySymbols.forEach((sym)=>{
|
|
190
|
+
keys.push(sym.toString());
|
|
191
|
+
keys.push(...this.getAllKeys(obj[sym]));
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return keys;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Validates payload types recursively.
|
|
198
|
+
*
|
|
199
|
+
* @param obj - Object to validate
|
|
200
|
+
* @returns Array of type validation errors
|
|
201
|
+
*/ validateTypes(obj) {
|
|
202
|
+
const errors = [];
|
|
203
|
+
if (obj === null) {
|
|
204
|
+
return errors; // null is allowed
|
|
205
|
+
}
|
|
206
|
+
const type = Array.isArray(obj) ? 'array' : typeof obj;
|
|
207
|
+
if (!this.rules.allowedTypes.includes(type)) {
|
|
208
|
+
errors.push(`Type '${type}' not allowed in payload`);
|
|
209
|
+
return errors; // Don't recurse into invalid types
|
|
210
|
+
}
|
|
211
|
+
if (type === 'object' || type === 'array') {
|
|
212
|
+
const values = Array.isArray(obj) ? obj : Object.values(obj);
|
|
213
|
+
values.forEach((value)=>{
|
|
214
|
+
errors.push(...this.validateTypes(value));
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return errors;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Removes forbidden keys from object recursively.
|
|
221
|
+
*
|
|
222
|
+
* @param obj - Object to clean
|
|
223
|
+
* @returns Cleaned object
|
|
224
|
+
*/ removeForbiddenKeys(obj) {
|
|
225
|
+
if (obj === null || typeof obj !== 'object') {
|
|
226
|
+
return obj;
|
|
227
|
+
}
|
|
228
|
+
if (Array.isArray(obj)) {
|
|
229
|
+
return obj.map((item)=>this.removeForbiddenKeys(item));
|
|
230
|
+
}
|
|
231
|
+
const cleaned = {};
|
|
232
|
+
Object.keys(obj).forEach((key)=>{
|
|
233
|
+
if (!this.rules.forbiddenKeys.includes(key)) {
|
|
234
|
+
cleaned[key] = this.removeForbiddenKeys(obj[key]);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
return cleaned;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Deep freezes an object to prevent modification.
|
|
241
|
+
*
|
|
242
|
+
* @param obj - Object to freeze
|
|
243
|
+
* @returns Frozen object
|
|
244
|
+
*/ deepFreeze(obj) {
|
|
245
|
+
if (obj === null || typeof obj !== 'object') {
|
|
246
|
+
return obj;
|
|
247
|
+
}
|
|
248
|
+
if (Array.isArray(obj)) {
|
|
249
|
+
obj.forEach((item)=>this.deepFreeze(item));
|
|
250
|
+
} else {
|
|
251
|
+
Object.keys(obj).forEach((key)=>{
|
|
252
|
+
this.deepFreeze(obj[key]);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return Object.freeze(obj);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
//# sourceMappingURL=payload-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/coordination/archives/v2-sdk-typescript/v2/security/payload-validator.ts"],"names":["PayloadValidationError","Error","message","name","PayloadValidator","rules","DEFAULT_RULES","maxDepth","maxSize","allowedTypes","forbiddenKeys","validate","payload","errors","proto","Object","getPrototypeOf","prototype","push","serialized","JSON","stringify","size","Buffer","byteLength","depth","getObjectDepth","allKeys","getAllKeys","foundForbidden","filter","key","includes","length","join","typeErrors","validateTypes","valid","error","String","sanitize","undefined","parsed","parse","cleaned","removeForbiddenKeys","deepFreeze","obj","currentDepth","Array","isArray","Math","max","map","item","keys","forEach","propertyNames","getOwnPropertyNames","propertySymbols","getOwnPropertySymbols","sym","toString","type","values","value","freeze"],"mappings":"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"}
|