free-coding-models 0.3.55 → 0.3.57

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 (75) hide show
  1. package/CHANGELOG.md +55 -56
  2. package/README.md +214 -160
  3. package/bin/free-coding-models.js +46 -0
  4. package/package.json +2 -2
  5. package/sources.js +134 -310
  6. package/src/analysis.js +23 -10
  7. package/src/app.js +66 -27
  8. package/src/cache.js +1 -1
  9. package/src/cli-help.js +9 -0
  10. package/src/command-palette.js +15 -13
  11. package/src/config.js +201 -35
  12. package/src/constants.js +4 -4
  13. package/src/endpoint-installer.js +45 -1
  14. package/src/favorites.js +22 -0
  15. package/src/graphify-out/cache/089db1c1def873cf6d112f1590da4490e61e691aff0db41e006aa2fb15ba0656.json +1 -0
  16. package/src/graphify-out/cache/0b510b53cf1a1393fb52b1fc3bbbf88b63938e961ec5b82119a2e9715fee8bd7.json +1 -0
  17. package/src/graphify-out/cache/0ec9a95a326bde58e0316889018b278062d06d494d0f31ba177c9de71e5fed2d.json +1 -0
  18. package/src/graphify-out/cache/1548663a24a68dce740ebab1bd1d3091048c9604e9d067a1650a42a6d82541d4.json +1 -0
  19. package/src/graphify-out/cache/1783af63cb6d0dfb4d469009f71ac83a74ba0b33d48186ff2c6e63f9429e900a.json +1 -0
  20. package/src/graphify-out/cache/1e109f5eb5dc4fd285871c3613e32b6b14a8c225f4080ee34b51c7e1a1764571.json +1 -0
  21. package/src/graphify-out/cache/1eb24dbeb69b46c8bc1caf925df2f2a964af0f33aea143adf8ddf88e017db6ca.json +1 -0
  22. package/src/graphify-out/cache/21e1bcfed11685e8347243f9d8516072dda183266a4bfe22c52fb31753a446c8.json +1 -0
  23. package/src/graphify-out/cache/2327473478b9c4b1940bf7ef66c9ee960b3cba8d5302e56b625df8274246e0b4.json +1 -0
  24. package/src/graphify-out/cache/25955b81fd25454c8fa90fb71a47db8d1215cf621beb8ff3cbd580aaf011b4f3.json +1 -0
  25. package/src/graphify-out/cache/2739677f19c702f88f3de0a0bac475066adbda98709907ad3de967aef689f86d.json +1 -0
  26. package/src/graphify-out/cache/2bba03422f6b3ee7f5b5d29cc90314a064d259e5822a176657bda3e04505cf00.json +1 -0
  27. package/src/graphify-out/cache/2ddf1d2c6d10147b0402446bc71a7988187b79b6210dd7e7250be8c555b9ff35.json +1 -0
  28. package/src/graphify-out/cache/2ee07457a5767c95a57f8e9eb95b28f800044f35666e0715e9d88ad1103a092e.json +1 -0
  29. package/src/graphify-out/cache/2fe9f75dc2951c417f2c8dd22749092cf550dc67599f1c8d1866900dc6e9154e.json +1 -0
  30. package/src/graphify-out/cache/41c4b7c27e7fc3e2948d3a4bf95a72de2ed9a6f0463994babdce8ed2cc84598c.json +1 -0
  31. package/src/graphify-out/cache/5028defd54b7fbd3c7e444973e493de036e097e9b1d2a7cae7f19b88d68aacde.json +1 -0
  32. package/src/graphify-out/cache/5b133aba3fb16410c5b1fdbd1730039fc7fa1ac93abd99d7be08f60da70fc8d4.json +1 -0
  33. package/src/graphify-out/cache/74252e5b0978d85ab3421a3de1a9384aa282ffd2be2cfe7db2530139089f4275.json +1 -0
  34. package/src/graphify-out/cache/7695ebeea056095edd14332963cc43354ef3a097caf46f1e28d0f01369642901.json +1 -0
  35. package/src/graphify-out/cache/777aa7085c395a935c6556bbde182cd871edb61f3a685ed8068ec0c8f6fb0075.json +1 -0
  36. package/src/graphify-out/cache/82a723881980e82273c113def8315533d7da28827e300413d9ad30f27b7407df.json +1 -0
  37. package/src/graphify-out/cache/86b87c9603e6cd188f42c7eed3b86c291d48a781c223a707e74f3e7ed0c02a21.json +1 -0
  38. package/src/graphify-out/cache/890fead9a78cadaed560a2d2453916121fa605c3e43a334910ac4bc951a9ef6d.json +1 -0
  39. package/src/graphify-out/cache/89d3ea66f52783caa775ef9a30923d7d6225e1d8ae9e962f4741b8c7785dab1e.json +1 -0
  40. package/src/graphify-out/cache/8cc82cd9edce41f0e1c092f14a94fd52bf847addf3237b616dc5a9e505bd05bd.json +1 -0
  41. package/src/graphify-out/cache/93ba2e25e3ff7ad525f397902345fbd375df7315de7b402e20cc803c14eccde8.json +1 -0
  42. package/src/graphify-out/cache/99beed29580b9c7bfecfee794cb3d8e535fcf0eb3b92113108f88bdd0a8e79b3.json +1 -0
  43. package/src/graphify-out/cache/aeeb931fa477c65ce2e51d8149957350fa54225c613222bbbe8448998d1afd3d.json +1 -0
  44. package/src/graphify-out/cache/baf91bef5b5ecb2a476433b6cc0c48c563c54ee2d07fc3c192e543685e3e7222.json +1 -0
  45. package/src/graphify-out/cache/bd98b94ac4e9b92b6336d47b26e0366b51a4eaf0711d722f05f98dfae23ab42b.json +1 -0
  46. package/src/graphify-out/cache/bfcb51e9328e9cbfbee4f6fee0f56635d7b03488addc9f6c4e4b190b70a73362.json +1 -0
  47. package/src/graphify-out/cache/c0d3dabeb093aa758c49eadf41b87ecc96a16c1449c2670aaf48cbfc891d8da6.json +1 -0
  48. package/src/graphify-out/cache/c20d6630236f473c1406068c3ae205853e649b216495c93dfec055dd222c55cf.json +1 -0
  49. package/src/graphify-out/cache/c22b9122816bebce0a2f79af41a986559d01e00163dbcd579c5755621b4cb483.json +1 -0
  50. package/src/graphify-out/cache/ca556ec14453ddb8f9e0c5a832dac90d77111b9bad5f8c2d80d272e2e7a06371.json +1 -0
  51. package/src/graphify-out/cache/d6dbc9135dfa35a756b3b09b06700e4bc229fdccba11bb963f2ba44028e0bbae.json +1 -0
  52. package/src/graphify-out/cache/e1cf71276f1779d0fa075f79bd7c8a9fd0b8eef6932ac043137451b7c7fa7cbe.json +1 -0
  53. package/src/graphify-out/cache/e4b3be14494467df2d2ed389bc4f18f099021cb5bc355b901fa88387b2d8b8a2.json +1 -0
  54. package/src/graphify-out/cache/eaea0dded097f6f9553b654220046c6ec0c9be592a5973d906564ee60af34e0d.json +1 -0
  55. package/src/graphify-out/cache/ef07d0cd2675d1f79d2a2fdbf3bc3319687638751e9ce89b0d0d97ed1cd9f7e1.json +1 -0
  56. package/src/graphify-out/cache/f81272d6eb8aaff9e96d5a1d9f06777db70ac3652a646b951ded51f79871d733.json +1 -0
  57. package/src/graphify-out/cache/f9619dd92186f75a6dbda937e0c606647153918524cdb5763f956e6ec2a9e386.json +1 -0
  58. package/src/graphify-out/cache/fd88b1b2ff4bfcae08559d9c2aaeeb9a3f1e2f5cd8928762c311196956c170a5.json +1 -0
  59. package/src/key-handler.js +322 -114
  60. package/src/kilo.js +20 -1
  61. package/src/opencode.js +23 -2
  62. package/src/overlays.js +199 -98
  63. package/src/provider-metadata.js +26 -17
  64. package/src/quota-capabilities.js +6 -10
  65. package/src/render-helpers.js +38 -8
  66. package/src/render-table.js +119 -248
  67. package/src/router-daemon.js +1986 -0
  68. package/src/router-dashboard.js +902 -0
  69. package/src/sync-set.js +479 -0
  70. package/src/theme.js +4 -0
  71. package/src/tool-launchers.js +1 -0
  72. package/src/tool-metadata.js +6 -2
  73. package/src/utils.js +30 -6
  74. package/web/dist/assets/{index-C03JjCgA.js → index-DKHCzbK1.js} +2 -2
  75. package/web/dist/index.html +1 -1
package/src/config.js CHANGED
@@ -17,18 +17,12 @@
17
17
  * "cerebras": "csk_xxx",
18
18
  * "sambanova": "sn-xxx",
19
19
  * "openrouter": "sk-or-xxx",
20
- * "huggingface":"hf_xxx",
21
- * "replicate": "r8_xxx",
22
- * "deepinfra": "di_xxx",
23
- * "fireworks": "fw_xxx",
24
- * "codestral": "csk-xxx",
25
- * "hyperbolic": "eyJ...",
20
+ * "github-models": "github_pat_xxx",
21
+ * "mistral": "mistral-xxx",
22
+ * "codestral": "mistral-xxx",
26
23
  * "scaleway": "scw-xxx",
27
24
  * "googleai": "AIza...",
28
- * "siliconflow":"sk-xxx",
29
- * "together": "together-xxx",
30
25
  * "cloudflare": "cf-xxx",
31
- * "perplexity": "pplx-xxx",
32
26
  * "zai": "zai-xxx"
33
27
  * },
34
28
  * "providers": {
@@ -37,22 +31,16 @@
37
31
  * "cerebras": { "enabled": true },
38
32
  * "sambanova": { "enabled": true },
39
33
  * "openrouter": { "enabled": true },
40
- * "huggingface":{ "enabled": true },
41
- * "replicate": { "enabled": true },
42
- * "deepinfra": { "enabled": true },
43
- * "fireworks": { "enabled": true },
34
+ * "github-models": { "enabled": true },
35
+ * "mistral": { "enabled": true },
44
36
  * "codestral": { "enabled": true },
45
- * "hyperbolic": { "enabled": true },
46
37
  * "scaleway": { "enabled": true },
47
38
  * "googleai": { "enabled": true },
48
- * "siliconflow":{ "enabled": true },
49
- * "together": { "enabled": true },
50
39
  * "cloudflare": { "enabled": true },
51
- * "perplexity": { "enabled": true },
52
40
  * "zai": { "enabled": true }
53
41
  * },
54
42
  * "favorites": [
55
- * "nvidia/deepseek-ai/deepseek-v3.2"
43
+ * "nvidia/deepseek-ai/deepseek-v4-flash"
56
44
  * ],
57
45
  * "telemetry": {
58
46
  * "enabled": true,
@@ -67,7 +55,19 @@
67
55
  * },
68
56
  * "endpointInstalls": [
69
57
  * { "providerKey": "nvidia", "toolMode": "opencode", "scope": "all", "modelIds": [], "lastSyncedAt": "2026-03-09T10:00:00.000Z" }
70
- * ]
58
+ * ],
59
+ * "router": {
60
+ * "enabled": true,
61
+ * "activeSet": "fast-coding",
62
+ * "probeMode": "balanced",
63
+ * "sets": {
64
+ * "fast-coding": {
65
+ * "name": "fast-coding",
66
+ * "models": [{ "provider": "groq", "model": "llama-3.3-70b-versatile", "priority": 1 }],
67
+ * "created": "2026-04-22T10:00:00.000Z"
68
+ * }
69
+ * }
70
+ * }
71
71
  * }
72
72
  *
73
73
 
@@ -88,10 +88,11 @@
88
88
  * → replaceConfigContents(targetConfig, nextConfig) — Refresh an in-memory config object from a normalized snapshot
89
89
  * → persistApiKeysForProvider(config, providerKey) — Persist one provider's API keys without clobbering the rest of the file
90
90
  * → normalizeEndpointInstalls(endpointInstalls) — Keep tracked endpoint installs stable across app versions
91
+ * → normalizeRouterConfig(router) — Keep Smart Router sets and daemon tuning safe to persist
91
92
  *
92
93
  * @exports loadConfig, saveConfig, validateConfigFile, getApiKey, isProviderEnabled
93
94
  * @exports addApiKey, removeApiKey, listApiKeys — multi-key management helpers
94
- * @exports normalizeEndpointInstalls
95
+ * @exports normalizeEndpointInstalls, normalizeRouterConfig, DEFAULT_ROUTER_SETTINGS
95
96
  * @exports buildPersistedConfig, replaceConfigContents, persistApiKeysForProvider
96
97
  * @exports CONFIG_PATH — path to the JSON config file
97
98
  *
@@ -121,23 +122,52 @@ const ENV_VARS = {
121
122
  cerebras: 'CEREBRAS_API_KEY',
122
123
  sambanova: 'SAMBANOVA_API_KEY',
123
124
  openrouter: 'OPENROUTER_API_KEY',
124
- huggingface:['HUGGINGFACE_API_KEY', 'HF_TOKEN'],
125
- replicate: 'REPLICATE_API_TOKEN',
126
- deepinfra: ['DEEPINFRA_API_KEY', 'DEEPINFRA_TOKEN'],
127
- fireworks: 'FIREWORKS_API_KEY',
128
- codestral: 'CODESTRAL_API_KEY',
129
- hyperbolic: 'HYPERBOLIC_API_KEY',
125
+ 'github-models': ['GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_MODELS_TOKEN'],
126
+ mistral: 'MISTRAL_API_KEY',
127
+ codestral: ['MISTRAL_API_KEY', 'CODESTRAL_API_KEY'],
130
128
  scaleway: 'SCALEWAY_API_KEY',
131
129
  googleai: 'GOOGLE_API_KEY',
132
- siliconflow:'SILICONFLOW_API_KEY',
133
- together: 'TOGETHER_API_KEY',
134
130
  cloudflare: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_API_KEY'],
135
- perplexity: ['PERPLEXITY_API_KEY', 'PPLX_API_KEY'],
136
131
  qwen: 'DASHSCOPE_API_KEY',
137
132
  zai: 'ZAI_API_KEY',
138
- iflow: 'IFLOW_API_KEY',
133
+ gemini: 'GEMINI_API_KEY',
134
+ ovhcloud: 'OVH_AI_ENDPOINTS_ACCESS_TOKEN',
135
+ 'opencode-zen': 'OPENCODE_ZEN_API_KEY',
139
136
  }
140
137
 
138
+ // 📖 Smart Router defaults are intentionally conservative: balanced probing,
139
+ // 📖 three-request failover, and short local port range discovery.
140
+ export const DEFAULT_ROUTER_SETTINGS = Object.freeze({
141
+ enabled: false,
142
+ onboardingSeen: false,
143
+ autoStartOnBoot: false,
144
+ port: 19280,
145
+ activeSet: 'fast-coding',
146
+ probeMode: 'balanced',
147
+ probeIntervals: Object.freeze({
148
+ eco: 120000,
149
+ balanced: 30000,
150
+ aggressive: 10000,
151
+ }),
152
+ circuitBreaker: Object.freeze({
153
+ failureThreshold: 3,
154
+ initialCooldownMs: 30000,
155
+ maxCooldownMs: 300000,
156
+ backoffMultiplier: 2,
157
+ }),
158
+ failover: Object.freeze({
159
+ maxRetries: 3,
160
+ streamStallTimeoutMs: 8000,
161
+ requestTimeoutMs: 15000,
162
+ }),
163
+ scoring: Object.freeze({
164
+ latencyWeight: 0.4,
165
+ uptimeWeight: 0.4,
166
+ priorityWeight: 0.2,
167
+ }),
168
+ logLevel: 'info',
169
+ })
170
+
141
171
  function isPlainObject(value) {
142
172
  return Boolean(value) && typeof value === 'object' && !Array.isArray(value)
143
173
  }
@@ -207,12 +237,12 @@ function normalizeProvidersSection(providers) {
207
237
 
208
238
  function normalizeSettingsSection(settings) {
209
239
  const safeSettings = isPlainObject(settings) ? { ...settings } : {}
240
+ delete safeSettings.footerHidden
210
241
  return {
211
242
  ...safeSettings,
212
243
  hideUnconfiguredModels: typeof safeSettings.hideUnconfiguredModels === 'boolean' ? safeSettings.hideUnconfiguredModels : true,
213
244
  favoritesPinnedAndSticky: typeof safeSettings.favoritesPinnedAndSticky === 'boolean' ? safeSettings.favoritesPinnedAndSticky : false,
214
245
  theme: ['dark', 'light', 'auto'].includes(safeSettings.theme) ? safeSettings.theme : 'auto',
215
- footerHidden: typeof safeSettings.footerHidden === 'boolean' ? safeSettings.footerHidden : false,
216
246
  }
217
247
  }
218
248
 
@@ -227,6 +257,136 @@ function normalizeTelemetrySection(telemetry) {
227
257
  }
228
258
  }
229
259
 
260
+ function normalizeRouterName(value, fallback = '') {
261
+ if (typeof value !== 'string') return fallback
262
+ return value.trim().replace(/\s+/g, '-').replace(/[^a-zA-Z0-9._-]/g, '').slice(0, 64) || fallback
263
+ }
264
+
265
+ function normalizePositiveInteger(value, fallback, { min = 1, max = Number.MAX_SAFE_INTEGER } = {}) {
266
+ const numeric = Number(value)
267
+ if (!Number.isFinite(numeric)) return fallback
268
+ return Math.max(min, Math.min(max, Math.round(numeric)))
269
+ }
270
+
271
+ function normalizeRouterSetModels(models) {
272
+ if (!Array.isArray(models)) return []
273
+ const seen = new Set()
274
+ const normalized = []
275
+ for (const entry of models) {
276
+ if (!isPlainObject(entry)) continue
277
+ const provider = normalizeRouterName(entry.provider)
278
+ const model = typeof entry.model === 'string' ? entry.model.trim() : ''
279
+ if (!provider || !model) continue
280
+ const key = `${provider}/${model}`
281
+ if (seen.has(key)) continue
282
+ seen.add(key)
283
+ normalized.push({
284
+ provider,
285
+ model,
286
+ priority: normalizePositiveInteger(entry.priority, normalized.length + 1, { min: 1, max: 999 }),
287
+ })
288
+ }
289
+ return normalized
290
+ .sort((a, b) => a.priority - b.priority)
291
+ .map((entry, index) => ({ ...entry, priority: index + 1 }))
292
+ }
293
+
294
+ function normalizeRouterSets(sets) {
295
+ if (!isPlainObject(sets)) return {}
296
+ const normalized = {}
297
+ for (const [rawName, rawSet] of Object.entries(sets)) {
298
+ if (!isPlainObject(rawSet)) continue
299
+ const name = normalizeRouterName(rawSet.name, normalizeRouterName(rawName))
300
+ if (!name) continue
301
+ normalized[name] = {
302
+ name,
303
+ models: normalizeRouterSetModels(rawSet.models),
304
+ created: typeof rawSet.created === 'string' && rawSet.created.trim()
305
+ ? rawSet.created
306
+ : new Date().toISOString(),
307
+ }
308
+ }
309
+ return normalized
310
+ }
311
+
312
+ function normalizeRouterIntervals(intervals) {
313
+ const safeIntervals = isPlainObject(intervals) ? intervals : {}
314
+ return {
315
+ eco: normalizePositiveInteger(safeIntervals.eco, DEFAULT_ROUTER_SETTINGS.probeIntervals.eco, { min: 5000, max: 3600000 }),
316
+ balanced: normalizePositiveInteger(safeIntervals.balanced, DEFAULT_ROUTER_SETTINGS.probeIntervals.balanced, { min: 5000, max: 3600000 }),
317
+ aggressive: normalizePositiveInteger(safeIntervals.aggressive, DEFAULT_ROUTER_SETTINGS.probeIntervals.aggressive, { min: 5000, max: 3600000 }),
318
+ }
319
+ }
320
+
321
+ function normalizeRouterCircuitBreaker(circuitBreaker) {
322
+ const safeBreaker = isPlainObject(circuitBreaker) ? circuitBreaker : {}
323
+ return {
324
+ failureThreshold: normalizePositiveInteger(safeBreaker.failureThreshold, DEFAULT_ROUTER_SETTINGS.circuitBreaker.failureThreshold, { min: 1, max: 20 }),
325
+ initialCooldownMs: normalizePositiveInteger(safeBreaker.initialCooldownMs, DEFAULT_ROUTER_SETTINGS.circuitBreaker.initialCooldownMs, { min: 1000, max: 3600000 }),
326
+ maxCooldownMs: normalizePositiveInteger(safeBreaker.maxCooldownMs, DEFAULT_ROUTER_SETTINGS.circuitBreaker.maxCooldownMs, { min: 1000, max: 3600000 }),
327
+ backoffMultiplier: normalizePositiveInteger(safeBreaker.backoffMultiplier, DEFAULT_ROUTER_SETTINGS.circuitBreaker.backoffMultiplier, { min: 1, max: 10 }),
328
+ }
329
+ }
330
+
331
+ function normalizeRouterFailover(failover) {
332
+ const safeFailover = isPlainObject(failover) ? failover : {}
333
+ return {
334
+ maxRetries: normalizePositiveInteger(safeFailover.maxRetries, DEFAULT_ROUTER_SETTINGS.failover.maxRetries, { min: 1, max: 10 }),
335
+ streamStallTimeoutMs: normalizePositiveInteger(safeFailover.streamStallTimeoutMs, DEFAULT_ROUTER_SETTINGS.failover.streamStallTimeoutMs, { min: 1000, max: 120000 }),
336
+ requestTimeoutMs: normalizePositiveInteger(safeFailover.requestTimeoutMs, DEFAULT_ROUTER_SETTINGS.failover.requestTimeoutMs, { min: 1000, max: 300000 }),
337
+ }
338
+ }
339
+
340
+ function normalizeRouterScoring(scoring) {
341
+ const safeScoring = isPlainObject(scoring) ? scoring : {}
342
+ const numberOrDefault = (value, fallback) => {
343
+ const numeric = Number(value)
344
+ return Number.isFinite(numeric) && numeric >= 0 ? numeric : fallback
345
+ }
346
+ return {
347
+ latencyWeight: numberOrDefault(safeScoring.latencyWeight, DEFAULT_ROUTER_SETTINGS.scoring.latencyWeight),
348
+ uptimeWeight: numberOrDefault(safeScoring.uptimeWeight, DEFAULT_ROUTER_SETTINGS.scoring.uptimeWeight),
349
+ priorityWeight: numberOrDefault(safeScoring.priorityWeight, DEFAULT_ROUTER_SETTINGS.scoring.priorityWeight),
350
+ }
351
+ }
352
+
353
+ /**
354
+ * 📖 normalizeRouterConfig preserves the Smart Router subtree without trusting
355
+ * 📖 arbitrary JSON shapes from disk. It keeps model sets ordered, clamps timing
356
+ * 📖 knobs, and leaves the router absent when no router key exists so upgrades can
357
+ * 📖 still distinguish "not onboarded yet" from "explicitly disabled".
358
+ *
359
+ * @param {unknown} router
360
+ * @returns {object|null}
361
+ */
362
+ export function normalizeRouterConfig(router) {
363
+ if (!isPlainObject(router)) return null
364
+ const sets = normalizeRouterSets(router.sets)
365
+ const activeSet = normalizeRouterName(router.activeSet, DEFAULT_ROUTER_SETTINGS.activeSet)
366
+ const safeActiveSet = sets[activeSet] ? activeSet : (Object.keys(sets)[0] || activeSet)
367
+ const probeMode = ['eco', 'balanced', 'aggressive'].includes(router.probeMode)
368
+ ? router.probeMode
369
+ : DEFAULT_ROUTER_SETTINGS.probeMode
370
+ const logLevel = ['error', 'warn', 'info', 'debug'].includes(router.logLevel)
371
+ ? router.logLevel
372
+ : DEFAULT_ROUTER_SETTINGS.logLevel
373
+
374
+ return {
375
+ enabled: router.enabled === true,
376
+ onboardingSeen: router.onboardingSeen === true,
377
+ autoStartOnBoot: router.autoStartOnBoot === true,
378
+ port: normalizePositiveInteger(router.port, DEFAULT_ROUTER_SETTINGS.port, { min: 1, max: 65535 }),
379
+ activeSet: safeActiveSet,
380
+ sets,
381
+ probeMode,
382
+ probeIntervals: normalizeRouterIntervals(router.probeIntervals),
383
+ circuitBreaker: normalizeRouterCircuitBreaker(router.circuitBreaker),
384
+ failover: normalizeRouterFailover(router.failover),
385
+ scoring: normalizeRouterScoring(router.scoring),
386
+ logLevel,
387
+ }
388
+ }
389
+
230
390
  function normalizeProfileSettings(settings) {
231
391
  const safeSettings = isPlainObject(settings) ? { ...settings } : {}
232
392
  return {
@@ -240,7 +400,7 @@ function normalizeProfileSettings(settings) {
240
400
 
241
401
  function normalizeConfigShape(config) {
242
402
  const safeConfig = isPlainObject(config) ? config : {}
243
- return {
403
+ const normalized = {
244
404
  apiKeys: normalizeApiKeysSection(safeConfig.apiKeys),
245
405
  providers: normalizeProvidersSection(safeConfig.providers),
246
406
  settings: normalizeSettingsSection(safeConfig.settings),
@@ -250,6 +410,9 @@ function normalizeConfigShape(config) {
250
410
 
251
411
 
252
412
  }
413
+ const normalizedRouter = normalizeRouterConfig(safeConfig.router)
414
+ if (normalizedRouter) normalized.router = normalizedRouter
415
+ return normalized
253
416
  }
254
417
 
255
418
  function readStoredConfigSnapshot() {
@@ -322,7 +485,11 @@ export function buildPersistedConfig(incomingConfig, diskConfig = _emptyConfig()
322
485
  ? cloneConfigValue(normalizedIncoming.endpointInstalls)
323
486
  : mergeEndpointInstalls(normalizedDisk.endpointInstalls, normalizedIncoming.endpointInstalls),
324
487
  // 📖 Profile system removed - always null
325
-
488
+ }
489
+ if (Object.prototype.hasOwnProperty.call(normalizedIncoming, 'router')) {
490
+ merged.router = cloneConfigValue(normalizedIncoming.router)
491
+ } else if (Object.prototype.hasOwnProperty.call(normalizedDisk, 'router')) {
492
+ merged.router = cloneConfigValue(normalizedDisk.router)
326
493
  }
327
494
 
328
495
  return normalizeConfigShape(merged)
@@ -840,7 +1007,7 @@ export function isProviderEnabled(config, providerKey) {
840
1007
  /**
841
1008
  * 📖 _emptyProfileSettings: Default TUI settings.
842
1009
  *
843
- * @returns {{ tierFilter: string|null, sortColumn: string, sortAsc: boolean, pingInterval: number, hideUnconfiguredModels: boolean, favoritesPinnedAndSticky: boolean, preferredToolMode: string, theme: string, footerHidden: boolean }}
1010
+ * @returns {{ tierFilter: string|null, sortColumn: string, sortAsc: boolean, pingInterval: number, hideUnconfiguredModels: boolean, favoritesPinnedAndSticky: boolean, preferredToolMode: string, theme: string }}
844
1011
  */
845
1012
  export function _emptyProfileSettings() {
846
1013
  return {
@@ -852,7 +1019,6 @@ export function _emptyProfileSettings() {
852
1019
  favoritesPinnedAndSticky: false, // 📖 default mode keeps favorites as normal starred rows; press Y to pin+stick them.
853
1020
  preferredToolMode: 'opencode', // 📖 remember the last Z-selected launcher across app restarts
854
1021
  theme: 'auto', // 📖 'auto' follows the terminal/OS theme, override with 'dark' or 'light' if needed
855
- footerHidden: false, // 📖 false = full footer shown; true = collapsed to a single "(W) Toggle Footer" hint
856
1022
  }
857
1023
  }
858
1024
 
package/src/constants.js CHANGED
@@ -15,8 +15,8 @@
15
15
  * - `FPS` controls animation frame rate (braille spinner).
16
16
  * - `COL_MODEL` / `COL_MS` control legacy ping-column widths (retained for compat).
17
17
  * - `CELL_W` is derived from `COL_MS` and used by `msCell` / `spinCell`.
18
- * - `TABLE_HEADER_LINES` + `TABLE_FOOTER_LINES` = `TABLE_FIXED_LINES` must stay in sync
19
- * with the actual number of lines rendered by `renderTable()` in bin/.
18
+ * - `TABLE_HEADER_LINES` and footer line counts must stay in sync with the
19
+ * actual number of lines rendered by `renderTable()`.
20
20
  * - `WIDTH_WARNING_MIN_COLS` controls when the narrow-terminal startup warning appears.
21
21
  * - Overlay background colours (chalk.bgRgb) make each overlay panel visually distinct.
22
22
  *
@@ -101,8 +101,8 @@ export const WIDTH_WARNING_MIN_COLS = 80
101
101
 
102
102
  // 📖 Table row-budget constants — must stay in sync with renderTable()'s actual output.
103
103
  // 📖 If this drifts, model rows overflow and can push the title row out of view.
104
- export const TABLE_HEADER_LINES = 5 // 📖 title, filter bar, spacer, column headers, separator
105
- export const TABLE_FOOTER_LINES = 1 // 📖 single toggle-hint line when collapsed, full footer otherwise
104
+ export const TABLE_HEADER_LINES = 2 // 📖 title, column headers
105
+ export const TABLE_FOOTER_LINES = 2 // 📖 actions, links
106
106
  export const TABLE_FIXED_LINES = TABLE_HEADER_LINES + TABLE_FOOTER_LINES
107
107
 
108
108
  // ─── Small cell-formatting helpers ────────────────────────────────────────────
@@ -52,7 +52,7 @@ import { getToolMeta } from './tool-metadata.js'
52
52
  const DIRECT_INSTALL_UNSUPPORTED_PROVIDERS = new Set(['replicate', 'zai', 'rovo', 'gemini', 'opencode-zen'])
53
53
  // 📖 Install Endpoints only lists tools whose persisted config shape is actually supported here.
54
54
  // 📖 Claude Code, Codex, and Gemini stay out while their dedicated bridges are being rebuilt.
55
- const INSTALL_TARGET_MODES = ['opencode', 'opencode-desktop', 'opencode-web', 'openclaw', 'kilo', 'crush', 'goose', 'pi', 'aider', 'qwen', 'openhands', 'amp', 'hermes', 'continue', 'cline']
55
+ const INSTALL_TARGET_MODES = ['opencode', 'opencode-desktop', 'opencode-web', 'openclaw', 'kilo', 'crush', 'goose', 'pi', 'aider', 'qwen', 'openhands', 'amp', 'hermes', 'continue', 'cline', 'fcm_router']
56
56
 
57
57
  function getDefaultPaths() {
58
58
  const home = homedir()
@@ -509,6 +509,48 @@ function installIntoEnvBasedTool(providerKey, models, apiKey, toolMode) {
509
509
  return { path: envFilePath, backupPath, providerId, modelCount: models.length }
510
510
  }
511
511
 
512
+ // 📖 installIntoFcmRouter: adds provider endpoints to the running FCM Router daemon
513
+ // 📖 via the /sets API so the router can use them for failover routing.
514
+ // 📖 Uses the daemon's expected schema: { provider, model, priority } per model entry.
515
+ function installIntoFcmRouter(providerKey, models, apiKey) {
516
+ const baseUrl = `http://localhost:${process.env.FCM_ROUTER_PORT || '19280'}`
517
+ const routerSetName = `fcm-${providerKey}`
518
+ // 📖 Map to the daemon's expected model schema (provider + model + priority)
519
+ const routerModels = models.map((m, index) => ({
520
+ provider: providerKey,
521
+ model: m.modelId,
522
+ priority: index + 1,
523
+ }))
524
+ const payload = { name: routerSetName, models: routerModels }
525
+
526
+ // 📖 Try POST first (creates the set), then PUT to update if it already exists.
527
+ // 📖 Both are fire-and-forget: the daemon may not be running during install,
528
+ // 📖 and that's OK — the set will be picked up on next daemon restart via config.
529
+ void (async () => {
530
+ try {
531
+ const createRes = await fetch(`${baseUrl}/sets`, {
532
+ method: 'POST',
533
+ headers: { 'Content-Type': 'application/json' },
534
+ body: JSON.stringify(payload),
535
+ signal: AbortSignal.timeout(3000),
536
+ })
537
+ // 📖 If the set already exists (name conflict), update it via PUT
538
+ if (!createRes.ok) {
539
+ await fetch(`${baseUrl}/sets/${encodeURIComponent(routerSetName)}`, {
540
+ method: 'PUT',
541
+ headers: { 'Content-Type': 'application/json' },
542
+ body: JSON.stringify(payload),
543
+ signal: AbortSignal.timeout(3000),
544
+ }).catch(() => {})
545
+ }
546
+ } catch {
547
+ // 📖 Daemon unreachable — silently ignore, user can restart daemon later
548
+ }
549
+ })()
550
+
551
+ return { path: `FCM Router (${baseUrl})`, backupPath: null, providerId: providerKey, modelCount: models.length }
552
+ }
553
+
512
554
  export function installProviderEndpoints(config, providerKey, toolMode, options = {}) {
513
555
  const canonicalToolMode = canonicalizeToolMode(toolMode)
514
556
  const support = getDirectInstallSupport(providerKey)
@@ -544,6 +586,8 @@ export function installProviderEndpoints(config, providerKey, toolMode, options
544
586
  installResult = installIntoQwen(providerKey, models, apiKey, paths)
545
587
  } else if (canonicalToolMode === 'openhands') {
546
588
  installResult = installIntoEnvBasedTool(providerKey, models, apiKey, canonicalToolMode, paths)
589
+ } else if (canonicalToolMode === 'fcm_router') {
590
+ installResult = installIntoFcmRouter(providerKey, models, apiKey)
547
591
  } else {
548
592
  throw new Error(`Unsupported install target: ${toolMode}`)
549
593
  }
package/src/favorites.js CHANGED
@@ -103,3 +103,25 @@ export function toggleFavoriteModel(config, providerKey, modelId) {
103
103
  if (saveResult.success) replaceConfigContents(config, latestConfig)
104
104
  return true
105
105
  }
106
+
107
+ /**
108
+ * 📖 Move a favorite up or down in the priority order and persist.
109
+ * @param {Record<string, unknown>} config
110
+ * @param {string} providerKey
111
+ * @param {string} modelId
112
+ * @param {'up'|'down'} direction
113
+ * @returns {boolean} true if reorder succeeded
114
+ */
115
+ export function reorderFavorite(config, providerKey, modelId, direction) {
116
+ const latestConfig = loadConfig()
117
+ ensureFavoritesConfig(latestConfig)
118
+ const favoriteKey = toFavoriteKey(providerKey, modelId)
119
+ const idx = latestConfig.favorites.indexOf(favoriteKey)
120
+ if (idx < 0) return false
121
+ const swapIdx = direction === 'up' ? idx - 1 : idx + 1
122
+ if (swapIdx < 0 || swapIdx >= latestConfig.favorites.length) return false
123
+ ;[latestConfig.favorites[idx], latestConfig.favorites[swapIdx]] = [latestConfig.favorites[swapIdx], latestConfig.favorites[idx]]
124
+ const saveResult = saveConfig(latestConfig, { replaceFavorites: true })
125
+ if (saveResult.success) replaceConfigContents(config, latestConfig)
126
+ return true
127
+ }
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "users_vava_documents_github_free_coding_models_src_utils_js", "label": "utils.js", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L1"}, {"id": "utils_getavg", "label": "getAvg()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L90"}, {"id": "utils_getverdict", "label": "getVerdict()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L118"}, {"id": "utils_getuptime", "label": "getUptime()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L150"}, {"id": "utils_getp95", "label": "getP95()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L163"}, {"id": "utils_getjitter", "label": "getJitter()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L175"}, {"id": "utils_getstabilityscore", "label": "getStabilityScore()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L197"}, {"id": "utils_sortresults", "label": "sortResults()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L238"}, {"id": "utils_filterbytier", "label": "filterByTier()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L339"}, {"id": "utils_findbestmodel", "label": "findBestModel()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L356"}, {"id": "utils_parseargs", "label": "parseArgs()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L402"}, {"id": "utils_parsectxtok", "label": "parseCtxToK()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L573"}, {"id": "utils_formatctxwindow", "label": "formatCtxWindow()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L583"}, {"id": "utils_labelfromid", "label": "labelFromId()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L591"}, {"id": "utils_parseswetonum", "label": "parseSweToNum()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L602"}, {"id": "utils_scoremodelfortask", "label": "scoreModelForTask()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L627"}, {"id": "utils_gettoprecommendations", "label": "getTopRecommendations()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L703"}, {"id": "utils_getversionstatusinfo", "label": "getVersionStatusInfo()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L730"}, {"id": "utils_formatresultsasjson", "label": "formatResultsAsJSON()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L796"}], "edges": [{"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getavg", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L90", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getverdict", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L118", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getuptime", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L150", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getp95", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L163", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getjitter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L175", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getstabilityscore", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L197", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_sortresults", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L238", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_filterbytier", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L339", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_findbestmodel", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L356", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_parseargs", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L402", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_parsectxtok", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L573", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_formatctxwindow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L583", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_labelfromid", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L591", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_parseswetonum", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L602", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_scoremodelfortask", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L627", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_gettoprecommendations", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L703", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_getversionstatusinfo", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L730", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_utils_js", "target": "utils_formatresultsasjson", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L796", "weight": 1.0}, {"source": "utils_getverdict", "target": "utils_getavg", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L119", "weight": 1.0}, {"source": "utils_getverdict", "target": "utils_getp95", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L129", "weight": 1.0}, {"source": "utils_getstabilityscore", "target": "utils_getp95", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L201", "weight": 1.0}, {"source": "utils_getstabilityscore", "target": "utils_getjitter", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L202", "weight": 1.0}, {"source": "utils_getstabilityscore", "target": "utils_getuptime", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L203", "weight": 1.0}, {"source": "utils_scoremodelfortask", "target": "utils_parseswetonum", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L634", "weight": 1.0}, {"source": "utils_scoremodelfortask", "target": "utils_getavg", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L638", "weight": 1.0}, {"source": "utils_scoremodelfortask", "target": "utils_parsectxtok", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L650", "weight": 1.0}, {"source": "utils_scoremodelfortask", "target": "utils_getstabilityscore", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L663", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_getavg", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L91"}, {"caller_nid": "utils_getavg", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L93"}, {"caller_nid": "utils_getavg", "callee": "reduce", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L93"}, {"caller_nid": "utils_getverdict", "callee": "some", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L120"}, {"caller_nid": "utils_getverdict", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L128"}, {"caller_nid": "utils_getuptime", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L152"}, {"caller_nid": "utils_getuptime", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L153"}, {"caller_nid": "utils_getp95", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L164"}, {"caller_nid": "utils_getp95", "callee": "sort", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L166"}, {"caller_nid": "utils_getp95", "callee": "map", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L166"}, {"caller_nid": "utils_getp95", "callee": "ceil", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L167"}, {"caller_nid": "utils_getp95", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L168"}, {"caller_nid": "utils_getjitter", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L176"}, {"caller_nid": "utils_getjitter", "callee": "reduce", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L178"}, {"caller_nid": "utils_getjitter", "callee": "reduce", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L179"}, {"caller_nid": "utils_getjitter", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L180"}, {"caller_nid": "utils_getjitter", "callee": "sqrt", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L180"}, {"caller_nid": "utils_getstabilityscore", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L198"}, {"caller_nid": "utils_getstabilityscore", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L204"}, {"caller_nid": "utils_getstabilityscore", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L208"}, {"caller_nid": "utils_getstabilityscore", "callee": "min", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L208"}, {"caller_nid": "utils_getstabilityscore", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L209"}, {"caller_nid": "utils_getstabilityscore", "callee": "min", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L209"}, {"caller_nid": "utils_getstabilityscore", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L210"}, {"caller_nid": "utils_getstabilityscore", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L215"}, {"caller_nid": "utils_sortresults", "callee": "sort", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L239"}, {"caller_nid": "utils_filterbytier", "callee": "toUpperCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L340"}, {"caller_nid": "utils_filterbytier", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L343"}, {"caller_nid": "utils_findbestmodel", "callee": "sort", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L357"}, {"caller_nid": "utils_parseargs", "callee": "slice", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L403"}, {"caller_nid": "utils_parseargs", "callee": "findIndex", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L408"}, {"caller_nid": "utils_parseargs", "callee": "startsWith", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L409"}, {"caller_nid": "utils_parseargs", "callee": "findIndex", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L414"}, {"caller_nid": "utils_parseargs", "callee": "startsWith", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L415"}, {"caller_nid": "utils_parseargs", "callee": "findIndex", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L419"}, {"caller_nid": "utils_parseargs", "callee": "startsWith", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L420"}, {"caller_nid": "utils_parseargs", "callee": "findIndex", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L424"}, {"caller_nid": "utils_parseargs", "callee": "startsWith", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L425"}, {"caller_nid": "utils_parseargs", "callee": "add", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L431"}, {"caller_nid": "utils_parseargs", "callee": "add", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L432"}, {"caller_nid": "utils_parseargs", "callee": "add", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L433"}, {"caller_nid": "utils_parseargs", "callee": "add", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L434"}, {"caller_nid": "utils_parseargs", "callee": "entries", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L436"}, {"caller_nid": "utils_parseargs", "callee": "startsWith", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L437"}, {"caller_nid": "utils_parseargs", "callee": "push", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L438"}, {"caller_nid": "utils_parseargs", "callee": "toLowerCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L438"}, {"caller_nid": "utils_parseargs", "callee": "has", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L439"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L446"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L447"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L448"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L449"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L450"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L451"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L452"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L453"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L454"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L455"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L456"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L457"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L458"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L459"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L460"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L461"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L462"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L463"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L464"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L465"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L466"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L467"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L468"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L469"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L470"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L470"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L471"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L472"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L473"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L474"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L475"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L478"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L478"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L481"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L482"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L483"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L484"}, {"caller_nid": "utils_parseargs", "callee": "toUpperCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L486"}, {"caller_nid": "utils_parseargs", "callee": "toLowerCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L487"}, {"caller_nid": "utils_parseargs", "callee": "parseInt", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L489"}, {"caller_nid": "utils_parseargs", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L495"}, {"caller_nid": "utils_parsectxtok", "callee": "toLowerCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L575"}, {"caller_nid": "utils_parsectxtok", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L576"}, {"caller_nid": "utils_parsectxtok", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L576"}, {"caller_nid": "utils_parsectxtok", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L576"}, {"caller_nid": "utils_parsectxtok", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L577"}, {"caller_nid": "utils_parsectxtok", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L577"}, {"caller_nid": "utils_parsectxtok", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L577"}, {"caller_nid": "utils_formatctxwindow", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L585"}, {"caller_nid": "utils_formatctxwindow", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L586"}, {"caller_nid": "utils_labelfromid", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L592"}, {"caller_nid": "utils_labelfromid", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L593"}, {"caller_nid": "utils_labelfromid", "callee": "pop", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L593"}, {"caller_nid": "utils_labelfromid", "callee": "split", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L593"}, {"caller_nid": "utils_labelfromid", "callee": "join", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L594"}, {"caller_nid": "utils_labelfromid", "callee": "map", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L594"}, {"caller_nid": "utils_labelfromid", "callee": "split", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L594"}, {"caller_nid": "utils_parseswetonum", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L604"}, {"caller_nid": "utils_parseswetonum", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L604"}, {"caller_nid": "utils_parseswetonum", "callee": "isNaN", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L605"}, {"caller_nid": "utils_scoremodelfortask", "callee": "min", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L635"}, {"caller_nid": "utils_scoremodelfortask", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L643"}, {"caller_nid": "utils_scoremodelfortask", "callee": "min", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L643"}, {"caller_nid": "utils_scoremodelfortask", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L657"}, {"caller_nid": "utils_scoremodelfortask", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L687"}, {"caller_nid": "utils_scoremodelfortask", "callee": "min", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L687"}, {"caller_nid": "utils_scoremodelfortask", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L687"}, {"caller_nid": "utils_gettoprecommendations", "callee": "sort", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L704"}, {"caller_nid": "utils_gettoprecommendations", "callee": "map", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L704"}, {"caller_nid": "utils_gettoprecommendations", "callee": "filter", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L704"}, {"caller_nid": "utils_gettoprecommendations", "callee": "slice", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L709"}, {"caller_nid": "utils_getversionstatusinfo", "callee": "trim", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L738"}, {"caller_nid": "utils_getversionstatusinfo", "callee": "trim", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L741"}, {"caller_nid": "utils_getversionstatusinfo", "callee": "trim", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L745"}, {"caller_nid": "utils_getversionstatusinfo", "callee": "trim", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L748"}, {"caller_nid": "utils_formatresultsasjson", "callee": "slice", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L797"}, {"caller_nid": "utils_formatresultsasjson", "callee": "map", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L797"}, {"caller_nid": "utils_formatresultsasjson", "callee": "stringify", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/utils.js", "source_location": "L818"}]}
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "users_vava_documents_github_free_coding_models_src_ping_js", "label": "ping.js", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L1"}, {"id": "ping_resolvecloudflareurl", "label": "resolveCloudflareUrl()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L46"}, {"id": "ping_buildpingrequest", "label": "buildPingRequest()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L56"}, {"id": "ping_ping", "label": "ping()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L102"}, {"id": "ping_getheadervalue", "label": "getHeaderValue()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L134"}, {"id": "ping_extractquotapercent", "label": "extractQuotaPercent()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L143"}, {"id": "ping_fetchproviderquotapercent", "label": "fetchProviderQuotaPercent()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L170"}, {"id": "ping_getproviderquotapercentcached", "label": "getProviderQuotaPercentCached()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L177"}, {"id": "ping_usageplaceholderforprovider", "label": "usagePlaceholderForProvider()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L184"}], "edges": [{"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "users_vava_documents_github_free_coding_models_src_constants_ts", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L40", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "users_vava_documents_github_free_coding_models_src_provider_quota_fetchers_ts", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L41", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "users_vava_documents_github_free_coding_models_src_quota_capabilities_ts", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L42", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_resolvecloudflareurl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L46", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_buildpingrequest", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L56", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_ping", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L102", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_getheadervalue", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L134", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_extractquotapercent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L143", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_fetchproviderquotapercent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L170", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_getproviderquotapercentcached", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L177", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_ping_js", "target": "ping_usageplaceholderforprovider", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L184", "weight": 1.0}, {"source": "ping_buildpingrequest", "target": "ping_resolvecloudflareurl", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L76", "weight": 1.0}, {"source": "ping_ping", "target": "ping_buildpingrequest", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L107", "weight": 1.0}, {"source": "ping_ping", "target": "ping_extractquotapercent", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L118", "weight": 1.0}, {"source": "ping_extractquotapercent", "target": "ping_getheadervalue", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L152", "weight": 1.0}, {"source": "ping_getproviderquotapercentcached", "target": "ping_fetchproviderquotapercent", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L178", "weight": 1.0}], "raw_calls": [{"caller_nid": "ping_resolvecloudflareurl", "callee": "trim", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L47"}, {"caller_nid": "ping_resolvecloudflareurl", "callee": "includes", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L48"}, {"caller_nid": "ping_resolvecloudflareurl", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L49"}, {"caller_nid": "ping_resolvecloudflareurl", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L50"}, {"caller_nid": "ping_resolvecloudflareurl", "callee": "encodeURIComponent", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L50"}, {"caller_nid": "ping_buildpingrequest", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L58"}, {"caller_nid": "ping_ping", "callee": "setTimeout", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L104"}, {"caller_nid": "ping_ping", "callee": "now", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L105"}, {"caller_nid": "ping_ping", "callee": "fetch", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L108"}, {"caller_nid": "ping_ping", "callee": "stringify", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L111"}, {"caller_nid": "ping_ping", "callee": "String", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L114"}, {"caller_nid": "ping_ping", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L117"}, {"caller_nid": "ping_ping", "callee": "now", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L117"}, {"caller_nid": "ping_ping", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L124"}, {"caller_nid": "ping_ping", "callee": "now", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L124"}, {"caller_nid": "ping_ping", "callee": "clearTimeout", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L128"}, {"caller_nid": "ping_getheadervalue", "callee": "get", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L136"}, {"caller_nid": "ping_getheadervalue", "callee": "toLowerCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L137"}, {"caller_nid": "ping_extractquotapercent", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L154"}, {"caller_nid": "ping_extractquotapercent", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L155"}, {"caller_nid": "ping_extractquotapercent", "callee": "isFinite", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L156"}, {"caller_nid": "ping_extractquotapercent", "callee": "isFinite", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L156"}, {"caller_nid": "ping_extractquotapercent", "callee": "round", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L157"}, {"caller_nid": "ping_extractquotapercent", "callee": "max", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L158"}, {"caller_nid": "ping_extractquotapercent", "callee": "min", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L158"}, {"caller_nid": "ping_fetchproviderquotapercent", "callee": "_fetchProviderQuotaFromModule", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L171"}, {"caller_nid": "ping_usageplaceholderforprovider", "callee": "supportsUsagePercent", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/ping.js", "source_location": "L185"}]}
@@ -0,0 +1 @@
1
+ {"nodes": [{"id": "users_vava_documents_github_free_coding_models_src_model_merger_js", "label": "model-merger.js", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L1"}, {"id": "model_merger_parsectxk", "label": "parseCtxK()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L3"}, {"id": "model_merger_parseswepercent", "label": "parseSwePercent()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L10"}, {"id": "model_merger_slugify", "label": "slugify()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L19"}, {"id": "model_merger_buildmergedmodels", "label": "buildMergedModels()", "file_type": "code", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L47"}], "edges": [{"source": "users_vava_documents_github_free_coding_models_src_model_merger_js", "target": "model_merger_parsectxk", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L3", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_model_merger_js", "target": "model_merger_parseswepercent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L10", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_model_merger_js", "target": "model_merger_slugify", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L19", "weight": 1.0}, {"source": "users_vava_documents_github_free_coding_models_src_model_merger_js", "target": "model_merger_buildmergedmodels", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L47", "weight": 1.0}, {"source": "model_merger_buildmergedmodels", "target": "model_merger_parseswepercent", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L63", "weight": 1.0}, {"source": "model_merger_buildmergedmodels", "target": "model_merger_parsectxk", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L67", "weight": 1.0}], "raw_calls": [{"caller_nid": "model_merger_parsectxk", "callee": "toLowerCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L5"}, {"caller_nid": "model_merger_parsectxk", "callee": "endsWith", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L6"}, {"caller_nid": "model_merger_parsectxk", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L6"}, {"caller_nid": "model_merger_parsectxk", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L7"}, {"caller_nid": "model_merger_parseswepercent", "callee": "parseFloat", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L11"}, {"caller_nid": "model_merger_slugify", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L20"}, {"caller_nid": "model_merger_slugify", "callee": "replace", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L20"}, {"caller_nid": "model_merger_slugify", "callee": "toLowerCase", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L20"}, {"caller_nid": "model_merger_slugify", "callee": "has", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L23"}, {"caller_nid": "model_merger_slugify", "callee": "add", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L26"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "has", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L51"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "set", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L52"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "get", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L55"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "push", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L56"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "map", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L73"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "from", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L73"}, {"caller_nid": "model_merger_buildmergedmodels", "callee": "values", "source_file": "/Users/vava/Documents/GitHub/free-coding-models/src/model-merger.js", "source_location": "L73"}]}