@revealui/ai 0.1.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 +22 -0
- package/LICENSE.commercial +112 -0
- package/README.md +314 -0
- package/dist/a2a/card.d.ts +26 -0
- package/dist/a2a/card.d.ts.map +1 -0
- package/dist/a2a/card.js +173 -0
- package/dist/a2a/handler.d.ts +26 -0
- package/dist/a2a/handler.d.ts.map +1 -0
- package/dist/a2a/handler.js +170 -0
- package/dist/a2a/index.d.ts +10 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +9 -0
- package/dist/a2a/task-store.d.ts +42 -0
- package/dist/a2a/task-store.d.ts.map +1 -0
- package/dist/a2a/task-store.js +99 -0
- package/dist/audit/emitter.d.ts +34 -0
- package/dist/audit/emitter.d.ts.map +1 -0
- package/dist/audit/emitter.js +34 -0
- package/dist/audit/index.d.ts +44 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +48 -0
- package/dist/audit/observer.d.ts +108 -0
- package/dist/audit/observer.d.ts.map +1 -0
- package/dist/audit/observer.js +271 -0
- package/dist/audit/policy.d.ts +70 -0
- package/dist/audit/policy.d.ts.map +1 -0
- package/dist/audit/policy.js +209 -0
- package/dist/audit/store.d.ts +42 -0
- package/dist/audit/store.d.ts.map +1 -0
- package/dist/audit/store.js +80 -0
- package/dist/audit/types.d.ts +169 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +80 -0
- package/dist/client/hooks/index.d.ts +22 -0
- package/dist/client/hooks/index.d.ts.map +1 -0
- package/dist/client/hooks/index.js +21 -0
- package/dist/client/hooks/useAgentContext.d.ts +30 -0
- package/dist/client/hooks/useAgentContext.d.ts.map +1 -0
- package/dist/client/hooks/useAgentContext.js +161 -0
- package/dist/client/hooks/useAgentEvents.d.ts +126 -0
- package/dist/client/hooks/useAgentEvents.d.ts.map +1 -0
- package/dist/client/hooks/useAgentEvents.js +232 -0
- package/dist/client/hooks/useAgentStream.d.ts +44 -0
- package/dist/client/hooks/useAgentStream.d.ts.map +1 -0
- package/dist/client/hooks/useAgentStream.js +101 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts +25 -0
- package/dist/client/hooks/useEpisodicMemory.d.ts.map +1 -0
- package/dist/client/hooks/useEpisodicMemory.js +174 -0
- package/dist/client/hooks/useWorkingMemory.d.ts +57 -0
- package/dist/client/hooks/useWorkingMemory.d.ts.map +1 -0
- package/dist/client/hooks/useWorkingMemory.js +276 -0
- package/dist/client/index.d.ts +14 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +13 -0
- package/dist/embeddings/index.d.ts +51 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +73 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/inference/context-assembly.d.ts +27 -0
- package/dist/inference/context-assembly.d.ts.map +1 -0
- package/dist/inference/context-assembly.js +81 -0
- package/dist/inference/overflow-compressor.d.ts +17 -0
- package/dist/inference/overflow-compressor.d.ts.map +1 -0
- package/dist/inference/overflow-compressor.js +40 -0
- package/dist/inference/runRag.d.ts +35 -0
- package/dist/inference/runRag.d.ts.map +1 -0
- package/dist/inference/runRag.js +53 -0
- package/dist/ingestion/bm25.d.ts +29 -0
- package/dist/ingestion/bm25.d.ts.map +1 -0
- package/dist/ingestion/bm25.js +161 -0
- package/dist/ingestion/cms-indexer.d.ts +39 -0
- package/dist/ingestion/cms-indexer.d.ts.map +1 -0
- package/dist/ingestion/cms-indexer.js +74 -0
- package/dist/ingestion/file-parsers.d.ts +51 -0
- package/dist/ingestion/file-parsers.d.ts.map +1 -0
- package/dist/ingestion/file-parsers.js +247 -0
- package/dist/ingestion/hybrid-search.d.ts +22 -0
- package/dist/ingestion/hybrid-search.d.ts.map +1 -0
- package/dist/ingestion/hybrid-search.js +63 -0
- package/dist/ingestion/index.d.ts +9 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +8 -0
- package/dist/ingestion/pipeline.d.ts +35 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +114 -0
- package/dist/ingestion/rag-vector-service.d.ts +34 -0
- package/dist/ingestion/rag-vector-service.d.ts.map +1 -0
- package/dist/ingestion/rag-vector-service.js +98 -0
- package/dist/ingestion/reranker.d.ts +10 -0
- package/dist/ingestion/reranker.d.ts.map +1 -0
- package/dist/ingestion/reranker.js +41 -0
- package/dist/ingestion/text-splitter.d.ts +25 -0
- package/dist/ingestion/text-splitter.d.ts.map +1 -0
- package/dist/ingestion/text-splitter.js +119 -0
- package/dist/llm/cache-utils.d.ts +146 -0
- package/dist/llm/cache-utils.d.ts.map +1 -0
- package/dist/llm/cache-utils.js +204 -0
- package/dist/llm/client.d.ts +134 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +497 -0
- package/dist/llm/key-validator.d.ts +25 -0
- package/dist/llm/key-validator.d.ts.map +1 -0
- package/dist/llm/key-validator.js +101 -0
- package/dist/llm/provider-health.d.ts +40 -0
- package/dist/llm/provider-health.d.ts.map +1 -0
- package/dist/llm/provider-health.js +97 -0
- package/dist/llm/providers/anthropic.d.ts +31 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +248 -0
- package/dist/llm/providers/base.d.ts +111 -0
- package/dist/llm/providers/base.d.ts.map +1 -0
- package/dist/llm/providers/base.js +6 -0
- package/dist/llm/providers/groq.d.ts +23 -0
- package/dist/llm/providers/groq.d.ts.map +1 -0
- package/dist/llm/providers/groq.js +27 -0
- package/dist/llm/providers/ollama.d.ts +27 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +48 -0
- package/dist/llm/providers/openai.d.ts +19 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +245 -0
- package/dist/llm/providers/vultr.d.ts +18 -0
- package/dist/llm/providers/vultr.d.ts.map +1 -0
- package/dist/llm/providers/vultr.js +168 -0
- package/dist/llm/response-cache.d.ts +166 -0
- package/dist/llm/response-cache.d.ts.map +1 -0
- package/dist/llm/response-cache.js +233 -0
- package/dist/llm/semantic-cache.d.ts +179 -0
- package/dist/llm/semantic-cache.d.ts.map +1 -0
- package/dist/llm/semantic-cache.js +306 -0
- package/dist/llm/server.d.ts +14 -0
- package/dist/llm/server.d.ts.map +1 -0
- package/dist/llm/server.js +15 -0
- package/dist/llm/token-counter.d.ts +48 -0
- package/dist/llm/token-counter.d.ts.map +1 -0
- package/dist/llm/token-counter.js +77 -0
- package/dist/llm/workspace-provider-config.d.ts +38 -0
- package/dist/llm/workspace-provider-config.d.ts.map +1 -0
- package/dist/llm/workspace-provider-config.js +47 -0
- package/dist/memory/agent/context-manager.d.ts +148 -0
- package/dist/memory/agent/context-manager.d.ts.map +1 -0
- package/dist/memory/agent/context-manager.js +284 -0
- package/dist/memory/agent/index.d.ts +7 -0
- package/dist/memory/agent/index.d.ts.map +1 -0
- package/dist/memory/agent/index.js +6 -0
- package/dist/memory/crdt/index.d.ts +13 -0
- package/dist/memory/crdt/index.d.ts.map +1 -0
- package/dist/memory/crdt/index.js +12 -0
- package/dist/memory/crdt/lww-register.d.ts +108 -0
- package/dist/memory/crdt/lww-register.d.ts.map +1 -0
- package/dist/memory/crdt/lww-register.js +169 -0
- package/dist/memory/crdt/or-set.d.ts +141 -0
- package/dist/memory/crdt/or-set.d.ts.map +1 -0
- package/dist/memory/crdt/or-set.js +291 -0
- package/dist/memory/crdt/pn-counter.d.ts +116 -0
- package/dist/memory/crdt/pn-counter.d.ts.map +1 -0
- package/dist/memory/crdt/pn-counter.js +174 -0
- package/dist/memory/crdt/vector-clock.d.ts +115 -0
- package/dist/memory/crdt/vector-clock.d.ts.map +1 -0
- package/dist/memory/crdt/vector-clock.js +179 -0
- package/dist/memory/errors/index.d.ts +56 -0
- package/dist/memory/errors/index.d.ts.map +1 -0
- package/dist/memory/errors/index.js +85 -0
- package/dist/memory/index.d.ts +21 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +20 -0
- package/dist/memory/persistence/crdt-persistence.d.ts +85 -0
- package/dist/memory/persistence/crdt-persistence.d.ts.map +1 -0
- package/dist/memory/persistence/crdt-persistence.js +204 -0
- package/dist/memory/persistence/index.d.ts +7 -0
- package/dist/memory/persistence/index.d.ts.map +1 -0
- package/dist/memory/persistence/index.js +6 -0
- package/dist/memory/preferences/index.d.ts +7 -0
- package/dist/memory/preferences/index.d.ts.map +1 -0
- package/dist/memory/preferences/index.js +6 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts +133 -0
- package/dist/memory/preferences/user-preferences-manager.d.ts.map +1 -0
- package/dist/memory/preferences/user-preferences-manager.js +342 -0
- package/dist/memory/services/index.d.ts +8 -0
- package/dist/memory/services/index.d.ts.map +1 -0
- package/dist/memory/services/index.js +6 -0
- package/dist/memory/services/node-id-service.d.ts +75 -0
- package/dist/memory/services/node-id-service.d.ts.map +1 -0
- package/dist/memory/services/node-id-service.js +190 -0
- package/dist/memory/stores/episodic-memory.d.ts +182 -0
- package/dist/memory/stores/episodic-memory.d.ts.map +1 -0
- package/dist/memory/stores/episodic-memory.js +378 -0
- package/dist/memory/stores/index.d.ts +16 -0
- package/dist/memory/stores/index.d.ts.map +1 -0
- package/dist/memory/stores/index.js +15 -0
- package/dist/memory/stores/procedural-memory.d.ts +89 -0
- package/dist/memory/stores/procedural-memory.d.ts.map +1 -0
- package/dist/memory/stores/procedural-memory.js +152 -0
- package/dist/memory/stores/semantic-memory.d.ts +92 -0
- package/dist/memory/stores/semantic-memory.d.ts.map +1 -0
- package/dist/memory/stores/semantic-memory.js +155 -0
- package/dist/memory/stores/working-memory.d.ts +225 -0
- package/dist/memory/stores/working-memory.d.ts.map +1 -0
- package/dist/memory/stores/working-memory.js +336 -0
- package/dist/memory/utils/deep-clone.d.ts +10 -0
- package/dist/memory/utils/deep-clone.d.ts.map +1 -0
- package/dist/memory/utils/deep-clone.js +9 -0
- package/dist/memory/utils/index.d.ts +8 -0
- package/dist/memory/utils/index.d.ts.map +1 -0
- package/dist/memory/utils/index.js +7 -0
- package/dist/memory/utils/logger.d.ts +21 -0
- package/dist/memory/utils/logger.d.ts.map +1 -0
- package/dist/memory/utils/logger.js +62 -0
- package/dist/memory/utils/sql-helpers.d.ts +97 -0
- package/dist/memory/utils/sql-helpers.d.ts.map +1 -0
- package/dist/memory/utils/sql-helpers.js +214 -0
- package/dist/memory/utils/validation.d.ts +62 -0
- package/dist/memory/utils/validation.d.ts.map +1 -0
- package/dist/memory/utils/validation.js +244 -0
- package/dist/memory/vector/index.d.ts +12 -0
- package/dist/memory/vector/index.d.ts.map +1 -0
- package/dist/memory/vector/index.js +14 -0
- package/dist/memory/vector/vector-memory-service.d.ts +88 -0
- package/dist/memory/vector/vector-memory-service.d.ts.map +1 -0
- package/dist/memory/vector/vector-memory-service.js +335 -0
- package/dist/observability/logger.d.ts +79 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +165 -0
- package/dist/observability/metrics.d.ts +43 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +197 -0
- package/dist/observability/query.d.ts +150 -0
- package/dist/observability/query.d.ts.map +1 -0
- package/dist/observability/query.js +339 -0
- package/dist/observability/types.d.ts +140 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +6 -0
- package/dist/orchestration/agent.d.ts +98 -0
- package/dist/orchestration/agent.d.ts.map +1 -0
- package/dist/orchestration/agent.js +6 -0
- package/dist/orchestration/defaults.d.ts +21 -0
- package/dist/orchestration/defaults.d.ts.map +1 -0
- package/dist/orchestration/defaults.js +22 -0
- package/dist/orchestration/memory-integration.d.ts +58 -0
- package/dist/orchestration/memory-integration.d.ts.map +1 -0
- package/dist/orchestration/memory-integration.js +130 -0
- package/dist/orchestration/orchestrator.d.ts +67 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +174 -0
- package/dist/orchestration/runtime.d.ts +82 -0
- package/dist/orchestration/runtime.d.ts.map +1 -0
- package/dist/orchestration/runtime.js +251 -0
- package/dist/orchestration/streaming-runtime.d.ts +36 -0
- package/dist/orchestration/streaming-runtime.d.ts.map +1 -0
- package/dist/orchestration/streaming-runtime.js +175 -0
- package/dist/orchestration/ticket-agent.d.ts +70 -0
- package/dist/orchestration/ticket-agent.d.ts.map +1 -0
- package/dist/orchestration/ticket-agent.js +146 -0
- package/dist/skills/activation/index.d.ts +7 -0
- package/dist/skills/activation/index.d.ts.map +1 -0
- package/dist/skills/activation/index.js +6 -0
- package/dist/skills/activation/skill-activator.d.ts +68 -0
- package/dist/skills/activation/skill-activator.d.ts.map +1 -0
- package/dist/skills/activation/skill-activator.js +224 -0
- package/dist/skills/catalog/catalog-search.d.ts +55 -0
- package/dist/skills/catalog/catalog-search.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-search.js +111 -0
- package/dist/skills/catalog/catalog-types.d.ts +81 -0
- package/dist/skills/catalog/catalog-types.d.ts.map +1 -0
- package/dist/skills/catalog/catalog-types.js +66 -0
- package/dist/skills/catalog/index.d.ts +9 -0
- package/dist/skills/catalog/index.d.ts.map +1 -0
- package/dist/skills/catalog/index.js +7 -0
- package/dist/skills/catalog/vercel-catalog.d.ts +42 -0
- package/dist/skills/catalog/vercel-catalog.d.ts.map +1 -0
- package/dist/skills/catalog/vercel-catalog.js +189 -0
- package/dist/skills/compat/index.d.ts +9 -0
- package/dist/skills/compat/index.d.ts.map +1 -0
- package/dist/skills/compat/index.js +8 -0
- package/dist/skills/compat/skill-enhancer.d.ts +37 -0
- package/dist/skills/compat/skill-enhancer.d.ts.map +1 -0
- package/dist/skills/compat/skill-enhancer.js +76 -0
- package/dist/skills/compat/tool-mapper.d.ts +61 -0
- package/dist/skills/compat/tool-mapper.d.ts.map +1 -0
- package/dist/skills/compat/tool-mapper.js +168 -0
- package/dist/skills/compat/vercel-compat.d.ts +33 -0
- package/dist/skills/compat/vercel-compat.d.ts.map +1 -0
- package/dist/skills/compat/vercel-compat.js +132 -0
- package/dist/skills/index.d.ts +40 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +47 -0
- package/dist/skills/integration/agent-skill-provider.d.ts +94 -0
- package/dist/skills/integration/agent-skill-provider.d.ts.map +1 -0
- package/dist/skills/integration/agent-skill-provider.js +161 -0
- package/dist/skills/integration/index.d.ts +7 -0
- package/dist/skills/integration/index.d.ts.map +1 -0
- package/dist/skills/integration/index.js +6 -0
- package/dist/skills/loader/github-loader.d.ts +61 -0
- package/dist/skills/loader/github-loader.d.ts.map +1 -0
- package/dist/skills/loader/github-loader.js +176 -0
- package/dist/skills/loader/index.d.ts +10 -0
- package/dist/skills/loader/index.d.ts.map +1 -0
- package/dist/skills/loader/index.js +9 -0
- package/dist/skills/loader/local-loader.d.ts +56 -0
- package/dist/skills/loader/local-loader.d.ts.map +1 -0
- package/dist/skills/loader/local-loader.js +186 -0
- package/dist/skills/loader/vercel-loader.d.ts +64 -0
- package/dist/skills/loader/vercel-loader.d.ts.map +1 -0
- package/dist/skills/loader/vercel-loader.js +313 -0
- package/dist/skills/loader/vercel-types.d.ts +64 -0
- package/dist/skills/loader/vercel-types.d.ts.map +1 -0
- package/dist/skills/loader/vercel-types.js +55 -0
- package/dist/skills/parser/index.d.ts +7 -0
- package/dist/skills/parser/index.d.ts.map +1 -0
- package/dist/skills/parser/index.js +6 -0
- package/dist/skills/parser/skill-md-parser.d.ts +64 -0
- package/dist/skills/parser/skill-md-parser.d.ts.map +1 -0
- package/dist/skills/parser/skill-md-parser.js +242 -0
- package/dist/skills/registry/index.d.ts +7 -0
- package/dist/skills/registry/index.d.ts.map +1 -0
- package/dist/skills/registry/index.js +6 -0
- package/dist/skills/registry/skill-registry.d.ts +133 -0
- package/dist/skills/registry/skill-registry.d.ts.map +1 -0
- package/dist/skills/registry/skill-registry.js +373 -0
- package/dist/skills/types.d.ts +216 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +176 -0
- package/dist/templates/agent-spec.d.ts +138 -0
- package/dist/templates/agent-spec.d.ts.map +1 -0
- package/dist/templates/agent-spec.js +138 -0
- package/dist/templates/index.d.ts +56 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +58 -0
- package/dist/templates/prompt-spec.d.ts +140 -0
- package/dist/templates/prompt-spec.d.ts.map +1 -0
- package/dist/templates/prompt-spec.js +210 -0
- package/dist/templates/skill-spec.d.ts +106 -0
- package/dist/templates/skill-spec.d.ts.map +1 -0
- package/dist/templates/skill-spec.js +119 -0
- package/dist/tools/base.d.ts +74 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +6 -0
- package/dist/tools/cms/collection-tools.d.ts +36 -0
- package/dist/tools/cms/collection-tools.d.ts.map +1 -0
- package/dist/tools/cms/collection-tools.js +178 -0
- package/dist/tools/cms/factory.d.ts +89 -0
- package/dist/tools/cms/factory.d.ts.map +1 -0
- package/dist/tools/cms/factory.js +462 -0
- package/dist/tools/cms/global-tools.d.ts +21 -0
- package/dist/tools/cms/global-tools.d.ts.map +1 -0
- package/dist/tools/cms/global-tools.js +92 -0
- package/dist/tools/cms/index.d.ts +11 -0
- package/dist/tools/cms/index.d.ts.map +1 -0
- package/dist/tools/cms/index.js +11 -0
- package/dist/tools/cms/media-tools.d.ts +31 -0
- package/dist/tools/cms/media-tools.d.ts.map +1 -0
- package/dist/tools/cms/media-tools.js +140 -0
- package/dist/tools/cms/user-tools.d.ts +31 -0
- package/dist/tools/cms/user-tools.d.ts.map +1 -0
- package/dist/tools/cms/user-tools.js +135 -0
- package/dist/tools/deduplicator.d.ts +19 -0
- package/dist/tools/deduplicator.d.ts.map +1 -0
- package/dist/tools/deduplicator.js +53 -0
- package/dist/tools/document-summarizer.d.ts +11 -0
- package/dist/tools/document-summarizer.d.ts.map +1 -0
- package/dist/tools/document-summarizer.js +82 -0
- package/dist/tools/mcp-adapter.d.ts +66 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +152 -0
- package/dist/tools/memory/index.d.ts +3 -0
- package/dist/tools/memory/index.d.ts.map +1 -0
- package/dist/tools/memory/index.js +1 -0
- package/dist/tools/memory/store-memory.d.ts +39 -0
- package/dist/tools/memory/store-memory.d.ts.map +1 -0
- package/dist/tools/memory/store-memory.js +94 -0
- package/dist/tools/registry.d.ts +14 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +48 -0
- package/dist/tools/ticket-tools.d.ts +31 -0
- package/dist/tools/ticket-tools.d.ts.map +1 -0
- package/dist/tools/ticket-tools.js +74 -0
- package/dist/tools/web/duck-duck-go.d.ts +52 -0
- package/dist/tools/web/duck-duck-go.d.ts.map +1 -0
- package/dist/tools/web/duck-duck-go.js +202 -0
- package/dist/tools/web/exa.d.ts +34 -0
- package/dist/tools/web/exa.d.ts.map +1 -0
- package/dist/tools/web/exa.js +80 -0
- package/dist/tools/web/index.d.ts +6 -0
- package/dist/tools/web/index.d.ts.map +1 -0
- package/dist/tools/web/index.js +4 -0
- package/dist/tools/web/scraper.d.ts +9 -0
- package/dist/tools/web/scraper.d.ts.map +1 -0
- package/dist/tools/web/scraper.js +118 -0
- package/dist/tools/web/tavily.d.ts +32 -0
- package/dist/tools/web/tavily.d.ts.map +1 -0
- package/dist/tools/web/tavily.js +73 -0
- package/dist/tools/web/types.d.ts +31 -0
- package/dist/tools/web/types.d.ts.map +1 -0
- package/dist/tools/web/types.js +9 -0
- package/package.json +143 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multiple agents for complex tasks.
|
|
5
|
+
* Requires an LLM client to execute agent tasks via the runtime.
|
|
6
|
+
*/
|
|
7
|
+
import { AgentRuntime } from './runtime.js';
|
|
8
|
+
export class AgentOrchestrator {
|
|
9
|
+
agents = new Map();
|
|
10
|
+
config;
|
|
11
|
+
runtime;
|
|
12
|
+
llmClient = null;
|
|
13
|
+
constructor(config = {}) {
|
|
14
|
+
this.config = {
|
|
15
|
+
maxConcurrentAgents: config.maxConcurrentAgents ?? 5,
|
|
16
|
+
taskTimeout: config.taskTimeout ?? 60000,
|
|
17
|
+
retryOnFailure: config.retryOnFailure ?? true,
|
|
18
|
+
};
|
|
19
|
+
this.runtime = new AgentRuntime({
|
|
20
|
+
timeout: this.config.taskTimeout || 60000,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Set the LLM client used for task execution.
|
|
25
|
+
* Must be called before delegateTask() or coordinateAgents().
|
|
26
|
+
*/
|
|
27
|
+
setLLMClient(client) {
|
|
28
|
+
this.llmClient = client;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the current LLM client (if configured)
|
|
32
|
+
*/
|
|
33
|
+
getLLMClient() {
|
|
34
|
+
return this.llmClient;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register an agent
|
|
38
|
+
*/
|
|
39
|
+
registerAgent(agent) {
|
|
40
|
+
if (this.agents.has(agent.id)) {
|
|
41
|
+
throw new Error(`Agent with ID "${agent.id}" is already registered`);
|
|
42
|
+
}
|
|
43
|
+
this.agents.set(agent.id, agent);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Unregister an agent
|
|
47
|
+
*/
|
|
48
|
+
unregisterAgent(agentId) {
|
|
49
|
+
this.agents.delete(agentId);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get an agent by ID
|
|
53
|
+
*/
|
|
54
|
+
getAgent(agentId) {
|
|
55
|
+
return this.agents.get(agentId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get all registered agents
|
|
59
|
+
*/
|
|
60
|
+
getAllAgents() {
|
|
61
|
+
return Array.from(this.agents.values());
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delegate a task to the most appropriate agent.
|
|
65
|
+
* Uses the runtime's agentic loop (LLM chat → tool calls → repeat).
|
|
66
|
+
*/
|
|
67
|
+
async delegateTask(task, preferredAgentId) {
|
|
68
|
+
if (!this.llmClient) {
|
|
69
|
+
throw new Error('LLM client not configured. Call setLLMClient() before delegating tasks.');
|
|
70
|
+
}
|
|
71
|
+
let agent;
|
|
72
|
+
if (preferredAgentId) {
|
|
73
|
+
agent = this.agents.get(preferredAgentId);
|
|
74
|
+
if (!agent) {
|
|
75
|
+
throw new Error(`Agent "${preferredAgentId}" not found`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
agent = this.findBestAgent(task);
|
|
80
|
+
if (!agent) {
|
|
81
|
+
throw new Error(`No suitable agent found for task type "${task.type}"`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const result = await this.runtime.executeTask(agent, task, this.llmClient);
|
|
85
|
+
// Retry once on failure if configured
|
|
86
|
+
if (!result.success && this.config.retryOnFailure) {
|
|
87
|
+
return this.runtime.executeTask(agent, task, this.llmClient);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Find the best agent for a task.
|
|
93
|
+
*
|
|
94
|
+
* Routing priority:
|
|
95
|
+
* 1. Capability intersection — agent whose AgentConfig.capabilities overlaps
|
|
96
|
+
* with task.requiredCapabilities (highest-overlap agent wins)
|
|
97
|
+
* 2. Tool-name substring match — agent has a tool whose name includes the
|
|
98
|
+
* task type string (legacy fallback)
|
|
99
|
+
* 3. First registered agent — last-resort fallback
|
|
100
|
+
*/
|
|
101
|
+
findBestAgent(task) {
|
|
102
|
+
// 1. Capability-based routing
|
|
103
|
+
if (task.requiredCapabilities && task.requiredCapabilities.length > 0) {
|
|
104
|
+
const required = new Set(task.requiredCapabilities);
|
|
105
|
+
let bestAgent;
|
|
106
|
+
let bestScore = 0;
|
|
107
|
+
for (const agent of this.agents.values()) {
|
|
108
|
+
const caps = agent.config?.capabilities ?? [];
|
|
109
|
+
const score = caps.filter((c) => required.has(c)).length;
|
|
110
|
+
if (score > bestScore) {
|
|
111
|
+
bestScore = score;
|
|
112
|
+
bestAgent = agent;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (bestAgent)
|
|
116
|
+
return bestAgent;
|
|
117
|
+
}
|
|
118
|
+
// 2. Tool-name substring fallback
|
|
119
|
+
for (const agent of this.agents.values()) {
|
|
120
|
+
const hasRelevantTool = agent.tools.some((tool) => tool.name.toLowerCase().includes(task.type.toLowerCase()));
|
|
121
|
+
if (hasRelevantTool)
|
|
122
|
+
return agent;
|
|
123
|
+
}
|
|
124
|
+
// 3. First agent
|
|
125
|
+
return this.agents.values().next().value;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Coordinate multiple agents for a complex task.
|
|
129
|
+
* Executes in batches up to maxConcurrentAgents, each agent receiving a subtask.
|
|
130
|
+
*/
|
|
131
|
+
async coordinateAgents(task, agentIds) {
|
|
132
|
+
if (!this.llmClient) {
|
|
133
|
+
throw new Error('LLM client not configured. Call setLLMClient() before coordinating agents.');
|
|
134
|
+
}
|
|
135
|
+
const llmClient = this.llmClient;
|
|
136
|
+
const results = new Map();
|
|
137
|
+
const maxConcurrent = this.config.maxConcurrentAgents || 5;
|
|
138
|
+
for (let i = 0; i < agentIds.length; i += maxConcurrent) {
|
|
139
|
+
const batch = agentIds.slice(i, i + maxConcurrent);
|
|
140
|
+
const batchPromises = [];
|
|
141
|
+
for (const agentId of batch) {
|
|
142
|
+
const agent = this.agents.get(agentId);
|
|
143
|
+
if (!agent) {
|
|
144
|
+
results.set(agentId, {
|
|
145
|
+
success: false,
|
|
146
|
+
error: `Agent "${agentId}" not found`,
|
|
147
|
+
});
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Create agent-specific subtask
|
|
151
|
+
const subtask = {
|
|
152
|
+
...task,
|
|
153
|
+
id: `${task.id}-${agentId}`,
|
|
154
|
+
description: `[Agent: ${agent.name}] ${task.description}`,
|
|
155
|
+
};
|
|
156
|
+
batchPromises.push(this.runtime
|
|
157
|
+
.executeTask(agent, subtask, llmClient)
|
|
158
|
+
.then((result) => [agentId, result])
|
|
159
|
+
.catch((error) => [
|
|
160
|
+
agentId,
|
|
161
|
+
{
|
|
162
|
+
success: false,
|
|
163
|
+
error: error instanceof Error ? error.message : String(error),
|
|
164
|
+
},
|
|
165
|
+
]));
|
|
166
|
+
}
|
|
167
|
+
const batchResults = await Promise.all(batchPromises);
|
|
168
|
+
for (const [agentId, result] of batchResults) {
|
|
169
|
+
results.set(agentId, result);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return results;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Runtime
|
|
3
|
+
*
|
|
4
|
+
* Executes agent tasks with tool execution, memory management, and error handling
|
|
5
|
+
*/
|
|
6
|
+
import type { LLMClient } from '../llm/client.js';
|
|
7
|
+
import type { AgentSkillProvider } from '../skills/integration/agent-skill-provider.js';
|
|
8
|
+
import type { MCPToolSource } from '../tools/mcp-adapter.js';
|
|
9
|
+
import type { Agent, AgentResult, Task } from './agent.js';
|
|
10
|
+
/**
|
|
11
|
+
* Controls how much of the model's token budget is allocated to internal reasoning.
|
|
12
|
+
* Applies to Anthropic Claude only — ignored by other providers.
|
|
13
|
+
*
|
|
14
|
+
* | Level | Budget (tokens) | Use case |
|
|
15
|
+
* |---------|-----------------|-----------------------------------|
|
|
16
|
+
* | off | 0 | Disabled (default) |
|
|
17
|
+
* | minimal | 512 | Simple tasks, cost-sensitive |
|
|
18
|
+
* | low | 2 048 | Moderate complexity |
|
|
19
|
+
* | medium | 8 000 | Multi-step reasoning |
|
|
20
|
+
* | high | 16 000 | Complex planning |
|
|
21
|
+
* | xhigh | 31 999 | Maximum depth (expensive) |
|
|
22
|
+
*/
|
|
23
|
+
export type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
24
|
+
export interface RuntimeConfig {
|
|
25
|
+
maxIterations?: number;
|
|
26
|
+
timeout?: number;
|
|
27
|
+
retryOnError?: boolean;
|
|
28
|
+
maxRetries?: number;
|
|
29
|
+
/** Enable prompt caching for Anthropic (90% cost reduction on cache hits) */
|
|
30
|
+
enableCache?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Extended thinking depth (Anthropic only).
|
|
33
|
+
* Allocates token budget for internal reasoning before each response.
|
|
34
|
+
* Defaults to 'off'. Trade cost for quality on complex tasks.
|
|
35
|
+
*/
|
|
36
|
+
thinkingLevel?: ThinkingLevel;
|
|
37
|
+
/**
|
|
38
|
+
* Optional MCP Hypervisor (or any MCPToolSource). When provided, tools from
|
|
39
|
+
* all healthy MCP servers are merged into the agent's tool set before each
|
|
40
|
+
* task execution. Pass an MCPHypervisor from @revealui/mcp.
|
|
41
|
+
*/
|
|
42
|
+
mcpToolSource?: MCPToolSource;
|
|
43
|
+
/**
|
|
44
|
+
* Optional skill provider. When set, activated skills are injected into the
|
|
45
|
+
* system prompt before the first LLM call, giving the agent contextual
|
|
46
|
+
* instructions from the matching skill packages.
|
|
47
|
+
*/
|
|
48
|
+
skillProvider?: AgentSkillProvider;
|
|
49
|
+
}
|
|
50
|
+
export declare class AgentRuntime {
|
|
51
|
+
protected config: RuntimeConfig;
|
|
52
|
+
private taskQueue;
|
|
53
|
+
private executingTasks;
|
|
54
|
+
private isShuttingDown;
|
|
55
|
+
constructor(config?: RuntimeConfig);
|
|
56
|
+
/**
|
|
57
|
+
* Execute a task with an agent
|
|
58
|
+
*/
|
|
59
|
+
executeTask(agent: Agent, task: Task, llmClient: LLMClient): Promise<AgentResult>;
|
|
60
|
+
private runTask;
|
|
61
|
+
/**
|
|
62
|
+
* Add task to queue
|
|
63
|
+
*/
|
|
64
|
+
enqueueTask(task: Task): void;
|
|
65
|
+
/**
|
|
66
|
+
* Process task queue
|
|
67
|
+
*/
|
|
68
|
+
processQueue(agent: Agent, llmClient: LLMClient): Promise<AgentResult[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Cleanup runtime resources - cancel executing tasks and clear queue
|
|
71
|
+
*/
|
|
72
|
+
cleanup(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Get runtime status
|
|
75
|
+
*/
|
|
76
|
+
getStatus(): {
|
|
77
|
+
isShuttingDown: boolean;
|
|
78
|
+
queuedTasks: number;
|
|
79
|
+
executingTasks: number;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/orchestration/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAA;AAGvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAG5D,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAWnF,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAA;CACnC;AAED,qBAAa,YAAY;IACvB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAA;IAC/B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,cAAc,CAAQ;gBAElB,MAAM,GAAE,aAAkB;IAmBtC;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;YAqBzE,OAAO;IAoKrB;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAI7B;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAc9E;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B9B;;OAEG;IACH,SAAS,IAAI;QACX,cAAc,EAAE,OAAO,CAAA;QACvB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,MAAM,CAAA;KACvB;CAOF"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Runtime
|
|
3
|
+
*
|
|
4
|
+
* Executes agent tasks with tool execution, memory management, and error handling
|
|
5
|
+
*/
|
|
6
|
+
import { registerCleanupHandler } from '@revealui/core/monitoring';
|
|
7
|
+
import { z } from 'zod/v4';
|
|
8
|
+
import { ToolCallDeduplicator } from '../tools/deduplicator.js';
|
|
9
|
+
import { discoverMCPTools } from '../tools/mcp-adapter.js';
|
|
10
|
+
import { createWebSearchTool } from '../tools/web/duck-duck-go.js';
|
|
11
|
+
const THINKING_BUDGETS = {
|
|
12
|
+
off: 0,
|
|
13
|
+
minimal: 512,
|
|
14
|
+
low: 2048,
|
|
15
|
+
medium: 8000,
|
|
16
|
+
high: 16000,
|
|
17
|
+
xhigh: 31999,
|
|
18
|
+
};
|
|
19
|
+
export class AgentRuntime {
|
|
20
|
+
config;
|
|
21
|
+
taskQueue = [];
|
|
22
|
+
executingTasks = new Map();
|
|
23
|
+
isShuttingDown = false;
|
|
24
|
+
constructor(config = {}) {
|
|
25
|
+
this.config = {
|
|
26
|
+
maxIterations: config.maxIterations ?? 10,
|
|
27
|
+
timeout: config.timeout ?? 60000, // 60 seconds
|
|
28
|
+
retryOnError: config.retryOnError ?? true,
|
|
29
|
+
maxRetries: config.maxRetries ?? 3,
|
|
30
|
+
enableCache: config.enableCache ?? true, // Enable by default for cost savings
|
|
31
|
+
mcpToolSource: config.mcpToolSource,
|
|
32
|
+
};
|
|
33
|
+
// Register cleanup handler
|
|
34
|
+
registerCleanupHandler(`ai-runtime-${Date.now()}`, () => this.cleanup(), 'Cleanup AI agent runtime tasks', 80);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Execute a task with an agent
|
|
38
|
+
*/
|
|
39
|
+
async executeTask(agent, task, llmClient) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
// Check if task is already executing
|
|
42
|
+
const existingExecution = this.executingTasks.get(task.id);
|
|
43
|
+
if (existingExecution) {
|
|
44
|
+
return existingExecution;
|
|
45
|
+
}
|
|
46
|
+
// Create execution promise
|
|
47
|
+
const execution = this.runTask(agent, task, llmClient, startTime);
|
|
48
|
+
this.executingTasks.set(task.id, execution);
|
|
49
|
+
try {
|
|
50
|
+
const result = await execution;
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
this.executingTasks.delete(task.id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async runTask(agent, task, llmClient, startTime) {
|
|
58
|
+
const toolResults = [];
|
|
59
|
+
const deduplicator = new ToolCallDeduplicator();
|
|
60
|
+
let iterations = 0;
|
|
61
|
+
// Merge MCP-discovered tools (from healthy servers) into the agent's tool set
|
|
62
|
+
const mcpTools = this.config.mcpToolSource ? discoverMCPTools(this.config.mcpToolSource) : [];
|
|
63
|
+
// Swap in a custom WebSearchProvider if the agent config specifies one (P4-3)
|
|
64
|
+
const customProvider = agent.config?.webSearchProvider;
|
|
65
|
+
let baseTools;
|
|
66
|
+
if (customProvider) {
|
|
67
|
+
const customSearchTool = createWebSearchTool(customProvider);
|
|
68
|
+
baseTools = agent.tools.map((t) => (t.name === 'web_search' ? customSearchTool : t));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
baseTools = agent.tools;
|
|
72
|
+
}
|
|
73
|
+
const allTools = mcpTools.length > 0 ? [...baseTools, ...mcpTools] : baseTools;
|
|
74
|
+
let messages = [
|
|
75
|
+
{
|
|
76
|
+
role: 'system',
|
|
77
|
+
content: agent.instructions,
|
|
78
|
+
// Cache agent instructions for cost savings (Anthropic only)
|
|
79
|
+
cacheControl: this.config.enableCache ? { type: 'ephemeral' } : undefined,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
role: 'user',
|
|
83
|
+
content: task.description,
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
// Inject activated skill instructions into the system prompt.
|
|
87
|
+
if (this.config.skillProvider) {
|
|
88
|
+
const { messages: augmented } = await this.config.skillProvider.injectSkillInstructions(messages, { taskDescription: task.description });
|
|
89
|
+
messages = augmented;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
while (iterations < (this.config.maxIterations || 10)) {
|
|
93
|
+
iterations++;
|
|
94
|
+
// Check timeout
|
|
95
|
+
if (Date.now() - startTime > (this.config.timeout || 60000)) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
error: 'Task execution timeout',
|
|
99
|
+
toolResults,
|
|
100
|
+
metadata: {
|
|
101
|
+
executionTime: Date.now() - startTime,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Resolve thinking budget if a level is configured
|
|
106
|
+
const thinkingBudget = this.config.thinkingLevel && this.config.thinkingLevel !== 'off'
|
|
107
|
+
? THINKING_BUDGETS[this.config.thinkingLevel]
|
|
108
|
+
: undefined;
|
|
109
|
+
// Get LLM response (with caching for agent instructions and tools)
|
|
110
|
+
const response = await llmClient.chat(messages, {
|
|
111
|
+
tools: allTools.map((tool) => ({
|
|
112
|
+
type: 'function',
|
|
113
|
+
function: {
|
|
114
|
+
name: tool.name,
|
|
115
|
+
description: tool.description,
|
|
116
|
+
parameters: z.toJSONSchema(tool.parameters),
|
|
117
|
+
},
|
|
118
|
+
})),
|
|
119
|
+
enableCache: this.config.enableCache,
|
|
120
|
+
thinkingBudget,
|
|
121
|
+
});
|
|
122
|
+
// Add assistant response to messages
|
|
123
|
+
messages.push({
|
|
124
|
+
role: 'assistant',
|
|
125
|
+
content: response.content,
|
|
126
|
+
toolCalls: response.toolCalls || [],
|
|
127
|
+
});
|
|
128
|
+
// If no tool calls, task is complete
|
|
129
|
+
if (!response.toolCalls || response.toolCalls.length === 0) {
|
|
130
|
+
return {
|
|
131
|
+
success: true,
|
|
132
|
+
output: response.content,
|
|
133
|
+
toolResults,
|
|
134
|
+
metadata: {
|
|
135
|
+
executionTime: Date.now() - startTime,
|
|
136
|
+
tokensUsed: response.usage?.totalTokens || 0,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Execute tool calls
|
|
141
|
+
for (const toolCall of response.toolCalls) {
|
|
142
|
+
const tool = allTools.find((t) => t.name === toolCall.function.name);
|
|
143
|
+
if (!tool) {
|
|
144
|
+
toolResults.push({
|
|
145
|
+
success: false,
|
|
146
|
+
error: `Tool "${toolCall.function.name}" not found`,
|
|
147
|
+
});
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const params = JSON.parse(toolCall.function.arguments);
|
|
152
|
+
// Return cached result for duplicate tool calls within this run
|
|
153
|
+
const cached = deduplicator.isDuplicate(tool.name, params)
|
|
154
|
+
? deduplicator.getResult(tool.name, params)
|
|
155
|
+
: undefined;
|
|
156
|
+
const result = cached ?? (await tool.execute(params));
|
|
157
|
+
if (!cached)
|
|
158
|
+
deduplicator.record(tool.name, params, result);
|
|
159
|
+
toolResults.push(result);
|
|
160
|
+
// Add tool result to messages.
|
|
161
|
+
// Use result.content (LLM-optimized summary) when available;
|
|
162
|
+
// otherwise serialize the full result so the model has context.
|
|
163
|
+
messages.push({
|
|
164
|
+
role: 'tool',
|
|
165
|
+
content: result.content ?? JSON.stringify(result.data ?? result),
|
|
166
|
+
toolCallId: toolCall.id,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
toolResults.push({
|
|
171
|
+
success: false,
|
|
172
|
+
error: error instanceof Error ? error.message : String(error),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
error: 'Maximum iterations reached',
|
|
180
|
+
toolResults,
|
|
181
|
+
metadata: {
|
|
182
|
+
executionTime: Date.now() - startTime,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
error: error instanceof Error ? error.message : String(error),
|
|
190
|
+
toolResults,
|
|
191
|
+
metadata: {
|
|
192
|
+
executionTime: Date.now() - startTime,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Add task to queue
|
|
199
|
+
*/
|
|
200
|
+
enqueueTask(task) {
|
|
201
|
+
this.taskQueue.push(task);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Process task queue
|
|
205
|
+
*/
|
|
206
|
+
async processQueue(agent, llmClient) {
|
|
207
|
+
const results = [];
|
|
208
|
+
while (this.taskQueue.length > 0) {
|
|
209
|
+
const task = this.taskQueue.shift();
|
|
210
|
+
if (task) {
|
|
211
|
+
const result = await this.executeTask(agent, task, llmClient);
|
|
212
|
+
results.push(result);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Cleanup runtime resources - cancel executing tasks and clear queue
|
|
219
|
+
*/
|
|
220
|
+
async cleanup() {
|
|
221
|
+
if (this.isShuttingDown)
|
|
222
|
+
return;
|
|
223
|
+
this.isShuttingDown = true;
|
|
224
|
+
// Clear task queue
|
|
225
|
+
this.taskQueue = [];
|
|
226
|
+
// Wait for executing tasks to complete (with timeout)
|
|
227
|
+
if (this.executingTasks.size > 0) {
|
|
228
|
+
const timeout = new Promise((resolve) => {
|
|
229
|
+
setTimeout(() => resolve(), 10_000); // 10 second timeout
|
|
230
|
+
});
|
|
231
|
+
const allTasks = Promise.all(Array.from(this.executingTasks.values()).map((task) => task.catch(() => {
|
|
232
|
+
/* Ignore errors during cleanup */
|
|
233
|
+
}))).then(() => {
|
|
234
|
+
// All tasks completed
|
|
235
|
+
});
|
|
236
|
+
await Promise.race([allTasks, timeout]);
|
|
237
|
+
}
|
|
238
|
+
// Clear executing tasks map
|
|
239
|
+
this.executingTasks.clear();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get runtime status
|
|
243
|
+
*/
|
|
244
|
+
getStatus() {
|
|
245
|
+
return {
|
|
246
|
+
isShuttingDown: this.isShuttingDown,
|
|
247
|
+
queuedTasks: this.taskQueue.length,
|
|
248
|
+
executingTasks: this.executingTasks.size,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Agent Runtime
|
|
3
|
+
*
|
|
4
|
+
* Extends AgentRuntime with SSE-compatible streaming via LLMClient.stream().
|
|
5
|
+
* Each yielded AgentStreamChunk maps to one SSE event.
|
|
6
|
+
*
|
|
7
|
+
* AnythingLLM lesson: SSE is the correct approach for unidirectional LLM output.
|
|
8
|
+
* EventSource is not used client-side because it doesn't support POST — use fetch + ReadableStream.
|
|
9
|
+
*/
|
|
10
|
+
import type { LLMClient } from '../llm/client.js';
|
|
11
|
+
import type { ToolResult } from '../tools/base.js';
|
|
12
|
+
import type { Agent, Task } from './agent.js';
|
|
13
|
+
import { AgentRuntime, type RuntimeConfig } from './runtime.js';
|
|
14
|
+
export interface AgentStreamChunk {
|
|
15
|
+
type: 'text' | 'tool_call_start' | 'tool_call_result' | 'error' | 'done';
|
|
16
|
+
content?: string;
|
|
17
|
+
toolCall?: {
|
|
18
|
+
name: string;
|
|
19
|
+
arguments: string;
|
|
20
|
+
};
|
|
21
|
+
toolResult?: ToolResult;
|
|
22
|
+
error?: string;
|
|
23
|
+
metadata?: {
|
|
24
|
+
tokensUsed?: number;
|
|
25
|
+
executionTime?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare class StreamingAgentRuntime extends AgentRuntime {
|
|
29
|
+
constructor(config?: RuntimeConfig);
|
|
30
|
+
/**
|
|
31
|
+
* Stream a task execution, yielding typed events as they occur.
|
|
32
|
+
* Accepts an AbortSignal — on abort, emits an error event and stops.
|
|
33
|
+
*/
|
|
34
|
+
streamTask(agent: Agent, task: Task, llmClient: LLMClient, signal?: AbortSignal): AsyncGenerator<AgentStreamChunk>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=streaming-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-runtime.d.ts","sourceRoot":"","sources":["../../src/orchestration/streaming-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,GAAG,MAAM,CAAA;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,aAAa,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;CACF;AAED,qBAAa,qBAAsB,SAAQ,YAAY;gBACzC,MAAM,GAAE,aAAkB;IAItC;;;OAGG;IACI,UAAU,CACf,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,gBAAgB,CAAC;CA+KpC"}
|