@olane/o-lane 0.7.12-alpha.76 → 0.7.12
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/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/prompts/agent.prompt.d.ts +11 -0
- package/dist/src/prompts/agent.prompt.d.ts.map +1 -1
- package/dist/src/prompts/agent.prompt.js +14 -3
- package/dist/src/prompts/configure.prompt.d.ts +7 -0
- package/dist/src/prompts/configure.prompt.d.ts.map +1 -1
- package/dist/src/prompts/configure.prompt.js +8 -1
- package/dist/src/prompts/custom.prompt.d.ts +7 -0
- package/dist/src/prompts/custom.prompt.d.ts.map +1 -1
- package/dist/src/prompts/custom.prompt.js +77 -0
- package/dist/src/storage/index.d.ts +8 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +12 -0
- package/dist/src/storage/interfaces/prompt-storage.interface.d.ts +102 -0
- package/dist/src/storage/interfaces/prompt-storage.interface.d.ts.map +1 -0
- package/dist/src/storage/methods/prompt-storage.methods.d.ts +9 -0
- package/dist/src/storage/methods/prompt-storage.methods.d.ts.map +1 -0
- package/dist/src/storage/methods/prompt-storage.methods.js +338 -0
- package/dist/src/storage/prompt-loader.d.ts +40 -0
- package/dist/src/storage/prompt-loader.d.ts.map +1 -0
- package/dist/src/storage/prompt-loader.js +126 -0
- package/dist/src/storage/prompt-schema.d.ts +42 -0
- package/dist/src/storage/prompt-schema.d.ts.map +1 -0
- package/dist/src/storage/prompt-schema.js +29 -0
- package/dist/src/storage/prompt-seeder.d.ts +42 -0
- package/dist/src/storage/prompt-seeder.d.ts.map +1 -0
- package/dist/src/storage/prompt-seeder.js +141 -0
- package/dist/src/storage/prompt-storage-provider.tool.d.ts +99 -0
- package/dist/src/storage/prompt-storage-provider.tool.d.ts.map +1 -0
- package/dist/src/storage/prompt-storage-provider.tool.js +320 -0
- package/dist/test/prompt-seeder.spec.d.ts +2 -0
- package/dist/test/prompt-seeder.spec.d.ts.map +1 -0
- package/dist/test/prompt-seeder.spec.js +254 -0
- package/dist/test/prompt-storage-provider.spec.d.ts +2 -0
- package/dist/test/prompt-storage-provider.spec.d.ts.map +1 -0
- package/dist/test/prompt-storage-provider.spec.js +456 -0
- package/package.json +10 -7
- package/dist/src/ag-ui/ag-ui-constants.d.ts +0 -90
- package/dist/src/ag-ui/ag-ui-constants.d.ts.map +0 -1
- package/dist/src/ag-ui/ag-ui-constants.js +0 -113
- package/dist/src/ag-ui/ag-ui-event-mapper.d.ts +0 -88
- package/dist/src/ag-ui/ag-ui-event-mapper.d.ts.map +0 -1
- package/dist/src/ag-ui/ag-ui-event-mapper.js +0 -487
- package/dist/src/ag-ui/ag-ui-olane.tool.d.ts +0 -45
- package/dist/src/ag-ui/ag-ui-olane.tool.d.ts.map +0 -1
- package/dist/src/ag-ui/ag-ui-olane.tool.js +0 -257
- package/dist/src/ag-ui/ag-ui-stream-manager.d.ts +0 -99
- package/dist/src/ag-ui/ag-ui-stream-manager.d.ts.map +0 -1
- package/dist/src/ag-ui/ag-ui-stream-manager.js +0 -160
- package/dist/src/ag-ui/ag-ui-utils.d.ts +0 -50
- package/dist/src/ag-ui/ag-ui-utils.d.ts.map +0 -1
- package/dist/src/ag-ui/ag-ui-utils.js +0 -287
- package/dist/src/ag-ui/index.d.ts +0 -17
- package/dist/src/ag-ui/index.d.ts.map +0 -1
- package/dist/src/ag-ui/index.js +0 -21
- package/dist/src/ag-ui/transports/ag-ui-transport.interface.d.ts +0 -44
- package/dist/src/ag-ui/transports/ag-ui-transport.interface.d.ts.map +0 -1
- package/dist/src/ag-ui/transports/ag-ui-transport.interface.js +0 -26
- package/dist/src/ag-ui/transports/callback-transport.d.ts +0 -13
- package/dist/src/ag-ui/transports/callback-transport.d.ts.map +0 -1
- package/dist/src/ag-ui/transports/callback-transport.js +0 -26
- package/dist/src/ag-ui/transports/console-transport.d.ts +0 -14
- package/dist/src/ag-ui/transports/console-transport.d.ts.map +0 -1
- package/dist/src/ag-ui/transports/console-transport.js +0 -63
- package/dist/src/ag-ui/transports/index.d.ts +0 -5
- package/dist/src/ag-ui/transports/index.d.ts.map +0 -1
- package/dist/src/ag-ui/transports/index.js +0 -4
- package/dist/src/ag-ui/transports/onode-transport.d.ts +0 -34
- package/dist/src/ag-ui/transports/onode-transport.d.ts.map +0 -1
- package/dist/src/ag-ui/transports/onode-transport.js +0 -83
- package/dist/src/ag-ui/types/ag-ui-config.interface.d.ts +0 -105
- package/dist/src/ag-ui/types/ag-ui-config.interface.d.ts.map +0 -1
- package/dist/src/ag-ui/types/ag-ui-event.types.d.ts +0 -266
- package/dist/src/ag-ui/types/ag-ui-event.types.d.ts.map +0 -1
- package/dist/src/ag-ui/types/ag-ui-event.types.js +0 -6
- package/dist/src/ag-ui/types/index.d.ts +0 -3
- package/dist/src/ag-ui/types/index.d.ts.map +0 -1
- package/dist/src/ag-ui/types/index.js +0 -2
- package/dist/test/ai.spec.d.ts +0 -2
- package/dist/test/ai.spec.d.ts.map +0 -1
- package/dist/test/ai.spec.js +0 -19
- /package/dist/src/{ag-ui/types/ag-ui-config.interface.js → storage/interfaces/prompt-storage.interface.js} +0 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { PromptStorageProvider } from '../src/storage/prompt-storage-provider.tool.js';
|
|
4
|
+
import { TestEnvironment, SimpleNodeBuilder, assertRunning, assertStopped, assertSuccess, assertError, } from '@olane/o-test';
|
|
5
|
+
import { oNodeAddress } from '@olane/o-node';
|
|
6
|
+
describe('PromptStorageProvider', () => {
|
|
7
|
+
const env = new TestEnvironment();
|
|
8
|
+
let storage;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
storage = await new SimpleNodeBuilder(PromptStorageProvider)
|
|
11
|
+
.withAddress(new oNodeAddress('o://prompt-storage-test'))
|
|
12
|
+
.build(env);
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
await env.cleanup();
|
|
16
|
+
});
|
|
17
|
+
describe('Lifecycle', () => {
|
|
18
|
+
it('should initialize successfully', () => {
|
|
19
|
+
expect(storage).to.exist;
|
|
20
|
+
assertRunning(storage);
|
|
21
|
+
expect(storage.address.toString()).to.equal('o://prompt-storage-test');
|
|
22
|
+
});
|
|
23
|
+
it('should stop successfully', async () => {
|
|
24
|
+
await storage.stop();
|
|
25
|
+
assertStopped(storage);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('Basic CRUD Operations', () => {
|
|
29
|
+
it('should store and retrieve data', async () => {
|
|
30
|
+
const putResult = await storage.use(storage.address, {
|
|
31
|
+
method: 'put',
|
|
32
|
+
params: {
|
|
33
|
+
promptId: 'test-prompt-1',
|
|
34
|
+
key: 'user_name',
|
|
35
|
+
value: 'Alice',
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
assertSuccess(putResult);
|
|
39
|
+
const response = await storage.use(storage.address, {
|
|
40
|
+
method: 'get',
|
|
41
|
+
params: {
|
|
42
|
+
promptId: 'test-prompt-1',
|
|
43
|
+
key: 'user_name',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
assertSuccess(response);
|
|
47
|
+
expect(response.result.data.value).to.equal('Alice');
|
|
48
|
+
});
|
|
49
|
+
it('should return null for non-existent key', async () => {
|
|
50
|
+
const result = await storage.use(storage.address, {
|
|
51
|
+
method: 'get',
|
|
52
|
+
params: {
|
|
53
|
+
promptId: 'test-prompt-1',
|
|
54
|
+
key: 'nonexistent',
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
assertSuccess(result);
|
|
58
|
+
expect(result.result.data.value).to.be.null;
|
|
59
|
+
});
|
|
60
|
+
it('should return null for non-existent prompt', async () => {
|
|
61
|
+
const result = await storage.use(storage.address, {
|
|
62
|
+
method: 'get',
|
|
63
|
+
params: {
|
|
64
|
+
promptId: 'nonexistent-prompt',
|
|
65
|
+
key: 'some_key',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
assertSuccess(result);
|
|
69
|
+
expect(result.result.data.value).to.be.null;
|
|
70
|
+
});
|
|
71
|
+
it('should delete data', async () => {
|
|
72
|
+
// Store data first
|
|
73
|
+
await storage.use(storage.address, {
|
|
74
|
+
method: 'put',
|
|
75
|
+
params: {
|
|
76
|
+
promptId: 'test-prompt-1',
|
|
77
|
+
key: 'temp_data',
|
|
78
|
+
value: 'temporary',
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
// Verify it exists
|
|
82
|
+
const beforeDelete = await storage.use(storage.address, {
|
|
83
|
+
method: 'get',
|
|
84
|
+
params: {
|
|
85
|
+
promptId: 'test-prompt-1',
|
|
86
|
+
key: 'temp_data',
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
assertSuccess(beforeDelete);
|
|
90
|
+
expect(beforeDelete.result.data.value).to.equal('temporary');
|
|
91
|
+
// Delete it
|
|
92
|
+
const deleteResult = await storage.use(storage.address, {
|
|
93
|
+
method: 'delete',
|
|
94
|
+
params: {
|
|
95
|
+
promptId: 'test-prompt-1',
|
|
96
|
+
key: 'temp_data',
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
assertSuccess(deleteResult);
|
|
100
|
+
// Verify it's gone
|
|
101
|
+
const afterDelete = await storage.use(storage.address, {
|
|
102
|
+
method: 'get',
|
|
103
|
+
params: {
|
|
104
|
+
promptId: 'test-prompt-1',
|
|
105
|
+
key: 'temp_data',
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
assertSuccess(afterDelete);
|
|
109
|
+
expect(afterDelete.result.data.value).to.be.null;
|
|
110
|
+
});
|
|
111
|
+
it('should check key existence with has', async () => {
|
|
112
|
+
// Check non-existent key
|
|
113
|
+
const beforePut = await storage.use(storage.address, {
|
|
114
|
+
method: 'has',
|
|
115
|
+
params: {
|
|
116
|
+
promptId: 'test-prompt-1',
|
|
117
|
+
key: 'test_key',
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
assertSuccess(beforePut);
|
|
121
|
+
expect(beforePut.result.data.success).to.be.false;
|
|
122
|
+
// Store data
|
|
123
|
+
await storage.use(storage.address, {
|
|
124
|
+
method: 'put',
|
|
125
|
+
params: {
|
|
126
|
+
promptId: 'test-prompt-1',
|
|
127
|
+
key: 'test_key',
|
|
128
|
+
value: 'test_value',
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
// Check existing key
|
|
132
|
+
const afterPut = await storage.use(storage.address, {
|
|
133
|
+
method: 'has',
|
|
134
|
+
params: {
|
|
135
|
+
promptId: 'test-prompt-1',
|
|
136
|
+
key: 'test_key',
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
assertSuccess(afterPut);
|
|
140
|
+
expect(afterPut.result.data.success).to.be.true;
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('Prompt Isolation', () => {
|
|
144
|
+
it('should isolate data between different prompts', async () => {
|
|
145
|
+
// Store same key in different prompts
|
|
146
|
+
await storage.use(storage.address, {
|
|
147
|
+
method: 'put',
|
|
148
|
+
params: {
|
|
149
|
+
promptId: 'prompt-1',
|
|
150
|
+
key: 'shared_key',
|
|
151
|
+
value: 'value-1',
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
await storage.use(storage.address, {
|
|
155
|
+
method: 'put',
|
|
156
|
+
params: {
|
|
157
|
+
promptId: 'prompt-2',
|
|
158
|
+
key: 'shared_key',
|
|
159
|
+
value: 'value-2',
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
// Verify each prompt has its own value
|
|
163
|
+
const result1 = await storage.use(storage.address, {
|
|
164
|
+
method: 'get',
|
|
165
|
+
params: {
|
|
166
|
+
promptId: 'prompt-1',
|
|
167
|
+
key: 'shared_key',
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
expect(result1.result.data.value).to.equal('value-1');
|
|
171
|
+
const result2 = await storage.use(storage.address, {
|
|
172
|
+
method: 'get',
|
|
173
|
+
params: {
|
|
174
|
+
promptId: 'prompt-2',
|
|
175
|
+
key: 'shared_key',
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
expect(result2.result.data.value).to.equal('value-2');
|
|
179
|
+
});
|
|
180
|
+
it('should not leak data between prompts on delete', async () => {
|
|
181
|
+
// Store in both prompts
|
|
182
|
+
await storage.use(storage.address, {
|
|
183
|
+
method: 'put',
|
|
184
|
+
params: { promptId: 'prompt-1', key: 'key', value: 'value-1' },
|
|
185
|
+
});
|
|
186
|
+
await storage.use(storage.address, {
|
|
187
|
+
method: 'put',
|
|
188
|
+
params: { promptId: 'prompt-2', key: 'key', value: 'value-2' },
|
|
189
|
+
});
|
|
190
|
+
// Delete from prompt-1
|
|
191
|
+
await storage.use(storage.address, {
|
|
192
|
+
method: 'delete',
|
|
193
|
+
params: { promptId: 'prompt-1', key: 'key' },
|
|
194
|
+
});
|
|
195
|
+
// Verify prompt-1 is deleted
|
|
196
|
+
const result1 = await storage.use(storage.address, {
|
|
197
|
+
method: 'get',
|
|
198
|
+
params: { promptId: 'prompt-1', key: 'key' },
|
|
199
|
+
});
|
|
200
|
+
expect(result1.result.data.value).to.be.null;
|
|
201
|
+
// Verify prompt-2 is unaffected
|
|
202
|
+
const result2 = await storage.use(storage.address, {
|
|
203
|
+
method: 'get',
|
|
204
|
+
params: { promptId: 'prompt-2', key: 'key' },
|
|
205
|
+
});
|
|
206
|
+
expect(result2.result.data.value).to.equal('value-2');
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('Prompt Management', () => {
|
|
210
|
+
it('should list all prompts', async () => {
|
|
211
|
+
// Store data in multiple prompts
|
|
212
|
+
await storage.use(storage.address, {
|
|
213
|
+
method: 'put',
|
|
214
|
+
params: { promptId: 'prompt-1', key: 'key1', value: 'value1' },
|
|
215
|
+
});
|
|
216
|
+
await storage.use(storage.address, {
|
|
217
|
+
method: 'put',
|
|
218
|
+
params: { promptId: 'prompt-2', key: 'key2', value: 'value2' },
|
|
219
|
+
});
|
|
220
|
+
await storage.use(storage.address, {
|
|
221
|
+
method: 'put',
|
|
222
|
+
params: { promptId: 'prompt-3', key: 'key3', value: 'value3' },
|
|
223
|
+
});
|
|
224
|
+
// List prompts
|
|
225
|
+
const result = await storage.use(storage.address, {
|
|
226
|
+
method: 'list_prompts',
|
|
227
|
+
params: {},
|
|
228
|
+
});
|
|
229
|
+
assertSuccess(result);
|
|
230
|
+
expect(result.result.data.count).to.equal(3);
|
|
231
|
+
expect(result.result.data.promptIds).to.have.members([
|
|
232
|
+
'prompt-1',
|
|
233
|
+
'prompt-2',
|
|
234
|
+
'prompt-3',
|
|
235
|
+
]);
|
|
236
|
+
});
|
|
237
|
+
it('should clear a specific prompt', async () => {
|
|
238
|
+
// Store multiple keys in a prompt
|
|
239
|
+
await storage.use(storage.address, {
|
|
240
|
+
method: 'put',
|
|
241
|
+
params: { promptId: 'prompt-1', key: 'key1', value: 'value1' },
|
|
242
|
+
});
|
|
243
|
+
await storage.use(storage.address, {
|
|
244
|
+
method: 'put',
|
|
245
|
+
params: { promptId: 'prompt-1', key: 'key2', value: 'value2' },
|
|
246
|
+
});
|
|
247
|
+
await storage.use(storage.address, {
|
|
248
|
+
method: 'put',
|
|
249
|
+
params: { promptId: 'prompt-1', key: 'key3', value: 'value3' },
|
|
250
|
+
});
|
|
251
|
+
// Clear the prompt
|
|
252
|
+
const clearResult = await storage.use(storage.address, {
|
|
253
|
+
method: 'clear_prompt',
|
|
254
|
+
params: { promptId: 'prompt-1' },
|
|
255
|
+
});
|
|
256
|
+
assertSuccess(clearResult);
|
|
257
|
+
expect(clearResult.result.data.success).to.be.true;
|
|
258
|
+
expect(clearResult.result.data.keysDeleted).to.equal(3);
|
|
259
|
+
// Verify all keys are gone
|
|
260
|
+
const getResult = await storage.use(storage.address, {
|
|
261
|
+
method: 'get',
|
|
262
|
+
params: { promptId: 'prompt-1', key: 'key1' },
|
|
263
|
+
});
|
|
264
|
+
assertSuccess(getResult);
|
|
265
|
+
expect(getResult.result.data.value).to.be.null;
|
|
266
|
+
});
|
|
267
|
+
it('should get keys for a specific prompt', async () => {
|
|
268
|
+
// Store multiple keys
|
|
269
|
+
await storage.use(storage.address, {
|
|
270
|
+
method: 'put',
|
|
271
|
+
params: { promptId: 'prompt-1', key: 'name', value: 'Alice' },
|
|
272
|
+
});
|
|
273
|
+
await storage.use(storage.address, {
|
|
274
|
+
method: 'put',
|
|
275
|
+
params: { promptId: 'prompt-1', key: 'email', value: 'alice@example.com' },
|
|
276
|
+
});
|
|
277
|
+
await storage.use(storage.address, {
|
|
278
|
+
method: 'put',
|
|
279
|
+
params: { promptId: 'prompt-1', key: 'role', value: 'admin' },
|
|
280
|
+
});
|
|
281
|
+
// Get keys
|
|
282
|
+
const result = await storage.use(storage.address, {
|
|
283
|
+
method: 'get_prompt_keys',
|
|
284
|
+
params: { promptId: 'prompt-1' },
|
|
285
|
+
});
|
|
286
|
+
assertSuccess(result);
|
|
287
|
+
expect(result.result.data.count).to.equal(3);
|
|
288
|
+
expect(result.result.data.keys).to.have.members(['name', 'email', 'role']);
|
|
289
|
+
});
|
|
290
|
+
it('should get stats for a specific prompt', async () => {
|
|
291
|
+
// Store some data
|
|
292
|
+
await storage.use(storage.address, {
|
|
293
|
+
method: 'put',
|
|
294
|
+
params: { promptId: 'prompt-1', key: 'key1', value: 'value1' },
|
|
295
|
+
});
|
|
296
|
+
await storage.use(storage.address, {
|
|
297
|
+
method: 'put',
|
|
298
|
+
params: { promptId: 'prompt-1', key: 'key2', value: 'value2' },
|
|
299
|
+
});
|
|
300
|
+
// Get stats
|
|
301
|
+
const result = await storage.use(storage.address, {
|
|
302
|
+
method: 'get_prompt_stats',
|
|
303
|
+
params: { promptId: 'prompt-1' },
|
|
304
|
+
});
|
|
305
|
+
assertSuccess(result);
|
|
306
|
+
expect(result.result.data.promptId).to.equal('prompt-1');
|
|
307
|
+
expect(result.result.data.keyCount).to.equal(2);
|
|
308
|
+
expect(result.result.data.exists).to.be.true;
|
|
309
|
+
expect(result.result.data.lastAccessed).to.be.a('number');
|
|
310
|
+
expect(result.result.data.createdAt).to.be.a('number');
|
|
311
|
+
});
|
|
312
|
+
it('should return empty stats for non-existent prompt', async () => {
|
|
313
|
+
const result = await storage.use(storage.address, {
|
|
314
|
+
method: 'get_prompt_stats',
|
|
315
|
+
params: { promptId: 'nonexistent' },
|
|
316
|
+
});
|
|
317
|
+
assertSuccess(result);
|
|
318
|
+
expect(result.result.data.exists).to.be.false;
|
|
319
|
+
expect(result.result.data.keyCount).to.equal(0);
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
describe('Validation', () => {
|
|
323
|
+
it('should throw error for missing promptId in put', async () => {
|
|
324
|
+
const response = await storage.use(storage.address, {
|
|
325
|
+
method: 'put',
|
|
326
|
+
params: { key: 'key', value: 'value' },
|
|
327
|
+
});
|
|
328
|
+
assertError(response, 'Missing required parameters');
|
|
329
|
+
});
|
|
330
|
+
it('should throw error for missing key in put', async () => {
|
|
331
|
+
const result = await storage.use(storage.address, {
|
|
332
|
+
method: 'put',
|
|
333
|
+
params: { promptId: 'prompt-1', value: 'value' },
|
|
334
|
+
});
|
|
335
|
+
assertError(result, 'Missing required parameters');
|
|
336
|
+
});
|
|
337
|
+
it('should throw error for missing value in put', async () => {
|
|
338
|
+
const result = await storage.use(storage.address, {
|
|
339
|
+
method: 'put',
|
|
340
|
+
params: { promptId: 'prompt-1', key: 'key' },
|
|
341
|
+
});
|
|
342
|
+
assertError(result, 'Missing required parameters');
|
|
343
|
+
});
|
|
344
|
+
it('should throw error for invalid promptId type', async () => {
|
|
345
|
+
const result = await storage.use(storage.address, {
|
|
346
|
+
method: 'get',
|
|
347
|
+
params: { promptId: 123, key: 'key' },
|
|
348
|
+
});
|
|
349
|
+
assertError(result, 'promptId is required and must be a string');
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
describe('Edge Cases', () => {
|
|
353
|
+
it('should handle empty prompt list', async () => {
|
|
354
|
+
const result = await storage.use(storage.address, {
|
|
355
|
+
method: 'list_prompts',
|
|
356
|
+
params: {},
|
|
357
|
+
});
|
|
358
|
+
assertSuccess(result);
|
|
359
|
+
expect(result.result.data.count).to.equal(0);
|
|
360
|
+
expect(result.result.data.promptIds).to.be.an('array').that.is.empty;
|
|
361
|
+
});
|
|
362
|
+
it('should handle clearing non-existent prompt', async () => {
|
|
363
|
+
const result = await storage.use(storage.address, {
|
|
364
|
+
method: 'clear_prompt',
|
|
365
|
+
params: { promptId: 'nonexistent' },
|
|
366
|
+
});
|
|
367
|
+
assertSuccess(result);
|
|
368
|
+
expect(result.result.data.keysDeleted).to.equal(0);
|
|
369
|
+
});
|
|
370
|
+
it('should handle deleting non-existent key', async () => {
|
|
371
|
+
const result = await storage.use(storage.address, {
|
|
372
|
+
method: 'delete',
|
|
373
|
+
params: { promptId: 'prompt-1', key: 'nonexistent' },
|
|
374
|
+
});
|
|
375
|
+
assertSuccess(result);
|
|
376
|
+
});
|
|
377
|
+
it('should handle overwriting existing value', async () => {
|
|
378
|
+
// Store initial value
|
|
379
|
+
await storage.use(storage.address, {
|
|
380
|
+
method: 'put',
|
|
381
|
+
params: { promptId: 'prompt-1', key: 'key', value: 'value1' },
|
|
382
|
+
});
|
|
383
|
+
// Overwrite with new value
|
|
384
|
+
await storage.use(storage.address, {
|
|
385
|
+
method: 'put',
|
|
386
|
+
params: { promptId: 'prompt-1', key: 'key', value: 'value2' },
|
|
387
|
+
});
|
|
388
|
+
// Verify new value
|
|
389
|
+
const result = await storage.use(storage.address, {
|
|
390
|
+
method: 'get',
|
|
391
|
+
params: { promptId: 'prompt-1', key: 'key' },
|
|
392
|
+
});
|
|
393
|
+
assertSuccess(result);
|
|
394
|
+
expect(result.result.data.value).to.equal('value2');
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
describe('Max Prompts Limit', () => {
|
|
398
|
+
it('should evict oldest prompt when max limit reached', async () => {
|
|
399
|
+
// Create storage with limit
|
|
400
|
+
await storage.stop();
|
|
401
|
+
storage = await new SimpleNodeBuilder(PromptStorageProvider)
|
|
402
|
+
.withAddress(new oNodeAddress('o://prompt-storage-test'))
|
|
403
|
+
.withConfig({ maxPrompts: 3 })
|
|
404
|
+
.build(env);
|
|
405
|
+
// Add 3 prompts
|
|
406
|
+
await storage.use(storage.address, {
|
|
407
|
+
method: 'put',
|
|
408
|
+
params: { promptId: 'prompt-1', key: 'key', value: 'value1' },
|
|
409
|
+
});
|
|
410
|
+
// Small delay to ensure different timestamps
|
|
411
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
412
|
+
await storage.use(storage.address, {
|
|
413
|
+
method: 'put',
|
|
414
|
+
params: { promptId: 'prompt-2', key: 'key', value: 'value2' },
|
|
415
|
+
});
|
|
416
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
417
|
+
await storage.use(storage.address, {
|
|
418
|
+
method: 'put',
|
|
419
|
+
params: { promptId: 'prompt-3', key: 'key', value: 'value3' },
|
|
420
|
+
});
|
|
421
|
+
// Verify all 3 exist
|
|
422
|
+
const before = await storage.use(storage.address, {
|
|
423
|
+
method: 'list_prompts',
|
|
424
|
+
params: {},
|
|
425
|
+
});
|
|
426
|
+
assertSuccess(before);
|
|
427
|
+
expect(before.result.data.count).to.equal(3);
|
|
428
|
+
// Add 4th prompt (should evict prompt-1)
|
|
429
|
+
await storage.use(storage.address, {
|
|
430
|
+
method: 'put',
|
|
431
|
+
params: { promptId: 'prompt-4', key: 'key', value: 'value4' },
|
|
432
|
+
});
|
|
433
|
+
// Verify only 3 prompts remain
|
|
434
|
+
const after = await storage.use(storage.address, {
|
|
435
|
+
method: 'list_prompts',
|
|
436
|
+
params: {},
|
|
437
|
+
});
|
|
438
|
+
assertSuccess(after);
|
|
439
|
+
expect(after.result.data.count).to.equal(3);
|
|
440
|
+
// Verify prompt-1 was evicted
|
|
441
|
+
const result1 = await storage.use(storage.address, {
|
|
442
|
+
method: 'get',
|
|
443
|
+
params: { promptId: 'prompt-1', key: 'key' },
|
|
444
|
+
});
|
|
445
|
+
assertSuccess(result1);
|
|
446
|
+
expect(result1.result.data.value).to.be.null;
|
|
447
|
+
// Verify prompt-4 exists
|
|
448
|
+
const result4 = await storage.use(storage.address, {
|
|
449
|
+
method: 'get',
|
|
450
|
+
params: { promptId: 'prompt-4', key: 'key' },
|
|
451
|
+
});
|
|
452
|
+
assertSuccess(result4);
|
|
453
|
+
expect(result4.result.data.value).to.equal('value4');
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@olane/o-lane",
|
|
3
|
-
"version": "0.7.12
|
|
3
|
+
"version": "0.7.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -36,11 +36,13 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@eslint/eslintrc": "^3.3.1",
|
|
38
38
|
"@eslint/js": "^9.29.0",
|
|
39
|
+
"@olane/o-test": "0.7.12",
|
|
39
40
|
"@tsconfig/node20": "^20.1.6",
|
|
40
41
|
"@types/jest": "^30.0.0",
|
|
41
42
|
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
|
42
43
|
"@typescript-eslint/parser": "^8.34.1",
|
|
43
44
|
"aegir": "^47.0.21",
|
|
45
|
+
"chai": "^5.1.2",
|
|
44
46
|
"eslint": "^9.29.0",
|
|
45
47
|
"eslint-config-prettier": "^10.1.6",
|
|
46
48
|
"eslint-plugin-prettier": "^5.5.0",
|
|
@@ -54,13 +56,14 @@
|
|
|
54
56
|
"typescript": "5.4.5"
|
|
55
57
|
},
|
|
56
58
|
"dependencies": {
|
|
57
|
-
"@olane/o-config": "0.7.12
|
|
58
|
-
"@olane/o-core": "0.7.12
|
|
59
|
-
"@olane/o-node": "0.7.12
|
|
60
|
-
"@olane/o-protocol": "0.7.12
|
|
61
|
-
"@olane/o-
|
|
59
|
+
"@olane/o-config": "0.7.12",
|
|
60
|
+
"@olane/o-core": "0.7.12",
|
|
61
|
+
"@olane/o-node": "0.7.12",
|
|
62
|
+
"@olane/o-protocol": "0.7.12",
|
|
63
|
+
"@olane/o-storage": "0.7.12",
|
|
64
|
+
"@olane/o-tool": "0.7.12",
|
|
62
65
|
"debug": "^4.4.1",
|
|
63
66
|
"dotenv": "^16.5.0"
|
|
64
67
|
},
|
|
65
|
-
"gitHead": "
|
|
68
|
+
"gitHead": "580d8c51fe0a12695ba1d77f077029200f0c8af4"
|
|
66
69
|
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AG-UI Protocol Constants
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* AG-UI protocol version this implementation supports
|
|
6
|
-
*/
|
|
7
|
-
export declare const AG_UI_PROTOCOL_VERSION = "1.0.0";
|
|
8
|
-
/**
|
|
9
|
-
* Default configuration values
|
|
10
|
-
*/
|
|
11
|
-
export declare const AG_UI_DEFAULTS: {
|
|
12
|
-
/**
|
|
13
|
-
* Default state snapshot interval (every N cycles)
|
|
14
|
-
*/
|
|
15
|
-
STATE_SNAPSHOT_INTERVAL: number;
|
|
16
|
-
/**
|
|
17
|
-
* Maximum delta history to keep
|
|
18
|
-
*/
|
|
19
|
-
MAX_DELTA_HISTORY: number;
|
|
20
|
-
/**
|
|
21
|
-
* Default text chunk size for streaming
|
|
22
|
-
*/
|
|
23
|
-
TEXT_CHUNK_SIZE: number;
|
|
24
|
-
/**
|
|
25
|
-
* Enable debug logging by default
|
|
26
|
-
*/
|
|
27
|
-
DEBUG_ENABLED: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* Enable AG-UI by default
|
|
30
|
-
*/
|
|
31
|
-
AGUI_ENABLED: boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Emit activity events by default
|
|
34
|
-
*/
|
|
35
|
-
EMIT_ACTIVITY_EVENTS: boolean;
|
|
36
|
-
/**
|
|
37
|
-
* Emit reasoning events by default
|
|
38
|
-
*/
|
|
39
|
-
EMIT_REASONING_EVENTS: boolean;
|
|
40
|
-
/**
|
|
41
|
-
* Include raw events by default
|
|
42
|
-
*/
|
|
43
|
-
INCLUDE_RAW_EVENTS: boolean;
|
|
44
|
-
/**
|
|
45
|
-
* Auto-generate thread ID by default
|
|
46
|
-
*/
|
|
47
|
-
AUTO_GENERATE_THREAD_ID: boolean;
|
|
48
|
-
};
|
|
49
|
-
/**
|
|
50
|
-
* Activity types for AG-UI activity events
|
|
51
|
-
*/
|
|
52
|
-
export declare const ACTIVITY_TYPES: {
|
|
53
|
-
readonly PLAN: "PLAN";
|
|
54
|
-
readonly EXECUTE: "EXECUTE";
|
|
55
|
-
readonly EVALUATE: "EVALUATE";
|
|
56
|
-
readonly SEARCH: "SEARCH";
|
|
57
|
-
readonly CONFIGURE: "CONFIGURE";
|
|
58
|
-
readonly ERROR: "ERROR";
|
|
59
|
-
readonly PROGRESS: "PROGRESS";
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Event type categories for filtering
|
|
63
|
-
*/
|
|
64
|
-
export declare const EVENT_CATEGORIES: {
|
|
65
|
-
readonly LIFECYCLE: readonly ["RunStarted", "RunFinished", "RunError", "StepStarted", "StepFinished"];
|
|
66
|
-
readonly MESSAGES: readonly ["TextMessageStart", "TextMessageContent", "TextMessageEnd", "TextMessageChunk"];
|
|
67
|
-
readonly TOOL_CALLS: readonly ["ToolCallStart", "ToolCallArgs", "ToolCallEnd", "ToolCallResult", "ToolCallChunk"];
|
|
68
|
-
readonly STATE: readonly ["StateSnapshot", "StateDelta", "MessagesSnapshot"];
|
|
69
|
-
readonly ACTIVITY: readonly ["ActivitySnapshot", "ActivityDelta"];
|
|
70
|
-
readonly SPECIAL: readonly ["Raw", "Custom"];
|
|
71
|
-
readonly REASONING: readonly ["ReasoningStart", "ReasoningEnd", "ReasoningMessageStart", "ReasoningMessageContent", "ReasoningMessageEnd", "ReasoningMessageChunk"];
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* Default message roles
|
|
75
|
-
*/
|
|
76
|
-
export declare const MESSAGE_ROLES: {
|
|
77
|
-
readonly DEVELOPER: "developer";
|
|
78
|
-
readonly SYSTEM: "system";
|
|
79
|
-
readonly ASSISTANT: "assistant";
|
|
80
|
-
readonly USER: "user";
|
|
81
|
-
readonly TOOL: "tool";
|
|
82
|
-
};
|
|
83
|
-
/**
|
|
84
|
-
* Run outcome types
|
|
85
|
-
*/
|
|
86
|
-
export declare const RUN_OUTCOMES: {
|
|
87
|
-
readonly SUCCESS: "success";
|
|
88
|
-
readonly INTERRUPT: "interrupt";
|
|
89
|
-
};
|
|
90
|
-
//# sourceMappingURL=ag-ui-constants.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ag-ui-constants.d.ts","sourceRoot":"","sources":["../../../src/ag-ui/ag-ui-constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;CAEJ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;CAQjB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;CAgCnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;CAGf,CAAC"}
|