@code-yeongyu/senpi 2026.8.5 → 2026.8.7
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/CHANGELOG.md +93 -0
- package/dist/core/agent-abort-provenance.d.ts +20 -0
- package/dist/core/agent-abort-provenance.d.ts.map +1 -0
- package/dist/core/agent-abort-provenance.js +83 -0
- package/dist/core/agent-abort-provenance.js.map +1 -0
- package/dist/core/agent-session.d.ts +15 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +123 -80
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-settled-delivery.d.ts +9 -0
- package/dist/core/agent-settled-delivery.d.ts.map +1 -0
- package/dist/core/agent-settled-delivery.js +25 -0
- package/dist/core/agent-settled-delivery.js.map +1 -0
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts +2 -2
- package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/index.js +17 -20
- package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts +7 -12
- package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
- package/dist/core/extensions/builtin/bash-timeout/timeout.js +11 -19
- package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +3 -3
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts +8 -8
- package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/per-turn-cap.js +9 -16
- package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
- package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts +11 -0
- package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js +13 -0
- package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -0
- package/dist/core/extensions/builtin/goal/cache-warm.d.ts +0 -2
- package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/cache-warm.js +0 -34
- package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +2 -0
- package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +17 -19
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/last-assistant-message.d.ts +5 -0
- package/dist/core/extensions/builtin/goal/last-assistant-message.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/last-assistant-message.js +9 -0
- package/dist/core/extensions/builtin/goal/last-assistant-message.js.map +1 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation-types.d.ts +23 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation-types.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation-types.js +2 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation-types.js.map +1 -0
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +4 -10
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +31 -21
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts +3 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js +10 -0
- package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js +55 -11
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js +8 -5
- package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts +2 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.js +39 -7
- package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +1 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/bash.js +22 -10
- package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
- package/dist/core/extensions/builtin/terminal/tools/foreground-window.d.ts +11 -0
- package/dist/core/extensions/builtin/terminal/tools/foreground-window.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/foreground-window.js +16 -0
- package/dist/core/extensions/builtin/terminal/tools/foreground-window.js.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/sleep-wait.d.ts +28 -0
- package/dist/core/extensions/builtin/terminal/tools/sleep-wait.d.ts.map +1 -0
- package/dist/core/extensions/builtin/terminal/tools/sleep-wait.js +75 -0
- package/dist/core/extensions/builtin/terminal/tools/sleep-wait.js.map +1 -0
- package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
- package/dist/core/extensions/builtin/tps.js +3 -3
- package/dist/core/extensions/builtin/tps.js.map +1 -1
- package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/ttsr/index.js +35 -34
- package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +2 -2
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/retry-fallback/hint-policy.d.ts +14 -0
- package/dist/core/retry-fallback/hint-policy.d.ts.map +1 -1
- package/dist/core/retry-fallback/hint-policy.js +14 -0
- package/dist/core/retry-fallback/hint-policy.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +0 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +8 -128
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/assistant-render-descriptors.d.ts +17 -0
- package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-render-descriptors.js +133 -0
- package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +41 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +2 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js +14 -1
- package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { AgentEndEvent, ExtensionContext } from "../../types.ts";
|
|
3
|
+
import type { GoalContinuationVerdict } from "./continuation.ts";
|
|
4
|
+
import type { Goal } from "./types.ts";
|
|
5
|
+
import type { GoalWaitKind } from "./wait-progress.ts";
|
|
6
|
+
export interface AgentEndOptions {
|
|
7
|
+
readonly ctx: ExtensionContext;
|
|
8
|
+
readonly goal: Goal | null;
|
|
9
|
+
readonly messages: readonly AgentMessage[];
|
|
10
|
+
}
|
|
11
|
+
export interface SystemAbortOptions extends AgentEndOptions {
|
|
12
|
+
readonly event: AgentEndEvent;
|
|
13
|
+
readonly willRetry: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type ContinuingGoalContinuationVerdict = Extract<GoalContinuationVerdict, {
|
|
16
|
+
kind: "continue";
|
|
17
|
+
}>;
|
|
18
|
+
export type DelayedContinuationKind = GoalWaitKind;
|
|
19
|
+
export type GoalContinuationAdmission = {
|
|
20
|
+
readonly goal: Goal;
|
|
21
|
+
readonly admitted: boolean;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=monitor-continuation-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor-continuation-types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/monitor-continuation-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IAC1D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,iCAAiC,GAAG,OAAO,CAAC,uBAAuB,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AACvG,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAEnD,MAAM,MAAM,yBAAyB,GAAG;IACvC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor-continuation-types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/monitor-continuation-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentEndEvent, ExtensionContext } from \"../../types.ts\";\nimport type { GoalContinuationVerdict } from \"./continuation.ts\";\nimport type { Goal } from \"./types.ts\";\nimport type { GoalWaitKind } from \"./wait-progress.ts\";\n\nexport interface AgentEndOptions {\n\treadonly ctx: ExtensionContext;\n\treadonly goal: Goal | null;\n\treadonly messages: readonly AgentMessage[];\n}\n\nexport interface SystemAbortOptions extends AgentEndOptions {\n\treadonly event: AgentEndEvent;\n\treadonly willRetry: boolean;\n}\n\nexport type ContinuingGoalContinuationVerdict = Extract<GoalContinuationVerdict, { kind: \"continue\" }>;\nexport type DelayedContinuationKind = GoalWaitKind;\n\nexport type GoalContinuationAdmission = {\n\treadonly goal: Goal;\n\treadonly admitted: boolean;\n};\n"]}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
1
|
import type { ExtensionAPI, ExtensionContext } from "../../types.ts";
|
|
2
|
+
import type { AgentEndOptions, SystemAbortOptions } from "./monitor-continuation-types.ts";
|
|
3
3
|
import type { Goal } from "./types.ts";
|
|
4
4
|
import type { GoalWaitTicker } from "./wait-ticker.ts";
|
|
5
5
|
export declare const GOAL_MONITOR_CONTINUATION_DELAY_MS = 240000;
|
|
6
6
|
export declare const GOAL_CONTINUATION_SCHEDULED_EVENT = "goal_continuation_scheduled";
|
|
7
7
|
export declare const GOAL_CONTINUATION_RESUMED_EVENT = "goal_continuation_resumed";
|
|
8
|
-
export declare const GOAL_MONITOR_CONTINUATION_NOTICE = "Goal continuation scheduled in 4 minutes while a monitor is active.";
|
|
9
|
-
export declare const GOAL_MONITOR_STALL_THRESHOLD = 3;
|
|
10
8
|
export declare const GOAL_MONITOR_STALL_EVENT = "goal_monitor_continuation_stall";
|
|
11
|
-
interface AgentEndOptions {
|
|
12
|
-
readonly ctx: ExtensionContext;
|
|
13
|
-
readonly goal: Goal | null;
|
|
14
|
-
readonly messages: readonly AgentMessage[];
|
|
15
|
-
}
|
|
16
9
|
export declare class MonitorAwareGoalContinuation {
|
|
17
10
|
#private;
|
|
18
11
|
constructor(pi: ExtensionAPI, isContinuationPending?: () => boolean, markContinuationPending?: () => void, waitTicker?: GoalWaitTicker);
|
|
19
12
|
start(ctx: ExtensionContext): void;
|
|
20
13
|
afterAgentEnd(options: AgentEndOptions): Promise<Goal | null>;
|
|
14
|
+
afterSystemAbort(options: SystemAbortOptions): Promise<Goal | null>;
|
|
15
|
+
afterAgentSettled(): Promise<Goal | null | undefined>;
|
|
21
16
|
syncGoal(goal: Goal | null): void;
|
|
22
17
|
/** Temporarily prevents a scheduled continuation from racing unresolved direct-input admission. */
|
|
23
18
|
holdDirectInput(inputId: string): void;
|
|
@@ -25,9 +20,8 @@ export declare class MonitorAwareGoalContinuation {
|
|
|
25
20
|
resolveDirectInput(inputId: string, accepted: boolean): void;
|
|
26
21
|
/** An accepted real user prompt starts a grace-governed user turn. */
|
|
27
22
|
noteUserPrompt(): void;
|
|
28
|
-
/** A
|
|
23
|
+
/** A hidden continuation or system recovery has started, so the next end is not user-initiated. */
|
|
29
24
|
noteContinuationStarted(): void;
|
|
30
25
|
dispose(): void;
|
|
31
26
|
}
|
|
32
|
-
export {};
|
|
33
27
|
//# sourceMappingURL=monitor-continuation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor-continuation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/monitor-continuation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"monitor-continuation.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/monitor-continuation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAwBrE,OAAO,KAAK,EACX,eAAe,EAIf,kBAAkB,EAClB,MAAM,iCAAiC,CAAC;AAKzC,OAAO,KAAK,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,eAAO,MAAM,kCAAkC,SAAU,CAAC;AAC1D,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAC/E,eAAO,MAAM,+BAA+B,8BAA8B,CAAC;AAC3E,eAAO,MAAM,wBAAwB,oCAAoC,CAAC;AAE1E,qBAAa,4BAA4B;;IAyBxC,YACC,EAAE,EAAE,YAAY,EAChB,qBAAqB,GAAE,MAAM,OAAqB,EAClD,uBAAuB,GAAE,MAAM,IAAe,EAC9C,UAAU,CAAC,EAAE,cAAc,EAM3B;IAED,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAuBjC;IAEK,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAsDlE;IAEK,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAaxE;IAEK,iBAAiB,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAK1D;IAED,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAOhC;IAED,mGAAmG;IACnG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAkBrC;IAED,6FAA6F;IAC7F,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAW3D;IAED,sEAAsE;IACtE,cAAc,IAAI,IAAI,CAIrB;IAED,mGAAmG;IACnG,uBAAuB,IAAI,IAAI,CAE9B;IAED,OAAO,IAAI,IAAI,CAUd;CAuND"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isTerminalMonitorStateEvent, TERMINAL_MONITOR_STATE_EVENT } from "../monitor-state-event.js";
|
|
2
|
-
import {
|
|
3
|
-
import { continuationTurnUsedTools, evaluateGoalContinuation,
|
|
2
|
+
import { estimateCacheWarmMetrics, GOAL_CACHE_WARMUP_ENTRY_TYPE, } from "./cache-warm.js";
|
|
3
|
+
import { continuationTurnUsedTools, evaluateGoalContinuation, GOAL_USER_GRACE_DELAY_MS, hasGoalContinuationProgress, hashAssistantText, normalizeAssistantText, } from "./continuation.js";
|
|
4
|
+
import { lastAssistantMessage } from "./last-assistant-message.js";
|
|
4
5
|
import { admitAndQueueGoalContinuation, buildCurrentGoalContinuationSignature, lastAssistantText, } from "./lifecycle-helpers.js";
|
|
5
6
|
import { buildContinuationPrompt, buildGoalStallNotice, buildTruncationRecoveryPrompt } from "./prompt.js";
|
|
6
7
|
import { resetContinuationStreak } from "./store.js";
|
|
@@ -9,8 +10,6 @@ import { collectAssistantUsage } from "./turn-usage.js";
|
|
|
9
10
|
export const GOAL_MONITOR_CONTINUATION_DELAY_MS = 240_000;
|
|
10
11
|
export const GOAL_CONTINUATION_SCHEDULED_EVENT = "goal_continuation_scheduled";
|
|
11
12
|
export const GOAL_CONTINUATION_RESUMED_EVENT = "goal_continuation_resumed";
|
|
12
|
-
export const GOAL_MONITOR_CONTINUATION_NOTICE = "Goal continuation scheduled in 4 minutes while a monitor is active.";
|
|
13
|
-
export const GOAL_MONITOR_STALL_THRESHOLD = GOAL_STALL_TOOLLESS_THRESHOLD;
|
|
14
13
|
export const GOAL_MONITOR_STALL_EVENT = "goal_monitor_continuation_stall";
|
|
15
14
|
export class MonitorAwareGoalContinuation {
|
|
16
15
|
#pi;
|
|
@@ -35,6 +34,7 @@ export class MonitorAwareGoalContinuation {
|
|
|
35
34
|
#scheduledCache;
|
|
36
35
|
#heldTimer;
|
|
37
36
|
#directInputHolds = new Set();
|
|
37
|
+
#pendingSystemRecovery;
|
|
38
38
|
constructor(pi, isContinuationPending = () => false, markContinuationPending = () => { }, waitTicker) {
|
|
39
39
|
this.#pi = pi;
|
|
40
40
|
this.#isContinuationPending = isContinuationPending;
|
|
@@ -123,6 +123,29 @@ export class MonitorAwareGoalContinuation {
|
|
|
123
123
|
this.#schedule(goal, "monitor");
|
|
124
124
|
return goal;
|
|
125
125
|
}
|
|
126
|
+
async afterSystemAbort(options) {
|
|
127
|
+
this.noteContinuationStarted();
|
|
128
|
+
this.#pendingSystemRecovery = undefined;
|
|
129
|
+
this.#ctx = options.ctx;
|
|
130
|
+
this.#goal = options.goal;
|
|
131
|
+
this.#lastAgentEndMessages = options.messages;
|
|
132
|
+
this.#lastTurnUsage = collectAssistantUsage([...options.messages]);
|
|
133
|
+
if (options.willRetry || options.goal?.status !== "active")
|
|
134
|
+
return options.goal;
|
|
135
|
+
if (this.#activeMonitorCount > 0)
|
|
136
|
+
this.#schedule(options.goal, "monitor");
|
|
137
|
+
else if (lastAssistantMessage(options.messages)?.stopReason === "error") {
|
|
138
|
+
this.#pendingSystemRecovery = options;
|
|
139
|
+
}
|
|
140
|
+
return options.goal;
|
|
141
|
+
}
|
|
142
|
+
async afterAgentSettled() {
|
|
143
|
+
const pending = this.#pendingSystemRecovery;
|
|
144
|
+
this.#pendingSystemRecovery = undefined;
|
|
145
|
+
if (pending === undefined || pending.goal === null || pending.event.abortSource === "user")
|
|
146
|
+
return undefined;
|
|
147
|
+
return (await this.#admitAndQueue(pending.ctx, pending.goal, "systemRecovery", pending.messages)).goal;
|
|
148
|
+
}
|
|
126
149
|
syncGoal(goal) {
|
|
127
150
|
if (goal?.id !== this.#goal?.id)
|
|
128
151
|
this.#resetContinuationState();
|
|
@@ -172,7 +195,7 @@ export class MonitorAwareGoalContinuation {
|
|
|
172
195
|
this.#endedTurnWasUserInitiated = true;
|
|
173
196
|
this.#resetContinuationState();
|
|
174
197
|
}
|
|
175
|
-
/** A
|
|
198
|
+
/** A hidden continuation or system recovery has started, so the next end is not user-initiated. */
|
|
176
199
|
noteContinuationStarted() {
|
|
177
200
|
this.#endedTurnWasUserInitiated = false;
|
|
178
201
|
}
|
|
@@ -195,9 +218,6 @@ export class MonitorAwareGoalContinuation {
|
|
|
195
218
|
const cache = estimateCacheWarmMetrics(this.#ctx?.model, process.env, this.#lastTurnUsage);
|
|
196
219
|
this.#scheduledCache = cache;
|
|
197
220
|
this.#scheduledAtMs = Date.now();
|
|
198
|
-
if (this.#ctx?.hasUI) {
|
|
199
|
-
this.#ctx.ui.notify(buildCacheWarmScheduledNotice(delayMs, this.#activeMonitorCount, cache), "info");
|
|
200
|
-
}
|
|
201
221
|
this.#pi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT, {
|
|
202
222
|
goalId: goal.id,
|
|
203
223
|
delayMs,
|
|
@@ -277,9 +297,6 @@ export class MonitorAwareGoalContinuation {
|
|
|
277
297
|
activeMonitorCount: this.#activeMonitorCount,
|
|
278
298
|
...(cache !== undefined ? { cache } : {}),
|
|
279
299
|
});
|
|
280
|
-
if (ctx.hasUI) {
|
|
281
|
-
ctx.ui.notify(buildCacheWarmResumedNotice(waitedMs, this.#activeMonitorCount, cache), "info");
|
|
282
|
-
}
|
|
283
300
|
}
|
|
284
301
|
async #admitAndQueue(ctx, goal, path, messages) {
|
|
285
302
|
const input = this.#buildVerdictInput(ctx, goal, path, messages);
|
|
@@ -303,7 +320,7 @@ export class MonitorAwareGoalContinuation {
|
|
|
303
320
|
this.#pi.appendEntry?.(GOAL_CACHE_WARMUP_ENTRY_TYPE, data);
|
|
304
321
|
}
|
|
305
322
|
#buildVerdictInput(ctx, goal, path, messages) {
|
|
306
|
-
const lastAssistant =
|
|
323
|
+
const lastAssistant = lastAssistantMessage(messages);
|
|
307
324
|
return {
|
|
308
325
|
isIdle: ctx.isIdle(),
|
|
309
326
|
hasPendingMessages: ctx.hasPendingMessages(),
|
|
@@ -360,11 +377,12 @@ export class MonitorAwareGoalContinuation {
|
|
|
360
377
|
this.#toollessContinuationStreak += 1;
|
|
361
378
|
}
|
|
362
379
|
#resetLengthRecoveryAfterCleanStop(goal, messages) {
|
|
363
|
-
if (goal === null ||
|
|
380
|
+
if (goal === null || lastAssistantMessage(messages)?.stopReason !== "stop")
|
|
364
381
|
return;
|
|
365
382
|
this.#consecutiveLengthRecoveries.delete(goal.id);
|
|
366
383
|
}
|
|
367
384
|
#resetContinuationState() {
|
|
385
|
+
this.#pendingSystemRecovery = undefined;
|
|
368
386
|
this.#consecutiveLengthRecoveries.clear();
|
|
369
387
|
this.#recentNormalizedOutputHashes = [];
|
|
370
388
|
this.#resetToollessContinuationStreak();
|
|
@@ -385,12 +403,4 @@ export class MonitorAwareGoalContinuation {
|
|
|
385
403
|
this.#waitTicker?.stop();
|
|
386
404
|
}
|
|
387
405
|
}
|
|
388
|
-
function findLastAssistantMessage(messages) {
|
|
389
|
-
for (let index = messages.length - 1; index >= 0; index--) {
|
|
390
|
-
const message = messages[index];
|
|
391
|
-
if (message?.role === "assistant")
|
|
392
|
-
return message;
|
|
393
|
-
}
|
|
394
|
-
return undefined;
|
|
395
|
-
}
|
|
396
406
|
//# sourceMappingURL=monitor-continuation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor-continuation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/monitor-continuation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isTerminalMonitorStateEvent, TERMINAL_MONITOR_STATE_EVENT } from \"../monitor-state-event.ts\";\nimport {\n\tbuildCacheWarmResumedNotice,\n\tbuildCacheWarmScheduledNotice,\n\testimateCacheWarmMetrics,\n\tGOAL_CACHE_WARMUP_ENTRY_TYPE,\n\ttype GoalCacheWarmMetrics,\n\ttype GoalCacheWarmupEntryData,\n} from \"./cache-warm.ts\";\nimport {\n\tcontinuationTurnUsedTools,\n\tevaluateGoalContinuation,\n\tGOAL_STALL_TOOLLESS_THRESHOLD,\n\tGOAL_USER_GRACE_DELAY_MS,\n\ttype GoalContinuationInput,\n\ttype GoalContinuationPath,\n\ttype GoalContinuationVerdict,\n\thasGoalContinuationProgress,\n\thashAssistantText,\n\tnormalizeAssistantText,\n} from \"./continuation.ts\";\nimport {\n\tadmitAndQueueGoalContinuation,\n\tbuildCurrentGoalContinuationSignature,\n\tlastAssistantText,\n} from \"./lifecycle-helpers.ts\";\nimport { buildContinuationPrompt, buildGoalStallNotice, buildTruncationRecoveryPrompt } from \"./prompt.ts\";\nimport { resetContinuationStreak } from \"./store.ts\";\nimport { goalStoreRef } from \"./store-ref.ts\";\nimport { collectAssistantUsage } from \"./turn-usage.ts\";\nimport type { Goal, TokenUsageSnapshot } from \"./types.ts\";\nimport type { GoalWaitKind } from \"./wait-progress.ts\";\nimport type { GoalWaitTicker } from \"./wait-ticker.ts\";\n\nexport const GOAL_MONITOR_CONTINUATION_DELAY_MS = 240_000;\nexport const GOAL_CONTINUATION_SCHEDULED_EVENT = \"goal_continuation_scheduled\";\nexport const GOAL_CONTINUATION_RESUMED_EVENT = \"goal_continuation_resumed\";\nexport const GOAL_MONITOR_CONTINUATION_NOTICE = \"Goal continuation scheduled in 4 minutes while a monitor is active.\";\nexport const GOAL_MONITOR_STALL_THRESHOLD = GOAL_STALL_TOOLLESS_THRESHOLD;\nexport const GOAL_MONITOR_STALL_EVENT = \"goal_monitor_continuation_stall\";\n\ninterface AgentEndOptions {\n\treadonly ctx: ExtensionContext;\n\treadonly goal: Goal | null;\n\treadonly messages: readonly AgentMessage[];\n}\n\ntype ContinuingGoalContinuationVerdict = Extract<GoalContinuationVerdict, { kind: \"continue\" }>;\ntype DelayedContinuationKind = GoalWaitKind;\n\ntype GoalContinuationAdmission = {\n\treadonly goal: Goal;\n\treadonly admitted: boolean;\n};\n\nexport class MonitorAwareGoalContinuation {\n\treadonly #pi: ExtensionAPI;\n\treadonly #isContinuationPending: () => boolean;\n\treadonly #markContinuationPending: () => void;\n\treadonly #waitTicker: GoalWaitTicker | undefined;\n\t#activeMonitorCount = 0;\n\t#ctx: ExtensionContext | undefined;\n\t#goal: Goal | null = null;\n\t#timer: ReturnType<typeof setTimeout> | undefined;\n\t#scheduledContinuationKind: DelayedContinuationKind | undefined;\n\t#unsubscribeMonitorState: (() => void) | undefined;\n\t#lastAgentEndMessages: readonly AgentMessage[] = [];\n\t#consecutiveLengthRecoveries = new Map<string, number>();\n\t#recentNormalizedOutputHashes: string[] = [];\n\t#toollessContinuationStreak = 0;\n\t#toollessStreakGoalId: string | null = null;\n\t#endedTurnWasUserInitiated = false;\n\t#lastTurnUsage: TokenUsageSnapshot | undefined;\n\t#scheduledAtMs: number | undefined;\n\t#scheduledDueAtMs: number | undefined;\n\t#scheduledCache: GoalCacheWarmMetrics | undefined;\n\t#heldTimer: { kind: DelayedContinuationKind; remainingMs: number } | undefined;\n\t#directInputHolds = new Set<string>();\n\n\tconstructor(\n\t\tpi: ExtensionAPI,\n\t\tisContinuationPending: () => boolean = () => false,\n\t\tmarkContinuationPending: () => void = () => {},\n\t\twaitTicker?: GoalWaitTicker,\n\t) {\n\t\tthis.#pi = pi;\n\t\tthis.#isContinuationPending = isContinuationPending;\n\t\tthis.#markContinuationPending = markContinuationPending;\n\t\tthis.#waitTicker = waitTicker;\n\t}\n\n\tstart(ctx: ExtensionContext): void {\n\t\tthis.#cancelTimer();\n\t\tthis.#unsubscribeMonitorState?.();\n\t\tthis.#ctx = ctx;\n\t\tthis.#activeMonitorCount = 0;\n\t\tthis.#goal = null;\n\t\tthis.#lastAgentEndMessages = [];\n\t\tthis.#directInputHolds.clear();\n\t\tthis.#resetContinuationState();\n\t\tconst events = this.#pi.events;\n\t\tif (events === undefined) return;\n\t\tthis.#unsubscribeMonitorState = events.on(TERMINAL_MONITOR_STATE_EVENT, (data) => {\n\t\t\tif (!isTerminalMonitorStateEvent(data)) return;\n\t\t\tthis.#activeMonitorCount = data.activeCount;\n\t\t\tif (data.activeCount === 0) {\n\t\t\t\tif (this.#scheduledContinuationKind === \"monitor\") this.#cancelTimer();\n\t\t\t\tthis.#resetToollessContinuationStreak();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#scheduledContinuationKind === \"monitor\") {\n\t\t\t\tthis.#waitTicker?.setActiveMonitorCount(data.activeCount);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync afterAgentEnd(options: AgentEndOptions): Promise<Goal | null> {\n\t\tif (options.goal?.id !== this.#goal?.id) this.#resetToollessContinuationStreak();\n\t\tthis.#ctx = options.ctx;\n\t\tthis.#goal = options.goal;\n\t\tthis.#lastAgentEndMessages = options.messages;\n\t\tthis.#lastTurnUsage = collectAssistantUsage([...options.messages]);\n\t\tthis.#resetLengthRecoveryAfterCleanStop(options.goal, options.messages);\n\t\tconst turnUsedTools = continuationTurnUsedTools(options.messages);\n\t\tthis.#recordAssistantOutput(options.messages, turnUsedTools);\n\t\tif (options.goal?.status !== \"active\") {\n\t\t\tthis.#cancelTimer();\n\t\t\treturn options.goal;\n\t\t}\n\t\tthis.#recordToollessContinuationTurn(options.goal, turnUsedTools);\n\t\tconst immediateInput = this.#buildVerdictInput(options.ctx, options.goal, \"immediate\", options.messages);\n\t\tconst goal =\n\t\t\t!this.#endedTurnWasUserInitiated && (turnUsedTools || hasGoalContinuationProgress(immediateInput))\n\t\t\t\t? ((await resetContinuationStreak(goalStoreRef(options.ctx.sessionManager, options.ctx.cwd))) ??\n\t\t\t\t\toptions.goal)\n\t\t\t\t: options.goal;\n\t\tthis.#goal = goal;\n\t\tconst immediateVerdict = evaluateGoalContinuation({\n\t\t\tgoal,\n\t\t\t...this.#buildVerdictInput(options.ctx, goal, \"immediate\", options.messages),\n\t\t});\n\t\tif (this.#endedTurnWasUserInitiated) {\n\t\t\tthis.#endedTurnWasUserInitiated = false;\n\t\t\tthis.#cancelTimer();\n\t\t\tif (immediateVerdict.kind === \"continue\") {\n\t\t\t\tthis.#schedule(goal, \"userGrace\");\n\t\t\t\treturn goal;\n\t\t\t}\n\t\t\tswitch (immediateVerdict.reason) {\n\t\t\t\tcase \"not-eligible\":\n\t\t\t\tcase \"single-flight\":\n\t\t\t\tcase \"stale\":\n\t\t\t\t\treturn goal;\n\t\t\t\tcase \"cap\":\n\t\t\t\tcase \"repetition\":\n\t\t\t\tcase \"length-exhausted\": {\n\t\t\t\t\tconst admission = await this.#admitAndQueue(options.ctx, goal, \"immediate\", options.messages);\n\t\t\t\t\treturn admission.goal;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (immediateVerdict.kind === \"deny\" && immediateVerdict.reason === \"not-eligible\") return goal;\n\n\t\tif (this.#activeMonitorCount === 0) {\n\t\t\tthis.#cancelTimer();\n\t\t\tconst admission = await this.#admitAndQueue(options.ctx, goal, \"immediate\", options.messages);\n\t\t\treturn admission.goal;\n\t\t}\n\t\tthis.#schedule(goal, \"monitor\");\n\t\treturn goal;\n\t}\n\n\tsyncGoal(goal: Goal | null): void {\n\t\tif (goal?.id !== this.#goal?.id) this.#resetContinuationState();\n\t\tthis.#goal = goal;\n\t\tif (goal?.status !== \"active\") {\n\t\t\tthis.#cancelTimer();\n\t\t\tthis.#resetContinuationState();\n\t\t}\n\t}\n\n\t/** Temporarily prevents a scheduled continuation from racing unresolved direct-input admission. */\n\tholdDirectInput(inputId: string): void {\n\t\tif (this.#directInputHolds.has(inputId)) return;\n\t\tthis.#directInputHolds.add(inputId);\n\t\tif (\n\t\t\tthis.#directInputHolds.size !== 1 ||\n\t\t\tthis.#timer === undefined ||\n\t\t\tthis.#scheduledContinuationKind === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#heldTimer = {\n\t\t\tkind: this.#scheduledContinuationKind,\n\t\t\tremainingMs: Math.max(0, (this.#scheduledDueAtMs ?? Date.now()) - Date.now()),\n\t\t};\n\t\tclearTimeout(this.#timer);\n\t\tthis.#timer = undefined;\n\t\tthis.#scheduledDueAtMs = undefined;\n\t\tthis.#waitTicker?.stop();\n\t}\n\n\t/** Resolves one admission hold without allowing overlapping inputs to consume each other. */\n\tresolveDirectInput(inputId: string, accepted: boolean): void {\n\t\tif (!this.#directInputHolds.delete(inputId)) return;\n\t\tif (accepted) {\n\t\t\tthis.#heldTimer = undefined;\n\t\t\tthis.noteUserPrompt();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#directInputHolds.size > 0 || this.#heldTimer === undefined) return;\n\t\tconst held = this.#heldTimer;\n\t\tthis.#heldTimer = undefined;\n\t\tthis.#armTimer(held.kind, held.remainingMs);\n\t}\n\n\t/** An accepted real user prompt starts a grace-governed user turn. */\n\tnoteUserPrompt(): void {\n\t\tthis.#cancelTimer();\n\t\tthis.#endedTurnWasUserInitiated = true;\n\t\tthis.#resetContinuationState();\n\t}\n\n\t/** A queued hidden continuation has started, so the next end is not user-initiated. */\n\tnoteContinuationStarted(): void {\n\t\tthis.#endedTurnWasUserInitiated = false;\n\t}\n\n\tdispose(): void {\n\t\tthis.#cancelTimer();\n\t\tthis.#unsubscribeMonitorState?.();\n\t\tthis.#unsubscribeMonitorState = undefined;\n\t\tthis.#ctx = undefined;\n\t\tthis.#goal = null;\n\t\tthis.#activeMonitorCount = 0;\n\t\tthis.#lastAgentEndMessages = [];\n\t\tthis.#directInputHolds.clear();\n\t\tthis.#resetContinuationState();\n\t}\n\n\t#schedule(goal: Goal, kind: DelayedContinuationKind): void {\n\t\tif (this.#scheduledContinuationKind !== undefined) return;\n\t\tconst delayMs = kind === \"monitor\" ? GOAL_MONITOR_CONTINUATION_DELAY_MS : GOAL_USER_GRACE_DELAY_MS;\n\t\tif (kind === \"monitor\") {\n\t\t\tconst cache = estimateCacheWarmMetrics(this.#ctx?.model, process.env, this.#lastTurnUsage);\n\t\t\tthis.#scheduledCache = cache;\n\t\t\tthis.#scheduledAtMs = Date.now();\n\t\t\tif (this.#ctx?.hasUI) {\n\t\t\t\tthis.#ctx.ui.notify(buildCacheWarmScheduledNotice(delayMs, this.#activeMonitorCount, cache), \"info\");\n\t\t\t}\n\t\t\tthis.#pi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT, {\n\t\t\t\tgoalId: goal.id,\n\t\t\t\tdelayMs,\n\t\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t\tcache,\n\t\t\t});\n\t\t\tthis.#appendWarmupEntry({\n\t\t\t\tphase: \"scheduled\",\n\t\t\t\tgoalId: goal.id,\n\t\t\t\tdelayMs,\n\t\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t\t...(cache !== undefined ? { cache } : {}),\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#scheduledAtMs = undefined;\n\t\t\tthis.#scheduledCache = undefined;\n\t\t}\n\t\tthis.#scheduledContinuationKind = kind;\n\t\tif (this.#directInputHolds.size > 0) {\n\t\t\tthis.#heldTimer = { kind, remainingMs: delayMs };\n\t\t\treturn;\n\t\t}\n\t\tthis.#armTimer(kind, delayMs);\n\t}\n\n\t#armTimer(kind: DelayedContinuationKind, delayMs: number): void {\n\t\tthis.#scheduledDueAtMs = Date.now() + delayMs;\n\t\tconst ctx = this.#ctx;\n\t\tif (ctx?.hasUI) {\n\t\t\tthis.#waitTicker?.sync(ctx, {\n\t\t\t\tkind,\n\t\t\t\tremainingMs: delayMs,\n\t\t\t\ttotalMs: kind === \"monitor\" ? GOAL_MONITOR_CONTINUATION_DELAY_MS : GOAL_USER_GRACE_DELAY_MS,\n\t\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t});\n\t\t}\n\t\tthis.#timer = setTimeout(() => {\n\t\t\tvoid this.#continueIfEligible(kind).catch((error: unknown) => {\n\t\t\t\tif (this.#ctx?.hasUI) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tthis.#ctx.ui.notify(`Goal continuation delivery failed: ${message}`, \"error\");\n\t\t\t\t}\n\t\t\t});\n\t\t}, delayMs);\n\t}\n\n\tasync #continueIfEligible(kind: DelayedContinuationKind): Promise<void> {\n\t\tthis.#timer = undefined;\n\t\tthis.#scheduledDueAtMs = undefined;\n\t\tthis.#scheduledContinuationKind = undefined;\n\t\tthis.#waitTicker?.stop();\n\t\tconst delayMs = kind === \"monitor\" ? GOAL_MONITOR_CONTINUATION_DELAY_MS : GOAL_USER_GRACE_DELAY_MS;\n\t\tconst waitedMs = this.#scheduledAtMs === undefined ? delayMs : Math.max(0, Date.now() - this.#scheduledAtMs);\n\t\tconst cache = this.#scheduledCache;\n\t\tthis.#scheduledAtMs = undefined;\n\t\tthis.#scheduledCache = undefined;\n\t\tconst ctx = this.#ctx;\n\t\tconst goal = this.#goal;\n\t\tif (ctx === undefined || goal?.status !== \"active\" || !ctx.isIdle() || ctx.hasPendingMessages()) return;\n\t\tif (kind === \"monitor\" && this.#activeMonitorCount === 0) return;\n\t\tconst admission = await this.#admitAndQueue(\n\t\t\tctx,\n\t\t\tgoal,\n\t\t\tkind === \"monitor\" ? \"monitorDelayed\" : \"userGrace\",\n\t\t\tthis.#lastAgentEndMessages,\n\t\t);\n\t\tif (kind !== \"monitor\" || !admission.admitted) return;\n\t\tthis.#pi.events?.emit(GOAL_CONTINUATION_RESUMED_EVENT, {\n\t\t\tgoalId: goal.id,\n\t\t\tdelayMs,\n\t\t\twaitedMs,\n\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\tcache,\n\t\t});\n\t\tthis.#appendWarmupEntry({\n\t\t\tphase: \"resumed\",\n\t\t\tgoalId: goal.id,\n\t\t\tdelayMs,\n\t\t\twaitedMs,\n\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t...(cache !== undefined ? { cache } : {}),\n\t\t});\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(buildCacheWarmResumedNotice(waitedMs, this.#activeMonitorCount, cache), \"info\");\n\t\t}\n\t}\n\n\tasync #admitAndQueue(\n\t\tctx: ExtensionContext,\n\t\tgoal: Goal,\n\t\tpath: GoalContinuationPath,\n\t\tmessages: readonly AgentMessage[],\n\t): Promise<GoalContinuationAdmission> {\n\t\tconst input = this.#buildVerdictInput(ctx, goal, path, messages);\n\t\tconst verdict = evaluateGoalContinuation({ goal, ...input });\n\t\tconst admittedGoal = await admitAndQueueGoalContinuation(this.#pi, ctx, goal, {\n\t\t\tinput,\n\t\t\tcontent: (continuationVerdict) => this.#buildContinuationContent(ctx, goal, continuationVerdict),\n\t\t\tmarkContinuationPending: this.#markContinuationPending,\n\t\t});\n\t\tif (verdict.kind === \"continue\" && input.lastStopReason === \"length\") {\n\t\t\tthis.#consecutiveLengthRecoveries.set(goal.id, input.consecutiveLengthRecoveries + 1);\n\t\t}\n\t\tthis.#goal = admittedGoal;\n\t\tif (admittedGoal.status !== \"active\") {\n\t\t\tthis.#cancelTimer();\n\t\t\tthis.#resetToollessContinuationStreak();\n\t\t}\n\t\treturn { goal: admittedGoal, admitted: verdict.kind === \"continue\" };\n\t}\n\n\t#appendWarmupEntry(data: GoalCacheWarmupEntryData): void {\n\t\tthis.#pi.appendEntry?.<GoalCacheWarmupEntryData>(GOAL_CACHE_WARMUP_ENTRY_TYPE, data);\n\t}\n\n\t#buildVerdictInput(\n\t\tctx: ExtensionContext,\n\t\tgoal: Goal,\n\t\tpath: GoalContinuationPath,\n\t\tmessages: readonly AgentMessage[],\n\t): Omit<GoalContinuationInput, \"goal\"> {\n\t\tconst lastAssistant = findLastAssistantMessage(messages);\n\t\treturn {\n\t\t\tisIdle: ctx.isIdle(),\n\t\t\thasPendingMessages: ctx.hasPendingMessages(),\n\t\t\tpath,\n\t\t\tlastStopReason: lastAssistant?.stopReason,\n\t\t\tconsecutiveContinuations: goal.consecutiveContinuations ?? 0,\n\t\t\tlastContinuationSignature: goal.lastContinuationSignature,\n\t\t\tcurrentSignature: buildCurrentGoalContinuationSignature(ctx, goal, lastAssistantText(messages)),\n\t\t\tconsecutiveLengthRecoveries: this.#consecutiveLengthRecoveries.get(goal.id) ?? 0,\n\t\t\trecentNormalizedOutputHashes: this.#recentNormalizedOutputHashes,\n\t\t\ttoollessContinuationStreak: this.#toollessContinuationStreak,\n\t\t\tcontinuationPending: this.#isContinuationPending(),\n\t\t};\n\t}\n\n\t#buildContinuationContent(ctx: ExtensionContext, goal: Goal, verdict: ContinuingGoalContinuationVerdict): string {\n\t\tlet content = verdict.prompt === \"minimal\" ? buildTruncationRecoveryPrompt() : buildContinuationPrompt(goal);\n\t\tif (!verdict.stallNotice) return content;\n\n\t\tconst monitorsActive = this.#activeMonitorCount > 0;\n\t\tthis.#pi.events?.emit(GOAL_MONITOR_STALL_EVENT, {\n\t\t\tgoalId: goal.id,\n\t\t\tconsecutiveContinuations: this.#toollessContinuationStreak,\n\t\t\ttoolless: true,\n\t\t});\n\t\tif (ctx.hasUI) {\n\t\t\tconst context = monitorsActive ? \"while monitors stayed active\" : \"without tool use\";\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal continuation repeated ${this.#toollessContinuationStreak} toolless turns ${context} - injected a stall check.`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t}\n\t\tcontent = `${buildGoalStallNotice(this.#toollessContinuationStreak, { monitorsActive })}\\n\\n${content}`;\n\t\treturn content;\n\t}\n\n\t/** A tool-using turn is forward progress, so it clears the repetition window instead of extending it. */\n\t#recordAssistantOutput(messages: readonly AgentMessage[], turnUsedTools: boolean): void {\n\t\tif (turnUsedTools) {\n\t\t\tthis.#recentNormalizedOutputHashes = [];\n\t\t\treturn;\n\t\t}\n\t\tconst text = lastAssistantText(messages);\n\t\tif (normalizeAssistantText(text).length === 0) return;\n\t\tthis.#recentNormalizedOutputHashes = [...this.#recentNormalizedOutputHashes, hashAssistantText(text)].slice(-3);\n\t}\n\n\t#recordToollessContinuationTurn(goal: Goal, turnUsedTools: boolean): void {\n\t\tif (goal.id !== this.#toollessStreakGoalId) {\n\t\t\tthis.#toollessStreakGoalId = goal.id;\n\t\t\tthis.#toollessContinuationStreak = 0;\n\t\t}\n\t\tif (this.#endedTurnWasUserInitiated) return;\n\t\tif (turnUsedTools) {\n\t\t\tthis.#toollessContinuationStreak = 0;\n\t\t\treturn;\n\t\t}\n\t\tthis.#toollessContinuationStreak += 1;\n\t}\n\n\t#resetLengthRecoveryAfterCleanStop(goal: Goal | null, messages: readonly AgentMessage[]): void {\n\t\tif (goal === null || findLastAssistantMessage(messages)?.stopReason !== \"stop\") return;\n\t\tthis.#consecutiveLengthRecoveries.delete(goal.id);\n\t}\n\n\t#resetContinuationState(): void {\n\t\tthis.#consecutiveLengthRecoveries.clear();\n\t\tthis.#recentNormalizedOutputHashes = [];\n\t\tthis.#resetToollessContinuationStreak();\n\t}\n\n\t#resetToollessContinuationStreak(): void {\n\t\tthis.#toollessContinuationStreak = 0;\n\t\tthis.#toollessStreakGoalId = null;\n\t}\n\n\t#cancelTimer(): void {\n\t\tthis.#scheduledAtMs = undefined;\n\t\tthis.#scheduledDueAtMs = undefined;\n\t\tthis.#scheduledCache = undefined;\n\t\tthis.#heldTimer = undefined;\n\t\tif (this.#timer !== undefined) clearTimeout(this.#timer);\n\t\tthis.#timer = undefined;\n\t\tthis.#scheduledContinuationKind = undefined;\n\t\tthis.#waitTicker?.stop();\n\t}\n}\n\nfunction findLastAssistantMessage(\n\tmessages: readonly AgentMessage[],\n): Extract<AgentMessage, { role: \"assistant\" }> | undefined {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"monitor-continuation.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/monitor-continuation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\nimport { isTerminalMonitorStateEvent, TERMINAL_MONITOR_STATE_EVENT } from \"../monitor-state-event.ts\";\nimport {\n\testimateCacheWarmMetrics,\n\tGOAL_CACHE_WARMUP_ENTRY_TYPE,\n\ttype GoalCacheWarmMetrics,\n\ttype GoalCacheWarmupEntryData,\n} from \"./cache-warm.ts\";\nimport {\n\tcontinuationTurnUsedTools,\n\tevaluateGoalContinuation,\n\tGOAL_USER_GRACE_DELAY_MS,\n\ttype GoalContinuationInput,\n\ttype GoalContinuationPath,\n\thasGoalContinuationProgress,\n\thashAssistantText,\n\tnormalizeAssistantText,\n} from \"./continuation.ts\";\nimport { lastAssistantMessage } from \"./last-assistant-message.ts\";\nimport {\n\tadmitAndQueueGoalContinuation,\n\tbuildCurrentGoalContinuationSignature,\n\tlastAssistantText,\n} from \"./lifecycle-helpers.ts\";\nimport type {\n\tAgentEndOptions,\n\tContinuingGoalContinuationVerdict,\n\tDelayedContinuationKind,\n\tGoalContinuationAdmission,\n\tSystemAbortOptions,\n} from \"./monitor-continuation-types.ts\";\nimport { buildContinuationPrompt, buildGoalStallNotice, buildTruncationRecoveryPrompt } from \"./prompt.ts\";\nimport { resetContinuationStreak } from \"./store.ts\";\nimport { goalStoreRef } from \"./store-ref.ts\";\nimport { collectAssistantUsage } from \"./turn-usage.ts\";\nimport type { Goal, TokenUsageSnapshot } from \"./types.ts\";\nimport type { GoalWaitTicker } from \"./wait-ticker.ts\";\n\nexport const GOAL_MONITOR_CONTINUATION_DELAY_MS = 240_000;\nexport const GOAL_CONTINUATION_SCHEDULED_EVENT = \"goal_continuation_scheduled\";\nexport const GOAL_CONTINUATION_RESUMED_EVENT = \"goal_continuation_resumed\";\nexport const GOAL_MONITOR_STALL_EVENT = \"goal_monitor_continuation_stall\";\n\nexport class MonitorAwareGoalContinuation {\n\treadonly #pi: ExtensionAPI;\n\treadonly #isContinuationPending: () => boolean;\n\treadonly #markContinuationPending: () => void;\n\treadonly #waitTicker: GoalWaitTicker | undefined;\n\t#activeMonitorCount = 0;\n\t#ctx: ExtensionContext | undefined;\n\t#goal: Goal | null = null;\n\t#timer: ReturnType<typeof setTimeout> | undefined;\n\t#scheduledContinuationKind: DelayedContinuationKind | undefined;\n\t#unsubscribeMonitorState: (() => void) | undefined;\n\t#lastAgentEndMessages: readonly AgentMessage[] = [];\n\t#consecutiveLengthRecoveries = new Map<string, number>();\n\t#recentNormalizedOutputHashes: string[] = [];\n\t#toollessContinuationStreak = 0;\n\t#toollessStreakGoalId: string | null = null;\n\t#endedTurnWasUserInitiated = false;\n\t#lastTurnUsage: TokenUsageSnapshot | undefined;\n\t#scheduledAtMs: number | undefined;\n\t#scheduledDueAtMs: number | undefined;\n\t#scheduledCache: GoalCacheWarmMetrics | undefined;\n\t#heldTimer: { kind: DelayedContinuationKind; remainingMs: number } | undefined;\n\t#directInputHolds = new Set<string>();\n\t#pendingSystemRecovery: SystemAbortOptions | undefined;\n\n\tconstructor(\n\t\tpi: ExtensionAPI,\n\t\tisContinuationPending: () => boolean = () => false,\n\t\tmarkContinuationPending: () => void = () => {},\n\t\twaitTicker?: GoalWaitTicker,\n\t) {\n\t\tthis.#pi = pi;\n\t\tthis.#isContinuationPending = isContinuationPending;\n\t\tthis.#markContinuationPending = markContinuationPending;\n\t\tthis.#waitTicker = waitTicker;\n\t}\n\n\tstart(ctx: ExtensionContext): void {\n\t\tthis.#cancelTimer();\n\t\tthis.#unsubscribeMonitorState?.();\n\t\tthis.#ctx = ctx;\n\t\tthis.#activeMonitorCount = 0;\n\t\tthis.#goal = null;\n\t\tthis.#lastAgentEndMessages = [];\n\t\tthis.#directInputHolds.clear();\n\t\tthis.#resetContinuationState();\n\t\tconst events = this.#pi.events;\n\t\tif (events === undefined) return;\n\t\tthis.#unsubscribeMonitorState = events.on(TERMINAL_MONITOR_STATE_EVENT, (data) => {\n\t\t\tif (!isTerminalMonitorStateEvent(data)) return;\n\t\t\tthis.#activeMonitorCount = data.activeCount;\n\t\t\tif (data.activeCount === 0) {\n\t\t\t\tif (this.#scheduledContinuationKind === \"monitor\") this.#cancelTimer();\n\t\t\t\tthis.#resetToollessContinuationStreak();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#scheduledContinuationKind === \"monitor\") {\n\t\t\t\tthis.#waitTicker?.setActiveMonitorCount(data.activeCount);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync afterAgentEnd(options: AgentEndOptions): Promise<Goal | null> {\n\t\tif (options.goal?.id !== this.#goal?.id) this.#resetToollessContinuationStreak();\n\t\tthis.#ctx = options.ctx;\n\t\tthis.#goal = options.goal;\n\t\tthis.#lastAgentEndMessages = options.messages;\n\t\tthis.#lastTurnUsage = collectAssistantUsage([...options.messages]);\n\t\tthis.#resetLengthRecoveryAfterCleanStop(options.goal, options.messages);\n\t\tconst turnUsedTools = continuationTurnUsedTools(options.messages);\n\t\tthis.#recordAssistantOutput(options.messages, turnUsedTools);\n\t\tif (options.goal?.status !== \"active\") {\n\t\t\tthis.#cancelTimer();\n\t\t\treturn options.goal;\n\t\t}\n\t\tthis.#recordToollessContinuationTurn(options.goal, turnUsedTools);\n\t\tconst immediateInput = this.#buildVerdictInput(options.ctx, options.goal, \"immediate\", options.messages);\n\t\tconst goal =\n\t\t\t!this.#endedTurnWasUserInitiated && (turnUsedTools || hasGoalContinuationProgress(immediateInput))\n\t\t\t\t? ((await resetContinuationStreak(goalStoreRef(options.ctx.sessionManager, options.ctx.cwd))) ??\n\t\t\t\t\toptions.goal)\n\t\t\t\t: options.goal;\n\t\tthis.#goal = goal;\n\t\tconst immediateVerdict = evaluateGoalContinuation({\n\t\t\tgoal,\n\t\t\t...this.#buildVerdictInput(options.ctx, goal, \"immediate\", options.messages),\n\t\t});\n\t\tif (this.#endedTurnWasUserInitiated) {\n\t\t\tthis.#endedTurnWasUserInitiated = false;\n\t\t\tthis.#cancelTimer();\n\t\t\tif (immediateVerdict.kind === \"continue\") {\n\t\t\t\tthis.#schedule(goal, \"userGrace\");\n\t\t\t\treturn goal;\n\t\t\t}\n\t\t\tswitch (immediateVerdict.reason) {\n\t\t\t\tcase \"not-eligible\":\n\t\t\t\tcase \"single-flight\":\n\t\t\t\tcase \"stale\":\n\t\t\t\t\treturn goal;\n\t\t\t\tcase \"cap\":\n\t\t\t\tcase \"repetition\":\n\t\t\t\tcase \"length-exhausted\": {\n\t\t\t\t\tconst admission = await this.#admitAndQueue(options.ctx, goal, \"immediate\", options.messages);\n\t\t\t\t\treturn admission.goal;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (immediateVerdict.kind === \"deny\" && immediateVerdict.reason === \"not-eligible\") return goal;\n\n\t\tif (this.#activeMonitorCount === 0) {\n\t\t\tthis.#cancelTimer();\n\t\t\tconst admission = await this.#admitAndQueue(options.ctx, goal, \"immediate\", options.messages);\n\t\t\treturn admission.goal;\n\t\t}\n\t\tthis.#schedule(goal, \"monitor\");\n\t\treturn goal;\n\t}\n\n\tasync afterSystemAbort(options: SystemAbortOptions): Promise<Goal | null> {\n\t\tthis.noteContinuationStarted();\n\t\tthis.#pendingSystemRecovery = undefined;\n\t\tthis.#ctx = options.ctx;\n\t\tthis.#goal = options.goal;\n\t\tthis.#lastAgentEndMessages = options.messages;\n\t\tthis.#lastTurnUsage = collectAssistantUsage([...options.messages]);\n\t\tif (options.willRetry || options.goal?.status !== \"active\") return options.goal;\n\t\tif (this.#activeMonitorCount > 0) this.#schedule(options.goal, \"monitor\");\n\t\telse if (lastAssistantMessage(options.messages)?.stopReason === \"error\") {\n\t\t\tthis.#pendingSystemRecovery = options;\n\t\t}\n\t\treturn options.goal;\n\t}\n\n\tasync afterAgentSettled(): Promise<Goal | null | undefined> {\n\t\tconst pending = this.#pendingSystemRecovery;\n\t\tthis.#pendingSystemRecovery = undefined;\n\t\tif (pending === undefined || pending.goal === null || pending.event.abortSource === \"user\") return undefined;\n\t\treturn (await this.#admitAndQueue(pending.ctx, pending.goal, \"systemRecovery\", pending.messages)).goal;\n\t}\n\n\tsyncGoal(goal: Goal | null): void {\n\t\tif (goal?.id !== this.#goal?.id) this.#resetContinuationState();\n\t\tthis.#goal = goal;\n\t\tif (goal?.status !== \"active\") {\n\t\t\tthis.#cancelTimer();\n\t\t\tthis.#resetContinuationState();\n\t\t}\n\t}\n\n\t/** Temporarily prevents a scheduled continuation from racing unresolved direct-input admission. */\n\tholdDirectInput(inputId: string): void {\n\t\tif (this.#directInputHolds.has(inputId)) return;\n\t\tthis.#directInputHolds.add(inputId);\n\t\tif (\n\t\t\tthis.#directInputHolds.size !== 1 ||\n\t\t\tthis.#timer === undefined ||\n\t\t\tthis.#scheduledContinuationKind === undefined\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#heldTimer = {\n\t\t\tkind: this.#scheduledContinuationKind,\n\t\t\tremainingMs: Math.max(0, (this.#scheduledDueAtMs ?? Date.now()) - Date.now()),\n\t\t};\n\t\tclearTimeout(this.#timer);\n\t\tthis.#timer = undefined;\n\t\tthis.#scheduledDueAtMs = undefined;\n\t\tthis.#waitTicker?.stop();\n\t}\n\n\t/** Resolves one admission hold without allowing overlapping inputs to consume each other. */\n\tresolveDirectInput(inputId: string, accepted: boolean): void {\n\t\tif (!this.#directInputHolds.delete(inputId)) return;\n\t\tif (accepted) {\n\t\t\tthis.#heldTimer = undefined;\n\t\t\tthis.noteUserPrompt();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#directInputHolds.size > 0 || this.#heldTimer === undefined) return;\n\t\tconst held = this.#heldTimer;\n\t\tthis.#heldTimer = undefined;\n\t\tthis.#armTimer(held.kind, held.remainingMs);\n\t}\n\n\t/** An accepted real user prompt starts a grace-governed user turn. */\n\tnoteUserPrompt(): void {\n\t\tthis.#cancelTimer();\n\t\tthis.#endedTurnWasUserInitiated = true;\n\t\tthis.#resetContinuationState();\n\t}\n\n\t/** A hidden continuation or system recovery has started, so the next end is not user-initiated. */\n\tnoteContinuationStarted(): void {\n\t\tthis.#endedTurnWasUserInitiated = false;\n\t}\n\n\tdispose(): void {\n\t\tthis.#cancelTimer();\n\t\tthis.#unsubscribeMonitorState?.();\n\t\tthis.#unsubscribeMonitorState = undefined;\n\t\tthis.#ctx = undefined;\n\t\tthis.#goal = null;\n\t\tthis.#activeMonitorCount = 0;\n\t\tthis.#lastAgentEndMessages = [];\n\t\tthis.#directInputHolds.clear();\n\t\tthis.#resetContinuationState();\n\t}\n\n\t#schedule(goal: Goal, kind: DelayedContinuationKind): void {\n\t\tif (this.#scheduledContinuationKind !== undefined) return;\n\t\tconst delayMs = kind === \"monitor\" ? GOAL_MONITOR_CONTINUATION_DELAY_MS : GOAL_USER_GRACE_DELAY_MS;\n\t\tif (kind === \"monitor\") {\n\t\t\tconst cache = estimateCacheWarmMetrics(this.#ctx?.model, process.env, this.#lastTurnUsage);\n\t\t\tthis.#scheduledCache = cache;\n\t\t\tthis.#scheduledAtMs = Date.now();\n\t\t\tthis.#pi.events?.emit(GOAL_CONTINUATION_SCHEDULED_EVENT, {\n\t\t\t\tgoalId: goal.id,\n\t\t\t\tdelayMs,\n\t\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t\tcache,\n\t\t\t});\n\t\t\tthis.#appendWarmupEntry({\n\t\t\t\tphase: \"scheduled\",\n\t\t\t\tgoalId: goal.id,\n\t\t\t\tdelayMs,\n\t\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t\t...(cache !== undefined ? { cache } : {}),\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#scheduledAtMs = undefined;\n\t\t\tthis.#scheduledCache = undefined;\n\t\t}\n\t\tthis.#scheduledContinuationKind = kind;\n\t\tif (this.#directInputHolds.size > 0) {\n\t\t\tthis.#heldTimer = { kind, remainingMs: delayMs };\n\t\t\treturn;\n\t\t}\n\t\tthis.#armTimer(kind, delayMs);\n\t}\n\n\t#armTimer(kind: DelayedContinuationKind, delayMs: number): void {\n\t\tthis.#scheduledDueAtMs = Date.now() + delayMs;\n\t\tconst ctx = this.#ctx;\n\t\tif (ctx?.hasUI) {\n\t\t\tthis.#waitTicker?.sync(ctx, {\n\t\t\t\tkind,\n\t\t\t\tremainingMs: delayMs,\n\t\t\t\ttotalMs: kind === \"monitor\" ? GOAL_MONITOR_CONTINUATION_DELAY_MS : GOAL_USER_GRACE_DELAY_MS,\n\t\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t});\n\t\t}\n\t\tthis.#timer = setTimeout(() => {\n\t\t\tvoid this.#continueIfEligible(kind).catch((error: unknown) => {\n\t\t\t\tif (this.#ctx?.hasUI) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tthis.#ctx.ui.notify(`Goal continuation delivery failed: ${message}`, \"error\");\n\t\t\t\t}\n\t\t\t});\n\t\t}, delayMs);\n\t}\n\n\tasync #continueIfEligible(kind: DelayedContinuationKind): Promise<void> {\n\t\tthis.#timer = undefined;\n\t\tthis.#scheduledDueAtMs = undefined;\n\t\tthis.#scheduledContinuationKind = undefined;\n\t\tthis.#waitTicker?.stop();\n\t\tconst delayMs = kind === \"monitor\" ? GOAL_MONITOR_CONTINUATION_DELAY_MS : GOAL_USER_GRACE_DELAY_MS;\n\t\tconst waitedMs = this.#scheduledAtMs === undefined ? delayMs : Math.max(0, Date.now() - this.#scheduledAtMs);\n\t\tconst cache = this.#scheduledCache;\n\t\tthis.#scheduledAtMs = undefined;\n\t\tthis.#scheduledCache = undefined;\n\t\tconst ctx = this.#ctx;\n\t\tconst goal = this.#goal;\n\t\tif (ctx === undefined || goal?.status !== \"active\" || !ctx.isIdle() || ctx.hasPendingMessages()) return;\n\t\tif (kind === \"monitor\" && this.#activeMonitorCount === 0) return;\n\t\tconst admission = await this.#admitAndQueue(\n\t\t\tctx,\n\t\t\tgoal,\n\t\t\tkind === \"monitor\" ? \"monitorDelayed\" : \"userGrace\",\n\t\t\tthis.#lastAgentEndMessages,\n\t\t);\n\t\tif (kind !== \"monitor\" || !admission.admitted) return;\n\t\tthis.#pi.events?.emit(GOAL_CONTINUATION_RESUMED_EVENT, {\n\t\t\tgoalId: goal.id,\n\t\t\tdelayMs,\n\t\t\twaitedMs,\n\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\tcache,\n\t\t});\n\t\tthis.#appendWarmupEntry({\n\t\t\tphase: \"resumed\",\n\t\t\tgoalId: goal.id,\n\t\t\tdelayMs,\n\t\t\twaitedMs,\n\t\t\tactiveMonitorCount: this.#activeMonitorCount,\n\t\t\t...(cache !== undefined ? { cache } : {}),\n\t\t});\n\t}\n\n\tasync #admitAndQueue(\n\t\tctx: ExtensionContext,\n\t\tgoal: Goal,\n\t\tpath: GoalContinuationPath,\n\t\tmessages: readonly AgentMessage[],\n\t): Promise<GoalContinuationAdmission> {\n\t\tconst input = this.#buildVerdictInput(ctx, goal, path, messages);\n\t\tconst verdict = evaluateGoalContinuation({ goal, ...input });\n\t\tconst admittedGoal = await admitAndQueueGoalContinuation(this.#pi, ctx, goal, {\n\t\t\tinput,\n\t\t\tcontent: (continuationVerdict) => this.#buildContinuationContent(ctx, goal, continuationVerdict),\n\t\t\tmarkContinuationPending: this.#markContinuationPending,\n\t\t});\n\t\tif (verdict.kind === \"continue\" && input.lastStopReason === \"length\") {\n\t\t\tthis.#consecutiveLengthRecoveries.set(goal.id, input.consecutiveLengthRecoveries + 1);\n\t\t}\n\t\tthis.#goal = admittedGoal;\n\t\tif (admittedGoal.status !== \"active\") {\n\t\t\tthis.#cancelTimer();\n\t\t\tthis.#resetToollessContinuationStreak();\n\t\t}\n\t\treturn { goal: admittedGoal, admitted: verdict.kind === \"continue\" };\n\t}\n\n\t#appendWarmupEntry(data: GoalCacheWarmupEntryData): void {\n\t\tthis.#pi.appendEntry?.<GoalCacheWarmupEntryData>(GOAL_CACHE_WARMUP_ENTRY_TYPE, data);\n\t}\n\n\t#buildVerdictInput(\n\t\tctx: ExtensionContext,\n\t\tgoal: Goal,\n\t\tpath: GoalContinuationPath,\n\t\tmessages: readonly AgentMessage[],\n\t): Omit<GoalContinuationInput, \"goal\"> {\n\t\tconst lastAssistant = lastAssistantMessage(messages);\n\t\treturn {\n\t\t\tisIdle: ctx.isIdle(),\n\t\t\thasPendingMessages: ctx.hasPendingMessages(),\n\t\t\tpath,\n\t\t\tlastStopReason: lastAssistant?.stopReason,\n\t\t\tconsecutiveContinuations: goal.consecutiveContinuations ?? 0,\n\t\t\tlastContinuationSignature: goal.lastContinuationSignature,\n\t\t\tcurrentSignature: buildCurrentGoalContinuationSignature(ctx, goal, lastAssistantText(messages)),\n\t\t\tconsecutiveLengthRecoveries: this.#consecutiveLengthRecoveries.get(goal.id) ?? 0,\n\t\t\trecentNormalizedOutputHashes: this.#recentNormalizedOutputHashes,\n\t\t\ttoollessContinuationStreak: this.#toollessContinuationStreak,\n\t\t\tcontinuationPending: this.#isContinuationPending(),\n\t\t};\n\t}\n\n\t#buildContinuationContent(ctx: ExtensionContext, goal: Goal, verdict: ContinuingGoalContinuationVerdict): string {\n\t\tlet content = verdict.prompt === \"minimal\" ? buildTruncationRecoveryPrompt() : buildContinuationPrompt(goal);\n\t\tif (!verdict.stallNotice) return content;\n\n\t\tconst monitorsActive = this.#activeMonitorCount > 0;\n\t\tthis.#pi.events?.emit(GOAL_MONITOR_STALL_EVENT, {\n\t\t\tgoalId: goal.id,\n\t\t\tconsecutiveContinuations: this.#toollessContinuationStreak,\n\t\t\ttoolless: true,\n\t\t});\n\t\tif (ctx.hasUI) {\n\t\t\tconst context = monitorsActive ? \"while monitors stayed active\" : \"without tool use\";\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal continuation repeated ${this.#toollessContinuationStreak} toolless turns ${context} - injected a stall check.`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t}\n\t\tcontent = `${buildGoalStallNotice(this.#toollessContinuationStreak, { monitorsActive })}\\n\\n${content}`;\n\t\treturn content;\n\t}\n\n\t/** A tool-using turn is forward progress, so it clears the repetition window instead of extending it. */\n\t#recordAssistantOutput(messages: readonly AgentMessage[], turnUsedTools: boolean): void {\n\t\tif (turnUsedTools) {\n\t\t\tthis.#recentNormalizedOutputHashes = [];\n\t\t\treturn;\n\t\t}\n\t\tconst text = lastAssistantText(messages);\n\t\tif (normalizeAssistantText(text).length === 0) return;\n\t\tthis.#recentNormalizedOutputHashes = [...this.#recentNormalizedOutputHashes, hashAssistantText(text)].slice(-3);\n\t}\n\n\t#recordToollessContinuationTurn(goal: Goal, turnUsedTools: boolean): void {\n\t\tif (goal.id !== this.#toollessStreakGoalId) {\n\t\t\tthis.#toollessStreakGoalId = goal.id;\n\t\t\tthis.#toollessContinuationStreak = 0;\n\t\t}\n\t\tif (this.#endedTurnWasUserInitiated) return;\n\t\tif (turnUsedTools) {\n\t\t\tthis.#toollessContinuationStreak = 0;\n\t\t\treturn;\n\t\t}\n\t\tthis.#toollessContinuationStreak += 1;\n\t}\n\n\t#resetLengthRecoveryAfterCleanStop(goal: Goal | null, messages: readonly AgentMessage[]): void {\n\t\tif (goal === null || lastAssistantMessage(messages)?.stopReason !== \"stop\") return;\n\t\tthis.#consecutiveLengthRecoveries.delete(goal.id);\n\t}\n\n\t#resetContinuationState(): void {\n\t\tthis.#pendingSystemRecovery = undefined;\n\t\tthis.#consecutiveLengthRecoveries.clear();\n\t\tthis.#recentNormalizedOutputHashes = [];\n\t\tthis.#resetToollessContinuationStreak();\n\t}\n\n\t#resetToollessContinuationStreak(): void {\n\t\tthis.#toollessContinuationStreak = 0;\n\t\tthis.#toollessStreakGoalId = null;\n\t}\n\n\t#cancelTimer(): void {\n\t\tthis.#scheduledAtMs = undefined;\n\t\tthis.#scheduledDueAtMs = undefined;\n\t\tthis.#scheduledCache = undefined;\n\t\tthis.#heldTimer = undefined;\n\t\tif (this.#timer !== undefined) clearTimeout(this.#timer);\n\t\tthis.#timer = undefined;\n\t\tthis.#scheduledContinuationKind = undefined;\n\t\tthis.#waitTicker?.stop();\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-provider-error.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/terminal-provider-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAK7E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { lastAssistantMessage } from "./last-assistant-message.js";
|
|
2
|
+
export function didTerminalProviderErrorEndTurn(event) {
|
|
3
|
+
if (event.abortSource === "system")
|
|
4
|
+
return false;
|
|
5
|
+
if (event.willRetry !== false)
|
|
6
|
+
return false;
|
|
7
|
+
const message = lastAssistantMessage(event.messages);
|
|
8
|
+
return message?.stopReason === "error" || (message?.stopReason === "aborted" && event.abortSource === undefined);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=terminal-provider-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-provider-error.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/goal/terminal-provider-error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,UAAU,+BAA+B,CAAC,KAAoB;IACnE,IAAI,KAAK,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjD,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrD,OAAO,OAAO,EAAE,UAAU,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC;AAClH,CAAC","sourcesContent":["import type { AgentEndEvent } from \"../../types.ts\";\nimport { lastAssistantMessage } from \"./last-assistant-message.ts\";\n\nexport function didTerminalProviderErrorEndTurn(event: AgentEndEvent): boolean {\n\tif (event.abortSource === \"system\") return false;\n\tif (event.willRetry !== false) return false;\n\tconst message = lastAssistantMessage(event.messages);\n\treturn message?.stopReason === \"error\" || (message?.stopReason === \"aborted\" && event.abortSource === undefined);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/apply.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,KAAK,EAGX,0BAA0B,EAC1B,gBAAgB,EAChB,qBAAqB,EAErB,MAAM,YAAY,CAAC;AA2BpB,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAWlF;
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/apply.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,KAAK,EAGX,0BAA0B,EAC1B,gBAAgB,EAChB,qBAAqB,EAErB,MAAM,YAAY,CAAC;AA2BpB,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAWlF;AA8BD,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,qBAAqB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAEf;AA0HD,wBAAsB,kBAAkB,CACvC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,0BAA0B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAqC3B;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BlF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir,
|
|
1
|
+
import { mkdir, rename, rm, unlink, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { withFileMutationQueue } from "../../../tools/file-mutation-queue.js";
|
|
4
4
|
import { ApplyPatchError } from "./errors.js";
|
|
@@ -52,6 +52,19 @@ async function writeFileAtomic(absPath, content, operations = ATOMIC_WRITE_OPERA
|
|
|
52
52
|
await operations.rename(tempPath, absPath);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
+
async function writeBinaryFileAtomic(absPath, content) {
|
|
56
|
+
const tempPath = `${absPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;
|
|
57
|
+
await writeFile(tempPath, content);
|
|
58
|
+
try {
|
|
59
|
+
await rename(tempPath, absPath);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (!hasErrorCode(error, "EEXIST"))
|
|
63
|
+
throw error;
|
|
64
|
+
await unlink(absPath);
|
|
65
|
+
await rename(tempPath, absPath);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
55
68
|
export async function __testWriteFileAtomic(absPath, content, operations) {
|
|
56
69
|
await writeFileAtomic(absPath, content, operations);
|
|
57
70
|
}
|
|
@@ -67,25 +80,56 @@ async function applySingleHunk(cwd, hunk) {
|
|
|
67
80
|
return { summary: `add: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };
|
|
68
81
|
}
|
|
69
82
|
if (hunk.type === "delete") {
|
|
70
|
-
const
|
|
83
|
+
const source = await readPatchFileSnapshot(absolutePath);
|
|
71
84
|
const preview = buildPatchPreviewFile({
|
|
72
85
|
hunk,
|
|
73
|
-
source
|
|
86
|
+
source,
|
|
74
87
|
newContent: "",
|
|
75
88
|
});
|
|
76
89
|
await rm(absolutePath);
|
|
77
90
|
return { summary: `delete: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };
|
|
78
91
|
}
|
|
79
|
-
const
|
|
92
|
+
const source = await readPatchFileSnapshot(absolutePath);
|
|
93
|
+
if (!source.exists) {
|
|
94
|
+
const error = new Error(`ENOENT: no such file or directory, open '${absolutePath}'`);
|
|
95
|
+
error.code = "ENOENT";
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
const absoluteMovePath = hunk.movePath ? resolvePatchPath(cwd, hunk.movePath) : undefined;
|
|
99
|
+
const moveDestination = absoluteMovePath && absoluteMovePath !== absolutePath
|
|
100
|
+
? await readPatchFileSnapshot(absoluteMovePath)
|
|
101
|
+
: undefined;
|
|
102
|
+
if (source.binary) {
|
|
103
|
+
if (hunk.chunks.length > 0) {
|
|
104
|
+
throw new Error(`apply_patch cannot apply text hunks to binary file: ${hunk.filePath}`);
|
|
105
|
+
}
|
|
106
|
+
if (!hunk.movePath || !absoluteMovePath || !source.bytes) {
|
|
107
|
+
throw new Error(`apply_patch cannot update binary file without a move destination: ${hunk.filePath}`);
|
|
108
|
+
}
|
|
109
|
+
const preview = buildPatchPreviewFile({
|
|
110
|
+
hunk,
|
|
111
|
+
source,
|
|
112
|
+
newContent: "",
|
|
113
|
+
...(moveDestination ? { moveDestination } : {}),
|
|
114
|
+
});
|
|
115
|
+
await mkdir(path.dirname(absoluteMovePath), { recursive: true });
|
|
116
|
+
await writeBinaryFileAtomic(absoluteMovePath, source.bytes);
|
|
117
|
+
if (absoluteMovePath !== absolutePath)
|
|
118
|
+
await rm(absolutePath);
|
|
119
|
+
return {
|
|
120
|
+
summary: `move: ${hunk.filePath} -> ${hunk.movePath}`,
|
|
121
|
+
appliedFile: hunk.movePath,
|
|
122
|
+
fuzz: 0,
|
|
123
|
+
preview,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
80
126
|
const chunkResult = hunk.chunks.length === 0
|
|
81
|
-
? { content:
|
|
82
|
-
: replaceChunks(
|
|
83
|
-
if (hunk.movePath) {
|
|
84
|
-
const absoluteMovePath = resolvePatchPath(cwd, hunk.movePath);
|
|
85
|
-
const moveDestination = absoluteMovePath === absolutePath ? undefined : await readPatchFileSnapshot(absoluteMovePath);
|
|
127
|
+
? { content: source.content, fuzz: 0 }
|
|
128
|
+
: replaceChunks(source.content, hunk.filePath, hunk.chunks);
|
|
129
|
+
if (hunk.movePath && absoluteMovePath) {
|
|
86
130
|
const preview = buildPatchPreviewFile({
|
|
87
131
|
hunk,
|
|
88
|
-
source
|
|
132
|
+
source,
|
|
89
133
|
newContent: chunkResult.content,
|
|
90
134
|
...(moveDestination ? { moveDestination } : {}),
|
|
91
135
|
});
|
|
@@ -102,7 +146,7 @@ async function applySingleHunk(cwd, hunk) {
|
|
|
102
146
|
}
|
|
103
147
|
const preview = buildPatchPreviewFile({
|
|
104
148
|
hunk,
|
|
105
|
-
source
|
|
149
|
+
source,
|
|
106
150
|
newContent: chunkResult.content,
|
|
107
151
|
});
|
|
108
152
|
await writeFileAtomic(absolutePath, chunkResult.content);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAS/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,uBAAuB,GAA0B,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAErF,KAAK,UAAU,wBAAwB,CACtC,UAAkD,EAClD,QAAmD;IAEnD,IAAI,CAAC;QACJ,MAAM,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,4EAA4E;IAC7E,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY;IACjD,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACvC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7F,OAAO,KAAK,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAwB;IAC/D,OAAO;QACN,GAAG,MAAM;QACT,OAAO,EAAE;YACR,GAAG,MAAM,CAAC,OAAO;YACjB,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;gBACvF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;gBAC5D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;YAC/D,CAAC,CAAC;SACF;KACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC7B,OAAe,EACf,OAAe,EACf,UAAU,GAA0B,uBAAuB;IAE3D,MAAM,QAAQ,GAAG,GAAG,OAAO,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC;QACJ,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC;YAAE,MAAM,KAAK,CAAC;QAChD,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,OAAe,EACf,OAAe,EACf,UAAiC;IAEjC,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,eAAe,CAC7B,GAAW,EACX,IAAiB;IAOjB,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,aAAa,GAClB,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACjH,OAAO,uBAAuB,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;QACxD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;QAC3F,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC;gBACrC,IAAI;gBACJ,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;gBAC7C,UAAU,EAAE,EAAE;aACd,CAAC,CAAC;YACH,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,WAAW,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;QAC9F,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,WAAW,GAChB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE;YACtC,CAAC,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,eAAe,GACpB,gBAAgB,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;YAC/F,MAAM,OAAO,GAAG,qBAAqB,CAAC;gBACrC,IAAI;gBACJ,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE;gBACjD,UAAU,EAAE,WAAW,CAAC,OAAO;gBAC/B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C,CAAC,CAAC;YACH,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,eAAe,CAAC,gBAAgB,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,gBAAgB,KAAK,YAAY;gBAAE,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;YAC9D,OAAO;gBACN,OAAO,EAAE,SAAS,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,EAAE;gBACrD,WAAW,EAAE,IAAI,CAAC,QAAQ;gBAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,OAAO;aACP,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,qBAAqB,CAAC;YACrC,IAAI;YACJ,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE;YACjD,UAAU,EAAE,WAAW,CAAC,OAAO;SAC/B,CAAC,CAAC;QACH,MAAM,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,WAAW,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7G,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAI,SAA4B,EAAE,SAA2B;IAClG,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,CAAC,KAAa,EAAc,EAAE;QAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,SAAS,EAAE,CAAC;QAC/C,OAAO,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC;IACF,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,IAAI,UAAU,KAAK,gCAAgC;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,GAAW,EACX,SAAiB,EACjB,UAAuC;IAEvC,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,iBAAiB,GAA4B,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACvC,iBAAiB,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,wBAAwB,CAAC,UAAU,EAAE;YAC1C,OAAO,EAAE,YAAY,CAAC,MAAM;YAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,KAAK,EAAE,KAAK,CAAC,MAAM;SACnB,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAqB;QAChC,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,iBAAiB,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjE,oBAAoB,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QAClF,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;KACpC,CAAC;IACF,MAAM,CAAC,oBAAoB,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,SAAiB;IAC9D,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,iBAAiB,GAA4B,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACjD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACvC,iBAAiB,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAwB;gBACrC,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE;aACzG,CAAC;YACF,MAAM,MAAM,GAAqB;gBAChC,SAAS;gBACT,YAAY;gBACZ,QAAQ;gBACR,iBAAiB,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC;gBAC1C,oBAAoB,EAAE,0BAA0B,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;gBAC5E,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,iBAAiB,EAAE;aACvC,CAAC;YACF,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import { mkdir, readFile, rename, rm, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { withFileMutationQueue } from \"../../../tools/file-mutation-queue.ts\";\nimport { ApplyPatchError } from \"./errors.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { replaceChunks } from \"./patch-replace.ts\";\nimport { buildPatchPreviewFile, readPatchFileSnapshot } from \"./preview.ts\";\nimport { createRecoveryInstructions } from \"./recovery.ts\";\n\nexport { buildPartialFailureText } from \"./recovery.ts\";\n\nimport { normalizePatchText } from \"./text.ts\";\nimport type {\n\tAppliedPatchOperation,\n\tApplyPatchFailure,\n\tApplyPatchProgressCallback,\n\tApplyPatchResult,\n\tAtomicWriteOperations,\n\tParsedPatch,\n} from \"./types.ts\";\nimport { resolvePatchPath } from \"./workspace.ts\";\n\nconst ATOMIC_WRITE_OPERATIONS: AtomicWriteOperations = { writeFile, rename, unlink };\n\nasync function notifyApplyPatchProgress(\n\tonProgress: ApplyPatchProgressCallback | undefined,\n\tprogress: Parameters<ApplyPatchProgressCallback>[0],\n): Promise<void> {\n\ttry {\n\t\tawait onProgress?.(progress);\n\t} catch {\n\t\t// Rendering progress must not affect patch application or recovery details.\n\t}\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n\treturn Boolean(error && typeof error === \"object\" && \"code\" in error && error.code === code);\n}\n\nfunction extractErrorCode(error: unknown): string | undefined {\n\tif (error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\") {\n\t\treturn error.code;\n\t}\n\treturn undefined;\n}\n\nexport function compactApplyPatchResult(result: ApplyPatchResult): ApplyPatchResult {\n\treturn {\n\t\t...result,\n\t\tdetails: {\n\t\t\t...result.details,\n\t\t\tappliedOperations: result.details.appliedOperations.map(({ operationIndex, preview }) => {\n\t\t\t\tconst { diff: _diff, patch: _patch, ...metadata } = preview;\n\t\t\t\treturn { operationIndex, preview: { ...metadata, diff: \"\" } };\n\t\t\t}),\n\t\t},\n\t};\n}\n\nasync function writeFileAtomic(\n\tabsPath: string,\n\tcontent: string,\n\toperations: AtomicWriteOperations = ATOMIC_WRITE_OPERATIONS,\n): Promise<void> {\n\tconst tempPath = `${absPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;\n\tawait operations.writeFile(tempPath, content, \"utf-8\");\n\ttry {\n\t\tawait operations.rename(tempPath, absPath);\n\t} catch (error) {\n\t\tif (!hasErrorCode(error, \"EEXIST\")) throw error;\n\t\tawait operations.unlink(absPath);\n\t\tawait operations.rename(tempPath, absPath);\n\t}\n}\n\nexport async function __testWriteFileAtomic(\n\tabsPath: string,\n\tcontent: string,\n\toperations: AtomicWriteOperations,\n): Promise<void> {\n\tawait writeFileAtomic(absPath, content, operations);\n}\n\nasync function applySingleHunk(\n\tcwd: string,\n\thunk: ParsedPatch,\n): Promise<{\n\treadonly summary: string;\n\treadonly appliedFile: string;\n\treadonly fuzz: number;\n\treadonly preview: ReturnType<typeof buildPatchPreviewFile>;\n}> {\n\tconst absolutePath = resolvePatchPath(cwd, hunk.filePath);\n\tconst mutationPaths =\n\t\thunk.type === \"update\" && hunk.movePath ? [absolutePath, resolvePatchPath(cwd, hunk.movePath)] : [absolutePath];\n\treturn withPatchMutationQueues(mutationPaths, async () => {\n\t\tif (hunk.type === \"add\") {\n\t\t\tconst source = await readPatchFileSnapshot(absolutePath);\n\t\t\tconst preview = buildPatchPreviewFile({ hunk, source, newContent: hunk.content });\n\t\t\tawait mkdir(path.dirname(absolutePath), { recursive: true });\n\t\t\tawait writeFileAtomic(absolutePath, hunk.content);\n\t\t\treturn { summary: `add: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };\n\t\t}\n\n\t\tif (hunk.type === \"delete\") {\n\t\t\tconst oldContent = await readFile(absolutePath, \"utf-8\");\n\t\t\tconst preview = buildPatchPreviewFile({\n\t\t\t\thunk,\n\t\t\t\tsource: { exists: true, content: oldContent },\n\t\t\t\tnewContent: \"\",\n\t\t\t});\n\t\t\tawait rm(absolutePath);\n\t\t\treturn { summary: `delete: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };\n\t\t}\n\n\t\tconst currentContent = await readFile(absolutePath, \"utf-8\");\n\t\tconst chunkResult =\n\t\t\thunk.chunks.length === 0\n\t\t\t\t? { content: currentContent, fuzz: 0 }\n\t\t\t\t: replaceChunks(currentContent, hunk.filePath, hunk.chunks);\n\n\t\tif (hunk.movePath) {\n\t\t\tconst absoluteMovePath = resolvePatchPath(cwd, hunk.movePath);\n\t\t\tconst moveDestination =\n\t\t\t\tabsoluteMovePath === absolutePath ? undefined : await readPatchFileSnapshot(absoluteMovePath);\n\t\t\tconst preview = buildPatchPreviewFile({\n\t\t\t\thunk,\n\t\t\t\tsource: { exists: true, content: currentContent },\n\t\t\t\tnewContent: chunkResult.content,\n\t\t\t\t...(moveDestination ? { moveDestination } : {}),\n\t\t\t});\n\t\t\tawait mkdir(path.dirname(absoluteMovePath), { recursive: true });\n\t\t\tawait writeFileAtomic(absoluteMovePath, chunkResult.content);\n\t\t\tif (absoluteMovePath !== absolutePath) await rm(absolutePath);\n\t\t\treturn {\n\t\t\t\tsummary: `move: ${hunk.filePath} -> ${hunk.movePath}`,\n\t\t\t\tappliedFile: hunk.movePath,\n\t\t\t\tfuzz: chunkResult.fuzz,\n\t\t\t\tpreview,\n\t\t\t};\n\t\t}\n\n\t\tconst preview = buildPatchPreviewFile({\n\t\t\thunk,\n\t\t\tsource: { exists: true, content: currentContent },\n\t\t\tnewContent: chunkResult.content,\n\t\t});\n\t\tawait writeFileAtomic(absolutePath, chunkResult.content);\n\t\treturn { summary: `update: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: chunkResult.fuzz, preview };\n\t});\n}\n\nasync function withPatchMutationQueues<T>(filePaths: readonly string[], operation: () => Promise<T>): Promise<T> {\n\tconst sortedPaths = [...new Set(filePaths)].sort((left, right) => left.localeCompare(right));\n\tconst runQueued = (index: number): Promise<T> => {\n\t\tconst filePath = sortedPaths[index];\n\t\tif (filePath === undefined) return operation();\n\t\treturn withFileMutationQueue(filePath, () => runQueued(index + 1));\n\t};\n\treturn runQueued(0);\n}\n\nfunction parseNonEmptyPatch(patchText: string): ParsedPatch[] {\n\tconst hunks = parsePatch(patchText);\n\tif (hunks.length === 0) {\n\t\tconst normalized = normalizePatchText(patchText).trim();\n\t\tif (normalized === \"*** Begin Patch\\n*** End Patch\") throw new Error(\"patch rejected: empty patch\");\n\t\tthrow new Error(\"apply_patch verification failed: no hunks found\");\n\t}\n\treturn hunks;\n}\n\nexport async function applyPatchDetailed(\n\tcwd: string,\n\tpatchText: string,\n\tonProgress?: ApplyPatchProgressCallback,\n): Promise<ApplyPatchResult> {\n\tconst hunks = parseNonEmptyPatch(patchText);\n\tconst summaries: string[] = [];\n\tconst appliedFiles: string[] = [];\n\tconst appliedOperations: AppliedPatchOperation[] = [];\n\tconst failures: ApplyPatchFailure[] = [];\n\tlet fuzz = 0;\n\n\tfor (const [operationIndex, hunk] of hunks.entries()) {\n\t\ttry {\n\t\t\tconst applied = await applySingleHunk(cwd, hunk);\n\t\t\tsummaries.push(applied.summary);\n\t\t\tappliedFiles.push(applied.appliedFile);\n\t\t\tappliedOperations.push({ operationIndex, preview: applied.preview });\n\t\t\tfuzz += applied.fuzz;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst code = extractErrorCode(error);\n\t\t\tfailures.push({ operationIndex, filePath: hunk.filePath, operation: hunk.type, message, code });\n\t\t}\n\t\tawait notifyApplyPatchProgress(onProgress, {\n\t\t\tapplied: appliedFiles.length,\n\t\t\tfailed: failures.length,\n\t\t\ttotal: hunks.length,\n\t\t});\n\t}\n\n\tconst result: ApplyPatchResult = {\n\t\tsummaries,\n\t\tappliedFiles,\n\t\tfailures,\n\t\thasPartialSuccess: appliedFiles.length > 0 && failures.length > 0,\n\t\trecoveryInstructions: { mustReadFiles: [], mustNotReadFiles: [], failedFiles: [] },\n\t\tdetails: { fuzz, appliedOperations },\n\t};\n\tresult.recoveryInstructions = createRecoveryInstructions(result);\n\treturn result;\n}\n\nexport async function applyPatch(cwd: string, patchText: string): Promise<string[]> {\n\tconst hunks = parseNonEmptyPatch(patchText);\n\tconst summaries: string[] = [];\n\tconst appliedFiles: string[] = [];\n\tconst appliedOperations: AppliedPatchOperation[] = [];\n\tfor (const [operationIndex, hunk] of hunks.entries()) {\n\t\ttry {\n\t\t\tconst applied = await applySingleHunk(cwd, hunk);\n\t\t\tsummaries.push(applied.summary);\n\t\t\tappliedFiles.push(applied.appliedFile);\n\t\t\tappliedOperations.push({ operationIndex, preview: applied.preview });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst failures: ApplyPatchFailure[] = [\n\t\t\t\t{ operationIndex, filePath: hunk.filePath, operation: hunk.type, message, code: extractErrorCode(error) },\n\t\t\t];\n\t\t\tconst result: ApplyPatchResult = {\n\t\t\t\tsummaries,\n\t\t\t\tappliedFiles,\n\t\t\t\tfailures,\n\t\t\t\thasPartialSuccess: appliedFiles.length > 0,\n\t\t\t\trecoveryInstructions: createRecoveryInstructions({ appliedFiles, failures }),\n\t\t\t\tdetails: { fuzz: 0, appliedOperations },\n\t\t\t};\n\t\t\tthrow new ApplyPatchError(message, compactApplyPatchResult(result));\n\t\t}\n\t}\n\n\treturn summaries;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/apply.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, rename, rm, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { withFileMutationQueue } from \"../../../tools/file-mutation-queue.ts\";\nimport { ApplyPatchError } from \"./errors.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { replaceChunks } from \"./patch-replace.ts\";\nimport { buildPatchPreviewFile, readPatchFileSnapshot } from \"./preview.ts\";\nimport { createRecoveryInstructions } from \"./recovery.ts\";\n\nexport { buildPartialFailureText } from \"./recovery.ts\";\n\nimport { normalizePatchText } from \"./text.ts\";\nimport type {\n\tAppliedPatchOperation,\n\tApplyPatchFailure,\n\tApplyPatchProgressCallback,\n\tApplyPatchResult,\n\tAtomicWriteOperations,\n\tParsedPatch,\n} from \"./types.ts\";\nimport { resolvePatchPath } from \"./workspace.ts\";\n\nconst ATOMIC_WRITE_OPERATIONS: AtomicWriteOperations = { writeFile, rename, unlink };\n\nasync function notifyApplyPatchProgress(\n\tonProgress: ApplyPatchProgressCallback | undefined,\n\tprogress: Parameters<ApplyPatchProgressCallback>[0],\n): Promise<void> {\n\ttry {\n\t\tawait onProgress?.(progress);\n\t} catch {\n\t\t// Rendering progress must not affect patch application or recovery details.\n\t}\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n\treturn Boolean(error && typeof error === \"object\" && \"code\" in error && error.code === code);\n}\n\nfunction extractErrorCode(error: unknown): string | undefined {\n\tif (error && typeof error === \"object\" && \"code\" in error && typeof error.code === \"string\") {\n\t\treturn error.code;\n\t}\n\treturn undefined;\n}\n\nexport function compactApplyPatchResult(result: ApplyPatchResult): ApplyPatchResult {\n\treturn {\n\t\t...result,\n\t\tdetails: {\n\t\t\t...result.details,\n\t\t\tappliedOperations: result.details.appliedOperations.map(({ operationIndex, preview }) => {\n\t\t\t\tconst { diff: _diff, patch: _patch, ...metadata } = preview;\n\t\t\t\treturn { operationIndex, preview: { ...metadata, diff: \"\" } };\n\t\t\t}),\n\t\t},\n\t};\n}\n\nasync function writeFileAtomic(\n\tabsPath: string,\n\tcontent: string,\n\toperations: AtomicWriteOperations = ATOMIC_WRITE_OPERATIONS,\n): Promise<void> {\n\tconst tempPath = `${absPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;\n\tawait operations.writeFile(tempPath, content, \"utf-8\");\n\ttry {\n\t\tawait operations.rename(tempPath, absPath);\n\t} catch (error) {\n\t\tif (!hasErrorCode(error, \"EEXIST\")) throw error;\n\t\tawait operations.unlink(absPath);\n\t\tawait operations.rename(tempPath, absPath);\n\t}\n}\n\nasync function writeBinaryFileAtomic(absPath: string, content: Uint8Array): Promise<void> {\n\tconst tempPath = `${absPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;\n\tawait writeFile(tempPath, content);\n\ttry {\n\t\tawait rename(tempPath, absPath);\n\t} catch (error) {\n\t\tif (!hasErrorCode(error, \"EEXIST\")) throw error;\n\t\tawait unlink(absPath);\n\t\tawait rename(tempPath, absPath);\n\t}\n}\n\nexport async function __testWriteFileAtomic(\n\tabsPath: string,\n\tcontent: string,\n\toperations: AtomicWriteOperations,\n): Promise<void> {\n\tawait writeFileAtomic(absPath, content, operations);\n}\n\nasync function applySingleHunk(\n\tcwd: string,\n\thunk: ParsedPatch,\n): Promise<{\n\treadonly summary: string;\n\treadonly appliedFile: string;\n\treadonly fuzz: number;\n\treadonly preview: ReturnType<typeof buildPatchPreviewFile>;\n}> {\n\tconst absolutePath = resolvePatchPath(cwd, hunk.filePath);\n\tconst mutationPaths =\n\t\thunk.type === \"update\" && hunk.movePath ? [absolutePath, resolvePatchPath(cwd, hunk.movePath)] : [absolutePath];\n\treturn withPatchMutationQueues(mutationPaths, async () => {\n\t\tif (hunk.type === \"add\") {\n\t\t\tconst source = await readPatchFileSnapshot(absolutePath);\n\t\t\tconst preview = buildPatchPreviewFile({ hunk, source, newContent: hunk.content });\n\t\t\tawait mkdir(path.dirname(absolutePath), { recursive: true });\n\t\t\tawait writeFileAtomic(absolutePath, hunk.content);\n\t\t\treturn { summary: `add: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };\n\t\t}\n\n\t\tif (hunk.type === \"delete\") {\n\t\t\tconst source = await readPatchFileSnapshot(absolutePath);\n\t\t\tconst preview = buildPatchPreviewFile({\n\t\t\t\thunk,\n\t\t\t\tsource,\n\t\t\t\tnewContent: \"\",\n\t\t\t});\n\t\t\tawait rm(absolutePath);\n\t\t\treturn { summary: `delete: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };\n\t\t}\n\n\t\tconst source = await readPatchFileSnapshot(absolutePath);\n\t\tif (!source.exists) {\n\t\t\tconst error = new Error(`ENOENT: no such file or directory, open '${absolutePath}'`) as NodeJS.ErrnoException;\n\t\t\terror.code = \"ENOENT\";\n\t\t\tthrow error;\n\t\t}\n\t\tconst absoluteMovePath = hunk.movePath ? resolvePatchPath(cwd, hunk.movePath) : undefined;\n\t\tconst moveDestination =\n\t\t\tabsoluteMovePath && absoluteMovePath !== absolutePath\n\t\t\t\t? await readPatchFileSnapshot(absoluteMovePath)\n\t\t\t\t: undefined;\n\t\tif (source.binary) {\n\t\t\tif (hunk.chunks.length > 0) {\n\t\t\t\tthrow new Error(`apply_patch cannot apply text hunks to binary file: ${hunk.filePath}`);\n\t\t\t}\n\t\t\tif (!hunk.movePath || !absoluteMovePath || !source.bytes) {\n\t\t\t\tthrow new Error(`apply_patch cannot update binary file without a move destination: ${hunk.filePath}`);\n\t\t\t}\n\t\t\tconst preview = buildPatchPreviewFile({\n\t\t\t\thunk,\n\t\t\t\tsource,\n\t\t\t\tnewContent: \"\",\n\t\t\t\t...(moveDestination ? { moveDestination } : {}),\n\t\t\t});\n\t\t\tawait mkdir(path.dirname(absoluteMovePath), { recursive: true });\n\t\t\tawait writeBinaryFileAtomic(absoluteMovePath, source.bytes);\n\t\t\tif (absoluteMovePath !== absolutePath) await rm(absolutePath);\n\t\t\treturn {\n\t\t\t\tsummary: `move: ${hunk.filePath} -> ${hunk.movePath}`,\n\t\t\t\tappliedFile: hunk.movePath,\n\t\t\t\tfuzz: 0,\n\t\t\t\tpreview,\n\t\t\t};\n\t\t}\n\n\t\tconst chunkResult =\n\t\t\thunk.chunks.length === 0\n\t\t\t\t? { content: source.content, fuzz: 0 }\n\t\t\t\t: replaceChunks(source.content, hunk.filePath, hunk.chunks);\n\n\t\tif (hunk.movePath && absoluteMovePath) {\n\t\t\tconst preview = buildPatchPreviewFile({\n\t\t\t\thunk,\n\t\t\t\tsource,\n\t\t\t\tnewContent: chunkResult.content,\n\t\t\t\t...(moveDestination ? { moveDestination } : {}),\n\t\t\t});\n\t\t\tawait mkdir(path.dirname(absoluteMovePath), { recursive: true });\n\t\t\tawait writeFileAtomic(absoluteMovePath, chunkResult.content);\n\t\t\tif (absoluteMovePath !== absolutePath) await rm(absolutePath);\n\t\t\treturn {\n\t\t\t\tsummary: `move: ${hunk.filePath} -> ${hunk.movePath}`,\n\t\t\t\tappliedFile: hunk.movePath,\n\t\t\t\tfuzz: chunkResult.fuzz,\n\t\t\t\tpreview,\n\t\t\t};\n\t\t}\n\n\t\tconst preview = buildPatchPreviewFile({\n\t\t\thunk,\n\t\t\tsource,\n\t\t\tnewContent: chunkResult.content,\n\t\t});\n\t\tawait writeFileAtomic(absolutePath, chunkResult.content);\n\t\treturn { summary: `update: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: chunkResult.fuzz, preview };\n\t});\n}\n\nasync function withPatchMutationQueues<T>(filePaths: readonly string[], operation: () => Promise<T>): Promise<T> {\n\tconst sortedPaths = [...new Set(filePaths)].sort((left, right) => left.localeCompare(right));\n\tconst runQueued = (index: number): Promise<T> => {\n\t\tconst filePath = sortedPaths[index];\n\t\tif (filePath === undefined) return operation();\n\t\treturn withFileMutationQueue(filePath, () => runQueued(index + 1));\n\t};\n\treturn runQueued(0);\n}\n\nfunction parseNonEmptyPatch(patchText: string): ParsedPatch[] {\n\tconst hunks = parsePatch(patchText);\n\tif (hunks.length === 0) {\n\t\tconst normalized = normalizePatchText(patchText).trim();\n\t\tif (normalized === \"*** Begin Patch\\n*** End Patch\") throw new Error(\"patch rejected: empty patch\");\n\t\tthrow new Error(\"apply_patch verification failed: no hunks found\");\n\t}\n\treturn hunks;\n}\n\nexport async function applyPatchDetailed(\n\tcwd: string,\n\tpatchText: string,\n\tonProgress?: ApplyPatchProgressCallback,\n): Promise<ApplyPatchResult> {\n\tconst hunks = parseNonEmptyPatch(patchText);\n\tconst summaries: string[] = [];\n\tconst appliedFiles: string[] = [];\n\tconst appliedOperations: AppliedPatchOperation[] = [];\n\tconst failures: ApplyPatchFailure[] = [];\n\tlet fuzz = 0;\n\n\tfor (const [operationIndex, hunk] of hunks.entries()) {\n\t\ttry {\n\t\t\tconst applied = await applySingleHunk(cwd, hunk);\n\t\t\tsummaries.push(applied.summary);\n\t\t\tappliedFiles.push(applied.appliedFile);\n\t\t\tappliedOperations.push({ operationIndex, preview: applied.preview });\n\t\t\tfuzz += applied.fuzz;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst code = extractErrorCode(error);\n\t\t\tfailures.push({ operationIndex, filePath: hunk.filePath, operation: hunk.type, message, code });\n\t\t}\n\t\tawait notifyApplyPatchProgress(onProgress, {\n\t\t\tapplied: appliedFiles.length,\n\t\t\tfailed: failures.length,\n\t\t\ttotal: hunks.length,\n\t\t});\n\t}\n\n\tconst result: ApplyPatchResult = {\n\t\tsummaries,\n\t\tappliedFiles,\n\t\tfailures,\n\t\thasPartialSuccess: appliedFiles.length > 0 && failures.length > 0,\n\t\trecoveryInstructions: { mustReadFiles: [], mustNotReadFiles: [], failedFiles: [] },\n\t\tdetails: { fuzz, appliedOperations },\n\t};\n\tresult.recoveryInstructions = createRecoveryInstructions(result);\n\treturn result;\n}\n\nexport async function applyPatch(cwd: string, patchText: string): Promise<string[]> {\n\tconst hunks = parseNonEmptyPatch(patchText);\n\tconst summaries: string[] = [];\n\tconst appliedFiles: string[] = [];\n\tconst appliedOperations: AppliedPatchOperation[] = [];\n\tfor (const [operationIndex, hunk] of hunks.entries()) {\n\t\ttry {\n\t\t\tconst applied = await applySingleHunk(cwd, hunk);\n\t\t\tsummaries.push(applied.summary);\n\t\t\tappliedFiles.push(applied.appliedFile);\n\t\t\tappliedOperations.push({ operationIndex, preview: applied.preview });\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst failures: ApplyPatchFailure[] = [\n\t\t\t\t{ operationIndex, filePath: hunk.filePath, operation: hunk.type, message, code: extractErrorCode(error) },\n\t\t\t];\n\t\t\tconst result: ApplyPatchResult = {\n\t\t\t\tsummaries,\n\t\t\t\tappliedFiles,\n\t\t\t\tfailures,\n\t\t\t\thasPartialSuccess: appliedFiles.length > 0,\n\t\t\t\trecoveryInstructions: createRecoveryInstructions({ appliedFiles, failures }),\n\t\t\t\tdetails: { fuzz: 0, appliedOperations },\n\t\t\t};\n\t\t\tthrow new ApplyPatchError(message, compactApplyPatchResult(result));\n\t\t}\n\t}\n\n\treturn summaries;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview-format.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/preview-format.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,iBAAiB,EAEjB,qBAAqB,EACrB,eAAe,EACf,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,uBAAuB,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"preview-format.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/preview-format.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEX,iBAAiB,EAEjB,qBAAqB,EACrB,eAAe,EACf,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,uBAAuB,OAAO,CAAC;AA2E5C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWjE;AAcD,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,iBAAiB,EAC1B,GAAG,GAAE,MAAsB,EAC3B,QAAQ,GAAE,OAAc,GACtB,MAAM,CA8BR;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMhE;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,qBAAqB,CA6BlH;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,OAAO,GACf,MAAM,CA4CR;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAO5E"}
|