zapmyco 0.11.0 → 0.12.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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { D as configureLogger, H as SESSION_DIR_NAME, I as ZapmycoErrorCode, L as buildSkillSnapshot, O as logger, P as WebError, R as loadSkills, T as DEFAULT_COMPACTION_CONFIG, U as VERSION, V as APP_NAME, W as __require, h as createLlmBasedAgent, i as AgentLlmFacade, n as loadConfig, p as SubAgentManager, t as HOME_CONFIG_PATH, w as eventBus } from "../loader-CosX5iDC.mjs";
2
+ import { D as configureLogger, H as SESSION_DIR_NAME, I as ZapmycoErrorCode, L as buildSkillSnapshot, O as logger, P as WebError, R as loadSkills, T as DEFAULT_COMPACTION_CONFIG, U as VERSION, V as APP_NAME, W as __require, h as createLlmBasedAgent, i as AgentLlmFacade, n as loadConfig, p as SubAgentManager, t as HOME_CONFIG_PATH, w as eventBus } from "../loader-B7H9LtJ6.mjs";
3
3
  import { createHash, randomBytes } from "node:crypto";
4
4
  import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, unlinkSync, writeFileSync } from "node:fs";
5
5
  import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
@@ -1274,7 +1274,7 @@ function getAgentTypeRegistry() {
1274
1274
  function createAgentsCommand() {
1275
1275
  return {
1276
1276
  name: "agents",
1277
- aliases: ["ag"],
1277
+ aliases: [],
1278
1278
  description: "Agent 团队管理:查看类型、实例、团队状态",
1279
1279
  usage: "/agents [types | instances | team]",
1280
1280
  handler(args, session) {
@@ -1331,7 +1331,7 @@ function getInboxMessages(instanceId, instanceManager) {
1331
1331
  function createClearCommand() {
1332
1332
  return {
1333
1333
  name: "clear",
1334
- aliases: ["cl"],
1334
+ aliases: [],
1335
1335
  description: "清除屏幕",
1336
1336
  usage: "/clear",
1337
1337
  handler(_args, session) {
@@ -1408,7 +1408,7 @@ function updateSettingsFile(path, value) {
1408
1408
  function createConfigCommand() {
1409
1409
  return {
1410
1410
  name: "config",
1411
- aliases: ["cfg"],
1411
+ aliases: [],
1412
1412
  description: "查看或修改配置 [show | get <key> | set <key> <value>]",
1413
1413
  usage: "/config [show | get <key> | set <key> <value>]",
1414
1414
  handler(args, session) {
@@ -1484,7 +1484,7 @@ function createConfigCommand() {
1484
1484
  function createHelpCommand() {
1485
1485
  return {
1486
1486
  name: "help",
1487
- aliases: ["h", "?"],
1487
+ aliases: [],
1488
1488
  description: "显示帮助信息",
1489
1489
  usage: "/help",
1490
1490
  handler(_args, session) {
@@ -1527,7 +1527,7 @@ const DEFAULT_COUNT = 10;
1527
1527
  function createHistoryCommand() {
1528
1528
  return {
1529
1529
  name: "history",
1530
- aliases: ["hi"],
1530
+ aliases: [],
1531
1531
  description: "查看历史记录 [n]",
1532
1532
  usage: "/history [n]",
1533
1533
  handler(args, session) {
@@ -1556,11 +1556,7 @@ function createHistoryCommand() {
1556
1556
  function createQuitCommand() {
1557
1557
  return {
1558
1558
  name: "quit",
1559
- aliases: [
1560
- "exit",
1561
- "q",
1562
- "x"
1563
- ],
1559
+ aliases: [],
1564
1560
  description: "退出 REPL",
1565
1561
  usage: "/quit",
1566
1562
  async handler(_args, session) {
@@ -1619,7 +1615,7 @@ function barChart(score) {
1619
1615
  function createSecurityCommand() {
1620
1616
  return {
1621
1617
  name: "audit",
1622
- aliases: ["sec", "security"],
1618
+ aliases: [],
1623
1619
  description: "安全审计与健康报告",
1624
1620
  usage: "/audit",
1625
1621
  handler(_args, session) {
@@ -1734,6 +1730,9 @@ var en_default = {
1734
1730
  settings: {
1735
1731
  "mainMenu": {
1736
1732
  "defaultModel": "Default Model",
1733
+ "visionModel": "Vision Model",
1734
+ "lightModel": "Lightweight Model",
1735
+ "analysisModel": "Analysis Model",
1737
1736
  "manageProviders": "Manage Providers",
1738
1737
  "viewConfig": "View Config",
1739
1738
  "language": "Language / 语言",
@@ -1780,6 +1779,9 @@ var en_default = {
1780
1779
  "baseUrlReset": "[ok] Reset {{provider}} Base URL to default",
1781
1780
  "baseUrlSet": "[ok] Set {{provider}} Base URL: {{url}}",
1782
1781
  "defaultModelSet": "[ok] Default model set to: {{model}}",
1782
+ "visionModelSet": "[ok] Vision model set to: {{model}}",
1783
+ "lightModelSet": "[ok] Lightweight model set to: {{model}}",
1784
+ "analysisModelSet": "[ok] Analysis model set to: {{model}}",
1783
1785
  "languageSet": "[ok] Language set to: {{locale}}",
1784
1786
  "restartRequired": "Some changes may require a session restart to take full effect.",
1785
1787
  "noModels": "has no available model list",
@@ -1910,6 +1912,9 @@ var zh_CN_default = {
1910
1912
  settings: {
1911
1913
  "mainMenu": {
1912
1914
  "defaultModel": "默认模型",
1915
+ "visionModel": "视觉模型",
1916
+ "lightModel": "轻量模型",
1917
+ "analysisModel": "分析模型",
1913
1918
  "manageProviders": "管理提供商",
1914
1919
  "viewConfig": "查看配置",
1915
1920
  "language": "Language / 语言",
@@ -1956,6 +1961,9 @@ var zh_CN_default = {
1956
1961
  "baseUrlReset": "[ok] 已重置 {{provider}} 的 Base URL 为默认值",
1957
1962
  "baseUrlSet": "[ok] 已设置 {{provider}} 的 Base URL: {{url}}",
1958
1963
  "defaultModelSet": "[ok] 默认模型已设置为: {{model}}",
1964
+ "visionModelSet": "[ok] 视觉模型已设置为: {{model}}",
1965
+ "lightModelSet": "[ok] 轻量模型已设置为: {{model}}",
1966
+ "analysisModelSet": "[ok] 分析模型已设置为: {{model}}",
1959
1967
  "languageSet": "[ok] 语言已设置为: {{locale}}",
1960
1968
  "restartRequired": "部分更改可能需要重启会话才能完全生效。",
1961
1969
  "noModels": "没有可用的模型列表",
@@ -2568,7 +2576,7 @@ function getProviderModels(config, providerName) {
2568
2576
  function createSettingsCommand() {
2569
2577
  return {
2570
2578
  name: "settings",
2571
- aliases: ["set"],
2579
+ aliases: [],
2572
2580
  description: "Interactive configuration menu — manage model providers and API keys",
2573
2581
  usage: "/settings [list-providers | list-models <provider>]",
2574
2582
  async handler(args, session) {
@@ -2777,6 +2785,80 @@ async function handleInteractiveMode(tui, session, config) {
2777
2785
  ""
2778
2786
  ]);
2779
2787
  };
2788
+ /**
2789
+ * Generic handler for selecting a model from all providers and writing it to
2790
+ * a specific config slot (defaultModel / visionModel / lightModel / analysisModel).
2791
+ *
2792
+ * Reuses the same "show all models → select → save" flow that 'default-model'
2793
+ * uses, only the target config key and success message differ.
2794
+ */
2795
+ const handleModelSlotSelect = async (configKey, successMsgKey) => {
2796
+ const configuredProviders = _getByDotPath(state.current, "llm.providers");
2797
+ const allProviders = getProviders();
2798
+ const enabledItems = [];
2799
+ const disabledItems = [];
2800
+ for (const providerName of allProviders) {
2801
+ const models = getProviderModels(state.current, providerName);
2802
+ if (models.length === 0) continue;
2803
+ const isEnabled = configuredProviders !== void 0 && providerName in configuredProviders && hasApiKey(state.current, providerName);
2804
+ for (const modelId of models) {
2805
+ const key = `${providerName}/${modelId}`;
2806
+ if (isEnabled) enabledItems.push({
2807
+ value: key,
2808
+ label: key,
2809
+ description: ""
2810
+ });
2811
+ else disabledItems.push({
2812
+ value: key,
2813
+ label: chalk.gray(key),
2814
+ description: chalk.gray(t("settings.modelSelector.notConfigured"))
2815
+ });
2816
+ }
2817
+ }
2818
+ const modelItems = [...enabledItems, ...disabledItems];
2819
+ if (modelItems.length === 0) {
2820
+ session.appendOutput([
2821
+ "",
2822
+ ` ${t("settings.cliMode.noModelsAvailable")}`,
2823
+ ""
2824
+ ]);
2825
+ return;
2826
+ }
2827
+ const selected = await showSelectList(tui, modelItems, { onExit: exitAll });
2828
+ if (!selected || !selected.value) return;
2829
+ const selectedKey = selected.value;
2830
+ const slashIndex = selectedKey.indexOf("/");
2831
+ const providerName = selectedKey.slice(0, slashIndex);
2832
+ if (configuredProviders !== void 0 && providerName in configuredProviders && hasApiKey(state.current, providerName)) {
2833
+ setConfigValue(session, configKey, selectedKey);
2834
+ session.appendOutput([
2835
+ "",
2836
+ ` ${t(`settings.messages.${successMsgKey}`, { model: selectedKey })}`,
2837
+ ""
2838
+ ]);
2839
+ } else {
2840
+ if (!configuredProviders || !(providerName in configuredProviders)) {
2841
+ const known = KNOWN_PROVIDERS.find((p) => p.id === providerName);
2842
+ const newProvider = { apiKey: "" };
2843
+ if (known?.apiFormat) newProvider.apiFormat = known.apiFormat;
2844
+ const settings = readSettings();
2845
+ _setByDotPath(settings, `llm.providers.${providerName}`, newProvider);
2846
+ writeSettings(settings);
2847
+ _setByDotPath(session.config, `llm.providers.${providerName}`, newProvider);
2848
+ state.current = readSettings();
2849
+ }
2850
+ await handleApiKeyConfig(providerName, "");
2851
+ state.current = readSettings();
2852
+ if (hasApiKey(state.current, providerName)) {
2853
+ setConfigValue(session, configKey, selectedKey);
2854
+ session.appendOutput([
2855
+ "",
2856
+ ` ${t(`settings.messages.${successMsgKey}`, { model: selectedKey })}`,
2857
+ ""
2858
+ ]);
2859
+ }
2860
+ }
2861
+ };
2780
2862
  let running = true;
2781
2863
  const exitAll = () => {
2782
2864
  running = false;
@@ -2791,6 +2873,21 @@ async function handleInteractiveMode(tui, session, config) {
2791
2873
  label: t("settings.mainMenu.defaultModel"),
2792
2874
  description: String(_getByDotPath(state.current, "llm.defaultModel") ?? t("settings.mainMenu.notConfigured"))
2793
2875
  },
2876
+ {
2877
+ value: "vision-model",
2878
+ label: t("settings.mainMenu.visionModel"),
2879
+ description: String(_getByDotPath(state.current, "llm.visionModel") ?? t("settings.mainMenu.notConfigured"))
2880
+ },
2881
+ {
2882
+ value: "light-model",
2883
+ label: t("settings.mainMenu.lightModel"),
2884
+ description: String(_getByDotPath(state.current, "llm.lightModel") ?? t("settings.mainMenu.notConfigured"))
2885
+ },
2886
+ {
2887
+ value: "analysis-model",
2888
+ label: t("settings.mainMenu.analysisModel"),
2889
+ description: String(_getByDotPath(state.current, "llm.analysisModel") ?? t("settings.mainMenu.notConfigured"))
2890
+ },
2794
2891
  {
2795
2892
  value: "manage-providers",
2796
2893
  label: t("settings.mainMenu.manageProviders"),
@@ -2812,73 +2909,11 @@ async function handleInteractiveMode(tui, session, config) {
2812
2909
  break;
2813
2910
  }
2814
2911
  const value = choice.value;
2815
- if (value === "default-model") {
2816
- const configuredProviders = _getByDotPath(state.current, "llm.providers");
2817
- const allProviders = getProviders();
2818
- const enabledItems = [];
2819
- const disabledItems = [];
2820
- for (const providerName of allProviders) {
2821
- const models = getProviderModels(state.current, providerName);
2822
- if (models.length === 0) continue;
2823
- const isEnabled = configuredProviders !== void 0 && providerName in configuredProviders && hasApiKey(state.current, providerName);
2824
- for (const modelId of models) {
2825
- const key = `${providerName}/${modelId}`;
2826
- if (isEnabled) enabledItems.push({
2827
- value: key,
2828
- label: key,
2829
- description: ""
2830
- });
2831
- else disabledItems.push({
2832
- value: key,
2833
- label: chalk.gray(key),
2834
- description: chalk.gray(t("settings.modelSelector.notConfigured"))
2835
- });
2836
- }
2837
- }
2838
- const modelItems = [...enabledItems, ...disabledItems];
2839
- if (modelItems.length === 0) {
2840
- session.appendOutput([
2841
- "",
2842
- ` ${t("settings.cliMode.noModelsAvailable")}`,
2843
- ""
2844
- ]);
2845
- continue;
2846
- }
2847
- const selected = await showSelectList(tui, modelItems, { onExit: exitAll });
2848
- if (!selected || !selected.value) continue;
2849
- const selectedKey = selected.value;
2850
- const slashIndex = selectedKey.indexOf("/");
2851
- const providerName = selectedKey.slice(0, slashIndex);
2852
- if (configuredProviders !== void 0 && providerName in configuredProviders && hasApiKey(state.current, providerName)) {
2853
- setConfigValue(session, "llm.defaultModel", selectedKey);
2854
- session.appendOutput([
2855
- "",
2856
- ` ${t("settings.messages.defaultModelSet", { model: selectedKey })}`,
2857
- ""
2858
- ]);
2859
- } else {
2860
- if (!configuredProviders || !(providerName in configuredProviders)) {
2861
- const known = KNOWN_PROVIDERS.find((p) => p.id === providerName);
2862
- const newProvider = { apiKey: "" };
2863
- if (known?.apiFormat) newProvider.apiFormat = known.apiFormat;
2864
- const settings = readSettings();
2865
- _setByDotPath(settings, `llm.providers.${providerName}`, newProvider);
2866
- writeSettings(settings);
2867
- _setByDotPath(session.config, `llm.providers.${providerName}`, newProvider);
2868
- state.current = readSettings();
2869
- }
2870
- await handleApiKeyConfig(providerName, "");
2871
- state.current = readSettings();
2872
- if (hasApiKey(state.current, providerName)) {
2873
- setConfigValue(session, "llm.defaultModel", selectedKey);
2874
- session.appendOutput([
2875
- "",
2876
- ` ${t("settings.messages.defaultModelSet", { model: selectedKey })}`,
2877
- ""
2878
- ]);
2879
- }
2880
- }
2881
- } else if (value === "manage-providers") {
2912
+ if (value === "default-model") await handleModelSlotSelect("llm.defaultModel", "defaultModelSet");
2913
+ else if (value === "vision-model") await handleModelSlotSelect("llm.visionModel", "visionModelSet");
2914
+ else if (value === "light-model") await handleModelSlotSelect("llm.lightModel", "lightModelSet");
2915
+ else if (value === "analysis-model") await handleModelSlotSelect("llm.analysisModel", "analysisModelSet");
2916
+ else if (value === "manage-providers") {
2882
2917
  const providerChoice = await showSelectList(tui, [...Object.entries(providers).map(([name]) => {
2883
2918
  const hasK = hasApiKey(state.current, name);
2884
2919
  return {
@@ -3006,7 +3041,7 @@ async function handleInteractiveMode(tui, session, config) {
3006
3041
  function createStatusCommand() {
3007
3042
  return {
3008
3043
  name: "status",
3009
- aliases: ["st"],
3044
+ aliases: [],
3010
3045
  description: "查看会话状态统计",
3011
3046
  usage: "/status",
3012
3047
  handler(_args, session) {
@@ -15811,7 +15846,7 @@ var ReplSession = class {
15811
15846
  createCompactCommand() {
15812
15847
  return {
15813
15848
  name: "compact",
15814
- aliases: ["cmp"],
15849
+ aliases: [],
15815
15850
  description: "手动压缩对话上下文",
15816
15851
  usage: "/compact [聚焦主题]",
15817
15852
  handler: async (args, _session) => {