@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
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # AIGENCY CLI
2
+
3
+ Terminalden yapay zeka destekli kod üretimi, dosya yönetimi ve proje otomasyonu.
4
+
5
+ ## Kurulum
6
+
7
+ **macOS / Linux**
8
+ ```bash
9
+ curl -fsSL https://aigency.dev/cli/install.sh | bash
10
+ ```
11
+
12
+ **Windows (PowerShell)**
13
+ ```powershell
14
+ irm https://aigency.dev/cli/install.ps1 | iex
15
+ ```
16
+
17
+ **npm (alternatif)**
18
+ ```bash
19
+ npm install -g @aigencydev/cli
20
+ ```
21
+
22
+ ## Kullanım
23
+
24
+ ```bash
25
+ # Hesabınıza bağlanın
26
+ aigency login
27
+
28
+ # Mevcut dizinde .aigency/ proje klasörü oluşturun
29
+ aigency init
30
+
31
+ # Aylık kullanımınızı görün
32
+ aigency usage
33
+
34
+ # Sürüm kontrolü
35
+ aigency update
36
+
37
+ # Yardım
38
+ aigency help
39
+ ```
40
+
41
+ ## Paketler
42
+
43
+ | Paket | Fiyat | Aylık token |
44
+ |---|---|---|
45
+ | AIGENCY CLI Pro | 1.500 ₺/ay | 1.000.000 |
46
+ | AIGENCY CLI Max | 3.000 ₺/ay | 5.000.000 + öncelikli kuyruk + Auto mode |
47
+
48
+ ## İzin Modları (Faz 4'te aktif)
49
+
50
+ | Mod | Davranış |
51
+ |---|---|
52
+ | `default` | Dosya okuma otomatik, yazma ve komut onay ister |
53
+ | `plan` | Dry-run — hiçbir şey yazılmaz, sadece plan gösterilir |
54
+ | `accept_edits` | Dosya yazma otomatik, komut hâlâ onay ister |
55
+ | `auto` | Sınıflandırıcı destekli tam otomatik (sadece Max tier) |
56
+
57
+ ## Yapılandırma
58
+
59
+ ### Ortam değişkenleri
60
+
61
+ - `AIGENCY_CLI_API_URL` — API sunucu URL'i (varsayılan `https://aigency.dev`)
62
+ - `AIGENCY_CLI_DEBUG=1` — ayrıntılı debug log'ları
63
+
64
+ ### Dosyalar
65
+
66
+ - `~/.aigency/config.json` — kullanıcı düzeyinde varsayılan ayarlar
67
+ - `~/.aigency/credentials.enc` — şifrelenmiş oturum token'ları (AES-256-GCM)
68
+ - `<proje>/.aigency/settings.json` — proje düzeyinde ayar override
69
+
70
+ ## Geliştirme
71
+
72
+ ```bash
73
+ cd aigency-cli
74
+ npm install
75
+ npm run dev -- help # tsx ile direkt çalıştır
76
+ npm run typecheck # tip kontrolü
77
+ npm run build # dist/ üret
78
+ node dist/index.js help # derlenmiş halini çalıştır
79
+ ```
80
+
81
+ ## Lisans
82
+
83
+ Özel — AIGENCY.
@@ -0,0 +1,59 @@
1
+ /**
2
+ * AIGENCY CLI — kullanıcı prompt'u ve history için basit chunker.
3
+ *
4
+ * Faz 4 scope'u: basit token budget kontrolü + history trim.
5
+ * Faz 5'te gelişmiş chunked streaming (proje dosyalarını parçalara bölüp
6
+ * ardışık stream istekleriyle göndermek) eklenecek.
7
+ *
8
+ * Şu an:
9
+ * - Toplam token (history + prompt) tahmin et
10
+ * - Budget üstü ise en eski mesajları kırp
11
+ * - Kalan budget prompt + 20% response için yeterli değilse uyar
12
+ */
13
+ /** Basit token tahmini — 1 token ≈ 4 karakter */
14
+ export function approxTokens(text) {
15
+ return Math.ceil(text.length / 4);
16
+ }
17
+ const DEFAULT_MAX_CONTEXT = 120_000; // Güvenli sınır — çoğu model destekler
18
+ const DEFAULT_RESERVE_RESPONSE = 8_000;
19
+ const DEFAULT_RESERVE_SYSTEM = 4_000;
20
+ /**
21
+ * History'yi budget'a sığdırır — eskiden başlayarak kırpar.
22
+ */
23
+ export function prepareChunk(prompt, history, options = {}) {
24
+ const maxContext = options.maxContextTokens || DEFAULT_MAX_CONTEXT;
25
+ const reserveResponse = options.reserveForResponse || DEFAULT_RESERVE_RESPONSE;
26
+ const reserveSystem = options.reserveForSystem || DEFAULT_RESERVE_SYSTEM;
27
+ const available = maxContext - reserveResponse - reserveSystem;
28
+ const promptTokens = approxTokens(prompt);
29
+ if (promptTokens > available) {
30
+ return {
31
+ history: [],
32
+ inputTokens: promptTokens,
33
+ droppedCount: history.length,
34
+ warning: `Prompt tek başına ${promptTokens} token — context limiti (${available}) aşılıyor. Komutunuzu kısaltın.`,
35
+ };
36
+ }
37
+ // Sondan başa doğru ekle (son mesajlar daha önemli)
38
+ const reversed = [...history].reverse();
39
+ const selected = [];
40
+ let total = promptTokens;
41
+ for (const msg of reversed) {
42
+ const msgTokens = msg.approxTokens ?? approxTokens(msg.content || "");
43
+ if (total + msgTokens > available)
44
+ break;
45
+ total += msgTokens;
46
+ selected.unshift(msg);
47
+ }
48
+ const droppedCount = history.length - selected.length;
49
+ const warning = droppedCount > 0
50
+ ? `Geçmiş kırpıldı: ${droppedCount} eski mesaj atlandı (bağlam limiti)`
51
+ : null;
52
+ return {
53
+ history: selected,
54
+ inputTokens: total,
55
+ droppedCount,
56
+ warning,
57
+ };
58
+ }
59
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/agent/chunker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAsBD,MAAM,mBAAmB,GAAG,OAAO,CAAC,CAAC,uCAAuC;AAC5E,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,OAAyB,EACzB,UAAwB,EAAE;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,IAAI,mBAAmB,CAAC;IACnE,MAAM,eAAe,GAAG,OAAO,CAAC,kBAAkB,IAAI,wBAAwB,CAAC;IAC/E,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,IAAI,sBAAsB,CAAC;IAEzE,MAAM,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;IAC/D,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAE1C,IAAI,YAAY,GAAG,SAAS,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,YAAY;YACzB,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,OAAO,EAAE,qBAAqB,YAAY,4BAA4B,SAAS,kCAAkC;SAClH,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,IAAI,KAAK,GAAG,YAAY,CAAC;IAEzB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACtE,IAAI,KAAK,GAAG,SAAS,GAAG,SAAS;YAAE,MAAM;QACzC,KAAK,IAAI,SAAS,CAAC;QACnB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IACtD,MAAM,OAAO,GACX,YAAY,GAAG,CAAC;QACd,CAAC,CAAC,oBAAoB,YAAY,qCAAqC;QACvE,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,KAAK;QAClB,YAAY;QACZ,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * AIGENCY CLI — sohbet geçmişi ring buffer.
3
+ *
4
+ * Kullanıcı + asistan mesajlarını tutar. /clear komutu sıfırlar.
5
+ * Chunked streaming sırasında bu history stream endpoint'ine gönderilir.
6
+ */
7
+ const MAX_HISTORY = 40;
8
+ export class ChatHistory {
9
+ messages = [];
10
+ push(msg) {
11
+ const approxTokens = msg.approxTokens ?? Math.ceil((msg.content || "").length / 4);
12
+ this.messages.push({ ...msg, approxTokens });
13
+ // Ring buffer — en eski mesajları kırp
14
+ while (this.messages.length > MAX_HISTORY) {
15
+ this.messages.shift();
16
+ }
17
+ }
18
+ clear() {
19
+ this.messages = [];
20
+ }
21
+ getAll() {
22
+ return [...this.messages];
23
+ }
24
+ length() {
25
+ return this.messages.length;
26
+ }
27
+ /** Son N mesajı döner — stream endpoint'ine bunu gönderiyoruz */
28
+ tail(n) {
29
+ return this.messages.slice(-n);
30
+ }
31
+ totalApproxTokens() {
32
+ return this.messages.reduce((acc, m) => acc + (m.approxTokens || 0), 0);
33
+ }
34
+ }
35
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/agent/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,OAAO,WAAW;IACd,QAAQ,GAAqB,EAAE,CAAC;IAExC,IAAI,CAAC,GAAmB;QACtB,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;QAC7C,uCAAuC;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC,CAAS;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * AIGENCY CLI — agent loop orchestrator.
3
+ *
4
+ * Akış:
5
+ * 1. Kullanıcı prompt → request_id üret → stream endpoint'ine POST
6
+ * 2. SSE event'lerini dinle
7
+ * 3. cli_tool_dispatch gelirse:
8
+ * - Yerel tool registry'den handler'ı bul
9
+ * - Permission callback ile kullanıcıya sor (gerekirse)
10
+ * - Çalıştır → ToolResult
11
+ * - POST /api/cli/stream/tool-result ile sunucuya döndür
12
+ * 4. agent_message, cli_token_usage, cli_quota_warning event'leri UI'a iletilir
13
+ * 5. done veya error → loop biter
14
+ */
15
+ import crypto from "node:crypto";
16
+ import { openStream, sendToolResult } from "../api-client/stream.js";
17
+ import { dispatchLocalTool, hasLocalTool } from "../tools/registry.js";
18
+ import { prepareChunk } from "./chunker.js";
19
+ import { log } from "../utils/logger.js";
20
+ import { runHooks } from "../config/hooks.js";
21
+ function generateRequestId() {
22
+ return crypto.randomBytes(18).toString("base64url");
23
+ }
24
+ function cwdHash(cwd) {
25
+ return crypto.createHash("sha256").update(cwd).digest("hex").slice(0, 32);
26
+ }
27
+ /**
28
+ * Session-level permission cache — "a" (oturum boyunca kabul) için.
29
+ */
30
+ const SESSION_APPROVED_TOOLS = new Set();
31
+ function wrapPermission(originalRequestPermission, mode) {
32
+ return async (req) => {
33
+ // Plan mode zaten tool seviyesinde reddediyor, ama ekstra guard
34
+ if (mode === "plan" && (req.toolName === "write_file" || req.toolName === "edit_file")) {
35
+ return { decision: "reject" };
36
+ }
37
+ // Session'da zaten kabul edilmişse tekrar sorma
38
+ if (SESSION_APPROVED_TOOLS.has(req.toolName)) {
39
+ return { decision: "approve" };
40
+ }
41
+ const response = await originalRequestPermission(req);
42
+ if (response.decision === "approve_once_session") {
43
+ SESSION_APPROVED_TOOLS.add(req.toolName);
44
+ return { decision: "approve" };
45
+ }
46
+ return response;
47
+ };
48
+ }
49
+ export async function runAgentLoop(params) {
50
+ const requestId = generateRequestId();
51
+ let inputTokens = 0;
52
+ let outputTokens = 0;
53
+ let toolCalls = 0;
54
+ let finalMessage = "";
55
+ let aborted = false;
56
+ const toolCtx = {
57
+ cwd: params.workingDirectory,
58
+ mode: params.mode,
59
+ signal: params.signal,
60
+ requestPermission: wrapPermission(params.requestPermission, params.mode),
61
+ };
62
+ // History'yi hazırla + chunk'la
63
+ const chunk = prepareChunk(params.prompt, params.history.getAll());
64
+ if (chunk.warning) {
65
+ log.debug(`chunker: ${chunk.warning}`);
66
+ }
67
+ const streamHistory = chunk.history.map((m) => ({
68
+ role: m.role,
69
+ content: m.content,
70
+ tool_call_id: m.tool_call_id,
71
+ tool_calls: m.tool_calls,
72
+ }));
73
+ const onEvent = async (event) => {
74
+ // Her event UI'a iletilir (UI render eder)
75
+ params.onEvent(event);
76
+ switch (event.type) {
77
+ case "agent_message":
78
+ if (!event.delta) {
79
+ finalMessage = event.content;
80
+ }
81
+ else {
82
+ finalMessage += event.content;
83
+ }
84
+ break;
85
+ case "cli_token_usage":
86
+ inputTokens = event.input;
87
+ outputTokens = event.output;
88
+ break;
89
+ case "cli_tool_dispatch": {
90
+ // Sunucu LLM'den gelen tool call'u bize devretti — yerel çalıştır
91
+ toolCalls++;
92
+ if (!hasLocalTool(event.toolName)) {
93
+ // Bilinmeyen tool — server'a hata dön
94
+ const errorResult = {
95
+ success: false,
96
+ output: "",
97
+ error: `Yerel tool bulunamadı: ${event.toolName}`,
98
+ duration: 0,
99
+ };
100
+ await sendToolResult(params.accessToken, {
101
+ requestId: event.requestId,
102
+ stepId: event.stepId,
103
+ toolName: event.toolName,
104
+ result: errorResult,
105
+ mode: params.mode,
106
+ approved: 0,
107
+ });
108
+ return;
109
+ }
110
+ // PreToolUse hook
111
+ if (params.settings) {
112
+ await runHooks("preToolUse", params.settings, {
113
+ toolName: event.toolName,
114
+ cwd: params.workingDirectory,
115
+ params: event.params,
116
+ });
117
+ }
118
+ let result;
119
+ try {
120
+ result = await dispatchLocalTool(event.toolName, event.params, toolCtx);
121
+ }
122
+ catch (err) {
123
+ result = {
124
+ success: false,
125
+ output: "",
126
+ error: `Tool execute hatası: ${err.message.slice(0, 200)}`,
127
+ duration: 0,
128
+ };
129
+ }
130
+ // approvalState'i ToolResult'a ekleme — backend schema'sında yok,
131
+ // ayrı parametre olarak gönder
132
+ const approvalState = result.approvalState ?? 2;
133
+ // PostToolUse hook
134
+ if (params.settings) {
135
+ await runHooks("postToolUse", params.settings, {
136
+ toolName: event.toolName,
137
+ success: result.success,
138
+ cwd: params.workingDirectory,
139
+ params: event.params,
140
+ });
141
+ }
142
+ try {
143
+ await sendToolResult(params.accessToken, {
144
+ requestId: event.requestId,
145
+ stepId: event.stepId,
146
+ toolName: event.toolName,
147
+ result: {
148
+ success: result.success,
149
+ output: result.output,
150
+ error: result.error,
151
+ metadata: result.metadata,
152
+ duration: result.duration,
153
+ },
154
+ mode: params.mode,
155
+ approved: approvalState,
156
+ });
157
+ }
158
+ catch (err) {
159
+ log.debug(`tool-result POST hatası: ${err.message}`);
160
+ }
161
+ break;
162
+ }
163
+ case "error":
164
+ case "agent_error":
165
+ // UI error event'i gösterecek — burada ek bir şey yapmaya gerek yok
166
+ break;
167
+ case "done":
168
+ if (event.fullContent)
169
+ finalMessage = event.fullContent;
170
+ break;
171
+ }
172
+ };
173
+ try {
174
+ await openStream(params.accessToken, {
175
+ request_id: requestId,
176
+ prompt: params.prompt,
177
+ project_root: params.projectRoot,
178
+ working_directory: params.workingDirectory,
179
+ cwd_hash: cwdHash(params.workingDirectory),
180
+ mode: params.mode,
181
+ model: params.model,
182
+ chat_history: streamHistory,
183
+ compacted_summary: params.priorInsights,
184
+ }, onEvent, params.signal);
185
+ }
186
+ catch (err) {
187
+ if (err?.code === "aborted") {
188
+ aborted = true;
189
+ }
190
+ else {
191
+ throw err;
192
+ }
193
+ }
194
+ // Stop hook — oturum bitişinde
195
+ if (params.settings) {
196
+ try {
197
+ await runHooks("stop", params.settings, {
198
+ cwd: params.workingDirectory,
199
+ });
200
+ }
201
+ catch {
202
+ // ignore
203
+ }
204
+ }
205
+ return {
206
+ finalMessage,
207
+ inputTokens,
208
+ outputTokens,
209
+ toolCalls,
210
+ aborted,
211
+ };
212
+ }
213
+ /**
214
+ * Test veya /clear için session kabul cache'ini sıfırla.
215
+ */
216
+ export function clearSessionApprovalCache() {
217
+ SESSION_APPROVED_TOOLS.clear();
218
+ }
219
+ //# sourceMappingURL=loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * AIGENCY CLI — proje hafızası (.aigency/memory/*.md).
3
+ *
4
+ * Agent'ın uzun süreli notları için basit bir dosya-bazlı memory sistemi.
5
+ * Her yeni oturum başında `loadMemorySnapshot` çağrılır — bulunan markdown
6
+ * dosyalarının özeti system prompt'a iliştirilir.
7
+ *
8
+ * Faz 5 scope'u: salt okunur — agent kendisi memory yazmaz, kullanıcı
9
+ * veya gelecekteki `/remember` komutu dosya oluşturur.
10
+ *
11
+ * Dosya formatı:
12
+ * .aigency/memory/project.md — proje özeti, mimari kararlar
13
+ * .aigency/memory/conventions.md — kod stili, isimlendirme
14
+ * .aigency/memory/todo.md — yapılacaklar listesi
15
+ * vb.
16
+ */
17
+ import fs from "node:fs/promises";
18
+ import path from "node:path";
19
+ import { getProjectMemoryDir } from "../config/paths.js";
20
+ import { log } from "../utils/logger.js";
21
+ const MAX_FILE_SIZE = 64 * 1024; // 64 KB per memory file
22
+ const MAX_TOTAL_SIZE = 256 * 1024; // 256 KB total
23
+ const MAX_FILES = 20;
24
+ /**
25
+ * `.aigency/memory/` dizinindeki tüm markdown dosyalarını okur.
26
+ * Toplam boyut MAX_TOTAL_SIZE'ı aşmaz — aşarsa alfabetik sırayla keser.
27
+ */
28
+ export async function loadMemorySnapshot(cwd = process.cwd()) {
29
+ const memoryDir = getProjectMemoryDir(cwd);
30
+ const empty = {
31
+ files: [],
32
+ totalBytes: 0,
33
+ summary: "",
34
+ };
35
+ let entries;
36
+ try {
37
+ entries = await fs.readdir(memoryDir);
38
+ }
39
+ catch (err) {
40
+ const code = err?.code;
41
+ if (code !== "ENOENT") {
42
+ log.debug(`memory readdir hatası: ${err.message}`);
43
+ }
44
+ return empty;
45
+ }
46
+ const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
47
+ if (mdFiles.length === 0)
48
+ return empty;
49
+ const files = [];
50
+ let totalBytes = 0;
51
+ for (const name of mdFiles.slice(0, MAX_FILES)) {
52
+ if (totalBytes >= MAX_TOTAL_SIZE)
53
+ break;
54
+ const filePath = path.join(memoryDir, name);
55
+ let stat;
56
+ try {
57
+ stat = await fs.stat(filePath);
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ if (!stat.isFile())
63
+ continue;
64
+ if (stat.size > MAX_FILE_SIZE) {
65
+ log.debug(`memory: ${name} çok büyük, atlanıyor`);
66
+ continue;
67
+ }
68
+ const remaining = MAX_TOTAL_SIZE - totalBytes;
69
+ if (stat.size > remaining)
70
+ break;
71
+ let content;
72
+ try {
73
+ content = await fs.readFile(filePath, "utf8");
74
+ }
75
+ catch {
76
+ continue;
77
+ }
78
+ if (content.includes("\u0000"))
79
+ continue;
80
+ files.push({
81
+ name,
82
+ path: filePath,
83
+ content,
84
+ sizeBytes: stat.size,
85
+ modifiedAt: stat.mtime,
86
+ });
87
+ totalBytes += stat.size;
88
+ }
89
+ const summary = buildMemorySummary(files);
90
+ return {
91
+ files,
92
+ totalBytes,
93
+ summary,
94
+ };
95
+ }
96
+ /**
97
+ * Memory dosyalarını system prompt'a ek olarak verilebilecek bir string'e dönüştürür.
98
+ */
99
+ function buildMemorySummary(files) {
100
+ if (files.length === 0)
101
+ return "";
102
+ const parts = [
103
+ "## Proje Hafızası",
104
+ "Kullanıcının .aigency/memory/ dizininde tuttuğu notlar:",
105
+ "",
106
+ ];
107
+ for (const file of files) {
108
+ parts.push(`### ${file.name}`);
109
+ parts.push(file.content.trim());
110
+ parts.push("");
111
+ }
112
+ return parts.join("\n");
113
+ }
114
+ /**
115
+ * Tek bir memory dosyası okur — ad uzantısız veya uzantılı olabilir.
116
+ */
117
+ export async function readMemoryFile(name, cwd = process.cwd()) {
118
+ const fileName = name.endsWith(".md") ? name : `${name}.md`;
119
+ const filePath = path.join(getProjectMemoryDir(cwd), fileName);
120
+ try {
121
+ const stat = await fs.stat(filePath);
122
+ if (!stat.isFile())
123
+ return null;
124
+ if (stat.size > MAX_FILE_SIZE)
125
+ return null;
126
+ const content = await fs.readFile(filePath, "utf8");
127
+ return {
128
+ name: fileName,
129
+ path: filePath,
130
+ content,
131
+ sizeBytes: stat.size,
132
+ modifiedAt: stat.mtime,
133
+ };
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ }
139
+ /**
140
+ * Memory dosyası yazar — var olanın üstüne yazar.
141
+ * Kullanıcı bunu gelecekte /remember komutuyla tetikleyecek.
142
+ */
143
+ export async function writeMemoryFile(name, content, cwd = process.cwd()) {
144
+ const fileName = name.endsWith(".md") ? name : `${name}.md`;
145
+ // Yol güvenliği — `../` ve path traversal engeli
146
+ if (fileName.includes("/") || fileName.includes("\\") || fileName.includes("..")) {
147
+ throw new Error("Geçersiz memory dosya adı");
148
+ }
149
+ const memoryDir = getProjectMemoryDir(cwd);
150
+ await fs.mkdir(memoryDir, { recursive: true });
151
+ const filePath = path.join(memoryDir, fileName);
152
+ if (content.length > MAX_FILE_SIZE) {
153
+ throw new Error(`Memory içeriği çok büyük (maks ${MAX_FILE_SIZE} bayt)`);
154
+ }
155
+ await fs.writeFile(filePath, content, "utf8");
156
+ }
157
+ /**
158
+ * Tek bir memory dosyasını siler.
159
+ */
160
+ export async function deleteMemoryFile(name, cwd = process.cwd()) {
161
+ const fileName = name.endsWith(".md") ? name : `${name}.md`;
162
+ if (fileName.includes("/") || fileName.includes("\\") || fileName.includes("..")) {
163
+ throw new Error("Geçersiz memory dosya adı");
164
+ }
165
+ const filePath = path.join(getProjectMemoryDir(cwd), fileName);
166
+ try {
167
+ await fs.unlink(filePath);
168
+ return true;
169
+ }
170
+ catch (err) {
171
+ const code = err?.code;
172
+ if (code === "ENOENT")
173
+ return false;
174
+ throw err;
175
+ }
176
+ }
177
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/agent/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AIGENCY CLI — auth endpoint'leri istemcisi.
3
+ *
4
+ * Sunucu tarafı: pages/api/cli/auth/*
5
+ */
6
+ import { apiRequest } from "./base.js";
7
+ export async function initAuth(params) {
8
+ const res = await apiRequest("/api/cli/auth/init", {
9
+ method: "POST",
10
+ body: params,
11
+ maxRetries: 0,
12
+ });
13
+ return res.data;
14
+ }
15
+ /**
16
+ * Exchange — PKCE verifier ile access + refresh token al.
17
+ * 200 + pending yanıtı ("status": "pending") gelirse polling yapılır.
18
+ */
19
+ export async function exchangeCode(params) {
20
+ const res = await apiRequest("/api/cli/auth/exchange", {
21
+ method: "POST",
22
+ body: params,
23
+ maxRetries: 0,
24
+ });
25
+ return res.data;
26
+ }
27
+ export async function refreshAccessToken(refreshToken) {
28
+ const res = await apiRequest("/api/cli/auth/refresh", {
29
+ method: "POST",
30
+ bearer: refreshToken,
31
+ maxRetries: 0,
32
+ });
33
+ return res.data;
34
+ }
35
+ export async function revokeSession(token, reason) {
36
+ await apiRequest("/api/cli/auth/revoke", {
37
+ method: "POST",
38
+ bearer: token,
39
+ body: reason ? { reason } : undefined,
40
+ maxRetries: 0,
41
+ });
42
+ }
43
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api-client/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAoBvC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAO9B;IACC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAmB,oBAAoB,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAGlC;IACC,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,wBAAwB,EACxB;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,CAAC;KACd,CACF,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAmB,uBAAuB,EAAE;QACtE,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,YAAY;QACpB,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,MAAe;IAEf,MAAM,UAAU,CAAoB,sBAAsB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QACrC,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;AACL,CAAC"}