@aigencydev/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -0
- package/dist/agent/chunker.js +59 -0
- package/dist/agent/chunker.js.map +1 -0
- package/dist/agent/history.js +35 -0
- package/dist/agent/history.js.map +1 -0
- package/dist/agent/loop.js +219 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/memory.js +177 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/api-client/auth.js +43 -0
- package/dist/api-client/auth.js.map +1 -0
- package/dist/api-client/base.js +154 -0
- package/dist/api-client/base.js.map +1 -0
- package/dist/api-client/stream.js +123 -0
- package/dist/api-client/stream.js.map +1 -0
- package/dist/api-client/updates.js +31 -0
- package/dist/api-client/updates.js.map +1 -0
- package/dist/api-client/usage.js +15 -0
- package/dist/api-client/usage.js.map +1 -0
- package/dist/auth/oauth.js +178 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/pkce.js +19 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/session.js +48 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/storage.js +142 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/cli.js +161 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/chat.js +76 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/help.js +61 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.js +43 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.js +153 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +30 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/update.js +88 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/usage.js +64 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config/defaults.js +54 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/hooks.js +99 -0
- package/dist/config/hooks.js.map +1 -0
- package/dist/config/paths.js +62 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/settings.js +80 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/security/command-filter.js +121 -0
- package/dist/security/command-filter.js.map +1 -0
- package/dist/security/sandbox.js +182 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/security/sanitize.js +59 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/tools/bash.js +206 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/diff.js +56 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/edit-file.js +165 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/list-files.js +116 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/read-file.js +107 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/registry.js +54 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-files.js +159 -0
- package/dist/tools/search-files.js.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/write-file.js +141 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/App.js +264 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/InputBar.js +22 -0
- package/dist/ui/InputBar.js.map +1 -0
- package/dist/ui/MessageList.js +82 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/ModeIndicator.js +23 -0
- package/dist/ui/ModeIndicator.js.map +1 -0
- package/dist/ui/PermissionPrompt.js +61 -0
- package/dist/ui/PermissionPrompt.js.map +1 -0
- package/dist/ui/StatusBar.js +39 -0
- package/dist/ui/StatusBar.js.map +1 -0
- package/dist/ui/theme.js +42 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/abort.js +61 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/errors.js +63 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.js +102 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bash_execute — sandboxed shell komutu.
|
|
3
|
+
*
|
|
4
|
+
* Windows'ta cmd.exe, Unix'te sh kullanır. 120 saniye timeout, 50 KB çıktı sınırı.
|
|
5
|
+
* Plan modda her şey yasak, default'ta permission prompt, auto'da classifier.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { checkCommand, autoModeDecision } from "../security/command-filter.js";
|
|
9
|
+
import { checkPath } from "../security/sandbox.js";
|
|
10
|
+
const MAX_OUTPUT_BYTES = 50_000;
|
|
11
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
12
|
+
function runShell(command, cwd, timeoutMs, signal) {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
const isWin = process.platform === "win32";
|
|
15
|
+
const shell = isWin ? "cmd.exe" : "/bin/sh";
|
|
16
|
+
const args = isWin ? ["/d", "/s", "/c", command] : ["-c", command];
|
|
17
|
+
const child = spawn(shell, args, {
|
|
18
|
+
cwd,
|
|
19
|
+
env: process.env,
|
|
20
|
+
windowsHide: true,
|
|
21
|
+
});
|
|
22
|
+
let stdout = "";
|
|
23
|
+
let stderr = "";
|
|
24
|
+
let outBytes = 0;
|
|
25
|
+
let errBytes = 0;
|
|
26
|
+
let timedOut = false;
|
|
27
|
+
const timeoutHandle = setTimeout(() => {
|
|
28
|
+
timedOut = true;
|
|
29
|
+
try {
|
|
30
|
+
child.kill("SIGKILL");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// ignore
|
|
34
|
+
}
|
|
35
|
+
}, timeoutMs);
|
|
36
|
+
const onAbort = () => {
|
|
37
|
+
try {
|
|
38
|
+
child.kill("SIGKILL");
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// ignore
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
if (signal) {
|
|
45
|
+
if (signal.aborted)
|
|
46
|
+
onAbort();
|
|
47
|
+
else
|
|
48
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
49
|
+
}
|
|
50
|
+
child.stdout.on("data", (chunk) => {
|
|
51
|
+
if (outBytes >= MAX_OUTPUT_BYTES)
|
|
52
|
+
return;
|
|
53
|
+
const remaining = MAX_OUTPUT_BYTES - outBytes;
|
|
54
|
+
const text = chunk.toString("utf8").slice(0, remaining);
|
|
55
|
+
stdout += text;
|
|
56
|
+
outBytes += text.length;
|
|
57
|
+
});
|
|
58
|
+
child.stderr.on("data", (chunk) => {
|
|
59
|
+
if (errBytes >= MAX_OUTPUT_BYTES)
|
|
60
|
+
return;
|
|
61
|
+
const remaining = MAX_OUTPUT_BYTES - errBytes;
|
|
62
|
+
const text = chunk.toString("utf8").slice(0, remaining);
|
|
63
|
+
stderr += text;
|
|
64
|
+
errBytes += text.length;
|
|
65
|
+
});
|
|
66
|
+
child.on("error", (err) => {
|
|
67
|
+
clearTimeout(timeoutHandle);
|
|
68
|
+
resolve({
|
|
69
|
+
stdout,
|
|
70
|
+
stderr: `${stderr}\nSpawn hatası: ${err.message}`,
|
|
71
|
+
exitCode: 1,
|
|
72
|
+
timedOut,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
child.on("close", (code) => {
|
|
76
|
+
clearTimeout(timeoutHandle);
|
|
77
|
+
if (signal)
|
|
78
|
+
signal.removeEventListener("abort", onAbort);
|
|
79
|
+
resolve({
|
|
80
|
+
stdout,
|
|
81
|
+
stderr,
|
|
82
|
+
exitCode: code,
|
|
83
|
+
timedOut,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export const bashTool = async (params, ctx) => {
|
|
89
|
+
const start = Date.now();
|
|
90
|
+
const command = (params.command || "");
|
|
91
|
+
const rawCwd = (params.working_directory || ctx.cwd);
|
|
92
|
+
const timeoutMs = Number.isInteger(params.timeout_ms)
|
|
93
|
+
? Math.min(DEFAULT_TIMEOUT_MS, Number(params.timeout_ms))
|
|
94
|
+
: DEFAULT_TIMEOUT_MS;
|
|
95
|
+
if (!command) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
output: "",
|
|
99
|
+
error: "command parametresi eksik",
|
|
100
|
+
duration: Date.now() - start,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Command filter
|
|
104
|
+
const filterResult = checkCommand(command);
|
|
105
|
+
if (filterResult.verdict === "block") {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
output: "",
|
|
109
|
+
error: `Komut reddedildi: ${filterResult.reason}`,
|
|
110
|
+
metadata: { blocked_by: "command_filter", pattern: filterResult.matchedPattern },
|
|
111
|
+
approvalState: 0,
|
|
112
|
+
duration: Date.now() - start,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Plan modda sadece dry-run
|
|
116
|
+
if (ctx.mode === "plan") {
|
|
117
|
+
return {
|
|
118
|
+
success: true,
|
|
119
|
+
output: `[plan] Çalıştırılacak komut: ${command}`,
|
|
120
|
+
metadata: { dry_run: true },
|
|
121
|
+
approvalState: 2,
|
|
122
|
+
duration: Date.now() - start,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// Working directory sandbox kontrolü
|
|
126
|
+
const cwdCheck = checkPath(rawCwd, ctx.cwd, { mustExist: true });
|
|
127
|
+
if (!cwdCheck.ok || !cwdCheck.realPath) {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
output: "",
|
|
131
|
+
error: `Çalışma dizini reddedildi: ${cwdCheck.message || rawCwd}`,
|
|
132
|
+
duration: Date.now() - start,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// Permission akışı
|
|
136
|
+
let approvalState = 2;
|
|
137
|
+
const needsPrompt = ctx.mode === "default" ||
|
|
138
|
+
ctx.mode === "accept_edits" ||
|
|
139
|
+
(ctx.mode === "auto" && autoModeDecision(command) === "prompt");
|
|
140
|
+
if (needsPrompt) {
|
|
141
|
+
if (!ctx.requestPermission) {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
output: "",
|
|
145
|
+
error: "Permission callback yok",
|
|
146
|
+
duration: Date.now() - start,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const resp = await ctx.requestPermission({
|
|
150
|
+
toolName: "bash_execute",
|
|
151
|
+
severity: filterResult.verdict === "allow" ? "low" : "high",
|
|
152
|
+
title: "Shell komutu çalıştır",
|
|
153
|
+
description: command.slice(0, 200),
|
|
154
|
+
preview: command,
|
|
155
|
+
});
|
|
156
|
+
if (resp.decision === "reject") {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
output: "",
|
|
160
|
+
error: "Kullanıcı reddetti",
|
|
161
|
+
approvalState: 0,
|
|
162
|
+
duration: Date.now() - start,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (resp.decision === "cancel") {
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
output: "",
|
|
169
|
+
error: "İşlem iptal edildi",
|
|
170
|
+
approvalState: 0,
|
|
171
|
+
duration: Date.now() - start,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
approvalState = 1;
|
|
175
|
+
}
|
|
176
|
+
const result = await runShell(command, cwdCheck.realPath, timeoutMs, ctx.signal);
|
|
177
|
+
const output = [
|
|
178
|
+
result.stdout && `--- stdout ---\n${result.stdout}`,
|
|
179
|
+
result.stderr && `--- stderr ---\n${result.stderr}`,
|
|
180
|
+
]
|
|
181
|
+
.filter(Boolean)
|
|
182
|
+
.join("\n\n");
|
|
183
|
+
if (result.timedOut) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
output,
|
|
187
|
+
error: `Komut zaman aşımına uğradı (${timeoutMs}ms)`,
|
|
188
|
+
metadata: { exit_code: result.exitCode, timed_out: true },
|
|
189
|
+
approvalState,
|
|
190
|
+
duration: Date.now() - start,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
success: result.exitCode === 0,
|
|
195
|
+
output: output || "(çıktı yok)",
|
|
196
|
+
error: result.exitCode !== 0 ? `Exit code ${result.exitCode}` : undefined,
|
|
197
|
+
metadata: {
|
|
198
|
+
exit_code: result.exitCode,
|
|
199
|
+
stdout_length: result.stdout.length,
|
|
200
|
+
stderr_length: result.stderr.length,
|
|
201
|
+
},
|
|
202
|
+
approvalState,
|
|
203
|
+
duration: Date.now() - start,
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AASnC,SAAS,QAAQ,CACf,OAAe,EACf,GAAW,EACX,SAAiB,EACjB,MAAoB;IAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEnE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG;YACH,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;;gBACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,IAAI,QAAQ,IAAI,gBAAgB;gBAAE,OAAO;YACzC,MAAM,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,IAAI,IAAI,CAAC;YACf,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,IAAI,QAAQ,IAAI,gBAAgB;gBAAE,OAAO;YACzC,MAAM,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAC;YAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,IAAI,IAAI,CAAC;YACf,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM,EAAE,GAAG,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE;gBACjD,QAAQ,EAAE,CAAC;gBACX,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,IAAI,MAAM;gBAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC;gBACN,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,IAAI;gBACd,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAqB,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAW,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC,GAAG,CAAW,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC,kBAAkB,CAAC;IAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,2BAA2B;YAClC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,YAAY,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,qBAAqB,YAAY,CAAC,MAAM,EAAE;YACjD,QAAQ,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,CAAC,cAAc,EAAE;YAChF,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gCAAgC,OAAO,EAAE;YACjD,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;YAC3B,aAAa,EAAE,CAAC;YAChB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,8BAA8B,QAAQ,CAAC,OAAO,IAAI,MAAM,EAAE;YACjE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,aAAa,GAAc,CAAC,CAAC;IACjC,MAAM,WAAW,GACf,GAAG,CAAC,IAAI,KAAK,SAAS;QACtB,GAAG,CAAC,IAAI,KAAK,cAAc;QAC3B,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAElE,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,yBAAyB;gBAChC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC7B,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC;YACvC,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,YAAY,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAC3D,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAClC,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,oBAAoB;gBAC3B,aAAa,EAAE,CAAC;gBAChB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC7B,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,oBAAoB;gBAC3B,aAAa,EAAE,CAAC;gBAChB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC7B,CAAC;QACJ,CAAC;QACD,aAAa,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjF,MAAM,MAAM,GAAG;QACb,MAAM,CAAC,MAAM,IAAI,mBAAmB,MAAM,CAAC,MAAM,EAAE;QACnD,MAAM,CAAC,MAAM,IAAI,mBAAmB,MAAM,CAAC,MAAM,EAAE;KACpD;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM;YACN,KAAK,EAAE,+BAA+B,SAAS,KAAK;YACpD,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;YACzD,aAAa;YACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC;QAC9B,MAAM,EAAE,MAAM,IAAI,aAAa;QAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QACzE,QAAQ,EAAE;YACR,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;YACnC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;SACpC;QACD,aAAa;QACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC7B,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIGENCY CLI — basit unified diff üretici.
|
|
3
|
+
*
|
|
4
|
+
* Dış bağımlılık (diff paketi) kullanmadan okunabilir bir +/- diff üretir.
|
|
5
|
+
* Myers algoritması yerine satır bazlı basit farklı bulma — çoğu use case için yeterli.
|
|
6
|
+
*/
|
|
7
|
+
export function simpleDiff(oldContent, newContent, maxLines = 40) {
|
|
8
|
+
const oldLines = oldContent.split(/\r?\n/);
|
|
9
|
+
const newLines = newContent.split(/\r?\n/);
|
|
10
|
+
if (oldContent === newContent)
|
|
11
|
+
return "(değişiklik yok)";
|
|
12
|
+
const lines = [];
|
|
13
|
+
const max = Math.max(oldLines.length, newLines.length);
|
|
14
|
+
let added = 0;
|
|
15
|
+
let removed = 0;
|
|
16
|
+
for (let i = 0; i < max && lines.length < maxLines * 2; i++) {
|
|
17
|
+
const o = oldLines[i];
|
|
18
|
+
const n = newLines[i];
|
|
19
|
+
if (o === n) {
|
|
20
|
+
if (lines.length < maxLines) {
|
|
21
|
+
lines.push(` ${o ?? ""}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
if (o !== undefined) {
|
|
26
|
+
lines.push(`- ${o}`);
|
|
27
|
+
removed++;
|
|
28
|
+
}
|
|
29
|
+
if (n !== undefined) {
|
|
30
|
+
lines.push(`+ ${n}`);
|
|
31
|
+
added++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (lines.length >= maxLines * 2) {
|
|
36
|
+
lines.push(`… daha fazla değişiklik var`);
|
|
37
|
+
}
|
|
38
|
+
return `${lines.join("\n")}\n\n+${added} -${removed}`;
|
|
39
|
+
}
|
|
40
|
+
export function summarizeDiff(oldContent, newContent) {
|
|
41
|
+
const oldLines = oldContent.split(/\r?\n/);
|
|
42
|
+
const newLines = newContent.split(/\r?\n/);
|
|
43
|
+
let added = 0;
|
|
44
|
+
let removed = 0;
|
|
45
|
+
const max = Math.max(oldLines.length, newLines.length);
|
|
46
|
+
for (let i = 0; i < max; i++) {
|
|
47
|
+
if (oldLines[i] !== newLines[i]) {
|
|
48
|
+
if (oldLines[i] !== undefined)
|
|
49
|
+
removed++;
|
|
50
|
+
if (newLines[i] !== undefined)
|
|
51
|
+
added++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { added, removed };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/tools/diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,UAAkB,EAAE,QAAQ,GAAG,EAAE;IAC9E,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE3C,IAAI,UAAU,KAAK,UAAU;QAAE,OAAO,kBAAkB,CAAC;IAEzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrB,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACrB,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,UAAkB;IAIlE,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;YACzC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,KAAK,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* edit_file — mevcut dosyada old_string'i new_string ile değiştir.
|
|
3
|
+
*
|
|
4
|
+
* Kurallar (benzersiz edit):
|
|
5
|
+
* - old_string tam olarak dosyada 1 kez geçmeli
|
|
6
|
+
* - 0 veya 1'den fazla eşleşme varsa reddedilir
|
|
7
|
+
* - Plan modda yasak, diğer modlarda permission prompt
|
|
8
|
+
*/
|
|
9
|
+
import fs from "node:fs/promises";
|
|
10
|
+
import { checkWritePath } from "../security/sandbox.js";
|
|
11
|
+
import { simpleDiff, summarizeDiff } from "./diff.js";
|
|
12
|
+
export const editFileTool = async (params, ctx) => {
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
const rawPath = (params.path || params.filePath || "");
|
|
15
|
+
const oldString = (params.old_string || "");
|
|
16
|
+
const newString = (params.new_string || "");
|
|
17
|
+
if (!rawPath) {
|
|
18
|
+
return {
|
|
19
|
+
success: false,
|
|
20
|
+
output: "",
|
|
21
|
+
error: "path parametresi eksik",
|
|
22
|
+
duration: Date.now() - start,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (typeof oldString !== "string" || oldString.length === 0) {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
output: "",
|
|
29
|
+
error: "old_string boş olamaz",
|
|
30
|
+
duration: Date.now() - start,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (typeof newString !== "string") {
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
output: "",
|
|
37
|
+
error: "new_string string olmalı",
|
|
38
|
+
duration: Date.now() - start,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (oldString === newString) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
output: "",
|
|
45
|
+
error: "old_string ve new_string aynı",
|
|
46
|
+
duration: Date.now() - start,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (ctx.mode === "plan") {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
output: "",
|
|
53
|
+
error: "Plan modunda dosya düzenleme yasak. /mode accept_edits ile değiştirin.",
|
|
54
|
+
duration: Date.now() - start,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const check = checkWritePath(rawPath, ctx.cwd);
|
|
58
|
+
if (!check.ok || !check.realPath) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
output: "",
|
|
62
|
+
error: check.message || "Yol reddedildi",
|
|
63
|
+
duration: Date.now() - start,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Mevcut içeriği oku
|
|
67
|
+
let existing;
|
|
68
|
+
try {
|
|
69
|
+
existing = await fs.readFile(check.realPath, "utf8");
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return {
|
|
73
|
+
success: false,
|
|
74
|
+
output: "",
|
|
75
|
+
error: `Dosya okunamadı: ${check.displayPath}`,
|
|
76
|
+
duration: Date.now() - start,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Benzersizlik kontrolü
|
|
80
|
+
const firstIdx = existing.indexOf(oldString);
|
|
81
|
+
if (firstIdx === -1) {
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
output: "",
|
|
85
|
+
error: "old_string dosyada bulunamadı",
|
|
86
|
+
duration: Date.now() - start,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const secondIdx = existing.indexOf(oldString, firstIdx + 1);
|
|
90
|
+
if (secondIdx !== -1) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
output: "",
|
|
94
|
+
error: "old_string dosyada birden fazla yerde geçiyor — daha fazla bağlam ekleyin",
|
|
95
|
+
duration: Date.now() - start,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const updated = existing.slice(0, firstIdx) +
|
|
99
|
+
newString +
|
|
100
|
+
existing.slice(firstIdx + oldString.length);
|
|
101
|
+
const diff = summarizeDiff(existing, updated);
|
|
102
|
+
const previewLines = simpleDiff(existing, updated, 20);
|
|
103
|
+
// Permission
|
|
104
|
+
let approvalState = 2;
|
|
105
|
+
if (ctx.mode === "default") {
|
|
106
|
+
if (!ctx.requestPermission) {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
output: "",
|
|
110
|
+
error: "Permission callback yok",
|
|
111
|
+
duration: Date.now() - start,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const resp = await ctx.requestPermission({
|
|
115
|
+
toolName: "edit_file",
|
|
116
|
+
severity: "medium",
|
|
117
|
+
title: `Dosya düzenle: ${check.displayPath}`,
|
|
118
|
+
description: `+${diff.added} -${diff.removed} satır`,
|
|
119
|
+
preview: previewLines,
|
|
120
|
+
});
|
|
121
|
+
if (resp.decision === "reject") {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
output: "",
|
|
125
|
+
error: "Kullanıcı reddetti",
|
|
126
|
+
approvalState: 0,
|
|
127
|
+
duration: Date.now() - start,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (resp.decision === "cancel") {
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
output: "",
|
|
134
|
+
error: "İşlem iptal edildi",
|
|
135
|
+
approvalState: 0,
|
|
136
|
+
duration: Date.now() - start,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
approvalState = 1;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
await fs.writeFile(check.realPath, updated, "utf8");
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
output: "",
|
|
148
|
+
error: `Yazma hatası: ${err.message.slice(0, 120)}`,
|
|
149
|
+
approvalState,
|
|
150
|
+
duration: Date.now() - start,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
output: `Dosya düzenlendi: ${check.displayPath} (+${diff.added} -${diff.removed})`,
|
|
156
|
+
metadata: {
|
|
157
|
+
path: check.displayPath,
|
|
158
|
+
added: diff.added,
|
|
159
|
+
removed: diff.removed,
|
|
160
|
+
},
|
|
161
|
+
approvalState,
|
|
162
|
+
duration: Date.now() - start,
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
//# sourceMappingURL=edit-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-file.js","sourceRoot":"","sources":["../../src/tools/edit-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_files — dizin listeleme tool'u (yerel).
|
|
3
|
+
*/
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { checkPath } from "../security/sandbox.js";
|
|
7
|
+
const MAX_ENTRIES = 500;
|
|
8
|
+
const MAX_DEPTH = 4;
|
|
9
|
+
// Varsayılan olarak atlanacak isimler (yasak segmentlerle aynı mantık)
|
|
10
|
+
const SKIP_NAMES = new Set([
|
|
11
|
+
".git",
|
|
12
|
+
"node_modules",
|
|
13
|
+
".next",
|
|
14
|
+
".turbo",
|
|
15
|
+
".vscode",
|
|
16
|
+
".idea",
|
|
17
|
+
".svn",
|
|
18
|
+
".hg",
|
|
19
|
+
]);
|
|
20
|
+
async function walk(dir, base, depth, max, out) {
|
|
21
|
+
if (out.length >= max)
|
|
22
|
+
return;
|
|
23
|
+
let items;
|
|
24
|
+
try {
|
|
25
|
+
items = await fs.readdir(dir);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
items.sort();
|
|
31
|
+
for (const item of items) {
|
|
32
|
+
if (out.length >= max)
|
|
33
|
+
return;
|
|
34
|
+
if (SKIP_NAMES.has(item) || item.startsWith(".env"))
|
|
35
|
+
continue;
|
|
36
|
+
const full = path.join(dir, item);
|
|
37
|
+
let stat;
|
|
38
|
+
try {
|
|
39
|
+
stat = await fs.stat(full);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const rel = path.relative(base, full).replace(/\\/g, "/");
|
|
45
|
+
if (stat.isDirectory()) {
|
|
46
|
+
out.push({ type: "dir", name: item, path: rel });
|
|
47
|
+
if (depth > 0) {
|
|
48
|
+
await walk(full, base, depth - 1, max, out);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else if (stat.isFile()) {
|
|
52
|
+
out.push({
|
|
53
|
+
type: "file",
|
|
54
|
+
name: item,
|
|
55
|
+
path: rel,
|
|
56
|
+
size: stat.size,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export const listFilesTool = async (params, ctx) => {
|
|
62
|
+
const start = Date.now();
|
|
63
|
+
const rawDir = (params.directory || params.path || ".");
|
|
64
|
+
const recursive = params.recursive === true;
|
|
65
|
+
const check = checkPath(rawDir, ctx.cwd, { mustExist: true });
|
|
66
|
+
if (!check.ok || !check.realPath) {
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
output: "",
|
|
70
|
+
error: check.message || "Yol reddedildi",
|
|
71
|
+
duration: Date.now() - start,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
let stat;
|
|
75
|
+
try {
|
|
76
|
+
stat = await fs.stat(check.realPath);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
output: "",
|
|
82
|
+
error: `Dizin bulunamadı: ${check.displayPath}`,
|
|
83
|
+
duration: Date.now() - start,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (!stat.isDirectory()) {
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
output: "",
|
|
90
|
+
error: `Bu bir dosya, dizin değil: ${check.displayPath}`,
|
|
91
|
+
duration: Date.now() - start,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const entries = [];
|
|
95
|
+
await walk(check.realPath, check.realPath, recursive ? MAX_DEPTH : 0, MAX_ENTRIES, entries);
|
|
96
|
+
const truncated = entries.length >= MAX_ENTRIES;
|
|
97
|
+
const formatted = entries
|
|
98
|
+
.map((e) => {
|
|
99
|
+
const prefix = e.type === "dir" ? "📁" : "📄";
|
|
100
|
+
const size = e.type === "file" && e.size !== undefined ? ` (${e.size}b)` : "";
|
|
101
|
+
return `${prefix} ${e.path}${size}`;
|
|
102
|
+
})
|
|
103
|
+
.join("\n");
|
|
104
|
+
return {
|
|
105
|
+
success: true,
|
|
106
|
+
output: formatted || "(boş dizin)",
|
|
107
|
+
metadata: {
|
|
108
|
+
directory: check.displayPath,
|
|
109
|
+
count: entries.length,
|
|
110
|
+
truncated,
|
|
111
|
+
},
|
|
112
|
+
approvalState: 2,
|
|
113
|
+
duration: Date.now() - start,
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=list-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-files.js","sourceRoot":"","sources":["../../src/tools/list-files.ts"],"names":[],"mappings":"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"}
|