archymedes-cli 2.0.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.
@@ -0,0 +1,589 @@
1
+ // packages/archymedes-cli/src/viewport.ts
2
+ function newViewport(lines, height) {
3
+ return clamp({ lines, height: Math.max(1, Math.floor(height)), top: 0 });
4
+ }
5
+ function maxTop(state) {
6
+ return Math.max(0, state.lines.length - state.height);
7
+ }
8
+ function clamp(state) {
9
+ const height = Math.max(1, Math.floor(state.height));
10
+ const bounded = { ...state, height };
11
+ const top = Math.max(0, Math.min(Math.floor(bounded.top) || 0, maxTop(bounded)));
12
+ return { ...bounded, top };
13
+ }
14
+ function applyViewport(state, action) {
15
+ switch (action.kind) {
16
+ case "up":
17
+ return clamp({ ...state, top: state.top - Math.max(1, action.rows ?? 1) });
18
+ case "down":
19
+ return clamp({ ...state, top: state.top + Math.max(1, action.rows ?? 1) });
20
+ case "halfUp":
21
+ return clamp({ ...state, top: state.top - Math.max(1, Math.floor(state.height / 2)) });
22
+ case "halfDown":
23
+ return clamp({ ...state, top: state.top + Math.max(1, Math.floor(state.height / 2)) });
24
+ case "pageUp":
25
+ return clamp({ ...state, top: state.top - Math.max(1, state.height - 1) });
26
+ case "pageDown":
27
+ return clamp({ ...state, top: state.top + Math.max(1, state.height - 1) });
28
+ case "top":
29
+ return clamp({ ...state, top: 0 });
30
+ case "bottom":
31
+ return clamp({ ...state, top: maxTop(state) });
32
+ case "resize":
33
+ return clamp({ ...state, height: action.height });
34
+ case "content": {
35
+ const next = clamp({ ...state, lines: action.lines });
36
+ return action.follow ? clamp({ ...next, top: maxTop(next) }) : next;
37
+ }
38
+ }
39
+ }
40
+ function visibleLines(state) {
41
+ return state.lines.slice(state.top, state.top + state.height);
42
+ }
43
+ function scrollFraction(state) {
44
+ const furthest = maxTop(state);
45
+ return furthest === 0 ? 1 : state.top / furthest;
46
+ }
47
+
48
+ // packages/archymedes-cli/src/i18n.ts
49
+ var CONTROL_LANGUAGES = {
50
+ en: "English",
51
+ zh: "中文 (Mandarin)",
52
+ hi: "हिन्दी",
53
+ es: "Español",
54
+ fr: "Français",
55
+ ar: "العربية",
56
+ bn: "বাংলা",
57
+ pt: "Português",
58
+ ru: "Русский",
59
+ ur: "اردو",
60
+ ja: "日本語",
61
+ ko: "한국어",
62
+ de: "Deutsch",
63
+ id: "Bahasa Indonesia",
64
+ vi: "Tiếng Việt",
65
+ tr: "Türkçe"
66
+ };
67
+ function resolveControlLanguage(value) {
68
+ const normalized = value?.trim().toLowerCase().replace("_", "-") ?? "";
69
+ const base = normalized.split("-")[0];
70
+ return base in CONTROL_LANGUAGES ? base : "en";
71
+ }
72
+ var LABELS = {
73
+ en: { help: "commands", guide: "guide", exit: "leave", settings: "settings", voice: "voice", choose: "Choose a setting", saved: "saved", keyboard: "Keyboard shortcuts", remember: "remember" },
74
+ zh: { help: "命令", guide: "指南", exit: "退出", settings: "设置", voice: "语音", choose: "选择设置", saved: "已保存", keyboard: "键盘快捷键", remember: "记住" },
75
+ hi: { help: "कमांड", guide: "गाइड", exit: "बाहर निकलें", settings: "सेटिंग्स", voice: "आवाज़", choose: "सेटिंग चुनें", saved: "सहेजा गया", keyboard: "कीबोर्ड शॉर्टकट", remember: "याद रखें" },
76
+ es: { help: "comandos", guide: "guía", exit: "salir", settings: "ajustes", voice: "voz", choose: "Elige un ajuste", saved: "guardado", keyboard: "Atajos de teclado", remember: "recordar" },
77
+ fr: { help: "commandes", guide: "guide", exit: "quitter", settings: "réglages", voice: "voix", choose: "Choisissez un réglage", saved: "enregistré", keyboard: "Raccourcis clavier", remember: "mémoriser" },
78
+ ar: { help: "الأوامر", guide: "دليل", exit: "خروج", settings: "الإعدادات", voice: "الصوت", choose: "اختر إعدادًا", saved: "تم الحفظ", keyboard: "اختصارات لوحة المفاتيح", remember: "تذكّر" },
79
+ bn: { help: "কমান্ড", guide: "গাইড", exit: "প্রস্থান", settings: "সেটিংস", voice: "ভয়েস", choose: "একটি সেটিং বেছে নিন", saved: "সংরক্ষিত", keyboard: "কীবোর্ড শর্টকাট", remember: "মনে রাখুন" },
80
+ pt: { help: "comandos", guide: "guia", exit: "sair", settings: "configurações", voice: "voz", choose: "Escolha uma configuração", saved: "salvo", keyboard: "Atalhos de teclado", remember: "lembrar" },
81
+ ru: { help: "команды", guide: "руководство", exit: "выход", settings: "настройки", voice: "голос", choose: "Выберите настройку", saved: "сохранено", keyboard: "Горячие клавиши", remember: "запомнить" },
82
+ ur: { help: "کمانڈز", guide: "گائیڈ", exit: "باہر نکلیں", settings: "ترتیبات", voice: "آواز", choose: "ترتیب منتخب کریں", saved: "محفوظ ہوگیا", keyboard: "کی بورڈ شارٹ کٹس", remember: "یاد رکھیں" },
83
+ ja: { help: "コマンド", guide: "ガイド", exit: "終了", settings: "設定", voice: "音声", choose: "設定を選択", saved: "保存しました", keyboard: "キーボードショートカット", remember: "記憶" },
84
+ ko: { help: "명령", guide: "가이드", exit: "종료", settings: "설정", voice: "음성", choose: "설정 선택", saved: "저장됨", keyboard: "키보드 단축키", remember: "기억" },
85
+ de: { help: "Befehle", guide: "Anleitung", exit: "beenden", settings: "Einstellungen", voice: "Sprache", choose: "Einstellung wählen", saved: "gespeichert", keyboard: "Tastenkürzel", remember: "merken" },
86
+ id: { help: "perintah", guide: "panduan", exit: "keluar", settings: "pengaturan", voice: "suara", choose: "Pilih pengaturan", saved: "tersimpan", keyboard: "Pintasan keyboard", remember: "ingat" },
87
+ vi: { help: "lệnh", guide: "hướng dẫn", exit: "thoát", settings: "cài đặt", voice: "giọng nói", choose: "Chọn một cài đặt", saved: "đã lưu", keyboard: "Phím tắt", remember: "ghi nhớ" },
88
+ tr: { help: "komutlar", guide: "kılavuz", exit: "çık", settings: "ayarlar", voice: "ses", choose: "Bir ayar seçin", saved: "kaydedildi", keyboard: "Klavye kısayolları", remember: "hatırla" }
89
+ };
90
+ function controlLabel(language, key) {
91
+ return LABELS[language][key];
92
+ }
93
+ var COMMANDS = {
94
+ zh: { "/plan": "切换到只读规划模式", "/build": "切换到需批准的构建模式", "/auto": "自动应用编辑", "/model": "切换模型并保留上下文", "/undo": "撤销上一轮更改", "/diff": "显示最近更改", "/todos": "显示代理计划", "/clear": "开始新对话", "/pull": "复制沙箱文件", "/where": "显示当前工作区", "/providers": "显示模型提供商", "/settings": "配置密钥、网址、模型和语音", "/voice": "录音或转写语音提示", "/cost": "显示令牌和费用", "/sessions": "列出项目会话", "/keys": "键盘快捷键", "/help": "显示命令", "/exit": "退出" },
95
+ hi: { "/plan": "केवल-पढ़ने की योजना मोड", "/build": "अनुमति वाला बिल्ड मोड", "/auto": "संपादन अपने-आप लागू करें", "/model": "संदर्भ रखते हुए मॉडल बदलें", "/undo": "पिछले बदलाव वापस लें", "/diff": "हाल के बदलाव दिखाएँ", "/todos": "एजेंट की योजना", "/clear": "नई बातचीत", "/pull": "सैंडबॉक्स फ़ाइलें कॉपी करें", "/where": "वर्तमान वर्कस्पेस", "/providers": "मॉडल प्रदाता", "/settings": "कुंजियाँ, URL, मॉडल और आवाज़", "/voice": "आवाज़ रिकॉर्ड या ट्रांसक्राइब करें", "/cost": "टोकन और लागत", "/sessions": "प्रोजेक्ट सत्र", "/keys": "कीबोर्ड शॉर्टकट", "/help": "कमांड दिखाएँ", "/exit": "बाहर निकलें" },
96
+ es: { "/plan": "Modo de planificación de solo lectura", "/build": "Modo de cambios con aprobación", "/auto": "Aplicar cambios automáticamente", "/model": "Cambiar modelo conservando el contexto", "/undo": "Deshacer los últimos cambios", "/diff": "Mostrar cambios recientes", "/todos": "Mostrar el plan del agente", "/clear": "Iniciar una conversación nueva", "/pull": "Copiar archivos del entorno aislado", "/where": "Mostrar el espacio de trabajo", "/providers": "Mostrar proveedores de modelos", "/settings": "Configurar claves, URL, modelos y voz", "/voice": "Grabar o transcribir una instrucción", "/cost": "Mostrar tokens y coste", "/sessions": "Listar sesiones del proyecto", "/keys": "Atajos de teclado", "/help": "Mostrar comandos", "/exit": "Salir" },
97
+ fr: { "/plan": "Mode planification en lecture seule", "/build": "Mode modification avec approbation", "/auto": "Appliquer les modifications automatiquement", "/model": "Changer de modèle en gardant le contexte", "/undo": "Annuler les dernières modifications", "/diff": "Afficher les changements récents", "/todos": "Afficher le plan de l’agent", "/clear": "Nouvelle conversation", "/pull": "Copier les fichiers du bac à sable", "/where": "Afficher l’espace de travail", "/providers": "Afficher les fournisseurs de modèles", "/settings": "Configurer clés, URL, modèles et voix", "/voice": "Enregistrer ou transcrire une demande", "/cost": "Afficher jetons et coût", "/sessions": "Lister les sessions du projet", "/keys": "Raccourcis clavier", "/help": "Afficher les commandes", "/exit": "Quitter" },
98
+ ar: { "/plan": "وضع التخطيط للقراءة فقط", "/build": "وضع التعديل مع الموافقة", "/auto": "تطبيق التعديلات تلقائيًا", "/model": "تغيير النموذج مع حفظ السياق", "/undo": "التراجع عن آخر التعديلات", "/diff": "عرض التغييرات الأخيرة", "/todos": "عرض خطة الوكيل", "/clear": "بدء محادثة جديدة", "/pull": "نسخ ملفات البيئة المعزولة", "/where": "عرض مساحة العمل", "/providers": "عرض مزودي النماذج", "/settings": "إعداد المفاتيح والروابط والنماذج والصوت", "/voice": "تسجيل أو تحويل الصوت إلى نص", "/cost": "عرض الرموز والتكلفة", "/sessions": "عرض جلسات المشروع", "/keys": "اختصارات لوحة المفاتيح", "/help": "عرض الأوامر", "/exit": "خروج" },
99
+ bn: { "/plan": "শুধু-পঠন পরিকল্পনা মোড", "/build": "অনুমোদনসহ বিল্ড মোড", "/auto": "সম্পাদনা স্বয়ংক্রিয়ভাবে প্রয়োগ", "/model": "প্রসঙ্গ রেখে মডেল বদলান", "/undo": "শেষ পরিবর্তন ফিরিয়ে নিন", "/diff": "সাম্প্রতিক পরিবর্তন দেখান", "/todos": "এজেন্টের পরিকল্পনা", "/clear": "নতুন আলাপ", "/pull": "স্যান্ডবক্স ফাইল কপি", "/where": "বর্তমান ওয়ার্কস্পেস", "/providers": "মডেল প্রদানকারী", "/settings": "কী, URL, মডেল ও ভয়েস", "/voice": "ভয়েস রেকর্ড বা ট্রান্সক্রাইব", "/cost": "টোকেন ও খরচ", "/sessions": "প্রজেক্ট সেশন", "/keys": "কীবোর্ড শর্টকাট", "/help": "কমান্ড দেখান", "/exit": "প্রস্থান" },
100
+ pt: { "/plan": "Modo de planejamento somente leitura", "/build": "Modo de alterações com aprovação", "/auto": "Aplicar alterações automaticamente", "/model": "Trocar modelo mantendo o contexto", "/undo": "Desfazer últimas alterações", "/diff": "Mostrar alterações recentes", "/todos": "Mostrar plano do agente", "/clear": "Nova conversa", "/pull": "Copiar arquivos do sandbox", "/where": "Mostrar espaço de trabalho", "/providers": "Mostrar provedores de modelos", "/settings": "Configurar chaves, URLs, modelos e voz", "/voice": "Gravar ou transcrever uma solicitação", "/cost": "Mostrar tokens e custo", "/sessions": "Listar sessões do projeto", "/keys": "Atalhos de teclado", "/help": "Mostrar comandos", "/exit": "Sair" },
101
+ ru: { "/plan": "Режим планирования без записи", "/build": "Режим изменений с подтверждением", "/auto": "Применять изменения автоматически", "/model": "Сменить модель, сохранив контекст", "/undo": "Отменить последние изменения", "/diff": "Показать последние изменения", "/todos": "Показать план агента", "/clear": "Новый диалог", "/pull": "Скопировать файлы из песочницы", "/where": "Показать рабочую область", "/providers": "Показать провайдеров моделей", "/settings": "Настроить ключи, URL, модели и голос", "/voice": "Записать или распознать запрос", "/cost": "Показать токены и стоимость", "/sessions": "Список сессий проекта", "/keys": "Горячие клавиши", "/help": "Показать команды", "/exit": "Выход" },
102
+ ur: { "/plan": "صرف پڑھنے کا منصوبہ موڈ", "/build": "منظوری کے ساتھ بلڈ موڈ", "/auto": "تبدیلیاں خودکار لگائیں", "/model": "سیاق رکھتے ہوئے ماڈل بدلیں", "/undo": "آخری تبدیلی واپس کریں", "/diff": "حالیہ تبدیلیاں دکھائیں", "/todos": "ایجنٹ کا منصوبہ", "/clear": "نئی گفتگو", "/pull": "سینڈباکس فائلیں نقل کریں", "/where": "ورک اسپیس دکھائیں", "/providers": "ماڈل فراہم کنندگان", "/settings": "کلیدیں، URLs، ماڈلز اور آواز", "/voice": "آواز ریکارڈ یا متن میں بدلیں", "/cost": "ٹوکن اور لاگت", "/sessions": "پروجیکٹ سیشن", "/keys": "کی بورڈ شارٹ کٹس", "/help": "کمانڈز دکھائیں", "/exit": "باہر نکلیں" },
103
+ ja: { "/plan": "読み取り専用の計画モード", "/build": "承認付きのビルドモード", "/auto": "編集を自動で適用", "/model": "コンテキストを保ったままモデルを切り替え", "/undo": "前のターンの変更を取り消す", "/diff": "最近の変更を表示", "/todos": "エージェントの計画を表示", "/clear": "新しい会話を開始", "/pull": "サンドボックスのファイルをコピー", "/where": "現在のワークスペースを表示", "/providers": "モデルプロバイダーを表示", "/settings": "キー・URL・モデル・音声を設定", "/voice": "音声プロンプトを録音または文字起こし", "/cost": "トークンとコストを表示", "/sessions": "プロジェクトのセッション一覧", "/keys": "キーボードショートカット", "/help": "コマンドを表示", "/exit": "終了" },
104
+ ko: { "/plan": "읽기 전용 계획 모드", "/build": "승인이 필요한 빌드 모드", "/auto": "편집 자동 적용", "/model": "컨텍스트를 유지한 채 모델 전환", "/undo": "마지막 턴의 변경 취소", "/diff": "최근 변경 사항 표시", "/todos": "에이전트 계획 표시", "/clear": "새 대화 시작", "/pull": "샌드박스 파일 복사", "/where": "현재 작업 공간 표시", "/providers": "모델 제공자 표시", "/settings": "키, URL, 모델, 음성 설정", "/voice": "음성 프롬프트 녹음 또는 전사", "/cost": "토큰과 비용 표시", "/sessions": "프로젝트 세션 목록", "/keys": "키보드 단축키", "/help": "명령 표시", "/exit": "종료" },
105
+ de: { "/plan": "Nur-Lese-Planungsmodus", "/build": "Änderungsmodus mit Bestätigung", "/auto": "Änderungen automatisch übernehmen", "/model": "Modell wechseln und Kontext behalten", "/undo": "Letzte Änderungen zurücknehmen", "/diff": "Letzte Änderungen anzeigen", "/todos": "Plan des Agenten anzeigen", "/clear": "Neues Gespräch beginnen", "/pull": "Dateien aus der Sandbox kopieren", "/where": "Aktuellen Arbeitsbereich anzeigen", "/providers": "Modellanbieter anzeigen", "/settings": "Schlüssel, URLs, Modelle und Spracheingabe", "/voice": "Sprachaufforderung aufnehmen oder transkribieren", "/cost": "Tokens und Kosten anzeigen", "/sessions": "Projektsitzungen auflisten", "/keys": "Tastenkürzel", "/help": "Befehle anzeigen", "/exit": "Beenden" },
106
+ id: { "/plan": "Mode perencanaan hanya-baca", "/build": "Mode perubahan dengan persetujuan", "/auto": "Terapkan perubahan otomatis", "/model": "Ganti model sambil menjaga konteks", "/undo": "Batalkan perubahan giliran terakhir", "/diff": "Tampilkan perubahan terbaru", "/todos": "Tampilkan rencana agen", "/clear": "Mulai percakapan baru", "/pull": "Salin berkas sandbox", "/where": "Tampilkan ruang kerja saat ini", "/providers": "Tampilkan penyedia model", "/settings": "Atur kunci, URL, model, dan suara", "/voice": "Rekam atau transkripsikan perintah suara", "/cost": "Tampilkan token dan biaya", "/sessions": "Daftar sesi proyek", "/keys": "Pintasan keyboard", "/help": "Tampilkan perintah", "/exit": "Keluar" },
107
+ vi: { "/plan": "Chế độ lập kế hoạch chỉ đọc", "/build": "Chế độ thay đổi cần phê duyệt", "/auto": "Tự động áp dụng chỉnh sửa", "/model": "Đổi mô hình mà vẫn giữ ngữ cảnh", "/undo": "Hoàn tác thay đổi của lượt trước", "/diff": "Hiển thị thay đổi gần đây", "/todos": "Hiển thị kế hoạch của tác nhân", "/clear": "Bắt đầu cuộc trò chuyện mới", "/pull": "Sao chép tệp từ sandbox", "/where": "Hiển thị không gian làm việc hiện tại", "/providers": "Hiển thị nhà cung cấp mô hình", "/settings": "Cấu hình khóa, URL, mô hình và giọng nói", "/voice": "Ghi âm hoặc chuyển lời nhắc thành văn bản", "/cost": "Hiển thị token và chi phí", "/sessions": "Liệt kê phiên của dự án", "/keys": "Phím tắt", "/help": "Hiển thị các lệnh", "/exit": "Thoát" },
108
+ tr: { "/plan": "Salt okunur planlama modu", "/build": "Onaylı değişiklik modu", "/auto": "Değişiklikleri otomatik uygula", "/model": "Bağlamı koruyarak modeli değiştir", "/undo": "Son turun değişikliklerini geri al", "/diff": "Son değişiklikleri göster", "/todos": "Aracının planını göster", "/clear": "Yeni bir konuşma başlat", "/pull": "Sanal alan dosyalarını kopyala", "/where": "Geçerli çalışma alanını göster", "/providers": "Model sağlayıcılarını göster", "/settings": "Anahtarları, URL'leri, modelleri ve sesi ayarla", "/voice": "Sesli istemi kaydet veya yazıya dök", "/cost": "Belirteç ve maliyeti göster", "/sessions": "Proje oturumlarını listele", "/keys": "Klavye kısayolları", "/help": "Komutları göster", "/exit": "Çık" }
109
+ };
110
+ function commandDescription(language, command, fallback) {
111
+ return COMMANDS[language]?.[command] ?? fallback;
112
+ }
113
+ var TRANSLATED_KEYBOARD_IDS = {
114
+ zh: { "complete-command": "补全斜杠命令", "complete-path": "补全项目文件路径", history: "搜索历史输入", "line-ends": "移到输入开头 / 结尾", delete: "删除前一词 / 全部输入", clear: "清屏并重绘", interrupt: "中断当前任务", voice: "从麦克风录入提示" },
115
+ hi: { "complete-command": "स्लैश कमांड पूरा करें", "complete-path": "प्रोजेक्ट फ़ाइल पथ पूरा करें", history: "पुराना इनपुट खोजें", "line-ends": "इनपुट की शुरुआत / अंत", delete: "पिछला शब्द / पूरा इनपुट मिटाएँ", clear: "टर्मिनल साफ़ करें", interrupt: "वर्तमान काम रोकें", voice: "माइक्रोफ़ोन से प्रॉम्प्ट रिकॉर्ड करें" },
116
+ es: { "complete-command": "Completar un comando", "complete-path": "Completar una ruta del proyecto", history: "Buscar en el historial", "line-ends": "Ir al inicio / final", delete: "Borrar palabra / entrada completa", clear: "Limpiar la terminal", interrupt: "Interrumpir la tarea actual", voice: "Grabar desde el micrófono" },
117
+ fr: { "complete-command": "Compléter une commande", "complete-path": "Compléter un chemin du projet", history: "Rechercher dans l’historique", "line-ends": "Début / fin de la saisie", delete: "Effacer le mot / toute la saisie", clear: "Effacer le terminal", interrupt: "Interrompre la tâche", voice: "Enregistrer avec le microphone" },
118
+ ar: { "complete-command": "إكمال أمر", "complete-path": "إكمال مسار ملف المشروع", history: "البحث في السجل", "line-ends": "بداية / نهاية الإدخال", delete: "حذف الكلمة / كامل الإدخال", clear: "مسح الطرفية", interrupt: "إيقاف المهمة الحالية", voice: "تسجيل الطلب من الميكروفون" },
119
+ bn: { "complete-command": "স্ল্যাশ কমান্ড পূরণ", "complete-path": "প্রজেক্ট ফাইল পথ পূরণ", history: "ইতিহাস খুঁজুন", "line-ends": "ইনপুটের শুরু / শেষ", delete: "আগের শব্দ / সব ইনপুট মুছুন", clear: "টার্মিনাল পরিষ্কার", interrupt: "বর্তমান কাজ থামান", voice: "মাইক্রোফোন থেকে রেকর্ড" },
120
+ pt: { "complete-command": "Completar um comando", "complete-path": "Completar caminho do projeto", history: "Pesquisar histórico", "line-ends": "Ir ao início / fim", delete: "Apagar palavra / entrada inteira", clear: "Limpar o terminal", interrupt: "Interromper a tarefa", voice: "Gravar pelo microfone" },
121
+ ru: { "complete-command": "Дополнить команду", "complete-path": "Дополнить путь к файлу", history: "Искать в истории", "line-ends": "В начало / конец строки", delete: "Удалить слово / всю строку", clear: "Очистить терминал", interrupt: "Прервать задачу", voice: "Записать запрос с микрофона" },
122
+ ur: { "complete-command": "سلیش کمانڈ مکمل کریں", "complete-path": "پروجیکٹ فائل کا راستہ مکمل کریں", history: "تاریخ تلاش کریں", "line-ends": "ان پٹ کے شروع / آخر جائیں", delete: "پچھلا لفظ / پوری سطر مٹائیں", clear: "ٹرمینل صاف کریں", interrupt: "موجودہ کام روکیں", voice: "مائیکروفون سے ریکارڈ کریں" },
123
+ ja: { "complete-command": "スラッシュコマンドを補完", "complete-path": "プロジェクトのファイルパスを補完", history: "入力履歴を検索", "line-ends": "入力の先頭 / 末尾へ", delete: "前の単語 / 入力全体を削除", clear: "画面をクリアして再描画", interrupt: "現在のタスクを中断", voice: "マイクからプロンプトを録音" },
124
+ ko: { "complete-command": "슬래시 명령 자동완성", "complete-path": "프로젝트 파일 경로 자동완성", history: "입력 기록 검색", "line-ends": "입력의 처음 / 끝으로", delete: "이전 단어 / 전체 입력 삭제", clear: "화면 지우고 다시 그리기", interrupt: "현재 작업 중단", voice: "마이크로 프롬프트 녹음" },
125
+ de: { "complete-command": "Slash-Befehl vervollständigen", "complete-path": "Projektdateipfad vervollständigen", history: "Eingabeverlauf durchsuchen", "line-ends": "An Anfang / Ende der Eingabe", delete: "Vorheriges Wort / gesamte Eingabe löschen", clear: "Terminal leeren und neu zeichnen", interrupt: "Aktuelle Aufgabe abbrechen", voice: "Prompt über das Mikrofon aufnehmen" },
126
+ id: { "complete-command": "Lengkapi perintah garis miring", "complete-path": "Lengkapi jalur berkas proyek", history: "Cari riwayat masukan", "line-ends": "Ke awal / akhir masukan", delete: "Hapus kata sebelumnya / seluruh masukan", clear: "Bersihkan terminal dan gambar ulang", interrupt: "Hentikan tugas saat ini", voice: "Rekam prompt dari mikrofon" },
127
+ vi: { "complete-command": "Hoàn thành lệnh gạch chéo", "complete-path": "Hoàn thành đường dẫn tệp dự án", history: "Tìm trong lịch sử nhập", "line-ends": "Về đầu / cuối dòng nhập", delete: "Xóa từ trước / toàn bộ dòng nhập", clear: "Xóa và vẽ lại màn hình", interrupt: "Dừng tác vụ hiện tại", voice: "Ghi âm lời nhắc từ micro" },
128
+ tr: { "complete-command": "Eğik çizgi komutunu tamamla", "complete-path": "Proje dosya yolunu tamamla", history: "Girdi geçmişinde ara", "line-ends": "Girdinin başına / sonuna git", delete: "Önceki kelimeyi / tüm girdiyi sil", clear: "Terminali temizle ve yeniden çiz", interrupt: "Geçerli görevi durdur", voice: "Mikrofondan istem kaydet" }
129
+ };
130
+ function keyboardDescription(language, id, fallback) {
131
+ return TRANSLATED_KEYBOARD_IDS[language]?.[id] ?? fallback;
132
+ }
133
+ var MESSAGES = {
134
+ tagline: {
135
+ en: "a coding agent that shows its work",
136
+ zh: "会展示推导过程的编码代理",
137
+ hi: "अपना काम दिखाने वाला कोडिंग एजेंट",
138
+ es: "un agente de programación que muestra su razonamiento",
139
+ fr: "un agent de codage qui montre son raisonnement",
140
+ ar: "وكيل برمجة يُظهر خطوات عمله",
141
+ bn: "যে কোডিং এজেন্ট তার কাজ দেখায়",
142
+ pt: "um agente de programação que mostra seu raciocínio",
143
+ ru: "агент-программист, который показывает ход решения",
144
+ ur: "ایک کوڈنگ ایجنٹ جو اپنا کام دکھاتا ہے",
145
+ ja: "途中の考え方まで示すコーディングエージェント",
146
+ ko: "풀이 과정을 보여주는 코딩 에이전트",
147
+ de: "ein Coding-Agent, der seinen Rechenweg zeigt",
148
+ id: "agen pemrograman yang menunjukkan cara kerjanya",
149
+ vi: "một tác nhân lập trình trình bày cách làm",
150
+ tr: "yaptığı işi adım adım gösteren bir kodlama aracı"
151
+ },
152
+ "help.startHere": {
153
+ en: "Start here",
154
+ zh: "从这里开始",
155
+ hi: "यहाँ से शुरू करें",
156
+ es: "Empieza aquí",
157
+ fr: "Commencez ici",
158
+ ar: "ابدأ من هنا",
159
+ bn: "এখান থেকে শুরু করুন",
160
+ pt: "Comece aqui",
161
+ ru: "Начните здесь",
162
+ ur: "یہاں سے شروع کریں",
163
+ ja: "ここから始める",
164
+ ko: "여기서 시작",
165
+ de: "Hier anfangen",
166
+ id: "Mulai di sini",
167
+ vi: "Bắt đầu tại đây",
168
+ tr: "Buradan başlayın"
169
+ },
170
+ "help.running": {
171
+ en: "Running it",
172
+ zh: "运行方式",
173
+ hi: "इसे चलाना",
174
+ es: "Cómo ejecutarlo",
175
+ fr: "L'exécuter",
176
+ ar: "طريقة التشغيل",
177
+ bn: "এটি চালানো",
178
+ pt: "Como executar",
179
+ ru: "Как запускать",
180
+ ur: "اسے چلانا",
181
+ ja: "実行する",
182
+ ko: "실행하기",
183
+ de: "Ausführen",
184
+ id: "Menjalankannya",
185
+ vi: "Chạy nó",
186
+ tr: "Çalıştırma"
187
+ },
188
+ "help.files": {
189
+ en: "Where the files go",
190
+ zh: "文件位置",
191
+ hi: "फ़ाइलें कहाँ जाती हैं",
192
+ es: "Dónde van los archivos",
193
+ fr: "Où vont les fichiers",
194
+ ar: "أين تذهب الملفات",
195
+ bn: "ফাইল কোথায় যায়",
196
+ pt: "Para onde vão os arquivos",
197
+ ru: "Где находятся файлы",
198
+ ur: "فائلیں کہاں جاتی ہیں",
199
+ ja: "ファイルの場所",
200
+ ko: "파일이 저장되는 곳",
201
+ de: "Wohin die Dateien gehen",
202
+ id: "Ke mana berkas disimpan",
203
+ vi: "Tệp được lưu ở đâu",
204
+ tr: "Dosyalar nereye gider"
205
+ },
206
+ "help.model": {
207
+ en: "Model",
208
+ zh: "模型",
209
+ hi: "मॉडल",
210
+ es: "Modelo",
211
+ fr: "Modèle",
212
+ ar: "النموذج",
213
+ bn: "মডেল",
214
+ pt: "Modelo",
215
+ ru: "Модель",
216
+ ur: "ماڈل",
217
+ ja: "モデル",
218
+ ko: "모델",
219
+ de: "Modell",
220
+ id: "Model",
221
+ vi: "Mô hình",
222
+ tr: "Model"
223
+ },
224
+ "help.cost": {
225
+ en: "Cost",
226
+ zh: "费用",
227
+ hi: "लागत",
228
+ es: "Coste",
229
+ fr: "Coût",
230
+ ar: "التكلفة",
231
+ bn: "খরচ",
232
+ pt: "Custo",
233
+ ru: "Стоимость",
234
+ ur: "لاگت",
235
+ ja: "コスト",
236
+ ko: "비용",
237
+ de: "Kosten",
238
+ id: "Biaya",
239
+ vi: "Chi phí",
240
+ tr: "Maliyet"
241
+ },
242
+ "help.memory": {
243
+ en: "Memory and history",
244
+ zh: "记忆与历史",
245
+ hi: "मेमोरी और इतिहास",
246
+ es: "Memoria e historial",
247
+ fr: "Mémoire et historique",
248
+ ar: "الذاكرة والسجل",
249
+ bn: "মেমরি ও ইতিহাস",
250
+ pt: "Memória e histórico",
251
+ ru: "Память и история",
252
+ ur: "میموری اور تاریخ",
253
+ ja: "メモリと履歴",
254
+ ko: "메모리와 기록",
255
+ de: "Speicher und Verlauf",
256
+ id: "Memori dan riwayat",
257
+ vi: "Bộ nhớ và lịch sử",
258
+ tr: "Bellek ve geçmiş"
259
+ },
260
+ "help.transcript": {
261
+ en: "Reading the transcript",
262
+ zh: "阅读记录",
263
+ hi: "ट्रांसक्रिप्ट पढ़ना",
264
+ es: "Leer la transcripción",
265
+ fr: "Lire la transcription",
266
+ ar: "قراءة النص",
267
+ bn: "ট্রান্সক্রিপ্ট পড়া",
268
+ pt: "Ler a transcrição",
269
+ ru: "Чтение стенограммы",
270
+ ur: "ٹرانسکرپٹ پڑھنا",
271
+ ja: "記録を読む",
272
+ ko: "대화 기록 읽기",
273
+ de: "Das Transkript lesen",
274
+ id: "Membaca transkrip",
275
+ vi: "Đọc bản ghi",
276
+ tr: "Dökümü okuma"
277
+ },
278
+ "help.headless": {
279
+ en: "Headless output",
280
+ zh: "无界面输出",
281
+ hi: "हेडलेस आउटपुट",
282
+ es: "Salida sin interfaz",
283
+ fr: "Sortie sans interface",
284
+ ar: "المخرجات بدون واجهة",
285
+ bn: "হেডলেস আউটপুট",
286
+ pt: "Saída headless",
287
+ ru: "Вывод без интерфейса",
288
+ ur: "ہیڈ لیس آؤٹ پٹ",
289
+ ja: "ヘッドレス出力",
290
+ ko: "헤드리스 출력",
291
+ de: "Headless-Ausgabe",
292
+ id: "Keluaran tanpa antarmuka",
293
+ vi: "Đầu ra không giao diện",
294
+ tr: "Arayüzsüz çıktı"
295
+ },
296
+ "help.inSession": {
297
+ en: "In a session",
298
+ zh: "会话中",
299
+ hi: "सत्र में",
300
+ es: "En una sesión",
301
+ fr: "Dans une session",
302
+ ar: "داخل الجلسة",
303
+ bn: "একটি সেশনে",
304
+ pt: "Em uma sessão",
305
+ ru: "В сессии",
306
+ ur: "سیشن میں",
307
+ ja: "セッション中",
308
+ ko: "세션 안에서",
309
+ de: "In einer Sitzung",
310
+ id: "Dalam sesi",
311
+ vi: "Trong một phiên",
312
+ tr: "Bir oturumda"
313
+ },
314
+ "help.footnote": {
315
+ en: "Everything below is here when you need it — these five are the ones you need first.",
316
+ zh: "下面的内容备你所需——这五个是你首先要用的。",
317
+ hi: "नीचे सब कुछ ज़रूरत पड़ने पर है — ये पाँच पहले चाहिए।",
318
+ es: "Todo lo de abajo está aquí cuando lo necesites; estos cinco son los primeros.",
319
+ fr: "Tout ce qui suit est là au besoin — ces cinq-là sont les premiers.",
320
+ ar: "كل ما بالأسفل موجود عند الحاجة — وهذه الخمسة هي ما تحتاجه أولاً.",
321
+ bn: "নিচের সব কিছু প্রয়োজনে আছে — এই পাঁচটি প্রথমে দরকার।",
322
+ pt: "Tudo abaixo está aqui quando precisar — estes cinco vêm primeiro.",
323
+ ru: "Всё, что ниже, — на случай необходимости; эти пять нужны в первую очередь.",
324
+ ur: "نیچے سب کچھ ضرورت پر موجود ہے — یہ پانچ پہلے درکار ہیں۔",
325
+ ja: "以下は必要になったときのために。まずはこの5つ。",
326
+ ko: "아래는 필요할 때를 위한 것 — 이 다섯 개가 먼저 필요합니다.",
327
+ de: "Alles Weitere steht bereit, wenn du es brauchst — diese fünf zuerst.",
328
+ id: "Semua di bawah tersedia saat dibutuhkan — lima ini yang pertama.",
329
+ vi: "Mọi thứ bên dưới có sẵn khi bạn cần — năm mục này cần trước.",
330
+ tr: "Aşağıdakiler gerektiğinde burada — önce bu beşi."
331
+ },
332
+ "help.sessionHint": {
333
+ en: "marks the ones to learn first",
334
+ zh: "标记先学的项目",
335
+ hi: "पहले सीखने वाले चिह्नित",
336
+ es: "marca los que aprender primero",
337
+ fr: "marque ceux à apprendre d'abord",
338
+ ar: "يشير إلى ما يُتعلَّم أولاً",
339
+ bn: "প্রথমে শেখারগুলো চিহ্নিত",
340
+ pt: "marca os que aprender primeiro",
341
+ ru: "отмечает то, что изучить в первую очередь",
342
+ ur: "پہلے سیکھنے والوں کی نشاندہی",
343
+ ja: "最初に覚えるものを示す",
344
+ ko: "먼저 익힐 것을 표시",
345
+ de: "markiert, was zuerst zu lernen ist",
346
+ id: "menandai yang dipelajari lebih dulu",
347
+ vi: "đánh dấu những mục nên học trước",
348
+ tr: "önce öğrenilecekleri işaretler"
349
+ },
350
+ "mode.plan": {
351
+ en: "plan",
352
+ zh: "规划",
353
+ hi: "योजना",
354
+ es: "plan",
355
+ fr: "plan",
356
+ ar: "تخطيط",
357
+ bn: "পরিকল্পনা",
358
+ pt: "plano",
359
+ ru: "план",
360
+ ur: "منصوبہ",
361
+ ja: "計画",
362
+ ko: "계획",
363
+ de: "Plan",
364
+ id: "rencana",
365
+ vi: "kế hoạch",
366
+ tr: "plan"
367
+ },
368
+ "mode.auto": {
369
+ en: "auto",
370
+ zh: "自动",
371
+ hi: "स्वतः",
372
+ es: "auto",
373
+ fr: "auto",
374
+ ar: "تلقائي",
375
+ bn: "স্বয়ংক্রিয়",
376
+ pt: "auto",
377
+ ru: "авто",
378
+ ur: "خودکار",
379
+ ja: "自動",
380
+ ko: "자동",
381
+ de: "auto",
382
+ id: "otomatis",
383
+ vi: "tự động",
384
+ tr: "otomatik"
385
+ },
386
+ "mode.build": {
387
+ en: "build",
388
+ zh: "构建",
389
+ hi: "बिल्ड",
390
+ es: "construir",
391
+ fr: "construire",
392
+ ar: "بناء",
393
+ bn: "বিল্ড",
394
+ pt: "construir",
395
+ ru: "сборка",
396
+ ur: "بلڈ",
397
+ ja: "ビルド",
398
+ ko: "빌드",
399
+ de: "Build",
400
+ id: "bangun",
401
+ vi: "xây dựng",
402
+ tr: "derleme"
403
+ },
404
+ "mode.defender": {
405
+ en: "defender",
406
+ zh: "防御",
407
+ hi: "डिफेंडर",
408
+ es: "defensor",
409
+ fr: "défenseur",
410
+ ar: "مدافع",
411
+ bn: "ডিফেন্ডার",
412
+ pt: "defensor",
413
+ ru: "защита",
414
+ ur: "محافظ",
415
+ ja: "ディフェンダー",
416
+ ko: "디펜더",
417
+ de: "Verteidiger",
418
+ id: "penjaga",
419
+ vi: "phòng thủ",
420
+ tr: "savunucu"
421
+ },
422
+ "firstRun.notConfigured": {
423
+ en: "Archymedes is not configured yet. Add a provider key below to start.",
424
+ zh: "Archymedes 尚未配置。请在下方添加一个提供商密钥以开始。",
425
+ hi: "Archymedes अभी कॉन्फ़िगर नहीं है। शुरू करने के लिए नीचे एक प्रदाता कुंजी जोड़ें।",
426
+ es: "Archymedes aún no está configurado. Añade una clave de proveedor abajo para empezar.",
427
+ fr: "Archymedes n'est pas encore configuré. Ajoutez une clé de fournisseur ci-dessous pour commencer.",
428
+ ar: "لم يتم إعداد Archymedes بعد. أضف مفتاح مزوّد بالأسفل للبدء.",
429
+ bn: "Archymedes এখনও কনফিগার করা হয়নি। শুরু করতে নিচে একটি প্রোভাইডার কী যোগ করুন।",
430
+ pt: "O Archymedes ainda não está configurado. Adicione uma chave de provedor abaixo para começar.",
431
+ ru: "Archymedes ещё не настроен. Добавьте ключ провайдера ниже, чтобы начать.",
432
+ ur: "Archymedes ابھی ترتیب نہیں دیا گیا۔ شروع کرنے کے لیے نیچے ایک پرووائیڈر کلید شامل کریں۔",
433
+ ja: "Archymedes はまだ設定されていません。開始するには下でプロバイダーのキーを追加してください。",
434
+ ko: "Archymedes가 아직 설정되지 않았습니다. 시작하려면 아래에 공급자 키를 추가하세요.",
435
+ de: "Archymedes ist noch nicht konfiguriert. Füge unten einen Anbieter-Schlüssel hinzu, um zu starten.",
436
+ id: "Archymedes belum dikonfigurasi. Tambahkan kunci penyedia di bawah untuk memulai.",
437
+ vi: "Archymedes chưa được cấu hình. Thêm khóa nhà cung cấp bên dưới để bắt đầu.",
438
+ tr: "Archymedes henüz yapılandırılmadı. Başlamak için aşağıya bir sağlayıcı anahtarı ekleyin."
439
+ },
440
+ "doctor.header": {
441
+ en: "Archymedes connectivity check",
442
+ zh: "Archymedes 连接检查",
443
+ hi: "Archymedes कनेक्टिविटी जाँच",
444
+ es: "Comprobación de conectividad de Archymedes",
445
+ fr: "Vérification de connectivité d'Archymedes",
446
+ ar: "فحص اتصال Archymedes",
447
+ bn: "Archymedes সংযোগ পরীক্ষা",
448
+ pt: "Verificação de conectividade do Archymedes",
449
+ ru: "Проверка соединения Archymedes",
450
+ ur: "Archymedes کنیکٹیویٹی جانچ",
451
+ ja: "Archymedes 接続チェック",
452
+ ko: "Archymedes 연결 점검",
453
+ de: "Archymedes-Verbindungsprüfung",
454
+ id: "Pemeriksaan konektivitas Archymedes",
455
+ vi: "Kiểm tra kết nối Archymedes",
456
+ tr: "Archymedes bağlantı kontrolü"
457
+ },
458
+ "doctor.allReachable": {
459
+ en: "All required endpoints are reachable.",
460
+ zh: "所有必需的端点均可访问。",
461
+ hi: "सभी आवश्यक एंडपॉइंट पहुँच योग्य हैं।",
462
+ es: "Todos los puntos finales necesarios son accesibles.",
463
+ fr: "Tous les points de terminaison requis sont accessibles.",
464
+ ar: "جميع نقاط النهاية المطلوبة قابلة للوصول.",
465
+ bn: "সব প্রয়োজনীয় এন্ডপয়েন্টে পৌঁছানো যাচ্ছে।",
466
+ pt: "Todos os endpoints necessários estão acessíveis.",
467
+ ru: "Все необходимые адреса доступны.",
468
+ ur: "تمام مطلوبہ اینڈ پوائنٹس قابل رسائی ہیں۔",
469
+ ja: "必要なエンドポイントはすべて到達可能です。",
470
+ ko: "필요한 모든 엔드포인트에 연결할 수 있습니다.",
471
+ de: "Alle erforderlichen Endpunkte sind erreichbar.",
472
+ id: "Semua endpoint yang diperlukan dapat dijangkau.",
473
+ vi: "Tất cả các endpoint cần thiết đều truy cập được.",
474
+ tr: "Gerekli tüm uç noktalara erişilebiliyor."
475
+ },
476
+ "doctor.noProvider": {
477
+ en: "No provider is configured — set an API key to use Archymedes.",
478
+ zh: "未配置任何提供商——设置一个 API 密钥以使用 Archymedes。",
479
+ hi: "कोई प्रदाता कॉन्फ़िगर नहीं है — Archymedes उपयोग करने के लिए एक API कुंजी सेट करें।",
480
+ es: "No hay ningún proveedor configurado: establece una clave de API para usar Archymedes.",
481
+ fr: "Aucun fournisseur configuré — définissez une clé API pour utiliser Archymedes.",
482
+ ar: "لا يوجد مزوّد مُهيّأ — عيّن مفتاح API لاستخدام Archymedes.",
483
+ bn: "কোনো প্রোভাইডার কনফিগার করা নেই — Archymedes ব্যবহার করতে একটি API কী সেট করুন।",
484
+ pt: "Nenhum provedor configurado — defina uma chave de API para usar o Archymedes.",
485
+ ru: "Провайдер не настроен — задайте ключ API, чтобы использовать Archymedes.",
486
+ ur: "کوئی پرووائیڈر ترتیب نہیں — Archymedes استعمال کرنے کے لیے ایک API کلید سیٹ کریں۔",
487
+ ja: "プロバイダーが未設定です。Archymedes を使うには API キーを設定してください。",
488
+ ko: "설정된 공급자가 없습니다 — Archymedes를 사용하려면 API 키를 설정하세요.",
489
+ de: "Kein Anbieter konfiguriert — lege einen API-Schlüssel fest, um Archymedes zu nutzen.",
490
+ id: "Tidak ada penyedia yang dikonfigurasi — atur kunci API untuk memakai Archymedes.",
491
+ vi: "Chưa cấu hình nhà cung cấp — đặt khóa API để dùng Archymedes.",
492
+ tr: "Yapılandırılmış sağlayıcı yok — Archymedes'i kullanmak için bir API anahtarı ayarlayın."
493
+ },
494
+ "doctor.cannotReach": {
495
+ en: "Archymedes cannot reach its model provider:",
496
+ zh: "Archymedes 无法连接其模型提供商:",
497
+ hi: "Archymedes अपने मॉडल प्रदाता तक नहीं पहुँच सकता:",
498
+ es: "Archymedes no puede acceder a su proveedor de modelos:",
499
+ fr: "Archymedes ne peut pas joindre son fournisseur de modèles :",
500
+ ar: "لا يستطيع Archymedes الوصول إلى مزوّد النموذج:",
501
+ bn: "Archymedes তার মডেল প্রোভাইডারে পৌঁছাতে পারছে না:",
502
+ pt: "O Archymedes não consegue acessar seu provedor de modelos:",
503
+ ru: "Archymedes не может связаться с провайдером модели:",
504
+ ur: "Archymedes اپنے ماڈل پرووائیڈر تک نہیں پہنچ سکتا:",
505
+ ja: "Archymedes はモデルプロバイダーに接続できません:",
506
+ ko: "Archymedes가 모델 공급자에 연결할 수 없습니다:",
507
+ de: "Archymedes kann seinen Modellanbieter nicht erreichen:",
508
+ id: "Archymedes tidak dapat menjangkau penyedia modelnya:",
509
+ vi: "Archymedes không thể kết nối tới nhà cung cấp mô hình:",
510
+ tr: "Archymedes model sağlayıcısına ulaşamıyor:"
511
+ },
512
+ "balance.tracking": {
513
+ en: "Archymedes will subtract each turn's measured cost from it.",
514
+ zh: "Archymedes 将从中扣除每轮的实测费用。",
515
+ hi: "Archymedes हर टर्न की मापी गई लागत इसमें से घटाएगा।",
516
+ es: "Archymedes restará de él el coste medido de cada turno.",
517
+ fr: "Archymedes en soustraira le coût mesuré de chaque tour.",
518
+ ar: "سيخصم Archymedes منه التكلفة المقاسة لكل جولة.",
519
+ bn: "Archymedes প্রতিটি টার্নের পরিমাপকৃত খরচ এটি থেকে বাদ দেবে।",
520
+ pt: "O Archymedes subtrairá dele o custo medido de cada turno.",
521
+ ru: "Archymedes будет вычитать из него измеренную стоимость каждого хода.",
522
+ ur: "Archymedes ہر باری کی ماپی گئی لاگت اس میں سے منہا کرے گا۔",
523
+ ja: "Archymedes は各ターンの実測コストをここから差し引きます。",
524
+ ko: "Archymedes가 매 턴의 측정된 비용을 여기서 차감합니다.",
525
+ de: "Archymedes zieht die gemessenen Kosten jeder Runde davon ab.",
526
+ id: "Archymedes akan mengurangi biaya terukur setiap giliran dari saldo ini.",
527
+ vi: "Archymedes sẽ trừ chi phí đo được của mỗi lượt khỏi số dư này.",
528
+ tr: "Archymedes her turun ölçülen maliyetini bundan düşecek."
529
+ }
530
+ };
531
+ function t(language, key) {
532
+ return MESSAGES[key][language] ?? MESSAGES[key].en;
533
+ }
534
+
535
+ // packages/archymedes-cli/src/commands.ts
536
+ function defineCommands(table) {
537
+ return Object.entries(table).map(([name, command]) => ({ name, ...command }));
538
+ }
539
+ var COMMANDS2 = defineCommands({
540
+ "/mode": { args: "[plan|build|auto|defender]", description: "Show or switch the permission mode" },
541
+ "/plan": { description: "Switch to plan mode — read and reason, no writes" },
542
+ "/build": { description: "Switch to build mode — edits need approval" },
543
+ "/auto": { description: "Auto-apply ordinary edits; sensitive actions still ask" },
544
+ "/defender": { description: "Switch to defender mode — find and fix real security issues, every change still asks" },
545
+ "/models": { args: "[refresh]", description: "Every model each provider actually offers, with prices — or add a key for one you can't use yet" },
546
+ "/model": { args: "[name | N | provider model]", description: "Open the model picker, or switch straight to a name, keeping the transcript" },
547
+ "/fallback": { args: "[off|ask|provider:model]", description: "Opt into a safe alternate model after transient provider failures" },
548
+ "/undo": { args: "[code|conversation]", description: "Revert the last turn — files, the conversation, or both (default)" },
549
+ "/retry": { description: "Repeat the last failed request only when no tool or file change already happened" },
550
+ "/continue": { description: "Resume an interrupted or incomplete task from its current workspace state" },
551
+ "/diff": { description: "What changed since the last checkpoint" },
552
+ "/todos": { description: "The agent's current plan" },
553
+ "/task": { description: "Where the whole task stands: request, plan, changes, verification, blockers" },
554
+ "/route": { args: "[all|summary|plan]", description: "The hosted exchange's routing decision: chosen model, alternatives, policy, est vs actual cost. `plan` forecasts the next turn before spending" },
555
+ "/clear": { description: "Start a fresh thread" },
556
+ "/memory": { args: "[add|replace|recall|forget]", description: "Bounded, relevant memory across sessions — # <fact> remembers for this project" },
557
+ "/history": { args: "[<id> | search <text> | resume | status]", description: "Browse, search or pick up durable conversation history" },
558
+ "/export": { args: "[markdown|json|support]", description: "Write a redacted session transcript or compact support artifact" },
559
+ "/expand": { args: "[N | all | list]", description: "Show a folded block — written code, a test run, a long result — in full" },
560
+ "/slow": { args: "[on|strict|off]", description: "Spend at a slower pace: fewer model rounds, smaller replies, a pause between turns" },
561
+ "/workspace": { description: "Open the control panel: every tab and watched job, live, on one screen" },
562
+ "/watch": { args: "[id|show <id>|stop <id>]", description: "Follow a background job's output without giving up the prompt" },
563
+ "/theme": { args: "[name|list|where]", description: "Change the colours — blueprint, parchment, chalkboard, high-contrast, or a .tss file of your own" },
564
+ "/tab": { args: "[new|next|prev|close|rename|N]", description: "Several pieces of work, one at a time — only the tab in front runs (/detach for parallel)" },
565
+ "/pull": { args: "[dir]", description: "Copy sandbox files here" },
566
+ "/where": { description: "Show the current workspace" },
567
+ "/tools": { description: "What the agent can call, and which skills, plugins, MCP servers or hooks a project added" },
568
+ "/providers": { description: "Which model providers are configured" },
569
+ "/settings": { description: "Configure API keys, URLs, models and voice input" },
570
+ "/update": { args: "[auto|check|off]", description: "Update Archymedes now, or choose whether it updates itself" },
571
+ "/voice": { args: "[audio-file]", description: "Record or transcribe an editable voice prompt" },
572
+ "/wander": { args: "[topic|random|daily|weekly]", description: "Run a bounded research lab and grade what it finds" },
573
+ "/jobs": { args: "[run|cancel|approve]", description: "Durable background work: list, start, cancel, or answer" },
574
+ "/attach": { args: "<id>", description: "Watch a background job's log live" },
575
+ "/detach": { args: "<task>", description: "Start work in the background; press Alt+B to send a running turn there" },
576
+ "/cost": { description: "Token and cost breakdown for this session" },
577
+ "/balance": { args: "[amount] [currency] | clear", description: "Your Archymedes credit balance on the exchange, or a locally tracked spend limit on a direct provider" },
578
+ "/scan": { args: "[glob]", description: "Deterministic secret scan of the workspace, worst severity first — no model turn needed" },
579
+ "/sessions": { description: "List sessions in this project (an alias for /history)" },
580
+ "/palette": { description: "Search every command by name or by what it does" },
581
+ "/keys": { description: "Every shortcut in full, plus line-editing keys and which chords this terminal may not deliver — /help lists them inline, next to each command" },
582
+ "/guide": { args: "[topic|search <text>|all]", description: "The user guide, as a screen you can browse — or print one topic with /guide <topic>" },
583
+ "/files": { description: "Browse the project tree — expand folders, preview a file, pick one to @mention" },
584
+ "/edit": { args: "<path>", description: "Open a file in the built-in editor — through the workspace, so it works in a sandbox too" },
585
+ "/help": { args: "[all|work|review|steer|parallel|learn|setup]", description: "Commands grouped by purpose" },
586
+ "/exit": { description: "Leave" }
587
+ });
588
+
589
+ export { newViewport, applyViewport, visibleLines, scrollFraction, CONTROL_LANGUAGES, resolveControlLanguage, controlLabel, commandDescription, keyboardDescription, t, COMMANDS2 as COMMANDS };