@olane/o-lane 0.7.18 → 0.7.20
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/dist/src/capabilities/enums/o-capability.type-enum.d.ts +1 -0
- package/dist/src/capabilities/enums/o-capability.type-enum.d.ts.map +1 -1
- package/dist/src/capabilities/enums/o-capability.type-enum.js +1 -0
- package/dist/src/capabilities/index.d.ts +2 -1
- package/dist/src/capabilities/index.d.ts.map +1 -1
- package/dist/src/capabilities/index.js +2 -1
- package/dist/src/capabilities/interfaces/{o-capability.config.d.ts → o-capability.config-interface.d.ts} +5 -4
- package/dist/src/capabilities/interfaces/o-capability.config-interface.d.ts.map +1 -0
- package/dist/src/capabilities/interfaces/o-capability.result-interface.d.ts +1 -2
- package/dist/src/capabilities/interfaces/o-capability.result-interface.d.ts.map +1 -1
- package/dist/src/capabilities/o-capability.config.d.ts +24 -0
- package/dist/src/capabilities/o-capability.config.d.ts.map +1 -0
- package/dist/src/capabilities/o-capability.config.js +25 -0
- package/dist/src/capabilities/o-capability.d.ts +9 -5
- package/dist/src/capabilities/o-capability.d.ts.map +1 -1
- package/dist/src/capabilities/o-capability.intelligence.d.ts.map +1 -1
- package/dist/src/capabilities/o-capability.intelligence.js +4 -18
- package/dist/src/capabilities/o-capability.js +4 -5
- package/dist/src/capabilities/o-capability.result.d.ts +6 -12
- package/dist/src/capabilities/o-capability.result.d.ts.map +1 -1
- package/dist/src/capabilities/o-capability.result.js +2 -10
- package/dist/src/capabilities-all/o-capability.all.d.ts +2 -3
- package/dist/src/capabilities-all/o-capability.all.d.ts.map +1 -1
- package/dist/src/capabilities-all/o-capability.all.js +6 -8
- package/dist/src/capabilities-configure/interfaces/o-capability.configure-config.d.ts +2 -2
- package/dist/src/capabilities-configure/interfaces/o-capability.configure-config.d.ts.map +1 -1
- package/dist/src/capabilities-configure/o-capability.configure.d.ts +0 -15
- package/dist/src/capabilities-configure/o-capability.configure.d.ts.map +1 -1
- package/dist/src/capabilities-configure/o-capability.configure.js +61 -47
- package/dist/src/capabilities-evaluate/o-capability.evaluate.d.ts +1 -0
- package/dist/src/capabilities-evaluate/o-capability.evaluate.d.ts.map +1 -1
- package/dist/src/capabilities-evaluate/o-capability.evaluate.js +17 -2
- package/dist/src/capabilities-execute/execute.capability.d.ts +13 -0
- package/dist/src/capabilities-execute/execute.capability.d.ts.map +1 -0
- package/dist/src/capabilities-execute/execute.capability.js +111 -0
- package/dist/src/capabilities-execute/interfaces/o-capability.configure-config.d.ts +8 -0
- package/dist/src/capabilities-execute/interfaces/o-capability.configure-config.d.ts.map +1 -0
- package/dist/src/capabilities-multiple-step/interfaces/o-capability.multiple-step-config.d.ts +1 -1
- package/dist/src/capabilities-multiple-step/interfaces/o-capability.multiple-step-config.d.ts.map +1 -1
- package/dist/src/capabilities-multiple-step/o-capability.multiple-step.d.ts.map +1 -1
- package/dist/src/capabilities-multiple-step/o-capability.multiple-step.js +0 -1
- package/dist/src/capabilities-search/interfaces/o-capability.search-config.d.ts +1 -1
- package/dist/src/capabilities-search/interfaces/o-capability.search-config.d.ts.map +1 -1
- package/dist/src/capabilities-search/o-capability.search.d.ts.map +1 -1
- package/dist/src/capabilities-search/o-capability.search.js +0 -4
- package/dist/src/index.d.ts +1 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/interfaces/o-lane.config.d.ts +5 -0
- package/dist/src/interfaces/o-lane.config.d.ts.map +1 -1
- package/dist/src/o-lane.d.ts +13 -13
- package/dist/src/o-lane.d.ts.map +1 -1
- package/dist/src/o-lane.js +52 -180
- package/dist/src/o-lane.mixin.d.ts.map +1 -1
- package/dist/src/o-lane.mixin.js +9 -5
- package/dist/src/prompts/agent.prompt.d.ts +1 -12
- package/dist/src/prompts/agent.prompt.d.ts.map +1 -1
- package/dist/src/prompts/agent.prompt.js +80 -138
- package/dist/src/prompts/configure.prompt.d.ts +1 -8
- package/dist/src/prompts/configure.prompt.d.ts.map +1 -1
- package/dist/src/prompts/configure.prompt.js +68 -47
- package/dist/src/prompts/execute.prompt.d.ts +9 -0
- package/dist/src/prompts/execute.prompt.d.ts.map +1 -0
- package/dist/src/prompts/execute.prompt.js +47 -0
- package/dist/src/prompts/index.d.ts +3 -0
- package/dist/src/prompts/index.d.ts.map +1 -0
- package/dist/src/prompts/index.js +2 -0
- package/dist/src/prompts/interfaces/o-prompt.config.d.ts +8 -0
- package/dist/src/prompts/interfaces/o-prompt.config.d.ts.map +1 -0
- package/dist/src/prompts/interfaces/o-prompt.config.js +1 -0
- package/dist/src/prompts/o-prompt.d.ts +36 -0
- package/dist/src/prompts/o-prompt.d.ts.map +1 -0
- package/dist/src/prompts/o-prompt.js +92 -0
- package/dist/src/storage/default.prompt-loader.d.ts +14 -0
- package/dist/src/storage/default.prompt-loader.d.ts.map +1 -0
- package/dist/src/storage/default.prompt-loader.js +34 -0
- package/dist/src/storage/index.d.ts +1 -3
- package/dist/src/storage/index.d.ts.map +1 -1
- package/dist/src/storage/index.js +1 -5
- package/dist/src/storage/o-lane.storage-manager.d.ts +71 -0
- package/dist/src/storage/o-lane.storage-manager.d.ts.map +1 -0
- package/dist/src/storage/o-lane.storage-manager.js +208 -0
- package/dist/src/storage/prompt-loader.d.ts +10 -28
- package/dist/src/storage/prompt-loader.d.ts.map +1 -1
- package/dist/src/storage/prompt-loader.js +9 -112
- package/dist/test/index.d.ts +1 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +2 -0
- package/package.json +12 -10
- package/dist/src/capabilities/interfaces/o-capability.config.d.ts.map +0 -1
- package/dist/src/capabilities-task/interfaces/o-capability.task-config.d.ts +0 -16
- package/dist/src/capabilities-task/interfaces/o-capability.task-config.d.ts.map +0 -1
- package/dist/src/capabilities-task/o-capability.task-result.d.ts +0 -5
- package/dist/src/capabilities-task/o-capability.task-result.d.ts.map +0 -1
- package/dist/src/capabilities-task/o-capability.task-result.js +0 -3
- package/dist/src/capabilities-task/o-capability.task.d.ts +0 -20
- package/dist/src/capabilities-task/o-capability.task.d.ts.map +0 -1
- package/dist/src/capabilities-task/o-capability.task.js +0 -124
- package/dist/src/storage/prompt-schema.d.ts +0 -42
- package/dist/src/storage/prompt-schema.d.ts.map +0 -1
- package/dist/src/storage/prompt-schema.js +0 -29
- package/dist/src/storage/prompt-seeder.d.ts +0 -42
- package/dist/src/storage/prompt-seeder.d.ts.map +0 -1
- package/dist/src/storage/prompt-seeder.js +0 -141
- package/dist/src/storage/prompt-storage-provider.tool.d.ts +0 -99
- package/dist/src/storage/prompt-storage-provider.tool.d.ts.map +0 -1
- package/dist/src/storage/prompt-storage-provider.tool.js +0 -320
- package/dist/test/prompt-seeder.spec.d.ts +0 -2
- package/dist/test/prompt-seeder.spec.d.ts.map +0 -1
- package/dist/test/prompt-seeder.spec.js +0 -256
- package/dist/test/prompt-storage-provider.spec.d.ts +0 -2
- package/dist/test/prompt-storage-provider.spec.d.ts.map +0 -1
- package/dist/test/prompt-storage-provider.spec.js +0 -457
- /package/dist/src/capabilities/interfaces/{o-capability.config.js → o-capability.config-interface.js} +0 -0
- /package/dist/src/{capabilities-task/interfaces/o-capability.task-config.js → capabilities-execute/interfaces/o-capability.configure-config.js} +0 -0
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
import 'dotenv/config';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
|
-
import { PromptStorageProvider } from '../src/storage/prompt-storage-provider.tool.js';
|
|
4
|
-
import { TestEnvironment, SimpleNodeBuilder } from '@olane/o-node/test/helpers';
|
|
5
|
-
import { assertRunning, assertStopped, assertSuccess, assertError } from '@olane/o-test';
|
|
6
|
-
import { oNodeAddress } from '@olane/o-node';
|
|
7
|
-
describe('PromptStorageProvider', () => {
|
|
8
|
-
const env = new TestEnvironment();
|
|
9
|
-
let storage;
|
|
10
|
-
beforeEach(async () => {
|
|
11
|
-
storage = await new SimpleNodeBuilder(PromptStorageProvider)
|
|
12
|
-
.withAddress(new oNodeAddress('o://prompt-storage-test'))
|
|
13
|
-
.build(env);
|
|
14
|
-
});
|
|
15
|
-
afterEach(async () => {
|
|
16
|
-
await env.cleanup();
|
|
17
|
-
});
|
|
18
|
-
describe('Lifecycle', () => {
|
|
19
|
-
it('should initialize successfully', () => {
|
|
20
|
-
expect(storage).to.exist;
|
|
21
|
-
assertRunning(storage);
|
|
22
|
-
expect(storage.address.toString()).to.equal('o://prompt-storage-test');
|
|
23
|
-
});
|
|
24
|
-
it('should stop successfully', async () => {
|
|
25
|
-
await storage.stop();
|
|
26
|
-
assertStopped(storage);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
describe('Basic CRUD Operations', () => {
|
|
30
|
-
it('should store and retrieve data', async () => {
|
|
31
|
-
const putResult = await storage.use(storage.address, {
|
|
32
|
-
method: 'put',
|
|
33
|
-
params: {
|
|
34
|
-
promptId: 'test-prompt-1',
|
|
35
|
-
key: 'user_name',
|
|
36
|
-
value: 'Alice',
|
|
37
|
-
},
|
|
38
|
-
});
|
|
39
|
-
assertSuccess(putResult);
|
|
40
|
-
const response = await storage.use(storage.address, {
|
|
41
|
-
method: 'get',
|
|
42
|
-
params: {
|
|
43
|
-
promptId: 'test-prompt-1',
|
|
44
|
-
key: 'user_name',
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
assertSuccess(response);
|
|
48
|
-
expect(response.result.data.value).to.equal('Alice');
|
|
49
|
-
});
|
|
50
|
-
it('should return null for non-existent key', async () => {
|
|
51
|
-
const result = await storage.use(storage.address, {
|
|
52
|
-
method: 'get',
|
|
53
|
-
params: {
|
|
54
|
-
promptId: 'test-prompt-1',
|
|
55
|
-
key: 'nonexistent',
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
assertSuccess(result);
|
|
59
|
-
expect(result.result.data.value).to.be.null;
|
|
60
|
-
});
|
|
61
|
-
it('should return null for non-existent prompt', async () => {
|
|
62
|
-
const result = await storage.use(storage.address, {
|
|
63
|
-
method: 'get',
|
|
64
|
-
params: {
|
|
65
|
-
promptId: 'nonexistent-prompt',
|
|
66
|
-
key: 'some_key',
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
assertSuccess(result);
|
|
70
|
-
expect(result.result.data.value).to.be.null;
|
|
71
|
-
});
|
|
72
|
-
it('should delete data', async () => {
|
|
73
|
-
// Store data first
|
|
74
|
-
await storage.use(storage.address, {
|
|
75
|
-
method: 'put',
|
|
76
|
-
params: {
|
|
77
|
-
promptId: 'test-prompt-1',
|
|
78
|
-
key: 'temp_data',
|
|
79
|
-
value: 'temporary',
|
|
80
|
-
},
|
|
81
|
-
});
|
|
82
|
-
// Verify it exists
|
|
83
|
-
const beforeDelete = await storage.use(storage.address, {
|
|
84
|
-
method: 'get',
|
|
85
|
-
params: {
|
|
86
|
-
promptId: 'test-prompt-1',
|
|
87
|
-
key: 'temp_data',
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
assertSuccess(beforeDelete);
|
|
91
|
-
expect(beforeDelete.result.data.value).to.equal('temporary');
|
|
92
|
-
// Delete it
|
|
93
|
-
const deleteResult = await storage.use(storage.address, {
|
|
94
|
-
method: 'delete',
|
|
95
|
-
params: {
|
|
96
|
-
promptId: 'test-prompt-1',
|
|
97
|
-
key: 'temp_data',
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
assertSuccess(deleteResult);
|
|
101
|
-
// Verify it's gone
|
|
102
|
-
const afterDelete = await storage.use(storage.address, {
|
|
103
|
-
method: 'get',
|
|
104
|
-
params: {
|
|
105
|
-
promptId: 'test-prompt-1',
|
|
106
|
-
key: 'temp_data',
|
|
107
|
-
},
|
|
108
|
-
});
|
|
109
|
-
assertSuccess(afterDelete);
|
|
110
|
-
expect(afterDelete.result.data.value).to.be.null;
|
|
111
|
-
});
|
|
112
|
-
it('should check key existence with has', async () => {
|
|
113
|
-
// Check non-existent key
|
|
114
|
-
const beforePut = await storage.use(storage.address, {
|
|
115
|
-
method: 'has',
|
|
116
|
-
params: {
|
|
117
|
-
promptId: 'test-prompt-1',
|
|
118
|
-
key: 'test_key',
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
assertSuccess(beforePut);
|
|
122
|
-
expect(beforePut.result.data.success).to.be.false;
|
|
123
|
-
// Store data
|
|
124
|
-
await storage.use(storage.address, {
|
|
125
|
-
method: 'put',
|
|
126
|
-
params: {
|
|
127
|
-
promptId: 'test-prompt-1',
|
|
128
|
-
key: 'test_key',
|
|
129
|
-
value: 'test_value',
|
|
130
|
-
},
|
|
131
|
-
});
|
|
132
|
-
// Check existing key
|
|
133
|
-
const afterPut = await storage.use(storage.address, {
|
|
134
|
-
method: 'has',
|
|
135
|
-
params: {
|
|
136
|
-
promptId: 'test-prompt-1',
|
|
137
|
-
key: 'test_key',
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
assertSuccess(afterPut);
|
|
141
|
-
expect(afterPut.result.data.success).to.be.true;
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
describe('Prompt Isolation', () => {
|
|
145
|
-
it('should isolate data between different prompts', async () => {
|
|
146
|
-
// Store same key in different prompts
|
|
147
|
-
await storage.use(storage.address, {
|
|
148
|
-
method: 'put',
|
|
149
|
-
params: {
|
|
150
|
-
promptId: 'prompt-1',
|
|
151
|
-
key: 'shared_key',
|
|
152
|
-
value: 'value-1',
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
await storage.use(storage.address, {
|
|
156
|
-
method: 'put',
|
|
157
|
-
params: {
|
|
158
|
-
promptId: 'prompt-2',
|
|
159
|
-
key: 'shared_key',
|
|
160
|
-
value: 'value-2',
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
// Verify each prompt has its own value
|
|
164
|
-
const result1 = await storage.use(storage.address, {
|
|
165
|
-
method: 'get',
|
|
166
|
-
params: {
|
|
167
|
-
promptId: 'prompt-1',
|
|
168
|
-
key: 'shared_key',
|
|
169
|
-
},
|
|
170
|
-
});
|
|
171
|
-
expect(result1.result.data.value).to.equal('value-1');
|
|
172
|
-
const result2 = await storage.use(storage.address, {
|
|
173
|
-
method: 'get',
|
|
174
|
-
params: {
|
|
175
|
-
promptId: 'prompt-2',
|
|
176
|
-
key: 'shared_key',
|
|
177
|
-
},
|
|
178
|
-
});
|
|
179
|
-
expect(result2.result.data.value).to.equal('value-2');
|
|
180
|
-
});
|
|
181
|
-
it('should not leak data between prompts on delete', async () => {
|
|
182
|
-
// Store in both prompts
|
|
183
|
-
await storage.use(storage.address, {
|
|
184
|
-
method: 'put',
|
|
185
|
-
params: { promptId: 'prompt-1', key: 'key', value: 'value-1' },
|
|
186
|
-
});
|
|
187
|
-
await storage.use(storage.address, {
|
|
188
|
-
method: 'put',
|
|
189
|
-
params: { promptId: 'prompt-2', key: 'key', value: 'value-2' },
|
|
190
|
-
});
|
|
191
|
-
// Delete from prompt-1
|
|
192
|
-
await storage.use(storage.address, {
|
|
193
|
-
method: 'delete',
|
|
194
|
-
params: { promptId: 'prompt-1', key: 'key' },
|
|
195
|
-
});
|
|
196
|
-
// Verify prompt-1 is deleted
|
|
197
|
-
const result1 = await storage.use(storage.address, {
|
|
198
|
-
method: 'get',
|
|
199
|
-
params: { promptId: 'prompt-1', key: 'key' },
|
|
200
|
-
});
|
|
201
|
-
expect(result1.result.data.value).to.be.null;
|
|
202
|
-
// Verify prompt-2 is unaffected
|
|
203
|
-
const result2 = await storage.use(storage.address, {
|
|
204
|
-
method: 'get',
|
|
205
|
-
params: { promptId: 'prompt-2', key: 'key' },
|
|
206
|
-
});
|
|
207
|
-
expect(result2.result.data.value).to.equal('value-2');
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
describe('Prompt Management', () => {
|
|
211
|
-
it('should list all prompts', async () => {
|
|
212
|
-
// Store data in multiple prompts
|
|
213
|
-
await storage.use(storage.address, {
|
|
214
|
-
method: 'put',
|
|
215
|
-
params: { promptId: 'prompt-1', key: 'key1', value: 'value1' },
|
|
216
|
-
});
|
|
217
|
-
await storage.use(storage.address, {
|
|
218
|
-
method: 'put',
|
|
219
|
-
params: { promptId: 'prompt-2', key: 'key2', value: 'value2' },
|
|
220
|
-
});
|
|
221
|
-
await storage.use(storage.address, {
|
|
222
|
-
method: 'put',
|
|
223
|
-
params: { promptId: 'prompt-3', key: 'key3', value: 'value3' },
|
|
224
|
-
});
|
|
225
|
-
// List prompts
|
|
226
|
-
const result = await storage.use(storage.address, {
|
|
227
|
-
method: 'list_prompts',
|
|
228
|
-
params: {},
|
|
229
|
-
});
|
|
230
|
-
assertSuccess(result);
|
|
231
|
-
expect(result.result.data.count).to.equal(3);
|
|
232
|
-
expect(result.result.data.promptIds).to.have.members([
|
|
233
|
-
'prompt-1',
|
|
234
|
-
'prompt-2',
|
|
235
|
-
'prompt-3',
|
|
236
|
-
]);
|
|
237
|
-
});
|
|
238
|
-
it('should clear a specific prompt', async () => {
|
|
239
|
-
// Store multiple keys in a prompt
|
|
240
|
-
await storage.use(storage.address, {
|
|
241
|
-
method: 'put',
|
|
242
|
-
params: { promptId: 'prompt-1', key: 'key1', value: 'value1' },
|
|
243
|
-
});
|
|
244
|
-
await storage.use(storage.address, {
|
|
245
|
-
method: 'put',
|
|
246
|
-
params: { promptId: 'prompt-1', key: 'key2', value: 'value2' },
|
|
247
|
-
});
|
|
248
|
-
await storage.use(storage.address, {
|
|
249
|
-
method: 'put',
|
|
250
|
-
params: { promptId: 'prompt-1', key: 'key3', value: 'value3' },
|
|
251
|
-
});
|
|
252
|
-
// Clear the prompt
|
|
253
|
-
const clearResult = await storage.use(storage.address, {
|
|
254
|
-
method: 'clear_prompt',
|
|
255
|
-
params: { promptId: 'prompt-1' },
|
|
256
|
-
});
|
|
257
|
-
assertSuccess(clearResult);
|
|
258
|
-
expect(clearResult.result.data.success).to.be.true;
|
|
259
|
-
expect(clearResult.result.data.keysDeleted).to.equal(3);
|
|
260
|
-
// Verify all keys are gone
|
|
261
|
-
const getResult = await storage.use(storage.address, {
|
|
262
|
-
method: 'get',
|
|
263
|
-
params: { promptId: 'prompt-1', key: 'key1' },
|
|
264
|
-
});
|
|
265
|
-
assertSuccess(getResult);
|
|
266
|
-
expect(getResult.result.data.value).to.be.null;
|
|
267
|
-
});
|
|
268
|
-
it('should get keys for a specific prompt', async () => {
|
|
269
|
-
// Store multiple keys
|
|
270
|
-
await storage.use(storage.address, {
|
|
271
|
-
method: 'put',
|
|
272
|
-
params: { promptId: 'prompt-1', key: 'name', value: 'Alice' },
|
|
273
|
-
});
|
|
274
|
-
await storage.use(storage.address, {
|
|
275
|
-
method: 'put',
|
|
276
|
-
params: { promptId: 'prompt-1', key: 'email', value: 'alice@example.com' },
|
|
277
|
-
});
|
|
278
|
-
await storage.use(storage.address, {
|
|
279
|
-
method: 'put',
|
|
280
|
-
params: { promptId: 'prompt-1', key: 'role', value: 'admin' },
|
|
281
|
-
});
|
|
282
|
-
// Get keys
|
|
283
|
-
const result = await storage.use(storage.address, {
|
|
284
|
-
method: 'get_prompt_keys',
|
|
285
|
-
params: { promptId: 'prompt-1' },
|
|
286
|
-
});
|
|
287
|
-
assertSuccess(result);
|
|
288
|
-
expect(result.result.data.count).to.equal(3);
|
|
289
|
-
expect(result.result.data.keys).to.have.members(['name', 'email', 'role']);
|
|
290
|
-
});
|
|
291
|
-
it('should get stats for a specific prompt', async () => {
|
|
292
|
-
// Store some data
|
|
293
|
-
await storage.use(storage.address, {
|
|
294
|
-
method: 'put',
|
|
295
|
-
params: { promptId: 'prompt-1', key: 'key1', value: 'value1' },
|
|
296
|
-
});
|
|
297
|
-
await storage.use(storage.address, {
|
|
298
|
-
method: 'put',
|
|
299
|
-
params: { promptId: 'prompt-1', key: 'key2', value: 'value2' },
|
|
300
|
-
});
|
|
301
|
-
// Get stats
|
|
302
|
-
const result = await storage.use(storage.address, {
|
|
303
|
-
method: 'get_prompt_stats',
|
|
304
|
-
params: { promptId: 'prompt-1' },
|
|
305
|
-
});
|
|
306
|
-
assertSuccess(result);
|
|
307
|
-
expect(result.result.data.promptId).to.equal('prompt-1');
|
|
308
|
-
expect(result.result.data.keyCount).to.equal(2);
|
|
309
|
-
expect(result.result.data.exists).to.be.true;
|
|
310
|
-
expect(result.result.data.lastAccessed).to.be.a('number');
|
|
311
|
-
expect(result.result.data.createdAt).to.be.a('number');
|
|
312
|
-
});
|
|
313
|
-
it('should return empty stats for non-existent prompt', async () => {
|
|
314
|
-
const result = await storage.use(storage.address, {
|
|
315
|
-
method: 'get_prompt_stats',
|
|
316
|
-
params: { promptId: 'nonexistent' },
|
|
317
|
-
});
|
|
318
|
-
assertSuccess(result);
|
|
319
|
-
expect(result.result.data.exists).to.be.false;
|
|
320
|
-
expect(result.result.data.keyCount).to.equal(0);
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
describe('Validation', () => {
|
|
324
|
-
it('should throw error for missing promptId in put', async () => {
|
|
325
|
-
const response = await storage.use(storage.address, {
|
|
326
|
-
method: 'put',
|
|
327
|
-
params: { key: 'key', value: 'value' },
|
|
328
|
-
});
|
|
329
|
-
assertError(response, 'Missing required parameters');
|
|
330
|
-
});
|
|
331
|
-
it('should throw error for missing key in put', async () => {
|
|
332
|
-
const result = await storage.use(storage.address, {
|
|
333
|
-
method: 'put',
|
|
334
|
-
params: { promptId: 'prompt-1', value: 'value' },
|
|
335
|
-
});
|
|
336
|
-
assertError(result, 'Missing required parameters');
|
|
337
|
-
});
|
|
338
|
-
it('should throw error for missing value in put', async () => {
|
|
339
|
-
const result = await storage.use(storage.address, {
|
|
340
|
-
method: 'put',
|
|
341
|
-
params: { promptId: 'prompt-1', key: 'key' },
|
|
342
|
-
});
|
|
343
|
-
assertError(result, 'Missing required parameters');
|
|
344
|
-
});
|
|
345
|
-
it('should throw error for invalid promptId type', async () => {
|
|
346
|
-
const result = await storage.use(storage.address, {
|
|
347
|
-
method: 'get',
|
|
348
|
-
params: { promptId: 123, key: 'key' },
|
|
349
|
-
});
|
|
350
|
-
assertError(result, 'promptId is required and must be a string');
|
|
351
|
-
});
|
|
352
|
-
});
|
|
353
|
-
describe('Edge Cases', () => {
|
|
354
|
-
it('should handle empty prompt list', async () => {
|
|
355
|
-
const result = await storage.use(storage.address, {
|
|
356
|
-
method: 'list_prompts',
|
|
357
|
-
params: {},
|
|
358
|
-
});
|
|
359
|
-
assertSuccess(result);
|
|
360
|
-
expect(result.result.data.count).to.equal(0);
|
|
361
|
-
expect(result.result.data.promptIds).to.be.an('array').that.is.empty;
|
|
362
|
-
});
|
|
363
|
-
it('should handle clearing non-existent prompt', async () => {
|
|
364
|
-
const result = await storage.use(storage.address, {
|
|
365
|
-
method: 'clear_prompt',
|
|
366
|
-
params: { promptId: 'nonexistent' },
|
|
367
|
-
});
|
|
368
|
-
assertSuccess(result);
|
|
369
|
-
expect(result.result.data.keysDeleted).to.equal(0);
|
|
370
|
-
});
|
|
371
|
-
it('should handle deleting non-existent key', async () => {
|
|
372
|
-
const result = await storage.use(storage.address, {
|
|
373
|
-
method: 'delete',
|
|
374
|
-
params: { promptId: 'prompt-1', key: 'nonexistent' },
|
|
375
|
-
});
|
|
376
|
-
assertSuccess(result);
|
|
377
|
-
});
|
|
378
|
-
it('should handle overwriting existing value', async () => {
|
|
379
|
-
// Store initial value
|
|
380
|
-
await storage.use(storage.address, {
|
|
381
|
-
method: 'put',
|
|
382
|
-
params: { promptId: 'prompt-1', key: 'key', value: 'value1' },
|
|
383
|
-
});
|
|
384
|
-
// Overwrite with new value
|
|
385
|
-
await storage.use(storage.address, {
|
|
386
|
-
method: 'put',
|
|
387
|
-
params: { promptId: 'prompt-1', key: 'key', value: 'value2' },
|
|
388
|
-
});
|
|
389
|
-
// Verify new value
|
|
390
|
-
const result = await storage.use(storage.address, {
|
|
391
|
-
method: 'get',
|
|
392
|
-
params: { promptId: 'prompt-1', key: 'key' },
|
|
393
|
-
});
|
|
394
|
-
assertSuccess(result);
|
|
395
|
-
expect(result.result.data.value).to.equal('value2');
|
|
396
|
-
});
|
|
397
|
-
});
|
|
398
|
-
describe('Max Prompts Limit', () => {
|
|
399
|
-
it('should evict oldest prompt when max limit reached', async () => {
|
|
400
|
-
// Create storage with limit
|
|
401
|
-
await storage.stop();
|
|
402
|
-
storage = await new SimpleNodeBuilder(PromptStorageProvider)
|
|
403
|
-
.withAddress(new oNodeAddress('o://prompt-storage-test'))
|
|
404
|
-
.withConfig({ maxPrompts: 3 })
|
|
405
|
-
.build(env);
|
|
406
|
-
// Add 3 prompts
|
|
407
|
-
await storage.use(storage.address, {
|
|
408
|
-
method: 'put',
|
|
409
|
-
params: { promptId: 'prompt-1', key: 'key', value: 'value1' },
|
|
410
|
-
});
|
|
411
|
-
// Small delay to ensure different timestamps
|
|
412
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
413
|
-
await storage.use(storage.address, {
|
|
414
|
-
method: 'put',
|
|
415
|
-
params: { promptId: 'prompt-2', key: 'key', value: 'value2' },
|
|
416
|
-
});
|
|
417
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
418
|
-
await storage.use(storage.address, {
|
|
419
|
-
method: 'put',
|
|
420
|
-
params: { promptId: 'prompt-3', key: 'key', value: 'value3' },
|
|
421
|
-
});
|
|
422
|
-
// Verify all 3 exist
|
|
423
|
-
const before = await storage.use(storage.address, {
|
|
424
|
-
method: 'list_prompts',
|
|
425
|
-
params: {},
|
|
426
|
-
});
|
|
427
|
-
assertSuccess(before);
|
|
428
|
-
expect(before.result.data.count).to.equal(3);
|
|
429
|
-
// Add 4th prompt (should evict prompt-1)
|
|
430
|
-
await storage.use(storage.address, {
|
|
431
|
-
method: 'put',
|
|
432
|
-
params: { promptId: 'prompt-4', key: 'key', value: 'value4' },
|
|
433
|
-
});
|
|
434
|
-
// Verify only 3 prompts remain
|
|
435
|
-
const after = await storage.use(storage.address, {
|
|
436
|
-
method: 'list_prompts',
|
|
437
|
-
params: {},
|
|
438
|
-
});
|
|
439
|
-
assertSuccess(after);
|
|
440
|
-
expect(after.result.data.count).to.equal(3);
|
|
441
|
-
// Verify prompt-1 was evicted
|
|
442
|
-
const result1 = await storage.use(storage.address, {
|
|
443
|
-
method: 'get',
|
|
444
|
-
params: { promptId: 'prompt-1', key: 'key' },
|
|
445
|
-
});
|
|
446
|
-
assertSuccess(result1);
|
|
447
|
-
expect(result1.result.data.value).to.be.null;
|
|
448
|
-
// Verify prompt-4 exists
|
|
449
|
-
const result4 = await storage.use(storage.address, {
|
|
450
|
-
method: 'get',
|
|
451
|
-
params: { promptId: 'prompt-4', key: 'key' },
|
|
452
|
-
});
|
|
453
|
-
assertSuccess(result4);
|
|
454
|
-
expect(result4.result.data.value).to.equal('value4');
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
});
|
|
File without changes
|