Commit Graph
4139 Commits
Author SHA1 Message Date
github-actions[bot] aecd8beb54 chore(release): 8.1.0-dev.7 2026-05-24 16:37:11 +00:00
Kai (Tam Nhu) TranandGitHub f1ba01334a Merge pull request #1392 from kaitranntt/kai/fix/1390-analytics-disclaimer-shrink
fix(analytics): tighten profile-aware top bar (disclaimer + trigger + timestamp)
2026-05-24 12:33:44 -04:00
Tam Nhu Tran bfa4c704eb fix(analytics): tighten top-bar layout (single-line trigger, grouped cluster, compact timestamp)
Three design taste fixes that ride on top of the disclaimer collapse:

- Single-line profile trigger: render only `option.label` in the
  Select trigger; keep label+description in the open menu where the
  description earns its keep. Removes the two-line trigger that broke
  the row baseline (taller pill, vertical-center cascade).
- Group Select + Info icon in an `inline-flex … shrink-0` cluster so
  they wrap as a single unit and the icon never orphans onto a second
  row under the refresh button.
- Compact timestamp: "Updated less than a minute ago" → "1m ago"
  rendered in font-mono. Full phrase preserved via `title`
  attribute. Drops the localized prefix into a tooltip-only context.
- Trigger width trimmed 190px → 170px since it no longer needs to fit
  a description line.
2026-05-24 11:34:57 -04:00
Tam Nhu Tran 9130c7d869 fix(analytics): collapse profile-scope disclaimer into tooltip icon
The disclaimer paragraph rendered as a two-line block under the
controls row, eating vertical real-estate while the cards stayed
empty. Replace it with a small Info icon beside the profile
dropdown that surfaces the same copy in a tooltip on hover/focus.

- Same copy preserved verbatim; no informational loss
- Icon only renders when a non-All profile is selected
- Reclaims ~32px of vertical space on the analytics header

Closes #1390
2026-05-23 23:40:02 -04:00
github-actions[bot] 0a482bd2d3 chore(release): 8.1.0-dev.6 2026-05-24 02:41:07 +00:00
Kai (Tam Nhu) TranandGitHub 88fbac3a32 fix(channels): avoid secrets in --set-token argv (#1389) 2026-05-23 22:37:55 -04:00
Kai (Tam Nhu) TranandGitHub fec84417a6 fix(web): avoid runtime proxy probes on public masked settings route (#1388) 2026-05-23 22:37:49 -04:00
Kai (Tam Nhu) TranandGitHub b35a23a6e4 fix: reject unsupported image analysis backends (#1387)
* fix: reject unsupported image analysis backends

* style: apply prettier formatting
2026-05-23 22:37:44 -04:00
Kai (Tam Nhu) TranandGitHub 4cf840ea0a fix(cliproxy): prevent management key leak on runtime proxy overrides (#1386)
* fix(cliproxy): clear yaml management key on runtime overrides

* style: apply prettier formatting
2026-05-23 22:37:39 -04:00
github-actions[bot] 2237011b59 chore(release): 8.1.0-dev.5 2026-05-24 02:14:01 +00:00
Kai (Tam Nhu) TranandGitHub ba887e012a fix(cursor-daemon): widen safeResolve type for daemonToken (#1385)
* fix(cursor-daemon): auto-generate token + expose for callers

PRs #1373/#1377 gated cursor daemon endpoints behind a token check, but
startDaemon() did not generate or expose a token. Health-check probing
during startup then 401'd against the new auth, so startDaemon waited 30s
then reported failure. Same for tests asserting /404 and validation
behavior — they couldn't reach the downstream logic past the 401 gate.

- Auto-generate a 32-byte hex token in startDaemon when caller did not
  provide one
- Return daemonToken in startDaemon result so callers/tests can attach it
- Update integration tests to include x-ccs-cursor-token header

* fix(cursor-daemon): widen safeResolve type for daemonToken field
2026-05-23 22:09:53 -04:00
Kai (Tam Nhu) TranandGitHub b7d5ce178a fix(cursor-daemon): auto-generate token + expose for callers (#1384)
PRs #1373/#1377 gated cursor daemon endpoints behind a token check, but
startDaemon() did not generate or expose a token. Health-check probing
during startup then 401'd against the new auth, so startDaemon waited 30s
then reported failure. Same for tests asserting /404 and validation
behavior — they couldn't reach the downstream logic past the 401 gate.

- Auto-generate a 32-byte hex token in startDaemon when caller did not
  provide one
- Return daemonToken in startDaemon result so callers/tests can attach it
- Update integration tests to include x-ccs-cursor-token header
2026-05-23 22:07:15 -04:00
Kai (Tam Nhu) TranandGitHub b63943eb45 fix(browser): track explicit devtools_port from config (#1383)
#1369 unconditionally set hasExplicitDevtoolsPort=false for config-attach,
which broke users who explicitly set devtools_port in config. Now track
whether config.claude.devtools_port was actually provided.
2026-05-23 21:55:02 -04:00
Kai (Tam Nhu) TranandGitHub f985cec3ff fix(browser): avoid implicit explicit devtools port for config attach (#1369)
* fix(browser): avoid implicit explicit devtools port for config attach

* style: apply prettier formatting
2026-05-23 21:46:04 -04:00
Kai (Tam Nhu) TranandGitHub e59ee6df79 docs(docker): avoid exposing dashboard password in examples (#1382) 2026-05-23 21:45:17 -04:00
Kai (Tam Nhu) TranandGitHub 7ccea955ad docs(docker): harden remote token migration staging (#1381) 2026-05-23 21:45:15 -04:00
Kai (Tam Nhu) TranandGitHub 55cd78bce4 fix: create explicit CODEX_HOME with secure permissions (#1380) 2026-05-23 21:45:12 -04:00
Kai (Tam Nhu) TranandGitHub 90d5ca2cbb fix(proxy): honor backpressure in cliproxy local streaming (#1379) 2026-05-23 21:45:09 -04:00
Kai (Tam Nhu) TranandGitHub 0db9705d75 fix(claude-extension): enforce private permissions for settings writes (#1378) 2026-05-23 21:45:07 -04:00
Kai (Tam Nhu) TranandGitHub 210ab761e2 fix(cursor): enforce auth token for anthropic daemon route (#1377) 2026-05-23 21:45:05 -04:00
Kai (Tam Nhu) TranandGitHub 781c84b04b fix: narrow legacy GLMT base URL normalization (#1376)
* fix: narrow legacy glmt base url normalization

* style: apply prettier formatting
2026-05-23 21:45:02 -04:00
Kai (Tam Nhu) TranandGitHub b0a754179c fix(codex): cap buffered upstream error response size (#1375) 2026-05-23 21:45:00 -04:00
Kai (Tam Nhu) TranandGitHub cba1414b7e fix(ci): qualify docker release checkout refs (#1374)
* fix(ci): qualify docker release checkout refs

* style: apply prettier formatting
2026-05-23 21:44:57 -04:00
Kai (Tam Nhu) TranandGitHub 03a30119d9 fix(cursor): authenticate local daemon health/runtime traffic (#1373) 2026-05-23 21:44:55 -04:00
Kai (Tam Nhu) TranandGitHub 6c0f7ac39c fix(dashboard): clear local control-panel management key (#1372) 2026-05-23 21:44:53 -04:00
Kai (Tam Nhu) TranandGitHub e6f764c79b fix(cursor): block cross-origin runtime probe requests (#1371) 2026-05-23 21:44:50 -04:00
Kai (Tam Nhu) TranandGitHub 37fdf90e30 fix(ci): constrain PR-Agent GitHub App token permissions (#1370)
* fix(ci): constrain pr-agent app token permissions

* style: apply prettier formatting
2026-05-23 21:44:47 -04:00
Kai (Tam Nhu) TranandGitHub 4e7894a3da fix: honor browser eval env override in attach config (#1368) 2026-05-23 21:44:44 -04:00
Kai (Tam Nhu) TranandGitHub c322829f44 fix(browser): cap click and key repeat counts in MCP (#1367)
* fix(browser): cap click and key repeat counts in MCP

* style: apply prettier formatting
2026-05-23 21:44:42 -04:00
Kai (Tam Nhu) TranandGitHub 8b3ba5532e fix(browser): log only matched intercepted requests (#1366) 2026-05-23 21:44:40 -04:00
Kai (Tam Nhu) TranandGitHub 2188cdc990 fix(cliproxy): clean up upstream proxy on response disconnect (#1361)
* fix(cliproxy): clean up upstream proxy on response disconnect

* style: apply prettier formatting
2026-05-23 21:44:37 -04:00
Kai (Tam Nhu) TranandGitHub e658e838f9 fix(cliproxy): scrub GitLab PAT env after token-login auth (#1360)
* fix(cliproxy): scrub gitlab pat env var after auth handoff

* style: apply prettier formatting
2026-05-23 21:44:35 -04:00
Kai (Tam Nhu) TranandGitHub 2ec23c6c3a fix(sse): make CRLF normalization chunk-boundary safe (#1359)
* fix(sse): handle CRLF split across chunk boundaries

* style: apply prettier formatting
2026-05-23 21:44:32 -04:00
Kai (Tam Nhu) TranandGitHub 21764d5b90 fix(web): harden localhost guard against DNS rebinding (#1357)
* fix(web): harden localhost guard against DNS rebinding

* style: apply prettier formatting
2026-05-23 21:44:19 -04:00
Kai (Tam Nhu) TranandGitHub 0bd2e577b2 fix(codex-auth): restrict symlink fallback and harden copy path (#1365) 2026-05-23 21:43:51 -04:00
github-actions[bot] 1065f68eae chore(release): 8.1.0-dev.4 2026-05-24 01:42:35 +00:00
Kai (Tam Nhu) TranandGitHub 9357f4df26 fix(cliproxy): redact generic token query params in oauth trace (#1364) 2026-05-23 21:39:05 -04:00
github-actions[bot] 65ced77c4c chore(release): 8.1.0-dev.3 2026-05-24 01:37:41 +00:00
Kai (Tam Nhu) TranandGitHub d9616447f9 fix(web-server): stop startup local prefix sync secret leak (#1362) 2026-05-23 21:24:18 -04:00
github-actions[bot] 7606a31b8e chore(release): 8.1.0-dev.2 2026-05-24 01:23:22 +00:00
Kai (Tam Nhu) TranandGitHub aef331d8ef fix(docker): pin runtime deps to committed bun lockfile (#1358) 2026-05-23 21:19:31 -04:00
github-actions[bot] 1e834b8478 chore(release): 8.1.0-dev.1 2026-05-24 01:18:20 +00:00
Kai (Tam Nhu) TranandGitHub ab379e9e13 fix: disable docker legacy API key auth by default (#1355) 2026-05-23 21:03:24 -04:00
semantic-release-bot c21f589247 chore(release): 8.1.0 [skip ci]
## [8.1.0](https://github.com/kaitranntt/ccs/compare/v8.0.0...v8.1.0) (2026-05-23)

### Features

* **release:** promote dev to main — security hardening batch ([#1351](https://github.com/kaitranntt/ccs/issues/1351)) ([aed942f](https://github.com/kaitranntt/ccs/commit/aed942f51bc4f2dd1db52302d8cea3185a2bb192)), closes [#1340](https://github.com/kaitranntt/ccs/issues/1340) [#1341](https://github.com/kaitranntt/ccs/issues/1341) [#1342](https://github.com/kaitranntt/ccs/issues/1342) [#1344](https://github.com/kaitranntt/ccs/issues/1344) [#1346](https://github.com/kaitranntt/ccs/issues/1346) [#1347](https://github.com/kaitranntt/ccs/issues/1347) [#1348](https://github.com/kaitranntt/ccs/issues/1348) [#1349](https://github.com/kaitranntt/ccs/issues/1349) [#1350](https://github.com/kaitranntt/ccs/issues/1350) [#1345](https://github.com/kaitranntt/ccs/issues/1345) [#1353](https://github.com/kaitranntt/ccs/issues/1353) [#1340](https://github.com/kaitranntt/ccs/issues/1340) [#1354](https://github.com/kaitranntt/ccs/issues/1354) [#1347](https://github.com/kaitranntt/ccs/issues/1347) [#1352](https://github.com/kaitranntt/ccs/issues/1352)

### Bug Fixes

* **analytics:** harden sqlite3 invocation for native Droid usage scan ([#1347](https://github.com/kaitranntt/ccs/issues/1347)) ([469c9ff](https://github.com/kaitranntt/ccs/commit/469c9ffde44ca7bba8c9e33365d92b9a819cdec7))
* **analytics:** support sqlite3 path resolution on Windows and NixOS ([#1354](https://github.com/kaitranntt/ccs/issues/1354)) ([9a42098](https://github.com/kaitranntt/ccs/commit/9a420988bc1b63a9cab270e331ee6e762726cb1b)), closes [#1347](https://github.com/kaitranntt/ccs/issues/1347)
* **ci:** prevent promote-release tag command injection ([#1350](https://github.com/kaitranntt/ccs/issues/1350)) ([3b94ec8](https://github.com/kaitranntt/ccs/commit/3b94ec853d090317211a33abb5cf4f56542ef664))
* **cliproxy:** disable spoofable default bg keepalive probe ([#1340](https://github.com/kaitranntt/ccs/issues/1340)) ([f0ec820](https://github.com/kaitranntt/ccs/commit/f0ec82005446d51434816e5d64b74e3d0c0ea602))
* **cliproxy:** sanitize local port before config regeneration ([#1342](https://github.com/kaitranntt/ccs/issues/1342)) ([af7aa0c](https://github.com/kaitranntt/ccs/commit/af7aa0c2dda834237a3aa79661cd62d096c32876))
* **codex-auth:** stop spawning powershell in shell detection ([#1348](https://github.com/kaitranntt/ccs/issues/1348)) ([825efb8](https://github.com/kaitranntt/ccs/commit/825efb8b109e88c4f778259176cf2485406eb8ed))
* **codex-quota:** guard feature label type in quota windows ([#1346](https://github.com/kaitranntt/ccs/issues/1346)) ([b71fe5d](https://github.com/kaitranntt/ccs/commit/b71fe5dd6ec975ac13ea1f33bd00d51df8ac80dc))
* **dispatcher:** also treat -p as non-subcommand short for --print ([#1352](https://github.com/kaitranntt/ccs/issues/1352)) ([8335f0c](https://github.com/kaitranntt/ccs/commit/8335f0c73cb2ade7f2bdd5d92ab6b0df1bc14e7a))
* **dispatcher:** treat --print as non-subcommand Claude session ([#1341](https://github.com/kaitranntt/ccs/issues/1341)) ([fd561b5](https://github.com/kaitranntt/ccs/commit/fd561b59bc4b1bd46419848a1babc388d31d5321))
* **models-dev:** sanitize models.dev registry entries and harden pricing resolver ([#1345](https://github.com/kaitranntt/ccs/issues/1345)) ([9cd9b79](https://github.com/kaitranntt/ccs/commit/9cd9b796caa953e146077d8402971db7a63a2c8f))
* **pricing:** guard malformed models.dev model entries ([#1344](https://github.com/kaitranntt/ccs/issues/1344)) ([66966f3](https://github.com/kaitranntt/ccs/commit/66966f35276556551db52f38af46b5a5f8634c03))
* **ui-docs:** remove third-party runtime assets from health report ([#1349](https://github.com/kaitranntt/ccs/issues/1349)) ([58df999](https://github.com/kaitranntt/ccs/commit/58df9999db44727695cbc0631f646623eb7e7fb5))

### Code Refactoring

* **cliproxy:** remove orphaned bg keepalive wiring ([#1353](https://github.com/kaitranntt/ccs/issues/1353)) ([5d27f10](https://github.com/kaitranntt/ccs/commit/5d27f10367f2e869079c6850e8b24aa2b98242f1)), closes [#1340](https://github.com/kaitranntt/ccs/issues/1340)
2026-05-23 21:46:07 +00:00
Kai (Tam Nhu) TranGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
aed942f51b feat(release): promote dev to main — security hardening batch (#1351)
* fix(cliproxy): disable spoofable default bg keepalive probe (#1340)

* fix(dispatcher): treat --print as non-subcommand Claude session (#1341)

* fix(dispatcher): treat --print as non-subcommand Claude session

* style: apply prettier formatting

* fix(dispatcher): correct return type in subcommand detector

getClaudeSubcommandName returns string | null; return false (boolean)
was invalid after dev refactored isClaudeSubcommandInvocation to
delegate to it. Change to return null to preserve the --print safety
fix intent.

* fix(cliproxy): sanitize local port before config regeneration (#1342)

* fix(pricing): guard malformed models.dev model entries (#1344)

* fix(pricing): guard malformed models.dev model entries

* style: apply prettier formatting

* fix(codex-quota): guard feature label type in quota windows (#1346)

* fix(analytics): harden sqlite3 invocation for native Droid usage scan (#1347)

* fix(analytics): use trusted sqlite3 binary path

* style: apply prettier formatting

* fix(codex-auth): stop spawning powershell in shell detection (#1348)

* fix(ui-docs): remove third-party runtime assets from health report (#1349)

* fix(ui-docs): remove third-party runtime assets from health report

* style: apply prettier formatting

* fix(ci): prevent promote-release tag command injection (#1350)

* chore(release): 8.0.0-dev.1

* fix(models-dev): sanitize models.dev registry entries and harden pricing resolver (#1345)

* fix(models-dev): sanitize cached model entries before pricing lookup

* style: apply prettier formatting

* chore(release): 8.0.0-dev.2

* refactor(cliproxy): remove orphaned bg keepalive wiring (#1353)

Red-team review of #1340 found that backgroundProbe / shouldKeepSessionProxiesAlive /
startKeepAliveWatcher and related types were never reachable: the sole caller
(claude-launcher.ts) passed no hasBackgroundWorkerUsingBaseUrl detector, so
backgroundProbe was always undefined and the keepalive branch never executed.

Remove the unreachable scaffold:
- Delete CLAUDE_BG_WORKER_ARGS, hasClaudeBackgroundWorkerUsingBaseUrl{,InProcessList},
  shouldKeepSessionProxiesAlive, ShouldKeepSessionProxiesAliveOptions, and the
  SessionProxyKeepAliveOptions interface from session-bridge.ts
- Remove the backgroundProbe/startKeepAliveWatcher block and keepalive exit branch
  from setupCleanupHandlers; the function now always calls stopSessionResources on
  Claude exit
- Remove backgroundKeepAliveBaseUrl wiring from claude-launcher.ts
- Remove the execFileSync import (was only used by the deleted ps-based detector)
- Update test file: remove tests for deleted exports, keep placeholder

A trusted bg-worker detector can be re-added in a future PR if the feature is
actually needed; the keepalive logic in shouldKeepSessionProxiesAlive can be
restored then.

* fix(analytics): support sqlite3 path resolution on Windows and NixOS (#1354)

- Add CCS_SQLITE_BIN env-var override; validated with fs.realpathSync so
  symlinks are fully resolved before prefix check
- Reject any override whose realpath does not start under a trusted system
  prefix (prevents PATH-hijack reintroduction from #1347)
- Add TRUSTED_PREFIX_UNIX covering /nix/store/, /opt/local/ (MacPorts),
  /snap/, /run/current-system/ in addition to existing /usr/* and
  /opt/homebrew/ entries
- Add TRUSTED_PREFIX_WINDOWS covering Program Files, System32, and the
  Chocolatey managed bin dir (no canonical winget/Scoop path exists)
- Keep TRUSTED_SQLITE_PATHS_WINDOWS empty — Windows users set CCS_SQLITE_BIN
- Pass env as optional third param to querySqliteJson (backward compatible)
- Add 16-test suite covering env-var acceptance, /tmp rejection, symlink
  traversal, NixOS paths, MacPorts, Windows fallback, and prefix safety

* fix(dispatcher): also treat -p as non-subcommand short for --print (#1352)

Red-team follow-up to #1341: the original fix only guarded --print but
Claude accepts -p as the short form, and CCS itself passes -p in
headless-executor.ts. Without this check the security bypass survived
via the short flag.

Added regression tests: ['-p', 'agents'], ['-p', 'doctor'], ['-p']
alone, and injector short-circuit verification for -p form.

* chore(release): 8.0.0-dev.3

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-23 17:42:54 -04:00
github-actions[bot] e1f58246a4 chore(release): 8.0.0-dev.3 2026-05-23 21:38:19 +00:00
Kai (Tam Nhu) TranandGitHub 8335f0c73c fix(dispatcher): also treat -p as non-subcommand short for --print (#1352)
Red-team follow-up to #1341: the original fix only guarded --print but
Claude accepts -p as the short form, and CCS itself passes -p in
headless-executor.ts. Without this check the security bypass survived
via the short flag.

Added regression tests: ['-p', 'agents'], ['-p', 'doctor'], ['-p']
alone, and injector short-circuit verification for -p form.
2026-05-23 17:33:38 -04:00
Kai (Tam Nhu) TranandGitHub 9a420988bc fix(analytics): support sqlite3 path resolution on Windows and NixOS (#1354)
- Add CCS_SQLITE_BIN env-var override; validated with fs.realpathSync so
  symlinks are fully resolved before prefix check
- Reject any override whose realpath does not start under a trusted system
  prefix (prevents PATH-hijack reintroduction from #1347)
- Add TRUSTED_PREFIX_UNIX covering /nix/store/, /opt/local/ (MacPorts),
  /snap/, /run/current-system/ in addition to existing /usr/* and
  /opt/homebrew/ entries
- Add TRUSTED_PREFIX_WINDOWS covering Program Files, System32, and the
  Chocolatey managed bin dir (no canonical winget/Scoop path exists)
- Keep TRUSTED_SQLITE_PATHS_WINDOWS empty — Windows users set CCS_SQLITE_BIN
- Pass env as optional third param to querySqliteJson (backward compatible)
- Add 16-test suite covering env-var acceptance, /tmp rejection, symlink
  traversal, NixOS paths, MacPorts, Windows fallback, and prefix safety
2026-05-23 17:29:52 -04:00
Kai (Tam Nhu) TranandGitHub 5d27f10367 refactor(cliproxy): remove orphaned bg keepalive wiring (#1353)
Red-team review of #1340 found that backgroundProbe / shouldKeepSessionProxiesAlive /
startKeepAliveWatcher and related types were never reachable: the sole caller
(claude-launcher.ts) passed no hasBackgroundWorkerUsingBaseUrl detector, so
backgroundProbe was always undefined and the keepalive branch never executed.

Remove the unreachable scaffold:
- Delete CLAUDE_BG_WORKER_ARGS, hasClaudeBackgroundWorkerUsingBaseUrl{,InProcessList},
  shouldKeepSessionProxiesAlive, ShouldKeepSessionProxiesAliveOptions, and the
  SessionProxyKeepAliveOptions interface from session-bridge.ts
- Remove the backgroundProbe/startKeepAliveWatcher block and keepalive exit branch
  from setupCleanupHandlers; the function now always calls stopSessionResources on
  Claude exit
- Remove backgroundKeepAliveBaseUrl wiring from claude-launcher.ts
- Remove the execFileSync import (was only used by the deleted ps-based detector)
- Update test file: remove tests for deleted exports, keep placeholder

A trusted bg-worker detector can be re-added in a future PR if the feature is
actually needed; the keepalive logic in shouldKeepSessionProxiesAlive can be
restored then.
2026-05-23 17:29:18 -04:00
github-actions[bot] 348e9ab7f9 chore(release): 8.0.0-dev.2 2026-05-23 21:07:18 +00:00