@pixelbyte-software/pixcode 1.33.2 → 1.33.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/dist/assets/{index-CqqsWXRO.js → index-D0qriZVb.js} +169 -169
- package/dist/assets/{index-NTwX-xc2.css → index-cWbTlXsr.css} +1 -1
- package/dist/index.html +2 -2
- package/dist-server/server/index.js +13 -1
- package/dist-server/server/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +14 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +2 -1
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/opencode-cli.js +360 -0
- package/dist-server/server/opencode-cli.js.map +1 -0
- package/dist-server/server/opencode-response-handler.js +95 -0
- package/dist-server/server/opencode-response-handler.js.map +1 -0
- package/package.json +178 -178
- package/server/index.js +10 -1
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +10 -1
- package/server/modules/providers/provider.routes.ts +2 -1
- package/server/opencode-cli.js +403 -0
- package/server/opencode-response-handler.js +92 -0
package/package.json
CHANGED
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@pixelbyte-software/pixcode",
|
|
3
|
-
"version": "1.33.
|
|
4
|
-
"description": "Pixcode — a desktop and mobile web UI for Claude Code, Cursor CLI, Codex, Gemini CLI, Qwen Code, and OpenCode.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist-server/server/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"pixcode": "dist-server/server/cli.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"server/",
|
|
12
|
-
"shared/",
|
|
13
|
-
"dist/",
|
|
14
|
-
"dist-server/",
|
|
15
|
-
"scripts/",
|
|
16
|
-
"README.md"
|
|
17
|
-
],
|
|
18
|
-
"homepage": "https://github.com/alicomert/pixcode",
|
|
19
|
-
"repository": {
|
|
20
|
-
"type": "git",
|
|
21
|
-
"url": "git+https://github.com/alicomert/pixcode.git"
|
|
22
|
-
},
|
|
23
|
-
"bugs": {
|
|
24
|
-
"url": "https://github.com/alicomert/pixcode/issues"
|
|
25
|
-
},
|
|
26
|
-
"publishConfig": {
|
|
27
|
-
"access": "public"
|
|
28
|
-
},
|
|
29
|
-
"scripts": {
|
|
30
|
-
"dev": "npm run server:dev",
|
|
31
|
-
"server": "node dist-server/server/cli.js start",
|
|
32
|
-
"server:dev": "node server/cli.js daemon install --mode system --port 3001 --frontend-port 5173",
|
|
33
|
-
"server:dev-watch": "node server/cli.js daemon restart --mode system --port 3001 --frontend-port 5173",
|
|
34
|
-
"client": "vite",
|
|
35
|
-
"build": "npm run build:client && npm run build:server",
|
|
36
|
-
"build:client": "vite build",
|
|
37
|
-
"prebuild:server": "node -e \"require('node:fs').rmSync('dist-server', { recursive: true, force: true })\"",
|
|
38
|
-
"build:server": "tsc -p server/tsconfig.json && tsc-alias -p server/tsconfig.json",
|
|
39
|
-
"preview": "vite preview",
|
|
40
|
-
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p server/tsconfig.json",
|
|
41
|
-
"lint": "eslint src/ server/",
|
|
42
|
-
"lint:fix": "eslint src/ server/ --fix",
|
|
43
|
-
"start": "npm run build && npm run server",
|
|
44
|
-
"release": "./release.sh",
|
|
45
|
-
"prepublishOnly": "npm run build",
|
|
46
|
-
"postinstall": "node scripts/fix-node-pty.js",
|
|
47
|
-
"prepare": "husky",
|
|
48
|
-
"update:platform": "./update-platform.sh"
|
|
49
|
-
},
|
|
50
|
-
"keywords": [
|
|
51
|
-
"claude code",
|
|
52
|
-
"claude-code",
|
|
53
|
-
"pixcode",
|
|
54
|
-
"codex",
|
|
55
|
-
"gemini",
|
|
56
|
-
"gemini-cli",
|
|
57
|
-
"cursor",
|
|
58
|
-
"cursor-cli",
|
|
59
|
-
"opencode",
|
|
60
|
-
"opencode-cli",
|
|
61
|
-
"anthropic",
|
|
62
|
-
"openai",
|
|
63
|
-
"google",
|
|
64
|
-
"coding-agent",
|
|
65
|
-
"web-ui",
|
|
66
|
-
"ui",
|
|
67
|
-
"mobile IDE"
|
|
68
|
-
],
|
|
69
|
-
"author": "Pixcode Contributors",
|
|
70
|
-
"license": "AGPL-3.0-or-later",
|
|
71
|
-
"dependencies": {
|
|
72
|
-
"@anthropic-ai/claude-agent-sdk": "^0.2.116",
|
|
73
|
-
"@iarna/toml": "^2.2.5",
|
|
74
|
-
"@octokit/rest": "^22.0.0",
|
|
75
|
-
"@openai/codex-sdk": "^0.101.0",
|
|
76
|
-
"bcryptjs": "^3.0.3",
|
|
77
|
-
"better-sqlite3": "^12.6.2",
|
|
78
|
-
"chokidar": "^4.0.3",
|
|
79
|
-
"cors": "^2.8.5",
|
|
80
|
-
"cross-spawn": "^7.0.3",
|
|
81
|
-
"express": "^4.18.2",
|
|
82
|
-
"gray-matter": "^4.0.3",
|
|
83
|
-
"jsonwebtoken": "^9.0.2",
|
|
84
|
-
"mime-types": "^3.0.1",
|
|
85
|
-
"multer": "^2.0.1",
|
|
86
|
-
"node-fetch": "^2.7.0",
|
|
87
|
-
"node-pty": "^1.2.0-beta.12",
|
|
88
|
-
"tar": "^7.5.13",
|
|
89
|
-
"web-push": "^3.6.7",
|
|
90
|
-
"ws": "^8.14.2"
|
|
91
|
-
},
|
|
92
|
-
"devDependencies": {
|
|
93
|
-
"@codemirror/lang-css": "^6.3.1",
|
|
94
|
-
"@codemirror/lang-html": "^6.4.9",
|
|
95
|
-
"@codemirror/lang-javascript": "^6.2.4",
|
|
96
|
-
"@codemirror/lang-json": "^6.0.1",
|
|
97
|
-
"@codemirror/lang-markdown": "^6.3.3",
|
|
98
|
-
"@codemirror/lang-python": "^6.2.1",
|
|
99
|
-
"@codemirror/merge": "^6.11.1",
|
|
100
|
-
"@codemirror/theme-one-dark": "^6.1.2",
|
|
101
|
-
"@commitlint/cli": "^20.5.0",
|
|
102
|
-
"@commitlint/config-conventional": "^20.5.0",
|
|
103
|
-
"@eslint/js": "^9.39.3",
|
|
104
|
-
"@heroicons/react": "^2.2.0",
|
|
105
|
-
"@release-it/conventional-changelog": "^10.0.5",
|
|
106
|
-
"@replit/codemirror-minimap": "^0.5.2",
|
|
107
|
-
"@tailwindcss/typography": "^0.5.16",
|
|
108
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
109
|
-
"@types/cross-spawn": "^6.0.6",
|
|
110
|
-
"@types/express": "^5.0.6",
|
|
111
|
-
"@types/node": "^22.19.7",
|
|
112
|
-
"@types/qrcode": "^1.5.6",
|
|
113
|
-
"@types/react": "^18.2.43",
|
|
114
|
-
"@types/react-dom": "^18.2.17",
|
|
115
|
-
"@uiw/react-codemirror": "^4.23.13",
|
|
116
|
-
"@vitejs/plugin-react": "^4.6.0",
|
|
117
|
-
"@xterm/addon-clipboard": "^0.1.0",
|
|
118
|
-
"@xterm/addon-fit": "^0.10.0",
|
|
119
|
-
"@xterm/addon-web-links": "^0.11.0",
|
|
120
|
-
"@xterm/addon-webgl": "^0.18.0",
|
|
121
|
-
"@xterm/xterm": "^5.5.0",
|
|
122
|
-
"auto-changelog": "^2.5.0",
|
|
123
|
-
"autoprefixer": "^10.4.16",
|
|
124
|
-
"class-variance-authority": "^0.7.1",
|
|
125
|
-
"clsx": "^2.1.1",
|
|
126
|
-
"concurrently": "^8.2.2",
|
|
127
|
-
"eslint": "^9.39.3",
|
|
128
|
-
"eslint-import-resolver-typescript": "^4.4.4",
|
|
129
|
-
"eslint-plugin-boundaries": "^6.0.2",
|
|
130
|
-
"eslint-plugin-import-x": "^4.16.1",
|
|
131
|
-
"eslint-plugin-react": "^7.37.5",
|
|
132
|
-
"eslint-plugin-react-hooks": "^7.0.1",
|
|
133
|
-
"eslint-plugin-react-refresh": "^0.5.2",
|
|
134
|
-
"eslint-plugin-tailwindcss": "^3.18.2",
|
|
135
|
-
"eslint-plugin-unused-imports": "^4.4.1",
|
|
136
|
-
"fuse.js": "^7.0.0",
|
|
137
|
-
"globals": "^17.4.0",
|
|
138
|
-
"gsap": "^3.12.5",
|
|
139
|
-
"husky": "^9.1.7",
|
|
140
|
-
"i18next": "^25.7.4",
|
|
141
|
-
"i18next-browser-languagedetector": "^8.2.0",
|
|
142
|
-
"jszip": "^3.10.1",
|
|
143
|
-
"katex": "^0.16.25",
|
|
144
|
-
"lint-staged": "^16.3.2",
|
|
145
|
-
"lucide-react": "^0.515.0",
|
|
146
|
-
"node-gyp": "^12.0.0",
|
|
147
|
-
"postcss": "^8.4.32",
|
|
148
|
-
"qrcode": "^1.5.4",
|
|
149
|
-
"react": "^18.2.0",
|
|
150
|
-
"react-dom": "^18.2.0",
|
|
151
|
-
"react-dropzone": "^14.2.3",
|
|
152
|
-
"react-error-boundary": "^4.1.2",
|
|
153
|
-
"react-i18next": "^16.5.3",
|
|
154
|
-
"react-markdown": "^10.1.0",
|
|
155
|
-
"react-router-dom": "^6.8.1",
|
|
156
|
-
"react-syntax-highlighter": "^16.1.1",
|
|
157
|
-
"rehype-katex": "^7.0.1",
|
|
158
|
-
"rehype-raw": "^7.0.0",
|
|
159
|
-
"release-it": "^19.0.5",
|
|
160
|
-
"remark-gfm": "^4.0.0",
|
|
161
|
-
"remark-math": "^6.0.0",
|
|
162
|
-
"sharp": "^0.34.2",
|
|
163
|
-
"tailwind-merge": "^3.3.1",
|
|
164
|
-
"tailwindcss": "^3.4.0",
|
|
165
|
-
"tsc-alias": "^1.8.16",
|
|
166
|
-
"tsx": "^4.21.0",
|
|
167
|
-
"typescript": "^5.9.3",
|
|
168
|
-
"typescript-eslint": "^8.56.1",
|
|
169
|
-
"vite": "^7.0.4"
|
|
170
|
-
},
|
|
171
|
-
"lint-staged": {
|
|
172
|
-
"src/**/*.{ts,tsx,js,jsx}": "eslint",
|
|
173
|
-
"server/**/*.{js,ts}": "eslint"
|
|
174
|
-
},
|
|
175
|
-
"overrides": {
|
|
176
|
-
"undici": ">=6.23.1"
|
|
177
|
-
}
|
|
178
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@pixelbyte-software/pixcode",
|
|
3
|
+
"version": "1.33.4",
|
|
4
|
+
"description": "Pixcode — a desktop and mobile web UI for Claude Code, Cursor CLI, Codex, Gemini CLI, Qwen Code, and OpenCode.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist-server/server/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"pixcode": "dist-server/server/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"server/",
|
|
12
|
+
"shared/",
|
|
13
|
+
"dist/",
|
|
14
|
+
"dist-server/",
|
|
15
|
+
"scripts/",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"homepage": "https://github.com/alicomert/pixcode",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/alicomert/pixcode.git"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/alicomert/pixcode/issues"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"dev": "npm run server:dev",
|
|
31
|
+
"server": "node dist-server/server/cli.js start",
|
|
32
|
+
"server:dev": "node server/cli.js daemon install --mode system --port 3001 --frontend-port 5173",
|
|
33
|
+
"server:dev-watch": "node server/cli.js daemon restart --mode system --port 3001 --frontend-port 5173",
|
|
34
|
+
"client": "vite",
|
|
35
|
+
"build": "npm run build:client && npm run build:server",
|
|
36
|
+
"build:client": "vite build",
|
|
37
|
+
"prebuild:server": "node -e \"require('node:fs').rmSync('dist-server', { recursive: true, force: true })\"",
|
|
38
|
+
"build:server": "tsc -p server/tsconfig.json && tsc-alias -p server/tsconfig.json",
|
|
39
|
+
"preview": "vite preview",
|
|
40
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p server/tsconfig.json",
|
|
41
|
+
"lint": "eslint src/ server/",
|
|
42
|
+
"lint:fix": "eslint src/ server/ --fix",
|
|
43
|
+
"start": "npm run build && npm run server",
|
|
44
|
+
"release": "./release.sh",
|
|
45
|
+
"prepublishOnly": "npm run build",
|
|
46
|
+
"postinstall": "node scripts/fix-node-pty.js",
|
|
47
|
+
"prepare": "husky",
|
|
48
|
+
"update:platform": "./update-platform.sh"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"claude code",
|
|
52
|
+
"claude-code",
|
|
53
|
+
"pixcode",
|
|
54
|
+
"codex",
|
|
55
|
+
"gemini",
|
|
56
|
+
"gemini-cli",
|
|
57
|
+
"cursor",
|
|
58
|
+
"cursor-cli",
|
|
59
|
+
"opencode",
|
|
60
|
+
"opencode-cli",
|
|
61
|
+
"anthropic",
|
|
62
|
+
"openai",
|
|
63
|
+
"google",
|
|
64
|
+
"coding-agent",
|
|
65
|
+
"web-ui",
|
|
66
|
+
"ui",
|
|
67
|
+
"mobile IDE"
|
|
68
|
+
],
|
|
69
|
+
"author": "Pixcode Contributors",
|
|
70
|
+
"license": "AGPL-3.0-or-later",
|
|
71
|
+
"dependencies": {
|
|
72
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.116",
|
|
73
|
+
"@iarna/toml": "^2.2.5",
|
|
74
|
+
"@octokit/rest": "^22.0.0",
|
|
75
|
+
"@openai/codex-sdk": "^0.101.0",
|
|
76
|
+
"bcryptjs": "^3.0.3",
|
|
77
|
+
"better-sqlite3": "^12.6.2",
|
|
78
|
+
"chokidar": "^4.0.3",
|
|
79
|
+
"cors": "^2.8.5",
|
|
80
|
+
"cross-spawn": "^7.0.3",
|
|
81
|
+
"express": "^4.18.2",
|
|
82
|
+
"gray-matter": "^4.0.3",
|
|
83
|
+
"jsonwebtoken": "^9.0.2",
|
|
84
|
+
"mime-types": "^3.0.1",
|
|
85
|
+
"multer": "^2.0.1",
|
|
86
|
+
"node-fetch": "^2.7.0",
|
|
87
|
+
"node-pty": "^1.2.0-beta.12",
|
|
88
|
+
"tar": "^7.5.13",
|
|
89
|
+
"web-push": "^3.6.7",
|
|
90
|
+
"ws": "^8.14.2"
|
|
91
|
+
},
|
|
92
|
+
"devDependencies": {
|
|
93
|
+
"@codemirror/lang-css": "^6.3.1",
|
|
94
|
+
"@codemirror/lang-html": "^6.4.9",
|
|
95
|
+
"@codemirror/lang-javascript": "^6.2.4",
|
|
96
|
+
"@codemirror/lang-json": "^6.0.1",
|
|
97
|
+
"@codemirror/lang-markdown": "^6.3.3",
|
|
98
|
+
"@codemirror/lang-python": "^6.2.1",
|
|
99
|
+
"@codemirror/merge": "^6.11.1",
|
|
100
|
+
"@codemirror/theme-one-dark": "^6.1.2",
|
|
101
|
+
"@commitlint/cli": "^20.5.0",
|
|
102
|
+
"@commitlint/config-conventional": "^20.5.0",
|
|
103
|
+
"@eslint/js": "^9.39.3",
|
|
104
|
+
"@heroicons/react": "^2.2.0",
|
|
105
|
+
"@release-it/conventional-changelog": "^10.0.5",
|
|
106
|
+
"@replit/codemirror-minimap": "^0.5.2",
|
|
107
|
+
"@tailwindcss/typography": "^0.5.16",
|
|
108
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
109
|
+
"@types/cross-spawn": "^6.0.6",
|
|
110
|
+
"@types/express": "^5.0.6",
|
|
111
|
+
"@types/node": "^22.19.7",
|
|
112
|
+
"@types/qrcode": "^1.5.6",
|
|
113
|
+
"@types/react": "^18.2.43",
|
|
114
|
+
"@types/react-dom": "^18.2.17",
|
|
115
|
+
"@uiw/react-codemirror": "^4.23.13",
|
|
116
|
+
"@vitejs/plugin-react": "^4.6.0",
|
|
117
|
+
"@xterm/addon-clipboard": "^0.1.0",
|
|
118
|
+
"@xterm/addon-fit": "^0.10.0",
|
|
119
|
+
"@xterm/addon-web-links": "^0.11.0",
|
|
120
|
+
"@xterm/addon-webgl": "^0.18.0",
|
|
121
|
+
"@xterm/xterm": "^5.5.0",
|
|
122
|
+
"auto-changelog": "^2.5.0",
|
|
123
|
+
"autoprefixer": "^10.4.16",
|
|
124
|
+
"class-variance-authority": "^0.7.1",
|
|
125
|
+
"clsx": "^2.1.1",
|
|
126
|
+
"concurrently": "^8.2.2",
|
|
127
|
+
"eslint": "^9.39.3",
|
|
128
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
129
|
+
"eslint-plugin-boundaries": "^6.0.2",
|
|
130
|
+
"eslint-plugin-import-x": "^4.16.1",
|
|
131
|
+
"eslint-plugin-react": "^7.37.5",
|
|
132
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
133
|
+
"eslint-plugin-react-refresh": "^0.5.2",
|
|
134
|
+
"eslint-plugin-tailwindcss": "^3.18.2",
|
|
135
|
+
"eslint-plugin-unused-imports": "^4.4.1",
|
|
136
|
+
"fuse.js": "^7.0.0",
|
|
137
|
+
"globals": "^17.4.0",
|
|
138
|
+
"gsap": "^3.12.5",
|
|
139
|
+
"husky": "^9.1.7",
|
|
140
|
+
"i18next": "^25.7.4",
|
|
141
|
+
"i18next-browser-languagedetector": "^8.2.0",
|
|
142
|
+
"jszip": "^3.10.1",
|
|
143
|
+
"katex": "^0.16.25",
|
|
144
|
+
"lint-staged": "^16.3.2",
|
|
145
|
+
"lucide-react": "^0.515.0",
|
|
146
|
+
"node-gyp": "^12.0.0",
|
|
147
|
+
"postcss": "^8.4.32",
|
|
148
|
+
"qrcode": "^1.5.4",
|
|
149
|
+
"react": "^18.2.0",
|
|
150
|
+
"react-dom": "^18.2.0",
|
|
151
|
+
"react-dropzone": "^14.2.3",
|
|
152
|
+
"react-error-boundary": "^4.1.2",
|
|
153
|
+
"react-i18next": "^16.5.3",
|
|
154
|
+
"react-markdown": "^10.1.0",
|
|
155
|
+
"react-router-dom": "^6.8.1",
|
|
156
|
+
"react-syntax-highlighter": "^16.1.1",
|
|
157
|
+
"rehype-katex": "^7.0.1",
|
|
158
|
+
"rehype-raw": "^7.0.0",
|
|
159
|
+
"release-it": "^19.0.5",
|
|
160
|
+
"remark-gfm": "^4.0.0",
|
|
161
|
+
"remark-math": "^6.0.0",
|
|
162
|
+
"sharp": "^0.34.2",
|
|
163
|
+
"tailwind-merge": "^3.3.1",
|
|
164
|
+
"tailwindcss": "^3.4.0",
|
|
165
|
+
"tsc-alias": "^1.8.16",
|
|
166
|
+
"tsx": "^4.21.0",
|
|
167
|
+
"typescript": "^5.9.3",
|
|
168
|
+
"typescript-eslint": "^8.56.1",
|
|
169
|
+
"vite": "^7.0.4"
|
|
170
|
+
},
|
|
171
|
+
"lint-staged": {
|
|
172
|
+
"src/**/*.{ts,tsx,js,jsx}": "eslint",
|
|
173
|
+
"server/**/*.{js,ts}": "eslint"
|
|
174
|
+
},
|
|
175
|
+
"overrides": {
|
|
176
|
+
"undici": ">=6.23.1"
|
|
177
|
+
}
|
|
178
|
+
}
|
package/server/index.js
CHANGED
|
@@ -48,6 +48,7 @@ import { spawnCursor, abortCursorSession, isCursorSessionActive, getActiveCursor
|
|
|
48
48
|
import { queryCodex, abortCodexSession, isCodexSessionActive, getActiveCodexSessions } from './openai-codex.js';
|
|
49
49
|
import { spawnGemini, abortGeminiSession, isGeminiSessionActive, getActiveGeminiSessions } from './gemini-cli.js';
|
|
50
50
|
import { spawnQwen, abortQwenSession, isQwenSessionActive, getActiveQwenSessions } from './qwen-code-cli.js';
|
|
51
|
+
import { spawnOpencode, abortOpencodeSession, isOpencodeSessionActive, getActiveOpencodeSessions } from './opencode-cli.js';
|
|
51
52
|
import sessionManager from './sessionManager.js';
|
|
52
53
|
import gitRoutes from './routes/git.js';
|
|
53
54
|
import authRoutes from './routes/auth.js';
|
|
@@ -1810,6 +1811,9 @@ function handleChatConnection(ws, request) {
|
|
|
1810
1811
|
} else if (data.type === 'qwen-command') {
|
|
1811
1812
|
chatDebug('qwen', data);
|
|
1812
1813
|
await spawnQwen(data.command, data.options, writer);
|
|
1814
|
+
} else if (data.type === 'opencode-command') {
|
|
1815
|
+
chatDebug('opencode', data);
|
|
1816
|
+
await spawnOpencode(data.command, data.options, writer);
|
|
1813
1817
|
} else if (data.type === 'cursor-resume') {
|
|
1814
1818
|
// Backward compatibility: treat as cursor-command with resume and no prompt
|
|
1815
1819
|
console.log('[DEBUG] Cursor resume session (compat):', data.sessionId);
|
|
@@ -1831,6 +1835,8 @@ function handleChatConnection(ws, request) {
|
|
|
1831
1835
|
success = abortGeminiSession(data.sessionId);
|
|
1832
1836
|
} else if (provider === 'qwen') {
|
|
1833
1837
|
success = abortQwenSession(data.sessionId);
|
|
1838
|
+
} else if (provider === 'opencode') {
|
|
1839
|
+
success = abortOpencodeSession(data.sessionId);
|
|
1834
1840
|
} else {
|
|
1835
1841
|
// Use Claude Agents SDK
|
|
1836
1842
|
success = await abortClaudeSDKSession(data.sessionId);
|
|
@@ -1867,6 +1873,8 @@ function handleChatConnection(ws, request) {
|
|
|
1867
1873
|
isActive = isGeminiSessionActive(sessionId);
|
|
1868
1874
|
} else if (provider === 'qwen') {
|
|
1869
1875
|
isActive = isQwenSessionActive(sessionId);
|
|
1876
|
+
} else if (provider === 'opencode') {
|
|
1877
|
+
isActive = isOpencodeSessionActive(sessionId);
|
|
1870
1878
|
} else {
|
|
1871
1879
|
// Use Claude Agents SDK
|
|
1872
1880
|
isActive = isClaudeSDKSessionActive(sessionId);
|
|
@@ -1901,7 +1909,8 @@ function handleChatConnection(ws, request) {
|
|
|
1901
1909
|
cursor: getActiveCursorSessions(),
|
|
1902
1910
|
codex: getActiveCodexSessions(),
|
|
1903
1911
|
gemini: getActiveGeminiSessions(),
|
|
1904
|
-
qwen: getActiveQwenSessions()
|
|
1912
|
+
qwen: getActiveQwenSessions(),
|
|
1913
|
+
opencode: getActiveOpencodeSessions()
|
|
1905
1914
|
};
|
|
1906
1915
|
writer.send({
|
|
1907
1916
|
type: 'active-sessions',
|
|
@@ -87,13 +87,22 @@ export class OpencodeSessionsProvider implements IProviderSessions {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
if (raw.type === 'error') {
|
|
90
|
+
const rawErr = raw.error ?? raw.message;
|
|
91
|
+
const content = typeof rawErr === 'string'
|
|
92
|
+
? rawErr
|
|
93
|
+
: rawErr && typeof rawErr === 'object'
|
|
94
|
+
? (() => {
|
|
95
|
+
try { return JSON.stringify(rawErr); }
|
|
96
|
+
catch { return 'Unknown OpenCode streaming error'; }
|
|
97
|
+
})()
|
|
98
|
+
: 'Unknown OpenCode streaming error';
|
|
90
99
|
return [createNormalizedMessage({
|
|
91
100
|
id: baseId,
|
|
92
101
|
sessionId,
|
|
93
102
|
timestamp: ts,
|
|
94
103
|
provider: PROVIDER,
|
|
95
104
|
kind: 'error',
|
|
96
|
-
content
|
|
105
|
+
content,
|
|
97
106
|
})];
|
|
98
107
|
}
|
|
99
108
|
|
|
@@ -218,7 +218,8 @@ const parseProvider = (value: unknown): LLMProvider => {
|
|
|
218
218
|
normalized === 'codex' ||
|
|
219
219
|
normalized === 'cursor' ||
|
|
220
220
|
normalized === 'gemini' ||
|
|
221
|
-
normalized === 'qwen'
|
|
221
|
+
normalized === 'qwen' ||
|
|
222
|
+
normalized === 'opencode'
|
|
222
223
|
) {
|
|
223
224
|
return normalized;
|
|
224
225
|
}
|