@code-yeongyu/senpi 2026.7.30 → 2026.7.31
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 +98 -0
- package/README.md +3 -0
- package/dist/core/agent-session.d.ts +7 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +31 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +1 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -0
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/idle.d.ts +16 -0
- package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -0
- package/dist/core/extensions/builtin/compaction/idle.js +21 -0
- package/dist/core/extensions/builtin/compaction/idle.js.map +1 -0
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +18 -1
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -0
- package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/openai-remote.js +15 -4
- package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +18 -4
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -0
- package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/continuation.js +12 -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 +4 -1
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/monitor-continuation.js +22 -18
- package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js +67 -66
- package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.d.ts +4 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.d.ts.map +1 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.js +35 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/recovery.js.map +1 -0
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js +0 -5
- package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +2 -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/high-reasoning-warning.d.ts +10 -0
- package/dist/core/high-reasoning-warning.d.ts.map +1 -0
- package/dist/core/high-reasoning-warning.js +28 -0
- package/dist/core/high-reasoning-warning.js.map +1 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +3 -11
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +1 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +59 -13
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/risky-main-model-warning.d.ts +5 -0
- package/dist/modes/interactive/risky-main-model-warning.d.ts.map +1 -0
- package/dist/modes/interactive/risky-main-model-warning.js +8 -0
- package/dist/modes/interactive/risky-main-model-warning.js.map +1 -0
- package/dist/modes/interactive/tips/catalog/subagent-tips.d.ts.map +1 -1
- package/dist/modes/interactive/tips/catalog/subagent-tips.js +30 -0
- package/dist/modes/interactive/tips/catalog/subagent-tips.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +6 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +22 -2
- package/dist/utils/version-check.js.map +1 -1
- package/docs/docs.json +4 -0
- package/docs/quickstart.md +3 -0
- package/docs/release-guide.md +636 -0
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts +4 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +106 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.d.ts +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.js +1 -0
- package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.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/huggingface.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/dist/tool-call-middleware/index.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +13 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/recovery-stream.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.js +29 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery-stream.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.js +82 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/kimi-xtml/thinking-recovery.js.map +1 -0
- 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/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/index.js +1 -12
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.d.ts +7 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.js +9 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/streamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/streamableHttp.js +5 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/client/streamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/index.js +1 -12
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.js +17 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/sseKeepAlive.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.d.ts +9 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.js +10 -4
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.d.ts +21 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.js +239 -41
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/webStandardStreamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/zod-compat.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/zod-compat.js +25 -6
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/server/zod-compat.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.d.ts +32 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.js +64 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/mediaType.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.js +10 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/cjs/shared/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js +2 -13
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.d.ts +7 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js +9 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.js +5 -3
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/client/streamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js +2 -13
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.js +13 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sseKeepAlive.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.d.ts +9 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js +10 -4
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.d.ts +21 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.js +239 -41
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/webStandardStreamableHttp.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js +25 -6
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.d.ts +32 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.d.ts.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.js +57 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/mediaType.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.d.ts +5 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.d.ts.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js +9 -0
- package/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js.map +1 -1
- package/node_modules/@modelcontextprotocol/sdk/package.json +4 -3
- package/node_modules/brace-expansion/README.md +12 -0
- package/node_modules/brace-expansion/dist/commonjs/index.d.ts +2 -0
- package/node_modules/brace-expansion/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js +138 -86
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.d.ts +2 -0
- package/node_modules/brace-expansion/dist/esm/index.d.ts.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +137 -85
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +2 -2
- package/package.json +7 -7
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { mkdir, readFile, rename, rm, unlink, writeFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { withFileMutationQueue } from "../../../tools/file-mutation-queue.js";
|
|
3
4
|
import { ApplyPatchError } from "./errors.js";
|
|
4
5
|
import { parsePatch } from "./parser.js";
|
|
5
6
|
import { replaceChunks } from "./patch-replace.js";
|
|
6
7
|
import { buildPatchPreviewFile, readPatchFileSnapshot } from "./preview.js";
|
|
8
|
+
import { createRecoveryInstructions } from "./recovery.js";
|
|
9
|
+
export { buildPartialFailureText } from "./recovery.js";
|
|
7
10
|
import { normalizePatchText } from "./text.js";
|
|
8
11
|
import { resolvePatchPath } from "./workspace.js";
|
|
9
12
|
const ATOMIC_WRITE_OPERATIONS = { writeFile, rename, unlink };
|
|
@@ -18,6 +21,12 @@ async function notifyApplyPatchProgress(onProgress, progress) {
|
|
|
18
21
|
function hasErrorCode(error, code) {
|
|
19
22
|
return Boolean(error && typeof error === "object" && "code" in error && error.code === code);
|
|
20
23
|
}
|
|
24
|
+
function extractErrorCode(error) {
|
|
25
|
+
if (error && typeof error === "object" && "code" in error && typeof error.code === "string") {
|
|
26
|
+
return error.code;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
21
30
|
async function writeFileAtomic(absPath, content, operations = ATOMIC_WRITE_OPERATIONS) {
|
|
22
31
|
const tempPath = `${absPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;
|
|
23
32
|
await operations.writeFile(tempPath, content, "utf-8");
|
|
@@ -36,76 +45,67 @@ export async function __testWriteFileAtomic(absPath, content, operations) {
|
|
|
36
45
|
}
|
|
37
46
|
async function applySingleHunk(cwd, hunk) {
|
|
38
47
|
const absolutePath = resolvePatchPath(cwd, hunk.filePath);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
48
|
+
const mutationPaths = hunk.type === "update" && hunk.movePath ? [absolutePath, resolvePatchPath(cwd, hunk.movePath)] : [absolutePath];
|
|
49
|
+
return withPatchMutationQueues(mutationPaths, async () => {
|
|
50
|
+
if (hunk.type === "add") {
|
|
51
|
+
const source = await readPatchFileSnapshot(absolutePath);
|
|
52
|
+
const preview = buildPatchPreviewFile({ hunk, source, newContent: hunk.content });
|
|
53
|
+
await mkdir(path.dirname(absolutePath), { recursive: true });
|
|
54
|
+
await writeFileAtomic(absolutePath, hunk.content);
|
|
55
|
+
return { summary: `add: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };
|
|
56
|
+
}
|
|
57
|
+
if (hunk.type === "delete") {
|
|
58
|
+
const oldContent = await readFile(absolutePath, "utf-8");
|
|
59
|
+
const preview = buildPatchPreviewFile({
|
|
60
|
+
hunk,
|
|
61
|
+
source: { exists: true, content: oldContent },
|
|
62
|
+
newContent: "",
|
|
63
|
+
});
|
|
64
|
+
await rm(absolutePath);
|
|
65
|
+
return { summary: `delete: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };
|
|
66
|
+
}
|
|
67
|
+
const currentContent = await readFile(absolutePath, "utf-8");
|
|
68
|
+
const chunkResult = hunk.chunks.length === 0
|
|
69
|
+
? { content: currentContent, fuzz: 0 }
|
|
70
|
+
: replaceChunks(currentContent, hunk.filePath, hunk.chunks);
|
|
71
|
+
if (hunk.movePath) {
|
|
72
|
+
const absoluteMovePath = resolvePatchPath(cwd, hunk.movePath);
|
|
73
|
+
const moveDestination = absoluteMovePath === absolutePath ? undefined : await readPatchFileSnapshot(absoluteMovePath);
|
|
74
|
+
const preview = buildPatchPreviewFile({
|
|
75
|
+
hunk,
|
|
76
|
+
source: { exists: true, content: currentContent },
|
|
77
|
+
newContent: chunkResult.content,
|
|
78
|
+
...(moveDestination ? { moveDestination } : {}),
|
|
79
|
+
});
|
|
80
|
+
await mkdir(path.dirname(absoluteMovePath), { recursive: true });
|
|
81
|
+
await writeFileAtomic(absoluteMovePath, chunkResult.content);
|
|
82
|
+
if (absoluteMovePath !== absolutePath)
|
|
83
|
+
await rm(absolutePath);
|
|
84
|
+
return {
|
|
85
|
+
summary: `move: ${hunk.filePath} -> ${hunk.movePath}`,
|
|
86
|
+
appliedFile: hunk.movePath,
|
|
87
|
+
fuzz: chunkResult.fuzz,
|
|
88
|
+
preview,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
63
91
|
const preview = buildPatchPreviewFile({
|
|
64
92
|
hunk,
|
|
65
93
|
source: { exists: true, content: currentContent },
|
|
66
94
|
newContent: chunkResult.content,
|
|
67
|
-
...(moveDestination ? { moveDestination } : {}),
|
|
68
95
|
});
|
|
69
|
-
await
|
|
70
|
-
|
|
71
|
-
if (absoluteMovePath !== absolutePath)
|
|
72
|
-
await rm(absolutePath);
|
|
73
|
-
return {
|
|
74
|
-
summary: `move: ${hunk.filePath} -> ${hunk.movePath}`,
|
|
75
|
-
appliedFile: hunk.movePath,
|
|
76
|
-
fuzz: chunkResult.fuzz,
|
|
77
|
-
preview,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
const preview = buildPatchPreviewFile({
|
|
81
|
-
hunk,
|
|
82
|
-
source: { exists: true, content: currentContent },
|
|
83
|
-
newContent: chunkResult.content,
|
|
96
|
+
await writeFileAtomic(absolutePath, chunkResult.content);
|
|
97
|
+
return { summary: `update: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: chunkResult.fuzz, preview };
|
|
84
98
|
});
|
|
85
|
-
await writeFileAtomic(absolutePath, chunkResult.content);
|
|
86
|
-
return { summary: `update: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: chunkResult.fuzz, preview };
|
|
87
99
|
}
|
|
88
|
-
function
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return
|
|
97
|
-
"apply_patch partially failed.",
|
|
98
|
-
`Failed: ${failed}`,
|
|
99
|
-
`Recovery: MUST read ${mustReadText} before retrying.`,
|
|
100
|
-
result.appliedFiles.length > 0
|
|
101
|
-
? "Earlier file actions in this patch were already applied."
|
|
102
|
-
: "No file actions were applied.",
|
|
103
|
-
result.recoveryInstructions.mustNotReadFiles.length > 0
|
|
104
|
-
? "Recovery: MUST NOT reread other files from this patch unless a specific dependency requires it."
|
|
105
|
-
: "",
|
|
106
|
-
]
|
|
107
|
-
.filter((line) => line.length > 0)
|
|
108
|
-
.join("\n");
|
|
100
|
+
async function withPatchMutationQueues(filePaths, operation) {
|
|
101
|
+
const sortedPaths = [...new Set(filePaths)].sort((left, right) => left.localeCompare(right));
|
|
102
|
+
const runQueued = (index) => {
|
|
103
|
+
const filePath = sortedPaths[index];
|
|
104
|
+
if (filePath === undefined)
|
|
105
|
+
return operation();
|
|
106
|
+
return withFileMutationQueue(filePath, () => runQueued(index + 1));
|
|
107
|
+
};
|
|
108
|
+
return runQueued(0);
|
|
109
109
|
}
|
|
110
110
|
function parseNonEmptyPatch(patchText) {
|
|
111
111
|
const hunks = parsePatch(patchText);
|
|
@@ -134,7 +134,8 @@ export async function applyPatchDetailed(cwd, patchText, onProgress) {
|
|
|
134
134
|
}
|
|
135
135
|
catch (error) {
|
|
136
136
|
const message = error instanceof Error ? error.message : String(error);
|
|
137
|
-
|
|
137
|
+
const code = extractErrorCode(error);
|
|
138
|
+
failures.push({ operationIndex, filePath: hunk.filePath, operation: hunk.type, message, code });
|
|
138
139
|
}
|
|
139
140
|
await notifyApplyPatchProgress(onProgress, {
|
|
140
141
|
applied: appliedFiles.length,
|
|
@@ -147,7 +148,7 @@ export async function applyPatchDetailed(cwd, patchText, onProgress) {
|
|
|
147
148
|
appliedFiles,
|
|
148
149
|
failures,
|
|
149
150
|
hasPartialSuccess: appliedFiles.length > 0 && failures.length > 0,
|
|
150
|
-
recoveryInstructions: { mustReadFiles: [], mustNotReadFiles: [] },
|
|
151
|
+
recoveryInstructions: { mustReadFiles: [], mustNotReadFiles: [], failedFiles: [] },
|
|
151
152
|
details: { fuzz, appliedOperations },
|
|
152
153
|
};
|
|
153
154
|
result.recoveryInstructions = createRecoveryInstructions(result);
|
|
@@ -168,7 +169,7 @@ export async function applyPatch(cwd, patchText) {
|
|
|
168
169
|
catch (error) {
|
|
169
170
|
const message = error instanceof Error ? error.message : String(error);
|
|
170
171
|
const failures = [
|
|
171
|
-
{ operationIndex, filePath: hunk.filePath, operation: hunk.type, message },
|
|
172
|
+
{ operationIndex, filePath: hunk.filePath, operation: hunk.type, message, code: extractErrorCode(error) },
|
|
172
173
|
];
|
|
173
174
|
const result = {
|
|
174
175
|
summaries,
|
|
@@ -1 +1 @@
|
|
|
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, readFile, rename, rm, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ApplyPatchError } from \"./errors.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { replaceChunks } from \"./patch-replace.ts\";\nimport { buildPatchPreviewFile, readPatchFileSnapshot } from \"./preview.ts\";\nimport { normalizePatchText } from \"./text.ts\";\nimport type {\n\tAppliedPatchOperation,\n\tApplyPatchFailure,\n\tApplyPatchProgressCallback,\n\tApplyPatchRecoveryInstructions,\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\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\tif (hunk.type === \"add\") {\n\t\tconst source = await readPatchFileSnapshot(absolutePath);\n\t\tconst preview = buildPatchPreviewFile({ hunk, source, newContent: hunk.content });\n\t\tawait mkdir(path.dirname(absolutePath), { recursive: true });\n\t\tawait writeFileAtomic(absolutePath, hunk.content);\n\t\treturn { summary: `add: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };\n\t}\n\n\tif (hunk.type === \"delete\") {\n\t\tconst oldContent = await readFile(absolutePath, \"utf-8\");\n\t\tconst preview = buildPatchPreviewFile({\n\t\t\thunk,\n\t\t\tsource: { exists: true, content: oldContent },\n\t\t\tnewContent: \"\",\n\t\t});\n\t\tawait rm(absolutePath);\n\t\treturn { summary: `delete: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: 0, preview };\n\t}\n\n\tconst currentContent = await readFile(absolutePath, \"utf-8\");\n\tconst chunkResult =\n\t\thunk.chunks.length === 0\n\t\t\t? { content: currentContent, fuzz: 0 }\n\t\t\t: replaceChunks(currentContent, hunk.filePath, hunk.chunks);\n\n\tif (hunk.movePath) {\n\t\tconst absoluteMovePath = resolvePatchPath(cwd, hunk.movePath);\n\t\tconst moveDestination =\n\t\t\tabsoluteMovePath === absolutePath ? undefined : await readPatchFileSnapshot(absoluteMovePath);\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\t...(moveDestination ? { moveDestination } : {}),\n\t\t});\n\t\tawait mkdir(path.dirname(absoluteMovePath), { recursive: true });\n\t\tawait writeFileAtomic(absoluteMovePath, chunkResult.content);\n\t\tif (absoluteMovePath !== absolutePath) await rm(absolutePath);\n\t\treturn {\n\t\t\tsummary: `move: ${hunk.filePath} -> ${hunk.movePath}`,\n\t\t\tappliedFile: hunk.movePath,\n\t\t\tfuzz: chunkResult.fuzz,\n\t\t\tpreview,\n\t\t};\n\t}\n\n\tconst preview = buildPatchPreviewFile({\n\t\thunk,\n\t\tsource: { exists: true, content: currentContent },\n\t\tnewContent: chunkResult.content,\n\t});\n\tawait writeFileAtomic(absolutePath, chunkResult.content);\n\treturn { summary: `update: ${hunk.filePath}`, appliedFile: hunk.filePath, fuzz: chunkResult.fuzz, preview };\n}\n\nfunction createRecoveryInstructions(\n\tresult: Pick<ApplyPatchResult, \"appliedFiles\" | \"failures\">,\n): ApplyPatchRecoveryInstructions {\n\tconst mustReadFiles = [...new Set(result.failures.map((failure) => failure.filePath))];\n\tconst mustNotReadFiles = [...new Set(result.appliedFiles.filter((filePath) => !mustReadFiles.includes(filePath)))];\n\treturn { mustReadFiles, mustNotReadFiles };\n}\n\nexport function buildPartialFailureText(result: ApplyPatchResult): string {\n\tconst failed = result.recoveryInstructions.mustReadFiles.join(\", \");\n\tconst mustReadText = failed.includes(\",\") ? failed.split(\", \").join(\" and \") : failed;\n\treturn [\n\t\t\"apply_patch partially failed.\",\n\t\t`Failed: ${failed}`,\n\t\t`Recovery: MUST read ${mustReadText} before retrying.`,\n\t\tresult.appliedFiles.length > 0\n\t\t\t? \"Earlier file actions in this patch were already applied.\"\n\t\t\t: \"No file actions were applied.\",\n\t\tresult.recoveryInstructions.mustNotReadFiles.length > 0\n\t\t\t? \"Recovery: MUST NOT reread other files from this patch unless a specific dependency requires it.\"\n\t\t\t: \"\",\n\t]\n\t\t.filter((line) => line.length > 0)\n\t\t.join(\"\\n\");\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\tfailures.push({ operationIndex, filePath: hunk.filePath, operation: hunk.type, message });\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: [] },\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 },\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, 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, 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\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, result);\n\t\t}\n\t}\n\n\treturn summaries;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ApplyPatchRecoveryInstructions, ApplyPatchResult } from "./types.ts";
|
|
2
|
+
export declare function createRecoveryInstructions(result: Pick<ApplyPatchResult, "appliedFiles" | "failures">): ApplyPatchRecoveryInstructions;
|
|
3
|
+
export declare function buildPartialFailureText(result: ApplyPatchResult): string;
|
|
4
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,8BAA8B,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAWtG,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,GAAG,UAAU,CAAC,GACzD,8BAA8B,CAMhC;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAoBxE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ENOENT (missing file), EACCES/EPERM (permission), ENOTDIR/EISDIR (path) are
|
|
3
|
+
* not context mismatches — rereading will not fix them. Only context-line
|
|
4
|
+
* failures (no error code, thrown by replaceChunks) benefit from a reread.
|
|
5
|
+
*/
|
|
6
|
+
function isRereadCandidate(failure) {
|
|
7
|
+
return failure.code === undefined;
|
|
8
|
+
}
|
|
9
|
+
export function createRecoveryInstructions(result) {
|
|
10
|
+
const mustReadFiles = [...new Set(result.failures.filter(isRereadCandidate).map((failure) => failure.filePath))];
|
|
11
|
+
const mustReadFileSet = new Set(mustReadFiles);
|
|
12
|
+
const failedFileSet = new Set(result.failures.map((failure) => failure.filePath));
|
|
13
|
+
const mustNotReadFiles = [...new Set(result.appliedFiles.filter((filePath) => !mustReadFileSet.has(filePath)))];
|
|
14
|
+
return { mustReadFiles, mustNotReadFiles, failedFiles: [...failedFileSet] };
|
|
15
|
+
}
|
|
16
|
+
export function buildPartialFailureText(result) {
|
|
17
|
+
const failureLines = result.failures.map((failure) => `- ${failure.filePath} (${failure.operation}): ${failure.message}`);
|
|
18
|
+
const mustReadFiles = result.recoveryInstructions.mustReadFiles;
|
|
19
|
+
const mustReadText = mustReadFiles.join(" and ");
|
|
20
|
+
return [
|
|
21
|
+
result.hasPartialSuccess ? "apply_patch partially failed." : "apply_patch failed.",
|
|
22
|
+
"Failed:",
|
|
23
|
+
...failureLines,
|
|
24
|
+
mustReadFiles.length > 0 ? `Recovery: MUST read ${mustReadText} before retrying.` : "",
|
|
25
|
+
result.appliedFiles.length > 0
|
|
26
|
+
? "Earlier file actions in this patch were already applied."
|
|
27
|
+
: "No file actions were applied.",
|
|
28
|
+
result.recoveryInstructions.mustNotReadFiles.length > 0
|
|
29
|
+
? "Recovery: MUST NOT reread other files from this patch unless a specific dependency requires it."
|
|
30
|
+
: "",
|
|
31
|
+
]
|
|
32
|
+
.filter((line) => line.length > 0)
|
|
33
|
+
.join("\n");
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/recovery.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,OAA0B;IACpD,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,MAA2D;IAE3D,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClF,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAwB;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CACvC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,OAAO,EAAE,CAC/E,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC;IAChE,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO;QACN,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,qBAAqB;QAClF,SAAS;QACT,GAAG,YAAY;QACf,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,YAAY,mBAAmB,CAAC,CAAC,CAAC,EAAE;QACtF,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAC7B,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,+BAA+B;QAClC,MAAM,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;YACtD,CAAC,CAAC,iGAAiG;YACnG,CAAC,CAAC,EAAE;KACL;SACC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC","sourcesContent":["import type { ApplyPatchFailure, ApplyPatchRecoveryInstructions, ApplyPatchResult } from \"./types.ts\";\n\n/**\n * ENOENT (missing file), EACCES/EPERM (permission), ENOTDIR/EISDIR (path) are\n * not context mismatches — rereading will not fix them. Only context-line\n * failures (no error code, thrown by replaceChunks) benefit from a reread.\n */\nfunction isRereadCandidate(failure: ApplyPatchFailure): boolean {\n\treturn failure.code === undefined;\n}\n\nexport function createRecoveryInstructions(\n\tresult: Pick<ApplyPatchResult, \"appliedFiles\" | \"failures\">,\n): ApplyPatchRecoveryInstructions {\n\tconst mustReadFiles = [...new Set(result.failures.filter(isRereadCandidate).map((failure) => failure.filePath))];\n\tconst mustReadFileSet = new Set(mustReadFiles);\n\tconst failedFileSet = new Set(result.failures.map((failure) => failure.filePath));\n\tconst mustNotReadFiles = [...new Set(result.appliedFiles.filter((filePath) => !mustReadFileSet.has(filePath)))];\n\treturn { mustReadFiles, mustNotReadFiles, failedFiles: [...failedFileSet] };\n}\n\nexport function buildPartialFailureText(result: ApplyPatchResult): string {\n\tconst failureLines = result.failures.map(\n\t\t(failure) => `- ${failure.filePath} (${failure.operation}): ${failure.message}`,\n\t);\n\tconst mustReadFiles = result.recoveryInstructions.mustReadFiles;\n\tconst mustReadText = mustReadFiles.join(\" and \");\n\treturn [\n\t\tresult.hasPartialSuccess ? \"apply_patch partially failed.\" : \"apply_patch failed.\",\n\t\t\"Failed:\",\n\t\t...failureLines,\n\t\tmustReadFiles.length > 0 ? `Recovery: MUST read ${mustReadText} before retrying.` : \"\",\n\t\tresult.appliedFiles.length > 0\n\t\t\t? \"Earlier file actions in this patch were already applied.\"\n\t\t\t: \"No file actions were applied.\",\n\t\tresult.recoveryInstructions.mustNotReadFiles.length > 0\n\t\t\t? \"Recovery: MUST NOT reread other files from this patch unless a specific dependency requires it.\"\n\t\t\t: \"\",\n\t]\n\t\t.filter((line) => line.length > 0)\n\t\t.join(\"\\n\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAKX,wBAAwB,EAGxB,MAAM,YAAY,CAAC;AAiDpB,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,UAAU,GAAG,MAAmB,GAAG,wBAAwB,
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAKX,wBAAwB,EAGxB,MAAM,YAAY,CAAC;AAiDpB,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,UAAU,GAAG,MAAmB,GAAG,wBAAwB,CA4FxG"}
|
|
@@ -77,11 +77,6 @@ export function createApplyPatchTool(variant = "freeform") {
|
|
|
77
77
|
});
|
|
78
78
|
const resultPreview = appliedPreview(result);
|
|
79
79
|
if (result.failures.length > 0) {
|
|
80
|
-
if (result.appliedFiles.length === 0) {
|
|
81
|
-
const firstFailure = result.failures[0];
|
|
82
|
-
if (firstFailure)
|
|
83
|
-
throw new Error(firstFailure.message);
|
|
84
|
-
}
|
|
85
80
|
return {
|
|
86
81
|
content: [{ type: "text", text: buildPartialFailureText(result) }],
|
|
87
82
|
details: resultPreview ? { preview: resultPreview, result } : { result },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Container, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext } from \"../../types.ts\";\nimport { defineTool } from \"../../types.ts\";\nimport { applyPatchDetailed, buildPartialFailureText } from \"./apply.ts\";\nimport {\n\tAPPLY_PATCH_FREEFORM_DESCRIPTION,\n\tAPPLY_PATCH_JSON_DESCRIPTION,\n\tAPPLY_PATCH_LARK_GRAMMAR,\n\tAPPLY_PATCH_PARAMS,\n} from \"./constants.ts\";\nimport { normalizeApplyPatchArguments } from \"./params.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { createPendingPatchUpdate } from \"./preview.ts\";\nimport { getApplyPatchRenderState, renderPatchPreview } from \"./preview-format.ts\";\nimport { renderStreamingPatchCall } from \"./streaming-render.ts\";\nimport type {\n\tApplyPatchPreview,\n\tApplyPatchRenderState,\n\tApplyPatchResult,\n\tApplyPatchTheme,\n\tApplyPatchToolDefinition,\n\tApplyPatchToolDetails,\n\tFreeformToolFormat,\n} from \"./types.ts\";\n\nfunction appliedPreview(result: ApplyPatchResult): ApplyPatchPreview | undefined {\n\tconst files = [...result.details.appliedOperations]\n\t\t.sort((left, right) => left.operationIndex - right.operationIndex)\n\t\t.map((operation) => operation.preview);\n\tif (files.length === 0) return undefined;\n\treturn {\n\t\tfiles,\n\t\tadded: files.reduce((total, file) => total + file.added, 0),\n\t\tremoved: files.reduce((total, file) => total + file.removed, 0),\n\t};\n}\n\nfunction renderPreviewBox(\n\ttitle: string,\n\tdetails: ApplyPatchToolDetails,\n\tisPartial: boolean,\n\tcwd: string,\n\texpanded: boolean,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tif (!details.preview) return component;\n\tconst bgName = isPartial ? \"toolPendingBg\" : \"toolSuccessBg\";\n\tconst progress = details.progress;\n\tconst renderedTitle = progress ? `Applying patch (${progress.applied + progress.failed}/${progress.total})` : title;\n\tconst box = new Box(1, 1, (text: string) => theme.bg(bgName, text));\n\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(renderedTitle)), 0, 0));\n\tbox.addChild(new Spacer(1));\n\tbox.addChild(new Text(renderPatchPreview(details.preview, cwd, theme, expanded), 0, 0));\n\tcomponent.addChild(box);\n\treturn component;\n}\n\nfunction renderTextResult(\n\tresult: AgentToolResult<ApplyPatchToolDetails | undefined>,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tconst text = result.content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.filter((value) => typeof value === \"string\" && value.length > 0)\n\t\t.join(\"\\n\");\n\tif (text) component.addChild(new Text(theme.fg(\"toolOutput\", text), 0, 0));\n\treturn component;\n}\n\nexport function createApplyPatchTool(variant: \"freeform\" | \"json\" = \"freeform\"): ApplyPatchToolDefinition {\n\tconst tool = defineTool<typeof APPLY_PATCH_PARAMS, ApplyPatchToolDetails | undefined, ApplyPatchRenderState>({\n\t\tname: \"apply_patch\",\n\t\tlabel: \"ApplyPatch\",\n\t\tdescription: variant === \"json\" ? APPLY_PATCH_JSON_DESCRIPTION : APPLY_PATCH_FREEFORM_DESCRIPTION,\n\t\tparameters: APPLY_PATCH_PARAMS,\n\t\tprepareArguments: normalizeApplyPatchArguments,\n\t\tpromptSnippet: \"Apply Codex-format file patches with apply_patch\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use apply_patch for file edits instead of mutating files through bash, Python scripts, heredocs, or shell redirection.\",\n\t\t\t\"After apply_patch succeeds, do not re-read the edited files just to confirm the patch applied.\",\n\t\t],\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\tparams,\n\t\t\t_signal,\n\t\t\tonUpdate,\n\t\t\tctx,\n\t\t): Promise<AgentToolResult<ApplyPatchToolDetails | undefined>> {\n\t\t\tconst normalizedParams = normalizeApplyPatchArguments(params);\n\t\t\tif (!normalizedParams.input) throw new Error(\"input is required\");\n\t\t\tlet totalOperations = 0;\n\t\t\ttry {\n\t\t\t\ttotalOperations = parsePatch(normalizedParams.input).length;\n\t\t\t} catch {\n\t\t\t\t// createPendingPatchUpdate keeps incomplete or invalid patch text renderable.\n\t\t\t}\n\t\t\tconst initialProgress = totalOperations > 0 ? { applied: 0, failed: 0, total: totalOperations } : undefined;\n\t\t\tconst pendingUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, initialProgress);\n\t\t\tonUpdate?.({ content: [{ type: \"text\", text: pendingUpdate.text }], details: pendingUpdate.details });\n\t\t\tconst preview = pendingUpdate.details?.preview;\n\t\t\tconst result = await applyPatchDetailed(ctx.cwd, normalizedParams.input, async (progress) => {\n\t\t\t\tconst progressUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, progress, preview);\n\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: progressUpdate.text }], details: progressUpdate.details });\n\t\t\t});\n\t\t\tconst resultPreview = appliedPreview(result);\n\t\t\tif (result.failures.length > 0) {\n\t\t\t\tif (result.appliedFiles.length === 0) {\n\t\t\t\t\tconst firstFailure = result.failures[0];\n\t\t\t\t\tif (firstFailure) throw new Error(firstFailure.message);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: buildPartialFailureText(result) }],\n\t\t\t\t\tdetails: resultPreview ? { preview: resultPreview, result } : { result },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: result.summaries.join(\"\\n\") }],\n\t\t\t\tdetails: resultPreview ? { preview: resultPreview, result } : { result },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context: ToolRenderContext<ApplyPatchRenderState, { input: string }>) {\n\t\t\tif (!context.executionStarted) {\n\t\t\t\tconst streaming = renderStreamingPatchCall(normalizeApplyPatchArguments(args), theme, context.state);\n\t\t\t\tif (streaming) return streaming;\n\t\t\t}\n\t\t\tif (!context.argsComplete) return new Text(theme.fg(\"toolTitle\", theme.bold(\"apply_patch: Patching\")), 0, 0);\n\t\t\tconst normalizedArgs = normalizeApplyPatchArguments(args);\n\t\t\tconst renderState = getApplyPatchRenderState(context.toolCallId, context.cwd, normalizedArgs.input);\n\t\t\tconst text = renderState.callText?.length ? `apply_patch: ${renderState.callText}` : \"apply_patch\";\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(text)), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (result.details?.preview) {\n\t\t\t\tconst expanded = true;\n\t\t\t\treturn renderPreviewBox(\n\t\t\t\t\toptions.isPartial ? \"Applying patch\" : \"Applied patch\",\n\t\t\t\t\tresult.details,\n\t\t\t\t\toptions.isPartial,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t\texpanded,\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (result.details?.result) {\n\t\t\t\tconst component = new Container();\n\t\t\t\tconst box = new Box(1, 1, (text: string) =>\n\t\t\t\t\ttheme.bg(options.isPartial ? \"toolPendingBg\" : \"toolSuccessBg\", text),\n\t\t\t\t);\n\t\t\t\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(\"Applying patch\")), 0, 0));\n\t\t\t\tbox.addChild(new Spacer(1));\n\t\t\t\tif (result.details.preview) {\n\t\t\t\t\tconst expanded = options.isPartial ? true : (options.expanded ?? true);\n\t\t\t\t\tbox.addChild(new Text(renderPatchPreview(result.details.preview, context.cwd, theme, expanded), 0, 0));\n\t\t\t\t}\n\t\t\t\tcomponent.addChild(box);\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\treturn renderTextResult(result, theme);\n\t\t},\n\t});\n\n\tif (variant === \"json\") return tool;\n\treturn Object.assign(tool, {\n\t\tfreeform: { type: \"grammar\", syntax: \"lark\", definition: APPLY_PATCH_LARK_GRAMMAR } satisfies FreeformToolFormat,\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Container, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext } from \"../../types.ts\";\nimport { defineTool } from \"../../types.ts\";\nimport { applyPatchDetailed, buildPartialFailureText } from \"./apply.ts\";\nimport {\n\tAPPLY_PATCH_FREEFORM_DESCRIPTION,\n\tAPPLY_PATCH_JSON_DESCRIPTION,\n\tAPPLY_PATCH_LARK_GRAMMAR,\n\tAPPLY_PATCH_PARAMS,\n} from \"./constants.ts\";\nimport { normalizeApplyPatchArguments } from \"./params.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { createPendingPatchUpdate } from \"./preview.ts\";\nimport { getApplyPatchRenderState, renderPatchPreview } from \"./preview-format.ts\";\nimport { renderStreamingPatchCall } from \"./streaming-render.ts\";\nimport type {\n\tApplyPatchPreview,\n\tApplyPatchRenderState,\n\tApplyPatchResult,\n\tApplyPatchTheme,\n\tApplyPatchToolDefinition,\n\tApplyPatchToolDetails,\n\tFreeformToolFormat,\n} from \"./types.ts\";\n\nfunction appliedPreview(result: ApplyPatchResult): ApplyPatchPreview | undefined {\n\tconst files = [...result.details.appliedOperations]\n\t\t.sort((left, right) => left.operationIndex - right.operationIndex)\n\t\t.map((operation) => operation.preview);\n\tif (files.length === 0) return undefined;\n\treturn {\n\t\tfiles,\n\t\tadded: files.reduce((total, file) => total + file.added, 0),\n\t\tremoved: files.reduce((total, file) => total + file.removed, 0),\n\t};\n}\n\nfunction renderPreviewBox(\n\ttitle: string,\n\tdetails: ApplyPatchToolDetails,\n\tisPartial: boolean,\n\tcwd: string,\n\texpanded: boolean,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tif (!details.preview) return component;\n\tconst bgName = isPartial ? \"toolPendingBg\" : \"toolSuccessBg\";\n\tconst progress = details.progress;\n\tconst renderedTitle = progress ? `Applying patch (${progress.applied + progress.failed}/${progress.total})` : title;\n\tconst box = new Box(1, 1, (text: string) => theme.bg(bgName, text));\n\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(renderedTitle)), 0, 0));\n\tbox.addChild(new Spacer(1));\n\tbox.addChild(new Text(renderPatchPreview(details.preview, cwd, theme, expanded), 0, 0));\n\tcomponent.addChild(box);\n\treturn component;\n}\n\nfunction renderTextResult(\n\tresult: AgentToolResult<ApplyPatchToolDetails | undefined>,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tconst text = result.content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.filter((value) => typeof value === \"string\" && value.length > 0)\n\t\t.join(\"\\n\");\n\tif (text) component.addChild(new Text(theme.fg(\"toolOutput\", text), 0, 0));\n\treturn component;\n}\n\nexport function createApplyPatchTool(variant: \"freeform\" | \"json\" = \"freeform\"): ApplyPatchToolDefinition {\n\tconst tool = defineTool<typeof APPLY_PATCH_PARAMS, ApplyPatchToolDetails | undefined, ApplyPatchRenderState>({\n\t\tname: \"apply_patch\",\n\t\tlabel: \"ApplyPatch\",\n\t\tdescription: variant === \"json\" ? APPLY_PATCH_JSON_DESCRIPTION : APPLY_PATCH_FREEFORM_DESCRIPTION,\n\t\tparameters: APPLY_PATCH_PARAMS,\n\t\tprepareArguments: normalizeApplyPatchArguments,\n\t\tpromptSnippet: \"Apply Codex-format file patches with apply_patch\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use apply_patch for file edits instead of mutating files through bash, Python scripts, heredocs, or shell redirection.\",\n\t\t\t\"After apply_patch succeeds, do not re-read the edited files just to confirm the patch applied.\",\n\t\t],\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\tparams,\n\t\t\t_signal,\n\t\t\tonUpdate,\n\t\t\tctx,\n\t\t): Promise<AgentToolResult<ApplyPatchToolDetails | undefined>> {\n\t\t\tconst normalizedParams = normalizeApplyPatchArguments(params);\n\t\t\tif (!normalizedParams.input) throw new Error(\"input is required\");\n\t\t\tlet totalOperations = 0;\n\t\t\ttry {\n\t\t\t\ttotalOperations = parsePatch(normalizedParams.input).length;\n\t\t\t} catch {\n\t\t\t\t// createPendingPatchUpdate keeps incomplete or invalid patch text renderable.\n\t\t\t}\n\t\t\tconst initialProgress = totalOperations > 0 ? { applied: 0, failed: 0, total: totalOperations } : undefined;\n\t\t\tconst pendingUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, initialProgress);\n\t\t\tonUpdate?.({ content: [{ type: \"text\", text: pendingUpdate.text }], details: pendingUpdate.details });\n\t\t\tconst preview = pendingUpdate.details?.preview;\n\t\t\tconst result = await applyPatchDetailed(ctx.cwd, normalizedParams.input, async (progress) => {\n\t\t\t\tconst progressUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, progress, preview);\n\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: progressUpdate.text }], details: progressUpdate.details });\n\t\t\t});\n\t\t\tconst resultPreview = appliedPreview(result);\n\t\t\tif (result.failures.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: buildPartialFailureText(result) }],\n\t\t\t\t\tdetails: resultPreview ? { preview: resultPreview, result } : { result },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: result.summaries.join(\"\\n\") }],\n\t\t\t\tdetails: resultPreview ? { preview: resultPreview, result } : { result },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context: ToolRenderContext<ApplyPatchRenderState, { input: string }>) {\n\t\t\tif (!context.executionStarted) {\n\t\t\t\tconst streaming = renderStreamingPatchCall(normalizeApplyPatchArguments(args), theme, context.state);\n\t\t\t\tif (streaming) return streaming;\n\t\t\t}\n\t\t\tif (!context.argsComplete) return new Text(theme.fg(\"toolTitle\", theme.bold(\"apply_patch: Patching\")), 0, 0);\n\t\t\tconst normalizedArgs = normalizeApplyPatchArguments(args);\n\t\t\tconst renderState = getApplyPatchRenderState(context.toolCallId, context.cwd, normalizedArgs.input);\n\t\t\tconst text = renderState.callText?.length ? `apply_patch: ${renderState.callText}` : \"apply_patch\";\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(text)), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (result.details?.preview) {\n\t\t\t\tconst expanded = true;\n\t\t\t\treturn renderPreviewBox(\n\t\t\t\t\toptions.isPartial ? \"Applying patch\" : \"Applied patch\",\n\t\t\t\t\tresult.details,\n\t\t\t\t\toptions.isPartial,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t\texpanded,\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (result.details?.result) {\n\t\t\t\tconst component = new Container();\n\t\t\t\tconst box = new Box(1, 1, (text: string) =>\n\t\t\t\t\ttheme.bg(options.isPartial ? \"toolPendingBg\" : \"toolSuccessBg\", text),\n\t\t\t\t);\n\t\t\t\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(\"Applying patch\")), 0, 0));\n\t\t\t\tbox.addChild(new Spacer(1));\n\t\t\t\tif (result.details.preview) {\n\t\t\t\t\tconst expanded = options.isPartial ? true : (options.expanded ?? true);\n\t\t\t\t\tbox.addChild(new Text(renderPatchPreview(result.details.preview, context.cwd, theme, expanded), 0, 0));\n\t\t\t\t}\n\t\t\t\tcomponent.addChild(box);\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\treturn renderTextResult(result, theme);\n\t\t},\n\t});\n\n\tif (variant === \"json\") return tool;\n\treturn Object.assign(tool, {\n\t\tfreeform: { type: \"grammar\", syntax: \"lark\", definition: APPLY_PATCH_LARK_GRAMMAR } satisfies FreeformToolFormat,\n\t});\n}\n"]}
|
|
@@ -64,6 +64,7 @@ export type ApplyPatchFailure = {
|
|
|
64
64
|
filePath: string;
|
|
65
65
|
operation: ApplyPatchOperation;
|
|
66
66
|
message: string;
|
|
67
|
+
code?: string | undefined;
|
|
67
68
|
};
|
|
68
69
|
export type AppliedPatchOperation = {
|
|
69
70
|
operationIndex: number;
|
|
@@ -72,6 +73,7 @@ export type AppliedPatchOperation = {
|
|
|
72
73
|
export type ApplyPatchRecoveryInstructions = {
|
|
73
74
|
mustReadFiles: string[];
|
|
74
75
|
mustNotReadFiles: string[];
|
|
76
|
+
failedFiles: string[];
|
|
75
77
|
};
|
|
76
78
|
export type ApplyPatchResult = {
|
|
77
79
|
summaries: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,MAAM,WAAW,GACpB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,UAAU,GAAG;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9D,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAExE,MAAM,MAAM,sBAAsB,GAAG;IACpC,kGAAkG;IAClG,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEhG,MAAM,MAAM,iBAAiB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExtensionAPI, ToolDefinition } from \"../../types.ts\";\nimport type { APPLY_PATCH_PARAMS } from \"./constants.ts\";\n\nexport type ParsedPatch =\n\t| { type: \"add\"; filePath: string; content: string }\n\t| { type: \"delete\"; filePath: string }\n\t| { type: \"update\"; filePath: string; movePath?: string; chunks: PatchChunk[] };\n\nexport type PatchChunk = {\n\tchangeContexts: string[];\n\toldLines: string[];\n\tnewLines: string[];\n\tisEndOfFile: boolean;\n};\n\nexport type ApplyPatchWireMode = \"freeform\" | \"json\" | \"none\";\n\nexport type ApplyPatchToolVariant = Exclude<ApplyPatchWireMode, \"none\">;\n\nexport type ApplyPatchToolsetState = {\n\t/** Exactly the edit-family tools this extension removed at the last non-GPT to GPT transition. */\n\tremovedEditToolNames: string[];\n};\n\nexport type FreeformToolFormat = {\n\ttype: \"grammar\";\n\tsyntax: \"lark\";\n\tdefinition: string;\n};\n\nexport type ApplyPatchParams = {\n\tinput: string;\n};\n\nexport type ApplyPatchOperation = \"add\" | \"delete\" | \"update\";\n\nexport type ApplyPatchPreviewFile = {\n\tfilePath: string;\n\tmovePath?: string;\n\toperation: ApplyPatchOperation;\n\tdiff: string;\n\tpatch?: string;\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchPreview = {\n\tfiles: ApplyPatchPreviewFile[];\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchToolDetails = {\n\tpreview?: ApplyPatchPreview;\n\tprogress?: ApplyPatchProgress;\n\tresult?: ApplyPatchResult;\n};\n\nexport type ApplyPatchProgress = {\n\tapplied: number;\n\tfailed: number;\n\ttotal: number;\n};\n\nexport type ApplyPatchProgressCallback = (progress: ApplyPatchProgress) => Promise<void> | void;\n\nexport type ApplyPatchFailure = {\n\toperationIndex: number;\n\tfilePath: string;\n\toperation: ApplyPatchOperation;\n\tmessage: string;\n};\n\nexport type AppliedPatchOperation = {\n\toperationIndex: number;\n\tpreview: ApplyPatchPreviewFile;\n};\n\nexport type ApplyPatchRecoveryInstructions = {\n\tmustReadFiles: string[];\n\tmustNotReadFiles: string[];\n};\n\nexport type ApplyPatchResult = {\n\tsummaries: string[];\n\tappliedFiles: string[];\n\tfailures: ApplyPatchFailure[];\n\thasPartialSuccess: boolean;\n\trecoveryInstructions: ApplyPatchRecoveryInstructions;\n\tdetails: {\n\t\tfuzz: number;\n\t\tappliedOperations: AppliedPatchOperation[];\n\t};\n};\n\nexport type AtomicWriteOperations = {\n\twriteFile: (filePath: string, content: string, encoding: \"utf-8\") => Promise<void>;\n\trename: (fromPath: string, toPath: string) => Promise<void>;\n\tunlink: (filePath: string) => Promise<void>;\n};\n\nexport type ApplyPatchThemeColor =\n\t| \"accent\"\n\t| \"error\"\n\t| \"muted\"\n\t| \"toolDiffAdded\"\n\t| \"toolDiffContext\"\n\t| \"toolDiffRemoved\"\n\t| \"toolOutput\"\n\t| \"toolTitle\";\n\nexport type ApplyPatchThemeBg = \"toolErrorBg\" | \"toolPendingBg\" | \"toolSuccessBg\";\n\nexport type ApplyPatchTheme = {\n\tfg: (name: ApplyPatchThemeColor, text: string) => string;\n\tbg: (name: ApplyPatchThemeBg, text: string) => string;\n\tbold: (text: string) => string;\n\tinverse: (text: string) => string;\n};\n\nexport type ApplyPatchRenderState = {\n\tcwd?: string;\n\tpatchText?: string;\n\tcallText?: string;\n\tcollapsed?: string;\n\texpanded?: string;\n\tstreamingInput?: string;\n\tstreamingParser?: { pushDelta: (delta: string) => ParsedPatch[] };\n\tstreamingHunks?: ParsedPatch[];\n\tstreamingError?: string;\n};\n\nexport type ApplyPatchToolDefinition = ToolDefinition<\n\ttypeof APPLY_PATCH_PARAMS,\n\tApplyPatchToolDetails | undefined,\n\tApplyPatchRenderState\n>;\n\nexport type ApplyPatchExtensionAPI = Pick<ExtensionAPI, \"on\" | \"getActiveTools\" | \"getAllTools\" | \"setActiveTools\"> & {\n\tregisterTool: (tool: ApplyPatchToolDefinition) => void;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExtensionAPI, ToolDefinition } from \"../../types.ts\";\nimport type { APPLY_PATCH_PARAMS } from \"./constants.ts\";\n\nexport type ParsedPatch =\n\t| { type: \"add\"; filePath: string; content: string }\n\t| { type: \"delete\"; filePath: string }\n\t| { type: \"update\"; filePath: string; movePath?: string; chunks: PatchChunk[] };\n\nexport type PatchChunk = {\n\tchangeContexts: string[];\n\toldLines: string[];\n\tnewLines: string[];\n\tisEndOfFile: boolean;\n};\n\nexport type ApplyPatchWireMode = \"freeform\" | \"json\" | \"none\";\n\nexport type ApplyPatchToolVariant = Exclude<ApplyPatchWireMode, \"none\">;\n\nexport type ApplyPatchToolsetState = {\n\t/** Exactly the edit-family tools this extension removed at the last non-GPT to GPT transition. */\n\tremovedEditToolNames: string[];\n};\n\nexport type FreeformToolFormat = {\n\ttype: \"grammar\";\n\tsyntax: \"lark\";\n\tdefinition: string;\n};\n\nexport type ApplyPatchParams = {\n\tinput: string;\n};\n\nexport type ApplyPatchOperation = \"add\" | \"delete\" | \"update\";\n\nexport type ApplyPatchPreviewFile = {\n\tfilePath: string;\n\tmovePath?: string;\n\toperation: ApplyPatchOperation;\n\tdiff: string;\n\tpatch?: string;\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchPreview = {\n\tfiles: ApplyPatchPreviewFile[];\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchToolDetails = {\n\tpreview?: ApplyPatchPreview;\n\tprogress?: ApplyPatchProgress;\n\tresult?: ApplyPatchResult;\n};\n\nexport type ApplyPatchProgress = {\n\tapplied: number;\n\tfailed: number;\n\ttotal: number;\n};\n\nexport type ApplyPatchProgressCallback = (progress: ApplyPatchProgress) => Promise<void> | void;\n\nexport type ApplyPatchFailure = {\n\toperationIndex: number;\n\tfilePath: string;\n\toperation: ApplyPatchOperation;\n\tmessage: string;\n\tcode?: string | undefined;\n};\n\nexport type AppliedPatchOperation = {\n\toperationIndex: number;\n\tpreview: ApplyPatchPreviewFile;\n};\n\nexport type ApplyPatchRecoveryInstructions = {\n\tmustReadFiles: string[];\n\tmustNotReadFiles: string[];\n\tfailedFiles: string[];\n};\n\nexport type ApplyPatchResult = {\n\tsummaries: string[];\n\tappliedFiles: string[];\n\tfailures: ApplyPatchFailure[];\n\thasPartialSuccess: boolean;\n\trecoveryInstructions: ApplyPatchRecoveryInstructions;\n\tdetails: {\n\t\tfuzz: number;\n\t\tappliedOperations: AppliedPatchOperation[];\n\t};\n};\n\nexport type AtomicWriteOperations = {\n\twriteFile: (filePath: string, content: string, encoding: \"utf-8\") => Promise<void>;\n\trename: (fromPath: string, toPath: string) => Promise<void>;\n\tunlink: (filePath: string) => Promise<void>;\n};\n\nexport type ApplyPatchThemeColor =\n\t| \"accent\"\n\t| \"error\"\n\t| \"muted\"\n\t| \"toolDiffAdded\"\n\t| \"toolDiffContext\"\n\t| \"toolDiffRemoved\"\n\t| \"toolOutput\"\n\t| \"toolTitle\";\n\nexport type ApplyPatchThemeBg = \"toolErrorBg\" | \"toolPendingBg\" | \"toolSuccessBg\";\n\nexport type ApplyPatchTheme = {\n\tfg: (name: ApplyPatchThemeColor, text: string) => string;\n\tbg: (name: ApplyPatchThemeBg, text: string) => string;\n\tbold: (text: string) => string;\n\tinverse: (text: string) => string;\n};\n\nexport type ApplyPatchRenderState = {\n\tcwd?: string;\n\tpatchText?: string;\n\tcallText?: string;\n\tcollapsed?: string;\n\texpanded?: string;\n\tstreamingInput?: string;\n\tstreamingParser?: { pushDelta: (delta: string) => ParsedPatch[] };\n\tstreamingHunks?: ParsedPatch[];\n\tstreamingError?: string;\n};\n\nexport type ApplyPatchToolDefinition = ToolDefinition<\n\ttypeof APPLY_PATCH_PARAMS,\n\tApplyPatchToolDetails | undefined,\n\tApplyPatchRenderState\n>;\n\nexport type ApplyPatchExtensionAPI = Pick<ExtensionAPI, \"on\" | \"getActiveTools\" | \"getAllTools\" | \"setActiveTools\"> & {\n\tregisterTool: (tool: ApplyPatchToolDefinition) => void;\n};\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
3
|
+
export declare function isSensitiveHighReasoningModel(model: Pick<Model<Api>, "id">): boolean;
|
|
4
|
+
export declare function shouldWarnHighReasoning(model: Pick<Model<Api>, "id">, thinkingLevel: ThinkingLevel): boolean;
|
|
5
|
+
export interface HighReasoningWarningContent {
|
|
6
|
+
readonly title: string;
|
|
7
|
+
readonly body: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function buildHighReasoningWarning(model: Pick<Model<Api>, "id" | "provider">, thinkingLevel: ThinkingLevel): HighReasoningWarningContent;
|
|
10
|
+
//# sourceMappingURL=high-reasoning-warning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"high-reasoning-warning.d.ts","sourceRoot":"","sources":["../../src/core/high-reasoning-warning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAQxD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,OAAO,CAEpF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAE5G;AAED,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,UAAU,CAAC,EAC1C,aAAa,EAAE,aAAa,GAC1B,2BAA2B,CAe7B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Matches only the gpt-5.x "sol" variants (gpt-5.6-sol, -sol-fast, -sol-pro and
|
|
2
|
+
// provider-prefixed forms such as openai/ or openai.). The trailing negative
|
|
3
|
+
// lookahead stops unrelated ids that merely continue with letters after "sol" —
|
|
4
|
+
// notably upstage/solar-pro-3 — from matching.
|
|
5
|
+
const SOL_MODEL_ID_PATTERN = /gpt-5(?:\.\d+)?-sol(?![a-z])/i;
|
|
6
|
+
export function isSensitiveHighReasoningModel(model) {
|
|
7
|
+
return SOL_MODEL_ID_PATTERN.test(model.id);
|
|
8
|
+
}
|
|
9
|
+
export function shouldWarnHighReasoning(model, thinkingLevel) {
|
|
10
|
+
return (thinkingLevel === "xhigh" || thinkingLevel === "max") && isSensitiveHighReasoningModel(model);
|
|
11
|
+
}
|
|
12
|
+
export function buildHighReasoningWarning(model, thinkingLevel) {
|
|
13
|
+
const modelId = model.id;
|
|
14
|
+
const title = `⚠ HIGH-REASONING MODEL WARNING — ${model.provider}/${modelId} @ ${thinkingLevel}`;
|
|
15
|
+
const body = [
|
|
16
|
+
`${modelId} is a frontier reasoning model. Running it at "${thinkingLevel}" effort makes it acutely sensitive to prompt quality.`,
|
|
17
|
+
"Driving this model directly from a human prompt is NOT recommended. Risks include:",
|
|
18
|
+
" • The model may refuse to stop, looping or working far past the stated goal.",
|
|
19
|
+
' • It may perform unrequested actions in order to "complete" the task.',
|
|
20
|
+
" • It may take risky, irreversible, or dangerous actions to force completion.",
|
|
21
|
+
"Strongly recommended: use this model ONLY through the ultrabrain subagent.",
|
|
22
|
+
"Human prompts leave gaps; an agent-authored prompt is denser and stricter than a human's — exactly what these high-effort models need to stay bounded.",
|
|
23
|
+
'From the main agent, delegate instead: "query ultrabrain with <task>".',
|
|
24
|
+
`If you drive this model directly at ${thinkingLevel}, YOU assume ALL responsibility for the consequences.`,
|
|
25
|
+
];
|
|
26
|
+
return { title, body };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=high-reasoning-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"high-reasoning-warning.js","sourceRoot":"","sources":["../../src/core/high-reasoning-warning.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,6EAA6E;AAC7E,gFAAgF;AAChF,+CAA+C;AAC/C,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAE7D,MAAM,UAAU,6BAA6B,CAAC,KAA6B;IAC1E,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA6B,EAAE,aAA4B;IAClG,OAAO,CAAC,aAAa,KAAK,OAAO,IAAI,aAAa,KAAK,KAAK,CAAC,IAAI,6BAA6B,CAAC,KAAK,CAAC,CAAC;AACvG,CAAC;AAOD,MAAM,UAAU,yBAAyB,CACxC,KAA0C,EAC1C,aAA4B;IAE5B,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,oCAAoC,KAAK,CAAC,QAAQ,IAAI,OAAO,MAAM,aAAa,EAAE,CAAC;IACjG,MAAM,IAAI,GAAG;QACZ,GAAG,OAAO,kDAAkD,aAAa,wDAAwD;QACjI,oFAAoF;QACpF,gFAAgF;QAChF,yEAAyE;QACzE,gFAAgF;QAChF,4EAA4E;QAC5E,wJAAwJ;QACxJ,wEAAwE;QACxE,uCAAuC,aAAa,uDAAuD;KAC3G,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\n\n// Matches only the gpt-5.x \"sol\" variants (gpt-5.6-sol, -sol-fast, -sol-pro and\n// provider-prefixed forms such as openai/ or openai.). The trailing negative\n// lookahead stops unrelated ids that merely continue with letters after \"sol\" —\n// notably upstage/solar-pro-3 — from matching.\nconst SOL_MODEL_ID_PATTERN = /gpt-5(?:\\.\\d+)?-sol(?![a-z])/i;\n\nexport function isSensitiveHighReasoningModel(model: Pick<Model<Api>, \"id\">): boolean {\n\treturn SOL_MODEL_ID_PATTERN.test(model.id);\n}\n\nexport function shouldWarnHighReasoning(model: Pick<Model<Api>, \"id\">, thinkingLevel: ThinkingLevel): boolean {\n\treturn (thinkingLevel === \"xhigh\" || thinkingLevel === \"max\") && isSensitiveHighReasoningModel(model);\n}\n\nexport interface HighReasoningWarningContent {\n\treadonly title: string;\n\treadonly body: readonly string[];\n}\n\nexport function buildHighReasoningWarning(\n\tmodel: Pick<Model<Api>, \"id\" | \"provider\">,\n\tthinkingLevel: ThinkingLevel,\n): HighReasoningWarningContent {\n\tconst modelId = model.id;\n\tconst title = `⚠ HIGH-REASONING MODEL WARNING — ${model.provider}/${modelId} @ ${thinkingLevel}`;\n\tconst body = [\n\t\t`${modelId} is a frontier reasoning model. Running it at \"${thinkingLevel}\" effort makes it acutely sensitive to prompt quality.`,\n\t\t\"Driving this model directly from a human prompt is NOT recommended. Risks include:\",\n\t\t\" • The model may refuse to stop, looping or working far past the stated goal.\",\n\t\t' • It may perform unrequested actions in order to \"complete\" the task.',\n\t\t\" • It may take risky, irreversible, or dangerous actions to force completion.\",\n\t\t\"Strongly recommended: use this model ONLY through the ultrabrain subagent.\",\n\t\t\"Human prompts leave gaps; an agent-authored prompt is denser and stricter than a human's — exactly what these high-effort models need to stay bounded.\",\n\t\t'From the main agent, delegate instead: \"query ultrabrain with <task>\".',\n\t\t`If you drive this model directly at ${thinkingLevel}, YOU assume ALL responsibility for the consequences.`,\n\t];\n\treturn { title, body };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-runtime.d.ts","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,GAAG,EAER,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"model-runtime.d.ts","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dirname, join } from "node:path";
|
|
2
|
-
import { createModels,
|
|
2
|
+
import { createModels, lazyStream, ModelsError, wrapStreamWithModelRecovery, } from "@earendil-works/pi-ai";
|
|
3
3
|
import * as builtinProviderCatalog from "@earendil-works/pi-ai/providers/all";
|
|
4
4
|
import { getAgentDir } from "../config.js";
|
|
5
5
|
import { AuthStorage as DefaultAuthStorage } from "./auth-storage.js";
|
|
@@ -381,11 +381,7 @@ export class ModelRuntime {
|
|
|
381
381
|
return lazyStream(model, async () => {
|
|
382
382
|
const prepared = await this.prepareRequest(model, options);
|
|
383
383
|
const inner = prepared.provider.stream(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model));
|
|
384
|
-
return
|
|
385
|
-
? wrapStreamWithInvokeRecovery(inner, context.tools, hasKimiTextToolCallRecovery(model)
|
|
386
|
-
? { createParser: createXtmlRecoveryStreamParser, protocol: "kimi-xtml" }
|
|
387
|
-
: undefined)
|
|
388
|
-
: inner;
|
|
384
|
+
return wrapStreamWithModelRecovery(inner, model, context.tools ?? []);
|
|
389
385
|
});
|
|
390
386
|
}
|
|
391
387
|
complete(model, context, options) {
|
|
@@ -395,11 +391,7 @@ export class ModelRuntime {
|
|
|
395
391
|
return lazyStream(model, async () => {
|
|
396
392
|
const prepared = await this.prepareRequest(model, options);
|
|
397
393
|
const inner = prepared.provider.streamSimple(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model));
|
|
398
|
-
return
|
|
399
|
-
? wrapStreamWithInvokeRecovery(inner, context.tools, hasKimiTextToolCallRecovery(model)
|
|
400
|
-
? { createParser: createXtmlRecoveryStreamParser, protocol: "kimi-xtml" }
|
|
401
|
-
: undefined)
|
|
402
|
-
: inner;
|
|
394
|
+
return wrapStreamWithModelRecovery(inner, model, context.tools ?? []);
|
|
403
395
|
});
|
|
404
396
|
}
|
|
405
397
|
completeSimple(model, context, options) {
|