zapmyco 0.10.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.
- package/dist/cli/index.mjs +120 -84
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.d.mts +68 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{loader-36UrSNj8.mjs → loader-B7H9LtJ6.mjs} +146 -10
- package/dist/loader-B7H9LtJ6.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/loader-36UrSNj8.mjs.map +0 -1
package/dist/cli/index.mjs
CHANGED
|
@@ -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-
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
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: [
|
|
3044
|
+
aliases: [],
|
|
3010
3045
|
description: "查看会话状态统计",
|
|
3011
3046
|
usage: "/status",
|
|
3012
3047
|
handler(_args, session) {
|
|
@@ -10873,7 +10908,7 @@ var WorktreeStore = class {
|
|
|
10873
10908
|
cache = /* @__PURE__ */ new Map();
|
|
10874
10909
|
loaded = false;
|
|
10875
10910
|
constructor(baseDir) {
|
|
10876
|
-
this.baseDir = baseDir
|
|
10911
|
+
this.baseDir = baseDir || getDefaultBaseDir();
|
|
10877
10912
|
}
|
|
10878
10913
|
/** 获取存储目录 */
|
|
10879
10914
|
getBaseDir() {
|
|
@@ -11004,7 +11039,7 @@ var WorktreeManager = class {
|
|
|
11004
11039
|
const timestamp = Date.now();
|
|
11005
11040
|
const branchName = `zapmyco-${options.slug}-${timestamp}`;
|
|
11006
11041
|
const dirName = `${options.slug}-${timestamp}`;
|
|
11007
|
-
const worktreePath = join(this.
|
|
11042
|
+
const worktreePath = join(this.store.getBaseDir(), dirName);
|
|
11008
11043
|
let gitRoot;
|
|
11009
11044
|
try {
|
|
11010
11045
|
const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], { timeout: 5e3 });
|
|
@@ -15423,6 +15458,7 @@ var ReplSession = class {
|
|
|
15423
15458
|
baseDir: join(homedir(), ".zapmyco", "worktrees"),
|
|
15424
15459
|
...rawConfig
|
|
15425
15460
|
};
|
|
15461
|
+
if (!worktreeConfig.baseDir) worktreeConfig.baseDir = join(homedir(), ".zapmyco", "worktrees");
|
|
15426
15462
|
this.worktreeManager = new WorktreeManager(worktreeConfig);
|
|
15427
15463
|
setWorktreeManager(this.worktreeManager);
|
|
15428
15464
|
this.worktreeManager.cleanExpired().catch((err) => {
|
|
@@ -15810,7 +15846,7 @@ var ReplSession = class {
|
|
|
15810
15846
|
createCompactCommand() {
|
|
15811
15847
|
return {
|
|
15812
15848
|
name: "compact",
|
|
15813
|
-
aliases: [
|
|
15849
|
+
aliases: [],
|
|
15814
15850
|
description: "手动压缩对话上下文",
|
|
15815
15851
|
usage: "/compact [聚焦主题]",
|
|
15816
15852
|
handler: async (args, _session) => {
|