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
@@ -1,483 +0,0 @@
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
- }
294
- return {
295
- messages,
296
- terminate: shouldTerminateToolBatch(finalizedCalls),
297
- };
298
- }
299
- async function executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit) {
300
- const finalizedCalls = [];
301
- for (const toolCall of toolCalls) {
302
- await emit({
303
- type: 'tool_execution_start',
304
- toolCallId: toolCall.id,
305
- toolName: toolCall.name,
306
- args: toolCall.arguments,
307
- });
308
- const preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);
309
- if (preparation.kind === 'immediate') {
310
- const finalized = {
311
- toolCall,
312
- result: preparation.result,
313
- isError: preparation.isError,
314
- };
315
- await emitToolExecutionEnd(finalized, emit);
316
- finalizedCalls.push(finalized);
317
- continue;
318
- }
319
- finalizedCalls.push(async () => {
320
- const executed = await executePreparedToolCall(preparation, signal, emit);
321
- const finalized = await finalizeExecutedToolCall(currentContext, assistantMessage, preparation, executed, config, signal);
322
- await emitToolExecutionEnd(finalized, emit);
323
- return finalized;
324
- });
325
- }
326
- const orderedFinalizedCalls = await Promise.all(finalizedCalls.map((entry) => typeof entry === 'function' ? entry() : Promise.resolve(entry)));
327
- const messages = [];
328
- for (const finalized of orderedFinalizedCalls) {
329
- const toolResultMessage = createToolResultMessage(finalized);
330
- await emitToolResultMessage(toolResultMessage, emit);
331
- messages.push(toolResultMessage);
332
- }
333
- return {
334
- messages,
335
- terminate: shouldTerminateToolBatch(orderedFinalizedCalls),
336
- };
337
- }
338
- function shouldTerminateToolBatch(finalizedCalls) {
339
- return (finalizedCalls.length > 0 &&
340
- finalizedCalls.every((finalized) => finalized.result.terminate === true));
341
- }
342
- function prepareToolCallArguments(tool, toolCall) {
343
- if (!tool.prepareArguments) {
344
- return toolCall;
345
- }
346
- const preparedArguments = tool.prepareArguments(toolCall.arguments);
347
- if (preparedArguments === toolCall.arguments) {
348
- return toolCall;
349
- }
350
- return {
351
- ...toolCall,
352
- arguments: preparedArguments,
353
- };
354
- }
355
- async function prepareToolCall(currentContext, assistantMessage, toolCall, config, signal) {
356
- const tool = currentContext.tools?.find((t) => t.name === toolCall.name);
357
- if (!tool) {
358
- return {
359
- kind: 'immediate',
360
- result: createErrorToolResult(`Tool ${toolCall.name} not found`),
361
- isError: true,
362
- };
363
- }
364
- try {
365
- const preparedToolCall = prepareToolCallArguments(tool, toolCall);
366
- const validatedArgs = validateToolArguments(tool, preparedToolCall);
367
- if (config.beforeToolCall) {
368
- const beforeResult = await config.beforeToolCall({
369
- assistantMessage,
370
- toolCall,
371
- args: validatedArgs,
372
- context: currentContext,
373
- }, signal);
374
- if (beforeResult?.block) {
375
- return {
376
- kind: 'immediate',
377
- result: createErrorToolResult(beforeResult.reason || 'Tool execution was blocked'),
378
- isError: true,
379
- };
380
- }
381
- }
382
- return {
383
- kind: 'prepared',
384
- toolCall,
385
- tool,
386
- args: validatedArgs,
387
- };
388
- }
389
- catch (error) {
390
- return {
391
- kind: 'immediate',
392
- result: createErrorToolResult(error instanceof Error ? error.message : String(error)),
393
- isError: true,
394
- };
395
- }
396
- }
397
- async function executePreparedToolCall(prepared, signal, emit) {
398
- const updateEvents = [];
399
- try {
400
- const result = await prepared.tool.execute(prepared.toolCall.id, prepared.args, signal, (partialResult) => {
401
- updateEvents.push(Promise.resolve(emit({
402
- type: 'tool_execution_update',
403
- toolCallId: prepared.toolCall.id,
404
- toolName: prepared.toolCall.name,
405
- args: prepared.toolCall.arguments,
406
- partialResult,
407
- })));
408
- });
409
- await Promise.all(updateEvents);
410
- return { result, isError: false };
411
- }
412
- catch (error) {
413
- await Promise.all(updateEvents);
414
- return {
415
- result: createErrorToolResult(error instanceof Error ? error.message : String(error)),
416
- isError: true,
417
- };
418
- }
419
- }
420
- async function finalizeExecutedToolCall(currentContext, assistantMessage, prepared, executed, config, signal) {
421
- let result = executed.result;
422
- let isError = executed.isError;
423
- if (config.afterToolCall) {
424
- try {
425
- const afterResult = await config.afterToolCall({
426
- assistantMessage,
427
- toolCall: prepared.toolCall,
428
- args: prepared.args,
429
- result,
430
- isError,
431
- context: currentContext,
432
- }, signal);
433
- if (afterResult) {
434
- result = {
435
- content: afterResult.content ?? result.content,
436
- details: afterResult.details ?? result.details,
437
- terminate: afterResult.terminate ?? result.terminate,
438
- };
439
- isError = afterResult.isError ?? isError;
440
- }
441
- }
442
- catch (error) {
443
- result = createErrorToolResult(error instanceof Error ? error.message : String(error));
444
- isError = true;
445
- }
446
- }
447
- return {
448
- toolCall: prepared.toolCall,
449
- result,
450
- isError,
451
- };
452
- }
453
- function createErrorToolResult(message) {
454
- return {
455
- content: [{ type: 'text', text: message }],
456
- details: {},
457
- };
458
- }
459
- async function emitToolExecutionEnd(finalized, emit) {
460
- await emit({
461
- type: 'tool_execution_end',
462
- toolCallId: finalized.toolCall.id,
463
- toolName: finalized.toolCall.name,
464
- result: finalized.result,
465
- isError: finalized.isError,
466
- });
467
- }
468
- function createToolResultMessage(finalized) {
469
- return {
470
- role: 'toolResult',
471
- toolCallId: finalized.toolCall.id,
472
- toolName: finalized.toolCall.name,
473
- content: finalized.result.content,
474
- details: finalized.result.details,
475
- isError: finalized.isError,
476
- timestamp: Date.now(),
477
- };
478
- }
479
- async function emitToolResultMessage(toolResultMessage, emit) {
480
- await emit({ type: 'message_start', message: toolResultMessage });
481
- await emit({ type: 'message_end', message: toolResultMessage });
482
- }
483
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbG9vcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9hZ2VudC1sb29wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFHTCxXQUFXLEVBQ1gsWUFBWSxFQUVaLHFCQUFxQixHQUN0QixNQUFNLHVCQUF1QixDQUFDO0FBZS9COzs7R0FHRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLE9BQXVCLEVBQ3ZCLE9BQXFCLEVBQ3JCLE1BQXVCLEVBQ3ZCLE1BQW9CLEVBQ3BCLFFBQW1CO0lBRW5CLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFFbkMsS0FBSyxZQUFZLENBQ2YsT0FBTyxFQUNQLE9BQU8sRUFDUCxNQUFNLEVBQ04sS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDLEVBQ0QsTUFBTSxFQUNOLFFBQVEsQ0FDVCxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsT0FBcUIsRUFDckIsTUFBdUIsRUFDdkIsTUFBb0IsRUFDcEIsUUFBbUI7SUFFbkIsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtB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