@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.
Files changed (104) hide show
  1. package/README.md +83 -0
  2. package/dist/agent/chunker.js +59 -0
  3. package/dist/agent/chunker.js.map +1 -0
  4. package/dist/agent/history.js +35 -0
  5. package/dist/agent/history.js.map +1 -0
  6. package/dist/agent/loop.js +219 -0
  7. package/dist/agent/loop.js.map +1 -0
  8. package/dist/agent/memory.js +177 -0
  9. package/dist/agent/memory.js.map +1 -0
  10. package/dist/api-client/auth.js +43 -0
  11. package/dist/api-client/auth.js.map +1 -0
  12. package/dist/api-client/base.js +154 -0
  13. package/dist/api-client/base.js.map +1 -0
  14. package/dist/api-client/stream.js +123 -0
  15. package/dist/api-client/stream.js.map +1 -0
  16. package/dist/api-client/updates.js +31 -0
  17. package/dist/api-client/updates.js.map +1 -0
  18. package/dist/api-client/usage.js +15 -0
  19. package/dist/api-client/usage.js.map +1 -0
  20. package/dist/auth/oauth.js +178 -0
  21. package/dist/auth/oauth.js.map +1 -0
  22. package/dist/auth/pkce.js +19 -0
  23. package/dist/auth/pkce.js.map +1 -0
  24. package/dist/auth/session.js +48 -0
  25. package/dist/auth/session.js.map +1 -0
  26. package/dist/auth/storage.js +142 -0
  27. package/dist/auth/storage.js.map +1 -0
  28. package/dist/cli.js +161 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/commands/chat.js +76 -0
  31. package/dist/commands/chat.js.map +1 -0
  32. package/dist/commands/help.js +61 -0
  33. package/dist/commands/help.js.map +1 -0
  34. package/dist/commands/init.js +43 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/login.js +153 -0
  37. package/dist/commands/login.js.map +1 -0
  38. package/dist/commands/logout.js +30 -0
  39. package/dist/commands/logout.js.map +1 -0
  40. package/dist/commands/update.js +88 -0
  41. package/dist/commands/update.js.map +1 -0
  42. package/dist/commands/usage.js +64 -0
  43. package/dist/commands/usage.js.map +1 -0
  44. package/dist/config/defaults.js +54 -0
  45. package/dist/config/defaults.js.map +1 -0
  46. package/dist/config/hooks.js +99 -0
  47. package/dist/config/hooks.js.map +1 -0
  48. package/dist/config/paths.js +62 -0
  49. package/dist/config/paths.js.map +1 -0
  50. package/dist/config/settings.js +80 -0
  51. package/dist/config/settings.js.map +1 -0
  52. package/dist/index.js +36 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/security/command-filter.js +121 -0
  55. package/dist/security/command-filter.js.map +1 -0
  56. package/dist/security/sandbox.js +182 -0
  57. package/dist/security/sandbox.js.map +1 -0
  58. package/dist/security/sanitize.js +59 -0
  59. package/dist/security/sanitize.js.map +1 -0
  60. package/dist/tools/bash.js +206 -0
  61. package/dist/tools/bash.js.map +1 -0
  62. package/dist/tools/diff.js +56 -0
  63. package/dist/tools/diff.js.map +1 -0
  64. package/dist/tools/edit-file.js +165 -0
  65. package/dist/tools/edit-file.js.map +1 -0
  66. package/dist/tools/list-files.js +116 -0
  67. package/dist/tools/list-files.js.map +1 -0
  68. package/dist/tools/read-file.js +107 -0
  69. package/dist/tools/read-file.js.map +1 -0
  70. package/dist/tools/registry.js +54 -0
  71. package/dist/tools/registry.js.map +1 -0
  72. package/dist/tools/search-files.js +159 -0
  73. package/dist/tools/search-files.js.map +1 -0
  74. package/dist/tools/types.js +5 -0
  75. package/dist/tools/types.js.map +1 -0
  76. package/dist/tools/write-file.js +141 -0
  77. package/dist/tools/write-file.js.map +1 -0
  78. package/dist/types/index.js +8 -0
  79. package/dist/types/index.js.map +1 -0
  80. package/dist/ui/App.js +264 -0
  81. package/dist/ui/App.js.map +1 -0
  82. package/dist/ui/InputBar.js +22 -0
  83. package/dist/ui/InputBar.js.map +1 -0
  84. package/dist/ui/MessageList.js +82 -0
  85. package/dist/ui/MessageList.js.map +1 -0
  86. package/dist/ui/ModeIndicator.js +23 -0
  87. package/dist/ui/ModeIndicator.js.map +1 -0
  88. package/dist/ui/PermissionPrompt.js +61 -0
  89. package/dist/ui/PermissionPrompt.js.map +1 -0
  90. package/dist/ui/StatusBar.js +39 -0
  91. package/dist/ui/StatusBar.js.map +1 -0
  92. package/dist/ui/theme.js +42 -0
  93. package/dist/ui/theme.js.map +1 -0
  94. package/dist/utils/abort.js +61 -0
  95. package/dist/utils/abort.js.map +1 -0
  96. package/dist/utils/errors.js +63 -0
  97. package/dist/utils/errors.js.map +1 -0
  98. package/dist/utils/formatting.js +102 -0
  99. package/dist/utils/formatting.js.map +1 -0
  100. package/dist/utils/logger.js +43 -0
  101. package/dist/utils/logger.js.map +1 -0
  102. package/dist/version.js +10 -0
  103. package/dist/version.js.map +1 -0
  104. 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":"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"}
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGtD,MAAM,CAAC,MAAM,YAAY,GAAqB,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAW,CAAC;IACjE,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAW,CAAC;IACtD,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAW,CAAC;IAEtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,wBAAwB;YAC/B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,uBAAuB;YAC9B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,0BAA0B;YACjC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,+BAA+B;YACtC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,wEAAwE;YAC/E,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,gBAAgB;YACxC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,oBAAoB,KAAK,CAAC,WAAW,EAAE;YAC9C,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,+BAA+B;YACtC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,2EAA2E;YAClF,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GACX,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;QAC3B,SAAS;QACT,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAEvD,aAAa;IACb,IAAI,aAAa,GAAc,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,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,WAAW;YACrB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,kBAAkB,KAAK,CAAC,WAAW,EAAE;YAC5C,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,QAAQ;YACpD,OAAO,EAAE,YAAY;SACtB,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,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,iBAAkB,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YAC9D,aAAa;YACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,qBAAqB,KAAK,CAAC,WAAW,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,GAAG;QAClF,QAAQ,EAAE;YACR,IAAI,EAAE,KAAK,CAAC,WAAW;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB;QACD,aAAa;QACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC7B,CAAC;AACJ,CAAC,CAAC"}
@@ -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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"}