@cloudcli-ai/cloudcli 1.29.1 → 1.29.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 (113) hide show
  1. package/dist/assets/{index-ByHZ8-LL.css → index-D-9h5kNf.css} +1 -1
  2. package/dist/assets/{index-BOWaxSnV.js → index-y8yqvoLv.js} +229 -229
  3. package/dist/index.html +2 -2
  4. package/dist-server/server/claude-sdk.js +694 -0
  5. package/dist-server/server/claude-sdk.js.map +1 -0
  6. package/dist-server/server/cli.js +642 -0
  7. package/dist-server/server/cli.js.map +1 -0
  8. package/dist-server/server/constants/config.js +6 -0
  9. package/dist-server/server/constants/config.js.map +1 -0
  10. package/dist-server/server/cursor-cli.js +271 -0
  11. package/dist-server/server/cursor-cli.js.map +1 -0
  12. package/dist-server/server/database/db.js +535 -0
  13. package/dist-server/server/database/db.js.map +1 -0
  14. package/dist-server/server/database/schema.js +97 -0
  15. package/dist-server/server/database/schema.js.map +1 -0
  16. package/dist-server/server/gemini-cli.js +394 -0
  17. package/dist-server/server/gemini-cli.js.map +1 -0
  18. package/dist-server/server/gemini-response-handler.js +72 -0
  19. package/dist-server/server/gemini-response-handler.js.map +1 -0
  20. package/dist-server/server/index.js +2244 -0
  21. package/dist-server/server/index.js.map +1 -0
  22. package/dist-server/server/load-env.js +32 -0
  23. package/dist-server/server/load-env.js.map +1 -0
  24. package/dist-server/server/middleware/auth.js +111 -0
  25. package/dist-server/server/middleware/auth.js.map +1 -0
  26. package/dist-server/server/openai-codex.js +367 -0
  27. package/dist-server/server/openai-codex.js.map +1 -0
  28. package/dist-server/server/projects.js +2331 -0
  29. package/dist-server/server/projects.js.map +1 -0
  30. package/dist-server/server/providers/claude/adapter.js +266 -0
  31. package/dist-server/server/providers/claude/adapter.js.map +1 -0
  32. package/dist-server/server/providers/codex/adapter.js +232 -0
  33. package/dist-server/server/providers/codex/adapter.js.map +1 -0
  34. package/dist-server/server/providers/cursor/adapter.js +347 -0
  35. package/dist-server/server/providers/cursor/adapter.js.map +1 -0
  36. package/dist-server/server/providers/gemini/adapter.js +174 -0
  37. package/dist-server/server/providers/gemini/adapter.js.map +1 -0
  38. package/dist-server/server/providers/registry.js +39 -0
  39. package/dist-server/server/providers/registry.js.map +1 -0
  40. package/dist-server/server/providers/types.js +106 -0
  41. package/dist-server/server/providers/types.js.map +1 -0
  42. package/dist-server/server/providers/utils.js +28 -0
  43. package/dist-server/server/providers/utils.js.map +1 -0
  44. package/dist-server/server/routes/agent.js +1147 -0
  45. package/dist-server/server/routes/agent.js.map +1 -0
  46. package/dist-server/server/routes/auth.js +117 -0
  47. package/dist-server/server/routes/auth.js.map +1 -0
  48. package/dist-server/server/routes/cli-auth.js +406 -0
  49. package/dist-server/server/routes/cli-auth.js.map +1 -0
  50. package/dist-server/server/routes/codex.js +294 -0
  51. package/dist-server/server/routes/codex.js.map +1 -0
  52. package/dist-server/server/routes/commands.js +531 -0
  53. package/dist-server/server/routes/commands.js.map +1 -0
  54. package/dist-server/server/routes/cursor.js +545 -0
  55. package/dist-server/server/routes/cursor.js.map +1 -0
  56. package/dist-server/server/routes/gemini.js +21 -0
  57. package/dist-server/server/routes/gemini.js.map +1 -0
  58. package/dist-server/server/routes/git.js +1259 -0
  59. package/dist-server/server/routes/git.js.map +1 -0
  60. package/dist-server/server/routes/mcp-utils.js +46 -0
  61. package/dist-server/server/routes/mcp-utils.js.map +1 -0
  62. package/dist-server/server/routes/mcp.js +480 -0
  63. package/dist-server/server/routes/mcp.js.map +1 -0
  64. package/dist-server/server/routes/messages.js +56 -0
  65. package/dist-server/server/routes/messages.js.map +1 -0
  66. package/dist-server/server/routes/plugins.js +266 -0
  67. package/dist-server/server/routes/plugins.js.map +1 -0
  68. package/dist-server/server/routes/projects.js +505 -0
  69. package/dist-server/server/routes/projects.js.map +1 -0
  70. package/dist-server/server/routes/settings.js +249 -0
  71. package/dist-server/server/routes/settings.js.map +1 -0
  72. package/dist-server/server/routes/taskmaster.js +1832 -0
  73. package/dist-server/server/routes/taskmaster.js.map +1 -0
  74. package/dist-server/server/routes/user.js +115 -0
  75. package/dist-server/server/routes/user.js.map +1 -0
  76. package/dist-server/server/services/notification-orchestrator.js +177 -0
  77. package/dist-server/server/services/notification-orchestrator.js.map +1 -0
  78. package/dist-server/server/services/vapid-keys.js +26 -0
  79. package/dist-server/server/services/vapid-keys.js.map +1 -0
  80. package/dist-server/server/sessionManager.js +194 -0
  81. package/dist-server/server/sessionManager.js.map +1 -0
  82. package/dist-server/server/utils/commandParser.js +255 -0
  83. package/dist-server/server/utils/commandParser.js.map +1 -0
  84. package/dist-server/server/utils/frontmatter.js +16 -0
  85. package/dist-server/server/utils/frontmatter.js.map +1 -0
  86. package/dist-server/server/utils/gitConfig.js +36 -0
  87. package/dist-server/server/utils/gitConfig.js.map +1 -0
  88. package/dist-server/server/utils/mcp-detector.js +183 -0
  89. package/dist-server/server/utils/mcp-detector.js.map +1 -0
  90. package/dist-server/server/utils/plugin-loader.js +413 -0
  91. package/dist-server/server/utils/plugin-loader.js.map +1 -0
  92. package/dist-server/server/utils/plugin-process-manager.js +163 -0
  93. package/dist-server/server/utils/plugin-process-manager.js.map +1 -0
  94. package/dist-server/server/utils/runtime-paths.js +30 -0
  95. package/dist-server/server/utils/runtime-paths.js.map +1 -0
  96. package/dist-server/server/utils/taskmaster-websocket.js +118 -0
  97. package/dist-server/server/utils/taskmaster-websocket.js.map +1 -0
  98. package/dist-server/shared/modelConstants.js +87 -0
  99. package/dist-server/shared/modelConstants.js.map +1 -0
  100. package/dist-server/shared/networkHosts.js +20 -0
  101. package/dist-server/shared/networkHosts.js.map +1 -0
  102. package/package.json +21 -10
  103. package/server/cli.js +35 -33
  104. package/server/database/db.js +24 -61
  105. package/server/database/schema.js +102 -0
  106. package/server/index.js +12 -12
  107. package/server/load-env.js +11 -6
  108. package/server/routes/commands.js +6 -4
  109. package/server/routes/cursor.js +0 -218
  110. package/server/tsconfig.json +33 -0
  111. package/server/utils/runtime-paths.js +37 -0
  112. package/shared/modelConstants.js +4 -2
  113. package/server/database/init.sql +0 -99
@@ -0,0 +1,294 @@
1
+ import express from 'express';
2
+ import { spawn } from 'child_process';
3
+ import { promises as fs } from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ import TOML from '@iarna/toml';
7
+ import { getCodexSessions, deleteCodexSession } from '../projects.js';
8
+ import { applyCustomSessionNames, sessionNamesDb } from '../database/db.js';
9
+ const router = express.Router();
10
+ function createCliResponder(res) {
11
+ let responded = false;
12
+ return (status, payload) => {
13
+ if (responded || res.headersSent) {
14
+ return;
15
+ }
16
+ responded = true;
17
+ res.status(status).json(payload);
18
+ };
19
+ }
20
+ router.get('/config', async (req, res) => {
21
+ try {
22
+ const configPath = path.join(os.homedir(), '.codex', 'config.toml');
23
+ const content = await fs.readFile(configPath, 'utf8');
24
+ const config = TOML.parse(content);
25
+ res.json({
26
+ success: true,
27
+ config: {
28
+ model: config.model || null,
29
+ mcpServers: config.mcp_servers || {},
30
+ approvalMode: config.approval_mode || 'suggest'
31
+ }
32
+ });
33
+ }
34
+ catch (error) {
35
+ if (error.code === 'ENOENT') {
36
+ res.json({
37
+ success: true,
38
+ config: {
39
+ model: null,
40
+ mcpServers: {},
41
+ approvalMode: 'suggest'
42
+ }
43
+ });
44
+ }
45
+ else {
46
+ console.error('Error reading Codex config:', error);
47
+ res.status(500).json({ success: false, error: error.message });
48
+ }
49
+ }
50
+ });
51
+ router.get('/sessions', async (req, res) => {
52
+ try {
53
+ const { projectPath } = req.query;
54
+ if (!projectPath) {
55
+ return res.status(400).json({ success: false, error: 'projectPath query parameter required' });
56
+ }
57
+ const sessions = await getCodexSessions(projectPath);
58
+ applyCustomSessionNames(sessions, 'codex');
59
+ res.json({ success: true, sessions });
60
+ }
61
+ catch (error) {
62
+ console.error('Error fetching Codex sessions:', error);
63
+ res.status(500).json({ success: false, error: error.message });
64
+ }
65
+ });
66
+ router.delete('/sessions/:sessionId', async (req, res) => {
67
+ try {
68
+ const { sessionId } = req.params;
69
+ await deleteCodexSession(sessionId);
70
+ sessionNamesDb.deleteName(sessionId, 'codex');
71
+ res.json({ success: true });
72
+ }
73
+ catch (error) {
74
+ console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);
75
+ res.status(500).json({ success: false, error: error.message });
76
+ }
77
+ });
78
+ // MCP Server Management Routes
79
+ router.get('/mcp/cli/list', async (req, res) => {
80
+ try {
81
+ const respond = createCliResponder(res);
82
+ const proc = spawn('codex', ['mcp', 'list'], { stdio: ['pipe', 'pipe', 'pipe'] });
83
+ let stdout = '';
84
+ let stderr = '';
85
+ proc.stdout?.on('data', (data) => { stdout += data.toString(); });
86
+ proc.stderr?.on('data', (data) => { stderr += data.toString(); });
87
+ proc.on('close', (code) => {
88
+ if (code === 0) {
89
+ respond(200, { success: true, output: stdout, servers: parseCodexListOutput(stdout) });
90
+ }
91
+ else {
92
+ respond(500, { error: 'Codex CLI command failed', details: stderr || `Exited with code ${code}` });
93
+ }
94
+ });
95
+ proc.on('error', (error) => {
96
+ const isMissing = error?.code === 'ENOENT';
97
+ respond(isMissing ? 503 : 500, {
98
+ error: isMissing ? 'Codex CLI not installed' : 'Failed to run Codex CLI',
99
+ details: error.message,
100
+ code: error.code
101
+ });
102
+ });
103
+ }
104
+ catch (error) {
105
+ res.status(500).json({ error: 'Failed to list MCP servers', details: error.message });
106
+ }
107
+ });
108
+ router.post('/mcp/cli/add', async (req, res) => {
109
+ try {
110
+ const { name, command, args = [], env = {} } = req.body;
111
+ if (!name || !command) {
112
+ return res.status(400).json({ error: 'name and command are required' });
113
+ }
114
+ // Build: codex mcp add <name> [-e KEY=VAL]... -- <command> [args...]
115
+ let cliArgs = ['mcp', 'add', name];
116
+ Object.entries(env).forEach(([key, value]) => {
117
+ cliArgs.push('-e', `${key}=${value}`);
118
+ });
119
+ cliArgs.push('--', command);
120
+ if (args && args.length > 0) {
121
+ cliArgs.push(...args);
122
+ }
123
+ const respond = createCliResponder(res);
124
+ const proc = spawn('codex', cliArgs, { stdio: ['pipe', 'pipe', 'pipe'] });
125
+ let stdout = '';
126
+ let stderr = '';
127
+ proc.stdout?.on('data', (data) => { stdout += data.toString(); });
128
+ proc.stderr?.on('data', (data) => { stderr += data.toString(); });
129
+ proc.on('close', (code) => {
130
+ if (code === 0) {
131
+ respond(200, { success: true, output: stdout, message: `MCP server "${name}" added successfully` });
132
+ }
133
+ else {
134
+ respond(400, { error: 'Codex CLI command failed', details: stderr || `Exited with code ${code}` });
135
+ }
136
+ });
137
+ proc.on('error', (error) => {
138
+ const isMissing = error?.code === 'ENOENT';
139
+ respond(isMissing ? 503 : 500, {
140
+ error: isMissing ? 'Codex CLI not installed' : 'Failed to run Codex CLI',
141
+ details: error.message,
142
+ code: error.code
143
+ });
144
+ });
145
+ }
146
+ catch (error) {
147
+ res.status(500).json({ error: 'Failed to add MCP server', details: error.message });
148
+ }
149
+ });
150
+ router.delete('/mcp/cli/remove/:name', async (req, res) => {
151
+ try {
152
+ const { name } = req.params;
153
+ const respond = createCliResponder(res);
154
+ const proc = spawn('codex', ['mcp', 'remove', name], { stdio: ['pipe', 'pipe', 'pipe'] });
155
+ let stdout = '';
156
+ let stderr = '';
157
+ proc.stdout?.on('data', (data) => { stdout += data.toString(); });
158
+ proc.stderr?.on('data', (data) => { stderr += data.toString(); });
159
+ proc.on('close', (code) => {
160
+ if (code === 0) {
161
+ respond(200, { success: true, output: stdout, message: `MCP server "${name}" removed successfully` });
162
+ }
163
+ else {
164
+ respond(400, { error: 'Codex CLI command failed', details: stderr || `Exited with code ${code}` });
165
+ }
166
+ });
167
+ proc.on('error', (error) => {
168
+ const isMissing = error?.code === 'ENOENT';
169
+ respond(isMissing ? 503 : 500, {
170
+ error: isMissing ? 'Codex CLI not installed' : 'Failed to run Codex CLI',
171
+ details: error.message,
172
+ code: error.code
173
+ });
174
+ });
175
+ }
176
+ catch (error) {
177
+ res.status(500).json({ error: 'Failed to remove MCP server', details: error.message });
178
+ }
179
+ });
180
+ router.get('/mcp/cli/get/:name', async (req, res) => {
181
+ try {
182
+ const { name } = req.params;
183
+ const respond = createCliResponder(res);
184
+ const proc = spawn('codex', ['mcp', 'get', name], { stdio: ['pipe', 'pipe', 'pipe'] });
185
+ let stdout = '';
186
+ let stderr = '';
187
+ proc.stdout?.on('data', (data) => { stdout += data.toString(); });
188
+ proc.stderr?.on('data', (data) => { stderr += data.toString(); });
189
+ proc.on('close', (code) => {
190
+ if (code === 0) {
191
+ respond(200, { success: true, output: stdout, server: parseCodexGetOutput(stdout) });
192
+ }
193
+ else {
194
+ respond(404, { error: 'Codex CLI command failed', details: stderr || `Exited with code ${code}` });
195
+ }
196
+ });
197
+ proc.on('error', (error) => {
198
+ const isMissing = error?.code === 'ENOENT';
199
+ respond(isMissing ? 503 : 500, {
200
+ error: isMissing ? 'Codex CLI not installed' : 'Failed to run Codex CLI',
201
+ details: error.message,
202
+ code: error.code
203
+ });
204
+ });
205
+ }
206
+ catch (error) {
207
+ res.status(500).json({ error: 'Failed to get MCP server details', details: error.message });
208
+ }
209
+ });
210
+ router.get('/mcp/config/read', async (req, res) => {
211
+ try {
212
+ const configPath = path.join(os.homedir(), '.codex', 'config.toml');
213
+ let configData = null;
214
+ try {
215
+ const fileContent = await fs.readFile(configPath, 'utf8');
216
+ configData = TOML.parse(fileContent);
217
+ }
218
+ catch (error) {
219
+ // Config file doesn't exist
220
+ }
221
+ if (!configData) {
222
+ return res.json({ success: true, configPath, servers: [] });
223
+ }
224
+ const servers = [];
225
+ if (configData.mcp_servers && typeof configData.mcp_servers === 'object') {
226
+ for (const [name, config] of Object.entries(configData.mcp_servers)) {
227
+ servers.push({
228
+ id: name,
229
+ name: name,
230
+ type: 'stdio',
231
+ scope: 'user',
232
+ config: {
233
+ command: config.command || '',
234
+ args: config.args || [],
235
+ env: config.env || {}
236
+ },
237
+ raw: config
238
+ });
239
+ }
240
+ }
241
+ res.json({ success: true, configPath, servers });
242
+ }
243
+ catch (error) {
244
+ res.status(500).json({ error: 'Failed to read Codex configuration', details: error.message });
245
+ }
246
+ });
247
+ function parseCodexListOutput(output) {
248
+ const servers = [];
249
+ const lines = output.split('\n').filter(line => line.trim());
250
+ for (const line of lines) {
251
+ if (line.includes(':')) {
252
+ const colonIndex = line.indexOf(':');
253
+ const name = line.substring(0, colonIndex).trim();
254
+ if (!name)
255
+ continue;
256
+ const rest = line.substring(colonIndex + 1).trim();
257
+ let description = rest;
258
+ let status = 'unknown';
259
+ if (rest.includes('✓') || rest.includes('✗')) {
260
+ const statusMatch = rest.match(/(.*?)\s*-\s*([✓✗].*)$/);
261
+ if (statusMatch) {
262
+ description = statusMatch[1].trim();
263
+ status = statusMatch[2].includes('✓') ? 'connected' : 'failed';
264
+ }
265
+ }
266
+ servers.push({ name, type: 'stdio', status, description });
267
+ }
268
+ }
269
+ return servers;
270
+ }
271
+ function parseCodexGetOutput(output) {
272
+ try {
273
+ const jsonMatch = output.match(/\{[\s\S]*\}/);
274
+ if (jsonMatch) {
275
+ return JSON.parse(jsonMatch[0]);
276
+ }
277
+ const server = { raw_output: output };
278
+ const lines = output.split('\n');
279
+ for (const line of lines) {
280
+ if (line.includes('Name:'))
281
+ server.name = line.split(':')[1]?.trim();
282
+ else if (line.includes('Type:'))
283
+ server.type = line.split(':')[1]?.trim();
284
+ else if (line.includes('Command:'))
285
+ server.command = line.split(':')[1]?.trim();
286
+ }
287
+ return server;
288
+ }
289
+ catch (error) {
290
+ return { raw_output: output, parse_error: error.message };
291
+ }
292
+ }
293
+ export default router;
294
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../server/routes/codex.js"],"names":[],"mappings":"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"}