@takimcizgisi/ajan 0.2.5

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 (79) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +366 -0
  3. package/config/models.json +54 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +741 -0
  6. package/dist/cli/tui.d.ts +145 -0
  7. package/dist/cli/tui.js +1003 -0
  8. package/dist/config/configManager.d.ts +18 -0
  9. package/dist/config/configManager.js +204 -0
  10. package/dist/config/types.d.ts +98 -0
  11. package/dist/config/types.js +2 -0
  12. package/dist/core/agent.d.ts +88 -0
  13. package/dist/core/agent.js +222 -0
  14. package/dist/electron/main.d.ts +1 -0
  15. package/dist/electron/main.js +364 -0
  16. package/dist/electron/preload.d.ts +1 -0
  17. package/dist/electron/preload.js +67 -0
  18. package/dist/engine/llama.d.ts +39 -0
  19. package/dist/engine/llama.js +146 -0
  20. package/dist/engine/modelManager.d.ts +18 -0
  21. package/dist/engine/modelManager.js +73 -0
  22. package/dist/index.d.ts +9 -0
  23. package/dist/index.js +9 -0
  24. package/dist/service.d.ts +90 -0
  25. package/dist/service.js +268 -0
  26. package/dist/tools/data.d.ts +3 -0
  27. package/dist/tools/data.js +111 -0
  28. package/dist/tools/edit.d.ts +2 -0
  29. package/dist/tools/edit.js +48 -0
  30. package/dist/tools/file.d.ts +6 -0
  31. package/dist/tools/file.js +274 -0
  32. package/dist/tools/filesys.d.ts +3 -0
  33. package/dist/tools/filesys.js +74 -0
  34. package/dist/tools/memory.d.ts +3 -0
  35. package/dist/tools/memory.js +69 -0
  36. package/dist/tools/patch.d.ts +15 -0
  37. package/dist/tools/patch.js +129 -0
  38. package/dist/tools/registry.d.ts +10 -0
  39. package/dist/tools/registry.js +64 -0
  40. package/dist/tools/taskComplete.d.ts +2 -0
  41. package/dist/tools/taskComplete.js +19 -0
  42. package/dist/tools/terminal.d.ts +2 -0
  43. package/dist/tools/terminal.js +130 -0
  44. package/dist/tools/utils.d.ts +7 -0
  45. package/dist/tools/utils.js +63 -0
  46. package/dist/tools/web.d.ts +8 -0
  47. package/dist/tools/web.js +181 -0
  48. package/dist/utils/clipboard.d.ts +2 -0
  49. package/dist/utils/clipboard.js +40 -0
  50. package/dist/utils/lock.d.ts +12 -0
  51. package/dist/utils/lock.js +68 -0
  52. package/dist/utils/paths.d.ts +13 -0
  53. package/dist/utils/paths.js +58 -0
  54. package/dist/utils/projectContext.d.ts +2 -0
  55. package/dist/utils/projectContext.js +24 -0
  56. package/dist/utils/sacGuard.d.ts +4 -0
  57. package/dist/utils/sacGuard.js +47 -0
  58. package/dist/utils/sessions.d.ts +29 -0
  59. package/dist/utils/sessions.js +64 -0
  60. package/dist/utils/spinner.d.ts +10 -0
  61. package/dist/utils/spinner.js +32 -0
  62. package/package.json +106 -0
  63. package/src/gui/assets/image/AJAN_LOGO.svg +1 -0
  64. package/src/gui/assets/image/ajan.png +0 -0
  65. package/src/gui/assets/image/logo.svg +1 -0
  66. package/src/gui/assets/image/opencode.svg +18 -0
  67. package/src/gui/css/style.css +430 -0
  68. package/src/gui/html/chat.html +34 -0
  69. package/src/gui/html/downloads.html +11 -0
  70. package/src/gui/html/hakkinda.html +26 -0
  71. package/src/gui/html/index.html +82 -0
  72. package/src/gui/html/projects.html +12 -0
  73. package/src/gui/html/settings.html +4 -0
  74. package/src/gui/js/app.js +197 -0
  75. package/src/gui/js/chat.js +434 -0
  76. package/src/gui/js/downloads.js +172 -0
  77. package/src/gui/js/hakkinda.js +16 -0
  78. package/src/gui/js/projects.js +113 -0
  79. package/src/gui/js/settings.js +177 -0
@@ -0,0 +1,430 @@
1
+ /* ─── RESET & BASE ─── */
2
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; border-radius: 0 !important; }
3
+ body {
4
+ background: #1a1a1a; color: #f8f9fa;
5
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
6
+ height: 100vh; display: flex; flex-direction: column; overflow: hidden;
7
+ user-select: none;
8
+ }
9
+ a { text-decoration: none; color: inherit; }
10
+
11
+ /* ─── LAYOUT ─── */
12
+ #app { display: flex; flex-direction: row; height: 100vh; width: 100vw; }
13
+
14
+ /* ─── SIDEBAR ─── */
15
+ .sidebar {
16
+ width: 60px; background: #1a1a1a; border-right: 1px solid #ff751f;
17
+ display: flex; flex-direction: column; justify-content: space-between;
18
+ padding: 0; flex-shrink: 0; overflow: hidden; white-space: nowrap;
19
+ transition: width 0.25s cubic-bezier(0.16, 1, 0.3, 1); z-index: 1000;
20
+ }
21
+ .sidebar:hover { width: 220px; }
22
+
23
+ .sidebar-brand {
24
+ height: 50px; display: flex; align-items: center; justify-content: center;
25
+ border-bottom: 1px solid #ff751f; position: relative; width: 100%;
26
+ }
27
+ .brand-small, .brand-large {
28
+ height: 36px; object-fit: contain; position: absolute;
29
+ left: 50%; top: 50%; transform: translate(-50%, -50%);
30
+ transition: opacity 0.15s ease;
31
+ }
32
+ .brand-small { opacity: 1; width: 36px; }
33
+ .brand-large { opacity: 0; width: 100%; padding: 0 12px; }
34
+ .sidebar:hover .brand-small { opacity: 0; pointer-events: none; }
35
+ .sidebar:hover .brand-large { opacity: 1; }
36
+
37
+ .sidebar-menu { display: flex; flex-direction: column; gap: 0; flex: 1; padding-top: 2px; }
38
+ .sidebar-link {
39
+ display: flex; align-items: center; padding: 10px 20px; color: #8e8e93;
40
+ font-size: 0.9rem; transition: all 0.15s ease;
41
+ border-left: 3px solid transparent; cursor: pointer; gap: 14px;
42
+ min-height: 38px;
43
+ }
44
+ .sidebar-text { opacity: 0; transition: opacity 0.15s ease; white-space: nowrap; }
45
+ .sidebar:hover .sidebar-text { opacity: 1; }
46
+ .sidebar-link .icon { width: 1.2rem; height: 1.2rem; flex-shrink: 0; stroke: #ff751f; stroke-width: 2; fill: none; }
47
+ .sidebar-link:hover .icon, .sidebar-link.active .icon { stroke: #ffffff; }
48
+ .sidebar-link:hover { color: #ffffff; background: #222222; border-left-color: #ff751f; }
49
+ .sidebar-link.active { color: #ffffff; background: #252525; border-left-color: #ff751f; font-weight: 600; }
50
+ .sidebar-link-action { color: #ff751f; }
51
+ .sidebar-link-action:hover { color: #ffffff; }
52
+
53
+ .sidebar-divider {
54
+ height: 0; border-top: 1px solid #ff751f; margin: 4px 0;
55
+ }
56
+
57
+ .sidebar-sessions-header {
58
+ padding: 8px 20px 2px; color: #666; font-size: 0.7rem; text-transform: uppercase;
59
+ letter-spacing: 0.5px; white-space: nowrap; margin-top: 4px;
60
+ }
61
+ .sidebar-sessions {
62
+ flex: 1; overflow-y: auto; overflow-x: hidden; margin-top: 2px;
63
+ min-height: 0;
64
+ }
65
+ .sidebar-sessions::-webkit-scrollbar { width: 4px; }
66
+ .sidebar-sessions::-webkit-scrollbar-thumb { background: #333; border-radius: 2px; }
67
+ .sidebar-session-item {
68
+ display: flex; align-items: center; gap: 10px; padding: 7px 20px;
69
+ color: #8e8e93; font-size: 0.85rem; cursor: pointer; white-space: nowrap;
70
+ border-left: 3px solid transparent; transition: all 0.15s ease; min-height: 32px;
71
+ }
72
+ .sidebar-session-item:hover { color: #ffffff; background: #222222; border-left-color: #ff751f; }
73
+ .sidebar-session-item.active { color: #ffffff; background: #252525; border-left-color: #ff751f; }
74
+ .sidebar-session-title-text {
75
+ overflow: hidden; text-overflow: ellipsis; flex: 1;
76
+ }
77
+ .sidebar-sessions-empty {
78
+ padding: 6px 20px; color: #555; font-size: 0.8rem; white-space: nowrap;
79
+ }
80
+
81
+ .sidebar-footer { padding: 0 10px; }
82
+ .sidebar-version {
83
+ font-size: 0.65rem; color: #555; text-align: center; opacity: 0;
84
+ transition: opacity 0.15s ease;
85
+ }
86
+ .sidebar:hover .sidebar-version { opacity: 1; }
87
+
88
+ /* ─── MAIN AREA ─── */
89
+ #main-container {
90
+ flex: 1; height: 100%; display: flex; flex-direction: column;
91
+ background: #1a1a1a; overflow: hidden;
92
+ }
93
+
94
+ /* ─── WINDOW HEADER ─── */
95
+ .window-header {
96
+ height: 50px; width: 100%; background: #1a1a1a; border-bottom: 1px solid #ff751f;
97
+ display: flex; align-items: center; justify-content: space-between; flex-shrink: 0;
98
+ position: relative;
99
+ }
100
+ .header-drag-region {
101
+ position: absolute; inset: 0; -webkit-app-region: drag;
102
+ }
103
+
104
+ /* Header nav icons — solda hizalı */
105
+ .header-nav-icons {
106
+ display: flex; gap: 0; z-index: 10; -webkit-app-region: no-drag;
107
+ padding-left: 4px;
108
+ }
109
+ .header-nav-btn {
110
+ width: 42px; height: 50px; background: transparent;
111
+ border: none; border-bottom: 1px solid transparent;
112
+ color: #8e8e93; cursor: pointer; display: flex; align-items: center;
113
+ justify-content: center; transition: color 0.15s, background 0.15s, border-color 0.15s;
114
+ }
115
+ .header-nav-btn:hover { color: #fff; background: #252525; border-bottom-color: #ff751f; }
116
+ .header-nav-btn.active { color: #ff751f; border-bottom-color: #ff751f; }
117
+ .header-btn-new-chat { color: #ff751f; }
118
+ .header-btn-new-chat:hover { color: #fff; background: #252525; }
119
+
120
+ /* Header controls — sağa hizalı */
121
+ .header-controls {
122
+ display: flex; gap: 0; z-index: 10; -webkit-app-region: no-drag;
123
+ }
124
+ .header-btn {
125
+ width: 46px; height: 50px; background: transparent;
126
+ border: none; border-bottom: 1px solid #ff751f;
127
+ color: #8e8e93; cursor: pointer; display: flex; align-items: center;
128
+ justify-content: center; transition: color 0.15s, background 0.15s;
129
+ }
130
+ .header-btn:hover { background: #252525; color: #fff; }
131
+ .header-btn-close:hover { background: #e81123; color: #fff; }
132
+
133
+ /* Pencere büyüdüğünde maximize butonunu fade out ile gizle */
134
+ body.is-maximized .header-btn-maximize {
135
+ opacity: 0; transform: translateX(20px); pointer-events: none;
136
+ width: 0; overflow: hidden; margin: 0; padding: 0;
137
+ }
138
+ .header-btn-maximize {
139
+ transition: opacity 0.45s ease, transform 0.45s ease, width 0.45s ease, margin 0.45s ease, padding 0.45s ease;
140
+ }
141
+
142
+ /* ─── CONTENT ─── */
143
+ #main-content {
144
+ flex: 1; padding: 25px; display: flex; flex-direction: column;
145
+ overflow: hidden; align-items: center;
146
+ }
147
+
148
+ /* ─── SCROLLBAR ─── */
149
+ ::-webkit-scrollbar { width: 6px; }
150
+ ::-webkit-scrollbar-track { background: transparent; }
151
+ ::-webkit-scrollbar-thumb { background: #444; border-radius: 3px; }
152
+ ::-webkit-scrollbar-thumb:hover { background: #666; }
153
+
154
+ /* ─── CHAT ─── */
155
+ .chat-container {
156
+ width: 100%; max-width: 750px; display: flex; flex-direction: column;
157
+ align-items: center; flex: 1; overflow: hidden;
158
+ }
159
+ .chat-logo {
160
+ height: 65px; width: auto; object-fit: contain;
161
+ filter: drop-shadow(0 0 1px rgba(255, 117, 31, 0.3));
162
+ pointer-events: none; margin-bottom: 16px; flex-shrink: 0;
163
+ }
164
+ .chat-logs {
165
+ width: 100%; flex: 1; overflow-y: auto;
166
+ padding: 0 8px; margin-bottom: 12px;
167
+ }
168
+ .chat-input-wrap { width: 100%; flex-shrink: 0; }
169
+
170
+ /* Boş durumda logo + yazma alanı ortada dursun */
171
+ .chat-container.chat-empty {
172
+ justify-content: center;
173
+ padding-bottom: 8vh;
174
+ }
175
+ .chat-container.chat-empty .chat-logo {
176
+ margin-bottom: 24px;
177
+ }
178
+ .chat-container.chat-empty .chat-logs {
179
+ flex: 0 0 auto;
180
+ display: none;
181
+ }
182
+ .chat-form {
183
+ background: #1a1a1a; border: 1px solid #ff751f; border-radius: 30px;
184
+ display: flex; align-items: center; padding: 8px 14px; height: 54px;
185
+ transition: background 0.2s ease;
186
+ }
187
+ .chat-form:focus-within { background: #222222; }
188
+ .chat-input {
189
+ flex: 1; background: transparent; border: none; outline: none;
190
+ color: #fff; font-size: 0.95rem; font-family: inherit;
191
+ }
192
+ .chat-input::placeholder { color: #666; }
193
+ .chat-send-btn {
194
+ background: #ff751f; color: #1a1a1a; border: none;
195
+ width: 38px; height: 38px; border-radius: 50%; cursor: pointer;
196
+ display: flex; align-items: center; justify-content: center;
197
+ flex-shrink: 0; transition: transform 0.2s, background 0.2s;
198
+ }
199
+ .chat-send-btn:hover { background: #ff8533; transform: scale(1.05); }
200
+ .chat-send-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }
201
+ .chat-send-btn svg { width: 1.1rem; height: 1.1rem; stroke-width: 2.5; }
202
+ .chat-stop-btn {
203
+ background: #b3341f; color: #fff; border: none;
204
+ width: 38px; height: 38px; border-radius: 50%; cursor: pointer;
205
+ display: flex; align-items: center; justify-content: center;
206
+ flex-shrink: 0; margin-left: 8px; transition: transform 0.2s, background 0.2s;
207
+ }
208
+ .chat-stop-btn:hover { background: #d0442c; transform: scale(1.05); }
209
+ .chat-stop-btn svg { width: 1.1rem; height: 1.1rem; }
210
+
211
+ .load-progress-bar {
212
+ display: flex; align-items: center; gap: 10px; width: 100%;
213
+ padding: 6px 12px; margin-bottom: 8px; background: #222; border: 1px solid #333;
214
+ font-size: 0.75rem; color: #ff751f;
215
+ }
216
+ .load-progress-fill {
217
+ height: 4px; background: #ff751f; transition: width 0.2s;
218
+ border-radius: 2px; max-width: 100%;
219
+ }
220
+ .load-progress-bar span { white-space: nowrap; }
221
+
222
+ .model-select-row {
223
+ display: flex; justify-content: flex-end; width: 100%; margin-top: 8px;
224
+ padding: 0 8px; opacity: 0.85;
225
+ }
226
+ .model-select {
227
+ background: transparent; color: #8e8e93; border: none;
228
+ font-size: 0.75rem; cursor: pointer; outline: none;
229
+ padding: 2px 5px; transition: color 0.2s; text-align-last: right;
230
+ }
231
+ .model-select:hover, .model-select:focus { color: #ff751f; }
232
+ .model-select option { background: #1a1a1a; color: #fff; }
233
+
234
+ /* ─── MESSAGES ─── */
235
+ .msg { display: flex; width: 100%; margin-bottom: 12px; }
236
+ .msg-user { justify-content: flex-end; }
237
+ .msg-ai { justify-content: flex-start; }
238
+ .msg-bubble {
239
+ max-width: 80%; padding: 12px 16px; font-size: 0.95rem;
240
+ white-space: pre-wrap; line-height: 1.5;
241
+ }
242
+ .msg-user .msg-bubble {
243
+ background: #222222; border-right: 3px solid #ff751f; color: #f8f9fa;
244
+ }
245
+ .msg-ai .msg-bubble {
246
+ background: #1a1a1a; border-left: 3px solid #00e5ff; color: #f8f9fa;
247
+ }
248
+ .msg-label {
249
+ font-size: 0.7rem; display: block; margin-bottom: 4px;
250
+ letter-spacing: 0.5px; opacity: 0.7;
251
+ }
252
+ .msg-user .msg-label { color: #888; }
253
+ .msg-ai .msg-label { color: #00e5ff; }
254
+
255
+ /* ─── THINKING / TOOL ─── */
256
+ .msg-think { justify-content: center; }
257
+ .msg-think .msg-bubble {
258
+ background: #1a1a1a; border-left: 3px solid #666; color: #888;
259
+ font-size: 0.85rem; font-style: italic;
260
+ }
261
+ .msg-tool { justify-content: center; }
262
+ .msg-tool .msg-bubble {
263
+ background: #1a1a1a; border-left: 3px solid #ff751f; color: #ccc;
264
+ font-size: 0.8rem; font-family: 'Consolas', 'Courier New', monospace;
265
+ max-width: 90%; overflow-x: auto;
266
+ }
267
+ .tool-status { color: #ff751f; font-weight: 600; margin-bottom: 4px; }
268
+ .tool-status.ok { color: #4caf50; }
269
+ .tool-status.err { color: #f44336; }
270
+ .tool-output { opacity: 0.8; max-height: 200px; overflow-y: auto; white-space: pre-wrap; word-break: break-all; }
271
+
272
+ /* ─── TYPING INDICATOR ─── */
273
+ .typing-indicator {
274
+ display: flex; justify-content: flex-start; width: 100%; margin-bottom: 12px;
275
+ }
276
+ .typing-bubble {
277
+ background: #1a1a1a; border-left: 3px solid #666; color: #888;
278
+ padding: 12px 16px; display: flex; align-items: center; gap: 8px;
279
+ }
280
+ .spinner {
281
+ width: 14px; height: 14px; border: 2px solid #555; border-top-color: #ff751f;
282
+ border-radius: 50%; animation: spin 0.8s linear infinite;
283
+ }
284
+ @keyframes spin { to { transform: rotate(360deg); } }
285
+
286
+ /* ─── STEP BAR ─── */
287
+ .step-bar {
288
+ width: 100%; max-width: 750px; margin-bottom: 8px;
289
+ display: flex; align-items: center; gap: 8px; font-size: 0.75rem; color: #666;
290
+ }
291
+ .step-progress {
292
+ flex: 1; height: 3px; background: #333; border-radius: 2px; overflow: hidden;
293
+ }
294
+ .step-fill {
295
+ height: 100%; background: #ff751f; transition: width 0.3s ease;
296
+ }
297
+
298
+ /* ─── SETTINGS ─── */
299
+ .settings-page { width: 100%; max-width: 700px; }
300
+ .settings-title { font-size: 1.3rem; font-weight: 600; color: #ff751f; margin-bottom: 24px; }
301
+ .settings-section { margin-bottom: 24px; }
302
+ .settings-section-title { font-size: 0.85rem; color: #888; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 12px; border-bottom: 1px solid #333; padding-bottom: 6px; }
303
+ .settings-row {
304
+ display: flex; align-items: center; justify-content: space-between;
305
+ padding: 10px 0; border-bottom: 1px solid #252525;
306
+ }
307
+ .settings-row:last-child { border-bottom: none; }
308
+ .settings-label { color: #ccc; font-size: 0.9rem; }
309
+ .settings-hint { color: #666; font-size: 0.75rem; margin-top: 2px; }
310
+ .settings-input {
311
+ background: #1a1a1a; border: 1px solid #444; color: #fff;
312
+ padding: 6px 12px; font-size: 0.9rem; width: 180px; outline: none;
313
+ transition: border-color 0.2s;
314
+ }
315
+ .settings-input:focus { border-color: #ff751f; }
316
+ .settings-select {
317
+ background: #1a1a1a; border: 1px solid #444; color: #fff;
318
+ padding: 6px 12px; font-size: 0.9rem; outline: none; cursor: pointer;
319
+ }
320
+ .settings-btn {
321
+ background: #ff751f; color: #1a1a1a; border: none; padding: 8px 20px;
322
+ font-size: 0.9rem; font-weight: 600; cursor: pointer; transition: background 0.2s;
323
+ }
324
+ .settings-btn:hover { background: #ff8533; }
325
+ .settings-btn:disabled { opacity: 0.5; cursor: not-allowed; }
326
+ .settings-btn-outline {
327
+ background: transparent; color: #ff751f; border: 1px solid #ff751f;
328
+ padding: 6px 16px; font-size: 0.85rem; cursor: pointer; transition: all 0.2s;
329
+ }
330
+ .settings-btn-outline:hover { background: #ff751f; color: #1a1a1a; }
331
+ .settings-btn-danger {
332
+ background: transparent; color: #f44336; border: 1px solid #f44336;
333
+ padding: 6px 16px; font-size: 0.85rem; cursor: pointer; transition: all 0.2s;
334
+ }
335
+ .settings-btn-danger:hover { background: #f44336; color: #fff; }
336
+
337
+ /* ─── DOWNLOADS ─── */
338
+ .downloads-page { width: 100%; max-width: 700px; }
339
+ .downloads-title { font-size: 1.3rem; font-weight: 600; color: #ff751f; margin-bottom: 24px; }
340
+ .model-card {
341
+ background: #1a1a1a; border: 1px solid #333; padding: 16px 20px;
342
+ margin-bottom: 12px; transition: border-color 0.2s;
343
+ }
344
+ .model-card:hover { border-color: #ff751f; }
345
+ .model-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
346
+ .model-card-name { color: #fff; font-size: 1rem; font-weight: 600; }
347
+ .model-card-status { font-size: 0.75rem; padding: 2px 8px; }
348
+ .model-card-status.installed { color: #4caf50; border: 1px solid #4caf50; }
349
+ .model-card-status.missing { color: #888; border: 1px solid #555; }
350
+ .model-card-active { color: #ff751f; border: 1px solid #ff751f; }
351
+ .model-card-desc { color: #888; font-size: 0.85rem; margin-bottom: 8px; }
352
+ .model-card-meta { color: #666; font-size: 0.75rem; display: flex; gap: 16px; }
353
+ .model-card-actions { margin-top: 10px; display: flex; gap: 8px; }
354
+ .model-card-actions button { font-size: 0.8rem; padding: 5px 14px; }
355
+ .model-download-progress { display: flex; align-items: center; gap: 8px; margin-top: 8px; font-size: 0.72rem; color: #ff751f; }
356
+ .model-dl-bar { flex: 1; height: 6px; background: #222; border-radius: 3px; overflow: hidden; }
357
+ .model-dl-bar > div { height: 100%; background: #ff751f; transition: width 0.2s; }
358
+
359
+ /* ─── PROJECTS ─── */
360
+ .projects-page { width: 100%; max-width: 700px; }
361
+ .projects-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; gap: 12px; }
362
+ .projects-actions { display: flex; gap: 8px; }
363
+ .projects-list { width: 100%; }
364
+ .project-card {
365
+ background: #1a1a1a; border: 1px solid #333; padding: 14px 18px;
366
+ margin-bottom: 12px; transition: border-color 0.2s;
367
+ }
368
+ .project-card:hover { border-color: #555; }
369
+ .project-card-active { border-color: #ff751f; }
370
+ .project-card-body { display: flex; align-items: center; gap: 14px; }
371
+ .project-card-icon { font-size: 1.4rem; opacity: 0.8; }
372
+ .project-card-info { flex: 1; min-width: 0; }
373
+ .project-card-name { color: #fff; font-size: 0.95rem; font-weight: 600; margin-bottom: 2px; }
374
+ .project-card-path { color: #666; font-size: 0.78rem; word-break: break-all; }
375
+ .project-card-status {
376
+ font-size: 0.72rem; padding: 2px 8px; color: #888; border: 1px solid #555; white-space: nowrap;
377
+ }
378
+ .project-card-active .project-card-status { color: #ff751f; border-color: #ff751f; }
379
+ .project-card-actions { margin-top: 10px; display: flex; gap: 8px; }
380
+ .project-card-actions button { font-size: 0.8rem; padding: 5px 14px; }
381
+
382
+ /* ─── EMPTY STATE ─── */
383
+ .empty-state {
384
+ display: flex; flex-direction: column; align-items: center;
385
+ justify-content: center; flex: 1; color: #555; gap: 8px;
386
+ }
387
+ .empty-state-icon { font-size: 2rem; opacity: 0.3; }
388
+ .empty-state-text { font-size: 0.9rem; }
389
+
390
+ /* ─── TOAST ─── */
391
+ .toast {
392
+ position: fixed; bottom: 24px; right: 24px; background: #333;
393
+ color: #fff; padding: 10px 20px; font-size: 0.85rem; z-index: 9999;
394
+ opacity: 0; transform: translateY(10px); transition: all 0.3s;
395
+ pointer-events: none;
396
+ }
397
+ .toast.show { opacity: 1; transform: translateY(0); }
398
+ .toast.error { border-left: 3px solid #f44336; }
399
+ .toast.success { border-left: 3px solid #4caf50; }
400
+
401
+ /* ─── ABOUT ─── */
402
+ .about-page { width: 100%; max-width: 560px; }
403
+ .about-card {
404
+ background: #1a1a1a; border: 1px solid #333; padding: 32px 36px;
405
+ display: flex; flex-direction: column; align-items: center; text-align: center;
406
+ }
407
+ .about-logo { height: 72px; width: auto; object-fit: contain; margin-bottom: 12px; }
408
+ .about-title { font-size: 1.5rem; font-weight: 600; color: #ff751f; margin-bottom: 2px; }
409
+ .about-version { font-size: 0.8rem; color: #666; margin-bottom: 16px; }
410
+ .about-desc { color: #bbb; font-size: 0.9rem; line-height: 1.6; margin-bottom: 20px; }
411
+ .about-section { width: 100%; text-align: left; margin-bottom: 20px; }
412
+ .about-section-title {
413
+ font-size: 0.85rem; color: #888; text-transform: uppercase;
414
+ letter-spacing: 1px; margin-bottom: 8px; border-bottom: 1px solid #333; padding-bottom: 6px;
415
+ }
416
+ .about-list { list-style: none; }
417
+ .about-list li {
418
+ color: #ccc; font-size: 0.88rem; padding: 5px 0 5px 18px; position: relative;
419
+ }
420
+ .about-list li::before {
421
+ content: "•"; position: absolute; left: 0; color: #ff751f; font-weight: 700;
422
+ }
423
+ .about-meta { width: 100%; text-align: left; }
424
+ .about-row {
425
+ display: flex; justify-content: space-between; gap: 12px;
426
+ padding: 8px 0; border-bottom: 1px solid #252525; font-size: 0.85rem;
427
+ }
428
+ .about-row:last-child { border-bottom: none; }
429
+ .about-meta-label { color: #888; }
430
+ .about-code { color: #ff751f; font-family: 'Consolas', 'Courier New', monospace; font-size: 0.8rem; }
@@ -0,0 +1,34 @@
1
+ <div class="chat-container">
2
+ <img src="../assets/image/ajan.png" alt="AJAN" class="chat-logo" id="chat-logo">
3
+
4
+ <div class="load-progress-bar" id="load-progress-bar" style="display:none">
5
+ <div class="load-progress-fill" id="load-progress-fill" style="width:0%"></div>
6
+ <span id="load-progress-text"></span>
7
+ </div>
8
+
9
+ <div class="step-bar" id="step-bar" style="display:none">
10
+ <span id="step-text">Adım 0/0</span>
11
+ <div class="step-progress"><div class="step-fill" id="step-fill" style="width:0%"></div></div>
12
+ </div>
13
+
14
+ <div id="chat-logs" class="chat-logs"></div>
15
+
16
+ <div class="chat-input-wrap">
17
+ <div class="chat-form">
18
+ <input type="text" id="chat-input" class="chat-input"
19
+ placeholder="Yapay zekaya talimat verin..." autofocus autocomplete="off">
20
+ <button class="chat-send-btn" id="chat-send-btn">
21
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m22 2-7 20-4-9-9-4z"/><path d="M22 2 11 13"/></svg>
22
+ </button>
23
+ <button class="chat-stop-btn" id="chat-stop-btn" title="Durdur" style="display:none">
24
+ <svg viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="6" width="12" height="12" rx="2"/></svg>
25
+ </button>
26
+ </div>
27
+
28
+ <div class="model-select-row">
29
+ <select id="model-select" class="model-select">
30
+ <option value="" disabled selected>Model yükleniyor...</option>
31
+ </select>
32
+ </div>
33
+ </div>
34
+ </div>
@@ -0,0 +1,11 @@
1
+ <div class="downloads-page">
2
+ <div class="projects-header">
3
+ <span class="settings-title">İndirmeler</span>
4
+ <div class="projects-actions">
5
+ <button class="settings-btn-outline" id="btn-refresh-models">Yenile</button>
6
+ </div>
7
+ </div>
8
+ <div id="models-list">
9
+ <div class="empty-state"><div class="spinner"></div><div class="empty-state-text">Modeller yükleniyor...</div></div>
10
+ </div>
11
+ </div>
@@ -0,0 +1,26 @@
1
+ <div class="about-page">
2
+ <div class="about-card">
3
+ <img src="../assets/image/ajan.png" alt="AJAN" class="about-logo">
4
+ <div class="about-title">AJAN AI</div>
5
+ <div class="about-version" id="about-version">v0.0.0</div>
6
+ <div class="about-desc">
7
+ Otonom yerel kodlama yapay zekâ asistanı. Gemma 4 E2B + node-llama-cpp üzerinde,
8
+ tamamen yerel ve kişisel verilerinizi cihazınızdan çıkarmadan çalışır.
9
+ </div>
10
+ <div class="about-section">
11
+ <div class="about-section-title">Özellikler</div>
12
+ <ul class="about-list">
13
+ <li>Tamamen yerel çalışma (internet gerektirmez)</li>
14
+ <li>Dosya oluşturma / düzenleme araçları</li>
15
+ <li>Terminal komutu çalıştırma</li>
16
+ <li>Proje bağlamı ve kalıcı hafıza</li>
17
+ </ul>
18
+ </div>
19
+ <div class="about-meta">
20
+ <div class="about-row"><span class="about-meta-label">Geliştirici</span><span>TakımÇizgisi Yazılım Geliştirme Grubu</span></div>
21
+ <div class="about-row"><span class="about-meta-label">Lisans</span><span>Apache-2.0</span></div>
22
+ <div class="about-row"><span class="about-meta-label">Depo</span><span class="about-code">github.com/takimcizgisi/ajan</span></div>
23
+ <div class="about-row"><span class="about-meta-label">Motor</span><span class="about-code">node-llama-cpp</span></div>
24
+ </div>
25
+ </div>
26
+ </div>
@@ -0,0 +1,82 @@
1
+ <!DOCTYPE html>
2
+ <html lang="tr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:;">
7
+ <title id="page-title">AJAN AI</title>
8
+ <link rel="stylesheet" href="../css/style.css">
9
+ </head>
10
+ <body>
11
+ <div id="app">
12
+ <aside class="sidebar" id="sidebar">
13
+ <div>
14
+ <div class="sidebar-brand">
15
+ <img src="../assets/image/ajan.png" class="brand-small" alt="A">
16
+ <img src="../assets/image/ajan.png" class="brand-large" alt="AJAN AI">
17
+ </div>
18
+ <nav class="sidebar-menu">
19
+ <a href="#" data-action="new-project" class="sidebar-link sidebar-link-action">
20
+ <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
21
+ <span class="sidebar-text">Yeni Proje</span>
22
+ </a>
23
+ <a href="#" data-page="projects" class="sidebar-link">
24
+ <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
25
+ <span class="sidebar-text">Projeler</span>
26
+ </a>
27
+ <div class="sidebar-divider"></div>
28
+ <div class="sidebar-sessions-header">
29
+ <span class="sidebar-text">Oturumlar</span>
30
+ </div>
31
+ <div class="sidebar-sessions" id="sidebar-sessions"></div>
32
+ </nav>
33
+ </div>
34
+ <div class="sidebar-footer">
35
+ <div class="sidebar-version" id="version-info">v0.2.1</div>
36
+ </div>
37
+ </aside>
38
+
39
+ <main id="main-container">
40
+ <div class="window-header" id="window-header">
41
+ <div class="header-drag-region"></div>
42
+ <div class="header-nav-icons">
43
+ <button class="header-nav-btn header-btn-new-chat" id="header-new-chat" title="Yeni Sohbet">
44
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>
45
+ </button>
46
+ <button class="header-nav-btn" data-page="chat" title="Sohbetler">
47
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m22 2-7 20-4-9-9-4z"/><path d="M22 2 11 13"/></svg>
48
+ </button>
49
+ <button class="header-nav-btn" data-page="downloads" title="İndirmeler">
50
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" x2="3" y1="12" y2="12"/></svg>
51
+ </button>
52
+ <button class="header-nav-btn" data-page="settings" title="Ayarlar">
53
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>
54
+ </button>
55
+ <button class="header-nav-btn" data-page="hakkinda" title="Hakkında">
56
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>
57
+ </button>
58
+ </div>
59
+ <div class="header-controls">
60
+ <button class="header-btn" id="btn-minimize" title="Küçült">
61
+ <svg width="12" height="12" viewBox="0 0 12 12"><rect y="5" width="12" height="1.5" fill="currentColor"/></svg>
62
+ </button>
63
+ <button class="header-btn header-btn-maximize" id="btn-maximize" title="Büyüt">
64
+ <svg width="12" height="12" viewBox="0 0 12 12"><rect x="1" y="1" width="10" height="10" fill="none" stroke="currentColor" stroke-width="1.5"/></svg>
65
+ </button>
66
+ <button class="header-btn header-btn-close" id="btn-close" title="Kapat">
67
+ <svg width="12" height="12" viewBox="0 0 12 12"><line x1="1" y1="1" x2="11" y2="11" stroke="currentColor" stroke-width="1.5"/><line x1="11" y1="1" x2="1" y2="11" stroke="currentColor" stroke-width="1.5"/></svg>
68
+ </button>
69
+ </div>
70
+ </div>
71
+ <div id="main-content"></div>
72
+ </main>
73
+ </div>
74
+
75
+ <script src="../js/app.js"></script>
76
+ <script src="../js/chat.js"></script>
77
+ <script src="../js/downloads.js"></script>
78
+ <script src="../js/projects.js"></script>
79
+ <script src="../js/settings.js"></script>
80
+ <script src="../js/hakkinda.js"></script>
81
+ </body>
82
+ </html>
@@ -0,0 +1,12 @@
1
+ <div class="projects-page">
2
+ <div class="projects-header">
3
+ <span class="settings-title">Projeler</span>
4
+ <div class="projects-actions">
5
+ <button class="settings-btn" id="btn-add-project">+ Yeni Proje</button>
6
+ <button class="settings-btn-outline" id="btn-refresh-projects">Yenile</button>
7
+ </div>
8
+ </div>
9
+ <div id="projects-list" class="projects-list">
10
+ <div class="empty-state"><div class="spinner"></div><div class="empty-state-text">Projeler yükleniyor...</div></div>
11
+ </div>
12
+ </div>
@@ -0,0 +1,4 @@
1
+ <div class="settings-page">
2
+ <div class="settings-title">Ayarlar</div>
3
+ <div class="empty-state"><div class="spinner"></div><div class="empty-state-text">Ayarlar yükleniyor...</div></div>
4
+ </div>