@pixelbyte-software/pixcode 1.33.5 → 1.33.7

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.
@@ -109,8 +109,18 @@ async function discoverOpenAiCompat(apiKey, baseUrl, fallbackBase) {
109
109
  const response = await fetch(endpoint, {
110
110
  headers: { Authorization: `Bearer ${apiKey}` },
111
111
  });
112
- if (!response.ok)
112
+ if (!response.ok) {
113
+ // 401 specifically means our key is bad — but for codex/qwen/etc.
114
+ // users often log in via OAuth (`codex login`, `qwen auth`) which
115
+ // doesn't expose an OpenAI-compatible API key. Surface a clean
116
+ // "no live discovery available" rather than a scary 401 trace.
117
+ if (response.status === 401) {
118
+ const err = new Error('OpenAI-compatible /v1/models requires an API key. The static catalog is shown instead — that\'s expected when you signed in via OAuth (e.g. `codex login`).');
119
+ err.code = 'OAUTH_NO_API_KEY';
120
+ throw err;
121
+ }
113
122
  throw new Error(`${endpoint} returned ${response.status}`);
123
+ }
114
124
  const data = await response.json();
115
125
  const rows = Array.isArray(data?.data) ? data.data : [];
116
126
  return rows
@@ -121,6 +131,33 @@ async function discoverOpenAiCompat(apiKey, baseUrl, fallbackBase) {
121
131
  source: 'api',
122
132
  }));
123
133
  }
134
+ /**
135
+ * Detect whether the user is authenticated via the provider's OAuth flow
136
+ * (codex login / qwen auth) so we can skip live model discovery silently
137
+ * — those flows don't surface a usable OpenAI-compatible API key, and the
138
+ * SDK calls the upstream APIs through its own internal auth path.
139
+ */
140
+ async function hasProviderOauthAuth(provider) {
141
+ if (provider === 'codex') {
142
+ try {
143
+ await fs.access(path.join(os.homedir(), '.codex', 'auth.json'));
144
+ return true;
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ }
150
+ if (provider === 'qwen') {
151
+ try {
152
+ await fs.access(path.join(os.homedir(), '.qwen', 'oauth_creds.json'));
153
+ return true;
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ }
159
+ return false;
160
+ }
124
161
  /**
125
162
  * OpenCode is multi-provider — its "model" picker isn't a single API list,
126
163
  * it's the union of every provider it can route to (Anthropic, OpenAI,
@@ -293,9 +330,16 @@ export async function getProviderModels(provider, opts = {}) {
293
330
  const apiKey = creds?.apiKey || envKey;
294
331
  const baseUrl = creds?.baseUrl || envBase || undefined;
295
332
  if (!apiKey) {
296
- // Be explicit so the UI can surface a useful hint rather than just
297
- // showing the static baseline with no reason given.
298
- error = `No ${provider} API key configured. Save one in Settings > Agents > API Key to enable live discovery.`;
333
+ // Codex and Qwen support OAuth (`codex login`, `qwen auth`) which
334
+ // DOESN'T expose a usable API key the SDK auths against the
335
+ // upstream API directly. Skip the discovery step silently in that
336
+ // case; the static catalog is the right answer.
337
+ const oauthOnly = await hasProviderOauthAuth(provider);
338
+ if (!oauthOnly) {
339
+ // Be explicit so the UI can surface a useful hint rather than just
340
+ // showing the static baseline with no reason given.
341
+ error = `No ${provider} API key configured. Save one in Settings > Agents > API Key, or sign in via the CLI (e.g. \`codex login\`).`;
342
+ }
299
343
  }
300
344
  else {
301
345
  try {
@@ -313,7 +357,13 @@ export async function getProviderModels(provider, opts = {}) {
313
357
  }
314
358
  }
315
359
  catch (err) {
316
- error = err?.message || String(err);
360
+ // OAuth users get a clean message instead of a raw 401 stack.
361
+ if (err?.code === 'OAUTH_NO_API_KEY') {
362
+ error = err.message;
363
+ }
364
+ else {
365
+ error = err?.message || String(err);
366
+ }
317
367
  }
318
368
  }
319
369
  const merged = mergeCatalogs(normalizeList(liveModels), staticCatalog);
@@ -1 +1 @@
1
- {"version":3,"file":"provider-models.js","sourceRoot":"","sources":["../../../server/services/provider-models.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-models.js","sourceRoot":"","sources":["../../../server/services/provider-models.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelbyte-software/pixcode",
3
- "version": "1.33.5",
3
+ "version": "1.33.7",
4
4
  "description": "Pixcode — a desktop and mobile web UI for Claude Code, Cursor CLI, Codex, Gemini CLI, Qwen Code, and OpenCode.",
5
5
  "type": "module",
6
6
  "main": "dist-server/server/index.js",
@@ -360,10 +360,13 @@ async function spawnOpencode(command, options = {}, ws) {
360
360
  const installed = await providerAuthService.isProviderInstalled('opencode');
361
361
  const errorContent = !installed
362
362
  ? 'OpenCode CLI is not installed. Install it from the Settings → Agents → OpenCode tab, or run: npm install -g opencode-ai'
363
- : error.message;
363
+ : (error?.message || String(error));
364
364
 
365
365
  const errorSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : finalSessionId;
366
366
  ws.send(createNormalizedMessage({ kind: 'error', content: errorContent, sessionId: errorSessionId, provider: 'opencode' }));
367
+ // Always emit `complete` so the UI's "Processing..." state clears
368
+ // even when spawn fails (ENOENT, EACCES) and `close` never fires.
369
+ ws.send(createNormalizedMessage({ kind: 'complete', exitCode: 1, isNewSession: !sessionId && !!command, sessionId: errorSessionId, provider: 'opencode' }));
367
370
  notifyTerminalState({ error });
368
371
 
369
372
  reject(error);
@@ -699,6 +699,7 @@ async function getProjects(progressCallback = null) {
699
699
  sessions: [],
700
700
  geminiSessions: [],
701
701
  qwenSessions: [],
702
+ opencodeSessions: [],
702
703
  sessionMeta: {
703
704
  hasMore: false,
704
705
  total: 0
@@ -768,6 +769,14 @@ async function getProjects(progressCallback = null) {
768
769
  }
769
770
  applyCustomSessionNames(project.qwenSessions, 'qwen');
770
771
 
772
+ try {
773
+ project.opencodeSessions = await getOpencodeCliSessions(actualProjectDir);
774
+ } catch (e) {
775
+ console.warn(`Could not load OpenCode sessions for project ${entry.name}:`, e.message);
776
+ project.opencodeSessions = [];
777
+ }
778
+ applyCustomSessionNames(project.opencodeSessions, 'opencode');
779
+
771
780
  try {
772
781
  const taskMasterResult = await detectTaskMasterFolder(actualProjectDir);
773
782
  project.taskmaster = {
@@ -831,6 +840,7 @@ async function getProjects(progressCallback = null) {
831
840
  sessions: [],
832
841
  geminiSessions: [],
833
842
  qwenSessions: [],
843
+ opencodeSessions: [],
834
844
  sessionMeta: {
835
845
  hasMore: false,
836
846
  total: 0
@@ -876,6 +886,13 @@ async function getProjects(progressCallback = null) {
876
886
  }
877
887
  applyCustomSessionNames(project.geminiSessions, 'gemini');
878
888
 
889
+ try {
890
+ project.opencodeSessions = await getOpencodeCliSessions(actualProjectDir);
891
+ } catch (e) {
892
+ console.warn(`Could not load OpenCode sessions for tracked project ${projectName}:`, e.message);
893
+ }
894
+ applyCustomSessionNames(project.opencodeSessions, 'opencode');
895
+
879
896
  try {
880
897
  const taskMasterResult = await detectTaskMasterFolder(actualProjectDir);
881
898
 
@@ -2798,6 +2815,100 @@ async function getQwenCliSessions(projectPath, options = {}) {
2798
2815
  );
2799
2816
  }
2800
2817
 
2818
+ /**
2819
+ * OpenCode session enumerator. Walks `~/.local/share/opencode/project/*` (the
2820
+ * XDG data dir OpenCode uses on every platform — yes, including Windows under
2821
+ * the user profile) and surfaces every session whose `directory` field matches
2822
+ * the project root we're listing. `<projectID>` segments are git-root commit
2823
+ * hashes for git repos and the literal "global" for non-git dirs, so we
2824
+ * don't try to be clever about the slug — we just walk every project bucket
2825
+ * and filter by the stored `directory`.
2826
+ *
2827
+ * This is best-effort: when OpenCode hasn't written anything yet (brand-new
2828
+ * project, no chats sent) the data dir is missing and we return [] without
2829
+ * surfacing an error to the caller.
2830
+ */
2831
+ async function getOpencodeCliSessions(projectPath) {
2832
+ const normalizedProjectPath = normalizeComparablePath(projectPath);
2833
+ if (!normalizedProjectPath) return [];
2834
+
2835
+ const sessions = [];
2836
+ const opencodeDataDir = path.join(os.homedir(), '.local', 'share', 'opencode', 'project');
2837
+
2838
+ let projectBuckets;
2839
+ try {
2840
+ projectBuckets = await fs.readdir(opencodeDataDir);
2841
+ } catch {
2842
+ return [];
2843
+ }
2844
+
2845
+ for (const bucket of projectBuckets) {
2846
+ const sessionRoot = path.join(opencodeDataDir, bucket, 'storage', 'session');
2847
+ let projectIdDirs;
2848
+ try {
2849
+ projectIdDirs = await fs.readdir(sessionRoot);
2850
+ } catch {
2851
+ continue;
2852
+ }
2853
+
2854
+ for (const pidDir of projectIdDirs) {
2855
+ const dir = path.join(sessionRoot, pidDir);
2856
+ let sessionFiles;
2857
+ try {
2858
+ sessionFiles = await fs.readdir(dir);
2859
+ } catch {
2860
+ continue;
2861
+ }
2862
+
2863
+ for (const file of sessionFiles) {
2864
+ if (!file.startsWith('ses_') || !file.endsWith('.json')) continue;
2865
+ try {
2866
+ const data = await fs.readFile(path.join(dir, file), 'utf8');
2867
+ const sess = JSON.parse(data);
2868
+ const sessDir = typeof sess?.directory === 'string'
2869
+ ? normalizeComparablePath(sess.directory)
2870
+ : null;
2871
+ if (!sessDir || sessDir !== normalizedProjectPath) continue;
2872
+
2873
+ const id = typeof sess?.id === 'string' ? sess.id : file.replace(/\.json$/, '');
2874
+ sessions.push({
2875
+ id,
2876
+ summary: sess?.title || 'OpenCode Session',
2877
+ messageCount: typeof sess?.messageCount === 'number' ? sess.messageCount : 0,
2878
+ lastActivity: sess?.time?.updated || sess?.time?.created || null,
2879
+ provider: 'opencode',
2880
+ });
2881
+ } catch {
2882
+ // Skip unreadable session files silently — one corrupt file
2883
+ // shouldn't blank the whole list.
2884
+ continue;
2885
+ }
2886
+ }
2887
+ }
2888
+ }
2889
+
2890
+ // Merge in live sessions held by the in-memory sessionManager so a fresh
2891
+ // chat that hasn't been flushed to disk yet still shows in the sidebar.
2892
+ try {
2893
+ const liveSessions = sessionManager.getProjectSessions(projectPath) || [];
2894
+ for (const s of liveSessions) {
2895
+ if (!s.id || !s.id.startsWith('opencode_')) continue;
2896
+ if (sessions.some((existing) => existing.id === s.id)) continue;
2897
+ sessions.push({
2898
+ id: s.id,
2899
+ summary: s.summary || s.title || 'OpenCode Session',
2900
+ messageCount: s.messageCount || 0,
2901
+ lastActivity: s.lastActivity || s.createdAt || null,
2902
+ provider: 'opencode',
2903
+ });
2904
+ }
2905
+ } catch { /* sessionManager not initialised yet — ignore */ }
2906
+
2907
+ return sessions.sort((a, b) =>
2908
+ new Date(b.lastActivity || 0) - new Date(a.lastActivity || 0)
2909
+ );
2910
+ }
2911
+
2801
2912
  async function getQwenCliSessionMessages(sessionId) {
2802
2913
  const qwenTmpDir = path.join(os.homedir(), '.qwen', 'tmp');
2803
2914
  let projectDirs;
@@ -2989,5 +3100,6 @@ export {
2989
3100
  getGeminiCliSessionMessages,
2990
3101
  getQwenCliSessions,
2991
3102
  getQwenCliSessionMessages,
3103
+ getOpencodeCliSessions,
2992
3104
  searchConversations
2993
3105
  };
@@ -335,10 +335,13 @@ async function spawnQwen(command, options = {}, ws) {
335
335
  const installed = await providerAuthService.isProviderInstalled('qwen');
336
336
  const errorContent = !installed
337
337
  ? 'Qwen Code CLI is not installed. Install it first: npm install -g @qwen-code/qwen-code'
338
- : error.message;
338
+ : (error?.message || String(error));
339
339
 
340
340
  const errorSessionId = typeof ws.getSessionId === 'function' ? ws.getSessionId() : finalSessionId;
341
341
  ws.send(createNormalizedMessage({ kind: 'error', content: errorContent, sessionId: errorSessionId, provider: 'qwen' }));
342
+ // Always emit `complete` so the UI's "Processing..." state clears
343
+ // even when spawn fails (ENOENT, EACCES) and `close` never fires.
344
+ ws.send(createNormalizedMessage({ kind: 'complete', exitCode: 1, isNewSession: !sessionId && !!command, sessionId: errorSessionId, provider: 'qwen' }));
342
345
  notifyTerminalState({ error });
343
346
 
344
347
  reject(error);
@@ -113,7 +113,18 @@ async function discoverOpenAiCompat(apiKey, baseUrl, fallbackBase) {
113
113
  const response = await fetch(endpoint, {
114
114
  headers: { Authorization: `Bearer ${apiKey}` },
115
115
  });
116
- if (!response.ok) throw new Error(`${endpoint} returned ${response.status}`);
116
+ if (!response.ok) {
117
+ // 401 specifically means our key is bad — but for codex/qwen/etc.
118
+ // users often log in via OAuth (`codex login`, `qwen auth`) which
119
+ // doesn't expose an OpenAI-compatible API key. Surface a clean
120
+ // "no live discovery available" rather than a scary 401 trace.
121
+ if (response.status === 401) {
122
+ const err = new Error('OpenAI-compatible /v1/models requires an API key. The static catalog is shown instead — that\'s expected when you signed in via OAuth (e.g. `codex login`).');
123
+ err.code = 'OAUTH_NO_API_KEY';
124
+ throw err;
125
+ }
126
+ throw new Error(`${endpoint} returned ${response.status}`);
127
+ }
117
128
  const data = await response.json();
118
129
  const rows = Array.isArray(data?.data) ? data.data : [];
119
130
  return rows
@@ -125,6 +136,28 @@ async function discoverOpenAiCompat(apiKey, baseUrl, fallbackBase) {
125
136
  }));
126
137
  }
127
138
 
139
+ /**
140
+ * Detect whether the user is authenticated via the provider's OAuth flow
141
+ * (codex login / qwen auth) so we can skip live model discovery silently
142
+ * — those flows don't surface a usable OpenAI-compatible API key, and the
143
+ * SDK calls the upstream APIs through its own internal auth path.
144
+ */
145
+ async function hasProviderOauthAuth(provider) {
146
+ if (provider === 'codex') {
147
+ try {
148
+ await fs.access(path.join(os.homedir(), '.codex', 'auth.json'));
149
+ return true;
150
+ } catch { return false; }
151
+ }
152
+ if (provider === 'qwen') {
153
+ try {
154
+ await fs.access(path.join(os.homedir(), '.qwen', 'oauth_creds.json'));
155
+ return true;
156
+ } catch { return false; }
157
+ }
158
+ return false;
159
+ }
160
+
128
161
  /**
129
162
  * OpenCode is multi-provider — its "model" picker isn't a single API list,
130
163
  * it's the union of every provider it can route to (Anthropic, OpenAI,
@@ -299,9 +332,16 @@ export async function getProviderModels(provider, opts = {}) {
299
332
  const baseUrl = creds?.baseUrl || envBase || undefined;
300
333
 
301
334
  if (!apiKey) {
302
- // Be explicit so the UI can surface a useful hint rather than just
303
- // showing the static baseline with no reason given.
304
- error = `No ${provider} API key configured. Save one in Settings > Agents > API Key to enable live discovery.`;
335
+ // Codex and Qwen support OAuth (`codex login`, `qwen auth`) which
336
+ // DOESN'T expose a usable API key the SDK auths against the
337
+ // upstream API directly. Skip the discovery step silently in that
338
+ // case; the static catalog is the right answer.
339
+ const oauthOnly = await hasProviderOauthAuth(provider);
340
+ if (!oauthOnly) {
341
+ // Be explicit so the UI can surface a useful hint rather than just
342
+ // showing the static baseline with no reason given.
343
+ error = `No ${provider} API key configured. Save one in Settings > Agents > API Key, or sign in via the CLI (e.g. \`codex login\`).`;
344
+ }
305
345
  } else {
306
346
  try {
307
347
  if (provider === 'claude') {
@@ -318,7 +358,12 @@ export async function getProviderModels(provider, opts = {}) {
318
358
  liveModels = await discoverGoogle(apiKey);
319
359
  }
320
360
  } catch (err) {
321
- error = err?.message || String(err);
361
+ // OAuth users get a clean message instead of a raw 401 stack.
362
+ if (err?.code === 'OAUTH_NO_API_KEY') {
363
+ error = err.message;
364
+ } else {
365
+ error = err?.message || String(err);
366
+ }
322
367
  }
323
368
  }
324
369