@chances-ai/engine 28.0.0 → 30.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/index.js +1 -1
- package/dist/ai/adapters/ai-sdk-stream.js +15 -0
- package/dist/ai/adapters/ai-sdk-stream.js.map +1 -1
- package/dist/ai/adapters/ai-sdk.js +1 -1
- package/dist/ai/adapters/ai-sdk.js.map +1 -1
- package/dist/ai/setup.d.ts +1 -1
- package/dist/ai/setup.js +1 -1
- package/dist/ai/types.d.ts +13 -1
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/core/engine.d.ts +17 -3
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +49 -3
- package/dist/core/engine.js.map +1 -1
- package/dist/core/task-tool.d.ts +1 -1
- package/dist/core/task-tool.js +1 -1
- package/dist/core/workspace-query.d.ts +1 -1
- package/dist/core/workspace-query.js +1 -1
- package/dist/hashline/apply.d.ts +9 -0
- package/dist/hashline/apply.d.ts.map +1 -0
- package/dist/hashline/apply.js +523 -0
- package/dist/hashline/apply.js.map +1 -0
- package/dist/hashline/block.d.ts +25 -0
- package/dist/hashline/block.d.ts.map +1 -0
- package/dist/hashline/block.js +71 -0
- package/dist/hashline/block.js.map +1 -0
- package/dist/hashline/format.d.ts +106 -0
- package/dist/hashline/format.d.ts.map +1 -0
- package/dist/hashline/format.js +191 -0
- package/dist/hashline/format.js.map +1 -0
- package/dist/hashline/fs.d.ts +87 -0
- package/dist/hashline/fs.d.ts.map +1 -0
- package/dist/hashline/fs.js +123 -0
- package/dist/hashline/fs.js.map +1 -0
- package/dist/hashline/index.d.ts +27 -0
- package/dist/hashline/index.d.ts.map +1 -0
- package/dist/hashline/index.js +27 -0
- package/dist/hashline/index.js.map +1 -0
- package/dist/hashline/input.d.ts +101 -0
- package/dist/hashline/input.d.ts.map +1 -0
- package/dist/hashline/input.js +378 -0
- package/dist/hashline/input.js.map +1 -0
- package/dist/hashline/messages.d.ts +87 -0
- package/dist/hashline/messages.d.ts.map +1 -0
- package/dist/hashline/messages.js +94 -0
- package/dist/hashline/messages.js.map +1 -0
- package/dist/hashline/mismatch.d.ts +45 -0
- package/dist/hashline/mismatch.d.ts.map +1 -0
- package/dist/hashline/mismatch.js +118 -0
- package/dist/hashline/mismatch.js.map +1 -0
- package/dist/hashline/normalize.d.ts +22 -0
- package/dist/hashline/normalize.d.ts.map +1 -0
- package/dist/hashline/normalize.js +31 -0
- package/dist/hashline/normalize.js.map +1 -0
- package/dist/hashline/parser.d.ts +24 -0
- package/dist/hashline/parser.d.ts.map +1 -0
- package/dist/hashline/parser.js +295 -0
- package/dist/hashline/parser.js.map +1 -0
- package/dist/hashline/patcher.d.ts +111 -0
- package/dist/hashline/patcher.d.ts.map +1 -0
- package/dist/hashline/patcher.js +332 -0
- package/dist/hashline/patcher.js.map +1 -0
- package/dist/hashline/recovery.d.ts +41 -0
- package/dist/hashline/recovery.d.ts.map +1 -0
- package/dist/hashline/recovery.js +175 -0
- package/dist/hashline/recovery.js.map +1 -0
- package/dist/hashline/snapshots.d.ts +62 -0
- package/dist/hashline/snapshots.d.ts.map +1 -0
- package/dist/hashline/snapshots.js +127 -0
- package/dist/hashline/snapshots.js.map +1 -0
- package/dist/hashline/tokenizer.d.ts +66 -0
- package/dist/hashline/tokenizer.d.ts.map +1 -0
- package/dist/hashline/tokenizer.js +408 -0
- package/dist/hashline/tokenizer.js.map +1 -0
- package/dist/hashline/types.d.ts +117 -0
- package/dist/hashline/types.d.ts.map +1 -0
- package/dist/hashline/types.js +13 -0
- package/dist/hashline/types.js.map +1 -0
- package/dist/local-vault/index.d.ts +1 -1
- package/dist/local-vault/index.js +1 -1
- package/dist/lsp/index.d.ts +1 -1
- package/dist/lsp/index.js +1 -1
- package/dist/lsp/types.d.ts +2 -2
- package/dist/mcp/host.d.ts +3 -3
- package/dist/mcp/load-mcp-host.d.ts +4 -4
- package/dist/mcp/load-mcp-host.js +4 -4
- package/dist/mcp/oauth/provider.d.ts.map +1 -1
- package/dist/mcp/oauth/provider.js +10 -1
- package/dist/mcp/oauth/provider.js.map +1 -1
- package/dist/plugin-api/index.d.ts +10 -2
- package/dist/plugin-api/index.d.ts.map +1 -1
- package/dist/plugin-api/index.js +15 -0
- package/dist/plugin-api/index.js.map +1 -1
- package/dist/tools/approval.d.ts +1 -1
- package/dist/tools/approval.js +1 -1
- package/dist/tools/builtins/_hashline-fs.d.ts +16 -0
- package/dist/tools/builtins/_hashline-fs.d.ts.map +1 -0
- package/dist/tools/builtins/_hashline-fs.js +62 -0
- package/dist/tools/builtins/_hashline-fs.js.map +1 -0
- package/dist/tools/builtins/_image.d.ts +26 -0
- package/dist/tools/builtins/_image.d.ts.map +1 -0
- package/dist/tools/builtins/_image.js +76 -0
- package/dist/tools/builtins/_image.js.map +1 -0
- package/dist/tools/builtins/_login-shell.d.ts +17 -0
- package/dist/tools/builtins/_login-shell.d.ts.map +1 -0
- package/dist/tools/builtins/_login-shell.js +66 -0
- package/dist/tools/builtins/_login-shell.js.map +1 -0
- package/dist/tools/builtins/_notebook.d.ts +15 -0
- package/dist/tools/builtins/_notebook.d.ts.map +1 -0
- package/dist/tools/builtins/_notebook.js +81 -0
- package/dist/tools/builtins/_notebook.js.map +1 -0
- package/dist/tools/builtins/_pdf.d.ts +19 -0
- package/dist/tools/builtins/_pdf.d.ts.map +1 -0
- package/dist/tools/builtins/_pdf.js +42 -0
- package/dist/tools/builtins/_pdf.js.map +1 -0
- package/dist/tools/builtins/_shared.d.ts +11 -0
- package/dist/tools/builtins/_shared.d.ts.map +1 -1
- package/dist/tools/builtins/_shared.js +40 -1
- package/dist/tools/builtins/_shared.js.map +1 -1
- package/dist/tools/builtins/ast-edit.d.ts +18 -0
- package/dist/tools/builtins/ast-edit.d.ts.map +1 -0
- package/dist/tools/builtins/ast-edit.js +109 -0
- package/dist/tools/builtins/ast-edit.js.map +1 -0
- package/dist/tools/builtins/ast-grep.d.ts +6 -0
- package/dist/tools/builtins/ast-grep.d.ts.map +1 -0
- package/dist/tools/builtins/ast-grep.js +67 -0
- package/dist/tools/builtins/ast-grep.js.map +1 -0
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +13 -2
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/edit.d.ts.map +1 -1
- package/dist/tools/builtins/edit.js +112 -31
- package/dist/tools/builtins/edit.js.map +1 -1
- package/dist/tools/builtins/lsp.js +1 -1
- package/dist/tools/builtins/pty.d.ts +1 -1
- package/dist/tools/builtins/read.d.ts.map +1 -1
- package/dist/tools/builtins/read.js +187 -11
- package/dist/tools/builtins/read.js.map +1 -1
- package/dist/tools/builtins.d.ts.map +1 -1
- package/dist/tools/builtins.js +4 -0
- package/dist/tools/builtins.js.map +1 -1
- package/dist/tools/file-lock.d.ts +8 -0
- package/dist/tools/file-lock.d.ts.map +1 -1
- package/dist/tools/file-lock.js +22 -0
- package/dist/tools/file-lock.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +27 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/package.json +8 -3
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token-driven state machine that turns a stream of {@link Token}s into a
|
|
3
|
+
* flat list of {@link Edit}s. Sits between the {@link Tokenizer} and the
|
|
4
|
+
* applier. Ported from oh-my-pi `packages/hashline/src/parser.ts`.
|
|
5
|
+
*/
|
|
6
|
+
import { HL_PAYLOAD_REPLACE } from "./format.js";
|
|
7
|
+
import { BARE_BODY_AUTO_PIPED_WARNING, DELETE_BLOCK_TAKES_NO_BODY, DELETE_TAKES_NO_BODY, EMPTY_BLOCK, EMPTY_INSERT, MINUS_ROW_REJECTED, } from "./messages.js";
|
|
8
|
+
import { cloneCursor, Tokenizer } from "./tokenizer.js";
|
|
9
|
+
function validateRangeOrder(range, lineNum) {
|
|
10
|
+
if (range.end.line < range.start.line) {
|
|
11
|
+
throw new Error(`line ${lineNum}: range ${range.start.line}..${range.end.line} ends before it starts.`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function expandRange(range) {
|
|
15
|
+
const anchors = [];
|
|
16
|
+
for (let line = range.start.line; line <= range.end.line; line++)
|
|
17
|
+
anchors.push({ line });
|
|
18
|
+
return anchors;
|
|
19
|
+
}
|
|
20
|
+
function isSkippableCommentLine(line) {
|
|
21
|
+
return line.trimStart().startsWith("#");
|
|
22
|
+
}
|
|
23
|
+
function detectApplyPatchContamination(text, _hasPending) {
|
|
24
|
+
const trimmed = text.trimStart();
|
|
25
|
+
if (trimmed.length === 0)
|
|
26
|
+
return null;
|
|
27
|
+
if (trimmed.startsWith("*** Update File:") ||
|
|
28
|
+
trimmed.startsWith("*** Add File:") ||
|
|
29
|
+
trimmed.startsWith("*** Delete File:") ||
|
|
30
|
+
trimmed.startsWith("*** Move to:")) {
|
|
31
|
+
const preview = trimmed.length > 48 ? `${trimmed.slice(0, 48)}…` : trimmed;
|
|
32
|
+
return (`apply_patch sentinel ${JSON.stringify(preview)} is not valid in hashline. ` +
|
|
33
|
+
"File sections start with `¶path#HASH` (no `Update File:` / `Add File:` keyword). " +
|
|
34
|
+
"Use `replace N..M:`, `delete N..M`, or `insert before|after|head|tail:` ops.");
|
|
35
|
+
}
|
|
36
|
+
if (/^@@\s+[-+]?\d+,\d+\s+[-+]?\d+,\d+\s+@@/.test(trimmed)) {
|
|
37
|
+
return ("unified-diff hunk header (`@@ -N,M +N,M @@`) is not valid in hashline. " +
|
|
38
|
+
"Use `replace N..M:`, `delete N..M`, or `insert before|after|head|tail:` ops.");
|
|
39
|
+
}
|
|
40
|
+
if (trimmed.startsWith("@@")) {
|
|
41
|
+
const preview = trimmed.length > 48 ? `${trimmed.slice(0, 48)}…` : trimmed;
|
|
42
|
+
return (`\`@@\`-bracketed hunk header ${JSON.stringify(preview)} is not valid in hashline. ` +
|
|
43
|
+
"Drop the `@@ ... @@` brackets and write a verb header such as `replace N..M:`.");
|
|
44
|
+
}
|
|
45
|
+
if (/^delete\s+[1-9]\d*(?:\s*(?:\.\.|-|…|\s)\s*[1-9]\d*)?\s*:/.test(trimmed)) {
|
|
46
|
+
return "`delete N..M` has no colon and no body. Remove the colon and body rows.";
|
|
47
|
+
}
|
|
48
|
+
if (/^[1-9]\d*\s*$/.test(trimmed)) {
|
|
49
|
+
return `hunk headers need a verb. Use \`replace ${trimmed}..${trimmed}:\` to replace, or \`delete ${trimmed}\` to delete.`;
|
|
50
|
+
}
|
|
51
|
+
const bareRange = /^([1-9]\d*)\s*[-. …]+\s*([1-9]\d*)\s*:?$/.exec(trimmed);
|
|
52
|
+
if (bareRange !== null) {
|
|
53
|
+
return (`bare range hunk header ${JSON.stringify(trimmed)} is not valid. ` +
|
|
54
|
+
`Hunk headers need a verb: write \`replace ${bareRange[1]}..${bareRange[2]}:\` or \`delete ${bareRange[1]}..${bareRange[2]}\`.`);
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
export class Executor {
|
|
59
|
+
#edits = [];
|
|
60
|
+
#warnings = [];
|
|
61
|
+
#editIndex = 0;
|
|
62
|
+
#pending;
|
|
63
|
+
#terminated = false;
|
|
64
|
+
#skippableComments = [];
|
|
65
|
+
#discardPendingSkippableComments() {
|
|
66
|
+
this.#skippableComments = [];
|
|
67
|
+
}
|
|
68
|
+
#consumePendingSkippableComments() {
|
|
69
|
+
if (this.#skippableComments.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
for (const comment of this.#skippableComments)
|
|
72
|
+
this.#handleRaw(comment.text, comment.lineNum);
|
|
73
|
+
this.#skippableComments = [];
|
|
74
|
+
}
|
|
75
|
+
feed(token) {
|
|
76
|
+
if (this.#terminated)
|
|
77
|
+
return;
|
|
78
|
+
switch (token.kind) {
|
|
79
|
+
case "envelope-begin":
|
|
80
|
+
this.#consumePendingSkippableComments();
|
|
81
|
+
return;
|
|
82
|
+
case "envelope-end":
|
|
83
|
+
this.#consumePendingSkippableComments();
|
|
84
|
+
this.#terminated = true;
|
|
85
|
+
return;
|
|
86
|
+
case "abort":
|
|
87
|
+
this.#terminated = true;
|
|
88
|
+
return;
|
|
89
|
+
case "header":
|
|
90
|
+
this.#consumePendingSkippableComments();
|
|
91
|
+
this.#flushPending();
|
|
92
|
+
return;
|
|
93
|
+
case "blank":
|
|
94
|
+
this.#consumePendingSkippableComments();
|
|
95
|
+
return;
|
|
96
|
+
case "payload-literal":
|
|
97
|
+
this.#consumePendingSkippableComments();
|
|
98
|
+
this.#handleLiteralPayload(token.text, token.lineNum);
|
|
99
|
+
return;
|
|
100
|
+
case "raw":
|
|
101
|
+
if (this.#pending === undefined && isSkippableCommentLine(token.text)) {
|
|
102
|
+
this.#skippableComments.push({ text: token.text, lineNum: token.lineNum });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.#consumePendingSkippableComments();
|
|
106
|
+
this.#handleRaw(token.text, token.lineNum);
|
|
107
|
+
return;
|
|
108
|
+
case "op-block":
|
|
109
|
+
this.#discardPendingSkippableComments();
|
|
110
|
+
if (token.target.kind === "replace" || token.target.kind === "delete") {
|
|
111
|
+
validateRangeOrder(token.target.range, token.lineNum);
|
|
112
|
+
}
|
|
113
|
+
this.#flushPending();
|
|
114
|
+
this.#pending = { target: token.target, lineNum: token.lineNum, payloads: [] };
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
end() {
|
|
119
|
+
this.#consumePendingSkippableComments();
|
|
120
|
+
this.#flushPending();
|
|
121
|
+
this.#validateNoOverlappingDeletes();
|
|
122
|
+
return { edits: this.#edits, warnings: this.#warnings };
|
|
123
|
+
}
|
|
124
|
+
endStreaming() {
|
|
125
|
+
this.#consumePendingSkippableComments();
|
|
126
|
+
if (this.#pending && this.#pending.payloads.length > 0)
|
|
127
|
+
this.#flushPending();
|
|
128
|
+
else if (this.#pending?.target.kind === "delete" || this.#pending?.target.kind === "delete_block")
|
|
129
|
+
this.#flushPending();
|
|
130
|
+
else
|
|
131
|
+
this.#pending = undefined;
|
|
132
|
+
this.#validateNoOverlappingDeletes();
|
|
133
|
+
return { edits: this.#edits, warnings: this.#warnings };
|
|
134
|
+
}
|
|
135
|
+
reset() {
|
|
136
|
+
this.#edits = [];
|
|
137
|
+
this.#warnings = [];
|
|
138
|
+
this.#editIndex = 0;
|
|
139
|
+
this.#pending = undefined;
|
|
140
|
+
this.#skippableComments = [];
|
|
141
|
+
this.#terminated = false;
|
|
142
|
+
}
|
|
143
|
+
#validateNoOverlappingDeletes() {
|
|
144
|
+
const sourceLinesByAnchor = new Map();
|
|
145
|
+
for (const edit of this.#edits) {
|
|
146
|
+
if (edit.kind !== "delete")
|
|
147
|
+
continue;
|
|
148
|
+
let sourceLines = sourceLinesByAnchor.get(edit.anchor.line);
|
|
149
|
+
if (sourceLines === undefined) {
|
|
150
|
+
sourceLines = [];
|
|
151
|
+
sourceLinesByAnchor.set(edit.anchor.line, sourceLines);
|
|
152
|
+
}
|
|
153
|
+
if (!sourceLines.includes(edit.lineNum))
|
|
154
|
+
sourceLines.push(edit.lineNum);
|
|
155
|
+
}
|
|
156
|
+
for (const [anchorLine, sourceLines] of sourceLinesByAnchor) {
|
|
157
|
+
if (sourceLines.length < 2)
|
|
158
|
+
continue;
|
|
159
|
+
const [firstBlock, secondBlock] = [...sourceLines].sort((a, b) => a - b);
|
|
160
|
+
throw new Error(`line ${secondBlock}: anchor line ${anchorLine} is already targeted by another hunk on line ${firstBlock}. ` +
|
|
161
|
+
"Issue ONE hunk per range; payload is only the final desired content, never a before/after pair.");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
#handleLiteralPayload(text, lineNum) {
|
|
165
|
+
const pending = this.#pending;
|
|
166
|
+
if (!pending) {
|
|
167
|
+
throw new Error(`line ${lineNum}: payload line has no preceding hunk header. ` +
|
|
168
|
+
`Got ${JSON.stringify(`${HL_PAYLOAD_REPLACE}${text}`)}.`);
|
|
169
|
+
}
|
|
170
|
+
if (pending.target.kind === "delete")
|
|
171
|
+
throw new Error(`line ${lineNum}: ${DELETE_TAKES_NO_BODY}`);
|
|
172
|
+
if (pending.target.kind === "delete_block")
|
|
173
|
+
throw new Error(`line ${lineNum}: ${DELETE_BLOCK_TAKES_NO_BODY}`);
|
|
174
|
+
pending.payloads.push({ kind: "literal", text, lineNum });
|
|
175
|
+
}
|
|
176
|
+
#handleRaw(text, lineNum) {
|
|
177
|
+
const contamination = detectApplyPatchContamination(text, this.#pending !== undefined);
|
|
178
|
+
if (contamination !== null)
|
|
179
|
+
throw new Error(`line ${lineNum}: ${contamination}`);
|
|
180
|
+
if (this.#pending) {
|
|
181
|
+
if (text.trim().length === 0)
|
|
182
|
+
return;
|
|
183
|
+
if (this.#pending.target.kind === "delete")
|
|
184
|
+
throw new Error(`line ${lineNum}: ${DELETE_TAKES_NO_BODY}`);
|
|
185
|
+
if (this.#pending.target.kind === "delete_block")
|
|
186
|
+
throw new Error(`line ${lineNum}: ${DELETE_BLOCK_TAKES_NO_BODY}`);
|
|
187
|
+
if (text.trimStart().charCodeAt(0) === 45 /* - */)
|
|
188
|
+
throw new Error(`line ${lineNum}: ${MINUS_ROW_REJECTED}`);
|
|
189
|
+
if (!this.#warnings.includes(BARE_BODY_AUTO_PIPED_WARNING))
|
|
190
|
+
this.#warnings.push(BARE_BODY_AUTO_PIPED_WARNING);
|
|
191
|
+
this.#pending.payloads.push({ kind: "literal", text, lineNum });
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (text.trim().length === 0)
|
|
195
|
+
return;
|
|
196
|
+
throw new Error(`line ${lineNum}: payload line has no preceding hunk header. ` +
|
|
197
|
+
`Use \`replace N..M:\`, \`delete N..M\`, or \`insert before|after|head|tail:\` above the body. Got ${JSON.stringify(text)}.`);
|
|
198
|
+
}
|
|
199
|
+
#pushInsert(cursor, text, lineNum, mode) {
|
|
200
|
+
this.#edits.push({
|
|
201
|
+
kind: "insert",
|
|
202
|
+
cursor: cloneCursor(cursor),
|
|
203
|
+
text,
|
|
204
|
+
lineNum,
|
|
205
|
+
index: this.#editIndex++,
|
|
206
|
+
...(mode === undefined ? {} : { mode }),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
#pushDelete(anchor, lineNum) {
|
|
210
|
+
this.#edits.push({ kind: "delete", anchor: { ...anchor }, lineNum, index: this.#editIndex++ });
|
|
211
|
+
}
|
|
212
|
+
#pushBlock(anchor, payloads, lineNum) {
|
|
213
|
+
this.#edits.push({
|
|
214
|
+
kind: "block",
|
|
215
|
+
anchor: { ...anchor },
|
|
216
|
+
payloads: payloads.map((payload) => payload.text),
|
|
217
|
+
lineNum,
|
|
218
|
+
index: this.#editIndex++,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
#emitPayloadRows(cursor, payloads, lineNum, mode) {
|
|
222
|
+
for (const payload of payloads)
|
|
223
|
+
this.#pushInsert(cursor, payload.text, lineNum, mode);
|
|
224
|
+
}
|
|
225
|
+
#flushPending() {
|
|
226
|
+
const pending = this.#pending;
|
|
227
|
+
if (!pending)
|
|
228
|
+
return;
|
|
229
|
+
const { target, lineNum, payloads } = pending;
|
|
230
|
+
this.#pending = undefined;
|
|
231
|
+
if (target.kind === "delete") {
|
|
232
|
+
for (const anchor of expandRange(target.range))
|
|
233
|
+
this.#pushDelete(anchor, lineNum);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (target.kind === "delete_block") {
|
|
237
|
+
// A block edit with no payloads resolves to a pure block deletion.
|
|
238
|
+
this.#pushBlock(target.anchor, [], lineNum);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (target.kind === "block") {
|
|
242
|
+
if (payloads.length === 0)
|
|
243
|
+
throw new Error(`line ${lineNum}: ${EMPTY_BLOCK}`);
|
|
244
|
+
this.#pushBlock(target.anchor, payloads, lineNum);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (payloads.length === 0) {
|
|
248
|
+
if (target.kind === "replace") {
|
|
249
|
+
for (const anchor of expandRange(target.range))
|
|
250
|
+
this.#pushDelete(anchor, lineNum);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
throw new Error(`line ${lineNum}: ${EMPTY_INSERT}`);
|
|
254
|
+
}
|
|
255
|
+
if (target.kind === "replace") {
|
|
256
|
+
const cursor = { kind: "before_anchor", anchor: { ...target.range.start } };
|
|
257
|
+
this.#emitPayloadRows(cursor, payloads, lineNum, "replacement");
|
|
258
|
+
for (const anchor of expandRange(target.range))
|
|
259
|
+
this.#pushDelete(anchor, lineNum);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (target.kind === "insert_before") {
|
|
263
|
+
this.#emitPayloadRows({ kind: "before_anchor", anchor: { ...target.anchor } }, payloads, lineNum);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (target.kind === "insert_after") {
|
|
267
|
+
this.#emitPayloadRows({ kind: "after_anchor", anchor: { ...target.anchor } }, payloads, lineNum);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const cursor = target.kind === "bof" ? { kind: "bof" } : { kind: "eof" };
|
|
271
|
+
this.#emitPayloadRows(cursor, payloads, lineNum);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function drain(executor, tokenizer) {
|
|
275
|
+
for (const token of tokenizer.end())
|
|
276
|
+
executor.feed(token);
|
|
277
|
+
return executor.end();
|
|
278
|
+
}
|
|
279
|
+
export function parsePatch(diff) {
|
|
280
|
+
const tokenizer = new Tokenizer();
|
|
281
|
+
const executor = new Executor();
|
|
282
|
+
for (const token of tokenizer.feed(diff))
|
|
283
|
+
executor.feed(token);
|
|
284
|
+
return drain(executor, tokenizer);
|
|
285
|
+
}
|
|
286
|
+
export function parsePatchStreaming(diff) {
|
|
287
|
+
const tokenizer = new Tokenizer();
|
|
288
|
+
const executor = new Executor();
|
|
289
|
+
for (const token of tokenizer.feed(diff))
|
|
290
|
+
executor.feed(token);
|
|
291
|
+
for (const token of tokenizer.end())
|
|
292
|
+
executor.feed(token);
|
|
293
|
+
return executor.endStreaming();
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/hashline/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { Filesystem } from "./fs.js";
|
|
2
|
+
import type { Patch, PatchSection } from "./input.js";
|
|
3
|
+
import { type LineEnding } from "./normalize.js";
|
|
4
|
+
import { Recovery } from "./recovery.js";
|
|
5
|
+
import type { SnapshotStore } from "./snapshots.js";
|
|
6
|
+
import type { ApplyResult, BlockResolver } from "./types.js";
|
|
7
|
+
export interface PatcherOptions {
|
|
8
|
+
/** Storage backend used for all reads and writes. */
|
|
9
|
+
fs: Filesystem;
|
|
10
|
+
/** Snapshot store that minted and resolves hashline section tags. Required. */
|
|
11
|
+
snapshots: SnapshotStore;
|
|
12
|
+
/**
|
|
13
|
+
* Resolves `replace block N:` anchors to concrete line spans via tree-sitter.
|
|
14
|
+
* Optional: when omitted, any `replace block N:` edit throws on apply (the
|
|
15
|
+
* host did not wire a resolver). Plain line-range ops never need it. In
|
|
16
|
+
* chances-cli this is backed by `native.blockRangeAt` (capability-gated).
|
|
17
|
+
*/
|
|
18
|
+
blockResolver?: BlockResolver;
|
|
19
|
+
}
|
|
20
|
+
/** Per-section result returned by {@link Patcher.apply} / {@link Patcher.commit}. */
|
|
21
|
+
export interface PatchSectionResult {
|
|
22
|
+
/** Section path (as authored, after cwd-resolution at parse time). */
|
|
23
|
+
path: string;
|
|
24
|
+
/** Filesystem-canonical key for this section (e.g. absolute path). */
|
|
25
|
+
canonicalPath: string;
|
|
26
|
+
/** `"noop"` when the apply produced no change; otherwise `"create"` / `"update"`. */
|
|
27
|
+
op: "create" | "update" | "noop";
|
|
28
|
+
/** Pre-edit text (LF-normalized, BOM-stripped). */
|
|
29
|
+
before: string;
|
|
30
|
+
/** Post-edit text (LF-normalized, BOM-stripped). For `"noop"` equals `before`. */
|
|
31
|
+
after: string;
|
|
32
|
+
/** Same text as `after` but with the original BOM and line ending restored. */
|
|
33
|
+
persisted: string;
|
|
34
|
+
/** Final text that the {@link Filesystem} actually wrote (may differ if the FS transformed it). */
|
|
35
|
+
written: string;
|
|
36
|
+
/** 4-hex content-hash snapshot tag for `after`. Use to anchor follow-up edits. */
|
|
37
|
+
fileHash: string;
|
|
38
|
+
/** Hashline section header (`¶path#tag`) of the post-edit content. */
|
|
39
|
+
header: string;
|
|
40
|
+
/** 1-indexed first changed line in `after`, or `undefined` for noops. */
|
|
41
|
+
firstChangedLine?: number;
|
|
42
|
+
/** Warnings collected by the parser, applier, and (optionally) recovery. */
|
|
43
|
+
warnings: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface PatcherApplyResult {
|
|
46
|
+
sections: PatchSectionResult[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Opaque token returned by {@link Patcher.prepare}. Carries the section, the
|
|
50
|
+
* raw file content read off disk, and the in-memory apply result.
|
|
51
|
+
* {@link Patcher.commit} just writes the {@link PreparedSection.applyResult}.
|
|
52
|
+
*/
|
|
53
|
+
export declare class PreparedSection {
|
|
54
|
+
readonly section: PatchSection;
|
|
55
|
+
readonly canonicalPath: string;
|
|
56
|
+
readonly exists: boolean;
|
|
57
|
+
readonly rawContent: string;
|
|
58
|
+
readonly bom: string;
|
|
59
|
+
readonly lineEnding: LineEnding;
|
|
60
|
+
readonly normalized: string;
|
|
61
|
+
readonly applyResult: ApplyResult;
|
|
62
|
+
readonly parseWarnings: readonly string[];
|
|
63
|
+
/** @internal */
|
|
64
|
+
constructor(section: PatchSection, canonicalPath: string, exists: boolean, rawContent: string, bom: string, lineEnding: LineEnding, normalized: string, applyResult: ApplyResult, parseWarnings: readonly string[]);
|
|
65
|
+
/** Convenience: returns true when the apply produced no change. */
|
|
66
|
+
get isNoop(): boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* High-level patcher. Wires a {@link Filesystem} and a required
|
|
70
|
+
* {@link SnapshotStore} together with the parsing + applying core.
|
|
71
|
+
*
|
|
72
|
+
* Construct once per FS configuration; reuse across patches.
|
|
73
|
+
*/
|
|
74
|
+
export declare class Patcher {
|
|
75
|
+
#private;
|
|
76
|
+
readonly fs: Filesystem;
|
|
77
|
+
readonly snapshots: SnapshotStore;
|
|
78
|
+
readonly recovery: Recovery;
|
|
79
|
+
readonly blockResolver: BlockResolver | undefined;
|
|
80
|
+
constructor(options: PatcherOptions);
|
|
81
|
+
/**
|
|
82
|
+
* Apply every section in `patch`. `prepare` runs the full apply for each
|
|
83
|
+
* section in memory before any write hits the filesystem, so a
|
|
84
|
+
* multi-section batch is naturally all-or-nothing. Returns one
|
|
85
|
+
* {@link PatchSectionResult} per section in the original patch order.
|
|
86
|
+
*/
|
|
87
|
+
apply(patch: Patch): Promise<PatcherApplyResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Run the preflight pass only: read, parse, validate, apply-in-memory.
|
|
90
|
+
* No writes hit the filesystem. Use for CI checks and dry runs.
|
|
91
|
+
*/
|
|
92
|
+
preflight(patch: Patch): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Read a section's target file, parse the section, validate the snapshot
|
|
95
|
+
* tag (with recovery), and apply the edits in memory. Returns a
|
|
96
|
+
* {@link PreparedSection} which can be fed to {@link commit} to land
|
|
97
|
+
* the result on the filesystem.
|
|
98
|
+
*
|
|
99
|
+
* Throws on parse error, missing-file-for-anchored-edit, or unrecovered
|
|
100
|
+
* tag mismatch ({@link MismatchError}).
|
|
101
|
+
*/
|
|
102
|
+
prepare(section: PatchSection): Promise<PreparedSection>;
|
|
103
|
+
/**
|
|
104
|
+
* Commit a previously {@link prepare}d section to the filesystem.
|
|
105
|
+
* Restores line endings and BOM, writes via the {@link Filesystem}, and
|
|
106
|
+
* records a fresh snapshot in the {@link SnapshotStore} keyed by the
|
|
107
|
+
* filesystem-canonical path.
|
|
108
|
+
*/
|
|
109
|
+
commit(prepared: PreparedSection): Promise<PatchSectionResult>;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=patcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patcher.d.ts","sourceRoot":"","sources":["../../src/hashline/patcher.ts"],"names":[],"mappings":"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"}
|