@pixelbyte-software/pixcode 1.41.0 → 1.41.2

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 (27) hide show
  1. package/dist/assets/{index-DPzxZAAM.js → index-BC6Knu5B.js} +156 -156
  2. package/dist/index.html +1 -1
  3. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js +8 -18
  4. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js.map +1 -1
  5. package/dist-server/server/modules/providers/provider.routes.js +6 -20
  6. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  7. package/dist-server/server/routes/agent.js +2 -2
  8. package/dist-server/server/routes/agent.js.map +1 -1
  9. package/dist-server/server/routes/commands.js +20 -14
  10. package/dist-server/server/routes/commands.js.map +1 -1
  11. package/dist-server/server/routes/cursor.js +9 -3
  12. package/dist-server/server/routes/cursor.js.map +1 -1
  13. package/dist-server/server/services/model-registry.js +119 -0
  14. package/dist-server/server/services/model-registry.js.map +1 -0
  15. package/dist-server/server/services/telegram/control-center.js +2 -9
  16. package/dist-server/server/services/telegram/control-center.js.map +1 -1
  17. package/package.json +1 -1
  18. package/scripts/smoke/command-center-agent-writes.mjs +3 -1
  19. package/scripts/smoke/model-registry.mjs +36 -0
  20. package/scripts/smoke/run-state-refresh.mjs +52 -0
  21. package/server/modules/orchestration/workflows/workflow-runner.ts +12 -30
  22. package/server/modules/providers/provider.routes.ts +9 -28
  23. package/server/routes/agent.js +2 -2
  24. package/server/routes/commands.js +29 -15
  25. package/server/routes/cursor.js +10 -3
  26. package/server/services/model-registry.js +144 -0
  27. package/server/services/telegram/control-center.js +4 -16
@@ -0,0 +1,144 @@
1
+ import {
2
+ CLAUDE_MODELS,
3
+ CODEX_MODELS,
4
+ CURSOR_MODELS,
5
+ GEMINI_MODELS,
6
+ OPENCODE_MODELS,
7
+ QWEN_MODELS,
8
+ } from '../../shared/modelConstants.js';
9
+
10
+ import { clearProviderModelCache, getProviderModels } from './provider-models.js';
11
+
12
+ export const MODEL_REGISTRY_CACHE_TTL_MS = 6 * 60 * 60 * 1000;
13
+
14
+ const PROVIDER_CONFIG = {
15
+ claude: {
16
+ defaultModel: CLAUDE_MODELS.DEFAULT,
17
+ staticModels: CLAUDE_MODELS.OPTIONS,
18
+ },
19
+ cursor: {
20
+ defaultModel: CURSOR_MODELS.DEFAULT,
21
+ staticModels: CURSOR_MODELS.OPTIONS,
22
+ },
23
+ codex: {
24
+ defaultModel: CODEX_MODELS.DEFAULT,
25
+ staticModels: CODEX_MODELS.OPTIONS,
26
+ },
27
+ gemini: {
28
+ defaultModel: GEMINI_MODELS.DEFAULT,
29
+ staticModels: GEMINI_MODELS.OPTIONS,
30
+ },
31
+ qwen: {
32
+ defaultModel: QWEN_MODELS.DEFAULT,
33
+ staticModels: QWEN_MODELS.OPTIONS,
34
+ },
35
+ opencode: {
36
+ defaultModel: OPENCODE_MODELS.DEFAULT,
37
+ staticModels: OPENCODE_MODELS.OPTIONS,
38
+ },
39
+ };
40
+
41
+ export const MODEL_REGISTRY_PROVIDERS = Object.freeze(Object.keys(PROVIDER_CONFIG));
42
+
43
+ function normalizeStaticModels(models) {
44
+ const seen = new Set();
45
+ const out = [];
46
+
47
+ for (const model of Array.isArray(models) ? models : []) {
48
+ if (!model || typeof model !== 'object') continue;
49
+ const value = typeof model.value === 'string' ? model.value.trim() : '';
50
+ if (!value || seen.has(value)) continue;
51
+ seen.add(value);
52
+
53
+ const label = typeof model.label === 'string' && model.label.trim() ? model.label.trim() : value;
54
+ const entry = { value, label, source: 'static' };
55
+ if (typeof model.free === 'boolean') entry.free = model.free;
56
+ out.push(entry);
57
+ }
58
+
59
+ return out;
60
+ }
61
+
62
+ function readProviderConfig(provider) {
63
+ return PROVIDER_CONFIG[provider] ?? null;
64
+ }
65
+
66
+ export function isModelRegistryProvider(provider) {
67
+ return Boolean(readProviderConfig(provider));
68
+ }
69
+
70
+ export function getProviderModelRegistryConfig(provider) {
71
+ const config = readProviderConfig(provider);
72
+ if (!config) return null;
73
+
74
+ return {
75
+ provider,
76
+ defaultModel: config.defaultModel,
77
+ staticModels: getStaticProviderModels(provider),
78
+ };
79
+ }
80
+
81
+ export function getStaticProviderModels(provider) {
82
+ const config = readProviderConfig(provider);
83
+ return normalizeStaticModels(config?.staticModels ?? []);
84
+ }
85
+
86
+ export function getDefaultProviderModel(provider) {
87
+ return readProviderConfig(provider)?.defaultModel;
88
+ }
89
+
90
+ function readFreshnessSource({ error, fromCache }) {
91
+ if (error) return 'fallback';
92
+ if (fromCache) return 'cache';
93
+ return 'live';
94
+ }
95
+
96
+ export async function getProviderModelRegistryEntry(provider, opts = {}) {
97
+ const config = readProviderConfig(provider);
98
+ if (!config) {
99
+ throw new Error(`Unsupported provider: ${provider}`);
100
+ }
101
+
102
+ const staticModels = getStaticProviderModels(provider);
103
+ const result = await getProviderModels(provider, {
104
+ forceRefresh: Boolean(opts.forceRefresh),
105
+ staticList: staticModels,
106
+ });
107
+
108
+ const models = Array.isArray(result?.models) && result.models.length > 0
109
+ ? result.models
110
+ : staticModels;
111
+ const error = result?.error || null;
112
+
113
+ return {
114
+ provider,
115
+ models,
116
+ defaultModel: config.defaultModel,
117
+ fetchedAt: result?.fetchedAt ?? null,
118
+ error,
119
+ fromCache: Boolean(result?.fromCache),
120
+ freshness: {
121
+ ttlMs: MODEL_REGISTRY_CACHE_TTL_MS,
122
+ fetchedAt: result?.fetchedAt ?? null,
123
+ fromCache: Boolean(result?.fromCache),
124
+ degraded: Boolean(error),
125
+ source: readFreshnessSource({ error, fromCache: result?.fromCache }),
126
+ },
127
+ };
128
+ }
129
+
130
+ export async function getAllProviderModelRegistry(opts = {}) {
131
+ const entries = await Promise.all(
132
+ MODEL_REGISTRY_PROVIDERS.map((provider) => getProviderModelRegistryEntry(provider, opts)),
133
+ );
134
+
135
+ return Object.fromEntries(entries.map((entry) => [entry.provider, entry]));
136
+ }
137
+
138
+ export async function clearProviderModelRegistryCache(provider) {
139
+ if (!isModelRegistryProvider(provider)) {
140
+ throw new Error(`Unsupported provider: ${provider}`);
141
+ }
142
+
143
+ await clearProviderModelCache(provider);
144
+ }
@@ -2,14 +2,7 @@ import crypto from 'node:crypto';
2
2
 
3
3
  import { apiKeysDb, telegramLinksDb } from '../../database/db.js';
4
4
  import { getProjects } from '../../projects.js';
5
- import {
6
- CLAUDE_MODELS,
7
- CODEX_MODELS,
8
- CURSOR_MODELS,
9
- GEMINI_MODELS,
10
- OPENCODE_MODELS,
11
- QWEN_MODELS,
12
- } from '../../../shared/modelConstants.js';
5
+ import { getStaticProviderModels } from '../model-registry.js';
13
6
 
14
7
  import { SUPPORTED_LANGUAGES, t } from './translations.js';
15
8
 
@@ -20,14 +13,9 @@ const MAX_TELEGRAM_TEXT = 3600;
20
13
  const callbackActions = new Map();
21
14
  const runMonitors = new Map();
22
15
 
23
- const MODEL_FALLBACKS = {
24
- claude: CLAUDE_MODELS.OPTIONS,
25
- codex: CODEX_MODELS.OPTIONS,
26
- cursor: CURSOR_MODELS.OPTIONS,
27
- gemini: GEMINI_MODELS.OPTIONS,
28
- qwen: QWEN_MODELS.OPTIONS,
29
- opencode: OPENCODE_MODELS.OPTIONS,
30
- };
16
+ const MODEL_FALLBACKS = Object.fromEntries(
17
+ PROVIDERS.map((provider) => [provider, getStaticProviderModels(provider)]),
18
+ );
31
19
 
32
20
  const AUTH_HELP = {
33
21
  claude: '`claude login`',