@takimcizgisi/ajan 0.2.5 → 0.3.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.

Potentially problematic release.


This version of @takimcizgisi/ajan might be problematic. Click here for more details.

Files changed (71) hide show
  1. package/LICENSE +227 -674
  2. package/README.md +243 -305
  3. package/ajan-logo.txt +2 -0
  4. package/dist/config/configManager.js +122 -19
  5. package/dist/config/types.d.ts +37 -0
  6. package/dist/core/agent.d.ts +1 -1
  7. package/dist/core/agent.js +25 -4
  8. package/dist/discord/presence.d.ts +65 -0
  9. package/dist/discord/presence.js +401 -0
  10. package/dist/engine/llama.d.ts +5 -0
  11. package/dist/engine/llama.js +19 -5
  12. package/dist/engine/modelManager.d.ts +0 -1
  13. package/dist/engine/modelManager.js +0 -8
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.js +1 -0
  16. package/dist/service.js +0 -1
  17. package/dist/tools/playground.d.ts +4 -0
  18. package/dist/tools/playground.js +125 -0
  19. package/dist/tools/registry.d.ts +0 -1
  20. package/dist/tools/registry.js +5 -4
  21. package/dist/tools/taskComplete.js +16 -4
  22. package/dist/tools/terminal.js +12 -12
  23. package/dist/utils/paths.d.ts +1 -0
  24. package/dist/utils/paths.js +29 -11
  25. package/package.json +78 -106
  26. package/scripts/build-vscode.mjs +28 -0
  27. package/scripts/ensure-tgz.mjs +27 -0
  28. package/scripts/install-vscode.mjs +236 -0
  29. package/scripts/release.mjs +19 -0
  30. package/scripts/smoke-new-tools.ts +79 -0
  31. package/scripts/smoke-tools.ts +201 -0
  32. package/src/vscode/LICENSE +674 -0
  33. package/src/vscode/README.md +54 -0
  34. package/src/vscode/media/assets/Anton.ttf +0 -0
  35. package/src/vscode/media/chat.js +634 -0
  36. package/src/vscode/media/style.css +767 -0
  37. package/src/vscode/out/extension.js +598 -0
  38. package/src/vscode/package.json +243 -0
  39. package/dist/cli/index.d.ts +0 -2
  40. package/dist/cli/index.js +0 -741
  41. package/dist/cli/tui.d.ts +0 -145
  42. package/dist/cli/tui.js +0 -1003
  43. package/dist/electron/main.d.ts +0 -1
  44. package/dist/electron/main.js +0 -364
  45. package/dist/electron/preload.d.ts +0 -1
  46. package/dist/electron/preload.js +0 -67
  47. package/dist/utils/clipboard.d.ts +0 -2
  48. package/dist/utils/clipboard.js +0 -40
  49. package/dist/utils/lock.d.ts +0 -12
  50. package/dist/utils/lock.js +0 -68
  51. package/dist/utils/sacGuard.d.ts +0 -4
  52. package/dist/utils/sacGuard.js +0 -47
  53. package/dist/utils/spinner.d.ts +0 -10
  54. package/dist/utils/spinner.js +0 -32
  55. package/src/gui/assets/image/logo.svg +0 -1
  56. package/src/gui/assets/image/opencode.svg +0 -18
  57. package/src/gui/css/style.css +0 -430
  58. package/src/gui/html/chat.html +0 -34
  59. package/src/gui/html/downloads.html +0 -11
  60. package/src/gui/html/hakkinda.html +0 -26
  61. package/src/gui/html/index.html +0 -82
  62. package/src/gui/html/projects.html +0 -12
  63. package/src/gui/html/settings.html +0 -4
  64. package/src/gui/js/app.js +0 -197
  65. package/src/gui/js/chat.js +0 -434
  66. package/src/gui/js/downloads.js +0 -172
  67. package/src/gui/js/hakkinda.js +0 -16
  68. package/src/gui/js/projects.js +0 -113
  69. package/src/gui/js/settings.js +0 -177
  70. /package/src/{gui/assets/image → vscode/media/assets}/AJAN_LOGO.svg +0 -0
  71. /package/src/{gui/assets/image → vscode/media/assets}/ajan.png +0 -0
@@ -20,31 +20,124 @@ export const DEFAULT_CONFIG = {
20
20
  contextTrimThreshold: 0.8,
21
21
  maxSteps: 25,
22
22
  beepOnComplete: true,
23
- remoteModelsUrl: "https://raw.githubusercontent.com/takimcizgisi/ajan/main/config/models.json"
23
+ remoteModelsUrl: "https://raw.githubusercontent.com/takimcizgisi/ajan/main/config/models.json",
24
+ discord: {
25
+ enabled: false,
26
+ clientId: "",
27
+ transport: "ipc",
28
+ showToolCalls: true,
29
+ showThinking: false,
30
+ largeImageKey: "ajan-logo",
31
+ largeImageText: "AJAN AI",
32
+ smallImageKeys: {
33
+ idle: "ajan-idle",
34
+ chat: "ajan-chat",
35
+ task: "ajan-task",
36
+ loading: "ajan-loading",
37
+ error: "ajan-error"
38
+ },
39
+ buttons: {
40
+ label: "GitHub",
41
+ url: "https://github.com/TakimCizgisi/AJAN"
42
+ }
43
+ }
24
44
  };
25
45
  export function buildDefaultSystemPrompt(cwd) {
26
46
  return [
47
+ "# KİMLİK",
27
48
  "Sen AJAN AI'sin; TakimCizgisi Yazilim Gelistirme Grubu'nun OTONOM yerel kodlama ajanisin.",
49
+ "Yazılım görevlerini bağımsız PLANLAR, araçlarla GERÇEKTEN uygular, sonucu DOĞRULAR ve raporlarsın.",
50
+ "Kullanıcının kızışıyla değil, verilen görevle yönlenirsin: hedefe ulaşana kadar araçları kullan.",
28
51
  "",
29
- "ÇALIŞMA PROTOKOLÜ (her görev için):",
30
- "1. Görevi parçalara böl; her parçayı ilgili araçla GERÇEKTEN uygula.",
31
- "2. Her araç sonucunu gözlemle; hata varsa düzeltip tekrar dene. Pes etme, tarif etme — UYGULA.",
32
- "3. Araç kullanılacak bir adım kaldıysa asla nihai yanıt yazma; aracı çağır.",
33
- "4. Tüm adımlar bitince ve sonucu doğrulayınca task_complete aracını kısa bir raporla çağır.",
34
- "5. Sohbet/soru ise doğrudan yanıtla (araç gerektirmiyorsa).",
52
+ "# ÇALIŞMA ALANI VE TEST ALANI",
53
+ "İki ayrı alanın var; aralarındaki farkı bil:",
54
+ "1. ANA ÇALIŞMA DİZİNİ (cwd): " + cwd + " — asıl işin burada.",
55
+ " - Kullanıcının proje dosyalarını düzenlerken BURAYI kullan.",
56
+ " - Geri dönüşü olmayan değişikliklerden önce mutlaka oku ve doğrula.",
57
+ "2. TEST ALANI (.ajan): " + join(cwd, ".ajan") + " — kullanıcının VSCode'dan açtığı/istediğinde bomboş hale getirdiğin kum havuzu.",
58
+ " - Bir fikri denemek, kod parçası test etmek, prototip yazmak veya tehlikeli/şüpheli işlem yapmak istersen BURADA yap.",
59
+ " - Bir denemeye başlarken open_playground (istenirse reset=true) ile klasörü hazırla.",
60
+ " - Şüpheli denemeleri (çalıştırıp görmek istediğin komutlar, silme testleri, geçici dosyalar) .ajan'da yap; asıl projeye ancak DOĞRULANDIKTAN sonra uygula.",
61
+ " - Deneme başarılı olduysa sonucu ana çalışma dizinine taşı/yaz; .ajan'ı gereksiz dosyalardan temizle.",
62
+ " - Kullanıcının proje dosyalarına dokunmadan çalışan bir kod göstermen gerekiyorsa .ajan kullan.",
63
+ " - .ajan geçici bir alandır; kalıcı olması gereken söz/ayar gibi bilgileri not_al ile ~/.ajan/notes.json'da sakla.",
35
64
  "",
36
- "KURALLAR:",
37
- "- HER ZAMAN TÜRKÇE YANIT VER. Kullanıcı hangi dilde yazarsa yazsın yanıtların Türkçe olsun. Düşüncelerini de Türkçe yürüt.",
38
- "- Bir aracı gerçekten çalıştırmadan 'yaptım', 'kaydettim', 'tamamlandı' deme.",
39
- "- KRİTİK DÜRÜSTLÜK KURALI: Bir araç sonucu 'HATA' ile başlıyorsa işlem GERÇEKLEŞMEMİŞTİR. Bu durumda asla 'başarıyla oluşturuldu/okundu/tamamlandı' deme; hatayı olduğu gibi kullanıcıya bildir veya sorunu çözüp tekrar dene. Hata gördüğün halde başarı raporu vermek en ciddi hatadır.",
40
- "- Dosya oluşturma/düzenlemede write_file, edit_file veya apply_patch kullan; dosyanın tam içeriğini yanıtta TEKRARLAMA, yalnızca yaptıklarını özetle.",
41
- "- Bilgi eksikse makul varsayım yapıp devam et; kullanıcıya gereksiz soru sorma.",
42
- "- CLI çıktısına uygun yaz: girinti yok, fazla boş satır yok, sıkı düzenli metin.",
43
- "- Bir işlemi tamamladığını iddia etmeden önce doğrula: read_file/list_dir/run_command ile kontrol et; aracın döndürdüğü GERÇEK sonucu bildir.",
44
- "- Küçük değişikliklerde edit_file; tam yeniden yazmada write_file kullan.",
45
- `- Çalışma dizini: ${cwd}. Dosya yollarında göreli yol kullan (örn. src/index.ts).`,
65
+ "# GÖREV PROGRAMI (TODO)",
66
+ "- Görev birden fazla adım içeriyorsa, daha bir şey yapmadan set_todos ile kısa bir TODO listesi kaydet.",
67
+ "- Adımlarını aslında UYGULARKEN listeden güncelle (tamamlananı done=true yap); get_todos ile geri oku.",
68
+ "- Tüm araç adımlarını kendi belirlersin: hangi dosyayı okuyacağını, hangi aracı çağıracağını sen programlıyorsun.",
69
+ "",
70
+ "# MEVCUT ARAÇLAR",
71
+ "DOSYA ARAÇLARI:",
72
+ "- read_file: dosya okuma (offset/limit ile kısmi okuma)",
73
+ "- write_file: dosya yaz/oluştur (append=true ile sona ekler, klasörü otomatik açar)",
74
+ "- edit_file: mevcut dosyada küçük/orta değişiklik",
75
+ "- apply_patch: çoklu/yapısal değişiklikler için satır tabanlı yama",
76
+ "- list_dir: dizin listele (recursive ile alt dizinler)",
77
+ "- search_files: dosya adı glob araması (ör. '**/*.ts')",
78
+ "- grep_files: dosya içeriklerinde regex araması",
79
+ "- move_file / delete_file: dosya taşı / sil",
80
+ "- read_data / unzip_file: veri dosyası oku / arşiv aç",
81
+ "",
82
+ "ÇALIŞTIRMA & KONTROL ARAÇLARI:",
83
+ "- run_command: terminal komutu çalıştır (zaman aşımı var)",
84
+ "",
85
+ "BİLGİ & İLETİŞİM ARAÇLARI:",
86
+ "- web_search / fetch_url: web araması / URL içeriği getir",
87
+ "- not_al / not_oku: kullanıcının kalıcı hafızasına not yaz / oku",
88
+ "",
89
+ "TEST ALANI & GÖREV ARAÇLARI:",
90
+ "- open_playground: açık klasördeki .ajan test klasörünü hazırla (reset=true ile bomboş yapar)",
91
+ "- set_todos / get_todos: görev programını kaydet / oku",
92
+ "",
93
+ "GÖREV:",
94
+ "- task_complete: görev akışını sen yönetirsin — sürdürmek için continue:true, bitirmek için continue:false ile çağır",
95
+ "",
96
+ "# GÖREV YÜRÜTME PROTOKOLÜ",
97
+ "1. Görevi oku, mantıklı parçalara böl, TODO planlayıp set_todos ile kaydet (tek adımlı işlerde plan zorunlu değil), sırayla uygula.",
98
+ "2. Üzerinde çalışacağın dosyayı ÖNCE read_file ile oku; içeriği tahmin ederek değiştirme.",
99
+ "3. Her araç sonucunu gözlemle; hata varsa düzeltip tekrar dene. Pes etme, tarif etme — UYGULA.",
100
+ "4. Kullanılacak bir araç adımı kaldıysa asla nihai yanıt yazma; aracı çağırmaya devam et.",
101
+ "5. Görevin bitmediyse task_complete(continue:true) ile yeni tur iste; bu senin kararınla sürer, sistem seni zorlamaz.",
102
+ "6. Tüm adımlar bitip sonucu DOĞRULAYINCA task_complete(continue:false) (veya sadece task_complete) aracını kısa bir raporla çağırarak akışı BİTİR.",
103
+ " Doğrulama = okunan/listelenen/çalıştırılan sonucun gözlemlenmesi.",
104
+ "7. Sohbet veya soru ise (araç gerekmiyorsa) doğrudan yanıtla.",
105
+ "",
106
+ "# ARAÇ SEÇİMİ",
107
+ "- Küçük değişiklikte edit_file; tam yeniden yazmada write_file; çoklu/yapısal değişiklikte apply_patch kullan.",
108
+ "- Aradığını bilmiyorsan: search_files (isim) veya grep_files (içerik) ile konumlandır, sonra read_file ile incele.",
109
+ "- Dosya yollarında göreli yol kullan (örn. src/index.ts); kullanıcının verdiği yolu olduğu gibi kullan, gerekirse okuyarak doğrula.",
110
+ "- BİR ARACI GERÇEKTEN ÇALIŞTIRMADAN 'yaptım', 'kaydettim', 'tamamlandı' DEME.",
111
+ "",
112
+ "# DÜRÜSTLÜK KURALLARI (KRİTİK)",
113
+ "- Araç sonucu 'HATA' ile başlıyorsa işlem GERÇEKLEŞMEMİŞTİR. Asla 'başarıyla oluşturuldu/okundu/tamamlandı' deme; hatayı kullanıcıya bildir veya sorunu çözüp tekrar dene.",
114
+ "- Hata gördüğün halde başarı raporu vermek en ciddi hatandır.",
115
+ "- İşlemi tamamladığını iddia etmeden önce read_file/list_dir/run_command ile GERÇEK durumu doğrula; aracın döndürdüğü sonucu olduğu gibi yansıt, uydurma içerik raporlama.",
116
+ "- Dosyanın tam içeriğini yanıtında TEKRARLAMA; yalnızca yaptıklarını özetle.",
117
+ "",
118
+ "# GÜVENLİK",
119
+ "- Engellenen komutlar tanımlıysa (blockedCommands) onları asla çalıştırma; gerekirse kullanıcıya teklif sun.",
120
+ "- Geri dönüşü olmayan işlemlerde (delete_file, üzerine yazma, silme içeren komutlar) hedefi emin olmadan uygulama; önce listele/oku.",
46
121
  "- Kullanıcı 'masaüstü', 'belgeler', 'indirilenler' derse gerçek Windows klasörleri (Desktop, Documents, Downloads) kastedilir.",
47
- "- Kullanıcının kalıcı hafızası var: not_al/not_oku araçlarıyla önemli tercihleri saklayıp geri getirebilirsin."
122
+ "- Uzun süren/kilitlenen command çalıştırmalarında timeout ver.",
123
+ "",
124
+ "# AJAN TEST MODE",
125
+ "- Kullanıcı 'AJAN TEST MODE' derse (veya 'TEST MODE', 'test modu' derse) TEST MODU'NA GEÇERSİN.",
126
+ "- TEST MODE'da kullanıcının her söylediğini DOĞRUDAN yap: soru sorma, gereksiz doğrulama bekleme, hemen UYGULA.",
127
+ "- Deneme/test gerektiren her şeyi .ajan test klasöründe yap; gerçek projeye yalnızca kullanıcı açıkça isterse dokun.",
128
+ "- TEST MODE'dayken engelli komutlar (blockedCommands) ve KESİN kullanıcı zararı içerenler dışındaki adımları gecikmeden uygularsın.",
129
+ "- Kullanıcı 'test mode kapalı' / 'normal mod' derse normal kurallarina ve doğrulama disiplinine geri dönersin.",
130
+ "",
131
+ "# YANIT BİÇİMİ",
132
+ "- HER ZAMAN TÜRKÇE YANIT VER. Kullanıcı hangi dilde yazarsa yazsın yanıtların Türkçe olsun; düşüncelerini de Türkçe yürüt.",
133
+ "- VSCode paneline uygun yaz: girinti yok, gereksiz boş satır yok, sıkı ve düzenli metin.",
134
+ "- Bilgi eksikse makul varsayım yapıp devam et; kullanıcıya gereksiz soru sorma.",
135
+ "- Kullanıcının kalıcı hafızası var: not_al/not_oku ile önemli tercihleri saklayıp geri getirebilirsin.",
136
+ "",
137
+ "# ÖNEMLİ NOTLAR",
138
+ "- Kullanıcı 'Durdur' butonu ile görevi durdurabilir; yeni görevle devam edebilirsin.",
139
+ "- Geçmiş büyüdükçe eski turlar otomatik kırpılabilir; bundan etkilenme, görevine kaldığın yerden devam et.",
140
+ "- Verilen iş aralıklı (adım adım) yürür; her araç sonucunu gözlemleyerek rotanı güncelle."
48
141
  ].join("\n");
49
142
  }
50
143
  const bundledModelsPath = join(__dirname, "..", "..", "config", "models.json");
@@ -134,10 +227,20 @@ export function loadConfig(forceReload = false) {
134
227
  // Donmuş/bayat sistem promptu diske asla yazılmaz ve okunmaz;
135
228
  // içinde eski çalışma dizini kalabilir. Her açılışta taze üretilir.
136
229
  delete fileCfg.systemPrompt;
230
+ const fileDiscord = fileCfg.discord;
231
+ const baseDiscord = DEFAULT_CONFIG.discord ?? {};
137
232
  cachedConfig = {
138
233
  ...DEFAULT_CONFIG,
139
234
  ...fileCfg,
140
- session: { ...DEFAULT_CONFIG.session, ...fileCfg.session }
235
+ session: { ...DEFAULT_CONFIG.session, ...fileCfg.session },
236
+ discord: {
237
+ ...baseDiscord,
238
+ ...fileDiscord,
239
+ smallImageKeys: {
240
+ ...(baseDiscord.smallImageKeys ?? {}),
241
+ ...(fileDiscord?.smallImageKeys ?? {})
242
+ }
243
+ }
141
244
  };
142
245
  delete cachedConfig.cwd;
143
246
  cachedConfig.systemPrompt = buildDefaultSystemPrompt(process.cwd());
@@ -25,6 +25,10 @@ export type ModelDefinition = {
25
25
  size?: number;
26
26
  /** Dosya sha256 sağlaması */
27
27
  sha256?: string;
28
+ /** Modelin özel ana system promptu (varsa varsayılan prompt yerine kullanılır) */
29
+ systemPrompt?: string;
30
+ /** Modelin ikincil system promptu (ana prompttan sonra eklenir) */
31
+ secondarySystemPrompt?: string;
28
32
  /** Özel yapılandırma (modele özgü parametreler) */
29
33
  options?: Record<string, unknown>;
30
34
  };
@@ -43,9 +47,40 @@ export type SessionConfig = {
43
47
  repeatPenalty?: number;
44
48
  dryRepeatPenalty?: boolean;
45
49
  };
50
+ export type DiscordConfig = {
51
+ /** Discord Rich Presence etkin mi */
52
+ enabled?: boolean;
53
+ /** Discord Application (Client) ID — Developer Portal'dan alınır */
54
+ clientId?: string;
55
+ /** Bağlantı transport'u: "ipc" (masaüstü socket) veya "websocket" (yerel RPC WS) */
56
+ transport?: "ipc" | "websocket";
57
+ /** Araç çağrılarını etkinlikte göster (örn. "read_file") */
58
+ showToolCalls?: boolean;
59
+ /** Düşünme/metin akışını etkinlikte göster */
60
+ showThinking?: boolean;
61
+ /** Büyük görsel asset anahtarı (Developer Portal > Rich Presence > Art Assets) */
62
+ largeImageKey?: string;
63
+ /** Büyük görsel açıklaması */
64
+ largeImageText?: string;
65
+ /** Duruma göre kullanılacak küçük görsel asset anahtarları */
66
+ smallImageKeys?: {
67
+ idle?: string;
68
+ chat?: string;
69
+ task?: string;
70
+ loading?: string;
71
+ error?: string;
72
+ };
73
+ /** Etkinlikte gösterilecek butonlar (örn. GitHub'a giden) */
74
+ buttons?: {
75
+ label?: string;
76
+ url?: string;
77
+ };
78
+ };
46
79
  export type AjanConfig = {
47
80
  /** Seçili model kimliği */
48
81
  modelId: string;
82
+ /** Discord Rich Presence ayarları */
83
+ discord?: DiscordConfig;
49
84
  /** Sistem promptu */
50
85
  systemPrompt?: string;
51
86
  /** Bağlam boyutu */
@@ -79,6 +114,8 @@ export type ToolHandler<Params = any> = (params: Params, ctx: ToolExecutionConte
79
114
  export type ToolExecutionSignal = {
80
115
  /** task_complete aracı çağrıldığında true olur */
81
116
  taskCompleted?: boolean;
117
+ /** task_complete(continue:true) çağrıldığında model yeni bir tur istemiştir */
118
+ continueRequested?: boolean;
82
119
  };
83
120
  export type ToolExecutionContext = {
84
121
  cwd: string;
@@ -51,7 +51,7 @@ export declare class AjanAgent {
51
51
  modelPath: string;
52
52
  modelId: string;
53
53
  };
54
- /** TUI göstergesi için bağlam doluluk bilgisi */
54
+ /** VSCode durum göstergesi için bağlam doluluk bilgisi */
55
55
  getContextStats(): {
56
56
  usedTokens: number;
57
57
  contextSize: number;
@@ -45,15 +45,30 @@ export class AjanAgent {
45
45
  this.modelPath = options.modelPath ?? resolveModelFilePath(this.model);
46
46
  // Sistem promptu her açılışta güncel çalışma diziniyle taze üretilir;
47
47
  // config.systemPrompt yok sayılır (bayat cwd içermesin diye).
48
+ // Modelin özel system promptu varsa onu kullan, yoksa varsayılanı üret.
49
+ const modelSystemPrompt = this.model.systemPrompt;
50
+ const modelSecondaryPrompt = this.model.secondarySystemPrompt;
51
+ let basePrompt;
52
+ if (modelSystemPrompt) {
53
+ // Model özel system prompta çalışma dizinini ekle
54
+ basePrompt =
55
+ modelSystemPrompt +
56
+ `\n- Çalışma dizini: ${process.cwd()}. Dosya yollarında göreli yol kullan (örn. src/index.ts).\n` +
57
+ `- Deneme/test alanın: ${process.cwd()}/.ajan. Deneme, prototip ve riskli testleri burada yap (open_playground); asıl projeye ancak doğruladıktan sonra uygula.`;
58
+ }
59
+ else {
60
+ basePrompt = buildDefaultSystemPrompt(process.cwd());
61
+ }
48
62
  this.systemPrompt =
49
- (options.systemPrompt ?? buildDefaultSystemPrompt(process.cwd())) +
63
+ basePrompt +
64
+ (modelSecondaryPrompt ? "\n\n" + modelSecondaryPrompt : "") +
50
65
  loadProjectContext(process.cwd());
51
66
  this.tools = options.tools ?? createCoreTools({ cwd: process.cwd(), config });
52
67
  }
53
68
  get engineInfo() {
54
69
  return { modelPath: this.modelPath, modelId: this.model.id };
55
70
  }
56
- /** TUI göstergesi için bağlam doluluk bilgisi */
71
+ /** VSCode durum göstergesi için bağlam doluluk bilgisi */
57
72
  getContextStats() {
58
73
  if (!this.engine)
59
74
  return null;
@@ -131,7 +146,11 @@ export class AjanAgent {
131
146
  signal: activeSignal
132
147
  });
133
148
  };
134
- const continuePrompt = "Devam et. Görevin kalan adımlarını araçlarla tamamla; her şey bitip doğrulanınca task_complete aracını raporla çağır.";
149
+ const continuePrompt = "Devam et. (Bir önceki turda task_complete ile continue:true istedin veya işin yarıda kaldı.) " +
150
+ "Kalan adımları araçlarla tamamla. Görevi sürdürmek istersen yine task_complete(continue:true) çağır; " +
151
+ "her şey bitip doğrulandığında task_complete(continue:false) ile bitir.";
152
+ // Model kendi kararıyla sürdürür/durur: task_complete(continue:true) yeni tur açar,
153
+ // task_complete(continue:false) veya araçsız son yanıt akışı bitirir.
135
154
  let step = 0;
136
155
  let response = "";
137
156
  while (step < maxSteps) {
@@ -147,7 +166,9 @@ export class AjanAgent {
147
166
  }
148
167
  if (signals.taskCompleted)
149
168
  break;
150
- if (toolCallsThisRound === 0)
169
+ const keepGoing = signals.continueRequested === true || toolCallsThisRound > 0;
170
+ signals.continueRequested = false;
171
+ if (!keepGoing)
151
172
  break;
152
173
  }
153
174
  const budgetExhausted = !signals.taskCompleted && step >= maxSteps;
@@ -0,0 +1,65 @@
1
+ import type { DiscordConfig } from "../config/types.js";
2
+ export type PresencePhase = "idle" | "chat" | "thinking" | "loading" | "error";
3
+ /**
4
+ * AJAN etkinliklerini Discord Rich Presence'a (profildeki "Oynuyor" alanı)
5
+ * dönüştürür. Discord masaüstü uygulaması çalışıyorken IPC üzerinden bağlanır.
6
+ *
7
+ * Kullanım: config.json içinde `discord.enabled = true` ve `discord.clientId`
8
+ * ayarlanmalıdır. Client ID, https://discord.com/developers/applications
9
+ * adresinden alınır; görseller Rich Presence > Art Assets sekmesine yüklenir.
10
+ */
11
+ export declare class DiscordPresence {
12
+ private client;
13
+ private config;
14
+ private readonly phaseTime;
15
+ private sessionStartedAt;
16
+ private sessionTitle;
17
+ private currentTool;
18
+ private currentStep;
19
+ private maxSteps;
20
+ private lastError;
21
+ private thinkingText;
22
+ private lastToolCallAt;
23
+ private loadingPercent;
24
+ private partyId;
25
+ private joinSecret;
26
+ private spectateSecret;
27
+ private connected;
28
+ private disposed;
29
+ private reconnectTimer;
30
+ private heartbeat;
31
+ private reconnectAttempt;
32
+ private refreshTimer;
33
+ private lastErrorLogAt;
34
+ private lastErrorLogMsg;
35
+ constructor(config: DiscordConfig);
36
+ get isEnabled(): boolean;
37
+ get isConnected(): boolean;
38
+ /** Discord IPC'ye bağlanır; başarısız olursa sessizce devam eder. */
39
+ connect(): Promise<boolean>;
40
+ disconnect(): Promise<void>;
41
+ /** Bağlantı koptuğunda üstel gecikmeyle yeniden bağlanmayı dener. */
42
+ private reconnect;
43
+ /** Activity'yi Discord ile canlı tutmak için düzenli tazeleme. */
44
+ private startHeartbeat;
45
+ private stopTimers;
46
+ onSessionStart(title: string): void;
47
+ onSessionEnd(): void;
48
+ onThinking(text: string): void;
49
+ onToolCall(name: string): void;
50
+ onToolResult(): void;
51
+ onStepStart(step: number, maxSteps: number): void;
52
+ onComplete(): void;
53
+ onError(message: string): void;
54
+ onModelLoadProgress(pct: number): void;
55
+ onModelLoadComplete(): void;
56
+ onTextChunk(text: string): void;
57
+ private markPhase;
58
+ private buildActivity;
59
+ /** Son durum değişikliğini 250ms'de bir tek sefere birleştirir (fırtına önleyici). */
60
+ private scheduleRefresh;
61
+ /** Aktiviteyi Discord'a gönderir; hata durumunu (tekrarı kısıtlanmış şekilde) yutar. */
62
+ private flushRefresh;
63
+ /** Açık oturum yokken "boşta" durumunu göster. */
64
+ showIdle(): Promise<void>;
65
+ }