gencode-ai 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 (274) hide show
  1. package/.env.example +11 -0
  2. package/CLAUDE.md +70 -0
  3. package/LICENSE +21 -0
  4. package/README.md +117 -0
  5. package/dist/agent/agent.d.ts +84 -0
  6. package/dist/agent/agent.d.ts.map +1 -0
  7. package/dist/agent/agent.js +233 -0
  8. package/dist/agent/agent.js.map +1 -0
  9. package/dist/agent/index.d.ts +6 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +6 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/types.d.ts +47 -0
  14. package/dist/agent/types.d.ts.map +1 -0
  15. package/dist/agent/types.js +5 -0
  16. package/dist/agent/types.js.map +1 -0
  17. package/dist/cli/components/App.d.ts +14 -0
  18. package/dist/cli/components/App.d.ts.map +1 -0
  19. package/dist/cli/components/App.js +395 -0
  20. package/dist/cli/components/App.js.map +1 -0
  21. package/dist/cli/components/CommandSuggestions.d.ts +13 -0
  22. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
  23. package/dist/cli/components/CommandSuggestions.js +32 -0
  24. package/dist/cli/components/CommandSuggestions.js.map +1 -0
  25. package/dist/cli/components/Header.d.ts +9 -0
  26. package/dist/cli/components/Header.d.ts.map +1 -0
  27. package/dist/cli/components/Header.js +13 -0
  28. package/dist/cli/components/Header.js.map +1 -0
  29. package/dist/cli/components/Input.d.ts +13 -0
  30. package/dist/cli/components/Input.d.ts.map +1 -0
  31. package/dist/cli/components/Input.js +27 -0
  32. package/dist/cli/components/Input.js.map +1 -0
  33. package/dist/cli/components/Logo.d.ts +2 -0
  34. package/dist/cli/components/Logo.d.ts.map +1 -0
  35. package/dist/cli/components/Logo.js +8 -0
  36. package/dist/cli/components/Logo.js.map +1 -0
  37. package/dist/cli/components/Messages.d.ts +37 -0
  38. package/dist/cli/components/Messages.d.ts.map +1 -0
  39. package/dist/cli/components/Messages.js +106 -0
  40. package/dist/cli/components/Messages.js.map +1 -0
  41. package/dist/cli/components/ModelSelector.d.ts +13 -0
  42. package/dist/cli/components/ModelSelector.d.ts.map +1 -0
  43. package/dist/cli/components/ModelSelector.js +72 -0
  44. package/dist/cli/components/ModelSelector.js.map +1 -0
  45. package/dist/cli/components/Spinner.d.ts +12 -0
  46. package/dist/cli/components/Spinner.d.ts.map +1 -0
  47. package/dist/cli/components/Spinner.js +45 -0
  48. package/dist/cli/components/Spinner.js.map +1 -0
  49. package/dist/cli/components/index.d.ts +12 -0
  50. package/dist/cli/components/index.d.ts.map +1 -0
  51. package/dist/cli/components/index.js +12 -0
  52. package/dist/cli/components/index.js.map +1 -0
  53. package/dist/cli/components/theme.d.ts +31 -0
  54. package/dist/cli/components/theme.d.ts.map +1 -0
  55. package/dist/cli/components/theme.js +36 -0
  56. package/dist/cli/components/theme.js.map +1 -0
  57. package/dist/cli/index-legacy.d.ts +7 -0
  58. package/dist/cli/index-legacy.d.ts.map +1 -0
  59. package/dist/cli/index-legacy.js +431 -0
  60. package/dist/cli/index-legacy.js.map +1 -0
  61. package/dist/cli/index.d.ts +7 -0
  62. package/dist/cli/index.d.ts.map +1 -0
  63. package/dist/cli/index.js +116 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/ink-cli.d.ts +7 -0
  66. package/dist/cli/ink-cli.d.ts.map +1 -0
  67. package/dist/cli/ink-cli.js +105 -0
  68. package/dist/cli/ink-cli.js.map +1 -0
  69. package/dist/cli/session-picker.d.ts +16 -0
  70. package/dist/cli/session-picker.d.ts.map +1 -0
  71. package/dist/cli/session-picker.js +280 -0
  72. package/dist/cli/session-picker.js.map +1 -0
  73. package/dist/cli/ui.d.ts +61 -0
  74. package/dist/cli/ui.d.ts.map +1 -0
  75. package/dist/cli/ui.js +364 -0
  76. package/dist/cli/ui.js.map +1 -0
  77. package/dist/config/index.d.ts +7 -0
  78. package/dist/config/index.d.ts.map +1 -0
  79. package/dist/config/index.js +6 -0
  80. package/dist/config/index.js.map +1 -0
  81. package/dist/config/manager.d.ts +31 -0
  82. package/dist/config/manager.d.ts.map +1 -0
  83. package/dist/config/manager.js +65 -0
  84. package/dist/config/manager.js.map +1 -0
  85. package/dist/config/types.d.ts +22 -0
  86. package/dist/config/types.d.ts.map +1 -0
  87. package/dist/config/types.js +6 -0
  88. package/dist/config/types.js.map +1 -0
  89. package/dist/index.d.ts +12 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +21 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/memory/index.d.ts +10 -0
  94. package/dist/memory/index.d.ts.map +1 -0
  95. package/dist/memory/index.js +9 -0
  96. package/dist/memory/index.js.map +1 -0
  97. package/dist/memory/init.d.ts +20 -0
  98. package/dist/memory/init.d.ts.map +1 -0
  99. package/dist/memory/init.js +332 -0
  100. package/dist/memory/init.js.map +1 -0
  101. package/dist/memory/manager.d.ts +85 -0
  102. package/dist/memory/manager.d.ts.map +1 -0
  103. package/dist/memory/manager.js +234 -0
  104. package/dist/memory/manager.js.map +1 -0
  105. package/dist/memory/types.d.ts +74 -0
  106. package/dist/memory/types.d.ts.map +1 -0
  107. package/dist/memory/types.js +6 -0
  108. package/dist/memory/types.js.map +1 -0
  109. package/dist/permissions/index.d.ts +7 -0
  110. package/dist/permissions/index.d.ts.map +1 -0
  111. package/dist/permissions/index.js +6 -0
  112. package/dist/permissions/index.js.map +1 -0
  113. package/dist/permissions/manager.d.ts +32 -0
  114. package/dist/permissions/manager.d.ts.map +1 -0
  115. package/dist/permissions/manager.js +79 -0
  116. package/dist/permissions/manager.js.map +1 -0
  117. package/dist/permissions/types.d.ts +14 -0
  118. package/dist/permissions/types.d.ts.map +1 -0
  119. package/dist/permissions/types.js +17 -0
  120. package/dist/permissions/types.js.map +1 -0
  121. package/dist/providers/anthropic.d.ts +20 -0
  122. package/dist/providers/anthropic.d.ts.map +1 -0
  123. package/dist/providers/anthropic.js +185 -0
  124. package/dist/providers/anthropic.js.map +1 -0
  125. package/dist/providers/gemini.d.ts +21 -0
  126. package/dist/providers/gemini.d.ts.map +1 -0
  127. package/dist/providers/gemini.js +241 -0
  128. package/dist/providers/gemini.js.map +1 -0
  129. package/dist/providers/index.d.ts +34 -0
  130. package/dist/providers/index.d.ts.map +1 -0
  131. package/dist/providers/index.js +72 -0
  132. package/dist/providers/index.js.map +1 -0
  133. package/dist/providers/openai.d.ts +19 -0
  134. package/dist/providers/openai.d.ts.map +1 -0
  135. package/dist/providers/openai.js +221 -0
  136. package/dist/providers/openai.js.map +1 -0
  137. package/dist/providers/types.d.ts +125 -0
  138. package/dist/providers/types.d.ts.map +1 -0
  139. package/dist/providers/types.js +6 -0
  140. package/dist/providers/types.js.map +1 -0
  141. package/dist/session/index.d.ts +6 -0
  142. package/dist/session/index.d.ts.map +1 -0
  143. package/dist/session/index.js +6 -0
  144. package/dist/session/index.js.map +1 -0
  145. package/dist/session/manager.d.ts +101 -0
  146. package/dist/session/manager.d.ts.map +1 -0
  147. package/dist/session/manager.js +295 -0
  148. package/dist/session/manager.js.map +1 -0
  149. package/dist/session/types.d.ts +39 -0
  150. package/dist/session/types.d.ts.map +1 -0
  151. package/dist/session/types.js +10 -0
  152. package/dist/session/types.js.map +1 -0
  153. package/dist/tools/builtin/bash.d.ts +7 -0
  154. package/dist/tools/builtin/bash.d.ts.map +1 -0
  155. package/dist/tools/builtin/bash.js +80 -0
  156. package/dist/tools/builtin/bash.js.map +1 -0
  157. package/dist/tools/builtin/edit.d.ts +7 -0
  158. package/dist/tools/builtin/edit.d.ts.map +1 -0
  159. package/dist/tools/builtin/edit.js +32 -0
  160. package/dist/tools/builtin/edit.js.map +1 -0
  161. package/dist/tools/builtin/glob.d.ts +7 -0
  162. package/dist/tools/builtin/glob.d.ts.map +1 -0
  163. package/dist/tools/builtin/glob.js +36 -0
  164. package/dist/tools/builtin/glob.js.map +1 -0
  165. package/dist/tools/builtin/grep.d.ts +7 -0
  166. package/dist/tools/builtin/grep.d.ts.map +1 -0
  167. package/dist/tools/builtin/grep.js +59 -0
  168. package/dist/tools/builtin/grep.js.map +1 -0
  169. package/dist/tools/builtin/read.d.ts +7 -0
  170. package/dist/tools/builtin/read.d.ts.map +1 -0
  171. package/dist/tools/builtin/read.js +29 -0
  172. package/dist/tools/builtin/read.js.map +1 -0
  173. package/dist/tools/builtin/write.d.ts +7 -0
  174. package/dist/tools/builtin/write.d.ts.map +1 -0
  175. package/dist/tools/builtin/write.js +24 -0
  176. package/dist/tools/builtin/write.js.map +1 -0
  177. package/dist/tools/index.d.ts +38 -0
  178. package/dist/tools/index.d.ts.map +1 -0
  179. package/dist/tools/index.js +32 -0
  180. package/dist/tools/index.js.map +1 -0
  181. package/dist/tools/registry.d.ts +22 -0
  182. package/dist/tools/registry.d.ts.map +1 -0
  183. package/dist/tools/registry.js +71 -0
  184. package/dist/tools/registry.js.map +1 -0
  185. package/dist/tools/types.d.ts +62 -0
  186. package/dist/tools/types.d.ts.map +1 -0
  187. package/dist/tools/types.js +126 -0
  188. package/dist/tools/types.js.map +1 -0
  189. package/docs/README.md +16 -0
  190. package/docs/proposals/0001-web-fetch-tool.md +293 -0
  191. package/docs/proposals/0002-web-search-tool.md +306 -0
  192. package/docs/proposals/0003-task-subagents.md +333 -0
  193. package/docs/proposals/0004-plan-mode.md +338 -0
  194. package/docs/proposals/0005-todo-system.md +299 -0
  195. package/docs/proposals/0006-memory-system.md +539 -0
  196. package/docs/proposals/0007-context-management.md +429 -0
  197. package/docs/proposals/0008-checkpointing.md +327 -0
  198. package/docs/proposals/0009-hooks-system.md +343 -0
  199. package/docs/proposals/0010-mcp-integration.md +382 -0
  200. package/docs/proposals/0011-custom-commands.md +374 -0
  201. package/docs/proposals/0012-ask-user-question.md +317 -0
  202. package/docs/proposals/0013-multi-edit-tool.md +345 -0
  203. package/docs/proposals/0014-lsp-tool.md +478 -0
  204. package/docs/proposals/0015-ls-tool.md +407 -0
  205. package/docs/proposals/0016-kill-shell-tool.md +455 -0
  206. package/docs/proposals/0017-background-tasks.md +489 -0
  207. package/docs/proposals/0018-parallel-tool-execution.md +415 -0
  208. package/docs/proposals/0019-session-enhancements.md +462 -0
  209. package/docs/proposals/0020-session-summarization.md +447 -0
  210. package/docs/proposals/0021-skills-system.md +409 -0
  211. package/docs/proposals/0022-plugin-system.md +467 -0
  212. package/docs/proposals/0023-permission-enhancements.md +470 -0
  213. package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
  214. package/docs/proposals/0025-cost-tracking.md +447 -0
  215. package/docs/proposals/0026-git-integration.md +475 -0
  216. package/docs/proposals/0027-enhanced-read-tool.md +514 -0
  217. package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
  218. package/docs/proposals/0029-notebook-edit-tool.md +413 -0
  219. package/docs/proposals/0030-plugin-marketplace.md +360 -0
  220. package/docs/proposals/0031-command-suggestions.md +295 -0
  221. package/docs/proposals/0032-ide-integrations.md +328 -0
  222. package/docs/proposals/0033-enterprise-deployment.md +221 -0
  223. package/docs/proposals/0034-sandboxing.md +273 -0
  224. package/docs/proposals/0035-auto-updater.md +311 -0
  225. package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
  226. package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
  227. package/docs/proposals/0038-interactive-cli-ui.md +373 -0
  228. package/docs/proposals/0039-streaming-enhancements.md +359 -0
  229. package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
  230. package/docs/proposals/README.md +84 -0
  231. package/docs/proposals/TEMPLATE.md +57 -0
  232. package/docs/proposals/research/claude-code-research.md +307 -0
  233. package/examples/agent-demo.ts +115 -0
  234. package/examples/basic.ts +166 -0
  235. package/package.json +50 -0
  236. package/src/agent/agent.ts +276 -0
  237. package/src/agent/index.ts +6 -0
  238. package/src/agent/types.ts +62 -0
  239. package/src/cli/components/App.tsx +565 -0
  240. package/src/cli/components/CommandSuggestions.tsx +58 -0
  241. package/src/cli/components/Header.tsx +36 -0
  242. package/src/cli/components/Input.tsx +60 -0
  243. package/src/cli/components/Logo.tsx +16 -0
  244. package/src/cli/components/Messages.tsx +210 -0
  245. package/src/cli/components/ModelSelector.tsx +135 -0
  246. package/src/cli/components/Spinner.tsx +72 -0
  247. package/src/cli/components/index.ts +21 -0
  248. package/src/cli/components/theme.ts +36 -0
  249. package/src/cli/index.tsx +136 -0
  250. package/src/config/index.ts +7 -0
  251. package/src/config/manager.ts +77 -0
  252. package/src/config/types.ts +25 -0
  253. package/src/index.ts +86 -0
  254. package/src/permissions/index.ts +7 -0
  255. package/src/permissions/manager.ts +97 -0
  256. package/src/permissions/types.ts +29 -0
  257. package/src/providers/anthropic.ts +224 -0
  258. package/src/providers/gemini.ts +295 -0
  259. package/src/providers/index.ts +97 -0
  260. package/src/providers/openai.ts +261 -0
  261. package/src/providers/types.ts +181 -0
  262. package/src/session/index.ts +6 -0
  263. package/src/session/manager.ts +354 -0
  264. package/src/session/types.ts +49 -0
  265. package/src/tools/builtin/bash.ts +92 -0
  266. package/src/tools/builtin/edit.ts +37 -0
  267. package/src/tools/builtin/glob.ts +42 -0
  268. package/src/tools/builtin/grep.ts +67 -0
  269. package/src/tools/builtin/read.ts +34 -0
  270. package/src/tools/builtin/write.ts +27 -0
  271. package/src/tools/index.ts +36 -0
  272. package/src/tools/registry.ts +83 -0
  273. package/src/tools/types.ts +172 -0
  274. package/tsconfig.json +21 -0
@@ -0,0 +1,369 @@
1
+ # Proposal: Multi-Provider Enhancements
2
+
3
+ - **Proposal ID**: 0040
4
+ - **Author**: mycode team
5
+ - **Status**: Draft
6
+ - **Created**: 2025-01-15
7
+ - **Updated**: 2025-01-15
8
+
9
+ ## Summary
10
+
11
+ Enhance the multi-provider system with unified tool calling, provider fallbacks, automatic model selection, and cross-provider consistency for seamless switching between LLM providers.
12
+
13
+ ## Motivation
14
+
15
+ Current multi-provider support is basic:
16
+
17
+ 1. **Inconsistent tool calling**: Different formats per provider
18
+ 2. **No fallbacks**: Single point of failure
19
+ 3. **Manual selection**: User must choose provider
20
+ 4. **Feature gaps**: Not all features on all providers
21
+ 5. **No cost optimization**: Can't auto-select cheapest
22
+
23
+ Enhanced multi-provider enables robust, flexible LLM usage.
24
+
25
+ ## Detailed Design
26
+
27
+ ### API Design
28
+
29
+ ```typescript
30
+ // src/providers/types.ts
31
+ interface ProviderConfig {
32
+ name: string;
33
+ enabled: boolean;
34
+ priority: number; // Lower = higher priority
35
+ models: ModelConfig[];
36
+ rateLimits?: RateLimitConfig;
37
+ fallbackTo?: string; // Fallback provider
38
+ }
39
+
40
+ interface ModelConfig {
41
+ id: string;
42
+ aliases: string[];
43
+ capabilities: ModelCapability[];
44
+ contextWindow: number;
45
+ maxOutputTokens: number;
46
+ inputPricePer1M: number;
47
+ outputPricePer1M: number;
48
+ }
49
+
50
+ type ModelCapability =
51
+ | 'text'
52
+ | 'vision'
53
+ | 'tools'
54
+ | 'streaming'
55
+ | 'thinking'
56
+ | 'json_mode';
57
+
58
+ interface ProviderSelector {
59
+ strategy: 'priority' | 'round_robin' | 'cost_optimized' | 'latency_optimized';
60
+ requirements?: {
61
+ capabilities?: ModelCapability[];
62
+ minContextWindow?: number;
63
+ maxCostPer1K?: number;
64
+ };
65
+ }
66
+
67
+ interface ProviderResult<T> {
68
+ provider: string;
69
+ model: string;
70
+ result: T;
71
+ usage?: TokenUsage;
72
+ latency: number;
73
+ fallbackUsed: boolean;
74
+ }
75
+ ```
76
+
77
+ ### Unified Provider Manager
78
+
79
+ ```typescript
80
+ // src/providers/manager.ts
81
+ class ProviderManager {
82
+ private providers: Map<string, LLMProvider> = new Map();
83
+ private configs: Map<string, ProviderConfig> = new Map();
84
+ private healthStatus: Map<string, ProviderHealth> = new Map();
85
+
86
+ constructor() {
87
+ this.loadProviders();
88
+ this.startHealthChecks();
89
+ }
90
+
91
+ async complete(
92
+ request: CompletionRequest,
93
+ selector?: ProviderSelector
94
+ ): Promise<ProviderResult<CompletionResponse>> {
95
+ const provider = await this.selectProvider(request, selector);
96
+
97
+ const start = Date.now();
98
+ let fallbackUsed = false;
99
+
100
+ try {
101
+ const result = await provider.complete(request);
102
+ return {
103
+ provider: provider.name,
104
+ model: request.model,
105
+ result,
106
+ usage: result.usage,
107
+ latency: Date.now() - start,
108
+ fallbackUsed
109
+ };
110
+ } catch (error) {
111
+ // Try fallback
112
+ const fallback = await this.getFallback(provider.name, request);
113
+ if (fallback) {
114
+ fallbackUsed = true;
115
+ const result = await fallback.complete(request);
116
+ return {
117
+ provider: fallback.name,
118
+ model: request.model,
119
+ result,
120
+ usage: result.usage,
121
+ latency: Date.now() - start,
122
+ fallbackUsed
123
+ };
124
+ }
125
+ throw error;
126
+ }
127
+ }
128
+
129
+ private async selectProvider(
130
+ request: CompletionRequest,
131
+ selector?: ProviderSelector
132
+ ): Promise<LLMProvider> {
133
+ const strategy = selector?.strategy || 'priority';
134
+ const requirements = selector?.requirements || {};
135
+
136
+ // Get eligible providers
137
+ const eligible = Array.from(this.providers.entries())
138
+ .filter(([name, provider]) => {
139
+ const config = this.configs.get(name);
140
+ if (!config?.enabled) return false;
141
+
142
+ // Check health
143
+ const health = this.healthStatus.get(name);
144
+ if (health?.status === 'unhealthy') return false;
145
+
146
+ // Check capabilities
147
+ if (requirements.capabilities) {
148
+ const model = this.findModel(config, request.model);
149
+ if (!model) return false;
150
+ const hasAll = requirements.capabilities.every(c =>
151
+ model.capabilities.includes(c)
152
+ );
153
+ if (!hasAll) return false;
154
+ }
155
+
156
+ return true;
157
+ });
158
+
159
+ if (eligible.length === 0) {
160
+ throw new Error('No eligible providers available');
161
+ }
162
+
163
+ // Select based on strategy
164
+ switch (strategy) {
165
+ case 'priority':
166
+ eligible.sort((a, b) => {
167
+ const priorityA = this.configs.get(a[0])?.priority || 999;
168
+ const priorityB = this.configs.get(b[0])?.priority || 999;
169
+ return priorityA - priorityB;
170
+ });
171
+ return eligible[0][1];
172
+
173
+ case 'cost_optimized':
174
+ return this.selectCheapest(eligible, request);
175
+
176
+ case 'latency_optimized':
177
+ return this.selectFastest(eligible);
178
+
179
+ case 'round_robin':
180
+ return this.selectRoundRobin(eligible);
181
+
182
+ default:
183
+ return eligible[0][1];
184
+ }
185
+ }
186
+
187
+ private selectCheapest(
188
+ providers: [string, LLMProvider][],
189
+ request: CompletionRequest
190
+ ): LLMProvider {
191
+ const estimatedTokens = this.estimateTokens(request);
192
+
193
+ let cheapest: LLMProvider | null = null;
194
+ let lowestCost = Infinity;
195
+
196
+ for (const [name, provider] of providers) {
197
+ const config = this.configs.get(name);
198
+ const model = this.findModel(config!, request.model);
199
+ if (!model) continue;
200
+
201
+ const cost = (estimatedTokens.input * model.inputPricePer1M / 1_000_000) +
202
+ (estimatedTokens.output * model.outputPricePer1M / 1_000_000);
203
+
204
+ if (cost < lowestCost) {
205
+ lowestCost = cost;
206
+ cheapest = provider;
207
+ }
208
+ }
209
+
210
+ return cheapest || providers[0][1];
211
+ }
212
+
213
+ // Tool calling normalization
214
+ normalizeToolCall(call: ProviderToolCall): UnifiedToolCall {
215
+ // Convert provider-specific format to unified format
216
+ return {
217
+ id: call.id || generateId(),
218
+ name: call.name || call.function?.name,
219
+ input: call.input || JSON.parse(call.function?.arguments || '{}')
220
+ };
221
+ }
222
+
223
+ normalizeToolResult(result: ToolResult, provider: string): ProviderToolResult {
224
+ // Convert unified result to provider-specific format
225
+ switch (provider) {
226
+ case 'anthropic':
227
+ return {
228
+ type: 'tool_result',
229
+ tool_use_id: result.id,
230
+ content: result.success ? result.output : `Error: ${result.error}`
231
+ };
232
+
233
+ case 'openai':
234
+ return {
235
+ role: 'tool',
236
+ tool_call_id: result.id,
237
+ content: result.success ? result.output : `Error: ${result.error}`
238
+ };
239
+
240
+ case 'gemini':
241
+ return {
242
+ functionResponse: {
243
+ name: result.name,
244
+ response: { result: result.success ? result.output : result.error }
245
+ }
246
+ };
247
+
248
+ default:
249
+ throw new Error(`Unknown provider: ${provider}`);
250
+ }
251
+ }
252
+
253
+ // Health monitoring
254
+ private startHealthChecks(): void {
255
+ setInterval(async () => {
256
+ for (const [name, provider] of this.providers) {
257
+ try {
258
+ const start = Date.now();
259
+ await provider.complete({
260
+ messages: [{ role: 'user', content: 'ping' }],
261
+ maxTokens: 5
262
+ });
263
+ this.healthStatus.set(name, {
264
+ status: 'healthy',
265
+ latency: Date.now() - start,
266
+ lastCheck: new Date()
267
+ });
268
+ } catch (error) {
269
+ const current = this.healthStatus.get(name);
270
+ this.healthStatus.set(name, {
271
+ status: current?.status === 'degraded' ? 'unhealthy' : 'degraded',
272
+ error: error instanceof Error ? error.message : 'Unknown error',
273
+ lastCheck: new Date()
274
+ });
275
+ }
276
+ }
277
+ }, 60000); // Check every minute
278
+ }
279
+ }
280
+
281
+ export const providerManager = new ProviderManager();
282
+ ```
283
+
284
+ ### File Changes
285
+
286
+ | File | Action | Description |
287
+ |------|--------|-------------|
288
+ | `src/providers/types.ts` | Modify | Enhanced types |
289
+ | `src/providers/manager.ts` | Create | Provider management |
290
+ | `src/providers/selector.ts` | Create | Selection strategies |
291
+ | `src/providers/normalizer.ts` | Create | Format normalization |
292
+ | `src/providers/health.ts` | Create | Health monitoring |
293
+
294
+ ## User Experience
295
+
296
+ ### Provider Status
297
+ ```
298
+ User: /providers
299
+
300
+ Provider Status:
301
+ ┌────────────────────────────────────────────────────────────┐
302
+ │ Provider Status Latency Models Priority │
303
+ ├────────────────────────────────────────────────────────────┤
304
+ │ anthropic ● Healthy 120ms claude-* 1 │
305
+ │ openai ● Healthy 95ms gpt-4*, o1 2 │
306
+ │ gemini ○ Degraded 450ms gemini-* 3 │
307
+ └────────────────────────────────────────────────────────────┘
308
+
309
+ Active: anthropic (claude-sonnet-4)
310
+ Fallback: openai (gpt-4o)
311
+ ```
312
+
313
+ ### Automatic Fallback
314
+ ```
315
+ Agent: Attempting to connect to anthropic...
316
+ ⚠️ anthropic unavailable, falling back to openai
317
+
318
+ Using: openai/gpt-4o
319
+ ```
320
+
321
+ ### Cost-Optimized Selection
322
+ ```
323
+ User: /settings provider strategy cost_optimized
324
+
325
+ Provider strategy set to: Cost Optimized
326
+
327
+ For your typical usage:
328
+ • Small queries → gemini-2.0-flash ($0.0001/1K)
329
+ • Complex tasks → claude-sonnet ($0.003/1K)
330
+ • Vision tasks → gpt-4o ($0.005/1K)
331
+ ```
332
+
333
+ ### Model Comparison
334
+ ```
335
+ User: /compare-models "Explain async/await"
336
+
337
+ Model Comparison:
338
+ ┌────────────────────────────────────────────────────────────┐
339
+ │ Model Tokens Cost Latency Quality │
340
+ ├────────────────────────────────────────────────────────────┤
341
+ │ claude-opus-4-5 1,234 $0.093 2.3s ★★★★★ │
342
+ │ claude-sonnet-4 892 $0.027 1.1s ★★★★☆ │
343
+ │ gpt-4o 756 $0.019 0.9s ★★★★☆ │
344
+ │ gemini-2.0-flash 645 $0.002 0.4s ★★★☆☆ │
345
+ └────────────────────────────────────────────────────────────┘
346
+ ```
347
+
348
+ ## Security Considerations
349
+
350
+ 1. API key isolation per provider
351
+ 2. Secure credential storage
352
+ 3. No cross-provider data leakage
353
+ 4. Rate limit enforcement
354
+ 5. Audit logging per provider
355
+
356
+ ## Migration Path
357
+
358
+ 1. **Phase 1**: Unified tool calling
359
+ 2. **Phase 2**: Provider fallbacks
360
+ 3. **Phase 3**: Selection strategies
361
+ 4. **Phase 4**: Health monitoring
362
+ 5. **Phase 5**: Cost optimization
363
+
364
+ ## References
365
+
366
+ - [Anthropic API](https://docs.anthropic.com/claude/reference)
367
+ - [OpenAI API](https://platform.openai.com/docs/api-reference)
368
+ - [Google AI API](https://ai.google.dev/docs)
369
+ - [LiteLLM](https://github.com/BerriAI/litellm) - Multi-provider abstraction
@@ -0,0 +1,84 @@
1
+ # mycode Enhancement Proposals
2
+
3
+ This directory contains enhancement proposals for the mycode project. Each proposal describes a feature inspired by Claude Code that we plan to implement.
4
+
5
+ ## Proposal Process
6
+
7
+ 1. **Draft**: Initial proposal written and submitted
8
+ 2. **Under Review**: Community and maintainer review
9
+ 3. **Accepted**: Approved for implementation
10
+ 4. **Implemented**: Feature has been implemented
11
+ 5. **Rejected**: Proposal was rejected with explanation
12
+
13
+ ## Proposal Index
14
+
15
+ ### P1 Priority - Core Features
16
+
17
+ | ID | Title | Status |
18
+ |----|-------|--------|
19
+ | [0001](./0001-web-fetch-tool.md) | WebFetch Tool | Draft |
20
+ | [0002](./0002-web-search-tool.md) | WebSearch Tool | Draft |
21
+ | [0003](./0003-task-subagents.md) | Task Tool & Subagents | Draft |
22
+ | [0004](./0004-plan-mode.md) | Plan Mode | Draft |
23
+ | [0005](./0005-todo-system.md) | Todo System | Draft |
24
+ | [0006](./0006-memory-system.md) | Memory System (MYCODE.md) | Draft |
25
+ | [0007](./0007-context-management.md) | Context Management | Draft |
26
+ | [0008](./0008-checkpointing.md) | Checkpointing | Draft |
27
+ | [0009](./0009-hooks-system.md) | Hooks System | Draft |
28
+ | [0010](./0010-mcp-integration.md) | MCP Integration | Draft |
29
+ | [0011](./0011-custom-commands.md) | Custom Commands | Draft |
30
+ | [0012](./0012-ask-user-question.md) | AskUserQuestion Tool | Draft |
31
+
32
+ ### P2 Priority - Enhanced Features
33
+
34
+ | ID | Title | Status |
35
+ |----|-------|--------|
36
+ | [0013](./0013-multi-edit-tool.md) | MultiEdit Tool | Draft |
37
+ | [0014](./0014-lsp-tool.md) | LSP Tool | Draft |
38
+ | [0015](./0015-ls-tool.md) | LS Tool | Draft |
39
+ | [0016](./0016-kill-shell-tool.md) | KillShell Tool | Draft |
40
+ | [0017](./0017-background-tasks.md) | Background Tasks | Draft |
41
+ | [0018](./0018-parallel-tool-execution.md) | Parallel Tool Execution | Draft |
42
+ | [0019](./0019-session-enhancements.md) | Session Enhancements | Draft |
43
+ | [0020](./0020-session-summarization.md) | Session Summarization | Draft |
44
+ | [0021](./0021-skills-system.md) | Skills System | Draft |
45
+ | [0022](./0022-plugin-system.md) | Plugin System | Draft |
46
+ | [0023](./0023-permission-enhancements.md) | Permission Enhancements | Draft |
47
+ | [0024](./0024-keyboard-shortcuts.md) | Keyboard Shortcuts | Draft |
48
+ | [0025](./0025-cost-tracking.md) | Cost Tracking | Draft |
49
+ | [0026](./0026-git-integration.md) | Git Integration | Draft |
50
+ | [0027](./0027-enhanced-read-tool.md) | Enhanced Read Tool | Draft |
51
+ | [0028](./0028-enhanced-bash-tool.md) | Enhanced Bash Tool | Draft |
52
+
53
+ ### P3 Priority - Advanced Features
54
+
55
+ | ID | Title | Status |
56
+ |----|-------|--------|
57
+ | [0029](./0029-notebook-edit-tool.md) | NotebookEdit Tool | Draft |
58
+ | [0030](./0030-plugin-marketplace.md) | Plugin Marketplace | Draft |
59
+ | [0031](./0031-command-suggestions.md) | Command Suggestions | Draft |
60
+ | [0032](./0032-ide-integrations.md) | IDE Integrations | Draft |
61
+ | [0033](./0033-enterprise-deployment.md) | Enterprise Deployment | Draft |
62
+ | [0034](./0034-sandboxing.md) | Sandboxing | Draft |
63
+ | [0035](./0035-auto-updater.md) | Auto-updater | Draft |
64
+ | [0036](./0036-enhanced-glob-tool.md) | Enhanced Glob Tool | Draft |
65
+ | [0037](./0037-enhanced-grep-tool.md) | Enhanced Grep Tool | Draft |
66
+ | [0038](./0038-interactive-cli-ui.md) | Interactive CLI UI | Draft |
67
+ | [0039](./0039-streaming-enhancements.md) | Streaming Enhancements | Draft |
68
+ | [0040](./0040-multi-provider-enhancements.md) | Multi-Provider Enhancements | Draft |
69
+
70
+ ## Research
71
+
72
+ Background research on Claude Code's implementation is documented in [research/](./research/):
73
+
74
+ - [claude-code-research.md](./research/claude-code-research.md) - Comprehensive research on Claude Code's memory, context, and session systems
75
+
76
+ ## Writing a Proposal
77
+
78
+ Use [TEMPLATE.md](./TEMPLATE.md) as a starting point for new proposals.
79
+
80
+ ## References
81
+
82
+ - [Claude Code Official Docs](https://code.claude.com/docs/en/overview)
83
+ - [Claude Code GitHub](https://github.com/anthropics/claude-code)
84
+ - [Claude Code Best Practices](https://www.anthropic.com/engineering/claude-code-best-practices)
@@ -0,0 +1,57 @@
1
+ # Proposal: [Feature Name]
2
+
3
+ - **Proposal ID**: NNNN
4
+ - **Author**: [Name]
5
+ - **Status**: Draft | Under Review | Accepted | Implemented | Rejected
6
+ - **Created**: YYYY-MM-DD
7
+ - **Updated**: YYYY-MM-DD
8
+
9
+ ## Summary
10
+
11
+ [One paragraph describing the feature]
12
+
13
+ ## Motivation
14
+
15
+ [Why this feature is needed, what problems it solves]
16
+
17
+ ## Claude Code Reference
18
+
19
+ [How this feature works in Claude Code, with examples]
20
+
21
+ ## Detailed Design
22
+
23
+ ### API Design
24
+
25
+ [Interfaces, types, function signatures]
26
+
27
+ ### Implementation Approach
28
+
29
+ [Technical implementation details]
30
+
31
+ ### File Changes
32
+
33
+ [List of files to be created/modified]
34
+
35
+ ## User Experience
36
+
37
+ [How users will interact with this feature]
38
+
39
+ ## Alternatives Considered
40
+
41
+ [Other approaches that were considered]
42
+
43
+ ## Security Considerations
44
+
45
+ [Security implications if any]
46
+
47
+ ## Testing Strategy
48
+
49
+ [How to test this feature]
50
+
51
+ ## Migration Path
52
+
53
+ [How to migrate from current state]
54
+
55
+ ## References
56
+
57
+ [Links to Claude Code docs, related proposals, etc.]