@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.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/dist/agent-loop.d.ts +2 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +2 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent.d.ts +125 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +427 -0
- package/dist/agent.js.map +1 -0
- package/dist/harness/agent-harness.d.ts +114 -0
- package/dist/harness/agent-harness.d.ts.map +1 -0
- package/dist/harness/agent-harness.js +474 -0
- package/dist/harness/agent-harness.js.map +1 -0
- package/dist/harness/compaction/branch-summarization.d.ts +54 -0
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/harness/compaction/branch-summarization.js +183 -0
- package/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/dist/harness/compaction/compaction.d.ts +19 -0
- package/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/dist/harness/compaction/compaction.js +335 -0
- package/dist/harness/compaction/compaction.js.map +1 -0
- package/dist/harness/compaction/cut-points.d.ts +7 -0
- package/dist/harness/compaction/cut-points.d.ts.map +1 -0
- package/dist/harness/compaction/cut-points.js +106 -0
- package/dist/harness/compaction/cut-points.js.map +1 -0
- package/dist/harness/compaction/overflow.d.ts +3 -0
- package/dist/harness/compaction/overflow.d.ts.map +1 -0
- package/dist/harness/compaction/overflow.js +54 -0
- package/dist/harness/compaction/overflow.js.map +1 -0
- package/dist/harness/compaction/policy.d.ts +8 -0
- package/dist/harness/compaction/policy.d.ts.map +1 -0
- package/dist/harness/compaction/policy.js +57 -0
- package/dist/harness/compaction/policy.js.map +1 -0
- package/dist/harness/compaction/types.d.ts +79 -0
- package/dist/harness/compaction/types.d.ts.map +1 -0
- package/dist/harness/compaction/types.js +2 -0
- package/dist/harness/compaction/types.js.map +1 -0
- package/dist/harness/compaction/usage.d.ts +30 -0
- package/dist/harness/compaction/usage.d.ts.map +1 -0
- package/dist/harness/compaction/usage.js +177 -0
- package/dist/harness/compaction/usage.js.map +1 -0
- package/dist/harness/compaction/utils.d.ts +25 -0
- package/dist/harness/compaction/utils.d.ts.map +1 -0
- package/dist/harness/compaction/utils.js +131 -0
- package/dist/harness/compaction/utils.js.map +1 -0
- package/dist/harness/configuration.d.ts +34 -0
- package/dist/harness/configuration.d.ts.map +1 -0
- package/dist/harness/configuration.js +75 -0
- package/dist/harness/configuration.js.map +1 -0
- package/dist/harness/conversation/context.d.ts +24 -0
- package/dist/harness/conversation/context.d.ts.map +1 -0
- package/dist/harness/conversation/context.js +76 -0
- package/dist/harness/conversation/context.js.map +1 -0
- package/dist/harness/conversation/conversation.d.ts +36 -0
- package/dist/harness/conversation/conversation.d.ts.map +1 -0
- package/dist/harness/conversation/conversation.js +163 -0
- package/dist/harness/conversation/conversation.js.map +1 -0
- package/dist/harness/conversation/entries.d.ts +117 -0
- package/dist/harness/conversation/entries.d.ts.map +1 -0
- package/dist/harness/conversation/entries.js +2 -0
- package/dist/harness/conversation/entries.js.map +1 -0
- package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
- package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-repo.js +110 -0
- package/dist/harness/conversation/jsonl-repo.js.map +1 -0
- package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
- package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-storage.js +213 -0
- package/dist/harness/conversation/jsonl-storage.js.map +1 -0
- package/dist/harness/conversation/memory-repo.d.ts +18 -0
- package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
- package/dist/harness/conversation/memory-repo.js +45 -0
- package/dist/harness/conversation/memory-repo.js.map +1 -0
- package/dist/harness/conversation/memory-storage.d.ts +25 -0
- package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
- package/dist/harness/conversation/memory-storage.js +88 -0
- package/dist/harness/conversation/memory-storage.js.map +1 -0
- package/dist/harness/conversation/repo-utils.d.ts +13 -0
- package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
- package/dist/harness/conversation/repo-utils.js +39 -0
- package/dist/harness/conversation/repo-utils.js.map +1 -0
- package/dist/harness/conversation/storage-utils.d.ts +11 -0
- package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
- package/dist/harness/conversation/storage-utils.js +32 -0
- package/dist/harness/conversation/storage-utils.js.map +1 -0
- package/dist/harness/conversation/text-extraction.d.ts +8 -0
- package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
- package/dist/harness/conversation/text-extraction.js +24 -0
- package/dist/harness/conversation/text-extraction.js.map +1 -0
- package/dist/harness/conversation/uuid.d.ts +2 -0
- package/dist/harness/conversation/uuid.d.ts.map +1 -0
- package/dist/harness/conversation/uuid.js +54 -0
- package/dist/harness/conversation/uuid.js.map +1 -0
- package/dist/harness/conversation-writes.d.ts +9 -0
- package/dist/harness/conversation-writes.d.ts.map +1 -0
- package/dist/harness/conversation-writes.js +54 -0
- package/dist/harness/conversation-writes.js.map +1 -0
- package/dist/harness/env/nodejs.d.ts +53 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -0
- package/dist/harness/env/nodejs.js +497 -0
- package/dist/harness/env/nodejs.js.map +1 -0
- package/dist/harness/env/types.d.ts +106 -0
- package/dist/harness/env/types.d.ts.map +1 -0
- package/dist/harness/env/types.js +2 -0
- package/dist/harness/env/types.js.map +1 -0
- package/dist/harness/errors.d.ts +48 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +63 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/events.d.ts +238 -0
- package/dist/harness/events.d.ts.map +1 -0
- package/dist/harness/events.js +2 -0
- package/dist/harness/events.js.map +1 -0
- package/dist/harness/harness-configuration-methods.d.ts +36 -0
- package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
- package/dist/harness/harness-configuration-methods.js +145 -0
- package/dist/harness/harness-configuration-methods.js.map +1 -0
- package/dist/harness/harness-continuation.d.ts +18 -0
- package/dist/harness/harness-continuation.d.ts.map +1 -0
- package/dist/harness/harness-continuation.js +56 -0
- package/dist/harness/harness-continuation.js.map +1 -0
- package/dist/harness/harness-events.d.ts +23 -0
- package/dist/harness/harness-events.d.ts.map +1 -0
- package/dist/harness/harness-events.js +129 -0
- package/dist/harness/harness-events.js.map +1 -0
- package/dist/harness/harness-invocations.d.ts +20 -0
- package/dist/harness/harness-invocations.d.ts.map +1 -0
- package/dist/harness/harness-invocations.js +22 -0
- package/dist/harness/harness-invocations.js.map +1 -0
- package/dist/harness/harness-maintenance.d.ts +30 -0
- package/dist/harness/harness-maintenance.d.ts.map +1 -0
- package/dist/harness/harness-maintenance.js +155 -0
- package/dist/harness/harness-maintenance.js.map +1 -0
- package/dist/harness/harness-queue-methods.d.ts +45 -0
- package/dist/harness/harness-queue-methods.d.ts.map +1 -0
- package/dist/harness/harness-queue-methods.js +51 -0
- package/dist/harness/harness-queue-methods.js.map +1 -0
- package/dist/harness/messages.d.ts +76 -0
- package/dist/harness/messages.d.ts.map +1 -0
- package/dist/harness/messages.js +147 -0
- package/dist/harness/messages.js.map +1 -0
- package/dist/harness/options.d.ts +95 -0
- package/dist/harness/options.d.ts.map +1 -0
- package/dist/harness/options.js +2 -0
- package/dist/harness/options.js.map +1 -0
- package/dist/harness/prompt-templates.d.ts +49 -0
- package/dist/harness/prompt-templates.d.ts.map +1 -0
- package/dist/harness/prompt-templates.js +230 -0
- package/dist/harness/prompt-templates.js.map +1 -0
- package/dist/harness/result.d.ts +19 -0
- package/dist/harness/result.d.ts.map +1 -0
- package/dist/harness/result.js +32 -0
- package/dist/harness/result.js.map +1 -0
- package/dist/harness/run/messages.d.ts +5 -0
- package/dist/harness/run/messages.d.ts.map +1 -0
- package/dist/harness/run/messages.js +37 -0
- package/dist/harness/run/messages.js.map +1 -0
- package/dist/harness/skills/format.d.ts +6 -0
- package/dist/harness/skills/format.d.ts.map +1 -0
- package/dist/harness/skills/format.js +38 -0
- package/dist/harness/skills/format.js.map +1 -0
- package/dist/harness/skills/index.d.ts +5 -0
- package/dist/harness/skills/index.d.ts.map +1 -0
- package/dist/harness/skills/index.js +5 -0
- package/dist/harness/skills/index.js.map +1 -0
- package/dist/harness/skills/loader.d.ts +43 -0
- package/dist/harness/skills/loader.d.ts.map +1 -0
- package/dist/harness/skills/loader.js +279 -0
- package/dist/harness/skills/loader.js.map +1 -0
- package/dist/harness/skills/parser.d.ts +12 -0
- package/dist/harness/skills/parser.d.ts.map +1 -0
- package/dist/harness/skills/parser.js +22 -0
- package/dist/harness/skills/parser.js.map +1 -0
- package/dist/harness/skills/validation.d.ts +3 -0
- package/dist/harness/skills/validation.d.ts.map +1 -0
- package/dist/harness/skills/validation.js +28 -0
- package/dist/harness/skills/validation.js.map +1 -0
- package/dist/harness/skills.d.ts +2 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +2 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/stream-options.d.ts +5 -0
- package/dist/harness/stream-options.d.ts.map +1 -0
- package/dist/harness/stream-options.js +67 -0
- package/dist/harness/stream-options.js.map +1 -0
- package/dist/harness/system-prompt.d.ts +2 -0
- package/dist/harness/system-prompt.d.ts.map +1 -0
- package/dist/harness/system-prompt.js +2 -0
- package/dist/harness/system-prompt.js.map +1 -0
- package/dist/harness/turn-state.d.ts +27 -0
- package/dist/harness/turn-state.d.ts.map +1 -0
- package/dist/harness/turn-state.js +35 -0
- package/dist/harness/turn-state.js.map +1 -0
- package/dist/harness/types.d.ts +9 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +8 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/utils/env-path.d.ts +14 -0
- package/dist/harness/utils/env-path.d.ts.map +1 -0
- package/dist/harness/utils/env-path.js +99 -0
- package/dist/harness/utils/env-path.js.map +1 -0
- package/dist/harness/utils/shell-output.d.ts +16 -0
- package/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/dist/harness/utils/shell-output.js +137 -0
- package/dist/harness/utils/shell-output.js.map +1 -0
- package/dist/harness/utils/truncate.d.ts +70 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -0
- package/dist/harness/utils/truncate.js +289 -0
- package/dist/harness/utils/truncate.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +299 -0
- package/dist/proxy.js.map +1 -0
- package/dist/runtime/loop/agent-loop.d.ts +24 -0
- package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
- package/dist/runtime/loop/agent-loop.js +72 -0
- package/dist/runtime/loop/agent-loop.js.map +1 -0
- package/dist/runtime/loop/events.d.ts +5 -0
- package/dist/runtime/loop/events.d.ts.map +1 -0
- package/dist/runtime/loop/events.js +5 -0
- package/dist/runtime/loop/events.js.map +1 -0
- package/dist/runtime/loop/index.d.ts +6 -0
- package/dist/runtime/loop/index.d.ts.map +1 -0
- package/dist/runtime/loop/index.js +6 -0
- package/dist/runtime/loop/index.js.map +1 -0
- package/dist/runtime/loop/stream-assistant.d.ts +9 -0
- package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
- package/dist/runtime/loop/stream-assistant.js +87 -0
- package/dist/runtime/loop/stream-assistant.js.map +1 -0
- package/dist/runtime/loop/tool-execution.d.ts +15 -0
- package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
- package/dist/runtime/loop/tool-execution.js +271 -0
- package/dist/runtime/loop/tool-execution.js.map +1 -0
- package/dist/runtime/loop/turn-loop.d.ts +7 -0
- package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
- package/dist/runtime/loop/turn-loop.js +84 -0
- package/dist/runtime/loop/turn-loop.js.map +1 -0
- package/dist/runtime.d.ts +63 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +170 -0
- package/dist/runtime.js.map +1 -0
- package/dist/suspension.d.ts +18 -0
- package/dist/suspension.d.ts.map +1 -0
- package/dist/suspension.js +19 -0
- package/dist/suspension.js.map +1 -0
- package/dist/types.d.ts +395 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +88 -0
- package/dist/worker.js.map +1 -0
- 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"}
|