@botconnector/bccli 0.4.0-beta.4 → 0.4.0-beta.41

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 (46) hide show
  1. package/README.md +80 -1
  2. package/dist/acp-SZWZ5EE4.js +114 -0
  3. package/dist/args-4SMOHFN5.js +13 -0
  4. package/dist/chunk-3HCOAJEQ.js +190 -0
  5. package/dist/chunk-AS7VV7D3.js +195 -0
  6. package/dist/{chunk-NGLKANMD.js → chunk-AVB6M4JE.js} +24 -2
  7. package/dist/chunk-BUHWQU3V.js +231 -0
  8. package/dist/chunk-DBHDZ5EP.js +723 -0
  9. package/dist/{chunk-GW36UMHZ.js → chunk-DSFHN5CH.js} +2 -2
  10. package/dist/chunk-EQQTTE2K.js +8 -0
  11. package/dist/{chunk-ELML4KVQ.js → chunk-GAFJEQTJ.js} +32 -2
  12. package/dist/chunk-GGNXHJL6.js +884 -0
  13. package/dist/chunk-HE33XAPZ.js +341 -0
  14. package/dist/{chunk-UESQNU4A.js → chunk-ISCT3PN3.js} +14 -9
  15. package/dist/chunk-JROUQ5YS.js +76 -0
  16. package/dist/chunk-LN32JIZR.js +56 -0
  17. package/dist/chunk-M23QBX3V.js +419 -0
  18. package/dist/chunk-M4IYXI3V.js +2125 -0
  19. package/dist/chunk-M7LLJQ7M.js +310 -0
  20. package/dist/chunk-NI5JZUZ3.js +63 -0
  21. package/dist/chunk-PSO7R5AD.js +10 -0
  22. package/dist/{chunk-U7DLMVPZ.js → chunk-SESBH44L.js} +2 -1
  23. package/dist/{chunk-SJH3YLW4.js → chunk-VM7HYAJS.js} +4 -1
  24. package/dist/cli.js +94 -1278
  25. package/dist/{config-NPSYFAFD.js → config-C4KLLDC6.js} +5 -2
  26. package/dist/integrationCli-HR7CDUSI.js +685 -0
  27. package/dist/{login-F4G5QXOU.js → login-T5S6SPZA.js} +1 -1
  28. package/dist/{mcpCli-Q2H63ISP.js → mcpCli-5QTXH7XJ.js} +42 -9
  29. package/dist/modelsCli-DKTT3UZD.js +36 -0
  30. package/dist/providerCli-DDH4ZZUY.js +15 -0
  31. package/dist/sdk.js +5179 -0
  32. package/dist/serve-I2VQUTHR.js +178 -0
  33. package/dist/serve-KQ35P4W3.js +514 -0
  34. package/dist/session-H2YL5RSB.js +12 -0
  35. package/dist/setup-45WQXUBK.js +23 -0
  36. package/dist/ui-S4QFJJIB.js +2280 -0
  37. package/dist/update-VBDEHHMR.js +109 -0
  38. package/package.json +24 -3
  39. package/dist/args-FCLPQ7TO.js +0 -11
  40. package/dist/chunk-C5AFWX7H.js +0 -328
  41. package/dist/chunk-OSWQPSA4.js +0 -252
  42. package/dist/chunk-RZUJYAQV.js +0 -112
  43. package/dist/chunk-UN7QXPCB.js +0 -82
  44. package/dist/providerCli-MXV6PD6F.js +0 -11
  45. package/dist/session-7UB77CEG.js +0 -9
  46. package/dist/ui-7FXPXXGN.js +0 -1333
@@ -0,0 +1,419 @@
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
+ "esc to cancel": "esc batal",
30
+ "/ for commands": "/ perintah",
31
+ "\u2026 {n} earlier steps": "\u2026 {n} langkah sebelumnya",
32
+ "\u2717 failed": "\u2717 gagal",
33
+ "\u2713 done": "\u2713 selesai",
34
+ "\u2026 {n} more lines ({bind})": "\u2026 {n} baris lagi ({bind})",
35
+ "No sessions in this folder yet; starting a new one.": "Belum ada sesi di folder ini; memulai sesi baru.",
36
+ "Session number (enter = new): ": "Nomor sesi (enter = baru): ",
37
+ 'This repo wants to run the MCP server "{name}" ({what}). Allow? [y/N] ': 'Repo ini ingin menjalankan server MCP "{name}" ({what}). Izinkan? [y/N] ',
38
+ "Conversation summarized to fit the model context.": "Percakapan diringkas agar muat di konteks model.",
39
+ 'Step limit of {n} reached. Type "continue" to keep going.': 'Batas {n} langkah tercapai. Ketik "lanjut" untuk meneruskan.',
40
+ "Cancelled.": "Dibatalkan.",
41
+ "Permission mode: {mode}": "Mode izin: {mode}",
42
+ "Folder: {cwd}": "Folder: {cwd}",
43
+ "MCP: {ready} active, {errors} errors": "MCP: {ready} aktif, {errors} error",
44
+ "Session tokens: {input} in \xB7 {output} out": "Token sesi: {input} masuk \xB7 {output} keluar",
45
+ "Context: ~{pct}% of 128k": "Konteks: \xB1{pct}% dari 128k",
46
+ "{name} \u2014 {description} \xB7 tools: {tools} \xB7 model: {model}": "{name} \u2014 {description} \xB7 alat: {tools} \xB7 model: {model}",
47
+ "all": "semua",
48
+ "same as main": "ikut utama",
49
+ "(no skills)": "(tidak ada skill)",
50
+ "(no custom commands)": "(tidak ada perintah custom)",
51
+ "Skills": "Skill",
52
+ "Custom commands": "Perintah custom",
53
+ "Started: {when}": "Mulai: {when}",
54
+ "{messages} messages \xB7 {input} tokens in \xB7 {output} out": "{messages} pesan \xB7 {input} token masuk \xB7 {output} keluar",
55
+ "File: {file}": "File: {file}",
56
+ "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.",
57
+ "This folder is not a git repository, so there is no diff.": "Folder ini bukan repository git, jadi tidak ada diff.",
58
+ "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.",
59
+ "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.",
60
+ "This folder is not a git repository, so -w cannot create a worktree.": "Folder ini bukan repository git, jadi -w tidak bisa membuat worktree.",
61
+ '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).',
62
+ "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.",
63
+ "Git worktrees:": "Git worktree:",
64
+ "Create one with: bccli -w <name>": "Buat dengan: bccli -w <nama>",
65
+ "Remove with: git worktree remove <path>": "Hapus dengan: git worktree remove <path>",
66
+ "list git worktrees; create one with bccli -w <name>": "daftar git worktree; buat dengan bccli -w <nama>",
67
+ "No uncommitted changes.": "Tidak ada perubahan yang belum di-commit.",
68
+ "\u2026 {n} more lines": "\u2026 {n} baris lagi",
69
+ "New files (untracked): {files}": "File baru (belum di-track): {files}",
70
+ "\u2717 Node {version} (needs \u2265 22)": "\u2717 Node {version} (butuh \u2265 22)",
71
+ "\u25CB {name} (no key yet)": "\u25CB {name} (belum ada key)",
72
+ "\u2713 Connection {provider} ({n} models)": "\u2713 Koneksi {provider} ({n} model)",
73
+ "\u2717 Connection {provider}: {error}": "\u2717 Koneksi {provider}: {error}",
74
+ "list of commands and shortcuts": "daftar perintah dan pintasan",
75
+ "change model": "ganti model",
76
+ "set reasoning: auto/off/low/medium/high/max": "atur reasoning: auto/off/low/medium/high/max",
77
+ "add/choose an AI provider": "tambah/pilih provider AI",
78
+ "install/manage MCP servers": "pasang/kelola server MCP",
79
+ "new session (the old one stays saved)": "sesi baru (sesi lama tetap tersimpan)",
80
+ "continue another session in this folder": "lanjutkan sesi lain di folder ini",
81
+ "info about this session": "info sesi ini",
82
+ "version, model, permission mode, MCP, context": "versi, model, mode izin, MCP, konteks",
83
+ "view/revoke permissions": "lihat/cabut izin",
84
+ "undo the file edits of the last turn": "batalkan edit file giliran terakhir",
85
+ "re-apply the file edits that /undo just reverted": "terapkan ulang edit file yang baru dibatalkan /undo",
86
+ "git diff of the project": "git diff project",
87
+ "copy the last answer": "salin jawaban terakhir",
88
+ "save the conversation as markdown": "simpan percakapan ke markdown",
89
+ "project instructions (/memory <text>, /memory global <text>)": "instruksi project (/memory <teks>, /memory global <teks>)",
90
+ "create/update AGENTS.md for this project": "buat/perbarui AGENTS.md untuk project ini",
91
+ "list subagents": "daftar subagent",
92
+ "list skills and custom commands": "daftar skill dan perintah custom",
93
+ "check installation health": "cek kesehatan instalasi",
94
+ "save the API key of the current provider": "simpan API key provider aktif",
95
+ "delete the API key of the current provider": "hapus API key provider aktif",
96
+ "set the interface language: en/id": "atur bahasa tampilan: en/id",
97
+ "start a new conversation": "mulai percakapan baru",
98
+ "summarize the conversation": "ringkas percakapan",
99
+ "token usage of this session": "pemakaian token sesi ini",
100
+ "quit": "keluar",
101
+ [`BCCLI \u2014 BotConnector's AI coding agent for the terminal
102
+
103
+ Usage:
104
+ bccli [task] interactive mode (optionally start with a task)
105
+ bccli -p "task" run one task without interaction (scripts/CI)
106
+ bccli login [provider] save an API key (default: bc-cloud)
107
+ bccli models [provider] list models (default: the active provider)
108
+ bccli update install the newest bccli from npm
109
+ bccli acp run as an ACP agent for editors (Zed, ...)
110
+ bccli serve [--port N] serve sessions over HTTP+WS for IDEs/bots
111
+ bccli provider list|add <id>|remove <id> manage providers (custom: --url <url> [--name N] [--key-env ENV])
112
+ 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
113
+ bccli integrations show the status of external agent integrations
114
+ bccli connect <agent> opencode, aider, cline, dsh, codex, claude-code, cursor, openai-cli, openai-sdk, openai-compatible, openclaw, hermes
115
+ bccli disconnect <agent> remove an integration and restore the previous config
116
+
117
+ Options:
118
+ -m, --model <provider/model> choose a model, e.g. bc-cloud/glm-5.3-flash
119
+ --reasoning <level> auto | off | low | medium | high | max
120
+ -c, --continue continue the last session in this folder
121
+ -r, --resume pick a session to continue
122
+ --allow-all run all tools without asking for permission
123
+ --allowed-tools <a,b> tools allowed without asking: bash, edit, fetch
124
+ -w, --worktree <name> run in git worktree ../<repo>.worktrees/<name> (created, or reused if it exists)
125
+ --output-format <fmt> text | json | stream-json for -p (machine-readable output)
126
+ --permission-mode <mode> default | acceptEdits | plan | allowAll
127
+ --lang <en|id> interface language (default: en; or BCCLI_LANG, or "language" in config)
128
+ -v, --version version
129
+ -h, --help this help`]: `BCCLI \u2014 agent AI BotConnector di terminal
130
+
131
+ Pemakaian:
132
+ bccli [tugas] mode interaktif (opsional langsung dengan tugas)
133
+ bccli -p "tugas" jalankan satu tugas tanpa interaksi (skrip/CI)
134
+ bccli login [provider] simpan API key (default: bc-cloud)
135
+ bccli models [provider] daftar model (default: provider aktif)
136
+ bccli update pasang bccli terbaru dari npm
137
+ bccli acp jalankan sebagai agen ACP untuk editor (Zed, ...)
138
+ bccli serve [--port N] sajikan sesi lewat HTTP+WS untuk IDE/bot
139
+ bccli provider list|add <id>|remove <id> kelola provider (custom: --url <url> [--name N] [--key-env ENV])
140
+ 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
141
+ bccli integrations lihat status integrasi agent eksternal
142
+ bccli connect <agent> opencode, aider, cline, dsh, codex, claude-code, cursor, openai-cli, openai-sdk, openai-compatible, openclaw, hermes
143
+ bccli disconnect <agent> lepas integrasi dan pulihkan config sebelumnya
144
+
145
+ Opsi:
146
+ -m, --model <provider/model> pilih model, contoh bc-cloud/glm-5.3-flash
147
+ --reasoning <level> auto | off | low | medium | high | max
148
+ -c, --continue lanjutkan sesi terakhir di folder ini
149
+ -r, --resume pilih sesi untuk dilanjutkan
150
+ --allow-all jalankan semua alat tanpa minta izin
151
+ --allowed-tools <a,b> alat yang boleh tanpa izin: bash, edit, fetch
152
+ -w, --worktree <name> jalankan di git worktree ../<repo>.worktrees/<name> (dibuat, atau dipakai ulang jika ada)
153
+ --output-format <fmt> text | json | stream-json untuk -p (output mesin)
154
+ --permission-mode <mode> default | acceptEdits | plan | allowAll
155
+ --lang <en|id> bahasa tampilan (default: en; atau BCCLI_LANG, atau "language" di config)
156
+ -v, --version versi
157
+ -h, --help bantuan ini`,
158
+ "--reasoning must be one of: {levels}": "--reasoning harus salah satu dari: {levels}",
159
+ "--port must be a number between 0 and 65535": "--port harus angka antara 0 dan 65535",
160
+ "serve only accepts loopback --host (127.0.0.1, localhost, ::1)": "serve hanya menerima --host loopback (127.0.0.1, localhost, ::1)",
161
+ 'networkPolicy must be "allow" or "offline".': 'networkPolicy harus "allow" atau "offline".',
162
+ "plugins must be an array of strings.": "plugins harus berupa array of string.",
163
+ "verifyCommands must be an array of non-empty strings.": "verifyCommands harus berupa array of string tidak kosong.",
164
+ 'usageCap must be an object, e.g. { "tokens": 2000000 }.': 'usageCap harus berupa objek, mis. { "tokens": 2000000 }.',
165
+ "usageCap.tokens must be a number greater than 0.": "usageCap.tokens harus angka lebih dari 0.",
166
+ "usageCap.usd must be a number greater than 0.": "usageCap.usd harus angka lebih dari 0.",
167
+ "usageCap.usd requires usageCap.prices (USD per 1M tokens).": "usageCap.usd memerlukan usageCap.prices (USD per 1 juta token).",
168
+ '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).',
169
+ "usageCap needs at least one of: tokens, usd.": "usageCap memerlukan setidaknya salah satu dari: tokens, usd.",
170
+ 'updateCheck must be "on" or "off".': 'updateCheck harus "on" atau "off".',
171
+ "repoMap must be true or false.": "repoMap harus true atau false.",
172
+ "theme must be one of: {themes}.": "theme harus salah satu dari: {themes}.",
173
+ 'editor must be "emacs" or "vim".': 'editor harus "emacs" atau "vim".',
174
+ 'sandbox must be "off" or "on".': 'sandbox harus "off" atau "on".',
175
+ 'lsp must be an object with a "servers" array.': 'lsp harus berupa objek dengan array "servers".',
176
+ 'Each lsp server needs { "extensions": [".ts"], "command": "...", "args": ["..."] }.': 'Setiap server lsp butuh { "extensions": [".ts"], "command": "...", "args": ["..."] }.',
177
+ "No LSP server is configured for {ext} files.": "Tidak ada server LSP yang dikonfigurasi untuk file {ext}.",
178
+ NORMAL: "-- NORMAL --",
179
+ "A new bccli is available: {latest} (you have {current}). Run: bccli update": "bccli versi baru tersedia: {latest} (kamu punya {current}). Jalankan: bccli update",
180
+ "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.",
181
+ "No image on the clipboard.": "Tidak ada gambar di clipboard.",
182
+ "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.",
183
+ "Verifying edits: {cmds}": "Memverifikasi edit: {cmds}",
184
+ "Verification passed.": "Verifikasi lulus.",
185
+ "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.",
186
+ "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}",
187
+ "keybinds must be an object mapping action to binding.": "keybinds harus berupa objek yang memetakan aksi ke binding.",
188
+ 'Keybind for "{action}" must be a string like "ctrl+t".': 'Keybind untuk "{action}" harus string seperti "ctrl+t".',
189
+ '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".',
190
+ 'Unknown keybind action "{action}". Known actions: {list}.': 'Aksi keybind "{action}" tidak dikenal. Aksi yang dikenal: {list}.',
191
+ "Plugin not found: {spec}": "Plugin tidak ditemukan: {spec}",
192
+ "Plugin failed to load: {spec}: {reason}": "Plugin gagal dimuat: {spec}: {reason}",
193
+ "Plugin {spec} registered a tool name that is already in use: {name}": "Plugin {spec} mendaftarkan nama tool yang sudah terpakai: {name}",
194
+ "--permission-mode must be one of: {modes}": "--permission-mode harus salah satu dari: {modes}",
195
+ "Plan needs approval; run with --allow-all.": "Rencana butuh persetujuan; jalankan dengan --allow-all.",
196
+ "Step limit reached.": "Batas langkah tercapai.",
197
+ "Needs permission for {tool}. Run with --allow-all or --allowed-tools {kind}.": "Butuh izin untuk {tool}. Jalankan dengan --allow-all atau --allowed-tools {kind}.",
198
+ "--lang must be one of: en, id": "--lang harus salah satu dari: en, id",
199
+ "--output-format must be one of: {formats}": "--output-format harus salah satu dari: {formats}",
200
+ "Invalid config: {path} ({error})": "Config tidak valid: {path} ({error})",
201
+ "maxSteps must be a positive number, or 0/null to disable the limit.": "maxSteps harus berupa angka positif, atau 0/null untuk menonaktifkan batas.",
202
+ "Hook {event} failed: {reason}": "Hook {event} gagal: {reason}",
203
+ "list background tasks": "daftar tugas latar belakang",
204
+ "Nothing to rewind.": "Tidak ada yang bisa di-rewind.",
205
+ "Rewound {n} turn(s): the conversation continues from before them.": "{n} giliran di-rewind: percakapan dilanjutkan dari sebelum giliran itu.",
206
+ "step back turns: conversation and file edits (/rewind 2)": "mundur beberapa giliran: percakapan + edit file (/rewind 2)",
207
+ "review a pull request (/pr <n|url|branch>)": "review pull request (/pr <n|url|branch>)",
208
+ "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})",
209
+ 'Provider "{id}" is not in the config. Available: {list}': 'Provider "{id}" tidak ada di config. Tersedia: {list}',
210
+ "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}.",
211
+ "Error from the provider: {message}": "Error dari provider: {message}",
212
+ "Cannot connect to {url}: {error}": "Tidak bisa terhubung ke {url}: {error}",
213
+ "{status} from {url}: {message}": "{status} dari {url}: {message}",
214
+ "Request failed": "Permintaan gagal",
215
+ "Connection closed before the response finished.": "Koneksi ditutup sebelum respons selesai.",
216
+ "WebSocket connection failed.": "Koneksi WebSocket gagal.",
217
+ "WebSocket connection closed: {reason}": "Koneksi WebSocket ditutup: {reason}",
218
+ "Empty response from the provider": "Respons provider kosong",
219
+ "{status} while fetching the model list": "{status} saat mengambil daftar model",
220
+ "The API key was rejected or {provider} could not be reached.": "API key ditolak atau {provider} tidak bisa dihubungi.",
221
+ "Usage: bccli provider {action} <id>": "Pemakaian: bccli provider {action} <id>",
222
+ "{id} removed.": "{id} dihapus.",
223
+ "Unknown action: {action}. Use list, add, or remove.": "Aksi tidak dikenal: {action}. Pakai list, add, atau remove.",
224
+ "Unknown action: {action}. Use list, add, remove, auth, logout, or serve.": "Aksi tidak dikenal: {action}. Pakai list, add, remove, auth, logout, atau serve.",
225
+ "OAuth required for {name}: run bccli mcp auth {name}": "OAuth diperlukan untuk {name}: jalankan bccli mcp auth {name}",
226
+ "{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>",
227
+ "{name} authorized. Active in the next bccli session.": "{name} terautorisasi. Aktif di sesi bccli berikutnya.",
228
+ "OAuth login failed for {name}: {reason}": "Login OAuth gagal untuk {name}: {reason}",
229
+ "{name} logged out.": "{name} telah logout.",
230
+ "{name} has no stored OAuth tokens.": "{name} tidak menyimpan token OAuth.",
231
+ "{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>.",
232
+ "API key for {id} (leave empty if not needed): ": "API key untuk {id} (kosongkan bila tidak perlu): ",
233
+ "{id} is ready. {n} models available.": "{id} siap. {n} model tersedia.",
234
+ "Usage: bccli mcp {action} <name>": "Pemakaian: bccli mcp {action} <nama>",
235
+ "{name} removed.": "{name} dihapus.",
236
+ "{name} installed ({url}).": "{name} terpasang ({url}).",
237
+ "{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>",
238
+ "{name} installed. Active in the next bccli session.": "{name} terpasang. Aktif di sesi bccli berikutnya.",
239
+ "control a browser (open pages, click, fill forms, screenshot)": "kontrol browser (buka halaman, klik, isi form, screenshot)",
240
+ "up-to-date library documentation": "dokumentasi library terbaru",
241
+ "fetch web pages as markdown (needs uv)": "ambil halaman web jadi markdown (butuh uv)",
242
+ "access folders outside the project": "akses folder di luar project",
243
+ "Folder the server may access": "Folder yang boleh diakses",
244
+ "structured git operations (needs uv)": "operasi git terstruktur (butuh uv)",
245
+ "GitHub issues, PRs, and repos": "issue, PR, dan repo GitHub",
246
+ "Missing MCP fields: {fields}": "Isian MCP belum lengkap: {fields}",
247
+ "Invalid MCP file: {path} ({error})": "File MCP tidak valid: {path} ({error})",
248
+ "could not be reached": "tidak bisa dihubungi",
249
+ "{label} must be one of: {levels}": "{label} harus salah satu dari: {levels}",
250
+ "This provider has no manual reasoning setting yet. Use Auto.": "Provider ini belum memiliki kontrak reasoning manual. Gunakan Auto.",
251
+ "This model/provider does not support reasoning level '{level}'. Use Auto{supported}.": "Model/provider ini tidak mendukung reasoning level '{level}'. Gunakan Auto{supported}.",
252
+ '-p mode needs a task, e.g. bccli -p "explain this repo"': 'Mode -p butuh tugas, contoh: bccli -p "jelaskan repo ini"',
253
+ '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).',
254
+ 'Interactive mode needs a terminal. For scripts/CI use: bccli -p "task"': 'Mode interaktif butuh terminal. Untuk skrip/CI pakai: bccli -p "tugas"',
255
+ "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",
256
+ "Cannot determine the home directory.": "Home directory tidak dapat ditentukan.",
257
+ "No BotConnector API key yet. Run bccli login bc-cloud first.": "API key BotConnector belum tersedia. Jalankan bccli login bc-cloud terlebih dahulu.",
258
+ "Could not load the BotConnector model catalog (HTTP {status}).": "Katalog model BotConnector gagal dimuat (HTTP {status}).",
259
+ "The BotConnector model catalog is empty; cannot configure external agents.": "Katalog model BotConnector kosong; agent eksternal tidak dapat dikonfigurasi.",
260
+ "The OpenCode config is not valid JSON: {path}": "Config OpenCode tidak valid JSON: {path}",
261
+ "OpenCode is connected to BotConnector ({n} models).": "OpenCode terhubung ke BotConnector ({n} model).",
262
+ "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.",
263
+ "Aider is connected to BotConnector.": "Aider terhubung ke BotConnector.",
264
+ "The BotConnector catalog has no model that external agents can use.": "Katalog BotConnector tidak memiliki model yang dapat dipakai agent eksternal.",
265
+ "The Cline config is not valid JSON: {path}": "Config Cline tidak valid JSON: {path}",
266
+ "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.",
267
+ "Cline is connected to BotConnector ({n} models available; default {model}).": "Cline terhubung ke BotConnector ({n} model tersedia; default {model}).",
268
+ "The DeepSeek Harness config is not valid YAML: {path}": "Config DeepSeek Harness tidak valid YAML: {path}",
269
+ 'DeepSeek Harness already has a provider "{id}" with a different endpoint.': 'DeepSeek Harness sudah memiliki provider "{id}" dengan endpoint lain.',
270
+ "$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}",
271
+ "DeepSeek Harness is connected to BotConnector ({n} models).": "DeepSeek Harness terhubung ke BotConnector ({n} model).",
272
+ "Equivalent long form: dsh --profile web": "Bentuk panjang yang setara: dsh --profile web",
273
+ "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.",
274
+ "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.",
275
+ "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.",
276
+ "The BotConnector catalog has no model for external coding agents.": "Katalog BotConnector tidak memiliki model untuk coding agent eksternal.",
277
+ "Codex already has botconnector.config.toml. BCCLI will not overwrite it.": "Codex sudah memiliki botconnector.config.toml. BCCLI tidak akan menimpanya.",
278
+ "Codex CLI is connected to the BotConnector Responses API.": "Codex CLI terhubung ke BotConnector Responses API.",
279
+ "Claude Code is connected to the BotConnector Anthropic Messages compatibility API.": "Claude Code terhubung ke BotConnector Anthropic Messages compatibility API.",
280
+ '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.',
281
+ "The OpenClaw config is not valid JSON: {path}": "Config OpenClaw tidak valid JSON: {path}",
282
+ "OpenClaw is connected to BotConnector ({n} models; default {model}).": "OpenClaw terhubung ke BotConnector ({n} model; default {model}).",
283
+ "API key: env {env} (SecretRef, not stored in the config).": "API key: env {env} (SecretRef, tidak disimpan di config).",
284
+ "Set the default model in OpenClaw with: openclaw models set {provider}/{model}": "Atur model default di OpenClaw dengan: openclaw models set {provider}/{model}",
285
+ "The Hermes config is not valid YAML: {path}": "Config Hermes tidak valid YAML: {path}",
286
+ '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.',
287
+ "Hermes is connected to BotConnector ({n} models; default {model}).": "Hermes terhubung ke BotConnector ({n} model; default {model}).",
288
+ "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).",
289
+ "{target}: not managed by BCCLI yet.": "{target}: belum dikelola oleh BCCLI.",
290
+ "{target}: the BotConnector integration was removed and the config restored.": "{target}: integrasi BotConnector dilepas dan config dipulihkan.",
291
+ "Custom commands:": "Perintah custom:",
292
+ "Skills:": "Skill:",
293
+ "shift+tab switch permission mode esc cancel the turn": "shift+tab ganti mode izin esc batalkan giliran",
294
+ "{bind} full output of the last tool \\ + enter new line": "{bind} output alat terakhir lengkap \\ + enter baris baru",
295
+ "{bind} show/hide the model\u2019s thinking": "{bind} buka/tutup thinking model",
296
+ "@file + tab complete file names \u2191\u2193 input history": "@file + tab lengkapi nama file \u2191\u2193 riwayat input",
297
+ "custom command": "perintah custom",
298
+ "skill \xB7 {description}": "skill \xB7 {description}",
299
+ "Conversation cleared.": "Percakapan dikosongkan.",
300
+ "Could not summarize: {error}": "Gagal meringkas: {error}",
301
+ "Reasoning: {level} (saved as default)": "Reasoning: {level} (tersimpan sebagai default)",
302
+ "not supported by this provider": "tidak didukung provider ini",
303
+ "Model: {model} (saved as default)": "Model: {model} (tersimpan sebagai default)",
304
+ "Cannot fetch the model list: {error}": "Tidak bisa mengambil daftar model: {error}",
305
+ "New session started. The previous session stays saved (/resume).": "Sesi baru dimulai. Sesi sebelumnya tetap tersimpan (/resume).",
306
+ "No other sessions in this folder yet.": "Belum ada sesi lain di folder ini.",
307
+ "Continue a session": "Lanjutkan sesi",
308
+ "(empty)": "(kosong)",
309
+ "{n} messages": "{n} pesan",
310
+ "Resuming the session ({messages} messages saved \xB7 {chat} user/assistant chats shown).": "Melanjutkan sesi ({messages} pesan tersimpan \xB7 {chat} chat user/assistant ditampilkan).",
311
+ "Checking\u2026": "Memeriksa\u2026",
312
+ "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.",
313
+ "Active permissions (enter: revoke a session permission)": "Izin aktif (enter: cabut izin sesi)",
314
+ "this session": "sesi ini",
315
+ "{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.",
316
+ "Permission {rule} revoked.": "Izin {rule} dicabut.",
317
+ "{path} ({lines} lines)": "{path} ({lines} baris)",
318
+ "No AGENTS.md / BCCLI.md yet. Add one with /memory <text>.": "Belum ada AGENTS.md / BCCLI.md. Tambah dengan /memory <teks>.",
319
+ "Write the text: /memory global <text>.": "Tulis teksnya: /memory global <teks>.",
320
+ "Could not write {file}: {error}": "Gagal menulis {file}: {error}",
321
+ "Added to {file}.": "Ditambahkan ke {file}.",
322
+ "API key for {provider}": "API key untuk {provider}",
323
+ "Key for {provider} saved, but {env} in the environment takes precedence and is still used.": "Key {provider} tersimpan, tapi {env} di environment lebih diutamakan dan tetap dipakai.",
324
+ "Key for {provider} saved \xB7 {n} models.": "Key {provider} tersimpan \xB7 {n} model.",
325
+ "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.",
326
+ "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.",
327
+ "No stored key for {provider}.": "Tidak ada key tersimpan untuk {provider}.",
328
+ "Key for {provider} deleted. Use /login or /provider to add one again.": "Key {provider} dihapus. Pakai /login atau /provider untuk menambah lagi.",
329
+ "No file edits to undo.": "Tidak ada edit file yang bisa dibatalkan.",
330
+ "No file edits to redo.": "Tidak ada edit file yang bisa di-redo.",
331
+ "Re-applied: {files}": "Diterapkan ulang: {files}",
332
+ "Deleted again: {files}": "Dihapus lagi: {files}",
333
+ "Could not restore: {files}": "Gagal dikembalikan: {files}",
334
+ "Restored: {files}": "Dikembalikan: {files}",
335
+ "Deleted (new files): {files}": "Dihapus (file baru): {files}",
336
+ "Too large to back up, left unchanged: {files}": "Terlalu besar untuk disimpan, tidak diubah: {files}",
337
+ "Note: changes made through bash commands cannot be undone.": "Catatan: perubahan lewat perintah bash tidak bisa di-undo.",
338
+ "No answer to copy yet.": "Belum ada jawaban untuk disalin.",
339
+ "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}.",
340
+ "{file} already exists. Overwrite? (y/N)": "{file} sudah ada. Timpa? (y/N)",
341
+ "Export cancelled.": "Ekspor dibatalkan.",
342
+ "BCCLI session {when}": "Sesi BCCLI {when}",
343
+ "Conversation saved to {file}.": "Percakapan disimpan di {file}.",
344
+ "Unknown command: /{name}. Type /help.": "Perintah tidak dikenal: /{name}. Ketik /help.",
345
+ "Skill {name} cannot be read: {error}": "Skill {name} tidak bisa dibaca: {error}",
346
+ "{n} queued messages cancelled.": "{n} pesan antrian dibatalkan.",
347
+ "Thinking shown ({bind} to hide).": "Thinking ditampilkan ({bind} untuk menutup).",
348
+ "Thinking hidden ({bind} to show).": "Thinking disembunyikan ({bind} untuk membuka).",
349
+ "MCP {name} removed.": "MCP {name} dihapus.",
350
+ "MCP {name} installed, connecting\u2026": "MCP {name} dipasang, menghubungkan\u2026",
351
+ "MCP {name} active \xB7 {n} tools.": "MCP {name} aktif \xB7 {n} alat.",
352
+ "MCP {name} failed: {error}": "MCP {name} gagal: {error}",
353
+ "unknown": "tidak diketahui",
354
+ "\u273B Thinking \xB7 {n} lines \xB7 {bind} to show": "\u273B Berpikir \xB7 {n} baris \xB7 {bind} buka",
355
+ "\u273B Thinking ({bind} to hide)": "\u273B Berpikir ({bind} tutup)",
356
+ " \u23F3 queued: {q}": " \u23F3 antri: {q}",
357
+ "Thinking": "Berpikir",
358
+ "Cancelling": "Membatalkan",
359
+ "Language: {lang}. Change it with /language en or /language id.": "Bahasa: {lang}. Ganti dengan /language en atau /language id.",
360
+ 'Unknown language "{lang}". Use en or id.': 'Bahasa "{lang}" tidak dikenal. Pakai en atau id.',
361
+ "Could not save the language: {error}": "Gagal menyimpan bahasa: {error}",
362
+ "Language set to {lang} (saved as default).": "Bahasa diatur ke {lang} (tersimpan sebagai default).",
363
+ "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.",
364
+ "This model may not support tool calling. Try another model with /model.": "Model ini sepertinya tidak mendukung tool calling. Coba model lain dengan /model.",
365
+ "{lines} lines written": "{lines} baris ditulis",
366
+ "{n} lines": "{n} baris",
367
+ "{n} results": "{n} hasil",
368
+ "{steps} steps \xB7 {tokens} tokens": "{steps} langkah \xB7 {tokens} token",
369
+ "plan": "rencana",
370
+ "~{n} tokens": "~{n} token",
371
+ "focused excerpt \xB7 cache": "kutipan fokus \xB7 cache",
372
+ "focused excerpt (Keenable)": "kutipan fokus (Keenable)",
373
+ "focused excerpt (local)": "kutipan fokus (lokal)",
374
+ "over 5 MB, truncated": "lebih dari 5 MB, dipotong",
375
+ "{n} characters": "{n} karakter",
376
+ "{input} tokens in \xB7 {output} tokens out": "{input} token masuk \xB7 {output} token keluar",
377
+ "Run: dsh web": "Jalankan: dsh web",
378
+ "timeout after {n} seconds": "timeout {n} detik",
379
+ "Could not start MCP servers: {error}": "Tidak bisa menjalankan server MCP: {error}",
380
+ "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."
381
+ };
382
+
383
+ // src/i18n.ts
384
+ var LANGS = ["en", "id"];
385
+ var current = "en";
386
+ function parseLang(value) {
387
+ const v = value?.trim().toLowerCase().split(/[-_.]/)[0];
388
+ return LANGS.includes(v ?? "") ? v : void 0;
389
+ }
390
+ function setLanguage(lang) {
391
+ current = lang;
392
+ }
393
+ function getLanguage() {
394
+ return current;
395
+ }
396
+ var locale = () => current === "id" ? "id-ID" : "en-US";
397
+ function t(en, params) {
398
+ const template = current === "id" ? ID[en] ?? en : en;
399
+ return params ? template.replace(/\{(\w+)\}/g, (match, key) => key in params ? String(params[key]) : match) : template;
400
+ }
401
+ function langFromArgv(argv) {
402
+ for (let i = 0; i < argv.length; i++) {
403
+ if (argv[i] === "--lang") return parseLang(argv[i + 1]);
404
+ if (argv[i].startsWith("--lang=")) return parseLang(argv[i].slice(7));
405
+ }
406
+ return void 0;
407
+ }
408
+ function resolveLanguage(argv, env, fromConfig) {
409
+ return langFromArgv(argv) ?? parseLang(env.BCCLI_LANG) ?? parseLang(fromConfig) ?? "en";
410
+ }
411
+
412
+ export {
413
+ parseLang,
414
+ setLanguage,
415
+ getLanguage,
416
+ locale,
417
+ t,
418
+ resolveLanguage
419
+ };