@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,153 @@
1
+ /**
2
+ * `aigency login` — OAuth akışı ile hesaba bağlan.
3
+ *
4
+ * Akış:
5
+ * 1. PKCE verifier + state üret
6
+ * 2. Local HTTP callback server başlat (random port)
7
+ * 3. POST /api/cli/auth/init → auth_url
8
+ * 4. Kullanıcı tarayıcıda auth_url'yi aç
9
+ * 5. Kullanıcı onayı veya "Reddet" seçene kadar bekle
10
+ * 6. Callback geldiğinde state doğrula
11
+ * 7. POST /api/cli/auth/exchange → access + refresh token
12
+ * 8. Credentials'ı ~/.aigency/credentials.enc'ye kaydet
13
+ * 9. "Giriş başarılı" mesajı
14
+ */
15
+ import os from "node:os";
16
+ import { spawn } from "node:child_process";
17
+ import { startLocalAuthServer } from "../auth/oauth.js";
18
+ import { generatePkceVerifier, deriveChallenge, generateState } from "../auth/pkce.js";
19
+ import { saveSession } from "../auth/session.js";
20
+ import { writeUserMetadata } from "../auth/storage.js";
21
+ import { initAuth, exchangeCode, } from "../api-client/auth.js";
22
+ import { CLI_VERSION, CLI_DISPLAY_NAME } from "../version.js";
23
+ import { log } from "../utils/logger.js";
24
+ import { color, symbols } from "../utils/formatting.js";
25
+ import { AuthError, CliError } from "../utils/errors.js";
26
+ import { getGlobalAbortManager } from "../utils/abort.js";
27
+ function getDeviceName() {
28
+ try {
29
+ return `${os.hostname()}-${os.userInfo().username}`.slice(0, 120);
30
+ }
31
+ catch {
32
+ return `aigency-cli-${Date.now()}`;
33
+ }
34
+ }
35
+ function openBrowser(url) {
36
+ // Platform başına uygun komut. Hata durumunda kullanıcıya URL gösterilir.
37
+ const platform = process.platform;
38
+ const opts = {
39
+ detached: true,
40
+ stdio: "ignore",
41
+ };
42
+ try {
43
+ if (platform === "darwin") {
44
+ spawn("open", [url], opts).unref();
45
+ }
46
+ else if (platform === "win32") {
47
+ // Windows — cmd /c start komutuyla
48
+ spawn("cmd", ["/c", "start", "", url], opts).unref();
49
+ }
50
+ else {
51
+ // Linux/freebsd — xdg-open
52
+ spawn("xdg-open", [url], opts).unref();
53
+ }
54
+ }
55
+ catch {
56
+ // Tarayıcı açılamazsa manuel göster
57
+ }
58
+ }
59
+ export async function runLoginCommand(options = {}) {
60
+ log.info(`${CLI_DISPLAY_NAME} v${CLI_VERSION} — Hesabınıza bağlanılıyor`);
61
+ log.newline();
62
+ // 1) PKCE + state üret
63
+ const codeVerifier = generatePkceVerifier();
64
+ const codeChallenge = deriveChallenge(codeVerifier);
65
+ const clientState = generateState();
66
+ // 2) Local callback server başlat
67
+ const server = await startLocalAuthServer();
68
+ log.debug(`Yerel callback server: http://127.0.0.1:${server.port}`);
69
+ try {
70
+ // 3) Sunucuya init gönder
71
+ const init = await initAuth({
72
+ cli_version: CLI_VERSION,
73
+ device_name: getDeviceName(),
74
+ device_os: process.platform,
75
+ device_arch: process.arch,
76
+ cli_port: server.port,
77
+ code_challenge: codeChallenge,
78
+ });
79
+ // Sunucunun döndürdüğü state bizim ürettiğimizin aynısı OLMAK ZORUNDA DEĞİL —
80
+ // sunucu kendi state'ini üretir, biz de onu karşılaştırmada kullanırız.
81
+ const serverState = init.state;
82
+ // 4) Tarayıcıyı aç
83
+ if (options.noBrowser) {
84
+ log.plain("Aşağıdaki bağlantıyı tarayıcıda açın:");
85
+ log.plain(" " + color.cyan(init.auth_url));
86
+ }
87
+ else {
88
+ openBrowser(init.auth_url);
89
+ log.info("Tarayıcı açılıyor — onay sayfasından hesabınızı yetkilendirin");
90
+ log.hint(init.auth_url);
91
+ }
92
+ log.newline();
93
+ log.dim("Onay bekleniyor " + symbols.ellipsis);
94
+ // 5) Callback bekle
95
+ const abortManager = getGlobalAbortManager();
96
+ const callbackPromise = server.waitForCallback();
97
+ // Ctrl+C → server.close ve abort
98
+ const abortHandler = () => {
99
+ server.close();
100
+ };
101
+ abortManager.signal.addEventListener("abort", abortHandler, { once: true });
102
+ const callback = await callbackPromise;
103
+ abortManager.signal.removeEventListener("abort", abortHandler);
104
+ if (callback.error) {
105
+ throw new AuthError(`Yetkilendirme reddedildi: ${callback.error}`);
106
+ }
107
+ if (callback.state !== serverState) {
108
+ throw new AuthError("State eşleşmedi — olası CSRF saldırısı", "`aigency login` komutunu tekrar çalıştırın.");
109
+ }
110
+ // 6) Exchange — raw token al
111
+ log.debug("Token değişimi yapılıyor");
112
+ const exchanged = await exchangeCode({
113
+ state: serverState,
114
+ code_verifier: codeVerifier,
115
+ });
116
+ if ("status" in exchanged && exchanged.status === "pending") {
117
+ throw new AuthError("Sunucu hâlâ onayı işliyor", "Birkaç saniye sonra tekrar deneyin.");
118
+ }
119
+ const exchangeResponse = exchanged;
120
+ const { access_token, refresh_token, expires_at, user } = exchangeResponse;
121
+ // 7) Credentials'ı kaydet
122
+ await saveSession({
123
+ access_token,
124
+ refresh_token,
125
+ expires_at,
126
+ user,
127
+ saved_at: new Date().toISOString(),
128
+ });
129
+ // 8) Metadata (şifresiz) — profil özeti
130
+ await writeUserMetadata({
131
+ user,
132
+ device_name: getDeviceName(),
133
+ last_login: new Date().toISOString(),
134
+ });
135
+ log.newline();
136
+ log.success(`Giriş başarılı — ${color.bold(user.name || user.email)}`);
137
+ log.hint("`aigency usage` ile aylık kotanızı görebilirsiniz");
138
+ log.hint("`aigency logout` ile çıkış yapabilirsiniz");
139
+ }
140
+ catch (err) {
141
+ if (err instanceof CliError) {
142
+ throw err;
143
+ }
144
+ throw new CliError(err.message || "Giriş başarısız", {
145
+ code: "login_failed",
146
+ cause: err,
147
+ });
148
+ }
149
+ finally {
150
+ server.close();
151
+ }
152
+ }
153
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `aigency logout` — sunucudaki session'ı iptal et ve yerel token'ları sil.
3
+ */
4
+ import { deleteSession, getActiveSession } from "../auth/session.js";
5
+ import { revokeSession } from "../api-client/auth.js";
6
+ import { log } from "../utils/logger.js";
7
+ import { CliError } from "../utils/errors.js";
8
+ export async function runLogoutCommand() {
9
+ const creds = await getActiveSession();
10
+ if (!creds) {
11
+ log.info("Zaten giriş yapılmamış.");
12
+ return;
13
+ }
14
+ // Sunucuya revoke isteği — hata olsa bile yerel token'ları sil
15
+ try {
16
+ await revokeSession(creds.access_token, "user_logout");
17
+ log.debug("Sunucu session'ı iptal etti");
18
+ }
19
+ catch (err) {
20
+ if (err instanceof CliError && err.code === "auth_error") {
21
+ log.debug("Sunucu session zaten geçersiz");
22
+ }
23
+ else {
24
+ log.warn(`Sunucuya revoke gönderilemedi: ${err.message.slice(0, 80)}`);
25
+ }
26
+ }
27
+ await deleteSession();
28
+ log.success("Çıkış yapıldı — hesabınızla olan bağlantı sonlandırıldı");
29
+ }
30
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QACvD,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACzD,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CACN,kCAAmC,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * `aigency update` — yeni sürüm kontrolü + otomatik güncelleme.
3
+ *
4
+ * Strateji: npm global install öncülenir. Binary swap (Windows file lock
5
+ * problemi nedeniyle) daha sonraki faza ertelendi. Kullanıcı onayı ile
6
+ * otomatik `npm install -g @aigencydev/cli` çalıştırılır.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import readline from "node:readline";
10
+ import { checkForUpdates } from "../api-client/updates.js";
11
+ import { log } from "../utils/logger.js";
12
+ import { color } from "../utils/formatting.js";
13
+ import { CLI_VERSION } from "../version.js";
14
+ function promptYesNo(question) {
15
+ return new Promise((resolve) => {
16
+ const rl = readline.createInterface({
17
+ input: process.stdin,
18
+ output: process.stdout,
19
+ });
20
+ rl.question(`${question} [y/N] `, (answer) => {
21
+ rl.close();
22
+ resolve(answer.trim().toLowerCase().startsWith("y"));
23
+ });
24
+ });
25
+ }
26
+ function runNpmInstall() {
27
+ return new Promise((resolve) => {
28
+ const isWin = process.platform === "win32";
29
+ const cmd = isWin ? "npm.cmd" : "npm";
30
+ const child = spawn(cmd, ["install", "-g", "@aigencydev/cli"], {
31
+ stdio: "inherit",
32
+ shell: false,
33
+ });
34
+ child.on("error", () => resolve(false));
35
+ child.on("close", (code) => resolve(code === 0));
36
+ });
37
+ }
38
+ export async function runUpdateCommand() {
39
+ log.info("Sürüm kontrolü yapılıyor...");
40
+ let manifest;
41
+ try {
42
+ manifest = await checkForUpdates();
43
+ }
44
+ catch (err) {
45
+ log.error(`Sürüm sunucusuna ulaşılamadı: ${err.message.slice(0, 100)}`);
46
+ return;
47
+ }
48
+ log.plain(`Mevcut sürüm: ${color.bold(CLI_VERSION)} · Son sürüm: ${color.bold(manifest.latest)}`);
49
+ if (!manifest.update_available) {
50
+ log.success("Zaten en güncel sürümdesiniz.");
51
+ return;
52
+ }
53
+ if (manifest.force_update) {
54
+ log.warn("Bu sürüm artık desteklenmiyor — güncelleme zorunlu.");
55
+ }
56
+ log.plain(color.dim(`Minimum gerekli sürüm: ${manifest.required_minimum}`));
57
+ log.hint(`Sürüm notları: ${manifest.release_notes_url}`);
58
+ log.newline();
59
+ // Kullanıcıya sor
60
+ const consent = await promptYesNo(`${color.bold("Şimdi güncellemek ister misiniz?")} ${color.dim("(npm install -g @aigencydev/cli)")}`);
61
+ if (!consent) {
62
+ log.newline();
63
+ log.plain("Güncellemek istediğinizde aşağıdaki komutu çalıştırın:");
64
+ if (process.platform === "win32") {
65
+ log.plain(color.cyan(" npm install -g @aigencydev/cli"));
66
+ log.plain(color.dim(" veya: irm https://aigency.dev/cli/install.ps1 | iex"));
67
+ }
68
+ else {
69
+ log.plain(color.cyan(" npm install -g @aigencydev/cli"));
70
+ log.plain(color.dim(" veya: curl -fsSL https://aigency.dev/cli/install.sh | bash"));
71
+ }
72
+ return;
73
+ }
74
+ log.newline();
75
+ log.info("Güncelleme başlatılıyor...");
76
+ const success = await runNpmInstall();
77
+ if (success) {
78
+ log.success(`AIGENCY CLI v${manifest.latest} yüklendi`);
79
+ log.hint("Yeni sürümü kullanmak için mevcut terminali kapatıp yeniden açın");
80
+ }
81
+ else {
82
+ log.error("Güncelleme başarısız oldu");
83
+ log.hint(process.platform === "win32"
84
+ ? "PowerShell'i yönetici olarak açıp tekrar deneyin"
85
+ : "sudo gerekmiyorsa nvm kullanımını kontrol edin: `which npm`");
86
+ }
87
+ }
88
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `aigency usage` — aylık kullanım, kota ve paket bilgisini göster.
3
+ */
4
+ import { requireActiveSession } from "../auth/session.js";
5
+ import { fetchUsage, fetchPackages } from "../api-client/usage.js";
6
+ import { log } from "../utils/logger.js";
7
+ import { color, formatNumber, formatRelativeTime, progressBar, symbols, } from "../utils/formatting.js";
8
+ export async function runUsageCommand(options = {}) {
9
+ const session = await requireActiveSession();
10
+ const usage = await fetchUsage(session.access_token);
11
+ if (options.json) {
12
+ process.stdout.write(JSON.stringify(usage, null, 2) + "\n");
13
+ return;
14
+ }
15
+ const { current_month, last_month, top_commands, peak_hours } = usage;
16
+ log.plain(color.bold("AIGENCY CLI — Kullanım"));
17
+ log.plain(color.dim("─".repeat(40)));
18
+ // Bu ay
19
+ const pct = current_month.percent_used;
20
+ const bar = progressBar(pct, 28);
21
+ log.plain(`Bu ay: ${bar} ${color.bold(String(pct) + "%")}`);
22
+ log.plain(` ${color.dim(`${formatNumber(current_month.tokens_total)} / ${formatNumber(current_month.quota_limit)} token`)}`);
23
+ log.plain(` ${color.dim(`${formatNumber(current_month.commands_count)} komut`)}`);
24
+ log.plain(` ${color.dim(`Yenileme: ${new Date(current_month.reset_at).toLocaleDateString("tr-TR")}`)}`);
25
+ if (options.brief)
26
+ return;
27
+ log.newline();
28
+ // Geçen ay
29
+ log.plain(`${color.dim("Geçen ay:")} ${formatNumber(last_month.tokens_total)} token · ${formatNumber(last_month.commands_count)} komut`);
30
+ log.newline();
31
+ // En çok kullanılan komutlar
32
+ if (top_commands.length > 0) {
33
+ log.plain(color.bold("En çok kullanılan komutlar (bu ay)"));
34
+ for (const tc of top_commands) {
35
+ log.plain(` ${symbols.bullet} ${tc.command} ${color.dim("(" + tc.count + ")")}`);
36
+ }
37
+ log.newline();
38
+ }
39
+ // Yoğun saatler
40
+ if (peak_hours.length > 0) {
41
+ log.plain(color.bold("Yoğun saatler (son 30 gün)"));
42
+ for (const ph of peak_hours) {
43
+ log.plain(` ${symbols.bullet} ${String(ph.hour).padStart(2, "0")}:00 ${color.dim("(" + ph.count + ")")}`);
44
+ }
45
+ log.newline();
46
+ }
47
+ // Kota uyarı mesajı
48
+ if (pct >= 85) {
49
+ log.warn(`Aylık kotanızın ${pct}%'ini kullandınız. Paketinizi yükseltmeyi düşünebilirsiniz.`);
50
+ try {
51
+ const pkgs = await fetchPackages();
52
+ log.newline();
53
+ log.plain(color.bold("Paketler:"));
54
+ for (const pkg of pkgs.packages) {
55
+ log.plain(` ${symbols.bullet} ${color.cyan(pkg.name)} — ${formatNumber(pkg.monthly_price_try)} ${pkgs.currency}/ay (${formatNumber(pkg.monthly_tokens)} token)`);
56
+ }
57
+ }
58
+ catch {
59
+ // Paket listesi alınamadı — sessiz geç
60
+ }
61
+ }
62
+ log.dim(`${formatRelativeTime(session.saved_at)} kaydedildi`);
63
+ }
64
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * AIGENCY CLI — varsayılan ayarlar + sabitler.
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * API sunucu URL'i — production default aigency.dev, dev için 8060 port.
7
+ * Ortam değişkeni ile override edilebilir.
8
+ */
9
+ export function getApiBaseUrl() {
10
+ const envUrl = process.env.AIGENCY_CLI_API_URL;
11
+ if (envUrl)
12
+ return envUrl.replace(/\/$/, "");
13
+ return "https://aigency.dev";
14
+ }
15
+ export const DEFAULT_PERMISSION_MODE = "default";
16
+ export const DEFAULT_MODEL_TIER = "pro";
17
+ export const DEFAULT_TIMEOUTS = {
18
+ http: 60_000, // genel HTTP istekleri
19
+ oauthServer: 5 * 60 * 1000, // lokal HTTP auth server: 5 dakika
20
+ stream: 10 * 60 * 1000, // stream bekleme maks
21
+ toolExec: 3 * 60 * 1000, // yerel tool exec maks
22
+ };
23
+ /**
24
+ * Zod şeması — ~/.aigency/config.json ve <cwd>/.aigency/settings.json
25
+ */
26
+ export const SettingsSchema = z.object({
27
+ mode: z.enum(["default", "plan", "accept_edits", "auto"]).default("default"),
28
+ model: z.enum(["pro", "max"]).default("pro"),
29
+ telemetry: z
30
+ .object({
31
+ enabled: z.boolean().default(false),
32
+ })
33
+ .default({ enabled: false }),
34
+ hooks: z
35
+ .object({
36
+ preToolUse: z.array(z.string()).default([]),
37
+ postToolUse: z.array(z.string()).default([]),
38
+ stop: z.array(z.string()).default([]),
39
+ })
40
+ .default({ preToolUse: [], postToolUse: [], stop: [] }),
41
+ permissions: z
42
+ .object({
43
+ autoApprove: z.array(z.string()).default([]),
44
+ neverApprove: z.array(z.string()).default([]),
45
+ })
46
+ .default({ autoApprove: [], neverApprove: [] }),
47
+ ui: z
48
+ .object({
49
+ theme: z.enum(["dark", "auto"]).default("auto"),
50
+ })
51
+ .default({ theme: "auto" }),
52
+ });
53
+ export const DEFAULT_SETTINGS = SettingsSchema.parse({});
54
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC/C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAmB,SAAS,CAAC;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAc,KAAK,CAAC;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,EAAE,uBAAuB;IACrC,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,mCAAmC;IAC/D,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,sBAAsB;IAC9C,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,uBAAuB;CACxC,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5E,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5C,SAAS,EAAE,CAAC;SACT,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;KACpC,CAAC;SACD,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACtC,CAAC;SACD,OAAO,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACzD,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KAC9C,CAAC;SACD,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACjD,EAAE,EAAE,CAAC;SACF,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;KAChD,CAAC;SACD,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAa,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * AIGENCY CLI — hooks executor.
3
+ *
4
+ * Settings.json içindeki hook listeleri:
5
+ * hooks.preToolUse — her tool çalıştırılmadan önce çalışır
6
+ * hooks.postToolUse — her tool çalışınca (başarılı veya hatalı) çalışır
7
+ * hooks.stop — chat oturumu bittiğinde çalışır
8
+ *
9
+ * Her hook bir shell komutudur. Komut çıktısı logger.debug ile gösterilir.
10
+ * Hook başarısız olursa tool akışı engellenmez (best-effort).
11
+ *
12
+ * Güvenlik: hook komutları da command-filter'dan geçer — kullanıcı
13
+ * ayar dosyasına `rm -rf /` yazamaz.
14
+ */
15
+ import { spawn } from "node:child_process";
16
+ import { checkCommand } from "../security/command-filter.js";
17
+ import { log } from "../utils/logger.js";
18
+ const HOOK_TIMEOUT_MS = 30_000; // 30 saniye
19
+ const HOOK_MAX_OUTPUT = 4_000;
20
+ async function runSingleHook(command, ctx) {
21
+ // Güvenlik: hook komutu da filter'dan geçer
22
+ const check = checkCommand(command);
23
+ if (check.verdict === "block") {
24
+ log.warn(`Hook bloklandı (${check.reason}): ${command.slice(0, 50)}`);
25
+ return { ok: false, output: `blocked: ${check.reason}` };
26
+ }
27
+ return new Promise((resolve) => {
28
+ const isWin = process.platform === "win32";
29
+ const shell = isWin ? "cmd.exe" : "/bin/sh";
30
+ const args = isWin ? ["/d", "/s", "/c", command] : ["-c", command];
31
+ const child = spawn(shell, args, {
32
+ cwd: ctx.cwd,
33
+ env: {
34
+ ...process.env,
35
+ AIGENCY_HOOK_TOOL: ctx.toolName || "",
36
+ AIGENCY_HOOK_SUCCESS: ctx.success === undefined ? "" : ctx.success ? "1" : "0",
37
+ AIGENCY_HOOK_PARAMS: ctx.params ? JSON.stringify(ctx.params).slice(0, 2000) : "",
38
+ },
39
+ windowsHide: true,
40
+ });
41
+ let output = "";
42
+ let bytes = 0;
43
+ const timer = setTimeout(() => {
44
+ try {
45
+ child.kill("SIGKILL");
46
+ }
47
+ catch {
48
+ // ignore
49
+ }
50
+ }, HOOK_TIMEOUT_MS);
51
+ const appendOutput = (chunk) => {
52
+ if (bytes >= HOOK_MAX_OUTPUT)
53
+ return;
54
+ const remaining = HOOK_MAX_OUTPUT - bytes;
55
+ const text = chunk.toString("utf8").slice(0, remaining);
56
+ output += text;
57
+ bytes += text.length;
58
+ };
59
+ child.stdout.on("data", appendOutput);
60
+ child.stderr.on("data", appendOutput);
61
+ child.on("error", (err) => {
62
+ clearTimeout(timer);
63
+ resolve({ ok: false, output: `spawn error: ${err.message}` });
64
+ });
65
+ child.on("close", (code) => {
66
+ clearTimeout(timer);
67
+ resolve({
68
+ ok: code === 0,
69
+ output,
70
+ });
71
+ });
72
+ });
73
+ }
74
+ /**
75
+ * Belirli bir event için tüm hook komutlarını sırayla çalıştırır.
76
+ * Paralel çalıştırma yok — hooks genellikle dosya sistemi etkileşimi olur,
77
+ * sıralı olması daha öngörülebilir.
78
+ */
79
+ export async function runHooks(event, settings, ctx) {
80
+ const commands = settings.hooks?.[event] || [];
81
+ if (commands.length === 0)
82
+ return;
83
+ log.debug(`hooks.${event}: ${commands.length} komut çalıştırılıyor`);
84
+ for (const command of commands) {
85
+ try {
86
+ const result = await runSingleHook(command, ctx);
87
+ if (!result.ok) {
88
+ log.debug(`hooks.${event} hata (komut atlanıyor): ${command.slice(0, 60)} → ${result.output.slice(0, 120)}`);
89
+ }
90
+ else if (result.output) {
91
+ log.debug(`hooks.${event} çıktı: ${result.output.slice(0, 120)}`);
92
+ }
93
+ }
94
+ catch (err) {
95
+ log.debug(`hook exception: ${err.message}`);
96
+ }
97
+ }
98
+ }
99
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/config/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * AIGENCY CLI — dosya ve dizin yol sabitleri.
3
+ *
4
+ * Windows, macOS ve Linux için `~/.aigency/` altında ayarlar ve oturum
5
+ * metadata'sı tutulur. Çalıştığı proje dizininde ise `.aigency/` altında
6
+ * proje-özel ayarlar bulunabilir.
7
+ */
8
+ import os from "node:os";
9
+ import path from "node:path";
10
+ /**
11
+ * ~/.aigency/ — kullanıcının kişisel CLI verisi
12
+ */
13
+ export function getUserAigencyDir() {
14
+ return path.join(os.homedir(), ".aigency");
15
+ }
16
+ /**
17
+ * ~/.aigency/cli.json — oturum metadata (kullanıcı, last login, device id)
18
+ * Not: Raw token'lar burada SAKLANMAZ; token'lar OS keyring'de tutulur.
19
+ * Keyring erişilemezse fallback olarak ~/.aigency/credentials.enc şifreli dosya.
20
+ */
21
+ export function getUserMetadataFile() {
22
+ return path.join(getUserAigencyDir(), "cli.json");
23
+ }
24
+ /**
25
+ * ~/.aigency/credentials.enc — OS keyring fallback için AES-GCM şifreli
26
+ * token dosyası. Anahtar OS username + home dir hash'inden türetilir.
27
+ */
28
+ export function getFallbackCredentialsFile() {
29
+ return path.join(getUserAigencyDir(), "credentials.enc");
30
+ }
31
+ /**
32
+ * ~/.aigency/cli.log — rotating log dosyası
33
+ */
34
+ export function getUserLogFile() {
35
+ return path.join(getUserAigencyDir(), "cli.log");
36
+ }
37
+ /**
38
+ * ~/.aigency/config.json — global ayarlar (default mode, telemetri, hooks)
39
+ */
40
+ export function getUserConfigFile() {
41
+ return path.join(getUserAigencyDir(), "config.json");
42
+ }
43
+ /**
44
+ * <cwd>/.aigency/ — proje-özel CLI klasörü
45
+ * `aigency init` ile oluşturulur.
46
+ */
47
+ export function getProjectAigencyDir(cwd = process.cwd()) {
48
+ return path.join(cwd, ".aigency");
49
+ }
50
+ /**
51
+ * <cwd>/.aigency/settings.json — proje-özel ayarlar (mode override, hooks)
52
+ */
53
+ export function getProjectSettingsFile(cwd = process.cwd()) {
54
+ return path.join(getProjectAigencyDir(cwd), "settings.json");
55
+ }
56
+ /**
57
+ * <cwd>/.aigency/memory/ — proje-özel agent hafıza klasörü (Faz 4'te kullanılacak)
58
+ */
59
+ export function getProjectMemoryDir(cwd = process.cwd()) {
60
+ return path.join(getProjectAigencyDir(cwd), "memory");
61
+ }
62
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAChE,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC"}