@providerprotocol/agents 0.0.2 → 0.0.3
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/checkpoint/index.d.ts +43 -0
- package/dist/checkpoint/index.js +64 -0
- package/dist/checkpoint/index.js.map +1 -0
- package/{src/execution/loop.ts → dist/chunk-4ESYN66B.js} +54 -162
- package/dist/chunk-4ESYN66B.js.map +1 -0
- package/dist/chunk-EKRXMSDX.js +8 -0
- package/dist/chunk-EKRXMSDX.js.map +1 -0
- package/dist/chunk-PHI5ULBV.js +427 -0
- package/dist/chunk-PHI5ULBV.js.map +1 -0
- package/dist/execution/index.d.ts +105 -0
- package/dist/execution/index.js +679 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/index-qsPwbY86.d.ts +65 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/index.d.ts +23 -0
- package/dist/middleware/index.js +82 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/thread-tree/index.d.ts +115 -0
- package/dist/thread-tree/index.js +4 -0
- package/dist/thread-tree/index.js.map +1 -0
- package/dist/types-2Vsthzyu.d.ts +163 -0
- package/dist/types-BhX9uD_d.d.ts +91 -0
- package/dist/types-DR02gtFv.d.ts +270 -0
- package/dist/types-NGQMdnaD.d.ts +65 -0
- package/package.json +40 -8
- package/.claude/settings.local.json +0 -29
- package/AGENTS.md +0 -681
- package/CLAUDE.md +0 -681
- package/bun.lock +0 -472
- package/eslint.config.js +0 -75
- package/index.ts +0 -1
- package/llms.md +0 -796
- package/specs/UAP-1.0.md +0 -2355
- package/src/agent/index.ts +0 -384
- package/src/agent/types.ts +0 -91
- package/src/checkpoint/file.ts +0 -126
- package/src/checkpoint/index.ts +0 -40
- package/src/checkpoint/types.ts +0 -95
- package/src/execution/index.ts +0 -37
- package/src/execution/plan.ts +0 -497
- package/src/execution/react.ts +0 -340
- package/src/execution/tool-ordering.ts +0 -186
- package/src/execution/types.ts +0 -315
- package/src/index.ts +0 -80
- package/src/middleware/index.ts +0 -7
- package/src/middleware/logging.ts +0 -123
- package/src/middleware/types.ts +0 -69
- package/src/state/index.ts +0 -301
- package/src/state/types.ts +0 -173
- package/src/thread-tree/index.ts +0 -249
- package/src/thread-tree/types.ts +0 -29
- package/src/utils/uuid.ts +0 -7
- package/tests/live/agent-anthropic.test.ts +0 -288
- package/tests/live/agent-strategy-hooks.test.ts +0 -268
- package/tests/live/checkpoint.test.ts +0 -243
- package/tests/live/execution-strategies.test.ts +0 -255
- package/tests/live/plan-strategy.test.ts +0 -160
- package/tests/live/subagent-events.live.test.ts +0 -249
- package/tests/live/thread-tree.test.ts +0 -186
- package/tests/unit/agent.test.ts +0 -703
- package/tests/unit/checkpoint.test.ts +0 -232
- package/tests/unit/execution/equivalence.test.ts +0 -402
- package/tests/unit/execution/loop.test.ts +0 -437
- package/tests/unit/execution/plan.test.ts +0 -590
- package/tests/unit/execution/react.test.ts +0 -604
- package/tests/unit/execution/subagent-events.test.ts +0 -235
- package/tests/unit/execution/tool-ordering.test.ts +0 -310
- package/tests/unit/middleware/logging.test.ts +0 -276
- package/tests/unit/state.test.ts +0 -573
- package/tests/unit/thread-tree.test.ts +0 -249
- package/tsconfig.json +0 -29
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect, mock } from 'bun:test';
|
|
2
|
-
import { UserMessage, AssistantMessage } from '@providerprotocol/ai';
|
|
3
|
-
import type { Turn } from '@providerprotocol/ai';
|
|
4
|
-
import { logging } from '../../../src/middleware/logging.ts';
|
|
5
|
-
import type { MiddlewareContext } from '../../../src/middleware/types.ts';
|
|
6
|
-
import type { GenerateResult } from '../../../src/execution/types.ts';
|
|
7
|
-
import { AgentState } from '../../../src/state/index.ts';
|
|
8
|
-
|
|
9
|
-
function createMockContext(): MiddlewareContext {
|
|
10
|
-
return {
|
|
11
|
-
agent: { id: 'test-agent', system: 'Test system' },
|
|
12
|
-
input: new UserMessage('Hello'),
|
|
13
|
-
state: AgentState.initial(),
|
|
14
|
-
metadata: new Map(),
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function createMockResult(): GenerateResult {
|
|
19
|
-
const response = new AssistantMessage('Hello back!');
|
|
20
|
-
return {
|
|
21
|
-
turn: {
|
|
22
|
-
response,
|
|
23
|
-
messages: [response],
|
|
24
|
-
toolExecutions: [],
|
|
25
|
-
usage: {
|
|
26
|
-
inputTokens: 10,
|
|
27
|
-
outputTokens: 20,
|
|
28
|
-
totalTokens: 30,
|
|
29
|
-
},
|
|
30
|
-
cycles: 1,
|
|
31
|
-
} as unknown as Turn,
|
|
32
|
-
state: AgentState.initial(),
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
describe('logging() middleware', () => {
|
|
37
|
-
describe('configuration', () => {
|
|
38
|
-
test('uses default options', () => {
|
|
39
|
-
const mw = logging();
|
|
40
|
-
expect(mw.name).toBe('logging');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('accepts custom log level', () => {
|
|
44
|
-
const mw = logging({ level: 'debug' });
|
|
45
|
-
expect(mw.name).toBe('logging');
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('accepts custom logger', () => {
|
|
49
|
-
const customLogger = mock(() => {});
|
|
50
|
-
const mw = logging({ logger: customLogger });
|
|
51
|
-
expect(mw.name).toBe('logging');
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('before()', () => {
|
|
56
|
-
test('logs execution started', async () => {
|
|
57
|
-
const logs: string[] = [];
|
|
58
|
-
const mw = logging({
|
|
59
|
-
logger: (msg) => logs.push(msg),
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const context = createMockContext();
|
|
63
|
-
await mw.before?.(context);
|
|
64
|
-
|
|
65
|
-
expect(logs.some((l) => l.includes('Execution started'))).toBe(true);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('includes agent ID in log', async () => {
|
|
69
|
-
const logs: string[] = [];
|
|
70
|
-
const mw = logging({
|
|
71
|
-
logger: (msg) => logs.push(msg),
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
const context = createMockContext();
|
|
75
|
-
await mw.before?.(context);
|
|
76
|
-
|
|
77
|
-
expect(logs.some((l) => l.includes('test-agent'))).toBe(true);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('sets start time in metadata when timing enabled', async () => {
|
|
81
|
-
const mw = logging({ includeTiming: true });
|
|
82
|
-
const context = createMockContext();
|
|
83
|
-
|
|
84
|
-
await mw.before?.(context);
|
|
85
|
-
|
|
86
|
-
expect(context.metadata.has('_logging_startTime')).toBe(true);
|
|
87
|
-
expect(typeof context.metadata.get('_logging_startTime')).toBe('number');
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
test('returns context', async () => {
|
|
91
|
-
const mw = logging();
|
|
92
|
-
const context = createMockContext();
|
|
93
|
-
|
|
94
|
-
const result = await mw.before?.(context);
|
|
95
|
-
|
|
96
|
-
expect(result).toBe(context);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test('logs input when includeMessages is true', async () => {
|
|
100
|
-
const logs: string[] = [];
|
|
101
|
-
const mw = logging({
|
|
102
|
-
logger: (msg) => logs.push(msg),
|
|
103
|
-
includeMessages: true,
|
|
104
|
-
level: 'debug',
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
const context = createMockContext();
|
|
108
|
-
await mw.before?.(context);
|
|
109
|
-
|
|
110
|
-
expect(logs.some((l) => l.includes('Input'))).toBe(true);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
describe('after()', () => {
|
|
115
|
-
test('logs execution completed', async () => {
|
|
116
|
-
const logs: string[] = [];
|
|
117
|
-
const mw = logging({
|
|
118
|
-
logger: (msg) => logs.push(msg),
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const context = createMockContext();
|
|
122
|
-
const result = createMockResult();
|
|
123
|
-
|
|
124
|
-
await mw.after?.(context, result);
|
|
125
|
-
|
|
126
|
-
expect(logs.some((l) => l.includes('Execution completed'))).toBe(true);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test('includes timing when enabled', async () => {
|
|
130
|
-
const logs: string[] = [];
|
|
131
|
-
const mw = logging({
|
|
132
|
-
logger: (msg) => logs.push(msg),
|
|
133
|
-
includeTiming: true,
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
const context = createMockContext();
|
|
137
|
-
context.metadata.set('_logging_startTime', Date.now() - 100);
|
|
138
|
-
const result = createMockResult();
|
|
139
|
-
|
|
140
|
-
await mw.after?.(context, result);
|
|
141
|
-
|
|
142
|
-
expect(logs.some((l) => l.includes('ms'))).toBe(true);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test('includes token count', async () => {
|
|
146
|
-
const logs: string[] = [];
|
|
147
|
-
const mw = logging({
|
|
148
|
-
logger: (msg) => logs.push(msg),
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
const context = createMockContext();
|
|
152
|
-
const result = createMockResult();
|
|
153
|
-
|
|
154
|
-
await mw.after?.(context, result);
|
|
155
|
-
|
|
156
|
-
expect(logs.some((l) => l.includes('tokens=30'))).toBe(true);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
test('returns result unchanged', async () => {
|
|
160
|
-
const mw = logging();
|
|
161
|
-
const context = createMockContext();
|
|
162
|
-
const result = createMockResult();
|
|
163
|
-
|
|
164
|
-
const returned = await mw.after?.(context, result);
|
|
165
|
-
|
|
166
|
-
expect(returned).toBe(result);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
test('logs response when includeMessages is true', async () => {
|
|
170
|
-
const logs: string[] = [];
|
|
171
|
-
const mw = logging({
|
|
172
|
-
logger: (msg) => logs.push(msg),
|
|
173
|
-
includeMessages: true,
|
|
174
|
-
level: 'debug',
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
const context = createMockContext();
|
|
178
|
-
const result = createMockResult();
|
|
179
|
-
|
|
180
|
-
await mw.after?.(context, result);
|
|
181
|
-
|
|
182
|
-
expect(logs.some((l) => l.includes('Response'))).toBe(true);
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
describe('onError()', () => {
|
|
187
|
-
test('logs error message', async () => {
|
|
188
|
-
const logs: string[] = [];
|
|
189
|
-
const mw = logging({
|
|
190
|
-
logger: (msg) => logs.push(msg),
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
const context = createMockContext();
|
|
194
|
-
const error = new Error('Something went wrong');
|
|
195
|
-
|
|
196
|
-
await mw.onError?.(context, error);
|
|
197
|
-
|
|
198
|
-
expect(logs.some((l) => l.includes('Execution failed'))).toBe(true);
|
|
199
|
-
expect(logs.some((l) => l.includes('Something went wrong'))).toBe(true);
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
test('includes timing when enabled', async () => {
|
|
203
|
-
const logs: string[] = [];
|
|
204
|
-
const mw = logging({
|
|
205
|
-
logger: (msg) => logs.push(msg),
|
|
206
|
-
includeTiming: true,
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
const context = createMockContext();
|
|
210
|
-
context.metadata.set('_logging_startTime', Date.now() - 50);
|
|
211
|
-
const error = new Error('Failed');
|
|
212
|
-
|
|
213
|
-
await mw.onError?.(context, error);
|
|
214
|
-
|
|
215
|
-
expect(logs.some((l) => l.includes('after') && l.includes('ms'))).toBe(true);
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
test('returns undefined to let error propagate', async () => {
|
|
219
|
-
const mw = logging();
|
|
220
|
-
const context = createMockContext();
|
|
221
|
-
const error = new Error('Error');
|
|
222
|
-
|
|
223
|
-
const result = await mw.onError?.(context, error);
|
|
224
|
-
|
|
225
|
-
expect(result).toBeUndefined();
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
test('uses error log level', async () => {
|
|
229
|
-
const logs: string[] = [];
|
|
230
|
-
const mw = logging({
|
|
231
|
-
logger: (msg) => logs.push(msg),
|
|
232
|
-
level: 'error',
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
const context = createMockContext();
|
|
236
|
-
const error = new Error('Failed');
|
|
237
|
-
|
|
238
|
-
await mw.onError?.(context, error);
|
|
239
|
-
|
|
240
|
-
expect(logs.some((l) => l.includes('[UAP:ERROR]'))).toBe(true);
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
describe('log levels', () => {
|
|
245
|
-
test('debug level logs everything', async () => {
|
|
246
|
-
const logs: string[] = [];
|
|
247
|
-
const mw = logging({
|
|
248
|
-
logger: (msg) => logs.push(msg),
|
|
249
|
-
level: 'debug',
|
|
250
|
-
includeMessages: true,
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
const context = createMockContext();
|
|
254
|
-
await mw.before?.(context);
|
|
255
|
-
|
|
256
|
-
expect(logs.length).toBeGreaterThan(0);
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
test('error level only logs errors', async () => {
|
|
260
|
-
const logs: string[] = [];
|
|
261
|
-
const mw = logging({
|
|
262
|
-
logger: (msg) => logs.push(msg),
|
|
263
|
-
level: 'error',
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
const context = createMockContext();
|
|
267
|
-
const result = createMockResult();
|
|
268
|
-
|
|
269
|
-
await mw.before?.(context);
|
|
270
|
-
await mw.after?.(context, result);
|
|
271
|
-
|
|
272
|
-
// Info messages should not be logged at error level
|
|
273
|
-
expect(logs.filter((l) => l.includes('[UAP:INFO]'))).toHaveLength(0);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
});
|