@hazeljs/prompts 0.2.0-beta.64
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 +192 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +255 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/stores/file.store.test.d.ts +2 -0
- package/dist/__tests__/stores/file.store.test.d.ts.map +1 -0
- package/dist/__tests__/stores/file.store.test.js +134 -0
- package/dist/__tests__/stores/file.store.test.js.map +1 -0
- package/dist/__tests__/stores/memory.store.test.d.ts +2 -0
- package/dist/__tests__/stores/memory.store.test.d.ts.map +1 -0
- package/dist/__tests__/stores/memory.store.test.js +74 -0
- package/dist/__tests__/stores/memory.store.test.js.map +1 -0
- package/dist/__tests__/stores/multi.store.test.d.ts +2 -0
- package/dist/__tests__/stores/multi.store.test.d.ts.map +1 -0
- package/dist/__tests__/stores/multi.store.test.js +81 -0
- package/dist/__tests__/stores/multi.store.test.js.map +1 -0
- package/dist/__tests__/template.test.d.ts +2 -0
- package/dist/__tests__/template.test.d.ts.map +1 -0
- package/dist/__tests__/template.test.js +60 -0
- package/dist/__tests__/template.test.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +153 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +288 -0
- package/dist/registry.js.map +1 -0
- package/dist/stores/database.store.d.ts +93 -0
- package/dist/stores/database.store.d.ts.map +1 -0
- package/dist/stores/database.store.js +46 -0
- package/dist/stores/database.store.js.map +1 -0
- package/dist/stores/file.store.d.ts +49 -0
- package/dist/stores/file.store.d.ts.map +1 -0
- package/dist/stores/file.store.js +105 -0
- package/dist/stores/file.store.js.map +1 -0
- package/dist/stores/index.d.ts +10 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +14 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/memory.store.d.ts +21 -0
- package/dist/stores/memory.store.d.ts.map +1 -0
- package/dist/stores/memory.store.js +63 -0
- package/dist/stores/memory.store.js.map +1 -0
- package/dist/stores/multi.store.d.ts +44 -0
- package/dist/stores/multi.store.d.ts.map +1 -0
- package/dist/stores/multi.store.js +68 -0
- package/dist/stores/multi.store.js.map +1 -0
- package/dist/stores/redis.store.d.ts +65 -0
- package/dist/stores/redis.store.d.ts.map +1 -0
- package/dist/stores/redis.store.js +81 -0
- package/dist/stores/redis.store.js.map +1 -0
- package/dist/stores/store.interface.d.ts +62 -0
- package/dist/stores/store.interface.d.ts.map +1 -0
- package/dist/stores/store.interface.js +3 -0
- package/dist/stores/store.interface.js.map +1 -0
- package/dist/template.d.ts +38 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +46 -0
- package/dist/template.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PromptEntry, PromptStore } from './store.interface';
|
|
2
|
+
/**
|
|
3
|
+
* MemoryStore
|
|
4
|
+
*
|
|
5
|
+
* Stores all prompt entries in a plain `Map` keyed by `"key@version"`.
|
|
6
|
+
* This is the default store when no external backend is configured.
|
|
7
|
+
* Entries are lost when the process exits.
|
|
8
|
+
*/
|
|
9
|
+
export declare class MemoryStore implements PromptStore {
|
|
10
|
+
readonly name = "memory";
|
|
11
|
+
/** Keyed by `"key@version"` — e.g. `"rag:graph:entity-extraction@1.0.0"`. */
|
|
12
|
+
private readonly data;
|
|
13
|
+
private compoundKey;
|
|
14
|
+
get(key: string, version?: string): Promise<PromptEntry | undefined>;
|
|
15
|
+
set(entry: PromptEntry): Promise<void>;
|
|
16
|
+
delete(key: string, version?: string): Promise<void>;
|
|
17
|
+
has(key: string, version?: string): Promise<boolean>;
|
|
18
|
+
keys(): Promise<string[]>;
|
|
19
|
+
versions(key: string): Promise<string[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=memory.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.store.d.ts","sourceRoot":"","sources":["../../src/stores/memory.store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,YAAY;IAEzB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkC;IAEvD,OAAO,CAAC,WAAW;IAIb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAItE,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAStC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAQ/C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoryStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* MemoryStore
|
|
6
|
+
*
|
|
7
|
+
* Stores all prompt entries in a plain `Map` keyed by `"key@version"`.
|
|
8
|
+
* This is the default store when no external backend is configured.
|
|
9
|
+
* Entries are lost when the process exits.
|
|
10
|
+
*/
|
|
11
|
+
class MemoryStore {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.name = 'memory';
|
|
14
|
+
/** Keyed by `"key@version"` — e.g. `"rag:graph:entity-extraction@1.0.0"`. */
|
|
15
|
+
this.data = new Map();
|
|
16
|
+
}
|
|
17
|
+
compoundKey(key, version) {
|
|
18
|
+
return `${key}@${version}`;
|
|
19
|
+
}
|
|
20
|
+
async get(key, version = 'latest') {
|
|
21
|
+
return this.data.get(this.compoundKey(key, version));
|
|
22
|
+
}
|
|
23
|
+
async set(entry) {
|
|
24
|
+
const version = entry.version || 'latest';
|
|
25
|
+
this.data.set(this.compoundKey(entry.key, version), { ...entry, version });
|
|
26
|
+
// Also write / overwrite the 'latest' slot so get(key) always works
|
|
27
|
+
if (version !== 'latest') {
|
|
28
|
+
this.data.set(this.compoundKey(entry.key, 'latest'), { ...entry, version: 'latest' });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async delete(key, version) {
|
|
32
|
+
if (version) {
|
|
33
|
+
this.data.delete(this.compoundKey(key, version));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
for (const k of [...this.data.keys()]) {
|
|
37
|
+
if (k.startsWith(`${key}@`))
|
|
38
|
+
this.data.delete(k);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async has(key, version = 'latest') {
|
|
43
|
+
return this.data.has(this.compoundKey(key, version));
|
|
44
|
+
}
|
|
45
|
+
async keys() {
|
|
46
|
+
const seen = new Set();
|
|
47
|
+
for (const compKey of this.data.keys()) {
|
|
48
|
+
seen.add(compKey.split('@')[0]);
|
|
49
|
+
}
|
|
50
|
+
return [...seen];
|
|
51
|
+
}
|
|
52
|
+
async versions(key) {
|
|
53
|
+
const vers = [];
|
|
54
|
+
for (const compKey of this.data.keys()) {
|
|
55
|
+
const [k, v] = compKey.split('@');
|
|
56
|
+
if (k === key && v !== 'latest')
|
|
57
|
+
vers.push(v);
|
|
58
|
+
}
|
|
59
|
+
return vers.sort();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.MemoryStore = MemoryStore;
|
|
63
|
+
//# sourceMappingURL=memory.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.store.js","sourceRoot":"","sources":["../../src/stores/memory.store.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,MAAa,WAAW;IAAxB;QACW,SAAI,GAAG,QAAQ,CAAC;QAEzB,6EAA6E;QAC5D,SAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAiDzD,CAAC;IA/CS,WAAW,CAAC,GAAW,EAAE,OAAe;QAC9C,OAAO,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAO,GAAG,QAAQ;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAkB;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,oEAAoE;QACpE,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAgB;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAO,GAAG,QAAQ;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;CACF;AArDD,kCAqDC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { PromptEntry, PromptStore } from './store.interface';
|
|
2
|
+
/**
|
|
3
|
+
* MultiStore
|
|
4
|
+
*
|
|
5
|
+
* A composite `PromptStore` that fans out writes to all registered stores
|
|
6
|
+
* and reads from the first store that has the requested entry.
|
|
7
|
+
*
|
|
8
|
+
* Useful for layered caching strategies, e.g.:
|
|
9
|
+
* - Read: check in-memory → Redis → database
|
|
10
|
+
* - Write: write to all three simultaneously
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { PromptRegistry, MultiStore, MemoryStore, RedisStore, FileStore } from '@hazeljs/prompts';
|
|
15
|
+
*
|
|
16
|
+
* PromptRegistry.configure([
|
|
17
|
+
* new MultiStore([
|
|
18
|
+
* new MemoryStore(),
|
|
19
|
+
* new RedisStore({ client: redisClient }),
|
|
20
|
+
* new FileStore({ filePath: './prompts/library.json' }),
|
|
21
|
+
* ])
|
|
22
|
+
* ]);
|
|
23
|
+
*
|
|
24
|
+
* await PromptRegistry.saveAll();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class MultiStore implements PromptStore {
|
|
28
|
+
private readonly stores;
|
|
29
|
+
readonly name: string;
|
|
30
|
+
constructor(stores: PromptStore[]);
|
|
31
|
+
/** Returns from the first store that has the entry; `undefined` if none do. */
|
|
32
|
+
get(key: string, version?: string): Promise<PromptEntry | undefined>;
|
|
33
|
+
/** Writes to ALL stores in parallel. */
|
|
34
|
+
set(entry: PromptEntry): Promise<void>;
|
|
35
|
+
/** Deletes from ALL stores in parallel. */
|
|
36
|
+
delete(key: string, version?: string): Promise<void>;
|
|
37
|
+
/** Returns `true` if ANY store has the entry. */
|
|
38
|
+
has(key: string, version?: string): Promise<boolean>;
|
|
39
|
+
/** Returns the union of all keys across all stores (deduplicated). */
|
|
40
|
+
keys(): Promise<string[]>;
|
|
41
|
+
/** Returns the union of all version strings for a key across all stores. */
|
|
42
|
+
versions(key: string): Promise<string[]>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=multi.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi.store.d.ts","sourceRoot":"","sources":["../../src/stores/multi.store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,UAAW,YAAW,WAAW;IAGhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEO,MAAM,EAAE,WAAW,EAAE;IAIlD,+EAA+E;IACzE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQ5E,wCAAwC;IAClC,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,2CAA2C;IACrC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,iDAAiD;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D,sEAAsE;IAChE,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/B,4EAA4E;IACtE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI/C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultiStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* MultiStore
|
|
6
|
+
*
|
|
7
|
+
* A composite `PromptStore` that fans out writes to all registered stores
|
|
8
|
+
* and reads from the first store that has the requested entry.
|
|
9
|
+
*
|
|
10
|
+
* Useful for layered caching strategies, e.g.:
|
|
11
|
+
* - Read: check in-memory → Redis → database
|
|
12
|
+
* - Write: write to all three simultaneously
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { PromptRegistry, MultiStore, MemoryStore, RedisStore, FileStore } from '@hazeljs/prompts';
|
|
17
|
+
*
|
|
18
|
+
* PromptRegistry.configure([
|
|
19
|
+
* new MultiStore([
|
|
20
|
+
* new MemoryStore(),
|
|
21
|
+
* new RedisStore({ client: redisClient }),
|
|
22
|
+
* new FileStore({ filePath: './prompts/library.json' }),
|
|
23
|
+
* ])
|
|
24
|
+
* ]);
|
|
25
|
+
*
|
|
26
|
+
* await PromptRegistry.saveAll();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
class MultiStore {
|
|
30
|
+
constructor(stores) {
|
|
31
|
+
this.stores = stores;
|
|
32
|
+
this.name = `multi(${stores.map((s) => s.name).join(', ')})`;
|
|
33
|
+
}
|
|
34
|
+
/** Returns from the first store that has the entry; `undefined` if none do. */
|
|
35
|
+
async get(key, version = 'latest') {
|
|
36
|
+
for (const store of this.stores) {
|
|
37
|
+
const entry = await store.get(key, version);
|
|
38
|
+
if (entry)
|
|
39
|
+
return entry;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/** Writes to ALL stores in parallel. */
|
|
44
|
+
async set(entry) {
|
|
45
|
+
await Promise.all(this.stores.map((s) => s.set(entry)));
|
|
46
|
+
}
|
|
47
|
+
/** Deletes from ALL stores in parallel. */
|
|
48
|
+
async delete(key, version) {
|
|
49
|
+
await Promise.all(this.stores.map((s) => s.delete(key, version)));
|
|
50
|
+
}
|
|
51
|
+
/** Returns `true` if ANY store has the entry. */
|
|
52
|
+
async has(key, version = 'latest') {
|
|
53
|
+
const results = await Promise.all(this.stores.map((s) => s.has(key, version)));
|
|
54
|
+
return results.some(Boolean);
|
|
55
|
+
}
|
|
56
|
+
/** Returns the union of all keys across all stores (deduplicated). */
|
|
57
|
+
async keys() {
|
|
58
|
+
const allKeys = await Promise.all(this.stores.map((s) => s.keys()));
|
|
59
|
+
return [...new Set(allKeys.flat())];
|
|
60
|
+
}
|
|
61
|
+
/** Returns the union of all version strings for a key across all stores. */
|
|
62
|
+
async versions(key) {
|
|
63
|
+
const allVersions = await Promise.all(this.stores.map((s) => s.versions(key)));
|
|
64
|
+
return [...new Set(allVersions.flat())].sort();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.MultiStore = MultiStore;
|
|
68
|
+
//# sourceMappingURL=multi.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi.store.js","sourceRoot":"","sources":["../../src/stores/multi.store.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAa,UAAU;IAGrB,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAChD,IAAI,CAAC,IAAI,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/D,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAO,GAAG,QAAQ;QACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,GAAG,CAAC,KAAkB;QAC1B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAgB;QACxC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAO,GAAG,QAAQ;QACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;CACF;AA3CD,gCA2CC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { PromptEntry, PromptStore } from './store.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal Redis adapter interface.
|
|
4
|
+
* Pass any Redis client (ioredis, node-redis, upstash, etc.) that satisfies
|
|
5
|
+
* this shape — no direct dependency on any Redis library is needed.
|
|
6
|
+
*
|
|
7
|
+
* @example Using ioredis:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import Redis from 'ioredis';
|
|
10
|
+
* const redis = new Redis();
|
|
11
|
+
* PromptRegistry.addStore(new RedisStore({ client: redis }));
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @example Using @upstash/redis:
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { Redis } from '@upstash/redis';
|
|
17
|
+
* const redis = Redis.fromEnv();
|
|
18
|
+
* PromptRegistry.addStore(new RedisStore({ client: redis as RedisAdapter }));
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export interface RedisAdapter {
|
|
22
|
+
get(key: string): Promise<string | null>;
|
|
23
|
+
set(key: string, value: string): Promise<unknown>;
|
|
24
|
+
del(...keys: string[]): Promise<unknown>;
|
|
25
|
+
exists(...keys: string[]): Promise<number>;
|
|
26
|
+
/** Returns all keys matching a glob pattern. */
|
|
27
|
+
keys(pattern: string): Promise<string[]>;
|
|
28
|
+
}
|
|
29
|
+
export interface RedisStoreOptions {
|
|
30
|
+
/** A Redis client instance implementing `RedisAdapter`. */
|
|
31
|
+
client: RedisAdapter;
|
|
32
|
+
/**
|
|
33
|
+
* Optional key prefix to namespace all prompts in the Redis keyspace.
|
|
34
|
+
* Default: `'hazeljs:prompts'`.
|
|
35
|
+
*/
|
|
36
|
+
prefix?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* RedisStore
|
|
40
|
+
*
|
|
41
|
+
* Persists prompt entries as JSON strings in Redis.
|
|
42
|
+
* Each prompt version is stored at: `{prefix}:{key}@{version}`
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* import Redis from 'ioredis';
|
|
47
|
+
* const redis = new Redis(process.env.REDIS_URL);
|
|
48
|
+
* PromptRegistry.addStore(new RedisStore({ client: redis }));
|
|
49
|
+
* await PromptRegistry.saveAll();
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare class RedisStore implements PromptStore {
|
|
53
|
+
readonly name = "redis";
|
|
54
|
+
private readonly client;
|
|
55
|
+
private readonly prefix;
|
|
56
|
+
constructor(options: RedisStoreOptions);
|
|
57
|
+
private redisKey;
|
|
58
|
+
get(key: string, version?: string): Promise<PromptEntry | undefined>;
|
|
59
|
+
set(entry: PromptEntry): Promise<void>;
|
|
60
|
+
delete(key: string, version?: string): Promise<void>;
|
|
61
|
+
has(key: string, version?: string): Promise<boolean>;
|
|
62
|
+
keys(): Promise<string[]>;
|
|
63
|
+
versions(key: string): Promise<string[]>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=redis.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.store.d.ts","sourceRoot":"","sources":["../../src/stores/redis.store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,gDAAgD;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAW,YAAW,WAAW;IAC5C,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,iBAAiB;IAOtC,OAAO,CAAC,QAAQ;IAMV,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAMtE,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAYtC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAU/C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RedisStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* RedisStore
|
|
6
|
+
*
|
|
7
|
+
* Persists prompt entries as JSON strings in Redis.
|
|
8
|
+
* Each prompt version is stored at: `{prefix}:{key}@{version}`
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import Redis from 'ioredis';
|
|
13
|
+
* const redis = new Redis(process.env.REDIS_URL);
|
|
14
|
+
* PromptRegistry.addStore(new RedisStore({ client: redis }));
|
|
15
|
+
* await PromptRegistry.saveAll();
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
class RedisStore {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.name = 'redis';
|
|
21
|
+
this.client = options.client;
|
|
22
|
+
this.prefix = options.prefix ?? 'hazeljs:prompts';
|
|
23
|
+
}
|
|
24
|
+
// ── Internal helpers ──────────────────────────────────────────────────────
|
|
25
|
+
redisKey(key, version) {
|
|
26
|
+
return `${this.prefix}:${key}@${version}`;
|
|
27
|
+
}
|
|
28
|
+
// ── PromptStore interface ─────────────────────────────────────────────────
|
|
29
|
+
async get(key, version = 'latest') {
|
|
30
|
+
const raw = await this.client.get(this.redisKey(key, version));
|
|
31
|
+
if (!raw)
|
|
32
|
+
return undefined;
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
async set(entry) {
|
|
36
|
+
const version = entry.version || 'latest';
|
|
37
|
+
const serialized = JSON.stringify({ ...entry, version });
|
|
38
|
+
await this.client.set(this.redisKey(entry.key, version), serialized);
|
|
39
|
+
if (version !== 'latest') {
|
|
40
|
+
await this.client.set(this.redisKey(entry.key, 'latest'), JSON.stringify({ ...entry, version: 'latest' }));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async delete(key, version) {
|
|
44
|
+
if (version) {
|
|
45
|
+
await this.client.del(this.redisKey(key, version));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const matches = await this.client.keys(`${this.prefix}:${key}@*`);
|
|
49
|
+
if (matches.length > 0) {
|
|
50
|
+
await this.client.del(...matches);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async has(key, version = 'latest') {
|
|
55
|
+
const count = await this.client.exists(this.redisKey(key, version));
|
|
56
|
+
return count > 0;
|
|
57
|
+
}
|
|
58
|
+
async keys() {
|
|
59
|
+
const allKeys = await this.client.keys(`${this.prefix}:*`);
|
|
60
|
+
const seen = new Set();
|
|
61
|
+
for (const k of allKeys) {
|
|
62
|
+
// Strip prefix and version: "hazeljs:prompts:rag:graph:entity@1.0.0" → "rag:graph:entity"
|
|
63
|
+
const stripped = k.slice(this.prefix.length + 1); // after "prefix:"
|
|
64
|
+
seen.add(stripped.split('@')[0]);
|
|
65
|
+
}
|
|
66
|
+
return [...seen];
|
|
67
|
+
}
|
|
68
|
+
async versions(key) {
|
|
69
|
+
const pattern = `${this.prefix}:${key}@*`;
|
|
70
|
+
const matches = await this.client.keys(pattern);
|
|
71
|
+
const vers = [];
|
|
72
|
+
for (const k of matches) {
|
|
73
|
+
const v = k.split('@').pop() ?? '';
|
|
74
|
+
if (v && v !== 'latest')
|
|
75
|
+
vers.push(v);
|
|
76
|
+
}
|
|
77
|
+
return vers.sort();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.RedisStore = RedisStore;
|
|
81
|
+
//# sourceMappingURL=redis.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.store.js","sourceRoot":"","sources":["../../src/stores/redis.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { PromptMetadata } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* A serializable snapshot of one version of a registered prompt.
|
|
4
|
+
* This is what gets persisted to / loaded from any store backend.
|
|
5
|
+
*/
|
|
6
|
+
export interface PromptEntry {
|
|
7
|
+
/** Registry key (e.g. `rag:graph:entity-extraction`). */
|
|
8
|
+
key: string;
|
|
9
|
+
/**
|
|
10
|
+
* Semantic version string (e.g. `1.0.0`).
|
|
11
|
+
* Defaults to `'latest'` when `PromptMetadata.version` is not set.
|
|
12
|
+
*/
|
|
13
|
+
version: string;
|
|
14
|
+
/** Raw template string with `{variable}` placeholders. */
|
|
15
|
+
template: string;
|
|
16
|
+
/** Human-readable metadata. */
|
|
17
|
+
metadata: PromptMetadata;
|
|
18
|
+
/** ISO-8601 timestamp of when the entry was written to the store. */
|
|
19
|
+
storedAt: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* PromptStore
|
|
23
|
+
*
|
|
24
|
+
* Async storage contract implemented by every backend.
|
|
25
|
+
* All methods are async so implementations can use any I/O mechanism
|
|
26
|
+
* (file system, Redis, SQL/NoSQL, HTTP, etc.) without blocking the event loop.
|
|
27
|
+
*
|
|
28
|
+
* Versioning semantics:
|
|
29
|
+
* - Every entry is stored under a `(key, version)` pair.
|
|
30
|
+
* - `version` defaults to `'latest'` when not supplied.
|
|
31
|
+
* - `get(key)` returns the `'latest'` version.
|
|
32
|
+
* - `get(key, '1.2.0')` returns a specific historical version.
|
|
33
|
+
*/
|
|
34
|
+
export interface PromptStore {
|
|
35
|
+
/** Human-readable identifier shown in error messages and logs. */
|
|
36
|
+
readonly name: string;
|
|
37
|
+
/**
|
|
38
|
+
* Retrieve the entry for `key` at `version` (defaults to `'latest'`).
|
|
39
|
+
* Returns `undefined` when the entry does not exist.
|
|
40
|
+
*/
|
|
41
|
+
get(key: string, version?: string): Promise<PromptEntry | undefined>;
|
|
42
|
+
/**
|
|
43
|
+
* Persist `entry` to the store.
|
|
44
|
+
* If an entry with the same `(key, version)` already exists it is overwritten.
|
|
45
|
+
*/
|
|
46
|
+
set(entry: PromptEntry): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Remove the entry for `key` at `version`.
|
|
49
|
+
* If `version` is omitted, ALL versions of the key are removed.
|
|
50
|
+
*/
|
|
51
|
+
delete(key: string, version?: string): Promise<void>;
|
|
52
|
+
/** Returns `true` when an entry for `key@version` exists. */
|
|
53
|
+
has(key: string, version?: string): Promise<boolean>;
|
|
54
|
+
/** Returns all distinct keys currently stored (deduplicated across versions). */
|
|
55
|
+
keys(): Promise<string[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Returns all stored version strings for a given key in ascending semver order.
|
|
58
|
+
* Returns an empty array when the key does not exist.
|
|
59
|
+
*/
|
|
60
|
+
versions(key: string): Promise<string[]>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=store.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.interface.d.ts","sourceRoot":"","sources":["../../src/stores/store.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAErE;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErD,6DAA6D;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErD,iFAAiF;IACjF,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.interface.js","sourceRoot":"","sources":["../../src/stores/store.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptTemplate<TVariables>
|
|
3
|
+
*
|
|
4
|
+
* A typed, reusable prompt template that interpolates named `{variable}`
|
|
5
|
+
* placeholders with caller-supplied values.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const tpl = new PromptTemplate<{ query: string; context: string }>(
|
|
10
|
+
* 'Answer the question using the context.\nContext: {context}\nQuestion: {query}',
|
|
11
|
+
* { name: 'RAG Answer', version: '1.0.0' },
|
|
12
|
+
* );
|
|
13
|
+
*
|
|
14
|
+
* const rendered = tpl.render({ query: 'What is TypeScript?', context: '...' });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
import type { PromptMetadata } from './types';
|
|
18
|
+
export declare class PromptTemplate<TVariables extends object = Record<string, unknown>> {
|
|
19
|
+
/** The raw template string containing `{variableName}` placeholders. */
|
|
20
|
+
readonly template: string;
|
|
21
|
+
/** Descriptive metadata — used for debugging and the registry. */
|
|
22
|
+
readonly metadata: PromptMetadata;
|
|
23
|
+
constructor(
|
|
24
|
+
/** The raw template string containing `{variableName}` placeholders. */
|
|
25
|
+
template: string,
|
|
26
|
+
/** Descriptive metadata — used for debugging and the registry. */
|
|
27
|
+
metadata: PromptMetadata);
|
|
28
|
+
/**
|
|
29
|
+
* Render the template by substituting all `{key}` placeholders with the
|
|
30
|
+
* corresponding values from `variables`.
|
|
31
|
+
*
|
|
32
|
+
* - If a placeholder key is present in `variables` its value is `String()`-cast.
|
|
33
|
+
* - If a placeholder key is NOT present it is left as-is (e.g. `{missing}`),
|
|
34
|
+
* making missing variables easy to spot.
|
|
35
|
+
*/
|
|
36
|
+
render(variables: TVariables): string;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,qBAAa,cAAc,CAAC,UAAU,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3E,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,cAAc;;IAHjC,wEAAwE;IAC/D,QAAQ,EAAE,MAAM;IACzB,kEAAkE;IACzD,QAAQ,EAAE,cAAc;IAGnC;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM;CAOtC"}
|
package/dist/template.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PromptTemplate<TVariables>
|
|
4
|
+
*
|
|
5
|
+
* A typed, reusable prompt template that interpolates named `{variable}`
|
|
6
|
+
* placeholders with caller-supplied values.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const tpl = new PromptTemplate<{ query: string; context: string }>(
|
|
11
|
+
* 'Answer the question using the context.\nContext: {context}\nQuestion: {query}',
|
|
12
|
+
* { name: 'RAG Answer', version: '1.0.0' },
|
|
13
|
+
* );
|
|
14
|
+
*
|
|
15
|
+
* const rendered = tpl.render({ query: 'What is TypeScript?', context: '...' });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.PromptTemplate = void 0;
|
|
20
|
+
class PromptTemplate {
|
|
21
|
+
constructor(
|
|
22
|
+
/** The raw template string containing `{variableName}` placeholders. */
|
|
23
|
+
template,
|
|
24
|
+
/** Descriptive metadata — used for debugging and the registry. */
|
|
25
|
+
metadata) {
|
|
26
|
+
this.template = template;
|
|
27
|
+
this.metadata = metadata;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Render the template by substituting all `{key}` placeholders with the
|
|
31
|
+
* corresponding values from `variables`.
|
|
32
|
+
*
|
|
33
|
+
* - If a placeholder key is present in `variables` its value is `String()`-cast.
|
|
34
|
+
* - If a placeholder key is NOT present it is left as-is (e.g. `{missing}`),
|
|
35
|
+
* making missing variables easy to spot.
|
|
36
|
+
*/
|
|
37
|
+
render(variables) {
|
|
38
|
+
const vars = variables;
|
|
39
|
+
return this.template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
40
|
+
const value = vars[key];
|
|
41
|
+
return value !== undefined ? String(value) : match;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.PromptTemplate = PromptTemplate;
|
|
46
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAIH,MAAa,cAAc;IACzB;IACE,wEAAwE;IAC/D,QAAgB;IACzB,kEAAkE;IACzD,QAAwB;QAFxB,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,aAAQ,GAAR,QAAQ,CAAgB;IAChC,CAAC;IAEJ;;;;;;;OAOG;IACH,MAAM,CAAC,SAAqB;QAC1B,MAAM,IAAI,GAAG,SAAoC,CAAC;QAClD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAvBD,wCAuBC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata attached to every PromptTemplate.
|
|
3
|
+
*/
|
|
4
|
+
export interface PromptMetadata {
|
|
5
|
+
/** Unique human-readable name for this prompt. */
|
|
6
|
+
name: string;
|
|
7
|
+
/** Optional short description of what this prompt does. */
|
|
8
|
+
description?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Semantic version string (e.g. '1.0.0').
|
|
11
|
+
* Bump when the prompt text changes meaningfully to aid debugging.
|
|
12
|
+
*/
|
|
13
|
+
version?: string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hazeljs/prompts",
|
|
3
|
+
"version": "0.2.0-beta.64",
|
|
4
|
+
"description": "Typed, overridable prompt templates for HazelJS AI, RAG, and Agent packages",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc --skipLibCheck",
|
|
12
|
+
"test": "jest --coverage --passWithNoTests",
|
|
13
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
14
|
+
"lint:fix": "eslint \"src/**/*.ts\" --fix",
|
|
15
|
+
"clean": "rm -rf dist"
|
|
16
|
+
},
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@types/jest": "^29.5.14",
|
|
19
|
+
"@types/node": "^20.17.50",
|
|
20
|
+
"@typescript-eslint/eslint-plugin": "^8.18.2",
|
|
21
|
+
"@typescript-eslint/parser": "^8.18.2",
|
|
22
|
+
"eslint": "^8.56.0",
|
|
23
|
+
"jest": "^29.7.0",
|
|
24
|
+
"ts-jest": "^29.1.2",
|
|
25
|
+
"typescript": "^5.3.3"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/hazeljs/hazeljs.git",
|
|
33
|
+
"directory": "packages/prompts"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"hazeljs",
|
|
37
|
+
"prompts",
|
|
38
|
+
"prompt-template",
|
|
39
|
+
"llm",
|
|
40
|
+
"ai",
|
|
41
|
+
"rag",
|
|
42
|
+
"agent"
|
|
43
|
+
],
|
|
44
|
+
"author": "Muhammad Arslan <muhammad.arslan@hazeljs.com>",
|
|
45
|
+
"license": "Apache-2.0",
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/hazeljs/hazel-js/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://hazeljs.com",
|
|
50
|
+
"jest": {
|
|
51
|
+
"preset": "ts-jest",
|
|
52
|
+
"testEnvironment": "node",
|
|
53
|
+
"testMatch": [
|
|
54
|
+
"**/src/__tests__/**/*.test.ts"
|
|
55
|
+
],
|
|
56
|
+
"collectCoverageFrom": [
|
|
57
|
+
"src/**/*.ts",
|
|
58
|
+
"!src/__tests__/**",
|
|
59
|
+
"!src/index.ts",
|
|
60
|
+
"!src/stores/index.ts",
|
|
61
|
+
"!src/stores/redis.store.ts",
|
|
62
|
+
"!src/stores/database.store.ts"
|
|
63
|
+
],
|
|
64
|
+
"coverageThreshold": {
|
|
65
|
+
"global": {
|
|
66
|
+
"statements": 90,
|
|
67
|
+
"branches": 80,
|
|
68
|
+
"functions": 90,
|
|
69
|
+
"lines": 90
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"gitHead": "52562169540a50bb37ee4fdc818424e92c2c645b"
|
|
74
|
+
}
|