psadk 1.3.6 → 1.4.1

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