@miller-tech/uap 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +888 -0
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +684 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/benchmarks/agents/naive-agent.d.ts +60 -0
- package/dist/benchmarks/agents/naive-agent.d.ts.map +1 -0
- package/dist/benchmarks/agents/naive-agent.js +144 -0
- package/dist/benchmarks/agents/naive-agent.js.map +1 -0
- package/dist/benchmarks/agents/uap-agent.d.ts +167 -0
- package/dist/benchmarks/agents/uap-agent.d.ts.map +1 -0
- package/dist/benchmarks/agents/uap-agent.js +437 -0
- package/dist/benchmarks/agents/uap-agent.js.map +1 -0
- package/dist/benchmarks/benchmark.d.ts +328 -0
- package/dist/benchmarks/benchmark.d.ts.map +1 -0
- package/dist/benchmarks/benchmark.js +112 -0
- package/dist/benchmarks/benchmark.js.map +1 -0
- package/dist/benchmarks/execution-verifier.d.ts +41 -0
- package/dist/benchmarks/execution-verifier.d.ts.map +1 -0
- package/dist/benchmarks/execution-verifier.js +340 -0
- package/dist/benchmarks/execution-verifier.js.map +1 -0
- package/dist/benchmarks/hierarchical-prompting.d.ts +37 -0
- package/dist/benchmarks/hierarchical-prompting.d.ts.map +1 -0
- package/dist/benchmarks/hierarchical-prompting.js +246 -0
- package/dist/benchmarks/hierarchical-prompting.js.map +1 -0
- package/dist/benchmarks/improved-benchmark.d.ts +89 -0
- package/dist/benchmarks/improved-benchmark.d.ts.map +1 -0
- package/dist/benchmarks/improved-benchmark.js +585 -0
- package/dist/benchmarks/improved-benchmark.js.map +1 -0
- package/dist/benchmarks/index.d.ts +11 -0
- package/dist/benchmarks/index.d.ts.map +1 -0
- package/dist/benchmarks/index.js +11 -0
- package/dist/benchmarks/index.js.map +1 -0
- package/dist/benchmarks/model-integration.d.ts +111 -0
- package/dist/benchmarks/model-integration.d.ts.map +1 -0
- package/dist/benchmarks/model-integration.js +904 -0
- package/dist/benchmarks/model-integration.js.map +1 -0
- package/dist/benchmarks/multi-turn-agent.d.ts +44 -0
- package/dist/benchmarks/multi-turn-agent.d.ts.map +1 -0
- package/dist/benchmarks/multi-turn-agent.js +254 -0
- package/dist/benchmarks/multi-turn-agent.js.map +1 -0
- package/dist/benchmarks/multi-turn-loop.d.ts +57 -0
- package/dist/benchmarks/multi-turn-loop.d.ts.map +1 -0
- package/dist/benchmarks/multi-turn-loop.js +167 -0
- package/dist/benchmarks/multi-turn-loop.js.map +1 -0
- package/dist/benchmarks/tasks.d.ts +19 -0
- package/dist/benchmarks/tasks.d.ts.map +1 -0
- package/dist/benchmarks/tasks.js +435 -0
- package/dist/benchmarks/tasks.js.map +1 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +546 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/llama-server-optimize.d.ts +18 -0
- package/dist/bin/llama-server-optimize.d.ts.map +1 -0
- package/dist/bin/llama-server-optimize.js +708 -0
- package/dist/bin/llama-server-optimize.js.map +1 -0
- package/dist/bin/policy.d.ts +3 -0
- package/dist/bin/policy.d.ts.map +1 -0
- package/dist/bin/policy.js +143 -0
- package/dist/bin/policy.js.map +1 -0
- package/dist/bin/tool-calls.d.ts +3 -0
- package/dist/bin/tool-calls.d.ts.map +1 -0
- package/dist/bin/tool-calls.js +4 -0
- package/dist/bin/tool-calls.js.map +1 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +2 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/web-browser.d.ts +30 -0
- package/dist/browser/web-browser.d.ts.map +1 -0
- package/dist/browser/web-browser.js +93 -0
- package/dist/browser/web-browser.js.map +1 -0
- package/dist/cli/agent.d.ts +20 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +474 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/analyze.d.ts +7 -0
- package/dist/cli/analyze.d.ts.map +1 -0
- package/dist/cli/analyze.js +103 -0
- package/dist/cli/analyze.js.map +1 -0
- package/dist/cli/completion-gates.d.ts +51 -0
- package/dist/cli/completion-gates.d.ts.map +1 -0
- package/dist/cli/completion-gates.js +201 -0
- package/dist/cli/completion-gates.js.map +1 -0
- package/dist/cli/compliance.d.ts +8 -0
- package/dist/cli/compliance.d.ts.map +1 -0
- package/dist/cli/compliance.js +509 -0
- package/dist/cli/compliance.js.map +1 -0
- package/dist/cli/coord.d.ts +7 -0
- package/dist/cli/coord.d.ts.map +1 -0
- package/dist/cli/coord.js +138 -0
- package/dist/cli/coord.js.map +1 -0
- package/dist/cli/dashboard.d.ts +21 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +1508 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/deploy.d.ts +19 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +387 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/droids.d.ts +9 -0
- package/dist/cli/droids.d.ts.map +1 -0
- package/dist/cli/droids.js +227 -0
- package/dist/cli/droids.js.map +1 -0
- package/dist/cli/generate.d.ts +17 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +432 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/hooks.d.ts +9 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +464 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +364 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp-router.d.ts +16 -0
- package/dist/cli/mcp-router.d.ts.map +1 -0
- package/dist/cli/mcp-router.js +143 -0
- package/dist/cli/mcp-router.js.map +1 -0
- package/dist/cli/memory.d.ts +24 -0
- package/dist/cli/memory.d.ts.map +1 -0
- package/dist/cli/memory.js +885 -0
- package/dist/cli/memory.js.map +1 -0
- package/dist/cli/model.d.ts +15 -0
- package/dist/cli/model.d.ts.map +1 -0
- package/dist/cli/model.js +290 -0
- package/dist/cli/model.js.map +1 -0
- package/dist/cli/patterns.d.ts +26 -0
- package/dist/cli/patterns.d.ts.map +1 -0
- package/dist/cli/patterns.js +862 -0
- package/dist/cli/patterns.js.map +1 -0
- package/dist/cli/rtk-validation.d.ts +9 -0
- package/dist/cli/rtk-validation.d.ts.map +1 -0
- package/dist/cli/rtk-validation.js +9 -0
- package/dist/cli/rtk-validation.js.map +1 -0
- package/dist/cli/rtk.d.ts +34 -0
- package/dist/cli/rtk.d.ts.map +1 -0
- package/dist/cli/rtk.js +401 -0
- package/dist/cli/rtk.js.map +1 -0
- package/dist/cli/schema-diff.d.ts +7 -0
- package/dist/cli/schema-diff.d.ts.map +1 -0
- package/dist/cli/schema-diff.js +11 -0
- package/dist/cli/schema-diff.js.map +1 -0
- package/dist/cli/setup-mcp-router.d.ts +8 -0
- package/dist/cli/setup-mcp-router.d.ts.map +1 -0
- package/dist/cli/setup-mcp-router.js +163 -0
- package/dist/cli/setup-mcp-router.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +2 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +806 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/setup.d.ts +15 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +154 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/sync.d.ts +8 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +395 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/task.d.ts +33 -0
- package/dist/cli/task.d.ts.map +1 -0
- package/dist/cli/task.js +672 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/tool-calls.d.ts +20 -0
- package/dist/cli/tool-calls.d.ts.map +1 -0
- package/dist/cli/tool-calls.js +605 -0
- package/dist/cli/tool-calls.js.map +1 -0
- package/dist/cli/uap.d.ts +10 -0
- package/dist/cli/uap.d.ts.map +1 -0
- package/dist/cli/uap.js +398 -0
- package/dist/cli/uap.js.map +1 -0
- package/dist/cli/update.d.ts +10 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +300 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/visualize.d.ts +77 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +287 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/cli/worktree.d.ts +9 -0
- package/dist/cli/worktree.d.ts.map +1 -0
- package/dist/cli/worktree.js +213 -0
- package/dist/cli/worktree.js.map +1 -0
- package/dist/coordination/adaptive-patterns.d.ts +65 -0
- package/dist/coordination/adaptive-patterns.d.ts.map +1 -0
- package/dist/coordination/adaptive-patterns.js +108 -0
- package/dist/coordination/adaptive-patterns.js.map +1 -0
- package/dist/coordination/auto-agent.d.ts +82 -0
- package/dist/coordination/auto-agent.d.ts.map +1 -0
- package/dist/coordination/auto-agent.js +145 -0
- package/dist/coordination/auto-agent.js.map +1 -0
- package/dist/coordination/capability-router.d.ts +79 -0
- package/dist/coordination/capability-router.d.ts.map +1 -0
- package/dist/coordination/capability-router.js +334 -0
- package/dist/coordination/capability-router.js.map +1 -0
- package/dist/coordination/database.d.ts +13 -0
- package/dist/coordination/database.d.ts.map +1 -0
- package/dist/coordination/database.js +136 -0
- package/dist/coordination/database.js.map +1 -0
- package/dist/coordination/deploy-batcher.d.ts +122 -0
- package/dist/coordination/deploy-batcher.d.ts.map +1 -0
- package/dist/coordination/deploy-batcher.js +718 -0
- package/dist/coordination/deploy-batcher.js.map +1 -0
- package/dist/coordination/droid-validator.d.ts +59 -0
- package/dist/coordination/droid-validator.d.ts.map +1 -0
- package/dist/coordination/droid-validator.js +142 -0
- package/dist/coordination/droid-validator.js.map +1 -0
- package/dist/coordination/index.d.ts +10 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +10 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/pattern-router.d.ts +50 -0
- package/dist/coordination/pattern-router.d.ts.map +1 -0
- package/dist/coordination/pattern-router.js +118 -0
- package/dist/coordination/pattern-router.js.map +1 -0
- package/dist/coordination/service.d.ts +81 -0
- package/dist/coordination/service.d.ts.map +1 -0
- package/dist/coordination/service.js +619 -0
- package/dist/coordination/service.js.map +1 -0
- package/dist/coordination/worktree-enforcer.d.ts +22 -0
- package/dist/coordination/worktree-enforcer.d.ts.map +1 -0
- package/dist/coordination/worktree-enforcer.js +71 -0
- package/dist/coordination/worktree-enforcer.js.map +1 -0
- package/dist/generators/claude-md.d.ts +3 -0
- package/dist/generators/claude-md.d.ts.map +1 -0
- package/dist/generators/claude-md.js +1020 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/template-loader.d.ts +105 -0
- package/dist/generators/template-loader.d.ts.map +1 -0
- package/dist/generators/template-loader.js +291 -0
- package/dist/generators/template-loader.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-router/config/parser.d.ts +9 -0
- package/dist/mcp-router/config/parser.d.ts.map +1 -0
- package/dist/mcp-router/config/parser.js +174 -0
- package/dist/mcp-router/config/parser.js.map +1 -0
- package/dist/mcp-router/executor/client.d.ts +31 -0
- package/dist/mcp-router/executor/client.d.ts.map +1 -0
- package/dist/mcp-router/executor/client.js +189 -0
- package/dist/mcp-router/executor/client.js.map +1 -0
- package/dist/mcp-router/index.d.ts +22 -0
- package/dist/mcp-router/index.d.ts.map +1 -0
- package/dist/mcp-router/index.js +18 -0
- package/dist/mcp-router/index.js.map +1 -0
- package/dist/mcp-router/output-compressor.d.ts +26 -0
- package/dist/mcp-router/output-compressor.d.ts.map +1 -0
- package/dist/mcp-router/output-compressor.js +236 -0
- package/dist/mcp-router/output-compressor.js.map +1 -0
- package/dist/mcp-router/search/fuzzy.d.ts +26 -0
- package/dist/mcp-router/search/fuzzy.d.ts.map +1 -0
- package/dist/mcp-router/search/fuzzy.js +94 -0
- package/dist/mcp-router/search/fuzzy.js.map +1 -0
- package/dist/mcp-router/server.d.ts +50 -0
- package/dist/mcp-router/server.d.ts.map +1 -0
- package/dist/mcp-router/server.js +229 -0
- package/dist/mcp-router/server.js.map +1 -0
- package/dist/mcp-router/session-stats.d.ts +37 -0
- package/dist/mcp-router/session-stats.d.ts.map +1 -0
- package/dist/mcp-router/session-stats.js +56 -0
- package/dist/mcp-router/session-stats.js.map +1 -0
- package/dist/mcp-router/tools/discover.d.ts +37 -0
- package/dist/mcp-router/tools/discover.d.ts.map +1 -0
- package/dist/mcp-router/tools/discover.js +65 -0
- package/dist/mcp-router/tools/discover.js.map +1 -0
- package/dist/mcp-router/tools/execute.d.ts +43 -0
- package/dist/mcp-router/tools/execute.d.ts.map +1 -0
- package/dist/mcp-router/tools/execute.js +144 -0
- package/dist/mcp-router/tools/execute.js.map +1 -0
- package/dist/mcp-router/types.d.ts +62 -0
- package/dist/mcp-router/types.d.ts.map +1 -0
- package/dist/mcp-router/types.js +6 -0
- package/dist/mcp-router/types.js.map +1 -0
- package/dist/memory/adaptive-context.d.ts +149 -0
- package/dist/memory/adaptive-context.d.ts.map +1 -0
- package/dist/memory/adaptive-context.js +1095 -0
- package/dist/memory/adaptive-context.js.map +1 -0
- package/dist/memory/agent-scoped-memory.d.ts +67 -0
- package/dist/memory/agent-scoped-memory.d.ts.map +1 -0
- package/dist/memory/agent-scoped-memory.js +126 -0
- package/dist/memory/agent-scoped-memory.js.map +1 -0
- package/dist/memory/ambiguity-detector.d.ts +54 -0
- package/dist/memory/ambiguity-detector.d.ts.map +1 -0
- package/dist/memory/ambiguity-detector.js +401 -0
- package/dist/memory/ambiguity-detector.js.map +1 -0
- package/dist/memory/backends/base.d.ts +18 -0
- package/dist/memory/backends/base.d.ts.map +1 -0
- package/dist/memory/backends/base.js +2 -0
- package/dist/memory/backends/base.js.map +1 -0
- package/dist/memory/backends/factory.d.ts +4 -0
- package/dist/memory/backends/factory.d.ts.map +1 -0
- package/dist/memory/backends/factory.js +53 -0
- package/dist/memory/backends/factory.js.map +1 -0
- package/dist/memory/backends/github.d.ts +27 -0
- package/dist/memory/backends/github.d.ts.map +1 -0
- package/dist/memory/backends/github.js +134 -0
- package/dist/memory/backends/github.js.map +1 -0
- package/dist/memory/backends/qdrant-cloud.d.ts +32 -0
- package/dist/memory/backends/qdrant-cloud.d.ts.map +1 -0
- package/dist/memory/backends/qdrant-cloud.js +167 -0
- package/dist/memory/backends/qdrant-cloud.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +116 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +430 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/context-pruner.d.ts +55 -0
- package/dist/memory/context-pruner.d.ts.map +1 -0
- package/dist/memory/context-pruner.js +85 -0
- package/dist/memory/context-pruner.js.map +1 -0
- package/dist/memory/correction-propagator.d.ts +44 -0
- package/dist/memory/correction-propagator.d.ts.map +1 -0
- package/dist/memory/correction-propagator.js +156 -0
- package/dist/memory/correction-propagator.js.map +1 -0
- package/dist/memory/daily-log.d.ts +67 -0
- package/dist/memory/daily-log.d.ts.map +1 -0
- package/dist/memory/daily-log.js +143 -0
- package/dist/memory/daily-log.js.map +1 -0
- package/dist/memory/dynamic-retrieval.d.ts +112 -0
- package/dist/memory/dynamic-retrieval.d.ts.map +1 -0
- package/dist/memory/dynamic-retrieval.js +908 -0
- package/dist/memory/dynamic-retrieval.js.map +1 -0
- package/dist/memory/embeddings.d.ts +172 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +780 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/generic-uap-patterns.d.ts +7 -0
- package/dist/memory/generic-uap-patterns.d.ts.map +1 -0
- package/dist/memory/generic-uap-patterns.js +43 -0
- package/dist/memory/generic-uap-patterns.js.map +1 -0
- package/dist/memory/hierarchical-memory.d.ts +141 -0
- package/dist/memory/hierarchical-memory.d.ts.map +1 -0
- package/dist/memory/hierarchical-memory.js +485 -0
- package/dist/memory/hierarchical-memory.js.map +1 -0
- package/dist/memory/knowledge-graph.d.ts +98 -0
- package/dist/memory/knowledge-graph.d.ts.map +1 -0
- package/dist/memory/knowledge-graph.js +275 -0
- package/dist/memory/knowledge-graph.js.map +1 -0
- package/dist/memory/memory-consolidator.d.ts +124 -0
- package/dist/memory/memory-consolidator.d.ts.map +1 -0
- package/dist/memory/memory-consolidator.js +514 -0
- package/dist/memory/memory-consolidator.js.map +1 -0
- package/dist/memory/memory-maintenance.d.ts +39 -0
- package/dist/memory/memory-maintenance.d.ts.map +1 -0
- package/dist/memory/memory-maintenance.js +336 -0
- package/dist/memory/memory-maintenance.js.map +1 -0
- package/dist/memory/model-router.d.ts +105 -0
- package/dist/memory/model-router.d.ts.map +1 -0
- package/dist/memory/model-router.js +474 -0
- package/dist/memory/model-router.js.map +1 -0
- package/dist/memory/multi-view-memory.d.ts +134 -0
- package/dist/memory/multi-view-memory.d.ts.map +1 -0
- package/dist/memory/multi-view-memory.js +430 -0
- package/dist/memory/multi-view-memory.js.map +1 -0
- package/dist/memory/predictive-memory.d.ts +79 -0
- package/dist/memory/predictive-memory.d.ts.map +1 -0
- package/dist/memory/predictive-memory.js +294 -0
- package/dist/memory/predictive-memory.js.map +1 -0
- package/dist/memory/prepopulate.d.ts +76 -0
- package/dist/memory/prepopulate.d.ts.map +1 -0
- package/dist/memory/prepopulate.js +832 -0
- package/dist/memory/prepopulate.js.map +1 -0
- package/dist/memory/semantic-compression.d.ts +77 -0
- package/dist/memory/semantic-compression.d.ts.map +1 -0
- package/dist/memory/semantic-compression.js +359 -0
- package/dist/memory/semantic-compression.js.map +1 -0
- package/dist/memory/serverless-qdrant.d.ts +102 -0
- package/dist/memory/serverless-qdrant.d.ts.map +1 -0
- package/dist/memory/serverless-qdrant.js +369 -0
- package/dist/memory/serverless-qdrant.js.map +1 -0
- package/dist/memory/short-term/factory.d.ts +26 -0
- package/dist/memory/short-term/factory.d.ts.map +1 -0
- package/dist/memory/short-term/factory.js +28 -0
- package/dist/memory/short-term/factory.js.map +1 -0
- package/dist/memory/short-term/indexeddb.d.ts +25 -0
- package/dist/memory/short-term/indexeddb.d.ts.map +1 -0
- package/dist/memory/short-term/indexeddb.js +64 -0
- package/dist/memory/short-term/indexeddb.js.map +1 -0
- package/dist/memory/short-term/schema.d.ts +6 -0
- package/dist/memory/short-term/schema.d.ts.map +1 -0
- package/dist/memory/short-term/schema.js +141 -0
- package/dist/memory/short-term/schema.js.map +1 -0
- package/dist/memory/short-term/sqlite.d.ts +64 -0
- package/dist/memory/short-term/sqlite.d.ts.map +1 -0
- package/dist/memory/short-term/sqlite.js +274 -0
- package/dist/memory/short-term/sqlite.js.map +1 -0
- package/dist/memory/speculative-cache.d.ts +111 -0
- package/dist/memory/speculative-cache.d.ts.map +1 -0
- package/dist/memory/speculative-cache.js +457 -0
- package/dist/memory/speculative-cache.js.map +1 -0
- package/dist/memory/task-classifier.d.ts +40 -0
- package/dist/memory/task-classifier.d.ts.map +1 -0
- package/dist/memory/task-classifier.js +342 -0
- package/dist/memory/task-classifier.js.map +1 -0
- package/dist/memory/terminal-bench-knowledge.d.ts +48 -0
- package/dist/memory/terminal-bench-knowledge.d.ts.map +1 -0
- package/dist/memory/terminal-bench-knowledge.js +622 -0
- package/dist/memory/terminal-bench-knowledge.js.map +1 -0
- package/dist/memory/write-gate.d.ts +39 -0
- package/dist/memory/write-gate.d.ts.map +1 -0
- package/dist/memory/write-gate.js +190 -0
- package/dist/memory/write-gate.js.map +1 -0
- package/dist/models/api-client.d.ts +46 -0
- package/dist/models/api-client.d.ts.map +1 -0
- package/dist/models/api-client.js +182 -0
- package/dist/models/api-client.js.map +1 -0
- package/dist/models/execution-profiles.d.ts +64 -0
- package/dist/models/execution-profiles.d.ts.map +1 -0
- package/dist/models/execution-profiles.js +403 -0
- package/dist/models/execution-profiles.js.map +1 -0
- package/dist/models/executor.d.ts +130 -0
- package/dist/models/executor.d.ts.map +1 -0
- package/dist/models/executor.js +382 -0
- package/dist/models/executor.js.map +1 -0
- package/dist/models/index.d.ts +19 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +23 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/plan-validator.d.ts +37 -0
- package/dist/models/plan-validator.d.ts.map +1 -0
- package/dist/models/plan-validator.js +179 -0
- package/dist/models/plan-validator.js.map +1 -0
- package/dist/models/planner.d.ts +73 -0
- package/dist/models/planner.d.ts.map +1 -0
- package/dist/models/planner.js +375 -0
- package/dist/models/planner.js.map +1 -0
- package/dist/models/router.d.ts +96 -0
- package/dist/models/router.d.ts.map +1 -0
- package/dist/models/router.js +523 -0
- package/dist/models/router.js.map +1 -0
- package/dist/models/types.d.ts +370 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +232 -0
- package/dist/models/types.js.map +1 -0
- package/dist/models/unified-router.d.ts +152 -0
- package/dist/models/unified-router.d.ts.map +1 -0
- package/dist/models/unified-router.js +313 -0
- package/dist/models/unified-router.js.map +1 -0
- package/dist/policies/convert-policy-to-claude.d.ts +3 -0
- package/dist/policies/convert-policy-to-claude.d.ts.map +1 -0
- package/dist/policies/convert-policy-to-claude.js +87 -0
- package/dist/policies/convert-policy-to-claude.js.map +1 -0
- package/dist/policies/database-manager.d.ts +27 -0
- package/dist/policies/database-manager.d.ts.map +1 -0
- package/dist/policies/database-manager.js +198 -0
- package/dist/policies/database-manager.js.map +1 -0
- package/dist/policies/enforced-tool-router.d.ts +53 -0
- package/dist/policies/enforced-tool-router.d.ts.map +1 -0
- package/dist/policies/enforced-tool-router.js +80 -0
- package/dist/policies/enforced-tool-router.js.map +1 -0
- package/dist/policies/index.d.ts +10 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +8 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/policy-gate.d.ts +59 -0
- package/dist/policies/policy-gate.d.ts.map +1 -0
- package/dist/policies/policy-gate.js +171 -0
- package/dist/policies/policy-gate.js.map +1 -0
- package/dist/policies/policy-memory.d.ts +18 -0
- package/dist/policies/policy-memory.d.ts.map +1 -0
- package/dist/policies/policy-memory.js +126 -0
- package/dist/policies/policy-memory.js.map +1 -0
- package/dist/policies/policy-tools.d.ts +11 -0
- package/dist/policies/policy-tools.d.ts.map +1 -0
- package/dist/policies/policy-tools.js +66 -0
- package/dist/policies/policy-tools.js.map +1 -0
- package/dist/policies/schemas/policy.d.ts +69 -0
- package/dist/policies/schemas/policy.d.ts.map +1 -0
- package/dist/policies/schemas/policy.js +31 -0
- package/dist/policies/schemas/policy.js.map +1 -0
- package/dist/tasks/coordination.d.ts +83 -0
- package/dist/tasks/coordination.d.ts.map +1 -0
- package/dist/tasks/coordination.js +291 -0
- package/dist/tasks/coordination.js.map +1 -0
- package/dist/tasks/database.d.ts +19 -0
- package/dist/tasks/database.d.ts.map +1 -0
- package/dist/tasks/database.js +149 -0
- package/dist/tasks/database.js.map +1 -0
- package/dist/tasks/decoder-gate.d.ts +64 -0
- package/dist/tasks/decoder-gate.d.ts.map +1 -0
- package/dist/tasks/decoder-gate.js +268 -0
- package/dist/tasks/decoder-gate.js.map +1 -0
- package/dist/tasks/index.d.ts +6 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +6 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/service.d.ts +40 -0
- package/dist/tasks/service.d.ts.map +1 -0
- package/dist/tasks/service.js +671 -0
- package/dist/tasks/service.js.map +1 -0
- package/dist/tasks/types.d.ts +238 -0
- package/dist/tasks/types.d.ts.map +1 -0
- package/dist/tasks/types.js +74 -0
- package/dist/tasks/types.js.map +1 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +2 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/session-telemetry.d.ts +56 -0
- package/dist/telemetry/session-telemetry.d.ts.map +1 -0
- package/dist/telemetry/session-telemetry.js +807 -0
- package/dist/telemetry/session-telemetry.js.map +1 -0
- package/dist/types/analysis.d.ts +82 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +2 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/config.d.ts +3324 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +418 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/coordination.d.ts +240 -0
- package/dist/types/coordination.d.ts.map +1 -0
- package/dist/types/coordination.js +43 -0
- package/dist/types/coordination.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/uap-droids-strict.d.ts +59 -0
- package/dist/uap-droids-strict.d.ts.map +1 -0
- package/dist/uap-droids-strict.js +200 -0
- package/dist/uap-droids-strict.js.map +1 -0
- package/dist/utils/config-manager.d.ts +30 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +41 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/fetch-with-retry.d.ts +5 -0
- package/dist/utils/fetch-with-retry.d.ts.map +1 -0
- package/dist/utils/fetch-with-retry.js +61 -0
- package/dist/utils/fetch-with-retry.js.map +1 -0
- package/dist/utils/merge-claude-md.d.ts +28 -0
- package/dist/utils/merge-claude-md.d.ts.map +1 -0
- package/dist/utils/merge-claude-md.js +342 -0
- package/dist/utils/merge-claude-md.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +58 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +100 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/string-similarity.d.ts +37 -0
- package/dist/utils/string-similarity.d.ts.map +1 -0
- package/dist/utils/string-similarity.js +114 -0
- package/dist/utils/string-similarity.js.map +1 -0
- package/dist/utils/validate-json.d.ts +51 -0
- package/dist/utils/validate-json.d.ts.map +1 -0
- package/dist/utils/validate-json.js +94 -0
- package/dist/utils/validate-json.js.map +1 -0
- package/docs/INDEX.md +66 -0
- package/docs/architecture/MULTI_MODEL.md +224 -0
- package/docs/architecture/SYSTEM_ANALYSIS.md +1117 -0
- package/docs/architecture/UAP_COMPLIANCE.md +217 -0
- package/docs/architecture/UAP_PROTOCOL.md +339 -0
- package/docs/architecture/UAP_STRICT_DROIDS.md +172 -0
- package/docs/archive/BALLS_MODE_SELF_ANALYSIS.md +260 -0
- package/docs/archive/FAILING_TASKS_SOLUTION_PLAN.md +668 -0
- package/docs/archive/JINJA2-SYSTEM-MESSAGE-FIX.md +209 -0
- package/docs/archive/NPM-PUBLISH-V0.9.1.md +240 -0
- package/docs/archive/OPTIMIZATION_OPTIONS.md +334 -0
- package/docs/archive/SETUP_IMPROVEMENTS.md +213 -0
- package/docs/archive/UAP_GENERIC_OPTIMIZATION_PLAN.md +270 -0
- package/docs/archive/UAP_V103_PATTERN_DESIGN.md +315 -0
- package/docs/archive/UAP_V104_COMPLIANCE_DESIGN.md +223 -0
- package/docs/archive/changelog/2026-03-10_uap-100-compliance.md +77 -0
- package/docs/archive/changelog/2026-03-10_uap-full-system-verification.md +109 -0
- package/docs/benchmarks/ACCURACY_ANALYSIS.md +471 -0
- package/docs/benchmarks/TOKEN_OPTIMIZATION.md +572 -0
- package/docs/benchmarks/VALIDATION_PLAN.md +568 -0
- package/docs/benchmarks/VALIDATION_RESULTS.md +161 -0
- package/docs/deployment/DEPLOYMENT.md +895 -0
- package/docs/deployment/DEPLOYMENT_STRATEGIES.md +518 -0
- package/docs/deployment/DEPLOY_BATCHER_ANALYSIS.md +856 -0
- package/docs/deployment/DEPLOY_BATCHING.md +273 -0
- package/docs/deployment/DEPLOY_BUCKETING_ANALYSIS.md +420 -0
- package/docs/deployment/QWEN35_LLAMA_CPP.md +265 -0
- package/docs/getting-started/INTEGRATION.md +449 -0
- package/docs/getting-started/OVERVIEW.md +344 -0
- package/docs/getting-started/SETUP.md +203 -0
- package/docs/integrations/MCP_ROUTER_SETUP.md +445 -0
- package/docs/integrations/RTK_INTEGRATION.md +468 -0
- package/docs/operations/TROUBLESHOOTING.md +660 -0
- package/docs/reference/API_REFERENCE.md +903 -0
- package/docs/reference/FEATURES.md +472 -0
- package/docs/reference/HARNESS-MATRIX.md +318 -0
- package/docs/reference/UAP_CLI_REFERENCE.md +600 -0
- package/docs/research/BEHAVIORAL_PATTERNS.md +228 -0
- package/docs/research/DOMAIN_STRATEGIES.md +316 -0
- package/docs/research/MEMORY_SYSTEMS_COMPARISON.md +812 -0
- package/docs/research/PATTERN_ANALYSIS_2026-01-18.md +436 -0
- package/docs/research/PERFORMANCE_ANALYSIS_2026-01-18.md +209 -0
- package/docs/research/PERFORMANCE_TEST_PLAN.md +383 -0
- package/docs/research/TERMINAL_BENCH_LEARNINGS.md +217 -0
- package/package.json +113 -0
- package/scripts/README.md +161 -0
- package/templates/CLAUDE.template.md +10 -0
- package/templates/CLAUDE_ARCHITECTURE.template.md +103 -0
- package/templates/CLAUDE_CODING.template.md +127 -0
- package/templates/CLAUDE_DROIDS.template.md +109 -0
- package/templates/CLAUDE_MEMORY.template.md +131 -0
- package/templates/CLAUDE_WORKFLOWS.template.md +139 -0
- package/templates/PROJECT.template.md +209 -0
- package/templates/SCHEMA.md +57 -0
- package/templates/archive/CLAUDE.template.root-v6.md +534 -0
- package/templates/archive/CLAUDE.template.v6.md +534 -0
- package/templates/hooks/forgecode/pre-compact.sh +68 -0
- package/templates/hooks/forgecode/session-start.sh +169 -0
- package/templates/hooks/forgecode.plugin.sh +128 -0
- package/templates/hooks/pre-compact.sh +74 -0
- package/templates/hooks/session-start.sh +366 -0
- package/tools/agents/README.md +224 -0
- package/tools/agents/UAP/README.md +386 -0
- package/tools/agents/UAP/__init__.py +9 -0
- package/tools/agents/UAP/cli.py +901 -0
- package/tools/agents/UAP/compliance_verify.sh +108 -0
- package/tools/agents/UAP/full_verification.sh +126 -0
- package/tools/agents/UAP/version.py +32 -0
- package/tools/agents/benchmarks/benchmark_memory_systems.py +730 -0
- package/tools/agents/benchmarks/results/benchmark_20260106_064817.json +170 -0
- package/tools/agents/benchmarks/results/benchmark_20260106_064817.md +51 -0
- package/tools/agents/config/chat_template.jinja +77 -0
- package/tools/agents/config/tool-call-schema.json +19 -0
- package/tools/agents/config/tool-call.gbnf +58 -0
- package/tools/agents/docker/Dockerfile.python +52 -0
- package/tools/agents/docker/Dockerfile.ubuntu +55 -0
- package/tools/agents/docker-compose.qdrant.yml +24 -0
- package/tools/agents/install-opencode-local.sh.j2 +135 -0
- package/tools/agents/migrations/apply.py +256 -0
- package/tools/agents/opencode_uap_agent.py +1505 -0
- package/tools/agents/plugin/README.md +91 -0
- package/tools/agents/plugin/index.ts +46 -0
- package/tools/agents/plugin/pre-compact.sh +68 -0
- package/tools/agents/plugin/session-start.sh +175 -0
- package/tools/agents/plugin/uap-commands.ts +45 -0
- package/tools/agents/plugin/uap-droids.ts +54 -0
- package/tools/agents/plugin/uap-patterns.ts +54 -0
- package/tools/agents/plugin/uap-skills.ts +52 -0
- package/tools/agents/plugins/uap-enforce.ts +314 -0
- package/tools/agents/scripts/__pycache__/tool_call_wrapper.cpython-313.pyc +0 -0
- package/tools/agents/scripts/chat_template_verifier.py +343 -0
- package/tools/agents/scripts/fix-qwen-template.js +38 -0
- package/tools/agents/scripts/fix_qwen_chat_template.py +316 -0
- package/tools/agents/scripts/generate_lora_training_data.py +412 -0
- package/tools/agents/scripts/init_qdrant.py +151 -0
- package/tools/agents/scripts/memory_migration.py +560 -0
- package/tools/agents/scripts/migrate_memory_to_qdrant.py +110 -0
- package/tools/agents/scripts/prepare_lora.sh +512 -0
- package/tools/agents/scripts/query_memory.py +200 -0
- package/tools/agents/scripts/qwen-tool-call-test.js +38 -0
- package/tools/agents/scripts/qwen-tool-call-wrapper.js +38 -0
- package/tools/agents/scripts/qwen_tool_call_test.py +464 -0
- package/tools/agents/scripts/qwen_tool_call_wrapper.py +686 -0
- package/tools/agents/scripts/start-services.sh +96 -0
- package/tools/agents/scripts/tool-choice-proxy.cjs +296 -0
- package/tools/agents/scripts/tool_call_test.py +656 -0
- package/tools/agents/scripts/tool_call_wrapper.py +799 -0
- package/tools/agents/tests/test_uap_compliance.py +257 -0
- package/tools/agents/uap_agent.py +122 -0
- package/tools/agents/uap_agent_install.sh +12 -0
|
@@ -0,0 +1,856 @@
|
|
|
1
|
+
# DeployBatcher Feature Analysis
|
|
2
|
+
|
|
3
|
+
> Comprehensive analysis of the `DeployBatcher` class - a multi-agent deployment optimization system designed to reduce CI/CD pipeline minutes through intelligent batching, squashing, and parallel execution.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
1. [Overview](#overview)
|
|
8
|
+
2. [Architecture](#architecture)
|
|
9
|
+
3. [Type System](#type-system)
|
|
10
|
+
4. [Class Diagram](#class-diagram)
|
|
11
|
+
5. [Core Features](#core-features)
|
|
12
|
+
6. [Data Flow](#data-flow)
|
|
13
|
+
7. [State Management](#state-management)
|
|
14
|
+
8. [CI/CD Optimization Strategies](#cicd-optimization-strategies)
|
|
15
|
+
9. [CLI Integration](#cli-integration)
|
|
16
|
+
10. [Usage Examples](#usage-examples)
|
|
17
|
+
11. [Performance Characteristics](#performance-characteristics)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Overview
|
|
22
|
+
|
|
23
|
+
The `DeployBatcher` is a SQLite-backed deployment coordination system that optimizes CI/CD pipeline usage in multi-agent environments. It addresses a critical problem: when multiple AI agents work in parallel, they can trigger redundant CI/CD runs, consuming expensive pipeline minutes.
|
|
24
|
+
|
|
25
|
+
### Key Problem Solved
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Without DeployBatcher:
|
|
29
|
+
Agent A commits → CI Run 1 (5 min)
|
|
30
|
+
Agent B commits → CI Run 2 (5 min)
|
|
31
|
+
Agent C commits → CI Run 3 (5 min)
|
|
32
|
+
Agent A pushes → CI Run 4 (5 min)
|
|
33
|
+
Total: 4 runs × 5 min = 20 CI minutes
|
|
34
|
+
|
|
35
|
+
With DeployBatcher:
|
|
36
|
+
Agent A, B, C queue commits → Batched → Single squashed commit
|
|
37
|
+
Single push → CI Run 1 (5 min)
|
|
38
|
+
Total: 1 run × 5 min = 5 CI minutes (75% reduction)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Architecture
|
|
44
|
+
|
|
45
|
+
```mermaid
|
|
46
|
+
graph TB
|
|
47
|
+
subgraph "Multi-Agent Environment"
|
|
48
|
+
A1[Agent 1]
|
|
49
|
+
A2[Agent 2]
|
|
50
|
+
A3[Agent N]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
subgraph "DeployBatcher Core"
|
|
54
|
+
Q[Queue Layer]
|
|
55
|
+
B[Batch Creator]
|
|
56
|
+
S[Squash Engine]
|
|
57
|
+
E[Executor]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
subgraph "Storage"
|
|
61
|
+
DB[(SQLite DB)]
|
|
62
|
+
DQ[deploy_queue]
|
|
63
|
+
DBT[deploy_batches]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
subgraph "Execution Targets"
|
|
67
|
+
GIT[Git Operations]
|
|
68
|
+
GH[GitHub CLI]
|
|
69
|
+
DEPLOY[Deploy Scripts]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
A1 --> Q
|
|
73
|
+
A2 --> Q
|
|
74
|
+
A3 --> Q
|
|
75
|
+
|
|
76
|
+
Q --> DB
|
|
77
|
+
DB --> DQ
|
|
78
|
+
DB --> DBT
|
|
79
|
+
|
|
80
|
+
Q --> B
|
|
81
|
+
B --> S
|
|
82
|
+
S --> E
|
|
83
|
+
|
|
84
|
+
E --> GIT
|
|
85
|
+
E --> GH
|
|
86
|
+
E --> DEPLOY
|
|
87
|
+
|
|
88
|
+
style Q fill:#e1f5fe
|
|
89
|
+
style B fill:#fff3e0
|
|
90
|
+
style S fill:#f3e5f5
|
|
91
|
+
style E fill:#e8f5e9
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Type System
|
|
97
|
+
|
|
98
|
+
### Core Types (from `types/coordination.ts`)
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Action types that can be batched
|
|
102
|
+
type DeployActionType = 'commit' | 'push' | 'merge' | 'deploy' | 'workflow';
|
|
103
|
+
|
|
104
|
+
// Status lifecycle
|
|
105
|
+
type DeployStatus = 'pending' | 'batched' | 'executing' | 'completed' | 'failed';
|
|
106
|
+
|
|
107
|
+
// Single deploy action
|
|
108
|
+
interface DeployAction {
|
|
109
|
+
id: number;
|
|
110
|
+
agentId: string;
|
|
111
|
+
actionType: DeployActionType;
|
|
112
|
+
target: string;
|
|
113
|
+
payload?: Record<string, unknown>;
|
|
114
|
+
status: DeployStatus;
|
|
115
|
+
batchId?: string;
|
|
116
|
+
queuedAt: string;
|
|
117
|
+
executeAfter?: string;
|
|
118
|
+
priority: number;
|
|
119
|
+
dependencies?: string[];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Grouped batch
|
|
123
|
+
interface DeployBatch {
|
|
124
|
+
id: string; // UUID
|
|
125
|
+
actions: DeployAction[];
|
|
126
|
+
createdAt: string;
|
|
127
|
+
status: DeployStatus;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Execution result
|
|
131
|
+
interface BatchResult {
|
|
132
|
+
batchId: string;
|
|
133
|
+
success: boolean;
|
|
134
|
+
executedActions: number;
|
|
135
|
+
failedActions: number;
|
|
136
|
+
errors?: string[];
|
|
137
|
+
duration: number; // milliseconds
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Configuration Interfaces
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// Dynamic window configuration (per action type)
|
|
145
|
+
interface DynamicBatchWindows {
|
|
146
|
+
commit: number; // Default: 30000ms (30s)
|
|
147
|
+
push: number; // Default: 5000ms (5s)
|
|
148
|
+
merge: number; // Default: 10000ms (10s)
|
|
149
|
+
workflow: number; // Default: 5000ms (5s)
|
|
150
|
+
deploy: number; // Default: 60000ms (60s)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Batcher configuration
|
|
154
|
+
interface DeployBatcherConfig {
|
|
155
|
+
dbPath?: string;
|
|
156
|
+
batchWindowMs?: number; // Legacy single window
|
|
157
|
+
dynamicWindows?: Partial<DynamicBatchWindows>;
|
|
158
|
+
maxBatchSize?: number; // Default: 20
|
|
159
|
+
dryRun?: boolean;
|
|
160
|
+
parallelExecution?: boolean; // Default: true
|
|
161
|
+
maxParallelActions?: number; // Default: 5
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Class Diagram
|
|
168
|
+
|
|
169
|
+
```mermaid
|
|
170
|
+
classDiagram
|
|
171
|
+
class DeployBatcher {
|
|
172
|
+
-db: Database
|
|
173
|
+
-dynamicWindows: DynamicBatchWindows
|
|
174
|
+
-maxBatchSize: number
|
|
175
|
+
-dryRun: boolean
|
|
176
|
+
-parallelExecution: boolean
|
|
177
|
+
-maxParallelActions: number
|
|
178
|
+
|
|
179
|
+
+constructor(config?: DeployBatcherConfig)
|
|
180
|
+
+getBatchWindow(actionType): number
|
|
181
|
+
+setUrgentMode(urgent: boolean): void
|
|
182
|
+
+queue(agentId, actionType, target, payload?, options?): Promise~number~
|
|
183
|
+
+queueBulk(agentId, actions): Promise~number[]~
|
|
184
|
+
+createBatch(): Promise~DeployBatch|null~
|
|
185
|
+
+executeBatch(batchId): Promise~BatchResult~
|
|
186
|
+
+getBatch(batchId): DeployBatch|null
|
|
187
|
+
+getPendingBatches(): DeployBatch[]
|
|
188
|
+
+flushAll(): Promise~BatchResult[]~
|
|
189
|
+
+getWindowConfig(): DynamicBatchWindows
|
|
190
|
+
|
|
191
|
+
-queueSync(agentId, actionType, target, payload?, options?): number
|
|
192
|
+
-findSimilarAction(actionType, target): DeployAction|null
|
|
193
|
+
-canMerge(existing, incoming): boolean
|
|
194
|
+
-mergeActions(existingId, newPayload?): Promise~void~
|
|
195
|
+
-mergePayloads(existing, incoming): Record
|
|
196
|
+
-groupByTarget(actions): Map
|
|
197
|
+
-squashActions(grouped): DeployAction[]
|
|
198
|
+
-squashCommits(commits): DeployAction
|
|
199
|
+
-categorizeActions(actions): {sequential, parallel}
|
|
200
|
+
-executeParallel(actions): Promise~Array~
|
|
201
|
+
-executeAction(action): Promise~void~
|
|
202
|
+
-executeCommit(target, payload): Promise~void~
|
|
203
|
+
-executePush(target, payload): Promise~void~
|
|
204
|
+
-executeMerge(target, payload): Promise~void~
|
|
205
|
+
-executeWorkflow(target, payload): Promise~void~
|
|
206
|
+
-executeDeploy(target, payload): Promise~void~
|
|
207
|
+
-updateActionStatus(actionId, status): void
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
class CoordinationDatabase {
|
|
211
|
+
-db: Database
|
|
212
|
+
-instance: CoordinationDatabase$
|
|
213
|
+
|
|
214
|
+
+getInstance(dbPath): CoordinationDatabase$
|
|
215
|
+
+resetInstance(): void$
|
|
216
|
+
+getDatabase(): Database
|
|
217
|
+
+close(): void
|
|
218
|
+
-initSchema(): void
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
class DeployAction {
|
|
222
|
+
<<interface>>
|
|
223
|
+
+id: number
|
|
224
|
+
+agentId: string
|
|
225
|
+
+actionType: DeployActionType
|
|
226
|
+
+target: string
|
|
227
|
+
+payload?: Record
|
|
228
|
+
+status: DeployStatus
|
|
229
|
+
+batchId?: string
|
|
230
|
+
+queuedAt: string
|
|
231
|
+
+executeAfter?: string
|
|
232
|
+
+priority: number
|
|
233
|
+
+dependencies?: string[]
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
class DeployBatch {
|
|
237
|
+
<<interface>>
|
|
238
|
+
+id: string
|
|
239
|
+
+actions: DeployAction[]
|
|
240
|
+
+createdAt: string
|
|
241
|
+
+status: DeployStatus
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
class BatchResult {
|
|
245
|
+
<<interface>>
|
|
246
|
+
+batchId: string
|
|
247
|
+
+success: boolean
|
|
248
|
+
+executedActions: number
|
|
249
|
+
+failedActions: number
|
|
250
|
+
+errors?: string[]
|
|
251
|
+
+duration: number
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
class DynamicBatchWindows {
|
|
255
|
+
<<interface>>
|
|
256
|
+
+commit: number
|
|
257
|
+
+push: number
|
|
258
|
+
+merge: number
|
|
259
|
+
+workflow: number
|
|
260
|
+
+deploy: number
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
DeployBatcher --> CoordinationDatabase : uses
|
|
264
|
+
DeployBatcher --> DeployAction : manages
|
|
265
|
+
DeployBatcher --> DeployBatch : creates
|
|
266
|
+
DeployBatcher --> BatchResult : returns
|
|
267
|
+
DeployBatcher --> DynamicBatchWindows : configures
|
|
268
|
+
DeployBatch --> DeployAction : contains
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Core Features
|
|
274
|
+
|
|
275
|
+
### 1. Dynamic Batch Windows
|
|
276
|
+
|
|
277
|
+
Different action types have different time-sensitivity requirements:
|
|
278
|
+
|
|
279
|
+
| Action Type | Window | Rationale |
|
|
280
|
+
|-------------|--------|-----------|
|
|
281
|
+
| `push` | 5s | PRs need fast feedback |
|
|
282
|
+
| `workflow` | 5s | CI triggers should be responsive |
|
|
283
|
+
| `merge` | 10s | Moderate safety buffer |
|
|
284
|
+
| `commit` | 30s | Allows squashing multiple commits |
|
|
285
|
+
| `deploy` | 60s | Safety buffer for production |
|
|
286
|
+
|
|
287
|
+
```mermaid
|
|
288
|
+
gantt
|
|
289
|
+
title Batch Window Timeline
|
|
290
|
+
dateFormat X
|
|
291
|
+
axisFormat %s
|
|
292
|
+
|
|
293
|
+
section Push Actions
|
|
294
|
+
Window (5s) :0, 5
|
|
295
|
+
|
|
296
|
+
section Workflow Actions
|
|
297
|
+
Window (5s) :0, 5
|
|
298
|
+
|
|
299
|
+
section Merge Actions
|
|
300
|
+
Window (10s) :0, 10
|
|
301
|
+
|
|
302
|
+
section Commit Actions
|
|
303
|
+
Window (30s) :0, 30
|
|
304
|
+
|
|
305
|
+
section Deploy Actions
|
|
306
|
+
Window (60s) :0, 60
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### 2. Action Merging & Deduplication
|
|
310
|
+
|
|
311
|
+
The batcher intelligently merges similar pending actions:
|
|
312
|
+
|
|
313
|
+
```mermaid
|
|
314
|
+
flowchart LR
|
|
315
|
+
subgraph "Incoming Actions"
|
|
316
|
+
C1[Commit: file1.ts]
|
|
317
|
+
C2[Commit: file2.ts]
|
|
318
|
+
C3[Commit: file3.ts]
|
|
319
|
+
P1[Push: main]
|
|
320
|
+
P2[Push: main]
|
|
321
|
+
W1[Workflow: test.yml]
|
|
322
|
+
W2[Workflow: test.yml]
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
subgraph "Merge Logic"
|
|
326
|
+
MC[canMerge]
|
|
327
|
+
MP[mergePayloads]
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
subgraph "Result"
|
|
331
|
+
SC[Squashed Commit:\nfile1, file2, file3]
|
|
332
|
+
SP[Single Push: main]
|
|
333
|
+
SW[Single Workflow: test.yml]
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
C1 --> MC
|
|
337
|
+
C2 --> MC
|
|
338
|
+
C3 --> MC
|
|
339
|
+
MC --> MP
|
|
340
|
+
MP --> SC
|
|
341
|
+
|
|
342
|
+
P1 --> MC
|
|
343
|
+
P2 --> MC
|
|
344
|
+
MC --> SP
|
|
345
|
+
|
|
346
|
+
W1 --> MC
|
|
347
|
+
W2 --> MC
|
|
348
|
+
MC --> SW
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### 3. Commit Squashing
|
|
352
|
+
|
|
353
|
+
Multiple commits to the same target are squashed into one:
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
// Input: 3 separate commits
|
|
357
|
+
[
|
|
358
|
+
{ message: "fix: typo in auth", files: ["src/auth.ts"] },
|
|
359
|
+
{ message: "feat: add logging", files: ["src/logger.ts"] },
|
|
360
|
+
{ message: "test: add auth tests", files: ["test/auth.test.ts"] }
|
|
361
|
+
]
|
|
362
|
+
|
|
363
|
+
// Output: Single squashed commit
|
|
364
|
+
{
|
|
365
|
+
message: "Squashed 3 commits:\n\n1. fix: typo in auth\n2. feat: add logging\n3. test: add auth tests",
|
|
366
|
+
files: ["src/auth.ts", "src/logger.ts", "test/auth.test.ts"],
|
|
367
|
+
squashedFrom: [1, 2, 3]
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 4. Parallel Execution
|
|
372
|
+
|
|
373
|
+
Actions are categorized for parallel vs sequential execution:
|
|
374
|
+
|
|
375
|
+
```mermaid
|
|
376
|
+
flowchart TB
|
|
377
|
+
subgraph "Action Pool"
|
|
378
|
+
A1[Commit]
|
|
379
|
+
A2[Push]
|
|
380
|
+
A3[Workflow 1]
|
|
381
|
+
A4[Workflow 2]
|
|
382
|
+
A5[Workflow 3]
|
|
383
|
+
A6[Deploy]
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
subgraph "Categorization"
|
|
387
|
+
CAT{categorizeActions}
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
subgraph "Sequential Queue"
|
|
391
|
+
S1[Commit]
|
|
392
|
+
S2[Push]
|
|
393
|
+
S3[Deploy]
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
subgraph "Parallel Pool"
|
|
397
|
+
P1[Workflow 1]
|
|
398
|
+
P2[Workflow 2]
|
|
399
|
+
P3[Workflow 3]
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
A1 --> CAT
|
|
403
|
+
A2 --> CAT
|
|
404
|
+
A3 --> CAT
|
|
405
|
+
A4 --> CAT
|
|
406
|
+
A5 --> CAT
|
|
407
|
+
A6 --> CAT
|
|
408
|
+
|
|
409
|
+
CAT --> S1
|
|
410
|
+
CAT --> S2
|
|
411
|
+
CAT --> S3
|
|
412
|
+
CAT --> P1
|
|
413
|
+
CAT --> P2
|
|
414
|
+
CAT --> P3
|
|
415
|
+
|
|
416
|
+
S1 --> |"order matters"| S2
|
|
417
|
+
S2 --> S3
|
|
418
|
+
|
|
419
|
+
P1 --> |"concurrent"| DONE[Complete]
|
|
420
|
+
P2 --> |"concurrent"| DONE
|
|
421
|
+
P3 --> |"concurrent"| DONE
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Parallel-safe types**: `workflow` (no state dependencies)
|
|
425
|
+
**Sequential types**: `commit`, `push`, `merge`, `deploy` (state-dependent)
|
|
426
|
+
|
|
427
|
+
### 5. Urgent Mode
|
|
428
|
+
|
|
429
|
+
For time-critical operations, urgent mode reduces all windows:
|
|
430
|
+
|
|
431
|
+
```typescript
|
|
432
|
+
// Normal mode
|
|
433
|
+
{ commit: 30000, push: 5000, merge: 10000, workflow: 5000, deploy: 60000 }
|
|
434
|
+
|
|
435
|
+
// Urgent mode
|
|
436
|
+
{ commit: 2000, push: 1000, merge: 2000, workflow: 1000, deploy: 5000 }
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Data Flow
|
|
442
|
+
|
|
443
|
+
### Queue → Batch → Execute Flow
|
|
444
|
+
|
|
445
|
+
```mermaid
|
|
446
|
+
sequenceDiagram
|
|
447
|
+
participant A1 as Agent 1
|
|
448
|
+
participant A2 as Agent 2
|
|
449
|
+
participant Q as queue()
|
|
450
|
+
participant DB as SQLite
|
|
451
|
+
participant CB as createBatch()
|
|
452
|
+
participant EB as executeBatch()
|
|
453
|
+
participant GIT as Git/GitHub
|
|
454
|
+
|
|
455
|
+
Note over A1,A2: Multiple agents queue actions
|
|
456
|
+
|
|
457
|
+
A1->>Q: queue(commit, main, {files})
|
|
458
|
+
Q->>DB: INSERT INTO deploy_queue
|
|
459
|
+
Q-->>A1: action_id: 1
|
|
460
|
+
|
|
461
|
+
A2->>Q: queue(commit, main, {files})
|
|
462
|
+
Q->>DB: findSimilarAction()
|
|
463
|
+
DB-->>Q: existing action found
|
|
464
|
+
Q->>DB: mergeActions()
|
|
465
|
+
Q-->>A2: action_id: 1 (merged)
|
|
466
|
+
|
|
467
|
+
A1->>Q: queue(push, main)
|
|
468
|
+
Q->>DB: INSERT INTO deploy_queue
|
|
469
|
+
Q-->>A1: action_id: 2
|
|
470
|
+
|
|
471
|
+
Note over CB: Time window expires
|
|
472
|
+
|
|
473
|
+
rect rgb(255, 243, 224)
|
|
474
|
+
CB->>DB: SELECT pending WHERE execute_after <= now
|
|
475
|
+
DB-->>CB: [action 1, action 2]
|
|
476
|
+
CB->>CB: groupByTarget()
|
|
477
|
+
CB->>CB: squashActions()
|
|
478
|
+
CB->>DB: UPDATE status='batched', INSERT batch
|
|
479
|
+
CB-->>EB: DeployBatch
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
rect rgb(232, 245, 233)
|
|
483
|
+
EB->>EB: categorizeActions()
|
|
484
|
+
EB->>DB: UPDATE status='executing'
|
|
485
|
+
|
|
486
|
+
par Parallel Execution
|
|
487
|
+
EB->>GIT: executeAction(workflow)
|
|
488
|
+
and
|
|
489
|
+
EB->>GIT: executeAction(workflow)
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
loop Sequential Execution
|
|
493
|
+
EB->>GIT: executeCommit()
|
|
494
|
+
EB->>GIT: executePush()
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
EB->>DB: UPDATE status='completed'
|
|
498
|
+
EB-->>A1: BatchResult
|
|
499
|
+
end
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## State Management
|
|
505
|
+
|
|
506
|
+
### Action Status Lifecycle
|
|
507
|
+
|
|
508
|
+
```mermaid
|
|
509
|
+
stateDiagram-v2
|
|
510
|
+
[*] --> pending: queue()
|
|
511
|
+
|
|
512
|
+
pending --> pending: mergeActions()
|
|
513
|
+
pending --> batched: createBatch()
|
|
514
|
+
|
|
515
|
+
batched --> executing: executeBatch()
|
|
516
|
+
|
|
517
|
+
executing --> completed: success
|
|
518
|
+
executing --> failed: error
|
|
519
|
+
|
|
520
|
+
completed --> [*]
|
|
521
|
+
failed --> [*]
|
|
522
|
+
|
|
523
|
+
note right of pending
|
|
524
|
+
Actions wait in queue
|
|
525
|
+
until executeAfter time
|
|
526
|
+
end note
|
|
527
|
+
|
|
528
|
+
note right of batched
|
|
529
|
+
Actions grouped into
|
|
530
|
+
batch, ready for execution
|
|
531
|
+
end note
|
|
532
|
+
|
|
533
|
+
note right of executing
|
|
534
|
+
Parallel/sequential
|
|
535
|
+
execution in progress
|
|
536
|
+
end note
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### Batch Status Lifecycle
|
|
540
|
+
|
|
541
|
+
```mermaid
|
|
542
|
+
stateDiagram-v2
|
|
543
|
+
[*] --> pending: createBatch()
|
|
544
|
+
|
|
545
|
+
pending --> executing: executeBatch() starts
|
|
546
|
+
|
|
547
|
+
executing --> completed: all actions succeed
|
|
548
|
+
executing --> completed: partial success (some failed)
|
|
549
|
+
executing --> failed: all actions failed
|
|
550
|
+
|
|
551
|
+
completed --> [*]
|
|
552
|
+
failed --> [*]
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
## CI/CD Optimization Strategies
|
|
558
|
+
|
|
559
|
+
### Strategy 1: Commit Squashing
|
|
560
|
+
|
|
561
|
+
**Problem**: N commits = N CI runs
|
|
562
|
+
**Solution**: Squash commits within window into single commit
|
|
563
|
+
|
|
564
|
+
```mermaid
|
|
565
|
+
flowchart LR
|
|
566
|
+
subgraph "Without Squashing"
|
|
567
|
+
C1A[Commit 1] --> CI1[CI Run 1]
|
|
568
|
+
C2A[Commit 2] --> CI2[CI Run 2]
|
|
569
|
+
C3A[Commit 3] --> CI3[CI Run 3]
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
subgraph "With Squashing"
|
|
573
|
+
C1B[Commit 1] --> SQ[Squash]
|
|
574
|
+
C2B[Commit 2] --> SQ
|
|
575
|
+
C3B[Commit 3] --> SQ
|
|
576
|
+
SQ --> CIS[CI Run 1]
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
style CI1 fill:#ffcdd2
|
|
580
|
+
style CI2 fill:#ffcdd2
|
|
581
|
+
style CI3 fill:#ffcdd2
|
|
582
|
+
style CIS fill:#c8e6c9
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
**Savings**: ~67% reduction (3 runs → 1 run)
|
|
586
|
+
|
|
587
|
+
### Strategy 2: Push Deduplication
|
|
588
|
+
|
|
589
|
+
**Problem**: Multiple agents push to same branch
|
|
590
|
+
**Solution**: Merge push requests, execute once
|
|
591
|
+
|
|
592
|
+
```mermaid
|
|
593
|
+
flowchart LR
|
|
594
|
+
subgraph "Without Dedup"
|
|
595
|
+
P1A[Push Agent 1] --> CI1[CI Run 1]
|
|
596
|
+
P2A[Push Agent 2] --> CI2[CI Run 2]
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
subgraph "With Dedup"
|
|
600
|
+
P1B[Push Agent 1] --> MERGE[Merge]
|
|
601
|
+
P2B[Push Agent 2] --> MERGE
|
|
602
|
+
MERGE --> CIS[CI Run 1]
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
style CI1 fill:#ffcdd2
|
|
606
|
+
style CI2 fill:#ffcdd2
|
|
607
|
+
style CIS fill:#c8e6c9
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Strategy 3: Workflow Trigger Batching
|
|
611
|
+
|
|
612
|
+
**Problem**: Redundant workflow dispatches
|
|
613
|
+
**Solution**: Deduplicate identical workflow triggers
|
|
614
|
+
|
|
615
|
+
### Strategy 4: Time-Window Batching
|
|
616
|
+
|
|
617
|
+
**Problem**: Rapid-fire actions trigger multiple pipelines
|
|
618
|
+
**Solution**: Delay execution to collect related actions
|
|
619
|
+
|
|
620
|
+
```mermaid
|
|
621
|
+
gantt
|
|
622
|
+
title Action Batching Timeline
|
|
623
|
+
dateFormat X
|
|
624
|
+
axisFormat %s
|
|
625
|
+
|
|
626
|
+
section Without Batching
|
|
627
|
+
Action 1 :a1, 0, 1
|
|
628
|
+
CI Run 1 :crit, ci1, 1, 6
|
|
629
|
+
Action 2 :a2, 3, 1
|
|
630
|
+
CI Run 2 :crit, ci2, 4, 9
|
|
631
|
+
Action 3 :a3, 5, 1
|
|
632
|
+
CI Run 3 :crit, ci3, 6, 11
|
|
633
|
+
|
|
634
|
+
section With Batching (30s window)
|
|
635
|
+
Action 1 :a1b, 0, 1
|
|
636
|
+
Action 2 :a2b, 3, 1
|
|
637
|
+
Action 3 :a3b, 5, 1
|
|
638
|
+
Window :active, w, 0, 30
|
|
639
|
+
Batch CI :done, bci, 30, 35
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## CLI Integration
|
|
645
|
+
|
|
646
|
+
The `DeployBatcher` is exposed through the CLI:
|
|
647
|
+
|
|
648
|
+
```bash
|
|
649
|
+
# Queue a commit
|
|
650
|
+
uam deploy queue --agent-id <id> --action-type commit --target main \
|
|
651
|
+
--message "feat: new feature" --files "src/feature.ts"
|
|
652
|
+
|
|
653
|
+
# Queue a push
|
|
654
|
+
uam deploy queue --agent-id <id> --action-type push --target main
|
|
655
|
+
|
|
656
|
+
# Queue a workflow trigger
|
|
657
|
+
uam deploy queue --agent-id <id> --action-type workflow --target test.yml \
|
|
658
|
+
--ref main --inputs '{"env":"staging"}'
|
|
659
|
+
|
|
660
|
+
# View status
|
|
661
|
+
uam deploy status
|
|
662
|
+
|
|
663
|
+
# Create batch manually
|
|
664
|
+
uam deploy batch
|
|
665
|
+
|
|
666
|
+
# Execute specific batch
|
|
667
|
+
uam deploy execute --batch-id <uuid>
|
|
668
|
+
|
|
669
|
+
# Flush all pending
|
|
670
|
+
uam deploy flush
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
### CLI Command Flow
|
|
674
|
+
|
|
675
|
+
```mermaid
|
|
676
|
+
flowchart TB
|
|
677
|
+
subgraph "CLI Commands"
|
|
678
|
+
QC[uam deploy queue]
|
|
679
|
+
BC[uam deploy batch]
|
|
680
|
+
EC[uam deploy execute]
|
|
681
|
+
SC[uam deploy status]
|
|
682
|
+
FC[uam deploy flush]
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
subgraph "DeployBatcher Methods"
|
|
686
|
+
Q[queue]
|
|
687
|
+
CB[createBatch]
|
|
688
|
+
EB[executeBatch]
|
|
689
|
+
GB[getBatch/getPendingBatches]
|
|
690
|
+
FA[flushAll]
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
QC --> Q
|
|
694
|
+
BC --> CB
|
|
695
|
+
EC --> EB
|
|
696
|
+
SC --> GB
|
|
697
|
+
FC --> FA
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
## Usage Examples
|
|
703
|
+
|
|
704
|
+
### Example 1: Multi-Agent Commit Batching
|
|
705
|
+
|
|
706
|
+
```typescript
|
|
707
|
+
import { DeployBatcher } from './coordination/deploy-batcher.js';
|
|
708
|
+
|
|
709
|
+
const batcher = new DeployBatcher({
|
|
710
|
+
dynamicWindows: { commit: 30000 }, // 30s window
|
|
711
|
+
parallelExecution: true,
|
|
712
|
+
});
|
|
713
|
+
|
|
714
|
+
// Agent 1 commits
|
|
715
|
+
await batcher.queue('agent-1', 'commit', 'main', {
|
|
716
|
+
message: 'feat: add user auth',
|
|
717
|
+
files: ['src/auth.ts', 'src/user.ts']
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
// Agent 2 commits (within window - will be merged)
|
|
721
|
+
await batcher.queue('agent-2', 'commit', 'main', {
|
|
722
|
+
message: 'feat: add logging',
|
|
723
|
+
files: ['src/logger.ts']
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
// After 30s, create and execute batch
|
|
727
|
+
const batch = await batcher.createBatch();
|
|
728
|
+
const result = await batcher.executeBatch(batch.id);
|
|
729
|
+
|
|
730
|
+
console.log(result);
|
|
731
|
+
// {
|
|
732
|
+
// batchId: 'uuid',
|
|
733
|
+
// success: true,
|
|
734
|
+
// executedActions: 1, // Squashed into single commit
|
|
735
|
+
// failedActions: 0,
|
|
736
|
+
// duration: 1234
|
|
737
|
+
// }
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
### Example 2: Urgent Deployment
|
|
741
|
+
|
|
742
|
+
```typescript
|
|
743
|
+
const batcher = new DeployBatcher();
|
|
744
|
+
|
|
745
|
+
// Enable urgent mode for critical fix
|
|
746
|
+
batcher.setUrgentMode(true);
|
|
747
|
+
|
|
748
|
+
// Queue with minimal delay
|
|
749
|
+
await batcher.queue('agent-1', 'commit', 'main', {
|
|
750
|
+
message: 'hotfix: critical security patch',
|
|
751
|
+
files: ['src/security.ts']
|
|
752
|
+
}, { urgent: true });
|
|
753
|
+
|
|
754
|
+
await batcher.queue('agent-1', 'push', 'main', {}, { urgent: true });
|
|
755
|
+
|
|
756
|
+
// Immediately flush
|
|
757
|
+
const results = await batcher.flushAll();
|
|
758
|
+
|
|
759
|
+
// Restore normal mode
|
|
760
|
+
batcher.setUrgentMode(false);
|
|
761
|
+
```
|
|
762
|
+
|
|
763
|
+
### Example 3: Bulk Queue with Transaction
|
|
764
|
+
|
|
765
|
+
```typescript
|
|
766
|
+
const batcher = new DeployBatcher();
|
|
767
|
+
|
|
768
|
+
// Queue multiple actions atomically
|
|
769
|
+
const ids = await batcher.queueBulk('agent-1', [
|
|
770
|
+
{ actionType: 'commit', target: 'main', payload: { message: 'feat: A' } },
|
|
771
|
+
{ actionType: 'commit', target: 'main', payload: { message: 'feat: B' } },
|
|
772
|
+
{ actionType: 'push', target: 'main' },
|
|
773
|
+
{ actionType: 'workflow', target: 'deploy.yml', payload: { ref: 'main' } },
|
|
774
|
+
]);
|
|
775
|
+
|
|
776
|
+
console.log(`Queued ${ids.length} actions`);
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
---
|
|
780
|
+
|
|
781
|
+
## Performance Characteristics
|
|
782
|
+
|
|
783
|
+
### Time Complexity
|
|
784
|
+
|
|
785
|
+
| Operation | Complexity | Notes |
|
|
786
|
+
|-----------|------------|-------|
|
|
787
|
+
| `queue()` | O(1) | Single INSERT |
|
|
788
|
+
| `queueBulk()` | O(n) | Transaction with n INSERTs |
|
|
789
|
+
| `createBatch()` | O(n log n) | SELECT + grouping + squashing |
|
|
790
|
+
| `executeBatch()` | O(n) sequential, O(n/p) parallel | p = maxParallelActions |
|
|
791
|
+
| `flushAll()` | O(b × n) | b batches, n actions each |
|
|
792
|
+
|
|
793
|
+
### Space Complexity
|
|
794
|
+
|
|
795
|
+
| Storage | Size |
|
|
796
|
+
|---------|------|
|
|
797
|
+
| Per action | ~500 bytes (JSON payload) |
|
|
798
|
+
| Per batch | ~100 bytes + action references |
|
|
799
|
+
| SQLite overhead | ~4KB per page |
|
|
800
|
+
|
|
801
|
+
### Recommended Limits
|
|
802
|
+
|
|
803
|
+
| Parameter | Default | Max Recommended |
|
|
804
|
+
|-----------|---------|-----------------|
|
|
805
|
+
| `maxBatchSize` | 20 | 100 |
|
|
806
|
+
| `maxParallelActions` | 5 | 10 |
|
|
807
|
+
| Queue depth | - | 1000 actions |
|
|
808
|
+
|
|
809
|
+
---
|
|
810
|
+
|
|
811
|
+
## Database Schema
|
|
812
|
+
|
|
813
|
+
```mermaid
|
|
814
|
+
erDiagram
|
|
815
|
+
deploy_queue {
|
|
816
|
+
INTEGER id PK
|
|
817
|
+
TEXT agent_id
|
|
818
|
+
TEXT action_type
|
|
819
|
+
TEXT target
|
|
820
|
+
TEXT payload
|
|
821
|
+
TEXT status
|
|
822
|
+
TEXT batch_id FK
|
|
823
|
+
TEXT queued_at
|
|
824
|
+
TEXT execute_after
|
|
825
|
+
INTEGER priority
|
|
826
|
+
TEXT dependencies
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
deploy_batches {
|
|
830
|
+
TEXT id PK
|
|
831
|
+
TEXT created_at
|
|
832
|
+
TEXT executed_at
|
|
833
|
+
TEXT status
|
|
834
|
+
TEXT result
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
deploy_queue }o--|| deploy_batches : "belongs to"
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
---
|
|
841
|
+
|
|
842
|
+
## Summary
|
|
843
|
+
|
|
844
|
+
The `DeployBatcher` provides a comprehensive solution for optimizing CI/CD pipeline usage in multi-agent environments:
|
|
845
|
+
|
|
846
|
+
| Feature | Benefit |
|
|
847
|
+
|---------|---------|
|
|
848
|
+
| Dynamic batch windows | Balances speed vs batching per action type |
|
|
849
|
+
| Commit squashing | Reduces N commits to 1 CI run |
|
|
850
|
+
| Action merging | Deduplicates redundant operations |
|
|
851
|
+
| Parallel execution | Faster batch completion |
|
|
852
|
+
| Urgent mode | Fast path for critical operations |
|
|
853
|
+
| SQLite persistence | Survives agent restarts |
|
|
854
|
+
| CLI integration | Easy manual control |
|
|
855
|
+
|
|
856
|
+
**Typical CI/CD savings**: 50-80% reduction in pipeline minutes for multi-agent workflows.
|