agent-orcha 0.0.4 → 0.0.5
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/README.md +197 -221
- package/dist/lib/agents/agent-executor.d.ts +13 -4
- package/dist/lib/agents/agent-executor.d.ts.map +1 -1
- package/dist/lib/agents/agent-executor.js +307 -73
- package/dist/lib/agents/agent-executor.js.map +1 -1
- package/dist/lib/agents/agent-loader.d.ts +1 -1
- package/dist/lib/agents/agent-loader.d.ts.map +1 -1
- package/dist/lib/agents/agent-loader.js +10 -3
- package/dist/lib/agents/agent-loader.js.map +1 -1
- package/dist/lib/agents/index.d.ts +5 -5
- package/dist/lib/agents/index.js +4 -4
- package/dist/lib/agents/react-loop.d.ts +30 -0
- package/dist/lib/agents/react-loop.d.ts.map +1 -0
- package/dist/lib/agents/react-loop.js +155 -0
- package/dist/lib/agents/react-loop.js.map +1 -0
- package/dist/lib/agents/structured-output-wrapper.d.ts +3 -3
- package/dist/lib/agents/structured-output-wrapper.d.ts.map +1 -1
- package/dist/lib/agents/structured-output-wrapper.js +2 -2
- package/dist/lib/agents/structured-output-wrapper.js.map +1 -1
- package/dist/lib/agents/types.d.ts +132 -8
- package/dist/lib/agents/types.d.ts.map +1 -1
- package/dist/lib/agents/types.js +16 -2
- package/dist/lib/agents/types.js.map +1 -1
- package/dist/lib/functions/function-loader.d.ts +1 -1
- package/dist/lib/functions/function-loader.js +13 -5
- package/dist/lib/functions/function-loader.js.map +1 -1
- package/dist/lib/functions/index.d.ts +2 -2
- package/dist/lib/functions/index.js +1 -1
- package/dist/lib/functions/simple-function-wrapper.d.ts +2 -11
- package/dist/lib/functions/simple-function-wrapper.d.ts.map +1 -1
- package/dist/lib/functions/simple-function-wrapper.js +3 -3
- package/dist/lib/functions/simple-function-wrapper.js.map +1 -1
- package/dist/lib/index.d.ts +29 -17
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +21 -9
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/integrations/collabnook.d.ts +56 -0
- package/dist/lib/integrations/collabnook.d.ts.map +1 -0
- package/dist/lib/integrations/collabnook.js +307 -0
- package/dist/lib/integrations/collabnook.js.map +1 -0
- package/dist/lib/integrations/integration-manager.d.ts +14 -0
- package/dist/lib/integrations/integration-manager.d.ts.map +1 -0
- package/dist/lib/integrations/integration-manager.js +109 -0
- package/dist/lib/integrations/integration-manager.js.map +1 -0
- package/dist/lib/integrations/types.d.ts +49 -0
- package/dist/lib/integrations/types.d.ts.map +1 -0
- package/dist/lib/integrations/types.js +14 -0
- package/dist/lib/integrations/types.js.map +1 -0
- package/dist/lib/knowledge/direct-mapper.d.ts +21 -0
- package/dist/lib/knowledge/direct-mapper.d.ts.map +1 -0
- package/dist/lib/knowledge/direct-mapper.js +134 -0
- package/dist/lib/knowledge/direct-mapper.js.map +1 -0
- package/dist/lib/knowledge/index.d.ts +9 -8
- package/dist/lib/knowledge/index.d.ts.map +1 -1
- package/dist/lib/knowledge/index.js +9 -7
- package/dist/lib/knowledge/index.js.map +1 -1
- package/dist/lib/knowledge/knowledge-store-metadata.d.ts +40 -0
- package/dist/lib/knowledge/knowledge-store-metadata.d.ts.map +1 -0
- package/dist/lib/knowledge/knowledge-store-metadata.js +93 -0
- package/dist/lib/knowledge/knowledge-store-metadata.js.map +1 -0
- package/dist/lib/knowledge/knowledge-store.d.ts +43 -0
- package/dist/lib/knowledge/knowledge-store.d.ts.map +1 -0
- package/dist/lib/knowledge/knowledge-store.js +603 -0
- package/dist/lib/knowledge/knowledge-store.js.map +1 -0
- package/dist/lib/knowledge/loaders/database-loader.d.ts +5 -5
- package/dist/lib/knowledge/loaders/database-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/database-loader.js +21 -10
- package/dist/lib/knowledge/loaders/database-loader.js.map +1 -1
- package/dist/lib/knowledge/loaders/file-loaders.d.ts +39 -0
- package/dist/lib/knowledge/loaders/file-loaders.d.ts.map +1 -0
- package/dist/lib/knowledge/loaders/file-loaders.js +131 -0
- package/dist/lib/knowledge/loaders/file-loaders.js.map +1 -0
- package/dist/lib/knowledge/loaders/index.d.ts +3 -3
- package/dist/lib/knowledge/loaders/index.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/index.js +3 -3
- package/dist/lib/knowledge/loaders/index.js.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.d.ts +2 -2
- package/dist/lib/knowledge/loaders/web-loader.d.ts.map +1 -1
- package/dist/lib/knowledge/loaders/web-loader.js +22 -21
- package/dist/lib/knowledge/loaders/web-loader.js.map +1 -1
- package/dist/lib/knowledge/sqlite-store.d.ts +107 -0
- package/dist/lib/knowledge/sqlite-store.d.ts.map +1 -0
- package/dist/lib/knowledge/sqlite-store.js +327 -0
- package/dist/lib/knowledge/sqlite-store.js.map +1 -0
- package/dist/lib/knowledge/types.d.ts +72 -1432
- package/dist/lib/knowledge/types.d.ts.map +1 -1
- package/dist/lib/knowledge/types.js +36 -57
- package/dist/lib/knowledge/types.js.map +1 -1
- package/dist/lib/knowledge/utils/connection-pool.d.ts +3 -2
- package/dist/lib/knowledge/utils/connection-pool.d.ts.map +1 -1
- package/dist/lib/knowledge/utils/connection-pool.js +20 -10
- package/dist/lib/knowledge/utils/connection-pool.js.map +1 -1
- package/dist/lib/knowledge/utils/index.d.ts +2 -2
- package/dist/lib/knowledge/utils/index.js +2 -2
- package/dist/lib/llm/index.d.ts +5 -5
- package/dist/lib/llm/index.d.ts.map +1 -1
- package/dist/lib/llm/index.js +3 -3
- package/dist/lib/llm/index.js.map +1 -1
- package/dist/lib/llm/llm-call-logger.d.ts +37 -0
- package/dist/lib/llm/llm-call-logger.d.ts.map +1 -0
- package/dist/lib/llm/llm-call-logger.js +105 -0
- package/dist/lib/llm/llm-call-logger.js.map +1 -0
- package/dist/lib/llm/llm-config.d.ts +22 -16
- package/dist/lib/llm/llm-config.d.ts.map +1 -1
- package/dist/lib/llm/llm-config.js +19 -3
- package/dist/lib/llm/llm-config.js.map +1 -1
- package/dist/lib/llm/llm-factory.d.ts +3 -16
- package/dist/lib/llm/llm-factory.d.ts.map +1 -1
- package/dist/lib/llm/llm-factory.js +30 -48
- package/dist/lib/llm/llm-factory.js.map +1 -1
- package/dist/lib/llm/provider-detector.d.ts +1 -1
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts +27 -0
- package/dist/lib/llm/providers/anthropic-chat-model.d.ts.map +1 -0
- package/dist/lib/llm/providers/anthropic-chat-model.js +186 -0
- package/dist/lib/llm/providers/anthropic-chat-model.js.map +1 -0
- package/dist/lib/llm/providers/gemini-chat-model.d.ts +29 -0
- package/dist/lib/llm/providers/gemini-chat-model.d.ts.map +1 -0
- package/dist/lib/llm/providers/gemini-chat-model.js +241 -0
- package/dist/lib/llm/providers/gemini-chat-model.js.map +1 -0
- package/dist/lib/llm/providers/gemini-embeddings.d.ts +14 -0
- package/dist/lib/llm/providers/gemini-embeddings.d.ts.map +1 -0
- package/dist/lib/llm/providers/gemini-embeddings.js +20 -0
- package/dist/lib/llm/providers/gemini-embeddings.js.map +1 -0
- package/dist/lib/llm/providers/openai-chat-model.d.ts +30 -0
- package/dist/lib/llm/providers/openai-chat-model.d.ts.map +1 -0
- package/dist/lib/llm/providers/openai-chat-model.js +196 -0
- package/dist/lib/llm/providers/openai-chat-model.js.map +1 -0
- package/dist/lib/llm/providers/openai-embeddings.d.ts +17 -0
- package/dist/lib/llm/providers/openai-embeddings.d.ts.map +1 -0
- package/dist/lib/llm/providers/openai-embeddings.js +35 -0
- package/dist/lib/llm/providers/openai-embeddings.js.map +1 -0
- package/dist/lib/llm/types.d.ts +2 -2
- package/dist/lib/llm/types.js +1 -1
- package/dist/lib/logger.d.ts +7 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +43 -4
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/mcp/index.d.ts +3 -3
- package/dist/lib/mcp/index.js +2 -2
- package/dist/lib/mcp/mcp-client.d.ts +3 -2
- package/dist/lib/mcp/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp/mcp-client.js +5 -2
- package/dist/lib/mcp/mcp-client.js.map +1 -1
- package/dist/lib/mcp/types.d.ts +33 -23
- package/dist/lib/mcp/types.d.ts.map +1 -1
- package/dist/lib/mcp/types.js +11 -2
- package/dist/lib/mcp/types.js.map +1 -1
- package/dist/lib/memory/conversation-store.d.ts +2 -2
- package/dist/lib/memory/conversation-store.d.ts.map +1 -1
- package/dist/lib/memory/conversation-store.js +1 -1
- package/dist/lib/memory/index.d.ts +3 -2
- package/dist/lib/memory/index.d.ts.map +1 -1
- package/dist/lib/memory/index.js +3 -2
- package/dist/lib/memory/index.js.map +1 -1
- package/dist/lib/memory/memory-manager.d.ts +9 -0
- package/dist/lib/memory/memory-manager.d.ts.map +1 -0
- package/dist/lib/memory/memory-manager.js +34 -0
- package/dist/lib/memory/memory-manager.js.map +1 -0
- package/dist/lib/memory/types.d.ts +1 -1
- package/dist/lib/memory/types.d.ts.map +1 -1
- package/dist/lib/orchestrator.d.ts +78 -18
- package/dist/lib/orchestrator.d.ts.map +1 -1
- package/dist/lib/orchestrator.js +247 -55
- package/dist/lib/orchestrator.js.map +1 -1
- package/dist/lib/sandbox/html-to-markdown.d.ts +2 -0
- package/dist/lib/sandbox/html-to-markdown.d.ts.map +1 -0
- package/dist/lib/sandbox/html-to-markdown.js +64 -0
- package/dist/lib/sandbox/html-to-markdown.js.map +1 -0
- package/dist/lib/sandbox/index.d.ts +7 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -0
- package/dist/lib/sandbox/index.js +6 -0
- package/dist/lib/sandbox/index.js.map +1 -0
- package/dist/lib/sandbox/sandbox-exec.d.ts +5 -0
- package/dist/lib/sandbox/sandbox-exec.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-exec.js +35 -0
- package/dist/lib/sandbox/sandbox-exec.js.map +1 -0
- package/dist/lib/sandbox/sandbox-web.d.ts +5 -0
- package/dist/lib/sandbox/sandbox-web.d.ts.map +1 -0
- package/dist/lib/sandbox/sandbox-web.js +211 -0
- package/dist/lib/sandbox/sandbox-web.js.map +1 -0
- package/dist/lib/sandbox/types.d.ts +21 -0
- package/dist/lib/sandbox/types.d.ts.map +1 -0
- package/dist/lib/sandbox/types.js +7 -0
- package/dist/lib/sandbox/types.js.map +1 -0
- package/dist/lib/sandbox/vm-executor.d.ts +12 -0
- package/dist/lib/sandbox/vm-executor.d.ts.map +1 -0
- package/dist/lib/sandbox/vm-executor.js +101 -0
- package/dist/lib/sandbox/vm-executor.js.map +1 -0
- package/dist/lib/skills/index.d.ts +4 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +3 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/skill-loader.d.ts +19 -0
- package/dist/lib/skills/skill-loader.d.ts.map +1 -0
- package/dist/lib/skills/skill-loader.js +105 -0
- package/dist/lib/skills/skill-loader.js.map +1 -0
- package/dist/lib/skills/types.d.ts +17 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +6 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/tasks/index.d.ts +4 -0
- package/dist/lib/tasks/index.d.ts.map +1 -0
- package/dist/lib/tasks/index.js +4 -0
- package/dist/lib/tasks/index.js.map +1 -0
- package/dist/lib/tasks/task-manager.d.ts +25 -0
- package/dist/lib/tasks/task-manager.d.ts.map +1 -0
- package/dist/lib/tasks/task-manager.js +189 -0
- package/dist/lib/tasks/task-manager.js.map +1 -0
- package/dist/lib/tasks/task-store.d.ts +20 -0
- package/dist/lib/tasks/task-store.d.ts.map +1 -0
- package/dist/lib/tasks/task-store.js +102 -0
- package/dist/lib/tasks/task-store.js.map +1 -0
- package/dist/lib/tasks/types.d.ts +38 -0
- package/dist/lib/tasks/types.d.ts.map +1 -0
- package/dist/lib/tasks/types.js +2 -0
- package/dist/lib/tasks/types.js.map +1 -0
- package/dist/lib/templates/resource-templates.d.ts +6 -0
- package/dist/lib/templates/resource-templates.d.ts.map +1 -0
- package/dist/lib/templates/resource-templates.js +146 -0
- package/dist/lib/templates/resource-templates.js.map +1 -0
- package/dist/lib/tools/agent-tool-wrapper.d.ts +5 -5
- package/dist/lib/tools/agent-tool-wrapper.js +3 -3
- package/dist/lib/tools/agent-tool-wrapper.js.map +1 -1
- package/dist/lib/tools/built-in/ask-user.tool.d.ts +1 -1
- package/dist/lib/tools/built-in/ask-user.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/ask-user.tool.js +2 -2
- package/dist/lib/tools/built-in/ask-user.tool.js.map +1 -1
- package/dist/lib/tools/built-in/index.d.ts +9 -2
- package/dist/lib/tools/built-in/index.d.ts.map +1 -1
- package/dist/lib/tools/built-in/index.js +9 -2
- package/dist/lib/tools/built-in/index.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts +9 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js +102 -0
- package/dist/lib/tools/built-in/knowledge-entity-lookup.tool.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts +9 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js +96 -0
- package/dist/lib/tools/built-in/knowledge-graph-schema.tool.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-search.tool.d.ts +2 -2
- package/dist/lib/tools/built-in/knowledge-search.tool.d.ts.map +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js +1 -1
- package/dist/lib/tools/built-in/knowledge-search.tool.js.map +1 -1
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts +7 -0
- package/dist/lib/tools/built-in/knowledge-sql.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-sql.tool.js +127 -0
- package/dist/lib/tools/built-in/knowledge-sql.tool.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts +17 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.js +54 -0
- package/dist/lib/tools/built-in/knowledge-tools-factory.js.map +1 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts +9 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js +91 -0
- package/dist/lib/tools/built-in/knowledge-traverse.tool.js.map +1 -0
- package/dist/lib/tools/built-in/memory-save.tool.d.ts +4 -0
- package/dist/lib/tools/built-in/memory-save.tool.d.ts.map +1 -0
- package/dist/lib/tools/built-in/memory-save.tool.js +21 -0
- package/dist/lib/tools/built-in/memory-save.tool.js.map +1 -0
- package/dist/lib/tools/built-in/query-validators.d.ts +18 -0
- package/dist/lib/tools/built-in/query-validators.d.ts.map +1 -0
- package/dist/lib/tools/built-in/query-validators.js +87 -0
- package/dist/lib/tools/built-in/query-validators.js.map +1 -0
- package/dist/lib/tools/index.d.ts +4 -4
- package/dist/lib/tools/index.js +4 -4
- package/dist/lib/tools/tool-discovery.d.ts +11 -33
- package/dist/lib/tools/tool-discovery.d.ts.map +1 -1
- package/dist/lib/tools/tool-discovery.js +16 -43
- package/dist/lib/tools/tool-discovery.js.map +1 -1
- package/dist/lib/tools/tool-registry.d.ts +10 -18
- package/dist/lib/tools/tool-registry.d.ts.map +1 -1
- package/dist/lib/tools/tool-registry.js +37 -23
- package/dist/lib/tools/tool-registry.js.map +1 -1
- package/dist/lib/tools/workspace/workspace-tools.d.ts +60 -0
- package/dist/lib/tools/workspace/workspace-tools.d.ts.map +1 -0
- package/dist/lib/tools/workspace/workspace-tools.js +140 -0
- package/dist/lib/tools/workspace/workspace-tools.js.map +1 -0
- package/dist/lib/triggers/cron-trigger.d.ts +12 -0
- package/dist/lib/triggers/cron-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/cron-trigger.js +45 -0
- package/dist/lib/triggers/cron-trigger.js.map +1 -0
- package/dist/lib/triggers/index.d.ts +6 -0
- package/dist/lib/triggers/index.d.ts.map +1 -0
- package/dist/lib/triggers/index.js +5 -0
- package/dist/lib/triggers/index.js.map +1 -0
- package/dist/lib/triggers/trigger-manager.d.ts +11 -0
- package/dist/lib/triggers/trigger-manager.d.ts.map +1 -0
- package/dist/lib/triggers/trigger-manager.js +51 -0
- package/dist/lib/triggers/trigger-manager.js.map +1 -0
- package/dist/lib/triggers/types.d.ts +57 -0
- package/dist/lib/triggers/types.d.ts.map +1 -0
- package/dist/lib/triggers/types.js +16 -0
- package/dist/lib/triggers/types.js.map +1 -0
- package/dist/lib/triggers/webhook-trigger.d.ts +12 -0
- package/dist/lib/triggers/webhook-trigger.d.ts.map +1 -0
- package/dist/lib/triggers/webhook-trigger.js +34 -0
- package/dist/lib/triggers/webhook-trigger.js.map +1 -0
- package/dist/lib/types/llm-types.d.ts +54 -0
- package/dist/lib/types/llm-types.d.ts.map +1 -0
- package/dist/lib/types/llm-types.js +22 -0
- package/dist/lib/types/llm-types.js.map +1 -0
- package/dist/lib/types/text-splitters.d.ts +27 -0
- package/dist/lib/types/text-splitters.d.ts.map +1 -0
- package/dist/lib/types/text-splitters.js +114 -0
- package/dist/lib/types/text-splitters.js.map +1 -0
- package/dist/lib/types/tool-factory.d.ts +9 -0
- package/dist/lib/types/tool-factory.d.ts.map +1 -0
- package/dist/lib/types/tool-factory.js +12 -0
- package/dist/lib/types/tool-factory.js.map +1 -0
- package/dist/lib/utils/file-utils.d.ts +11 -0
- package/dist/lib/utils/file-utils.d.ts.map +1 -0
- package/dist/lib/utils/file-utils.js +86 -0
- package/dist/lib/utils/file-utils.js.map +1 -0
- package/dist/lib/workflows/index.d.ts +6 -6
- package/dist/lib/workflows/index.d.ts.map +1 -1
- package/dist/lib/workflows/index.js +5 -5
- package/dist/lib/workflows/index.js.map +1 -1
- package/dist/lib/workflows/interrupt-manager.d.ts +1 -1
- package/dist/lib/workflows/interrupt-manager.js +1 -1
- package/dist/lib/workflows/react-workflow-executor.d.ts +26 -0
- package/dist/lib/workflows/react-workflow-executor.d.ts.map +1 -0
- package/dist/lib/workflows/react-workflow-executor.js +333 -0
- package/dist/lib/workflows/react-workflow-executor.js.map +1 -0
- package/dist/lib/workflows/types.d.ts +96 -97
- package/dist/lib/workflows/types.d.ts.map +1 -1
- package/dist/lib/workflows/types.js +5 -5
- package/dist/lib/workflows/types.js.map +1 -1
- package/dist/lib/workflows/workflow-executor.d.ts +3 -3
- package/dist/lib/workflows/workflow-executor.js +2 -2
- package/dist/lib/workflows/workflow-executor.js.map +1 -1
- package/dist/lib/workflows/workflow-loader.d.ts +1 -1
- package/dist/lib/workflows/workflow-loader.d.ts.map +1 -1
- package/dist/lib/workflows/workflow-loader.js +10 -3
- package/dist/lib/workflows/workflow-loader.js.map +1 -1
- package/dist/public/index.html +32 -0
- package/dist/public/src/components/AgentsView.js +298 -44
- package/dist/public/src/components/AppRoot.js +124 -4
- package/dist/public/src/components/GraphView.js +336 -0
- package/dist/public/src/components/IdeView.js +462 -7
- package/dist/public/src/components/KnowledgeView.js +443 -66
- package/dist/public/src/components/MonitorView.js +388 -0
- package/dist/public/src/components/NavBar.js +3 -0
- package/dist/public/src/components/SkillsView.js +137 -0
- package/dist/public/src/components/WorkflowsView.js +287 -114
- package/dist/public/src/services/ApiService.js +165 -25
- package/dist/public/src/store.js +3 -2
- package/dist/public/src/utils/markdown.js +1 -0
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/start.d.ts +0 -1
- package/dist/src/cli/commands/start.d.ts.map +1 -1
- package/dist/src/cli/commands/start.js +23 -14
- package/dist/src/cli/commands/start.js.map +1 -1
- package/dist/src/cli/index.js +3 -3
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +23 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +3 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +107 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/routes/agents.route.d.ts.map +1 -1
- package/dist/src/routes/agents.route.js +31 -2
- package/dist/src/routes/agents.route.js.map +1 -1
- package/dist/src/routes/files.route.d.ts.map +1 -1
- package/dist/src/routes/files.route.js +128 -87
- package/dist/src/routes/files.route.js.map +1 -1
- package/dist/src/routes/functions.route.js +1 -1
- package/dist/src/routes/graph.route.d.ts +3 -0
- package/dist/src/routes/graph.route.d.ts.map +1 -0
- package/dist/src/routes/graph.route.js +173 -0
- package/dist/src/routes/graph.route.js.map +1 -0
- package/dist/src/routes/knowledge.route.d.ts.map +1 -1
- package/dist/src/routes/knowledge.route.js +172 -69
- package/dist/src/routes/knowledge.route.js.map +1 -1
- package/dist/src/routes/llm.route.d.ts.map +1 -1
- package/dist/src/routes/llm.route.js +48 -7
- package/dist/src/routes/llm.route.js.map +1 -1
- package/dist/src/routes/mcp.route.js +1 -1
- package/dist/src/routes/skills.route.d.ts +3 -0
- package/dist/src/routes/skills.route.d.ts.map +1 -0
- package/dist/src/routes/skills.route.js +23 -0
- package/dist/src/routes/skills.route.js.map +1 -0
- package/dist/src/routes/tasks.route.d.ts +3 -0
- package/dist/src/routes/tasks.route.d.ts.map +1 -0
- package/dist/src/routes/tasks.route.js +135 -0
- package/dist/src/routes/tasks.route.js.map +1 -0
- package/dist/src/routes/workflows.route.d.ts.map +1 -1
- package/dist/src/routes/workflows.route.js +9 -1
- package/dist/src/routes/workflows.route.js.map +1 -1
- package/dist/src/server.d.ts +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +21 -8
- package/dist/src/server.js.map +1 -1
- package/dist/templates/.env.example +4 -19
- package/dist/templates/README.md +18 -10
- package/dist/templates/agents/architect.agent.yaml +49 -0
- package/dist/templates/agents/chatbot.agent.yaml +58 -0
- package/dist/templates/agents/knowledge-broker.agent.yaml +39 -0
- package/dist/templates/agents/sandbox.agent.yaml +56 -0
- package/dist/templates/knowledge/example.knowledge.yaml +0 -3
- package/dist/templates/knowledge/org-chart/personnel.csv +21 -0
- package/dist/templates/knowledge/org-chart.knowledge.yaml +49 -0
- package/dist/templates/knowledge/pet-store/pet-store.db +0 -0
- package/dist/templates/knowledge/pet-store.knowledge.yaml +78 -0
- package/dist/templates/knowledge/web-docs.knowledge.yaml +20 -0
- package/dist/templates/llm.json +2 -2
- package/dist/templates/mcp.json +3 -0
- package/dist/templates/skills/orcha-builder/SKILL.md +339 -0
- package/dist/templates/skills/sandbox/SKILL.md +63 -0
- package/dist/templates/workflows/example.workflow.yaml +25 -30
- package/dist/templates/workflows/react-example.workflow.yaml +53 -0
- package/package.json +17 -20
- package/dist/lib/knowledge/graph-rag/community-detector.d.ts +0 -16
- package/dist/lib/knowledge/graph-rag/community-detector.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/community-detector.js +0 -81
- package/dist/lib/knowledge/graph-rag/community-detector.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts +0 -17
- package/dist/lib/knowledge/graph-rag/community-summarizer.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/community-summarizer.js +0 -87
- package/dist/lib/knowledge/graph-rag/community-summarizer.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts +0 -36
- package/dist/lib/knowledge/graph-rag/entity-extractor.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/entity-extractor.js +0 -192
- package/dist/lib/knowledge/graph-rag/entity-extractor.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts +0 -30
- package/dist/lib/knowledge/graph-rag/extraction-cache.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/extraction-cache.js +0 -88
- package/dist/lib/knowledge/graph-rag/extraction-cache.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/global-search.d.ts +0 -19
- package/dist/lib/knowledge/graph-rag/global-search.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/global-search.js +0 -96
- package/dist/lib/knowledge/graph-rag/global-search.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts +0 -24
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.js +0 -239
- package/dist/lib/knowledge/graph-rag/graph-rag-factory.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/index.d.ts +0 -14
- package/dist/lib/knowledge/graph-rag/index.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/index.js +0 -12
- package/dist/lib/knowledge/graph-rag/index.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/local-search.d.ts +0 -20
- package/dist/lib/knowledge/graph-rag/local-search.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/local-search.js +0 -110
- package/dist/lib/knowledge/graph-rag/local-search.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts +0 -31
- package/dist/lib/knowledge/graph-rag/memory-graph-store.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/memory-graph-store.js +0 -165
- package/dist/lib/knowledge/graph-rag/memory-graph-store.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts +0 -38
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js +0 -190
- package/dist/lib/knowledge/graph-rag/neo4j-graph-store.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts +0 -11
- package/dist/lib/knowledge/graph-rag/search-mode-detector.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/search-mode-detector.js +0 -50
- package/dist/lib/knowledge/graph-rag/search-mode-detector.js.map +0 -1
- package/dist/lib/knowledge/graph-rag/types.d.ts +0 -368
- package/dist/lib/knowledge/graph-rag/types.d.ts.map +0 -1
- package/dist/lib/knowledge/graph-rag/types.js +0 -48
- package/dist/lib/knowledge/graph-rag/types.js.map +0 -1
- package/dist/lib/knowledge/knowledge-store-factory.d.ts +0 -16
- package/dist/lib/knowledge/knowledge-store-factory.d.ts.map +0 -1
- package/dist/lib/knowledge/knowledge-store-factory.js +0 -376
- package/dist/lib/knowledge/knowledge-store-factory.js.map +0 -1
- package/dist/lib/knowledge/knowledge-store-manager.d.ts +0 -18
- package/dist/lib/knowledge/knowledge-store-manager.d.ts.map +0 -1
- package/dist/lib/knowledge/knowledge-store-manager.js +0 -98
- package/dist/lib/knowledge/knowledge-store-manager.js.map +0 -1
- package/dist/lib/knowledge/loaders/s3-loader.d.ts +0 -17
- package/dist/lib/knowledge/loaders/s3-loader.d.ts.map +0 -1
- package/dist/lib/knowledge/loaders/s3-loader.js +0 -185
- package/dist/lib/knowledge/loaders/s3-loader.js.map +0 -1
- package/dist/lib/workflows/langgraph-executor.d.ts +0 -51
- package/dist/lib/workflows/langgraph-executor.d.ts.map +0 -1
- package/dist/lib/workflows/langgraph-executor.js +0 -297
- package/dist/lib/workflows/langgraph-executor.js.map +0 -1
- package/dist/templates/agents/call-center-analyst-simple.agent.yaml +0 -36
- package/dist/templates/agents/math.agent.yaml +0 -28
- package/dist/templates/agents/sentiment-structured.agent.yaml +0 -42
- package/dist/templates/llm.md +0 -1195
- package/dist/templates/workflows/langgraph-example.workflow.yaml +0 -84
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SqliteStore } from './sqlite-store.ts';
|
|
2
|
+
import { KnowledgeMetadataManager } from './knowledge-store-metadata.ts';
|
|
3
|
+
import type { Document, Embeddings } from '../types/llm-types.ts';
|
|
4
|
+
import type { KnowledgeConfig, KnowledgeStoreInstance } from './types.ts';
|
|
5
|
+
import type { KnowledgeStoreMetadata, IndexingProgressCallback } from './knowledge-store-metadata.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Unified knowledge store. Replaces KnowledgeStoreManager + KnowledgeStoreFactory + GraphRagFactory.
|
|
8
|
+
* All stores use SQLite as persistence — no caching layers.
|
|
9
|
+
* If config.graph exists, entity extraction is enabled; otherwise chunks-only.
|
|
10
|
+
*/
|
|
11
|
+
export declare class KnowledgeStore {
|
|
12
|
+
private knowledgeDir;
|
|
13
|
+
private workspaceRoot;
|
|
14
|
+
private stores;
|
|
15
|
+
private configs;
|
|
16
|
+
private sqliteStores;
|
|
17
|
+
private metadataManager;
|
|
18
|
+
private activeIndexing;
|
|
19
|
+
constructor(knowledgeDir: string, workspaceRoot: string);
|
|
20
|
+
loadAll(): Promise<void>;
|
|
21
|
+
loadOne(filePath: string): Promise<KnowledgeConfig>;
|
|
22
|
+
private restoreIndexedStores;
|
|
23
|
+
initialize(name: string, onProgress?: IndexingProgressCallback): Promise<KnowledgeStoreInstance>;
|
|
24
|
+
private doInitialize;
|
|
25
|
+
private createInstance;
|
|
26
|
+
get(name: string): KnowledgeStoreInstance | undefined;
|
|
27
|
+
getConfig(name: string): KnowledgeConfig | undefined;
|
|
28
|
+
getSqliteStore(name: string): SqliteStore | undefined;
|
|
29
|
+
list(): KnowledgeStoreInstance[];
|
|
30
|
+
listConfigs(): KnowledgeConfig[];
|
|
31
|
+
getStatus(name: string): Promise<KnowledgeStoreMetadata | null>;
|
|
32
|
+
getAllStatuses(): Promise<Map<string, KnowledgeStoreMetadata>>;
|
|
33
|
+
getMetadataManager(): KnowledgeMetadataManager;
|
|
34
|
+
isIndexing(name: string): boolean;
|
|
35
|
+
refresh(name: string, onProgress?: IndexingProgressCallback): Promise<void>;
|
|
36
|
+
static createEmbeddings(configName: string): Embeddings;
|
|
37
|
+
private static wrapWithValidation;
|
|
38
|
+
static loadDocuments(config: KnowledgeConfig, workspaceRoot: string): Promise<Document[]>;
|
|
39
|
+
private static createLoader;
|
|
40
|
+
static splitDocuments(config: KnowledgeConfig, documents: Document[]): Promise<Document[]>;
|
|
41
|
+
static computeFileHashes(config: KnowledgeConfig, workspaceRoot: string): Promise<Record<string, string>>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=knowledge-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-store.d.ts","sourceRoot":"","sources":["../../../lib/knowledge/knowledge-store.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,wBAAwB,EAAyB,MAAM,+BAA+B,CAAC;AAQhG,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EAIvB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAKtG;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAkD;IAChE,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,cAAc,CAA2D;gBAErE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAUjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBxB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAiB3C,oBAAoB;IAkB5B,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,wBAAwB,GACpC,OAAO,CAAC,sBAAsB,CAAC;YA8BpB,YAAY;IAwK1B,OAAO,CAAC,cAAc;IAsGtB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS;IAIrD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIrD,IAAI,IAAI,sBAAsB,EAAE;IAIhC,WAAW,IAAI,eAAe,EAAE;IAI1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAI/D,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAKpE,kBAAkB,IAAI,wBAAwB;IAI9C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDjF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAkCvD,OAAO,CAAC,MAAM,CAAC,kBAAkB;WA2CpB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmC/F,OAAO,CAAC,MAAM,CAAC,YAAY;WAWd,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;WAcnF,iBAAiB,CAC5B,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAuBnC"}
|
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as crypto from 'crypto';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { glob } from 'glob';
|
|
5
|
+
import { parse as parseYaml } from 'yaml';
|
|
6
|
+
import { SqliteStore } from "./sqlite-store.js";
|
|
7
|
+
import { DirectMapper } from "./direct-mapper.js";
|
|
8
|
+
import { KnowledgeConfigSchema } from "./types.js";
|
|
9
|
+
import { KnowledgeMetadataManager, createDefaultMetadata } from "./knowledge-store-metadata.js";
|
|
10
|
+
import { CharacterTextSplitter, RecursiveCharacterTextSplitter } from "../types/text-splitters.js";
|
|
11
|
+
import { OpenAIEmbeddingsProvider } from "../llm/providers/openai-embeddings.js";
|
|
12
|
+
import { GeminiEmbeddingsProvider } from "../llm/providers/gemini-embeddings.js";
|
|
13
|
+
import { getEmbeddingConfig, resolveApiKey } from "../llm/llm-config.js";
|
|
14
|
+
import { detectProvider } from "../llm/provider-detector.js";
|
|
15
|
+
import { DatabaseLoader, WebLoader, TextLoader, JSONLoader, CSVLoader, PDFLoader } from "./loaders/index.js";
|
|
16
|
+
import { createLogger } from "../logger.js";
|
|
17
|
+
const logger = createLogger('KnowledgeStore');
|
|
18
|
+
const searchLogger = createLogger('KnowledgeSearch');
|
|
19
|
+
/**
|
|
20
|
+
* Unified knowledge store. Replaces KnowledgeStoreManager + KnowledgeStoreFactory + GraphRagFactory.
|
|
21
|
+
* All stores use SQLite as persistence — no caching layers.
|
|
22
|
+
* If config.graph exists, entity extraction is enabled; otherwise chunks-only.
|
|
23
|
+
*/
|
|
24
|
+
export class KnowledgeStore {
|
|
25
|
+
knowledgeDir;
|
|
26
|
+
workspaceRoot;
|
|
27
|
+
stores = new Map();
|
|
28
|
+
configs = new Map();
|
|
29
|
+
sqliteStores = new Map();
|
|
30
|
+
metadataManager;
|
|
31
|
+
activeIndexing = new Map();
|
|
32
|
+
constructor(knowledgeDir, workspaceRoot) {
|
|
33
|
+
this.knowledgeDir = knowledgeDir;
|
|
34
|
+
this.workspaceRoot = workspaceRoot;
|
|
35
|
+
this.metadataManager = new KnowledgeMetadataManager(path.join(workspaceRoot, '.knowledge-cache'));
|
|
36
|
+
}
|
|
37
|
+
// --- Config Loading ---
|
|
38
|
+
async loadAll() {
|
|
39
|
+
const files = await glob('**/*.knowledge.yaml', { cwd: this.knowledgeDir });
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const filePath = path.join(this.knowledgeDir, file);
|
|
42
|
+
try {
|
|
43
|
+
await this.loadOne(filePath);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
47
|
+
logger.warn(`Skipping invalid knowledge file "${file}": ${message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const names = Array.from(this.configs.keys());
|
|
51
|
+
await this.metadataManager.resetStaleIndexing(names);
|
|
52
|
+
await this.restoreIndexedStores();
|
|
53
|
+
}
|
|
54
|
+
async loadOne(filePath) {
|
|
55
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
56
|
+
const parsed = parseYaml(content);
|
|
57
|
+
const config = KnowledgeConfigSchema.parse(parsed);
|
|
58
|
+
// Resolve sqlite:// paths relative to workspaceRoot so they work regardless of cwd
|
|
59
|
+
if (config.source.type === 'database' && config.source.connectionString.startsWith('sqlite://')) {
|
|
60
|
+
const filePart = config.source.connectionString.replace(/^sqlite:\/\//, '');
|
|
61
|
+
if (!path.isAbsolute(filePart)) {
|
|
62
|
+
config.source.connectionString = `sqlite://${path.resolve(this.workspaceRoot, filePart)}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
this.configs.set(config.name, config);
|
|
66
|
+
return config;
|
|
67
|
+
}
|
|
68
|
+
async restoreIndexedStores() {
|
|
69
|
+
const statuses = await this.getAllStatuses();
|
|
70
|
+
for (const [name, metadata] of statuses) {
|
|
71
|
+
if (metadata.status !== 'indexed')
|
|
72
|
+
continue;
|
|
73
|
+
if (this.stores.has(name))
|
|
74
|
+
continue;
|
|
75
|
+
try {
|
|
76
|
+
logger.info(`Restoring "${name}" from SQLite...`);
|
|
77
|
+
await this.initialize(name);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger.warn(`Failed to restore "${name}": ${error instanceof Error ? error.message : String(error)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// --- Initialization ---
|
|
85
|
+
async initialize(name, onProgress) {
|
|
86
|
+
const existing = this.stores.get(name);
|
|
87
|
+
if (existing) {
|
|
88
|
+
logger.info(`"${name}" already initialized`);
|
|
89
|
+
return existing;
|
|
90
|
+
}
|
|
91
|
+
// Prevent concurrent indexing of the same store
|
|
92
|
+
const activePromise = this.activeIndexing.get(name);
|
|
93
|
+
if (activePromise) {
|
|
94
|
+
logger.info(`"${name}" is already being indexed, waiting...`);
|
|
95
|
+
return activePromise;
|
|
96
|
+
}
|
|
97
|
+
const config = this.configs.get(name);
|
|
98
|
+
if (!config) {
|
|
99
|
+
throw new Error(`Knowledge config not found: ${name}`);
|
|
100
|
+
}
|
|
101
|
+
const promise = this.doInitialize(name, config, onProgress);
|
|
102
|
+
this.activeIndexing.set(name, promise);
|
|
103
|
+
try {
|
|
104
|
+
const store = await promise;
|
|
105
|
+
return store;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.activeIndexing.delete(name);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async doInitialize(name, config, onProgress) {
|
|
112
|
+
const hasGraph = !!config.graph;
|
|
113
|
+
logger.info(`Initializing "${name}" (graph: ${hasGraph})...`);
|
|
114
|
+
if (config.source.type === 'directory' || config.source.type === 'file') {
|
|
115
|
+
logger.info(`Source: ${config.source.path}`);
|
|
116
|
+
}
|
|
117
|
+
else if (config.source.type === 'database') {
|
|
118
|
+
logger.info(`Source: database (${config.source.connectionString.split('@')[1] || 'unknown'})`);
|
|
119
|
+
}
|
|
120
|
+
else if (config.source.type === 'web') {
|
|
121
|
+
logger.info(`Source: web (${config.source.url})`);
|
|
122
|
+
}
|
|
123
|
+
const metadata = createDefaultMetadata(name, hasGraph ? 'graph-rag' : 'vector');
|
|
124
|
+
metadata.embeddingModel = config.embedding;
|
|
125
|
+
metadata.status = 'indexing';
|
|
126
|
+
await this.metadataManager.save(name, metadata);
|
|
127
|
+
onProgress?.({ name, phase: 'loading', progress: 0, message: 'Starting initialization...' });
|
|
128
|
+
const startTime = Date.now();
|
|
129
|
+
try {
|
|
130
|
+
// 1. Create embeddings and test to get dimensions
|
|
131
|
+
const embeddings = KnowledgeStore.createEmbeddings(config.embedding);
|
|
132
|
+
const testEmbedding = await embeddings.embedQuery('dimension test');
|
|
133
|
+
const dimensions = testEmbedding.length;
|
|
134
|
+
logger.info(`Embedding dimensions: ${dimensions}`);
|
|
135
|
+
// 2. Determine DB path and open SqliteStore
|
|
136
|
+
const dbPath = path.join(this.workspaceRoot, '.knowledge-data', `${name}.db`);
|
|
137
|
+
// Check dimension mismatch
|
|
138
|
+
if (!SqliteStore.validateDimensions(dbPath, dimensions)) {
|
|
139
|
+
logger.warn(`Dimension mismatch for "${name}", will re-index`);
|
|
140
|
+
// Delete old DB
|
|
141
|
+
try {
|
|
142
|
+
await fs.unlink(dbPath);
|
|
143
|
+
}
|
|
144
|
+
catch { /* may not exist */ }
|
|
145
|
+
}
|
|
146
|
+
const sqliteStore = new SqliteStore(dbPath, dimensions);
|
|
147
|
+
// 3. Check if DB already has valid data
|
|
148
|
+
const storedHashes = sqliteStore.getMeta('sourceHashes');
|
|
149
|
+
const currentHashes = await KnowledgeStore.computeFileHashes(config, this.workspaceRoot);
|
|
150
|
+
const currentHashStr = JSON.stringify(currentHashes);
|
|
151
|
+
const isUpToDate = sqliteStore.hasData() && storedHashes === currentHashStr;
|
|
152
|
+
if (isUpToDate) {
|
|
153
|
+
logger.info(`"${name}" restored from SQLite (${sqliteStore.getChunkCount()} chunks, ${sqliteStore.getEntityCount()} entities)`);
|
|
154
|
+
onProgress?.({ name, phase: 'done', progress: 100, message: 'Restored from SQLite' });
|
|
155
|
+
metadata.documentCount = sqliteStore.getChunkCount();
|
|
156
|
+
metadata.chunkCount = sqliteStore.getChunkCount();
|
|
157
|
+
metadata.entityCount = sqliteStore.getEntityCount();
|
|
158
|
+
metadata.edgeCount = sqliteStore.getRelationshipCount();
|
|
159
|
+
metadata.sourceHashes = currentHashes;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// Full indexing pipeline
|
|
163
|
+
sqliteStore.clear();
|
|
164
|
+
onProgress?.({ name, phase: 'loading', progress: 10, message: 'Loading documents...' });
|
|
165
|
+
const documents = await KnowledgeStore.loadDocuments(config, this.workspaceRoot);
|
|
166
|
+
logger.info(`Loaded ${documents.length} document(s)`);
|
|
167
|
+
metadata.documentCount = documents.length;
|
|
168
|
+
onProgress?.({ name, phase: 'splitting', progress: 20, message: `Splitting ${documents.length} documents...` });
|
|
169
|
+
const splitDocs = await KnowledgeStore.splitDocuments(config, documents);
|
|
170
|
+
logger.info(`Split into ${splitDocs.length} chunk(s)`);
|
|
171
|
+
metadata.chunkCount = splitDocs.length;
|
|
172
|
+
// Embed and insert chunks
|
|
173
|
+
onProgress?.({ name, phase: 'embedding', progress: 35, message: `Embedding ${splitDocs.length} chunks...` });
|
|
174
|
+
const chunkTexts = splitDocs.map(d => d.pageContent);
|
|
175
|
+
const chunkEmbeddings = await embeddings.embedDocuments(chunkTexts);
|
|
176
|
+
const chunkInserts = splitDocs.map((doc, i) => ({
|
|
177
|
+
content: doc.pageContent,
|
|
178
|
+
metadata: doc.metadata,
|
|
179
|
+
source: doc.metadata?.source ?? '',
|
|
180
|
+
embedding: chunkEmbeddings[i],
|
|
181
|
+
}));
|
|
182
|
+
onProgress?.({ name, phase: 'building', progress: 55, message: 'Inserting chunks...' });
|
|
183
|
+
sqliteStore.insertChunks(chunkInserts);
|
|
184
|
+
// Entity extraction (if graph config present)
|
|
185
|
+
if (config.graph) {
|
|
186
|
+
onProgress?.({ name, phase: 'extracting', progress: 60, message: 'Extracting entities...' });
|
|
187
|
+
if (!config.graph.directMapping) {
|
|
188
|
+
throw new Error(`Graph config for "${name}" requires a directMapping configuration`);
|
|
189
|
+
}
|
|
190
|
+
const { entities, relationships } = DirectMapper.mapQueryResults(documents, config.graph.directMapping);
|
|
191
|
+
logger.info(`Extracted ${entities.length} entities, ${relationships.length} relationships`);
|
|
192
|
+
if (entities.length > 0) {
|
|
193
|
+
// Embed entities
|
|
194
|
+
onProgress?.({ name, phase: 'embedding', progress: 75, message: `Embedding ${entities.length} entities...` });
|
|
195
|
+
const entityDescs = entities.map(e => `${e.name}: ${e.description}`);
|
|
196
|
+
const entityEmbeddings = await embeddings.embedDocuments(entityDescs);
|
|
197
|
+
const entityInserts = entities.map((entity, i) => ({
|
|
198
|
+
id: normalizeId(entity.name, entity.type),
|
|
199
|
+
type: entity.type,
|
|
200
|
+
name: entity.name,
|
|
201
|
+
description: entity.description,
|
|
202
|
+
properties: entity.properties,
|
|
203
|
+
sourceChunkIds: entity.properties.sourceChunkIds ?? [],
|
|
204
|
+
embedding: entityEmbeddings[i],
|
|
205
|
+
}));
|
|
206
|
+
onProgress?.({ name, phase: 'building', progress: 85, message: 'Inserting entities and relationships...' });
|
|
207
|
+
sqliteStore.insertEntities(entityInserts);
|
|
208
|
+
// Build and insert relationships
|
|
209
|
+
const relInserts = buildRelationships(relationships, entityInserts.map(e => ({ id: e.id, name: e.name, type: e.type })));
|
|
210
|
+
if (relInserts.length > 0) {
|
|
211
|
+
sqliteStore.insertRelationships(relInserts);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
metadata.entityCount = entities.length;
|
|
215
|
+
metadata.edgeCount = relationships.length;
|
|
216
|
+
}
|
|
217
|
+
// Store source hashes
|
|
218
|
+
sqliteStore.setMeta('sourceHashes', currentHashStr);
|
|
219
|
+
metadata.sourceHashes = currentHashes;
|
|
220
|
+
onProgress?.({ name, phase: 'caching', progress: 95, message: 'Finalizing...' });
|
|
221
|
+
}
|
|
222
|
+
// Register stores
|
|
223
|
+
this.sqliteStores.set(name, sqliteStore);
|
|
224
|
+
// Create the KnowledgeStoreInstance
|
|
225
|
+
const instance = this.createInstance(name, config, sqliteStore, embeddings, metadata);
|
|
226
|
+
this.stores.set(name, instance);
|
|
227
|
+
// Update metadata on success
|
|
228
|
+
const storeMetadata = instance.getMetadata();
|
|
229
|
+
storeMetadata.status = 'indexed';
|
|
230
|
+
storeMetadata.lastIndexedAt = new Date().toISOString();
|
|
231
|
+
storeMetadata.lastIndexDurationMs = Date.now() - startTime;
|
|
232
|
+
storeMetadata.errorMessage = null;
|
|
233
|
+
await this.metadataManager.save(name, storeMetadata);
|
|
234
|
+
onProgress?.({ name, phase: 'done', progress: 100, message: 'Initialization complete' });
|
|
235
|
+
logger.info(`"${name}" initialized successfully (${storeMetadata.lastIndexDurationMs}ms)`);
|
|
236
|
+
return instance;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
240
|
+
metadata.status = 'error';
|
|
241
|
+
metadata.errorMessage = errorMessage;
|
|
242
|
+
metadata.lastIndexDurationMs = Date.now() - startTime;
|
|
243
|
+
await this.metadataManager.save(name, metadata);
|
|
244
|
+
onProgress?.({ name, phase: 'error', progress: 0, message: errorMessage });
|
|
245
|
+
logger.error(`Failed to initialize "${name}":`, error);
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
createInstance(name, config, sqliteStore, embeddings, metadata) {
|
|
250
|
+
return {
|
|
251
|
+
config,
|
|
252
|
+
search: async (query, k) => {
|
|
253
|
+
const numResults = k ?? config.search?.defaultK ?? 4;
|
|
254
|
+
searchLogger.info(`Searching "${name}" for: "${query.substring(0, 50)}..." (k=${numResults})`);
|
|
255
|
+
try {
|
|
256
|
+
const queryEmbedding = await embeddings.embedQuery(query);
|
|
257
|
+
// Chunk similarity search
|
|
258
|
+
const chunkResults = sqliteStore.searchChunks(queryEmbedding, numResults);
|
|
259
|
+
// Entity neighborhood search (if entities exist)
|
|
260
|
+
const entityResults = [];
|
|
261
|
+
if (sqliteStore.getEntityCount() > 0) {
|
|
262
|
+
const topEntities = sqliteStore.searchEntities(queryEmbedding, Math.min(numResults, 5));
|
|
263
|
+
for (const entity of topEntities) {
|
|
264
|
+
const { entities, relationships } = sqliteStore.getNeighborhood(entity.id, 2);
|
|
265
|
+
const neighborText = formatNeighborhood(entity, entities, relationships);
|
|
266
|
+
entityResults.push({
|
|
267
|
+
content: neighborText,
|
|
268
|
+
metadata: { type: 'entity_neighborhood', entityId: entity.id, entityName: entity.name },
|
|
269
|
+
score: entity.score,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Merge all results by score, return top k
|
|
274
|
+
const allResults = [
|
|
275
|
+
...chunkResults.map(r => ({
|
|
276
|
+
content: r.content,
|
|
277
|
+
metadata: r.metadata,
|
|
278
|
+
score: r.score,
|
|
279
|
+
})),
|
|
280
|
+
...entityResults,
|
|
281
|
+
];
|
|
282
|
+
allResults.sort((a, b) => b.score - a.score);
|
|
283
|
+
const threshold = config.search?.scoreThreshold;
|
|
284
|
+
const filtered = threshold !== undefined
|
|
285
|
+
? allResults.filter(r => r.score >= threshold)
|
|
286
|
+
: allResults;
|
|
287
|
+
const final = filtered.slice(0, numResults);
|
|
288
|
+
searchLogger.info(`Results: ${chunkResults.length} chunks, ${entityResults.length} entities → ${final.length} total`);
|
|
289
|
+
return final;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
293
|
+
searchLogger.error(`Error during search: ${errorMessage}`, error);
|
|
294
|
+
return [];
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
addDocuments: async (docs) => {
|
|
298
|
+
const texts = docs.map(d => d.content);
|
|
299
|
+
const vectors = await embeddings.embedDocuments(texts);
|
|
300
|
+
sqliteStore.insertChunks(docs.map((d, i) => ({
|
|
301
|
+
content: d.content,
|
|
302
|
+
metadata: d.metadata ?? {},
|
|
303
|
+
source: '',
|
|
304
|
+
embedding: vectors[i],
|
|
305
|
+
})));
|
|
306
|
+
metadata.chunkCount = sqliteStore.getChunkCount();
|
|
307
|
+
},
|
|
308
|
+
refresh: async (refreshOnProgress) => {
|
|
309
|
+
refreshOnProgress?.({ name, phase: 'loading', progress: 10, message: 'Checking for changes...' });
|
|
310
|
+
const newSourceHashes = await KnowledgeStore.computeFileHashes(config, this.workspaceRoot);
|
|
311
|
+
const currentHashStr = JSON.stringify(newSourceHashes);
|
|
312
|
+
const storedHashes = sqliteStore.getMeta('sourceHashes');
|
|
313
|
+
if (currentHashStr === storedHashes) {
|
|
314
|
+
logger.info(`No changes detected for "${name}", skipping refresh`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
logger.info(`Changes detected for "${name}", re-indexing...`);
|
|
318
|
+
// Remove current store references, re-initialize
|
|
319
|
+
this.stores.delete(name);
|
|
320
|
+
this.sqliteStores.delete(name);
|
|
321
|
+
sqliteStore.close();
|
|
322
|
+
// Delete old DB file to force full re-index
|
|
323
|
+
try {
|
|
324
|
+
await fs.unlink(sqliteStore.getDbPath());
|
|
325
|
+
}
|
|
326
|
+
catch { /* */ }
|
|
327
|
+
await this.doInitialize(name, config, refreshOnProgress);
|
|
328
|
+
},
|
|
329
|
+
getMetadata: () => ({ ...metadata }),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
// --- Public Accessors ---
|
|
333
|
+
get(name) {
|
|
334
|
+
return this.stores.get(name);
|
|
335
|
+
}
|
|
336
|
+
getConfig(name) {
|
|
337
|
+
return this.configs.get(name);
|
|
338
|
+
}
|
|
339
|
+
getSqliteStore(name) {
|
|
340
|
+
return this.sqliteStores.get(name);
|
|
341
|
+
}
|
|
342
|
+
list() {
|
|
343
|
+
return Array.from(this.stores.values());
|
|
344
|
+
}
|
|
345
|
+
listConfigs() {
|
|
346
|
+
return Array.from(this.configs.values());
|
|
347
|
+
}
|
|
348
|
+
async getStatus(name) {
|
|
349
|
+
return this.metadataManager.load(name);
|
|
350
|
+
}
|
|
351
|
+
async getAllStatuses() {
|
|
352
|
+
const names = Array.from(this.configs.keys());
|
|
353
|
+
return this.metadataManager.getAll(names);
|
|
354
|
+
}
|
|
355
|
+
getMetadataManager() {
|
|
356
|
+
return this.metadataManager;
|
|
357
|
+
}
|
|
358
|
+
isIndexing(name) {
|
|
359
|
+
return this.activeIndexing.has(name);
|
|
360
|
+
}
|
|
361
|
+
async refresh(name, onProgress) {
|
|
362
|
+
const store = this.stores.get(name);
|
|
363
|
+
if (!store)
|
|
364
|
+
return;
|
|
365
|
+
const config = this.configs.get(name);
|
|
366
|
+
if (config) {
|
|
367
|
+
const metadata = await this.metadataManager.load(name);
|
|
368
|
+
if (metadata) {
|
|
369
|
+
metadata.status = 'indexing';
|
|
370
|
+
await this.metadataManager.save(name, metadata);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
const refreshPromise = (async () => {
|
|
374
|
+
const startTime = Date.now();
|
|
375
|
+
onProgress?.({ name, phase: 'loading', progress: 0, message: 'Starting refresh...' });
|
|
376
|
+
try {
|
|
377
|
+
await store.refresh(onProgress);
|
|
378
|
+
const storeMetadata = store.getMetadata();
|
|
379
|
+
storeMetadata.status = 'indexed';
|
|
380
|
+
storeMetadata.lastIndexedAt = new Date().toISOString();
|
|
381
|
+
storeMetadata.lastIndexDurationMs = Date.now() - startTime;
|
|
382
|
+
storeMetadata.errorMessage = null;
|
|
383
|
+
await this.metadataManager.save(name, storeMetadata);
|
|
384
|
+
onProgress?.({ name, phase: 'done', progress: 100, message: 'Refresh complete' });
|
|
385
|
+
return store;
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
389
|
+
const metadata = await this.metadataManager.load(name);
|
|
390
|
+
if (metadata) {
|
|
391
|
+
metadata.status = 'error';
|
|
392
|
+
metadata.errorMessage = errorMessage;
|
|
393
|
+
await this.metadataManager.save(name, metadata);
|
|
394
|
+
}
|
|
395
|
+
onProgress?.({ name, phase: 'error', progress: 0, message: errorMessage });
|
|
396
|
+
throw error;
|
|
397
|
+
}
|
|
398
|
+
})();
|
|
399
|
+
this.activeIndexing.set(name, refreshPromise);
|
|
400
|
+
try {
|
|
401
|
+
await refreshPromise;
|
|
402
|
+
}
|
|
403
|
+
finally {
|
|
404
|
+
this.activeIndexing.delete(name);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// --- Static Helpers (reused from old KnowledgeStoreFactory) ---
|
|
408
|
+
static createEmbeddings(configName) {
|
|
409
|
+
const embeddingConfig = getEmbeddingConfig(configName);
|
|
410
|
+
const provider = detectProvider(embeddingConfig);
|
|
411
|
+
const eosToken = embeddingConfig.eosToken;
|
|
412
|
+
logger.info(`Embedding model: ${embeddingConfig.model} (provider: ${provider})${embeddingConfig.baseUrl ? `, URL: ${embeddingConfig.baseUrl}` : ''}`);
|
|
413
|
+
let baseEmbeddings;
|
|
414
|
+
switch (provider) {
|
|
415
|
+
case 'gemini':
|
|
416
|
+
baseEmbeddings = new GeminiEmbeddingsProvider({
|
|
417
|
+
modelName: embeddingConfig.model,
|
|
418
|
+
apiKey: resolveApiKey('gemini', embeddingConfig.apiKey),
|
|
419
|
+
});
|
|
420
|
+
break;
|
|
421
|
+
case 'openai':
|
|
422
|
+
case 'local':
|
|
423
|
+
case 'anthropic':
|
|
424
|
+
default: {
|
|
425
|
+
const apiKey = resolveApiKey(provider, embeddingConfig.apiKey);
|
|
426
|
+
baseEmbeddings = new OpenAIEmbeddingsProvider({
|
|
427
|
+
modelName: embeddingConfig.model,
|
|
428
|
+
apiKey,
|
|
429
|
+
baseURL: embeddingConfig.baseUrl,
|
|
430
|
+
dimensions: embeddingConfig.dimensions,
|
|
431
|
+
});
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return this.wrapWithValidation(baseEmbeddings, eosToken);
|
|
436
|
+
}
|
|
437
|
+
static wrapWithValidation(embeddings, eosToken) {
|
|
438
|
+
const appendToken = (text) => {
|
|
439
|
+
if (!eosToken || text.endsWith(eosToken))
|
|
440
|
+
return text;
|
|
441
|
+
return `${text}${eosToken}`;
|
|
442
|
+
};
|
|
443
|
+
const validateEmbedding = (result, context) => {
|
|
444
|
+
if (!Array.isArray(result) || result.length === 0) {
|
|
445
|
+
throw new Error(`${context}: Embedding returned invalid format`);
|
|
446
|
+
}
|
|
447
|
+
if (result.some(v => !isFinite(v))) {
|
|
448
|
+
throw new Error(`${context}: Embedding contains NaN or Infinity values`);
|
|
449
|
+
}
|
|
450
|
+
if (result.every(v => v === 0)) {
|
|
451
|
+
throw new Error(`${context}: Embedding returned a zero vector`);
|
|
452
|
+
}
|
|
453
|
+
return result;
|
|
454
|
+
};
|
|
455
|
+
const originalEmbedQuery = embeddings.embedQuery.bind(embeddings);
|
|
456
|
+
const originalEmbedDocuments = embeddings.embedDocuments.bind(embeddings);
|
|
457
|
+
return {
|
|
458
|
+
embedQuery: async (text) => {
|
|
459
|
+
try {
|
|
460
|
+
return validateEmbedding(await originalEmbedQuery(appendToken(text)), 'embedQuery');
|
|
461
|
+
}
|
|
462
|
+
catch (error) {
|
|
463
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
464
|
+
throw new Error(`Embedding query failed: ${msg}`);
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
embedDocuments: async (texts) => {
|
|
468
|
+
try {
|
|
469
|
+
const result = await originalEmbedDocuments(texts.map(appendToken));
|
|
470
|
+
return result.map((emb, i) => validateEmbedding(emb, `embedDocuments[${i}]`));
|
|
471
|
+
}
|
|
472
|
+
catch (error) {
|
|
473
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
474
|
+
throw new Error(`Embedding documents failed: ${msg}`);
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
static async loadDocuments(config, workspaceRoot) {
|
|
480
|
+
if (config.source.type === 'database') {
|
|
481
|
+
const dbLoader = new DatabaseLoader(config.source);
|
|
482
|
+
return dbLoader.load();
|
|
483
|
+
}
|
|
484
|
+
if (config.source.type === 'web') {
|
|
485
|
+
const webLoader = new WebLoader(config.source);
|
|
486
|
+
return webLoader.load();
|
|
487
|
+
}
|
|
488
|
+
const sourcePath = path.join(workspaceRoot, config.source.path);
|
|
489
|
+
if (config.source.type === 'directory') {
|
|
490
|
+
const pattern = config.source.pattern ?? '*';
|
|
491
|
+
const files = await glob(pattern, { cwd: sourcePath, absolute: true });
|
|
492
|
+
logger.info(`Found ${files.length} file(s) in ${sourcePath}`);
|
|
493
|
+
const allDocs = [];
|
|
494
|
+
for (const file of files) {
|
|
495
|
+
const loader = this.createLoader(config.loader.type, file);
|
|
496
|
+
const docs = await loader.load();
|
|
497
|
+
allDocs.push(...docs);
|
|
498
|
+
}
|
|
499
|
+
return allDocs;
|
|
500
|
+
}
|
|
501
|
+
if (config.source.type === 'file') {
|
|
502
|
+
const loader = this.createLoader(config.loader.type, sourcePath);
|
|
503
|
+
return loader.load();
|
|
504
|
+
}
|
|
505
|
+
throw new Error(`Unknown source type: ${config.source.type}`);
|
|
506
|
+
}
|
|
507
|
+
static createLoader(type, filePath) {
|
|
508
|
+
switch (type) {
|
|
509
|
+
case 'pdf': return new PDFLoader(filePath);
|
|
510
|
+
case 'csv': return new CSVLoader(filePath);
|
|
511
|
+
case 'json': return new JSONLoader(filePath);
|
|
512
|
+
case 'text':
|
|
513
|
+
case 'markdown':
|
|
514
|
+
default: return new TextLoader(filePath);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
static async splitDocuments(config, documents) {
|
|
518
|
+
const splitterConfig = {
|
|
519
|
+
chunkSize: config.splitter.chunkSize,
|
|
520
|
+
chunkOverlap: config.splitter.chunkOverlap,
|
|
521
|
+
separator: config.splitter.separator,
|
|
522
|
+
};
|
|
523
|
+
const splitter = config.splitter.type === 'recursive'
|
|
524
|
+
? new RecursiveCharacterTextSplitter(splitterConfig)
|
|
525
|
+
: new CharacterTextSplitter(splitterConfig);
|
|
526
|
+
return splitter.splitDocuments(documents);
|
|
527
|
+
}
|
|
528
|
+
static async computeFileHashes(config, workspaceRoot) {
|
|
529
|
+
const hashes = {};
|
|
530
|
+
if (config.source.type === 'directory') {
|
|
531
|
+
const sourcePath = path.join(workspaceRoot, config.source.path);
|
|
532
|
+
const pattern = config.source.pattern ?? '*';
|
|
533
|
+
const files = await glob(pattern, { cwd: sourcePath, absolute: true });
|
|
534
|
+
for (const file of files) {
|
|
535
|
+
const content = await fs.readFile(file);
|
|
536
|
+
hashes[file] = crypto.createHash('sha256').update(content).digest('hex');
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
else if (config.source.type === 'file') {
|
|
540
|
+
const sourcePath = path.join(workspaceRoot, config.source.path);
|
|
541
|
+
const content = await fs.readFile(sourcePath);
|
|
542
|
+
hashes[sourcePath] = crypto.createHash('sha256').update(content).digest('hex');
|
|
543
|
+
}
|
|
544
|
+
else if (config.source.type === 'database') {
|
|
545
|
+
hashes['database:query'] = crypto.createHash('sha256').update(config.source.query).digest('hex');
|
|
546
|
+
}
|
|
547
|
+
else if (config.source.type === 'web') {
|
|
548
|
+
hashes['web:url'] = crypto.createHash('sha256').update(config.source.url).digest('hex');
|
|
549
|
+
}
|
|
550
|
+
return hashes;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
// --- Helpers ---
|
|
554
|
+
function normalizeId(name, type) {
|
|
555
|
+
return `${type}::${name}`
|
|
556
|
+
.toLowerCase()
|
|
557
|
+
.replace(/[^a-z0-9:]+/g, '-')
|
|
558
|
+
.replace(/^-|-$/g, '');
|
|
559
|
+
}
|
|
560
|
+
function buildRelationships(relationships, entities) {
|
|
561
|
+
const nodeIdMap = new Map();
|
|
562
|
+
for (const entity of entities) {
|
|
563
|
+
const key = normalizeId(entity.name, entity.type);
|
|
564
|
+
nodeIdMap.set(key, entity.id);
|
|
565
|
+
}
|
|
566
|
+
const result = [];
|
|
567
|
+
for (let i = 0; i < relationships.length; i++) {
|
|
568
|
+
const rel = relationships[i];
|
|
569
|
+
const sourceKey = normalizeId(rel.sourceName, rel.sourceType);
|
|
570
|
+
const targetKey = normalizeId(rel.targetName, rel.targetType);
|
|
571
|
+
const sourceId = nodeIdMap.get(sourceKey);
|
|
572
|
+
const targetId = nodeIdMap.get(targetKey);
|
|
573
|
+
if (!sourceId || !targetId)
|
|
574
|
+
continue;
|
|
575
|
+
result.push({
|
|
576
|
+
id: `edge-${i}-${rel.type}`,
|
|
577
|
+
type: rel.type,
|
|
578
|
+
sourceId,
|
|
579
|
+
targetId,
|
|
580
|
+
description: rel.description,
|
|
581
|
+
weight: rel.weight,
|
|
582
|
+
properties: {},
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
return result;
|
|
586
|
+
}
|
|
587
|
+
function formatNeighborhood(entity, neighbors, relationships) {
|
|
588
|
+
const lines = [];
|
|
589
|
+
lines.push(`[${entity.type}] ${entity.name}: ${entity.description}`);
|
|
590
|
+
if (relationships.length > 0) {
|
|
591
|
+
lines.push('Relationships:');
|
|
592
|
+
for (const rel of relationships.slice(0, 10)) {
|
|
593
|
+
const other = rel.source_id === entity.id
|
|
594
|
+
? neighbors.find(n => n.id === rel.target_id)
|
|
595
|
+
: neighbors.find(n => n.id === rel.source_id);
|
|
596
|
+
if (other) {
|
|
597
|
+
lines.push(` -[${rel.type}]-> [${other.type}] ${other.name}`);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
return lines.join('\n');
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=knowledge-store.js.map
|