@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,366 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# UAP Session Start Hook (universal - all coding harnesses)
|
|
3
|
+
# COMPLIANCE ENFORCEMENT: Outputs mandatory protocol checklist
|
|
4
|
+
# that the AI agent MUST complete before any work begins.
|
|
5
|
+
# Fails safely - never blocks the agent.
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-${FACTORY_PROJECT_DIR:-${CURSOR_PROJECT_DIR:-.}}}"
|
|
9
|
+
DB_PATH="${PROJECT_DIR}/agents/data/memory/short_term.db"
|
|
10
|
+
COORD_DB="${PROJECT_DIR}/agents/data/coordination/coordination.db"
|
|
11
|
+
|
|
12
|
+
if [ ! -f "$DB_PATH" ]; then
|
|
13
|
+
exit 0
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
# Auto-create coordination DB if missing (self-healing)
|
|
17
|
+
if [ ! -f "$COORD_DB" ]; then
|
|
18
|
+
mkdir -p "$(dirname "$COORD_DB")"
|
|
19
|
+
sqlite3 "$COORD_DB" "
|
|
20
|
+
PRAGMA journal_mode = WAL;
|
|
21
|
+
PRAGMA synchronous = NORMAL;
|
|
22
|
+
PRAGMA busy_timeout = 10000;
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS agent_registry (
|
|
25
|
+
id TEXT PRIMARY KEY, name TEXT NOT NULL, session_id TEXT NOT NULL,
|
|
26
|
+
status TEXT NOT NULL CHECK(status IN ('active','idle','completed','failed')),
|
|
27
|
+
current_task TEXT, worktree_branch TEXT, started_at TEXT NOT NULL,
|
|
28
|
+
last_heartbeat TEXT NOT NULL, capabilities TEXT
|
|
29
|
+
);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS idx_agent_registry_session ON agent_registry(session_id);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS idx_agent_registry_status ON agent_registry(status);
|
|
32
|
+
|
|
33
|
+
CREATE TABLE IF NOT EXISTS agent_messages (
|
|
34
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, channel TEXT NOT NULL,
|
|
35
|
+
from_agent TEXT, to_agent TEXT,
|
|
36
|
+
type TEXT NOT NULL CHECK(type IN ('request','response','notification','claim','release')),
|
|
37
|
+
payload TEXT NOT NULL, priority INTEGER DEFAULT 5,
|
|
38
|
+
created_at TEXT NOT NULL, read_at TEXT, expires_at TEXT
|
|
39
|
+
);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_messages_channel ON agent_messages(channel);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_messages_to_agent ON agent_messages(to_agent);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_messages_created ON agent_messages(created_at);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE IF NOT EXISTS work_announcements (
|
|
45
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id TEXT NOT NULL,
|
|
46
|
+
agent_name TEXT, worktree_branch TEXT,
|
|
47
|
+
intent_type TEXT NOT NULL CHECK(intent_type IN ('editing','reviewing','refactoring','testing','documenting')),
|
|
48
|
+
resource TEXT NOT NULL, description TEXT, files_affected TEXT,
|
|
49
|
+
estimated_completion TEXT, announced_at TEXT NOT NULL, completed_at TEXT,
|
|
50
|
+
FOREIGN KEY (agent_id) REFERENCES agent_registry(id)
|
|
51
|
+
);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_announcements_agent ON work_announcements(agent_id);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_announcements_resource ON work_announcements(resource);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_announcements_active ON work_announcements(completed_at) WHERE completed_at IS NULL;
|
|
55
|
+
|
|
56
|
+
CREATE TABLE IF NOT EXISTS work_claims (
|
|
57
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, resource TEXT NOT NULL,
|
|
58
|
+
agent_id TEXT NOT NULL, claim_type TEXT NOT NULL CHECK(claim_type IN ('exclusive','shared')),
|
|
59
|
+
claimed_at TEXT NOT NULL, expires_at TEXT,
|
|
60
|
+
FOREIGN KEY (agent_id) REFERENCES agent_registry(id)
|
|
61
|
+
);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_claims_agent ON work_claims(agent_id);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_claims_resource ON work_claims(resource);
|
|
64
|
+
|
|
65
|
+
CREATE TABLE IF NOT EXISTS deploy_queue (
|
|
66
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id TEXT NOT NULL,
|
|
67
|
+
action_type TEXT NOT NULL CHECK(action_type IN ('commit','push','merge','deploy','workflow')),
|
|
68
|
+
target TEXT NOT NULL, payload TEXT,
|
|
69
|
+
status TEXT NOT NULL CHECK(status IN ('pending','batched','executing','completed','failed')),
|
|
70
|
+
batch_id TEXT, queued_at TEXT NOT NULL, execute_after TEXT,
|
|
71
|
+
priority INTEGER DEFAULT 5, dependencies TEXT
|
|
72
|
+
);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_deploy_status ON deploy_queue(status);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_deploy_batch ON deploy_queue(batch_id);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_deploy_target ON deploy_queue(target);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE IF NOT EXISTS deploy_batches (
|
|
78
|
+
id TEXT PRIMARY KEY, created_at TEXT NOT NULL, executed_at TEXT,
|
|
79
|
+
status TEXT NOT NULL CHECK(status IN ('pending','executing','completed','failed')),
|
|
80
|
+
result TEXT
|
|
81
|
+
);
|
|
82
|
+
" 2>/dev/null || true
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# Clean stale agents from coordination DB (heartbeat >24h old)
|
|
86
|
+
if [ -f "$COORD_DB" ]; then
|
|
87
|
+
sqlite3 "$COORD_DB" "
|
|
88
|
+
DELETE FROM work_claims WHERE agent_id IN (
|
|
89
|
+
SELECT id FROM agent_registry
|
|
90
|
+
WHERE status IN ('active','idle') AND last_heartbeat < datetime('now','-24 hours')
|
|
91
|
+
);
|
|
92
|
+
DELETE FROM work_announcements WHERE agent_id IN (
|
|
93
|
+
SELECT id FROM agent_registry
|
|
94
|
+
WHERE status IN ('active','idle') AND last_heartbeat < datetime('now','-24 hours')
|
|
95
|
+
) AND completed_at IS NULL;
|
|
96
|
+
UPDATE agent_registry SET status='failed'
|
|
97
|
+
WHERE status IN ('active','idle') AND last_heartbeat < datetime('now','-24 hours');
|
|
98
|
+
DELETE FROM agent_registry
|
|
99
|
+
WHERE status IN ('completed','failed') AND started_at < datetime('now','-7 days');
|
|
100
|
+
DELETE FROM agent_messages WHERE created_at < datetime('now','-24 hours');
|
|
101
|
+
" 2>/dev/null || true
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# ============================================================
|
|
105
|
+
# MANDATORY: Auto-register this agent + start heartbeat
|
|
106
|
+
# ============================================================
|
|
107
|
+
AGENT_ID="claude-${SESSION_ID:-$(head -c 6 /dev/urandom | od -An -tx1 | tr -d ' \n')}"
|
|
108
|
+
AGENT_NAME="claude-code"
|
|
109
|
+
|
|
110
|
+
if [ -f "$COORD_DB" ]; then
|
|
111
|
+
# Register this agent
|
|
112
|
+
sqlite3 "$COORD_DB" "
|
|
113
|
+
INSERT OR REPLACE INTO agent_registry (id, name, session_id, status, capabilities, started_at, last_heartbeat)
|
|
114
|
+
VALUES ('${AGENT_ID}', '${AGENT_NAME}', '${AGENT_ID}', 'active', '[]', datetime('now'), datetime('now'));
|
|
115
|
+
" 2>/dev/null || true
|
|
116
|
+
|
|
117
|
+
# Check for other active agents and their work
|
|
118
|
+
OTHER_AGENTS=$(sqlite3 "$COORD_DB" "
|
|
119
|
+
SELECT id || ': ' || COALESCE(current_task, 'idle')
|
|
120
|
+
FROM agent_registry
|
|
121
|
+
WHERE status='active' AND id != '${AGENT_ID}'
|
|
122
|
+
ORDER BY last_heartbeat DESC LIMIT 5;
|
|
123
|
+
" 2>/dev/null || true)
|
|
124
|
+
|
|
125
|
+
ACTIVE_WORK=$(sqlite3 "$COORD_DB" "
|
|
126
|
+
SELECT agent_id || ' -> ' || resources
|
|
127
|
+
FROM work_announcements
|
|
128
|
+
WHERE completed_at IS NULL
|
|
129
|
+
ORDER BY announced_at DESC LIMIT 5;
|
|
130
|
+
" 2>/dev/null || true)
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
# Export agent ID for downstream tools
|
|
134
|
+
export UAP_AGENT_ID="${AGENT_ID}"
|
|
135
|
+
|
|
136
|
+
# Start background heartbeat (every 30s, auto-stops when shell exits)
|
|
137
|
+
if [ -f "$COORD_DB" ]; then
|
|
138
|
+
(
|
|
139
|
+
while true; do
|
|
140
|
+
sleep 30
|
|
141
|
+
sqlite3 "$COORD_DB" "UPDATE agent_registry SET last_heartbeat=datetime('now') WHERE id='${AGENT_ID}';" 2>/dev/null || break
|
|
142
|
+
done
|
|
143
|
+
) &
|
|
144
|
+
HEARTBEAT_PID=$!
|
|
145
|
+
# Ensure heartbeat stops and agent deregisters on exit
|
|
146
|
+
trap "kill $HEARTBEAT_PID 2>/dev/null; sqlite3 \"$COORD_DB\" \"UPDATE agent_registry SET status='completed' WHERE id='${AGENT_ID}';\" 2>/dev/null" EXIT
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
output=""
|
|
150
|
+
|
|
151
|
+
# ============================================================
|
|
152
|
+
# UAP SESSION BANNER - Rich Operational Data
|
|
153
|
+
# ============================================================
|
|
154
|
+
SESSION_ID=$(head -c 6 /dev/urandom | od -An -tx1 | tr -d ' \n' | head -c 6)
|
|
155
|
+
TASK_DB="${PROJECT_DIR}/.uap/tasks/tasks.db"
|
|
156
|
+
PKG_VERSION=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('${PROJECT_DIR}/package.json','utf8')).version)}catch{console.log('?')}" 2>/dev/null || echo "?")
|
|
157
|
+
|
|
158
|
+
# Gather task stats
|
|
159
|
+
TASK_TOTAL=0; TASK_OPEN=0; TASK_PROGRESS=0; TASK_BLOCKED=0; TASK_DONE=0
|
|
160
|
+
if [ -f "$TASK_DB" ]; then
|
|
161
|
+
TASK_TOTAL=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks;" 2>/dev/null || echo 0)
|
|
162
|
+
TASK_OPEN=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='open';" 2>/dev/null || echo 0)
|
|
163
|
+
TASK_PROGRESS=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='in_progress';" 2>/dev/null || echo 0)
|
|
164
|
+
TASK_BLOCKED=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='blocked';" 2>/dev/null || echo 0)
|
|
165
|
+
TASK_DONE=$(sqlite3 "$TASK_DB" "SELECT COUNT(*) FROM tasks WHERE status='done' OR status='wont_do';" 2>/dev/null || echo 0)
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# Gather memory stats
|
|
169
|
+
MEM_ENTRIES=0; MEM_SIZE="0 KB"
|
|
170
|
+
if [ -f "$DB_PATH" ]; then
|
|
171
|
+
MEM_ENTRIES=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM memories;" 2>/dev/null || echo 0)
|
|
172
|
+
MEM_SIZE=$(du -h "$DB_PATH" 2>/dev/null | cut -f1 || echo "?")
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
# Gather agent stats
|
|
176
|
+
AGENT_COUNT=0
|
|
177
|
+
if [ -f "$COORD_DB" ]; then
|
|
178
|
+
AGENT_COUNT=$(sqlite3 "$COORD_DB" "SELECT COUNT(*) FROM agent_registry WHERE status='active';" 2>/dev/null || echo 0)
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# Qdrant status
|
|
182
|
+
QDRANT_STATUS="OFF"
|
|
183
|
+
if docker ps --filter name=qdrant --format "{{.Status}}" 2>/dev/null | grep -q "Up"; then
|
|
184
|
+
QDRANT_STATUS="ON"
|
|
185
|
+
fi
|
|
186
|
+
|
|
187
|
+
# Git branch
|
|
188
|
+
GIT_BRANCH=$(git -C "$PROJECT_DIR" branch --show-current 2>/dev/null || echo "?")
|
|
189
|
+
GIT_DIRTY=$(git -C "$PROJECT_DIR" status --porcelain 2>/dev/null | wc -l | tr -d ' ')
|
|
190
|
+
|
|
191
|
+
# Worktree count
|
|
192
|
+
WORKTREE_COUNT=0
|
|
193
|
+
if [ -d "${PROJECT_DIR}/.worktrees" ]; then
|
|
194
|
+
WORKTREE_COUNT=$(find "${PROJECT_DIR}/.worktrees" -maxdepth 1 -mindepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
|
|
195
|
+
fi
|
|
196
|
+
|
|
197
|
+
# Pattern count
|
|
198
|
+
PATTERN_COUNT=0
|
|
199
|
+
if [ -f "${PROJECT_DIR}/.factory/patterns/index.json" ]; then
|
|
200
|
+
PATTERN_COUNT=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('${PROJECT_DIR}/.factory/patterns/index.json','utf8')).patterns?.length||0)}catch{console.log(0)}" 2>/dev/null || echo 0)
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
# Skill count
|
|
204
|
+
SKILL_COUNT=$(find "${PROJECT_DIR}/.claude/skills" "${PROJECT_DIR}/.factory/skills" -name "SKILL.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
205
|
+
|
|
206
|
+
# Droid count
|
|
207
|
+
DROID_COUNT=$(find "${PROJECT_DIR}/.factory/droids" -name "*.md" -not -name "test-droid-*" 2>/dev/null | wc -l | tr -d ' ')
|
|
208
|
+
|
|
209
|
+
# Build task progress bar (20 chars wide)
|
|
210
|
+
if [ "$TASK_TOTAL" -gt 0 ]; then
|
|
211
|
+
TASK_PCT=$((TASK_DONE * 100 / TASK_TOTAL))
|
|
212
|
+
FILLED=$((TASK_DONE * 20 / TASK_TOTAL))
|
|
213
|
+
EMPTY=$((20 - FILLED))
|
|
214
|
+
TASK_BAR=$(printf '%0.s█' $(seq 1 $FILLED 2>/dev/null) 2>/dev/null)$(printf '%0.s░' $(seq 1 $EMPTY 2>/dev/null) 2>/dev/null)
|
|
215
|
+
else
|
|
216
|
+
TASK_PCT=0
|
|
217
|
+
TASK_BAR="░░░░░░░░░░░░░░░░░░░░"
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
# Render banner
|
|
221
|
+
W=62
|
|
222
|
+
output+="╭$(printf '─%.0s' $(seq 1 $W))╮"$'\n'
|
|
223
|
+
output+="│ UAP Universal Agent Protocol v${PKG_VERSION}$(printf ' %.0s' $(seq 1 $((W - 40 - ${#PKG_VERSION}))))│"$'\n'
|
|
224
|
+
output+="│ Session: ${SESSION_ID} $(date '+%Y-%m-%d %H:%M:%S') Branch: ${GIT_BRANCH}$(printf ' %.0s' $(seq 1 $((W - 42 - ${#GIT_BRANCH}))))│"$'\n'
|
|
225
|
+
output+="├$(printf '─%.0s' $(seq 1 $W))┤"$'\n'
|
|
226
|
+
|
|
227
|
+
# Task status line
|
|
228
|
+
if [ "$TASK_TOTAL" -gt 0 ]; then
|
|
229
|
+
output+="│ Tasks: ${TASK_BAR} ${TASK_PCT}% (${TASK_DONE}/${TASK_TOTAL})$(printf ' %.0s' $(seq 1 $((W - 38 - ${#TASK_PCT} - ${#TASK_DONE} - ${#TASK_TOTAL}))))│"$'\n'
|
|
230
|
+
TASK_DETAIL="${TASK_OPEN} open ${TASK_PROGRESS} active ${TASK_BLOCKED} blocked ${TASK_DONE} done"
|
|
231
|
+
output+="│ ${TASK_DETAIL}$(printf ' %.0s' $(seq 1 $((W - 3 - ${#TASK_DETAIL}))))│"$'\n'
|
|
232
|
+
else
|
|
233
|
+
output+="│ Tasks: No tasks tracked yet$(printf ' %.0s' $(seq 1 $((W - 28))))│"$'\n'
|
|
234
|
+
fi
|
|
235
|
+
|
|
236
|
+
# Memory & infrastructure line
|
|
237
|
+
MEM_LINE="Memory: ${MEM_ENTRIES} entries (${MEM_SIZE}) Qdrant: ${QDRANT_STATUS}"
|
|
238
|
+
output+="│ ${MEM_LINE}$(printf ' %.0s' $(seq 1 $((W - 1 - ${#MEM_LINE}))))│"$'\n'
|
|
239
|
+
|
|
240
|
+
# Agents, patterns, skills line
|
|
241
|
+
INFRA_LINE="Agents: ${AGENT_COUNT} Patterns: ${PATTERN_COUNT} Skills: ${SKILL_COUNT} Droids: ${DROID_COUNT}"
|
|
242
|
+
output+="│ ${INFRA_LINE}$(printf ' %.0s' $(seq 1 $((W - 1 - ${#INFRA_LINE}))))│"$'\n'
|
|
243
|
+
|
|
244
|
+
# Git & worktree line
|
|
245
|
+
GIT_LINE="Git: ${GIT_DIRTY} uncommitted Worktrees: ${WORKTREE_COUNT}"
|
|
246
|
+
output+="│ ${GIT_LINE}$(printf ' %.0s' $(seq 1 $((W - 1 - ${#GIT_LINE}))))│"$'\n'
|
|
247
|
+
|
|
248
|
+
output+="├$(printf '─%.0s' $(seq 1 $W))┤"$'\n'
|
|
249
|
+
|
|
250
|
+
# Active policies
|
|
251
|
+
output+="│ Policies: [ON] IaC Parity [ON] File Backup$(printf ' %.0s' $(seq 1 $((W - 47))))│"$'\n'
|
|
252
|
+
|
|
253
|
+
# Memory layers
|
|
254
|
+
L3_STATUS="?"
|
|
255
|
+
[ "$QDRANT_STATUS" = "ON" ] && L3_STATUS="ON"
|
|
256
|
+
output+="│ Layers: L1:ON L2:ON L3:${L3_STATUS} L4:ON$(printf ' %.0s' $(seq 1 $((W - 37 - ${#L3_STATUS}))))│"$'\n'
|
|
257
|
+
|
|
258
|
+
output+="╰$(printf '─%.0s' $(seq 1 $W))╯"$'\n'
|
|
259
|
+
output+=""$'\n'
|
|
260
|
+
|
|
261
|
+
# ============================================================
|
|
262
|
+
# COMPLIANCE ENFORCEMENT BLOCK
|
|
263
|
+
# This is injected as system context. The AI MUST follow these.
|
|
264
|
+
# ============================================================
|
|
265
|
+
output+="<system-reminder>"$'\n'
|
|
266
|
+
output+="## UAP COMPLIANCE - MANDATORY PROTOCOL"$'\n'
|
|
267
|
+
output+=""$'\n'
|
|
268
|
+
output+="You MUST complete these steps IN ORDER before doing ANY work."$'\n'
|
|
269
|
+
output+="Skipping ANY step is a critical protocol violation."$'\n'
|
|
270
|
+
output+=""$'\n'
|
|
271
|
+
output+="### BEFORE WORK (execute these commands NOW):"$'\n'
|
|
272
|
+
output+="1. Run: uap task ready"$'\n'
|
|
273
|
+
output+="2. Run: sqlite3 ./agents/data/memory/short_term.db \"SELECT type, substr(content,1,80) FROM memories ORDER BY id DESC LIMIT 5;\""$'\n'
|
|
274
|
+
output+="3. Run: uap memory query \"<relevant to user request>\""$'\n'
|
|
275
|
+
output+="4. On work request: Run: uap task create --type <task|bug|feature> --title \"<description>\""$'\n'
|
|
276
|
+
output+=""$'\n'
|
|
277
|
+
output+="### BEFORE FIRST EDIT (MANDATORY):"$'\n'
|
|
278
|
+
output+="5. BACKUP all files you will modify: cp <file> .uap-backups/$(date +%Y-%m-%d)/<file>"$'\n'
|
|
279
|
+
output+=" Or use: mkdir -p .uap-backups/$(date +%Y-%m-%d) && cp -r <dir> .uap-backups/$(date +%Y-%m-%d)/"$'\n'
|
|
280
|
+
output+=""$'\n'
|
|
281
|
+
output+="### DURING WORK:"$'\n'
|
|
282
|
+
output+="6. ALL file changes MUST use worktree: uap worktree create <slug>"$'\n'
|
|
283
|
+
output+="7. Work in .worktrees/NNN-<slug>/ directory"$'\n'
|
|
284
|
+
output+=""$'\n'
|
|
285
|
+
output+="### BEFORE COMMIT:"$'\n'
|
|
286
|
+
output+="8. Self-review: git diff"$'\n'
|
|
287
|
+
output+="9. Run tests if applicable"$'\n'
|
|
288
|
+
output+=""$'\n'
|
|
289
|
+
output+="### AFTER WORK:"$'\n'
|
|
290
|
+
output+="10. Store lesson: sqlite3 ./agents/data/memory/short_term.db \"INSERT INTO session_memories (session_id,timestamp,type,content,importance) VALUES ('current',datetime('now'),'decision','<summary of work and lessons>',7);\""$'\n'
|
|
291
|
+
output+="11. Clean up worktree after PR merge: uap worktree cleanup <id>"$'\n'
|
|
292
|
+
output+=""$'\n'
|
|
293
|
+
output+="### MULTI-AGENT COORDINATION (MANDATORY):"$'\n'
|
|
294
|
+
output+="Your agent ID is: ${AGENT_ID}"$'\n'
|
|
295
|
+
output+="12. Before editing files, announce work: uap agent announce --resources '<file1>,<file2>' --description '<what>'"$'\n'
|
|
296
|
+
output+="13. Check for conflicts: uap agent overlaps"$'\n'
|
|
297
|
+
output+="14. After completing work: uap agent complete <announcement-id>"$'\n'
|
|
298
|
+
output+=""$'\n'
|
|
299
|
+
|
|
300
|
+
if [ -n "$OTHER_AGENTS" ]; then
|
|
301
|
+
output+="### ACTIVE AGENTS (coordinate with them):"$'\n'
|
|
302
|
+
output+="$OTHER_AGENTS"$'\n'
|
|
303
|
+
output+=""$'\n'
|
|
304
|
+
fi
|
|
305
|
+
|
|
306
|
+
if [ -n "$ACTIVE_WORK" ]; then
|
|
307
|
+
output+="### ACTIVE WORK ANNOUNCEMENTS (avoid conflicts):"$'\n'
|
|
308
|
+
output+="$ACTIVE_WORK"$'\n'
|
|
309
|
+
output+=""$'\n'
|
|
310
|
+
fi
|
|
311
|
+
|
|
312
|
+
output+="FAILURE TO COMPLY = CRITICAL VIOLATION. This is life or death."$'\n'
|
|
313
|
+
output+="</system-reminder>"$'\n\n'
|
|
314
|
+
|
|
315
|
+
# Recent memories (last 24h, high importance)
|
|
316
|
+
recent=$(sqlite3 "$DB_PATH" "
|
|
317
|
+
SELECT type, substr(content, 1, 120) FROM memories
|
|
318
|
+
WHERE timestamp >= datetime('now', '-1 day')
|
|
319
|
+
ORDER BY id DESC
|
|
320
|
+
LIMIT 10;
|
|
321
|
+
" 2>/dev/null || true)
|
|
322
|
+
|
|
323
|
+
if [ -n "$recent" ]; then
|
|
324
|
+
mem_count=$(echo "$recent" | wc -l)
|
|
325
|
+
output+="[MEMORY] ${mem_count} recent memories loaded (last 24h)"$'\n'
|
|
326
|
+
output+="## Recent Memory Context"$'\n'
|
|
327
|
+
output+="$recent"$'\n\n'
|
|
328
|
+
else
|
|
329
|
+
output+="[MEMORY] No recent memories found (last 24h)"$'\n\n'
|
|
330
|
+
fi
|
|
331
|
+
|
|
332
|
+
# Open loops from session memories
|
|
333
|
+
open_loops=$(sqlite3 "$DB_PATH" "
|
|
334
|
+
SELECT content FROM session_memories
|
|
335
|
+
WHERE type IN ('action','goal','decision')
|
|
336
|
+
AND importance >= 7
|
|
337
|
+
ORDER BY id DESC
|
|
338
|
+
LIMIT 5;
|
|
339
|
+
" 2>/dev/null || true)
|
|
340
|
+
|
|
341
|
+
if [ -n "$open_loops" ]; then
|
|
342
|
+
output+="## Open Loops"$'\n'
|
|
343
|
+
output+="$open_loops"$'\n'
|
|
344
|
+
fi
|
|
345
|
+
|
|
346
|
+
# In-progress tasks (show what's actively being worked on)
|
|
347
|
+
if [ -f "$TASK_DB" ] && [ "$TASK_PROGRESS" -gt 0 ]; then
|
|
348
|
+
active_tasks=$(sqlite3 "$TASK_DB" "SELECT ' [' || id || '] ' || title FROM tasks WHERE status='in_progress' ORDER BY priority ASC LIMIT 5;" 2>/dev/null || true)
|
|
349
|
+
if [ -n "$active_tasks" ]; then
|
|
350
|
+
output+="## Active Tasks"$'\n'
|
|
351
|
+
output+="$active_tasks"$'\n'
|
|
352
|
+
fi
|
|
353
|
+
fi
|
|
354
|
+
|
|
355
|
+
# Blocked tasks warning
|
|
356
|
+
if [ -f "$TASK_DB" ] && [ "$TASK_BLOCKED" -gt 0 ]; then
|
|
357
|
+
blocked_tasks=$(sqlite3 "$TASK_DB" "SELECT ' [' || id || '] ' || title FROM tasks WHERE status='blocked' ORDER BY priority ASC LIMIT 3;" 2>/dev/null || true)
|
|
358
|
+
if [ -n "$blocked_tasks" ]; then
|
|
359
|
+
output+=$'\n'"## Blocked Tasks (need attention)"$'\n'
|
|
360
|
+
output+="$blocked_tasks"$'\n'
|
|
361
|
+
fi
|
|
362
|
+
fi
|
|
363
|
+
|
|
364
|
+
if [ -n "$output" ]; then
|
|
365
|
+
echo "$output"
|
|
366
|
+
fi
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Qwen3.5 Tool Call Fixes
|
|
2
|
+
|
|
3
|
+
This directory contains tools and configurations for fixing Qwen3.5 tool calling issues that cause ~40% success rate on long-running tasks (5+ tool calls) to improve to ~88%.
|
|
4
|
+
|
|
5
|
+
## Performance Improvement
|
|
6
|
+
|
|
7
|
+
| Scenario | Without Fixes | With Fixes |
|
|
8
|
+
| ------------------- | ------------- | ---------- |
|
|
9
|
+
| Single tool call | ~95% | ~98% |
|
|
10
|
+
| 2-3 tool calls | ~70% | ~92% |
|
|
11
|
+
| 5+ tool calls | ~40% | ~88% |
|
|
12
|
+
| Long context (50K+) | ~30% | ~85% |
|
|
13
|
+
|
|
14
|
+
## Files
|
|
15
|
+
|
|
16
|
+
### `config/chat_template.jinja`
|
|
17
|
+
|
|
18
|
+
The core fix: a patched Jinja2 template for Qwen3.5 that adds conditional wrappers around tool call argument iteration.
|
|
19
|
+
|
|
20
|
+
**Key Fix (line 138-144):**
|
|
21
|
+
|
|
22
|
+
```jinja2
|
|
23
|
+
{%- if tool_call.arguments is mapping %}
|
|
24
|
+
{%- for args_name, args_value in tool_call.arguments|items %}
|
|
25
|
+
{{- '<parameter=' + args_name + '>\n' }}
|
|
26
|
+
{%- set args_value = args_value | tojson | safe if args_value is mapping or (args_value is sequence and args_value is not string) else args_value | string %}
|
|
27
|
+
{{- args_value }}
|
|
28
|
+
{{- '\n</parameter>\n' }}
|
|
29
|
+
{%- endfor %}
|
|
30
|
+
{%- endif %}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This prevents template parsing failures after the first 1-2 tool calls.
|
|
34
|
+
|
|
35
|
+
### `scripts/fix_qwen_chat_template.py`
|
|
36
|
+
|
|
37
|
+
Python script to automatically apply the template fix to existing chat templates.
|
|
38
|
+
|
|
39
|
+
**Usage:**
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
python3 fix_qwen_chat_template.py [template_file]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### `scripts/qwen_tool_call_wrapper.py`
|
|
46
|
+
|
|
47
|
+
OpenAI-compatible client with automatic retry logic and validation for Qwen3.5 tool calls.
|
|
48
|
+
|
|
49
|
+
**Features:**
|
|
50
|
+
|
|
51
|
+
- Automatic retry with exponential backoff
|
|
52
|
+
- Prompt correction for failed tool calls
|
|
53
|
+
- Metrics tracking and monitoring
|
|
54
|
+
- Thinking mode disablement
|
|
55
|
+
- Template validation
|
|
56
|
+
|
|
57
|
+
**Usage:**
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from qwen_tool_call_wrapper import Qwen35ToolCallClient
|
|
61
|
+
|
|
62
|
+
client = Qwen35ToolCallClient()
|
|
63
|
+
response = client.chat_with_tools(
|
|
64
|
+
messages=[{"role": "user", "content": "Call read_file with path='/etc/hosts'"}],
|
|
65
|
+
tools=[...]
|
|
66
|
+
)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### `scripts/qwen_tool_call_test.py`
|
|
70
|
+
|
|
71
|
+
Reliability test suite for validating Qwen3.5 tool call performance.
|
|
72
|
+
|
|
73
|
+
**Usage:**
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python3 qwen_tool_call_test.py --verbose
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Tests:**
|
|
80
|
+
|
|
81
|
+
1. Single tool call (baseline)
|
|
82
|
+
2. Two consecutive tool calls
|
|
83
|
+
3. Three tool calls
|
|
84
|
+
4. Five tool calls (stress test)
|
|
85
|
+
5. Reasoning content interference
|
|
86
|
+
6. Invalid format recovery
|
|
87
|
+
|
|
88
|
+
## Installation
|
|
89
|
+
|
|
90
|
+
### Option 1: Using UAP CLI (Recommended)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
uap tool-calls setup
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This will:
|
|
97
|
+
|
|
98
|
+
1. Copy `chat_template.jinja` to `tools/agents/config/`
|
|
99
|
+
2. Copy Python scripts to `tools/agents/scripts/`
|
|
100
|
+
3. Print setup instructions for llama.cpp and OpenCode
|
|
101
|
+
|
|
102
|
+
### Option 2: Manual Installation
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Copy template
|
|
106
|
+
mkdir -p tools/agents/config
|
|
107
|
+
cp tools/agents/config/chat_template.jinja tools/agents/config/
|
|
108
|
+
|
|
109
|
+
# Copy scripts
|
|
110
|
+
mkdir -p tools/agents/scripts
|
|
111
|
+
cp tools/agents/scripts/*.py tools/agents/scripts/
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Integration
|
|
115
|
+
|
|
116
|
+
### llama.cpp
|
|
117
|
+
|
|
118
|
+
**Start llama-server with the fixed template:**
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
./llama-server \
|
|
122
|
+
--model ~/models/Qwen3.5-35B-Instruct-Q4_K_M.gguf \
|
|
123
|
+
--chat-template-file tools/agents/config/chat_template.jinja \
|
|
124
|
+
--jinja \
|
|
125
|
+
--port 8080 \
|
|
126
|
+
--ctx-size 262144 \
|
|
127
|
+
--batch-size 4096 \
|
|
128
|
+
--threads $(nproc)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Key flags:**
|
|
132
|
+
|
|
133
|
+
- `--chat-template-file`: Path to the fixed template
|
|
134
|
+
- `--jinja`: Enable Jinja2 template processing
|
|
135
|
+
|
|
136
|
+
### OpenCode
|
|
137
|
+
|
|
138
|
+
**1. Copy template to OpenCode agent config:**
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
mkdir -p ~/.opencode/agent
|
|
142
|
+
cp tools/agents/config/chat_template.jinja ~/.opencode/agent/
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**2. Update `.opencode/config.json`:**
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"provider": "llama.cpp",
|
|
150
|
+
"model": "qwen35-a3b-iq4xs",
|
|
151
|
+
"chatTemplate": "jinja",
|
|
152
|
+
"baseURL": "http://localhost:8080/v1"
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**3. Restart OpenCode**
|
|
157
|
+
|
|
158
|
+
## Verification
|
|
159
|
+
|
|
160
|
+
### Check Setup
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
uap tool-calls status
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Run Tests
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
python3 tools/agents/scripts/qwen_tool_call_test.py --verbose
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Expected results:
|
|
173
|
+
|
|
174
|
+
- Single tool call: ~98% success rate
|
|
175
|
+
- 2-3 tool calls: ~92% success rate
|
|
176
|
+
- 5+ tool calls: ~88% success rate
|
|
177
|
+
|
|
178
|
+
### Test Tool Call Manually
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
curl -X POST http://localhost:8080/v1/chat/completions \
|
|
182
|
+
-H "Content-Type: application/json" \
|
|
183
|
+
-d '{
|
|
184
|
+
"model": "qwen35-a3b-iq4xs",
|
|
185
|
+
"messages": [{"role": "user", "content": "Read /etc/hosts"}],
|
|
186
|
+
"tools": [{"type": "function", "function": {"name": "read_file"}}]
|
|
187
|
+
}'
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Troubleshooting
|
|
191
|
+
|
|
192
|
+
### Issue: Tool calls fail after 1-2 attempts
|
|
193
|
+
|
|
194
|
+
**Solution:** Verify template was loaded with `--chat-template-file` flag
|
|
195
|
+
|
|
196
|
+
### Issue: Template not found
|
|
197
|
+
|
|
198
|
+
**Solution:** Check path exists:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
ls -la tools/agents/config/chat_template.jinja
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Issue: OpenCode still using old template
|
|
205
|
+
|
|
206
|
+
**Solution:** Restart OpenCode after copying template
|
|
207
|
+
|
|
208
|
+
### Issue: Python scripts not found
|
|
209
|
+
|
|
210
|
+
**Solution:** Ensure you're in the scripts directory:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
cd tools/agents/scripts
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## References
|
|
217
|
+
|
|
218
|
+
- **Original Issue:** Hugging Face Discussion #4 - Qwen3.5 tool call failures
|
|
219
|
+
- **Source:** universal-agent-protocol project - Qwen3.5 35B A3B tool call fixes
|
|
220
|
+
- **Performance Data:** Factory.AI droid `qwen35-tool-call-optimized.md`
|
|
221
|
+
|
|
222
|
+
## License
|
|
223
|
+
|
|
224
|
+
MIT License - Same as universal-agent-protocol
|