anti-trace 0.1.0 → 0.1.1

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.
@@ -1,353 +0,0 @@
1
- import { stdin, stdout } from "node:process";
2
- import { StringDecoder } from "node:string_decoder";
3
- const ENABLE_BRACKETED_PASTE = "\x1b[?2004h";
4
- const DISABLE_BRACKETED_PASTE = "\x1b[?2004l";
5
- const PASTE_START = "\x1b[200~";
6
- const PASTE_END = "\x1b[201~";
7
- const ESCAPE_DELAY_MS = 250;
8
- const NO_MODIFIERS = { ctrl: false, alt: false, shift: false };
9
- /**
10
- * Owns the byte stream and turns terminal input into text, key, and atomic paste
11
- * events. In a non-TTY pipeline, the complete input is emitted as one paste at
12
- * EOF, followed by `end`; a newline in piped data never acts as Enter.
13
- */
14
- export class TerminalInput {
15
- input;
16
- output;
17
- onEvent;
18
- decoder = new StringDecoder("utf8");
19
- started = false;
20
- wasRaw = false;
21
- tty = false;
22
- bracketed = false;
23
- pending = "";
24
- paste = "";
25
- inPaste = false;
26
- escapeTimer;
27
- skipNextLF = false;
28
- constructor(options) {
29
- this.input = options.input ?? stdin;
30
- this.output = options.output ?? stdout;
31
- this.onEvent = options.onEvent;
32
- }
33
- start() {
34
- if (this.started)
35
- return;
36
- this.decoder = new StringDecoder("utf8");
37
- this.pending = "";
38
- this.paste = "";
39
- this.inPaste = false;
40
- this.skipNextLF = false;
41
- this.tty = this.input.isTTY === true;
42
- this.bracketed = this.tty && this.output.isTTY === true;
43
- this.wasRaw = this.input.isRaw === true;
44
- if (this.tty && typeof this.input.setRawMode !== "function") {
45
- throw new Error("TTY input does not support setRawMode");
46
- }
47
- this.started = true;
48
- try {
49
- this.input.on("data", this.handleData);
50
- this.input.once("end", this.handleEnd);
51
- if (this.tty) {
52
- this.input.setRawMode?.(true);
53
- if (this.bracketed)
54
- this.output.write(ENABLE_BRACKETED_PASTE);
55
- }
56
- this.input.resume();
57
- }
58
- catch (error) {
59
- this.stop();
60
- throw error;
61
- }
62
- }
63
- stop() {
64
- if (!this.started)
65
- return;
66
- this.started = false;
67
- this.input.off("data", this.handleData);
68
- this.input.off("end", this.handleEnd);
69
- this.clearEscapeTimer();
70
- if (this.tty) {
71
- try {
72
- if (this.bracketed)
73
- this.output.write(DISABLE_BRACKETED_PASTE);
74
- }
75
- finally {
76
- this.input.setRawMode?.(this.wasRaw);
77
- }
78
- }
79
- }
80
- handleData = (chunk) => {
81
- if (!this.started)
82
- return;
83
- const bytes = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
84
- this.pending += this.decoder.write(bytes);
85
- if (this.tty)
86
- this.drain(false);
87
- };
88
- handleEnd = () => {
89
- if (!this.started)
90
- return;
91
- this.pending += this.decoder.end();
92
- if (this.tty) {
93
- this.drain(true);
94
- if (this.inPaste) {
95
- this.paste += this.pending;
96
- this.pending = "";
97
- this.finishPaste();
98
- }
99
- }
100
- else if (this.pending.length > 0) {
101
- this.onEvent({ type: "paste", text: cleanPaste(this.pending) });
102
- }
103
- this.stop();
104
- this.onEvent({ type: "end" });
105
- };
106
- drain(final) {
107
- while (this.pending.length > 0 && this.started) {
108
- if (this.inPaste) {
109
- const end = this.pending.indexOf(PASTE_END);
110
- if (end >= 0) {
111
- this.paste += this.pending.slice(0, end);
112
- this.pending = this.pending.slice(end + PASTE_END.length);
113
- this.finishPaste();
114
- continue;
115
- }
116
- if (final) {
117
- this.paste += this.pending;
118
- this.pending = "";
119
- this.finishPaste();
120
- continue;
121
- }
122
- const safeLength = Math.max(0, this.pending.length - PASTE_END.length + 1);
123
- this.paste += this.pending.slice(0, safeLength);
124
- this.pending = this.pending.slice(safeLength);
125
- return;
126
- }
127
- if (this.pending[0] === "\x1b") {
128
- this.skipNextLF = false;
129
- if (!this.consumeEscape(final)) {
130
- // A paste delimiter can span arbitrarily many chunks. Do not
131
- // time out a recognized prefix while waiting for its last bytes.
132
- if (this.pending.length > 1 && (PASTE_START.startsWith(this.pending) || PASTE_END.startsWith(this.pending))) {
133
- this.clearEscapeTimer();
134
- }
135
- else {
136
- this.scheduleEscapeTimer();
137
- }
138
- return;
139
- }
140
- this.clearEscapeTimer();
141
- continue;
142
- }
143
- const character = String.fromCodePoint(this.pending.codePointAt(0));
144
- this.pending = this.pending.slice(character.length);
145
- if (this.skipNextLF && character === "\n") {
146
- this.skipNextLF = false;
147
- continue;
148
- }
149
- this.skipNextLF = false;
150
- this.consumeCharacter(character);
151
- }
152
- }
153
- consumeEscape(final) {
154
- if (this.pending.length === 1) {
155
- if (!final)
156
- return false;
157
- this.pending = "";
158
- this.emitKey("escape", "\x1b");
159
- return true;
160
- }
161
- if (this.pending[1] === "[") {
162
- let end = 2;
163
- while (end < this.pending.length) {
164
- const code = this.pending.charCodeAt(end);
165
- if (code >= 0x40 && code <= 0x7e)
166
- break;
167
- end++;
168
- }
169
- if (end === this.pending.length) {
170
- if (!final)
171
- return false;
172
- this.pending = this.pending.slice(1);
173
- this.emitKey("escape", "\x1b");
174
- return true;
175
- }
176
- const raw = this.pending.slice(0, end + 1);
177
- this.pending = this.pending.slice(end + 1);
178
- if (raw === PASTE_START) {
179
- this.inPaste = true;
180
- this.paste = "";
181
- }
182
- else if (raw !== PASTE_END) {
183
- this.consumeCSI(raw);
184
- }
185
- return true;
186
- }
187
- if (this.pending[1] === "O") {
188
- if (this.pending.length < 3) {
189
- if (!final)
190
- return false;
191
- this.pending = this.pending.slice(1);
192
- this.emitKey("escape", "\x1b");
193
- return true;
194
- }
195
- const raw = this.pending.slice(0, 3);
196
- this.pending = this.pending.slice(3);
197
- const key = { A: "up", B: "down", C: "right", D: "left", H: "home", F: "end" }[raw[2]];
198
- this.emitKey(key ?? "unknown", raw);
199
- return true;
200
- }
201
- const character = String.fromCodePoint(this.pending.codePointAt(1));
202
- this.pending = this.pending.slice(1 + character.length);
203
- this.emitKey(character.toLowerCase() === "v" ? "alt-v" : "unknown", `\x1b${character}`, {
204
- ctrl: false,
205
- alt: true,
206
- shift: character !== character.toLowerCase(),
207
- });
208
- return true;
209
- }
210
- consumeCSI(raw) {
211
- const final = raw.at(-1);
212
- const parameters = raw.slice(2, -1).split(";");
213
- if (final === "Z") {
214
- this.emitKey("tab", raw, { ctrl: false, alt: false, shift: true });
215
- return;
216
- }
217
- const mods = decodeModifiers(parameters[1]);
218
- if (final === "u") {
219
- this.consumeModifiedCharacter(Number(parameters[0]), raw, mods);
220
- return;
221
- }
222
- if (final === "~") {
223
- if (parameters[0] === "27" && parameters.length >= 3) {
224
- this.consumeModifiedCharacter(Number(parameters[2]), raw, mods);
225
- return;
226
- }
227
- const key = { "1": "home", "2": "insert", "3": "delete", "4": "end", "5": "page-up", "6": "page-down", "7": "home", "8": "end" }[parameters[0]];
228
- this.emitKey(key ?? "unknown", raw, mods);
229
- return;
230
- }
231
- const key = { A: "up", B: "down", C: "right", D: "left", H: "home", F: "end" }[final];
232
- this.emitKey(key ?? "unknown", raw, mods);
233
- }
234
- consumeModifiedCharacter(codePoint, raw, mods) {
235
- if (!Number.isInteger(codePoint) || codePoint < 0 || codePoint > 0x10ffff) {
236
- this.emitKey("unknown", raw, mods);
237
- return;
238
- }
239
- const character = String.fromCodePoint(codePoint);
240
- if (mods.ctrl) {
241
- const ctrlKey = { a: "ctrl-a", c: "ctrl-c", d: "ctrl-d", e: "ctrl-e", g: "ctrl-g", j: "ctrl-j", k: "ctrl-k", l: "ctrl-l", u: "ctrl-u", v: "ctrl-v", w: "ctrl-w" }[character.toLowerCase()];
242
- if (ctrlKey) {
243
- this.emitKey(ctrlKey, raw, mods);
244
- return;
245
- }
246
- }
247
- if (mods.alt && character.toLowerCase() === "v") {
248
- this.emitKey("alt-v", raw, mods);
249
- return;
250
- }
251
- const key = { "\r": "enter", "\n": "ctrl-j", "\t": "tab", "\x1b": "escape", "\x7f": "backspace" }[character];
252
- if (key) {
253
- this.emitKey(key, raw, mods);
254
- }
255
- else if (!mods.ctrl && !mods.alt) {
256
- this.onEvent({ type: "text", text: character });
257
- }
258
- else {
259
- this.emitKey("unknown", raw, mods);
260
- }
261
- }
262
- consumeCharacter(character) {
263
- switch (character) {
264
- case "\r":
265
- this.skipNextLF = true;
266
- this.emitKey("enter", character);
267
- return;
268
- case "\n":
269
- this.emitKey("ctrl-j", character);
270
- return;
271
- case "\t":
272
- this.emitKey("tab", character);
273
- return;
274
- case "\x7f":
275
- case "\b":
276
- this.emitKey("backspace", character);
277
- return;
278
- case "\x03":
279
- this.emitKey("ctrl-c", character, { ctrl: true, alt: false, shift: false });
280
- return;
281
- case "\x04":
282
- this.emitKey("ctrl-d", character, { ctrl: true, alt: false, shift: false });
283
- return;
284
- case "\x07":
285
- this.emitKey("ctrl-g", character, { ctrl: true, alt: false, shift: false });
286
- return;
287
- case "\x16":
288
- this.emitKey("ctrl-v", character, { ctrl: true, alt: false, shift: false });
289
- return;
290
- case "\x01":
291
- this.emitKey("ctrl-a", character, { ctrl: true, alt: false, shift: false });
292
- return;
293
- case "\x05":
294
- this.emitKey("ctrl-e", character, { ctrl: true, alt: false, shift: false });
295
- return;
296
- case "\x0b":
297
- this.emitKey("ctrl-k", character, { ctrl: true, alt: false, shift: false });
298
- return;
299
- case "\x0c":
300
- this.emitKey("ctrl-l", character, { ctrl: true, alt: false, shift: false });
301
- return;
302
- case "\x15":
303
- this.emitKey("ctrl-u", character, { ctrl: true, alt: false, shift: false });
304
- return;
305
- case "\x17":
306
- this.emitKey("ctrl-w", character, { ctrl: true, alt: false, shift: false });
307
- return;
308
- }
309
- if (character.charCodeAt(0) < 0x20 || character.charCodeAt(0) === 0x7f) {
310
- this.emitKey("unknown", character);
311
- }
312
- else {
313
- this.onEvent({ type: "text", text: character });
314
- }
315
- }
316
- emitKey(key, raw, mods = NO_MODIFIERS) {
317
- this.onEvent({ type: "key", key, raw, ...mods });
318
- }
319
- finishPaste() {
320
- const text = cleanPaste(this.paste);
321
- this.paste = "";
322
- this.inPaste = false;
323
- this.onEvent({ type: "paste", text });
324
- }
325
- scheduleEscapeTimer() {
326
- if (this.escapeTimer)
327
- return;
328
- this.escapeTimer = setTimeout(() => {
329
- this.escapeTimer = undefined;
330
- if (!this.started || this.pending[0] !== "\x1b")
331
- return;
332
- this.pending = this.pending.slice(1);
333
- this.emitKey("escape", "\x1b");
334
- this.drain(false);
335
- }, ESCAPE_DELAY_MS);
336
- }
337
- clearEscapeTimer() {
338
- if (!this.escapeTimer)
339
- return;
340
- clearTimeout(this.escapeTimer);
341
- this.escapeTimer = undefined;
342
- }
343
- }
344
- function decodeModifiers(parameter) {
345
- const value = Number(parameter ?? "1") - 1;
346
- if (!Number.isInteger(value) || value < 0)
347
- return NO_MODIFIERS;
348
- return { shift: (value & 1) !== 0, alt: (value & 2) !== 0, ctrl: (value & 4) !== 0 };
349
- }
350
- function cleanPaste(text) {
351
- return text.replace(/\r\n?/g, "\n").replace(/[\x00-\x08\x0b-\x1f\x7f-\x9f]/g, "");
352
- }
353
- //# sourceMappingURL=terminal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../../src/cli/input/stash/terminal.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { ImageContent } from "../../types.ts";
2
- export interface PasteKey {
3
- name?: string;
4
- ctrl?: boolean;
5
- meta?: boolean;
6
- shift?: boolean;
7
- }
8
- /** Windows uses Alt+V because the terminal consumes Ctrl+V as a text paste. */
9
- export declare function isImagePasteKey(key: PasteKey): boolean;
10
- /**
11
- * Read an image from the clipboard.
12
- * Each platform tries a bitmap first, then a file path sitting on the clipboard.
13
- * The original file is never modified.
14
- */
15
- export declare function readClipboardImage(): ImageContent | null;
@@ -1,175 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { randomUUID } from "node:crypto";
3
- import { copyFileSync, existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { detectSupportedImageMimeType, imageContentFromBytes, shrinkImageBytes } from "../../harness/tools/image.js";
7
- const TIMEOUT_MS = 8000;
8
- /** Windows uses Alt+V because the terminal consumes Ctrl+V as a text paste. */
9
- export function isImagePasteKey(key) {
10
- if (key.name !== "v" || key.shift) {
11
- return false;
12
- }
13
- if (process.platform === "win32") {
14
- return key.meta === true && key.ctrl !== true;
15
- }
16
- return key.ctrl === true && key.meta !== true;
17
- }
18
- /**
19
- * Read an image from the clipboard.
20
- * Each platform tries a bitmap first, then a file path sitting on the clipboard.
21
- * The original file is never modified.
22
- */
23
- export function readClipboardImage() {
24
- const captured = captureClipboard();
25
- if (!captured) {
26
- return null;
27
- }
28
- try {
29
- const bytes = new Uint8Array(readFileSync(captured));
30
- return imageContentFromBytes(shrinkImageBytes(bytes)) ?? null;
31
- }
32
- catch {
33
- return null;
34
- }
35
- finally {
36
- unlinkQuiet(captured);
37
- }
38
- }
39
- function captureClipboard() {
40
- const dest = tempImagePath();
41
- if (saveBitmap(dest)) {
42
- return dest;
43
- }
44
- unlinkQuiet(dest);
45
- const source = clipboardFilePath();
46
- if (!source || !existsSync(source) || !isImageFile(source)) {
47
- return null;
48
- }
49
- copyFileSync(source, dest);
50
- return dest;
51
- }
52
- function saveBitmap(filePath) {
53
- if (process.platform === "win32") {
54
- return saveWindowsBitmap(filePath);
55
- }
56
- if (process.platform === "darwin") {
57
- return saveDarwinBitmap(filePath);
58
- }
59
- return saveLinuxBitmap(filePath);
60
- }
61
- function clipboardFilePath() {
62
- if (process.platform === "win32") {
63
- return windowsClipboardPath();
64
- }
65
- if (process.platform === "darwin") {
66
- return commandStdout("osascript", ["-e", "get POSIX path of (the clipboard as «class furl»)"]);
67
- }
68
- return linuxClipboardText();
69
- }
70
- function saveWindowsBitmap(filePath) {
71
- const pathLiteral = psQuote(filePath);
72
- const script = [
73
- "Add-Type -AssemblyName System.Drawing",
74
- "$img = Get-Clipboard -Format Image",
75
- "if (-not $img) { Write-Output 'empty'; exit 0 }",
76
- `$img.Save(${pathLiteral}, [System.Drawing.Imaging.ImageFormat]::Png)`,
77
- "$img.Dispose()",
78
- "Write-Output 'ok'",
79
- ].join("; ");
80
- const result = powershell(script);
81
- return result.status === 0 && result.stdout.trim() === "ok";
82
- }
83
- function windowsClipboardPath() {
84
- const listed = powershell("$files = Get-Clipboard -Format FileDropList; if ($files -and $files.Count -gt 0) { Write-Output $files[0] }");
85
- const fromList = firstExistingPath(listed.status === 0 ? listed.stdout : "");
86
- if (fromList) {
87
- return fromList;
88
- }
89
- const text = powershell("Get-Clipboard -Raw");
90
- return text.status === 0 ? firstExistingPath(text.stdout) : null;
91
- }
92
- function saveDarwinBitmap(filePath) {
93
- const result = spawnSync("osascript", [
94
- "-e",
95
- "set png_data to (the clipboard as «class PNGf»)",
96
- "-e",
97
- `set fp to open for access POSIX file "${filePath}" with write permission`,
98
- "-e",
99
- "write png_data to fp",
100
- "-e",
101
- "close access fp",
102
- ], { timeout: TIMEOUT_MS });
103
- return result.status === 0 && existsSync(filePath);
104
- }
105
- function saveLinuxBitmap(filePath) {
106
- const attempts = [
107
- ["xclip", ["-selection", "clipboard", "-t", "image/png", "-o"]],
108
- ["wl-paste", ["--type", "image/png"]],
109
- ["xclip", ["-selection", "clipboard", "-t", "image/jpeg", "-o"]],
110
- ["wl-paste", ["--type", "image/jpeg"]],
111
- ];
112
- for (const [command, args] of attempts) {
113
- const result = spawnSync(command, args, { timeout: TIMEOUT_MS, maxBuffer: 50 * 1024 * 1024 });
114
- if (result.status === 0 && result.stdout.length > 0) {
115
- writeFileSync(filePath, result.stdout);
116
- return true;
117
- }
118
- }
119
- return false;
120
- }
121
- function linuxClipboardText() {
122
- const xclip = commandStdout("xclip", ["-selection", "clipboard", "-o"]);
123
- if (xclip) {
124
- return firstExistingPath(xclip);
125
- }
126
- return firstExistingPath(commandStdout("wl-paste", ["--no-newline"]) ?? "");
127
- }
128
- function isImageFile(filePath) {
129
- try {
130
- return detectSupportedImageMimeType(new Uint8Array(readFileSync(filePath))) !== undefined;
131
- }
132
- catch {
133
- return false;
134
- }
135
- }
136
- function tempImagePath() {
137
- return join(tmpdir(), `anti-trace-clip-${randomUUID()}.img`);
138
- }
139
- function powershell(script) {
140
- const result = spawnSync("powershell.exe", ["-STA", "-NoProfile", "-Command", script], {
141
- encoding: "utf8",
142
- timeout: TIMEOUT_MS,
143
- windowsHide: true,
144
- });
145
- return { status: result.status, stdout: result.stdout ?? "" };
146
- }
147
- function commandStdout(command, args) {
148
- const result = spawnSync(command, args, { encoding: "utf8", timeout: TIMEOUT_MS });
149
- if (result.status !== 0) {
150
- return null;
151
- }
152
- const text = result.stdout.trim();
153
- return text.length > 0 ? text : null;
154
- }
155
- function firstExistingPath(text) {
156
- for (const rawLine of text.split(/\r?\n/)) {
157
- const line = rawLine.trim().replace(/^["']|["']$/g, "");
158
- if (line.length > 0 && existsSync(line)) {
159
- return line;
160
- }
161
- }
162
- return null;
163
- }
164
- function psQuote(filePath) {
165
- return `'${filePath.replaceAll("'", "''")}'`;
166
- }
167
- function unlinkQuiet(filePath) {
168
- try {
169
- unlinkSync(filePath);
170
- }
171
- catch {
172
- // Already gone, or the capture step never created it.
173
- }
174
- }
175
- //# sourceMappingURL=image.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/cli/utils/image.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- import type { BeforeToolCallContext, BeforeToolCallResult } from "../../types.ts";
2
- import type { InputTarget } from "../../cli/input/input-dispatcher.ts";
3
- import { TextInputController } from "../../cli/input/text-input-controller.ts";
4
- import { type StructuredDiffHunk } from "../../harness/tools/diff.ts";
5
- export type PermissionMode = "default" | "auto-edit" | "yolo";
6
- export interface PermissionRequest {
7
- id: string;
8
- name: string;
9
- args: Record<string, unknown>;
10
- hunks?: StructuredDiffHunk[];
11
- previewError?: string;
12
- }
13
- export interface PermissionSnapshot {
14
- mode: PermissionMode;
15
- request: PermissionRequest | null;
16
- selectedIndex: number;
17
- editingFeedback: boolean;
18
- }
19
- export declare class PermissionPolicy {
20
- private readonly cwd;
21
- private readonly interactive;
22
- private snapshot;
23
- private readonly listeners;
24
- private readonly allowedCommands;
25
- private allowEdits;
26
- private pending?;
27
- readonly feedback: TextInputController;
28
- readonly target: InputTarget;
29
- constructor(cwd: string, interactive: boolean, mode?: PermissionMode);
30
- getSnapshot: () => PermissionSnapshot;
31
- subscribe: (listener: () => void) => () => void;
32
- private update;
33
- private allowed;
34
- cycleMode(): void;
35
- resetSession(): void;
36
- move(direction: number): void;
37
- accept(): void;
38
- decide(decision: "allow" | "session" | "deny"): void;
39
- cancel(): void;
40
- dispose(): void;
41
- beforeToolCall: (context: BeforeToolCallContext, signal?: AbortSignal) => Promise<BeforeToolCallResult | undefined>;
42
- }