psadk 1.4.7 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +153 -0
  2. package/build/main/index.d.ts +1 -0
  3. package/build/main/lib/PSAI.js +1 -2
  4. package/build/main/lib/PSAgent.d.ts +50 -13
  5. package/build/main/lib/PSAgent.js +179 -502
  6. package/build/main/lib/PSAgentConfig.d.ts +114 -2
  7. package/build/main/lib/PSAgentLogger.js +1 -2
  8. package/build/main/lib/PSAgentTool.d.ts +8 -3
  9. package/build/main/lib/PSAgentTool.js +3 -3
  10. package/build/main/lib/agent-core/package.json +1 -1
  11. package/build/main/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  12. package/build/main/lib/agent-core/src/agent-loop.js +514 -0
  13. package/build/{module/lib/agent-core → main/lib/agent-core/src}/agent.d.ts +2 -2
  14. package/build/main/lib/agent-core/src/agent.js +419 -0
  15. package/build/main/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  16. package/build/main/lib/agent-core/src/harness/agent-harness.js +1028 -0
  17. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  18. package/build/main/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  19. package/build/main/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  20. package/build/main/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  21. package/build/main/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  22. package/build/main/lib/agent-core/src/harness/compaction/utils.js +131 -0
  23. package/build/main/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  24. package/build/main/lib/agent-core/src/harness/env/nodejs.js +494 -0
  25. package/build/main/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  26. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/messages.js +1 -1
  27. package/build/main/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  28. package/build/main/lib/agent-core/src/harness/prompt-templates.js +235 -0
  29. package/build/{module/lib/agent-core/harness/session/repo/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  30. package/build/main/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  31. package/build/{module/lib/agent-core/harness/session/storage/jsonl.d.ts → main/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  32. package/build/main/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  33. package/build/main/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  34. package/build/main/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  35. package/build/main/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  36. package/build/main/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  37. package/build/main/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  38. package/build/main/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  39. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  40. package/build/main/lib/agent-core/src/harness/session/session.js +213 -0
  41. package/build/main/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  42. package/build/main/lib/agent-core/src/harness/session/uuid.js +54 -0
  43. package/build/main/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  44. package/build/main/lib/agent-core/src/harness/skills.js +353 -0
  45. package/build/main/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  46. package/build/main/lib/agent-core/src/harness/system-prompt.js +30 -0
  47. package/build/{module/lib/agent-core → main/lib/agent-core/src}/harness/types.d.ts +160 -70
  48. package/build/main/lib/agent-core/src/harness/types.js +94 -0
  49. package/build/main/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  50. package/build/main/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  51. package/build/main/lib/agent-core/src/harness/utils/truncate.js +294 -0
  52. package/build/main/lib/agent-core/src/index.d.ts +19 -0
  53. package/build/main/lib/agent-core/src/index.js +25 -0
  54. package/build/main/lib/agent-core/src/node.d.ts +2 -0
  55. package/build/main/lib/agent-core/src/node.js +3 -0
  56. package/build/main/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  57. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.d.ts +13 -1
  58. package/build/{module/lib/agent-core → main/lib/agent-core/src}/types.js +1 -1
  59. package/build/main/lib/localAgent.d.ts +35 -0
  60. package/build/main/lib/localAgent.js +329 -0
  61. package/build/main/lib/remoteAgent.d.ts +25 -0
  62. package/build/main/lib/remoteAgent.js +311 -0
  63. package/build/main/lib/tools/BraveWebSearchTool.js +1 -2
  64. package/build/main/lib/tools/PSArtifactTool.js +1 -2
  65. package/build/main/lib/tools/PSClarifyTool.js +1 -2
  66. package/build/main/lib/tools/PSCommandLineTool.js +1 -2
  67. package/build/main/lib/tools/PSMemoryTool.js +1 -2
  68. package/build/main/lib/tools/PSReadFileTool.js +1 -2
  69. package/build/main/lib/tools/PSRetrievalTool.js +1 -2
  70. package/build/main/lib/tools/PSSkillTool.js +1 -2
  71. package/build/main/lib/tools/PSSubAgentTool.js +1 -1
  72. package/build/main/lib/tools/PSWriteFileTool.js +1 -2
  73. package/build/main/lib/tools/TodoTool.js +1 -2
  74. package/build/main/lib/utils/debuglogger.js +1 -2
  75. package/build/main/lib/utils/helpers.js +1 -6
  76. package/build/module/index.d.ts +1 -0
  77. package/build/module/lib/PSAI.js +1 -2
  78. package/build/module/lib/PSAgent.d.ts +50 -13
  79. package/build/module/lib/PSAgent.js +179 -502
  80. package/build/module/lib/PSAgentConfig.d.ts +114 -2
  81. package/build/module/lib/PSAgentLogger.js +1 -2
  82. package/build/module/lib/PSAgentTool.d.ts +8 -3
  83. package/build/module/lib/PSAgentTool.js +3 -3
  84. package/build/module/lib/agent-core/{agent-loop.d.ts → src/agent-loop.d.ts} +1 -1
  85. package/build/module/lib/agent-core/src/agent-loop.js +514 -0
  86. package/build/{main/lib/agent-core → module/lib/agent-core/src}/agent.d.ts +2 -2
  87. package/build/module/lib/agent-core/src/agent.js +419 -0
  88. package/build/module/lib/agent-core/{harness → src/harness}/agent-harness.d.ts +36 -26
  89. package/build/module/lib/agent-core/src/harness/agent-harness.js +1028 -0
  90. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.d.ts +52 -0
  91. package/build/module/lib/agent-core/src/harness/compaction/branch-summarization.js +182 -0
  92. package/build/module/lib/agent-core/src/harness/compaction/compaction.d.ts +94 -0
  93. package/build/module/lib/agent-core/src/harness/compaction/compaction.js +550 -0
  94. package/build/module/lib/agent-core/src/harness/compaction/utils.d.ts +24 -0
  95. package/build/module/lib/agent-core/src/harness/compaction/utils.js +131 -0
  96. package/build/module/lib/agent-core/src/harness/env/nodejs.d.ts +50 -0
  97. package/build/module/lib/agent-core/src/harness/env/nodejs.js +494 -0
  98. package/build/module/lib/agent-core/{harness → src/harness}/messages.d.ts +2 -2
  99. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/messages.js +1 -1
  100. package/build/module/lib/agent-core/{harness → src/harness}/prompt-templates.d.ts +4 -1
  101. package/build/module/lib/agent-core/src/harness/prompt-templates.js +235 -0
  102. package/build/{main/lib/agent-core/harness/session/repo/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-repo.d.ts} +7 -1
  103. package/build/module/lib/agent-core/src/harness/session/jsonl-repo.js +106 -0
  104. package/build/{main/lib/agent-core/harness/session/storage/jsonl.d.ts → module/lib/agent-core/src/harness/session/jsonl-storage.d.ts} +7 -4
  105. package/build/module/lib/agent-core/src/harness/session/jsonl-storage.js +234 -0
  106. package/build/module/lib/agent-core/{harness/session/repo/memory.d.ts → src/harness/session/memory-repo.d.ts} +1 -1
  107. package/build/module/lib/agent-core/src/harness/session/memory-repo.js +45 -0
  108. package/build/module/lib/agent-core/{harness/session/storage/memory.d.ts → src/harness/session/memory-storage.d.ts} +4 -5
  109. package/build/module/lib/agent-core/src/harness/session/memory-storage.js +116 -0
  110. package/build/module/lib/agent-core/{harness/session/repo/shared.d.ts → src/harness/session/repo-utils.d.ts} +3 -2
  111. package/build/module/lib/agent-core/src/harness/session/repo-utils.js +39 -0
  112. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/session/session.d.ts +3 -2
  113. package/build/module/lib/agent-core/src/harness/session/session.js +213 -0
  114. package/build/module/lib/agent-core/src/harness/session/uuid.d.ts +1 -0
  115. package/build/module/lib/agent-core/src/harness/session/uuid.js +54 -0
  116. package/build/module/lib/agent-core/{harness → src/harness}/skills.d.ts +4 -1
  117. package/build/module/lib/agent-core/src/harness/skills.js +353 -0
  118. package/build/module/lib/agent-core/{harness → src/harness}/system-prompt.d.ts +1 -1
  119. package/build/module/lib/agent-core/src/harness/system-prompt.js +30 -0
  120. package/build/{main/lib/agent-core → module/lib/agent-core/src}/harness/types.d.ts +160 -70
  121. package/build/module/lib/agent-core/src/harness/types.js +94 -0
  122. package/build/module/lib/agent-core/{harness → src/harness}/utils/shell-output.d.ts +2 -2
  123. package/build/module/lib/agent-core/src/harness/utils/shell-output.js +134 -0
  124. package/build/module/lib/agent-core/src/harness/utils/truncate.js +294 -0
  125. package/build/module/lib/agent-core/src/index.d.ts +19 -0
  126. package/build/module/lib/agent-core/src/index.js +25 -0
  127. package/build/module/lib/agent-core/src/node.d.ts +2 -0
  128. package/build/module/lib/agent-core/src/node.js +3 -0
  129. package/build/module/lib/agent-core/{proxy.js → src/proxy.js} +3 -2
  130. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.d.ts +13 -1
  131. package/build/{main/lib/agent-core → module/lib/agent-core/src}/types.js +1 -1
  132. package/build/module/lib/localAgent.d.ts +35 -0
  133. package/build/module/lib/localAgent.js +329 -0
  134. package/build/module/lib/remoteAgent.d.ts +25 -0
  135. package/build/module/lib/remoteAgent.js +311 -0
  136. package/build/module/lib/tools/BraveWebSearchTool.js +1 -2
  137. package/build/module/lib/tools/PSArtifactTool.js +1 -2
  138. package/build/module/lib/tools/PSClarifyTool.js +1 -2
  139. package/build/module/lib/tools/PSCommandLineTool.js +1 -2
  140. package/build/module/lib/tools/PSMemoryTool.js +1 -2
  141. package/build/module/lib/tools/PSReadFileTool.js +1 -2
  142. package/build/module/lib/tools/PSRetrievalTool.js +1 -2
  143. package/build/module/lib/tools/PSSkillTool.js +1 -2
  144. package/build/module/lib/tools/PSSubAgentTool.js +1 -1
  145. package/build/module/lib/tools/PSWriteFileTool.js +1 -2
  146. package/build/module/lib/tools/TodoTool.js +1 -2
  147. package/build/module/lib/utils/debuglogger.js +1 -2
  148. package/build/module/lib/utils/helpers.js +1 -6
  149. package/package.json +3 -2
  150. package/build/main/lib/agent-core/agent-loop.js +0 -483
  151. package/build/main/lib/agent-core/agent.js +0 -419
  152. package/build/main/lib/agent-core/harness/agent-harness.js +0 -772
  153. package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  154. package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  155. package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  156. package/build/main/lib/agent-core/harness/compaction/compaction.js +0 -637
  157. package/build/main/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  158. package/build/main/lib/agent-core/harness/compaction/utils.js +0 -153
  159. package/build/main/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  160. package/build/main/lib/agent-core/harness/env/nodejs.js +0 -353
  161. package/build/main/lib/agent-core/harness/execution-env.d.ts +0 -3
  162. package/build/main/lib/agent-core/harness/execution-env.js +0 -3
  163. package/build/main/lib/agent-core/harness/prompt-templates.js +0 -204
  164. package/build/main/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  165. package/build/main/lib/agent-core/harness/session/repo/memory.js +0 -46
  166. package/build/main/lib/agent-core/harness/session/repo/shared.js +0 -31
  167. package/build/main/lib/agent-core/harness/session/session.js +0 -199
  168. package/build/main/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  169. package/build/main/lib/agent-core/harness/session/storage/memory.js +0 -94
  170. package/build/main/lib/agent-core/harness/skills.js +0 -266
  171. package/build/main/lib/agent-core/harness/system-prompt.js +0 -30
  172. package/build/main/lib/agent-core/harness/types.js +0 -16
  173. package/build/main/lib/agent-core/harness/utils/shell-output.js +0 -101
  174. package/build/main/lib/agent-core/harness/utils/truncate.js +0 -208
  175. package/build/main/lib/agent-core/index.d.ts +0 -19
  176. package/build/main/lib/agent-core/index.js +0 -25
  177. package/build/module/lib/agent-core/agent-loop.js +0 -483
  178. package/build/module/lib/agent-core/agent.js +0 -419
  179. package/build/module/lib/agent-core/harness/agent-harness.js +0 -772
  180. package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +0 -87
  181. package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +0 -246
  182. package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +0 -121
  183. package/build/module/lib/agent-core/harness/compaction/compaction.js +0 -637
  184. package/build/module/lib/agent-core/harness/compaction/utils.d.ts +0 -37
  185. package/build/module/lib/agent-core/harness/compaction/utils.js +0 -153
  186. package/build/module/lib/agent-core/harness/env/nodejs.d.ts +0 -43
  187. package/build/module/lib/agent-core/harness/env/nodejs.js +0 -353
  188. package/build/module/lib/agent-core/harness/execution-env.d.ts +0 -3
  189. package/build/module/lib/agent-core/harness/execution-env.js +0 -3
  190. package/build/module/lib/agent-core/harness/prompt-templates.js +0 -204
  191. package/build/module/lib/agent-core/harness/session/repo/jsonl.js +0 -98
  192. package/build/module/lib/agent-core/harness/session/repo/memory.js +0 -46
  193. package/build/module/lib/agent-core/harness/session/repo/shared.js +0 -31
  194. package/build/module/lib/agent-core/harness/session/session.js +0 -199
  195. package/build/module/lib/agent-core/harness/session/storage/jsonl.js +0 -170
  196. package/build/module/lib/agent-core/harness/session/storage/memory.js +0 -94
  197. package/build/module/lib/agent-core/harness/skills.js +0 -266
  198. package/build/module/lib/agent-core/harness/system-prompt.js +0 -30
  199. package/build/module/lib/agent-core/harness/types.js +0 -16
  200. package/build/module/lib/agent-core/harness/utils/shell-output.js +0 -101
  201. package/build/module/lib/agent-core/harness/utils/truncate.js +0 -208
  202. package/build/module/lib/agent-core/index.d.ts +0 -19
  203. package/build/module/lib/agent-core/index.js +0 -25
  204. /package/build/main/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  205. /package/build/main/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
  206. /package/build/module/lib/agent-core/{harness → src/harness}/utils/truncate.d.ts +0 -0
  207. /package/build/module/lib/agent-core/{proxy.d.ts → src/proxy.d.ts} +0 -0
@@ -0,0 +1,1028 @@
1
+ import { streamSimple, } from '@earendil-works/pi-ai';
2
+ import { runAgentLoop } from "../agent-loop.js";
3
+ import { collectEntriesForBranchSummary, generateBranchSummary, } from "./compaction/branch-summarization.js";
4
+ import { compact, DEFAULT_COMPACTION_SETTINGS, prepareCompaction, } from "./compaction/compaction.js";
5
+ import { convertToLlm } from "./messages.js";
6
+ import { formatPromptTemplateInvocation } from "./prompt-templates.js";
7
+ import { formatSkillInvocation } from "./skills.js";
8
+ import { AgentHarnessError, BranchSummaryError, CompactionError, SessionError, toError, } from "./types.js";
9
+ function createUserMessage(text, images) {
10
+ const content = [
11
+ { type: 'text', text },
12
+ ];
13
+ if (images)
14
+ content.push(...images);
15
+ return { role: 'user', content, timestamp: Date.now() };
16
+ }
17
+ function createFailureMessage(model, error, aborted) {
18
+ return {
19
+ role: 'assistant',
20
+ content: [{ type: 'text', text: '' }],
21
+ api: model.api,
22
+ provider: model.provider,
23
+ model: model.id,
24
+ stopReason: aborted ? 'aborted' : 'error',
25
+ errorMessage: error instanceof Error ? error.message : String(error),
26
+ timestamp: Date.now(),
27
+ usage: {
28
+ input: 0,
29
+ output: 0,
30
+ cacheRead: 0,
31
+ cacheWrite: 0,
32
+ totalTokens: 0,
33
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
34
+ },
35
+ };
36
+ }
37
+ function cloneStreamOptions(streamOptions) {
38
+ return {
39
+ ...streamOptions,
40
+ headers: streamOptions?.headers ? { ...streamOptions.headers } : undefined,
41
+ metadata: streamOptions?.metadata
42
+ ? { ...streamOptions.metadata }
43
+ : undefined,
44
+ };
45
+ }
46
+ function mergeHeaders(...headers) {
47
+ const merged = {};
48
+ let hasHeaders = false;
49
+ for (const entry of headers) {
50
+ if (!entry)
51
+ continue;
52
+ Object.assign(merged, entry);
53
+ hasHeaders = true;
54
+ }
55
+ return hasHeaders ? merged : undefined;
56
+ }
57
+ function findDuplicateNames(names) {
58
+ const seen = new Set();
59
+ const duplicates = new Set();
60
+ for (const name of names) {
61
+ if (seen.has(name))
62
+ duplicates.add(name);
63
+ seen.add(name);
64
+ }
65
+ return [...duplicates];
66
+ }
67
+ function applyStreamOptionsPatch(base, patch) {
68
+ const result = cloneStreamOptions(base);
69
+ if (!patch)
70
+ return result;
71
+ if (Object.hasOwn(patch, 'transport'))
72
+ result.transport = patch.transport;
73
+ if (Object.hasOwn(patch, 'timeoutMs'))
74
+ result.timeoutMs = patch.timeoutMs;
75
+ if (Object.hasOwn(patch, 'maxRetries'))
76
+ result.maxRetries = patch.maxRetries;
77
+ if (Object.hasOwn(patch, 'maxRetryDelayMs'))
78
+ result.maxRetryDelayMs = patch.maxRetryDelayMs;
79
+ if (Object.hasOwn(patch, 'cacheRetention'))
80
+ result.cacheRetention = patch.cacheRetention;
81
+ if (Object.hasOwn(patch, 'headers')) {
82
+ if (patch.headers === undefined) {
83
+ result.headers = undefined;
84
+ }
85
+ else {
86
+ const headers = { ...(result.headers ?? {}) };
87
+ for (const [key, value] of Object.entries(patch.headers)) {
88
+ if (value === undefined)
89
+ delete headers[key];
90
+ else
91
+ headers[key] = value;
92
+ }
93
+ result.headers = Object.keys(headers).length > 0 ? headers : undefined;
94
+ }
95
+ }
96
+ if (Object.hasOwn(patch, 'metadata')) {
97
+ if (patch.metadata === undefined) {
98
+ result.metadata = undefined;
99
+ }
100
+ else {
101
+ const metadata = { ...(result.metadata ?? {}) };
102
+ for (const [key, value] of Object.entries(patch.metadata)) {
103
+ if (value === undefined)
104
+ delete metadata[key];
105
+ else
106
+ metadata[key] = value;
107
+ }
108
+ result.metadata = Object.keys(metadata).length > 0 ? metadata : undefined;
109
+ }
110
+ }
111
+ return result;
112
+ }
113
+ const SUBSCRIBER_EVENT_TYPE = '*';
114
+ function normalizeHarnessError(error, fallbackCode) {
115
+ if (error instanceof AgentHarnessError)
116
+ return error;
117
+ const cause = toError(error);
118
+ if (cause instanceof SessionError)
119
+ return new AgentHarnessError('session', cause.message, cause);
120
+ if (cause instanceof CompactionError)
121
+ return new AgentHarnessError('compaction', cause.message, cause);
122
+ if (cause instanceof BranchSummaryError)
123
+ return new AgentHarnessError('branch_summary', cause.message, cause);
124
+ return new AgentHarnessError(fallbackCode, cause.message, cause);
125
+ }
126
+ function normalizeHookError(error) {
127
+ return normalizeHarnessError(error, 'hook');
128
+ }
129
+ export class AgentHarness {
130
+ env;
131
+ session;
132
+ phase = 'idle';
133
+ runAbortController;
134
+ runPromise;
135
+ pendingSessionWrites = [];
136
+ model;
137
+ thinkingLevel;
138
+ systemPrompt;
139
+ streamOptions;
140
+ getApiKeyAndHeaders;
141
+ resources;
142
+ tools = new Map();
143
+ activeToolNames;
144
+ steerQueue = [];
145
+ steeringQueueMode;
146
+ followUpQueue = [];
147
+ followUpQueueMode;
148
+ nextTurnQueue = [];
149
+ handlers = new Map();
150
+ constructor(options) {
151
+ this.env = options.env;
152
+ this.session = options.session;
153
+ this.resources = options.resources ?? {};
154
+ this.streamOptions = cloneStreamOptions(options.streamOptions);
155
+ this.systemPrompt = options.systemPrompt;
156
+ this.getApiKeyAndHeaders = options.getApiKeyAndHeaders;
157
+ this.validateUniqueNames((options.tools ?? []).map((tool) => tool.name), 'Duplicate tool name(s)');
158
+ for (const tool of options.tools ?? []) {
159
+ this.tools.set(tool.name, tool);
160
+ }
161
+ this.model = options.model;
162
+ this.thinkingLevel = options.thinkingLevel ?? 'off';
163
+ this.activeToolNames = options.activeToolNames
164
+ ? [...options.activeToolNames]
165
+ : (options.tools ?? []).map((tool) => tool.name);
166
+ this.validateUniqueNames(this.activeToolNames, 'Duplicate active tool name(s)');
167
+ this.validateToolNames(this.activeToolNames);
168
+ this.steeringQueueMode = options.steeringMode ?? 'one-at-a-time';
169
+ this.followUpQueueMode = options.followUpMode ?? 'one-at-a-time';
170
+ }
171
+ getHandlers(type) {
172
+ return this.handlers.get(type);
173
+ }
174
+ async emitOwn(event, signal) {
175
+ for (const listener of this.getHandlers(SUBSCRIBER_EVENT_TYPE) ?? []) {
176
+ try {
177
+ await listener(event, signal);
178
+ }
179
+ catch (error) {
180
+ throw normalizeHookError(error);
181
+ }
182
+ }
183
+ }
184
+ async emitAny(event, signal) {
185
+ for (const listener of this.getHandlers(SUBSCRIBER_EVENT_TYPE) ?? []) {
186
+ try {
187
+ await listener(event, signal);
188
+ }
189
+ catch (error) {
190
+ throw normalizeHookError(error);
191
+ }
192
+ }
193
+ }
194
+ async emitHook(event) {
195
+ const handlers = this.getHandlers(event.type);
196
+ if (!handlers || handlers.size === 0)
197
+ return undefined;
198
+ let lastResult;
199
+ for (const handler of handlers) {
200
+ try {
201
+ const result = await handler(event);
202
+ if (result !== undefined) {
203
+ lastResult = result;
204
+ }
205
+ }
206
+ catch (error) {
207
+ throw normalizeHookError(error);
208
+ }
209
+ }
210
+ return lastResult;
211
+ }
212
+ async emitBeforeProviderRequest(model, sessionId, streamOptions) {
213
+ const handlers = this.getHandlers('before_provider_request');
214
+ let current = cloneStreamOptions(streamOptions);
215
+ if (!handlers || handlers.size === 0)
216
+ return current;
217
+ for (const handler of handlers) {
218
+ try {
219
+ const result = await handler({
220
+ type: 'before_provider_request',
221
+ model,
222
+ sessionId,
223
+ streamOptions: cloneStreamOptions(current),
224
+ });
225
+ if (result?.streamOptions) {
226
+ current = applyStreamOptionsPatch(current, result.streamOptions);
227
+ }
228
+ }
229
+ catch (error) {
230
+ throw normalizeHookError(error);
231
+ }
232
+ }
233
+ return current;
234
+ }
235
+ async emitBeforeProviderPayload(model, payload) {
236
+ const handlers = this.getHandlers('before_provider_payload');
237
+ let current = payload;
238
+ if (!handlers || handlers.size === 0)
239
+ return current;
240
+ for (const handler of handlers) {
241
+ try {
242
+ const result = await handler({
243
+ type: 'before_provider_payload',
244
+ model,
245
+ payload: current,
246
+ });
247
+ if (result !== undefined) {
248
+ current = result.payload;
249
+ }
250
+ }
251
+ catch (error) {
252
+ throw normalizeHookError(error);
253
+ }
254
+ }
255
+ return current;
256
+ }
257
+ async emitQueueUpdate() {
258
+ await this.emitOwn({
259
+ type: 'queue_update',
260
+ steer: [...this.steerQueue],
261
+ followUp: [...this.followUpQueue],
262
+ nextTurn: [...this.nextTurnQueue],
263
+ });
264
+ }
265
+ startRunPromise() {
266
+ let finish = () => { };
267
+ this.runPromise = new Promise((resolve) => {
268
+ finish = resolve;
269
+ });
270
+ return () => {
271
+ this.runPromise = undefined;
272
+ finish();
273
+ };
274
+ }
275
+ async createTurnState() {
276
+ const context = await this.session.buildContext();
277
+ const resources = this.getResources();
278
+ const sessionMetadata = await this.session.getMetadata();
279
+ const tools = [...this.tools.values()];
280
+ const activeTools = this.activeToolNames
281
+ .map((name) => this.tools.get(name))
282
+ .filter((tool) => tool !== undefined);
283
+ let systemPrompt = 'You are a helpful assistant.';
284
+ if (typeof this.systemPrompt === 'string') {
285
+ systemPrompt = this.systemPrompt;
286
+ }
287
+ else if (this.systemPrompt) {
288
+ systemPrompt = await this.systemPrompt({
289
+ env: this.env,
290
+ session: this.session,
291
+ model: this.model,
292
+ thinkingLevel: this.thinkingLevel,
293
+ activeTools,
294
+ resources,
295
+ });
296
+ }
297
+ return {
298
+ messages: context.messages,
299
+ resources,
300
+ streamOptions: cloneStreamOptions(this.streamOptions),
301
+ sessionId: sessionMetadata.id,
302
+ systemPrompt,
303
+ model: this.model,
304
+ thinkingLevel: this.thinkingLevel,
305
+ tools,
306
+ activeTools,
307
+ };
308
+ }
309
+ createContext(turnState, systemPrompt) {
310
+ return {
311
+ systemPrompt: systemPrompt ?? turnState.systemPrompt,
312
+ messages: turnState.messages.slice(),
313
+ tools: turnState.activeTools.slice(),
314
+ };
315
+ }
316
+ createStreamFn(getTurnState) {
317
+ return async (model, context, streamOptions) => {
318
+ const turnState = getTurnState();
319
+ const auth = await this.getApiKeyAndHeaders?.(model);
320
+ const snapshotOptions = {
321
+ ...turnState.streamOptions,
322
+ headers: mergeHeaders(turnState.streamOptions.headers, auth?.headers),
323
+ };
324
+ const requestOptions = await this.emitBeforeProviderRequest(model, turnState.sessionId, snapshotOptions);
325
+ return streamSimple(model, context, {
326
+ cacheRetention: requestOptions.cacheRetention,
327
+ headers: requestOptions.headers,
328
+ maxRetries: requestOptions.maxRetries,
329
+ maxRetryDelayMs: requestOptions.maxRetryDelayMs,
330
+ metadata: requestOptions.metadata,
331
+ onPayload: async (payload) => await this.emitBeforeProviderPayload(model, payload),
332
+ onResponse: async (response) => {
333
+ const headers = { ...response.headers };
334
+ await this.emitOwn({
335
+ type: 'after_provider_response',
336
+ status: response.status,
337
+ headers,
338
+ }, streamOptions?.signal);
339
+ },
340
+ reasoning: streamOptions?.reasoning,
341
+ signal: streamOptions?.signal,
342
+ sessionId: turnState.sessionId,
343
+ timeoutMs: requestOptions.timeoutMs,
344
+ transport: requestOptions.transport,
345
+ apiKey: auth?.apiKey,
346
+ });
347
+ };
348
+ }
349
+ async drainQueuedMessages(queue, mode) {
350
+ const messages = mode === 'all' ? queue.splice(0) : queue.splice(0, 1);
351
+ if (messages.length === 0)
352
+ return messages;
353
+ try {
354
+ await this.emitQueueUpdate();
355
+ return messages;
356
+ }
357
+ catch (error) {
358
+ queue.unshift(...messages);
359
+ throw normalizeHookError(error);
360
+ }
361
+ }
362
+ createLoopConfig(getTurnState, setTurnState) {
363
+ const turnState = getTurnState();
364
+ return {
365
+ model: turnState.model,
366
+ reasoning: turnState.thinkingLevel === 'off' ? undefined : turnState.thinkingLevel,
367
+ convertToLlm,
368
+ transformContext: async (messages) => {
369
+ const result = await this.emitHook({
370
+ type: 'context',
371
+ messages: [...messages],
372
+ });
373
+ return result?.messages ?? messages;
374
+ },
375
+ beforeToolCall: async ({ toolCall, args }) => {
376
+ const result = await this.emitHook({
377
+ type: 'tool_call',
378
+ toolCallId: toolCall.id,
379
+ toolName: toolCall.name,
380
+ input: args,
381
+ });
382
+ return result
383
+ ? { block: result.block, reason: result.reason }
384
+ : undefined;
385
+ },
386
+ afterToolCall: async ({ toolCall, args, result, isError }) => {
387
+ const patch = await this.emitHook({
388
+ type: 'tool_result',
389
+ toolCallId: toolCall.id,
390
+ toolName: toolCall.name,
391
+ input: args,
392
+ content: result.content,
393
+ details: result.details,
394
+ isError,
395
+ });
396
+ return patch
397
+ ? {
398
+ content: patch.content,
399
+ details: patch.details,
400
+ isError: patch.isError,
401
+ terminate: patch.terminate,
402
+ }
403
+ : undefined;
404
+ },
405
+ prepareNextTurn: async () => {
406
+ await this.flushPendingSessionWrites();
407
+ const nextTurnState = await this.createTurnState();
408
+ setTurnState(nextTurnState);
409
+ return {
410
+ context: this.createContext(nextTurnState),
411
+ model: nextTurnState.model,
412
+ thinkingLevel: nextTurnState.thinkingLevel,
413
+ };
414
+ },
415
+ getSteeringMessages: async () => this.drainQueuedMessages(this.steerQueue, this.steeringQueueMode),
416
+ getFollowUpMessages: async () => this.drainQueuedMessages(this.followUpQueue, this.followUpQueueMode),
417
+ };
418
+ }
419
+ validateUniqueNames(names, message) {
420
+ const duplicates = findDuplicateNames(names);
421
+ if (duplicates.length > 0)
422
+ throw new AgentHarnessError('invalid_argument', `${message}: ${duplicates.join(', ')}`);
423
+ }
424
+ validateToolNames(toolNames, tools = this.tools) {
425
+ this.validateUniqueNames(toolNames, 'Duplicate active tool name(s)');
426
+ const missing = toolNames.filter((name) => !tools.has(name));
427
+ if (missing.length > 0)
428
+ throw new AgentHarnessError('invalid_argument', `Unknown tool(s): ${missing.join(', ')}`);
429
+ }
430
+ async flushPendingSessionWrites() {
431
+ while (this.pendingSessionWrites.length > 0) {
432
+ const write = this.pendingSessionWrites[0];
433
+ if (write.type === 'message') {
434
+ await this.session.appendMessage(write.message);
435
+ }
436
+ else if (write.type === 'model_change') {
437
+ await this.session.appendModelChange(write.provider, write.modelId);
438
+ }
439
+ else if (write.type === 'thinking_level_change') {
440
+ await this.session.appendThinkingLevelChange(write.thinkingLevel);
441
+ }
442
+ else if (write.type === 'active_tools_change') {
443
+ await this.session.appendActiveToolsChange(write.activeToolNames);
444
+ }
445
+ else if (write.type === 'custom') {
446
+ await this.session.appendCustomEntry(write.customType, write.data);
447
+ }
448
+ else if (write.type === 'custom_message') {
449
+ await this.session.appendCustomMessageEntry(write.customType, write.content, write.display, write.details);
450
+ }
451
+ else if (write.type === 'label') {
452
+ await this.session.appendLabel(write.targetId, write.label);
453
+ }
454
+ else if (write.type === 'session_info') {
455
+ await this.session.appendSessionName(write.name ?? '');
456
+ }
457
+ else if (write.type === 'leaf') {
458
+ await this.session.getStorage().setLeafId(write.targetId);
459
+ }
460
+ this.pendingSessionWrites.shift();
461
+ }
462
+ }
463
+ async handleAgentEvent(event, signal) {
464
+ if (event.type === 'message_end') {
465
+ await this.session.appendMessage(event.message);
466
+ await this.emitAny(event, signal);
467
+ return;
468
+ }
469
+ if (event.type === 'turn_end') {
470
+ let eventError;
471
+ try {
472
+ await this.emitAny(event, signal);
473
+ }
474
+ catch (error) {
475
+ eventError = error;
476
+ }
477
+ const hadPendingMutations = this.pendingSessionWrites.length > 0;
478
+ await this.flushPendingSessionWrites();
479
+ if (eventError)
480
+ throw eventError;
481
+ await this.emitOwn({ type: 'save_point', hadPendingMutations });
482
+ return;
483
+ }
484
+ if (event.type === 'agent_end') {
485
+ await this.flushPendingSessionWrites();
486
+ this.phase = 'idle';
487
+ await this.emitAny(event, signal);
488
+ await this.emitOwn({ type: 'settled', nextTurnCount: this.nextTurnQueue.length }, signal);
489
+ return;
490
+ }
491
+ await this.emitAny(event, signal);
492
+ }
493
+ async emitRunFailure(model, error, aborted, signal) {
494
+ const failureMessage = createFailureMessage(model, error, aborted);
495
+ await this.handleAgentEvent({ type: 'message_start', message: failureMessage }, signal);
496
+ await this.handleAgentEvent({ type: 'message_end', message: failureMessage }, signal);
497
+ await this.handleAgentEvent({ type: 'turn_end', message: failureMessage, toolResults: [] }, signal);
498
+ await this.handleAgentEvent({ type: 'agent_end', messages: [failureMessage] }, signal);
499
+ return [failureMessage];
500
+ }
501
+ async executeTurn(turnState, text, options) {
502
+ let activeTurnState = turnState;
503
+ let messages = [createUserMessage(text, options?.images)];
504
+ if (this.nextTurnQueue.length > 0) {
505
+ const queuedMessages = this.nextTurnQueue.splice(0);
506
+ try {
507
+ await this.emitQueueUpdate();
508
+ }
509
+ catch (error) {
510
+ this.nextTurnQueue.unshift(...queuedMessages);
511
+ throw normalizeHookError(error);
512
+ }
513
+ messages = [...queuedMessages, messages[0]];
514
+ }
515
+ const beforeResult = await this.emitHook({
516
+ type: 'before_agent_start',
517
+ prompt: text,
518
+ images: options?.images,
519
+ systemPrompt: turnState.systemPrompt,
520
+ resources: turnState.resources,
521
+ });
522
+ if (beforeResult?.messages)
523
+ messages = [...messages, ...beforeResult.messages];
524
+ const abortController = new AbortController();
525
+ const getTurnState = () => activeTurnState;
526
+ const setTurnState = (nextTurnState) => {
527
+ activeTurnState = nextTurnState;
528
+ };
529
+ this.runAbortController = abortController;
530
+ const runResultPromise = (async () => {
531
+ try {
532
+ return await runAgentLoop(messages, this.createContext(turnState, beforeResult?.systemPrompt), this.createLoopConfig(getTurnState, setTurnState), (event) => this.handleAgentEvent(event, abortController.signal), abortController.signal, this.createStreamFn(getTurnState));
533
+ }
534
+ catch (error) {
535
+ try {
536
+ return await this.emitRunFailure(activeTurnState.model, error, abortController.signal.aborted, abortController.signal);
537
+ }
538
+ catch (failureError) {
539
+ const cause = new AggregateError([toError(error), toError(failureError)], 'Agent run failed and failure reporting failed');
540
+ throw new AgentHarnessError('unknown', cause.message, cause);
541
+ }
542
+ }
543
+ })();
544
+ try {
545
+ const newMessages = await runResultPromise;
546
+ for (let i = newMessages.length - 1; i >= 0; i--) {
547
+ const message = newMessages[i];
548
+ if (message.role === 'assistant') {
549
+ return message;
550
+ }
551
+ }
552
+ throw new AgentHarnessError('invalid_state', 'AgentHarness prompt completed without an assistant message');
553
+ }
554
+ finally {
555
+ try {
556
+ await this.flushPendingSessionWrites();
557
+ }
558
+ finally {
559
+ this.runAbortController = undefined;
560
+ }
561
+ }
562
+ }
563
+ async prompt(text, options) {
564
+ if (this.phase !== 'idle')
565
+ throw new AgentHarnessError('busy', 'AgentHarness is busy');
566
+ this.phase = 'turn';
567
+ const finishRunPromise = this.startRunPromise();
568
+ try {
569
+ const turnState = await this.createTurnState();
570
+ return await this.executeTurn(turnState, text, options);
571
+ }
572
+ catch (error) {
573
+ this.phase = 'idle';
574
+ throw normalizeHarnessError(error, 'unknown');
575
+ }
576
+ finally {
577
+ finishRunPromise();
578
+ }
579
+ }
580
+ async skill(name, additionalInstructions) {
581
+ if (this.phase !== 'idle')
582
+ throw new AgentHarnessError('busy', 'AgentHarness is busy');
583
+ this.phase = 'turn';
584
+ const finishRunPromise = this.startRunPromise();
585
+ try {
586
+ const turnState = await this.createTurnState();
587
+ const skill = (turnState.resources.skills ?? []).find((candidate) => candidate.name === name);
588
+ if (!skill)
589
+ throw new AgentHarnessError('invalid_argument', `Unknown skill: ${name}`);
590
+ return await this.executeTurn(turnState, formatSkillInvocation(skill, additionalInstructions));
591
+ }
592
+ catch (error) {
593
+ this.phase = 'idle';
594
+ throw normalizeHarnessError(error, 'unknown');
595
+ }
596
+ finally {
597
+ finishRunPromise();
598
+ }
599
+ }
600
+ async promptFromTemplate(name, args = []) {
601
+ if (this.phase !== 'idle')
602
+ throw new AgentHarnessError('busy', 'AgentHarness is busy');
603
+ this.phase = 'turn';
604
+ const finishRunPromise = this.startRunPromise();
605
+ try {
606
+ const turnState = await this.createTurnState();
607
+ const template = (turnState.resources.promptTemplates ?? []).find((candidate) => candidate.name === name);
608
+ if (!template)
609
+ throw new AgentHarnessError('invalid_argument', `Unknown prompt template: ${name}`);
610
+ return await this.executeTurn(turnState, formatPromptTemplateInvocation(template, args));
611
+ }
612
+ catch (error) {
613
+ this.phase = 'idle';
614
+ throw normalizeHarnessError(error, 'unknown');
615
+ }
616
+ finally {
617
+ finishRunPromise();
618
+ }
619
+ }
620
+ async steer(text, options) {
621
+ if (this.phase === 'idle')
622
+ throw new AgentHarnessError('invalid_state', 'Cannot steer while idle');
623
+ this.steerQueue.push(createUserMessage(text, options?.images));
624
+ await this.emitQueueUpdate();
625
+ }
626
+ async followUp(text, options) {
627
+ if (this.phase === 'idle')
628
+ throw new AgentHarnessError('invalid_state', 'Cannot follow up while idle');
629
+ this.followUpQueue.push(createUserMessage(text, options?.images));
630
+ await this.emitQueueUpdate();
631
+ }
632
+ async nextTurn(text, options) {
633
+ this.nextTurnQueue.push(createUserMessage(text, options?.images));
634
+ await this.emitQueueUpdate();
635
+ }
636
+ async appendMessage(message) {
637
+ try {
638
+ if (this.phase === 'idle') {
639
+ await this.session.appendMessage(message);
640
+ }
641
+ else {
642
+ this.pendingSessionWrites.push({ type: 'message', message });
643
+ }
644
+ }
645
+ catch (error) {
646
+ throw normalizeHarnessError(error, 'session');
647
+ }
648
+ }
649
+ async compact(customInstructions) {
650
+ if (this.phase !== 'idle')
651
+ throw new AgentHarnessError('busy', 'compact() requires idle harness');
652
+ this.phase = 'compaction';
653
+ try {
654
+ const model = this.model;
655
+ if (!model)
656
+ throw new AgentHarnessError('invalid_state', 'No model set for compaction');
657
+ const auth = await this.getApiKeyAndHeaders?.(model);
658
+ if (!auth)
659
+ throw new AgentHarnessError('auth', 'No auth available for compaction');
660
+ const branchEntries = await this.session.getBranch();
661
+ const preparationResult = prepareCompaction(branchEntries, DEFAULT_COMPACTION_SETTINGS);
662
+ if (!preparationResult.ok)
663
+ throw preparationResult.error;
664
+ const preparation = preparationResult.value;
665
+ if (!preparation)
666
+ throw new AgentHarnessError('compaction', 'Nothing to compact');
667
+ const hookResult = await this.emitHook({
668
+ type: 'session_before_compact',
669
+ preparation,
670
+ branchEntries,
671
+ customInstructions,
672
+ signal: new AbortController().signal,
673
+ });
674
+ if (hookResult?.cancel)
675
+ throw new AgentHarnessError('compaction', 'Compaction cancelled');
676
+ const provided = hookResult?.compaction;
677
+ const compactResult = provided
678
+ ? { ok: true, value: provided }
679
+ : await compact(preparation, model, auth.apiKey, auth.headers, customInstructions, undefined, this.thinkingLevel);
680
+ if (!compactResult.ok)
681
+ throw compactResult.error;
682
+ const result = compactResult.value;
683
+ const entryId = await this.session.appendCompaction(result.summary, result.firstKeptEntryId, result.tokensBefore, result.details, provided !== undefined);
684
+ const entry = await this.session.getEntry(entryId);
685
+ if (entry?.type === 'compaction') {
686
+ await this.emitOwn({
687
+ type: 'session_compact',
688
+ compactionEntry: entry,
689
+ fromHook: provided !== undefined,
690
+ });
691
+ }
692
+ return result;
693
+ }
694
+ catch (error) {
695
+ throw normalizeHarnessError(error, 'compaction');
696
+ }
697
+ finally {
698
+ this.phase = 'idle';
699
+ }
700
+ }
701
+ async navigateTree(targetId, options) {
702
+ if (this.phase !== 'idle')
703
+ throw new AgentHarnessError('busy', 'navigateTree() requires idle harness');
704
+ this.phase = 'branch_summary';
705
+ try {
706
+ const oldLeafId = await this.session.getLeafId();
707
+ if (oldLeafId === targetId)
708
+ return { cancelled: false };
709
+ const targetEntry = await this.session.getEntry(targetId);
710
+ if (!targetEntry)
711
+ throw new AgentHarnessError('invalid_argument', `Entry ${targetId} not found`);
712
+ const { entries, commonAncestorId } = await collectEntriesForBranchSummary(this.session, oldLeafId, targetId);
713
+ const preparation = {
714
+ targetId,
715
+ oldLeafId,
716
+ commonAncestorId,
717
+ entriesToSummarize: entries,
718
+ userWantsSummary: options?.summarize ?? false,
719
+ customInstructions: options?.customInstructions,
720
+ replaceInstructions: options?.replaceInstructions,
721
+ label: options?.label,
722
+ };
723
+ const signal = new AbortController().signal;
724
+ const hookResult = await this.emitHook({
725
+ type: 'session_before_tree',
726
+ preparation,
727
+ signal,
728
+ });
729
+ if (hookResult?.cancel)
730
+ return { cancelled: true };
731
+ let summaryEntry;
732
+ let summaryText = hookResult?.summary?.summary;
733
+ let summaryDetails = hookResult?.summary?.details;
734
+ if (!summaryText && options?.summarize && entries.length > 0) {
735
+ const model = this.model;
736
+ if (!model)
737
+ throw new AgentHarnessError('invalid_state', 'No model set for branch summary');
738
+ const auth = await this.getApiKeyAndHeaders?.(model);
739
+ if (!auth)
740
+ throw new AgentHarnessError('auth', 'No auth available for branch summary');
741
+ const branchSummary = await generateBranchSummary(entries, {
742
+ model,
743
+ apiKey: auth.apiKey,
744
+ headers: auth.headers,
745
+ signal: new AbortController().signal,
746
+ customInstructions: hookResult?.customInstructions ?? options?.customInstructions,
747
+ replaceInstructions: hookResult?.replaceInstructions ?? options?.replaceInstructions,
748
+ });
749
+ if (!branchSummary.ok) {
750
+ if (branchSummary.error.code === 'aborted')
751
+ return { cancelled: true };
752
+ throw new AgentHarnessError('branch_summary', branchSummary.error.message, branchSummary.error);
753
+ }
754
+ summaryText = branchSummary.value.summary;
755
+ summaryDetails = {
756
+ readFiles: branchSummary.value.readFiles,
757
+ modifiedFiles: branchSummary.value.modifiedFiles,
758
+ };
759
+ }
760
+ let editorText;
761
+ let newLeafId;
762
+ if (targetEntry.type === 'message' &&
763
+ targetEntry.message.role === 'user') {
764
+ newLeafId = targetEntry.parentId;
765
+ const content = targetEntry.message.content;
766
+ editorText =
767
+ typeof content === 'string'
768
+ ? content
769
+ : content
770
+ .filter((c) => c.type === 'text')
771
+ .map((c) => c.text)
772
+ .join('');
773
+ }
774
+ else if (targetEntry.type === 'custom_message') {
775
+ newLeafId = targetEntry.parentId;
776
+ editorText =
777
+ typeof targetEntry.content === 'string'
778
+ ? targetEntry.content
779
+ : targetEntry.content
780
+ .filter((c) => c.type === 'text')
781
+ .map((c) => c.text)
782
+ .join('');
783
+ }
784
+ else {
785
+ newLeafId = targetId;
786
+ }
787
+ const summaryId = await this.session.moveTo(newLeafId, summaryText
788
+ ? {
789
+ summary: summaryText,
790
+ details: summaryDetails,
791
+ fromHook: hookResult?.summary !== undefined,
792
+ }
793
+ : undefined);
794
+ if (summaryId) {
795
+ const entry = await this.session.getEntry(summaryId);
796
+ if (entry?.type === 'branch_summary')
797
+ summaryEntry = entry;
798
+ }
799
+ await this.emitOwn({
800
+ type: 'session_tree',
801
+ newLeafId: await this.session.getLeafId(),
802
+ oldLeafId,
803
+ summaryEntry,
804
+ fromHook: hookResult?.summary !== undefined,
805
+ });
806
+ return { cancelled: false, editorText, summaryEntry };
807
+ }
808
+ catch (error) {
809
+ throw normalizeHarnessError(error, 'branch_summary');
810
+ }
811
+ finally {
812
+ this.phase = 'idle';
813
+ }
814
+ }
815
+ getModel() {
816
+ return this.model;
817
+ }
818
+ async setModel(model) {
819
+ try {
820
+ const previousModel = this.model;
821
+ if (this.phase === 'idle') {
822
+ await this.session.appendModelChange(model.provider, model.id);
823
+ }
824
+ else {
825
+ this.pendingSessionWrites.push({
826
+ type: 'model_change',
827
+ provider: model.provider,
828
+ modelId: model.id,
829
+ });
830
+ }
831
+ this.model = model;
832
+ await this.emitOwn({
833
+ type: 'model_update',
834
+ model,
835
+ previousModel,
836
+ source: 'set',
837
+ });
838
+ }
839
+ catch (error) {
840
+ throw normalizeHarnessError(error, 'session');
841
+ }
842
+ }
843
+ getThinkingLevel() {
844
+ return this.thinkingLevel;
845
+ }
846
+ async setThinkingLevel(level) {
847
+ try {
848
+ const previousLevel = this.thinkingLevel;
849
+ if (this.phase === 'idle') {
850
+ await this.session.appendThinkingLevelChange(level);
851
+ }
852
+ else {
853
+ this.pendingSessionWrites.push({
854
+ type: 'thinking_level_change',
855
+ thinkingLevel: level,
856
+ });
857
+ }
858
+ this.thinkingLevel = level;
859
+ await this.emitOwn({
860
+ type: 'thinking_level_update',
861
+ level,
862
+ previousLevel,
863
+ });
864
+ }
865
+ catch (error) {
866
+ throw normalizeHarnessError(error, 'session');
867
+ }
868
+ }
869
+ getTools() {
870
+ return [...this.tools.values()];
871
+ }
872
+ async setTools(tools, activeToolNames) {
873
+ try {
874
+ this.validateUniqueNames(tools.map((tool) => tool.name), 'Duplicate tool name(s)');
875
+ const nextTools = new Map(tools.map((tool) => [tool.name, tool]));
876
+ const nextActiveToolNames = activeToolNames
877
+ ? [...activeToolNames]
878
+ : this.activeToolNames;
879
+ this.validateToolNames(nextActiveToolNames, nextTools);
880
+ const previousToolNames = [...this.tools.keys()];
881
+ const previousActiveToolNames = [...this.activeToolNames];
882
+ if (this.phase === 'idle') {
883
+ await this.session.appendActiveToolsChange(nextActiveToolNames);
884
+ }
885
+ else {
886
+ this.pendingSessionWrites.push({
887
+ type: 'active_tools_change',
888
+ activeToolNames: [...nextActiveToolNames],
889
+ });
890
+ }
891
+ this.tools = nextTools;
892
+ this.activeToolNames = [...nextActiveToolNames];
893
+ await this.emitOwn({
894
+ type: 'tools_update',
895
+ toolNames: [...this.tools.keys()],
896
+ previousToolNames,
897
+ activeToolNames: [...this.activeToolNames],
898
+ previousActiveToolNames,
899
+ source: 'set',
900
+ });
901
+ }
902
+ catch (error) {
903
+ throw normalizeHarnessError(error, 'invalid_argument');
904
+ }
905
+ }
906
+ getActiveTools() {
907
+ return this.activeToolNames.map((name) => this.tools.get(name));
908
+ }
909
+ async setActiveTools(toolNames) {
910
+ try {
911
+ this.validateToolNames(toolNames);
912
+ const previousToolNames = [...this.tools.keys()];
913
+ const previousActiveToolNames = [...this.activeToolNames];
914
+ if (this.phase === 'idle') {
915
+ await this.session.appendActiveToolsChange(toolNames);
916
+ }
917
+ else {
918
+ this.pendingSessionWrites.push({
919
+ type: 'active_tools_change',
920
+ activeToolNames: [...toolNames],
921
+ });
922
+ }
923
+ this.activeToolNames = [...toolNames];
924
+ await this.emitOwn({
925
+ type: 'tools_update',
926
+ toolNames: [...this.tools.keys()],
927
+ previousToolNames,
928
+ activeToolNames: [...this.activeToolNames],
929
+ previousActiveToolNames,
930
+ source: 'set',
931
+ });
932
+ }
933
+ catch (error) {
934
+ throw normalizeHarnessError(error, 'invalid_argument');
935
+ }
936
+ }
937
+ getSteeringMode() {
938
+ return this.steeringQueueMode;
939
+ }
940
+ async setSteeringMode(mode) {
941
+ this.steeringQueueMode = mode;
942
+ }
943
+ getFollowUpMode() {
944
+ return this.followUpQueueMode;
945
+ }
946
+ async setFollowUpMode(mode) {
947
+ this.followUpQueueMode = mode;
948
+ }
949
+ getResources() {
950
+ return {
951
+ skills: this.resources.skills?.slice(),
952
+ promptTemplates: this.resources.promptTemplates?.slice(),
953
+ };
954
+ }
955
+ async setResources(resources) {
956
+ const previousResources = this.getResources();
957
+ this.resources = {
958
+ skills: resources.skills?.slice(),
959
+ promptTemplates: resources.promptTemplates?.slice(),
960
+ };
961
+ await this.emitOwn({
962
+ type: 'resources_update',
963
+ resources: this.getResources(),
964
+ previousResources,
965
+ });
966
+ }
967
+ getStreamOptions() {
968
+ return cloneStreamOptions(this.streamOptions);
969
+ }
970
+ async setStreamOptions(streamOptions) {
971
+ this.streamOptions = cloneStreamOptions(streamOptions);
972
+ }
973
+ async abort() {
974
+ const clearedSteer = [...this.steerQueue];
975
+ const clearedFollowUp = [...this.followUpQueue];
976
+ this.steerQueue = [];
977
+ this.followUpQueue = [];
978
+ this.runAbortController?.abort();
979
+ const errors = [];
980
+ try {
981
+ await this.emitQueueUpdate();
982
+ }
983
+ catch (error) {
984
+ errors.push(toError(error));
985
+ }
986
+ try {
987
+ await this.waitForIdle();
988
+ }
989
+ catch (error) {
990
+ errors.push(toError(error));
991
+ }
992
+ try {
993
+ await this.emitOwn({ type: 'abort', clearedSteer, clearedFollowUp });
994
+ }
995
+ catch (error) {
996
+ errors.push(toError(error));
997
+ }
998
+ if (errors.length > 0) {
999
+ const cause = errors.length === 1
1000
+ ? errors[0]
1001
+ : new AggregateError(errors, 'Abort completed with errors');
1002
+ throw normalizeHarnessError(cause, 'hook');
1003
+ }
1004
+ return { clearedSteer, clearedFollowUp };
1005
+ }
1006
+ async waitForIdle() {
1007
+ await this.runPromise;
1008
+ }
1009
+ subscribe(listener) {
1010
+ let handlers = this.handlers.get(SUBSCRIBER_EVENT_TYPE);
1011
+ if (!handlers) {
1012
+ handlers = new Set();
1013
+ this.handlers.set(SUBSCRIBER_EVENT_TYPE, handlers);
1014
+ }
1015
+ handlers.add(listener);
1016
+ return () => handlers.delete(listener);
1017
+ }
1018
+ on(type, handler) {
1019
+ let handlers = this.handlers.get(type);
1020
+ if (!handlers) {
1021
+ handlers = new Set();
1022
+ this.handlers.set(type, handlers);
1023
+ }
1024
+ handlers.add(handler);
1025
+ return () => handlers.delete(handler);
1026
+ }
1027
+ }
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtaGFybmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9zcmMvaGFybmVzcy9hZ2VudC1oYXJuZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCxZQUFZLEdBRWIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFZaEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixxQkFBcUIsR0FDdEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsT0FBTyxFQUNQLDJCQUEyQixFQUMzQixpQkFBaUIsR0FDbEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQWtCcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLFlBQVksRUFDWixPQUFPLEdBQ1IsTUFBTSxZQUFZLENBQUM7QUFFcEIsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsTUFBdUI7SUFDOUQsTUFBTSxPQUFPLEdBQXlEO1FBQ3BFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7S0FDdkIsQ0FBQztJQUNGLElBQUksTUFBTTtRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUMzQixLQUFpQixFQUNqQixLQUFjLEVB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