@mhalder/qdrant-mcp-server 1.3.1 → 1.4.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/CHANGELOG.md +7 -0
- package/README.md +68 -0
- package/build/index.js +71 -6
- package/build/index.js.map +1 -1
- package/build/prompts/index.d.ts +7 -0
- package/build/prompts/index.d.ts.map +1 -0
- package/build/prompts/index.js +7 -0
- package/build/prompts/index.js.map +1 -0
- package/build/prompts/index.test.d.ts +2 -0
- package/build/prompts/index.test.d.ts.map +1 -0
- package/build/prompts/index.test.js +25 -0
- package/build/prompts/index.test.js.map +1 -0
- package/build/prompts/loader.d.ts +25 -0
- package/build/prompts/loader.d.ts.map +1 -0
- package/build/prompts/loader.js +81 -0
- package/build/prompts/loader.js.map +1 -0
- package/build/prompts/loader.test.d.ts +2 -0
- package/build/prompts/loader.test.d.ts.map +1 -0
- package/build/prompts/loader.test.js +417 -0
- package/build/prompts/loader.test.js.map +1 -0
- package/build/prompts/template.d.ts +20 -0
- package/build/prompts/template.d.ts.map +1 -0
- package/build/prompts/template.js +52 -0
- package/build/prompts/template.js.map +1 -0
- package/build/prompts/template.test.d.ts +2 -0
- package/build/prompts/template.test.d.ts.map +1 -0
- package/build/prompts/template.test.js +163 -0
- package/build/prompts/template.test.js.map +1 -0
- package/build/prompts/types.d.ts +34 -0
- package/build/prompts/types.d.ts.map +1 -0
- package/build/prompts/types.js +5 -0
- package/build/prompts/types.js.map +1 -0
- package/package.json +1 -1
- package/prompts.example.json +96 -0
- package/src/index.ts +86 -5
- package/src/prompts/index.test.ts +29 -0
- package/src/prompts/index.ts +7 -0
- package/src/prompts/loader.test.ts +494 -0
- package/src/prompts/loader.ts +90 -0
- package/src/prompts/template.test.ts +212 -0
- package/src/prompts/template.ts +69 -0
- package/src/prompts/types.ts +37 -0
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { getPrompt, listPrompts, loadPromptsConfig } from "./loader.js";
|
|
6
|
+
describe("loadPromptsConfig", () => {
|
|
7
|
+
let testDir;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
// Create a temporary directory for test files
|
|
10
|
+
testDir = join(tmpdir(), `prompts-test-${Date.now()}`);
|
|
11
|
+
mkdirSync(testDir, { recursive: true });
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
// Clean up test directory
|
|
15
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
it("should load valid prompts configuration", () => {
|
|
18
|
+
const config = {
|
|
19
|
+
prompts: [
|
|
20
|
+
{
|
|
21
|
+
name: "test_prompt",
|
|
22
|
+
description: "A test prompt",
|
|
23
|
+
arguments: [
|
|
24
|
+
{
|
|
25
|
+
name: "arg1",
|
|
26
|
+
description: "First argument",
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
template: "Test {{arg1}}",
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
const filePath = join(testDir, "prompts.json");
|
|
35
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
36
|
+
const result = loadPromptsConfig(filePath);
|
|
37
|
+
expect(result).toEqual(config);
|
|
38
|
+
expect(result.prompts).toHaveLength(1);
|
|
39
|
+
expect(result.prompts[0].name).toBe("test_prompt");
|
|
40
|
+
});
|
|
41
|
+
it("should load configuration with multiple prompts", () => {
|
|
42
|
+
const config = {
|
|
43
|
+
prompts: [
|
|
44
|
+
{
|
|
45
|
+
name: "prompt1",
|
|
46
|
+
description: "First prompt",
|
|
47
|
+
arguments: [],
|
|
48
|
+
template: "Template 1",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "prompt2",
|
|
52
|
+
description: "Second prompt",
|
|
53
|
+
arguments: [],
|
|
54
|
+
template: "Template 2",
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
const filePath = join(testDir, "prompts.json");
|
|
59
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
60
|
+
const result = loadPromptsConfig(filePath);
|
|
61
|
+
expect(result.prompts).toHaveLength(2);
|
|
62
|
+
expect(result.prompts[0].name).toBe("prompt1");
|
|
63
|
+
expect(result.prompts[1].name).toBe("prompt2");
|
|
64
|
+
});
|
|
65
|
+
it("should load configuration with optional arguments", () => {
|
|
66
|
+
const config = {
|
|
67
|
+
prompts: [
|
|
68
|
+
{
|
|
69
|
+
name: "test_prompt",
|
|
70
|
+
description: "A test prompt",
|
|
71
|
+
arguments: [
|
|
72
|
+
{
|
|
73
|
+
name: "required_arg",
|
|
74
|
+
description: "Required argument",
|
|
75
|
+
required: true,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "optional_arg",
|
|
79
|
+
description: "Optional argument",
|
|
80
|
+
required: false,
|
|
81
|
+
default: "default_value",
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
template: "Test {{required_arg}} {{optional_arg}}",
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
const filePath = join(testDir, "prompts.json");
|
|
89
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
90
|
+
const result = loadPromptsConfig(filePath);
|
|
91
|
+
expect(result.prompts[0].arguments).toHaveLength(2);
|
|
92
|
+
expect(result.prompts[0].arguments[0].required).toBe(true);
|
|
93
|
+
expect(result.prompts[0].arguments[1].required).toBe(false);
|
|
94
|
+
expect(result.prompts[0].arguments[1].default).toBe("default_value");
|
|
95
|
+
});
|
|
96
|
+
it("should throw error for non-existent file", () => {
|
|
97
|
+
const filePath = join(testDir, "nonexistent.json");
|
|
98
|
+
expect(() => loadPromptsConfig(filePath)).toThrow();
|
|
99
|
+
});
|
|
100
|
+
it("should throw error for invalid JSON", () => {
|
|
101
|
+
const filePath = join(testDir, "invalid.json");
|
|
102
|
+
writeFileSync(filePath, "{ invalid json }");
|
|
103
|
+
expect(() => loadPromptsConfig(filePath)).toThrow();
|
|
104
|
+
});
|
|
105
|
+
it("should throw error for missing prompts array", () => {
|
|
106
|
+
const config = {};
|
|
107
|
+
const filePath = join(testDir, "missing-prompts.json");
|
|
108
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
109
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Invalid prompts configuration");
|
|
110
|
+
});
|
|
111
|
+
it("should throw error for empty prompt name", () => {
|
|
112
|
+
const config = {
|
|
113
|
+
prompts: [
|
|
114
|
+
{
|
|
115
|
+
name: "",
|
|
116
|
+
description: "Test",
|
|
117
|
+
arguments: [],
|
|
118
|
+
template: "Test",
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
const filePath = join(testDir, "empty-name.json");
|
|
123
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
124
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Invalid prompts configuration");
|
|
125
|
+
});
|
|
126
|
+
it("should throw error for invalid prompt name format", () => {
|
|
127
|
+
const config = {
|
|
128
|
+
prompts: [
|
|
129
|
+
{
|
|
130
|
+
name: "Invalid-Name",
|
|
131
|
+
description: "Test",
|
|
132
|
+
arguments: [],
|
|
133
|
+
template: "Test",
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
const filePath = join(testDir, "invalid-name.json");
|
|
138
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
139
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Invalid prompts configuration");
|
|
140
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("lowercase letters, numbers, and underscores");
|
|
141
|
+
});
|
|
142
|
+
it("should accept valid prompt name formats", () => {
|
|
143
|
+
const config = {
|
|
144
|
+
prompts: [
|
|
145
|
+
{
|
|
146
|
+
name: "valid_name_123",
|
|
147
|
+
description: "Test",
|
|
148
|
+
arguments: [],
|
|
149
|
+
template: "Test",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: "another_valid",
|
|
153
|
+
description: "Test",
|
|
154
|
+
arguments: [],
|
|
155
|
+
template: "Test",
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
const filePath = join(testDir, "valid-names.json");
|
|
160
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
161
|
+
expect(() => loadPromptsConfig(filePath)).not.toThrow();
|
|
162
|
+
});
|
|
163
|
+
it("should throw error for duplicate prompt names", () => {
|
|
164
|
+
const config = {
|
|
165
|
+
prompts: [
|
|
166
|
+
{
|
|
167
|
+
name: "test_prompt",
|
|
168
|
+
description: "First",
|
|
169
|
+
arguments: [],
|
|
170
|
+
template: "Test 1",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "test_prompt",
|
|
174
|
+
description: "Second",
|
|
175
|
+
arguments: [],
|
|
176
|
+
template: "Test 2",
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
const filePath = join(testDir, "duplicate-names.json");
|
|
181
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
182
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Duplicate prompt name: test_prompt");
|
|
183
|
+
});
|
|
184
|
+
it("should throw error for duplicate argument names within a prompt", () => {
|
|
185
|
+
const config = {
|
|
186
|
+
prompts: [
|
|
187
|
+
{
|
|
188
|
+
name: "test_prompt",
|
|
189
|
+
description: "Test",
|
|
190
|
+
arguments: [
|
|
191
|
+
{
|
|
192
|
+
name: "arg1",
|
|
193
|
+
description: "First",
|
|
194
|
+
required: true,
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: "arg1",
|
|
198
|
+
description: "Second",
|
|
199
|
+
required: true,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
template: "Test",
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
const filePath = join(testDir, "duplicate-args.json");
|
|
207
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
208
|
+
expect(() => loadPromptsConfig(filePath)).toThrow('Duplicate argument name in prompt "test_prompt": arg1');
|
|
209
|
+
});
|
|
210
|
+
it("should allow same argument name in different prompts", () => {
|
|
211
|
+
const config = {
|
|
212
|
+
prompts: [
|
|
213
|
+
{
|
|
214
|
+
name: "prompt1",
|
|
215
|
+
description: "First",
|
|
216
|
+
arguments: [
|
|
217
|
+
{
|
|
218
|
+
name: "collection",
|
|
219
|
+
description: "Collection name",
|
|
220
|
+
required: true,
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
template: "Test 1",
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: "prompt2",
|
|
227
|
+
description: "Second",
|
|
228
|
+
arguments: [
|
|
229
|
+
{
|
|
230
|
+
name: "collection",
|
|
231
|
+
description: "Collection name",
|
|
232
|
+
required: true,
|
|
233
|
+
},
|
|
234
|
+
],
|
|
235
|
+
template: "Test 2",
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
};
|
|
239
|
+
const filePath = join(testDir, "same-args.json");
|
|
240
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
241
|
+
expect(() => loadPromptsConfig(filePath)).not.toThrow();
|
|
242
|
+
});
|
|
243
|
+
it("should throw error for missing argument name", () => {
|
|
244
|
+
const config = {
|
|
245
|
+
prompts: [
|
|
246
|
+
{
|
|
247
|
+
name: "test_prompt",
|
|
248
|
+
description: "Test",
|
|
249
|
+
arguments: [
|
|
250
|
+
{
|
|
251
|
+
name: "",
|
|
252
|
+
description: "Test",
|
|
253
|
+
required: true,
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
template: "Test",
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
};
|
|
260
|
+
const filePath = join(testDir, "empty-arg-name.json");
|
|
261
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
262
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Invalid prompts configuration");
|
|
263
|
+
});
|
|
264
|
+
it("should throw error for missing argument description", () => {
|
|
265
|
+
const config = {
|
|
266
|
+
prompts: [
|
|
267
|
+
{
|
|
268
|
+
name: "test_prompt",
|
|
269
|
+
description: "Test",
|
|
270
|
+
arguments: [
|
|
271
|
+
{
|
|
272
|
+
name: "arg1",
|
|
273
|
+
description: "",
|
|
274
|
+
required: true,
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
template: "Test",
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
};
|
|
281
|
+
const filePath = join(testDir, "empty-arg-description.json");
|
|
282
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
283
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Invalid prompts configuration");
|
|
284
|
+
});
|
|
285
|
+
it("should throw error for missing template", () => {
|
|
286
|
+
const config = {
|
|
287
|
+
prompts: [
|
|
288
|
+
{
|
|
289
|
+
name: "test_prompt",
|
|
290
|
+
description: "Test",
|
|
291
|
+
arguments: [],
|
|
292
|
+
template: "",
|
|
293
|
+
},
|
|
294
|
+
],
|
|
295
|
+
};
|
|
296
|
+
const filePath = join(testDir, "empty-template.json");
|
|
297
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
298
|
+
expect(() => loadPromptsConfig(filePath)).toThrow("Invalid prompts configuration");
|
|
299
|
+
});
|
|
300
|
+
it("should load empty prompts array", () => {
|
|
301
|
+
const config = {
|
|
302
|
+
prompts: [],
|
|
303
|
+
};
|
|
304
|
+
const filePath = join(testDir, "empty-prompts.json");
|
|
305
|
+
writeFileSync(filePath, JSON.stringify(config, null, 2));
|
|
306
|
+
const result = loadPromptsConfig(filePath);
|
|
307
|
+
expect(result.prompts).toHaveLength(0);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
describe("getPrompt", () => {
|
|
311
|
+
it("should return prompt by name", () => {
|
|
312
|
+
const config = {
|
|
313
|
+
prompts: [
|
|
314
|
+
{
|
|
315
|
+
name: "test_prompt",
|
|
316
|
+
description: "A test prompt",
|
|
317
|
+
arguments: [],
|
|
318
|
+
template: "Test template",
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: "another_prompt",
|
|
322
|
+
description: "Another prompt",
|
|
323
|
+
arguments: [],
|
|
324
|
+
template: "Another template",
|
|
325
|
+
},
|
|
326
|
+
],
|
|
327
|
+
};
|
|
328
|
+
const result = getPrompt(config, "test_prompt");
|
|
329
|
+
expect(result).toBeDefined();
|
|
330
|
+
expect(result?.name).toBe("test_prompt");
|
|
331
|
+
expect(result?.template).toBe("Test template");
|
|
332
|
+
});
|
|
333
|
+
it("should return undefined for non-existent prompt", () => {
|
|
334
|
+
const config = {
|
|
335
|
+
prompts: [
|
|
336
|
+
{
|
|
337
|
+
name: "test_prompt",
|
|
338
|
+
description: "A test prompt",
|
|
339
|
+
arguments: [],
|
|
340
|
+
template: "Test template",
|
|
341
|
+
},
|
|
342
|
+
],
|
|
343
|
+
};
|
|
344
|
+
const result = getPrompt(config, "nonexistent");
|
|
345
|
+
expect(result).toBeUndefined();
|
|
346
|
+
});
|
|
347
|
+
it("should return undefined for empty config", () => {
|
|
348
|
+
const config = {
|
|
349
|
+
prompts: [],
|
|
350
|
+
};
|
|
351
|
+
const result = getPrompt(config, "test_prompt");
|
|
352
|
+
expect(result).toBeUndefined();
|
|
353
|
+
});
|
|
354
|
+
it("should find prompt case-sensitively", () => {
|
|
355
|
+
const config = {
|
|
356
|
+
prompts: [
|
|
357
|
+
{
|
|
358
|
+
name: "test_prompt",
|
|
359
|
+
description: "A test prompt",
|
|
360
|
+
arguments: [],
|
|
361
|
+
template: "Test template",
|
|
362
|
+
},
|
|
363
|
+
],
|
|
364
|
+
};
|
|
365
|
+
const result1 = getPrompt(config, "test_prompt");
|
|
366
|
+
const result2 = getPrompt(config, "TEST_PROMPT");
|
|
367
|
+
expect(result1).toBeDefined();
|
|
368
|
+
expect(result2).toBeUndefined();
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
describe("listPrompts", () => {
|
|
372
|
+
it("should return all prompts", () => {
|
|
373
|
+
const config = {
|
|
374
|
+
prompts: [
|
|
375
|
+
{
|
|
376
|
+
name: "prompt1",
|
|
377
|
+
description: "First prompt",
|
|
378
|
+
arguments: [],
|
|
379
|
+
template: "Template 1",
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
name: "prompt2",
|
|
383
|
+
description: "Second prompt",
|
|
384
|
+
arguments: [],
|
|
385
|
+
template: "Template 2",
|
|
386
|
+
},
|
|
387
|
+
],
|
|
388
|
+
};
|
|
389
|
+
const result = listPrompts(config);
|
|
390
|
+
expect(result).toHaveLength(2);
|
|
391
|
+
expect(result[0].name).toBe("prompt1");
|
|
392
|
+
expect(result[1].name).toBe("prompt2");
|
|
393
|
+
});
|
|
394
|
+
it("should return empty array for empty config", () => {
|
|
395
|
+
const config = {
|
|
396
|
+
prompts: [],
|
|
397
|
+
};
|
|
398
|
+
const result = listPrompts(config);
|
|
399
|
+
expect(result).toHaveLength(0);
|
|
400
|
+
});
|
|
401
|
+
it("should return copy of prompts array", () => {
|
|
402
|
+
const config = {
|
|
403
|
+
prompts: [
|
|
404
|
+
{
|
|
405
|
+
name: "test_prompt",
|
|
406
|
+
description: "A test prompt",
|
|
407
|
+
arguments: [],
|
|
408
|
+
template: "Test template",
|
|
409
|
+
},
|
|
410
|
+
],
|
|
411
|
+
};
|
|
412
|
+
const result = listPrompts(config);
|
|
413
|
+
// Should return the same array reference (direct access)
|
|
414
|
+
expect(result).toBe(config.prompts);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
//# sourceMappingURL=loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/prompts/loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple template rendering engine for prompts
|
|
3
|
+
*/
|
|
4
|
+
import type { PromptArgument, RenderedPrompt } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Render a template string by replacing {{variable}} placeholders with actual values
|
|
7
|
+
* @param template Template string with {{variable}} placeholders
|
|
8
|
+
* @param args Record of argument values
|
|
9
|
+
* @param definitions Argument definitions with defaults
|
|
10
|
+
* @returns Rendered template
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderTemplate(template: string, args?: Record<string, string>, definitions?: PromptArgument[]): RenderedPrompt;
|
|
13
|
+
/**
|
|
14
|
+
* Validate that all required arguments are provided
|
|
15
|
+
* @param args Provided arguments
|
|
16
|
+
* @param definitions Argument definitions
|
|
17
|
+
* @throws Error if required arguments are missing
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateArguments(args: Record<string, string>, definitions: PromptArgument[]): void;
|
|
20
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/prompts/template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACjC,WAAW,GAAE,cAAc,EAAO,GACjC,cAAc,CA4BhB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,EAAE,cAAc,EAAE,GAC5B,IAAI,CAYN"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple template rendering engine for prompts
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Render a template string by replacing {{variable}} placeholders with actual values
|
|
6
|
+
* @param template Template string with {{variable}} placeholders
|
|
7
|
+
* @param args Record of argument values
|
|
8
|
+
* @param definitions Argument definitions with defaults
|
|
9
|
+
* @returns Rendered template
|
|
10
|
+
*/
|
|
11
|
+
export function renderTemplate(template, args = {}, definitions = []) {
|
|
12
|
+
let rendered = template;
|
|
13
|
+
// Create a map of defaults
|
|
14
|
+
const defaults = new Map();
|
|
15
|
+
for (const def of definitions) {
|
|
16
|
+
if (def.default !== undefined) {
|
|
17
|
+
defaults.set(def.name, def.default);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// Replace all {{variable}} placeholders
|
|
21
|
+
rendered = rendered.replace(/\{\{(\w+)\}\}/g, (match, varName) => {
|
|
22
|
+
// Check if value is provided in args
|
|
23
|
+
if (args[varName] !== undefined) {
|
|
24
|
+
return args[varName];
|
|
25
|
+
}
|
|
26
|
+
// Check if there's a default value
|
|
27
|
+
if (defaults.has(varName)) {
|
|
28
|
+
return defaults.get(varName);
|
|
29
|
+
}
|
|
30
|
+
// If no value and no default, keep the placeholder
|
|
31
|
+
return match;
|
|
32
|
+
});
|
|
33
|
+
return { text: rendered };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate that all required arguments are provided
|
|
37
|
+
* @param args Provided arguments
|
|
38
|
+
* @param definitions Argument definitions
|
|
39
|
+
* @throws Error if required arguments are missing
|
|
40
|
+
*/
|
|
41
|
+
export function validateArguments(args, definitions) {
|
|
42
|
+
const missing = [];
|
|
43
|
+
for (const def of definitions) {
|
|
44
|
+
if (def.required && (args[def.name] === undefined || args[def.name] === "")) {
|
|
45
|
+
missing.push(def.name);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (missing.length > 0) {
|
|
49
|
+
throw new Error(`Missing required arguments: ${missing.join(", ")}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/prompts/template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,OAA+B,EAAE,EACjC,cAAgC,EAAE;IAElC,IAAI,QAAQ,GAAG,QAAQ,CAAC;IAExB,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/D,qCAAqC;QACrC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,mCAAmC;QACnC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAChC,CAAC;QAED,mDAAmD;QACnD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAA4B,EAC5B,WAA6B;IAE7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.test.d.ts","sourceRoot":"","sources":["../../src/prompts/template.test.ts"],"names":[],"mappings":""}
|