psadk 1.4.7 → 1.5.0

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 (207) hide show
  1. package/README.md +153 -0
  2. package/build/main/index.d.ts +1 -0
  3. package/build/main/lib/PSAI.js +1 -2
  4. package/build/main/lib/PSAgent.d.ts +50 -13
  5. package/build/main/lib/PSAgent.js +179 -502
  6. package/build/main/lib/PSAgentConfig.d.ts +114 -2
  7. package/build/main/lib/PSAgentLogger.js +1 -2
  8. package/build/main/lib/PSAgentTool.d.ts +8 -3
  9. package/build/main/lib/PSAgentTool.js +3 -3
  10. package/build/main/lib/agent-core/package.json +1 -1
  11. package/build/main/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  12. package/build/main/lib/agent-core/src/agent-loop.js +514 -0
  13. package/build/{module/lib/agent-core → main/lib/agent-core/src}/agent.d.ts +2 -2
  14. package/build/main/lib/agent-core/src/agent.js +419 -0
  15. package/build/main/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  16. package/build/main/lib/agent-core/src/harness/agent-harness.js +1028 -0
  17. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  18. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  19. package/build/main/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  20. package/build/main/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  21. package/build/main/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  22. package/build/main/lib/agent-core/src/harness/compaction/utils.js +131 -0
  23. package/build/main/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  24. package/build/main/lib/agent-core/src/harness/env/nodejs.js +494 -0
  25. package/build/main/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  26. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/messages.js +1 -1
  27. package/build/main/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  28. package/build/main/lib/agent-core/src/harness/prompt-templates.js +235 -0
  29. package/build/{module/lib/agent-core/harness/session/repo/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  30. package/build/main/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  31. package/build/{module/lib/agent-core/harness/session/storage/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  32. package/build/main/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  33. package/build/main/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  34. package/build/main/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  35. package/build/main/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  36. package/build/main/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  37. package/build/main/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  38. package/build/main/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  39. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  40. package/build/main/lib/agent-core/src/harness/session/session.js +213 -0
  41. package/build/main/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  42. package/build/main/lib/agent-core/src/harness/session/uuid.js +54 -0
  43. package/build/main/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  44. package/build/main/lib/agent-core/src/harness/skills.js +353 -0
  45. package/build/main/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  46. package/build/main/lib/agent-core/src/harness/system-prompt.js +30 -0
  47. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/types.d.ts +160 -70
  48. package/build/main/lib/agent-core/src/harness/types.js +94 -0
  49. package/build/main/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  50. package/build/main/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  51. package/build/main/lib/agent-core/src/harness/utils/truncate.js +294 -0
  52. package/build/main/lib/agent-core/src/index.d.ts +19 -0
  53. package/build/main/lib/agent-core/src/index.js +25 -0
  54. package/build/main/lib/agent-core/src/node.d.ts +2 -0
  55. package/build/main/lib/agent-core/src/node.js +3 -0
  56. package/build/main/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  57. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.d.ts +13 -1
  58. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.js +1 -1
  59. package/build/main/lib/localAgent.d.ts +35 -0
  60. package/build/main/lib/localAgent.js +329 -0
  61. package/build/main/lib/remoteAgent.d.ts +25 -0
  62. package/build/main/lib/remoteAgent.js +311 -0
  63. package/build/main/lib/tools/BraveWebSearchTool.js +1 -2
  64. package/build/main/lib/tools/PSArtifactTool.js +1 -2
  65. package/build/main/lib/tools/PSClarifyTool.js +1 -2
  66. package/build/main/lib/tools/PSCommandLineTool.js +1 -2
  67. package/build/main/lib/tools/PSMemoryTool.js +1 -2
  68. package/build/main/lib/tools/PSReadFileTool.js +1 -2
  69. package/build/main/lib/tools/PSRetrievalTool.js +1 -2
  70. package/build/main/lib/tools/PSSkillTool.js +1 -2
  71. package/build/main/lib/tools/PSSubAgentTool.js +1 -1
  72. package/build/main/lib/tools/PSWriteFileTool.js +1 -2
  73. package/build/main/lib/tools/TodoTool.js +1 -2
  74. package/build/main/lib/utils/debuglogger.js +1 -2
  75. package/build/main/lib/utils/helpers.js +1 -6
  76. package/build/module/index.d.ts +1 -0
  77. package/build/module/lib/PSAI.js +1 -2
  78. package/build/module/lib/PSAgent.d.ts +50 -13
  79. package/build/module/lib/PSAgent.js +179 -502
  80. package/build/module/lib/PSAgentConfig.d.ts +114 -2
  81. package/build/module/lib/PSAgentLogger.js +1 -2
  82. package/build/module/lib/PSAgentTool.d.ts +8 -3
  83. package/build/module/lib/PSAgentTool.js +3 -3
  84. package/build/module/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  85. package/build/module/lib/agent-core/src/agent-loop.js +514 -0
  86. package/build/{main/lib/agent-core → module/lib/agent-core/src}/agent.d.ts +2 -2
  87. package/build/module/lib/agent-core/src/agent.js +419 -0
  88. package/build/module/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  89. package/build/module/lib/agent-core/src/harness/agent-harness.js +1028 -0
  90. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  91. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  92. package/build/module/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  93. package/build/module/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  94. package/build/module/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  95. package/build/module/lib/agent-core/src/harness/compaction/utils.js +131 -0
  96. package/build/module/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  97. package/build/module/lib/agent-core/src/harness/env/nodejs.js +494 -0
  98. package/build/module/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  99. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/messages.js +1 -1
  100. package/build/module/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  101. package/build/module/lib/agent-core/src/harness/prompt-templates.js +235 -0
  102. package/build/{main/lib/agent-core/harness/session/repo/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  103. package/build/module/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  104. package/build/{main/lib/agent-core/harness/session/storage/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  105. package/build/module/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  106. package/build/module/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  107. package/build/module/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  108. package/build/module/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  109. package/build/module/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  110. package/build/module/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  111. package/build/module/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  112. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  113. package/build/module/lib/agent-core/src/harness/session/session.js +213 -0
  114. package/build/module/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  115. package/build/module/lib/agent-core/src/harness/session/uuid.js +54 -0
  116. package/build/module/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  117. package/build/module/lib/agent-core/src/harness/skills.js +353 -0
  118. package/build/module/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  119. package/build/module/lib/agent-core/src/harness/system-prompt.js +30 -0
  120. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/types.d.ts +160 -70
  121. package/build/module/lib/agent-core/src/harness/types.js +94 -0
  122. package/build/module/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  123. package/build/module/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  124. package/build/module/lib/agent-core/src/harness/utils/truncate.js +294 -0
  125. package/build/module/lib/agent-core/src/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/src/index.js +25 -0
  127. package/build/module/lib/agent-core/src/node.d.ts +2 -0
  128. package/build/module/lib/agent-core/src/node.js +3 -0
  129. package/build/module/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  130. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.d.ts +13 -1
  131. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.js +1 -1
  132. package/build/module/lib/localAgent.d.ts +35 -0
  133. package/build/module/lib/localAgent.js +329 -0
  134. package/build/module/lib/remoteAgent.d.ts +25 -0
  135. package/build/module/lib/remoteAgent.js +311 -0
  136. package/build/module/lib/tools/BraveWebSearchTool.js +1 -2
  137. package/build/module/lib/tools/PSArtifactTool.js +1 -2
  138. package/build/module/lib/tools/PSClarifyTool.js +1 -2
  139. package/build/module/lib/tools/PSCommandLineTool.js +1 -2
  140. package/build/module/lib/tools/PSMemoryTool.js +1 -2
  141. package/build/module/lib/tools/PSReadFileTool.js +1 -2
  142. package/build/module/lib/tools/PSRetrievalTool.js +1 -2
  143. package/build/module/lib/tools/PSSkillTool.js +1 -2
  144. package/build/module/lib/tools/PSSubAgentTool.js +1 -1
  145. package/build/module/lib/tools/PSWriteFileTool.js +1 -2
  146. package/build/module/lib/tools/TodoTool.js +1 -2
  147. package/build/module/lib/utils/debuglogger.js +1 -2
  148. package/build/module/lib/utils/helpers.js +1 -6
  149. package/package.json +3 -2
  150. package/build/main/lib/agent-core/agent-loop.js +0 -483
  151. package/build/main/lib/agent-core/agent.js +0 -419
  152. package/build/main/lib/agent-core/harness/agent-harness.js +0 -772
  153. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  154. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  155. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  156. package/build/main/lib/agent-core/harness/compaction/compaction.js +0 -637
  157. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  158. package/build/main/lib/agent-core/harness/compaction/utils.js +0 -153
  159. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  160. package/build/main/lib/agent-core/harness/env/nodejs.js +0 -353
  161. package/build/main/lib/agent-core/harness/execution-env.d.ts +0 -3
  162. package/build/main/lib/agent-core/harness/execution-env.js +0 -3
  163. package/build/main/lib/agent-core/harness/prompt-templates.js +0 -204
  164. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  165. package/build/main/lib/agent-core/harness/session/repo/memory.js +0 -46
  166. package/build/main/lib/agent-core/harness/session/repo/shared.js +0 -31
  167. package/build/main/lib/agent-core/harness/session/session.js +0 -199
  168. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  169. package/build/main/lib/agent-core/harness/session/storage/memory.js +0 -94
  170. package/build/main/lib/agent-core/harness/skills.js +0 -266
  171. package/build/main/lib/agent-core/harness/system-prompt.js +0 -30
  172. package/build/main/lib/agent-core/harness/types.js +0 -16
  173. package/build/main/lib/agent-core/harness/utils/shell-output.js +0 -101
  174. package/build/main/lib/agent-core/harness/utils/truncate.js +0 -208
  175. package/build/main/lib/agent-core/index.d.ts +0 -19
  176. package/build/main/lib/agent-core/index.js +0 -25
  177. package/build/module/lib/agent-core/agent-loop.js +0 -483
  178. package/build/module/lib/agent-core/agent.js +0 -419
  179. package/build/module/lib/agent-core/harness/agent-harness.js +0 -772
  180. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  181. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  182. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  183. package/build/module/lib/agent-core/harness/compaction/compaction.js +0 -637
  184. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  185. package/build/module/lib/agent-core/harness/compaction/utils.js +0 -153
  186. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  187. package/build/module/lib/agent-core/harness/env/nodejs.js +0 -353
  188. package/build/module/lib/agent-core/harness/execution-env.d.ts +0 -3
  189. package/build/module/lib/agent-core/harness/execution-env.js +0 -3
  190. package/build/module/lib/agent-core/harness/prompt-templates.js +0 -204
  191. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  192. package/build/module/lib/agent-core/harness/session/repo/memory.js +0 -46
  193. package/build/module/lib/agent-core/harness/session/repo/shared.js +0 -31
  194. package/build/module/lib/agent-core/harness/session/session.js +0 -199
  195. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  196. package/build/module/lib/agent-core/harness/session/storage/memory.js +0 -94
  197. package/build/module/lib/agent-core/harness/skills.js +0 -266
  198. package/build/module/lib/agent-core/harness/system-prompt.js +0 -30
  199. package/build/module/lib/agent-core/harness/types.js +0 -16
  200. package/build/module/lib/agent-core/harness/utils/shell-output.js +0 -101
  201. package/build/module/lib/agent-core/harness/utils/truncate.js +0 -208
  202. package/build/module/lib/agent-core/index.d.ts +0 -19
  203. package/build/module/lib/agent-core/index.js +0 -25
  204. /package/build/main/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  205. /package/build/main/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
  206. /package/build/module/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  207. /package/build/module/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Agent loop that works with AgentMessage throughout.
3
+ * Transforms to Message[] only at the LLM call boundary.
4
+ */
5
+ import { EventStream, streamSimple, validateToolArguments, } from '@earendil-works/pi-ai';
6
+ /**
7
+ * Start an agent loop with a new prompt message.
8
+ * The prompt is added to the context and events are emitted for it.
9
+ */
10
+ export function agentLoop(prompts, context, config, signal, streamFn) {
11
+ const stream = createAgentStream();
12
+ void runAgentLoop(prompts, context, config, async (event) => {
13
+ stream.push(event);
14
+ }, signal, streamFn).then((messages) => {
15
+ stream.end(messages);
16
+ });
17
+ return stream;
18
+ }
19
+ /**
20
+ * Continue an agent loop from the current context without adding a new message.
21
+ * Used for retries - context already has user message or tool results.
22
+ *
23
+ * **Important:** The last message in context must convert to a `user` or `toolResult` message
24
+ * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.
25
+ * This cannot be validated here since `convertToLlm` is only called once per turn.
26
+ */
27
+ export function agentLoopContinue(context, config, signal, streamFn) {
28
+ if (context.messages.length === 0) {
29
+ throw new Error('Cannot continue: no messages in context');
30
+ }
31
+ if (context.messages[context.messages.length - 1].role === 'assistant') {
32
+ throw new Error('Cannot continue from message role: assistant');
33
+ }
34
+ const stream = createAgentStream();
35
+ void runAgentLoopContinue(context, config, async (event) => {
36
+ stream.push(event);
37
+ }, signal, streamFn).then((messages) => {
38
+ stream.end(messages);
39
+ });
40
+ return stream;
41
+ }
42
+ export async function runAgentLoop(prompts, context, config, emit, signal, streamFn) {
43
+ const newMessages = [...prompts];
44
+ const currentContext = {
45
+ ...context,
46
+ messages: [...context.messages, ...prompts],
47
+ };
48
+ await emit({ type: 'agent_start' });
49
+ await emit({ type: 'turn_start' });
50
+ for (const prompt of prompts) {
51
+ await emit({ type: 'message_start', message: prompt });
52
+ await emit({ type: 'message_end', message: prompt });
53
+ }
54
+ await runLoop(currentContext, newMessages, config, signal, emit, streamFn);
55
+ return newMessages;
56
+ }
57
+ export async function runAgentLoopContinue(context, config, emit, signal, streamFn) {
58
+ if (context.messages.length === 0) {
59
+ throw new Error('Cannot continue: no messages in context');
60
+ }
61
+ if (context.messages[context.messages.length - 1].role === 'assistant') {
62
+ throw new Error('Cannot continue from message role: assistant');
63
+ }
64
+ const newMessages = [];
65
+ const currentContext = { ...context };
66
+ await emit({ type: 'agent_start' });
67
+ await emit({ type: 'turn_start' });
68
+ await runLoop(currentContext, newMessages, config, signal, emit, streamFn);
69
+ return newMessages;
70
+ }
71
+ function createAgentStream() {
72
+ return new EventStream((event) => event.type === 'agent_end', (event) => (event.type === 'agent_end' ? event.messages : []));
73
+ }
74
+ /**
75
+ * Main loop logic shared by agentLoop and agentLoopContinue.
76
+ */
77
+ async function runLoop(initialContext, newMessages, initialConfig, signal, emit, streamFn) {
78
+ let currentContext = initialContext;
79
+ let config = initialConfig;
80
+ let firstTurn = true;
81
+ // Check for steering messages at start (user may have typed while waiting)
82
+ let pendingMessages = (await config.getSteeringMessages?.()) || [];
83
+ // Outer loop: continues when queued follow-up messages arrive after agent would stop
84
+ while (true) {
85
+ let hasMoreToolCalls = true;
86
+ // Inner loop: process tool calls and steering messages
87
+ while (hasMoreToolCalls || pendingMessages.length > 0) {
88
+ if (!firstTurn) {
89
+ await emit({ type: 'turn_start' });
90
+ }
91
+ else {
92
+ firstTurn = false;
93
+ }
94
+ // Process pending messages (inject before next assistant response)
95
+ if (pendingMessages.length > 0) {
96
+ for (const message of pendingMessages) {
97
+ await emit({ type: 'message_start', message });
98
+ await emit({ type: 'message_end', message });
99
+ currentContext.messages.push(message);
100
+ newMessages.push(message);
101
+ }
102
+ pendingMessages = [];
103
+ }
104
+ // Stream assistant response
105
+ const message = await streamAssistantResponse(currentContext, config, signal, emit, streamFn);
106
+ newMessages.push(message);
107
+ if (message.stopReason === 'error' || message.stopReason === 'aborted') {
108
+ await emit({ type: 'turn_end', message, toolResults: [] });
109
+ await emit({ type: 'agent_end', messages: newMessages });
110
+ return;
111
+ }
112
+ // Check for tool calls
113
+ const toolCalls = message.content.filter((c) => c.type === 'toolCall');
114
+ const toolResults = [];
115
+ hasMoreToolCalls = false;
116
+ if (toolCalls.length > 0) {
117
+ const executedToolBatch = await executeToolCalls(currentContext, message, config, signal, emit);
118
+ toolResults.push(...executedToolBatch.messages);
119
+ hasMoreToolCalls = !executedToolBatch.terminate;
120
+ for (const result of toolResults) {
121
+ currentContext.messages.push(result);
122
+ newMessages.push(result);
123
+ }
124
+ }
125
+ await emit({ type: 'turn_end', message, toolResults });
126
+ const nextTurnContext = {
127
+ message,
128
+ toolResults,
129
+ context: currentContext,
130
+ newMessages,
131
+ };
132
+ const nextTurnSnapshot = await config.prepareNextTurn?.(nextTurnContext);
133
+ if (nextTurnSnapshot) {
134
+ currentContext = nextTurnSnapshot.context ?? currentContext;
135
+ config = {
136
+ ...config,
137
+ model: nextTurnSnapshot.model ?? config.model,
138
+ reasoning: nextTurnSnapshot.thinkingLevel === undefined
139
+ ? config.reasoning
140
+ : nextTurnSnapshot.thinkingLevel === 'off'
141
+ ? undefined
142
+ : nextTurnSnapshot.thinkingLevel,
143
+ };
144
+ }
145
+ if (await config.shouldStopAfterTurn?.({
146
+ message,
147
+ toolResults,
148
+ context: currentContext,
149
+ newMessages,
150
+ })) {
151
+ await emit({ type: 'agent_end', messages: newMessages });
152
+ return;
153
+ }
154
+ pendingMessages = (await config.getSteeringMessages?.()) || [];
155
+ }
156
+ // Agent would stop here. Check for follow-up messages.
157
+ const followUpMessages = (await config.getFollowUpMessages?.()) || [];
158
+ if (followUpMessages.length > 0) {
159
+ // Set as pending so inner loop processes them
160
+ pendingMessages = followUpMessages;
161
+ continue;
162
+ }
163
+ // No more messages, exit
164
+ break;
165
+ }
166
+ await emit({ type: 'agent_end', messages: newMessages });
167
+ }
168
+ /**
169
+ * Stream an assistant response from the LLM.
170
+ * This is where AgentMessage[] gets transformed to Message[] for the LLM.
171
+ */
172
+ async function streamAssistantResponse(context, config, signal, emit, streamFn) {
173
+ // Apply context transform if configured (AgentMessage[] → AgentMessage[])
174
+ let messages = context.messages;
175
+ if (config.transformContext) {
176
+ messages = await config.transformContext(messages, signal);
177
+ }
178
+ // Convert to LLM-compatible messages (AgentMessage[] → Message[])
179
+ const llmMessages = await config.convertToLlm(messages);
180
+ // Build LLM context
181
+ const llmContext = {
182
+ systemPrompt: context.systemPrompt,
183
+ messages: llmMessages,
184
+ tools: context.tools,
185
+ };
186
+ const streamFunction = streamFn || streamSimple;
187
+ // Resolve API key (important for expiring tokens)
188
+ const resolvedApiKey = (config.getApiKey
189
+ ? await config.getApiKey(config.model.provider)
190
+ : undefined) || config.apiKey;
191
+ const response = await streamFunction(config.model, llmContext, {
192
+ ...config,
193
+ apiKey: resolvedApiKey,
194
+ signal,
195
+ });
196
+ let partialMessage = null;
197
+ let addedPartial = false;
198
+ for await (const event of response) {
199
+ switch (event.type) {
200
+ case 'start':
201
+ partialMessage = event.partial;
202
+ context.messages.push(partialMessage);
203
+ addedPartial = true;
204
+ await emit({ type: 'message_start', message: { ...partialMessage } });
205
+ break;
206
+ case 'text_start':
207
+ case 'text_delta':
208
+ case 'text_end':
209
+ case 'thinking_start':
210
+ case 'thinking_delta':
211
+ case 'thinking_end':
212
+ case 'toolcall_start':
213
+ case 'toolcall_delta':
214
+ case 'toolcall_end':
215
+ if (partialMessage) {
216
+ partialMessage = event.partial;
217
+ context.messages[context.messages.length - 1] = partialMessage;
218
+ await emit({
219
+ type: 'message_update',
220
+ assistantMessageEvent: event,
221
+ message: { ...partialMessage },
222
+ });
223
+ }
224
+ break;
225
+ case 'done':
226
+ case 'error': {
227
+ const finalMessage = await response.result();
228
+ if (addedPartial) {
229
+ context.messages[context.messages.length - 1] = finalMessage;
230
+ }
231
+ else {
232
+ context.messages.push(finalMessage);
233
+ }
234
+ if (!addedPartial) {
235
+ await emit({ type: 'message_start', message: { ...finalMessage } });
236
+ }
237
+ await emit({ type: 'message_end', message: finalMessage });
238
+ return finalMessage;
239
+ }
240
+ }
241
+ }
242
+ const finalMessage = await response.result();
243
+ if (addedPartial) {
244
+ context.messages[context.messages.length - 1] = finalMessage;
245
+ }
246
+ else {
247
+ context.messages.push(finalMessage);
248
+ await emit({ type: 'message_start', message: { ...finalMessage } });
249
+ }
250
+ await emit({ type: 'message_end', message: finalMessage });
251
+ return finalMessage;
252
+ }
253
+ /**
254
+ * Execute tool calls from an assistant message.
255
+ */
256
+ async function executeToolCalls(currentContext, assistantMessage, config, signal, emit) {
257
+ const toolCalls = assistantMessage.content.filter((c) => c.type === 'toolCall');
258
+ const hasSequentialToolCall = toolCalls.some((tc) => currentContext.tools?.find((t) => t.name === tc.name)?.executionMode ===
259
+ 'sequential');
260
+ if (config.toolExecution === 'sequential' || hasSequentialToolCall) {
261
+ return executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, emit);
262
+ }
263
+ return executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit);
264
+ }
265
+ async function executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, emit) {
266
+ const finalizedCalls = [];
267
+ const messages = [];
268
+ for (const toolCall of toolCalls) {
269
+ await emit({
270
+ type: 'tool_execution_start',
271
+ toolCallId: toolCall.id,
272
+ toolName: toolCall.name,
273
+ args: toolCall.arguments,
274
+ });
275
+ const preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);
276
+ let finalized;
277
+ if (preparation.kind === 'immediate') {
278
+ finalized = {
279
+ toolCall,
280
+ result: preparation.result,
281
+ isError: preparation.isError,
282
+ };
283
+ }
284
+ else {
285
+ const executed = await executePreparedToolCall(preparation, signal, emit);
286
+ finalized = await finalizeExecutedToolCall(currentContext, assistantMessage, preparation, executed, config, signal);
287
+ }
288
+ await emitToolExecutionEnd(finalized, emit);
289
+ const toolResultMessage = createToolResultMessage(finalized);
290
+ await emitToolResultMessage(toolResultMessage, emit);
291
+ finalizedCalls.push(finalized);
292
+ messages.push(toolResultMessage);
293
+ if (signal?.aborted) {
294
+ break;
295
+ }
296
+ }
297
+ return {
298
+ messages,
299
+ terminate: shouldTerminateToolBatch(finalizedCalls),
300
+ };
301
+ }
302
+ async function executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit) {
303
+ const finalizedCalls = [];
304
+ for (const toolCall of toolCalls) {
305
+ await emit({
306
+ type: 'tool_execution_start',
307
+ toolCallId: toolCall.id,
308
+ toolName: toolCall.name,
309
+ args: toolCall.arguments,
310
+ });
311
+ const preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);
312
+ if (preparation.kind === 'immediate') {
313
+ const finalized = {
314
+ toolCall,
315
+ result: preparation.result,
316
+ isError: preparation.isError,
317
+ };
318
+ await emitToolExecutionEnd(finalized, emit);
319
+ finalizedCalls.push(finalized);
320
+ if (signal?.aborted) {
321
+ break;
322
+ }
323
+ continue;
324
+ }
325
+ finalizedCalls.push(async () => {
326
+ const executed = await executePreparedToolCall(preparation, signal, emit);
327
+ const finalized = await finalizeExecutedToolCall(currentContext, assistantMessage, preparation, executed, config, signal);
328
+ await emitToolExecutionEnd(finalized, emit);
329
+ return finalized;
330
+ });
331
+ if (signal?.aborted) {
332
+ break;
333
+ }
334
+ }
335
+ const orderedFinalizedCalls = await Promise.all(finalizedCalls.map((entry) => typeof entry === 'function' ? entry() : Promise.resolve(entry)));
336
+ const messages = [];
337
+ for (const finalized of orderedFinalizedCalls) {
338
+ const toolResultMessage = createToolResultMessage(finalized);
339
+ await emitToolResultMessage(toolResultMessage, emit);
340
+ messages.push(toolResultMessage);
341
+ }
342
+ return {
343
+ messages,
344
+ terminate: shouldTerminateToolBatch(orderedFinalizedCalls),
345
+ };
346
+ }
347
+ function shouldTerminateToolBatch(finalizedCalls) {
348
+ return (finalizedCalls.length > 0 &&
349
+ finalizedCalls.every((finalized) => finalized.result.terminate === true));
350
+ }
351
+ function prepareToolCallArguments(tool, toolCall) {
352
+ if (!tool.prepareArguments) {
353
+ return toolCall;
354
+ }
355
+ const preparedArguments = tool.prepareArguments(toolCall.arguments);
356
+ if (preparedArguments === toolCall.arguments) {
357
+ return toolCall;
358
+ }
359
+ return {
360
+ ...toolCall,
361
+ arguments: preparedArguments,
362
+ };
363
+ }
364
+ async function prepareToolCall(currentContext, assistantMessage, toolCall, config, signal) {
365
+ const tool = currentContext.tools?.find((t) => t.name === toolCall.name);
366
+ if (!tool) {
367
+ return {
368
+ kind: 'immediate',
369
+ result: createErrorToolResult(`Tool ${toolCall.name} not found`),
370
+ isError: true,
371
+ };
372
+ }
373
+ try {
374
+ const preparedToolCall = prepareToolCallArguments(tool, toolCall);
375
+ const validatedArgs = validateToolArguments(tool, preparedToolCall);
376
+ if (config.beforeToolCall) {
377
+ const beforeResult = await config.beforeToolCall({
378
+ assistantMessage,
379
+ toolCall,
380
+ args: validatedArgs,
381
+ context: currentContext,
382
+ }, signal);
383
+ if (signal?.aborted) {
384
+ return {
385
+ kind: 'immediate',
386
+ result: createErrorToolResult('Operation aborted'),
387
+ isError: true,
388
+ };
389
+ }
390
+ if (beforeResult?.block) {
391
+ return {
392
+ kind: 'immediate',
393
+ result: createErrorToolResult(beforeResult.reason || 'Tool execution was blocked'),
394
+ isError: true,
395
+ };
396
+ }
397
+ }
398
+ if (signal?.aborted) {
399
+ return {
400
+ kind: 'immediate',
401
+ result: createErrorToolResult('Operation aborted'),
402
+ isError: true,
403
+ };
404
+ }
405
+ return {
406
+ kind: 'prepared',
407
+ toolCall,
408
+ tool,
409
+ args: validatedArgs,
410
+ };
411
+ }
412
+ catch (error) {
413
+ return {
414
+ kind: 'immediate',
415
+ result: createErrorToolResult(error instanceof Error ? error.message : String(error)),
416
+ isError: true,
417
+ };
418
+ }
419
+ }
420
+ async function executePreparedToolCall(prepared, signal, emit) {
421
+ const updateEvents = [];
422
+ let acceptingUpdates = true;
423
+ try {
424
+ const result = await prepared.tool.execute(prepared.toolCall.id, prepared.args, signal, (partialResult) => {
425
+ if (!acceptingUpdates)
426
+ return;
427
+ updateEvents.push(Promise.resolve(emit({
428
+ type: 'tool_execution_update',
429
+ toolCallId: prepared.toolCall.id,
430
+ toolName: prepared.toolCall.name,
431
+ args: prepared.toolCall.arguments,
432
+ partialResult,
433
+ })));
434
+ });
435
+ acceptingUpdates = false;
436
+ await Promise.all(updateEvents);
437
+ return { result, isError: false };
438
+ }
439
+ catch (error) {
440
+ acceptingUpdates = false;
441
+ await Promise.all(updateEvents);
442
+ return {
443
+ result: createErrorToolResult(error instanceof Error ? error.message : String(error)),
444
+ isError: true,
445
+ };
446
+ }
447
+ finally {
448
+ acceptingUpdates = false;
449
+ }
450
+ }
451
+ async function finalizeExecutedToolCall(currentContext, assistantMessage, prepared, executed, config, signal) {
452
+ let result = executed.result;
453
+ let isError = executed.isError;
454
+ if (config.afterToolCall) {
455
+ try {
456
+ const afterResult = await config.afterToolCall({
457
+ assistantMessage,
458
+ toolCall: prepared.toolCall,
459
+ args: prepared.args,
460
+ result,
461
+ isError,
462
+ context: currentContext,
463
+ }, signal);
464
+ if (afterResult) {
465
+ result = {
466
+ content: afterResult.content ?? result.content,
467
+ details: afterResult.details ?? result.details,
468
+ terminate: afterResult.terminate ?? result.terminate,
469
+ };
470
+ isError = afterResult.isError ?? isError;
471
+ }
472
+ }
473
+ catch (error) {
474
+ result = createErrorToolResult(error instanceof Error ? error.message : String(error));
475
+ isError = true;
476
+ }
477
+ }
478
+ return {
479
+ toolCall: prepared.toolCall,
480
+ result,
481
+ isError,
482
+ };
483
+ }
484
+ function createErrorToolResult(message) {
485
+ return {
486
+ content: [{ type: 'text', text: message }],
487
+ details: {},
488
+ };
489
+ }
490
+ async function emitToolExecutionEnd(finalized, emit) {
491
+ await emit({
492
+ type: 'tool_execution_end',
493
+ toolCallId: finalized.toolCall.id,
494
+ toolName: finalized.toolCall.name,
495
+ result: finalized.result,
496
+ isError: finalized.isError,
497
+ });
498
+ }
499
+ function createToolResultMessage(finalized) {
500
+ return {
501
+ role: 'toolResult',
502
+ toolCallId: finalized.toolCall.id,
503
+ toolName: finalized.toolCall.name,
504
+ content: finalized.result.content,
505
+ details: finalized.result.details,
506
+ isError: finalized.isError,
507
+ timestamp: Date.now(),
508
+ };
509
+ }
510
+ async function emitToolResultMessage(toolResultMessage, emit) {
511
+ await emit({ type: 'message_start', message: toolResultMessage });
512
+ await emit({ type: 'message_end', message: toolResultMessage });
513
+ }
514
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbG9vcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvYWdlbnQtbG9vcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBR0wsV0FBVyxFQUNYLFlBQVksRUFFWixxQkFBcUIsR0FDdEIsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUN2QixPQUF1QixFQUN2QixPQUFxQixFQUNyQixNQUF1QixFQUN2QixNQUFvQixFQUNwQixRQUFtQjtJQUVuQixNQUFNLE1BQU0sR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0lBRW5DLEtBQUssWUFBWSxDQUNmLE9BQU8sRUFDUCxPQUFPLEVBQ1AsTUFBTSxFQUNOLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQyxFQUNELE1BQU0sRUFDTixRQUFRLENBQ1QsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE9BQXFCLEVBQ3JCLE1BQXVCLEVBQ3ZCLE1BQW9CLEVBQ3BCLFFBQW1CO0lBRW5CLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMs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
@@ -1,6 +1,6 @@
1
1
  import { type ImageContent, type Message, type SimpleStreamOptions, type ThinkingBudgets, type Transport } from '@earendil-works/pi-ai';
2
- import type { AfterToolCallContext, AfterToolCallResult, AgentEvent, AgentLoopTurnUpdate, AgentMessage, AgentState, BeforeToolCallContext, BeforeToolCallResult, StreamFn, ToolExecutionMode } from './types.js';
3
- export type QueueMode = 'all' | 'one-at-a-time';
2
+ import type { AfterToolCallContext, AfterToolCallResult, AgentEvent, AgentLoopTurnUpdate, AgentMessage, AgentState, BeforeToolCallContext, BeforeToolCallResult, QueueMode, StreamFn, ToolExecutionMode } from './types.ts';
3
+ export type { QueueMode } from './types.ts';
4
4
  /** Options for constructing an {@link Agent}. */
5
5
  export interface AgentOptions {
6
6
  initialState?: Partial<Omit<AgentState, 'pendingToolCalls' | 'isStreaming' | 'streamingMessage' | 'errorMessage'>>;