@baselineos/protocol-core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +14 -0
- package/.turbo/turbo-test.log +15 -0
- package/CHANGELOG.md +49 -0
- package/LICENSE +17 -0
- package/README.md +18 -0
- package/dist/index.d.ts +1322 -0
- package/dist/index.js +2653 -0
- package/package.json +31 -0
- package/src/__tests__/functional.test.ts +269 -0
- package/src/__tests__/smoke.test.ts +23 -0
- package/src/chromadb.d.ts +9 -0
- package/src/index.ts +117 -0
- package/src/knowledge/knowledge-graph.ts +1441 -0
- package/src/knowledge/vector-store.ts +722 -0
- package/src/lang/lang.ts +278 -0
- package/src/lexicon/lexicon.ts +414 -0
- package/src/parser/grammar.ts +240 -0
- package/src/parser/parser.ts +420 -0
- package/src/types/index.ts +799 -0
- package/tsconfig.json +9 -0
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@baselineos/protocol-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Baseline Protocol™ — Open-source AI governance specification",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"tsup": "^8.0.0",
|
|
17
|
+
"typescript": "^5.7.0",
|
|
18
|
+
"vitest": "^2.1.0"
|
|
19
|
+
},
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup src/index.ts --format esm --dts",
|
|
25
|
+
"dev": "tsup src/index.ts --format esm --dts --watch",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"lint": "eslint src/",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"clean": "rm -rf dist"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional tests for @baselineos/protocol-core v1.0
|
|
3
|
+
* Tests actual behavior of lang, parser, lexicon, and grammar validator.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
6
|
+
import {
|
|
7
|
+
BaselineLangCore,
|
|
8
|
+
BaselineLang,
|
|
9
|
+
BaselineParser,
|
|
10
|
+
BaselineLexicon,
|
|
11
|
+
GrammarValidator,
|
|
12
|
+
baselineGrammar,
|
|
13
|
+
baselineGrammarRules,
|
|
14
|
+
KnowledgeGraphEngine,
|
|
15
|
+
ChromaVectorStore,
|
|
16
|
+
} from '../index.js';
|
|
17
|
+
|
|
18
|
+
// ─── BaselineLangCore ────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
describe('BaselineLangCore', () => {
|
|
21
|
+
it('initializes all subsystems', async () => {
|
|
22
|
+
const core = new BaselineLangCore();
|
|
23
|
+
await core.initialize();
|
|
24
|
+
|
|
25
|
+
expect(core.getLang()).toBeInstanceOf(BaselineLang);
|
|
26
|
+
expect(core.getParser()).toBeInstanceOf(BaselineParser);
|
|
27
|
+
expect(core.getLexicon()).toBeInstanceOf(BaselineLexicon);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// ─── BaselineParser ──────────────────────────────────────────────────────────
|
|
32
|
+
|
|
33
|
+
describe('BaselineParser', () => {
|
|
34
|
+
let parser: BaselineParser;
|
|
35
|
+
|
|
36
|
+
beforeEach(async () => {
|
|
37
|
+
parser = new BaselineParser();
|
|
38
|
+
await parser.initialize();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('tokenizes identifiers', () => {
|
|
42
|
+
const tokens = parser.tokenize('hello world');
|
|
43
|
+
expect(tokens.length).toBeGreaterThanOrEqual(2);
|
|
44
|
+
expect(tokens.some(t => t.type === 'IDENTIFIER')).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('tokenizes strings', () => {
|
|
48
|
+
const tokens = parser.tokenize('"hello world"');
|
|
49
|
+
expect(tokens.some(t => t.type === 'STRING')).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('tokenizes numbers', () => {
|
|
53
|
+
const tokens = parser.tokenize('42 3.14');
|
|
54
|
+
expect(tokens.filter(t => t.type === 'NUMBER')).toHaveLength(2);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('includes EOF token', () => {
|
|
58
|
+
const tokens = parser.tokenize('test');
|
|
59
|
+
expect(tokens[tokens.length - 1]?.type).toBe('EOF');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('parses a simple program', async () => {
|
|
63
|
+
const program = await parser.parse('lang { name: "test" }');
|
|
64
|
+
expect(program).toBeDefined();
|
|
65
|
+
expect(program.blocks).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('parses empty input', async () => {
|
|
69
|
+
const program = await parser.parse('');
|
|
70
|
+
expect(program).toBeDefined();
|
|
71
|
+
expect(program.blocks).toHaveLength(0);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// ─── BaselineLexicon ─────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
describe('BaselineLexicon', () => {
|
|
78
|
+
let lexicon: BaselineLexicon;
|
|
79
|
+
|
|
80
|
+
beforeEach(async () => {
|
|
81
|
+
lexicon = new BaselineLexicon();
|
|
82
|
+
await lexicon.initialize();
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('loads default domain packs', () => {
|
|
86
|
+
const domains = lexicon.listDomains();
|
|
87
|
+
expect(domains.length).toBeGreaterThan(0);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('retrieves a domain by name', () => {
|
|
91
|
+
const domains = lexicon.listDomains();
|
|
92
|
+
if (domains.length > 0) {
|
|
93
|
+
const name = domains[0]!.name;
|
|
94
|
+
const domain = lexicon.getDomain(name);
|
|
95
|
+
expect(domain).toBeDefined();
|
|
96
|
+
expect(domain?.name).toBe(name);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('adds a custom domain', () => {
|
|
101
|
+
const countBefore = lexicon.listDomains().length;
|
|
102
|
+
lexicon.addDomain({
|
|
103
|
+
name: 'test-domain',
|
|
104
|
+
description: 'Test domain for v1.0 tests',
|
|
105
|
+
version: '1.0.0',
|
|
106
|
+
terms: [],
|
|
107
|
+
});
|
|
108
|
+
expect(lexicon.listDomains().length).toBe(countBefore + 1);
|
|
109
|
+
expect(lexicon.getDomain('test-domain')).toBeDefined();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('adds and retrieves vocabulary', () => {
|
|
113
|
+
lexicon.addDomain({ name: 'vocab-test', description: 'Test', version: '1.0.0', terms: [] });
|
|
114
|
+
lexicon.addVocabulary('vocab-test', {
|
|
115
|
+
domain: 'vocab-test',
|
|
116
|
+
terms: [{ term: 'governance', definition: 'Rules and controls' }],
|
|
117
|
+
});
|
|
118
|
+
const vocab = lexicon.getVocabulary('vocab-test');
|
|
119
|
+
expect(vocab).toBeDefined();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('adds and retrieves templates', () => {
|
|
123
|
+
lexicon.addTemplate({
|
|
124
|
+
name: 'test-template',
|
|
125
|
+
description: 'A test template',
|
|
126
|
+
template: 'Hello {{name}}',
|
|
127
|
+
variables: [{ name: 'name', type: 'string', description: 'Name' }],
|
|
128
|
+
});
|
|
129
|
+
expect(lexicon.getTemplate('test-template')).toBeDefined();
|
|
130
|
+
expect(lexicon.listTemplates().some(t => t.name === 'test-template')).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('adds and retrieves patterns', () => {
|
|
134
|
+
lexicon.addPattern({
|
|
135
|
+
name: 'test-pattern',
|
|
136
|
+
description: 'A test pattern',
|
|
137
|
+
pattern: /test/,
|
|
138
|
+
examples: ['test input'],
|
|
139
|
+
});
|
|
140
|
+
expect(lexicon.getPattern('test-pattern')).toBeDefined();
|
|
141
|
+
expect(lexicon.listPatterns().some(p => p.name === 'test-pattern')).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('searches vocabulary', () => {
|
|
145
|
+
const results = lexicon.searchVocabulary('governance');
|
|
146
|
+
expect(Array.isArray(results)).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('returns lexicon stats', () => {
|
|
150
|
+
const stats = lexicon.getLexiconStats();
|
|
151
|
+
expect(stats.totalDomains).toBeGreaterThanOrEqual(0);
|
|
152
|
+
expect(typeof stats.totalTerms).toBe('number');
|
|
153
|
+
expect(typeof stats.totalTemplates).toBe('number');
|
|
154
|
+
expect(typeof stats.totalPatterns).toBe('number');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
// ─── BaselineLang ────────────────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
describe('BaselineLang', () => {
|
|
161
|
+
let lang: BaselineLang;
|
|
162
|
+
|
|
163
|
+
beforeEach(async () => {
|
|
164
|
+
const core = new BaselineLangCore();
|
|
165
|
+
await core.initialize();
|
|
166
|
+
lang = core.getLang();
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('generates from template', async () => {
|
|
170
|
+
const result = await lang.generateFromTemplate('Hello {{name}}!', { name: 'Baseline' });
|
|
171
|
+
expect(result).toContain('Baseline');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('returns language stats', async () => {
|
|
175
|
+
const stats = await lang.getLanguageStats();
|
|
176
|
+
expect(stats).toBeDefined();
|
|
177
|
+
expect(typeof stats.lexiconSize).toBe('number');
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('validates a parsed program', async () => {
|
|
181
|
+
const parser = new BaselineParser();
|
|
182
|
+
const program = await parser.parse('');
|
|
183
|
+
const result = await lang.validate(program);
|
|
184
|
+
expect(result).toBeDefined();
|
|
185
|
+
expect(Array.isArray(result.errors)).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// ─── GrammarValidator ────────────────────────────────────────────────────────
|
|
190
|
+
|
|
191
|
+
describe('GrammarValidator', () => {
|
|
192
|
+
it('validates balanced brackets', () => {
|
|
193
|
+
expect(GrammarValidator.validateRule('(a / b) c')).toBe(true);
|
|
194
|
+
expect(GrammarValidator.validateRule('(a (b c)')).toBe(false);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('validates balanced braces', () => {
|
|
198
|
+
expect(GrammarValidator.validateRule('{ a }')).toBe(true);
|
|
199
|
+
expect(GrammarValidator.validateRule('{ a')).toBe(false);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('extracts referenced rules', () => {
|
|
203
|
+
const refs = GrammarValidator.extractReferencedRules('Program = lang frame core');
|
|
204
|
+
expect(Array.isArray(refs)).toBe(true);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('generates grammar summary', () => {
|
|
208
|
+
const summary = GrammarValidator.generateSummary(baselineGrammarRules);
|
|
209
|
+
expect(summary.totalRules).toBeGreaterThan(0);
|
|
210
|
+
expect(summary.validationStatus).toBeDefined();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('grammar has substantial rules', () => {
|
|
214
|
+
const ruleCount = Object.keys(baselineGrammarRules).length;
|
|
215
|
+
expect(ruleCount).toBeGreaterThanOrEqual(10);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('grammar rules record is populated', () => {
|
|
219
|
+
expect(Object.keys(baselineGrammarRules).length).toBeGreaterThan(0);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// ─── KnowledgeGraphEngine ────────────────────────────────────────────────────
|
|
224
|
+
|
|
225
|
+
describe('KnowledgeGraphEngine', () => {
|
|
226
|
+
it('creates and retrieves nodes', () => {
|
|
227
|
+
const engine = new KnowledgeGraphEngine();
|
|
228
|
+
engine.createNode({
|
|
229
|
+
id: 'node-1',
|
|
230
|
+
type: 'concept',
|
|
231
|
+
name: 'Governance',
|
|
232
|
+
properties: { domain: 'baseline' },
|
|
233
|
+
});
|
|
234
|
+
const node = engine.getNode('node-1');
|
|
235
|
+
expect(node).toBeDefined();
|
|
236
|
+
expect(node?.name).toBe('Governance');
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('creates relationships between nodes', () => {
|
|
240
|
+
const engine = new KnowledgeGraphEngine();
|
|
241
|
+
engine.createNode({ id: 'a', type: 'concept', name: 'A', properties: {} });
|
|
242
|
+
engine.createNode({ id: 'b', type: 'concept', name: 'B', properties: {} });
|
|
243
|
+
engine.createRelationship({
|
|
244
|
+
id: 'rel-1',
|
|
245
|
+
from: 'a',
|
|
246
|
+
to: 'b',
|
|
247
|
+
type: 'relates_to',
|
|
248
|
+
properties: {},
|
|
249
|
+
});
|
|
250
|
+
const rels = engine.getAllRelationships();
|
|
251
|
+
expect(rels.length).toBeGreaterThanOrEqual(1);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// ─── ChromaVectorStore ───────────────────────────────────────────────────────
|
|
256
|
+
|
|
257
|
+
describe('ChromaVectorStore', () => {
|
|
258
|
+
it('reports not ready before initialization', () => {
|
|
259
|
+
const store = new ChromaVectorStore();
|
|
260
|
+
expect(store.isReady()).toBe(false);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('returns metrics', () => {
|
|
264
|
+
const store = new ChromaVectorStore();
|
|
265
|
+
const metrics = store.getMetrics();
|
|
266
|
+
expect(metrics).toBeDefined();
|
|
267
|
+
expect(typeof metrics.totalDocuments).toBe('number');
|
|
268
|
+
});
|
|
269
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { BaselineLangCore, KnowledgeGraphEngine, ChromaVectorStore } from '../index.js';
|
|
3
|
+
|
|
4
|
+
describe('protocol-core', () => {
|
|
5
|
+
it('should instantiate BaselineLangCore', () => {
|
|
6
|
+
const core = new BaselineLangCore();
|
|
7
|
+
expect(core).toBeDefined();
|
|
8
|
+
expect(core.getLang()).toBeDefined();
|
|
9
|
+
expect(core.getParser()).toBeDefined();
|
|
10
|
+
expect(core.getLexicon()).toBeDefined();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should instantiate KnowledgeGraphEngine', () => {
|
|
14
|
+
const engine = new KnowledgeGraphEngine();
|
|
15
|
+
expect(engine).toBeDefined();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should instantiate ChromaVectorStore', () => {
|
|
19
|
+
const store = new ChromaVectorStore();
|
|
20
|
+
expect(store).toBeDefined();
|
|
21
|
+
expect(store.isReady()).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// chromadb is an optional peer dependency loaded via dynamic import().
|
|
2
|
+
// This declaration satisfies the TypeScript compiler (TS2307).
|
|
3
|
+
// The runtime code casts everything to `unknown` anyway.
|
|
4
|
+
declare module 'chromadb' {
|
|
5
|
+
export class ChromaClient {
|
|
6
|
+
constructor(config?: Record<string, unknown>);
|
|
7
|
+
getOrCreateCollection(options: Record<string, unknown>): Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseline Lang -- Main Entry Point
|
|
3
|
+
* The Language & Expression Layer of Baseline Stack
|
|
4
|
+
*
|
|
5
|
+
* @license Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { BaselineLang } from './lang/lang.js';
|
|
9
|
+
import { BaselineParser } from './parser/parser.js';
|
|
10
|
+
import { BaselineLexicon } from './lexicon/lexicon.js';
|
|
11
|
+
|
|
12
|
+
// ─── Core Orchestrator ──────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
export class BaselineLangCore {
|
|
15
|
+
private lexicon: BaselineLexicon;
|
|
16
|
+
private parser: BaselineParser;
|
|
17
|
+
private lang: BaselineLang;
|
|
18
|
+
|
|
19
|
+
constructor() {
|
|
20
|
+
this.lexicon = new BaselineLexicon();
|
|
21
|
+
this.parser = new BaselineParser();
|
|
22
|
+
this.lang = new BaselineLang(this.parser, this.lexicon);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async initialize(): Promise<void> {
|
|
26
|
+
await this.lexicon.initialize();
|
|
27
|
+
await this.parser.initialize();
|
|
28
|
+
await this.lang.initialize();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
getLang(): BaselineLang {
|
|
32
|
+
return this.lang;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getParser(): BaselineParser {
|
|
36
|
+
return this.parser;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getLexicon(): BaselineLexicon {
|
|
40
|
+
return this.lexicon;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ─── Exports ────────────────────────────────────────────────────────
|
|
45
|
+
|
|
46
|
+
// Classes
|
|
47
|
+
export { BaselineLang } from './lang/lang.js';
|
|
48
|
+
export { BaselineParser } from './parser/parser.js';
|
|
49
|
+
export { BaselineLexicon } from './lexicon/lexicon.js';
|
|
50
|
+
|
|
51
|
+
// Types
|
|
52
|
+
export type * from './types/index.js';
|
|
53
|
+
|
|
54
|
+
// Grammar
|
|
55
|
+
export { baselineGrammarRules, baselineGrammar, GrammarValidator } from './parser/grammar.js';
|
|
56
|
+
|
|
57
|
+
// Lang types
|
|
58
|
+
export type {
|
|
59
|
+
ValidationResult,
|
|
60
|
+
ExecutionResult,
|
|
61
|
+
IntermediateRepresentation,
|
|
62
|
+
LanguageStats,
|
|
63
|
+
} from './lang/lang.js';
|
|
64
|
+
|
|
65
|
+
// Parser types
|
|
66
|
+
export type {
|
|
67
|
+
Token,
|
|
68
|
+
TokenType,
|
|
69
|
+
ParsedBlock,
|
|
70
|
+
LangBlockContent,
|
|
71
|
+
FrameBlockContent,
|
|
72
|
+
CoreBlockContent,
|
|
73
|
+
} from './parser/parser.js';
|
|
74
|
+
|
|
75
|
+
// Lexicon types
|
|
76
|
+
export type {
|
|
77
|
+
LexiconDomain,
|
|
78
|
+
LexiconTerm,
|
|
79
|
+
LexiconVocabulary,
|
|
80
|
+
LexiconDefinition,
|
|
81
|
+
LexiconTemplate,
|
|
82
|
+
LexiconVariable,
|
|
83
|
+
LexiconPattern,
|
|
84
|
+
SearchResult,
|
|
85
|
+
LexiconStats,
|
|
86
|
+
} from './lexicon/lexicon.js';
|
|
87
|
+
|
|
88
|
+
// Knowledge Graph
|
|
89
|
+
export { KnowledgeGraphEngine } from './knowledge/knowledge-graph.js';
|
|
90
|
+
|
|
91
|
+
export type {
|
|
92
|
+
KnowledgeNode,
|
|
93
|
+
KnowledgeRelationship,
|
|
94
|
+
KnowledgeAgent,
|
|
95
|
+
ReasoningEngine,
|
|
96
|
+
KnowledgeChain,
|
|
97
|
+
ChainStep,
|
|
98
|
+
ChainExecution,
|
|
99
|
+
KnowledgeTool,
|
|
100
|
+
QueryResult,
|
|
101
|
+
KnowledgeGraphConfig,
|
|
102
|
+
KnowledgeGraphMetrics,
|
|
103
|
+
} from './knowledge/knowledge-graph.js';
|
|
104
|
+
|
|
105
|
+
// Vector Store
|
|
106
|
+
export { ChromaVectorStore } from './knowledge/vector-store.js';
|
|
107
|
+
|
|
108
|
+
export type {
|
|
109
|
+
VectorStoreConfig,
|
|
110
|
+
VectorStoreMetrics,
|
|
111
|
+
DocumentInput,
|
|
112
|
+
VectorQueryResult,
|
|
113
|
+
VectorQueryOptions,
|
|
114
|
+
FilterSearchOptions,
|
|
115
|
+
BatchOperation,
|
|
116
|
+
CollectionStats,
|
|
117
|
+
} from './knowledge/vector-store.js';
|