@providerprotocol/agents 0.0.1 → 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.
Files changed (74) hide show
  1. package/README.md +333 -6
  2. package/dist/checkpoint/index.d.ts +43 -0
  3. package/dist/checkpoint/index.js +64 -0
  4. package/dist/checkpoint/index.js.map +1 -0
  5. package/{src/execution/loop.ts → dist/chunk-4ESYN66B.js} +54 -162
  6. package/dist/chunk-4ESYN66B.js.map +1 -0
  7. package/dist/chunk-EKRXMSDX.js +8 -0
  8. package/dist/chunk-EKRXMSDX.js.map +1 -0
  9. package/dist/chunk-PHI5ULBV.js +427 -0
  10. package/dist/chunk-PHI5ULBV.js.map +1 -0
  11. package/dist/execution/index.d.ts +105 -0
  12. package/dist/execution/index.js +679 -0
  13. package/dist/execution/index.js.map +1 -0
  14. package/dist/index-qsPwbY86.d.ts +65 -0
  15. package/dist/index.d.ts +101 -0
  16. package/dist/index.js +218 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/middleware/index.d.ts +23 -0
  19. package/dist/middleware/index.js +82 -0
  20. package/dist/middleware/index.js.map +1 -0
  21. package/dist/thread-tree/index.d.ts +115 -0
  22. package/dist/thread-tree/index.js +4 -0
  23. package/dist/thread-tree/index.js.map +1 -0
  24. package/dist/types-2Vsthzyu.d.ts +163 -0
  25. package/dist/types-BhX9uD_d.d.ts +91 -0
  26. package/dist/types-DR02gtFv.d.ts +270 -0
  27. package/dist/types-NGQMdnaD.d.ts +65 -0
  28. package/package.json +40 -8
  29. package/.claude/settings.local.json +0 -27
  30. package/AGENTS.md +0 -681
  31. package/CLAUDE.md +0 -681
  32. package/bun.lock +0 -472
  33. package/eslint.config.js +0 -75
  34. package/index.ts +0 -1
  35. package/llms.md +0 -796
  36. package/specs/UAP-1.0.md +0 -2355
  37. package/src/agent/index.ts +0 -384
  38. package/src/agent/types.ts +0 -91
  39. package/src/checkpoint/file.ts +0 -126
  40. package/src/checkpoint/index.ts +0 -40
  41. package/src/checkpoint/types.ts +0 -95
  42. package/src/execution/index.ts +0 -37
  43. package/src/execution/plan.ts +0 -497
  44. package/src/execution/react.ts +0 -340
  45. package/src/execution/tool-ordering.ts +0 -186
  46. package/src/execution/types.ts +0 -315
  47. package/src/index.ts +0 -80
  48. package/src/middleware/index.ts +0 -7
  49. package/src/middleware/logging.ts +0 -123
  50. package/src/middleware/types.ts +0 -69
  51. package/src/state/index.ts +0 -301
  52. package/src/state/types.ts +0 -173
  53. package/src/thread-tree/index.ts +0 -249
  54. package/src/thread-tree/types.ts +0 -29
  55. package/src/utils/uuid.ts +0 -7
  56. package/tests/live/agent-anthropic.test.ts +0 -288
  57. package/tests/live/agent-strategy-hooks.test.ts +0 -268
  58. package/tests/live/checkpoint.test.ts +0 -243
  59. package/tests/live/execution-strategies.test.ts +0 -255
  60. package/tests/live/plan-strategy.test.ts +0 -160
  61. package/tests/live/subagent-events.live.test.ts +0 -249
  62. package/tests/live/thread-tree.test.ts +0 -186
  63. package/tests/unit/agent.test.ts +0 -703
  64. package/tests/unit/checkpoint.test.ts +0 -232
  65. package/tests/unit/execution/equivalence.test.ts +0 -402
  66. package/tests/unit/execution/loop.test.ts +0 -437
  67. package/tests/unit/execution/plan.test.ts +0 -590
  68. package/tests/unit/execution/react.test.ts +0 -604
  69. package/tests/unit/execution/subagent-events.test.ts +0 -235
  70. package/tests/unit/execution/tool-ordering.test.ts +0 -310
  71. package/tests/unit/middleware/logging.test.ts +0 -276
  72. package/tests/unit/state.test.ts +0 -573
  73. package/tests/unit/thread-tree.test.ts +0 -249
  74. package/tsconfig.json +0 -29
@@ -0,0 +1,427 @@
1
+ import { generateUUID } from './chunk-EKRXMSDX.js';
2
+ import { UserMessage, AssistantMessage, ToolResultMessage } from '@providerprotocol/ai';
3
+
4
+ // src/state/types.ts
5
+ var UAP_VERSION = "1.0.0";
6
+
7
+ // src/state/index.ts
8
+ var AgentState = class _AgentState {
9
+ id;
10
+ messages;
11
+ step;
12
+ metadata;
13
+ reasoning;
14
+ plan;
15
+ subagentTraces;
16
+ constructor(id, messages, step, metadata, reasoning, plan, subagentTraces) {
17
+ this.id = id;
18
+ this.messages = messages;
19
+ this.step = step;
20
+ this.metadata = metadata;
21
+ this.reasoning = reasoning;
22
+ this.plan = plan;
23
+ this.subagentTraces = subagentTraces;
24
+ }
25
+ /**
26
+ * Create an initial empty state.
27
+ */
28
+ static initial() {
29
+ return new _AgentState(
30
+ generateUUID(),
31
+ [],
32
+ 0,
33
+ {},
34
+ [],
35
+ void 0,
36
+ []
37
+ );
38
+ }
39
+ /**
40
+ * Return new state with a message added.
41
+ */
42
+ withMessage(message) {
43
+ return new _AgentState(
44
+ generateUUID(),
45
+ [...this.messages, message],
46
+ this.step,
47
+ this.metadata,
48
+ this.reasoning,
49
+ this.plan,
50
+ this.subagentTraces
51
+ );
52
+ }
53
+ /**
54
+ * Return new state with messages added.
55
+ */
56
+ withMessages(messages) {
57
+ return new _AgentState(
58
+ generateUUID(),
59
+ [...this.messages, ...messages],
60
+ this.step,
61
+ this.metadata,
62
+ this.reasoning,
63
+ this.plan,
64
+ this.subagentTraces
65
+ );
66
+ }
67
+ /**
68
+ * Return new state with context replaced (all messages).
69
+ * Use for context window management (pruning, summarization).
70
+ */
71
+ withContext(messages) {
72
+ return new _AgentState(
73
+ generateUUID(),
74
+ [...messages],
75
+ this.step,
76
+ this.metadata,
77
+ this.reasoning,
78
+ this.plan,
79
+ this.subagentTraces
80
+ );
81
+ }
82
+ /**
83
+ * Return new state with updated step number.
84
+ */
85
+ withStep(step) {
86
+ return new _AgentState(
87
+ generateUUID(),
88
+ this.messages,
89
+ step,
90
+ this.metadata,
91
+ this.reasoning,
92
+ this.plan,
93
+ this.subagentTraces
94
+ );
95
+ }
96
+ /**
97
+ * Return new state with metadata entry added/updated.
98
+ */
99
+ withMetadata(key, value) {
100
+ return new _AgentState(
101
+ generateUUID(),
102
+ this.messages,
103
+ this.step,
104
+ { ...this.metadata, [key]: value },
105
+ this.reasoning,
106
+ this.plan,
107
+ this.subagentTraces
108
+ );
109
+ }
110
+ /**
111
+ * Return new state with reasoning trace added.
112
+ */
113
+ withReasoning(reasoning) {
114
+ return new _AgentState(
115
+ generateUUID(),
116
+ this.messages,
117
+ this.step,
118
+ this.metadata,
119
+ [...this.reasoning, reasoning],
120
+ this.plan,
121
+ this.subagentTraces
122
+ );
123
+ }
124
+ /**
125
+ * Return new state with plan set.
126
+ */
127
+ withPlan(plan) {
128
+ return new _AgentState(
129
+ generateUUID(),
130
+ this.messages,
131
+ this.step,
132
+ this.metadata,
133
+ this.reasoning,
134
+ [...plan],
135
+ this.subagentTraces
136
+ );
137
+ }
138
+ /**
139
+ * Return new state with sub-agent trace added.
140
+ * Per UAP spec Section 8.8.
141
+ */
142
+ withSubagentTrace(trace) {
143
+ return new _AgentState(
144
+ generateUUID(),
145
+ this.messages,
146
+ this.step,
147
+ this.metadata,
148
+ this.reasoning,
149
+ this.plan,
150
+ [...this.subagentTraces, trace]
151
+ );
152
+ }
153
+ /**
154
+ * Serialize state to JSON for persistence.
155
+ */
156
+ toJSON() {
157
+ return {
158
+ version: UAP_VERSION,
159
+ id: this.id,
160
+ messages: this.messages.map((msg) => serializeMessage(msg)),
161
+ step: this.step,
162
+ metadata: { ...this.metadata },
163
+ reasoning: [...this.reasoning],
164
+ plan: this.plan ? this.plan.map((s) => ({ ...s })) : void 0,
165
+ subagentTraces: this.subagentTraces.length > 0 ? this.subagentTraces.map((t) => ({ ...t })) : void 0
166
+ };
167
+ }
168
+ /**
169
+ * Deserialize state from JSON.
170
+ */
171
+ static fromJSON(json) {
172
+ if (json.version !== UAP_VERSION) {
173
+ throw new Error(`Unsupported UAP version: ${json.version}. Expected: ${UAP_VERSION}`);
174
+ }
175
+ return new _AgentState(
176
+ json.id,
177
+ json.messages.map((msg) => deserializeMessage(msg)),
178
+ json.step,
179
+ json.metadata,
180
+ json.reasoning,
181
+ json.plan ? json.plan.map((s) => ({ ...s })) : void 0,
182
+ json.subagentTraces ? json.subagentTraces.map((t) => ({ ...t })) : []
183
+ );
184
+ }
185
+ };
186
+ function serializeMessage(message) {
187
+ if (message instanceof UserMessage) {
188
+ return {
189
+ role: "user",
190
+ content: message.content,
191
+ metadata: message.metadata
192
+ };
193
+ }
194
+ if (message instanceof AssistantMessage) {
195
+ return {
196
+ role: "assistant",
197
+ content: {
198
+ content: message.content,
199
+ toolCalls: message.toolCalls
200
+ },
201
+ metadata: message.metadata
202
+ };
203
+ }
204
+ if (message instanceof ToolResultMessage) {
205
+ return {
206
+ role: "tool_result",
207
+ content: message.results,
208
+ metadata: message.metadata
209
+ };
210
+ }
211
+ throw new Error(`Unknown message type: ${typeof message}`);
212
+ }
213
+ function deserializeMessage(json) {
214
+ switch (json.role) {
215
+ case "user":
216
+ return new UserMessage(
217
+ json.content,
218
+ { metadata: json.metadata }
219
+ );
220
+ case "assistant": {
221
+ const assistantContent = json.content;
222
+ return new AssistantMessage(
223
+ assistantContent.content,
224
+ assistantContent.toolCalls,
225
+ { metadata: json.metadata }
226
+ );
227
+ }
228
+ case "tool_result":
229
+ return new ToolResultMessage(
230
+ json.content,
231
+ { metadata: json.metadata }
232
+ );
233
+ default:
234
+ throw new Error(`Unknown message role: ${json.role}`);
235
+ }
236
+ }
237
+
238
+ // src/thread-tree/index.ts
239
+ var ThreadNode = class _ThreadNode {
240
+ /** Node ID (UUIDv4) */
241
+ id;
242
+ /** Parent node ID (null for root) */
243
+ parentId;
244
+ /** State snapshot at this node */
245
+ state;
246
+ /** Optional branch name */
247
+ name;
248
+ /** Child node IDs */
249
+ children;
250
+ constructor(id, parentId, state, name, children = []) {
251
+ this.id = id;
252
+ this.parentId = parentId;
253
+ this.state = state;
254
+ this.name = name;
255
+ this.children = children;
256
+ }
257
+ /**
258
+ * Serialize to JSON.
259
+ */
260
+ toJSON() {
261
+ return {
262
+ id: this.id,
263
+ parentId: this.parentId,
264
+ state: this.state.toJSON(),
265
+ name: this.name,
266
+ children: [...this.children]
267
+ };
268
+ }
269
+ /**
270
+ * Deserialize from JSON.
271
+ */
272
+ static fromJSON(json) {
273
+ return new _ThreadNode(
274
+ json.id,
275
+ json.parentId,
276
+ AgentState.fromJSON(json.state),
277
+ json.name,
278
+ [...json.children]
279
+ );
280
+ }
281
+ };
282
+ var ThreadTree = class _ThreadTree {
283
+ /** Root node */
284
+ root;
285
+ /** Currently active node */
286
+ currentNode;
287
+ /** All nodes by ID */
288
+ nodes;
289
+ constructor(root) {
290
+ if (root) {
291
+ this.root = root;
292
+ this.currentNode = root;
293
+ this.nodes = /* @__PURE__ */ new Map([[root.id, root]]);
294
+ } else {
295
+ const rootNode = new ThreadNode(
296
+ generateUUID(),
297
+ null,
298
+ AgentState.initial(),
299
+ "root"
300
+ );
301
+ this.root = rootNode;
302
+ this.currentNode = rootNode;
303
+ this.nodes = /* @__PURE__ */ new Map([[rootNode.id, rootNode]]);
304
+ }
305
+ }
306
+ /**
307
+ * Get the currently active node.
308
+ */
309
+ get current() {
310
+ return this.currentNode;
311
+ }
312
+ /**
313
+ * Create a branch from a node.
314
+ *
315
+ * @param fromId - ID of the node to branch from
316
+ * @param name - Optional name for the branch
317
+ * @returns ID of the new node
318
+ */
319
+ branch(fromId, name) {
320
+ const parent = this.nodes.get(fromId);
321
+ if (!parent) {
322
+ throw new Error(`Node not found: ${fromId}`);
323
+ }
324
+ const newNode = new ThreadNode(
325
+ generateUUID(),
326
+ fromId,
327
+ parent.state,
328
+ // Copy parent's state
329
+ name
330
+ );
331
+ parent.children.push(newNode.id);
332
+ this.nodes.set(newNode.id, newNode);
333
+ return newNode.id;
334
+ }
335
+ /**
336
+ * Switch to a different node.
337
+ *
338
+ * @param nodeId - ID of the node to switch to
339
+ */
340
+ checkout(nodeId) {
341
+ const node = this.nodes.get(nodeId);
342
+ if (!node) {
343
+ throw new Error(`Node not found: ${nodeId}`);
344
+ }
345
+ this.currentNode = node;
346
+ }
347
+ /**
348
+ * Get the AgentState representing the full history from root to current node.
349
+ * Since nodes store full state snapshots, this returns the current node's state.
350
+ *
351
+ * @returns AgentState with combined history
352
+ */
353
+ history() {
354
+ return this.currentNode.state.withMetadata("_threadTreeNodeId", this.currentNode.id);
355
+ }
356
+ /**
357
+ * Get all leaf nodes (nodes with no children).
358
+ *
359
+ * @returns Array of leaf node IDs
360
+ */
361
+ getLeaves() {
362
+ const leaves = [];
363
+ for (const [id, node] of this.nodes) {
364
+ if (node.children.length === 0) {
365
+ leaves.push(id);
366
+ }
367
+ }
368
+ return leaves;
369
+ }
370
+ /**
371
+ * Get all branch names.
372
+ *
373
+ * @returns Map of node IDs to branch names
374
+ */
375
+ getBranches() {
376
+ const branches = /* @__PURE__ */ new Map();
377
+ for (const [id, node] of this.nodes) {
378
+ if (node.name) {
379
+ branches.set(id, node.name);
380
+ }
381
+ }
382
+ return branches;
383
+ }
384
+ /**
385
+ * Serialize to JSON.
386
+ */
387
+ toJSON() {
388
+ const nodes = [];
389
+ for (const node of this.nodes.values()) {
390
+ nodes.push(node.toJSON());
391
+ }
392
+ return {
393
+ rootId: this.root.id,
394
+ currentId: this.currentNode.id,
395
+ nodes
396
+ };
397
+ }
398
+ /**
399
+ * Deserialize from JSON.
400
+ */
401
+ static fromJSON(json) {
402
+ const nodesMap = /* @__PURE__ */ new Map();
403
+ for (const nodeJson of json.nodes) {
404
+ const node = ThreadNode.fromJSON(nodeJson);
405
+ nodesMap.set(node.id, node);
406
+ }
407
+ const root = nodesMap.get(json.rootId);
408
+ const current = nodesMap.get(json.currentId);
409
+ if (!root) {
410
+ throw new Error(`Root node not found: ${json.rootId}`);
411
+ }
412
+ if (!current) {
413
+ throw new Error(`Current node not found: ${json.currentId}`);
414
+ }
415
+ const tree = new _ThreadTree(root);
416
+ tree.nodes.clear();
417
+ for (const [id, node] of nodesMap) {
418
+ tree.nodes.set(id, node);
419
+ }
420
+ tree.checkout(current.id);
421
+ return tree;
422
+ }
423
+ };
424
+
425
+ export { AgentState, ThreadNode, ThreadTree };
426
+ //# sourceMappingURL=chunk-PHI5ULBV.js.map
427
+ //# sourceMappingURL=chunk-PHI5ULBV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state/types.ts","../src/state/index.ts","../src/thread-tree/index.ts"],"names":[],"mappings":"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","file":"chunk-PHI5ULBV.js","sourcesContent":["import type { Message, MessageMetadata, TokenUsage } from '@providerprotocol/ai';\n\n/**\n * Status of a plan step during execution.\n */\nexport type PlanStepStatus = 'pending' | 'in_progress' | 'completed' | 'failed';\n\n/**\n * A single tool execution trace from a sub-agent.\n * Per UAP spec Section 8.8.\n */\nexport interface ToolExecutionTrace {\n /** Name of the tool */\n toolName: string;\n /** Tool call ID */\n toolCallId?: string;\n /** Arguments passed to the tool */\n arguments: Record<string, unknown>;\n /** Tool result */\n result: string;\n /** Whether the tool errored */\n isError?: boolean;\n /** Execution time in milliseconds */\n duration?: number;\n}\n\n/**\n * Sub-agent execution trace for checkpoint persistence.\n * Per UAP spec Section 8.8.\n */\nexport interface SubagentExecutionTrace {\n /** Unique ID of the sub-agent instance */\n subagentId: string;\n /** Type/name of the sub-agent */\n subagentType: string;\n /** Tool call ID that spawned this sub-agent */\n parentToolCallId: string;\n /** The task given to the sub-agent */\n prompt: string;\n /** Start timestamp (ms since epoch) */\n startTime: number;\n /** End timestamp (ms since epoch) */\n endTime: number;\n /** Whether execution succeeded */\n success: boolean;\n /** Sub-agent's response (if successful) */\n result?: string;\n /** Error message (if failed) */\n error?: string;\n /** Tools used by sub-agent */\n toolExecutions?: ToolExecutionTrace[];\n /** Token usage for sub-agent */\n usage?: TokenUsage;\n}\n\n/**\n * Serialized form of SubagentExecutionTrace.\n */\nexport interface SubagentExecutionTraceJSON {\n subagentId: string;\n subagentType: string;\n parentToolCallId: string;\n prompt: string;\n startTime: number;\n endTime: number;\n success: boolean;\n result?: string;\n error?: string;\n toolExecutions?: ToolExecutionTrace[];\n usage?: TokenUsage;\n}\n\n/**\n * A single step in an execution plan.\n */\nexport interface PlanStep {\n /** Unique step identifier */\n id: string;\n /** Description of what this step does */\n description: string;\n /** Tool to use (if applicable) */\n tool?: string;\n /** IDs of steps this depends on */\n dependsOn: string[];\n /** Current status */\n status: PlanStepStatus;\n}\n\n/**\n * Serialized form of a PlanStep.\n */\nexport interface PlanStepJSON {\n id: string;\n description: string;\n tool?: string;\n dependsOn: string[];\n status: PlanStepStatus;\n}\n\n/**\n * Serialized form of AgentState for persistence.\n */\nexport interface AgentStateJSON {\n /** UAP version */\n version: string;\n /** State snapshot ID */\n id: string;\n /** Serialized messages */\n messages: MessageJSON[];\n /** Current step number */\n step: number;\n /** User-defined metadata */\n metadata: Record<string, unknown>;\n /** Reasoning traces (for ReAct) */\n reasoning: string[];\n /** Execution plan (for Plan strategy) */\n plan?: PlanStepJSON[];\n /** Sub-agent execution traces (per UAP spec Section 8.8) */\n subagentTraces?: SubagentExecutionTraceJSON[];\n}\n\n/**\n * Serialized form of a Message.\n * This preserves the UPP Message structure for serialization.\n */\nexport interface MessageJSON {\n role: 'user' | 'assistant' | 'tool_result';\n content: unknown;\n metadata?: MessageMetadata;\n}\n\n/**\n * Interface for AgentState operations.\n * All operations return new instances (immutable).\n */\nexport interface AgentStateInterface {\n /** State snapshot ID (UUIDv4) */\n readonly id: string;\n /** Conversation history (UPP Messages) */\n readonly messages: readonly Message[];\n /** Current step number */\n readonly step: number;\n /** User-defined metadata */\n readonly metadata: Readonly<Record<string, unknown>>;\n /** Reasoning traces (for ReAct) */\n readonly reasoning: readonly string[];\n /** Execution plan (for Plan strategy) */\n readonly plan: readonly PlanStep[] | undefined;\n /** Sub-agent execution traces (per UAP spec Section 8.8) */\n readonly subagentTraces: readonly SubagentExecutionTrace[];\n\n /** Return new state with message added */\n withMessage(message: Message): AgentStateInterface;\n /** Return new state with messages added */\n withMessages(messages: Message[]): AgentStateInterface;\n /** Return new state with context replaced (all messages) */\n withContext(messages: Message[]): AgentStateInterface;\n /** Return new state with updated step */\n withStep(step: number): AgentStateInterface;\n /** Return new state with metadata entry */\n withMetadata(key: string, value: unknown): AgentStateInterface;\n /** Return new state with reasoning added */\n withReasoning(reasoning: string): AgentStateInterface;\n /** Return new state with plan set */\n withPlan(plan: PlanStep[]): AgentStateInterface;\n /** Return new state with sub-agent trace added */\n withSubagentTrace(trace: SubagentExecutionTrace): AgentStateInterface;\n /** Serialize to JSON */\n toJSON(): AgentStateJSON;\n}\n\n/** UAP version for serialization */\nexport const UAP_VERSION = '1.0.0';\n","import type {\n Message,\n UserContent,\n AssistantContent,\n ToolCall,\n ToolResult,\n} from '@providerprotocol/ai';\nimport { UserMessage, AssistantMessage, ToolResultMessage } from '@providerprotocol/ai';\nimport { generateUUID } from '../utils/uuid.ts';\nimport type {\n AgentStateInterface,\n AgentStateJSON,\n PlanStep,\n MessageJSON,\n SubagentExecutionTrace,\n} from './types.ts';\nimport { UAP_VERSION } from './types.ts';\n\n/**\n * Immutable agent state snapshot.\n * All operations return new instances - the original state is never mutated.\n */\nexport class AgentState implements AgentStateInterface {\n readonly id: string;\n\n readonly messages: readonly Message[];\n\n readonly step: number;\n\n readonly metadata: Readonly<Record<string, unknown>>;\n\n readonly reasoning: readonly string[];\n\n readonly plan: readonly PlanStep[] | undefined;\n\n readonly subagentTraces: readonly SubagentExecutionTrace[];\n\n private constructor(\n id: string,\n messages: readonly Message[],\n step: number,\n metadata: Readonly<Record<string, unknown>>,\n reasoning: readonly string[],\n plan: readonly PlanStep[] | undefined,\n subagentTraces: readonly SubagentExecutionTrace[],\n ) {\n this.id = id;\n this.messages = messages;\n this.step = step;\n this.metadata = metadata;\n this.reasoning = reasoning;\n this.plan = plan;\n this.subagentTraces = subagentTraces;\n }\n\n /**\n * Create an initial empty state.\n */\n static initial(): AgentState {\n return new AgentState(\n generateUUID(),\n [],\n 0,\n {},\n [],\n undefined,\n [],\n );\n }\n\n /**\n * Return new state with a message added.\n */\n withMessage(message: Message): AgentState {\n return new AgentState(\n generateUUID(),\n [...this.messages, message],\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with messages added.\n */\n withMessages(messages: Message[]): AgentState {\n return new AgentState(\n generateUUID(),\n [...this.messages, ...messages],\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with context replaced (all messages).\n * Use for context window management (pruning, summarization).\n */\n withContext(messages: Message[]): AgentState {\n return new AgentState(\n generateUUID(),\n [...messages],\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with updated step number.\n */\n withStep(step: number): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n step,\n this.metadata,\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with metadata entry added/updated.\n */\n withMetadata(key: string, value: unknown): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n { ...this.metadata, [key]: value },\n this.reasoning,\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with reasoning trace added.\n */\n withReasoning(reasoning: string): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n this.metadata,\n [...this.reasoning, reasoning],\n this.plan,\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with plan set.\n */\n withPlan(plan: PlanStep[]): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n this.metadata,\n this.reasoning,\n [...plan],\n this.subagentTraces,\n );\n }\n\n /**\n * Return new state with sub-agent trace added.\n * Per UAP spec Section 8.8.\n */\n withSubagentTrace(trace: SubagentExecutionTrace): AgentState {\n return new AgentState(\n generateUUID(),\n this.messages,\n this.step,\n this.metadata,\n this.reasoning,\n this.plan,\n [...this.subagentTraces, trace],\n );\n }\n\n /**\n * Serialize state to JSON for persistence.\n */\n toJSON(): AgentStateJSON {\n return {\n version: UAP_VERSION,\n id: this.id,\n messages: this.messages.map((msg) => serializeMessage(msg)),\n step: this.step,\n metadata: { ...this.metadata },\n reasoning: [...this.reasoning],\n plan: this.plan ? this.plan.map((s) => ({ ...s })) : undefined,\n subagentTraces: this.subagentTraces.length > 0\n ? this.subagentTraces.map((t) => ({ ...t }))\n : undefined,\n };\n }\n\n /**\n * Deserialize state from JSON.\n */\n static fromJSON(json: AgentStateJSON): AgentState {\n if (json.version !== UAP_VERSION) {\n throw new Error(`Unsupported UAP version: ${json.version}. Expected: ${UAP_VERSION}`);\n }\n\n return new AgentState(\n json.id,\n json.messages.map((msg) => deserializeMessage(msg)),\n json.step,\n json.metadata,\n json.reasoning,\n json.plan ? json.plan.map((s) => ({ ...s })) : undefined,\n json.subagentTraces ? json.subagentTraces.map((t) => ({ ...t })) : [],\n );\n }\n}\n\n/**\n * Serialize a UPP Message to JSON.\n */\nfunction serializeMessage(message: Message): MessageJSON {\n if (message instanceof UserMessage) {\n return {\n role: 'user',\n content: message.content,\n metadata: message.metadata,\n };\n }\n if (message instanceof AssistantMessage) {\n return {\n role: 'assistant',\n content: {\n content: message.content,\n toolCalls: message.toolCalls,\n },\n metadata: message.metadata,\n };\n }\n if (message instanceof ToolResultMessage) {\n return {\n role: 'tool_result',\n content: message.results,\n metadata: message.metadata,\n };\n }\n throw new Error(`Unknown message type: ${typeof message}`);\n}\n\n/**\n * Deserialize a JSON message to UPP Message.\n */\nfunction deserializeMessage(json: MessageJSON): Message {\n switch (json.role) {\n case 'user':\n return new UserMessage(\n json.content as string | UserContent[],\n { metadata: json.metadata },\n );\n case 'assistant': {\n const assistantContent = json.content as {\n content: string | AssistantContent[];\n toolCalls?: ToolCall[];\n };\n return new AssistantMessage(\n assistantContent.content,\n assistantContent.toolCalls,\n { metadata: json.metadata },\n );\n }\n case 'tool_result':\n return new ToolResultMessage(\n json.content as ToolResult[],\n { metadata: json.metadata },\n );\n default:\n throw new Error(`Unknown message role: ${json.role}`);\n }\n}\n\nexport type {\n AgentStateInterface,\n AgentStateJSON,\n PlanStep,\n PlanStepStatus,\n SubagentExecutionTrace,\n SubagentExecutionTraceJSON,\n ToolExecutionTrace,\n} from './types.ts';\n","import { generateUUID } from '../utils/uuid.ts';\nimport { AgentState } from '../state/index.ts';\nimport type { ThreadNodeJSON, ThreadTreeJSON } from './types.ts';\n\n/**\n * A node in the thread tree representing a conversation state snapshot.\n */\nexport class ThreadNode {\n /** Node ID (UUIDv4) */\n readonly id: string;\n\n /** Parent node ID (null for root) */\n readonly parentId: string | null;\n\n /** State snapshot at this node */\n state: AgentState;\n\n /** Optional branch name */\n name?: string;\n\n /** Child node IDs */\n readonly children: string[];\n\n constructor(\n id: string,\n parentId: string | null,\n state: AgentState,\n name?: string,\n children: string[] = [],\n ) {\n this.id = id;\n this.parentId = parentId;\n this.state = state;\n this.name = name;\n this.children = children;\n }\n\n /**\n * Serialize to JSON.\n */\n toJSON(): ThreadNodeJSON {\n return {\n id: this.id,\n parentId: this.parentId,\n state: this.state.toJSON(),\n name: this.name,\n children: [...this.children],\n };\n }\n\n /**\n * Deserialize from JSON.\n */\n static fromJSON(json: ThreadNodeJSON): ThreadNode {\n return new ThreadNode(\n json.id,\n json.parentId,\n AgentState.fromJSON(json.state),\n json.name,\n [...json.children],\n );\n }\n}\n\n/**\n * A tree-structured collection of conversation threads with parent-child relationships.\n * Enables branching conversations and easy switching between alternative paths.\n */\nexport class ThreadTree {\n /** Root node */\n readonly root: ThreadNode;\n\n /** Currently active node */\n private currentNode: ThreadNode;\n\n /** All nodes by ID */\n readonly nodes: Map<string, ThreadNode>;\n\n constructor(root?: ThreadNode) {\n if (root) {\n this.root = root;\n this.currentNode = root;\n this.nodes = new Map([[root.id, root]]);\n } else {\n const rootNode = new ThreadNode(\n generateUUID(),\n null,\n AgentState.initial(),\n 'root',\n );\n this.root = rootNode;\n this.currentNode = rootNode;\n this.nodes = new Map([[rootNode.id, rootNode]]);\n }\n }\n\n /**\n * Get the currently active node.\n */\n get current(): ThreadNode {\n return this.currentNode;\n }\n\n /**\n * Create a branch from a node.\n *\n * @param fromId - ID of the node to branch from\n * @param name - Optional name for the branch\n * @returns ID of the new node\n */\n branch(fromId: string, name?: string): string {\n const parent = this.nodes.get(fromId);\n if (!parent) {\n throw new Error(`Node not found: ${fromId}`);\n }\n\n const newNode = new ThreadNode(\n generateUUID(),\n fromId,\n parent.state, // Copy parent's state\n name,\n );\n\n // Add to parent's children\n parent.children.push(newNode.id);\n\n // Add to nodes map\n this.nodes.set(newNode.id, newNode);\n\n return newNode.id;\n }\n\n /**\n * Switch to a different node.\n *\n * @param nodeId - ID of the node to switch to\n */\n checkout(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node not found: ${nodeId}`);\n }\n\n this.currentNode = node;\n }\n\n /**\n * Get the AgentState representing the full history from root to current node.\n * Since nodes store full state snapshots, this returns the current node's state.\n *\n * @returns AgentState with combined history\n */\n history(): AgentState {\n return this.currentNode.state\n .withMetadata('_threadTreeNodeId', this.currentNode.id);\n }\n\n /**\n * Get all leaf nodes (nodes with no children).\n *\n * @returns Array of leaf node IDs\n */\n getLeaves(): string[] {\n const leaves: string[] = [];\n\n for (const [id, node] of this.nodes) {\n if (node.children.length === 0) {\n leaves.push(id);\n }\n }\n\n return leaves;\n }\n\n /**\n * Get all branch names.\n *\n * @returns Map of node IDs to branch names\n */\n getBranches(): Map<string, string | undefined> {\n const branches = new Map<string, string | undefined>();\n\n for (const [id, node] of this.nodes) {\n if (node.name) {\n branches.set(id, node.name);\n }\n }\n\n return branches;\n }\n\n /**\n * Serialize to JSON.\n */\n toJSON(): ThreadTreeJSON {\n const nodes: ThreadNodeJSON[] = [];\n\n for (const node of this.nodes.values()) {\n nodes.push(node.toJSON());\n }\n\n return {\n rootId: this.root.id,\n currentId: this.currentNode.id,\n nodes,\n };\n }\n\n /**\n * Deserialize from JSON.\n */\n static fromJSON(json: ThreadTreeJSON): ThreadTree {\n // First, create all nodes\n const nodesMap = new Map<string, ThreadNode>();\n\n for (const nodeJson of json.nodes) {\n const node = ThreadNode.fromJSON(nodeJson);\n nodesMap.set(node.id, node);\n }\n\n // Find root and current nodes\n const root = nodesMap.get(json.rootId);\n const current = nodesMap.get(json.currentId);\n\n if (!root) {\n throw new Error(`Root node not found: ${json.rootId}`);\n }\n\n if (!current) {\n throw new Error(`Current node not found: ${json.currentId}`);\n }\n\n // Create tree with root\n const tree = new ThreadTree(root);\n\n // Replace the nodes map\n tree.nodes.clear();\n for (const [id, node] of nodesMap) {\n tree.nodes.set(id, node);\n }\n\n // Set current node\n tree.checkout(current.id);\n\n return tree;\n }\n}\n\nexport type { ThreadNodeJSON, ThreadTreeJSON } from './types.ts';\n"]}
@@ -0,0 +1,105 @@
1
+ import { L as LoopOptions, E as ExecutionStrategy, R as ReactOptions, P as PlanOptions } from '../types-DR02gtFv.js';
2
+ export { A as AgentStrategy, b as AgentStreamEvent, a as AgentStreamResult, h as ExecutionContext, i as ExecutionResult, G as GenerateResult, O as OnSubagentEvent, k as OrderedToolCall, f as SubagentEndEvent, g as SubagentEvent, c as SubagentEventBase, S as SubagentEventType, e as SubagentInnerEvent, d as SubagentStartEvent, T as ToolDependencyOptions, j as ToolWithDependencies, U as UAPEventType } from '../types-DR02gtFv.js';
3
+ import { ToolCall, Tool } from '@providerprotocol/ai';
4
+ import '../index-qsPwbY86.js';
5
+ import '../types-2Vsthzyu.js';
6
+ import '../types-BhX9uD_d.js';
7
+
8
+ /**
9
+ * Create a loop execution strategy.
10
+ * The simplest strategy - equivalent to UPP's tool loop behavior.
11
+ *
12
+ * Behavior:
13
+ * 1. Send input to LLM
14
+ * 2. If response has tool calls, execute tools and loop
15
+ * 3. Continue until no tool calls or maxIterations reached
16
+ * 4. Return final response as UPP Turn
17
+ *
18
+ * @param options - Loop configuration options
19
+ * @returns ExecutionStrategy
20
+ */
21
+ declare function loop(options?: LoopOptions): ExecutionStrategy;
22
+
23
+ /**
24
+ * Create a ReAct (Reason-Act-Observe) execution strategy.
25
+ *
26
+ * Behavior:
27
+ * 1. Reason: LLM outputs reasoning about what to do next
28
+ * 2. Act: LLM selects and executes tool(s)
29
+ * 3. Observe: Tool results are formatted as observations
30
+ * 4. Repeat until stop condition, no more actions, or maxSteps
31
+ *
32
+ * @param options - ReAct configuration options
33
+ * @returns ExecutionStrategy
34
+ */
35
+ declare function react(options?: ReactOptions): ExecutionStrategy;
36
+
37
+ /**
38
+ * Create a plan-then-execute strategy.
39
+ *
40
+ * Behavior:
41
+ * 1. Plan: LLM generates structured plan with steps and dependencies
42
+ * 2. Execute: Execute each plan step respecting dependency order
43
+ * 3. Replan: If a step fails and allowReplan is true, generate new plan
44
+ *
45
+ * @param options - Plan configuration options
46
+ * @returns ExecutionStrategy
47
+ */
48
+ declare function plan(options?: PlanOptions): ExecutionStrategy;
49
+
50
+ /**
51
+ * Execution group - a set of tool calls that can execute in parallel.
52
+ */
53
+ interface ExecutionGroup {
54
+ /** Tool calls in this group */
55
+ calls: ToolCall[];
56
+ /** Whether this group contains a sequential tool (acts as barrier) */
57
+ isBarrier: boolean;
58
+ }
59
+ /**
60
+ * Order tool calls into execution groups respecting dependencies.
61
+ *
62
+ * This function takes a list of tool calls and the available tools,
63
+ * then groups them for execution while respecting:
64
+ * 1. Tool-level `sequential` flag (creates execution barriers)
65
+ * 2. Tool-level `dependsOn` array (tool must wait for named tools)
66
+ * 3. Model-driven `after` array on tool calls (call must wait for specific calls)
67
+ *
68
+ * @param toolCalls - Tool calls from the model response
69
+ * @param tools - Tool definitions (may include dependency options)
70
+ * @returns Ordered array of execution groups
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const groups = orderToolCalls(turn.response.toolCalls, agent.tools);
75
+ *
76
+ * for (const group of groups) {
77
+ * if (group.isBarrier) {
78
+ * // Execute sequentially
79
+ * for (const call of group.calls) {
80
+ * await executeTool(call);
81
+ * }
82
+ * } else {
83
+ * // Execute in parallel
84
+ * await Promise.all(group.calls.map(executeTool));
85
+ * }
86
+ * }
87
+ * ```
88
+ */
89
+ declare function orderToolCalls(toolCalls: ToolCall[], tools: Tool[]): ExecutionGroup[];
90
+ /**
91
+ * Check if any tools have execution dependencies defined.
92
+ *
93
+ * @param tools - Tool definitions to check
94
+ * @returns true if any tool has sequential or dependsOn set
95
+ */
96
+ declare function hasToolDependencies(tools: Tool[]): boolean;
97
+ /**
98
+ * Check if any tool calls have model-driven dependencies.
99
+ *
100
+ * @param toolCalls - Tool calls to check
101
+ * @returns true if any call has the `after` field set
102
+ */
103
+ declare function hasCallDependencies(toolCalls: ToolCall[]): boolean;
104
+
105
+ export { type ExecutionGroup, ExecutionStrategy, LoopOptions, PlanOptions, ReactOptions, hasCallDependencies, hasToolDependencies, loop, orderToolCalls, plan, react };