agentsw 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/i18n.js +60 -38
  2. package/dist/menu.js +28 -22
  3. package/package.json +1 -1
package/dist/i18n.js CHANGED
@@ -63,62 +63,70 @@ const messages = {
63
63
  "menu.selectInstructions": { en: "↑/↓ move · Enter select", "zh-CN": "↑/↓ 移动 · Enter 选择" },
64
64
  "import.multiInstructions": { en: "↑/↓ move · Space toggle · Enter confirm", "zh-CN": "↑/↓ 移动 · 空格切换 · Enter 确认" },
65
65
  "menu.title": { en: " · interactive menu — Ctrl+C quits, ↑/↓ selects", "zh-CN": " · 交互菜单 — Ctrl+C 退出,↑/↓ 选择" },
66
- "menu.noProviders": { en: "no providers configured yet", "zh-CN": "尚未配置供应商" },
67
- "menu.noProvidersHint": { en: "no providers configured — choose import existing providers or add/update provider first", "zh-CN": "尚未配置供应商——请先选择导入已有供应商或添加/更新供应商" },
68
- "menu.firstScan": { en: "scan existing app configs and import custom providers now?", "zh-CN": "现在扫描应用配置并导入已有自定义供应商?" },
66
+ "menu.noProviders": { en: "no providers saved in agentsw yet", "zh-CN": "agentsw 中尚未保存供应商" },
67
+ "menu.noProvidersHint": { en: "no providers saved in agentsw — choose Add provider or Import existing providers first", "zh-CN": "agentsw 中尚未保存供应商,请先选择“添加供应商”或“导入已有供应商”" },
68
+ "menu.firstScan": { en: "import providers from existing agent configs into agentsw?", "zh-CN": "是否从已有智能体配置中导入供应商到 agentsw?" },
69
69
  "menu.what": { en: "what to do?", "zh-CN": "请选择操作" },
70
- "menu.add": { en: "add / update provider (id · protocol · base URL · API key)", "zh-CN": "添加 / 更新供应商 (id · 协议 · base URL · API key)" },
71
- "menu.import": { en: "import existing providers (scan app configs · auto-dedupe)", "zh-CN": "导入已有供应商 (扫描应用配置 · 自动去重)" },
72
- "menu.use": { en: "switch provider (use and sync into app configs)", "zh-CN": "切换供应商 (写入并同步到应用配置)" },
73
- "menu.status": { en: "status (what each app currently points at)", "zh-CN": "查看状态 (各应用当前指向)" },
74
- "menu.list": { en: "list providers", "zh-CN": "列出供应商" },
75
- "menu.sync": { en: "sync active provider (re-apply to app configs)", "zh-CN": "同步当前供应商 (重新应用到应用配置)" },
76
- "menu.discover": { en: "discover models (refresh provider list + metadata)", "zh-CN": "发现模型 (刷新供应商模型与元数据)" },
77
- "menu.remove": { en: "remove provider", "zh-CN": "删除供应商" },
78
- "menu.rename": { en: "rename provider (migrate references with backups)", "zh-CN": "重命名供应商 (备份并迁移引用)" },
79
- "menu.renameProvider": { en: "which provider to rename?", "zh-CN": "重命名哪个供应商?" },
80
- "menu.newId": { en: "new provider ID", "zh-CN": "新的供应商 ID" },
81
- "menu.renameConfirm": { en: "rename {oldId} to {newId} across configured apps?", "zh-CN": "将 {oldId} 重命名为 {newId},并迁移已配置智能体的引用?" },
70
+ "menu.add": { en: "Add / update provider (manual setup)", "zh-CN": "添加或更新供应商(手动设置)" },
71
+ "menu.import": { en: "Import existing providers", "zh-CN": "导入已有供应商" },
72
+ "menu.use": { en: "Switch provider and default model", "zh-CN": "切换供应商和默认模型" },
73
+ "menu.status": { en: "View each agent's current configuration", "zh-CN": "查看各智能体当前配置" },
74
+ "menu.list": { en: "View providers saved in agentsw", "zh-CN": "查看 agentsw 供应商列表" },
75
+ "menu.sync": { en: "Re-sync the current provider to agents", "zh-CN": "重新同步当前供应商" },
76
+ "menu.discover": { en: "Update a provider's model list", "zh-CN": "更新供应商模型列表" },
77
+ "menu.remove": { en: "Delete provider configuration", "zh-CN": "删除供应商配置" },
78
+ "menu.rename": { en: "Change a provider ID", "zh-CN": "修改供应商 ID" },
79
+ "menu.renameProvider": { en: "which provider ID should be changed?", "zh-CN": "选择要修改 ID 的供应商" },
80
+ "menu.newId": { en: "new provider ID (used in config references)", "zh-CN": "新的供应商 ID(用于配置引用)" },
81
+ "menu.renameConfirm": { en: "change provider ID from {oldId} to {newId} and update agent config references? Files are backed up first.", "zh-CN": "将供应商 ID 从 {oldId} 改为 {newId},并更新智能体中的关联配置?修改前自动备份。" },
82
82
  "menu.removeScope": { en: "where should this provider be removed?", "zh-CN": "从哪里删除供应商?" },
83
- "menu.removeStore": { en: "agentsw store only (keep app configs)", "zh-CN": "仅从 agentsw 删除(保留智能体配置)" },
84
- "menu.removeEverywhere": { en: "agentsw and matching app configurations", "zh-CN": "从 agentsw 和匹配的智能体配置中删除" },
85
- "menu.removeLocal": { en: "one agent only (including entries not imported into agentsw)", "zh-CN": "仅从一个智能体删除(包括未导入 agentsw 的供应商)" },
86
- "menu.noRemovable": { en: "no providers found in this scope", "zh-CN": "这个范围内没有可删除的供应商" },
87
- "menu.removeApp": { en: "which agent should this provider be removed from?", "zh-CN": "从哪个智能体删除供应商?" },
88
- "menu.removeConfirmScope": { en: "remove {id} from {scope}? Default references will be cleared; files are backed up first.", "zh-CN": "从 {scope} 删除 {id}?相关默认引用将被清理,文件会先备份。" },
89
- "menu.apps": { en: "agent versions (check installed CLIs / upgrade)", "zh-CN": "智能体版本 (检查已安装 CLI / 升级)" },
90
- "menu.language": { en: "language / 语言", "zh-CN": "语言 / Language" },
91
- "menu.quit": { en: "quit", "zh-CN": "退出" },
83
+ "menu.removeStore": { en: "Delete only the record in agentsw", "zh-CN": "只删除 agentsw 中的记录" },
84
+ "menu.removeEverywhere": { en: "Delete the agentsw record and matching agent configs", "zh-CN": "同时删除 agentsw 记录和智能体配置" },
85
+ "menu.removeLocal": { en: "Delete only one agent's configuration", "zh-CN": "只删除某个智能体中的配置" },
86
+ "menu.noRemovable": { en: "no provider records found here; return to the menu to choose another scope", "zh-CN": "所选位置没有供应商记录,请返回菜单选择其他删除范围" },
87
+ "menu.removeApp": { en: "which agent's configuration should be changed?", "zh-CN": "选择要删除配置的智能体" },
88
+ "menu.removeStoreHelp": { en: "Keep all agent configs; the agents can still use this provider.", "zh-CN": "保留各智能体配置,它们仍可继续使用该供应商。" },
89
+ "menu.removeEverywhereHelp": { en: "Remove the saved provider and matching agent entries, including related default selections.", "zh-CN": "删除已保存的供应商及各智能体中匹配的配置,并清理相关默认选择。" },
90
+ "menu.removeLocalHelp": { en: "Keep agentsw and other agents unchanged; also works for providers never imported into agentsw.", "zh-CN": "保留 agentsw 和其他智能体;也支持从未导入 agentsw 的供应商。" },
91
+ "menu.removeConfirmStore": { en: "delete {id} from agentsw only? All agent configs stay unchanged. Files are backed up first.", "zh-CN": "确认只删除 agentsw 中的供应商 {id}?各智能体配置保持不变,修改前自动备份。" },
92
+ "menu.removeConfirmEverywhere": { en: "delete {id} from agentsw and matching agent configs? Related default selections will also be cleared. Files are backed up first.", "zh-CN": "确认删除 {id} 的 agentsw 记录和匹配的智能体配置?相关默认选择会一并清理,修改前自动备份。" },
93
+ "menu.removeConfirmLocal": { en: "delete {id} only from {app}? Keep agentsw and other agents unchanged; syncing later may add it back. Files are backed up first.", "zh-CN": "仅从 {app} 删除 {id}?保留 agentsw 和其他智能体配置,再次同步可能恢复。修改前自动备份。" },
94
+ "menu.confirmRename": { en: "Change ID", "zh-CN": "确认修改 ID" },
95
+ "menu.confirmRemove": { en: "Delete configuration", "zh-CN": "确认删除" },
96
+ "menu.cancelAction": { en: "Cancel, return to menu", "zh-CN": "取消,返回菜单" },
97
+ "menu.apps": { en: "Check agent versions and updates", "zh-CN": "检查智能体版本和更新" },
98
+ "menu.language": { en: "Change language / 语言", "zh-CN": "切换界面语言 / Language" },
99
+ "menu.quit": { en: "Exit menu", "zh-CN": "退出菜单" },
92
100
  "menu.yes": { en: "yes", "zh-CN": "是" },
93
101
  "menu.no": { en: "no", "zh-CN": "否" },
94
- "menu.modelSource": { en: "how to fill the model list?", "zh-CN": "如何填写模型列表?" },
95
- "menu.modelDiscover": { en: "discover from the provider's /v1/models (recommended)", "zh-CN": "从供应商 /v1/models 自动发现(推荐)" },
96
- "menu.modelManual": { en: "type model ids manually", "zh-CN": "手动输入模型 id" },
97
- "menu.pickProvider": { en: "switch to provider", "zh-CN": "切换到供应商" },
102
+ "menu.modelSource": { en: "how should the model list be obtained?", "zh-CN": "选择模型列表的获取方式" },
103
+ "menu.modelDiscover": { en: "Fetch from the provider API (recommended)", "zh-CN": "从供应商接口自动获取(推荐)" },
104
+ "menu.modelManual": { en: "Enter model IDs manually", "zh-CN": "手动输入模型 ID" },
105
+ "menu.pickProvider": { en: "which provider should agents switch to?", "zh-CN": "选择要切换到的供应商" },
98
106
  "menu.defaultModel": { en: "default model", "zh-CN": "默认模型" },
99
107
  "menu.keepDefault": { en: "keep current default ({model})", "zh-CN": "保持当前默认模型({model})" },
100
- "menu.active": { en: "active", "zh-CN": "当前" },
101
- "menu.discoverFor": { en: "discover models for", "zh-CN": "为供应商发现模型" },
102
- "menu.pushRefresh": { en: "push refreshed provider into app configs?", "zh-CN": "将刷新后的供应商推送到应用配置?" },
103
- "menu.removeProvider": { en: "remove provider", "zh-CN": "删除供应商" },
108
+ "menu.active": { en: "current in agentsw", "zh-CN": "agentsw 当前" },
109
+ "menu.discoverFor": { en: "which provider's model list should be updated?", "zh-CN": "选择要更新模型列表的供应商" },
110
+ "menu.pushRefresh": { en: "also sync this provider to agent configs after updating its model list?", "zh-CN": "更新模型列表后,是否同时将该供应商同步到智能体配置?" },
111
+ "menu.removeProvider": { en: "which provider configuration should be deleted?", "zh-CN": "选择要删除配置的供应商" },
104
112
  "menu.reallyRemove": { en: "really remove {id}?", "zh-CN": "确认删除 {id}?" },
105
113
  "menu.pruneConfigs": { en: "also remove its entries from app configs?", "zh-CN": "同时从应用配置中移除其条目?" },
106
- "menu.upgrade": { en: "upgrade everything outdated?", "zh-CN": "升级全部过期项?" },
107
- "menu.installApp": { en: "install an agent", "zh-CN": "安装智能体" },
114
+ "menu.upgrade": { en: "upgrade all installed agents that have updates?", "zh-CN": "是否升级所有有新版本的已安装智能体?" },
115
+ "menu.installApp": { en: "Install a new coding agent", "zh-CN": "安装新的智能体" },
108
116
  "menu.pickApp": { en: "which agent to install?", "zh-CN": "安装哪个智能体?" },
109
117
  "menu.installConfirm": { en: "install {name} via: {cmd}?", "zh-CN": "通过以下命令安装 {name}: {cmd}?" },
110
118
  "menu.allInstalled": { en: "all agents already installed", "zh-CN": "所有智能体均已安装" },
111
119
  "menu.bye": { en: "bye", "zh-CN": "再见" },
112
120
  "add.id": { en: "provider id (slug)", "zh-CN": "供应商 id(slug)" },
113
121
  "add.idAuto": { en: "provider id (leave blank for hostname + protocol)", "zh-CN": "供应商 ID(留空使用完整域名 + 协议)" },
114
- "add.idInvalid": { en: "lowercase slug, e.g. glm or my-proxy", "zh-CN": "请用小写 slug,例如 glm 或 my-proxy" },
122
+ "add.idInvalid": { en: "start with a lowercase letter or digit; use only lowercase letters, digits, - and _, e.g. my-proxy", "zh-CN": "以小写字母或数字开头,仅含小写字母、数字、-、_,如 my-proxy" },
115
123
  "add.name": { en: "display name", "zh-CN": "显示名称" },
116
124
  "add.protocol": { en: "wire protocol", "zh-CN": "接口协议" },
117
125
  "add.openai": { en: "openai (chat completions)", "zh-CN": "openai (chat completions)" },
118
126
  "add.anthropic": { en: "anthropic (messages)", "zh-CN": "anthropic (messages)" },
119
- "add.baseUrl": { en: "base URL", "zh-CN": "base URL" },
127
+ "add.baseUrl": { en: "API base URL", "zh-CN": "接口地址(Base URL)" },
120
128
  "add.baseUrlInvalid": { en: "must start with http(s)://", "zh-CN": "必须以 http(s):// 开头" },
121
- "add.apiKey": { en: "API key", "zh-CN": "API key" },
129
+ "add.apiKey": { en: "API key", "zh-CN": "API 密钥(API key)" },
122
130
  "add.models": { en: "model ids (comma separated, or leave blank to auto-discover)", "zh-CN": "模型 id(逗号分隔,留空则自动发现)" },
123
131
  "add.cancelled": { en: "cancelled", "zh-CN": "已取消" },
124
132
  "import.already": { en: "already configured as {id}", "zh-CN": "已配置为 {id}" },
@@ -170,7 +178,21 @@ const messages = {
170
178
  "quick.noProtocol": { en: "no supported protocol found at this endpoint (tried openai and anthropic)", "zh-CN": "该端点未检测到支持的协议(已尝试 openai 和 anthropic)" },
171
179
  "quick.noModelsAfterFilter": { en: "{id}: no models left after filtering, skipping", "zh-CN": "{id}: 过滤后无剩余模型,跳过" },
172
180
  "quick.summary": { en: "created {count} provider(s): {ids}", "zh-CN": "创建了 {count} 个供应商: {ids}" },
173
- "menu.quickAdd": { en: "quick add (auto-detect protocol + models)", "zh-CN": "快速添加(自动探测协议 + 模型)" },
181
+ "menu.quickAdd": { en: "Add provider (auto-detect)", "zh-CN": "添加供应商(自动识别)" },
182
+ "menu.quickAddHelp": { en: "Recommended: enter an API URL and key; detect protocols and models automatically.", "zh-CN": "推荐:只填接口地址和 API key,自动识别协议与模型。" },
183
+ "menu.addHelp": { en: "Choose the protocol and model setup yourself; use an existing ID to update a provider.", "zh-CN": "自行选择协议和模型获取方式;填写已有 ID 可更新供应商。" },
184
+ "menu.importHelp": { en: "Read providers from agents or cc-switch into agentsw; leave source configs unchanged.", "zh-CN": "从智能体或 cc-switch 读取配置并保存到 agentsw,不修改来源配置。" },
185
+ "menu.useHelp": { en: "Select a provider and default model, then write them to compatible agent configs.", "zh-CN": "选择供应商和默认模型,然后写入支持该协议的智能体配置。" },
186
+ "menu.statusHelp": { en: "Show detected agents, their current providers and config file locations.", "zh-CN": "查看检测到的智能体、所用供应商及配置文件位置。" },
187
+ "menu.listHelp": { en: "Show only the providers, protocols and default models saved in agentsw.", "zh-CN": "只查看 agentsw 已保存的供应商、协议和默认模型。" },
188
+ "menu.syncHelp": { en: "Write the current agentsw provider to agent configs without fetching a new model list.", "zh-CN": "将 agentsw 当前供应商写入智能体配置,不重新获取模型列表。" },
189
+ "menu.discoverHelp": { en: "Fetch models from the provider, fill in model metadata, and optionally sync to agents.", "zh-CN": "从供应商接口重新获取模型并补全模型参数,可选择同步到智能体。" },
190
+ "menu.renameHelp": { en: "Change the config ID and update references; keep custom display names.", "zh-CN": "修改配置中的标识并更新关联引用,保留自定义显示名称。" },
191
+ "menu.removeHelp": { en: "Choose where to delete: agentsw only, one agent only, or both.", "zh-CN": "先选择删除范围:仅 agentsw、仅某个智能体,或两处一起。" },
192
+ "menu.appsHelp": { en: "Compare installed and latest versions, then choose whether to upgrade.", "zh-CN": "对比已安装版本和最新版本,再选择是否升级。" },
193
+ "menu.installAppHelp": { en: "Choose an agent that is not installed yet, such as Claude Code, Codex or omp.", "zh-CN": "选择尚未安装的编码智能体,如 Claude Code、Codex 或 omp。" },
194
+ "menu.languageHelp": { en: "Choose English or 简体中文 and save the language for future runs.", "zh-CN": "选择简体中文或 English,保存为后续运行的界面语言。" },
195
+ "menu.quitHelp": { en: "End this menu session without performing another action.", "zh-CN": "结束本次交互,不执行其他操作。" },
174
196
  "import.skip": { en: "skip", "zh-CN": "跳过" },
175
197
  "import.modelsCount": { en: "{count} models", "zh-CN": "{count} 个模型" },
176
198
  "table.protocol": { en: "PROTOCOL", "zh-CN": "协议" },
package/dist/menu.js CHANGED
@@ -13,8 +13,8 @@ function bye() {
13
13
  process.exit(0);
14
14
  }
15
15
  const cancel = { onCancel: () => bye() };
16
- async function askToggle(message, initial = false) {
17
- const { v } = await prompts({ type: "toggle", name: "v", message, active: t("menu.yes"), inactive: t("menu.no"), initial }, cancel);
16
+ async function askToggle(message, initial = false, labels) {
17
+ const { v } = await prompts({ type: "toggle", name: "v", message, active: labels?.active ?? t("menu.yes"), inactive: labels?.inactive ?? t("menu.no"), initial }, cancel);
18
18
  return v === true;
19
19
  }
20
20
  async function chooseLanguage() {
@@ -77,7 +77,9 @@ async function renameFromMenu() {
77
77
  return;
78
78
  const next = String(newId).trim();
79
79
  await cmdRename(picked.id, next, { dryRun: true });
80
- if (await askToggle(t("menu.renameConfirm", { oldId: picked.id, newId: next }))) {
80
+ if (await askToggle(t("menu.renameConfirm", { oldId: picked.id, newId: next }), false, {
81
+ active: t("menu.confirmRename"), inactive: t("menu.cancelAction"),
82
+ })) {
81
83
  await cmdRename(picked.id, next);
82
84
  }
83
85
  }
@@ -88,9 +90,9 @@ async function removeFromMenu() {
88
90
  message: t("menu.removeScope"),
89
91
  hint: t("menu.selectInstructions"),
90
92
  choices: [
91
- { title: t("menu.removeStore"), value: "store" },
92
- { title: t("menu.removeEverywhere"), value: "everywhere" },
93
- { title: t("menu.removeLocal"), value: "local" },
93
+ { title: t("menu.removeStore"), description: t("menu.removeStoreHelp"), value: "store" },
94
+ { title: t("menu.removeLocal"), description: t("menu.removeLocalHelp"), value: "local" },
95
+ { title: t("menu.removeEverywhere"), description: t("menu.removeEverywhereHelp"), value: "everywhere" },
94
96
  ],
95
97
  }, cancel);
96
98
  if (!scope)
@@ -130,8 +132,12 @@ async function removeFromMenu() {
130
132
  return;
131
133
  const opts = scope === "local" ? { apps: picked.app } : { prune: scope === "everywhere" };
132
134
  await cmdRemoveProvider(picked.id, { ...opts, dryRun: true });
133
- const scopeLabel = picked.app ?? t(scope === "everywhere" ? "menu.removeEverywhere" : "menu.removeStore");
134
- if (await askToggle(t("menu.removeConfirmScope", { id: picked.id, scope: scopeLabel }))) {
135
+ const confirmation = picked.app
136
+ ? t("menu.removeConfirmLocal", { id: picked.id, app: picked.app })
137
+ : t(scope === "everywhere" ? "menu.removeConfirmEverywhere" : "menu.removeConfirmStore", { id: picked.id });
138
+ if (await askToggle(confirmation, false, {
139
+ active: t("menu.confirmRemove"), inactive: t("menu.cancelAction"),
140
+ })) {
135
141
  await cmdRemoveProvider(picked.id, opts);
136
142
  }
137
143
  }
@@ -152,20 +158,20 @@ export async function cmdMenu() {
152
158
  message: t("menu.what"),
153
159
  hint: t("menu.selectInstructions"),
154
160
  choices: [
155
- { title: t("menu.add"), value: "add" },
156
- { title: t("menu.quickAdd"), value: "quickAdd" },
157
- { title: t("menu.import"), value: "import" },
158
- { title: t("menu.use"), value: "use" },
159
- { title: t("menu.status"), value: "status" },
160
- { title: t("menu.list"), value: "list" },
161
- { title: t("menu.sync"), value: "sync" },
162
- { title: t("menu.discover"), value: "discover" },
163
- { title: t("menu.rename"), value: "rename" },
164
- { title: t("menu.remove"), value: "remove" },
165
- { title: t("menu.apps"), value: "apps" },
166
- { title: t("menu.installApp"), value: "install" },
167
- { title: t("menu.language"), value: "language" },
168
- { title: t("menu.quit"), value: "quit" },
161
+ { title: t("menu.quickAdd"), description: t("menu.quickAddHelp"), value: "quickAdd" },
162
+ { title: t("menu.add"), description: t("menu.addHelp"), value: "add" },
163
+ { title: t("menu.import"), description: t("menu.importHelp"), value: "import" },
164
+ { title: t("menu.use"), description: t("menu.useHelp"), value: "use" },
165
+ { title: t("menu.status"), description: t("menu.statusHelp"), value: "status" },
166
+ { title: t("menu.list"), description: t("menu.listHelp"), value: "list" },
167
+ { title: t("menu.sync"), description: t("menu.syncHelp"), value: "sync" },
168
+ { title: t("menu.discover"), description: t("menu.discoverHelp"), value: "discover" },
169
+ { title: t("menu.rename"), description: t("menu.renameHelp"), value: "rename" },
170
+ { title: t("menu.remove"), description: t("menu.removeHelp"), value: "remove" },
171
+ { title: t("menu.apps"), description: t("menu.appsHelp"), value: "apps" },
172
+ { title: t("menu.installApp"), description: t("menu.installAppHelp"), value: "install" },
173
+ { title: t("menu.language"), description: t("menu.languageHelp"), value: "language" },
174
+ { title: t("menu.quit"), description: t("menu.quitHelp"), value: "quit" },
169
175
  ],
170
176
  }, cancel);
171
177
  if (action === undefined || action === "quit")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentsw",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "CLI provider switcher for coding agents: manage OpenAI/Anthropic-protocol providers in one place and sync them, with models.dev metadata, into Claude Code, Codex, omp, pi, prime-agent, opencode, Hermes, WorkBuddy and DeepSeek Harness",
5
5
  "type": "module",
6
6
  "repository": {