@onesclawkolor/onesclaw 0.1.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/README.md +65 -0
- package/dist/agent/conversation.d.ts +34 -0
- package/dist/agent/conversation.js +61 -0
- package/dist/agent/conversation.js.map +1 -0
- package/dist/agent/loop.d.ts +40 -0
- package/dist/agent/loop.js +213 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session.d.ts +73 -0
- package/dist/agent/session.js +225 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/audit/file-sink.d.ts +6 -0
- package/dist/audit/file-sink.js +21 -0
- package/dist/audit/file-sink.js.map +1 -0
- package/dist/audit/ids.d.ts +3 -0
- package/dist/audit/ids.js +15 -0
- package/dist/audit/ids.js.map +1 -0
- package/dist/audit/types.d.ts +13 -0
- package/dist/audit/types.js +2 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/cli/commands.d.ts +31 -0
- package/dist/cli/commands.js +433 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/logger.d.ts +57 -0
- package/dist/cli/logger.js +79 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/output.d.ts +59 -0
- package/dist/cli/output.js +306 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/prompt.d.ts +29 -0
- package/dist/cli/prompt.js +197 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/repl.d.ts +4 -0
- package/dist/cli/repl.js +486 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.js +84 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/model.d.ts +3 -0
- package/dist/commands/model.js +178 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/plugin-init.d.ts +23 -0
- package/dist/commands/plugin-init.js +303 -0
- package/dist/commands/plugin-init.js.map +1 -0
- package/dist/commands/provider-auth.d.ts +14 -0
- package/dist/commands/provider-auth.js +153 -0
- package/dist/commands/provider-auth.js.map +1 -0
- package/dist/config/manager.d.ts +71 -0
- package/dist/config/manager.js +201 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +43 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.js +55 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +83 -0
- package/dist/llm/anthropic.js +190 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/factory.d.ts +105 -0
- package/dist/llm/factory.js +164 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openai-codex.d.ts +102 -0
- package/dist/llm/openai-codex.js +445 -0
- package/dist/llm/openai-codex.js.map +1 -0
- package/dist/llm/openai.d.ts +71 -0
- package/dist/llm/openai.js +289 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +1 -0
- package/dist/llm/provider.js +2 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/types.d.ts +72 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/mcp/bridge.d.ts +17 -0
- package/dist/mcp/bridge.js +74 -0
- package/dist/mcp/bridge.js.map +1 -0
- package/dist/mcp/config.d.ts +10 -0
- package/dist/mcp/config.js +27 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/manager.d.ts +67 -0
- package/dist/mcp/manager.js +207 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/memory/scope.d.ts +4 -0
- package/dist/memory/scope.js +14 -0
- package/dist/memory/scope.js.map +1 -0
- package/dist/memory/store.d.ts +28 -0
- package/dist/memory/store.js +126 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/prompts/system.d.ts +4 -0
- package/dist/prompts/system.js +197 -0
- package/dist/prompts/system.js.map +1 -0
- package/dist/skills/loader.d.ts +25 -0
- package/dist/skills/loader.js +98 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +57 -0
- package/dist/skills/registry.js +132 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/sync.d.ts +33 -0
- package/dist/skills/sync.js +180 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/skills/types.d.ts +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/ask.d.ts +30 -0
- package/dist/tools/ask.js +60 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/confirmation.d.ts +12 -0
- package/dist/tools/confirmation.js +75 -0
- package/dist/tools/confirmation.js.map +1 -0
- package/dist/tools/plugin-init.d.ts +29 -0
- package/dist/tools/plugin-init.js +47 -0
- package/dist/tools/plugin-init.js.map +1 -0
- package/dist/tools/registry.d.ts +56 -0
- package/dist/tools/registry.js +123 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/safety.d.ts +2 -0
- package/dist/tools/safety.js +30 -0
- package/dist/tools/safety.js.map +1 -0
- package/dist/tools/server.d.ts +91 -0
- package/dist/tools/server.js +149 -0
- package/dist/tools/server.js.map +1 -0
- package/dist/tools/shell.d.ts +11 -0
- package/dist/tools/shell.js +174 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/skills-sync.d.ts +19 -0
- package/dist/tools/skills-sync.js +29 -0
- package/dist/tools/skills-sync.js.map +1 -0
- package/dist/tools/ssh.d.ts +62 -0
- package/dist/tools/ssh.js +343 -0
- package/dist/tools/ssh.js.map +1 -0
- package/dist/tools/types.d.ts +10 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/retry.d.ts +7 -0
- package/dist/utils/retry.js +34 -0
- package/dist/utils/retry.js.map +1 -0
- package/install.sh +171 -0
- package/package.json +49 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { PROVIDER_REGISTRY, fetchAvailableModels, } from '../llm/factory.js';
|
|
4
|
+
import { getCodexAccessToken, isCodexAuthValid } from '../llm/openai-codex.js';
|
|
5
|
+
import { codexOAuthLogin } from '../llm/openai-codex.js';
|
|
6
|
+
import { promptQuestion, promptChoice, questionSecret, CancelError } from '../cli/prompt.js';
|
|
7
|
+
/**
|
|
8
|
+
* 共享的 Provider 授权交互流程
|
|
9
|
+
*
|
|
10
|
+
* 流程: 选择 Provider → 选择授权方式 → 输入凭证 → 选择模型
|
|
11
|
+
*
|
|
12
|
+
* readline 生命周期: API Key 输入时 pause rl,questionSecret 完成后 resume。
|
|
13
|
+
* 无需 close/recreate readline。
|
|
14
|
+
*/
|
|
15
|
+
export async function runProviderAuth(rl, options) {
|
|
16
|
+
const fetchFromApi = options?.fetchModelsFromApi ?? false;
|
|
17
|
+
const showStatus = options?.showAuthStatus ?? false;
|
|
18
|
+
// ── 1. 选择 Provider ──────────────────────────────────────
|
|
19
|
+
const providerOptions = PROVIDER_REGISTRY.map((p) => {
|
|
20
|
+
if (showStatus) {
|
|
21
|
+
const pc = options?.existingProviders?.[p.name];
|
|
22
|
+
const isAuthed = pc && (pc.mode === 'oauth' || !!pc.api_key);
|
|
23
|
+
const status = isAuthed ? chalk.green(' ✓') : '';
|
|
24
|
+
return `${p.displayName}${status}`;
|
|
25
|
+
}
|
|
26
|
+
return p.displayName;
|
|
27
|
+
});
|
|
28
|
+
console.log(chalk.cyan(' 选择 Provider:'));
|
|
29
|
+
const providerIdx = await promptChoice(rl, '', providerOptions, 0);
|
|
30
|
+
if (providerIdx === null)
|
|
31
|
+
throw new CancelError();
|
|
32
|
+
const selectedProvider = PROVIDER_REGISTRY[providerIdx];
|
|
33
|
+
// ── 2. 选择授权方式(只有一种时跳过) ────────────────────
|
|
34
|
+
let selectedAuthMode = selectedProvider.authModes[0];
|
|
35
|
+
if (selectedProvider.authModes.length > 1) {
|
|
36
|
+
const authOptions = selectedProvider.authModes.map((a) => a.displayName);
|
|
37
|
+
console.log();
|
|
38
|
+
console.log(chalk.cyan(' 选择授权方式:'));
|
|
39
|
+
const authIdx = await promptChoice(rl, '', authOptions, 0);
|
|
40
|
+
if (authIdx === null)
|
|
41
|
+
throw new CancelError();
|
|
42
|
+
selectedAuthMode = selectedProvider.authModes[authIdx];
|
|
43
|
+
}
|
|
44
|
+
// ── 3. 凭证输入 ──────────────────────────────────────────
|
|
45
|
+
const existingConfig = options?.existingProviders?.[selectedProvider.name];
|
|
46
|
+
let providerConfig;
|
|
47
|
+
if (selectedAuthMode.mode === 'api_key') {
|
|
48
|
+
// pause rl,使用 questionSecret 安全输入
|
|
49
|
+
rl.pause();
|
|
50
|
+
let apiKey;
|
|
51
|
+
const keyHint = selectedProvider.keyPlaceholder
|
|
52
|
+
? chalk.gray(` (${selectedProvider.keyPlaceholder})`)
|
|
53
|
+
: '';
|
|
54
|
+
console.log();
|
|
55
|
+
while (true) {
|
|
56
|
+
apiKey = await questionSecret(` ${selectedProvider.displayName} API Key${keyHint}: `);
|
|
57
|
+
if (selectedProvider.validateKey) {
|
|
58
|
+
const err = selectedProvider.validateKey(apiKey);
|
|
59
|
+
if (err) {
|
|
60
|
+
console.log(chalk.red(` ❌ ${err}`));
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
rl.resume();
|
|
67
|
+
providerConfig = {
|
|
68
|
+
mode: 'api_key',
|
|
69
|
+
api_key: apiKey,
|
|
70
|
+
base_url: existingConfig?.base_url,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// OAuth 模式 — 检查现有授权是否有效
|
|
75
|
+
const alreadyAuthed = await isCodexAuthValid();
|
|
76
|
+
if (alreadyAuthed) {
|
|
77
|
+
console.log(chalk.green(' ✓ 已检测到有效的 Codex 授权'));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(chalk.gray(' 正在启动 OAuth 授权流程...'));
|
|
82
|
+
console.log();
|
|
83
|
+
rl.pause();
|
|
84
|
+
try {
|
|
85
|
+
await codexOAuthLogin();
|
|
86
|
+
console.log(chalk.green(' ✓ OAuth 授权成功'));
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
rl.resume();
|
|
90
|
+
throw new Error(`OAuth 授权失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
// 清除子进程残留的 stdin 数据
|
|
94
|
+
if (process.stdin.readable) {
|
|
95
|
+
process.stdin.read();
|
|
96
|
+
}
|
|
97
|
+
rl.resume();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
providerConfig = {
|
|
101
|
+
mode: 'oauth',
|
|
102
|
+
base_url: existingConfig?.base_url,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
console.log();
|
|
106
|
+
console.log(chalk.green(` ✓ ${selectedProvider.displayName} 授权成功`));
|
|
107
|
+
// ── 4. 选择模型 ──────────────────────────────────────────
|
|
108
|
+
let models;
|
|
109
|
+
if (fetchFromApi) {
|
|
110
|
+
let credential;
|
|
111
|
+
if (providerConfig.mode === 'oauth') {
|
|
112
|
+
try {
|
|
113
|
+
credential = await getCodexAccessToken();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
/* fallback to static */
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
credential = providerConfig.api_key;
|
|
121
|
+
}
|
|
122
|
+
models = await fetchAvailableModels(selectedProvider.name, credential);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
models = selectedProvider.models;
|
|
126
|
+
}
|
|
127
|
+
const modelOptions = models.map((m) => m.displayName || m.id);
|
|
128
|
+
modelOptions.push(chalk.gray('自定义模型 ID'));
|
|
129
|
+
console.log();
|
|
130
|
+
console.log(chalk.cyan(' 选择模型:'));
|
|
131
|
+
const modelIdx = await promptChoice(rl, '', modelOptions, 0);
|
|
132
|
+
let selectedModelId;
|
|
133
|
+
if (modelIdx === null) {
|
|
134
|
+
selectedModelId = models[0].id;
|
|
135
|
+
}
|
|
136
|
+
else if (modelIdx === models.length) {
|
|
137
|
+
// 自定义模型 ID
|
|
138
|
+
selectedModelId = await promptQuestion(rl, chalk.cyan(' 模型 ID: '));
|
|
139
|
+
if (!selectedModelId) {
|
|
140
|
+
selectedModelId = models[0].id;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
selectedModelId = models[modelIdx].id;
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
provider: selectedProvider,
|
|
148
|
+
authMode: selectedAuthMode.mode,
|
|
149
|
+
providerConfig,
|
|
150
|
+
selectedModelId,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=provider-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-auth.js","sourceRoot":"","sources":["../../src/commands/provider-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { ProviderConfig, SenoConfig, ServersConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 获取配置目录路径 ~/.onesclaw/
|
|
4
|
+
*/
|
|
5
|
+
export declare function getConfigDir(): string;
|
|
6
|
+
/**
|
|
7
|
+
* 获取配置文件路径 ~/.onesclaw/config.json
|
|
8
|
+
*/
|
|
9
|
+
export declare function getConfigPath(): string;
|
|
10
|
+
/**
|
|
11
|
+
* 获取服务器配置文件路径 ~/.onesclaw/servers.json
|
|
12
|
+
*/
|
|
13
|
+
export declare function getServersPath(): string;
|
|
14
|
+
/**
|
|
15
|
+
* 获取结构化记忆数据库路径 ~/.onesclaw/memory.sqlite
|
|
16
|
+
*/
|
|
17
|
+
export declare function getMemoryPath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* 获取日志目录路径 ~/.onesclaw/logs/
|
|
20
|
+
*/
|
|
21
|
+
export declare function getLogsDir(): string;
|
|
22
|
+
/**
|
|
23
|
+
* 确保配置目录存在(包括 logs 子目录)
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureConfigDir(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 解析 "provider/model_name" 格式的模型 ID
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseModelId(modelId: string): {
|
|
30
|
+
provider: string;
|
|
31
|
+
model: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 拼接 provider 和 model 为 "provider/model_name"
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatModelId(provider: string, model: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* 从 config 中获取当前活跃的 provider 信息
|
|
39
|
+
* @returns null 表示未配置或凭证缺失
|
|
40
|
+
*/
|
|
41
|
+
export declare function getActiveProvider(config: SenoConfig): {
|
|
42
|
+
name: string;
|
|
43
|
+
model: string;
|
|
44
|
+
providerConfig: ProviderConfig;
|
|
45
|
+
} | null;
|
|
46
|
+
/**
|
|
47
|
+
* 读取配置文件 ~/.onesclaw/config.json
|
|
48
|
+
* 自动检测并迁移旧格式配置
|
|
49
|
+
* @returns 配置对象,文件不存在返回 null
|
|
50
|
+
*/
|
|
51
|
+
export declare function loadConfig(): Promise<SenoConfig | null>;
|
|
52
|
+
/**
|
|
53
|
+
* 保存配置文件 ~/.onesclaw/config.json
|
|
54
|
+
* 文件权限设置为 0o600(仅用户可读写)
|
|
55
|
+
*/
|
|
56
|
+
export declare function saveConfig(config: SenoConfig): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* 检查是否已完成初始化
|
|
59
|
+
* 配置文件存在且包含必需字段即视为已初始化
|
|
60
|
+
* 兼容新格式(model + llm.providers)和旧格式(anthropic_api_key)
|
|
61
|
+
*/
|
|
62
|
+
export declare function isInitialized(): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* 读取 SSH 服务器配置 ~/.onesclaw/servers.json
|
|
65
|
+
* @returns 服务器列表,文件不存在返回空列表
|
|
66
|
+
*/
|
|
67
|
+
export declare function loadServers(): Promise<ServersConfig>;
|
|
68
|
+
/**
|
|
69
|
+
* 保存 SSH 服务器配置 ~/.onesclaw/servers.json
|
|
70
|
+
*/
|
|
71
|
+
export declare function saveServers(config: ServersConfig): Promise<void>;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { mkdir, readFile, writeFile, access, chmod } from 'node:fs/promises';
|
|
4
|
+
const CONFIG_DIR_NAME = '.onesclaw';
|
|
5
|
+
const CONFIG_FILE_NAME = 'config.json';
|
|
6
|
+
const SERVERS_FILE_NAME = 'servers.json';
|
|
7
|
+
const MEMORY_DB_FILE_NAME = 'memory.sqlite';
|
|
8
|
+
const LOGS_DIR_NAME = 'logs';
|
|
9
|
+
/**
|
|
10
|
+
* 获取配置目录路径 ~/.onesclaw/
|
|
11
|
+
*/
|
|
12
|
+
export function getConfigDir() {
|
|
13
|
+
return join(homedir(), CONFIG_DIR_NAME);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 获取配置文件路径 ~/.onesclaw/config.json
|
|
17
|
+
*/
|
|
18
|
+
export function getConfigPath() {
|
|
19
|
+
return join(getConfigDir(), CONFIG_FILE_NAME);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 获取服务器配置文件路径 ~/.onesclaw/servers.json
|
|
23
|
+
*/
|
|
24
|
+
export function getServersPath() {
|
|
25
|
+
return join(getConfigDir(), SERVERS_FILE_NAME);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 获取结构化记忆数据库路径 ~/.onesclaw/memory.sqlite
|
|
29
|
+
*/
|
|
30
|
+
export function getMemoryPath() {
|
|
31
|
+
return join(getConfigDir(), MEMORY_DB_FILE_NAME);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获取日志目录路径 ~/.onesclaw/logs/
|
|
35
|
+
*/
|
|
36
|
+
export function getLogsDir() {
|
|
37
|
+
return join(getConfigDir(), LOGS_DIR_NAME);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 确保配置目录存在(包括 logs 子目录)
|
|
41
|
+
*/
|
|
42
|
+
export async function ensureConfigDir() {
|
|
43
|
+
const configDir = getConfigDir();
|
|
44
|
+
await mkdir(configDir, { recursive: true });
|
|
45
|
+
await mkdir(getLogsDir(), { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 检查文件是否存在
|
|
49
|
+
*/
|
|
50
|
+
async function fileExists(path) {
|
|
51
|
+
try {
|
|
52
|
+
await access(path);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 解析 "provider/model_name" 格式的模型 ID
|
|
61
|
+
*/
|
|
62
|
+
export function parseModelId(modelId) {
|
|
63
|
+
const slashIndex = modelId.indexOf('/');
|
|
64
|
+
if (slashIndex === -1) {
|
|
65
|
+
// 无前缀时为旧版 anthropic 配置
|
|
66
|
+
return { provider: 'anthropic', model: modelId };
|
|
67
|
+
}
|
|
68
|
+
const provider = modelId.slice(0, slashIndex);
|
|
69
|
+
const model = modelId.slice(slashIndex + 1);
|
|
70
|
+
return { provider, model };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 拼接 provider 和 model 为 "provider/model_name"
|
|
74
|
+
*/
|
|
75
|
+
export function formatModelId(provider, model) {
|
|
76
|
+
return `${provider}/${model}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 从 config 中获取当前活跃的 provider 信息
|
|
80
|
+
* @returns null 表示未配置或凭证缺失
|
|
81
|
+
*/
|
|
82
|
+
export function getActiveProvider(config) {
|
|
83
|
+
if (!config.model)
|
|
84
|
+
return null;
|
|
85
|
+
const { provider, model } = parseModelId(config.model);
|
|
86
|
+
const providerConfig = config.llm?.providers?.[provider];
|
|
87
|
+
if (!providerConfig)
|
|
88
|
+
return null;
|
|
89
|
+
// 验证凭证:api_key 模式需要有 key,oauth 模式只需模式声明
|
|
90
|
+
if (providerConfig.mode === 'api_key' && !providerConfig.api_key)
|
|
91
|
+
return null;
|
|
92
|
+
return { name: provider, model, providerConfig };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 迁移旧格式配置到新格式
|
|
96
|
+
* 检测存在 anthropic_api_key 且无 model 字段时自动迁移
|
|
97
|
+
*/
|
|
98
|
+
function migrateConfig(config) {
|
|
99
|
+
// 已有新格式字段,无需迁移
|
|
100
|
+
if (config.model) {
|
|
101
|
+
return { config, migrated: false };
|
|
102
|
+
}
|
|
103
|
+
// 没有旧字段,也无需迁移
|
|
104
|
+
if (!config.anthropic_api_key) {
|
|
105
|
+
return { config, migrated: false };
|
|
106
|
+
}
|
|
107
|
+
// 旧版配置迁移:仅用于 anthropic 单 provider 时代的配置
|
|
108
|
+
const modelName = config.default_model || 'claude-sonnet-4-20250514';
|
|
109
|
+
const migrated = {
|
|
110
|
+
...config,
|
|
111
|
+
model: formatModelId('anthropic', modelName),
|
|
112
|
+
llm: {
|
|
113
|
+
providers: {
|
|
114
|
+
anthropic: {
|
|
115
|
+
mode: 'api_key',
|
|
116
|
+
api_key: config.anthropic_api_key,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
return { config: migrated, migrated: true };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* 读取配置文件 ~/.onesclaw/config.json
|
|
125
|
+
* 自动检测并迁移旧格式配置
|
|
126
|
+
* @returns 配置对象,文件不存在返回 null
|
|
127
|
+
*/
|
|
128
|
+
export async function loadConfig() {
|
|
129
|
+
const configPath = getConfigPath();
|
|
130
|
+
if (!(await fileExists(configPath))) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const content = await readFile(configPath, 'utf-8');
|
|
135
|
+
const raw = JSON.parse(content);
|
|
136
|
+
// 自动迁移旧配置
|
|
137
|
+
const { config, migrated } = migrateConfig(raw);
|
|
138
|
+
if (migrated) {
|
|
139
|
+
await saveConfig(config);
|
|
140
|
+
}
|
|
141
|
+
return config;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 保存配置文件 ~/.onesclaw/config.json
|
|
149
|
+
* 文件权限设置为 0o600(仅用户可读写)
|
|
150
|
+
*/
|
|
151
|
+
export async function saveConfig(config) {
|
|
152
|
+
await ensureConfigDir();
|
|
153
|
+
const configPath = getConfigPath();
|
|
154
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
155
|
+
await chmod(configPath, 0o600);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 检查是否已完成初始化
|
|
159
|
+
* 配置文件存在且包含必需字段即视为已初始化
|
|
160
|
+
* 兼容新格式(model + llm.providers)和旧格式(anthropic_api_key)
|
|
161
|
+
*/
|
|
162
|
+
export async function isInitialized() {
|
|
163
|
+
const config = await loadConfig();
|
|
164
|
+
if (!config)
|
|
165
|
+
return false;
|
|
166
|
+
if (!config.ones_mcp_url)
|
|
167
|
+
return false;
|
|
168
|
+
// 新格式:model 字段存在
|
|
169
|
+
if (config.model)
|
|
170
|
+
return true;
|
|
171
|
+
// 旧格式:anthropic_api_key 存在(loadConfig 会自动迁移,但防御性检查)
|
|
172
|
+
if (config.anthropic_api_key)
|
|
173
|
+
return true;
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 读取 SSH 服务器配置 ~/.onesclaw/servers.json
|
|
178
|
+
* @returns 服务器列表,文件不存在返回空列表
|
|
179
|
+
*/
|
|
180
|
+
export async function loadServers() {
|
|
181
|
+
const serversPath = getServersPath();
|
|
182
|
+
if (!(await fileExists(serversPath))) {
|
|
183
|
+
return { servers: [] };
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const content = await readFile(serversPath, 'utf-8');
|
|
187
|
+
return JSON.parse(content);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return { servers: [] };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 保存 SSH 服务器配置 ~/.onesclaw/servers.json
|
|
195
|
+
*/
|
|
196
|
+
export async function saveServers(config) {
|
|
197
|
+
await ensureConfigDir();
|
|
198
|
+
const serversPath = getServersPath();
|
|
199
|
+
await writeFile(serversPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface McpServerConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
required: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface SshServerConfig {
|
|
9
|
+
name: string;
|
|
10
|
+
host: string;
|
|
11
|
+
user: string;
|
|
12
|
+
port: number;
|
|
13
|
+
auth_type: 'password' | 'ssh-key';
|
|
14
|
+
identity_file?: string;
|
|
15
|
+
password?: string;
|
|
16
|
+
description: string;
|
|
17
|
+
}
|
|
18
|
+
export type LLMProviderName = 'anthropic' | 'openai' | 'openai-codex';
|
|
19
|
+
export type AuthMode = 'api_key' | 'oauth';
|
|
20
|
+
export interface ProviderConfig {
|
|
21
|
+
mode: AuthMode;
|
|
22
|
+
api_key?: string;
|
|
23
|
+
base_url?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface LLMProvidersConfig {
|
|
26
|
+
providers: Partial<Record<LLMProviderName, ProviderConfig>>;
|
|
27
|
+
}
|
|
28
|
+
export interface OnesSkillsConfig {
|
|
29
|
+
repository: string;
|
|
30
|
+
last_updated_at?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SenoConfig {
|
|
33
|
+
anthropic_api_key?: string;
|
|
34
|
+
default_model?: string;
|
|
35
|
+
model?: string;
|
|
36
|
+
ones_mcp_url: string;
|
|
37
|
+
debug: boolean;
|
|
38
|
+
llm?: LLMProvidersConfig;
|
|
39
|
+
ones_skills?: OnesSkillsConfig;
|
|
40
|
+
}
|
|
41
|
+
export interface ServersConfig {
|
|
42
|
+
servers: SshServerConfig[];
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ONESCLAW CLI 统一错误基类
|
|
3
|
+
*
|
|
4
|
+
* 提供结构化的错误类型体系,用于错误分类、重试判断和用户友好提示。
|
|
5
|
+
*/
|
|
6
|
+
export declare class SenoError extends Error {
|
|
7
|
+
code: any;
|
|
8
|
+
constructor(message: any, code: any);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* LLM API 错误
|
|
12
|
+
*
|
|
13
|
+
* 携带 HTTP 状态码和可重试标记,便于重试逻辑判断。
|
|
14
|
+
*/
|
|
15
|
+
export declare class LLMError extends SenoError {
|
|
16
|
+
statusCode: any;
|
|
17
|
+
retryable: any;
|
|
18
|
+
constructor(message: any, statusCode: any, retryable?: boolean);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* MCP 服务器错误
|
|
22
|
+
*
|
|
23
|
+
* 携带服务器名称,便于定位问题。
|
|
24
|
+
*/
|
|
25
|
+
export declare class MCPError extends SenoError {
|
|
26
|
+
serverName: any;
|
|
27
|
+
constructor(message: any, serverName: any);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 用户中断错误(Ctrl+C)
|
|
31
|
+
*
|
|
32
|
+
* 用于在 ask_user 等交互式工具中传播用户中断信号,
|
|
33
|
+
* 使 Agent 循环能够优雅终止当前任务。
|
|
34
|
+
*/
|
|
35
|
+
export declare class UserInterruptError extends SenoError {
|
|
36
|
+
constructor();
|
|
37
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* ONESCLAW CLI 统一错误基类
|
|
4
|
+
*
|
|
5
|
+
* 提供结构化的错误类型体系,用于错误分类、重试判断和用户友好提示。
|
|
6
|
+
*/
|
|
7
|
+
export class SenoError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
constructor(message, code) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.name = 'SenoError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* LLM API 错误
|
|
17
|
+
*
|
|
18
|
+
* 携带 HTTP 状态码和可重试标记,便于重试逻辑判断。
|
|
19
|
+
*/
|
|
20
|
+
export class LLMError extends SenoError {
|
|
21
|
+
statusCode;
|
|
22
|
+
retryable;
|
|
23
|
+
constructor(message, statusCode, retryable = false) {
|
|
24
|
+
super(message, 'LLM_ERROR');
|
|
25
|
+
this.statusCode = statusCode;
|
|
26
|
+
this.retryable = retryable;
|
|
27
|
+
this.name = 'LLMError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* MCP 服务器错误
|
|
32
|
+
*
|
|
33
|
+
* 携带服务器名称,便于定位问题。
|
|
34
|
+
*/
|
|
35
|
+
export class MCPError extends SenoError {
|
|
36
|
+
serverName;
|
|
37
|
+
constructor(message, serverName) {
|
|
38
|
+
super(message, 'MCP_ERROR');
|
|
39
|
+
this.serverName = serverName;
|
|
40
|
+
this.name = 'MCPError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 用户中断错误(Ctrl+C)
|
|
45
|
+
*
|
|
46
|
+
* 用于在 ask_user 等交互式工具中传播用户中断信号,
|
|
47
|
+
* 使 Agent 循环能够优雅终止当前任务。
|
|
48
|
+
*/
|
|
49
|
+
export class UserInterruptError extends SenoError {
|
|
50
|
+
constructor() {
|
|
51
|
+
super('用户中断 (Ctrl+C)', 'USER_INTERRUPT');
|
|
52
|
+
this.name = 'UserInterruptError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAChC,IAAI,CAAC;IACL,YAAY,OAAO,EAAE,IAAI;QACrB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC5B,CAAC;CACJ;AACD;;;;GAIG;AACH,MAAM,OAAO,QAAS,SAAQ,SAAS;IACnC,UAAU,CAAC;IACX,SAAS,CAAC;IACV,YAAY,OAAO,EAAE,UAAU,EAAE,SAAS,GAAG,KAAK;QAC9C,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ;AACD;;;;GAIG;AACH,MAAM,OAAO,QAAS,SAAQ,SAAS;IACnC,UAAU,CAAC;IACX,YAAY,OAAO,EAAE,UAAU;QAC3B,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ;AACD;;;;;GAKG;AACH,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC7C;QACI,KAAK,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACrC,CAAC;CACJ"}
|
package/dist/index.d.ts
ADDED