@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
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"}
|