@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.
- package/CHANGELOG.md +560 -0
- package/LICENSE +21 -0
- package/README.md +1213 -2
- package/package.json +45 -4
- package/src/agent/agent.js +1194 -0
- package/src/agent/approvals.js +76 -0
- package/src/agent/context.js +106 -0
- package/src/agent/planner.js +237 -0
- package/src/agent/worklog.js +318 -0
- package/src/cli/app.js +463 -0
- package/src/cli/commands.js +1150 -0
- package/src/cli/input.js +287 -0
- package/src/cli/markdown.js +527 -0
- package/src/cli/prompts.js +255 -0
- package/src/cli/renderer.js +2155 -0
- package/src/cli/settings-editor.js +280 -0
- package/src/cli/settings-tui.js +669 -0
- package/src/cli/tui.js +1737 -0
- package/src/cli/width.js +48 -0
- package/src/config/load.js +132 -0
- package/src/config/scaffold.js +50 -0
- package/src/config/settings-registry.js +495 -0
- package/src/config/settings.js +304 -0
- package/src/config/validate.js +451 -0
- package/src/index.js +449 -0
- package/src/providers/catalog.js +282 -0
- package/src/providers/index.js +84 -0
- package/src/providers/nvidia.js +645 -0
- package/src/providers/registry.js +104 -0
- package/src/services/clipboard.js +38 -0
- package/src/services/diff.js +153 -0
- package/src/services/doctor.js +126 -0
- package/src/services/logger.js +190 -0
- package/src/services/preferences.js +249 -0
- package/src/services/processes.js +345 -0
- package/src/services/provider-settings.js +226 -0
- package/src/services/sessions.js +279 -0
- package/src/services/undo.js +133 -0
- package/src/services/ushell.js +146 -0
- package/src/services/websearch/manager.js +616 -0
- package/src/services/websearch/mcp.js +233 -0
- package/src/services/websearch/normalize.js +284 -0
- package/src/services/websearch/providers.js +178 -0
- package/src/services/websearch/serper.js +263 -0
- package/src/services/workspace.js +589 -0
- package/src/tools/filesystem.js +304 -0
- package/src/tools/git.js +114 -0
- package/src/tools/index.js +48 -0
- package/src/tools/project.js +160 -0
- package/src/tools/registry.js +118 -0
- package/src/tools/search.js +210 -0
- package/src/tools/shell.js +279 -0
- package/src/tools/url.js +542 -0
- package/src/tools/web.js +67 -0
- package/src/utils/errors.js +160 -0
- package/src/utils/network.js +129 -0
- package/src/utils/redaction.js +73 -0
- package/src/utils/validation.js +370 -0
- 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.
|