@hazeljs/prompts 0.2.0-alpha.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.
Files changed (67) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +461 -0
  3. package/dist/__tests__/registry.test.d.ts +2 -0
  4. package/dist/__tests__/registry.test.d.ts.map +1 -0
  5. package/dist/__tests__/registry.test.js +255 -0
  6. package/dist/__tests__/registry.test.js.map +1 -0
  7. package/dist/__tests__/stores/file.store.test.d.ts +2 -0
  8. package/dist/__tests__/stores/file.store.test.d.ts.map +1 -0
  9. package/dist/__tests__/stores/file.store.test.js +134 -0
  10. package/dist/__tests__/stores/file.store.test.js.map +1 -0
  11. package/dist/__tests__/stores/memory.store.test.d.ts +2 -0
  12. package/dist/__tests__/stores/memory.store.test.d.ts.map +1 -0
  13. package/dist/__tests__/stores/memory.store.test.js +74 -0
  14. package/dist/__tests__/stores/memory.store.test.js.map +1 -0
  15. package/dist/__tests__/stores/multi.store.test.d.ts +2 -0
  16. package/dist/__tests__/stores/multi.store.test.d.ts.map +1 -0
  17. package/dist/__tests__/stores/multi.store.test.js +81 -0
  18. package/dist/__tests__/stores/multi.store.test.js.map +1 -0
  19. package/dist/__tests__/template.test.d.ts +2 -0
  20. package/dist/__tests__/template.test.d.ts.map +1 -0
  21. package/dist/__tests__/template.test.js +60 -0
  22. package/dist/__tests__/template.test.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +18 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/registry.d.ts +153 -0
  28. package/dist/registry.d.ts.map +1 -0
  29. package/dist/registry.js +288 -0
  30. package/dist/registry.js.map +1 -0
  31. package/dist/stores/database.store.d.ts +93 -0
  32. package/dist/stores/database.store.d.ts.map +1 -0
  33. package/dist/stores/database.store.js +46 -0
  34. package/dist/stores/database.store.js.map +1 -0
  35. package/dist/stores/file.store.d.ts +49 -0
  36. package/dist/stores/file.store.d.ts.map +1 -0
  37. package/dist/stores/file.store.js +105 -0
  38. package/dist/stores/file.store.js.map +1 -0
  39. package/dist/stores/index.d.ts +10 -0
  40. package/dist/stores/index.d.ts.map +1 -0
  41. package/dist/stores/index.js +14 -0
  42. package/dist/stores/index.js.map +1 -0
  43. package/dist/stores/memory.store.d.ts +21 -0
  44. package/dist/stores/memory.store.d.ts.map +1 -0
  45. package/dist/stores/memory.store.js +63 -0
  46. package/dist/stores/memory.store.js.map +1 -0
  47. package/dist/stores/multi.store.d.ts +44 -0
  48. package/dist/stores/multi.store.d.ts.map +1 -0
  49. package/dist/stores/multi.store.js +68 -0
  50. package/dist/stores/multi.store.js.map +1 -0
  51. package/dist/stores/redis.store.d.ts +65 -0
  52. package/dist/stores/redis.store.d.ts.map +1 -0
  53. package/dist/stores/redis.store.js +81 -0
  54. package/dist/stores/redis.store.js.map +1 -0
  55. package/dist/stores/store.interface.d.ts +62 -0
  56. package/dist/stores/store.interface.d.ts.map +1 -0
  57. package/dist/stores/store.interface.js +3 -0
  58. package/dist/stores/store.interface.js.map +1 -0
  59. package/dist/template.d.ts +38 -0
  60. package/dist/template.d.ts.map +1 -0
  61. package/dist/template.js +46 -0
  62. package/dist/template.js.map +1 -0
  63. package/dist/types.d.ts +15 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +3 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.store.d.ts","sourceRoot":"","sources":["../../src/stores/database.store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,WAAW,eAAe;IAC9B,qGAAqG;IACrG,OAAO,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAE3F,iCAAiC;IACjC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,8EAA8E;IAC9E,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,gCAAgC;IAChC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAE5C,yEAAyE;IACzE,YAAY,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,QAAQ,CAAC,IAAI,cAAc;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAE9B,OAAO,EAAE,oBAAoB;IAInC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKtE,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI/C"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseStore = void 0;
4
+ /**
5
+ * DatabaseStore
6
+ *
7
+ * Persists prompt entries to any relational or document database via a thin
8
+ * `DatabaseAdapter` interface. No database driver is imported directly;
9
+ * you supply the adapter so the package stays dependency-free.
10
+ *
11
+ * @example See `DatabaseAdapter` JSDoc for a complete Prisma example.
12
+ */
13
+ class DatabaseStore {
14
+ constructor(options) {
15
+ this.name = 'database';
16
+ this.adapter = options.adapter;
17
+ }
18
+ async get(key, version = 'latest') {
19
+ const result = await this.adapter.findOne({ key, version });
20
+ return result ?? undefined;
21
+ }
22
+ async set(entry) {
23
+ const version = entry.version || 'latest';
24
+ await this.adapter.upsert({ ...entry, version });
25
+ if (version !== 'latest') {
26
+ await this.adapter.upsert({ ...entry, version: 'latest' });
27
+ }
28
+ }
29
+ async delete(key, version) {
30
+ await this.adapter.remove({ key, version });
31
+ }
32
+ async has(key, version = 'latest') {
33
+ const result = await this.adapter.findOne({ key, version });
34
+ return result != null;
35
+ }
36
+ async keys() {
37
+ const rows = await this.adapter.findKeys();
38
+ return [...new Set(rows.map((r) => r.key))];
39
+ }
40
+ async versions(key) {
41
+ const rows = await this.adapter.findVersions({ key });
42
+ return rows.map((r) => r.version).sort();
43
+ }
44
+ }
45
+ exports.DatabaseStore = DatabaseStore;
46
+ //# sourceMappingURL=database.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.store.js","sourceRoot":"","sources":["../../src/stores/database.store.ts"],"names":[],"mappings":";;;AAmEA;;;;;;;;GAQG;AACH,MAAa,aAAa;IAKxB,YAAY,OAA6B;QAJhC,SAAI,GAAG,UAAU,CAAC;QAKzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAO,GAAG,QAAQ;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAkB;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC;QAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAgB;QACxC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,OAAO,GAAG,QAAQ;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;CACF;AAxCD,sCAwCC"}
@@ -0,0 +1,49 @@
1
+ import type { PromptEntry, PromptStore } from './store.interface';
2
+ export interface FileStoreOptions {
3
+ /**
4
+ * Absolute path to a JSON file that stores all prompt entries.
5
+ * The file is created (with parent directories) if it does not exist.
6
+ * Default: `./prompts.json` relative to the current working directory.
7
+ */
8
+ filePath?: string;
9
+ /**
10
+ * When `true`, the JSON file is pretty-printed with 2-space indentation.
11
+ * Useful for human-readable prompt files under version control.
12
+ * Default: `true`.
13
+ */
14
+ pretty?: boolean;
15
+ }
16
+ /**
17
+ * FileStore
18
+ *
19
+ * Persists prompt entries to a single JSON file on disk.
20
+ * Entries are keyed by `"key@version"` in the JSON object.
21
+ * The file is read once on first access and written on every `set`/`delete`.
22
+ *
23
+ * Suitable for small-to-medium prompt libraries committed to a repository.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * PromptRegistry.addStore(new FileStore({ filePath: './prompts/library.json' }));
28
+ * await PromptRegistry.saveAll();
29
+ * ```
30
+ */
31
+ export declare class FileStore implements PromptStore {
32
+ readonly name = "file";
33
+ private readonly filePath;
34
+ private readonly pretty;
35
+ private cache;
36
+ constructor(options?: FileStoreOptions);
37
+ private compoundKey;
38
+ private read;
39
+ private write;
40
+ get(key: string, version?: string): Promise<PromptEntry | undefined>;
41
+ set(entry: PromptEntry): Promise<void>;
42
+ delete(key: string, version?: string): Promise<void>;
43
+ has(key: string, version?: string): Promise<boolean>;
44
+ keys(): Promise<string[]>;
45
+ versions(key: string): Promise<string[]>;
46
+ /** Invalidate the in-process file cache, forcing a re-read on next access. */
47
+ invalidate(): void;
48
+ }
49
+ //# sourceMappingURL=file.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.store.d.ts","sourceRoot":"","sources":["../../src/stores/file.store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;;;;;;;;;GAcG;AACH,qBAAa,SAAU,YAAW,WAAW;IAC3C,QAAQ,CAAC,IAAI,UAAU;IAEvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,KAAK,CAAyB;gBAE1B,OAAO,GAAE,gBAAqB;IAO1C,OAAO,CAAC,WAAW;YAIL,IAAI;YAWJ,KAAK;IASb,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKtE,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASzB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU9C,8EAA8E;IAC9E,UAAU,IAAI,IAAI;CAGnB"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileStore = void 0;
4
+ const promises_1 = require("fs/promises");
5
+ const path_1 = require("path");
6
+ /**
7
+ * FileStore
8
+ *
9
+ * Persists prompt entries to a single JSON file on disk.
10
+ * Entries are keyed by `"key@version"` in the JSON object.
11
+ * The file is read once on first access and written on every `set`/`delete`.
12
+ *
13
+ * Suitable for small-to-medium prompt libraries committed to a repository.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * PromptRegistry.addStore(new FileStore({ filePath: './prompts/library.json' }));
18
+ * await PromptRegistry.saveAll();
19
+ * ```
20
+ */
21
+ class FileStore {
22
+ constructor(options = {}) {
23
+ this.name = 'file';
24
+ this.cache = null;
25
+ this.filePath = options.filePath ?? (0, path_1.join)(process.cwd(), 'prompts.json');
26
+ this.pretty = options.pretty ?? true;
27
+ }
28
+ // ── Internal helpers ──────────────────────────────────────────────────────
29
+ compoundKey(key, version) {
30
+ return `${key}@${version}`;
31
+ }
32
+ async read() {
33
+ if (this.cache !== null)
34
+ return this.cache;
35
+ try {
36
+ const raw = await (0, promises_1.readFile)(this.filePath, 'utf8');
37
+ this.cache = JSON.parse(raw);
38
+ }
39
+ catch {
40
+ this.cache = {};
41
+ }
42
+ return this.cache;
43
+ }
44
+ async write(data) {
45
+ this.cache = data;
46
+ await (0, promises_1.mkdir)((0, path_1.dirname)(this.filePath), { recursive: true });
47
+ const content = this.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
48
+ await (0, promises_1.writeFile)(this.filePath, content, 'utf8');
49
+ }
50
+ // ── PromptStore interface ─────────────────────────────────────────────────
51
+ async get(key, version = 'latest') {
52
+ const data = await this.read();
53
+ return data[this.compoundKey(key, version)];
54
+ }
55
+ async set(entry) {
56
+ const data = await this.read();
57
+ const version = entry.version || 'latest';
58
+ data[this.compoundKey(entry.key, version)] = { ...entry, version };
59
+ if (version !== 'latest') {
60
+ data[this.compoundKey(entry.key, 'latest')] = { ...entry, version: 'latest' };
61
+ }
62
+ await this.write(data);
63
+ }
64
+ async delete(key, version) {
65
+ const data = await this.read();
66
+ if (version) {
67
+ delete data[this.compoundKey(key, version)];
68
+ }
69
+ else {
70
+ for (const k of Object.keys(data)) {
71
+ if (k.startsWith(`${key}@`))
72
+ delete data[k];
73
+ }
74
+ }
75
+ await this.write(data);
76
+ }
77
+ async has(key, version = 'latest') {
78
+ const data = await this.read();
79
+ return this.compoundKey(key, version) in data;
80
+ }
81
+ async keys() {
82
+ const data = await this.read();
83
+ const seen = new Set();
84
+ for (const compKey of Object.keys(data)) {
85
+ seen.add(compKey.split('@')[0]);
86
+ }
87
+ return [...seen];
88
+ }
89
+ async versions(key) {
90
+ const data = await this.read();
91
+ const vers = [];
92
+ for (const compKey of Object.keys(data)) {
93
+ const [k, v] = compKey.split('@');
94
+ if (k === key && v !== 'latest')
95
+ vers.push(v);
96
+ }
97
+ return vers.sort();
98
+ }
99
+ /** Invalidate the in-process file cache, forcing a re-read on next access. */
100
+ invalidate() {
101
+ this.cache = null;
102
+ }
103
+ }
104
+ exports.FileStore = FileStore;
105
+ //# sourceMappingURL=file.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.store.js","sourceRoot":"","sources":["../../src/stores/file.store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type { PromptEntry, PromptStore } from './store.interface';
2
+ export { MemoryStore } from './memory.store';
3
+ export { FileStore } from './file.store';
4
+ export type { FileStoreOptions } from './file.store';
5
+ export { RedisStore } from './redis.store';
6
+ export type { RedisAdapter, RedisStoreOptions } from './redis.store';
7
+ export { DatabaseStore } from './database.store';
8
+ export type { DatabaseAdapter, DatabaseStoreOptions } from './database.store';
9
+ export { MultiStore } from './multi.store';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiStore = exports.DatabaseStore = exports.RedisStore = exports.FileStore = exports.MemoryStore = void 0;
4
+ var memory_store_1 = require("./memory.store");
5
+ Object.defineProperty(exports, "MemoryStore", { enumerable: true, get: function () { return memory_store_1.MemoryStore; } });
6
+ var file_store_1 = require("./file.store");
7
+ Object.defineProperty(exports, "FileStore", { enumerable: true, get: function () { return file_store_1.FileStore; } });
8
+ var redis_store_1 = require("./redis.store");
9
+ Object.defineProperty(exports, "RedisStore", { enumerable: true, get: function () { return redis_store_1.RedisStore; } });
10
+ var database_store_1 = require("./database.store");
11
+ Object.defineProperty(exports, "DatabaseStore", { enumerable: true, get: function () { return database_store_1.DatabaseStore; } });
12
+ var multi_store_1 = require("./multi.store");
13
+ Object.defineProperty(exports, "MultiStore", { enumerable: true, get: function () { return multi_store_1.MultiStore; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":";;;AACA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAElB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AAEnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
@@ -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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"}