@codemieai/code 0.0.2 → 0.0.3

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 (243) hide show
  1. package/CLAUDE.md +130 -760
  2. package/README.md +283 -695
  3. package/bin/codemie-claude.js +122 -0
  4. package/bin/codemie-code.js +90 -15
  5. package/bin/codemie-codex.js +138 -0
  6. package/bin/codemie.js +1 -1
  7. package/config.example.json +10 -0
  8. package/dist/agents/adapters/claude-code.d.ts +2 -2
  9. package/dist/agents/adapters/claude-code.d.ts.map +1 -1
  10. package/dist/agents/adapters/claude-code.js +20 -42
  11. package/dist/agents/adapters/claude-code.js.map +1 -1
  12. package/dist/agents/adapters/codemie-code.d.ts +11 -2
  13. package/dist/agents/adapters/codemie-code.d.ts.map +1 -1
  14. package/dist/agents/adapters/codemie-code.js +93 -25
  15. package/dist/agents/adapters/codemie-code.js.map +1 -1
  16. package/dist/agents/adapters/codex.d.ts +2 -2
  17. package/dist/agents/adapters/codex.d.ts.map +1 -1
  18. package/dist/agents/adapters/codex.js +31 -24
  19. package/dist/agents/adapters/codex.js.map +1 -1
  20. package/dist/agents/codemie-code/agent.d.ts +89 -0
  21. package/dist/agents/codemie-code/agent.d.ts.map +1 -0
  22. package/dist/agents/codemie-code/agent.js +523 -0
  23. package/dist/agents/codemie-code/agent.js.map +1 -0
  24. package/dist/agents/codemie-code/config.d.ts +40 -0
  25. package/dist/agents/codemie-code/config.d.ts.map +1 -0
  26. package/dist/agents/codemie-code/config.js +276 -0
  27. package/dist/agents/codemie-code/config.js.map +1 -0
  28. package/dist/agents/codemie-code/filters.d.ts +91 -0
  29. package/dist/agents/codemie-code/filters.d.ts.map +1 -0
  30. package/dist/agents/codemie-code/filters.js +328 -0
  31. package/dist/agents/codemie-code/filters.js.map +1 -0
  32. package/dist/agents/codemie-code/index.d.ts +78 -0
  33. package/dist/agents/codemie-code/index.d.ts.map +1 -0
  34. package/dist/agents/codemie-code/index.js +259 -0
  35. package/dist/agents/codemie-code/index.js.map +1 -0
  36. package/dist/agents/codemie-code/prompts.d.ts +11 -0
  37. package/dist/agents/codemie-code/prompts.d.ts.map +1 -0
  38. package/dist/agents/codemie-code/prompts.js +31 -0
  39. package/dist/agents/codemie-code/prompts.js.map +1 -0
  40. package/dist/agents/codemie-code/streaming/events.d.ts +7 -0
  41. package/dist/agents/codemie-code/streaming/events.d.ts.map +1 -0
  42. package/dist/agents/codemie-code/streaming/events.js +7 -0
  43. package/dist/agents/codemie-code/streaming/events.js.map +1 -0
  44. package/dist/agents/codemie-code/streaming/formatter.d.ts +2 -0
  45. package/dist/agents/codemie-code/streaming/formatter.d.ts.map +1 -0
  46. package/dist/agents/codemie-code/streaming/formatter.js +2 -0
  47. package/dist/agents/codemie-code/streaming/formatter.js.map +1 -0
  48. package/dist/agents/codemie-code/streaming/ui.d.ts +2 -0
  49. package/dist/agents/codemie-code/streaming/ui.d.ts.map +1 -0
  50. package/dist/agents/codemie-code/streaming/ui.js +2 -0
  51. package/dist/agents/codemie-code/streaming/ui.js.map +1 -0
  52. package/dist/agents/codemie-code/tokenUtils.d.ts +108 -0
  53. package/dist/agents/codemie-code/tokenUtils.d.ts.map +1 -0
  54. package/dist/agents/codemie-code/tokenUtils.js +220 -0
  55. package/dist/agents/codemie-code/tokenUtils.js.map +1 -0
  56. package/dist/agents/codemie-code/toolMetadata.d.ts +15 -0
  57. package/dist/agents/codemie-code/toolMetadata.d.ts.map +1 -0
  58. package/dist/agents/codemie-code/toolMetadata.js +315 -0
  59. package/dist/agents/codemie-code/toolMetadata.js.map +1 -0
  60. package/dist/agents/codemie-code/tools/command.d.ts +2 -0
  61. package/dist/agents/codemie-code/tools/command.d.ts.map +1 -0
  62. package/dist/agents/codemie-code/tools/command.js +2 -0
  63. package/dist/agents/codemie-code/tools/command.js.map +1 -0
  64. package/dist/agents/codemie-code/tools/filesystem.d.ts +2 -0
  65. package/dist/agents/codemie-code/tools/filesystem.d.ts.map +1 -0
  66. package/dist/agents/codemie-code/tools/filesystem.js +2 -0
  67. package/dist/agents/codemie-code/tools/filesystem.js.map +1 -0
  68. package/dist/agents/codemie-code/tools/git.d.ts +2 -0
  69. package/dist/agents/codemie-code/tools/git.d.ts.map +1 -0
  70. package/dist/agents/codemie-code/tools/git.js +2 -0
  71. package/dist/agents/codemie-code/tools/git.js.map +1 -0
  72. package/dist/agents/codemie-code/tools/index.d.ts +19 -0
  73. package/dist/agents/codemie-code/tools/index.d.ts.map +1 -0
  74. package/dist/agents/codemie-code/tools/index.js +239 -0
  75. package/dist/agents/codemie-code/tools/index.js.map +1 -0
  76. package/dist/agents/codemie-code/tools/security.d.ts +2 -0
  77. package/dist/agents/codemie-code/tools/security.d.ts.map +1 -0
  78. package/dist/agents/codemie-code/tools/security.js +2 -0
  79. package/dist/agents/codemie-code/tools/security.js.map +1 -0
  80. package/dist/agents/codemie-code/types.d.ts +254 -0
  81. package/dist/agents/codemie-code/types.d.ts.map +1 -0
  82. package/dist/agents/codemie-code/types.js +35 -0
  83. package/dist/agents/codemie-code/types.js.map +1 -0
  84. package/dist/agents/codemie-code/ui.d.ts +83 -0
  85. package/dist/agents/codemie-code/ui.d.ts.map +1 -0
  86. package/dist/agents/codemie-code/ui.js +624 -0
  87. package/dist/agents/codemie-code/ui.js.map +1 -0
  88. package/dist/agents/registry.d.ts +1 -1
  89. package/dist/agents/registry.d.ts.map +1 -1
  90. package/dist/agents/registry.js +7 -13
  91. package/dist/agents/registry.js.map +1 -1
  92. package/dist/cli/commands/config.d.ts +3 -0
  93. package/dist/cli/commands/config.d.ts.map +1 -0
  94. package/dist/cli/commands/config.js +323 -0
  95. package/dist/cli/commands/config.js.map +1 -0
  96. package/dist/cli/commands/doctor.d.ts.map +1 -1
  97. package/dist/cli/commands/doctor.js +113 -69
  98. package/dist/cli/commands/doctor.js.map +1 -1
  99. package/dist/cli/commands/env.d.ts +3 -0
  100. package/dist/cli/commands/env.d.ts.map +1 -0
  101. package/dist/cli/commands/env.js +19 -0
  102. package/dist/cli/commands/env.js.map +1 -0
  103. package/dist/cli/commands/install.js +27 -33
  104. package/dist/cli/commands/install.js.map +1 -1
  105. package/dist/cli/commands/list.js +18 -24
  106. package/dist/cli/commands/list.js.map +1 -1
  107. package/dist/cli/commands/run.d.ts.map +1 -1
  108. package/dist/cli/commands/run.js +291 -31
  109. package/dist/cli/commands/run.js.map +1 -1
  110. package/dist/cli/commands/setup.d.ts +3 -0
  111. package/dist/cli/commands/setup.d.ts.map +1 -0
  112. package/dist/cli/commands/setup.js +357 -0
  113. package/dist/cli/commands/setup.js.map +1 -0
  114. package/dist/cli/commands/uninstall.js +24 -30
  115. package/dist/cli/commands/uninstall.js.map +1 -1
  116. package/dist/cli/commands/version.d.ts.map +1 -1
  117. package/dist/cli/commands/version.js +11 -16
  118. package/dist/cli/commands/version.js.map +1 -1
  119. package/dist/cli/index.js +47 -31
  120. package/dist/cli/index.js.map +1 -1
  121. package/dist/env/manager.js +9 -46
  122. package/dist/env/manager.js.map +1 -1
  123. package/dist/index.d.ts +6 -13
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +6 -43
  126. package/dist/index.js.map +1 -1
  127. package/dist/utils/async-tips.d.ts.map +1 -1
  128. package/dist/utils/async-tips.js +16 -55
  129. package/dist/utils/async-tips.js.map +1 -1
  130. package/dist/utils/clipboard.d.ts +16 -0
  131. package/dist/utils/clipboard.d.ts.map +1 -0
  132. package/dist/utils/clipboard.js +179 -0
  133. package/dist/utils/clipboard.js.map +1 -0
  134. package/dist/utils/config-loader.d.ts +96 -0
  135. package/dist/utils/config-loader.d.ts.map +1 -0
  136. package/dist/utils/config-loader.js +351 -0
  137. package/dist/utils/config-loader.js.map +1 -0
  138. package/dist/utils/dirname.d.ts +7 -0
  139. package/dist/utils/dirname.d.ts.map +1 -0
  140. package/dist/utils/dirname.js +11 -0
  141. package/dist/utils/dirname.js.map +1 -0
  142. package/dist/utils/errors.js +7 -17
  143. package/dist/utils/errors.js.map +1 -1
  144. package/dist/utils/exec.js +3 -6
  145. package/dist/utils/exec.js.map +1 -1
  146. package/dist/utils/first-time.d.ts +34 -0
  147. package/dist/utils/first-time.d.ts.map +1 -0
  148. package/dist/utils/first-time.js +245 -0
  149. package/dist/utils/first-time.js.map +1 -0
  150. package/dist/utils/health-checker.d.ts +20 -0
  151. package/dist/utils/health-checker.d.ts.map +1 -0
  152. package/dist/utils/health-checker.js +168 -0
  153. package/dist/utils/health-checker.js.map +1 -0
  154. package/dist/utils/logger.js +12 -18
  155. package/dist/utils/logger.js.map +1 -1
  156. package/dist/utils/model-fetcher.d.ts +21 -0
  157. package/dist/utils/model-fetcher.d.ts.map +1 -0
  158. package/dist/utils/model-fetcher.js +137 -0
  159. package/dist/utils/model-fetcher.js.map +1 -0
  160. package/dist/utils/tips.d.ts.map +1 -1
  161. package/dist/utils/tips.js +13 -52
  162. package/dist/utils/tips.js.map +1 -1
  163. package/package.json +17 -23
  164. package/scripts/README.md +80 -0
  165. package/scripts/release.sh +156 -0
  166. package/dist/agents/adapters/aider.d.ts +0 -12
  167. package/dist/agents/adapters/aider.d.ts.map +0 -1
  168. package/dist/agents/adapters/aider.js +0 -80
  169. package/dist/agents/adapters/aider.js.map +0 -1
  170. package/dist/cli/cli.d.ts +0 -4
  171. package/dist/cli/cli.d.ts.map +0 -1
  172. package/dist/cli/cli.js +0 -107
  173. package/dist/cli/cli.js.map +0 -1
  174. package/dist/cli/commands/mcp.d.ts +0 -3
  175. package/dist/cli/commands/mcp.d.ts.map +0 -1
  176. package/dist/cli/commands/mcp.js +0 -459
  177. package/dist/cli/commands/mcp.js.map +0 -1
  178. package/dist/code/agent-events.d.ts +0 -39
  179. package/dist/code/agent-events.d.ts.map +0 -1
  180. package/dist/code/agent-events.js +0 -4
  181. package/dist/code/agent-events.js.map +0 -1
  182. package/dist/code/agent.d.ts +0 -19
  183. package/dist/code/agent.d.ts.map +0 -1
  184. package/dist/code/agent.js +0 -144
  185. package/dist/code/agent.js.map +0 -1
  186. package/dist/code/config.d.ts +0 -13
  187. package/dist/code/config.d.ts.map +0 -1
  188. package/dist/code/config.js +0 -41
  189. package/dist/code/config.js.map +0 -1
  190. package/dist/code/index.d.ts +0 -19
  191. package/dist/code/index.d.ts.map +0 -1
  192. package/dist/code/index.js +0 -400
  193. package/dist/code/index.js.map +0 -1
  194. package/dist/code/prompts.d.ts +0 -2
  195. package/dist/code/prompts.d.ts.map +0 -1
  196. package/dist/code/prompts.js +0 -45
  197. package/dist/code/prompts.js.map +0 -1
  198. package/dist/code/tools/command.d.ts +0 -8
  199. package/dist/code/tools/command.d.ts.map +0 -1
  200. package/dist/code/tools/command.js +0 -83
  201. package/dist/code/tools/command.js.map +0 -1
  202. package/dist/code/tools/diff-utils.d.ts +0 -2
  203. package/dist/code/tools/diff-utils.d.ts.map +0 -1
  204. package/dist/code/tools/diff-utils.js +0 -45
  205. package/dist/code/tools/diff-utils.js.map +0 -1
  206. package/dist/code/tools/filesystem.d.ts +0 -11
  207. package/dist/code/tools/filesystem.d.ts.map +0 -1
  208. package/dist/code/tools/filesystem.js +0 -442
  209. package/dist/code/tools/filesystem.js.map +0 -1
  210. package/dist/code/tools/git.d.ts +0 -7
  211. package/dist/code/tools/git.d.ts.map +0 -1
  212. package/dist/code/tools/git.js +0 -111
  213. package/dist/code/tools/git.js.map +0 -1
  214. package/dist/code/tools/mcp.d.ts +0 -13
  215. package/dist/code/tools/mcp.d.ts.map +0 -1
  216. package/dist/code/tools/mcp.js +0 -230
  217. package/dist/code/tools/mcp.js.map +0 -1
  218. package/dist/data/tips.json +0 -118
  219. package/dist/ui/terminal-ui.d.ts +0 -73
  220. package/dist/ui/terminal-ui.d.ts.map +0 -1
  221. package/dist/ui/terminal-ui.js +0 -900
  222. package/dist/ui/terminal-ui.js.map +0 -1
  223. package/dist/utils/env-mapper.d.ts +0 -40
  224. package/dist/utils/env-mapper.d.ts.map +0 -1
  225. package/dist/utils/env-mapper.js +0 -122
  226. package/dist/utils/env-mapper.js.map +0 -1
  227. package/docs/USER_GUIDE.md +0 -573
  228. package/tests/agent-direct.test.mjs +0 -45
  229. package/tests/agent-output.test.mjs +0 -64
  230. package/tests/codemie-code.test.mjs +0 -42
  231. package/tests/context7-only.test.mjs +0 -42
  232. package/tests/conversation-flow.test.mjs +0 -63
  233. package/tests/interactive-simulation.test.mjs +0 -60
  234. package/tests/live-output.test.mjs +0 -53
  235. package/tests/mcp-context7.test.mjs +0 -105
  236. package/tests/mcp-e2e.test.mjs +0 -109
  237. package/tests/mcp-time-server.test.mjs +0 -58
  238. package/tests/streaming.test.mjs +0 -57
  239. package/tests/test-helpers.mjs +0 -94
  240. package/tests/text-wrapping.test.mjs +0 -33
  241. package/tests/tool-count.test.mjs +0 -81
  242. package/tests/ui-format.test.mjs +0 -39
  243. package/tests/ui-state.test.mjs +0 -72
@@ -1,144 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeMieAgent = void 0;
4
- const openai_1 = require("@langchain/openai");
5
- const messages_1 = require("@langchain/core/messages");
6
- const prebuilt_1 = require("@langchain/langgraph/prebuilt");
7
- const prompts_js_1 = require("./prompts.js");
8
- const errors_js_1 = require("../utils/errors.js");
9
- class CodeMieAgent {
10
- model;
11
- tools;
12
- agent;
13
- conversationHistory = [];
14
- constructor(config, tools) {
15
- this.tools = tools;
16
- // Initialize AI model for OpenAI-compatible endpoints (LiteLLM proxy, etc.)
17
- this.model = new openai_1.ChatOpenAI({
18
- model: config.model,
19
- apiKey: config.authToken, // Changed from openAIApiKey to apiKey for LangChain 1.x
20
- configuration: {
21
- baseURL: config.baseUrl,
22
- },
23
- maxTokens: 4096,
24
- temperature: 0.7,
25
- maxRetries: 2,
26
- timeout: config.timeout * 1000
27
- });
28
- // Override the default invocation params to remove top_p
29
- // This prevents Bedrock errors about both temperature and top_p being set
30
- const originalInvocationParams = this.model.invocationParams.bind(this.model);
31
- this.model.invocationParams = function (options) {
32
- const params = originalInvocationParams(options);
33
- // Remove top_p if present to avoid Bedrock conflicts
34
- if ('top_p' in params) {
35
- delete params.top_p;
36
- }
37
- return params;
38
- };
39
- // Create LangGraph ReAct agent (matches Python implementation)
40
- this.agent = (0, prebuilt_1.createReactAgent)({
41
- llm: this.model,
42
- tools: this.tools,
43
- messageModifier: prompts_js_1.SYSTEM_PROMPT
44
- });
45
- }
46
- async chat(userMessage) {
47
- // Add user message to history
48
- this.conversationHistory.push(new messages_1.HumanMessage(userMessage));
49
- // Invoke agent with conversation history
50
- const result = await this.agent.invoke({ messages: this.conversationHistory }, { recursionLimit: 200 });
51
- // Extract final response from agent output
52
- const messages = result.messages || [];
53
- const lastMessage = messages[messages.length - 1];
54
- const response = lastMessage?.content || '';
55
- // Update conversation history with all messages from agent
56
- this.conversationHistory = messages;
57
- return response;
58
- }
59
- async chatStream(userMessage, onEvent, signal) {
60
- // Add user message to history
61
- this.conversationHistory.push(new messages_1.HumanMessage(userMessage));
62
- try {
63
- onEvent({ type: 'thinking_start' });
64
- // Stream agent execution
65
- const stream = await this.agent.stream({ messages: this.conversationHistory }, { streamMode: 'updates', recursionLimit: 200 });
66
- let currentContent = '';
67
- let allMessages = [];
68
- for await (const chunk of stream) {
69
- // Check if execution was cancelled
70
- if (signal?.aborted) {
71
- onEvent({ type: 'cancelled' });
72
- throw new Error('Execution cancelled by user');
73
- }
74
- // LangGraph streams updates by node
75
- // 'agent' node = model thinking/responding
76
- // 'tools' node = tool execution
77
- if (chunk.agent) {
78
- // Agent node update
79
- const messages = chunk.agent.messages || [];
80
- for (const msg of messages) {
81
- if (msg.content && typeof msg.content === 'string') {
82
- // Stream content chunk
83
- const newContent = msg.content.slice(currentContent.length);
84
- if (newContent) {
85
- currentContent = msg.content;
86
- onEvent({ type: 'content_chunk', content: newContent });
87
- }
88
- }
89
- // Check for tool calls
90
- if (msg.tool_calls && msg.tool_calls.length > 0) {
91
- for (const toolCall of msg.tool_calls) {
92
- onEvent({
93
- type: 'tool_call_start',
94
- toolName: toolCall.name,
95
- toolArgs: toolCall.args
96
- });
97
- }
98
- }
99
- allMessages.push(msg);
100
- }
101
- }
102
- if (chunk.tools) {
103
- // Tool execution results
104
- const messages = chunk.tools.messages || [];
105
- for (const msg of messages) {
106
- // Tool message contains the result
107
- if (msg.content) {
108
- const toolName = msg.name || 'unknown';
109
- onEvent({
110
- type: 'tool_call_result',
111
- toolName: toolName,
112
- result: msg.content
113
- });
114
- }
115
- allMessages.push(msg);
116
- }
117
- }
118
- }
119
- onEvent({ type: 'thinking_end' });
120
- // Update conversation history
121
- this.conversationHistory = allMessages.length > 0 ? allMessages : this.conversationHistory;
122
- onEvent({ type: 'complete' });
123
- }
124
- catch (error) {
125
- // Don't emit error event for cancellations - already handled by 'cancelled' event
126
- const errorMsg = (0, errors_js_1.getErrorMessage)(error);
127
- if (errorMsg !== 'Execution cancelled by user') {
128
- onEvent({ type: 'error', error: errorMsg });
129
- }
130
- throw error; // Re-throw original error without wrapping
131
- }
132
- }
133
- clearHistory() {
134
- this.conversationHistory = [];
135
- }
136
- getHistory() {
137
- return this.conversationHistory.map(msg => ({
138
- role: msg._getType() === 'human' ? 'user' : 'assistant',
139
- content: msg.content
140
- }));
141
- }
142
- }
143
- exports.CodeMieAgent = CodeMieAgent;
144
- //# sourceMappingURL=agent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/code/agent.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { ModelProvider } from '../utils/env-mapper.js';
2
- export interface CodeMieConfig {
3
- baseUrl: string;
4
- authToken: string;
5
- model: string;
6
- timeout: number;
7
- provider: ModelProvider;
8
- debug: boolean;
9
- mcpServers?: string[];
10
- workingDirectory: string;
11
- }
12
- export declare function loadConfig(workingDir?: string): CodeMieConfig;
13
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/code/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAIrF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAiC7D"}
@@ -1,41 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.loadConfig = loadConfig;
7
- const dotenv_1 = __importDefault(require("dotenv"));
8
- const errors_js_1 = require("../utils/errors.js");
9
- const env_mapper_js_1 = require("../utils/env-mapper.js");
10
- dotenv_1.default.config();
11
- function loadConfig(workingDir) {
12
- // Load AI configuration from environment variables
13
- // Priority: CODEMIE_* (generic) > ANTHROPIC_*/OPENAI_* (provider-specific)
14
- let aiConfig;
15
- try {
16
- aiConfig = (0, env_mapper_js_1.loadAIConfig)();
17
- }
18
- catch (error) {
19
- throw new errors_js_1.ConfigurationError((0, errors_js_1.getErrorMessage)(error));
20
- }
21
- // Detect provider from model
22
- const provider = (0, env_mapper_js_1.detectProvider)(aiConfig.model);
23
- // Debug mode
24
- const debug = process.env.CODEMIE_DEBUG === 'true';
25
- // MCP configuration
26
- const mcpServersEnv = process.env.CODEMIE_MCP_SERVERS;
27
- const mcpServers = mcpServersEnv ? mcpServersEnv.split(',').map(s => s.trim()) : undefined;
28
- // Working directory
29
- const workingDirectory = workingDir || process.cwd();
30
- return {
31
- baseUrl: aiConfig.baseUrl,
32
- authToken: aiConfig.authToken,
33
- model: aiConfig.model,
34
- timeout: aiConfig.timeout || 300,
35
- provider,
36
- debug,
37
- mcpServers,
38
- workingDirectory
39
- };
40
- }
41
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/code/config.ts"],"names":[],"mappings":";;;;;AAiBA,gCAiCC;AAlDD,oDAA4B;AAC5B,kDAAyE;AACzE,0DAAqF;AAErF,gBAAM,CAAC,MAAM,EAAE,CAAC;AAahB,SAAgB,UAAU,CAAC,UAAmB;IAC5C,mDAAmD;IACnD,2EAA2E;IAC3E,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,IAAA,4BAAY,GAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,IAAI,8BAAkB,CAAC,IAAA,2BAAe,EAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,IAAA,8BAAc,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,aAAa;IACb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,CAAC;IAEnD,oBAAoB;IACpB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACtD,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3F,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,GAAG;QAChC,QAAQ;QACR,KAAK;QACL,UAAU;QACV,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
@@ -1,19 +0,0 @@
1
- export declare class CodeMieCode {
2
- private agent;
3
- private config;
4
- private mcpTools;
5
- constructor(workingDir?: string);
6
- initialize(options?: {
7
- showTips?: boolean;
8
- }): Promise<void>;
9
- private performInitialization;
10
- startInteractive(): Promise<void>;
11
- private handleSlashCommand;
12
- private loadTips;
13
- chat(message: string): Promise<string>;
14
- executeNonInteractive(task: string): Promise<void>;
15
- private executeSlashCommand;
16
- dispose(): Promise<void>;
17
- static testConnection(): Promise<void>;
18
- }
19
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/code/index.ts"],"names":[],"mappings":"AAgBA,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,UAAU,CAAC,EAAE,MAAM;IAQzB,UAAU,CAAC,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAkBvD,qBAAqB;IA4C7B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;YAqEzB,kBAAkB;IA8BhC,OAAO,CAAC,QAAQ;IAaV,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YA2J1C,mBAAmB;IAe3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;WAMjB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAe7C"}
@@ -1,400 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.CodeMieCode = void 0;
40
- const filesystem_js_1 = require("./tools/filesystem.js");
41
- const command_js_1 = require("./tools/command.js");
42
- const git_js_1 = require("./tools/git.js");
43
- const mcp_js_1 = require("./tools/mcp.js");
44
- const agent_js_1 = require("./agent.js");
45
- const config_js_1 = require("./config.js");
46
- const logger_js_1 = require("../utils/logger.js");
47
- const async_tips_js_1 = require("../utils/async-tips.js");
48
- const terminal_ui_js_1 = require("../ui/terminal-ui.js");
49
- const errors_js_1 = require("../utils/errors.js");
50
- const chalk_1 = __importDefault(require("chalk"));
51
- const fs = __importStar(require("fs"));
52
- const path = __importStar(require("path"));
53
- const child_process_1 = require("child_process");
54
- class CodeMieCode {
55
- agent = null;
56
- config;
57
- mcpTools = null;
58
- constructor(workingDir) {
59
- this.config = (0, config_js_1.loadConfig)(workingDir);
60
- if (this.config.debug) {
61
- logger_js_1.logger.setDebugEnabled(true);
62
- }
63
- }
64
- async initialize(options = {}) {
65
- const { showTips = true } = options;
66
- logger_js_1.logger.info('Initializing CodeMie Code...');
67
- // Show tips during initialization only if requested
68
- const initPromise = this.performInitialization();
69
- if (showTips) {
70
- async_tips_js_1.asyncTipDisplay.showDuring(initPromise);
71
- }
72
- await initPromise;
73
- logger_js_1.logger.success('CodeMie Code initialized');
74
- logger_js_1.logger.info(`Working directory: ${this.config.workingDirectory}`);
75
- logger_js_1.logger.info(`Model: ${this.config.model} (${this.config.provider})`);
76
- }
77
- async performInitialization() {
78
- // Collect all tools
79
- const tools = [];
80
- // Filesystem tools
81
- const filesystemTools = new filesystem_js_1.FilesystemTools({
82
- allowedDirectories: [this.config.workingDirectory]
83
- });
84
- tools.push(...filesystemTools.getTools());
85
- logger_js_1.logger.debug(`Added ${filesystemTools.getTools().length} filesystem tools`);
86
- // Command tools
87
- const commandTools = new command_js_1.CommandTools({
88
- allowedDirectories: [this.config.workingDirectory]
89
- });
90
- tools.push(...commandTools.getTools());
91
- logger_js_1.logger.debug(`Added ${commandTools.getTools().length} command tools`);
92
- // Git tools
93
- const gitTools = new git_js_1.GitTools(this.config.workingDirectory);
94
- tools.push(...gitTools.getTools());
95
- logger_js_1.logger.debug(`Added ${gitTools.getTools().length} git tools`);
96
- // MCP tools - always try to initialize to check for configured servers
97
- // If mcpServers is undefined, MCPTools will load all available servers from config
98
- // If mcpServers is an empty array, no servers will be loaded
99
- // If mcpServers has values, only those specific servers will be loaded
100
- try {
101
- this.mcpTools = new mcp_js_1.MCPTools(this.config.workingDirectory);
102
- await this.mcpTools.initialize(this.config.mcpServers);
103
- const mcpToolsList = await this.mcpTools.getTools();
104
- if (mcpToolsList.length > 0) {
105
- tools.push(...mcpToolsList);
106
- logger_js_1.logger.info(`Added ${mcpToolsList.length} MCP tools`);
107
- }
108
- }
109
- catch (error) {
110
- logger_js_1.logger.warn(`Failed to initialize MCP tools: ${(0, errors_js_1.getErrorMessage)(error)}`);
111
- }
112
- // Create agent
113
- this.agent = new agent_js_1.CodeMieAgent(this.config, tools);
114
- logger_js_1.logger.info(`Total tools: ${tools.length}`);
115
- }
116
- async startInteractive() {
117
- if (!this.agent) {
118
- throw new Error('Agent not initialized. Call initialize() first.');
119
- }
120
- // Load tips from file
121
- const tips = this.loadTips();
122
- // Create terminal UI
123
- const ui = new terminal_ui_js_1.TerminalUI({
124
- onSubmit: async (message) => {
125
- try {
126
- const response = await this.agent.chat(message);
127
- ui.showAssistantResponse(response);
128
- }
129
- catch (error) {
130
- logger_js_1.logger.error('Error during conversation:', error);
131
- ui.showError((0, errors_js_1.getErrorMessage)(error));
132
- }
133
- },
134
- onSubmitStream: async (message, onEvent, abortSignal) => {
135
- try {
136
- await this.agent.chatStream(message, onEvent, abortSignal);
137
- }
138
- catch (error) {
139
- // Check if error is from cancellation
140
- const errorMsg = (0, errors_js_1.getErrorMessage)(error);
141
- if (errorMsg === 'Execution cancelled by user') {
142
- // Cancellation is already handled via event, no need to log as error
143
- return;
144
- }
145
- logger_js_1.logger.error('Error during streaming conversation:', error);
146
- onEvent({ type: 'error', error: errorMsg });
147
- }
148
- },
149
- onSlashCommand: async (command, args) => {
150
- return this.handleSlashCommand(command, args);
151
- },
152
- onClear: () => {
153
- // Clear the agent's conversation history
154
- this.agent.clearHistory();
155
- },
156
- onExit: async () => {
157
- // Suppress stderr during cleanup to avoid terminfo errors
158
- const originalStderr = process.stderr.write;
159
- process.stderr.write = () => true;
160
- try {
161
- await this.dispose();
162
- }
163
- finally {
164
- // Restore stderr
165
- process.stderr.write = originalStderr;
166
- }
167
- process.exit(0);
168
- },
169
- workingDirectory: this.config.workingDirectory,
170
- model: this.config.model,
171
- provider: this.config.provider
172
- });
173
- // Set tips for rotation
174
- ui.setTips(tips);
175
- // Keep the process running
176
- return new Promise(() => {
177
- // This promise never resolves, keeping the UI active
178
- // The UI will handle exit via onExit callback
179
- });
180
- }
181
- async handleSlashCommand(command, args) {
182
- try {
183
- // Build the codemie command
184
- const fullCommand = `codemie ${command} ${args.join(' ')}`;
185
- // Execute the command synchronously and capture output
186
- const output = (0, child_process_1.execSync)(fullCommand, {
187
- cwd: this.config.workingDirectory,
188
- encoding: 'utf-8',
189
- maxBuffer: 10 * 1024 * 1024, // 10MB buffer
190
- stdio: ['pipe', 'pipe', 'pipe'],
191
- env: {
192
- ...process.env,
193
- CODEMIE_IN_ASSISTANT: 'true' // Flag to suppress tips in assistant context
194
- }
195
- });
196
- return output;
197
- }
198
- catch (error) {
199
- // If command fails, return the error output (stderr contains the actual error message)
200
- if (error && typeof error === 'object' && ('stderr' in error || 'stdout' in error)) {
201
- const stderr = ('stderr' in error && typeof error.stderr === 'string' ? error.stderr : '').trim();
202
- const stdout = ('stdout' in error && typeof error.stdout === 'string' ? error.stdout : '').trim();
203
- const combined = [stdout, stderr].filter(Boolean).join('\n');
204
- throw new Error(combined || (0, errors_js_1.getErrorMessage)(error));
205
- }
206
- throw new Error(`Command failed: ${(0, errors_js_1.getErrorMessage)(error)}`);
207
- }
208
- }
209
- loadTips() {
210
- try {
211
- const tipsPath = path.join(__dirname, '../data/tips.json');
212
- const tipsData = fs.readFileSync(tipsPath, 'utf-8');
213
- return JSON.parse(tipsData);
214
- }
215
- catch {
216
- return [
217
- { message: 'Run codemie list to see available agents', command: 'codemie list' },
218
- { message: 'Use codemie doctor to check your setup', command: 'codemie doctor' }
219
- ];
220
- }
221
- }
222
- async chat(message) {
223
- if (!this.agent) {
224
- throw new Error('Agent not initialized. Call initialize() first.');
225
- }
226
- return await this.agent.chat(message);
227
- }
228
- async executeNonInteractive(task) {
229
- if (!this.agent) {
230
- throw new Error('Agent not initialized. Call initialize() first.');
231
- }
232
- // Check if task is a slash command (proxy command)
233
- if (task.startsWith('/')) {
234
- const parts = task.slice(1).split(/\s+/);
235
- const command = parts[0];
236
- const args = parts.slice(1);
237
- console.log(chalk_1.default.yellow(`Executing command: /${command} ${args.join(' ')}`));
238
- console.log();
239
- try {
240
- const result = await this.executeSlashCommand(command, args);
241
- console.log(result);
242
- process.exit(0);
243
- }
244
- catch (error) {
245
- console.error(chalk_1.default.red('Error:'), (0, errors_js_1.getErrorMessage)(error));
246
- process.exit(1);
247
- }
248
- return;
249
- }
250
- // Execute as agent task with streaming output
251
- console.log(chalk_1.default.cyan('Task:'), task);
252
- console.log();
253
- let hasOutput = false;
254
- let hasError = false;
255
- let isThinking = false;
256
- // Create AbortController for cancellation (Ctrl+C in non-interactive mode)
257
- const abortController = new AbortController();
258
- const abortHandler = () => {
259
- console.log(chalk_1.default.yellow('\nCancelling execution...'));
260
- abortController.abort();
261
- };
262
- process.once('SIGINT', abortHandler);
263
- try {
264
- await this.agent.chatStream(task, (event) => {
265
- switch (event.type) {
266
- case 'thinking_start':
267
- if (!isThinking) {
268
- process.stderr.write(chalk_1.default.gray('(thinking...)'));
269
- isThinking = true;
270
- }
271
- break;
272
- case 'thinking_end':
273
- // Clear the thinking line
274
- if (isThinking) {
275
- process.stderr.write('\r\x1b[K'); // Clear line
276
- isThinking = false;
277
- }
278
- break;
279
- case 'content_chunk':
280
- // Clear thinking indicator if still showing
281
- if (isThinking) {
282
- process.stderr.write('\r\x1b[K');
283
- isThinking = false;
284
- }
285
- if (!hasOutput) {
286
- hasOutput = true;
287
- }
288
- process.stdout.write(event.content);
289
- break;
290
- case 'tool_call_start':
291
- // Clear thinking indicator if still showing
292
- if (isThinking) {
293
- process.stderr.write('\r\x1b[K');
294
- isThinking = false;
295
- }
296
- console.log();
297
- console.log(chalk_1.default.green('⏺'), chalk_1.default.white(`${event.toolName}(${Object.values(event.toolArgs || {}).join(', ')})`));
298
- break;
299
- case 'tool_call_result': {
300
- // Truncate long results
301
- const lines = event.result?.split('\n') || [];
302
- const maxLines = 5;
303
- const displayLines = lines.slice(0, maxLines);
304
- console.log(chalk_1.default.gray(' ⎿'), displayLines[0] || '');
305
- for (let i = 1; i < displayLines.length; i++) {
306
- console.log(' ', displayLines[i]);
307
- }
308
- if (lines.length > maxLines) {
309
- console.log(chalk_1.default.gray(` … +${lines.length - maxLines} lines`));
310
- }
311
- console.log();
312
- break;
313
- }
314
- case 'tool_call_error':
315
- console.log(chalk_1.default.red('⏺ Error:'), event.error);
316
- console.log();
317
- break;
318
- case 'complete':
319
- // Clear thinking indicator if still showing
320
- if (isThinking) {
321
- process.stderr.write('\r\x1b[K');
322
- isThinking = false;
323
- }
324
- if (hasOutput) {
325
- console.log(); // Add newline after final output
326
- }
327
- break;
328
- case 'error':
329
- hasError = true;
330
- // Clear thinking indicator if still showing
331
- if (isThinking) {
332
- process.stderr.write('\r\x1b[K');
333
- isThinking = false;
334
- }
335
- console.error(chalk_1.default.red('Error:'), event.error);
336
- break;
337
- case 'cancelled':
338
- // Clear thinking indicator if still showing
339
- if (isThinking) {
340
- process.stderr.write('\r\x1b[K');
341
- isThinking = false;
342
- }
343
- console.log();
344
- console.log(chalk_1.default.yellow('Execution cancelled.'));
345
- break;
346
- }
347
- }, abortController.signal);
348
- process.removeListener('SIGINT', abortHandler);
349
- process.exit(hasError ? 1 : 0);
350
- }
351
- catch (error) {
352
- process.removeListener('SIGINT', abortHandler);
353
- // Clear thinking indicator if still showing
354
- if (isThinking) {
355
- process.stderr.write('\r\x1b[K');
356
- }
357
- // Check if error is from cancellation
358
- const errorMsg = (0, errors_js_1.getErrorMessage)(error);
359
- if (errorMsg === 'Execution cancelled by user') {
360
- process.exit(130); // Standard exit code for SIGINT
361
- }
362
- console.error(chalk_1.default.red('Error:'), errorMsg);
363
- process.exit(1);
364
- }
365
- }
366
- async executeSlashCommand(command, args) {
367
- // Build the codemie command
368
- const fullCommand = `codemie ${command} ${args.join(' ')}`;
369
- // Execute the command synchronously and capture output
370
- const output = (0, child_process_1.execSync)(fullCommand, {
371
- cwd: this.config.workingDirectory,
372
- encoding: 'utf-8',
373
- maxBuffer: 10 * 1024 * 1024, // 10MB buffer
374
- stdio: ['pipe', 'pipe', 'pipe']
375
- });
376
- return output;
377
- }
378
- async dispose() {
379
- if (this.mcpTools) {
380
- await this.mcpTools.dispose();
381
- }
382
- }
383
- static async testConnection() {
384
- try {
385
- const config = (0, config_js_1.loadConfig)();
386
- logger_js_1.logger.info(`Testing ${config.provider} connection...`);
387
- logger_js_1.logger.info(`Base URL: ${config.baseUrl}`);
388
- logger_js_1.logger.info(`Model: ${config.model}`);
389
- // Simple test to verify credentials
390
- const _testAgent = new agent_js_1.CodeMieAgent(config, []);
391
- logger_js_1.logger.success('Connection test successful!');
392
- }
393
- catch (error) {
394
- logger_js_1.logger.error('Connection test failed:', error);
395
- throw error;
396
- }
397
- }
398
- }
399
- exports.CodeMieCode = CodeMieCode;
400
- //# sourceMappingURL=index.js.map