@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,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A JSON-RPC Handler
|
|
3
|
+
*
|
|
4
|
+
* Dispatches A2A JSON-RPC 2.0 methods to the appropriate implementation.
|
|
5
|
+
* Integrates with AgentRuntime and AgentOrchestrator from @revealui/ai/orchestration.
|
|
6
|
+
*
|
|
7
|
+
* Supported methods:
|
|
8
|
+
* tasks/send — synchronous task execution
|
|
9
|
+
* tasks/get — retrieve task by ID
|
|
10
|
+
* tasks/cancel — cancel a running task
|
|
11
|
+
* tasks/sendSubscribe — (handled at route level via SSE; returns taskId here)
|
|
12
|
+
*/
|
|
13
|
+
import { A2ASendTaskParamsSchema } from '@revealui/contracts';
|
|
14
|
+
import { logger } from '@revealui/core/observability/logger';
|
|
15
|
+
import { agentCardRegistry } from './card.js';
|
|
16
|
+
import { appendArtifact, cancelTask, createTask, getTask, getTaskSignal, updateTaskState, } from './task-store.js';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// JSON-RPC error codes (A2A uses standard JSON-RPC codes + custom range -32000+)
|
|
19
|
+
// =============================================================================
|
|
20
|
+
const RPC_PARSE_ERROR = -32700;
|
|
21
|
+
const RPC_INVALID_REQUEST = -32600;
|
|
22
|
+
const RPC_METHOD_NOT_FOUND = -32601;
|
|
23
|
+
const RPC_INVALID_PARAMS = -32602;
|
|
24
|
+
const RPC_TASK_NOT_FOUND = -32001;
|
|
25
|
+
const RPC_TASK_NOT_CANCELABLE = -32002;
|
|
26
|
+
const RPC_AGENT_NOT_FOUND = -32003;
|
|
27
|
+
// =============================================================================
|
|
28
|
+
// Response helpers
|
|
29
|
+
// =============================================================================
|
|
30
|
+
function ok(id, result) {
|
|
31
|
+
return { jsonrpc: '2.0', id, result };
|
|
32
|
+
}
|
|
33
|
+
function err(id, code, message, data) {
|
|
34
|
+
return { jsonrpc: '2.0', id, error: { code, message, data } };
|
|
35
|
+
}
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// Method handlers
|
|
38
|
+
// =============================================================================
|
|
39
|
+
async function handleTasksSend(id, params, agentId, llmClient) {
|
|
40
|
+
const parsed = A2ASendTaskParamsSchema.safeParse(params);
|
|
41
|
+
if (!parsed.success) {
|
|
42
|
+
return err(id, RPC_INVALID_PARAMS, 'Invalid tasks/send params', parsed.error.issues);
|
|
43
|
+
}
|
|
44
|
+
const p = parsed.data;
|
|
45
|
+
// Validate agent exists if agentId provided
|
|
46
|
+
if (agentId && !agentCardRegistry.has(agentId)) {
|
|
47
|
+
return err(id, RPC_AGENT_NOT_FOUND, `Agent '${agentId}' not found`);
|
|
48
|
+
}
|
|
49
|
+
// Create task in submitted state
|
|
50
|
+
const task = createTask({
|
|
51
|
+
id: p.id,
|
|
52
|
+
sessionId: p.sessionId,
|
|
53
|
+
message: p.message,
|
|
54
|
+
metadata: p.metadata,
|
|
55
|
+
});
|
|
56
|
+
const signal = getTaskSignal(task.id);
|
|
57
|
+
try {
|
|
58
|
+
// Transition to working
|
|
59
|
+
updateTaskState(task.id, 'working');
|
|
60
|
+
// Execute via orchestration — for now, produce a direct text response.
|
|
61
|
+
// Full AgentRuntime integration wires in when an LLM provider is configured.
|
|
62
|
+
const agentDef = agentId
|
|
63
|
+
? agentCardRegistry.getDef(agentId)
|
|
64
|
+
: agentCardRegistry.getDef('revealui-creator');
|
|
65
|
+
if (signal?.aborted) {
|
|
66
|
+
return ok(id, getTask(task.id));
|
|
67
|
+
}
|
|
68
|
+
// Build response message
|
|
69
|
+
const textInput = p.message.parts
|
|
70
|
+
.filter((part) => part.type === 'text')
|
|
71
|
+
.map((part) => ('text' in part ? part.text : ''))
|
|
72
|
+
.join('\n')
|
|
73
|
+
.trim();
|
|
74
|
+
let responseText;
|
|
75
|
+
if (llmClient && textInput) {
|
|
76
|
+
// Real LLM call using the provided client
|
|
77
|
+
const messages = [];
|
|
78
|
+
if (agentDef?.systemPrompt) {
|
|
79
|
+
messages.push({ role: 'system', content: agentDef.systemPrompt });
|
|
80
|
+
}
|
|
81
|
+
messages.push({ role: 'user', content: textInput });
|
|
82
|
+
const llmResponse = await llmClient.chat(messages);
|
|
83
|
+
responseText = llmResponse.content;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Stub response when no LLM client is configured
|
|
87
|
+
responseText = agentDef
|
|
88
|
+
? `[${agentDef.name}] Received: "${textInput}". Task queued for execution. ` +
|
|
89
|
+
`Capabilities: ${agentDef.capabilities.join(', ')}.`
|
|
90
|
+
: `Task received: "${textInput}". Processing...`;
|
|
91
|
+
}
|
|
92
|
+
const agentMessage = {
|
|
93
|
+
role: 'agent',
|
|
94
|
+
parts: [{ type: 'text', text: responseText }],
|
|
95
|
+
};
|
|
96
|
+
// Append artifact and complete
|
|
97
|
+
appendArtifact(task.id, {
|
|
98
|
+
name: 'response',
|
|
99
|
+
parts: [{ type: 'text', text: responseText }],
|
|
100
|
+
index: 0,
|
|
101
|
+
lastChunk: true,
|
|
102
|
+
});
|
|
103
|
+
const completed = updateTaskState(task.id, 'completed', agentMessage);
|
|
104
|
+
logger.info(`A2A task ${task.id} completed`);
|
|
105
|
+
return ok(id, completed);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
const message = e instanceof Error ? e.message : 'Task execution failed';
|
|
109
|
+
logger.error(`A2A task ${task.id} failed: ${message}`);
|
|
110
|
+
const failed = updateTaskState(task.id, 'failed', {
|
|
111
|
+
role: 'agent',
|
|
112
|
+
parts: [{ type: 'text', text: `Error: ${message}` }],
|
|
113
|
+
});
|
|
114
|
+
return ok(id, failed);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function handleTasksGet(id, params) {
|
|
118
|
+
const p = params;
|
|
119
|
+
const taskId = p?.id;
|
|
120
|
+
if (typeof taskId !== 'string') {
|
|
121
|
+
return err(id, RPC_INVALID_PARAMS, 'params.id (string) is required');
|
|
122
|
+
}
|
|
123
|
+
const task = getTask(taskId);
|
|
124
|
+
if (!task) {
|
|
125
|
+
return err(id, RPC_TASK_NOT_FOUND, `Task '${taskId}' not found`);
|
|
126
|
+
}
|
|
127
|
+
return ok(id, task);
|
|
128
|
+
}
|
|
129
|
+
function handleTasksCancel(id, params) {
|
|
130
|
+
const p = params;
|
|
131
|
+
const taskId = p?.id;
|
|
132
|
+
if (typeof taskId !== 'string') {
|
|
133
|
+
return err(id, RPC_INVALID_PARAMS, 'params.id (string) is required');
|
|
134
|
+
}
|
|
135
|
+
const canceled = cancelTask(taskId);
|
|
136
|
+
if (!canceled) {
|
|
137
|
+
const task = getTask(taskId);
|
|
138
|
+
if (!task)
|
|
139
|
+
return err(id, RPC_TASK_NOT_FOUND, `Task '${taskId}' not found`);
|
|
140
|
+
return err(id, RPC_TASK_NOT_CANCELABLE, `Task '${taskId}' is not in a cancelable state`);
|
|
141
|
+
}
|
|
142
|
+
return ok(id, getTask(taskId));
|
|
143
|
+
}
|
|
144
|
+
// =============================================================================
|
|
145
|
+
// Main dispatcher
|
|
146
|
+
// =============================================================================
|
|
147
|
+
/**
|
|
148
|
+
* Handle an A2A JSON-RPC request and return a JSON-RPC response.
|
|
149
|
+
*
|
|
150
|
+
* @param req - Parsed JSON-RPC request body
|
|
151
|
+
* @param agentId - Optional agent ID (from X-Agent-ID header)
|
|
152
|
+
* @param llmClient - Optional LLM client for real inference (BYOK)
|
|
153
|
+
*/
|
|
154
|
+
export async function handleA2AJsonRpc(req, agentId, llmClient) {
|
|
155
|
+
const { id, method, params } = req;
|
|
156
|
+
switch (method) {
|
|
157
|
+
case 'tasks/send':
|
|
158
|
+
return handleTasksSend(id, params, agentId, llmClient);
|
|
159
|
+
case 'tasks/get':
|
|
160
|
+
return handleTasksGet(id, params);
|
|
161
|
+
case 'tasks/cancel':
|
|
162
|
+
return handleTasksCancel(id, params);
|
|
163
|
+
case 'tasks/sendSubscribe':
|
|
164
|
+
// SSE streaming is handled at the Hono route level; return a reference task here
|
|
165
|
+
return handleTasksSend(id, params, agentId, llmClient);
|
|
166
|
+
default:
|
|
167
|
+
return err(id, RPC_METHOD_NOT_FOUND, `Method '${method}' not found`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
export { RPC_PARSE_ERROR, RPC_INVALID_REQUEST };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @revealui/ai — A2A Protocol Implementation
|
|
3
|
+
*
|
|
4
|
+
* Agent-to-Agent (A2A) protocol support for RevealUI.
|
|
5
|
+
* Exports the agent card registry, task store, and JSON-RPC handler.
|
|
6
|
+
*/
|
|
7
|
+
export { agentCardRegistry } from './card.js';
|
|
8
|
+
export { handleA2AJsonRpc, RPC_INVALID_REQUEST, RPC_PARSE_ERROR } from './handler.js';
|
|
9
|
+
export { appendArtifact, cancelTask, createTask, evictTask, getTask, getTaskSignal, updateTaskState, } from './task-store.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/a2a/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACrF,OAAO,EACL,cAAc,EACd,UAAU,EACV,UAAU,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,eAAe,GAChB,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @revealui/ai — A2A Protocol Implementation
|
|
3
|
+
*
|
|
4
|
+
* Agent-to-Agent (A2A) protocol support for RevealUI.
|
|
5
|
+
* Exports the agent card registry, task store, and JSON-RPC handler.
|
|
6
|
+
*/
|
|
7
|
+
export { agentCardRegistry } from './card.js';
|
|
8
|
+
export { handleA2AJsonRpc, RPC_INVALID_REQUEST, RPC_PARSE_ERROR } from './handler.js';
|
|
9
|
+
export { appendArtifact, cancelTask, createTask, evictTask, getTask, getTaskSignal, updateTaskState, } from './task-store.js';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Task Store
|
|
3
|
+
*
|
|
4
|
+
* In-memory store for A2A task state. Tasks are short-lived (lifetime of a
|
|
5
|
+
* request or streaming session) so persistence is not needed here.
|
|
6
|
+
* The authoritative record for completed tasks lives in @revealui/db (agentActions).
|
|
7
|
+
*/
|
|
8
|
+
import type { A2AArtifact, A2AMessage, A2ATask, A2ATaskState } from '@revealui/contracts';
|
|
9
|
+
/**
|
|
10
|
+
* Create a new task in the 'submitted' state.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createTask(params: {
|
|
13
|
+
id?: string;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
message: A2AMessage;
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
}): A2ATask;
|
|
18
|
+
/**
|
|
19
|
+
* Get a task by ID.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getTask(id: string): A2ATask | null;
|
|
22
|
+
/**
|
|
23
|
+
* Transition a task to a new state, optionally attaching a message.
|
|
24
|
+
*/
|
|
25
|
+
export declare function updateTaskState(id: string, state: A2ATaskState, message?: A2AMessage): A2ATask | null;
|
|
26
|
+
/**
|
|
27
|
+
* Append an artifact to a completed task.
|
|
28
|
+
*/
|
|
29
|
+
export declare function appendArtifact(id: string, artifact: A2AArtifact): A2ATask | null;
|
|
30
|
+
/**
|
|
31
|
+
* Cancel a task. Returns true if the task was cancelable.
|
|
32
|
+
*/
|
|
33
|
+
export declare function cancelTask(id: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get the AbortSignal for a running task (so the executor can detect cancellation).
|
|
36
|
+
*/
|
|
37
|
+
export declare function getTaskSignal(id: string): AbortSignal | null;
|
|
38
|
+
/**
|
|
39
|
+
* Cleanup a task from the store (call after response has been sent).
|
|
40
|
+
*/
|
|
41
|
+
export declare function evictTask(id: string): void;
|
|
42
|
+
//# sourceMappingURL=task-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../src/a2a/task-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAUzF;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE;IACjC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,GAAG,OAAO,CAeV;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,GAAG,IAAI,CAehB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAUhF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAY9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAG1C"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Task Store
|
|
3
|
+
*
|
|
4
|
+
* In-memory store for A2A task state. Tasks are short-lived (lifetime of a
|
|
5
|
+
* request or streaming session) so persistence is not needed here.
|
|
6
|
+
* The authoritative record for completed tasks lives in @revealui/db (agentActions).
|
|
7
|
+
*/
|
|
8
|
+
// Map of abort controllers so callers can cancel running tasks
|
|
9
|
+
const _controllers = new Map();
|
|
10
|
+
const _tasks = new Map();
|
|
11
|
+
function now() {
|
|
12
|
+
return new Date().toISOString();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a new task in the 'submitted' state.
|
|
16
|
+
*/
|
|
17
|
+
export function createTask(params) {
|
|
18
|
+
const id = params.id ?? crypto.randomUUID();
|
|
19
|
+
const task = {
|
|
20
|
+
id,
|
|
21
|
+
sessionId: params.sessionId,
|
|
22
|
+
status: {
|
|
23
|
+
state: 'submitted',
|
|
24
|
+
timestamp: now(),
|
|
25
|
+
},
|
|
26
|
+
history: [params.message],
|
|
27
|
+
metadata: params.metadata,
|
|
28
|
+
};
|
|
29
|
+
_tasks.set(id, task);
|
|
30
|
+
_controllers.set(id, new AbortController());
|
|
31
|
+
return task;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get a task by ID.
|
|
35
|
+
*/
|
|
36
|
+
export function getTask(id) {
|
|
37
|
+
return _tasks.get(id) ?? null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Transition a task to a new state, optionally attaching a message.
|
|
41
|
+
*/
|
|
42
|
+
export function updateTaskState(id, state, message) {
|
|
43
|
+
const task = _tasks.get(id);
|
|
44
|
+
if (!task)
|
|
45
|
+
return null;
|
|
46
|
+
const updated = {
|
|
47
|
+
...task,
|
|
48
|
+
status: {
|
|
49
|
+
state,
|
|
50
|
+
message,
|
|
51
|
+
timestamp: now(),
|
|
52
|
+
},
|
|
53
|
+
history: message ? [...(task.history ?? []), message] : task.history,
|
|
54
|
+
};
|
|
55
|
+
_tasks.set(id, updated);
|
|
56
|
+
return updated;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Append an artifact to a completed task.
|
|
60
|
+
*/
|
|
61
|
+
export function appendArtifact(id, artifact) {
|
|
62
|
+
const task = _tasks.get(id);
|
|
63
|
+
if (!task)
|
|
64
|
+
return null;
|
|
65
|
+
const updated = {
|
|
66
|
+
...task,
|
|
67
|
+
artifacts: [...(task.artifacts ?? []), artifact],
|
|
68
|
+
};
|
|
69
|
+
_tasks.set(id, updated);
|
|
70
|
+
return updated;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Cancel a task. Returns true if the task was cancelable.
|
|
74
|
+
*/
|
|
75
|
+
export function cancelTask(id) {
|
|
76
|
+
const task = _tasks.get(id);
|
|
77
|
+
if (!task)
|
|
78
|
+
return false;
|
|
79
|
+
const cancelable = task.status.state === 'submitted' || task.status.state === 'working';
|
|
80
|
+
if (!cancelable)
|
|
81
|
+
return false;
|
|
82
|
+
// Signal abort to any running execution
|
|
83
|
+
_controllers.get(id)?.abort();
|
|
84
|
+
updateTaskState(id, 'canceled');
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the AbortSignal for a running task (so the executor can detect cancellation).
|
|
89
|
+
*/
|
|
90
|
+
export function getTaskSignal(id) {
|
|
91
|
+
return _controllers.get(id)?.signal ?? null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Cleanup a task from the store (call after response has been sent).
|
|
95
|
+
*/
|
|
96
|
+
export function evictTask(id) {
|
|
97
|
+
_tasks.delete(id);
|
|
98
|
+
_controllers.delete(id);
|
|
99
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Emitter
|
|
3
|
+
*
|
|
4
|
+
* Write-only interface for agents. Agents can emit events but cannot
|
|
5
|
+
* read, query, modify, or delete audit entries. This enforces the
|
|
6
|
+
* separation between agent execution and human oversight.
|
|
7
|
+
*
|
|
8
|
+
* The emitter is created by the AuditObserver and injected into agents
|
|
9
|
+
* via the runtime. Agents never have access to the observer itself.
|
|
10
|
+
*/
|
|
11
|
+
import type { AuditEventType, AuditSeverity } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Write-only audit interface provided to agents.
|
|
14
|
+
* This is the ONLY audit API agents can access.
|
|
15
|
+
*/
|
|
16
|
+
export interface AuditEmitter {
|
|
17
|
+
/**
|
|
18
|
+
* Emit an audit event. This is a fire-and-forget operation —
|
|
19
|
+
* the agent does not receive confirmation or any data back.
|
|
20
|
+
*/
|
|
21
|
+
emit(eventType: AuditEventType, payload: Record<string, unknown>, severity?: AuditSeverity): void;
|
|
22
|
+
}
|
|
23
|
+
/** Internal handler signature used by the observer to receive emitted events */
|
|
24
|
+
export type AuditEmitHandler = (agentId: string, eventType: AuditEventType, payload: Record<string, unknown>, severity: AuditSeverity) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a frozen, write-only AuditEmitter bound to a specific agent.
|
|
27
|
+
* The returned object is frozen to prevent agents from modifying it.
|
|
28
|
+
*
|
|
29
|
+
* @param agentId - The agent this emitter is scoped to
|
|
30
|
+
* @param handler - Internal handler that routes events to the observer
|
|
31
|
+
* @returns A frozen, write-only AuditEmitter
|
|
32
|
+
*/
|
|
33
|
+
export declare function createAuditEmitter(agentId: string, handler: AuditEmitHandler): AuditEmitter;
|
|
34
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/audit/emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI/D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;CAClG;AAID,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,aAAa,KACpB,IAAI,CAAA;AAIT;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAkB3F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Emitter
|
|
3
|
+
*
|
|
4
|
+
* Write-only interface for agents. Agents can emit events but cannot
|
|
5
|
+
* read, query, modify, or delete audit entries. This enforces the
|
|
6
|
+
* separation between agent execution and human oversight.
|
|
7
|
+
*
|
|
8
|
+
* The emitter is created by the AuditObserver and injected into agents
|
|
9
|
+
* via the runtime. Agents never have access to the observer itself.
|
|
10
|
+
*/
|
|
11
|
+
// ─── Emitter Factory ────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Creates a frozen, write-only AuditEmitter bound to a specific agent.
|
|
14
|
+
* The returned object is frozen to prevent agents from modifying it.
|
|
15
|
+
*
|
|
16
|
+
* @param agentId - The agent this emitter is scoped to
|
|
17
|
+
* @param handler - Internal handler that routes events to the observer
|
|
18
|
+
* @returns A frozen, write-only AuditEmitter
|
|
19
|
+
*/
|
|
20
|
+
export function createAuditEmitter(agentId, handler) {
|
|
21
|
+
const emitter = {
|
|
22
|
+
emit(eventType, payload, severity = 'info') {
|
|
23
|
+
// Fire-and-forget — agents don't get feedback from the audit system
|
|
24
|
+
try {
|
|
25
|
+
handler(agentId, eventType, payload, severity);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Silently swallow errors — audit failures must never affect agent execution
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
// Freeze to prevent agents from replacing or extending the emitter
|
|
33
|
+
return Object.freeze(emitter);
|
|
34
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Trail System
|
|
3
|
+
*
|
|
4
|
+
* Provides an immutable, append-only audit trail for all agent activity.
|
|
5
|
+
* Designed with strict separation of concerns:
|
|
6
|
+
*
|
|
7
|
+
* - **Agents** receive a write-only `AuditEmitter` (can emit events, nothing else)
|
|
8
|
+
* - **Humans** control the `AuditObserver` (query, policies, kill switches)
|
|
9
|
+
* - **Store** is append-only (no updates, no deletes)
|
|
10
|
+
*
|
|
11
|
+
* This architecture ensures that AI agents cannot tamper with, disable,
|
|
12
|
+
* or circumvent the audit trail — it lives entirely outside their scope.
|
|
13
|
+
*
|
|
14
|
+
* ## Quick Start
|
|
15
|
+
*
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { AuditObserver, InMemoryAuditStore, builtinPolicies } from '@revealui/ai'
|
|
18
|
+
*
|
|
19
|
+
* // Human sets up the observer (agents never see this)
|
|
20
|
+
* const observer = new AuditObserver({
|
|
21
|
+
* store: new InMemoryAuditStore(),
|
|
22
|
+
* onAlert: (alert) => logger.warn('ALERT:', alert),
|
|
23
|
+
* onAgentHalted: (id, reason) => logger.warn(`Agent ${id} halted: ${reason}`),
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Add safety policies
|
|
27
|
+
* observer.addPolicy(builtinPolicies.toolCallRateLimit(100, 'admin'))
|
|
28
|
+
* observer.addPolicy(builtinPolicies.selfModificationBlock('admin'))
|
|
29
|
+
*
|
|
30
|
+
* // Create write-only emitter for an agent
|
|
31
|
+
* const emitter = observer.createEmitterForAgent('agent-1')
|
|
32
|
+
* // Pass `emitter` to the agent — it can only call emitter.emit()
|
|
33
|
+
*
|
|
34
|
+
* // Human can halt agents at any time
|
|
35
|
+
* observer.haltAgent('agent-1', 'admin', 'Suspicious behavior')
|
|
36
|
+
* observer.haltFleet('admin', 'Emergency stop')
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export { type AuditEmitHandler, type AuditEmitter, createAuditEmitter, } from './emitter.js';
|
|
40
|
+
export { AuditObserver, type AuditObserverConfig, } from './observer.js';
|
|
41
|
+
export { AuditPolicyEngine, builtinPolicies, } from './policy.js';
|
|
42
|
+
export { type AuditStore, InMemoryAuditStore, } from './store.js';
|
|
43
|
+
export { type AuditAgentStatus, type AuditAlert, type AuditEntry, AuditEntrySchema, AuditEventType, type AuditFilter, type AuditPolicy, AuditSeverity, PolicyAction, } from './types.js';
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,KAAK,UAAU,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,gBAAgB,EAChB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Trail System
|
|
3
|
+
*
|
|
4
|
+
* Provides an immutable, append-only audit trail for all agent activity.
|
|
5
|
+
* Designed with strict separation of concerns:
|
|
6
|
+
*
|
|
7
|
+
* - **Agents** receive a write-only `AuditEmitter` (can emit events, nothing else)
|
|
8
|
+
* - **Humans** control the `AuditObserver` (query, policies, kill switches)
|
|
9
|
+
* - **Store** is append-only (no updates, no deletes)
|
|
10
|
+
*
|
|
11
|
+
* This architecture ensures that AI agents cannot tamper with, disable,
|
|
12
|
+
* or circumvent the audit trail — it lives entirely outside their scope.
|
|
13
|
+
*
|
|
14
|
+
* ## Quick Start
|
|
15
|
+
*
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { AuditObserver, InMemoryAuditStore, builtinPolicies } from '@revealui/ai'
|
|
18
|
+
*
|
|
19
|
+
* // Human sets up the observer (agents never see this)
|
|
20
|
+
* const observer = new AuditObserver({
|
|
21
|
+
* store: new InMemoryAuditStore(),
|
|
22
|
+
* onAlert: (alert) => logger.warn('ALERT:', alert),
|
|
23
|
+
* onAgentHalted: (id, reason) => logger.warn(`Agent ${id} halted: ${reason}`),
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Add safety policies
|
|
27
|
+
* observer.addPolicy(builtinPolicies.toolCallRateLimit(100, 'admin'))
|
|
28
|
+
* observer.addPolicy(builtinPolicies.selfModificationBlock('admin'))
|
|
29
|
+
*
|
|
30
|
+
* // Create write-only emitter for an agent
|
|
31
|
+
* const emitter = observer.createEmitterForAgent('agent-1')
|
|
32
|
+
* // Pass `emitter` to the agent — it can only call emitter.emit()
|
|
33
|
+
*
|
|
34
|
+
* // Human can halt agents at any time
|
|
35
|
+
* observer.haltAgent('agent-1', 'admin', 'Suspicious behavior')
|
|
36
|
+
* observer.haltFleet('admin', 'Emergency stop')
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
// Emitter (write-only agent interface)
|
|
40
|
+
export { createAuditEmitter, } from './emitter.js';
|
|
41
|
+
// Observer (human-facing control plane)
|
|
42
|
+
export { AuditObserver, } from './observer.js';
|
|
43
|
+
// Policy engine
|
|
44
|
+
export { AuditPolicyEngine, builtinPolicies, } from './policy.js';
|
|
45
|
+
// Store (append-only persistence)
|
|
46
|
+
export { InMemoryAuditStore, } from './store.js';
|
|
47
|
+
// Types
|
|
48
|
+
export { AuditEntrySchema, AuditEventType, AuditSeverity, PolicyAction, } from './types.js';
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Observer
|
|
3
|
+
*
|
|
4
|
+
* The central human-facing audit system. This is the ONLY component
|
|
5
|
+
* that has full read/write access to the audit trail. Agents never
|
|
6
|
+
* receive a reference to this object.
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities:
|
|
9
|
+
* - Receives events from agent emitters
|
|
10
|
+
* - Stores entries in the append-only store
|
|
11
|
+
* - Evaluates policies and generates alerts
|
|
12
|
+
* - Tracks agent halt status
|
|
13
|
+
* - Provides query interface for human review
|
|
14
|
+
*/
|
|
15
|
+
import { type AuditEmitter } from './emitter.js';
|
|
16
|
+
import type { AuditStore } from './store.js';
|
|
17
|
+
import type { AuditAgentStatus, AuditAlert, AuditEntry, AuditFilter, AuditPolicy } from './types.js';
|
|
18
|
+
export interface AuditObserverConfig {
|
|
19
|
+
/** Audit store backend */
|
|
20
|
+
store: AuditStore;
|
|
21
|
+
/** Number of recent entries to keep in memory for policy evaluation */
|
|
22
|
+
recentHistorySize?: number;
|
|
23
|
+
/** Callback when an alert is generated */
|
|
24
|
+
onAlert?: (alert: AuditAlert) => void;
|
|
25
|
+
/** Callback when an agent is halted */
|
|
26
|
+
onAgentHalted?: (agentId: string, reason: string) => void;
|
|
27
|
+
/** Callback when the entire fleet is halted */
|
|
28
|
+
onFleetHalted?: (reason: string) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare class AuditObserver {
|
|
31
|
+
private store;
|
|
32
|
+
private policyEngine;
|
|
33
|
+
private recentHistory;
|
|
34
|
+
private recentHistorySize;
|
|
35
|
+
private agentStatus;
|
|
36
|
+
private fleetHalted;
|
|
37
|
+
private onAlert?;
|
|
38
|
+
private onAgentHalted?;
|
|
39
|
+
private onFleetHalted?;
|
|
40
|
+
constructor(config: AuditObserverConfig);
|
|
41
|
+
/**
|
|
42
|
+
* Create a write-only AuditEmitter for an agent.
|
|
43
|
+
* This is the only audit API agents should ever receive.
|
|
44
|
+
*/
|
|
45
|
+
createEmitterForAgent(agentId: string): AuditEmitter;
|
|
46
|
+
private handleEvent;
|
|
47
|
+
/**
|
|
48
|
+
* Halt a specific agent. Only humans should call this.
|
|
49
|
+
*/
|
|
50
|
+
haltAgent(agentId: string, haltedBy: string, reason: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Resume a halted agent. Only humans should call this.
|
|
53
|
+
*/
|
|
54
|
+
resumeAgent(agentId: string, resumedBy: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Halt the entire agent fleet. Emergency stop.
|
|
57
|
+
*/
|
|
58
|
+
haltFleet(haltedBy: string, reason: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Resume the entire fleet. Only humans should call this.
|
|
61
|
+
*/
|
|
62
|
+
resumeFleet(resumedBy: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Check if an agent is halted
|
|
65
|
+
*/
|
|
66
|
+
isAgentHalted(agentId: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Check if the entire fleet is halted
|
|
69
|
+
*/
|
|
70
|
+
isFleetHalted(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Add a human-defined policy
|
|
73
|
+
*/
|
|
74
|
+
addPolicy(policy: AuditPolicy): void;
|
|
75
|
+
/**
|
|
76
|
+
* Remove a policy
|
|
77
|
+
*/
|
|
78
|
+
removePolicy(policyId: string, removedBy: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* Get all active policies
|
|
81
|
+
*/
|
|
82
|
+
getPolicies(): AuditPolicy[];
|
|
83
|
+
/**
|
|
84
|
+
* Query audit entries
|
|
85
|
+
*/
|
|
86
|
+
query(filter: AuditFilter): Promise<AuditEntry[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Get all alerts
|
|
89
|
+
*/
|
|
90
|
+
getAlerts(unacknowledgedOnly?: boolean): AuditAlert[];
|
|
91
|
+
/**
|
|
92
|
+
* Acknowledge an alert
|
|
93
|
+
*/
|
|
94
|
+
acknowledgeAlert(alertId: string, acknowledgedBy: string): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Get status of all tracked agents
|
|
97
|
+
*/
|
|
98
|
+
getAgentStatuses(): AuditAgentStatus[];
|
|
99
|
+
/**
|
|
100
|
+
* Get status of a specific agent
|
|
101
|
+
*/
|
|
102
|
+
getAgentStatus(agentId: string): AuditAgentStatus | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Get total entry count
|
|
105
|
+
*/
|
|
106
|
+
getTotalEntries(): Promise<number>;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../src/audit/observer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAyB,KAAK,YAAY,EAAsB,MAAM,cAAc,CAAA;AAE3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EAEV,WAAW,EACX,WAAW,EAEZ,MAAM,YAAY,CAAA;AAInB,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,KAAK,EAAE,UAAU,CAAA;IACjB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,uCAAuC;IACvC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACzD,+CAA+C;IAC/C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAC,CAA6B;IAC7C,OAAO,CAAC,aAAa,CAAC,CAA2C;IACjE,OAAO,CAAC,aAAa,CAAC,CAA0B;gBAEpC,MAAM,EAAE,mBAAmB;IAWvC;;;OAGG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;YA6BtC,WAAW;IAqEzB;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA6BlE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAoBrD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAuBjD;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAoBpC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACH,aAAa,IAAI,OAAO;IAMxB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAepC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAcvD;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAM5B;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIvD;;OAEG;IACH,SAAS,CAAC,kBAAkB,UAAQ,GAAG,UAAU,EAAE;IAInD;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO;IAkBlE;;OAEG;IACH,gBAAgB,IAAI,gBAAgB,EAAE;IAItC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI7D;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;CAGzC"}
|