@pixelbyte-software/pixcode 1.35.2 → 1.35.4
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.
- package/LICENSE +718 -718
- package/README.de.md +248 -248
- package/README.ja.md +240 -240
- package/README.ko.md +240 -240
- package/README.md +303 -303
- package/README.ru.md +248 -248
- package/README.tr.md +250 -250
- package/README.zh-CN.md +240 -240
- package/dist/api-docs.html +548 -548
- package/dist/assets/index-BwmhA_le.css +32 -0
- package/dist/assets/{index-D1-AIL_5.js → index-CyxRiNt0.js} +182 -182
- package/dist/clear-cache.html +85 -85
- package/dist/convert-icons.md +52 -52
- package/dist/favicon.svg +8 -8
- package/dist/generate-icons.js +48 -48
- package/dist/icons/codex-white.svg +3 -3
- package/dist/icons/codex.svg +3 -3
- package/dist/icons/cursor-white.svg +11 -11
- package/dist/icons/icon-128x128.svg +9 -9
- package/dist/icons/icon-144x144.svg +9 -9
- package/dist/icons/icon-152x152.svg +9 -9
- package/dist/icons/icon-192x192.svg +9 -9
- package/dist/icons/icon-384x384.svg +9 -9
- package/dist/icons/icon-512x512.svg +9 -9
- package/dist/icons/icon-72x72.svg +9 -9
- package/dist/icons/icon-96x96.svg +9 -9
- package/dist/icons/icon-template.svg +9 -9
- package/dist/icons/qwen-logo.svg +14 -14
- package/dist/index.html +59 -59
- package/dist/logo.svg +12 -12
- package/dist/manifest.json +60 -60
- package/dist/openapi.yaml +1693 -1693
- package/dist/sw.js +124 -124
- package/dist-server/server/cli.js +96 -96
- package/dist-server/server/cli.js.map +1 -1
- package/dist-server/server/cursor-cli.js.map +1 -1
- package/dist-server/server/daemon/manager.js +33 -33
- package/dist-server/server/daemon-manager.js +64 -64
- package/dist-server/server/gemini-cli.js +4 -4
- package/dist-server/server/gemini-cli.js.map +1 -1
- package/dist-server/server/index.js +11 -11
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/load-env.js.map +1 -1
- package/dist-server/server/middleware/auth.js.map +1 -1
- package/dist-server/server/modules/orchestration/tasks/orchestration-task.routes.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +1 -1
- package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/qwen/qwen-auth.provider.js +1 -1
- package/dist-server/server/modules/providers/list/qwen/qwen-auth.provider.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +3 -6
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/opencode-cli.js +1 -1
- package/dist-server/server/opencode-cli.js.map +1 -1
- package/dist-server/server/projects.js +2 -3
- package/dist-server/server/projects.js.map +1 -1
- package/dist-server/server/qwen-code-cli.js +1 -1
- package/dist-server/server/qwen-code-cli.js.map +1 -1
- package/dist-server/server/routes/agent.js +3 -3
- package/dist-server/server/routes/agent.js.map +1 -1
- package/dist-server/server/routes/auth.js.map +1 -1
- package/dist-server/server/routes/codex.js.map +1 -1
- package/dist-server/server/routes/commands.js +26 -26
- package/dist-server/server/routes/commands.js.map +1 -1
- package/dist-server/server/routes/cursor.js +1 -1
- package/dist-server/server/routes/cursor.js.map +1 -1
- package/dist-server/server/routes/gemini.js.map +1 -1
- package/dist-server/server/routes/git.js +18 -18
- package/dist-server/server/routes/git.js.map +1 -1
- package/dist-server/server/routes/mcp-utils.js.map +1 -1
- package/dist-server/server/routes/messages.js.map +1 -1
- package/dist-server/server/routes/network.js +1 -1
- package/dist-server/server/routes/network.js.map +1 -1
- package/dist-server/server/routes/plugins.js +2 -2
- package/dist-server/server/routes/plugins.js.map +1 -1
- package/dist-server/server/routes/projects.js +1 -1
- package/dist-server/server/routes/projects.js.map +1 -1
- package/dist-server/server/routes/settings.js.map +1 -1
- package/dist-server/server/routes/taskmaster.js +423 -424
- package/dist-server/server/routes/taskmaster.js.map +1 -1
- package/dist-server/server/routes/user.js +1 -1
- package/dist-server/server/routes/user.js.map +1 -1
- package/dist-server/server/services/external-access.js +0 -1
- package/dist-server/server/services/external-access.js.map +1 -1
- package/dist-server/server/services/notification-orchestrator.js.map +1 -1
- package/dist-server/server/utils/commandParser.js.map +1 -1
- package/dist-server/server/utils/plugin-process-manager.js.map +1 -1
- package/dist-server/server/vite-daemon.js.map +1 -1
- package/package.json +180 -180
- package/scripts/fix-node-pty.js +67 -67
- package/scripts/smoke/a2a-roundtrip.mjs +167 -167
- package/scripts/smoke/orchestration-api.mjs +172 -172
- package/scripts/smoke/orchestration-live-run.mjs +176 -176
- package/server/claude-sdk.js +898 -898
- package/server/cli.js +936 -935
- package/server/constants/config.js +4 -4
- package/server/cursor-cli.js +344 -342
- package/server/daemon/manager.js +564 -564
- package/server/daemon-manager.js +959 -959
- package/server/database/db.js +794 -794
- package/server/database/json-store.js +197 -197
- package/server/gemini-cli.js +536 -535
- package/server/gemini-response-handler.js +79 -79
- package/server/index.js +3138 -3135
- package/server/load-env.js +35 -34
- package/server/middleware/auth.js +174 -173
- package/server/modules/orchestration/a2a/adapter-registry.ts +108 -108
- package/server/modules/orchestration/a2a/adapters/abstract-a2a.adapter.ts +55 -55
- package/server/modules/orchestration/a2a/adapters/claude-code.adapter.ts +284 -284
- package/server/modules/orchestration/a2a/adapters/codex.adapter.ts +244 -244
- package/server/modules/orchestration/a2a/adapters/cursor.adapter.ts +249 -249
- package/server/modules/orchestration/a2a/adapters/gemini.adapter.ts +248 -248
- package/server/modules/orchestration/a2a/adapters/opencode.adapter.ts +248 -248
- package/server/modules/orchestration/a2a/adapters/qwen.adapter.ts +248 -248
- package/server/modules/orchestration/a2a/routes.ts +577 -577
- package/server/modules/orchestration/a2a/task-store.ts +178 -178
- package/server/modules/orchestration/a2a/types.ts +125 -125
- package/server/modules/orchestration/a2a/validator.ts +113 -113
- package/server/modules/orchestration/index.ts +66 -66
- package/server/modules/orchestration/preview/port-watcher.ts +112 -112
- package/server/modules/orchestration/preview/preview-proxy.ts +60 -60
- package/server/modules/orchestration/preview/types.ts +19 -19
- package/server/modules/orchestration/tasks/orchestration-task-store.ts +45 -45
- package/server/modules/orchestration/tasks/orchestration-task.routes.ts +74 -73
- package/server/modules/orchestration/tasks/orchestration-task.service.ts +145 -145
- package/server/modules/orchestration/tasks/orchestration-task.types.ts +29 -29
- package/server/modules/orchestration/workflows/built-in-workflows.ts +127 -127
- package/server/modules/orchestration/workflows/workflow-runner.ts +1206 -1206
- package/server/modules/orchestration/workflows/workflow-store.ts +97 -97
- package/server/modules/orchestration/workflows/workflow.routes.ts +169 -169
- package/server/modules/orchestration/workflows/workflow.types.ts +70 -70
- package/server/modules/orchestration/workflows/workspace-target.ts +120 -120
- package/server/modules/orchestration/workspace/docker-workspace.ts +135 -135
- package/server/modules/orchestration/workspace/path-safety.ts +55 -55
- package/server/modules/orchestration/workspace/types.ts +52 -52
- package/server/modules/orchestration/workspace/workspace-manager.ts +97 -97
- package/server/modules/orchestration/workspace/worktree-workspace.ts +125 -125
- package/server/modules/providers/index.ts +2 -2
- package/server/modules/providers/list/claude/claude-auth.provider.ts +146 -145
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -135
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -306
- package/server/modules/providers/list/claude/claude.provider.ts +15 -15
- package/server/modules/providers/list/codex/codex-auth.provider.ts +116 -115
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -135
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -319
- package/server/modules/providers/list/codex/codex.provider.ts +15 -15
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -143
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -108
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -421
- package/server/modules/providers/list/cursor/cursor.provider.ts +15 -15
- package/server/modules/providers/list/gemini/gemini-auth.provider.ts +164 -163
- package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -110
- package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -227
- package/server/modules/providers/list/gemini/gemini.provider.ts +15 -15
- package/server/modules/providers/list/opencode/opencode-auth.provider.ts +131 -130
- package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +126 -126
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +232 -232
- package/server/modules/providers/list/opencode/opencode.provider.ts +29 -29
- package/server/modules/providers/list/qwen/qwen-auth.provider.ts +146 -145
- package/server/modules/providers/list/qwen/qwen-mcp.provider.ts +114 -114
- package/server/modules/providers/list/qwen/qwen-sessions.provider.ts +265 -265
- package/server/modules/providers/list/qwen/qwen.provider.ts +21 -21
- package/server/modules/providers/provider.registry.ts +40 -40
- package/server/modules/providers/provider.routes.ts +822 -819
- package/server/modules/providers/services/mcp.service.ts +86 -86
- package/server/modules/providers/services/provider-auth.service.ts +26 -26
- package/server/modules/providers/services/sessions.service.ts +45 -45
- package/server/modules/providers/shared/base/abstract.provider.ts +20 -20
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -151
- package/server/modules/providers/shared/provider-configs.ts +142 -142
- package/server/modules/providers/tests/mcp.test.ts +293 -293
- package/server/openai-codex.js +462 -462
- package/server/opencode-cli.js +460 -459
- package/server/opencode-response-handler.js +107 -107
- package/server/projects.js +3106 -3105
- package/server/qwen-code-cli.js +396 -395
- package/server/qwen-response-handler.js +73 -73
- package/server/routes/agent.js +1367 -1365
- package/server/routes/auth.js +139 -138
- package/server/routes/codex.js +20 -19
- package/server/routes/commands.js +556 -554
- package/server/routes/cursor.js +54 -52
- package/server/routes/gemini.js +25 -24
- package/server/routes/git.js +1490 -1488
- package/server/routes/mcp-utils.js +32 -31
- package/server/routes/messages.js +62 -61
- package/server/routes/network.js +121 -120
- package/server/routes/plugins.js +320 -318
- package/server/routes/projects.js +917 -915
- package/server/routes/qwen.js +27 -27
- package/server/routes/settings.js +287 -286
- package/server/routes/taskmaster.js +1498 -1496
- package/server/routes/telegram.js +125 -125
- package/server/routes/user.js +125 -123
- package/server/services/external-access.js +171 -171
- package/server/services/install-jobs.js +571 -571
- package/server/services/notification-orchestrator.js +244 -242
- package/server/services/provider-credentials.js +189 -189
- package/server/services/provider-models.js +381 -381
- package/server/services/telegram/bot.js +279 -279
- package/server/services/telegram/telegram-http-client.js +130 -130
- package/server/services/telegram/translations.js +170 -170
- package/server/services/vapid-keys.js +36 -36
- package/server/sessionManager.js +225 -225
- package/server/shared/interfaces.ts +54 -54
- package/server/shared/types.ts +172 -172
- package/server/shared/utils.ts +193 -193
- package/server/tsconfig.json +36 -36
- package/server/utils/colors.js +21 -21
- package/server/utils/commandParser.js +305 -303
- package/server/utils/frontmatter.js +18 -18
- package/server/utils/gitConfig.js +34 -34
- package/server/utils/mcp-detector.js +147 -147
- package/server/utils/plugin-loader.js +457 -457
- package/server/utils/plugin-process-manager.js +185 -184
- package/server/utils/port-access.js +209 -209
- package/server/utils/runtime-paths.js +37 -37
- package/server/utils/taskmaster-websocket.js +128 -128
- package/server/utils/url-detection.js +71 -71
- package/server/vite-daemon.js +79 -78
- package/shared/modelConstants.js +162 -162
- package/shared/networkHosts.js +22 -22
- package/dist/assets/index-B8w57E1r.css +0 -32
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TASKMASTER WEBSOCKET UTILITIES
|
|
3
|
-
* ==============================
|
|
4
|
-
*
|
|
5
|
-
* Utilities for broadcasting TaskMaster state changes via WebSocket.
|
|
6
|
-
* Integrates with the existing WebSocket system to provide real-time updates.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Broadcast TaskMaster project update to all connected clients
|
|
11
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
12
|
-
* @param {string} projectName - Name of the updated project
|
|
13
|
-
* @param {Object} taskMasterData - Updated TaskMaster data
|
|
14
|
-
*/
|
|
15
|
-
export function broadcastTaskMasterProjectUpdate(wss, projectName, taskMasterData) {
|
|
16
|
-
if (!wss || !projectName) {
|
|
17
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectName');
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const message = {
|
|
22
|
-
type: 'taskmaster-project-updated',
|
|
23
|
-
projectName,
|
|
24
|
-
taskMasterData,
|
|
25
|
-
timestamp: new Date().toISOString()
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
wss.clients.forEach((client) => {
|
|
30
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
31
|
-
try {
|
|
32
|
-
client.send(JSON.stringify(message));
|
|
33
|
-
} catch (error) {
|
|
34
|
-
console.error('Error sending TaskMaster project update:', error);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Broadcast TaskMaster tasks update for a specific project
|
|
42
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
43
|
-
* @param {string} projectName - Name of the project with updated tasks
|
|
44
|
-
* @param {Object} tasksData - Updated tasks data
|
|
45
|
-
*/
|
|
46
|
-
export function broadcastTaskMasterTasksUpdate(wss, projectName, tasksData) {
|
|
47
|
-
if (!wss || !projectName) {
|
|
48
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectName');
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const message = {
|
|
53
|
-
type: 'taskmaster-tasks-updated',
|
|
54
|
-
projectName,
|
|
55
|
-
tasksData,
|
|
56
|
-
timestamp: new Date().toISOString()
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
wss.clients.forEach((client) => {
|
|
61
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
62
|
-
try {
|
|
63
|
-
client.send(JSON.stringify(message));
|
|
64
|
-
} catch (error) {
|
|
65
|
-
console.error('Error sending TaskMaster tasks update:', error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Broadcast MCP server status change
|
|
73
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
74
|
-
* @param {Object} mcpStatus - Updated MCP server status
|
|
75
|
-
*/
|
|
76
|
-
export function broadcastMCPStatusChange(wss, mcpStatus) {
|
|
77
|
-
if (!wss) {
|
|
78
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss');
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const message = {
|
|
83
|
-
type: 'taskmaster-mcp-status-changed',
|
|
84
|
-
mcpStatus,
|
|
85
|
-
timestamp: new Date().toISOString()
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
wss.clients.forEach((client) => {
|
|
90
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
91
|
-
try {
|
|
92
|
-
client.send(JSON.stringify(message));
|
|
93
|
-
} catch (error) {
|
|
94
|
-
console.error('Error sending TaskMaster MCP status update:', error);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Broadcast general TaskMaster update notification
|
|
102
|
-
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
103
|
-
* @param {string} updateType - Type of update (e.g., 'initialization', 'configuration')
|
|
104
|
-
* @param {Object} data - Additional data about the update
|
|
105
|
-
*/
|
|
106
|
-
export function broadcastTaskMasterUpdate(wss, updateType, data = {}) {
|
|
107
|
-
if (!wss || !updateType) {
|
|
108
|
-
console.warn('TaskMaster WebSocket broadcast: Missing wss or updateType');
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const message = {
|
|
113
|
-
type: 'taskmaster-update',
|
|
114
|
-
updateType,
|
|
115
|
-
data,
|
|
116
|
-
timestamp: new Date().toISOString()
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
wss.clients.forEach((client) => {
|
|
121
|
-
if (client.readyState === 1) { // WebSocket.OPEN
|
|
122
|
-
try {
|
|
123
|
-
client.send(JSON.stringify(message));
|
|
124
|
-
} catch (error) {
|
|
125
|
-
console.error('Error sending TaskMaster update:', error);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* TASKMASTER WEBSOCKET UTILITIES
|
|
3
|
+
* ==============================
|
|
4
|
+
*
|
|
5
|
+
* Utilities for broadcasting TaskMaster state changes via WebSocket.
|
|
6
|
+
* Integrates with the existing WebSocket system to provide real-time updates.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Broadcast TaskMaster project update to all connected clients
|
|
11
|
+
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
12
|
+
* @param {string} projectName - Name of the updated project
|
|
13
|
+
* @param {Object} taskMasterData - Updated TaskMaster data
|
|
14
|
+
*/
|
|
15
|
+
export function broadcastTaskMasterProjectUpdate(wss, projectName, taskMasterData) {
|
|
16
|
+
if (!wss || !projectName) {
|
|
17
|
+
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectName');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const message = {
|
|
22
|
+
type: 'taskmaster-project-updated',
|
|
23
|
+
projectName,
|
|
24
|
+
taskMasterData,
|
|
25
|
+
timestamp: new Date().toISOString()
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
wss.clients.forEach((client) => {
|
|
30
|
+
if (client.readyState === 1) { // WebSocket.OPEN
|
|
31
|
+
try {
|
|
32
|
+
client.send(JSON.stringify(message));
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error('Error sending TaskMaster project update:', error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Broadcast TaskMaster tasks update for a specific project
|
|
42
|
+
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
43
|
+
* @param {string} projectName - Name of the project with updated tasks
|
|
44
|
+
* @param {Object} tasksData - Updated tasks data
|
|
45
|
+
*/
|
|
46
|
+
export function broadcastTaskMasterTasksUpdate(wss, projectName, tasksData) {
|
|
47
|
+
if (!wss || !projectName) {
|
|
48
|
+
console.warn('TaskMaster WebSocket broadcast: Missing wss or projectName');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const message = {
|
|
53
|
+
type: 'taskmaster-tasks-updated',
|
|
54
|
+
projectName,
|
|
55
|
+
tasksData,
|
|
56
|
+
timestamp: new Date().toISOString()
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
wss.clients.forEach((client) => {
|
|
61
|
+
if (client.readyState === 1) { // WebSocket.OPEN
|
|
62
|
+
try {
|
|
63
|
+
client.send(JSON.stringify(message));
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error('Error sending TaskMaster tasks update:', error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Broadcast MCP server status change
|
|
73
|
+
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
74
|
+
* @param {Object} mcpStatus - Updated MCP server status
|
|
75
|
+
*/
|
|
76
|
+
export function broadcastMCPStatusChange(wss, mcpStatus) {
|
|
77
|
+
if (!wss) {
|
|
78
|
+
console.warn('TaskMaster WebSocket broadcast: Missing wss');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const message = {
|
|
83
|
+
type: 'taskmaster-mcp-status-changed',
|
|
84
|
+
mcpStatus,
|
|
85
|
+
timestamp: new Date().toISOString()
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
wss.clients.forEach((client) => {
|
|
90
|
+
if (client.readyState === 1) { // WebSocket.OPEN
|
|
91
|
+
try {
|
|
92
|
+
client.send(JSON.stringify(message));
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('Error sending TaskMaster MCP status update:', error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Broadcast general TaskMaster update notification
|
|
102
|
+
* @param {WebSocket.Server} wss - WebSocket server instance
|
|
103
|
+
* @param {string} updateType - Type of update (e.g., 'initialization', 'configuration')
|
|
104
|
+
* @param {Object} data - Additional data about the update
|
|
105
|
+
*/
|
|
106
|
+
export function broadcastTaskMasterUpdate(wss, updateType, data = {}) {
|
|
107
|
+
if (!wss || !updateType) {
|
|
108
|
+
console.warn('TaskMaster WebSocket broadcast: Missing wss or updateType');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const message = {
|
|
113
|
+
type: 'taskmaster-update',
|
|
114
|
+
updateType,
|
|
115
|
+
data,
|
|
116
|
+
timestamp: new Date().toISOString()
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
wss.clients.forEach((client) => {
|
|
121
|
+
if (client.readyState === 1) { // WebSocket.OPEN
|
|
122
|
+
try {
|
|
123
|
+
client.send(JSON.stringify(message));
|
|
124
|
+
} catch (error) {
|
|
125
|
+
console.error('Error sending TaskMaster update:', error);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
129
|
}
|
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
const ANSI_ESCAPE_SEQUENCE_REGEX = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1B\\))/g;
|
|
2
|
-
const TRAILING_URL_PUNCTUATION_REGEX = /[)\]}>.,;:!?]+$/;
|
|
3
|
-
|
|
4
|
-
function stripAnsiSequences(value = '') {
|
|
5
|
-
return value.replace(ANSI_ESCAPE_SEQUENCE_REGEX, '');
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function normalizeDetectedUrl(url) {
|
|
9
|
-
if (!url || typeof url !== 'string') return null;
|
|
10
|
-
|
|
11
|
-
const cleaned = url.trim().replace(TRAILING_URL_PUNCTUATION_REGEX, '');
|
|
12
|
-
if (!cleaned) return null;
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
const parsed = new URL(cleaned);
|
|
16
|
-
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
return parsed.toString();
|
|
20
|
-
} catch {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function extractUrlsFromText(value = '') {
|
|
26
|
-
const directMatches = value.match(/https?:\/\/[^\s<>"'`\\\x1b\x07]+/gi) || [];
|
|
27
|
-
|
|
28
|
-
// Handle wrapped terminal URLs split across lines by terminal width.
|
|
29
|
-
const wrappedMatches = [];
|
|
30
|
-
const continuationRegex = /^[A-Za-z0-9\-._~:/?#\[\]@!$&'()*+,;=%]+$/;
|
|
31
|
-
const lines = value.split(/\r?\n/);
|
|
32
|
-
for (let i = 0; i < lines.length; i++) {
|
|
33
|
-
const line = lines[i].trim();
|
|
34
|
-
const startMatch = line.match(/https?:\/\/[^\s<>"'`\\\x1b\x07]+/i);
|
|
35
|
-
if (!startMatch) continue;
|
|
36
|
-
|
|
37
|
-
let combined = startMatch[0];
|
|
38
|
-
let j = i + 1;
|
|
39
|
-
while (j < lines.length) {
|
|
40
|
-
const continuation = lines[j].trim();
|
|
41
|
-
if (!continuation) break;
|
|
42
|
-
if (!continuationRegex.test(continuation)) break;
|
|
43
|
-
combined += continuation;
|
|
44
|
-
j++;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
wrappedMatches.push(combined.replace(/\r?\n\s*/g, ''));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return Array.from(new Set([...directMatches, ...wrappedMatches]));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function shouldAutoOpenUrlFromOutput(value = '') {
|
|
54
|
-
const normalized = value.toLowerCase();
|
|
55
|
-
return (
|
|
56
|
-
normalized.includes('browser didn\'t open') ||
|
|
57
|
-
normalized.includes('open this url') ||
|
|
58
|
-
normalized.includes('continue in your browser') ||
|
|
59
|
-
normalized.includes('press enter to open') ||
|
|
60
|
-
normalized.includes('open_url:')
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export {
|
|
65
|
-
ANSI_ESCAPE_SEQUENCE_REGEX,
|
|
66
|
-
TRAILING_URL_PUNCTUATION_REGEX,
|
|
67
|
-
stripAnsiSequences,
|
|
68
|
-
normalizeDetectedUrl,
|
|
69
|
-
extractUrlsFromText,
|
|
70
|
-
shouldAutoOpenUrlFromOutput
|
|
71
|
-
};
|
|
1
|
+
const ANSI_ESCAPE_SEQUENCE_REGEX = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1B\\))/g;
|
|
2
|
+
const TRAILING_URL_PUNCTUATION_REGEX = /[)\]}>.,;:!?]+$/;
|
|
3
|
+
|
|
4
|
+
function stripAnsiSequences(value = '') {
|
|
5
|
+
return value.replace(ANSI_ESCAPE_SEQUENCE_REGEX, '');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function normalizeDetectedUrl(url) {
|
|
9
|
+
if (!url || typeof url !== 'string') return null;
|
|
10
|
+
|
|
11
|
+
const cleaned = url.trim().replace(TRAILING_URL_PUNCTUATION_REGEX, '');
|
|
12
|
+
if (!cleaned) return null;
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const parsed = new URL(cleaned);
|
|
16
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return parsed.toString();
|
|
20
|
+
} catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function extractUrlsFromText(value = '') {
|
|
26
|
+
const directMatches = value.match(/https?:\/\/[^\s<>"'`\\\x1b\x07]+/gi) || [];
|
|
27
|
+
|
|
28
|
+
// Handle wrapped terminal URLs split across lines by terminal width.
|
|
29
|
+
const wrappedMatches = [];
|
|
30
|
+
const continuationRegex = /^[A-Za-z0-9\-._~:/?#\[\]@!$&'()*+,;=%]+$/;
|
|
31
|
+
const lines = value.split(/\r?\n/);
|
|
32
|
+
for (let i = 0; i < lines.length; i++) {
|
|
33
|
+
const line = lines[i].trim();
|
|
34
|
+
const startMatch = line.match(/https?:\/\/[^\s<>"'`\\\x1b\x07]+/i);
|
|
35
|
+
if (!startMatch) continue;
|
|
36
|
+
|
|
37
|
+
let combined = startMatch[0];
|
|
38
|
+
let j = i + 1;
|
|
39
|
+
while (j < lines.length) {
|
|
40
|
+
const continuation = lines[j].trim();
|
|
41
|
+
if (!continuation) break;
|
|
42
|
+
if (!continuationRegex.test(continuation)) break;
|
|
43
|
+
combined += continuation;
|
|
44
|
+
j++;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
wrappedMatches.push(combined.replace(/\r?\n\s*/g, ''));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return Array.from(new Set([...directMatches, ...wrappedMatches]));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function shouldAutoOpenUrlFromOutput(value = '') {
|
|
54
|
+
const normalized = value.toLowerCase();
|
|
55
|
+
return (
|
|
56
|
+
normalized.includes('browser didn\'t open') ||
|
|
57
|
+
normalized.includes('open this url') ||
|
|
58
|
+
normalized.includes('continue in your browser') ||
|
|
59
|
+
normalized.includes('press enter to open') ||
|
|
60
|
+
normalized.includes('open_url:')
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
ANSI_ESCAPE_SEQUENCE_REGEX,
|
|
66
|
+
TRAILING_URL_PUNCTUATION_REGEX,
|
|
67
|
+
stripAnsiSequences,
|
|
68
|
+
normalizeDetectedUrl,
|
|
69
|
+
extractUrlsFromText,
|
|
70
|
+
shouldAutoOpenUrlFromOutput
|
|
71
|
+
};
|
package/server/vite-daemon.js
CHANGED
|
@@ -1,78 +1,79 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import process from 'node:process';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
server.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import process from 'node:process';
|
|
4
|
+
|
|
5
|
+
import { createServer } from 'vite';
|
|
6
|
+
|
|
7
|
+
const DEFAULT_PORT = 5173;
|
|
8
|
+
const DEFAULT_HOST = '0.0.0.0';
|
|
9
|
+
|
|
10
|
+
function parseArgs(argv) {
|
|
11
|
+
const parsed = {
|
|
12
|
+
host: process.env.VITE_HOST || process.env.HOST || DEFAULT_HOST,
|
|
13
|
+
port: Number(process.env.VITE_PORT || DEFAULT_PORT),
|
|
14
|
+
strictPort: true,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
for (let i = 0; i < argv.length; i++) {
|
|
18
|
+
const arg = argv[i];
|
|
19
|
+
if (arg === '--host') {
|
|
20
|
+
parsed.host = argv[++i];
|
|
21
|
+
} else if (arg.startsWith('--host=')) {
|
|
22
|
+
parsed.host = arg.split('=')[1];
|
|
23
|
+
} else if (arg === '--port' || arg === '-p') {
|
|
24
|
+
parsed.port = Number(argv[++i]);
|
|
25
|
+
} else if (arg.startsWith('--port=')) {
|
|
26
|
+
parsed.port = Number(arg.split('=')[1]);
|
|
27
|
+
} else if (arg === '--strictPort') {
|
|
28
|
+
parsed.strictPort = true;
|
|
29
|
+
} else if (arg === '--no-strictPort') {
|
|
30
|
+
parsed.strictPort = false;
|
|
31
|
+
} else if (arg === '--help' || arg === '-h') {
|
|
32
|
+
console.log('Usage: node server/vite-daemon.js [--host 0.0.0.0] [--port 5173] [--strictPort]');
|
|
33
|
+
process.exit(0);
|
|
34
|
+
} else {
|
|
35
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!Number.isInteger(parsed.port) || parsed.port < 1 || parsed.port > 65535) {
|
|
40
|
+
throw new Error(`Invalid port "${parsed.port}". Expected an integer between 1 and 65535.`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function main() {
|
|
47
|
+
const options = parseArgs(process.argv.slice(2));
|
|
48
|
+
const server = await createServer({
|
|
49
|
+
root: process.cwd(),
|
|
50
|
+
server: {
|
|
51
|
+
host: options.host,
|
|
52
|
+
port: options.port,
|
|
53
|
+
strictPort: options.strictPort,
|
|
54
|
+
},
|
|
55
|
+
clearScreen: false,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await server.listen();
|
|
59
|
+
server.printUrls();
|
|
60
|
+
|
|
61
|
+
const shutdown = async (signal) => {
|
|
62
|
+
console.log(`[INFO] Frontend daemon received ${signal}, shutting down...`);
|
|
63
|
+
await server.close();
|
|
64
|
+
process.exit(0);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
process.once('SIGTERM', () => {
|
|
68
|
+
void shutdown('SIGTERM');
|
|
69
|
+
});
|
|
70
|
+
process.once('SIGINT', () => {
|
|
71
|
+
void shutdown('SIGINT');
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
main().catch((error) => {
|
|
76
|
+
const message = error?.stack || error?.message || String(error);
|
|
77
|
+
console.error(`[ERROR] Frontend daemon failed to start: ${message}`);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
});
|