free-coding-models 0.5.50 โ†’ 0.5.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -809,6 +809,7 @@ Telemetry is enabled by default and can be disabled with any of the following:
809
809
  <td align="center" width="120"><a href="https://github.com/serajbaltu"><img src="https://avatars.githubusercontent.com/u/90699173?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="serajbaltu"></a></td>
810
810
  <td align="center" width="120"><a href="https://github.com/stgreenb"><img src="https://avatars.githubusercontent.com/u/18483964?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="stgreenb"></a></td>
811
811
  <td align="center" width="120"><a href="https://github.com/MoriDanWork"><img src="https://avatars.githubusercontent.com/u/55363096?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="MoriDanWork"></a></td>
812
+ <td align="center" width="120"><a href="https://github.com/fan92rus"><img src="https://avatars.githubusercontent.com/u/13201333?v=4&s=80" width="80" height="80" style="border-radius:50%" alt="fan92rus"></a></td>
812
813
  </tr>
813
814
  <tr>
814
815
  <td align="center"><a href="https://github.com/vava-nessa"><sub><b>vava-nessa</b></sub></a></td>
@@ -820,6 +821,10 @@ Telemetry is enabled by default and can be disabled with any of the following:
820
821
  <td align="center"><a href="https://github.com/serajbaltu"><sub><b>serajbaltu</b></sub></a></td>
821
822
  <td align="center"><a href="https://github.com/stgreenb"><sub><b>stgreenb</b></sub></a></td>
822
823
  <td align="center"><a href="https://github.com/MoriDanWork"><sub><b>MoriDanWork</b></sub></a></td>
824
+ <td align="center"><a href="https://github.com/fan92rus"><sub><b>fan92rus</b></sub></a></td>
825
+ </tr>
826
+ <tr>
827
+ <td align="center" colspan="10"><sub>๐Ÿ›ก๏ธ <b>fan92rus</b> โ€” Windows path traversal fix (<code>path.sep</code>)</sub></td>
823
828
  </tr>
824
829
  </table>
825
830
 
@@ -0,0 +1,15 @@
1
+ # Changelog v0.5.51 - 2026-07-25
2
+
3
+ ### Fixed
4
+ - ๐Ÿ›ก๏ธ **Windows path traversal protection** โ€” `serveWebStaticFile()` in `src/core/router-daemon.js` now uses `path.sep` instead of a hardcoded `/` for the path traversal guard. On Windows, `path.resolve()` returns backslash separators, which made the previous `candidate.startsWith(WEB_DIST_DIR + '/')` check always fail and serve `path_traversal_blocked` for every root request. On Linux/macOS, `path.sep === '/'` so behaviour is unchanged. *(Thanks @fan92rus! First contribution ๐ŸŽ‰)*
5
+
6
+ ### Changed
7
+ - ๐Ÿ“ฆ **Deps:** bump `@tanstack/react-virtual` from `3.14.3` โ†’ `3.14.5`
8
+ - ๐Ÿ“ฆ **DevDeps:** bump `@vitejs/plugin-react` from `6.0.2` โ†’ `6.0.3`
9
+
10
+ ### Maintenance
11
+ - ๐Ÿงน **kandown housekeeping:** drop stale `AGENT.md` / `AGENT_KANDOWN.md` copies, repair install, refresh agent ref
12
+ - ๐Ÿงน **fcm-agent fixes:** `direct-scanner.js`, `ranker.js`, `scan-orchestrator.js`, `pi-progress-renderer.js`, and `extensions/index.js` refinements (312+/46-)
13
+
14
+ ### Contributors
15
+ - **@fan92rus** โ€” Windows path traversal fix (`path.sep`). Welcome aboard! ๐Ÿ›ก๏ธ๐ŸŽ‰
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-coding-models",
3
- "version": "0.5.50",
3
+ "version": "0.5.51",
4
4
  "description": "Find the fastest coding LLM models in seconds โ€” ping free models from multiple providers, pick the best one for OpenCode, Cursor, or any AI coding assistant.",
5
5
  "keywords": [
6
6
  "nvidia",
@@ -31,7 +31,7 @@
31
31
 
32
32
  import { createServer } from 'node:http'
33
33
  import { existsSync, readFileSync } from 'node:fs'
34
- import { dirname, join, resolve as resolvePath } from 'node:path'
34
+ import { dirname, join, resolve as resolvePath, sep as pathSep } from 'node:path'
35
35
  import { fork } from 'node:child_process'
36
36
  import { randomUUID } from 'node:crypto'
37
37
  import { appendFileSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs'
@@ -434,7 +434,7 @@ function serveWebStaticFile(res, pathname, requestId) {
434
434
  // ๐Ÿ“– Without this, `pathname` like `/../../etc/passwd` escapes the dist root.
435
435
  const requested = pathname === '/' ? 'index.html' : pathname.replace(/^\/+/, '')
436
436
  const candidate = resolvePath(WEB_DIST_DIR, requested)
437
- if (candidate !== WEB_DIST_DIR && !candidate.startsWith(WEB_DIST_DIR + '/')) {
437
+ if (candidate !== WEB_DIST_DIR && !candidate.startsWith(WEB_DIST_DIR + pathSep)) {
438
438
  sendError(res, 403, 'Forbidden', 'invalid_request_error', 'path_traversal_blocked', requestId)
439
439
  return
440
440
  }
@@ -454,7 +454,7 @@ function serveWebStaticFile(res, pathname, requestId) {
454
454
 
455
455
  if (stats.isDirectory()) {
456
456
  const dirIndex = resolvePath(candidate, 'index.html')
457
- if (dirIndex.startsWith(WEB_DIST_DIR + '/') && existsSync(dirIndex)) {
457
+ if (dirIndex.startsWith(WEB_DIST_DIR + pathSep) && existsSync(dirIndex)) {
458
458
  serveStaticFromDist(res, dirIndex)
459
459
  return
460
460
  }