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,206 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/monitoring/quick-test-rate-limiting.sh - Quick validation of rate limiting monitoring
|
|
3
|
+
# Phase 1 Sprint 1.5: Rate Limiting Monitoring & Alerts
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# ==============================================================================
|
|
8
|
+
# CONFIGURATION
|
|
9
|
+
# ==============================================================================
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
13
|
+
|
|
14
|
+
# Test environment
|
|
15
|
+
export CFN_BASE_DIR="/tmp/cfn-quick-test-$$"
|
|
16
|
+
export METRICS_FILE="/tmp/cfn-quick-metrics-$$.jsonl"
|
|
17
|
+
export ALERT_LOG_FILE="/tmp/cfn-quick-alerts-$$.jsonl"
|
|
18
|
+
export MONITOR_PID_FILE="/tmp/rate-limiting-quick-$$.pid"
|
|
19
|
+
export CHECK_INTERVAL=2
|
|
20
|
+
export MAX_INBOX_SIZE=100
|
|
21
|
+
|
|
22
|
+
# ==============================================================================
|
|
23
|
+
# SETUP
|
|
24
|
+
# ==============================================================================
|
|
25
|
+
|
|
26
|
+
echo "=================================="
|
|
27
|
+
echo "Quick Rate Limiting Monitor Test"
|
|
28
|
+
echo "=================================="
|
|
29
|
+
echo ""
|
|
30
|
+
|
|
31
|
+
# Create test environment
|
|
32
|
+
mkdir -p "$CFN_BASE_DIR/inbox"
|
|
33
|
+
rm -f "$METRICS_FILE" "$ALERT_LOG_FILE" "$MONITOR_PID_FILE"
|
|
34
|
+
|
|
35
|
+
# Create test agent inboxes with different utilization levels
|
|
36
|
+
create_test_inbox() {
|
|
37
|
+
local agent_id="$1"
|
|
38
|
+
local message_count="$2"
|
|
39
|
+
local inbox_dir="$CFN_BASE_DIR/inbox/$agent_id"
|
|
40
|
+
|
|
41
|
+
mkdir -p "$inbox_dir"
|
|
42
|
+
|
|
43
|
+
for i in $(seq 1 "$message_count"); do
|
|
44
|
+
echo "{\"id\":\"msg-$i\",\"content\":\"test\"}" > "$inbox_dir/msg-$i.msg"
|
|
45
|
+
done
|
|
46
|
+
|
|
47
|
+
echo "[SETUP] Created inbox for $agent_id with $message_count messages"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Create test inboxes
|
|
51
|
+
create_test_inbox "agent-low" 20 # 20% utilization
|
|
52
|
+
create_test_inbox "agent-medium" 50 # 50% utilization
|
|
53
|
+
create_test_inbox "agent-warning" 80 # 80% utilization - WARNING
|
|
54
|
+
create_test_inbox "agent-critical" 95 # 95% utilization - CRITICAL
|
|
55
|
+
|
|
56
|
+
echo ""
|
|
57
|
+
|
|
58
|
+
# ==============================================================================
|
|
59
|
+
# TEST 1: Monitor Start/Stop
|
|
60
|
+
# ==============================================================================
|
|
61
|
+
|
|
62
|
+
echo "TEST 1: Monitor lifecycle"
|
|
63
|
+
echo "-------------------------"
|
|
64
|
+
|
|
65
|
+
# Start monitor in background
|
|
66
|
+
timeout 5 bash "$SCRIPT_DIR/rate-limiting-monitor.sh" background 2>&1 || true
|
|
67
|
+
sleep 3
|
|
68
|
+
|
|
69
|
+
# Check status
|
|
70
|
+
status=$(bash "$SCRIPT_DIR/rate-limiting-monitor.sh" status 2>&1)
|
|
71
|
+
if echo "$status" | grep -q "running"; then
|
|
72
|
+
echo "✅ Monitor started successfully"
|
|
73
|
+
else
|
|
74
|
+
echo "❌ Monitor failed to start"
|
|
75
|
+
echo " Status: $status"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
echo ""
|
|
79
|
+
|
|
80
|
+
# ==============================================================================
|
|
81
|
+
# TEST 2: Metrics Collection
|
|
82
|
+
# ==============================================================================
|
|
83
|
+
|
|
84
|
+
echo "TEST 2: Metrics collection"
|
|
85
|
+
echo "-------------------------"
|
|
86
|
+
|
|
87
|
+
sleep 5 # Wait for at least one collection cycle
|
|
88
|
+
|
|
89
|
+
if [ -f "$METRICS_FILE" ]; then
|
|
90
|
+
metric_count=$(wc -l < "$METRICS_FILE" 2>/dev/null || echo "0")
|
|
91
|
+
echo "✅ Metrics file created with $metric_count entries"
|
|
92
|
+
|
|
93
|
+
# Check for inbox metrics
|
|
94
|
+
if grep -q "inbox.size" "$METRICS_FILE"; then
|
|
95
|
+
echo "✅ Inbox size metrics collected"
|
|
96
|
+
else
|
|
97
|
+
echo "❌ No inbox size metrics found"
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
if grep -q "inbox.utilization" "$METRICS_FILE"; then
|
|
101
|
+
echo "✅ Inbox utilization metrics collected"
|
|
102
|
+
else
|
|
103
|
+
echo "❌ No inbox utilization metrics found"
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Show sample metrics
|
|
107
|
+
echo ""
|
|
108
|
+
echo "Sample metrics:"
|
|
109
|
+
tail -n 5 "$METRICS_FILE" | jq -r '.metric + ": " + (.value|tostring) + " (" + (.labels.agent // "N/A") + ")"' 2>/dev/null || tail -n 5 "$METRICS_FILE"
|
|
110
|
+
else
|
|
111
|
+
echo "❌ Metrics file not created"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
echo ""
|
|
115
|
+
|
|
116
|
+
# ==============================================================================
|
|
117
|
+
# TEST 3: Alert Generation
|
|
118
|
+
# ==============================================================================
|
|
119
|
+
|
|
120
|
+
echo "TEST 3: Alert generation"
|
|
121
|
+
echo "------------------------"
|
|
122
|
+
|
|
123
|
+
if [ -f "$ALERT_LOG_FILE" ]; then
|
|
124
|
+
alert_count=$(wc -l < "$ALERT_LOG_FILE" 2>/dev/null || echo "0")
|
|
125
|
+
echo "✅ Alert file created with $alert_count alerts"
|
|
126
|
+
|
|
127
|
+
# Check for warning alerts (80% threshold)
|
|
128
|
+
warning_count=$(grep -c "warning" "$ALERT_LOG_FILE" 2>/dev/null || echo "0")
|
|
129
|
+
echo " Warning alerts: $warning_count"
|
|
130
|
+
|
|
131
|
+
# Check for critical alerts (95% threshold)
|
|
132
|
+
critical_count=$(grep -c "critical" "$ALERT_LOG_FILE" 2>/dev/null || echo "0")
|
|
133
|
+
echo " Critical alerts: $critical_count"
|
|
134
|
+
|
|
135
|
+
if [ "$alert_count" -gt 0 ]; then
|
|
136
|
+
echo ""
|
|
137
|
+
echo "Recent alerts:"
|
|
138
|
+
tail -n 3 "$ALERT_LOG_FILE" | jq -r '"\(.severity | ascii_upcase): \(.message)"' 2>/dev/null || tail -n 3 "$ALERT_LOG_FILE"
|
|
139
|
+
fi
|
|
140
|
+
else
|
|
141
|
+
echo "⚠️ No alerts generated (may be expected if utilization below thresholds)"
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
echo ""
|
|
145
|
+
|
|
146
|
+
# ==============================================================================
|
|
147
|
+
# TEST 4: Summary Output
|
|
148
|
+
# ==============================================================================
|
|
149
|
+
|
|
150
|
+
echo "TEST 4: Summary output"
|
|
151
|
+
echo "----------------------"
|
|
152
|
+
|
|
153
|
+
summary=$(bash "$SCRIPT_DIR/rate-limiting-monitor.sh" summary 2>&1)
|
|
154
|
+
|
|
155
|
+
if echo "$summary" | grep -q "Rate Limiting Status"; then
|
|
156
|
+
echo "✅ Summary generated successfully"
|
|
157
|
+
echo ""
|
|
158
|
+
echo "$summary"
|
|
159
|
+
else
|
|
160
|
+
echo "❌ Summary generation failed"
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
echo ""
|
|
164
|
+
|
|
165
|
+
# ==============================================================================
|
|
166
|
+
# CLEANUP
|
|
167
|
+
# ==============================================================================
|
|
168
|
+
|
|
169
|
+
echo "=================================="
|
|
170
|
+
echo "Cleanup"
|
|
171
|
+
echo "=================================="
|
|
172
|
+
|
|
173
|
+
# Stop monitor
|
|
174
|
+
bash "$SCRIPT_DIR/rate-limiting-monitor.sh" stop 2>&1 || true
|
|
175
|
+
sleep 1
|
|
176
|
+
|
|
177
|
+
# Verify stopped
|
|
178
|
+
status=$(bash "$SCRIPT_DIR/rate-limiting-monitor.sh" status 2>&1)
|
|
179
|
+
if echo "$status" | grep -q "stopped"; then
|
|
180
|
+
echo "✅ Monitor stopped successfully"
|
|
181
|
+
else
|
|
182
|
+
echo "⚠️ Monitor status: $status"
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
# Remove test files
|
|
186
|
+
rm -rf "$CFN_BASE_DIR"
|
|
187
|
+
rm -f "$METRICS_FILE" "$ALERT_LOG_FILE" "$MONITOR_PID_FILE"
|
|
188
|
+
|
|
189
|
+
echo "✅ Test environment cleaned up"
|
|
190
|
+
echo ""
|
|
191
|
+
|
|
192
|
+
# ==============================================================================
|
|
193
|
+
# SUMMARY
|
|
194
|
+
# ==============================================================================
|
|
195
|
+
|
|
196
|
+
echo "=================================="
|
|
197
|
+
echo "Quick Test Complete"
|
|
198
|
+
echo "=================================="
|
|
199
|
+
echo ""
|
|
200
|
+
echo "Components tested:"
|
|
201
|
+
echo " ✓ Monitor start/stop lifecycle"
|
|
202
|
+
echo " ✓ Metrics collection (inbox size, utilization)"
|
|
203
|
+
echo " ✓ Alert generation (warning/critical thresholds)"
|
|
204
|
+
echo " ✓ Summary output generation"
|
|
205
|
+
echo ""
|
|
206
|
+
echo "All deliverables validated successfully!"
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/monitoring/rate-limiting-monitor.sh - Rate limiting metrics and alerting
|
|
3
|
+
# Phase 1 Sprint 1.5: Rate Limiting Monitoring & Alerts
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# ==============================================================================
|
|
8
|
+
# CONFIGURATION
|
|
9
|
+
# ==============================================================================
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
12
|
+
LIB_DIR="${SCRIPT_DIR}/../../lib"
|
|
13
|
+
CFN_BASE_DIR="${CFN_BASE_DIR:-/dev/shm/cfn}"
|
|
14
|
+
METRICS_FILE="${METRICS_FILE:-/dev/shm/cfn-metrics.jsonl}"
|
|
15
|
+
ALERT_LOG_FILE="${ALERT_LOG_FILE:-/dev/shm/cfn-alerts.jsonl}"
|
|
16
|
+
MONITOR_PID_FILE="${MONITOR_PID_FILE:-/dev/shm/rate-limiting-monitor.pid}"
|
|
17
|
+
|
|
18
|
+
# Check interval (seconds)
|
|
19
|
+
CHECK_INTERVAL="${CHECK_INTERVAL:-10}"
|
|
20
|
+
|
|
21
|
+
# Rate limiting thresholds
|
|
22
|
+
MAX_INBOX_SIZE="${MAX_INBOX_SIZE:-100}"
|
|
23
|
+
INBOX_CRITICAL_PCT="${INBOX_CRITICAL_PCT:-90}"
|
|
24
|
+
INBOX_WARNING_PCT="${INBOX_WARNING_PCT:-75}"
|
|
25
|
+
BACKPRESSURE_WARNING_RATE="${BACKPRESSURE_WARNING_RATE:-100}" # events/min
|
|
26
|
+
MESSAGE_FAILURE_CRITICAL_RATE="${MESSAGE_FAILURE_CRITICAL_RATE:-10}" # failures/min
|
|
27
|
+
|
|
28
|
+
# ==============================================================================
|
|
29
|
+
# DEPENDENCIES
|
|
30
|
+
# ==============================================================================
|
|
31
|
+
|
|
32
|
+
# Source libraries
|
|
33
|
+
if [ -f "$LIB_DIR/alerting.sh" ]; then
|
|
34
|
+
# shellcheck source=../../lib/alerting.sh
|
|
35
|
+
source "$LIB_DIR/alerting.sh"
|
|
36
|
+
else
|
|
37
|
+
echo "[ERROR] Alerting library not found at $LIB_DIR/alerting.sh" >&2
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
if [ -f "$LIB_DIR/metrics.sh" ]; then
|
|
42
|
+
# shellcheck source=../../lib/metrics.sh
|
|
43
|
+
source "$LIB_DIR/metrics.sh"
|
|
44
|
+
else
|
|
45
|
+
echo "[ERROR] Metrics library not found at $LIB_DIR/metrics.sh" >&2
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# ==============================================================================
|
|
50
|
+
# SIGNAL HANDLERS
|
|
51
|
+
# ==============================================================================
|
|
52
|
+
|
|
53
|
+
cleanup() {
|
|
54
|
+
echo "[INFO] Shutting down rate limiting monitor (PID: $$)" >&2
|
|
55
|
+
rm -f "$MONITOR_PID_FILE"
|
|
56
|
+
exit 0
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
trap cleanup SIGTERM SIGINT
|
|
60
|
+
|
|
61
|
+
# ==============================================================================
|
|
62
|
+
# METRICS COLLECTION FUNCTIONS
|
|
63
|
+
# ==============================================================================
|
|
64
|
+
|
|
65
|
+
# collect_inbox_metrics - Gather inbox size and utilization data
|
|
66
|
+
collect_inbox_metrics() {
|
|
67
|
+
local inbox_dir="$CFN_BASE_DIR/inbox"
|
|
68
|
+
|
|
69
|
+
# Skip if inbox directory doesn't exist
|
|
70
|
+
if [ ! -d "$inbox_dir" ]; then
|
|
71
|
+
return 0
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
# Iterate through agent inboxes
|
|
75
|
+
for agent_inbox in "$inbox_dir"/*; do
|
|
76
|
+
[ -d "$agent_inbox" ] || continue
|
|
77
|
+
|
|
78
|
+
local agent_id
|
|
79
|
+
agent_id=$(basename "$agent_inbox")
|
|
80
|
+
|
|
81
|
+
# Count messages in inbox (use ls -1 instead of find for performance)
|
|
82
|
+
local message_count=0
|
|
83
|
+
if ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l > /dev/null 2>&1; then
|
|
84
|
+
message_count=$(ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l)
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Calculate utilization percentage
|
|
88
|
+
local utilization_pct=0
|
|
89
|
+
if [ "$MAX_INBOX_SIZE" -gt 0 ]; then
|
|
90
|
+
utilization_pct=$((message_count * 100 / MAX_INBOX_SIZE))
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Emit metrics
|
|
94
|
+
emit_metric "inbox.size" "$message_count" "count" "{\"agent\":\"$agent_id\"}"
|
|
95
|
+
emit_metric "inbox.utilization" "$utilization_pct" "percent" "{\"agent\":\"$agent_id\"}"
|
|
96
|
+
|
|
97
|
+
# Check alert thresholds
|
|
98
|
+
check_inbox_thresholds "$agent_id" "$utilization_pct" "$message_count"
|
|
99
|
+
done
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# check_inbox_thresholds - Evaluate inbox against alert thresholds
|
|
103
|
+
check_inbox_thresholds() {
|
|
104
|
+
local agent_id="$1"
|
|
105
|
+
local utilization_pct="$2"
|
|
106
|
+
local message_count="$3"
|
|
107
|
+
|
|
108
|
+
if [ "$utilization_pct" -ge "$INBOX_CRITICAL_PCT" ]; then
|
|
109
|
+
emit_alert "inbox_high_utilization" \
|
|
110
|
+
"Agent $agent_id inbox at critical level: ${utilization_pct}% (${message_count}/${MAX_INBOX_SIZE} messages)" \
|
|
111
|
+
"critical" \
|
|
112
|
+
"{\"agent\":\"$agent_id\",\"utilization\":$utilization_pct,\"count\":$message_count,\"max\":$MAX_INBOX_SIZE}"
|
|
113
|
+
elif [ "$utilization_pct" -ge "$INBOX_WARNING_PCT" ]; then
|
|
114
|
+
emit_alert "inbox_high_utilization" \
|
|
115
|
+
"Agent $agent_id inbox utilization elevated: ${utilization_pct}% (${message_count}/${MAX_INBOX_SIZE} messages)" \
|
|
116
|
+
"warning" \
|
|
117
|
+
"{\"agent\":\"$agent_id\",\"utilization\":$utilization_pct,\"count\":$message_count,\"max\":$MAX_INBOX_SIZE}"
|
|
118
|
+
fi
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
# collect_backpressure_metrics - Track backpressure events
|
|
122
|
+
collect_backpressure_metrics() {
|
|
123
|
+
if [ ! -f "$METRICS_FILE" ]; then
|
|
124
|
+
return 0
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# Count backpressure events in last minute (last 6 samples at 10s interval)
|
|
128
|
+
local backpressure_events
|
|
129
|
+
backpressure_events=$(tail -n 60 "$METRICS_FILE" 2>/dev/null | \
|
|
130
|
+
jq -r 'select(.metric == "backpressure.wait") | .value' | wc -l)
|
|
131
|
+
|
|
132
|
+
# Emit backpressure rate metric
|
|
133
|
+
emit_metric "backpressure.events_per_min" "$backpressure_events" "count"
|
|
134
|
+
|
|
135
|
+
# Check alert threshold
|
|
136
|
+
if [ "$backpressure_events" -gt "$BACKPRESSURE_WARNING_RATE" ]; then
|
|
137
|
+
emit_alert "backpressure_high_rate" \
|
|
138
|
+
"Backpressure events exceed threshold: ${backpressure_events} events/min (threshold: ${BACKPRESSURE_WARNING_RATE}/min)" \
|
|
139
|
+
"warning" \
|
|
140
|
+
"{\"events_per_min\":$backpressure_events,\"threshold\":$BACKPRESSURE_WARNING_RATE}"
|
|
141
|
+
fi
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
# collect_message_failure_metrics - Track message delivery failures
|
|
145
|
+
collect_message_failure_metrics() {
|
|
146
|
+
if [ ! -f "$METRICS_FILE" ]; then
|
|
147
|
+
return 0
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Count message send failures in last minute
|
|
151
|
+
local send_failures
|
|
152
|
+
send_failures=$(tail -n 60 "$METRICS_FILE" 2>/dev/null | \
|
|
153
|
+
jq -r 'select(.metric == "coordination.send_failure") | .value' | wc -l)
|
|
154
|
+
|
|
155
|
+
# Emit failure rate metric
|
|
156
|
+
emit_metric "coordination.send_failures_per_min" "$send_failures" "count"
|
|
157
|
+
|
|
158
|
+
# Check critical threshold
|
|
159
|
+
if [ "$send_failures" -gt "$MESSAGE_FAILURE_CRITICAL_RATE" ]; then
|
|
160
|
+
emit_alert "message_send_failures_critical" \
|
|
161
|
+
"Message send failures exceed critical threshold: ${send_failures} failures/min (threshold: ${MESSAGE_FAILURE_CRITICAL_RATE}/min)" \
|
|
162
|
+
"critical" \
|
|
163
|
+
"{\"failures_per_min\":$send_failures,\"threshold\":$MESSAGE_FAILURE_CRITICAL_RATE}"
|
|
164
|
+
fi
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
# collect_overflow_metrics - Track inbox overflow events
|
|
168
|
+
collect_overflow_metrics() {
|
|
169
|
+
if [ ! -f "$METRICS_FILE" ]; then
|
|
170
|
+
return 0
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# Count overflow events in last minute
|
|
174
|
+
local overflow_events
|
|
175
|
+
overflow_events=$(tail -n 60 "$METRICS_FILE" 2>/dev/null | \
|
|
176
|
+
jq -r 'select(.metric == "inbox.overflow") | .value' | wc -l)
|
|
177
|
+
|
|
178
|
+
if [ "$overflow_events" -gt 0 ]; then
|
|
179
|
+
emit_metric "inbox.overflow_events_per_min" "$overflow_events" "count"
|
|
180
|
+
|
|
181
|
+
emit_alert "inbox_overflow_detected" \
|
|
182
|
+
"Inbox overflow detected: ${overflow_events} events in last minute" \
|
|
183
|
+
"critical" \
|
|
184
|
+
"{\"overflow_events\":$overflow_events}"
|
|
185
|
+
fi
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# ==============================================================================
|
|
189
|
+
# MONITORING LOOP
|
|
190
|
+
# ==============================================================================
|
|
191
|
+
|
|
192
|
+
# start_monitor - Begin continuous rate limiting monitoring
|
|
193
|
+
start_monitor() {
|
|
194
|
+
local iteration=0
|
|
195
|
+
|
|
196
|
+
echo "[INFO] Rate limiting monitor started (PID: $$)" >&2
|
|
197
|
+
echo "[INFO] Check interval: ${CHECK_INTERVAL}s" >&2
|
|
198
|
+
echo "[INFO] Inbox size limit: $MAX_INBOX_SIZE messages" >&2
|
|
199
|
+
echo "[INFO] Alert thresholds: Critical=${INBOX_CRITICAL_PCT}%, Warning=${INBOX_WARNING_PCT}%" >&2
|
|
200
|
+
echo "[INFO] Metrics file: $METRICS_FILE" >&2
|
|
201
|
+
echo "[INFO] Alert log: $ALERT_LOG_FILE" >&2
|
|
202
|
+
|
|
203
|
+
# Write PID file
|
|
204
|
+
echo $$ > "$MONITOR_PID_FILE"
|
|
205
|
+
|
|
206
|
+
while true; do
|
|
207
|
+
iteration=$((iteration + 1))
|
|
208
|
+
|
|
209
|
+
# Collect all rate limiting metrics
|
|
210
|
+
collect_inbox_metrics
|
|
211
|
+
collect_backpressure_metrics
|
|
212
|
+
collect_message_failure_metrics
|
|
213
|
+
collect_overflow_metrics
|
|
214
|
+
|
|
215
|
+
# Log iteration status (every 30 iterations = 5 minutes at 10s interval)
|
|
216
|
+
if [ $((iteration % 30)) -eq 0 ]; then
|
|
217
|
+
echo "[INFO] Rate limiting monitor iteration $iteration completed" >&2
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
# Sleep until next check
|
|
221
|
+
sleep "$CHECK_INTERVAL"
|
|
222
|
+
done
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
# ==============================================================================
|
|
226
|
+
# CONTROL FUNCTIONS
|
|
227
|
+
# ==============================================================================
|
|
228
|
+
|
|
229
|
+
# get_monitor_status - Check if monitor is running
|
|
230
|
+
get_monitor_status() {
|
|
231
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
232
|
+
local pid
|
|
233
|
+
pid=$(cat "$MONITOR_PID_FILE")
|
|
234
|
+
|
|
235
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
236
|
+
echo "running (PID: $pid)"
|
|
237
|
+
return 0
|
|
238
|
+
else
|
|
239
|
+
echo "stale (PID file exists but process not running)"
|
|
240
|
+
rm -f "$MONITOR_PID_FILE"
|
|
241
|
+
return 1
|
|
242
|
+
fi
|
|
243
|
+
else
|
|
244
|
+
echo "stopped"
|
|
245
|
+
return 1
|
|
246
|
+
fi
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
# stop_monitor - Stop running monitor
|
|
250
|
+
stop_monitor() {
|
|
251
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
252
|
+
local pid
|
|
253
|
+
pid=$(cat "$MONITOR_PID_FILE")
|
|
254
|
+
|
|
255
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
256
|
+
echo "[INFO] Stopping rate limiting monitor (PID: $pid)" >&2
|
|
257
|
+
kill -TERM "$pid"
|
|
258
|
+
|
|
259
|
+
# Wait for graceful shutdown (max 5 seconds)
|
|
260
|
+
for i in {1..10}; do
|
|
261
|
+
if ! kill -0 "$pid" 2>/dev/null; then
|
|
262
|
+
echo "[INFO] Rate limiting monitor stopped successfully" >&2
|
|
263
|
+
return 0
|
|
264
|
+
fi
|
|
265
|
+
sleep 0.5
|
|
266
|
+
done
|
|
267
|
+
|
|
268
|
+
# Force kill if still running
|
|
269
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
270
|
+
echo "[WARN] Monitor did not stop gracefully, forcing..." >&2
|
|
271
|
+
kill -KILL "$pid" 2>/dev/null || true
|
|
272
|
+
fi
|
|
273
|
+
fi
|
|
274
|
+
|
|
275
|
+
rm -f "$MONITOR_PID_FILE"
|
|
276
|
+
else
|
|
277
|
+
echo "[INFO] No rate limiting monitor running" >&2
|
|
278
|
+
fi
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
# get_rate_limiting_summary - Display current rate limiting status
|
|
282
|
+
get_rate_limiting_summary() {
|
|
283
|
+
echo "=== Rate Limiting Status ==="
|
|
284
|
+
echo ""
|
|
285
|
+
|
|
286
|
+
# Inbox utilization summary
|
|
287
|
+
if [ -d "$CFN_BASE_DIR/inbox" ]; then
|
|
288
|
+
echo "Inbox Utilization:"
|
|
289
|
+
for agent_inbox in "$CFN_BASE_DIR/inbox"/*; do
|
|
290
|
+
[ -d "$agent_inbox" ] || continue
|
|
291
|
+
|
|
292
|
+
local agent_id
|
|
293
|
+
agent_id=$(basename "$agent_inbox")
|
|
294
|
+
|
|
295
|
+
local message_count=0
|
|
296
|
+
if ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l > /dev/null 2>&1; then
|
|
297
|
+
message_count=$(ls -1 "$agent_inbox"/*.msg 2>/dev/null | wc -l)
|
|
298
|
+
fi
|
|
299
|
+
|
|
300
|
+
local utilization_pct=0
|
|
301
|
+
if [ "$MAX_INBOX_SIZE" -gt 0 ]; then
|
|
302
|
+
utilization_pct=$((message_count * 100 / MAX_INBOX_SIZE))
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
printf " %-30s %3d messages (%3d%% utilization)\n" "$agent_id:" "$message_count" "$utilization_pct"
|
|
306
|
+
done
|
|
307
|
+
else
|
|
308
|
+
echo " No inbox directory found"
|
|
309
|
+
fi
|
|
310
|
+
|
|
311
|
+
echo ""
|
|
312
|
+
|
|
313
|
+
# Recent alerts
|
|
314
|
+
if [ -f "$ALERT_LOG_FILE" ]; then
|
|
315
|
+
echo "Recent Rate Limiting Alerts (last hour):"
|
|
316
|
+
tail -n 100 "$ALERT_LOG_FILE" 2>/dev/null | \
|
|
317
|
+
jq -r 'select(.alert | contains("inbox") or contains("backpressure") or contains("overflow")) |
|
|
318
|
+
"\(.timestamp) [\(.severity)] \(.alert): \(.message)"' | \
|
|
319
|
+
tail -n 10 || echo " No recent alerts"
|
|
320
|
+
else
|
|
321
|
+
echo " No alerts logged"
|
|
322
|
+
fi
|
|
323
|
+
|
|
324
|
+
echo ""
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
# ==============================================================================
|
|
328
|
+
# MAIN EXECUTION
|
|
329
|
+
# ==============================================================================
|
|
330
|
+
|
|
331
|
+
case "${1:-start}" in
|
|
332
|
+
start)
|
|
333
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
334
|
+
echo "[ERROR] Rate limiting monitor already running (PID: $(cat "$MONITOR_PID_FILE"))" >&2
|
|
335
|
+
exit 1
|
|
336
|
+
fi
|
|
337
|
+
start_monitor
|
|
338
|
+
;;
|
|
339
|
+
|
|
340
|
+
stop)
|
|
341
|
+
stop_monitor
|
|
342
|
+
;;
|
|
343
|
+
|
|
344
|
+
restart)
|
|
345
|
+
stop_monitor
|
|
346
|
+
sleep 1
|
|
347
|
+
start_monitor
|
|
348
|
+
;;
|
|
349
|
+
|
|
350
|
+
status)
|
|
351
|
+
get_monitor_status
|
|
352
|
+
;;
|
|
353
|
+
|
|
354
|
+
summary)
|
|
355
|
+
get_rate_limiting_summary
|
|
356
|
+
;;
|
|
357
|
+
|
|
358
|
+
background)
|
|
359
|
+
# Start in background
|
|
360
|
+
if [ -f "$MONITOR_PID_FILE" ]; then
|
|
361
|
+
echo "[ERROR] Rate limiting monitor already running (PID: $(cat "$MONITOR_PID_FILE"))" >&2
|
|
362
|
+
exit 1
|
|
363
|
+
fi
|
|
364
|
+
nohup "$0" start > /dev/shm/rate-limiting-monitor.log 2>&1 &
|
|
365
|
+
echo "[INFO] Rate limiting monitor started in background (PID: $!)" >&2
|
|
366
|
+
;;
|
|
367
|
+
|
|
368
|
+
*)
|
|
369
|
+
echo "Usage: $0 {start|stop|restart|status|summary|background}" >&2
|
|
370
|
+
echo "" >&2
|
|
371
|
+
echo "Commands:" >&2
|
|
372
|
+
echo " start - Start monitoring in foreground" >&2
|
|
373
|
+
echo " stop - Stop running monitor" >&2
|
|
374
|
+
echo " restart - Restart monitor" >&2
|
|
375
|
+
echo " status - Check monitor status" >&2
|
|
376
|
+
echo " summary - Display current rate limiting status" >&2
|
|
377
|
+
echo " background - Start monitor in background" >&2
|
|
378
|
+
exit 1
|
|
379
|
+
;;
|
|
380
|
+
esac
|