@weavelogic/knowledge-graph-agent 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +70 -3
- package/dist/_virtual/__vite-browser-external.js +2 -2
- package/dist/_virtual/__vite-browser-external.js.map +1 -1
- package/dist/_virtual/index12.js +7 -0
- package/dist/_virtual/index12.js.map +1 -0
- package/dist/_virtual/ort-web.min.js +8 -0
- package/dist/_virtual/ort-web.min.js.map +1 -0
- package/dist/_virtual/ort-web.min2.js +5 -0
- package/dist/_virtual/ort-web.min2.js.map +1 -0
- package/dist/agents/base-agent.d.ts +63 -0
- package/dist/agents/base-agent.d.ts.map +1 -1
- package/dist/agents/base-agent.js +139 -0
- package/dist/agents/base-agent.js.map +1 -1
- package/dist/agents/coordinator-agent.d.ts +422 -0
- package/dist/agents/coordinator-agent.d.ts.map +1 -0
- package/dist/agents/documenter-agent.d.ts +298 -0
- package/dist/agents/documenter-agent.d.ts.map +1 -0
- package/dist/agents/index.d.ts +11 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/mixins/index.d.ts +9 -0
- package/dist/agents/mixins/index.d.ts.map +1 -0
- package/dist/agents/mixins/trajectory-mixin.d.ts +112 -0
- package/dist/agents/mixins/trajectory-mixin.d.ts.map +1 -0
- package/dist/agents/optimizer-agent.d.ts +388 -0
- package/dist/agents/optimizer-agent.d.ts.map +1 -0
- package/dist/agents/planner-agent.d.ts +395 -0
- package/dist/agents/planner-agent.d.ts.map +1 -0
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +5 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/agents/reviewer-agent.d.ts +330 -0
- package/dist/agents/reviewer-agent.d.ts.map +1 -0
- package/dist/agents/types.d.ts +12 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js +1 -0
- package/dist/agents/types.js.map +1 -1
- package/dist/cli/commands/hive-mind/add-frontmatter.d.ts +102 -0
- package/dist/cli/commands/hive-mind/add-frontmatter.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/add-frontmatter.js +439 -0
- package/dist/cli/commands/hive-mind/add-frontmatter.js.map +1 -0
- package/dist/cli/commands/hive-mind/analyze-links.d.ts +80 -0
- package/dist/cli/commands/hive-mind/analyze-links.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/analyze-links.js +367 -0
- package/dist/cli/commands/hive-mind/analyze-links.js.map +1 -0
- package/dist/cli/commands/hive-mind/find-connections.d.ts +75 -0
- package/dist/cli/commands/hive-mind/find-connections.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/find-connections.js +347 -0
- package/dist/cli/commands/hive-mind/find-connections.js.map +1 -0
- package/dist/cli/commands/hive-mind/index.d.ts +37 -0
- package/dist/cli/commands/hive-mind/index.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/index.js +33 -0
- package/dist/cli/commands/hive-mind/index.js.map +1 -0
- package/dist/cli/commands/hive-mind/validate-names.d.ts +79 -0
- package/dist/cli/commands/hive-mind/validate-names.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/validate-names.js +353 -0
- package/dist/cli/commands/hive-mind/validate-names.js.map +1 -0
- package/dist/cli/commands/vector.js +2 -0
- package/dist/cli/commands/vector.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/equilibrium/agent-equilibrium.d.ts +194 -0
- package/dist/equilibrium/agent-equilibrium.d.ts.map +1 -0
- package/dist/equilibrium/agent-equilibrium.js +304 -0
- package/dist/equilibrium/agent-equilibrium.js.map +1 -0
- package/dist/equilibrium/graph-equilibrium.d.ts +177 -0
- package/dist/equilibrium/graph-equilibrium.d.ts.map +1 -0
- package/dist/equilibrium/index.d.ts +11 -0
- package/dist/equilibrium/index.d.ts.map +1 -0
- package/dist/equilibrium/memory-equilibrium.d.ts +153 -0
- package/dist/equilibrium/memory-equilibrium.d.ts.map +1 -0
- package/dist/graphql/resolvers/index.d.ts.map +1 -1
- package/dist/graphql/resolvers/queries.d.ts +11 -0
- package/dist/graphql/resolvers/queries.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/inference/index.d.ts +9 -0
- package/dist/inference/index.d.ts.map +1 -0
- package/dist/inference/model-selection.d.ts +131 -0
- package/dist/inference/model-selection.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/agent-booster-adapter.d.ts +265 -0
- package/dist/integrations/agentic-flow/adapters/agent-booster-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-adapter.d.ts +197 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-vector-store.d.ts +249 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-vector-store.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/base-adapter.d.ts +120 -0
- package/dist/integrations/agentic-flow/adapters/base-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/federation-hub-adapter.d.ts +444 -0
- package/dist/integrations/agentic-flow/adapters/federation-hub-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/index.d.ts +17 -0
- package/dist/integrations/agentic-flow/adapters/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/model-router-adapter.d.ts +242 -0
- package/dist/integrations/agentic-flow/adapters/model-router-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/quic-transport-adapter.d.ts +364 -0
- package/dist/integrations/agentic-flow/adapters/quic-transport-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/reasoning-bank-adapter.d.ts +209 -0
- package/dist/integrations/agentic-flow/adapters/reasoning-bank-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/benchmark/index.d.ts +9 -0
- package/dist/integrations/agentic-flow/benchmark/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/benchmark/vector-benchmark.d.ts +253 -0
- package/dist/integrations/agentic-flow/benchmark/vector-benchmark.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/config.d.ts +109 -0
- package/dist/integrations/agentic-flow/config.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/feature-flags.d.ts +140 -0
- package/dist/integrations/agentic-flow/feature-flags.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/index.d.ts +22 -0
- package/dist/integrations/agentic-flow/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/migration/index.d.ts +9 -0
- package/dist/integrations/agentic-flow/migration/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/migration/migrate-to-agentdb.d.ts +242 -0
- package/dist/integrations/agentic-flow/migration/migrate-to-agentdb.d.ts.map +1 -0
- package/dist/learning/index.d.ts +91 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/learning-loop.d.ts +176 -0
- package/dist/learning/learning-loop.d.ts.map +1 -0
- package/dist/learning/services/ab-testing-framework.d.ts +135 -0
- package/dist/learning/services/ab-testing-framework.d.ts.map +1 -0
- package/dist/learning/services/agent-priming-service.d.ts +207 -0
- package/dist/learning/services/agent-priming-service.d.ts.map +1 -0
- package/dist/learning/services/daily-log-generator.d.ts +113 -0
- package/dist/learning/services/daily-log-generator.d.ts.map +1 -0
- package/dist/learning/services/index.d.ts +14 -0
- package/dist/learning/services/index.d.ts.map +1 -0
- package/dist/learning/services/memory-extraction-service.d.ts +87 -0
- package/dist/learning/services/memory-extraction-service.d.ts.map +1 -0
- package/dist/learning/services/task-completion-consumer.d.ts +162 -0
- package/dist/learning/services/task-completion-consumer.d.ts.map +1 -0
- package/dist/learning/services/trajectory-tracker.d.ts +174 -0
- package/dist/learning/services/trajectory-tracker.d.ts.map +1 -0
- package/dist/learning/types.d.ts +516 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/mcp/clients/claude-flow-memory-client.d.ts +259 -0
- package/dist/mcp/clients/claude-flow-memory-client.d.ts.map +1 -0
- package/dist/mcp/clients/claude-flow-memory-client.js +305 -0
- package/dist/mcp/clients/claude-flow-memory-client.js.map +1 -0
- package/dist/mcp/clients/index.d.ts +11 -0
- package/dist/mcp/clients/index.d.ts.map +1 -0
- package/dist/mcp/clients/mcp-client-adapter.d.ts +146 -0
- package/dist/mcp/clients/mcp-client-adapter.d.ts.map +1 -0
- package/dist/mcp/clients/mcp-client-adapter.js +372 -0
- package/dist/mcp/clients/mcp-client-adapter.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/memory/vault-sync.d.ts +12 -0
- package/dist/memory/vault-sync.d.ts.map +1 -1
- package/dist/memory/vault-sync.js +94 -11
- package/dist/memory/vault-sync.js.map +1 -1
- package/dist/node_modules/@huggingface/jinja/dist/index.js +118 -0
- package/dist/node_modules/@huggingface/jinja/dist/index.js.map +1 -0
- package/dist/node_modules/@typescript-eslint/project-service/dist/index.js +1 -1
- package/dist/node_modules/@xenova/transformers/src/backends/onnx.js +24 -0
- package/dist/node_modules/@xenova/transformers/src/backends/onnx.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/configs.js +52 -0
- package/dist/node_modules/@xenova/transformers/src/configs.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/env.js +35 -0
- package/dist/node_modules/@xenova/transformers/src/env.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/models.js +3852 -0
- package/dist/node_modules/@xenova/transformers/src/models.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/tokenizers.js +144 -0
- package/dist/node_modules/@xenova/transformers/src/tokenizers.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/core.js +52 -0
- package/dist/node_modules/@xenova/transformers/src/utils/core.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/generation.js +623 -0
- package/dist/node_modules/@xenova/transformers/src/utils/generation.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/hub.js +395 -0
- package/dist/node_modules/@xenova/transformers/src/utils/hub.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/image.js +12 -0
- package/dist/node_modules/@xenova/transformers/src/utils/image.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/maths.js +89 -0
- package/dist/node_modules/@xenova/transformers/src/utils/maths.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/tensor.js +750 -0
- package/dist/node_modules/@xenova/transformers/src/utils/tensor.js.map +1 -0
- package/dist/node_modules/fdir/dist/index.js +13 -13
- package/dist/node_modules/fdir/dist/index.js.map +1 -1
- package/dist/node_modules/onnxruntime-common/dist/lib/backend-impl.js +67 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/backend-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env-impl.js +24 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env.js +6 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/index.js +11 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/index.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session-impl.js +162 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session.js +6 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor-impl.js +393 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor.js +6 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor.js.map +1 -0
- package/dist/node_modules/onnxruntime-web/dist/ort-web.min.js +12919 -0
- package/dist/node_modules/onnxruntime-web/dist/ort-web.min.js.map +1 -0
- package/dist/node_modules/tinyglobby/dist/index.js +14 -14
- package/dist/node_modules/tinyglobby/dist/index.js.map +1 -1
- package/dist/node_modules/typescript/lib/typescript.js +24 -24
- package/dist/node_modules/typescript/lib/typescript.js.map +1 -1
- package/dist/transport/agent-transport.d.ts +269 -0
- package/dist/transport/agent-transport.d.ts.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/dist/vector/services/embedding-service.d.ts +244 -0
- package/dist/vector/services/embedding-service.d.ts.map +1 -0
- package/dist/vector/services/embedding-service.js +10 -0
- package/dist/vector/services/embedding-service.js.map +1 -0
- package/dist/vector/services/hybrid-search.d.ts +320 -0
- package/dist/vector/services/hybrid-search.d.ts.map +1 -0
- package/dist/vector/services/hybrid-search.js +3 -0
- package/dist/vector/services/hybrid-search.js.map +1 -0
- package/dist/vector/services/index.d.ts +4 -0
- package/dist/vector/services/index.d.ts.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid Search Service
|
|
3
|
+
*
|
|
4
|
+
* Combines vector similarity search with full-text search (FTS) for improved
|
|
5
|
+
* search relevance. Uses a weighted scoring approach to merge results from
|
|
6
|
+
* both search methods.
|
|
7
|
+
*
|
|
8
|
+
* @module vector/services/hybrid-search
|
|
9
|
+
*/
|
|
10
|
+
import type { EnhancedVectorStore } from './vector-store.js';
|
|
11
|
+
import type { EmbeddingService } from './embedding-service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for hybrid search
|
|
14
|
+
*/
|
|
15
|
+
export interface HybridSearchConfig {
|
|
16
|
+
/**
|
|
17
|
+
* Weight for vector similarity results (0-1)
|
|
18
|
+
* Higher values favor semantic similarity
|
|
19
|
+
* @default 0.6
|
|
20
|
+
*/
|
|
21
|
+
vectorWeight: number;
|
|
22
|
+
/**
|
|
23
|
+
* Weight for full-text search results (0-1)
|
|
24
|
+
* Higher values favor keyword matching
|
|
25
|
+
* @default 0.4
|
|
26
|
+
*/
|
|
27
|
+
ftsWeight: number;
|
|
28
|
+
/**
|
|
29
|
+
* Maximum number of results to return
|
|
30
|
+
* @default 20
|
|
31
|
+
*/
|
|
32
|
+
limit: number;
|
|
33
|
+
/**
|
|
34
|
+
* Minimum combined score threshold (0-1)
|
|
35
|
+
* Results below this score are filtered out
|
|
36
|
+
* @default 0.3
|
|
37
|
+
*/
|
|
38
|
+
minScore: number;
|
|
39
|
+
/**
|
|
40
|
+
* Boost factor for results that appear in both vector and FTS
|
|
41
|
+
* @default 1.2
|
|
42
|
+
*/
|
|
43
|
+
hybridBoost: number;
|
|
44
|
+
/**
|
|
45
|
+
* Whether to normalize scores before combining
|
|
46
|
+
* @default true
|
|
47
|
+
*/
|
|
48
|
+
normalizeScores: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* FTS (Full-Text Search) result from external search provider
|
|
52
|
+
*/
|
|
53
|
+
export interface FTSResult {
|
|
54
|
+
/**
|
|
55
|
+
* Node/document ID
|
|
56
|
+
*/
|
|
57
|
+
id: string;
|
|
58
|
+
/**
|
|
59
|
+
* Content that matched
|
|
60
|
+
*/
|
|
61
|
+
content: string;
|
|
62
|
+
/**
|
|
63
|
+
* FTS relevance score (0-1 normalized or raw)
|
|
64
|
+
*/
|
|
65
|
+
score?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Match snippets/highlights
|
|
68
|
+
*/
|
|
69
|
+
snippets?: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Additional metadata
|
|
72
|
+
*/
|
|
73
|
+
metadata?: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extended hybrid search result with source tracking
|
|
77
|
+
*/
|
|
78
|
+
export interface ExtendedHybridSearchResult {
|
|
79
|
+
/**
|
|
80
|
+
* Node/document ID
|
|
81
|
+
*/
|
|
82
|
+
nodeId: string;
|
|
83
|
+
/**
|
|
84
|
+
* Content of the matched node
|
|
85
|
+
*/
|
|
86
|
+
content: string;
|
|
87
|
+
/**
|
|
88
|
+
* Vector similarity score (0-1)
|
|
89
|
+
*/
|
|
90
|
+
vectorScore: number;
|
|
91
|
+
/**
|
|
92
|
+
* Full-text search score (0-1)
|
|
93
|
+
*/
|
|
94
|
+
ftsScore: number;
|
|
95
|
+
/**
|
|
96
|
+
* Combined/weighted score
|
|
97
|
+
*/
|
|
98
|
+
combinedScore: number;
|
|
99
|
+
/**
|
|
100
|
+
* Source of this result
|
|
101
|
+
*/
|
|
102
|
+
source: 'vector' | 'fts' | 'hybrid';
|
|
103
|
+
/**
|
|
104
|
+
* Rank in the final result list
|
|
105
|
+
*/
|
|
106
|
+
rank: number;
|
|
107
|
+
/**
|
|
108
|
+
* Optional metadata
|
|
109
|
+
*/
|
|
110
|
+
metadata?: Record<string, unknown>;
|
|
111
|
+
/**
|
|
112
|
+
* Match snippets for highlighting
|
|
113
|
+
*/
|
|
114
|
+
snippets?: string[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Search query input
|
|
118
|
+
*/
|
|
119
|
+
export interface HybridSearchQuery {
|
|
120
|
+
/**
|
|
121
|
+
* Text query for search
|
|
122
|
+
*/
|
|
123
|
+
query: string;
|
|
124
|
+
/**
|
|
125
|
+
* Maximum results to return
|
|
126
|
+
*/
|
|
127
|
+
limit?: number;
|
|
128
|
+
/**
|
|
129
|
+
* Minimum score threshold
|
|
130
|
+
*/
|
|
131
|
+
minScore?: number;
|
|
132
|
+
/**
|
|
133
|
+
* Node types to filter by
|
|
134
|
+
*/
|
|
135
|
+
nodeTypes?: string[];
|
|
136
|
+
/**
|
|
137
|
+
* Override vector weight
|
|
138
|
+
*/
|
|
139
|
+
vectorWeight?: number;
|
|
140
|
+
/**
|
|
141
|
+
* Override FTS weight
|
|
142
|
+
*/
|
|
143
|
+
ftsWeight?: number;
|
|
144
|
+
/**
|
|
145
|
+
* Include match snippets
|
|
146
|
+
*/
|
|
147
|
+
includeSnippets?: boolean;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Search statistics
|
|
151
|
+
*/
|
|
152
|
+
export interface SearchStats {
|
|
153
|
+
/**
|
|
154
|
+
* Total search time in milliseconds
|
|
155
|
+
*/
|
|
156
|
+
totalDurationMs: number;
|
|
157
|
+
/**
|
|
158
|
+
* Vector search time
|
|
159
|
+
*/
|
|
160
|
+
vectorSearchMs: number;
|
|
161
|
+
/**
|
|
162
|
+
* FTS search time
|
|
163
|
+
*/
|
|
164
|
+
ftsSearchMs: number;
|
|
165
|
+
/**
|
|
166
|
+
* Merge/ranking time
|
|
167
|
+
*/
|
|
168
|
+
mergeMs: number;
|
|
169
|
+
/**
|
|
170
|
+
* Number of vector results before merge
|
|
171
|
+
*/
|
|
172
|
+
vectorResultCount: number;
|
|
173
|
+
/**
|
|
174
|
+
* Number of FTS results before merge
|
|
175
|
+
*/
|
|
176
|
+
ftsResultCount: number;
|
|
177
|
+
/**
|
|
178
|
+
* Final result count after merge and filter
|
|
179
|
+
*/
|
|
180
|
+
finalResultCount: number;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Hybrid Search result with stats
|
|
184
|
+
*/
|
|
185
|
+
export interface HybridSearchResponse {
|
|
186
|
+
/**
|
|
187
|
+
* Search results
|
|
188
|
+
*/
|
|
189
|
+
results: ExtendedHybridSearchResult[];
|
|
190
|
+
/**
|
|
191
|
+
* Search statistics
|
|
192
|
+
*/
|
|
193
|
+
stats: SearchStats;
|
|
194
|
+
/**
|
|
195
|
+
* Original query
|
|
196
|
+
*/
|
|
197
|
+
query: string;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* FTS provider interface for pluggable full-text search
|
|
201
|
+
*/
|
|
202
|
+
export interface FTSProvider {
|
|
203
|
+
/**
|
|
204
|
+
* Search for documents matching query
|
|
205
|
+
*/
|
|
206
|
+
search(query: string, limit: number): Promise<FTSResult[]>;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Hybrid Search Service
|
|
210
|
+
*
|
|
211
|
+
* Combines vector similarity search with full-text search to provide
|
|
212
|
+
* better search relevance. Vector search captures semantic meaning
|
|
213
|
+
* while FTS captures exact keyword matches.
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* const hybridSearch = new HybridSearch(vectorStore, embeddingService);
|
|
218
|
+
*
|
|
219
|
+
* // Set up FTS provider (e.g., SQLite FTS5)
|
|
220
|
+
* hybridSearch.setFTSProvider({
|
|
221
|
+
* search: async (query, limit) => {
|
|
222
|
+
* return db.searchNodes(query, limit).map(node => ({
|
|
223
|
+
* id: node.id,
|
|
224
|
+
* content: node.content,
|
|
225
|
+
* score: 0.5,
|
|
226
|
+
* }));
|
|
227
|
+
* }
|
|
228
|
+
* });
|
|
229
|
+
*
|
|
230
|
+
* // Perform hybrid search
|
|
231
|
+
* const response = await hybridSearch.search({
|
|
232
|
+
* query: 'machine learning algorithms',
|
|
233
|
+
* limit: 10,
|
|
234
|
+
* });
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
export declare class HybridSearch {
|
|
238
|
+
private vectorStore;
|
|
239
|
+
private embeddingService;
|
|
240
|
+
private config;
|
|
241
|
+
private ftsProvider;
|
|
242
|
+
/**
|
|
243
|
+
* Create a new HybridSearch instance
|
|
244
|
+
*
|
|
245
|
+
* @param vectorStore - Vector store for similarity search
|
|
246
|
+
* @param embeddingService - Service for generating query embeddings
|
|
247
|
+
* @param config - Optional configuration overrides
|
|
248
|
+
*/
|
|
249
|
+
constructor(vectorStore: EnhancedVectorStore, embeddingService: EmbeddingService, config?: Partial<HybridSearchConfig>);
|
|
250
|
+
/**
|
|
251
|
+
* Set the full-text search provider
|
|
252
|
+
*
|
|
253
|
+
* @param provider - FTS provider implementation
|
|
254
|
+
*/
|
|
255
|
+
setFTSProvider(provider: FTSProvider): void;
|
|
256
|
+
/**
|
|
257
|
+
* Perform hybrid search combining vector and FTS
|
|
258
|
+
*
|
|
259
|
+
* @param query - Search query
|
|
260
|
+
* @returns Search response with results and statistics
|
|
261
|
+
*/
|
|
262
|
+
search(query: HybridSearchQuery): Promise<HybridSearchResponse>;
|
|
263
|
+
/**
|
|
264
|
+
* Perform vector similarity search
|
|
265
|
+
*
|
|
266
|
+
* @param query - Text query
|
|
267
|
+
* @param limit - Max results
|
|
268
|
+
* @returns Vector search results with timing
|
|
269
|
+
*/
|
|
270
|
+
private performVectorSearch;
|
|
271
|
+
/**
|
|
272
|
+
* Perform full-text search
|
|
273
|
+
*
|
|
274
|
+
* @param query - Text query
|
|
275
|
+
* @param limit - Max results
|
|
276
|
+
* @returns FTS results with timing
|
|
277
|
+
*/
|
|
278
|
+
private performFTSSearch;
|
|
279
|
+
/**
|
|
280
|
+
* Merge vector and FTS results using weighted scoring
|
|
281
|
+
*
|
|
282
|
+
* @param vectorResults - Results from vector search
|
|
283
|
+
* @param ftsResults - Results from FTS
|
|
284
|
+
* @param vectorWeight - Weight for vector scores
|
|
285
|
+
* @param ftsWeight - Weight for FTS scores
|
|
286
|
+
* @returns Merged and ranked results
|
|
287
|
+
*/
|
|
288
|
+
private mergeResults;
|
|
289
|
+
/**
|
|
290
|
+
* Normalize scores to 0-1 range
|
|
291
|
+
*
|
|
292
|
+
* @param items - Items with scores to normalize
|
|
293
|
+
* @returns Map of id to normalized score
|
|
294
|
+
*/
|
|
295
|
+
private normalizeScores;
|
|
296
|
+
/**
|
|
297
|
+
* Update configuration
|
|
298
|
+
*
|
|
299
|
+
* @param config - Configuration updates
|
|
300
|
+
*/
|
|
301
|
+
updateConfig(config: Partial<HybridSearchConfig>): void;
|
|
302
|
+
/**
|
|
303
|
+
* Get current configuration
|
|
304
|
+
*
|
|
305
|
+
* @returns Copy of current configuration
|
|
306
|
+
*/
|
|
307
|
+
getConfig(): HybridSearchConfig;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Create a hybrid search instance
|
|
311
|
+
*
|
|
312
|
+
* Factory function for creating hybrid search services.
|
|
313
|
+
*
|
|
314
|
+
* @param vectorStore - Vector store for similarity search
|
|
315
|
+
* @param embeddingService - Service for generating query embeddings
|
|
316
|
+
* @param config - Optional configuration overrides
|
|
317
|
+
* @returns New HybridSearch instance
|
|
318
|
+
*/
|
|
319
|
+
export declare function createHybridSearch(vectorStore: EnhancedVectorStore, embeddingService: EmbeddingService, config?: Partial<HybridSearchConfig>): HybridSearch;
|
|
320
|
+
//# sourceMappingURL=hybrid-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../../../src/vector/services/hybrid-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-search.js","sources":["../../../src/vector/services/hybrid-search.ts"],"sourcesContent":["/**\n * Hybrid Search Service\n *\n * Combines vector similarity search with full-text search (FTS) for improved\n * search relevance. Uses a weighted scoring approach to merge results from\n * both search methods.\n *\n * @module vector/services/hybrid-search\n */\n\nimport type { SearchResult, HybridSearchResult } from '../types.js';\nimport type { EnhancedVectorStore } from './vector-store.js';\nimport type { EmbeddingService } from './embedding-service.js';\nimport { createLogger } from '../../utils/index.js';\n\nconst logger = createLogger('hybrid-search');\n\n/**\n * Configuration for hybrid search\n */\nexport interface HybridSearchConfig {\n /**\n * Weight for vector similarity results (0-1)\n * Higher values favor semantic similarity\n * @default 0.6\n */\n vectorWeight: number;\n\n /**\n * Weight for full-text search results (0-1)\n * Higher values favor keyword matching\n * @default 0.4\n */\n ftsWeight: number;\n\n /**\n * Maximum number of results to return\n * @default 20\n */\n limit: number;\n\n /**\n * Minimum combined score threshold (0-1)\n * Results below this score are filtered out\n * @default 0.3\n */\n minScore: number;\n\n /**\n * Boost factor for results that appear in both vector and FTS\n * @default 1.2\n */\n hybridBoost: number;\n\n /**\n * Whether to normalize scores before combining\n * @default true\n */\n normalizeScores: boolean;\n}\n\n/**\n * Default hybrid search configuration\n */\nconst DEFAULT_CONFIG: HybridSearchConfig = {\n vectorWeight: 0.6,\n ftsWeight: 0.4,\n limit: 20,\n minScore: 0.3,\n hybridBoost: 1.2,\n normalizeScores: true,\n};\n\n/**\n * FTS (Full-Text Search) result from external search provider\n */\nexport interface FTSResult {\n /**\n * Node/document ID\n */\n id: string;\n\n /**\n * Content that matched\n */\n content: string;\n\n /**\n * FTS relevance score (0-1 normalized or raw)\n */\n score?: number;\n\n /**\n * Match snippets/highlights\n */\n snippets?: string[];\n\n /**\n * Additional metadata\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Extended hybrid search result with source tracking\n */\nexport interface ExtendedHybridSearchResult {\n /**\n * Node/document ID\n */\n nodeId: string;\n\n /**\n * Content of the matched node\n */\n content: string;\n\n /**\n * Vector similarity score (0-1)\n */\n vectorScore: number;\n\n /**\n * Full-text search score (0-1)\n */\n ftsScore: number;\n\n /**\n * Combined/weighted score\n */\n combinedScore: number;\n\n /**\n * Source of this result\n */\n source: 'vector' | 'fts' | 'hybrid';\n\n /**\n * Rank in the final result list\n */\n rank: number;\n\n /**\n * Optional metadata\n */\n metadata?: Record<string, unknown>;\n\n /**\n * Match snippets for highlighting\n */\n snippets?: string[];\n}\n\n/**\n * Search query input\n */\nexport interface HybridSearchQuery {\n /**\n * Text query for search\n */\n query: string;\n\n /**\n * Maximum results to return\n */\n limit?: number;\n\n /**\n * Minimum score threshold\n */\n minScore?: number;\n\n /**\n * Node types to filter by\n */\n nodeTypes?: string[];\n\n /**\n * Override vector weight\n */\n vectorWeight?: number;\n\n /**\n * Override FTS weight\n */\n ftsWeight?: number;\n\n /**\n * Include match snippets\n */\n includeSnippets?: boolean;\n}\n\n/**\n * Search statistics\n */\nexport interface SearchStats {\n /**\n * Total search time in milliseconds\n */\n totalDurationMs: number;\n\n /**\n * Vector search time\n */\n vectorSearchMs: number;\n\n /**\n * FTS search time\n */\n ftsSearchMs: number;\n\n /**\n * Merge/ranking time\n */\n mergeMs: number;\n\n /**\n * Number of vector results before merge\n */\n vectorResultCount: number;\n\n /**\n * Number of FTS results before merge\n */\n ftsResultCount: number;\n\n /**\n * Final result count after merge and filter\n */\n finalResultCount: number;\n}\n\n/**\n * Hybrid Search result with stats\n */\nexport interface HybridSearchResponse {\n /**\n * Search results\n */\n results: ExtendedHybridSearchResult[];\n\n /**\n * Search statistics\n */\n stats: SearchStats;\n\n /**\n * Original query\n */\n query: string;\n}\n\n/**\n * FTS provider interface for pluggable full-text search\n */\nexport interface FTSProvider {\n /**\n * Search for documents matching query\n */\n search(query: string, limit: number): Promise<FTSResult[]>;\n}\n\n/**\n * Hybrid Search Service\n *\n * Combines vector similarity search with full-text search to provide\n * better search relevance. Vector search captures semantic meaning\n * while FTS captures exact keyword matches.\n *\n * @example\n * ```typescript\n * const hybridSearch = new HybridSearch(vectorStore, embeddingService);\n *\n * // Set up FTS provider (e.g., SQLite FTS5)\n * hybridSearch.setFTSProvider({\n * search: async (query, limit) => {\n * return db.searchNodes(query, limit).map(node => ({\n * id: node.id,\n * content: node.content,\n * score: 0.5,\n * }));\n * }\n * });\n *\n * // Perform hybrid search\n * const response = await hybridSearch.search({\n * query: 'machine learning algorithms',\n * limit: 10,\n * });\n * ```\n */\nexport class HybridSearch {\n private vectorStore: EnhancedVectorStore;\n private embeddingService: EmbeddingService;\n private config: HybridSearchConfig;\n private ftsProvider: FTSProvider | null = null;\n\n /**\n * Create a new HybridSearch instance\n *\n * @param vectorStore - Vector store for similarity search\n * @param embeddingService - Service for generating query embeddings\n * @param config - Optional configuration overrides\n */\n constructor(\n vectorStore: EnhancedVectorStore,\n embeddingService: EmbeddingService,\n config: Partial<HybridSearchConfig> = {}\n ) {\n this.vectorStore = vectorStore;\n this.embeddingService = embeddingService;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Set the full-text search provider\n *\n * @param provider - FTS provider implementation\n */\n setFTSProvider(provider: FTSProvider): void {\n this.ftsProvider = provider;\n }\n\n /**\n * Perform hybrid search combining vector and FTS\n *\n * @param query - Search query\n * @returns Search response with results and statistics\n */\n async search(query: HybridSearchQuery): Promise<HybridSearchResponse> {\n const startTime = Date.now();\n const limit = query.limit ?? this.config.limit;\n const minScore = query.minScore ?? this.config.minScore;\n const vectorWeight = query.vectorWeight ?? this.config.vectorWeight;\n const ftsWeight = query.ftsWeight ?? this.config.ftsWeight;\n\n let vectorSearchMs = 0;\n let ftsSearchMs = 0;\n let vectorResults: SearchResult[] = [];\n let ftsResults: FTSResult[] = [];\n\n // Run vector search and FTS in parallel\n const [vectorResultsPromise, ftsResultsPromise] = await Promise.allSettled([\n this.performVectorSearch(query.query, limit * 2),\n this.performFTSSearch(query.query, limit * 2),\n ]);\n\n // Extract vector results\n if (vectorResultsPromise.status === 'fulfilled') {\n vectorResults = vectorResultsPromise.value.results;\n vectorSearchMs = vectorResultsPromise.value.durationMs;\n } else {\n logger.warn('Vector search failed', {\n error: vectorResultsPromise.reason,\n });\n }\n\n // Extract FTS results\n if (ftsResultsPromise.status === 'fulfilled') {\n ftsResults = ftsResultsPromise.value.results;\n ftsSearchMs = ftsResultsPromise.value.durationMs;\n } else {\n logger.warn('FTS search failed', {\n error: ftsResultsPromise.reason,\n });\n }\n\n // Merge results\n const mergeStartTime = Date.now();\n const merged = this.mergeResults(\n vectorResults,\n ftsResults,\n vectorWeight,\n ftsWeight\n );\n\n // Filter by minimum score\n const filtered = merged.filter((r) => r.combinedScore >= minScore);\n\n // Filter by node types if specified\n let final = filtered;\n if (query.nodeTypes && query.nodeTypes.length > 0) {\n final = filtered.filter((r) => {\n const nodeType = r.metadata?.type as string | undefined;\n return nodeType && query.nodeTypes!.includes(nodeType);\n });\n }\n\n // Limit and rank results\n const results = final.slice(0, limit).map((r, i) => ({\n ...r,\n rank: i + 1,\n }));\n\n const mergeMs = Date.now() - mergeStartTime;\n const totalDurationMs = Date.now() - startTime;\n\n logger.info('Hybrid search completed', {\n query: query.query.slice(0, 50),\n vectorResults: vectorResults.length,\n ftsResults: ftsResults.length,\n finalResults: results.length,\n totalDurationMs,\n });\n\n return {\n results,\n stats: {\n totalDurationMs,\n vectorSearchMs,\n ftsSearchMs,\n mergeMs,\n vectorResultCount: vectorResults.length,\n ftsResultCount: ftsResults.length,\n finalResultCount: results.length,\n },\n query: query.query,\n };\n }\n\n /**\n * Perform vector similarity search\n *\n * @param query - Text query\n * @param limit - Max results\n * @returns Vector search results with timing\n */\n private async performVectorSearch(\n query: string,\n limit: number\n ): Promise<{ results: SearchResult[]; durationMs: number }> {\n const startTime = Date.now();\n\n // Generate query embedding\n const embeddingResult = await this.embeddingService.embed(query);\n\n // Search vector store\n const results = await this.vectorStore.search({\n vector: Array.from(embeddingResult.embedding),\n k: limit,\n minScore: 0, // We'll filter by minScore after merge\n });\n\n return {\n results,\n durationMs: Date.now() - startTime,\n };\n }\n\n /**\n * Perform full-text search\n *\n * @param query - Text query\n * @param limit - Max results\n * @returns FTS results with timing\n */\n private async performFTSSearch(\n query: string,\n limit: number\n ): Promise<{ results: FTSResult[]; durationMs: number }> {\n const startTime = Date.now();\n\n if (!this.ftsProvider) {\n return { results: [], durationMs: Date.now() - startTime };\n }\n\n const results = await this.ftsProvider.search(query, limit);\n\n return {\n results,\n durationMs: Date.now() - startTime,\n };\n }\n\n /**\n * Merge vector and FTS results using weighted scoring\n *\n * @param vectorResults - Results from vector search\n * @param ftsResults - Results from FTS\n * @param vectorWeight - Weight for vector scores\n * @param ftsWeight - Weight for FTS scores\n * @returns Merged and ranked results\n */\n private mergeResults(\n vectorResults: SearchResult[],\n ftsResults: FTSResult[],\n vectorWeight: number,\n ftsWeight: number\n ): ExtendedHybridSearchResult[] {\n const combined = new Map<string, ExtendedHybridSearchResult>();\n\n // Normalize scores if configured\n const normalizedVector = this.config.normalizeScores\n ? this.normalizeScores(vectorResults.map((r) => ({ id: r.id, score: r.score })))\n : new Map(vectorResults.map((r) => [r.id, r.score]));\n\n const normalizedFTS = this.config.normalizeScores\n ? this.normalizeScores(\n ftsResults.map((r) => ({ id: r.id, score: r.score ?? 0.5 }))\n )\n : new Map(ftsResults.map((r) => [r.id, r.score ?? 0.5]));\n\n // Add vector results\n for (const result of vectorResults) {\n const vectorScore = normalizedVector.get(result.id) ?? 0;\n combined.set(result.id, {\n nodeId: result.id,\n content: (result.metadata?.content as string) ?? '',\n vectorScore,\n ftsScore: 0,\n combinedScore: vectorScore * vectorWeight,\n source: 'vector',\n rank: 0,\n metadata: result.metadata,\n });\n }\n\n // Merge FTS results\n for (const result of ftsResults) {\n const ftsScore = normalizedFTS.get(result.id) ?? 0;\n const existing = combined.get(result.id);\n\n if (existing) {\n // Result appears in both - apply hybrid boost\n existing.ftsScore = ftsScore;\n existing.combinedScore =\n (existing.vectorScore * vectorWeight + ftsScore * ftsWeight) *\n this.config.hybridBoost;\n existing.source = 'hybrid';\n existing.snippets = result.snippets;\n } else {\n // FTS-only result\n combined.set(result.id, {\n nodeId: result.id,\n content: result.content,\n vectorScore: 0,\n ftsScore,\n combinedScore: ftsScore * ftsWeight,\n source: 'fts',\n rank: 0,\n metadata: result.metadata,\n snippets: result.snippets,\n });\n }\n }\n\n // Sort by combined score and return\n return Array.from(combined.values()).sort(\n (a, b) => b.combinedScore - a.combinedScore\n );\n }\n\n /**\n * Normalize scores to 0-1 range\n *\n * @param items - Items with scores to normalize\n * @returns Map of id to normalized score\n */\n private normalizeScores(\n items: Array<{ id: string; score: number }>\n ): Map<string, number> {\n if (items.length === 0) {\n return new Map();\n }\n\n const scores = items.map((i) => i.score);\n const min = Math.min(...scores);\n const max = Math.max(...scores);\n const range = max - min;\n\n const result = new Map<string, number>();\n\n for (const item of items) {\n const normalized = range === 0 ? 1 : (item.score - min) / range;\n result.set(item.id, normalized);\n }\n\n return result;\n }\n\n /**\n * Update configuration\n *\n * @param config - Configuration updates\n */\n updateConfig(config: Partial<HybridSearchConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n *\n * @returns Copy of current configuration\n */\n getConfig(): HybridSearchConfig {\n return { ...this.config };\n }\n}\n\n/**\n * Create a hybrid search instance\n *\n * Factory function for creating hybrid search services.\n *\n * @param vectorStore - Vector store for similarity search\n * @param embeddingService - Service for generating query embeddings\n * @param config - Optional configuration overrides\n * @returns New HybridSearch instance\n */\nexport function createHybridSearch(\n vectorStore: EnhancedVectorStore,\n embeddingService: EmbeddingService,\n config?: Partial<HybridSearchConfig>\n): HybridSearch {\n return new HybridSearch(vectorStore, embeddingService, config);\n}\n"],"names":[],"mappings":";AAee,aAAa,eAAe;"}
|
|
@@ -5,9 +5,13 @@
|
|
|
5
5
|
* Includes:
|
|
6
6
|
* - Vector store for HNSW-based similarity search
|
|
7
7
|
* - Trajectory tracker for agent operation logging and self-learning
|
|
8
|
+
* - Embedding service for generating text embeddings
|
|
9
|
+
* - Hybrid search for combining vector and full-text search
|
|
8
10
|
*
|
|
9
11
|
* @module vector/services
|
|
10
12
|
*/
|
|
11
13
|
export { EnhancedVectorStore, createVectorStore } from './vector-store.js';
|
|
12
14
|
export { TrajectoryTracker, createTrajectoryTracker, type TrajectoryTrackerConfig, type DetectedPattern, } from './trajectory-tracker.js';
|
|
15
|
+
export { EmbeddingService, createEmbeddingService, getDefaultEmbeddingService, type EmbeddingConfig, type EmbeddingResult, type BatchEmbeddingResult, } from './embedding-service.js';
|
|
16
|
+
export { HybridSearch, createHybridSearch, type HybridSearchConfig, type FTSResult, type FTSProvider, type ExtendedHybridSearchResult, type HybridSearchQuery, type HybridSearchResponse, type SearchStats, } from './hybrid-search.js';
|
|
13
17
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vector/services/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vector/services/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,WAAW,GACjB,MAAM,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavelogic/knowledge-graph-agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "Knowledge graph agent for Claude Code - generates knowledge graphs, initializes docs, and integrates with claude-flow",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"@tanstack/react-query": "^5.62.0",
|
|
43
43
|
"@tanstack/react-table": "^8.20.0",
|
|
44
44
|
"@typescript-eslint/typescript-estree": "^8.51.0",
|
|
45
|
+
"@xenova/transformers": "^2.17.2",
|
|
45
46
|
"better-sqlite3": "^11.7.0",
|
|
46
47
|
"chalk": "^5.3.0",
|
|
47
48
|
"clsx": "^2.1.0",
|
|
@@ -99,5 +100,13 @@
|
|
|
99
100
|
},
|
|
100
101
|
"publishConfig": {
|
|
101
102
|
"access": "public"
|
|
103
|
+
},
|
|
104
|
+
"peerDependencies": {
|
|
105
|
+
"agentic-flow": "^1.10.0"
|
|
106
|
+
},
|
|
107
|
+
"peerDependenciesMeta": {
|
|
108
|
+
"agentic-flow": {
|
|
109
|
+
"optional": true
|
|
110
|
+
}
|
|
102
111
|
}
|
|
103
112
|
}
|