@aigencydev/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -0
- package/dist/agent/chunker.js +59 -0
- package/dist/agent/chunker.js.map +1 -0
- package/dist/agent/history.js +35 -0
- package/dist/agent/history.js.map +1 -0
- package/dist/agent/loop.js +219 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/memory.js +177 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/api-client/auth.js +43 -0
- package/dist/api-client/auth.js.map +1 -0
- package/dist/api-client/base.js +154 -0
- package/dist/api-client/base.js.map +1 -0
- package/dist/api-client/stream.js +123 -0
- package/dist/api-client/stream.js.map +1 -0
- package/dist/api-client/updates.js +31 -0
- package/dist/api-client/updates.js.map +1 -0
- package/dist/api-client/usage.js +15 -0
- package/dist/api-client/usage.js.map +1 -0
- package/dist/auth/oauth.js +178 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/pkce.js +19 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/session.js +48 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/storage.js +142 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/cli.js +161 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/chat.js +76 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/help.js +61 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.js +43 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.js +153 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +30 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/update.js +88 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/usage.js +64 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config/defaults.js +54 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/hooks.js +99 -0
- package/dist/config/hooks.js.map +1 -0
- package/dist/config/paths.js +62 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/settings.js +80 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/security/command-filter.js +121 -0
- package/dist/security/command-filter.js.map +1 -0
- package/dist/security/sandbox.js +182 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/security/sanitize.js +59 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/tools/bash.js +206 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/diff.js +56 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/edit-file.js +165 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/list-files.js +116 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/read-file.js +107 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/registry.js +54 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-files.js +159 -0
- package/dist/tools/search-files.js.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/write-file.js +141 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/App.js +264 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/InputBar.js +22 -0
- package/dist/ui/InputBar.js.map +1 -0
- package/dist/ui/MessageList.js +82 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/ModeIndicator.js +23 -0
- package/dist/ui/ModeIndicator.js.map +1 -0
- package/dist/ui/PermissionPrompt.js +61 -0
- package/dist/ui/PermissionPrompt.js.map +1 -0
- package/dist/ui/StatusBar.js +39 -0
- package/dist/ui/StatusBar.js.map +1 -0
- package/dist/ui/theme.js +42 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/utils/abort.js +61 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/errors.js +63 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.js +102 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,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":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,QAAQ,EACR,YAAY,GAEb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAA2C;QACnD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC;IACF,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACrC,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,mCAAmC;YACnC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAwB,EAAE;IAC9D,GAAG,CAAC,IAAI,CAAC,GAAG,gBAAgB,KAAK,WAAW,4BAA4B,CAAC,CAAC;IAC1E,GAAG,CAAC,OAAO,EAAE,CAAC;IAEd,uBAAuB;IACvB,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IAEpC,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC5C,GAAG,CAAC,KAAK,CAAC,2CAA2C,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC;YAC1B,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,aAAa,EAAE;YAC5B,SAAS,EAAE,OAAO,CAAC,QAAQ;YAC3B,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,QAAQ,EAAE,MAAM,CAAC,IAAI;YACrB,cAAc,EAAE,aAAa;SAC9B,CAAC,CAAC;QAEH,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;QAE/B,mBAAmB;QACnB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YACnD,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC1E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,GAAG,CAAC,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,oBAAoB;QACpB,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;QAC7C,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAEjD,iCAAiC;QACjC,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC;QACF,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;QACvC,YAAY,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE/D,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,SAAS,CAAC,6BAA6B,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,SAAS,CACjB,wCAAwC,EACxC,6CAA6C,CAC9C,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC;YACnC,KAAK,EAAE,WAAW;YAClB,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;QAEH,IAAI,QAAQ,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5D,MAAM,IAAI,SAAS,CACjB,2BAA2B,EAC3B,qCAAqC,CACtC,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG,SAA6B,CAAC;QACvD,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC;QAE3E,0BAA0B;QAC1B,MAAM,WAAW,CAAC;YAChB,YAAY;YACZ,aAAa;YACb,UAAU;YACV,IAAI;YACJ,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC;QAEH,wCAAwC;QACxC,MAAM,iBAAiB,CAAC;YACtB,IAAI;YACJ,WAAW,EAAE,aAAa,EAAE;YAC5B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QAEH,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,GAAG,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,QAAQ,CAAE,GAAa,CAAC,OAAO,IAAI,iBAAiB,EAAE;YAC9D,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|