psadk 1.3.7 → 1.4.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 (136) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +150 -0
  3. package/build/main/index.d.ts +1 -0
  4. package/build/main/index.js +2 -1
  5. package/build/main/lib/PSAI.d.ts +16 -1
  6. package/build/main/lib/PSAI.js +264 -79
  7. package/build/main/lib/PSAgent.js +77 -60
  8. package/build/main/lib/PSAgentConfig.d.ts +3 -0
  9. package/build/main/lib/PSAgentLogger.js +12 -9
  10. package/build/main/lib/PSAgentTask.js +4 -1
  11. package/build/main/lib/PSAgentTool.js +12 -2
  12. package/build/main/lib/agent-core/agent-loop.d.ts +23 -0
  13. package/build/main/lib/agent-core/agent-loop.js +483 -0
  14. package/build/main/lib/agent-core/agent.d.ts +124 -0
  15. package/build/main/lib/agent-core/agent.js +419 -0
  16. package/build/main/lib/agent-core/harness/agent-harness.d.ts +84 -0
  17. package/build/main/lib/agent-core/harness/agent-harness.js +772 -0
  18. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
  19. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
  20. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
  21. package/build/main/lib/agent-core/harness/compaction/compaction.js +637 -0
  22. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +37 -0
  23. package/build/main/lib/agent-core/harness/compaction/utils.js +153 -0
  24. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +43 -0
  25. package/build/main/lib/agent-core/harness/env/nodejs.js +353 -0
  26. package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -0
  27. package/build/main/lib/agent-core/harness/execution-env.js +3 -0
  28. package/build/main/lib/agent-core/harness/messages.d.ts +50 -0
  29. package/build/main/lib/agent-core/harness/messages.js +116 -0
  30. package/build/main/lib/agent-core/harness/prompt-templates.d.ts +44 -0
  31. package/build/main/lib/agent-core/harness/prompt-templates.js +204 -0
  32. package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
  33. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +98 -0
  34. package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
  35. package/build/main/lib/agent-core/harness/session/repo/memory.js +46 -0
  36. package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
  37. package/build/main/lib/agent-core/harness/session/repo/shared.js +31 -0
  38. package/build/main/lib/agent-core/harness/session/session.d.ts +31 -0
  39. package/build/main/lib/agent-core/harness/session/session.js +199 -0
  40. package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
  41. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +170 -0
  42. package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
  43. package/build/main/lib/agent-core/harness/session/storage/memory.js +94 -0
  44. package/build/main/lib/agent-core/harness/skills.d.ts +40 -0
  45. package/build/main/lib/agent-core/harness/skills.js +266 -0
  46. package/build/main/lib/agent-core/harness/system-prompt.d.ts +2 -0
  47. package/build/main/lib/agent-core/harness/system-prompt.js +30 -0
  48. package/build/main/lib/agent-core/harness/types.d.ts +524 -0
  49. package/build/main/lib/agent-core/harness/types.js +16 -0
  50. package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
  51. package/build/main/lib/agent-core/harness/utils/shell-output.js +101 -0
  52. package/build/main/lib/agent-core/harness/utils/truncate.d.ts +69 -0
  53. package/build/main/lib/agent-core/harness/utils/truncate.js +208 -0
  54. package/build/main/lib/agent-core/index.d.ts +19 -0
  55. package/build/main/lib/agent-core/index.js +25 -0
  56. package/build/main/lib/agent-core/package.json +3 -0
  57. package/build/main/lib/agent-core/proxy.d.ts +68 -0
  58. package/build/main/lib/agent-core/proxy.js +294 -0
  59. package/build/main/lib/agent-core/types.d.ts +385 -0
  60. package/build/main/lib/agent-core/types.js +2 -0
  61. package/build/main/lib/skills/constants.js +6 -4
  62. package/build/main/lib/skills/skillParser.js +2 -2
  63. package/build/main/lib/skills/utils.js +8 -10
  64. package/build/main/lib/tools/BraveWebSearchTool.js +4 -3
  65. package/build/main/lib/tools/PSArtifactTool.js +3 -3
  66. package/build/main/lib/tools/PSClarifyTool.js +3 -2
  67. package/build/main/lib/tools/PSCommandLineTool.js +8 -7
  68. package/build/main/lib/tools/PSMemoryTool.js +9 -7
  69. package/build/main/lib/tools/PSReadFileTool.js +3 -3
  70. package/build/main/lib/tools/PSRetrievalTool.d.ts +127 -0
  71. package/build/main/lib/tools/PSRetrievalTool.js +172 -0
  72. package/build/main/lib/tools/PSSkillTool.js +6 -4
  73. package/build/main/lib/tools/PSSubAgentTool.js +4 -5
  74. package/build/main/lib/tools/PSWriteFileTool.js +3 -3
  75. package/build/main/lib/tools/TodoTool.js +8 -4
  76. package/build/main/lib/utils/helpers.d.ts +34 -0
  77. package/build/main/lib/utils/helpers.js +281 -13
  78. package/build/module/index.d.ts +1 -0
  79. package/build/module/index.js +2 -1
  80. package/build/module/lib/PSAI.d.ts +16 -1
  81. package/build/module/lib/PSAI.js +229 -85
  82. package/build/module/lib/PSAgentConfig.d.ts +3 -0
  83. package/build/module/lib/agent-core/agent-loop.d.ts +23 -0
  84. package/build/module/lib/agent-core/agent-loop.js +483 -0
  85. package/build/module/lib/agent-core/agent.d.ts +124 -0
  86. package/build/module/lib/agent-core/agent.js +419 -0
  87. package/build/module/lib/agent-core/harness/agent-harness.d.ts +84 -0
  88. package/build/module/lib/agent-core/harness/agent-harness.js +772 -0
  89. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
  90. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
  91. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
  92. package/build/module/lib/agent-core/harness/compaction/compaction.js +637 -0
  93. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +37 -0
  94. package/build/module/lib/agent-core/harness/compaction/utils.js +153 -0
  95. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +43 -0
  96. package/build/module/lib/agent-core/harness/env/nodejs.js +353 -0
  97. package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -0
  98. package/build/module/lib/agent-core/harness/execution-env.js +3 -0
  99. package/build/module/lib/agent-core/harness/messages.d.ts +50 -0
  100. package/build/module/lib/agent-core/harness/messages.js +116 -0
  101. package/build/module/lib/agent-core/harness/prompt-templates.d.ts +44 -0
  102. package/build/module/lib/agent-core/harness/prompt-templates.js +204 -0
  103. package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
  104. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +98 -0
  105. package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
  106. package/build/module/lib/agent-core/harness/session/repo/memory.js +46 -0
  107. package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
  108. package/build/module/lib/agent-core/harness/session/repo/shared.js +31 -0
  109. package/build/module/lib/agent-core/harness/session/session.d.ts +31 -0
  110. package/build/module/lib/agent-core/harness/session/session.js +199 -0
  111. package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
  112. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +170 -0
  113. package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
  114. package/build/module/lib/agent-core/harness/session/storage/memory.js +94 -0
  115. package/build/module/lib/agent-core/harness/skills.d.ts +40 -0
  116. package/build/module/lib/agent-core/harness/skills.js +266 -0
  117. package/build/module/lib/agent-core/harness/system-prompt.d.ts +2 -0
  118. package/build/module/lib/agent-core/harness/system-prompt.js +30 -0
  119. package/build/module/lib/agent-core/harness/types.d.ts +524 -0
  120. package/build/module/lib/agent-core/harness/types.js +16 -0
  121. package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
  122. package/build/module/lib/agent-core/harness/utils/shell-output.js +101 -0
  123. package/build/module/lib/agent-core/harness/utils/truncate.d.ts +69 -0
  124. package/build/module/lib/agent-core/harness/utils/truncate.js +208 -0
  125. package/build/module/lib/agent-core/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/index.js +25 -0
  127. package/build/module/lib/agent-core/proxy.d.ts +68 -0
  128. package/build/module/lib/agent-core/proxy.js +294 -0
  129. package/build/module/lib/agent-core/types.d.ts +385 -0
  130. package/build/module/lib/agent-core/types.js +2 -0
  131. package/build/module/lib/tools/PSRetrievalTool.d.ts +127 -0
  132. package/build/module/lib/tools/PSRetrievalTool.js +172 -0
  133. package/build/module/lib/tools/PSSkillTool.js +1 -1
  134. package/build/module/lib/utils/helpers.d.ts +34 -0
  135. package/build/module/lib/utils/helpers.js +280 -1
  136. package/package.json +20 -3
@@ -0,0 +1,772 @@
1
+ import { streamSimple, } from '@earendil-works/pi-ai';
2
+ import { Agent } from '../agent.js';
3
+ import { collectEntriesForBranchSummary, generateBranchSummary, } from './compaction/branch-summarization.js';
4
+ import { compact, DEFAULT_COMPACTION_SETTINGS, prepareCompaction, } from './compaction/compaction.js';
5
+ import { formatPromptTemplateInvocation } from './prompt-templates.js';
6
+ import { formatSkillInvocation } from './skills.js';
7
+ function createUserMessage(text, images) {
8
+ const content = [
9
+ { type: 'text', text },
10
+ ];
11
+ if (images)
12
+ content.push(...images);
13
+ return { role: 'user', content, timestamp: Date.now() };
14
+ }
15
+ function cloneStreamOptions(streamOptions) {
16
+ return {
17
+ ...streamOptions,
18
+ headers: streamOptions?.headers ? { ...streamOptions.headers } : undefined,
19
+ metadata: streamOptions?.metadata
20
+ ? { ...streamOptions.metadata }
21
+ : undefined,
22
+ };
23
+ }
24
+ function mergeHeaders(...headers) {
25
+ const merged = {};
26
+ let hasHeaders = false;
27
+ for (const entry of headers) {
28
+ if (!entry)
29
+ continue;
30
+ Object.assign(merged, entry);
31
+ hasHeaders = true;
32
+ }
33
+ return hasHeaders ? merged : undefined;
34
+ }
35
+ function hasOwn(object, key) {
36
+ return Object.hasOwn(object, key);
37
+ }
38
+ function applyStreamOptionsPatch(base, patch) {
39
+ const result = cloneStreamOptions(base);
40
+ if (!patch)
41
+ return result;
42
+ if (hasOwn(patch, 'transport'))
43
+ result.transport = patch.transport;
44
+ if (hasOwn(patch, 'timeoutMs'))
45
+ result.timeoutMs = patch.timeoutMs;
46
+ if (hasOwn(patch, 'maxRetries'))
47
+ result.maxRetries = patch.maxRetries;
48
+ if (hasOwn(patch, 'maxRetryDelayMs'))
49
+ result.maxRetryDelayMs = patch.maxRetryDelayMs;
50
+ if (hasOwn(patch, 'cacheRetention'))
51
+ result.cacheRetention = patch.cacheRetention;
52
+ if (hasOwn(patch, 'headers')) {
53
+ if (patch.headers === undefined) {
54
+ result.headers = undefined;
55
+ }
56
+ else {
57
+ const headers = { ...(result.headers ?? {}) };
58
+ for (const [key, value] of Object.entries(patch.headers)) {
59
+ if (value === undefined)
60
+ delete headers[key];
61
+ else
62
+ headers[key] = value;
63
+ }
64
+ result.headers = Object.keys(headers).length > 0 ? headers : undefined;
65
+ }
66
+ }
67
+ if (hasOwn(patch, 'metadata')) {
68
+ if (patch.metadata === undefined) {
69
+ result.metadata = undefined;
70
+ }
71
+ else {
72
+ const metadata = { ...(result.metadata ?? {}) };
73
+ for (const [key, value] of Object.entries(patch.metadata)) {
74
+ if (value === undefined)
75
+ delete metadata[key];
76
+ else
77
+ metadata[key] = value;
78
+ }
79
+ result.metadata = Object.keys(metadata).length > 0 ? metadata : undefined;
80
+ }
81
+ }
82
+ return result;
83
+ }
84
+ export class AgentHarness {
85
+ agent;
86
+ env;
87
+ session;
88
+ model;
89
+ thinkingLevel;
90
+ activeToolNames;
91
+ nextTurnQueue = [];
92
+ phase = 'idle';
93
+ steerQueue = [];
94
+ followUpQueue = [];
95
+ pendingSessionWrites = [];
96
+ resources;
97
+ streamOptions;
98
+ appliedStreamOptions = {};
99
+ appliedSessionId;
100
+ systemPrompt;
101
+ getApiKeyAndHeaders;
102
+ tools = new Map();
103
+ listeners = new Set();
104
+ hooks = new Map();
105
+ constructor(options) {
106
+ this.agent = new Agent({
107
+ initialState: {
108
+ model: options.model,
109
+ thinkingLevel: options.thinkingLevel,
110
+ tools: options.tools ?? [],
111
+ },
112
+ streamFn: async (model, context, streamOptions) => {
113
+ const auth = await this.getApiKeyAndHeaders?.(model);
114
+ const snapshotOptions = {
115
+ ...this.appliedStreamOptions,
116
+ headers: mergeHeaders(this.appliedStreamOptions.headers, auth?.headers),
117
+ };
118
+ const requestOptions = await this.emitBeforeProviderRequest(model, this.appliedSessionId ?? '', snapshotOptions);
119
+ return streamSimple(model, context, {
120
+ cacheRetention: requestOptions.cacheRetention,
121
+ headers: requestOptions.headers,
122
+ maxRetries: requestOptions.maxRetries,
123
+ maxRetryDelayMs: requestOptions.maxRetryDelayMs,
124
+ metadata: requestOptions.metadata,
125
+ onPayload: async (payload) => await this.emitBeforeProviderPayload(model, payload),
126
+ onResponse: async (response) => {
127
+ const headers = { ...response.headers };
128
+ await this.emitOwn({
129
+ type: 'after_provider_response',
130
+ status: response.status,
131
+ headers,
132
+ }, this.agent.signal);
133
+ },
134
+ reasoning: streamOptions?.reasoning,
135
+ signal: streamOptions?.signal,
136
+ sessionId: this.appliedSessionId,
137
+ timeoutMs: requestOptions.timeoutMs,
138
+ transport: requestOptions.transport,
139
+ apiKey: auth?.apiKey,
140
+ });
141
+ },
142
+ steeringMode: options.steeringMode,
143
+ followUpMode: options.followUpMode,
144
+ });
145
+ this.env = options.env;
146
+ this.session = options.session;
147
+ this.resources = options.resources ?? {};
148
+ this.streamOptions = cloneStreamOptions(options.streamOptions);
149
+ this.systemPrompt = options.systemPrompt;
150
+ this.getApiKeyAndHeaders = options.getApiKeyAndHeaders;
151
+ for (const tool of options.tools ?? []) {
152
+ this.tools.set(tool.name, tool);
153
+ }
154
+ this.model = options.model;
155
+ this.thinkingLevel =
156
+ options.thinkingLevel ?? this.agent.state.thinkingLevel;
157
+ this.activeToolNames =
158
+ options.activeToolNames ?? (options.tools ?? []).map((tool) => tool.name);
159
+ this.agent.state.model = this.model;
160
+ this.agent.state.thinkingLevel = this.thinkingLevel;
161
+ this.agent.transformContext = async (messages) => {
162
+ const result = await this.emitHook({
163
+ type: 'context',
164
+ messages: [...messages],
165
+ });
166
+ return result?.messages ?? messages;
167
+ };
168
+ this.agent.beforeToolCall = async ({ toolCall, args }) => {
169
+ const result = await this.emitHook({
170
+ type: 'tool_call',
171
+ toolCallId: toolCall.id,
172
+ toolName: toolCall.name,
173
+ input: args,
174
+ });
175
+ return result
176
+ ? { block: result.block, reason: result.reason }
177
+ : undefined;
178
+ };
179
+ this.agent.afterToolCall = async ({ toolCall, args, result, isError }) => {
180
+ const patch = await this.emitHook({
181
+ type: 'tool_result',
182
+ toolCallId: toolCall.id,
183
+ toolName: toolCall.name,
184
+ input: args,
185
+ content: result.content,
186
+ details: result.details,
187
+ isError,
188
+ });
189
+ return patch
190
+ ? {
191
+ content: patch.content,
192
+ details: patch.details,
193
+ isError: patch.isError,
194
+ terminate: patch.terminate,
195
+ }
196
+ : undefined;
197
+ };
198
+ this.agent.prepareNextTurn = async () => {
199
+ await this.flushPendingSessionWrites();
200
+ const turnState = await this.createTurnState();
201
+ this.applyTurnState(turnState);
202
+ return {
203
+ context: {
204
+ systemPrompt: turnState.systemPrompt,
205
+ messages: turnState.messages.slice(),
206
+ tools: turnState.activeTools.slice(),
207
+ },
208
+ model: turnState.model,
209
+ thinkingLevel: turnState.thinkingLevel,
210
+ };
211
+ };
212
+ this.agent.subscribe(async (event, signal) => {
213
+ await this.handleAgentEvent(event, signal);
214
+ });
215
+ }
216
+ async emitOwn(event, signal) {
217
+ for (const listener of this.listeners) {
218
+ await listener(event, signal);
219
+ }
220
+ }
221
+ async emitAny(event, signal) {
222
+ for (const listener of this.listeners) {
223
+ await listener(event, signal);
224
+ }
225
+ }
226
+ async emitHook(event) {
227
+ const handlers = this.hooks.get(event.type);
228
+ if (!handlers || handlers.size === 0)
229
+ return undefined;
230
+ let lastResult;
231
+ for (const handler of handlers) {
232
+ const result = await handler(event);
233
+ if (result !== undefined) {
234
+ lastResult = result;
235
+ }
236
+ }
237
+ return lastResult;
238
+ }
239
+ async emitBeforeProviderRequest(model, sessionId, streamOptions) {
240
+ const handlers = this.hooks.get('before_provider_request');
241
+ let current = cloneStreamOptions(streamOptions);
242
+ if (!handlers || handlers.size === 0)
243
+ return current;
244
+ for (const handler of handlers) {
245
+ const result = await handler({
246
+ type: 'before_provider_request',
247
+ model,
248
+ sessionId,
249
+ streamOptions: cloneStreamOptions(current),
250
+ });
251
+ if (result?.streamOptions) {
252
+ current = applyStreamOptionsPatch(current, result.streamOptions);
253
+ }
254
+ }
255
+ return current;
256
+ }
257
+ async emitBeforeProviderPayload(model, payload) {
258
+ const handlers = this.hooks.get('before_provider_payload');
259
+ let current = payload;
260
+ if (!handlers || handlers.size === 0)
261
+ return current;
262
+ for (const handler of handlers) {
263
+ const result = await handler({
264
+ type: 'before_provider_payload',
265
+ model,
266
+ payload: current,
267
+ });
268
+ if (result !== undefined) {
269
+ current = result.payload;
270
+ }
271
+ }
272
+ return current;
273
+ }
274
+ async emitQueueUpdate() {
275
+ await this.emitOwn({
276
+ type: 'queue_update',
277
+ steer: [...this.steerQueue],
278
+ followUp: [...this.followUpQueue],
279
+ nextTurn: [...this.nextTurnQueue],
280
+ });
281
+ }
282
+ async createTurnState() {
283
+ const context = await this.session.buildContext();
284
+ const resources = this.getResources();
285
+ const sessionMetadata = await this.session.getMetadata();
286
+ const tools = [...this.tools.values()];
287
+ const activeTools = this.activeToolNames
288
+ .map((name) => this.tools.get(name))
289
+ .filter((tool) => tool !== undefined);
290
+ let systemPrompt = 'You are a helpful assistant.';
291
+ if (typeof this.systemPrompt === 'string') {
292
+ systemPrompt = this.systemPrompt;
293
+ }
294
+ else if (this.systemPrompt) {
295
+ systemPrompt = await this.systemPrompt({
296
+ env: this.env,
297
+ session: this.session,
298
+ model: this.model,
299
+ thinkingLevel: this.thinkingLevel,
300
+ activeTools,
301
+ resources,
302
+ });
303
+ }
304
+ return {
305
+ messages: context.messages,
306
+ resources,
307
+ streamOptions: cloneStreamOptions(this.streamOptions),
308
+ sessionId: sessionMetadata.id,
309
+ systemPrompt,
310
+ model: this.model,
311
+ thinkingLevel: this.thinkingLevel,
312
+ tools,
313
+ activeTools,
314
+ };
315
+ }
316
+ applyTurnState(turnState) {
317
+ this.agent.state.messages = turnState.messages;
318
+ this.appliedStreamOptions = cloneStreamOptions(turnState.streamOptions);
319
+ this.appliedSessionId = turnState.sessionId;
320
+ this.agent.state.systemPrompt = turnState.systemPrompt;
321
+ this.agent.state.model = turnState.model;
322
+ this.agent.state.thinkingLevel = turnState.thinkingLevel;
323
+ this.agent.state.tools = turnState.activeTools;
324
+ }
325
+ validateToolNames(toolNames) {
326
+ const missing = toolNames.filter((name) => !this.tools.has(name));
327
+ if (missing.length > 0)
328
+ throw new Error(`Unknown tool(s): ${missing.join(', ')}`);
329
+ }
330
+ async flushPendingSessionWrites() {
331
+ const writes = this.pendingSessionWrites;
332
+ this.pendingSessionWrites = [];
333
+ for (const write of writes) {
334
+ if (write.type === 'message') {
335
+ await this.session.appendMessage(write.message);
336
+ }
337
+ else if (write.type === 'model_change') {
338
+ await this.session.appendModelChange(write.provider, write.modelId);
339
+ }
340
+ else if (write.type === 'thinking_level_change') {
341
+ await this.session.appendThinkingLevelChange(write.thinkingLevel);
342
+ }
343
+ else if (write.type === 'custom') {
344
+ await this.session.appendCustomEntry(write.customType, write.data);
345
+ }
346
+ else if (write.type === 'custom_message') {
347
+ await this.session.appendCustomMessageEntry(write.customType, write.content, write.display, write.details);
348
+ }
349
+ else if (write.type === 'label') {
350
+ await this.session.appendLabel(write.targetId, write.label);
351
+ }
352
+ else if (write.type === 'session_info') {
353
+ await this.session.appendSessionName(write.name ?? '');
354
+ }
355
+ }
356
+ }
357
+ async handleAgentEvent(event, signal) {
358
+ await this.emitAny(event, signal);
359
+ if (event.type === 'message_start' && event.message.role === 'user') {
360
+ const steerIndex = this.steerQueue.indexOf(event.message);
361
+ if (steerIndex !== -1) {
362
+ this.steerQueue.splice(steerIndex, 1);
363
+ await this.emitQueueUpdate();
364
+ }
365
+ else {
366
+ const followUpIndex = this.followUpQueue.indexOf(event.message);
367
+ if (followUpIndex !== -1) {
368
+ this.followUpQueue.splice(followUpIndex, 1);
369
+ await this.emitQueueUpdate();
370
+ }
371
+ }
372
+ }
373
+ if (event.type === 'message_end') {
374
+ await this.session.appendMessage(event.message);
375
+ }
376
+ if (event.type === 'turn_end') {
377
+ const hadPendingMutations = this.pendingSessionWrites.length > 0;
378
+ await this.flushPendingSessionWrites();
379
+ await this.emitOwn({
380
+ type: 'save_point',
381
+ hadPendingMutations,
382
+ });
383
+ }
384
+ if (event.type === 'agent_end') {
385
+ await this.flushPendingSessionWrites();
386
+ this.phase = 'idle';
387
+ await this.emitOwn({ type: 'settled', nextTurnCount: this.nextTurnQueue.length }, signal);
388
+ }
389
+ }
390
+ async executeTurn(turnState, text, options) {
391
+ this.applyTurnState(turnState);
392
+ const beforeLength = this.agent.state.messages.length;
393
+ let messages = [createUserMessage(text, options?.images)];
394
+ if (this.nextTurnQueue.length > 0) {
395
+ messages = [...this.nextTurnQueue, messages[0]];
396
+ this.nextTurnQueue = [];
397
+ await this.emitQueueUpdate();
398
+ }
399
+ const beforeResult = await this.emitHook({
400
+ type: 'before_agent_start',
401
+ prompt: text,
402
+ images: options?.images,
403
+ systemPrompt: turnState.systemPrompt,
404
+ resources: turnState.resources,
405
+ });
406
+ if (beforeResult?.messages)
407
+ messages = [...beforeResult.messages, ...messages];
408
+ if (beforeResult?.systemPrompt)
409
+ this.agent.state.systemPrompt = beforeResult.systemPrompt;
410
+ try {
411
+ await this.agent.prompt(messages);
412
+ }
413
+ finally {
414
+ await this.flushPendingSessionWrites();
415
+ }
416
+ let response;
417
+ const newMessages = this.agent.state.messages.slice(beforeLength);
418
+ for (let i = newMessages.length - 1; i >= 0; i--) {
419
+ const message = newMessages[i];
420
+ if (message.role === 'assistant') {
421
+ response = message;
422
+ break;
423
+ }
424
+ }
425
+ if (!response)
426
+ throw new Error('AgentHarness prompt completed without an assistant message');
427
+ return response;
428
+ }
429
+ async prompt(text, options) {
430
+ if (this.phase !== 'idle')
431
+ throw new Error('AgentHarness is busy');
432
+ this.phase = 'turn';
433
+ try {
434
+ const turnState = await this.createTurnState();
435
+ return await this.executeTurn(turnState, text, options);
436
+ }
437
+ catch (error) {
438
+ this.phase = 'idle';
439
+ throw error;
440
+ }
441
+ }
442
+ async skill(name, additionalInstructions) {
443
+ if (this.phase !== 'idle')
444
+ throw new Error('AgentHarness is busy');
445
+ this.phase = 'turn';
446
+ try {
447
+ const turnState = await this.createTurnState();
448
+ const skill = (turnState.resources.skills ?? []).find((candidate) => candidate.name === name);
449
+ if (!skill)
450
+ throw new Error(`Unknown skill: ${name}`);
451
+ return await this.executeTurn(turnState, formatSkillInvocation(skill, additionalInstructions));
452
+ }
453
+ catch (error) {
454
+ this.phase = 'idle';
455
+ throw error;
456
+ }
457
+ }
458
+ async promptFromTemplate(name, args = []) {
459
+ if (this.phase !== 'idle')
460
+ throw new Error('AgentHarness is busy');
461
+ this.phase = 'turn';
462
+ try {
463
+ const turnState = await this.createTurnState();
464
+ const template = (turnState.resources.promptTemplates ?? []).find((candidate) => candidate.name === name);
465
+ if (!template)
466
+ throw new Error(`Unknown prompt template: ${name}`);
467
+ return await this.executeTurn(turnState, formatPromptTemplateInvocation(template, args));
468
+ }
469
+ catch (error) {
470
+ this.phase = 'idle';
471
+ throw error;
472
+ }
473
+ }
474
+ steer(text, options) {
475
+ if (this.phase === 'idle')
476
+ throw new Error('Cannot steer while idle');
477
+ const message = createUserMessage(text, options?.images);
478
+ this.steerQueue.push(message);
479
+ this.agent.steer(message);
480
+ void this.emitQueueUpdate();
481
+ }
482
+ followUp(text, options) {
483
+ if (this.phase === 'idle')
484
+ throw new Error('Cannot follow up while idle');
485
+ const message = createUserMessage(text, options?.images);
486
+ this.followUpQueue.push(message);
487
+ this.agent.followUp(message);
488
+ void this.emitQueueUpdate();
489
+ }
490
+ nextTurn(text, options) {
491
+ this.nextTurnQueue.push(createUserMessage(text, options?.images));
492
+ void this.emitQueueUpdate();
493
+ }
494
+ async appendMessage(message) {
495
+ if (this.phase === 'idle') {
496
+ await this.session.appendMessage(message);
497
+ }
498
+ else {
499
+ this.pendingSessionWrites.push({ type: 'message', message });
500
+ }
501
+ }
502
+ async compact(customInstructions) {
503
+ if (this.phase !== 'idle')
504
+ throw new Error('compact() requires idle harness');
505
+ this.phase = 'compaction';
506
+ const model = this.model;
507
+ if (!model)
508
+ throw new Error('No model set for compaction');
509
+ const auth = await this.getApiKeyAndHeaders?.(model);
510
+ if (!auth)
511
+ throw new Error('No auth available for compaction');
512
+ const branchEntries = await this.session.getBranch();
513
+ const preparation = prepareCompaction(branchEntries, DEFAULT_COMPACTION_SETTINGS);
514
+ if (!preparation)
515
+ throw new Error('Nothing to compact');
516
+ const hookResult = await this.emitHook({
517
+ type: 'session_before_compact',
518
+ preparation,
519
+ branchEntries,
520
+ customInstructions,
521
+ signal: new AbortController().signal,
522
+ });
523
+ if (hookResult?.cancel) {
524
+ this.phase = 'idle';
525
+ throw new Error('Compaction cancelled');
526
+ }
527
+ const provided = hookResult?.compaction;
528
+ const result = provided ??
529
+ (await compact(preparation, model, auth.apiKey, auth.headers, customInstructions, undefined, this.thinkingLevel));
530
+ const entryId = await this.session.appendCompaction(result.summary, result.firstKeptEntryId, result.tokensBefore, result.details, provided !== undefined);
531
+ const entry = await this.session.getEntry(entryId);
532
+ if (entry?.type === 'compaction') {
533
+ await this.emitOwn({
534
+ type: 'session_compact',
535
+ compactionEntry: entry,
536
+ fromHook: provided !== undefined,
537
+ });
538
+ }
539
+ this.phase = 'idle';
540
+ return result;
541
+ }
542
+ async navigateTree(targetId, options) {
543
+ if (this.phase !== 'idle')
544
+ throw new Error('navigateTree() requires idle harness');
545
+ this.phase = 'branch_summary';
546
+ const oldLeafId = await this.session.getLeafId();
547
+ if (oldLeafId === targetId) {
548
+ this.phase = 'idle';
549
+ return { cancelled: false };
550
+ }
551
+ const targetEntry = await this.session.getEntry(targetId);
552
+ if (!targetEntry)
553
+ throw new Error(`Entry ${targetId} not found`);
554
+ const { entries, commonAncestorId } = await collectEntriesForBranchSummary(this.session, oldLeafId, targetId);
555
+ const preparation = {
556
+ targetId,
557
+ oldLeafId,
558
+ commonAncestorId,
559
+ entriesToSummarize: entries,
560
+ userWantsSummary: options?.summarize ?? false,
561
+ customInstructions: options?.customInstructions,
562
+ replaceInstructions: options?.replaceInstructions,
563
+ label: options?.label,
564
+ };
565
+ const signal = new AbortController().signal;
566
+ const hookResult = await this.emitHook({
567
+ type: 'session_before_tree',
568
+ preparation,
569
+ signal,
570
+ });
571
+ if (hookResult?.cancel) {
572
+ this.phase = 'idle';
573
+ return { cancelled: true };
574
+ }
575
+ let summaryEntry;
576
+ let summaryText = hookResult?.summary?.summary;
577
+ let summaryDetails = hookResult?.summary?.details;
578
+ if (!summaryText && options?.summarize && entries.length > 0) {
579
+ const model = this.model;
580
+ if (!model)
581
+ throw new Error('No model set for branch summary');
582
+ const auth = await this.getApiKeyAndHeaders?.(model);
583
+ if (!auth)
584
+ throw new Error('No auth available for branch summary');
585
+ const branchSummary = await generateBranchSummary(entries, {
586
+ model,
587
+ apiKey: auth.apiKey,
588
+ headers: auth.headers,
589
+ signal: new AbortController().signal,
590
+ customInstructions: hookResult?.customInstructions ?? options?.customInstructions,
591
+ replaceInstructions: hookResult?.replaceInstructions ?? options?.replaceInstructions,
592
+ });
593
+ if (branchSummary.aborted) {
594
+ this.phase = 'idle';
595
+ return { cancelled: true };
596
+ }
597
+ if (branchSummary.error)
598
+ throw new Error(branchSummary.error);
599
+ summaryText = branchSummary.summary;
600
+ summaryDetails = {
601
+ readFiles: branchSummary.readFiles ?? [],
602
+ modifiedFiles: branchSummary.modifiedFiles ?? [],
603
+ };
604
+ }
605
+ let editorText;
606
+ let newLeafId;
607
+ if (targetEntry.type === 'message' && targetEntry.message.role === 'user') {
608
+ newLeafId = targetEntry.parentId;
609
+ const content = targetEntry.message.content;
610
+ editorText =
611
+ typeof content === 'string'
612
+ ? content
613
+ : content
614
+ .filter((c) => c.type === 'text')
615
+ .map((c) => c.text)
616
+ .join('');
617
+ }
618
+ else if (targetEntry.type === 'custom_message') {
619
+ newLeafId = targetEntry.parentId;
620
+ editorText =
621
+ typeof targetEntry.content === 'string'
622
+ ? targetEntry.content
623
+ : targetEntry.content
624
+ .filter((c) => c.type === 'text')
625
+ .map((c) => c.text)
626
+ .join('');
627
+ }
628
+ else {
629
+ newLeafId = targetId;
630
+ }
631
+ const summaryId = await this.session.moveTo(newLeafId, summaryText
632
+ ? {
633
+ summary: summaryText,
634
+ details: summaryDetails,
635
+ fromHook: hookResult?.summary !== undefined,
636
+ }
637
+ : undefined);
638
+ if (summaryId) {
639
+ summaryEntry = await this.session.getEntry(summaryId);
640
+ }
641
+ await this.emitOwn({
642
+ type: 'session_tree',
643
+ newLeafId: await this.session.getLeafId(),
644
+ oldLeafId,
645
+ summaryEntry,
646
+ fromHook: hookResult?.summary !== undefined,
647
+ });
648
+ this.phase = 'idle';
649
+ return { cancelled: false, editorText, summaryEntry };
650
+ }
651
+ async setModel(model) {
652
+ const previousModel = this.model;
653
+ this.model = model;
654
+ if (this.phase === 'idle') {
655
+ this.agent.state.model = model;
656
+ await this.session.appendModelChange(model.provider, model.id);
657
+ }
658
+ else {
659
+ this.pendingSessionWrites.push({
660
+ type: 'model_change',
661
+ provider: model.provider,
662
+ modelId: model.id,
663
+ });
664
+ }
665
+ await this.emitOwn({
666
+ type: 'model_select',
667
+ model,
668
+ previousModel,
669
+ source: 'set',
670
+ });
671
+ }
672
+ async setThinkingLevel(level) {
673
+ const previousLevel = this.thinkingLevel;
674
+ this.thinkingLevel = level;
675
+ if (this.phase === 'idle') {
676
+ this.agent.state.thinkingLevel = level;
677
+ await this.session.appendThinkingLevelChange(level);
678
+ }
679
+ else {
680
+ this.pendingSessionWrites.push({
681
+ type: 'thinking_level_change',
682
+ thinkingLevel: level,
683
+ });
684
+ }
685
+ await this.emitOwn({ type: 'thinking_level_select', level, previousLevel });
686
+ }
687
+ async setActiveTools(toolNames) {
688
+ this.validateToolNames(toolNames);
689
+ this.activeToolNames = [...toolNames];
690
+ if (this.phase === 'idle') {
691
+ this.agent.state.tools = this.activeToolNames.map((name) => this.tools.get(name));
692
+ }
693
+ }
694
+ get steeringMode() {
695
+ return this.agent.steeringMode;
696
+ }
697
+ set steeringMode(mode) {
698
+ this.agent.steeringMode = mode;
699
+ }
700
+ get followUpMode() {
701
+ return this.agent.followUpMode;
702
+ }
703
+ set followUpMode(mode) {
704
+ this.agent.followUpMode = mode;
705
+ }
706
+ getResources() {
707
+ return {
708
+ skills: this.resources.skills?.slice(),
709
+ promptTemplates: this.resources.promptTemplates?.slice(),
710
+ };
711
+ }
712
+ async setResources(resources) {
713
+ const previousResources = this.getResources();
714
+ this.resources = {
715
+ skills: resources.skills?.slice(),
716
+ promptTemplates: resources.promptTemplates?.slice(),
717
+ };
718
+ await this.emitOwn({
719
+ type: 'resources_update',
720
+ resources: this.getResources(),
721
+ previousResources,
722
+ });
723
+ }
724
+ getStreamOptions() {
725
+ return cloneStreamOptions(this.streamOptions);
726
+ }
727
+ setStreamOptions(streamOptions) {
728
+ this.streamOptions = cloneStreamOptions(streamOptions);
729
+ }
730
+ async setTools(tools, activeToolNames) {
731
+ this.tools = new Map(tools.map((tool) => [tool.name, tool]));
732
+ if (activeToolNames) {
733
+ this.validateToolNames(activeToolNames);
734
+ this.activeToolNames = [...activeToolNames];
735
+ }
736
+ else {
737
+ this.validateToolNames(this.activeToolNames);
738
+ }
739
+ if (this.phase === 'idle') {
740
+ this.agent.state.tools = this.activeToolNames.map((name) => this.tools.get(name));
741
+ }
742
+ }
743
+ async abort() {
744
+ const clearedSteer = [...this.steerQueue];
745
+ const clearedFollowUp = [...this.followUpQueue];
746
+ this.steerQueue = [];
747
+ this.followUpQueue = [];
748
+ this.agent.clearAllQueues();
749
+ await this.emitQueueUpdate();
750
+ this.agent.abort();
751
+ await this.agent.waitForIdle();
752
+ await this.emitOwn({ type: 'abort', clearedSteer, clearedFollowUp });
753
+ return { clearedSteer, clearedFollowUp };
754
+ }
755
+ async waitForIdle() {
756
+ await this.agent.waitForIdle();
757
+ }
758
+ subscribe(listener) {
759
+ this.listeners.add(listener);
760
+ return () => this.listeners.delete(listener);
761
+ }
762
+ on(type, handler) {
763
+ let handlers = this.hooks.get(type);
764
+ if (!handlers) {
765
+ handlers = new Set();
766
+ this.hooks.set(type, handlers);
767
+ }
768
+ handlers.add(handler);
769
+ return () => handlers.delete(handler);
770
+ }
771
+ }
772
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtaGFybmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9oYXJuZXNzL2FnZW50LWhhcm5lc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlMLFlBQVksR0FFYixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBRSxLQUFLLEVBQWtCLE1BQU0sYUFBYSxDQUFDO0FBUXBELE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIscUJBQXFCLEdBQ3RCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUNMLE9BQU8sRUFDUCwyQkFBMkIsRUFDM0IsaUJBQWlCLEdBQ2xCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBbUJwRCxTQUFTLGlCQUFpQixDQUFDLElBQVksRUFBRSxNQUF1QjtJQUM5RCxNQUFNLE9BQU8sR0FBeUQ7UUFDcEUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtLQUN2QixDQUFDO0lBQ0YsSUFBSSxNQUFNO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQ3pCLGFBQXlDO0lBRXpDLE9BQU87UUFDTCxHQUFHLGFBQWE7UUFDaEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDMUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxR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