@botconnector/bccli 0.4.0-beta.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.en.md +242 -0
  2. package/README.md +95 -3
  3. package/dist/acp-ATIL4JOZ.js +182 -0
  4. package/dist/args-J5ONVGIF.js +13 -0
  5. package/dist/chunk-45SDLMTV.js +341 -0
  6. package/dist/chunk-6M5X2KZE.js +8 -0
  7. package/dist/chunk-7F3IWBPQ.js +191 -0
  8. package/dist/{chunk-CLN4Z5E3.js → chunk-BLOYFIAD.js} +6 -3
  9. package/dist/chunk-BNA74HPN.js +145 -0
  10. package/dist/{chunk-DX7CZTBB.js → chunk-BQ2IGPBR.js} +14 -9
  11. package/dist/chunk-JL5ZCSP2.js +76 -0
  12. package/dist/chunk-KEMYIGCP.js +235 -0
  13. package/dist/{chunk-BFZXRKW5.js → chunk-L7QI6JN2.js} +24 -2
  14. package/dist/chunk-LACUWBWS.js +361 -0
  15. package/dist/chunk-M7CALSP3.js +733 -0
  16. package/dist/{chunk-ELML4KVQ.js → chunk-O7M3TGIW.js} +34 -2
  17. package/dist/chunk-PSO7R5AD.js +10 -0
  18. package/dist/chunk-PUN4HMAG.js +940 -0
  19. package/dist/{chunk-SJH3YLW4.js → chunk-QDQU6VY2.js} +60 -6
  20. package/dist/chunk-QZKLZELZ.js +64 -0
  21. package/dist/{chunk-7S6JXQCH.js → chunk-SPRNLS7K.js} +2 -1
  22. package/dist/chunk-TLPFQIS2.js +231 -0
  23. package/dist/chunk-TVALKHFB.js +2143 -0
  24. package/dist/chunk-UZWJQF67.js +500 -0
  25. package/dist/chunk-XBO5GACQ.js +56 -0
  26. package/dist/cli.js +162 -1383
  27. package/dist/completion-HPPFDAPB.js +125 -0
  28. package/dist/{config-YUNKPCNB.js → config-COPNMMV6.js} +5 -2
  29. package/dist/config-RZ5JONMX.js +30 -0
  30. package/dist/ghBotCli-IBCZIWT5.js +677 -0
  31. package/dist/integrationCli-P75R2VSC.js +685 -0
  32. package/dist/login-SYIQP46J.js +16 -0
  33. package/dist/{mcpCli-DZWQPTOS.js → mcpCli-QUV5SD64.js} +42 -9
  34. package/dist/modelsCli-TRRB5LX4.js +36 -0
  35. package/dist/npmRunner-LU43GM3W.js +46 -0
  36. package/dist/oauthLogin-6FWQABJ7.js +210 -0
  37. package/dist/pluginsCli-GNW4TPVV.js +284 -0
  38. package/dist/prCli-5IMV3VNQ.js +78 -0
  39. package/dist/providerCli-FAOZHOKW.js +15 -0
  40. package/dist/sdk.js +5490 -0
  41. package/dist/serve-6QLBJUYW.js +178 -0
  42. package/dist/serve-JG7RLIUD.js +515 -0
  43. package/dist/session-KBAQ4BZ5.js +12 -0
  44. package/dist/setup-FJAWDWV4.js +24 -0
  45. package/dist/statsCli-CF3R7ATL.js +353 -0
  46. package/dist/transferCli-TK2GSVRK.js +71 -0
  47. package/dist/ui-B3CJ6TGE.js +2365 -0
  48. package/dist/update-K5IQ2MYR.js +145 -0
  49. package/package.json +25 -4
  50. package/dist/args-FLTRM57K.js +0 -12
  51. package/dist/chunk-2MGINW4O.js +0 -114
  52. package/dist/chunk-IM3KMPVZ.js +0 -52
  53. package/dist/chunk-KV27KTOX.js +0 -254
  54. package/dist/chunk-U7GK73CK.js +0 -341
  55. package/dist/chunk-Z7PM3LTC.js +0 -93
  56. package/dist/login-JXFORO3J.js +0 -9
  57. package/dist/providerCli-Q7LRM2NP.js +0 -12
  58. package/dist/session-7UB77CEG.js +0 -9
  59. package/dist/ui-6GTQUJOE.js +0 -1415
@@ -0,0 +1,500 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/i18n/id.ts
4
+ var ID = {
5
+ "MCP servers (enter: install / remove \xB7 esc close) \xB7 \u2713 active \u25CB not installed \u2717 error": "Server MCP (enter: pasang / hapus \xB7 esc tutup) \xB7 \u2713 aktif \u25CB belum \u2717 error",
6
+ "{label}\u2026 ({seconds}s \xB7 esc to cancel)": "{label}\u2026 ({seconds} dtk \xB7 esc batal)",
7
+ "Provider (\u2191\u2193 enter, esc cancel) \xB7 \u2713 ready \xB7 \u25CB needs API key": "Provider (\u2191\u2193 enter, esc batal) \xB7 \u2713 siap \xB7 \u25CB butuh API key",
8
+ "Choose a model (type to filter{filter} \xB7 \u2191\u2193 enter \xB7 esc cancel)": "Pilih model (ketik untuk menyaring{filter} \xB7 \u2191\u2193 enter \xB7 esc batal)",
9
+ "No matching models.": "Tidak ada model yang cocok.",
10
+ "{title} (\u2191\u2193 enter \xB7 type to filter{filter} \xB7 esc cancel)": "{title} (\u2191\u2193 enter \xB7 ketik untuk menyaring{filter} \xB7 esc batal)",
11
+ "No matches.": "Tidak ada yang cocok.",
12
+ "edit": "edit",
13
+ "write": "tulis",
14
+ "run": "jalankan",
15
+ "fetch": "ambil",
16
+ "yes for all edits in this project, this session": "ya untuk semua edit di project ini, sesi ini",
17
+ "yes this session for {rules}": "ya sesi ini untuk {rules}",
18
+ "Allow {verb} {target}?": "Izinkan {verb} {target}?",
19
+ "[y] yes": "[y] ya",
20
+ "[s] yes to all ": "[s] ya semua ",
21
+ "[n] no": "[n] tidak",
22
+ "Plan from the agent": "Rencana dari agent",
23
+ "[a] yes, auto-edit": "[a] ya, edit otomatis",
24
+ "[y] yes, ask at each step": "[y] ya, tanya tiap langkah",
25
+ "[n] not yet, revise first": "[n] belum, perbaiki dulu",
26
+ " enter save \xB7 esc cancel": " enter simpan \xB7 esc batal",
27
+ "shift+tab switch mode": "shift+tab ganti mode",
28
+ "{n} tokens": "{n} token",
29
+ "\u273B Thinking": "\u273B Berpikir",
30
+ "click to toggle": "klik untuk buka/tutup",
31
+ "Model: {model} \xB7 reasoning: {level}": "Model: {model} \xB7 penalaran: {level}",
32
+ "No reasoning summary received yet; tool activity remains visible above.": "Belum ada ringkasan penalaran dari model; aktivitas tool tetap terlihat di atas.",
33
+ "esc to cancel": "esc batal",
34
+ "/ for commands": "/ perintah",
35
+ "\u2026 {n} earlier steps": "\u2026 {n} langkah sebelumnya",
36
+ "\u2717 failed": "\u2717 gagal",
37
+ "\u2713 done": "\u2713 selesai",
38
+ "\u2026 {n} more lines ({bind})": "\u2026 {n} baris lagi ({bind})",
39
+ "No sessions in this folder yet; starting a new one.": "Belum ada sesi di folder ini; memulai sesi baru.",
40
+ "Session number (enter = new): ": "Nomor sesi (enter = baru): ",
41
+ 'This repo wants to run the MCP server "{name}" ({what}). Allow? [y/N] ': 'Repo ini ingin menjalankan server MCP "{name}" ({what}). Izinkan? [y/N] ',
42
+ "Conversation summarized to fit the model context.": "Percakapan diringkas agar muat di konteks model.",
43
+ 'Step limit of {n} reached. Type "continue" to keep going.': 'Batas {n} langkah tercapai. Ketik "lanjut" untuk meneruskan.',
44
+ "Cancelled.": "Dibatalkan.",
45
+ "Permission mode: {mode}": "Mode izin: {mode}",
46
+ "Folder: {cwd}": "Folder: {cwd}",
47
+ "MCP: {ready} active, {errors} errors": "MCP: {ready} aktif, {errors} error",
48
+ "Session tokens: {input} in \xB7 {output} out": "Token sesi: {input} masuk \xB7 {output} keluar",
49
+ "Context: ~{pct}% of 128k": "Konteks: \xB1{pct}% dari 128k",
50
+ "{name} \u2014 {description} \xB7 tools: {tools} \xB7 model: {model}": "{name} \u2014 {description} \xB7 alat: {tools} \xB7 model: {model}",
51
+ "all": "semua",
52
+ "same as main": "ikut utama",
53
+ "(no skills)": "(tidak ada skill)",
54
+ "(no custom commands)": "(tidak ada perintah custom)",
55
+ "Skills": "Skill",
56
+ "Custom commands": "Perintah custom",
57
+ "Started: {when}": "Mulai: {when}",
58
+ "{messages} messages \xB7 {input} tokens in \xB7 {output} out": "{messages} pesan \xB7 {input} token masuk \xB7 {output} keluar",
59
+ "File: {file}": "File: {file}",
60
+ "git is not installed or not on PATH, so /diff cannot be used.": "git tidak terpasang atau tidak ada di PATH, jadi /diff tidak bisa dipakai.",
61
+ "This folder is not a git repository, so there is no diff.": "Folder ini bukan repository git, jadi tidak ada diff.",
62
+ "git is not installed or not on PATH, so /worktree cannot be used.": "git tidak terpasang atau tidak ada di PATH, jadi /worktree tidak bisa dipakai.",
63
+ "git is not installed or not on PATH, so -w cannot be used.": "git tidak terpasang atau tidak ada di PATH, jadi -w tidak bisa dipakai.",
64
+ "This folder is not a git repository, so -w cannot create a worktree.": "Folder ini bukan repository git, jadi -w tidak bisa membuat worktree.",
65
+ 'Invalid worktree name "{name}": use letters, digits, dot, dash, or underscore (no slashes).': 'Nama worktree "{name}" tidak valid: pakai huruf, angka, titik, strip, atau garis bawah (tanpa slash).',
66
+ "Worktree path {path} already exists but is not a registered worktree; remove or rename it first.": "Path worktree {path} sudah ada tapi bukan worktree terdaftar; hapus atau ganti nama dulu.",
67
+ "Git worktrees:": "Git worktree:",
68
+ "Create one with: bccli -w <name>": "Buat dengan: bccli -w <nama>",
69
+ "Remove with: git worktree remove <path>": "Hapus dengan: git worktree remove <path>",
70
+ "list git worktrees; create one with bccli -w <name>": "daftar git worktree; buat dengan bccli -w <nama>",
71
+ "No uncommitted changes.": "Tidak ada perubahan yang belum di-commit.",
72
+ "\u2026 {n} more lines": "\u2026 {n} baris lagi",
73
+ "New files (untracked): {files}": "File baru (belum di-track): {files}",
74
+ "\u2717 Node {version} (needs \u2265 22)": "\u2717 Node {version} (butuh \u2265 22)",
75
+ "\u25CB {name} (no key yet)": "\u25CB {name} (belum ada key)",
76
+ "\u2713 Connection {provider} ({n} models)": "\u2713 Koneksi {provider} ({n} model)",
77
+ "\u2717 Connection {provider}: {error}": "\u2717 Koneksi {provider}: {error}",
78
+ "list of commands and shortcuts": "daftar perintah dan pintasan",
79
+ "change model": "ganti model",
80
+ "set reasoning: auto/off/low/medium/high/max": "atur reasoning: auto/off/low/medium/high/max",
81
+ "add/choose an AI provider": "tambah/pilih provider AI",
82
+ "install/manage MCP servers": "pasang/kelola server MCP",
83
+ "new session (the old one stays saved)": "sesi baru (sesi lama tetap tersimpan)",
84
+ "continue another session in this folder": "lanjutkan sesi lain di folder ini",
85
+ "info about this session": "info sesi ini",
86
+ "version, model, permission mode, MCP, context": "versi, model, mode izin, MCP, konteks",
87
+ "view/revoke permissions": "lihat/cabut izin",
88
+ "undo the file edits of the last turn": "batalkan edit file giliran terakhir",
89
+ "re-apply the file edits that /undo just reverted": "terapkan ulang edit file yang baru dibatalkan /undo",
90
+ "git diff of the project": "git diff project",
91
+ "copy the last answer": "salin jawaban terakhir",
92
+ "save the conversation as markdown": "simpan percakapan ke markdown",
93
+ "project instructions (/memory <text>, /memory global <text>)": "instruksi project (/memory <teks>, /memory global <teks>)",
94
+ "create/update AGENTS.md for this project": "buat/perbarui AGENTS.md untuk project ini",
95
+ "list subagents": "daftar subagent",
96
+ "list skills and custom commands": "daftar skill dan perintah custom",
97
+ "check installation health": "cek kesehatan instalasi",
98
+ "save the API key of the current provider": "simpan API key provider aktif",
99
+ "delete the API key of the current provider": "hapus API key provider aktif",
100
+ "set the interface language: en/id": "atur bahasa tampilan: en/id",
101
+ "start a new conversation": "mulai percakapan baru",
102
+ "summarize the conversation": "ringkas percakapan",
103
+ "token usage of this session": "pemakaian token sesi ini",
104
+ "quit": "keluar",
105
+ [`BCCLI \u2014 BotConnector's AI coding agent for the terminal
106
+
107
+ Usage:
108
+ bccli [task] interactive mode (optionally start with a task)
109
+ bccli -p "task" run one task without interaction (scripts/CI)
110
+ bccli login [provider] OAuth login (or --key paste API key, --logout remove)
111
+ bccli models [provider] list models (default: the active provider)
112
+ bccli update install the newest bccli from npm
113
+ bccli acp run as an ACP agent for editors (Zed, ...)
114
+ bccli serve [--port N] serve sessions over HTTP+WS for IDEs/bots
115
+ bccli plugins list, install, remove, or update plugins
116
+ bccli gh-bot [serve] GitHub comment bot (off-by-default; needs config)
117
+ bccli provider list|add <id>|remove <id> manage providers (custom: --url <url> [--name N] [--key-env ENV])
118
+ bccli mcp list|add <name>|remove <name>|auth <name>|logout <name>|serve [--base-url <url>] manage MCP servers, or serve this account's tools over stdio
119
+ bccli completion <shell> print a shell completion script (bash, zsh, fish, powershell)
120
+ bccli stats [--days N] [--tools N] [--models [N|all]] [--project slug]
121
+ show token usage from local sessions (default: last 7 days)
122
+ bccli export [session] [file] copy a session JSONL to a file (default: last session here)
123
+ bccli import <file> import a session JSONL into the current project
124
+ bccli pr <number> [--repo owner/name] [task] check out a GitHub PR and run a task on it
125
+ bccli integrations show the status of external agent integrations
126
+ bccli connect <agent> opencode, aider, cline, dsh, codex, claude-code, cursor, openai-cli, openai-sdk, openai-compatible, openclaw, hermes
127
+ bccli disconnect <agent> remove an integration and restore the previous config
128
+
129
+ Options:
130
+ -m, --model <provider/model> choose a model, e.g. bc-cloud/glm-5.3-flash
131
+ --reasoning <level> auto | off | low | medium | high | max
132
+ -c, --continue continue the last session in this folder
133
+ -r, --resume pick a session to continue
134
+ --allow-all run all tools without asking for permission
135
+ --allowed-tools <a,b> tools allowed without asking: bash, edit, fetch
136
+ -w, --worktree <name> run in git worktree ../<repo>.worktrees/<name> (created, or reused if it exists)
137
+ --output-format <fmt> text | json | stream-json for -p (machine-readable output)
138
+ --permission-mode <mode> default | acceptEdits | plan | allowAll
139
+ --lang <en|id> interface language (default: en; or BCCLI_LANG, or "language" in config)
140
+ -v, --version version
141
+ -h, --help this help`]: `BCCLI \u2014 agent AI BotConnector di terminal
142
+
143
+ Pemakaian:
144
+ bccli [tugas] mode interaktif (opsional langsung dengan tugas)
145
+ bccli -p "tugas" jalankan satu tugas tanpa interaksi (skrip/CI)
146
+ bccli login [provider] login OAuth (atau --key tempel API key, --logout hapus)
147
+ bccli models [provider] daftar model (default: provider aktif)
148
+ bccli update pasang bccli terbaru dari npm
149
+ bccli acp jalankan sebagai agen ACP untuk editor (Zed, ...)
150
+ bccli serve [--port N] sajikan sesi lewat HTTP+WS untuk IDE/bot
151
+ bccli plugins daftar, install, remove, atau perbarui plugin
152
+ bccli gh-bot [serve] bot komentar GitHub (nonaktif default; butuh config)
153
+ bccli provider list|add <id>|remove <id> kelola provider (custom: --url <url> [--name N] [--key-env ENV])
154
+ bccli mcp list|add <nama>|remove <nama>|auth <nama>|logout <nama>|serve [--base-url <url>] kelola server MCP, atau layani tools akun ini lewat stdio
155
+ bccli integrations lihat status integrasi agent eksternal
156
+ bccli connect <agent> opencode, aider, cline, dsh, codex, claude-code, cursor, openai-cli, openai-sdk, openai-compatible, openclaw, hermes
157
+ bccli disconnect <agent> lepas integrasi dan pulihkan config sebelumnya
158
+
159
+ Opsi:
160
+ -m, --model <provider/model> pilih model, contoh bc-cloud/glm-5.3-flash
161
+ --reasoning <level> auto | off | low | medium | high | max
162
+ -c, --continue lanjutkan sesi terakhir di folder ini
163
+ -r, --resume pilih sesi untuk dilanjutkan
164
+ --allow-all jalankan semua alat tanpa minta izin
165
+ --allowed-tools <a,b> alat yang boleh tanpa izin: bash, edit, fetch
166
+ -w, --worktree <name> jalankan di git worktree ../<repo>.worktrees/<name> (dibuat, atau dipakai ulang jika ada)
167
+ --output-format <fmt> text | json | stream-json untuk -p (output mesin)
168
+ --permission-mode <mode> default | acceptEdits | plan | allowAll
169
+ --lang <en|id> bahasa tampilan (default: en; atau BCCLI_LANG, atau "language" di config)
170
+ -v, --version versi
171
+ -h, --help bantuan ini`,
172
+ "--reasoning must be one of: {levels}": "--reasoning harus salah satu dari: {levels}",
173
+ "--port must be a number between 0 and 65535": "--port harus angka antara 0 dan 65535",
174
+ "serve only accepts loopback --host (127.0.0.1, localhost, ::1)": "serve hanya menerima --host loopback (127.0.0.1, localhost, ::1)",
175
+ 'networkPolicy must be "allow" or "offline".': 'networkPolicy harus "allow" atau "offline".',
176
+ "plugins must be an array of strings.": "plugins harus berupa array of string.",
177
+ "verifyCommands must be an array of non-empty strings.": "verifyCommands harus berupa array of string tidak kosong.",
178
+ 'usageCap must be an object, e.g. { "tokens": 2000000 }.': 'usageCap harus berupa objek, mis. { "tokens": 2000000 }.',
179
+ "usageCap.tokens must be a number greater than 0.": "usageCap.tokens harus angka lebih dari 0.",
180
+ "usageCap.usd must be a number greater than 0.": "usageCap.usd harus angka lebih dari 0.",
181
+ "usageCap.usd requires usageCap.prices (USD per 1M tokens).": "usageCap.usd memerlukan usageCap.prices (USD per 1 juta token).",
182
+ 'usageCap.prices["{key}"] must have numeric input and output (USD per 1M tokens).': 'usageCap.prices["{key}"] harus punya input dan output numerik (USD per 1 juta token).',
183
+ "usageCap needs at least one of: tokens, usd.": "usageCap memerlukan setidaknya salah satu dari: tokens, usd.",
184
+ 'updateCheck must be "on" or "off".': 'updateCheck harus "on" atau "off".',
185
+ "repoMap must be true or false.": "repoMap harus true atau false.",
186
+ "theme must be one of: {themes}.": "theme harus salah satu dari: {themes}.",
187
+ 'editor must be "emacs" or "vim".': 'editor harus "emacs" atau "vim".',
188
+ 'sandbox must be "off" or "on".': 'sandbox harus "off" atau "on".',
189
+ 'lsp must be an object with a "servers" array.': 'lsp harus berupa objek dengan array "servers".',
190
+ 'Each lsp server needs { "extensions": [".ts"], "command": "...", "args": ["..."] }.': 'Setiap server lsp butuh { "extensions": [".ts"], "command": "...", "args": ["..."] }.',
191
+ "No LSP server is configured for {ext} files.": "Tidak ada server LSP yang dikonfigurasi untuk file {ext}.",
192
+ NORMAL: "-- NORMAL --",
193
+ "A new bccli is available: {latest} (you have {current}). Run: bccli update": "bccli versi baru tersedia: {latest} (kamu punya {current}). Jalankan: bccli update",
194
+ "Clipboard image saved to {path} \u2014 the path is inserted in the input; the model sees it when you send.": "Gambar clipboard disimpan ke {path} \u2014 path disisipkan ke input; model melihatnya saat kamu kirim.",
195
+ "No image on the clipboard.": "Tidak ada gambar di clipboard.",
196
+ "githubBot secret env {env} is empty \u2014 set it before enabling the bot.": "secret env githubBot {env} kosong \u2014 setel sebelum mengaktifkan bot.",
197
+ "githubBot.{name} must be an array of strings.": "githubBot.{name} harus berupa array of string.",
198
+ "githubBot.{name} must be a positive integer.": "githubBot.{name} harus bilangan bulat positif.",
199
+ "githubBot.enabled must be a boolean.": "githubBot.enabled harus boolean.",
200
+ "githubBot.path must be an absolute path like /github.": "githubBot.path harus path absolut seperti /github.",
201
+ "githubBot.secretEnv must be a non-empty string.": "githubBot.secretEnv harus string tidak kosong.",
202
+ "Ignored empty command in delivery {id}.": "Mengabaikan perintah kosong di delivery {id}.",
203
+ "Unknown action: {action}. Use serve.": "Aksi tidak dikenal: {action}. Gunakan serve.",
204
+ "gh CLI not found (exit {code}) \u2014 install GitHub CLI before enabling gh-bot.": "gh CLI tidak ditemukan (exit {code}) \u2014 pasang GitHub CLI sebelum mengaktifkan gh-bot.",
205
+ "Unknown action: {action}. Use list, install <spec>, remove <name>, or update [name].": "Aksi tidak dikenal: {action}. Gunakan list, install <spec>, remove <nama>, atau update [nama].",
206
+ "Cannot read the plugin config while running {action}: {reason} at {path} \u2014 no changes were made; fix the config, then retry.": "Tidak bisa membaca config plugin saat menjalankan {action}: {reason} di {path} \u2014 tidak ada perubahan; perbaiki config, lalu coba lagi.",
207
+ "npm install failed ({code}): {stderr}": "npm install gagal ({code}): {stderr}",
208
+ "install requires a package spec: bccli plugins install <spec>": "install butuh spesifikasi paket: bccli plugins install <spec>",
209
+ "Invalid npm package spec: {spec}. Use a name, @scope/name, name@version, or name@tag \u2014 URLs, git, paths, and flags are not accepted.": "Spesifikasi paket npm tidak valid: {spec}. Pakai nama, @scope/nama, nama@versi, atau nama@tag \u2014 URL, git, path, dan flag tidak diterima.",
210
+ "npm finished but the config could not be read: {reason} \u2014 the entry list is unchanged; fix {path}, then rerun the same command (safe to repeat).": "npm selesai tetapi config gagal dibaca: {reason} \u2014 daftar entry tidak berubah; perbaiki {path}, lalu jalankan ulang perintah yang sama (aman diulang).",
211
+ "npm finished but the config update failed: {reason}. {name} stays enabled through its existing entry {entry}; the package files may already be new. Fix the config error at {path} \u2014 no entry change was required.": "npm selesai tetapi pembaruan config gagal: {reason}. {name} tetap aktif lewat entry lama {entry}; file paket mungkin sudah baru. Perbaiki error config di {path} \u2014 tidak ada perubahan entry yang diperlukan.",
212
+ 'npm finished but the config update failed: {reason}. {name} is installed but NOT enabled \u2014 fix the config error, then run "bccli plugins install {name}" again (safe to repeat), or add {entry} to {path} manually.': 'npm selesai tetapi pembaruan config gagal: {reason}. {name} terpasang tetapi TIDAK aktif \u2014 perbaiki error config, lalu jalankan lagi "bccli plugins install {name}" (aman diulang), atau tambahkan {entry} ke {path} secara manual.',
213
+ "{name} is already enabled.": "{name} sudah aktif.",
214
+ "{name} installed and enabled.": "{name} terpasang dan aktif.",
215
+ "Malformed managed entry: {entry} \u2014 fix it manually in {path}; bccli will not pass it to npm.": "Entry terelola rusak: {entry} \u2014 perbaiki manual di {path}; bccli tidak akan meneruskannya ke npm.",
216
+ "{entry} is a manual plugin entry \u2014 edit the global config.json directly to remove it.": "{entry} adalah entry plugin manual \u2014 edit config.json global langsung untuk menghapusnya.",
217
+ "{name} is not an installed managed plugin.": "{name} bukan plugin terelola yang terpasang.",
218
+ "Unknown plugin: {arg}.": "Plugin tidak dikenal: {arg}.",
219
+ "remove requires a plugin name: bccli plugins remove <name>": "remove butuh nama plugin: bccli plugins remove <nama>",
220
+ 'npm removed the files of {name} but the plugin config could not be read: {reason} \u2014 the entry list is unchanged; fix {path}, then run "bccli plugins remove {name}" again (safe to repeat).': 'npm sudah menghapus file {name} tetapi config plugin gagal dibaca: {reason} \u2014 daftar entry tidak berubah; perbaiki {path}, lalu jalankan lagi "bccli plugins remove {name}" (aman diulang).',
221
+ 'npm removed the files of {name} but the config entry {entry} remains: {reason}. bccli will refuse to start while that entry is listed \u2014 fix the config error at {path}, then run "bccli plugins remove {name}" again (safe to repeat), or delete the entry manually.': 'npm sudah menghapus file {name} tetapi entry config {entry} tertinggal: {reason}. bccli menolak start selama entry itu terdaftar \u2014 perbaiki error config di {path}, lalu jalankan lagi "bccli plugins remove {name}" (aman diulang), atau hapus entry secara manual.',
222
+ "Skipping malformed entry: {entry} \u2014 fix it manually in {path}.": "Melewatkan entry rusak: {entry} \u2014 perbaiki manual di {path}.",
223
+ "No managed plugins to update.": "Tidak ada plugin terelola untuk diperbarui.",
224
+ "update requires a plugin name or no argument: bccli plugins update [name]": "update butuh nama plugin atau tanpa argumen: bccli plugins update [nama]",
225
+ "{name} updated to latest.": "{name} diperbarui ke versi terbaru.",
226
+ "Use either --key or --logout, not both.": "Pakai --key atau --logout, jangan keduanya.",
227
+ "Logout is not supported for {id}; use bccli provider remove {id} to delete its stored key and config.": "Logout tidak didukung untuk {id}; pakai bccli provider remove {id} untuk menghapus key dan config tersimpan.",
228
+ "bccli login openrouter needs a terminal. Use --key to paste an API key instead.": "bccli login openrouter butuh terminal. Pakai --key untuk menempel API key.",
229
+ "Could not open the browser automatically \u2014 open this URL manually: {url}": "Tidak bisa membuka browser otomatis \u2014 buka URL ini manual: {url}",
230
+ "Paste the authorization code from the browser: ": "Tempel kode otorisasi dari browser: ",
231
+ "Failed to read the authorization code: {reason}. Your stored credential was not changed.": "Gagal membaca kode otorisasi: {reason}. Credential tersimpan tidak berubah.",
232
+ "Authorization code is empty. Run bccli login openrouter again.": "Kode otorisasi kosong. Jalankan bccli login openrouter lagi.",
233
+ "Login cancelled.": "Login dibatalkan.",
234
+ "The exchange with OpenRouter timed out after {seconds}s. Your stored credential was not changed.": "Pertukaran dengan OpenRouter habis waktu setelah {seconds} dtk. Credential tersimpan tidak berubah.",
235
+ "Could not reach OpenRouter: {reason}. Your stored credential was not changed.": "Tidak bisa menghubungi OpenRouter: {reason}. Credential tersimpan tidak berubah.",
236
+ "Authorization code expired \u2014 codes are valid for 10 minutes. Run bccli login openrouter again.": "Kode otorisasi kedaluwarsa \u2014 kode berlaku 10 menit. Jalankan bccli login openrouter lagi.",
237
+ "OpenRouter rejected the authorization code (403): {detail}. Run bccli login openrouter again.": "OpenRouter menolak kode otorisasi (403): {detail}. Jalankan bccli login openrouter lagi.",
238
+ "OpenRouter did not return an API key in the expected format. Your stored credential was not changed.": "OpenRouter tidak mengembalikan API key dengan format yang diharapkan. Credential tersimpan tidak berubah.",
239
+ "OpenRouter exchange failed ({status}): {detail}. Your stored credential was not changed.": "Pertukaran OpenRouter gagal ({status}): {detail}. Credential tersimpan tidak berubah.",
240
+ "The key was created on your OpenRouter account but could not be saved locally ({reason}). Manage it (copy or revoke) at {dashboard}, then run bccli login openrouter again.": "Key sudah dibuat di akun OpenRouter kamu tetapi gagal disimpan lokal ({reason}). Kelola (salin atau cabut) di {dashboard}, lalu jalankan bccli login openrouter lagi.",
241
+ "Logged in: openrouter credential saved.": "Login berhasil: credential openrouter tersimpan.",
242
+ "Note: {env} is also set in the environment; the stored credential takes priority and {env} is only the fallback.": "Catatan: {env} juga ter-set di environment; credential tersimpan lebih diutamakan dan {env} hanya cadangan.",
243
+ "Verify with: bccli models openrouter (your key is never printed).": "Verifikasi dengan: bccli models openrouter (key kamu tidak pernah dicetak).",
244
+ "openrouter credential removed.": "credential openrouter dihapus.",
245
+ "openrouter credential was not stored.": "credential openrouter tidak tersimpan.",
246
+ "Note: {env} is still set in the environment and will keep being used.": "Catatan: {env} masih ter-set di environment dan akan terus dipakai.",
247
+ "To revoke keys on your account, open {dashboard}.": "Untuk mencabut key akun kamu, buka {dashboard}.",
248
+ "Budget exceeded ({kind}): {used} of {limit}. Further model calls are blocked; raise usageCap in ~/.bccli/config.json.": "Anggaran terlampaui ({kind}): {used} dari {limit}. Panggilan model selanjutnya diblokir; naikkan usageCap di ~/.bccli/config.json.",
249
+ "Could not save thinking visibility: {error}": "Gagal menyimpan pengaturan tampilan Thinking: {error}",
250
+ "Verifying edits: {cmds}": "Memverifikasi edit: {cmds}",
251
+ "Verification passed.": "Verifikasi lulus.",
252
+ "Verification still failing after {n} fix round(s). Run the commands manually to see why.": "Verifikasi masih gagal setelah {n} ronde perbaikan. Jalankan perintahnya secara manual untuk melihat penyebabnya.",
253
+ "Automatic verification after your edits failed. Fix the problems so these commands pass, then stop.\n\n{blocks}": "Verifikasi otomatis setelah editmu gagal. Perbaiki masalahnya agar perintah-perintah ini lulus, lalu berhenti.\n\n{blocks}",
254
+ "keybinds must be an object mapping action to binding.": "keybinds harus berupa objek yang memetakan aksi ke binding.",
255
+ 'Keybind for "{action}" must be a string like "ctrl+t".': 'Keybind untuk "{action}" harus string seperti "ctrl+t".',
256
+ 'Keybind "{spec}" for "{action}" is invalid: use ctrl or alt plus one letter, e.g. "ctrl+t".': 'Keybind "{spec}" untuk "{action}" tidak valid: gunakan ctrl atau alt plus satu huruf, mis. "ctrl+t".',
257
+ 'Unknown keybind action "{action}". Known actions: {list}.': 'Aksi keybind "{action}" tidak dikenal. Aksi yang dikenal: {list}.',
258
+ "Plugin not found: {spec}": "Plugin tidak ditemukan: {spec}",
259
+ "Plugin failed to load: {spec}: {reason}": "Plugin gagal dimuat: {spec}: {reason}",
260
+ "Plugin {spec} registered a tool name that is already in use: {name}": "Plugin {spec} mendaftarkan nama tool yang sudah terpakai: {name}",
261
+ "--permission-mode must be one of: {modes}": "--permission-mode harus salah satu dari: {modes}",
262
+ "Plan needs approval; run with --allow-all.": "Rencana butuh persetujuan; jalankan dengan --allow-all.",
263
+ "Step limit reached.": "Batas langkah tercapai.",
264
+ "Needs permission for {tool}. Run with --allow-all or --allowed-tools {kind}.": "Butuh izin untuk {tool}. Jalankan dengan --allow-all atau --allowed-tools {kind}.",
265
+ "--lang must be one of: en, id": "--lang harus salah satu dari: en, id",
266
+ "--output-format must be one of: {formats}": "--output-format harus salah satu dari: {formats}",
267
+ "Invalid config: {path} ({error})": "Config tidak valid: {path} ({error})",
268
+ "maxSteps must be a positive number, or 0/null to disable the limit.": "maxSteps harus berupa angka positif, atau 0/null untuk menonaktifkan batas.",
269
+ "sessionRetentionDays must be a positive number of days, or 0/null to keep sessions.": "sessionRetentionDays harus berupa jumlah hari positif, atau 0/null untuk menyimpan sesi.",
270
+ "Hook {event} failed: {reason}": "Hook {event} gagal: {reason}",
271
+ "list background tasks": "daftar tugas latar belakang",
272
+ "Nothing to rewind.": "Tidak ada yang bisa di-rewind.",
273
+ "Rewound {n} turn(s): the conversation continues from before them.": "{n} giliran di-rewind: percakapan dilanjutkan dari sebelum giliran itu.",
274
+ "step back turns: conversation and file edits (/rewind 2)": "mundur beberapa giliran: percakapan + edit file (/rewind 2)",
275
+ "review a pull request (/pr <n|url|branch>)": "review pull request (/pr <n|url|branch>)",
276
+ "Model must be in provider/model format, e.g. bc-cloud/glm-5.3-flash (got: {ref})": "Model harus berformat provider/model, contoh bc-cloud/glm-5.3-flash (dapat: {ref})",
277
+ 'Provider "{id}" is not in the config. Available: {list}': 'Provider "{id}" tidak ada di config. Tersedia: {list}',
278
+ "No API key for {id} yet. Run `bccli login` or set the env var {env}.": "API key untuk {id} belum ada. Jalankan `bccli login` atau set env {env}.",
279
+ "Error from the provider: {message}": "Error dari provider: {message}",
280
+ "Cannot connect to {url}: {error}": "Tidak bisa terhubung ke {url}: {error}",
281
+ "{status} from {url}: {message}": "{status} dari {url}: {message}",
282
+ "Request failed": "Permintaan gagal",
283
+ "Connection closed before the response finished.": "Koneksi ditutup sebelum respons selesai.",
284
+ "WebSocket connection failed.": "Koneksi WebSocket gagal.",
285
+ "WebSocket connection closed: {reason}": "Koneksi WebSocket ditutup: {reason}",
286
+ "Empty response from the provider": "Respons provider kosong",
287
+ "{status} while fetching the model list": "{status} saat mengambil daftar model",
288
+ "The API key was rejected or {provider} could not be reached.": "API key ditolak atau {provider} tidak bisa dihubungi.",
289
+ "Usage: bccli provider {action} <id>": "Pemakaian: bccli provider {action} <id>",
290
+ "{id} removed.": "{id} dihapus.",
291
+ "Unknown action: {action}. Use list, add, or remove.": "Aksi tidak dikenal: {action}. Pakai list, add, atau remove.",
292
+ "Unknown action: {action}. Use list, add, remove, auth, logout, or serve.": "Aksi tidak dikenal: {action}. Pakai list, add, remove, auth, logout, atau serve.",
293
+ "OAuth required for {name}: run bccli mcp auth {name}": "OAuth diperlukan untuk {name}: jalankan bccli mcp auth {name}",
294
+ "{name} is not an installed HTTP MCP server. Add it first with: bccli mcp add {name} --url <url>": "{name} bukan server MCP HTTP yang terpasang. Tambahkan dulu: bccli mcp add {name} --url <url>",
295
+ "{name} authorized. Active in the next bccli session.": "{name} terautorisasi. Aktif di sesi bccli berikutnya.",
296
+ "OAuth login failed for {name}: {reason}": "Login OAuth gagal untuk {name}: {reason}",
297
+ "{name} logged out.": "{name} telah logout.",
298
+ "{name} has no stored OAuth tokens.": "{name} tidak menyimpan token OAuth.",
299
+ "{id} is not a preset. For a custom provider add --url <OpenAI-compatible base URL>.": "{id} bukan preset. Untuk provider custom tambahkan --url <base URL OpenAI-compatible>.",
300
+ "API key for {id} (leave empty if not needed): ": "API key untuk {id} (kosongkan bila tidak perlu): ",
301
+ "{id} is ready. {n} models available.": "{id} siap. {n} model tersedia.",
302
+ "Usage: bccli mcp {action} <name>": "Pemakaian: bccli mcp {action} <nama>",
303
+ "{name} removed.": "{name} dihapus.",
304
+ "{name} installed ({url}).": "{name} terpasang ({url}).",
305
+ "{name} is not in the catalog. For another remote server use: bccli mcp add {name} --url <url>": "{name} tidak ada di katalog. Untuk server remote lain pakai: bccli mcp add {name} --url <url>",
306
+ "{name} installed. Active in the next bccli session.": "{name} terpasang. Aktif di sesi bccli berikutnya.",
307
+ "control a browser (open pages, click, fill forms, screenshot)": "kontrol browser (buka halaman, klik, isi form, screenshot)",
308
+ "up-to-date library documentation": "dokumentasi library terbaru",
309
+ "fetch web pages as markdown (needs uv)": "ambil halaman web jadi markdown (butuh uv)",
310
+ "access folders outside the project": "akses folder di luar project",
311
+ "Folder the server may access": "Folder yang boleh diakses",
312
+ "structured git operations (needs uv)": "operasi git terstruktur (butuh uv)",
313
+ "GitHub issues, PRs, and repos": "issue, PR, dan repo GitHub",
314
+ "Missing MCP fields: {fields}": "Isian MCP belum lengkap: {fields}",
315
+ "Invalid MCP file: {path} ({error})": "File MCP tidak valid: {path} ({error})",
316
+ "could not be reached": "tidak bisa dihubungi",
317
+ "{label} must be one of: {levels}": "{label} harus salah satu dari: {levels}",
318
+ "This provider has no manual reasoning setting yet. Use Auto.": "Provider ini belum memiliki kontrak reasoning manual. Gunakan Auto.",
319
+ "This model/provider does not support reasoning level '{level}'. Use Auto{supported}.": "Model/provider ini tidak mendukung reasoning level '{level}'. Gunakan Auto{supported}.",
320
+ '-p mode needs a task, e.g. bccli -p "explain this repo"': 'Mode -p butuh tugas, contoh: bccli -p "jelaskan repo ini"',
321
+ 'Project MCP server "{name}" skipped (not approved yet; run interactive bccli once to approve it).': 'Server MCP project "{name}" dilewati (belum diizinkan; jalankan bccli interaktif sekali untuk menyetujuinya).',
322
+ 'Interactive mode needs a terminal. For scripts/CI use: bccli -p "task"': 'Mode interaktif butuh terminal. Untuk skrip/CI pakai: bccli -p "tugas"',
323
+ "Agent must be one of: opencode, aider, cline, deepseek-harness (dsh), cursor, openai-cli, openai-sdk, openai-compatible, codex, claude-code, openclaw, hermes": "Agent harus salah satu dari: opencode, aider, cline, deepseek-harness (dsh), cursor, openai-cli, openai-sdk, openai-compatible, codex, claude-code, openclaw, hermes",
324
+ "Cannot determine the home directory.": "Home directory tidak dapat ditentukan.",
325
+ "No BotConnector API key yet. Run bccli login bc-cloud first.": "API key BotConnector belum tersedia. Jalankan bccli login bc-cloud terlebih dahulu.",
326
+ "Could not load the BotConnector model catalog (HTTP {status}).": "Katalog model BotConnector gagal dimuat (HTTP {status}).",
327
+ "The BotConnector model catalog is empty; cannot configure external agents.": "Katalog model BotConnector kosong; agent eksternal tidak dapat dikonfigurasi.",
328
+ "The OpenCode config is not valid JSON: {path}": "Config OpenCode tidak valid JSON: {path}",
329
+ "OpenCode is connected to BotConnector ({n} models).": "OpenCode terhubung ke BotConnector ({n} model).",
330
+ "The Aider config already has its own env-file/openai-api settings: {path}. BCCLI will not overwrite them.": "Config Aider sudah memiliki env-file/openai-api setting sendiri: {path}. BCCLI tidak akan menimpanya.",
331
+ "Aider is connected to BotConnector.": "Aider terhubung ke BotConnector.",
332
+ "The BotConnector catalog has no model that external agents can use.": "Katalog BotConnector tidak memiliki model yang dapat dipakai agent eksternal.",
333
+ "The Cline config is not valid JSON: {path}": "Config Cline tidak valid JSON: {path}",
334
+ "Cline already uses another openai-compatible provider ({base}). BCCLI will not overwrite it; disconnect or change that provider first.": "Cline sudah memakai provider openai-compatible lain ({base}). BCCLI tidak akan menimpanya; disconnect/ubah provider tersebut lebih dulu.",
335
+ "Cline is connected to BotConnector ({n} models available; default {model}).": "Cline terhubung ke BotConnector ({n} model tersedia; default {model}).",
336
+ "The DeepSeek Harness config is not valid YAML: {path}": "Config DeepSeek Harness tidak valid YAML: {path}",
337
+ 'DeepSeek Harness already has a provider "{id}" with a different endpoint.': 'DeepSeek Harness sudah memiliki provider "{id}" dengan endpoint lain.',
338
+ "$DSH_HOME/.env already has BOTCONNECTOR_API_KEY outside the BCCLI block: {path}": "$DSH_HOME/.env sudah memiliki BOTCONNECTOR_API_KEY di luar blok BCCLI: {path}",
339
+ "DeepSeek Harness is connected to BotConnector ({n} models).": "DeepSeek Harness terhubung ke BotConnector ({n} model).",
340
+ "Equivalent long form: dsh --profile web": "Bentuk panjang yang setara: dsh --profile web",
341
+ "The launcher does not store the API key in the script; the key is read from BCCLI storage when it runs.": "Launcher tidak menyimpan API key di dalam script; key dibaca dari storage BCCLI saat dijalankan.",
342
+ "The Python and Node OpenAI SDKs can read OPENAI_BASE_URL and OPENAI_API_KEY from this profile.": "Python dan Node OpenAI SDK dapat membaca OPENAI_BASE_URL dan OPENAI_API_KEY dari profile ini.",
343
+ "BCCLI does not edit Cursor\u2019s internal storage because that override format is not a stable external configuration.": "BCCLI tidak mengedit storage internal Cursor karena format override tersebut bukan konfigurasi eksternal yang stabil.",
344
+ "The BotConnector catalog has no model for external coding agents.": "Katalog BotConnector tidak memiliki model untuk coding agent eksternal.",
345
+ "Codex already has botconnector.config.toml. BCCLI will not overwrite it.": "Codex sudah memiliki botconnector.config.toml. BCCLI tidak akan menimpanya.",
346
+ "Codex CLI is connected to the BotConnector Responses API.": "Codex CLI terhubung ke BotConnector Responses API.",
347
+ "Claude Code is connected to the BotConnector Anthropic Messages compatibility API.": "Claude Code terhubung ke BotConnector Anthropic Messages compatibility API.",
348
+ 'OpenClaw already has a provider "{id}" with a different endpoint ({base}). BCCLI will not overwrite it; disconnect or change that provider first.': 'OpenClaw sudah memiliki provider "{id}" dengan endpoint lain ({base}). BCCLI tidak akan menimpanya; disconnect/ubah provider tersebut lebih dulu.',
349
+ "The OpenClaw config is not valid JSON: {path}": "Config OpenClaw tidak valid JSON: {path}",
350
+ "OpenClaw is connected to BotConnector ({n} models; default {model}).": "OpenClaw terhubung ke BotConnector ({n} model; default {model}).",
351
+ "API key: env {env} (SecretRef, not stored in the config).": "API key: env {env} (SecretRef, tidak disimpan di config).",
352
+ "Set the default model in OpenClaw with: openclaw models set {provider}/{model}": "Atur model default di OpenClaw dengan: openclaw models set {provider}/{model}",
353
+ "The Hermes config is not valid YAML: {path}": "Config Hermes tidak valid YAML: {path}",
354
+ 'Hermes already has a provider "{id}" with a different endpoint ({base}). BCCLI will not overwrite it; disconnect or change that provider first.': 'Hermes sudah memiliki provider "{id}" dengan endpoint lain ({base}). BCCLI tidak akan menimpanya; disconnect/ubah provider tersebut lebih dulu.',
355
+ "Hermes is connected to BotConnector ({n} models; default {model}).": "Hermes terhubung ke BotConnector ({n} model; default {model}).",
356
+ "API key: env {env} only (via key_env; a plaintext key in config.yaml is never written).": "API key: hanya env {env} (melalui key_env; key plaintext tidak pernah ditulis ke config.yaml).",
357
+ "{target}: not managed by BCCLI yet.": "{target}: belum dikelola oleh BCCLI.",
358
+ "{target}: the BotConnector integration was removed and the config restored.": "{target}: integrasi BotConnector dilepas dan config dipulihkan.",
359
+ "Custom commands:": "Perintah custom:",
360
+ "Skills:": "Skill:",
361
+ "shift+tab switch permission mode esc cancel the turn": "shift+tab ganti mode izin esc batalkan giliran",
362
+ "{bind} full output of the last tool \\ + enter new line": "{bind} output alat terakhir lengkap \\ + enter baris baru",
363
+ "{bind} show/hide the model\u2019s thinking": "{bind} buka/tutup thinking model",
364
+ "@file + tab complete file names \u2191\u2193 input history": "@file + tab lengkapi nama file \u2191\u2193 riwayat input",
365
+ "custom command": "perintah custom",
366
+ "skill \xB7 {description}": "skill \xB7 {description}",
367
+ "Conversation cleared.": "Percakapan dikosongkan.",
368
+ "Could not summarize: {error}": "Gagal meringkas: {error}",
369
+ "Reasoning: {level} (saved as default)": "Reasoning: {level} (tersimpan sebagai default)",
370
+ "not supported by this provider": "tidak didukung provider ini",
371
+ "Model: {model} (saved as default)": "Model: {model} (tersimpan sebagai default)",
372
+ "Cannot fetch the model list: {error}": "Tidak bisa mengambil daftar model: {error}",
373
+ "New session started. The previous session stays saved (/resume).": "Sesi baru dimulai. Sesi sebelumnya tetap tersimpan (/resume).",
374
+ "No other sessions in this folder yet.": "Belum ada sesi lain di folder ini.",
375
+ "Continue a session": "Lanjutkan sesi",
376
+ "(empty)": "(kosong)",
377
+ "{n} messages": "{n} pesan",
378
+ "Resuming the session ({messages} messages saved \xB7 {chat} user/assistant chats shown).": "Melanjutkan sesi ({messages} pesan tersimpan \xB7 {chat} chat user/assistant ditampilkan).",
379
+ "Checking\u2026": "Memeriksa\u2026",
380
+ "No saved permissions yet. Permissions from [a] answers and from the config will appear here.": "Belum ada izin tersimpan. Izin dari jawaban [a] dan dari config akan muncul di sini.",
381
+ "Active permissions (enter: revoke a session permission)": "Izin aktif (enter: cabut izin sesi)",
382
+ "this session": "sesi ini",
383
+ "{rule} comes from the config/flag; remove it from ~/.bccli/config.json to revoke it.": "{rule} berasal dari config/flag; hapus dari ~/.bccli/config.json untuk mencabutnya.",
384
+ "Permission {rule} revoked.": "Izin {rule} dicabut.",
385
+ "{path} ({lines} lines)": "{path} ({lines} baris)",
386
+ "No AGENTS.md / BCCLI.md yet. Add one with /memory <text>.": "Belum ada AGENTS.md / BCCLI.md. Tambah dengan /memory <teks>.",
387
+ "Write the text: /memory global <text>.": "Tulis teksnya: /memory global <teks>.",
388
+ "Could not write {file}: {error}": "Gagal menulis {file}: {error}",
389
+ "Added to {file}.": "Ditambahkan ke {file}.",
390
+ "API key for {provider}": "API key untuk {provider}",
391
+ "Key for {provider} saved \xB7 {n} models.": "Key {provider} tersimpan \xB7 {n} model.",
392
+ "Stored key deleted, but {env} is still set in the environment and is still used.": "Key tersimpan dihapus, tapi {env} masih ada di environment dan tetap dipakai.",
393
+ "No stored key; {env} is still set in the environment and is still used.": "Tidak ada key tersimpan; {env} masih ada di environment dan tetap dipakai.",
394
+ "No stored key for {provider}.": "Tidak ada key tersimpan untuk {provider}.",
395
+ "Key for {provider} deleted. Use /login or /provider to add one again.": "Key {provider} dihapus. Pakai /login atau /provider untuk menambah lagi.",
396
+ "No file edits to undo.": "Tidak ada edit file yang bisa dibatalkan.",
397
+ "No file edits to redo.": "Tidak ada edit file yang bisa di-redo.",
398
+ "Re-applied: {files}": "Diterapkan ulang: {files}",
399
+ "Deleted again: {files}": "Dihapus lagi: {files}",
400
+ "Could not restore: {files}": "Gagal dikembalikan: {files}",
401
+ "Restored: {files}": "Dikembalikan: {files}",
402
+ "Deleted (new files): {files}": "Dihapus (file baru): {files}",
403
+ "Too large to back up, left unchanged: {files}": "Terlalu besar untuk disimpan, tidak diubah: {files}",
404
+ "Note: changes made through bash commands cannot be undone.": "Catatan: perubahan lewat perintah bash tidak bisa di-undo.",
405
+ "No answer to copy yet.": "Belum ada jawaban untuk disalin.",
406
+ "Copied to the clipboard (if the terminal supports OSC 52) and saved to {file}.": "Disalin ke clipboard (bila terminal mendukung OSC 52) dan disimpan di {file}.",
407
+ "{file} already exists. Overwrite? (y/N)": "{file} sudah ada. Timpa? (y/N)",
408
+ "Export cancelled.": "Ekspor dibatalkan.",
409
+ "BCCLI session {when}": "Sesi BCCLI {when}",
410
+ "Conversation saved to {file}.": "Percakapan disimpan di {file}.",
411
+ "Unknown command: /{name}. Type /help.": "Perintah tidak dikenal: /{name}. Ketik /help.",
412
+ "Skill {name} cannot be read: {error}": "Skill {name} tidak bisa dibaca: {error}",
413
+ "{n} queued messages cancelled.": "{n} pesan antrian dibatalkan.",
414
+ "MCP {name} removed.": "MCP {name} dihapus.",
415
+ "MCP {name} installed, connecting\u2026": "MCP {name} dipasang, menghubungkan\u2026",
416
+ "MCP {name} active \xB7 {n} tools.": "MCP {name} aktif \xB7 {n} alat.",
417
+ "MCP {name} failed: {error}": "MCP {name} gagal: {error}",
418
+ "unknown": "tidak diketahui",
419
+ " \u23F3 queued: {q}": " \u23F3 antri: {q}",
420
+ "Thinking": "Berpikir",
421
+ "Cancelling": "Membatalkan",
422
+ "Language: {lang}. Change it with /language en or /language id.": "Bahasa: {lang}. Ganti dengan /language en atau /language id.",
423
+ 'Unknown language "{lang}". Use en or id.': 'Bahasa "{lang}" tidak dikenal. Pakai en atau id.',
424
+ "Could not save the language: {error}": "Gagal menyimpan bahasa: {error}",
425
+ "Language set to {lang} (saved as default).": "Bahasa diatur ke {lang} (tersimpan sebagai default).",
426
+ "The model got stuck repeating text, so the answer was stopped. Try again or switch models with /model.": "Model terjebak mengulang teks, jawaban dihentikan. Coba ulangi atau ganti model dengan /model.",
427
+ "This model may not support tool calling. Try another model with /model.": "Model ini sepertinya tidak mendukung tool calling. Coba model lain dengan /model.",
428
+ "{lines} lines written": "{lines} baris ditulis",
429
+ "{n} lines": "{n} baris",
430
+ "{n} results": "{n} hasil",
431
+ "{steps} steps \xB7 {tokens} tokens": "{steps} langkah \xB7 {tokens} token",
432
+ "plan": "rencana",
433
+ "~{n} tokens": "~{n} token",
434
+ "focused excerpt \xB7 cache": "kutipan fokus \xB7 cache",
435
+ "focused excerpt (Keenable)": "kutipan fokus (Keenable)",
436
+ "focused excerpt (local)": "kutipan fokus (lokal)",
437
+ "over 5 MB, truncated": "lebih dari 5 MB, dipotong",
438
+ "{n} characters": "{n} karakter",
439
+ "{input} tokens in \xB7 {output} tokens out": "{input} token masuk \xB7 {output} token keluar",
440
+ "Run: dsh web": "Jalankan: dsh web",
441
+ "timeout after {n} seconds": "timeout {n} detik",
442
+ "Could not start MCP servers: {error}": "Tidak bisa menjalankan server MCP: {error}",
443
+ "Blocked: {host} resolves to a private address ({addr}). Fetching an internal host through a public DNS name is not allowed.": "Diblokir: {host} mengarah ke alamat privat ({addr}). Mengambil host internal lewat nama DNS publik tidak diizinkan.",
444
+ "usage: bccli completion <{shells}>": "pakai: bccli completion <{shells}>",
445
+ "--days must be a positive integer": "--days harus bilangan bulat positif",
446
+ "--tools must be a positive integer": "--tools harus bilangan bulat positif",
447
+ '--models must be a positive integer or "all"': '--models harus bilangan bulat positif atau "all"',
448
+ "no sessions in the last {days} day(s)": "tidak ada sesi dalam {days} hari terakhir",
449
+ "sessions (last {days} day(s)):": "sesi ({days} hari terakhir):",
450
+ "session(s)": "sesi",
451
+ "message(s)": "pesan",
452
+ "no session to export in this folder": "tidak ada sesi untuk diekspor di folder ini",
453
+ "exported {file}": "diekspor ke {file}",
454
+ "file not found: {file}": "file tidak ditemukan: {file}",
455
+ "invalid session file (non-JSON line): {file}": "file sesi tidak valid (baris bukan JSON): {file}",
456
+ "imported {n} record(s) into {file}": "impor {n} rekaman ke {file}",
457
+ "usage: bccli pr <number> [--repo owner/name] [task]": "pakai: bccli pr <nomor> [--repo owner/name] [tugas]",
458
+ "gh is not available ({error}); install GitHub CLI first": "gh tidak tersedia ({error}); pasang GitHub CLI dulu",
459
+ "gh pr checkout {n} failed (exit {code})": "gh pr checkout {n} gagal (exit {code})",
460
+ "checked out PR #{n}": "checkout PR #{n} selesai",
461
+ "--allow-all: the PR task runs every tool without asking": "--allow-all: tugas PR menjalankan semua alat tanpa bertanya"
462
+ };
463
+
464
+ // src/i18n.ts
465
+ var LANGS = ["en", "id"];
466
+ var current = "en";
467
+ function parseLang(value) {
468
+ const v = value?.trim().toLowerCase().split(/[-_.]/)[0];
469
+ return LANGS.includes(v ?? "") ? v : void 0;
470
+ }
471
+ function setLanguage(lang) {
472
+ current = lang;
473
+ }
474
+ function getLanguage() {
475
+ return current;
476
+ }
477
+ var locale = () => current === "id" ? "id-ID" : "en-US";
478
+ function t(en, params) {
479
+ const template = current === "id" ? ID[en] ?? en : en;
480
+ return params ? template.replace(/\{(\w+)\}/g, (match, key) => key in params ? String(params[key]) : match) : template;
481
+ }
482
+ function langFromArgv(argv) {
483
+ for (let i = 0; i < argv.length; i++) {
484
+ if (argv[i] === "--lang") return parseLang(argv[i + 1]);
485
+ if (argv[i].startsWith("--lang=")) return parseLang(argv[i].slice(7));
486
+ }
487
+ return void 0;
488
+ }
489
+ function resolveLanguage(argv, env, fromConfig) {
490
+ return langFromArgv(argv) ?? parseLang(env.BCCLI_LANG) ?? parseLang(fromConfig) ?? "en";
491
+ }
492
+
493
+ export {
494
+ parseLang,
495
+ setLanguage,
496
+ getLanguage,
497
+ locale,
498
+ t,
499
+ resolveLanguage
500
+ };
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ hasKey,
4
+ providerName
5
+ } from "./chunk-SPRNLS7K.js";
6
+ import {
7
+ createProvider
8
+ } from "./chunk-PUN4HMAG.js";
9
+ import {
10
+ PRESETS,
11
+ readCredentials
12
+ } from "./chunk-LACUWBWS.js";
13
+ import {
14
+ t
15
+ } from "./chunk-UZWJQF67.js";
16
+
17
+ // src/models.ts
18
+ function order(ids) {
19
+ const presetIds = PRESETS.map((p) => p.id);
20
+ const presets = presetIds.filter((id) => ids.includes(id));
21
+ const custom = ids.filter((id) => !presetIds.includes(id)).sort();
22
+ return [...presets, ...custom];
23
+ }
24
+ async function listAllModels(config, env = process.env, opts = {}) {
25
+ const timeoutMs = opts.timeoutMs ?? 5e3;
26
+ const baseFetch = opts.fetch ?? fetch;
27
+ const untrusted = new Set(config.projectProviders ?? []);
28
+ const ids = order(Object.keys(config.providers)).filter((id) => opts.only ? id === opts.only : !untrusted.has(id) && hasKey(config, id, env));
29
+ const results = await Promise.all(
30
+ ids.map(async (id) => {
31
+ const provider = config.providers[id];
32
+ const apiKey = (opts.keyOverride && id === opts.only ? opts.keyOverride : void 0) || readCredentials(env)[id] || (provider.apiKeyEnv ? env[provider.apiKeyEnv] : void 0) || void 0;
33
+ const local = !provider.apiKeyEnv;
34
+ const timedFetch = ((input, init) => baseFetch(input, { ...init, signal: AbortSignal.timeout(timeoutMs) }));
35
+ const list = createProvider({ baseURL: provider.baseURL.replace(/\/+$/, ""), apiKey, model: "", fetch: timedFetch }).listModels();
36
+ let timer;
37
+ const timeout = new Promise((_, reject) => {
38
+ timer = setTimeout(() => reject(new Error("timeout")), timeoutMs);
39
+ });
40
+ try {
41
+ const models = await Promise.race([list, timeout]);
42
+ return { providerId: id, providerName: providerName(config, id), models };
43
+ } catch {
44
+ if (local && !opts.only) return void 0;
45
+ return { providerId: id, providerName: providerName(config, id), models: [], error: t("could not be reached") };
46
+ } finally {
47
+ clearTimeout(timer);
48
+ }
49
+ })
50
+ );
51
+ return results.filter((g) => !!g);
52
+ }
53
+
54
+ export {
55
+ listAllModels
56
+ };