@ryuu-reinzz/ryuu-cli 0.0.0-stage → 0.3.1

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 (59) hide show
  1. package/CHANGELOG.md +560 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1213 -2
  4. package/package.json +45 -4
  5. package/src/agent/agent.js +1194 -0
  6. package/src/agent/approvals.js +76 -0
  7. package/src/agent/context.js +106 -0
  8. package/src/agent/planner.js +237 -0
  9. package/src/agent/worklog.js +318 -0
  10. package/src/cli/app.js +463 -0
  11. package/src/cli/commands.js +1150 -0
  12. package/src/cli/input.js +287 -0
  13. package/src/cli/markdown.js +527 -0
  14. package/src/cli/prompts.js +255 -0
  15. package/src/cli/renderer.js +2155 -0
  16. package/src/cli/settings-editor.js +280 -0
  17. package/src/cli/settings-tui.js +669 -0
  18. package/src/cli/tui.js +1737 -0
  19. package/src/cli/width.js +48 -0
  20. package/src/config/load.js +132 -0
  21. package/src/config/scaffold.js +50 -0
  22. package/src/config/settings-registry.js +495 -0
  23. package/src/config/settings.js +304 -0
  24. package/src/config/validate.js +451 -0
  25. package/src/index.js +449 -0
  26. package/src/providers/catalog.js +282 -0
  27. package/src/providers/index.js +84 -0
  28. package/src/providers/nvidia.js +645 -0
  29. package/src/providers/registry.js +104 -0
  30. package/src/services/clipboard.js +38 -0
  31. package/src/services/diff.js +153 -0
  32. package/src/services/doctor.js +126 -0
  33. package/src/services/logger.js +190 -0
  34. package/src/services/preferences.js +249 -0
  35. package/src/services/processes.js +345 -0
  36. package/src/services/provider-settings.js +226 -0
  37. package/src/services/sessions.js +279 -0
  38. package/src/services/undo.js +133 -0
  39. package/src/services/ushell.js +146 -0
  40. package/src/services/websearch/manager.js +616 -0
  41. package/src/services/websearch/mcp.js +233 -0
  42. package/src/services/websearch/normalize.js +284 -0
  43. package/src/services/websearch/providers.js +178 -0
  44. package/src/services/websearch/serper.js +263 -0
  45. package/src/services/workspace.js +589 -0
  46. package/src/tools/filesystem.js +304 -0
  47. package/src/tools/git.js +114 -0
  48. package/src/tools/index.js +48 -0
  49. package/src/tools/project.js +160 -0
  50. package/src/tools/registry.js +118 -0
  51. package/src/tools/search.js +210 -0
  52. package/src/tools/shell.js +279 -0
  53. package/src/tools/url.js +542 -0
  54. package/src/tools/web.js +67 -0
  55. package/src/utils/errors.js +160 -0
  56. package/src/utils/network.js +129 -0
  57. package/src/utils/redaction.js +73 -0
  58. package/src/utils/validation.js +370 -0
  59. package/src/utils/version.js +24 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,560 @@
1
+ # Changelog
2
+
3
+ Semua perubahan penting pada Ryuu Agent CLI didokumentasikan di sini.
4
+ Project ini mengikuti [Semantic Versioning](https://semver.org/).
5
+
6
+ ## [0.3.1] - 2026-10-29
7
+
8
+ ### Ditambahkan
9
+
10
+ - **Kelola provider dan model langsung dari sesi.** `/provider user <name>`
11
+ berpindah provider, `/provider add <name> <url> [apiKey]` mendaftarkan provider
12
+ OpenAI-compatible baru, `/provider del <name>` menghapusnya, dan
13
+ `/addmodel <provider> <model-id>` / `/delmodel <provider> <model-id>` mengatur
14
+ daftar model per provider. Provider baru masuk `extraProviders` di
15
+ `config.json` dan kuncinya ke `providers.<id>.apiKey`; model pertama menjadi
16
+ default. Provider baru boleh dibuat tanpa model. Provider bawaan dan provider
17
+ yang sedang aktif tidak bisa dihapus. Kunci tetap tidak pernah dicetak.
18
+ - **`config.json` dibuat otomatis pada run pertama.** Bila file pengaturan belum
19
+ ada, `ensureSettingsFile` menulis scaffold-nya secara atomik dengan izin
20
+ `0600`: `version`, `provider`, `providers.<id>.apiKey`/`baseURL`,
21
+ `providerModel.<id>`, `extraProviders`, `agent.*`, dan `webSearch.*`, semuanya
22
+ bernilai kosong. Nilai kosong diperlakukan sebagai "pakai bawaan", jadi file
23
+ baru tidak mengubah perilaku; file yang sudah ada atau JSON yang rusak tidak
24
+ pernah ditimpa. `--settings` memakai scaffold yang sama saat membuat file.
25
+
26
+ ### Dihapus
27
+
28
+ - **File `.env` dan seluruh variabel environment tidak lagi dibaca.** Satu-satunya
29
+ sumber konfigurasi kini `config.json` (`ryuu --settings`): kredensial
30
+ (`providers.<id>.apiKey`), base URL (`providers.<id>.baseURL`), model
31
+ (`providerModel.<id>`), batas agent (`agent.*`), pencarian web (`webSearch.*`),
32
+ dan provider tambahan (`extraProviders`). `.env.example` ikut dihapus dari repo
33
+ dan dari daftar file paket. Presedensi: flag CLI > `.ryuu/preferences.json`
34
+ workspace > `config.json` > bawaan katalog; hanya `RYUU_CONFIG_DIR` yang masih
35
+ dibaca untuk menentukan letak `config.json`. Pesan galat, petunjuk pemulihan,
36
+ dan `/web providers` sekarang menyebut path kunci di `config.json`, bukan nama
37
+ variabel yang tidak lagi berpengaruh.
38
+
39
+ ### Diubah
40
+
41
+ - **Model bawaan provider `nvidia` kini `minimaxai/minimax-m3.1-flash`.** Model
42
+ itu masuk katalog sebagai entri ke-6, jadi `/model 6` memilihnya dan startup
43
+ tanpa `--model` memakainya. Lima model sebelumnya
44
+ (`nvidia/nemotron-3.5-super-vl-120b-a12b`, `z-ai/glm-5.3-flash`,
45
+ `google/diffusiongemma-26b-a4b-it`, `poolside/laguna-xs-2.1`,
46
+ `stepfun-ai/step-5-preview`) tetap ada dan nomornya tidak bergeser.
47
+
48
+ ## [0.3.0] - 2026-10-29
49
+
50
+ ### Ditambahkan
51
+
52
+ - **Pengaturan global `ryuu --settings` dan `ryuu --settings --tui`.** Nilai
53
+ pengguna kini tinggal di satu file milik pengguna — Linux/BSD
54
+ `$XDG_CONFIG_HOME/ryuu/config.json` (bawaan `~/.config/ryuu/config.json`),
55
+ macOS `~/Library/Application Support/ryuu/config.json`, Windows
56
+ `%APPDATA%\ryuu\config.json` — dan bisa dialihkan dengan `RYUU_CONFIG_DIR`,
57
+ sehingga terbaca dari direktori kerja mana pun. `--settings` membuka editor
58
+ baris bernomor (`<nomor> <nilai>`, `/list`, `/show`, `/reset`, `/help`,
59
+ `/exit`); `--settings --tui` membuka layar penuh dengan panel deskripsi,
60
+ navigasi panah, pengubahan pilihan provider/model, serta simpan/batal; dan
61
+ `--settings --list` mencetak daftar tanpa masuk mode edit. Setiap perubahan
62
+ tervalidasi lalu langsung disimpan secara atomik (fsync + rename) dengan izin
63
+ `0600`; satu kunci tidak pernah menghapus kunci lain, API key selalu
64
+ disamarkan, dan JSON yang rusak dilaporkan tanpa pernah ditimpa. Presedensi:
65
+ flag CLI > environment/`.env` > `.ryuu/preferences.json` workspace > file
66
+ pengaturan global > bawaan katalog. Kredensial provider, base URL, model,
67
+ batas agent, dan kunci web search semuanya bisa diatur dari sini; provider
68
+ tambahan dari `RYUU_PROVIDERS` otomatis mendapat barisnya sendiri. Mode
69
+ pengaturan tidak pernah membangun agent, tool, atau permintaan model.
70
+ - **Tombol `⧉ copy` pada blok kode.** Code fence di jawaban kini membawa chip
71
+ `⧉ copy` di header-nya, dan seluruh blok menjadi area klik: mengekliknya
72
+ menyalin isi kode (tanpa penanda fence) ke clipboard terminal lewat OSC 52,
73
+ sama seperti blok prompt. Berlaku di kedua antarmuka — `--tui` lewat peta klik
74
+ per-baris, antarmuka baris lewat `Renderer.copies` — dengan teks yang disalin
75
+ dibatasi 100k karakter seperti payload OSC 52.
76
+
77
+ ### Diubah
78
+
79
+ - **Prompt internal dirapikan dan dioptimalkan untuk waktu.** `buildSystemPrompt`
80
+ kini menaruh aturan efisiensi dan pemulihan di bagian tersendiri: jangan
81
+ menganalisis ulang fakta dari worklog/tool result, berpikir sekali lalu
82
+ bertindak, dan — terutama — **heartbeat** (reconnect, giliran kosong,
83
+ argumen yang diperbaiki/dipotong) diperlakukan sebagai transport, bukan reset
84
+ tugas: lanjutkan aksi yang terputus tanpa mengulang read/search/command yang
85
+ sudah berhasil. Nudge giliran kosong dan peringatan anggaran 70% ikut
86
+ menegaskan hal yang sama.
87
+ - **Notifikasi heartbeat kini biru langit tebal.** Pesan heartbeat pada UI baris
88
+ dan `--tui` (reconnect, giliran kosong, argumen diperbaiki, tautan pulih)
89
+ dicetak dengan warna biru langit (`#38bdf8`) dan tebal, menggantikan kuning/
90
+ hijau, agar terbaca sebagai kabar transport, bukan galat.
91
+
92
+ ## [0.2.1] - 2026-10-25
93
+
94
+ ### Ditambahkan
95
+
96
+ - **Dukungan multi-provider AI dengan registry dinamis.** Provider dan model kini
97
+ dideklarasikan di `src/providers/catalog.js` (`nvidia` dan `tokenharbor` bawaan,
98
+ plus entri `RYUU_PROVIDERS` dari `.env`), sehingga agent core tidak menyebut
99
+ provider mana pun. `ProviderRegistry` (`src/providers/registry.js`) membuat
100
+ instance per provider dari satu factory, dan `src/providers/index.js` meresolusi
101
+ pilihan, memvalidasi id/kunci/model, serta menyediakan `updateSelection()` untuk
102
+ berpindah provider tanpa membangun ulang agent.
103
+ - **Provider Token Harbor** (`tokenharbor`) dengan model bawaan
104
+ `deepseek-v4.1-flash:free` (DeepSeek V4.1 Flash Free), base URL
105
+ `https://tokenharbor.ai/v1`, kunci `TOKENHARBOR_API_KEY`, dan override
106
+ `TOKENHARBOR_BASE_URL` / `TOKENHARBOR_MODEL`. Protokolnya Chat Completions yang
107
+ kompatibel OpenAI, jadi klien SDK yang sama dipakai ulang; streaming, tool
108
+ calling, reasoning yang dikirim provider, serta pemetaan galat HTTP tetap sama.
109
+ - **Pemilihan provider dan model.** Flag `--provider <id>`, variabel
110
+ `RYUU_PROVIDER`/`RYUU_MODEL`, dan slash command `/provider [id]` (daftar status
111
+ kunci tanpa membocorkan nilainya). `/model`, `/addmodel`, dan `/delmodel` kini
112
+ bekerja per provider dan disimpan per provider di `.ryuu/preferences.json`;
113
+ berpindah provider mempertahankan riwayat percakapan dan worklog.
114
+ - **Kapabilitas per provider** (`streaming`, `tools`, `reasoning`, `multimodal`)
115
+ menggantikan asumsi bahwa semua endpoint identik. Agent hanya mengirim tools
116
+ atau meminta stream bila provider mengumumkannya, dan menampilkan keterbatasan
117
+ yang diumumkan di banner. Tidak ada fallback otomatis ke provider AI lain.
118
+ - **Validasi sebelum request**: provider harus dikenal, kuncinya harus ada (tidak
119
+ pernah memakai kunci kosong/hardcoded), dan id model harus valid. Model yang
120
+ tidak ada di daftar tetap diizinkan dengan peringatan, karena daftar itu adalah
121
+ id yang ditawarkan CLI, bukan jaminan ketersediaan di server.
122
+ - Uji offline untuk katalog, pemilihan provider/model, request Token Harbor
123
+ (base URL, model, header otorisasi, streaming, tool call), kunci yang hilang,
124
+ galat HTTP/timeout, preferensi per provider, dan redaksi kunci.
125
+
126
+ ### Diubah
127
+
128
+ - Pesan galat provider tidak lagi menyebut NVIDIA secara hard-coded: nama provider
129
+ dan variabel kunci yang benar dipakai, sehingga `401`/`403`/`404`/`429`/`5xx`
130
+ untuk Token Harbor menunjuk `TOKENHARBOR_API_KEY` dan model yang dipilih.
131
+ - `.env.example` dan README mendokumentasikan Token Harbor, `RYUU_PROVIDER`,
132
+ `RYUU_MODEL`, `RYUU_PROVIDERS`, kapabilitas per provider, dan batasan kuota
133
+ (tidak ada klaim gratis tanpa batas).
134
+
135
+ ## [0.2.0] - 2026-10-25
136
+
137
+ ### Ditambahkan
138
+
139
+ - **Pembaruan visual menyeluruh UI layar penuh.** Setiap blok kini dibuka dengan
140
+ header kecil (`▸ TASK`, `◆ response`, `⚙ Using tools`, `◈ reasoning`, `◆ PLAN`)
141
+ dan blok dipisahkan baris kosong plus **garis gradien pink → violet → biru
142
+ langit**. Tool call berurutan berbagi satu blok, satu header
143
+ `⚙ Using tools · N calls` dan tanpa pembatas di antaranya. Setiap jenis baris
144
+ punya warnanya sendiri alih-alih satu abu-abu redup: prosa assistant berwarna
145
+ putih, Markdown (heading, penanda daftar, inline code, link, code fence) dan
146
+ tabel berwarna biru langit, nama tool kuning, teks reasoning hijau dengan baris
147
+ status putih, tool yang gagal berupa nama merah tebal di atas output merah
148
+ redup, header command dan baris `$` berwarna biru langit, serta galat runtime
149
+ berwarna merah. Layar pembuka adalah frame yang sama dengan antarmuka baris —
150
+ wordmark ASCII berbingkai, tagline, dan blok telemetri (model, workspace,
151
+ runtime, access, log) dengan versinya — dan composer adalah `ryuu > ` dengan
152
+ `ryuu` pada gradien pink → blue, teks input kelabu, baris pertanyaan di atasnya,
153
+ serta word wrap lunak, sehingga tugas panjang tidak pernah terpotong. Status bar
154
+ mewarnai setiap segmen secara terpisah (fase, langkah, tool, token, gulir).
155
+ Setiap baris membungkus sesuai lebar terminal, termasuk telemetri banner, output
156
+ command, diff, dan pemberitahuan; palet naik ke truecolor ketika terminal
157
+ melaporkannya.
158
+
159
+ - **Menyalin prompt yang sudah Anda kirim.** Melipat jawaban 200 baris itu mudah,
160
+ tetapi menyalin tugas yang menghasilkannya tidak: memilih output berwarna dan
161
+ berbungkus dengan mouse rawan galat. Setiap blok prompt kini membawa chip
162
+ `⧉ copy` (mengklik bloknya menyalinnya), `Ctrl+Y` menyalin prompt terakhir dan
163
+ `/copy [n]` menyalin yang lebih lama di kedua antarmuka. Teksnya masuk ke
164
+ clipboard terminal dengan **OSC 52** (`src/services/clipboard.js`): tanpa proses
165
+ anak `pbcopy`/`xclip`/`clip.exe`, bekerja lewat SSH, dibatasi 100k karakter, dan
166
+ status bar melaporkan jumlahnya (`⧉ copied prompt #4 · 42 chars`). Terminal yang
167
+ mengabaikan OSC 52 membiarkan clipboard tidak tersentuh; sesi tidak pernah rusak.
168
+ Antarmuka baris menyimpan 25 prompt terakhir agar `/copy` juga bekerja di sana.
169
+
170
+ - **Satu versi, dibaca dari `package.json`.** `src/utils/version.js` kini menjadi
171
+ satu-satunya sumber string versi: banner, `--version`, header TUI, dan handshake
172
+ klien MCP semuanya meresolusinya saat runtime, sehingga sebuah rilis hanya
173
+ menyunting `package.json`. Literal bawaan `0.1.0` di `createApp` dan `Tui` sudah
174
+ dihapus.
175
+
176
+ - **UI layar penuh opsional (`--tui`).** Antarmuka bertipe retained-mode yang
177
+ menyimpan percakapan sebagai data (id stabil, tanda terbuka/tertutup per blok,
178
+ teks lengkap) dan menggambar ulang sebuah frame darinya, alih-alih menambahkan
179
+ baris ke scrollback dan melupakannya. Setiap reasoning, output `run_command`, dan
180
+ jawaban (dan kini blok shell) bisa dibuka secara independen, beberapa sekaligus,
181
+ dan blok lama tetap bisa dibuka sepanjang sesi; transkrip menggul di dalam
182
+ aplikasi (`PgUp`/`PgDn`, roda, klik untuk melipat) dan composer digambar dalam
183
+ frame yang sama. Tanpa `--tui` antarmuka sebelumnya dipakai tanpa perubahan;
184
+ flag diabaikan dengan peringatan ketika tidak ada TTY atau saat `--plain`. File
185
+ baru `src/cli/tui.js`.
186
+
187
+ - **`/bash <command>` dan `!command`.** Menjalankan sendiri command shell, di
188
+ workspace, tanpa melibatkan model: tanpa prompt persetujuan (Anda yang
189
+ mengetiknya), tetapi `--read-only` tetap menolaknya. Output dicetak lengkap
190
+ alih-alih pratinjau 5 baris, tangkapannya dibatasi (ekor disimpan, ditandai
191
+ terpotong), dan command, exit code, durasi, serta output dicatat sebagai giliran
192
+ pengguna dalam percakapan sesi dan worklog, sehingga model tugas berikutnya
193
+ sudah tahu apa yang dijalankan. `Ctrl+C` membatalkannya dengan menyinyalkan
194
+ seluruh grup proses, sehingga anak-anak dari pembungkus `sh -c` tidak selamat.
195
+ Variabel environment yang tampak seperti kredensial dibuang dari proses anak
196
+ (`sanitizedEnv`). `src/services/ushell.js` dan `Agent.recordUserShell()` baru.
197
+ - **Pencarian web multi-provider MCP dengan fallback otomatis.** `web_search` kini
198
+ adalah satu tool yang didukung `WebSearchManager`, yang terhubung secara malas ke
199
+ You.com (profil gratis tanpa kunci), Firecrawl (tingkat tanpa kunci), server stdio
200
+ DuckDuckGo lokal opsional, Tavily (butuh kunci API), dan backend REST Serper yang
201
+ sudah ada. Provider dicoba menurut urutan yang bisa dikonfigurasi; timeout,
202
+ galat DNS/jaringan, HTTP 401/403/429/5xx, kegagalan handshake/penemuan, tool yang
203
+ hilang, ketidaksesuaian skema, dan payload tidak valid semuanya pindah ke provider
204
+ berikutnya. Retry dibatasi (hanya kegagalan pemanggilan sesaat, backoff
205
+ eksponensial dengan jitter), `429` langsung diteruskan, dan dua kegagalan
206
+ berturut-turut membuka circuit breaker 60 detik. Penemuan tool memetakan tool
207
+ ke pencarian/ekstraksi menurut nama, deskripsi, dan skema input, dan semua hasil
208
+ dinormalkan (URL hanya http(s), dedupe menurut URL kanonik, judul/snippet/teks
209
+ terbatas, atribusi provider). Jika semua provider gagal, agent menerima satu galat
210
+ bertipe dan melanjutkan tanpa mengarang hasil. Terminal mencetak satu pohon
211
+ ringkas dengan status dan durasi tiap provider; kunci dan header tidak pernah
212
+ dicatat. `read_url` kini jatuh kembali ke provider MCP berkemampuan ekstraksi
213
+ saat pengambilan lokal gagal atau tidak mengekstrak teks. Konfigurasinya memakai
214
+ `WEB_SEARCH_ENABLED`, `WEB_SEARCH_FALLBACK`, `WEB_SEARCH_PROVIDERS`,
215
+ `WEB_SEARCH_DISABLED`, `WEB_MCP_TIMEOUT_MS`, `WEB_MCP_MAX_RETRIES`, `YDC_API_KEY`,
216
+ `FIRECRAWL_API_KEY`, `TAVILY_API_KEY`, dan `DUCKDUCKGO_MCP_ENABLED`; periksa
217
+ dengan `/web status|providers|test|enable|disable`. Pencarian You.com, pencarian
218
+ Firecrawl, dan ekstraksi Firecrawl sudah diverifikasi terhadap server MCP live;
219
+ Tavily tidak bisa diverifikasi tanpa kunci, dan server stdio DuckDuckGo opsional
220
+ tidak dijalankan karena `uvx` tidak terpasang.
221
+
222
+ - **Tool `read_url`.** Mengambil satu URL http(s) publik dan mengembalikan teks
223
+ hasil ekstraksi, judul, serta meta deskripsinya, sehingga model bisa
224
+ memverifikasi snippet pencarian terhadap halaman sumbernya alih-alih
225
+ memercayainya. Ia selalu terdaftar (tanpa kunci), read-only, dan bebas
226
+ persetujuan, mengikuti maksimal 5 redirect sambil memeriksa ulang setiap hop
227
+ (https→http ditolak), menolak URL dengan kredensial tertanam, hanya membaca jenis
228
+ konten tekstual, membatasi badan hingga 2 MB dan teks hingga 1.000–50.000
229
+ karakter (bawaan 20.000), serta memetakan kegagalan ke `READ_URL_INVALID`,
230
+ `READ_URL_REDIRECT`, `READ_URL_AUTH`, `READ_URL_NOT_FOUND`,
231
+ `READ_URL_RATE_LIMIT`, `READ_URL_UPSTREAM`, `READ_URL_TIMEOUT`,
232
+ `READ_URL_NETWORK`, `READ_URL_UNSUPPORTED`, dan `READ_URL_FAILED`. Alamat lokal,
233
+ privat, link-local, CGNAT, dan metadata cloud ditolak dengan `READ_URL_BLOCKED`
234
+ (nama, literal IP, dan pemeriksaan DNS pra-fetch, diperiksa ulang pada setiap
235
+ redirect); DNS rebinding dikendalikan tetapi tidak dihilangkan sepenuhnya.
236
+ Halaman yang dirender JavaScript mengembalikan tanpa teks alih-alih gagal. System
237
+ prompt memperlakukan teks halaman yang diambil sebagai data tak terpercaya dan
238
+ mencatat setiap pengambilan ke worklog. `web_search` kini menunjuk ke tool ini
239
+ saat sebuah snippet perlu dikonfirmasi.
240
+
241
+ - **Tool `web_search`.** Hasil Google dari SERP API Serper-kompatibel, dimodelkan
242
+ dari pencarian web Freebuff: `title`/`url`/`snippet` plus kotak jawaban, "people
243
+ also ask", dan pencarian terkait, dengan `depth: \"standard\" | \"deep\"`. Ia
244
+ opt-in (`SEARCH_API_KEY`), tidak pernah terdaftar tanpa kunci, men-cache kueri
245
+ identik per sesi, mencatat setiap pencarian ke worklog, dan memetakan kegagalan
246
+ ke `SEARCH_AUTH`, `SEARCH_RATE_LIMIT`, `SEARCH_UPSTREAM`, `SEARCH_TIMEOUT`,
247
+ `SEARCH_NETWORK`, `SEARCH_BAD_RESPONSE` alih-alih mengembalikan hasil kosong.
248
+ System prompt kini mewajibkan mengutip URL sumber dan menandai apa pun yang tidak
249
+ dibuktikan snippet sebagai belum terverifikasi.
250
+
251
+ - **Session worklog.** Fakta terverifikasi — file yang dibaca beserta rentang
252
+ barisnya, file yang diubah, command dengan exit code, temuan, rencana, dan tugas
253
+ lebih awal — disimpan sepanjang sesi dan diteruskan ke tugas berikutnya dalam satu
254
+ pesan `TASK BRIEF`. Tindak lanjut (`lanjutkan`, `continue`, `sudah?`) kini
255
+ melanjutkan pekerjaan alih-alih memulai ulang analisis. Periksa dengan
256
+ `/worklog`; ia disimpan bersama sesi dan dipulihkan oleh `/resume`.
257
+ - **Pembacaan berulang diblokir.** `read_file` pada path yang sudah ada di
258
+ worklog dan punya mtime sama mengembalikan balasan `cached: true` (ditampilkan
259
+ sebagai `↺` di feed aktivitas) alih-alih membaca dan menganalisis ulang file.
260
+ Membaca file yang berubah, rentang berbeda, atau memverifikasi file yang baru
261
+ disunting agent tetap bekerja.
262
+ - **Baris aktivitas kaya telemetri dan detail per-pemanggilan.** Baris live kini
263
+ menampilkan fase, waktu fase, total waktu run, langkah, tool yang sedang berjalan
264
+ beserta posisi antriannya (`writing edit_file src/x.js (2/5)`), token
265
+ prompt/completion live, dan latensi token pertama. Setiap pemanggilan model
266
+ mencetak `◇ model 9.4s · 21.3k↑ 388↓ tok · first token 1.8s`, dan respons yang
267
+ terpotong menyatakannya.
268
+ - **Output command live.** stdout/stderr dari command yang berjalan mengalir ke
269
+ wilayah live (ekor terbatas) alih-alih hanya muncul setelah proses keluar.
270
+ - **Diff perubahan file di UI.** Setiap create/write/edit mencetak baris `-`/`+`
271
+ yang benar-benar berubah (`• Edit src/agent/agent.js (+12 −3)`), dibatasi 24
272
+ baris, sehingga pengguna bisa mengaudit perubahan dan membatalkan + menugaskan
273
+ ulang bila salah.
274
+ - **Watchdog aliran mandek** (`AGENT_STREAM_IDLE_TIMEOUT_MS`, bawaan 45s): aliran
275
+ respons yang berhenti mengirim byte dibatalkan dan dilaporkan sebagai
276
+ `STREAM_STALLED` alih-alih menahan satu langkah terbuka tanpa batas. Permintaan
277
+ juga tidak lagi bisa hidup melampaui tenggat tugas.
278
+ - Command `/worklog`; `/status`, `/history`, dan `/sessions show` kini melaporkan
279
+ durasi, jumlah pemanggilan model, dan bacaan yang dipakai ulang.
280
+
281
+ - Flag CLI `--auto-approve`: melewati prompt persetujuan untuk setiap aksi tool
282
+ (command, penulisan, penghapusan) agar agent bisa bekerja tanpa pengawasan.
283
+ Bisa dikombinasikan dengan `-y` (yang hanya menyetujui penulisan);
284
+ `--auto-approve` mencakup semuanya. Sintaks shell mentah tetap butuh
285
+ `AGENT_ALLOW_SHELL=true`.
286
+ - Binary global `ryuu` (lewat `npm link`); nama `ryuu` sebelumnya tetap menjadi
287
+ alias. Dijalankan dari folder mana pun, folder itu tetap menjadi workspace dan
288
+ jatuh kembali ke `.env` CLI terpasang untuk `NVIDIA_API_KEY` ketika folder saat
289
+ ini tidak punya.
290
+ - HUD terminal futuristik: banner gradien `RYUU // AGENT OS`, panel telemetri,
291
+ feed aktivitas berbasis rail, panel reasoning live, kartu gerbang persetujuan,
292
+ dan dasbor ringkasan run.
293
+ - Pesan assistant sadar-Markdown: heading, bold/italic, inline code, link, daftar,
294
+ kutipan, blok kode bersal dengan penyorotan ringan, dan tabel sadar-lebar yang
295
+ mengecil, membungkus, atau jatuh ke tata letak vertikal ketika terminal terlalu
296
+ sempit. Markdown dirender di HUD maupun mode plain.
297
+ - Memori percakapan lintas tugas: permintaan dan jawaban setiap tugas yang selesai
298
+ disimpan dan dikirim sebagai konteks untuk tugas berikutnya dalam sesi yang sama,
299
+ sehingga agent mengingat apa yang diminta sebelumnya. Periksa dengan `/memory`,
300
+ pulihkan memori sesi tersimpan dengan `/resume <session-id>`, lupakan dengan
301
+ `/clear`. Giliran disunting, disimpan sebagai teks user/assistant saja (tidak
302
+ pernah pesan tool mentah) dan dibatasi `AGENT_MAX_CONTEXT_CHARS`.
303
+ - Jawaban akhir dialirkan langsung sebagai teks biasa sementara provider masih
304
+ menulisnya, alih-alih hanya muncul setelah langkah selesai. Kotak khusus untuk
305
+ aliran reasoning; jawaban yang dialirkan tidak pernah dibungkus kotak maupun
306
+ dicetak dua kali (ringkasan tidak merendernya ulang).
307
+ - CLI membersihkan terminal saat start (`console.clear()` di awal `main`), sehingga
308
+ banner selalu dimulai pada layar bersih. Ini tidak berpengaruh ketika stdout
309
+ bukan TTY (pipe, CI, tes).
310
+ - Katalog model bernomor untuk `/model`: `z-ai/glm-5.3-flash`,
311
+ `nvidia/nemotron-3.5-super-vl-120b-a12b`, `google/diffusiongemma-26b-a4b-it`,
312
+ `poolside/laguna-xs-2.1`, dan `stepfun-ai/step-5-preview` bergabung dengan model
313
+ DeepSeek bawaan, sehingga berpindah tidak perlu mengetik ulang id
314
+ `provider/model` yang panjang.
315
+ ### Diperbaiki
316
+
317
+ - **Jawaban yang dialirkan tidak lagi tumbuh melewati blok-blok yang mengikutinya.**
318
+ TUI menambahkan setiap `contentDelta` sebuah tugas ke blok jawaban terbuka
319
+ pertama, sehingga teks dari langkah berikutnya terus memperpanjang blok awal itu —
320
+ jawaban tampak menggul ke belakang dan terkubur di bawah blok reasoning dan tool.
321
+ Delta kini memulai blok baru setiap kali blok lain ditambahkan setelah blok yang
322
+ terbuka, dan `streamedResponse()` mengingat bahwa teks benar-benar dialirkan,
323
+ sehingga ringkasan akhir tidak digandakan. Dicakup oleh sebuah tes yang
324
+ mengalirkan teks, menjalankan tool, mengalirkan lagi, dan menegaskan urutan blok
325
+ serta barisnya.
326
+
327
+ - **`/exit` kini benar-benar keluar.** Menutup UI melepas listener-nya tetapi
328
+ meninggalkan stdin dalam mode flowing, sehingga event loop tetap hidup setelah
329
+ layar dibersihkan: proses tampak menggantung pada layar kosong sampai `Ctrl+C`
330
+ kedua. `ComposerInput.dispose()`, `PromptSession.close()`, `Tui.close()`, dan
331
+ kembalian interaktif di `main()` kini menjeda stdin, dan pemeriksaan PTY
332
+ end-to-end (stdin dibiarkan terbuka) menunjukkan proses kembali ke shell segera
333
+ setelah `/exit` di kedua antarmuka.
334
+
335
+ - **Payload tool-call yang rusak tidak lagi membunuh run.** Provider memvalidasi
336
+ setiap string `function.arguments` di percakapan pada *setiap* permintaan, jadi
337
+ dulu satu payload terpotong menggagalkan permintaan *berikutnya* dengan
338
+ `messages[n].tool_calls[i].function.arguments must be a valid JSON object string`
339
+ dan membatalkan seluruh tugas. Payload terpotong kini diperbaiki (string/array/
340
+ objek terbuka ditutup), pemanggilan yang diperbaiki dieksekusi, dan payload yang
341
+ tidak bisa diperbaiki diganti dengan `{}` dalam sejarah tersimpan sementara model
342
+ diberi tahu untuk mengirimnya ulang. Provider menyederhanakan permintaan sekali
343
+ lagi, sehingga payload rusak tidak lagi bisa sampai ke API.
344
+ - Tool call dengan argumen yang rusak bukan lagi jalan buntu: agent melaporkan galat
345
+ parse persisnya kembali ke model, tetap bekerja, dan melanjutkan tugas alih-alih
346
+ menggagalkan run.
347
+ - Pemanggilan gagal yang identik diblokir setelah dua kali (command yang keluar
348
+ dengan `1` juga dihitung), sehingga agent berhenti membakar langkah pada galat
349
+ yang sama dan diberi tahu untuk mengganti tool, argumen, atau melaporkan
350
+ temuannya.
351
+ - Penolakan provider yang hanya disebabkan oleh payload tool yang teracuni
352
+ (`INVALID_TOOL_ARGUMENTS`) kini dikenali sebagai bisa dipulihkan alih-alih
353
+ dilaporkan sebagai `BAD_REQUEST` yang tidak bisa dipulihkan.
354
+
355
+ ### Diubah
356
+
357
+ - **Sambung ulang dan giliran model kosong tidak lagi mengakhiri tugas.**
358
+ `AGENT_MAX_RECOVERY_ATTEMPTS` kini berbawaan `0`, yang berarti *tanpa batas*:
359
+ tautan provider yang putus terus menampilkan heartbeat dan mencoba ulang dengan
360
+ backoff eksponensial (maksimal 30s) sampai provider menjawab, tenggat tugas lewat,
361
+ atau pengguna membatalkan. Nilai positif (1–1000) tetap memaksakan batas keras.
362
+ Giliran model kosong juga diperlakukan sebagai percobaan ulang, bukan galat: agent
363
+ mendorong model, melakukan beat `empty response · attempt N (unlimited)`, menunggu
364
+ dengan backoff berbasis `AGENT_RECOVERY_BACKOFF_MS` (maksimal 15s), dan bertanya
365
+ ulang di bawah nomor langkah yang sama, sehingga percobaan ulang tidak
366
+ mengonsumsi anggaran `AGENT_MAX_STEPS` maupun memunculkan galat runtime
367
+ `EMPTY_RESPONSE`. Diverifikasi oleh uji unit yang menjalankan pemulihan melewati
368
+ batas lima-percobaan lama dan empat giliran kosong berturut-turut.
369
+ - **System prompt dirakit sekali per sesi dan dipakai ulang byte-per-byte.** Ia kini
370
+ menjadi kontrak menetap (aturan pengoperasian, katalog tool, fakta project)
371
+ alih-alih instruksi per-tugas, sehingga identik pada setiap langkah, tidak pernah
372
+ tumbuh, dan ramah cache. Setiap tugas hanya menambah badan lewat `TASK BRIEF`.
373
+ - **Prompt mengoptimalkan untuk waktu.** Ia menyatakan aturan lanjutan, meminta
374
+ maksimal enam pemanggilan tool independen dalam satu respons, melarang membaca
375
+ ulang file worklog, mewajibkan satu verifikasi sempit alih-alih loop eksploratif,
376
+ dan memberi tahu model untuk menyatu pada 70% anggaran.
377
+ - `finish_reason: \"length\"` kini ditangani: pemanggilan tool yang terpotong dibuang
378
+ dan dilaporkan ke model (`TRUNCATED_RESPONSE`), tidak pernah dieksekusi. Ini
379
+ menghilangkan mode gagal ketika payload terpotong yang sudah diperbaiki menulis
380
+ setengah file ke disk.
381
+ - Sesi menyimpan `durationMs`, `modelCalls`, `requestMs`, `firstTokenMs`,
382
+ `cachedReads`, dan worklog terbatas, sehingga riwayat run bisa diaudit setelahnya.
383
+ - Satu baris aktivitas yang selalu menyala kini berada di bagian bawah UI percakapan,
384
+ dianimasikan 10 fps dengan spinner dan jam berjalan, berpindah fase bersama run:
385
+ `thinking` saat model bekerja di latar, `reasoning` saat aliran reasoning-nya
386
+ ditampilkan, dan `working` sebagai cadangan (merakit tool call, menjalankan
387
+ command, persetujuan, mengalirkan jawaban). Ia dibersihkan saat run berakhir,
388
+ tidak pernah meninggalkan frame liar, dan hanya barisnya sendiri yang dicetak ulang
389
+ per tick, sehingga model lambat tidak pernah terlihat membeku dan terminal tidak
390
+ dibanjiri.
391
+ - Tugas dikirim dengan satu Enter. Kontrak sebelumnya menunggu Enter kedua yang
392
+ kosong, yang membuat CLI duduk di prompt `>` telanjang tanpa uplink tugas dan
393
+ tanpa baris aktivitas, tampak mati. Tugas multi-baris tetap tersedia dengan
394
+ mengakhiri baris menggunakan `\\`; prompt kelanjutan adalah `↳` dan menampilkan
395
+ petunjuk.
396
+ - Kotak reasoning dan baris aktivitas kini berbagi satu wilayah live yang ditambatkan
397
+ pada baris pertamanya, sehingga output yang diselang-seling (rencana, peringatan,
398
+ hasil tool, jawaban yang dialirkan) selalu membersihkan dan menggambar ulang di
399
+ tempat. Header kotak tidak lagi menampilkan waktu berjalan yang hanya disegarkan
400
+ saat reasoning baru tiba.
401
+ - Banner kini memakai wordmark blok `RYUU` enam baris yang jelas alih-alih glif
402
+ ringkas, dipusatkan di atas tagline dan panel telemetri.
403
+ - Loop agent tidak lagi berhenti pada jumlah langkah tetap. `AGENT_MAX_STEPS` kini
404
+ berbawaan `0` (tanpa batas) dan hanya berperan sebagai batas opsional;
405
+ `--max-steps 0` melakukan hal yang sama. `AGENT_MAX_TASK_DURATION_MS` dan `Ctrl+C`
406
+ tetap menjadi penjaga tugas yang lari sendiri.
407
+ - Renderer menampilkan `step n` dan `unlimited steps` ketika tidak ada batas yang
408
+ dikonfigurasi.
409
+ - Panel reasoning live kini menjadi kotak tertutup yang lebarnya sesuai: header,
410
+ lima baris pratinjau (sebelumnya dua), dan batas bawah. Ia tetap berada di layar
411
+ saat reasoning berakhir — ringkasan `reasoning n chars` ditambahkan di bawahnya
412
+ alih-alih menghapus pratinjaunya, dan path log reasoning tidak lagi dicetak.
413
+ - Tampilan penuh `Tab` kini menjadi viewport berbatas dengan gaya header tertutup
414
+ simetris yang sama dengan pratinjau (`last n/m · Tab: preview`), direbut kembali
415
+ di tempat, sehingga berpindah kembali ke pratinjau tidak lagi meninggalkan teks
416
+ liar.
417
+ - `/model` bekerja menurut nomor: ia mendaftarkan katalog dengan model terpilih
418
+ ditandai, dan `/model <n>` berpindah. Argumen `provider/model` mentah ditolak
419
+ dengan penunjuk ke daftar. Pilihan disimpan ke `.ryuu/preferences.json` dan tetap
420
+ ada setelah CLI restart (`--model` eksplisit tetap menang untuk satu run).
421
+ - Penggambaran ulang kotak reasoning tidak lagi bergeser satu kolom ke kanan:
422
+ penghapusan di tempat kini mereset kursor dengan carriage return sebelum dan
423
+ sesudah melangkah, sehingga header tetap simetris dengan batas bawah pada setiap
424
+ penggambaran ulang.
425
+ - Jawaban yang dialirkan kini merender Markdown inline saat tiba (bold, italic,
426
+ code, link), sehingga penanda `**bold**` tidak lagi bocor ke terminal. Baris
427
+ panjang membungkus pada batas kata sehingga token Markdown tidak pernah terpotong
428
+ setengah, dan baris parsial yang dibuffer selalu dikosongkan sebelum output lain —
429
+ sebuah PLAN atau baris tool tidak lagi bisa membelah jawaban di tengah kalimat.
430
+ - Token kontrol chat-template model yang bocor (`<|channel>`, `<channel|>`,
431
+ `<start_of_turn>`, `</tool_call>`, `<|repo_name|>`, …) dibuang dari jawaban yang
432
+ dialirkan, teks reasoning, rencana, catatan, dan respons akhir.
433
+ - Jawaban yang dialirkan merender lebih banyak Markdown secara langsung: header ATX
434
+ (`### title`) kehilangan tanda pagarnya dan dirender tebal, tabel pipe dan blok
435
+ kode bersal dit buffer dan dirender sebagai blok begitu selesai dialirkan
436
+ (tidak pernah sebagai baris `|` mentah atau pagar ```), dan pembungkusan baris
437
+ panjang kini menjaga rentang `**bold**`/`code` tetap seimbang sehingga penanda
438
+ tidak lagi bisa bocor sebagai asterisk nyasar.
439
+ - Rencana kini memimpin langkah: ia diekstrak hanya dari respons pertengahan tugas
440
+ (yang dilanjutkan dengan tool call) dan dikeluarkan sebelum ringkasan reasoning.
441
+ Jawaban akhir dengan daftar penjelasan bernomor tidak lagi dikira sebagai rencana.
442
+ - Baris tabel yang dialirkan tidak lagi terfragmentasi: deteksi blok kini berjalan
443
+ pada baris logis (dibatasi newline), sehingga baris tabel pipe yang lebih lebar
444
+ dari layar tidak pernah dibungkus di tengah sel — ia dibuffer utuh dan dirender
445
+ oleh perender tabel sadar-lebar ketika tabel berakhir. Garis horizontal (`---`)
446
+ dirender sebagai pembatas redup dan kutipan blok (`>`) kehilangan penandanya dan
447
+ dirender sebagai kutipan, alih-alih bocor mentah.
448
+ - Pengerasan system prompt dari bukti lapangan: periksa `file_info` sebelum membaca
449
+ file yang mungkin besar, jangan pernah mencoba ulang bacaan "too large" (pakai
450
+ `search_files` atau rentang baris sempit), dan jaga sel tabel Markdown tetap
451
+ pendek untuk output terminal.
452
+ - System prompt kini membawa katalog tool langsung (setiap tool terdaftar beserta
453
+ argumen dan gerbang persetujuannya), skrip `package.json` milik project itu
454
+ sendiri dan tata letak modul workspace, sehingga model memilih tool yang benar
455
+ alih-alih keluar ke `grep`/`rg`, dan tahu command apa saja yang benar-benar
456
+ disediakan project tersebut.
457
+ - System prompt mendapat aturan argumen eksplisit (satu objek JSON, tanpa pagar,
458
+ tanpa pemotongan, kutip yang di-escape) dan aturan pemulihan (pemanggilan yang
459
+ gagal adalah bukti, exit code `1` biasanya berarti "tidak ada yang cocok", jangan
460
+ pernah menjalankan ulang command identik).
461
+ - Kegagalan provider yang bisa dipulihkan (jaringan, timeout, `5xx`, `429`) dicoba
462
+ ulang oleh agent dengan backoff eksponensial alih-alih membatalkan tugas, dibatasi
463
+ oleh `AGENT_MAX_RECOVERY_ATTEMPTS` (bawaan 5) dan `AGENT_RECOVERY_BACKOFF_MS`
464
+ (bawaan 1000).
465
+ - **Heartbeat** kini membuktikan agent masih hidup saat memulihkan diri:
466
+ `♥ heartbeat · reconnecting · attempt 2/5 in 1.0s`, diikuti
467
+ `♥ heartbeat · link restored after 2 attempt(s)` ketika provider menjawab lagi.
468
+ Payload rusak menampilkan `♥ heartbeat · INVALID_ARGUMENTS · …` selama pemanggilan
469
+ diperbaiki. Baris aktivitas tetap berputar selama penantian, sehingga terminal
470
+ tidak pernah terlihat membeku.
471
+ - Pemisahan warna: teks respons (jawaban akhir dan catatan yang dialirkan) memakai
472
+ palet putih, sementara baris tugas, nama tool/command, dan baris command di panel
473
+ bukti memakai biru.
474
+ ### Dokumentasi
475
+
476
+ - Mendokumentasikan aliran reasoning langsung (`reasoning_content`, pratinjau lima
477
+ baris dalam kotak tertutup, `Tab` untuk tampilan penuh, log di
478
+ `.ryuu/logs/reasoning/`), memori percakapan (`/memory`, `/resume`), dan aliran
479
+ langsung jawaban akhir.
480
+ - Bagian pemecahan masalah README yang baru: "Tautan terputus di tengah run
481
+ (heartbeat)", "must be a valid JSON object string (HTTP 400)", dan "Sebuah tool
482
+ terus gagal", plus dua variabel environment pemulihan yang baru.
483
+ - Memperbaiki keterbatasan README yang masih mengklaim respons tidak dialirkan, dan
484
+ membuat petunjuk toggle reasoning penuh konsisten berbahasa Inggris.
485
+
486
+ ## [0.1.0] - 2026-10-20
487
+
488
+ Rilis pertama yang bisa dipakai: agen coding otonom yang bergerbang persetujuan
489
+ untuk terminal.
490
+
491
+ ### Ditambahkan
492
+
493
+ - UI terminal interaktif dengan banner bermerek, info model/provider/workspace/
494
+ runtime, pesan status berwarna, rencana tugas, langkah bernomor, aktivitas tool
495
+ live, durasi, permintaan persetujuan, penolakan, ringkasan bukti akhir, serta mode
496
+ plain untuk penggunaan non-TTY.
497
+ - Loop agent eksplisit di atas Chat Completions API NVIDIA yang kompatibel dengan
498
+ OpenAI (`https://integrate.api.nvidia.com/v1`, bawaan
499
+ `deepseek-ai/deepseek-v4.1-flash`): tool call tervalidasi skema, penegakan
500
+ persetujuan, bolak-balik hasil tool, deteksi pemanggilan duplikat, penanganan
501
+ argumen rusak, penolakan tool tak dikenal, pemadatan konteks berbatas, batas
502
+ langkah/durasi/output, dan pembatalan.
503
+ - Tool workspace: `list_files`, `tree`, `read_file`, `search_files`, `file_info`,
504
+ `create_file`, `edit_file`, `write_file`, `move_file`, `delete_file`, `diff_file`,
505
+ `inspect_git`, dan `project_summary`.
506
+ - Tool proses: `run_command`, `start_process`, `list_processes`,
507
+ `get_process_output`, dan `stop_process`, dengan stdout/stderr asli, exit code,
508
+ sinyal, durasi, timeout, buffer terbatas, serta penghentian bersih lalu paksa.
509
+ - Klien provider dengan retry terbatas dan jitter untuk kegagalan sesaat, dukungan
510
+ `Retry-After`, serta pemetaan yang bisa ditindaklanjuti untuk 401/403/404/429/5xx,
511
+ galat koneksi, timeout, galat panjang konteks, dan tool calling yang tidak
512
+ didukung.
513
+ - Slash command: `/help`, `/exit`, `/clear`, `/status`, `/model`, `/workspace`,
514
+ `/files`, `/tree`, `/tools`, `/processes`, `/logs`, `/cancel`, `/history`,
515
+ `/sessions`, `/diff`, `/undo`, `/config`, dan `/doctor`.
516
+ - Riwayat sesi lokal, caching ringkasan project dengan invalidasi, pemadatan
517
+ konteks, log yang disunting (redacted) dengan rotasi, serta undo stack terbatas
518
+ sesi dengan pemeriksaan file basi.
519
+ - Registry tool dengan skema JSON, tingkat risiko, metadata persetujuan, validasi
520
+ plugin, dan deteksi tabrakan.
521
+
522
+ ### Keamanan
523
+
524
+ - Penolakan escape path workspace dan symlink; path absolut di luar workspace
525
+ ditolak.
526
+ - Pemblokiran file rahasia untuk `.env*`, kunci, sertifikat, dan direktori
527
+ kredensial.
528
+ - Direktori hasil-generate (`node_modules`, `.git`, `dist`, output build, ...)
529
+ dikecualikan secara bawaan.
530
+ - Command dijalankan dengan array argumen dan `shell: false`; shell mentah butuh
531
+ `AGENT_ALLOW_SHELL=true` plus persetujuan eksplisit. Didokumentasikan sebagai
532
+ **bukan sandbox**.
533
+ - Variabel environment yang tampak seperti kredensial dibuang dari proses anak.
534
+ - Kunci API dan pola token disunting dari log, sesi, galat, dan output command.
535
+ - Penulisan atomik yang mempertahankan akhir baris, dengan perlindungan mtime basi
536
+ opsional.
537
+ - `.env` dan seluruh state lokal di bawah `.ryuu/` dikecualikan dari Git.
538
+
539
+ ### Pengujian
540
+
541
+ - 109 uji unit dan integrasi offline memakai runner tes bawaan Node, workspace
542
+ sementara, provider terskrip, dan `fetch` yang disuntikkan.
543
+ - Cakupannya meliputi penolakan traversal/symlink, pengecualian rahasia, batas
544
+ ukuran, baca/daftar/cari, diff, sunting aman, penolakan persetujuan, validasi
545
+ argumen, tool tak dikenal, normalisasi/pemetaan galat/retry provider, keluar/
546
+ timeout/truncasi proses, redaksi log dan izin log khusus pemilik, sesi/pemadatan,
547
+ eksekusi command yang disetujui dengan stdout/stderr/exit code/durasi asli, serta
548
+ perilaku start/doctor CLI.
549
+
550
+ ### Keterbatasan yang diketahui
551
+
552
+ - Validasi API NVIDIA langsung pada 2026-10-20 berhasil dengan `z-ai/glm-5.3`
553
+ (tool call plus jawaban akhir). Endpoint `deepseek-ai/deepseek-v4.1-flash` bawaan
554
+ saat itu habis waktu di sisi provider; pakai `--model` atau `NVIDIA_MODEL` sebagai
555
+ solusi dan jalankan ulang `npm run doctor -- --live`.
556
+ - Respons dialirkan dan dikumpulkan sisi-klien; tool call hanya berjalan berurutan.
557
+ - `/undo` terbatas pada tugas saat ini dan menolak saat file berubah di bawahnya.
558
+ - Tidak ada sandbox atau isolasi kontainer tingkat OS.
559
+ - Pembersihan pohon proses di Windows bersifat best-effort.
560
+
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ryuu-agent
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.