@nervekit/agent 0.1.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 (263) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/dist/agent-loop.d.ts +2 -0
  4. package/dist/agent-loop.d.ts.map +1 -0
  5. package/dist/agent-loop.js +2 -0
  6. package/dist/agent-loop.js.map +1 -0
  7. package/dist/agent.d.ts +125 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +427 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/harness/agent-harness.d.ts +114 -0
  12. package/dist/harness/agent-harness.d.ts.map +1 -0
  13. package/dist/harness/agent-harness.js +474 -0
  14. package/dist/harness/agent-harness.js.map +1 -0
  15. package/dist/harness/compaction/branch-summarization.d.ts +54 -0
  16. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  17. package/dist/harness/compaction/branch-summarization.js +183 -0
  18. package/dist/harness/compaction/branch-summarization.js.map +1 -0
  19. package/dist/harness/compaction/compaction.d.ts +19 -0
  20. package/dist/harness/compaction/compaction.d.ts.map +1 -0
  21. package/dist/harness/compaction/compaction.js +335 -0
  22. package/dist/harness/compaction/compaction.js.map +1 -0
  23. package/dist/harness/compaction/cut-points.d.ts +7 -0
  24. package/dist/harness/compaction/cut-points.d.ts.map +1 -0
  25. package/dist/harness/compaction/cut-points.js +106 -0
  26. package/dist/harness/compaction/cut-points.js.map +1 -0
  27. package/dist/harness/compaction/overflow.d.ts +3 -0
  28. package/dist/harness/compaction/overflow.d.ts.map +1 -0
  29. package/dist/harness/compaction/overflow.js +54 -0
  30. package/dist/harness/compaction/overflow.js.map +1 -0
  31. package/dist/harness/compaction/policy.d.ts +8 -0
  32. package/dist/harness/compaction/policy.d.ts.map +1 -0
  33. package/dist/harness/compaction/policy.js +57 -0
  34. package/dist/harness/compaction/policy.js.map +1 -0
  35. package/dist/harness/compaction/types.d.ts +79 -0
  36. package/dist/harness/compaction/types.d.ts.map +1 -0
  37. package/dist/harness/compaction/types.js +2 -0
  38. package/dist/harness/compaction/types.js.map +1 -0
  39. package/dist/harness/compaction/usage.d.ts +30 -0
  40. package/dist/harness/compaction/usage.d.ts.map +1 -0
  41. package/dist/harness/compaction/usage.js +177 -0
  42. package/dist/harness/compaction/usage.js.map +1 -0
  43. package/dist/harness/compaction/utils.d.ts +25 -0
  44. package/dist/harness/compaction/utils.d.ts.map +1 -0
  45. package/dist/harness/compaction/utils.js +131 -0
  46. package/dist/harness/compaction/utils.js.map +1 -0
  47. package/dist/harness/configuration.d.ts +34 -0
  48. package/dist/harness/configuration.d.ts.map +1 -0
  49. package/dist/harness/configuration.js +75 -0
  50. package/dist/harness/configuration.js.map +1 -0
  51. package/dist/harness/conversation/context.d.ts +24 -0
  52. package/dist/harness/conversation/context.d.ts.map +1 -0
  53. package/dist/harness/conversation/context.js +76 -0
  54. package/dist/harness/conversation/context.js.map +1 -0
  55. package/dist/harness/conversation/conversation.d.ts +36 -0
  56. package/dist/harness/conversation/conversation.d.ts.map +1 -0
  57. package/dist/harness/conversation/conversation.js +163 -0
  58. package/dist/harness/conversation/conversation.js.map +1 -0
  59. package/dist/harness/conversation/entries.d.ts +117 -0
  60. package/dist/harness/conversation/entries.d.ts.map +1 -0
  61. package/dist/harness/conversation/entries.js +2 -0
  62. package/dist/harness/conversation/entries.js.map +1 -0
  63. package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
  64. package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
  65. package/dist/harness/conversation/jsonl-repo.js +110 -0
  66. package/dist/harness/conversation/jsonl-repo.js.map +1 -0
  67. package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
  68. package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
  69. package/dist/harness/conversation/jsonl-storage.js +213 -0
  70. package/dist/harness/conversation/jsonl-storage.js.map +1 -0
  71. package/dist/harness/conversation/memory-repo.d.ts +18 -0
  72. package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
  73. package/dist/harness/conversation/memory-repo.js +45 -0
  74. package/dist/harness/conversation/memory-repo.js.map +1 -0
  75. package/dist/harness/conversation/memory-storage.d.ts +25 -0
  76. package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
  77. package/dist/harness/conversation/memory-storage.js +88 -0
  78. package/dist/harness/conversation/memory-storage.js.map +1 -0
  79. package/dist/harness/conversation/repo-utils.d.ts +13 -0
  80. package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
  81. package/dist/harness/conversation/repo-utils.js +39 -0
  82. package/dist/harness/conversation/repo-utils.js.map +1 -0
  83. package/dist/harness/conversation/storage-utils.d.ts +11 -0
  84. package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
  85. package/dist/harness/conversation/storage-utils.js +32 -0
  86. package/dist/harness/conversation/storage-utils.js.map +1 -0
  87. package/dist/harness/conversation/text-extraction.d.ts +8 -0
  88. package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
  89. package/dist/harness/conversation/text-extraction.js +24 -0
  90. package/dist/harness/conversation/text-extraction.js.map +1 -0
  91. package/dist/harness/conversation/uuid.d.ts +2 -0
  92. package/dist/harness/conversation/uuid.d.ts.map +1 -0
  93. package/dist/harness/conversation/uuid.js +54 -0
  94. package/dist/harness/conversation/uuid.js.map +1 -0
  95. package/dist/harness/conversation-writes.d.ts +9 -0
  96. package/dist/harness/conversation-writes.d.ts.map +1 -0
  97. package/dist/harness/conversation-writes.js +54 -0
  98. package/dist/harness/conversation-writes.js.map +1 -0
  99. package/dist/harness/env/nodejs.d.ts +53 -0
  100. package/dist/harness/env/nodejs.d.ts.map +1 -0
  101. package/dist/harness/env/nodejs.js +497 -0
  102. package/dist/harness/env/nodejs.js.map +1 -0
  103. package/dist/harness/env/types.d.ts +106 -0
  104. package/dist/harness/env/types.d.ts.map +1 -0
  105. package/dist/harness/env/types.js +2 -0
  106. package/dist/harness/env/types.js.map +1 -0
  107. package/dist/harness/errors.d.ts +48 -0
  108. package/dist/harness/errors.d.ts.map +1 -0
  109. package/dist/harness/errors.js +63 -0
  110. package/dist/harness/errors.js.map +1 -0
  111. package/dist/harness/events.d.ts +238 -0
  112. package/dist/harness/events.d.ts.map +1 -0
  113. package/dist/harness/events.js +2 -0
  114. package/dist/harness/events.js.map +1 -0
  115. package/dist/harness/harness-configuration-methods.d.ts +36 -0
  116. package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
  117. package/dist/harness/harness-configuration-methods.js +145 -0
  118. package/dist/harness/harness-configuration-methods.js.map +1 -0
  119. package/dist/harness/harness-continuation.d.ts +18 -0
  120. package/dist/harness/harness-continuation.d.ts.map +1 -0
  121. package/dist/harness/harness-continuation.js +56 -0
  122. package/dist/harness/harness-continuation.js.map +1 -0
  123. package/dist/harness/harness-events.d.ts +23 -0
  124. package/dist/harness/harness-events.d.ts.map +1 -0
  125. package/dist/harness/harness-events.js +129 -0
  126. package/dist/harness/harness-events.js.map +1 -0
  127. package/dist/harness/harness-invocations.d.ts +20 -0
  128. package/dist/harness/harness-invocations.d.ts.map +1 -0
  129. package/dist/harness/harness-invocations.js +22 -0
  130. package/dist/harness/harness-invocations.js.map +1 -0
  131. package/dist/harness/harness-maintenance.d.ts +30 -0
  132. package/dist/harness/harness-maintenance.d.ts.map +1 -0
  133. package/dist/harness/harness-maintenance.js +155 -0
  134. package/dist/harness/harness-maintenance.js.map +1 -0
  135. package/dist/harness/harness-queue-methods.d.ts +45 -0
  136. package/dist/harness/harness-queue-methods.d.ts.map +1 -0
  137. package/dist/harness/harness-queue-methods.js +51 -0
  138. package/dist/harness/harness-queue-methods.js.map +1 -0
  139. package/dist/harness/messages.d.ts +76 -0
  140. package/dist/harness/messages.d.ts.map +1 -0
  141. package/dist/harness/messages.js +147 -0
  142. package/dist/harness/messages.js.map +1 -0
  143. package/dist/harness/options.d.ts +95 -0
  144. package/dist/harness/options.d.ts.map +1 -0
  145. package/dist/harness/options.js +2 -0
  146. package/dist/harness/options.js.map +1 -0
  147. package/dist/harness/prompt-templates.d.ts +49 -0
  148. package/dist/harness/prompt-templates.d.ts.map +1 -0
  149. package/dist/harness/prompt-templates.js +230 -0
  150. package/dist/harness/prompt-templates.js.map +1 -0
  151. package/dist/harness/result.d.ts +19 -0
  152. package/dist/harness/result.d.ts.map +1 -0
  153. package/dist/harness/result.js +32 -0
  154. package/dist/harness/result.js.map +1 -0
  155. package/dist/harness/run/messages.d.ts +5 -0
  156. package/dist/harness/run/messages.d.ts.map +1 -0
  157. package/dist/harness/run/messages.js +37 -0
  158. package/dist/harness/run/messages.js.map +1 -0
  159. package/dist/harness/skills/format.d.ts +6 -0
  160. package/dist/harness/skills/format.d.ts.map +1 -0
  161. package/dist/harness/skills/format.js +38 -0
  162. package/dist/harness/skills/format.js.map +1 -0
  163. package/dist/harness/skills/index.d.ts +5 -0
  164. package/dist/harness/skills/index.d.ts.map +1 -0
  165. package/dist/harness/skills/index.js +5 -0
  166. package/dist/harness/skills/index.js.map +1 -0
  167. package/dist/harness/skills/loader.d.ts +43 -0
  168. package/dist/harness/skills/loader.d.ts.map +1 -0
  169. package/dist/harness/skills/loader.js +279 -0
  170. package/dist/harness/skills/loader.js.map +1 -0
  171. package/dist/harness/skills/parser.d.ts +12 -0
  172. package/dist/harness/skills/parser.d.ts.map +1 -0
  173. package/dist/harness/skills/parser.js +22 -0
  174. package/dist/harness/skills/parser.js.map +1 -0
  175. package/dist/harness/skills/validation.d.ts +3 -0
  176. package/dist/harness/skills/validation.d.ts.map +1 -0
  177. package/dist/harness/skills/validation.js +28 -0
  178. package/dist/harness/skills/validation.js.map +1 -0
  179. package/dist/harness/skills.d.ts +2 -0
  180. package/dist/harness/skills.d.ts.map +1 -0
  181. package/dist/harness/skills.js +2 -0
  182. package/dist/harness/skills.js.map +1 -0
  183. package/dist/harness/stream-options.d.ts +5 -0
  184. package/dist/harness/stream-options.d.ts.map +1 -0
  185. package/dist/harness/stream-options.js +67 -0
  186. package/dist/harness/stream-options.js.map +1 -0
  187. package/dist/harness/system-prompt.d.ts +2 -0
  188. package/dist/harness/system-prompt.d.ts.map +1 -0
  189. package/dist/harness/system-prompt.js +2 -0
  190. package/dist/harness/system-prompt.js.map +1 -0
  191. package/dist/harness/turn-state.d.ts +27 -0
  192. package/dist/harness/turn-state.d.ts.map +1 -0
  193. package/dist/harness/turn-state.js +35 -0
  194. package/dist/harness/turn-state.js.map +1 -0
  195. package/dist/harness/types.d.ts +9 -0
  196. package/dist/harness/types.d.ts.map +1 -0
  197. package/dist/harness/types.js +8 -0
  198. package/dist/harness/types.js.map +1 -0
  199. package/dist/harness/utils/env-path.d.ts +14 -0
  200. package/dist/harness/utils/env-path.d.ts.map +1 -0
  201. package/dist/harness/utils/env-path.js +99 -0
  202. package/dist/harness/utils/env-path.js.map +1 -0
  203. package/dist/harness/utils/shell-output.d.ts +16 -0
  204. package/dist/harness/utils/shell-output.d.ts.map +1 -0
  205. package/dist/harness/utils/shell-output.js +137 -0
  206. package/dist/harness/utils/shell-output.js.map +1 -0
  207. package/dist/harness/utils/truncate.d.ts +70 -0
  208. package/dist/harness/utils/truncate.d.ts.map +1 -0
  209. package/dist/harness/utils/truncate.js +289 -0
  210. package/dist/harness/utils/truncate.js.map +1 -0
  211. package/dist/index.d.ts +24 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +25 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/node.d.ts +3 -0
  216. package/dist/node.d.ts.map +1 -0
  217. package/dist/node.js +3 -0
  218. package/dist/node.js.map +1 -0
  219. package/dist/proxy.d.ts +67 -0
  220. package/dist/proxy.d.ts.map +1 -0
  221. package/dist/proxy.js +299 -0
  222. package/dist/proxy.js.map +1 -0
  223. package/dist/runtime/loop/agent-loop.d.ts +24 -0
  224. package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
  225. package/dist/runtime/loop/agent-loop.js +72 -0
  226. package/dist/runtime/loop/agent-loop.js.map +1 -0
  227. package/dist/runtime/loop/events.d.ts +5 -0
  228. package/dist/runtime/loop/events.d.ts.map +1 -0
  229. package/dist/runtime/loop/events.js +5 -0
  230. package/dist/runtime/loop/events.js.map +1 -0
  231. package/dist/runtime/loop/index.d.ts +6 -0
  232. package/dist/runtime/loop/index.d.ts.map +1 -0
  233. package/dist/runtime/loop/index.js +6 -0
  234. package/dist/runtime/loop/index.js.map +1 -0
  235. package/dist/runtime/loop/stream-assistant.d.ts +9 -0
  236. package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
  237. package/dist/runtime/loop/stream-assistant.js +87 -0
  238. package/dist/runtime/loop/stream-assistant.js.map +1 -0
  239. package/dist/runtime/loop/tool-execution.d.ts +15 -0
  240. package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
  241. package/dist/runtime/loop/tool-execution.js +271 -0
  242. package/dist/runtime/loop/tool-execution.js.map +1 -0
  243. package/dist/runtime/loop/turn-loop.d.ts +7 -0
  244. package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
  245. package/dist/runtime/loop/turn-loop.js +84 -0
  246. package/dist/runtime/loop/turn-loop.js.map +1 -0
  247. package/dist/runtime.d.ts +63 -0
  248. package/dist/runtime.d.ts.map +1 -0
  249. package/dist/runtime.js +170 -0
  250. package/dist/runtime.js.map +1 -0
  251. package/dist/suspension.d.ts +18 -0
  252. package/dist/suspension.d.ts.map +1 -0
  253. package/dist/suspension.js +19 -0
  254. package/dist/suspension.js.map +1 -0
  255. package/dist/types.d.ts +395 -0
  256. package/dist/types.d.ts.map +1 -0
  257. package/dist/types.js +2 -0
  258. package/dist/types.js.map +1 -0
  259. package/dist/worker.d.ts +2 -0
  260. package/dist/worker.d.ts.map +1 -0
  261. package/dist/worker.js +88 -0
  262. package/dist/worker.js.map +1 -0
  263. package/package.json +54 -0
@@ -0,0 +1,56 @@
1
+ import { runAgentLoopContinue } from "../agent-loop.js";
2
+ import { isAgentToolSuspension } from "../suspension.js";
3
+ import { AgentHarnessError } from "./errors.js";
4
+ import { normalizeHarnessError } from "./harness-events.js";
5
+ import { toError } from "./result.js";
6
+ export async function continueHarnessRun(state) {
7
+ if (state.phase !== "idle") {
8
+ throw new AgentHarnessError("busy", "AgentHarness is busy");
9
+ }
10
+ state.phase = "turn";
11
+ const finishRunPromise = state.startRunPromise();
12
+ let activeTurnState = await state.createTurnState();
13
+ const abortController = new AbortController();
14
+ const getTurnState = () => activeTurnState;
15
+ const setTurnState = (nextTurnState) => {
16
+ activeTurnState = nextTurnState;
17
+ };
18
+ state.runAbortController = abortController;
19
+ try {
20
+ const newMessages = await runAgentLoopContinue(state.createContext(activeTurnState), state.createLoopConfig(getTurnState, setTurnState), (event) => state.handleAgentEvent(event, abortController.signal), abortController.signal, state.createStreamFn(getTurnState));
21
+ for (const message of [...newMessages].reverse()) {
22
+ if (message.role === "assistant")
23
+ return message;
24
+ }
25
+ throw new AgentHarnessError("invalid_state", "AgentHarness continue completed without an assistant message");
26
+ }
27
+ catch (error) {
28
+ if (isAgentToolSuspension(error)) {
29
+ state.phase = "idle";
30
+ throw error;
31
+ }
32
+ try {
33
+ const failureMessages = await state.emitRunFailure(activeTurnState.model, error, abortController.signal.aborted, abortController.signal);
34
+ const assistant = [...failureMessages]
35
+ .reverse()
36
+ .find((message) => message.role === "assistant");
37
+ if (assistant)
38
+ return assistant;
39
+ }
40
+ catch (failureError) {
41
+ const cause = new AggregateError([toError(error), toError(failureError)], "Agent continuation failed and failure reporting failed");
42
+ throw new AgentHarnessError("unknown", cause.message, cause);
43
+ }
44
+ throw normalizeHarnessError(error, "unknown");
45
+ }
46
+ finally {
47
+ try {
48
+ await state.flushPendingConversationWrites();
49
+ }
50
+ finally {
51
+ state.runAbortController = undefined;
52
+ finishRunPromise();
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=harness-continuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-continuation.js","sourceRoot":"","sources":["../../src/harness/harness-continuation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AnyModel } from "../types.js";
2
+ import { AgentHarnessError } from "./errors.js";
3
+ import type { AgentHarnessEvent, AgentHarnessEventResultMap, AgentHarnessOwnEvent } from "./events.js";
4
+ import type { AgentHarnessStreamOptions, PromptTemplate, Skill } from "./options.js";
5
+ export type AgentHarnessHandler = (event: unknown, signal?: AbortSignal) => Promise<unknown> | unknown;
6
+ export declare function normalizeHarnessError(error: unknown, fallbackCode: AgentHarnessError["code"]): AgentHarnessError;
7
+ export declare function normalizeHookError(error: unknown): AgentHarnessError;
8
+ export declare class AgentHarnessEventHub<TSkill extends Skill = Skill, TPromptTemplate extends PromptTemplate = PromptTemplate> {
9
+ private handlers;
10
+ private getHandlers;
11
+ emitOwn(event: AgentHarnessOwnEvent<TSkill, TPromptTemplate>, signal?: AbortSignal): Promise<void>;
12
+ emitAny(event: AgentHarnessEvent<TSkill, TPromptTemplate>, signal?: AbortSignal): Promise<void>;
13
+ emitHook<TType extends keyof AgentHarnessEventResultMap>(event: Extract<AgentHarnessOwnEvent, {
14
+ type: TType;
15
+ }>): Promise<AgentHarnessEventResultMap[TType] | undefined>;
16
+ emitBeforeProviderRequest(model: AnyModel, conversationId: string, streamOptions: AgentHarnessStreamOptions): Promise<AgentHarnessStreamOptions>;
17
+ emitBeforeProviderPayload(model: AnyModel, payload: unknown): Promise<unknown>;
18
+ subscribe(listener: (event: AgentHarnessEvent<TSkill, TPromptTemplate>, signal?: AbortSignal) => Promise<void> | void): () => void;
19
+ on<TType extends keyof AgentHarnessEventResultMap>(type: TType, handler: (event: Extract<AgentHarnessOwnEvent, {
20
+ type: TType;
21
+ }>) => Promise<AgentHarnessEventResultMap[TType]> | AgentHarnessEventResultMap[TType]): () => void;
22
+ }
23
+ //# sourceMappingURL=harness-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-events.d.ts","sourceRoot":"","sources":["../../src/harness/harness-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,yBAAyB,EACzB,cAAc,EACd,KAAK,EACN,MAAM,cAAc,CAAC;AAStB,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,iBAAiB,CAAC,MAAM,CAAC,GACtC,iBAAiB,CAUnB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAEpE;AAED,qBAAa,oBAAoB,CAC/B,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5B,eAAe,SAAS,cAAc,GAAG,cAAc;IAEvD,OAAO,CAAC,QAAQ,CAA+C;IAE/D,OAAO,CAAC,WAAW;IAIb,OAAO,CACX,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,eAAe,CAAC,EACpD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC;IAUV,OAAO,CACX,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,EACjD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC;IAUV,QAAQ,CAAC,KAAK,SAAS,MAAM,0BAA0B,EAC3D,KAAK,EAAE,OAAO,CAAC,oBAAoB,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,GACpD,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAmBnD,yBAAyB,CAC7B,KAAK,EAAE,QAAQ,EACf,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,yBAAyB,GACvC,OAAO,CAAC,yBAAyB,CAAC;IAsB/B,yBAAyB,CAC7B,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,OAAO,CAAC;IAqBnB,SAAS,CACP,QAAQ,EAAE,CACR,KAAK,EAAE,iBAAiB,CAAC,MAAM,EAAE,eAAe,CAAC,EACjD,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACxB,MAAM,IAAI;IAWb,EAAE,CAAC,KAAK,SAAS,MAAM,0BAA0B,EAC/C,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,CACP,KAAK,EAAE,OAAO,CAAC,oBAAoB,EAAE;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE,CAAC,KAEnD,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAC1C,0BAA0B,CAAC,KAAK,CAAC,GACpC,MAAM,IAAI;CAUd"}
@@ -0,0 +1,129 @@
1
+ import { AgentHarnessError, BranchSummaryError, CompactionError, ConversationError, } from "./errors.js";
2
+ import { toError } from "./result.js";
3
+ import { applyStreamOptionsPatch, cloneStreamOptions, } from "./stream-options.js";
4
+ const SUBSCRIBER_EVENT_TYPE = "*";
5
+ export function normalizeHarnessError(error, fallbackCode) {
6
+ if (error instanceof AgentHarnessError)
7
+ return error;
8
+ const cause = toError(error);
9
+ if (cause instanceof ConversationError)
10
+ return new AgentHarnessError("conversation", cause.message, cause);
11
+ if (cause instanceof CompactionError)
12
+ return new AgentHarnessError("compaction", cause.message, cause);
13
+ if (cause instanceof BranchSummaryError)
14
+ return new AgentHarnessError("branch_summary", cause.message, cause);
15
+ return new AgentHarnessError(fallbackCode, cause.message, cause);
16
+ }
17
+ export function normalizeHookError(error) {
18
+ return normalizeHarnessError(error, "hook");
19
+ }
20
+ export class AgentHarnessEventHub {
21
+ handlers = new Map();
22
+ getHandlers(type) {
23
+ return this.handlers.get(type);
24
+ }
25
+ async emitOwn(event, signal) {
26
+ for (const listener of this.getHandlers(SUBSCRIBER_EVENT_TYPE) ?? []) {
27
+ try {
28
+ await listener(event, signal);
29
+ }
30
+ catch (error) {
31
+ throw normalizeHookError(error);
32
+ }
33
+ }
34
+ }
35
+ async emitAny(event, signal) {
36
+ for (const listener of this.getHandlers(SUBSCRIBER_EVENT_TYPE) ?? []) {
37
+ try {
38
+ await listener(event, signal);
39
+ }
40
+ catch (error) {
41
+ throw normalizeHookError(error);
42
+ }
43
+ }
44
+ }
45
+ async emitHook(event) {
46
+ const handlers = this.getHandlers(event.type);
47
+ if (!handlers || handlers.size === 0)
48
+ return undefined;
49
+ let lastResult;
50
+ for (const handler of handlers) {
51
+ try {
52
+ const result = (await handler(event));
53
+ if (result !== undefined) {
54
+ lastResult = result;
55
+ }
56
+ }
57
+ catch (error) {
58
+ throw normalizeHookError(error);
59
+ }
60
+ }
61
+ return lastResult;
62
+ }
63
+ async emitBeforeProviderRequest(model, conversationId, streamOptions) {
64
+ const handlers = this.getHandlers("before_provider_request");
65
+ let current = cloneStreamOptions(streamOptions);
66
+ if (!handlers || handlers.size === 0)
67
+ return current;
68
+ for (const handler of handlers) {
69
+ try {
70
+ const result = (await handler({
71
+ type: "before_provider_request",
72
+ model,
73
+ conversationId,
74
+ streamOptions: cloneStreamOptions(current),
75
+ }));
76
+ if (result?.streamOptions) {
77
+ current = applyStreamOptionsPatch(current, result.streamOptions);
78
+ }
79
+ }
80
+ catch (error) {
81
+ throw normalizeHookError(error);
82
+ }
83
+ }
84
+ return current;
85
+ }
86
+ async emitBeforeProviderPayload(model, payload) {
87
+ const handlers = this.getHandlers("before_provider_payload");
88
+ let current = payload;
89
+ if (!handlers || handlers.size === 0)
90
+ return current;
91
+ for (const handler of handlers) {
92
+ try {
93
+ const result = (await handler({
94
+ type: "before_provider_payload",
95
+ model,
96
+ payload: current,
97
+ }));
98
+ if (result !== undefined) {
99
+ current = result.payload;
100
+ }
101
+ }
102
+ catch (error) {
103
+ throw normalizeHookError(error);
104
+ }
105
+ }
106
+ return current;
107
+ }
108
+ subscribe(listener) {
109
+ let handlers = this.handlers.get(SUBSCRIBER_EVENT_TYPE);
110
+ if (!handlers) {
111
+ handlers = new Set();
112
+ this.handlers.set(SUBSCRIBER_EVENT_TYPE, handlers);
113
+ }
114
+ const activeHandlers = handlers;
115
+ activeHandlers.add(listener);
116
+ return () => activeHandlers.delete(listener);
117
+ }
118
+ on(type, handler) {
119
+ let handlers = this.handlers.get(type);
120
+ if (!handlers) {
121
+ handlers = new Set();
122
+ this.handlers.set(type, handlers);
123
+ }
124
+ const activeHandlers = handlers;
125
+ activeHandlers.add(handler);
126
+ return () => activeHandlers.delete(handler);
127
+ }
128
+ }
129
+ //# sourceMappingURL=harness-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-events.js","sourceRoot":"","sources":["../../src/harness/harness-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AssistantMessage, ImageContent } from "@earendil-works/pi-ai";
2
+ import type { AgentTool } from "../types.js";
3
+ import type { PromptTemplate, Skill } from "./options.js";
4
+ import type { AgentHarnessTurnState } from "./turn-state.js";
5
+ export type HarnessInvocationState<TSkill extends Skill, TPromptTemplate extends PromptTemplate, TTool extends AgentTool> = {
6
+ runForegroundTurn(resolvePrompt: (turnState: AgentHarnessTurnState<TSkill, TPromptTemplate, TTool>) => {
7
+ text: string;
8
+ options?: {
9
+ images?: ImageContent[];
10
+ };
11
+ } | Promise<{
12
+ text: string;
13
+ options?: {
14
+ images?: ImageContent[];
15
+ };
16
+ }>): Promise<AssistantMessage>;
17
+ };
18
+ export declare function invokeSkill<TSkill extends Skill, TPromptTemplate extends PromptTemplate, TTool extends AgentTool>(state: HarnessInvocationState<TSkill, TPromptTemplate, TTool>, name: string, additionalInstructions?: string): Promise<AssistantMessage>;
19
+ export declare function invokePromptTemplate<TSkill extends Skill, TPromptTemplate extends PromptTemplate, TTool extends AgentTool>(state: HarnessInvocationState<TSkill, TPromptTemplate, TTool>, name: string, args: string[]): Promise<AssistantMessage>;
20
+ //# sourceMappingURL=harness-invocations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-invocations.d.ts","sourceRoot":"","sources":["../../src/harness/harness-invocations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,MAAM,sBAAsB,CAChC,MAAM,SAAS,KAAK,EACpB,eAAe,SAAS,cAAc,EACtC,KAAK,SAAS,SAAS,IACrB;IACF,iBAAiB,CACf,aAAa,EAAE,CACb,SAAS,EAAE,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,KAE9D;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;SAAE,CAAA;KAAE,GACvD,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC,GACnE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B,CAAC;AAEF,wBAAgB,WAAW,CACzB,MAAM,SAAS,KAAK,EACpB,eAAe,SAAS,cAAc,EACtC,KAAK,SAAS,SAAS,EAEvB,KAAK,EAAE,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAC7D,IAAI,EAAE,MAAM,EACZ,sBAAsB,CAAC,EAAE,MAAM,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAU3B;AAED,wBAAgB,oBAAoB,CAClC,MAAM,SAAS,KAAK,EACpB,eAAe,SAAS,cAAc,EACtC,KAAK,SAAS,SAAS,EAEvB,KAAK,EAAE,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAC7D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
@@ -0,0 +1,22 @@
1
+ import { AgentHarnessError } from "./errors.js";
2
+ import { formatPromptTemplateInvocation } from "./prompt-templates.js";
3
+ import { formatSkillInvocation } from "./skills.js";
4
+ export function invokeSkill(state, name, additionalInstructions) {
5
+ return state.runForegroundTurn((turnState) => {
6
+ const skill = (turnState.resources.skills ?? []).find((candidate) => candidate.name === name);
7
+ if (!skill) {
8
+ throw new AgentHarnessError("invalid_argument", `Unknown skill: ${name}`);
9
+ }
10
+ return { text: formatSkillInvocation(skill, additionalInstructions) };
11
+ });
12
+ }
13
+ export function invokePromptTemplate(state, name, args) {
14
+ return state.runForegroundTurn((turnState) => {
15
+ const template = (turnState.resources.promptTemplates ?? []).find((candidate) => candidate.name === name);
16
+ if (!template) {
17
+ throw new AgentHarnessError("invalid_argument", `Unknown prompt template: ${name}`);
18
+ }
19
+ return { text: formatPromptTemplateInvocation(template, args) };
20
+ });
21
+ }
22
+ //# sourceMappingURL=harness-invocations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-invocations.js","sourceRoot":"","sources":["../../src/harness/harness-invocations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAiBpD,MAAM,UAAU,WAAW,CAKzB,KAA6D,EAC7D,IAAY,EACZ,sBAA+B;IAE/B,OAAO,KAAK,CAAC,iBAAiB,CAAC,CAAC,SAAS,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CACnD,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CACvC,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,CAAC,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAKlC,KAA6D,EAC7D,IAAY,EACZ,IAAc;IAEd,OAAO,KAAK,CAAC,iBAAiB,CAAC,CAAC,SAAS,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,CAC/D,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CACvC,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,iBAAiB,CACzB,kBAAkB,EAClB,4BAA4B,IAAI,EAAE,CACnC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { AgentTool, AnyModel, ThinkingLevel } from "../types.js";
2
+ import type { Conversation } from "./conversation/conversation.js";
3
+ import type { AgentHarnessOwnEvent, AgentHarnessPhase, NavigateTreeResult } from "./events.js";
4
+ import type { AgentHarnessOptions, PromptTemplate, Skill } from "./options.js";
5
+ type EmitHook = (event: AgentHarnessOwnEvent) => Promise<unknown>;
6
+ type EmitOwn = (event: AgentHarnessOwnEvent) => Promise<void>;
7
+ export type HarnessMaintenanceContext<TSkill extends Skill, TPromptTemplate extends PromptTemplate, TTool extends AgentTool> = {
8
+ getPhase(): AgentHarnessPhase;
9
+ setPhase(phase: AgentHarnessPhase): void;
10
+ conversation: Conversation;
11
+ getModel(): AnyModel;
12
+ getThinkingLevel(): ThinkingLevel;
13
+ getApiKeyAndHeaders?: AgentHarnessOptions<TSkill, TPromptTemplate, TTool>["getApiKeyAndHeaders"];
14
+ emitHook: EmitHook;
15
+ emitOwn: EmitOwn;
16
+ };
17
+ export declare function compactHarnessConversation<TSkill extends Skill, TPromptTemplate extends PromptTemplate, TTool extends AgentTool>(context: HarnessMaintenanceContext<TSkill, TPromptTemplate, TTool>, customInstructions?: string): Promise<{
18
+ summary: string;
19
+ firstKeptEntryId: string;
20
+ tokensBefore: number;
21
+ details?: unknown;
22
+ }>;
23
+ export declare function navigateHarnessTree<TSkill extends Skill, TPromptTemplate extends PromptTemplate, TTool extends AgentTool>(context: HarnessMaintenanceContext<TSkill, TPromptTemplate, TTool>, targetId: string, options?: {
24
+ summarize?: boolean;
25
+ customInstructions?: string;
26
+ replaceInstructions?: boolean;
27
+ label?: string;
28
+ }): Promise<NavigateTreeResult>;
29
+ export {};
30
+ //# sourceMappingURL=harness-maintenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-maintenance.d.ts","sourceRoot":"","sources":["../../src/harness/harness-maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE/E,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAClE,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,MAAM,yBAAyB,CACnC,MAAM,SAAS,KAAK,EACpB,eAAe,SAAS,cAAc,EACtC,KAAK,SAAS,SAAS,IACrB;IACF,QAAQ,IAAI,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,IAAI,QAAQ,CAAC;IACrB,gBAAgB,IAAI,aAAa,CAAC;IAClC,mBAAmB,CAAC,EAAE,mBAAmB,CACvC,MAAM,EACN,eAAe,EACf,KAAK,CACN,CAAC,qBAAqB,CAAC,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAmBF,wBAAsB,0BAA0B,CAC9C,MAAM,SAAS,KAAK,EACpB,eAAe,SAAS,cAAc,EACtC,KAAK,SAAS,SAAS,EAEvB,OAAO,EAAE,yBAAyB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAClE,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CAwED;AAED,wBAAsB,mBAAmB,CACvC,MAAM,SAAS,KAAK,EACpB,eAAe,SAAS,cAAc,EACtC,KAAK,SAAS,SAAS,EAEvB,OAAO,EAAE,yBAAyB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAClE,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,kBAAkB,CAAC,CA8G7B"}
@@ -0,0 +1,155 @@
1
+ import { collectEntriesForBranchSummary, generateBranchSummary, } from "./compaction/branch-summarization.js";
2
+ import { compact, DEFAULT_COMPACTION_SETTINGS, prepareCompaction, } from "./compaction/compaction.js";
3
+ import { editorTextForNavigatedEntry } from "./conversation/text-extraction.js";
4
+ import { AgentHarnessError } from "./errors.js";
5
+ import { normalizeHarnessError } from "./harness-events.js";
6
+ export async function compactHarnessConversation(context, customInstructions) {
7
+ if (context.getPhase() !== "idle") {
8
+ throw new AgentHarnessError("busy", "compact() requires idle harness");
9
+ }
10
+ context.setPhase("compaction");
11
+ try {
12
+ const model = context.getModel();
13
+ if (!model) {
14
+ throw new AgentHarnessError("invalid_state", "No model set for compaction");
15
+ }
16
+ const auth = await context.getApiKeyAndHeaders?.(model);
17
+ if (!auth) {
18
+ throw new AgentHarnessError("auth", "No auth available for compaction");
19
+ }
20
+ const branchEntries = await context.conversation.getBranch();
21
+ const preparationResult = prepareCompaction(branchEntries, DEFAULT_COMPACTION_SETTINGS);
22
+ if (!preparationResult.ok)
23
+ throw preparationResult.error;
24
+ const preparation = preparationResult.value;
25
+ if (!preparation) {
26
+ throw new AgentHarnessError("compaction", "Nothing to compact");
27
+ }
28
+ const hookResult = (await context.emitHook({
29
+ type: "conversation_before_compact",
30
+ preparation,
31
+ branchEntries,
32
+ customInstructions,
33
+ signal: new AbortController().signal,
34
+ }));
35
+ if (hookResult?.cancel) {
36
+ throw new AgentHarnessError("compaction", "Compaction cancelled");
37
+ }
38
+ const provided = hookResult?.compaction;
39
+ const compactResult = provided
40
+ ? { ok: true, value: provided }
41
+ : await compact(preparation, model, auth.apiKey, auth.headers, customInstructions, undefined, context.getThinkingLevel());
42
+ if (!compactResult.ok)
43
+ throw compactResult.error;
44
+ const result = compactResult.value;
45
+ const entryId = await context.conversation.appendCompaction(result.summary, result.firstKeptEntryId, result.tokensBefore, result.details, provided !== undefined);
46
+ const entry = await context.conversation.getEntry(entryId);
47
+ if (entry?.type === "compaction") {
48
+ await context.emitOwn({
49
+ type: "conversation_compact",
50
+ compactionEntry: entry,
51
+ fromHook: provided !== undefined,
52
+ });
53
+ }
54
+ return result;
55
+ }
56
+ catch (error) {
57
+ throw normalizeHarnessError(error, "compaction");
58
+ }
59
+ finally {
60
+ context.setPhase("idle");
61
+ }
62
+ }
63
+ export async function navigateHarnessTree(context, targetId, options) {
64
+ if (context.getPhase() !== "idle") {
65
+ throw new AgentHarnessError("busy", "navigateTree() requires idle harness");
66
+ }
67
+ context.setPhase("branch_summary");
68
+ try {
69
+ const oldLeafId = await context.conversation.getLeafId();
70
+ if (oldLeafId === targetId)
71
+ return { cancelled: false };
72
+ const targetEntry = await context.conversation.getEntry(targetId);
73
+ if (!targetEntry) {
74
+ throw new AgentHarnessError("invalid_argument", `Entry ${targetId} not found`);
75
+ }
76
+ const { entries, commonAncestorId } = await collectEntriesForBranchSummary(context.conversation, oldLeafId, targetId);
77
+ const preparation = {
78
+ targetId,
79
+ oldLeafId,
80
+ commonAncestorId,
81
+ entriesToSummarize: entries,
82
+ userWantsSummary: options?.summarize ?? false,
83
+ customInstructions: options?.customInstructions,
84
+ replaceInstructions: options?.replaceInstructions,
85
+ label: options?.label,
86
+ };
87
+ const signal = new AbortController().signal;
88
+ const hookResult = (await context.emitHook({
89
+ type: "conversation_before_tree",
90
+ preparation,
91
+ signal,
92
+ }));
93
+ if (hookResult?.cancel)
94
+ return { cancelled: true };
95
+ let summaryEntry;
96
+ let summaryText = hookResult?.summary?.summary;
97
+ let summaryDetails = hookResult?.summary?.details;
98
+ if (!summaryText && options?.summarize && entries.length > 0) {
99
+ const model = context.getModel();
100
+ if (!model) {
101
+ throw new AgentHarnessError("invalid_state", "No model set for branch summary");
102
+ }
103
+ const auth = await context.getApiKeyAndHeaders?.(model);
104
+ if (!auth) {
105
+ throw new AgentHarnessError("auth", "No auth available for branch summary");
106
+ }
107
+ const branchSummary = await generateBranchSummary(entries, {
108
+ model,
109
+ apiKey: auth.apiKey,
110
+ headers: auth.headers,
111
+ signal: new AbortController().signal,
112
+ customInstructions: hookResult?.customInstructions ?? options?.customInstructions,
113
+ replaceInstructions: hookResult?.replaceInstructions ?? options?.replaceInstructions,
114
+ });
115
+ if (!branchSummary.ok) {
116
+ if (branchSummary.error.code === "aborted")
117
+ return { cancelled: true };
118
+ throw new AgentHarnessError("branch_summary", branchSummary.error.message, branchSummary.error);
119
+ }
120
+ summaryText = branchSummary.value.summary;
121
+ summaryDetails = {
122
+ readFiles: branchSummary.value.readFiles,
123
+ modifiedFiles: branchSummary.value.modifiedFiles,
124
+ };
125
+ }
126
+ const { newLeafId, editorText } = editorTextForNavigatedEntry(targetEntry, targetId);
127
+ const summaryId = await context.conversation.moveTo(newLeafId, summaryText
128
+ ? {
129
+ summary: summaryText,
130
+ details: summaryDetails,
131
+ fromHook: hookResult?.summary !== undefined,
132
+ }
133
+ : undefined);
134
+ if (summaryId) {
135
+ const entry = await context.conversation.getEntry(summaryId);
136
+ if (entry?.type === "branch_summary")
137
+ summaryEntry = entry;
138
+ }
139
+ await context.emitOwn({
140
+ type: "conversation_tree",
141
+ newLeafId: await context.conversation.getLeafId(),
142
+ oldLeafId,
143
+ summaryEntry,
144
+ fromHook: hookResult?.summary !== undefined,
145
+ });
146
+ return { cancelled: false, editorText, summaryEntry };
147
+ }
148
+ catch (error) {
149
+ throw normalizeHarnessError(error, "branch_summary");
150
+ }
151
+ finally {
152
+ context.setPhase("idle");
153
+ }
154
+ }
155
+ //# sourceMappingURL=harness-maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-maintenance.js","sourceRoot":"","sources":["../../src/harness/harness-maintenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { ImageContent } from "@earendil-works/pi-ai";
2
+ import type { AgentMessage } from "../types.js";
3
+ import type { Conversation } from "./conversation/conversation.js";
4
+ import type { AgentHarnessPhase, PendingConversationWrite } from "./events.js";
5
+ export type InboundQueuedMessage = {
6
+ id?: string;
7
+ source: "user" | "harness";
8
+ message: AgentMessage;
9
+ enqueuedAt: string;
10
+ timestamp?: string;
11
+ priority?: "normal" | "high";
12
+ delivery?: {
13
+ taskId?: string;
14
+ event?: string;
15
+ pendingNotificationId?: string;
16
+ };
17
+ };
18
+ export type HarnessQueueState = {
19
+ phase: AgentHarnessPhase;
20
+ steerQueue: InboundQueuedMessage[];
21
+ nextTurnQueue: AgentMessage[];
22
+ pendingConversationWrites: PendingConversationWrite[];
23
+ conversation: Conversation;
24
+ emitQueueUpdate(): Promise<void>;
25
+ };
26
+ export declare function steerHarness(state: HarnessQueueState, text: string, options?: {
27
+ images?: ImageContent[];
28
+ }): Promise<void>;
29
+ export declare function enqueueHarnessMessage(state: HarnessQueueState, input: {
30
+ id?: string;
31
+ message: AgentMessage;
32
+ timestamp?: string;
33
+ delivery?: InboundQueuedMessage["delivery"];
34
+ priority?: InboundQueuedMessage["priority"];
35
+ }): Promise<void>;
36
+ export declare function enqueueNextTurn(state: HarnessQueueState, text: string, options?: {
37
+ images?: ImageContent[];
38
+ }): Promise<void>;
39
+ export declare function appendHarnessMessage(state: HarnessQueueState, message: AgentMessage): Promise<void>;
40
+ export declare function appendExternalHarnessMessage(state: HarnessQueueState, input: {
41
+ id: string;
42
+ message: AgentMessage;
43
+ timestamp?: string;
44
+ }): Promise<void>;
45
+ //# sourceMappingURL=harness-queue-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-queue-methods.d.ts","sourceRoot":"","sources":["../../src/harness/harness-queue-methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAI/E,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,iBAAiB,CAAC;IACzB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,yBAAyB,EAAE,wBAAwB,EAAE,CAAC;IACtD,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,CAAC;AAEF,wBAAsB,YAAY,CAChC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE;IACL,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;CAC7C,GACA,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,51 @@
1
+ import { queueOrWriteMessage } from "./conversation-writes.js";
2
+ import { AgentHarnessError } from "./errors.js";
3
+ import { normalizeHarnessError } from "./harness-events.js";
4
+ import { createUserMessage } from "./run/messages.js";
5
+ export async function steerHarness(state, text, options) {
6
+ if (state.phase === "idle") {
7
+ throw new AgentHarnessError("invalid_state", "Cannot steer while idle");
8
+ }
9
+ state.steerQueue.push({
10
+ source: "user",
11
+ message: createUserMessage(text, options?.images),
12
+ enqueuedAt: new Date().toISOString(),
13
+ });
14
+ await state.emitQueueUpdate();
15
+ }
16
+ export async function enqueueHarnessMessage(state, input) {
17
+ if (state.phase === "idle") {
18
+ throw new AgentHarnessError("invalid_state", "Cannot enqueue harness message while idle");
19
+ }
20
+ state.steerQueue.push({
21
+ id: input.id,
22
+ source: "harness",
23
+ message: input.message,
24
+ timestamp: input.timestamp,
25
+ enqueuedAt: new Date().toISOString(),
26
+ delivery: input.delivery,
27
+ priority: input.priority,
28
+ });
29
+ await state.emitQueueUpdate();
30
+ }
31
+ export async function enqueueNextTurn(state, text, options) {
32
+ state.nextTurnQueue.push(createUserMessage(text, options?.images));
33
+ await state.emitQueueUpdate();
34
+ }
35
+ export async function appendHarnessMessage(state, message) {
36
+ try {
37
+ await queueOrWriteMessage(state.phase, state.pendingConversationWrites, state.conversation, message);
38
+ }
39
+ catch (error) {
40
+ throw normalizeHarnessError(error, "conversation");
41
+ }
42
+ }
43
+ export async function appendExternalHarnessMessage(state, input) {
44
+ try {
45
+ await queueOrWriteMessage(state.phase, state.pendingConversationWrites, state.conversation, input.message, { id: input.id, timestamp: input.timestamp });
46
+ }
47
+ catch (error) {
48
+ throw normalizeHarnessError(error, "conversation");
49
+ }
50
+ }
51
+ //# sourceMappingURL=harness-queue-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-queue-methods.js","sourceRoot":"","sources":["../../src/harness/harness-queue-methods.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAyBtD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAwB,EACxB,IAAY,EACZ,OAAqC;IAErC,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,iBAAiB,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACpB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;QACjD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAwB,EACxB,KAMC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,iBAAiB,CACzB,eAAe,EACf,2CAA2C,CAC5C,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QACpB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAwB,EACxB,IAAY,EACZ,OAAqC;IAErC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAwB,EACxB,OAAqB;IAErB,IAAI,CAAC;QACH,MAAM,mBAAmB,CACvB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,YAAY,EAClB,OAAO,CACR,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAwB,EACxB,KAAgE;IAEhE,IAAI,CAAC;QACH,MAAM,mBAAmB,CACvB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,OAAO,EACb,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAC7C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}