Skip to content

fix(cursor-worker): masquer les jetons des remotes + un process par dépôt - #266

Merged
bobdivx merged 1 commit into
mainfrom
fix/redact-remotes-worker-routing
Oct 22, 2026
Merged

bobdivx merged 1 commit into
mainfrom
fix/redact-remotes-worker-routing

Conversation

@bobdivx

@bobdivx bobdivx commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Pourquoi

  1. Fuite de jetons : GET /api/v1/cursor-worker/status renvoyait workdirs[].git_remote tel que lu dans .git/config, donc https://x-access-token:<jeton>@github.com/… en clair pour certains projets (affiché aussi dans la modale « Dépôts »).
  2. Mauvais dossier : un agent lancé sur le worker devforge pour template-studio a tourné dans le checkout Vigie. Le CLI (cursor-agent 2026.10.19) prend le premier --worker-dir comme espace de travail principal de toute session (« first value is the assignment identity ») ; les autres dossiers ne servent qu'au routage. Avec 11 dépôts dans un seul process, tout tombait dans le premier.

Ce qui change

Masquage des remotes (https://user:token@host/… → https://***@host/…)

  • devforge_shared::redact::redact_remote (une URL) et redact_urls_in_text (texte libre / logs), avec tests.
  • Appliqué à : workdirs[].git_remote du statut, logs_tail du worker (leader), sorties des scripts nœud (exec_on, parse_script_output), logs [git] des déploiements (crates/deploy).
  • Les payloads projets étaient déjà masqués (redact_project_json), inchangé.

Un process worker par dépôt

  • Le worker « principal » sert uniquement le 1er dépôt (pid, logs, sonde /readyz inchangés).
  • Chaque dépôt suivant a son propre process cursor-agent worker --name <même nom> --worker-dir <dépôt> --data-dir <state>/repos/<id>/data start (pas de --management-addr pour éviter le conflit de port ; --data-dir séparé à cause du verrou du CLI).
  • Même nom de machine pour tous : Cursor associe la demande au process dont le dépôt correspond (doc « My Machines » : « start a worker in each repo's checkout »).
  • stop / restart / démarrage auto arrêtent et relancent tous les process ; les restes d'un démarrage précédent sont nettoyés.
  • Statut : repo_workers (par dépôt : running/pid) et repos_up ; la modale « Statut » affiche « Dépôts actifs x / y ». Les dépôts secondaires arrêtés remontent leur dernière erreur dans les logs.
  • Nœuds distants : mêmes règles dans start_script / stop_script / status_script ($D/repos/<n>/, DF_REPOS_UP).

Coût : un process cursor-agent par dépôt servi (11 aujourd'hui sur le leader).

Tests

  • redact_remote_hides_userinfo, redact_urls_in_text_masks_every_url (shared)
  • git_remote_is_redacted (vrai git init + remote avec faux jeton)
  • script_output_logs_never_show_url_tokens
  • repo_worker_args_serve_exactly_one_repo, repo_slot_ids_are_stable_and_distinct
  • scripts_run_end_to_end_with_fake_agent étendu : 2 dépôts → 2 process, le principal ne voit que le 1er dépôt, le 2e a son --data-dir, stop tue les deux.

Suivi (hors PR)

  • Les checkouts déployés avec un jeton GitHub non éphémère gardent https://x-access-token:…@ dans .git/config (git_sync_command avec git_clone_url(token)). Passer ce chemin à l'auth par en-tête (comme les jetons GitHub App) nettoierait le remote au prochain déploiement, mais retirerait aussi l'accès push/pull implicite dont les agents et opérations manuelles dépendent peut-être → à traiter séparément avec un credential helper.

Ne pas merger sans validation.

…dépôt

- Remotes Git : `https://user:token@host/…` → `https://***@host/…` dans le
  statut du worker (workdirs[].git_remote), ses logs, les sorties des scripts
  nœud et les logs git des déploiements. Helpers partagés redact_remote /
  redact_urls_in_text + tests.
- Routage : le CLI exécute toute session dans le PREMIER --worker-dir, donc
  un agent lancé sur template-studio tournait dans Vigie. Le worker démarre
  maintenant un process par dépôt (même nom de machine, --data-dir propre),
  le premier garde la sonde /readyz. Arrêt / statut / scripts distants
  gèrent tous les process ; le statut expose repos_up / repo_workers.
@bobdivx
bobdivx merged commit 35e9a20 into main Oct 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant