@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.
Files changed (141) hide show
  1. package/README.md +65 -0
  2. package/dist/agent/conversation.d.ts +34 -0
  3. package/dist/agent/conversation.js +61 -0
  4. package/dist/agent/conversation.js.map +1 -0
  5. package/dist/agent/loop.d.ts +40 -0
  6. package/dist/agent/loop.js +213 -0
  7. package/dist/agent/loop.js.map +1 -0
  8. package/dist/agent/session.d.ts +73 -0
  9. package/dist/agent/session.js +225 -0
  10. package/dist/agent/session.js.map +1 -0
  11. package/dist/audit/file-sink.d.ts +6 -0
  12. package/dist/audit/file-sink.js +21 -0
  13. package/dist/audit/file-sink.js.map +1 -0
  14. package/dist/audit/ids.d.ts +3 -0
  15. package/dist/audit/ids.js +15 -0
  16. package/dist/audit/ids.js.map +1 -0
  17. package/dist/audit/types.d.ts +13 -0
  18. package/dist/audit/types.js +2 -0
  19. package/dist/audit/types.js.map +1 -0
  20. package/dist/cli/commands.d.ts +31 -0
  21. package/dist/cli/commands.js +433 -0
  22. package/dist/cli/commands.js.map +1 -0
  23. package/dist/cli/logger.d.ts +57 -0
  24. package/dist/cli/logger.js +79 -0
  25. package/dist/cli/logger.js.map +1 -0
  26. package/dist/cli/output.d.ts +59 -0
  27. package/dist/cli/output.js +306 -0
  28. package/dist/cli/output.js.map +1 -0
  29. package/dist/cli/prompt.d.ts +29 -0
  30. package/dist/cli/prompt.js +197 -0
  31. package/dist/cli/prompt.js.map +1 -0
  32. package/dist/cli/repl.d.ts +4 -0
  33. package/dist/cli/repl.js +486 -0
  34. package/dist/cli/repl.js.map +1 -0
  35. package/dist/commands/init.d.ts +4 -0
  36. package/dist/commands/init.js +84 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/model.d.ts +3 -0
  39. package/dist/commands/model.js +178 -0
  40. package/dist/commands/model.js.map +1 -0
  41. package/dist/commands/plugin-init.d.ts +23 -0
  42. package/dist/commands/plugin-init.js +303 -0
  43. package/dist/commands/plugin-init.js.map +1 -0
  44. package/dist/commands/provider-auth.d.ts +14 -0
  45. package/dist/commands/provider-auth.js +153 -0
  46. package/dist/commands/provider-auth.js.map +1 -0
  47. package/dist/config/manager.d.ts +71 -0
  48. package/dist/config/manager.js +201 -0
  49. package/dist/config/manager.js.map +1 -0
  50. package/dist/config/types.d.ts +43 -0
  51. package/dist/config/types.js +2 -0
  52. package/dist/config/types.js.map +1 -0
  53. package/dist/errors.d.ts +37 -0
  54. package/dist/errors.js +55 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/index.d.ts +2 -0
  57. package/dist/index.js +207 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/llm/anthropic.d.ts +83 -0
  60. package/dist/llm/anthropic.js +190 -0
  61. package/dist/llm/anthropic.js.map +1 -0
  62. package/dist/llm/factory.d.ts +105 -0
  63. package/dist/llm/factory.js +164 -0
  64. package/dist/llm/factory.js.map +1 -0
  65. package/dist/llm/openai-codex.d.ts +102 -0
  66. package/dist/llm/openai-codex.js +445 -0
  67. package/dist/llm/openai-codex.js.map +1 -0
  68. package/dist/llm/openai.d.ts +71 -0
  69. package/dist/llm/openai.js +289 -0
  70. package/dist/llm/openai.js.map +1 -0
  71. package/dist/llm/provider.d.ts +1 -0
  72. package/dist/llm/provider.js +2 -0
  73. package/dist/llm/provider.js.map +1 -0
  74. package/dist/llm/types.d.ts +72 -0
  75. package/dist/llm/types.js +2 -0
  76. package/dist/llm/types.js.map +1 -0
  77. package/dist/mcp/bridge.d.ts +17 -0
  78. package/dist/mcp/bridge.js +74 -0
  79. package/dist/mcp/bridge.js.map +1 -0
  80. package/dist/mcp/config.d.ts +10 -0
  81. package/dist/mcp/config.js +27 -0
  82. package/dist/mcp/config.js.map +1 -0
  83. package/dist/mcp/manager.d.ts +67 -0
  84. package/dist/mcp/manager.js +207 -0
  85. package/dist/mcp/manager.js.map +1 -0
  86. package/dist/memory/scope.d.ts +4 -0
  87. package/dist/memory/scope.js +14 -0
  88. package/dist/memory/scope.js.map +1 -0
  89. package/dist/memory/store.d.ts +28 -0
  90. package/dist/memory/store.js +126 -0
  91. package/dist/memory/store.js.map +1 -0
  92. package/dist/prompts/system.d.ts +4 -0
  93. package/dist/prompts/system.js +197 -0
  94. package/dist/prompts/system.js.map +1 -0
  95. package/dist/skills/loader.d.ts +25 -0
  96. package/dist/skills/loader.js +98 -0
  97. package/dist/skills/loader.js.map +1 -0
  98. package/dist/skills/registry.d.ts +57 -0
  99. package/dist/skills/registry.js +132 -0
  100. package/dist/skills/registry.js.map +1 -0
  101. package/dist/skills/sync.d.ts +33 -0
  102. package/dist/skills/sync.js +180 -0
  103. package/dist/skills/sync.js.map +1 -0
  104. package/dist/skills/types.d.ts +1 -0
  105. package/dist/skills/types.js +2 -0
  106. package/dist/skills/types.js.map +1 -0
  107. package/dist/tools/ask.d.ts +30 -0
  108. package/dist/tools/ask.js +60 -0
  109. package/dist/tools/ask.js.map +1 -0
  110. package/dist/tools/confirmation.d.ts +12 -0
  111. package/dist/tools/confirmation.js +75 -0
  112. package/dist/tools/confirmation.js.map +1 -0
  113. package/dist/tools/plugin-init.d.ts +29 -0
  114. package/dist/tools/plugin-init.js +47 -0
  115. package/dist/tools/plugin-init.js.map +1 -0
  116. package/dist/tools/registry.d.ts +56 -0
  117. package/dist/tools/registry.js +123 -0
  118. package/dist/tools/registry.js.map +1 -0
  119. package/dist/tools/safety.d.ts +2 -0
  120. package/dist/tools/safety.js +30 -0
  121. package/dist/tools/safety.js.map +1 -0
  122. package/dist/tools/server.d.ts +91 -0
  123. package/dist/tools/server.js +149 -0
  124. package/dist/tools/server.js.map +1 -0
  125. package/dist/tools/shell.d.ts +11 -0
  126. package/dist/tools/shell.js +174 -0
  127. package/dist/tools/shell.js.map +1 -0
  128. package/dist/tools/skills-sync.d.ts +19 -0
  129. package/dist/tools/skills-sync.js +29 -0
  130. package/dist/tools/skills-sync.js.map +1 -0
  131. package/dist/tools/ssh.d.ts +62 -0
  132. package/dist/tools/ssh.js +343 -0
  133. package/dist/tools/ssh.js.map +1 -0
  134. package/dist/tools/types.d.ts +10 -0
  135. package/dist/tools/types.js +2 -0
  136. package/dist/tools/types.js.map +1 -0
  137. package/dist/utils/retry.d.ts +7 -0
  138. package/dist/utils/retry.js +34 -0
  139. package/dist/utils/retry.js.map +1 -0
  140. package/install.sh +171 -0
  141. package/package.json +49 -0
package/dist/index.js ADDED
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { readFileSync } from 'fs';
4
+ import { fileURLToPath } from 'url';
5
+ import { dirname, join } from 'path';
6
+ import chalk from 'chalk';
7
+ import { initCommand } from './commands/init.js';
8
+ import { isInitialized, loadConfig, loadServers, getActiveProvider, getMemoryPath, } from './config/manager.js';
9
+ import { getMcpServerConfigs } from './mcp/config.js';
10
+ import { MCPManager } from './mcp/manager.js';
11
+ import { createLLMProvider } from './llm/factory.js';
12
+ import { getCodexAccessToken, codexOAuthLogin } from './llm/openai-codex.js';
13
+ import { ToolRegistry } from './tools/registry.js';
14
+ import { AgentLoop } from './agent/loop.js';
15
+ import { printBanner, printError, createSpinner } from './cli/output.js';
16
+ import { startRepl } from './cli/repl.js';
17
+ import { buildSystemPrompt } from './prompts/system.js';
18
+ import { SessionState } from './agent/session.js';
19
+ import { logger } from './cli/logger.js';
20
+ import { MemoryStore } from './memory/store.js';
21
+ import { computeScopeKey } from './memory/scope.js';
22
+ const __filename = fileURLToPath(import.meta.url);
23
+ const __dirname = dirname(__filename);
24
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
25
+ const program = new Command();
26
+ program
27
+ .name('onesclaw')
28
+ .description('ONES 企业内部 AI Agent CLI')
29
+ .version(pkg.version);
30
+ program.option('--debug', '启用 Debug 模式,输出详细日志');
31
+ // onesclaw init — 首次初始化配置
32
+ program
33
+ .command('init')
34
+ .description('初始化 ONESCLAW 配置(~/.onesclaw/)')
35
+ .action(initCommand);
36
+ // 默认行为:无子命令时进入 REPL 对话模式
37
+ program.action(async (_options, command) => {
38
+ if (command.args.length > 0)
39
+ return;
40
+ const debug = program.opts().debug || false;
41
+ logger.setDebugMode(debug);
42
+ // 检查是否已初始化
43
+ if (!(await isInitialized())) {
44
+ console.log(chalk.yellow('\n 尚未初始化,请先运行: onesclaw init\n'));
45
+ process.exit(1);
46
+ }
47
+ // 加载配置
48
+ const config = await loadConfig();
49
+ if (!config) {
50
+ console.log(chalk.red('\n 配置文件加载失败,请重新运行: onesclaw init\n'));
51
+ process.exit(1);
52
+ }
53
+ // 连接 MCP 服务器
54
+ const mcpManager = new MCPManager();
55
+ const spinner = createSpinner('连接 MCP 服务器...');
56
+ spinner.start();
57
+ try {
58
+ const servers = getMcpServerConfigs(config);
59
+ await mcpManager.connectAll(servers);
60
+ spinner.succeed('MCP 服务器已连接');
61
+ }
62
+ catch (error) {
63
+ spinner.fail('MCP 服务器连接失败');
64
+ printError(error, debug);
65
+ process.exit(1);
66
+ }
67
+ // 4. 同步 Skills
68
+ const { needsSync, syncSkills, getSkillsDir } = await import('./skills/sync.js');
69
+ if (await needsSync(config)) {
70
+ const syncSpinner = createSpinner('同步 Skills...');
71
+ syncSpinner.start();
72
+ try {
73
+ const result = await syncSkills(config);
74
+ if (result.success) {
75
+ syncSpinner.succeed(`Skills 已同步 (${result.skillCount} 个技能)`);
76
+ }
77
+ else {
78
+ syncSpinner.warn(`Skills 同步跳过: ${result.error}`);
79
+ }
80
+ }
81
+ catch (error) {
82
+ syncSpinner.warn('Skills 同步失败,使用已有版本');
83
+ logger.error('skills', `Sync failed: ${error instanceof Error ? error.message : String(error)}`);
84
+ }
85
+ }
86
+ // 5. 初始化 LLM Provider
87
+ if (!config.model) {
88
+ console.log(chalk.yellow('\n LLM 未配置,请先运行: onesclaw init\n'));
89
+ process.exit(1);
90
+ }
91
+ const active = getActiveProvider(config);
92
+ if (!active) {
93
+ console.log(chalk.yellow('\n LLM provider 凭证缺失,请运行 /model auth 配置\n'));
94
+ process.exit(1);
95
+ }
96
+ // OAuth 模式:验证 token 有效,失效时自动重新授权
97
+ if (active.providerConfig.mode === 'oauth') {
98
+ try {
99
+ await getCodexAccessToken();
100
+ }
101
+ catch {
102
+ console.log(chalk.yellow('\n OAuth token 已失效,正在重新授权...\n'));
103
+ try {
104
+ await codexOAuthLogin();
105
+ await getCodexAccessToken();
106
+ console.log(chalk.green(' ✓ OAuth 重新授权成功\n'));
107
+ }
108
+ catch (authError) {
109
+ console.log(chalk.red(` OAuth 重新授权失败: ${authError instanceof Error ? authError.message : String(authError)}`));
110
+ console.log(chalk.yellow(' 请手动运行 /model auth 重新配置\n'));
111
+ process.exit(1);
112
+ }
113
+ }
114
+ }
115
+ const llmProvider = await createLLMProvider(active.providerConfig, active.name);
116
+ // 6. 注册工具
117
+ const toolRegistry = new ToolRegistry();
118
+ toolRegistry.registerNativeTools();
119
+ toolRegistry.registerMCPTools(mcpManager);
120
+ // 7. 加载 Skill 索引
121
+ const skillIndexPath = join(getSkillsDir(), 'index.json');
122
+ try {
123
+ await toolRegistry.loadSkills(skillIndexPath);
124
+ }
125
+ catch {
126
+ logger.info('skills', 'Skills 索引不存在,跳过加载');
127
+ }
128
+ // 8. 构建 System Prompt
129
+ const systemPrompt = buildSystemPrompt({
130
+ userInfo: mcpManager.userInfo,
131
+ skills: toolRegistry.getSkills(),
132
+ mcpTools: toolRegistry
133
+ .getToolDefinitions()
134
+ .filter((t) => t.name.includes('__'))
135
+ .map((t) => t.name),
136
+ });
137
+ // 9. 创建 Session 和 Agent Loop
138
+ const serversConfig = await loadServers();
139
+ const memoryStore = new MemoryStore(getMemoryPath());
140
+ await memoryStore.init();
141
+ const userIdentity = mcpManager.userInfo?.id || mcpManager.userInfo?.email || mcpManager.userInfo?.name || 'anonymous';
142
+ const scopeKey = computeScopeKey(userIdentity, process.cwd());
143
+ const session = await SessionState.create({
144
+ user: mcpManager.userInfo,
145
+ servers: serversConfig.servers,
146
+ memoryStore,
147
+ scopeKey,
148
+ });
149
+ const agent = new AgentLoop({
150
+ llmProvider,
151
+ toolRegistry,
152
+ systemPrompt,
153
+ chatOptions: { model: active.model },
154
+ session,
155
+ });
156
+ // 10. 全局异常兜底
157
+ process.on('uncaughtException', async (error) => {
158
+ logger.error('system', `Uncaught exception: ${error.message}`, {
159
+ stack: error.stack,
160
+ });
161
+ printError(error, debug);
162
+ try {
163
+ await toolRegistry.cleanup();
164
+ await mcpManager.disconnectAll();
165
+ await memoryStore.close();
166
+ }
167
+ catch {
168
+ // 清理失败不阻塞退出
169
+ }
170
+ process.exit(1);
171
+ });
172
+ process.on('unhandledRejection', (reason) => {
173
+ const message = reason instanceof Error ? reason.message : String(reason);
174
+ logger.error('system', `Unhandled rejection: ${message}`);
175
+ });
176
+ // 11. 显示启动横幅
177
+ printBanner(pkg.version, mcpManager.userInfo, mcpManager.getConnectedServers(), {
178
+ count: toolRegistry.getSkills().length,
179
+ lastSync: config.ones_skills?.last_updated_at ?? null,
180
+ }, config.model);
181
+ // 12. 启动 REPL
182
+ const reloadSkills = async () => {
183
+ try {
184
+ await toolRegistry.loadSkills(skillIndexPath);
185
+ }
186
+ catch {
187
+ // 加载失败不阻塞
188
+ }
189
+ return toolRegistry.getSkills();
190
+ };
191
+ try {
192
+ await startRepl({
193
+ agent,
194
+ skills: toolRegistry.getSkills(),
195
+ debug,
196
+ config,
197
+ reloadSkills,
198
+ });
199
+ }
200
+ finally {
201
+ await toolRegistry.cleanup();
202
+ await mcpManager.disconnectAll();
203
+ await memoryStore.close();
204
+ }
205
+ });
206
+ program.parse();
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { LLMError } from '../errors.js';
2
+ /**
3
+ * Anthropic Claude LLM Provider
4
+ *
5
+ * 使用 @anthropic-ai/sdk 的流式 API,将原始事件转换为统一的 StreamEvent。
6
+ * 支持 API 错误分类和自动重试(429 Rate Limit、5xx Server Error、网络错误)。
7
+ */
8
+ export declare class AnthropicProvider {
9
+ name: string;
10
+ client: any;
11
+ constructor(apiKey: any);
12
+ /**
13
+ * 流式对话调用
14
+ * 使用 AsyncGenerator 模式,逐个 yield StreamEvent。
15
+ */
16
+ chat(messages: any, tools: any, options: any): AsyncGenerator<{
17
+ type: string;
18
+ id: any;
19
+ name: any;
20
+ text?: undefined;
21
+ input_json?: undefined;
22
+ stop_reason?: undefined;
23
+ usage?: undefined;
24
+ error?: undefined;
25
+ } | {
26
+ type: string;
27
+ text: any;
28
+ id?: undefined;
29
+ name?: undefined;
30
+ input_json?: undefined;
31
+ stop_reason?: undefined;
32
+ usage?: undefined;
33
+ error?: undefined;
34
+ } | {
35
+ type: string;
36
+ input_json: any;
37
+ id?: undefined;
38
+ name?: undefined;
39
+ text?: undefined;
40
+ stop_reason?: undefined;
41
+ usage?: undefined;
42
+ error?: undefined;
43
+ } | {
44
+ type: string;
45
+ id?: undefined;
46
+ name?: undefined;
47
+ text?: undefined;
48
+ input_json?: undefined;
49
+ stop_reason?: undefined;
50
+ usage?: undefined;
51
+ error?: undefined;
52
+ } | {
53
+ type: string;
54
+ stop_reason: any;
55
+ usage: {
56
+ inputTokens: number;
57
+ outputTokens: any;
58
+ };
59
+ id?: undefined;
60
+ name?: undefined;
61
+ text?: undefined;
62
+ input_json?: undefined;
63
+ error?: undefined;
64
+ } | {
65
+ type: string;
66
+ error: Error;
67
+ id?: undefined;
68
+ name?: undefined;
69
+ text?: undefined;
70
+ input_json?: undefined;
71
+ stop_reason?: undefined;
72
+ usage?: undefined;
73
+ }, void, unknown>;
74
+ /**
75
+ * 判断 API 错误是否可重试
76
+ * 429 Rate Limit、5xx Server Error、网络错误可重试
77
+ */
78
+ isRetryableError(error: any): boolean;
79
+ /**
80
+ * 将原始错误转换为 LLMError,提供用户友好的错误信息
81
+ */
82
+ classifyError(error: any): LLMError;
83
+ }
@@ -0,0 +1,190 @@
1
+ // @ts-nocheck
2
+ import Anthropic from '@anthropic-ai/sdk';
3
+ import { logger } from '../cli/logger.js';
4
+ import { LLMError } from '../errors.js';
5
+ import { withRetry } from '../utils/retry.js';
6
+ const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
7
+ const DEFAULT_MAX_TOKENS = 8192;
8
+ /**
9
+ * Anthropic Claude LLM Provider
10
+ *
11
+ * 使用 @anthropic-ai/sdk 的流式 API,将原始事件转换为统一的 StreamEvent。
12
+ * 支持 API 错误分类和自动重试(429 Rate Limit、5xx Server Error、网络错误)。
13
+ */
14
+ export class AnthropicProvider {
15
+ name = 'anthropic';
16
+ client;
17
+ constructor(apiKey) {
18
+ this.client = new Anthropic({ apiKey });
19
+ }
20
+ /**
21
+ * 流式对话调用
22
+ * 使用 AsyncGenerator 模式,逐个 yield StreamEvent。
23
+ */
24
+ async *chat(messages, tools, options) {
25
+ const model = options?.model || DEFAULT_MODEL;
26
+ const maxTokens = options?.maxTokens || DEFAULT_MAX_TOKENS;
27
+ // 构造请求参数
28
+ const params = {
29
+ model,
30
+ max_tokens: maxTokens,
31
+ messages: messages,
32
+ stream: true,
33
+ };
34
+ // 系统提示词
35
+ if (options?.system) {
36
+ params.system = options.system;
37
+ }
38
+ // 温度
39
+ if (options?.temperature !== undefined) {
40
+ params.temperature = options.temperature;
41
+ }
42
+ // 工具定义(为空时不传,避免 API 报错)
43
+ if (tools.length > 0) {
44
+ params.tools = tools;
45
+ }
46
+ logger.debug('llm', `→ Request: model=${model}, tools=${tools.length}, messages=${messages.length}`);
47
+ // 1. 创建流(带重试:429/5xx/网络错误自动重试)
48
+ let stream;
49
+ try {
50
+ stream = await withRetry(() => this.client.messages.create(params), {
51
+ maxRetries: 3,
52
+ baseDelayMs: 1000,
53
+ maxDelayMs: 8000,
54
+ shouldRetry: (e) => this.isRetryableError(e),
55
+ });
56
+ }
57
+ catch (error) {
58
+ yield { type: 'error', error: this.classifyError(error) };
59
+ return;
60
+ }
61
+ // 2. 处理流式事件(流式阶段不重试)
62
+ try {
63
+ // 跟踪当前是否在 tool_use 上下文中
64
+ let inToolUse = false;
65
+ // 累积 token 计数(message_start 提供 input,message_delta 提供 output)
66
+ let inputTokens = 0;
67
+ for await (const event of stream) {
68
+ switch (event.type) {
69
+ case 'message_start': {
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ const usage = event.message?.usage;
72
+ inputTokens = usage?.input_tokens || 0;
73
+ break;
74
+ }
75
+ case 'content_block_start': {
76
+ if (event.content_block.type === 'tool_use') {
77
+ inToolUse = true;
78
+ yield {
79
+ type: 'tool_use_start',
80
+ id: event.content_block.id,
81
+ name: event.content_block.name,
82
+ };
83
+ }
84
+ // text block start 不需要额外事件,等待 delta
85
+ break;
86
+ }
87
+ case 'content_block_delta': {
88
+ if (event.delta.type === 'text_delta') {
89
+ yield {
90
+ type: 'text_delta',
91
+ text: event.delta.text,
92
+ };
93
+ }
94
+ else if (event.delta.type === 'input_json_delta') {
95
+ yield {
96
+ type: 'tool_use_delta',
97
+ input_json: event.delta.partial_json,
98
+ };
99
+ }
100
+ break;
101
+ }
102
+ case 'content_block_stop': {
103
+ if (inToolUse) {
104
+ yield { type: 'tool_use_end' };
105
+ inToolUse = false;
106
+ }
107
+ break;
108
+ }
109
+ case 'message_delta': {
110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+ const outputTokens = event.usage?.output_tokens || 0;
112
+ logger.debug('llm', `← Response: stop=${event.delta.stop_reason}, in=${inputTokens}, out=${outputTokens}`);
113
+ yield {
114
+ type: 'message_end',
115
+ stop_reason: event.delta.stop_reason || 'end_turn',
116
+ usage: { inputTokens, outputTokens },
117
+ };
118
+ break;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ catch (error) {
124
+ yield {
125
+ type: 'error',
126
+ error: error instanceof Error ? error : new Error(String(error)),
127
+ };
128
+ }
129
+ }
130
+ /**
131
+ * 判断 API 错误是否可重试
132
+ * 429 Rate Limit、5xx Server Error、网络错误可重试
133
+ */
134
+ isRetryableError(error) {
135
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
+ const status = error?.status;
137
+ if (status === 429 ||
138
+ status === 500 ||
139
+ status === 502 ||
140
+ status === 503) {
141
+ return true;
142
+ }
143
+ const message = error instanceof Error ? error.message : String(error);
144
+ if (message.includes('fetch') ||
145
+ message.includes('network') ||
146
+ message.includes('ECONNREFUSED') ||
147
+ message.includes('ETIMEDOUT')) {
148
+ return true;
149
+ }
150
+ return false;
151
+ }
152
+ /**
153
+ * 将原始错误转换为 LLMError,提供用户友好的错误信息
154
+ */
155
+ classifyError(error) {
156
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
157
+ const status = error?.status;
158
+ const message = error instanceof Error ? error.message : String(error);
159
+ switch (status) {
160
+ case 401:
161
+ return new LLMError('API 认证失败,请检查 API Key 配置 (onesclaw init)', 401, false);
162
+ case 400: {
163
+ // context length exceeded 保留原始消息,由 agent loop 处理
164
+ if (message.includes('context') ||
165
+ message.includes('too long') ||
166
+ message.includes('max tokens') ||
167
+ message.includes('too many')) {
168
+ return new LLMError(message, 400, false);
169
+ }
170
+ return new LLMError(`请求参数错误: ${message}`, 400, false);
171
+ }
172
+ case 429:
173
+ return new LLMError('API 请求频率超限,已重试仍失败', 429, true);
174
+ case 500:
175
+ case 502:
176
+ case 503:
177
+ return new LLMError(`Anthropic API 服务暂时不可用 (${status}),已重试仍失败`, status, true);
178
+ default: {
179
+ if (message.includes('fetch') ||
180
+ message.includes('network') ||
181
+ message.includes('ECONNREFUSED') ||
182
+ message.includes('ETIMEDOUT')) {
183
+ return new LLMError('网络连接失败,请检查网络', undefined, true);
184
+ }
185
+ return new LLMError(message, status);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/llm/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { AnthropicProvider } from './anthropic.js';
2
+ import { OpenAIProvider } from './openai.js';
3
+ import { OpenAICodexProvider } from './openai-codex.js';
4
+ /**
5
+ * Provider 注册表
6
+ *
7
+ * 包含所有支持的 Provider 的元数据:显示名、认证方式、模型列表、校验规则。
8
+ */
9
+ export declare const PROVIDER_REGISTRY: ({
10
+ name: string;
11
+ displayName: string;
12
+ authModes: {
13
+ mode: string;
14
+ displayName: string;
15
+ }[];
16
+ models: {
17
+ id: string;
18
+ displayName: string;
19
+ }[];
20
+ validateKey?: undefined;
21
+ keyPlaceholder?: undefined;
22
+ } | {
23
+ name: string;
24
+ displayName: string;
25
+ authModes: {
26
+ mode: string;
27
+ displayName: string;
28
+ }[];
29
+ models: {
30
+ id: string;
31
+ displayName: string;
32
+ }[];
33
+ validateKey: (key: any) => "API Key 不能为空" | "API Key 格式不正确,应以 sk- 开头";
34
+ keyPlaceholder: string;
35
+ } | {
36
+ name: string;
37
+ displayName: string;
38
+ authModes: {
39
+ mode: string;
40
+ displayName: string;
41
+ }[];
42
+ models: {
43
+ id: string;
44
+ displayName: string;
45
+ }[];
46
+ validateKey: (key: any) => "API Key 不能为空" | "API Key 格式不正确,应以 sk-ant- 开头";
47
+ keyPlaceholder: string;
48
+ })[];
49
+ /**
50
+ * 根据 provider name 查找注册信息
51
+ */
52
+ export declare function getProviderInfo(name: any): {
53
+ name: string;
54
+ displayName: string;
55
+ authModes: {
56
+ mode: string;
57
+ displayName: string;
58
+ }[];
59
+ models: {
60
+ id: string;
61
+ displayName: string;
62
+ }[];
63
+ validateKey?: undefined;
64
+ keyPlaceholder?: undefined;
65
+ } | {
66
+ name: string;
67
+ displayName: string;
68
+ authModes: {
69
+ mode: string;
70
+ displayName: string;
71
+ }[];
72
+ models: {
73
+ id: string;
74
+ displayName: string;
75
+ }[];
76
+ validateKey: (key: any) => "API Key 不能为空" | "API Key 格式不正确,应以 sk- 开头";
77
+ keyPlaceholder: string;
78
+ } | {
79
+ name: string;
80
+ displayName: string;
81
+ authModes: {
82
+ mode: string;
83
+ displayName: string;
84
+ }[];
85
+ models: {
86
+ id: string;
87
+ displayName: string;
88
+ }[];
89
+ validateKey: (key: any) => "API Key 不能为空" | "API Key 格式不正确,应以 sk-ant- 开头";
90
+ keyPlaceholder: string;
91
+ };
92
+ /**
93
+ * 根据配置创建 LLM Provider 实例
94
+ *
95
+ * - anthropic → AnthropicProvider(api_key)
96
+ * - openai → OpenAIProvider(api_key)
97
+ * - openai-codex → OpenAIProvider(oauth_access_token)
98
+ */
99
+ export declare function createLLMProvider(providerConfig: any, providerName: any): Promise<AnthropicProvider | OpenAIProvider | OpenAICodexProvider>;
100
+ /**
101
+ * 从 provider API 动态获取可用模型列表
102
+ *
103
+ * 有凭证时尝试从 API 获取,失败或无凭证时回退到 PROVIDER_REGISTRY 中的固定列表。
104
+ */
105
+ export declare function fetchAvailableModels(providerName: any, credential: any): Promise<any>;