xibecode 1.0.2 → 1.0.6

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 (288) hide show
  1. package/dist/commands/chat.d.ts +0 -1
  2. package/dist/commands/chat.d.ts.map +1 -1
  3. package/dist/commands/chat.js +10 -7
  4. package/dist/commands/chat.js.map +1 -1
  5. package/dist/commands/config.d.ts.map +1 -1
  6. package/dist/commands/config.js +5 -3
  7. package/dist/commands/config.js.map +1 -1
  8. package/dist/commands/diagnostics.js +1 -1
  9. package/dist/commands/diagnostics.js.map +1 -1
  10. package/dist/commands/mcp.js +1 -1
  11. package/dist/commands/mcp.js.map +1 -1
  12. package/dist/commands/resume.js +1 -1
  13. package/dist/commands/resume.js.map +1 -1
  14. package/dist/commands/run-pr.d.ts.map +1 -1
  15. package/dist/commands/run-pr.js +13 -10
  16. package/dist/commands/run-pr.js.map +1 -1
  17. package/dist/commands/run.d.ts.map +1 -1
  18. package/dist/commands/run.js +17 -14
  19. package/dist/commands/run.js.map +1 -1
  20. package/dist/commands/skills.d.ts.map +1 -1
  21. package/dist/commands/skills.js +3 -2
  22. package/dist/commands/skills.js.map +1 -1
  23. package/dist/components/AssistantMarkdown.js +1 -1
  24. package/dist/components/AssistantMarkdown.js.map +1 -1
  25. package/dist/index.js +2 -39
  26. package/dist/index.js.map +1 -1
  27. package/dist/ui/claude-style-chat.d.ts.map +1 -1
  28. package/dist/ui/claude-style-chat.js +15 -11
  29. package/dist/ui/claude-style-chat.js.map +1 -1
  30. package/dist/utils/built-in-skills-dir.d.ts +7 -0
  31. package/dist/utils/built-in-skills-dir.d.ts.map +1 -0
  32. package/dist/utils/built-in-skills-dir.js +11 -0
  33. package/dist/utils/built-in-skills-dir.js.map +1 -0
  34. package/dist/utils/config.d.ts +2 -119
  35. package/dist/utils/config.d.ts.map +1 -1
  36. package/dist/utils/config.js +3 -88
  37. package/dist/utils/config.js.map +1 -1
  38. package/package.json +11 -26
  39. package/dist/commands/punycode.d.ts +0 -5
  40. package/dist/commands/punycode.d.ts.map +0 -1
  41. package/dist/commands/punycode.js +0 -48
  42. package/dist/commands/punycode.js.map +0 -1
  43. package/dist/commands/tui.d.ts +0 -9
  44. package/dist/commands/tui.d.ts.map +0 -1
  45. package/dist/commands/tui.js +0 -83
  46. package/dist/commands/tui.js.map +0 -1
  47. package/dist/core/agent-tool-policies.d.ts +0 -5
  48. package/dist/core/agent-tool-policies.d.ts.map +0 -1
  49. package/dist/core/agent-tool-policies.js +0 -18
  50. package/dist/core/agent-tool-policies.js.map +0 -1
  51. package/dist/core/agent.d.ts +0 -181
  52. package/dist/core/agent.d.ts.map +0 -1
  53. package/dist/core/agent.js +0 -1777
  54. package/dist/core/agent.js.map +0 -1
  55. package/dist/core/background-agent.d.ts +0 -23
  56. package/dist/core/background-agent.d.ts.map +0 -1
  57. package/dist/core/background-agent.js +0 -175
  58. package/dist/core/background-agent.js.map +0 -1
  59. package/dist/core/code-graph.d.ts +0 -18
  60. package/dist/core/code-graph.d.ts.map +0 -1
  61. package/dist/core/code-graph.js +0 -105
  62. package/dist/core/code-graph.js.map +0 -1
  63. package/dist/core/conflict-solver.d.ts +0 -26
  64. package/dist/core/conflict-solver.d.ts.map +0 -1
  65. package/dist/core/conflict-solver.js +0 -108
  66. package/dist/core/conflict-solver.js.map +0 -1
  67. package/dist/core/context-compactor.d.ts +0 -10
  68. package/dist/core/context-compactor.d.ts.map +0 -1
  69. package/dist/core/context-compactor.js +0 -158
  70. package/dist/core/context-compactor.js.map +0 -1
  71. package/dist/core/context-pruner.d.ts +0 -19
  72. package/dist/core/context-pruner.d.ts.map +0 -1
  73. package/dist/core/context-pruner.js +0 -103
  74. package/dist/core/context-pruner.js.map +0 -1
  75. package/dist/core/context.d.ts +0 -82
  76. package/dist/core/context.d.ts.map +0 -1
  77. package/dist/core/context.js +0 -273
  78. package/dist/core/context.js.map +0 -1
  79. package/dist/core/conversation-recovery.d.ts +0 -9
  80. package/dist/core/conversation-recovery.d.ts.map +0 -1
  81. package/dist/core/conversation-recovery.js +0 -15
  82. package/dist/core/conversation-recovery.js.map +0 -1
  83. package/dist/core/debug-workflow.d.ts +0 -9
  84. package/dist/core/debug-workflow.d.ts.map +0 -1
  85. package/dist/core/debug-workflow.js +0 -19
  86. package/dist/core/debug-workflow.js.map +0 -1
  87. package/dist/core/docs-scraper.d.ts +0 -40
  88. package/dist/core/docs-scraper.d.ts.map +0 -1
  89. package/dist/core/docs-scraper.js +0 -386
  90. package/dist/core/docs-scraper.js.map +0 -1
  91. package/dist/core/editor.d.ts +0 -87
  92. package/dist/core/editor.d.ts.map +0 -1
  93. package/dist/core/editor.js +0 -377
  94. package/dist/core/editor.js.map +0 -1
  95. package/dist/core/export.d.ts +0 -11
  96. package/dist/core/export.d.ts.map +0 -1
  97. package/dist/core/export.js +0 -54
  98. package/dist/core/export.js.map +0 -1
  99. package/dist/core/history-manager.d.ts +0 -75
  100. package/dist/core/history-manager.d.ts.map +0 -1
  101. package/dist/core/history-manager.js +0 -146
  102. package/dist/core/history-manager.js.map +0 -1
  103. package/dist/core/marketplace-client.d.ts +0 -52
  104. package/dist/core/marketplace-client.d.ts.map +0 -1
  105. package/dist/core/marketplace-client.js +0 -71
  106. package/dist/core/marketplace-client.js.map +0 -1
  107. package/dist/core/mcp/mcp-config.d.ts +0 -10
  108. package/dist/core/mcp/mcp-config.d.ts.map +0 -1
  109. package/dist/core/mcp/mcp-config.js +0 -70
  110. package/dist/core/mcp/mcp-config.js.map +0 -1
  111. package/dist/core/mcp/mcp-policy.d.ts +0 -17
  112. package/dist/core/mcp/mcp-policy.d.ts.map +0 -1
  113. package/dist/core/mcp/mcp-policy.js +0 -56
  114. package/dist/core/mcp/mcp-policy.js.map +0 -1
  115. package/dist/core/mcp/oauth-flow.d.ts +0 -30
  116. package/dist/core/mcp/oauth-flow.d.ts.map +0 -1
  117. package/dist/core/mcp/oauth-flow.js +0 -230
  118. package/dist/core/mcp/oauth-flow.js.map +0 -1
  119. package/dist/core/mcp/oauth-store.d.ts +0 -13
  120. package/dist/core/mcp/oauth-store.d.ts.map +0 -1
  121. package/dist/core/mcp/oauth-store.js +0 -68
  122. package/dist/core/mcp/oauth-store.js.map +0 -1
  123. package/dist/core/mcp/resolve-mcp-servers.d.ts +0 -16
  124. package/dist/core/mcp/resolve-mcp-servers.d.ts.map +0 -1
  125. package/dist/core/mcp/resolve-mcp-servers.js +0 -83
  126. package/dist/core/mcp/resolve-mcp-servers.js.map +0 -1
  127. package/dist/core/mcp-client.d.ts +0 -99
  128. package/dist/core/mcp-client.d.ts.map +0 -1
  129. package/dist/core/mcp-client.js +0 -315
  130. package/dist/core/mcp-client.js.map +0 -1
  131. package/dist/core/memory-promotions.d.ts +0 -15
  132. package/dist/core/memory-promotions.d.ts.map +0 -1
  133. package/dist/core/memory-promotions.js +0 -38
  134. package/dist/core/memory-promotions.js.map +0 -1
  135. package/dist/core/memory.d.ts +0 -32
  136. package/dist/core/memory.d.ts.map +0 -1
  137. package/dist/core/memory.js +0 -121
  138. package/dist/core/memory.js.map +0 -1
  139. package/dist/core/modes.d.ts +0 -432
  140. package/dist/core/modes.d.ts.map +0 -1
  141. package/dist/core/modes.js +0 -1088
  142. package/dist/core/modes.js.map +0 -1
  143. package/dist/core/pattern-miner.d.ts +0 -43
  144. package/dist/core/pattern-miner.d.ts.map +0 -1
  145. package/dist/core/pattern-miner.js +0 -123
  146. package/dist/core/pattern-miner.js.map +0 -1
  147. package/dist/core/permission-store.d.ts +0 -15
  148. package/dist/core/permission-store.d.ts.map +0 -1
  149. package/dist/core/permission-store.js +0 -30
  150. package/dist/core/permission-store.js.map +0 -1
  151. package/dist/core/permissions.d.ts +0 -33
  152. package/dist/core/permissions.d.ts.map +0 -1
  153. package/dist/core/permissions.js +0 -141
  154. package/dist/core/permissions.js.map +0 -1
  155. package/dist/core/plan-artifacts.d.ts +0 -10
  156. package/dist/core/plan-artifacts.d.ts.map +0 -1
  157. package/dist/core/plan-artifacts.js +0 -60
  158. package/dist/core/plan-artifacts.js.map +0 -1
  159. package/dist/core/plan-session.d.ts +0 -25
  160. package/dist/core/plan-session.d.ts.map +0 -1
  161. package/dist/core/plan-session.js +0 -99
  162. package/dist/core/plan-session.js.map +0 -1
  163. package/dist/core/planMode.d.ts +0 -51
  164. package/dist/core/planMode.d.ts.map +0 -1
  165. package/dist/core/planMode.js +0 -245
  166. package/dist/core/planMode.js.map +0 -1
  167. package/dist/core/plugins.d.ts +0 -96
  168. package/dist/core/plugins.d.ts.map +0 -1
  169. package/dist/core/plugins.js +0 -202
  170. package/dist/core/plugins.js.map +0 -1
  171. package/dist/core/session-bridge.d.ts +0 -128
  172. package/dist/core/session-bridge.d.ts.map +0 -1
  173. package/dist/core/session-bridge.js +0 -328
  174. package/dist/core/session-bridge.js.map +0 -1
  175. package/dist/core/session-manager.d.ts +0 -80
  176. package/dist/core/session-manager.d.ts.map +0 -1
  177. package/dist/core/session-manager.js +0 -166
  178. package/dist/core/session-manager.js.map +0 -1
  179. package/dist/core/session-memory.d.ts +0 -45
  180. package/dist/core/session-memory.d.ts.map +0 -1
  181. package/dist/core/session-memory.js +0 -103
  182. package/dist/core/session-memory.js.map +0 -1
  183. package/dist/core/skill-selection.d.ts +0 -36
  184. package/dist/core/skill-selection.d.ts.map +0 -1
  185. package/dist/core/skill-selection.js +0 -172
  186. package/dist/core/skill-selection.js.map +0 -1
  187. package/dist/core/skills-sh-client.d.ts +0 -19
  188. package/dist/core/skills-sh-client.d.ts.map +0 -1
  189. package/dist/core/skills-sh-client.js +0 -75
  190. package/dist/core/skills-sh-client.js.map +0 -1
  191. package/dist/core/skills.d.ts +0 -97
  192. package/dist/core/skills.d.ts.map +0 -1
  193. package/dist/core/skills.js +0 -339
  194. package/dist/core/skills.js.map +0 -1
  195. package/dist/core/swarm.d.ts +0 -34
  196. package/dist/core/swarm.d.ts.map +0 -1
  197. package/dist/core/swarm.js +0 -111
  198. package/dist/core/swarm.js.map +0 -1
  199. package/dist/core/task-status.d.ts +0 -13
  200. package/dist/core/task-status.d.ts.map +0 -1
  201. package/dist/core/task-status.js +0 -17
  202. package/dist/core/task-status.js.map +0 -1
  203. package/dist/core/tool-orchestrator.d.ts +0 -30
  204. package/dist/core/tool-orchestrator.d.ts.map +0 -1
  205. package/dist/core/tool-orchestrator.js +0 -89
  206. package/dist/core/tool-orchestrator.js.map +0 -1
  207. package/dist/core/tools.d.ts +0 -462
  208. package/dist/core/tools.d.ts.map +0 -1
  209. package/dist/core/tools.js +0 -2916
  210. package/dist/core/tools.js.map +0 -1
  211. package/dist/core/transcript-cleanup.d.ts +0 -8
  212. package/dist/core/transcript-cleanup.d.ts.map +0 -1
  213. package/dist/core/transcript-cleanup.js +0 -52
  214. package/dist/core/transcript-cleanup.js.map +0 -1
  215. package/dist/core/visual-feedback.d.ts +0 -20
  216. package/dist/core/visual-feedback.d.ts.map +0 -1
  217. package/dist/core/visual-feedback.js +0 -117
  218. package/dist/core/visual-feedback.js.map +0 -1
  219. package/dist/tools/browser.d.ts +0 -120
  220. package/dist/tools/browser.d.ts.map +0 -1
  221. package/dist/tools/browser.js +0 -439
  222. package/dist/tools/browser.js.map +0 -1
  223. package/dist/tools/test-generator.d.ts +0 -157
  224. package/dist/tools/test-generator.d.ts.map +0 -1
  225. package/dist/tools/test-generator.js +0 -893
  226. package/dist/tools/test-generator.js.map +0 -1
  227. package/dist/tui/InkApp.d.ts +0 -21
  228. package/dist/tui/InkApp.d.ts.map +0 -1
  229. package/dist/tui/InkApp.js +0 -146
  230. package/dist/tui/InkApp.js.map +0 -1
  231. package/dist/tui/MarkdownMessage.d.ts +0 -16
  232. package/dist/tui/MarkdownMessage.d.ts.map +0 -1
  233. package/dist/tui/MarkdownMessage.js +0 -63
  234. package/dist/tui/MarkdownMessage.js.map +0 -1
  235. package/dist/tui/blessed-chat.d.ts +0 -9
  236. package/dist/tui/blessed-chat.d.ts.map +0 -1
  237. package/dist/tui/blessed-chat.js +0 -887
  238. package/dist/tui/blessed-chat.js.map +0 -1
  239. package/dist/tui/markdown-to-blessed.d.ts +0 -6
  240. package/dist/tui/markdown-to-blessed.d.ts.map +0 -1
  241. package/dist/tui/markdown-to-blessed.js +0 -26
  242. package/dist/tui/markdown-to-blessed.js.map +0 -1
  243. package/dist/ui/ink/App.d.ts +0 -25
  244. package/dist/ui/ink/App.d.ts.map +0 -1
  245. package/dist/ui/ink/App.js +0 -372
  246. package/dist/ui/ink/App.js.map +0 -1
  247. package/dist/utils/at-references.d.ts +0 -14
  248. package/dist/utils/at-references.d.ts.map +0 -1
  249. package/dist/utils/at-references.js +0 -47
  250. package/dist/utils/at-references.js.map +0 -1
  251. package/dist/utils/auto-memory.d.ts +0 -24
  252. package/dist/utils/auto-memory.d.ts.map +0 -1
  253. package/dist/utils/auto-memory.js +0 -153
  254. package/dist/utils/auto-memory.js.map +0 -1
  255. package/dist/utils/git.d.ts +0 -89
  256. package/dist/utils/git.d.ts.map +0 -1
  257. package/dist/utils/git.js +0 -444
  258. package/dist/utils/git.js.map +0 -1
  259. package/dist/utils/mcp-servers-file.d.ts +0 -46
  260. package/dist/utils/mcp-servers-file.d.ts.map +0 -1
  261. package/dist/utils/mcp-servers-file.js +0 -212
  262. package/dist/utils/mcp-servers-file.js.map +0 -1
  263. package/dist/utils/safety.d.ts +0 -60
  264. package/dist/utils/safety.d.ts.map +0 -1
  265. package/dist/utils/safety.js +0 -254
  266. package/dist/utils/safety.js.map +0 -1
  267. package/dist/utils/smithery.d.ts +0 -25
  268. package/dist/utils/smithery.d.ts.map +0 -1
  269. package/dist/utils/smithery.js +0 -50
  270. package/dist/utils/smithery.js.map +0 -1
  271. package/dist/utils/testRunner.d.ts +0 -44
  272. package/dist/utils/testRunner.d.ts.map +0 -1
  273. package/dist/utils/testRunner.js +0 -270
  274. package/dist/utils/testRunner.js.map +0 -1
  275. package/dist/webui/server.d.ts +0 -99
  276. package/dist/webui/server.d.ts.map +0 -1
  277. package/dist/webui/server.js +0 -2619
  278. package/dist/webui/server.js.map +0 -1
  279. package/webui-dist/assets/index-CSla6Lzy.css +0 -32
  280. package/webui-dist/assets/index-G_Z4gzPy.js +0 -457
  281. package/webui-dist/assets/index-G_Z4gzPy.js.map +0 -1
  282. package/webui-dist/assets/xterm-Da5jL1MD.js +0 -10
  283. package/webui-dist/assets/xterm-Da5jL1MD.js.map +0 -1
  284. package/webui-dist/assets/xterm-addon-fit-CMeqLIvm.js +0 -2
  285. package/webui-dist/assets/xterm-addon-fit-CMeqLIvm.js.map +0 -1
  286. package/webui-dist/assets/xterm-addon-web-links-D6m8jNVE.js +0 -2
  287. package/webui-dist/assets/xterm-addon-web-links-D6m8jNVE.js.map +0 -1
  288. package/webui-dist/index.html +0 -15
@@ -1,212 +0,0 @@
1
- import * as fs from 'fs/promises';
2
- import * as path from 'path';
3
- import * as os from 'os';
4
- /**
5
- * Manages MCP servers configuration file
6
- */
7
- export class MCPServersFileManager {
8
- filePath;
9
- constructor() {
10
- const configDir = path.join(os.homedir(), '.xibecode');
11
- this.filePath = path.join(configDir, 'mcp-servers.json');
12
- }
13
- /**
14
- * Get the path to the MCP servers config file
15
- */
16
- getFilePath() {
17
- return this.filePath;
18
- }
19
- /**
20
- * Check if the file exists
21
- */
22
- async fileExists() {
23
- try {
24
- await fs.access(this.filePath);
25
- return true;
26
- }
27
- catch {
28
- return false;
29
- }
30
- }
31
- /**
32
- * Load MCP servers from file
33
- * Supports both new object-based format and legacy array-based format
34
- * Automatically migrates legacy format to new format
35
- */
36
- async loadMCPServers() {
37
- try {
38
- if (!(await this.fileExists())) {
39
- return {};
40
- }
41
- const content = await fs.readFile(this.filePath, 'utf-8');
42
- const data = JSON.parse(content);
43
- // Check if it's the new object-based format
44
- if (data.mcpServers && typeof data.mcpServers === 'object' && !Array.isArray(data.mcpServers)) {
45
- // New format - validate and return
46
- const validatedServers = {};
47
- for (const [serverName, serverConfig] of Object.entries(data.mcpServers)) {
48
- const config = serverConfig;
49
- if (!config.command) {
50
- throw new Error(`Invalid server config for "${serverName}": missing required field "command"`);
51
- }
52
- validatedServers[serverName] = {
53
- command: config.command,
54
- args: config.args,
55
- env: config.env,
56
- };
57
- }
58
- return validatedServers;
59
- }
60
- // Check if it's the legacy array-based format
61
- if (data.servers && Array.isArray(data.servers)) {
62
- // Legacy format - migrate to new format
63
- const legacyData = data;
64
- const migratedServers = {};
65
- for (const server of legacyData.servers) {
66
- if (!server.name || !server.command) {
67
- throw new Error(`Invalid server config in legacy format: missing required fields (name, command)`);
68
- }
69
- // Remove transport field and use name as key
70
- migratedServers[server.name] = {
71
- command: server.command,
72
- args: server.args,
73
- env: server.env,
74
- };
75
- }
76
- // Auto-migrate: save in new format
77
- console.log('Migrating MCP servers configuration to new format...');
78
- await this.saveMCPServers(migratedServers);
79
- return migratedServers;
80
- }
81
- throw new Error('Invalid file format: must contain "mcpServers" object or legacy "servers" array');
82
- }
83
- catch (error) {
84
- if (error.code === 'ENOENT') {
85
- return {};
86
- }
87
- throw new Error(`Failed to load MCP servers file: ${error.message}`);
88
- }
89
- }
90
- /**
91
- * Save MCP servers to file
92
- * Uses new object-based format
93
- */
94
- async saveMCPServers(servers) {
95
- try {
96
- const configDir = path.dirname(this.filePath);
97
- // Ensure directory exists
98
- await fs.mkdir(configDir, { recursive: true });
99
- const data = {
100
- mcpServers: servers,
101
- };
102
- await fs.writeFile(this.filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
103
- }
104
- catch (error) {
105
- throw new Error(`Failed to save MCP servers file: ${error.message}`);
106
- }
107
- }
108
- /**
109
- * Create default config file with examples
110
- */
111
- async createDefaultFile() {
112
- const defaultServers = {
113
- 'filesystem': {
114
- command: 'mcp-server-filesystem',
115
- args: ['--root', '/path/to/files'],
116
- },
117
- 'github': {
118
- command: 'mcp-server-github',
119
- args: ['--token', 'YOUR_GITHUB_TOKEN'],
120
- },
121
- };
122
- await this.saveMCPServers(defaultServers);
123
- }
124
- /**
125
- * Validate the file format
126
- * Supports both new object-based and legacy array-based formats
127
- */
128
- async validateFile() {
129
- const errors = [];
130
- try {
131
- if (!(await this.fileExists())) {
132
- return { valid: false, errors: ['File does not exist'] };
133
- }
134
- const content = await fs.readFile(this.filePath, 'utf-8');
135
- let data;
136
- try {
137
- data = JSON.parse(content);
138
- }
139
- catch (error) {
140
- errors.push(`Invalid JSON: ${error.message}`);
141
- return { valid: false, errors };
142
- }
143
- // Check for new object-based format
144
- if (data.mcpServers) {
145
- if (typeof data.mcpServers !== 'object' || Array.isArray(data.mcpServers)) {
146
- errors.push('"mcpServers" must be an object (not an array)');
147
- }
148
- else {
149
- // Validate each server
150
- for (const [serverName, serverConfig] of Object.entries(data.mcpServers)) {
151
- const config = serverConfig;
152
- if (!config || typeof config !== 'object') {
153
- errors.push(`Server "${serverName}": configuration must be an object`);
154
- continue;
155
- }
156
- if (!config.command) {
157
- errors.push(`Server "${serverName}": missing "command" field`);
158
- }
159
- if (config.args && !Array.isArray(config.args)) {
160
- errors.push(`Server "${serverName}": "args" must be an array`);
161
- }
162
- if (config.env && typeof config.env !== 'object') {
163
- errors.push(`Server "${serverName}": "env" must be an object`);
164
- }
165
- }
166
- }
167
- }
168
- // Check for legacy array-based format
169
- else if (data.servers) {
170
- if (!Array.isArray(data.servers)) {
171
- errors.push('Legacy format: "servers" must be an array');
172
- }
173
- else {
174
- // Validate legacy format
175
- data.servers.forEach((server, index) => {
176
- if (!server.name) {
177
- errors.push(`Server ${index + 1}: missing "name"`);
178
- }
179
- if (!server.command) {
180
- errors.push(`Server ${index + 1}: missing "command"`);
181
- }
182
- if (server.transport && server.transport !== 'stdio') {
183
- errors.push(`Server ${index + 1}: invalid transport "${server.transport}" (only "stdio" supported)`);
184
- }
185
- });
186
- // Check for duplicate names
187
- const names = data.servers.map((s) => s.name).filter(Boolean);
188
- const duplicates = names.filter((name, index) => names.indexOf(name) !== index);
189
- if (duplicates.length > 0) {
190
- errors.push(`Duplicate server names: ${[...new Set(duplicates)].join(', ')}`);
191
- }
192
- // Suggest migration
193
- if (errors.length === 0) {
194
- errors.push('Note: Using legacy array-based format. Will auto-migrate to new object-based format on load.');
195
- }
196
- }
197
- }
198
- else {
199
- errors.push('Missing "mcpServers" field (or legacy "servers" field)');
200
- }
201
- return {
202
- valid: errors.length === 0 || (errors.length === 1 && errors[0].startsWith('Note:')),
203
- errors,
204
- };
205
- }
206
- catch (error) {
207
- errors.push(`Failed to read file: ${error.message}`);
208
- return { valid: false, errors };
209
- }
210
- }
211
- }
212
- //# sourceMappingURL=mcp-servers-file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-servers-file.js","sourceRoot":"","sources":["../../src/utils/mcp-servers-file.ts"],"names":[],"mappings":"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"}
@@ -1,60 +0,0 @@
1
- /**
2
- * Safety utilities for classifying and managing risky operations
3
- */
4
- export type RiskLevel = 'low' | 'medium' | 'high';
5
- /**
6
- * Resolve a file path against a working directory and ensure it stays inside it (no path traversal).
7
- * Use for all user-provided paths before file operations.
8
- */
9
- export declare function sanitizePath(workingDir: string, filePath: string): {
10
- ok: true;
11
- path: string;
12
- } | {
13
- ok: false;
14
- message: string;
15
- };
16
- /**
17
- * Validate URL for fetch_url to reduce SSRF risk: only http/https, no localhost or private IPs by default.
18
- */
19
- export declare function sanitizeUrl(url: string, allowLocalhost?: boolean): {
20
- ok: true;
21
- url: string;
22
- } | {
23
- ok: false;
24
- message: string;
25
- };
26
- export interface RiskAssessment {
27
- level: RiskLevel;
28
- reasons: string[];
29
- warnings: string[];
30
- }
31
- export declare class SafetyChecker {
32
- /**
33
- * Assess the risk level of a tool operation
34
- */
35
- assessToolRisk(toolName: string, params: any): RiskAssessment;
36
- /**
37
- * Assess the risk level of a shell command
38
- */
39
- assessCommandRisk(command: string): RiskLevel;
40
- /**
41
- * Check if a command should be blocked entirely
42
- */
43
- isCommandBlocked(command: string): {
44
- blocked: boolean;
45
- reason?: string;
46
- };
47
- /**
48
- * Suggest safer alternatives for risky commands
49
- */
50
- suggestSaferAlternative(command: string): string | null;
51
- /**
52
- * Check if a file path is sensitive
53
- */
54
- isSensitivePath(filepath: string): boolean;
55
- /**
56
- * Validate dry-run compatibility for a tool
57
- */
58
- canDryRun(toolName: string): boolean;
59
- }
60
- //# sourceMappingURL=safety.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/utils/safety.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQ9H;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiB3H;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,cAAc;IAqG7D;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAkD7C;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAqBxE;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA0BvD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAgB1C;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAgBrC"}
@@ -1,254 +0,0 @@
1
- /**
2
- * Safety utilities for classifying and managing risky operations
3
- */
4
- import * as path from 'path';
5
- /**
6
- * Resolve a file path against a working directory and ensure it stays inside it (no path traversal).
7
- * Use for all user-provided paths before file operations.
8
- */
9
- export function sanitizePath(workingDir, filePath) {
10
- const normalized = path.normalize(filePath).replace(/^(\.\.(\/|\\))+/, '');
11
- const resolved = path.resolve(workingDir, normalized);
12
- const relative = path.relative(workingDir, resolved);
13
- if (relative.startsWith('..') || path.isAbsolute(relative)) {
14
- return { ok: false, message: 'Path escapes working directory and is not allowed' };
15
- }
16
- return { ok: true, path: resolved };
17
- }
18
- /**
19
- * Validate URL for fetch_url to reduce SSRF risk: only http/https, no localhost or private IPs by default.
20
- */
21
- export function sanitizeUrl(url, allowLocalhost = false) {
22
- let parsed;
23
- try {
24
- parsed = new URL(url);
25
- }
26
- catch {
27
- return { ok: false, message: 'Invalid URL' };
28
- }
29
- if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
30
- return { ok: false, message: 'Only http and https URLs are allowed' };
31
- }
32
- if (!allowLocalhost) {
33
- const host = (parsed.hostname || '').toLowerCase();
34
- if (host === 'localhost' || host === '127.0.0.1' || host.startsWith('192.168.') || host.startsWith('10.') || host.endsWith('.local')) {
35
- return { ok: false, message: 'Local or private URLs are not allowed' };
36
- }
37
- }
38
- return { ok: true, url: parsed.toString() };
39
- }
40
- export class SafetyChecker {
41
- /**
42
- * Assess the risk level of a tool operation
43
- */
44
- assessToolRisk(toolName, params) {
45
- const reasons = [];
46
- const warnings = [];
47
- let level = 'low';
48
- switch (toolName) {
49
- case 'delete_file':
50
- level = 'high';
51
- reasons.push('Deletes files/directories permanently');
52
- warnings.push('Ensure backups exist before deletion');
53
- // Check if deleting important directories
54
- if (params.path) {
55
- const dangerousPaths = [
56
- 'node_modules',
57
- '.git',
58
- 'dist',
59
- 'build',
60
- 'src',
61
- '/',
62
- '~',
63
- ];
64
- for (const dangerous of dangerousPaths) {
65
- if (params.path.includes(dangerous)) {
66
- level = 'high';
67
- warnings.push(`Deleting ${dangerous} directory - HIGH RISK`);
68
- }
69
- }
70
- }
71
- break;
72
- case 'write_file':
73
- // Writing is generally safe but can overwrite
74
- if (params.path) {
75
- // Check for important files
76
- const importantFiles = [
77
- 'package.json',
78
- 'tsconfig.json',
79
- '.gitignore',
80
- 'README.md',
81
- '.env',
82
- ];
83
- if (importantFiles.some(f => params.path.endsWith(f))) {
84
- level = 'medium';
85
- reasons.push('Modifying important configuration file');
86
- warnings.push('Verify changes to avoid breaking the project');
87
- }
88
- }
89
- break;
90
- case 'edit_file':
91
- case 'edit_lines':
92
- case 'insert_at_line':
93
- level = 'low';
94
- reasons.push('File edits are backed up automatically');
95
- break;
96
- case 'move_file':
97
- level = 'medium';
98
- reasons.push('Moving files can break imports and references');
99
- warnings.push('Update imports after moving files');
100
- break;
101
- case 'run_command':
102
- level = this.assessCommandRisk(params.command);
103
- if (level === 'high') {
104
- reasons.push('Command can make irreversible changes');
105
- }
106
- break;
107
- case 'create_git_checkpoint':
108
- level = 'low';
109
- reasons.push('Creates a safe restore point');
110
- break;
111
- case 'revert_to_git_checkpoint':
112
- level = 'high';
113
- reasons.push('Reverts code changes');
114
- warnings.push('Ensure correct checkpoint before reverting');
115
- if (!params.confirm) {
116
- warnings.push('Requires explicit confirmation');
117
- }
118
- break;
119
- case 'revert_file':
120
- level = 'medium';
121
- reasons.push('Reverts file to previous version');
122
- warnings.push('Verify backup index before reverting');
123
- break;
124
- default:
125
- level = 'low';
126
- }
127
- return { level, reasons, warnings };
128
- }
129
- /**
130
- * Assess the risk level of a shell command
131
- */
132
- assessCommandRisk(command) {
133
- const cmd = command.toLowerCase().trim();
134
- // High-risk commands
135
- const highRiskPatterns = [
136
- /rm\s+-rf/,
137
- /git\s+reset\s+--hard/,
138
- /git\s+push\s+--force/,
139
- /git\s+push\s+-f/,
140
- /dd\s+if=/,
141
- /mkfs/,
142
- /format/,
143
- /:\(\)\{.*\}/, // Fork bomb pattern
144
- /chmod\s+777/,
145
- /chown\s+-R/,
146
- /sudo\s+rm/,
147
- /> \/dev\//,
148
- /curl.*\|\s*(bash|sh)/,
149
- /wget.*\|\s*(bash|sh)/,
150
- ];
151
- for (const pattern of highRiskPatterns) {
152
- if (pattern.test(cmd)) {
153
- return 'high';
154
- }
155
- }
156
- // Medium-risk commands
157
- const mediumRiskPatterns = [
158
- /git\s+push/,
159
- /npm\s+publish/,
160
- /rm\s+/,
161
- /git\s+reset/,
162
- /git\s+rebase/,
163
- /git\s+merge/,
164
- /docker\s+rm/,
165
- /docker\s+rmi/,
166
- /kill\s+-9/,
167
- /pkill/,
168
- ];
169
- for (const pattern of mediumRiskPatterns) {
170
- if (pattern.test(cmd)) {
171
- return 'medium';
172
- }
173
- }
174
- return 'low';
175
- }
176
- /**
177
- * Check if a command should be blocked entirely
178
- */
179
- isCommandBlocked(command) {
180
- const cmd = command.toLowerCase().trim();
181
- // Block extremely dangerous commands
182
- const blockedPatterns = [
183
- { pattern: /:\(\)\{.*\}/, reason: 'Fork bomb detected' },
184
- { pattern: /rm\s+-rf\s+\/($|\s)/, reason: 'Attempting to delete root directory' },
185
- { pattern: /rm\s+-rf\s+~($|\s)/, reason: 'Attempting to delete home directory' },
186
- { pattern: /> \/dev\/sda/, reason: 'Attempting to write directly to disk' },
187
- { pattern: /mkfs/, reason: 'Attempting to format filesystem' },
188
- ];
189
- for (const { pattern, reason } of blockedPatterns) {
190
- if (pattern.test(cmd)) {
191
- return { blocked: true, reason };
192
- }
193
- }
194
- return { blocked: false };
195
- }
196
- /**
197
- * Suggest safer alternatives for risky commands
198
- */
199
- suggestSaferAlternative(command) {
200
- const cmd = command.toLowerCase().trim();
201
- // Normalize multiple spaces for simpler matching
202
- const normalized = cmd.replace(/\s+/g, ' ');
203
- if (normalized.includes('git reset --hard')) {
204
- return 'Use "git stash" to save changes, then "git stash drop" if you really want to discard them';
205
- }
206
- if (normalized.includes('git push --force') || normalized.includes('git push -f')) {
207
- return 'Use "git push --force-with-lease" to avoid overwriting others\' work';
208
- }
209
- if (normalized.match(/rm\s+-rf/)) {
210
- return 'Consider using "mv" to move files to a temporary location first';
211
- }
212
- // Suggest alternative package managers only for explicit "npm install"
213
- if (/^npm\s+install\b/.test(normalized) && !normalized.includes('-g')) {
214
- return 'Consider using "pnpm install" or "bun install" for faster, more efficient installs';
215
- }
216
- return null;
217
- }
218
- /**
219
- * Check if a file path is sensitive
220
- */
221
- isSensitivePath(filepath) {
222
- const sensitive = [
223
- '.env',
224
- '.env.local',
225
- '.env.production',
226
- 'credentials.json',
227
- 'secrets.yaml',
228
- 'private.key',
229
- '.ssh/',
230
- 'id_rsa',
231
- 'id_ed25519',
232
- ];
233
- return sensitive.some(pattern => filepath.includes(pattern));
234
- }
235
- /**
236
- * Validate dry-run compatibility for a tool
237
- */
238
- canDryRun(toolName) {
239
- const dryRunnable = [
240
- 'write_file',
241
- 'edit_file',
242
- 'edit_lines',
243
- 'insert_at_line',
244
- 'delete_file',
245
- 'move_file',
246
- 'create_directory',
247
- 'create_git_checkpoint',
248
- 'revert_to_git_checkpoint',
249
- 'revert_file',
250
- ];
251
- return dryRunnable.includes(toolName);
252
- }
253
- }
254
- //# sourceMappingURL=safety.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/utils/safety.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- export interface SmitheryServer {
2
- qualifiedName: string;
3
- displayName?: string;
4
- description?: string;
5
- useCount?: number;
6
- connectionUrl?: string;
7
- }
8
- export declare class SmitheryClient {
9
- /**
10
- * Search for MCP servers using Smithery CLI
11
- */
12
- search(query: string): Promise<SmitheryServer[]>;
13
- /**
14
- * Construct the command configuration for running an MCP server via Smithery
15
- */
16
- getRunConfig(serverName: string, config?: Record<string, any>): {
17
- command: string;
18
- args: string[];
19
- };
20
- /**
21
- * Check if Smithery CLI is usable (has node/npx)
22
- */
23
- isAvailable(): Promise<boolean>;
24
- }
25
- //# sourceMappingURL=smithery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smithery.d.ts","sourceRoot":"","sources":["../../src/utils/smithery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAc;IACvB;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYtD;;OAEG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAcvG;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQxC"}
@@ -1,50 +0,0 @@
1
- import { exec } from 'child_process';
2
- import { promisify } from 'util';
3
- import chalk from 'chalk';
4
- const execAsync = promisify(exec);
5
- export class SmitheryClient {
6
- /**
7
- * Search for MCP servers using Smithery CLI
8
- */
9
- async search(query) {
10
- try {
11
- // Use --json to get structured output
12
- const { stdout } = await execAsync(`npx -y @smithery/cli search "${query}" --json`);
13
- const data = JSON.parse(stdout);
14
- return Array.isArray(data) ? data : [];
15
- }
16
- catch (error) {
17
- console.error(chalk.red('Failed to search Smithery:'), error.message);
18
- return [];
19
- }
20
- }
21
- /**
22
- * Construct the command configuration for running an MCP server via Smithery
23
- */
24
- getRunConfig(serverName, config = {}) {
25
- return {
26
- command: 'npx',
27
- args: [
28
- '-y',
29
- '@smithery/cli@latest',
30
- 'run',
31
- serverName,
32
- '--config',
33
- JSON.stringify(config) // Config must be passed as a JSON string to the CLI
34
- ]
35
- };
36
- }
37
- /**
38
- * Check if Smithery CLI is usable (has node/npx)
39
- */
40
- async isAvailable() {
41
- try {
42
- await execAsync('npx --version');
43
- return true;
44
- }
45
- catch {
46
- return false;
47
- }
48
- }
49
- }
50
- //# sourceMappingURL=smithery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smithery.js","sourceRoot":"","sources":["../../src/utils/smithery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAUlC,MAAM,OAAO,cAAc;IACvB;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa;QACtB,IAAI,CAAC;YACD,sCAAsC;YACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,gCAAgC,KAAK,UAAU,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,UAAkB,EAAE,SAA8B,EAAE;QAC7D,OAAO;YACH,OAAO,EAAE,KAAK;YACd,IAAI,EAAE;gBACF,IAAI;gBACJ,sBAAsB;gBACtB,KAAK;gBACL,UAAU;gBACV,UAAU;gBACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,oDAAoD;aAC9E;SACJ,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACb,IAAI,CAAC;YACD,MAAM,SAAS,CAAC,eAAe,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ"}