@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/package.json CHANGED
@@ -1,178 +1,178 @@
1
- {
2
- "name": "@pixelbyte-software/pixcode",
3
- "version": "1.33.2",
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: raw.error || raw.message || 'Unknown OpenCode streaming error',
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
  }