dsh-coding-subscription-oauth 0.6.2 → 0.6.3

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 (121) hide show
  1. package/CHANGELOG.md +222 -206
  2. package/CONTRIBUTING.md +129 -120
  3. package/INSTALL.md +218 -218
  4. package/LICENSE +19 -19
  5. package/NOTICE +11 -11
  6. package/README.de.md +289 -289
  7. package/README.es.md +290 -290
  8. package/README.fr.md +290 -290
  9. package/README.ja.md +290 -290
  10. package/README.ko.md +290 -290
  11. package/README.md +304 -304
  12. package/README.pt-BR.md +290 -290
  13. package/README.ru.md +290 -290
  14. package/README.zh-CN.md +302 -302
  15. package/compatibility/dsh-bom.json +0 -0
  16. package/cordis.patch.yml +13 -13
  17. package/docs/00-project-rules.md +212 -195
  18. package/docs/02-architecture.md +130 -130
  19. package/docs/02-architecture.zh-CN.md +130 -130
  20. package/lib/bin.js.map +1 -1
  21. package/lib/capability-settings.d.ts +8 -2
  22. package/lib/capability-settings.d.ts.map +1 -1
  23. package/lib/capability-tools.d.ts +7 -2
  24. package/lib/capability-tools.d.ts.map +1 -1
  25. package/lib/client.js +3 -3
  26. package/lib/client.js.map +2 -2
  27. package/lib/codex-images.d.ts +8 -0
  28. package/lib/codex-images.d.ts.map +1 -1
  29. package/lib/index.js +32 -7
  30. package/lib/index.js.map +2 -2
  31. package/lib/invariant.js.map +1 -1
  32. package/media/en/settings_accounts.png +0 -0
  33. package/media/en/settings_capabilities.png +0 -0
  34. package/media/en/settings_gateway.png +0 -0
  35. package/media/settings_accounts.png +0 -0
  36. package/media/settings_capabilities.png +0 -0
  37. package/media/settings_gateway.png +0 -0
  38. package/media/settings_overview.png +0 -0
  39. package/media/zh-CN/settings_accounts.png +0 -0
  40. package/media/zh-CN/settings_capabilities.png +0 -0
  41. package/media/zh-CN/settings_gateway.png +0 -0
  42. package/package.json +148 -148
  43. package/patches/dsh-agy@0.1.2.patch +25 -25
  44. package/scripts/release.mjs +186 -186
  45. package/scripts/smoke-deployed-routes.mjs +146 -146
  46. package/scripts/verify-deployed-catalog.mjs +87 -87
  47. package/src/adapter.ts +273 -273
  48. package/src/alias-adapter.ts +130 -130
  49. package/src/auth-routes.ts +921 -921
  50. package/src/auth.ts +67 -67
  51. package/src/bin.ts +350 -350
  52. package/src/capability-routes.ts +279 -279
  53. package/src/capability-runtime.ts +314 -313
  54. package/src/capability-settings.ts +671 -658
  55. package/src/capability-tools.ts +685 -666
  56. package/src/catalog.ts +271 -271
  57. package/src/client/GrokBuildSettings.tsx +771 -770
  58. package/src/client/api.ts +88 -88
  59. package/src/client/components/AboutTab.tsx +30 -30
  60. package/src/client/components/AccountsTab.tsx +241 -241
  61. package/src/client/components/Badge.tsx +33 -33
  62. package/src/client/components/CapabilitiesTab.tsx +265 -265
  63. package/src/client/components/CliPullPreview.tsx +116 -116
  64. package/src/client/components/CopyButton.tsx +57 -57
  65. package/src/client/components/GatewayTab.tsx +469 -469
  66. package/src/client/components/NoticeBanner.tsx +46 -46
  67. package/src/client/components/ProgressBar.tsx +53 -53
  68. package/src/client/components/ProviderCard.tsx +606 -606
  69. package/src/client/components/SettingsTabs.tsx +75 -75
  70. package/src/client/components/ToggleSwitch.tsx +71 -71
  71. package/src/client/constants.ts +230 -224
  72. package/src/client/display.ts +61 -61
  73. package/src/client/dshClientAdapter.ts +127 -127
  74. package/src/client/gatewaySnippets.ts +37 -37
  75. package/src/client/index.tsx +156 -156
  76. package/src/client/locales.ts +540 -535
  77. package/src/client/microStyles.ts +52 -52
  78. package/src/client/parsers.ts +398 -396
  79. package/src/client/styles.ts +325 -325
  80. package/src/client/types.ts +199 -197
  81. package/src/codex-http.ts +447 -447
  82. package/src/codex-images.ts +503 -485
  83. package/src/codex-model-capabilities.ts +320 -320
  84. package/src/codex-search.ts +245 -245
  85. package/src/codex-usage.ts +263 -263
  86. package/src/compatibility.ts +41 -41
  87. package/src/dsh-host-adapter.ts +173 -173
  88. package/src/gateway-anthropic-messages.ts +84 -84
  89. package/src/gateway-auth.ts +102 -102
  90. package/src/gateway-backend.ts +274 -274
  91. package/src/gateway-body.ts +49 -49
  92. package/src/gateway-config.ts +76 -76
  93. package/src/gateway-http.ts +104 -104
  94. package/src/gateway-openai-chat.ts +124 -124
  95. package/src/gateway-openai-responses.ts +53 -53
  96. package/src/gateway-parse.ts +224 -224
  97. package/src/gateway-protocol.ts +52 -52
  98. package/src/gateway-routes.ts +158 -158
  99. package/src/gateway.ts +258 -258
  100. package/src/grok-errors.ts +24 -24
  101. package/src/grok-imagine.ts +1627 -1627
  102. package/src/grok-import.ts +151 -151
  103. package/src/http-json.ts +82 -82
  104. package/src/ids.ts +59 -59
  105. package/src/imagine-routes.ts +463 -463
  106. package/src/index.ts +709 -709
  107. package/src/invariant.ts +17 -17
  108. package/src/kimi-errors.ts +26 -26
  109. package/src/media-store.ts +927 -927
  110. package/src/oauth-import-routes.ts +324 -324
  111. package/src/oauth-providers.ts +152 -152
  112. package/src/oauth-session.ts +183 -183
  113. package/src/oauth-sources.ts +1104 -1104
  114. package/src/oauth.ts +620 -620
  115. package/src/provider.ts +128 -128
  116. package/src/proxy.ts +11 -11
  117. package/src/redact.ts +72 -72
  118. package/src/session.ts +218 -218
  119. package/src/store.ts +217 -217
  120. package/src/web-origin.ts +296 -296
  121. package/src/web-routes.ts +38 -38
package/README.fr.md CHANGED
@@ -1,18 +1,18 @@
1
-
2
- <!-- banner -->
3
- <div align="center">
4
-
5
- # 🔐 dsh-coding-subscription-oauth
6
-
7
- **v0.6.2 · anciennement `dsh-grok-build`
8
-
9
- **Plugin OAuth pour abonnements de codage de [DeepSeek Harness](https://github.com/deepseek-ai/dsh).** Connectez-vous une fois avec les abonnements que vous payez déjà, puis utilisez leurs modèles depuis la page de configuration ou la CLI dsh. **Aucun token collé dans le chat.**
10
-
11
- [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE)
12
- [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
13
-
14
- *[English](README.md) · [中文版](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Português (BR)](README.pt-BR.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md)*
15
-
1
+
2
+ <!-- banner -->
3
+ <div align="center">
4
+
5
+ # 🔐 dsh-coding-subscription-oauth
6
+
7
+ **v0.6.3 · anciennement `dsh-grok-build`
8
+
9
+ **Plugin OAuth pour abonnements de codage de [DeepSeek Harness](https://github.com/deepseek-ai/dsh).** Connectez-vous une fois avec les abonnements que vous payez déjà, puis utilisez leurs modèles depuis la page de configuration ou la CLI dsh. **Aucun token collé dans le chat.**
10
+
11
+ [![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](LICENSE)
12
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
13
+
14
+ *[English](README.md) · [中文版](README.zh-CN.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Português (BR)](README.pt-BR.md) · [Español](README.es.md) · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md)*
15
+
16
16
  </div>
17
17
 
18
18
  ---
@@ -20,285 +20,285 @@
20
20
  > **Upgrade / 升级:** Follow the versioned steps in [`INSTALL.md`](INSTALL.md). Install into the existing `web` profile, keep profile/config/credential files, and restart one existing DSH Web process after all packages are updated. When Hub and Subscription are both used, `dsh-coding-oauth-core@0.1.0` is their shared npm dependency, not a separate DSH plugin.
21
21
 
22
22
  ---
23
-
24
- ## Changement de nom
25
-
26
- Le projet s'appelait **`dsh-grok-build`** (Grok Build uniquement). Il couvre maintenant SuperGrok / Codex / Kimi / Claude / Antigravity.
27
-
28
- | | Utiliser | Toujours valable |
29
- |---|---|---|
30
- | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build` (même `main`) |
31
- | npm | `dsh-coding-subscription-oauth@0.6.2` (version actuelle) | Aucun ancien paquet npm n'a été publié |
32
- | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
33
- | Cordis plugin id | `llm-grok-build-oauth` | inchangé |
34
- | API HTTP des réglages | `/plugins/dsh-grok-build/*` | inchangé |
35
- | Fichiers d'identifiants | `$DSH_HOME/.grok-build-auth.json` et les autres `*-oauth-auth.json` | inchangé |
36
-
37
- ## ✨ Fonctionnalités
38
-
39
- - 🧾 **Apportez votre abonnement** — utilisez les plans de codage que vous payez déjà au lieu de clés API séparées.
40
- - 🔑 **OAuth local, sans coller de clé** — autorisez dans la page de configuration ou la CLI ; les tokens n'entrent jamais dans le chat.
41
- - 🧩 **Un plugin, cinq fournisseurs** — Grok Build, Codex, Kimi, Claude et Google Antigravity.
42
- - 🛡️ **Sécurisé par conception** — fichiers d'identification propriétaire-seul `0600`, écriture atomique, verrou de fichier inter-processus.
43
- - ⚙️ **Catalogue dynamique** — le sélecteur n'affiche que les routes authentifiées, étiquetées `(OAuth)`, y compris le `xhigh` de grok-4.6.
44
- - 🌐 **Conscient du proxy** — ne proxifie que les domaines d'abonnement examinés et de confiance.
45
- - 📥 **CLI Pull manuel** — les paramètres découvrent en lecture seule les fichiers OAuth officiels des CLI Grok/Codex/Kimi/Claude autorisés ; vous récupérez une copie à sens unique après prévisualisation et confirmation d'écrasement.
46
- - 🗂️ **Paramètres en onglets** — Accounts, Gateway, Capabilities et About ; les hôtes distants privilégient le device code avec moins de bruit CLI missing ; les cartes connectées restent repliées jusqu'à expansion.
47
- - 🎛️ **Capacités optionnelles, désactivées par défaut** — recherche Codex, usage/quota, génération/édition d'images, Fast et Grok Imagine s'appliquent en direct dès leur activation.
48
- - 🔌 **Passerelle API locale opt-in** — serveur loopback compatible OpenAI/Anthropic, désactivé par défaut ; pour vos propres outils, jamais un relais public.
49
-
50
- ## Problèmes d'intégration que ce plugin résout
51
-
52
- Ce sont les recherches et erreurs DSH qui mènent le plus souvent ici.
53
- | Vous avez cherché / vu | Ce qui était cassé | Ce que fait le plugin |
54
- |---|---|---|
55
- | SuperGrok / X Premium dans DSH, Grok Build vs `api.x.ai` | La route `xai` est l'API à l'usage. L'abonnement coding passe par `cli-chat-proxy.grok.com` | Route `grok-build` + en-têtes d'empreinte CLI (`X-XAI-Token-Auth`, etc.) pour éviter un 403 silencieux |
56
- | `API key is invalid` / `AUTH` | L'UI mappe **tout** AUTH sur ce texte. Souvent le access token OAuth a juste expiré | Refresh **5 min** avant l'expiry ; sur 401, invalide le jeton et **relance le step** |
57
- | `INVALID_REPLAY_STATE` au 2ᵉ tour Codex/Kimi | Le replay gardait l'id provider natif de pi-ai | Conserve l'id de route Harness et répare l'ancien replay |
58
- | grok-4.6 sans **xhigh** | `/v1/models-v2` renvoie déjà `reasoning_efforts` ; cloner le modèle 4.5 cache xhigh | Lit les efforts en direct. 4.6 a xhigh ; 4.5 reste low/medium/high |
59
- | Kimi Code en `x-api-key` Anthropic | Le jeton OAuth partait comme clé Anthropic | Uniquement `Authorization: Bearer` |
60
- | Des modèles non connectés restent dans le sélecteur | Toutes les routes enregistrées étaient listées | Les routes non authentifiées sont vides ; les noms connectés portent `(OAuth)` |
61
- | PKCE sur un DSH distant / headless | Impossible de revenir sur `localhost` | Device-code pour Grok/Codex/Kimi ; Claude accepte l'URL de redirect collée |
62
- | Le proxy passe Grok et casse Kimi en Chine | Un `HTTPS_PROXY` global | Proxy sur liste blanche ; Kimi reste **direct** sauf `proxyKimi: true` |
63
-
64
- ## Fournisseurs pris en charge
65
-
66
- | Fournisseur | Route | Authentification | Coexiste avec |
67
- |---|---|---|---|
68
- | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
69
- | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
70
- | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
71
- | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |
72
- | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |
73
-
74
- > La connexion par dispositif de Grok Build, le catalogue dynamique `/v1/models-v2` et l'inférence en streaming via Responses sont vérifiés sur des déploiements réels. Codex/Kimi/Claude réutilisent l'OAuth/refresh natif du fournisseur de `@earendil-works/pi-ai` plutôt que de réimplémenter les flux de chaque vendeur.
75
-
76
- ## 🚀 Démarrage rapide
77
-
78
- ```bash
79
- # 1. installez le plugin dans le profil web (version actuelle npm)
80
- dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.2
81
-
82
- # 2. optionnel — Google Antigravity (version épinglée examinée)
83
- dsh plugin --profile web add dsh-agy@0.1.2
84
-
23
+
24
+ ## Changement de nom
25
+
26
+ Le projet s'appelait **`dsh-grok-build`** (Grok Build uniquement). Il couvre maintenant SuperGrok / Codex / Kimi / Claude / Antigravity.
27
+
28
+ | | Utiliser | Toujours valable |
29
+ |---|---|---|
30
+ | GitHub / `dsh plugin add` | [`dsh-coding-subscription-oauth`](https://github.com/lninghaha/dsh-coding-subscription-oauth) | `github:lninghaha/dsh-grok-build` (même `main`) |
31
+ | npm | `dsh-coding-subscription-oauth@0.6.3` (version actuelle) | Aucun ancien paquet npm n'a été publié |
32
+ | CLI | `dsh-coding-oauth` | `dsh-grok-build` |
33
+ | Cordis plugin id | `llm-grok-build-oauth` | inchangé |
34
+ | API HTTP des réglages | `/plugins/dsh-grok-build/*` | inchangé |
35
+ | Fichiers d'identifiants | `$DSH_HOME/.grok-build-auth.json` et les autres `*-oauth-auth.json` | inchangé |
36
+
37
+ ## ✨ Fonctionnalités
38
+
39
+ - 🧾 **Apportez votre abonnement** — utilisez les plans de codage que vous payez déjà au lieu de clés API séparées.
40
+ - 🔑 **OAuth local, sans coller de clé** — autorisez dans la page de configuration ou la CLI ; les tokens n'entrent jamais dans le chat.
41
+ - 🧩 **Un plugin, cinq fournisseurs** — Grok Build, Codex, Kimi, Claude et Google Antigravity.
42
+ - 🛡️ **Sécurisé par conception** — fichiers d'identification propriétaire-seul `0600`, écriture atomique, verrou de fichier inter-processus.
43
+ - ⚙️ **Catalogue dynamique** — le sélecteur n'affiche que les routes authentifiées, étiquetées `(OAuth)`, y compris le `xhigh` de grok-4.6.
44
+ - 🌐 **Conscient du proxy** — ne proxifie que les domaines d'abonnement examinés et de confiance.
45
+ - 📥 **CLI Pull manuel** — les paramètres découvrent en lecture seule les fichiers OAuth officiels des CLI Grok/Codex/Kimi/Claude autorisés ; vous récupérez une copie à sens unique après prévisualisation et confirmation d'écrasement.
46
+ - 🗂️ **Paramètres en onglets** — Accounts, Gateway, Capabilities et About ; les hôtes distants privilégient le device code avec moins de bruit CLI missing ; les cartes connectées restent repliées jusqu'à expansion.
47
+ - 🎛️ **Capacités optionnelles, désactivées par défaut** — recherche Codex, usage/quota, génération/édition d'images, Fast et Grok Imagine s'appliquent en direct dès leur activation. Un autre interrupteur, désactivé par défaut, autorise les routes de modèles non-Codex à appeler les outils d'image Codex sans contourner la connexion Codex, la session ni la propriété des pièces jointes.
48
+ - 🔌 **Passerelle API locale opt-in** — serveur loopback compatible OpenAI/Anthropic, désactivé par défaut ; pour vos propres outils, jamais un relais public.
49
+
50
+ ## Problèmes d'intégration que ce plugin résout
51
+
52
+ Ce sont les recherches et erreurs DSH qui mènent le plus souvent ici.
53
+ | Vous avez cherché / vu | Ce qui était cassé | Ce que fait le plugin |
54
+ |---|---|---|
55
+ | SuperGrok / X Premium dans DSH, Grok Build vs `api.x.ai` | La route `xai` est l'API à l'usage. L'abonnement coding passe par `cli-chat-proxy.grok.com` | Route `grok-build` + en-têtes d'empreinte CLI (`X-XAI-Token-Auth`, etc.) pour éviter un 403 silencieux |
56
+ | `API key is invalid` / `AUTH` | L'UI mappe **tout** AUTH sur ce texte. Souvent le access token OAuth a juste expiré | Refresh **5 min** avant l'expiry ; sur 401, invalide le jeton et **relance le step** |
57
+ | `INVALID_REPLAY_STATE` au 2ᵉ tour Codex/Kimi | Le replay gardait l'id provider natif de pi-ai | Conserve l'id de route Harness et répare l'ancien replay |
58
+ | grok-4.6 sans **xhigh** | `/v1/models-v2` renvoie déjà `reasoning_efforts` ; cloner le modèle 4.5 cache xhigh | Lit les efforts en direct. 4.6 a xhigh ; 4.5 reste low/medium/high |
59
+ | Kimi Code en `x-api-key` Anthropic | Le jeton OAuth partait comme clé Anthropic | Uniquement `Authorization: Bearer` |
60
+ | Des modèles non connectés restent dans le sélecteur | Toutes les routes enregistrées étaient listées | Les routes non authentifiées sont vides ; les noms connectés portent `(OAuth)` |
61
+ | PKCE sur un DSH distant / headless | Impossible de revenir sur `localhost` | Device-code pour Grok/Codex/Kimi ; Claude accepte l'URL de redirect collée |
62
+ | Le proxy passe Grok et casse Kimi en Chine | Un `HTTPS_PROXY` global | Proxy sur liste blanche ; Kimi reste **direct** sauf `proxyKimi: true` |
63
+
64
+ ## Fournisseurs pris en charge
65
+
66
+ | Fournisseur | Route | Authentification | Coexiste avec |
67
+ |---|---|---|---|
68
+ | **xAI Grok Build** | `grok-build` | SuperGrok / X Premium OAuth | `xai` |
69
+ | **OpenAI Codex** | `codex-oauth` | ChatGPT Plus/Pro OAuth | `openai` |
70
+ | **Kimi Code** | `kimi-code-oauth` | Kimi Code OAuth | `kimi-coding` |
71
+ | **Claude Code** | `claude-code-oauth` | Claude Pro/Max OAuth | — |
72
+ | **Google Antigravity** | `agy` | `dsh-agy` Google OAuth | — |
73
+
74
+ > La connexion par dispositif de Grok Build, le catalogue dynamique `/v1/models-v2` et l'inférence en streaming via Responses sont vérifiés sur des déploiements réels. Codex/Kimi/Claude réutilisent l'OAuth/refresh natif du fournisseur de `@earendil-works/pi-ai` plutôt que de réimplémenter les flux de chaque vendeur.
75
+
76
+ ## 🚀 Démarrage rapide
77
+
78
+ ```bash
79
+ # 1. installez le plugin dans le profil web (version actuelle npm)
80
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.3
81
+
82
+ # 2. optionnel — Google Antigravity (version épinglée examinée)
83
+ dsh plugin --profile web add dsh-agy@0.1.2
84
+
85
85
  # 3. redémarrez le processus DSH Web existant avec le gestionnaire configuré
86
86
  # `dsh web` est l’alias CLI officiel, pas un nom de service.
87
- ```
88
-
89
- Ensuite ouvrez **Settings → Coding OAuth** et connectez-vous à n'importe quel fournisseur. C'est tout — choisissez votre modèle authentifié dans le sélecteur.
90
-
91
- ## 📚 Sommaire
92
-
93
- - [Changement de nom](#changement-de-nom)
94
- - [Fonctionnalités](#-fonctionnalités)
95
- - [Problèmes d'intégration que ce plugin résout](#problèmes-dintégration-que-ce-plugin-résout)
96
- - [Fournisseurs pris en charge](#fournisseurs-pris-en-charge)
97
- - [Démarrage rapide](#-démarrage-rapide)
98
- - [Installation](#installation)
99
- - [Page de configuration](#page-de-configuration)
100
- - [Capacités optionnelles](#capacités-optionnelles)
101
- - [Passerelle API locale](#passerelle-api-locale)
102
- - [CLI](#cli)
103
- - [Kimi en Chine](#kimi-en-chine)
104
- - [Proxy réseau](#proxy-réseau)
105
- - [Résilience](#résilience)
106
- - [Identifiants](#identifiants)
107
- - [Architecture](#architecture)
108
- - [Notes techniques](#notes-techniques)
109
- - [Conformité](#conformité)
110
- - [Documentation](#documentation)
111
- - [Lié](#lié)
112
- - [Contribution](#contribution)
113
- - [Licence](#licence)
114
-
115
- ## Installation
116
-
87
+ ```
88
+
89
+ Ensuite ouvrez **Settings → Coding OAuth** et connectez-vous à n'importe quel fournisseur. C'est tout — choisissez votre modèle authentifié dans le sélecteur.
90
+
91
+ ## 📚 Sommaire
92
+
93
+ - [Changement de nom](#changement-de-nom)
94
+ - [Fonctionnalités](#-fonctionnalités)
95
+ - [Problèmes d'intégration que ce plugin résout](#problèmes-dintégration-que-ce-plugin-résout)
96
+ - [Fournisseurs pris en charge](#fournisseurs-pris-en-charge)
97
+ - [Démarrage rapide](#-démarrage-rapide)
98
+ - [Installation](#installation)
99
+ - [Page de configuration](#page-de-configuration)
100
+ - [Capacités optionnelles](#capacités-optionnelles)
101
+ - [Passerelle API locale](#passerelle-api-locale)
102
+ - [CLI](#cli)
103
+ - [Kimi en Chine](#kimi-en-chine)
104
+ - [Proxy réseau](#proxy-réseau)
105
+ - [Résilience](#résilience)
106
+ - [Identifiants](#identifiants)
107
+ - [Architecture](#architecture)
108
+ - [Notes techniques](#notes-techniques)
109
+ - [Conformité](#conformité)
110
+ - [Documentation](#documentation)
111
+ - [Lié](#lié)
112
+ - [Contribution](#contribution)
113
+ - [Licence](#licence)
114
+
115
+ ## Installation
116
+
117
117
  Nécessite DeepSeek Harness `0.1.1-rc.2` et Node.js 22.19+. Détails complets dans les [notes d'installation](INSTALL.md).
118
-
119
- ```bash
120
- # version actuelle npm (recommandé)
121
- dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.2
122
-
123
- # développement/alternatif : depuis GitHub
124
- dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
125
-
126
- # développement/alternatif : un checkout local de développement
127
- dsh plugin --profile web add ./dsh-coding-subscription-oauth
128
- ```
129
-
118
+
119
+ ```bash
120
+ # version actuelle npm (recommandé)
121
+ dsh plugin --profile web add dsh-coding-subscription-oauth@0.6.3
122
+
123
+ # développement/alternatif : depuis GitHub
124
+ dsh plugin --profile web add github:lninghaha/dsh-coding-subscription-oauth
125
+
126
+ # développement/alternatif : un checkout local de développement
127
+ dsh plugin --profile web add ./dsh-coding-subscription-oauth
128
+ ```
129
+
130
130
  Redémarrez le processus DSH Web existant après l'installation. Vérification sur un déploiement en direct :
131
-
132
- ```bash
133
- pnpm run verify:deployed # vérifie /api/llm.models réel + état OAuth
134
- DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # si Google est connecté
135
-
136
- DSH_RESTORE_PROVIDER=openai \
137
- DSH_RESTORE_MODEL=gpt-5.6-sol \
138
- DSH_RESTORE_REASONING=max \
139
- pnpm run smoke:deployed # appels réels Codex/Kimi + rejeu du second tour
140
- ```
141
-
142
- > `smoke:deployed` crée une session temporaire, valide les appels d'outils de Codex et Kimi ainsi qu'un second tour utilisateur (régression `INVALID_REPLAY_STATE`), restaure le modèle par défaut déclaré, puis archive la session.
143
-
144
- ## Page de configuration
145
-
146
- Ouvrez **Settings → Coding OAuth** :
147
-
148
-
149
-
150
- <table>
151
- <tr>
152
- <td align="center" valign="top" width="33%">
131
+
132
+ ```bash
133
+ pnpm run verify:deployed # vérifie /api/llm.models réel + état OAuth
134
+ DSH_EXPECT_AGY_AUTH=signed-in pnpm run verify:deployed # si Google est connecté
135
+
136
+ DSH_RESTORE_PROVIDER=openai \
137
+ DSH_RESTORE_MODEL=gpt-5.6-sol \
138
+ DSH_RESTORE_REASONING=max \
139
+ pnpm run smoke:deployed # appels réels Codex/Kimi + rejeu du second tour
140
+ ```
141
+
142
+ > `smoke:deployed` crée une session temporaire, valide les appels d'outils de Codex et Kimi ainsi qu'un second tour utilisateur (régression `INVALID_REPLAY_STATE`), restaure le modèle par défaut déclaré, puis archive la session.
143
+
144
+ ## Page de configuration
145
+
146
+ Ouvrez **Settings → Coding OAuth** :
147
+
148
+
149
+
150
+ <table>
151
+ <tr>
152
+ <td align="center" valign="top" width="33%">
153
153
  <a href="media/en/settings_accounts.png"><img src="media/en/settings_accounts.png" alt="Coding OAuth Accounts tab" width="280" /></a><br />
154
- <sub>Accounts</sub>
155
- </td>
156
- <td align="center" valign="top" width="33%">
154
+ <sub>Accounts</sub>
155
+ </td>
156
+ <td align="center" valign="top" width="33%">
157
157
  <a href="media/en/settings_gateway.png"><img src="media/en/settings_gateway.png" alt="Coding OAuth Gateway tab" width="280" /></a><br />
158
- <sub>Gateway</sub>
159
- </td>
160
- <td align="center" valign="top" width="33%">
158
+ <sub>Gateway</sub>
159
+ </td>
160
+ <td align="center" valign="top" width="33%">
161
161
  <a href="media/en/settings_capabilities.png"><img src="media/en/settings_capabilities.png" alt="Coding OAuth Capabilities tab" width="280" /></a><br />
162
- <sub>Capabilities</sub>
163
- </td>
164
- </tr>
165
- </table>
166
-
167
- | Fournisseur | Méthodes |
168
- |---|---|
169
- | Grok | code d'autorisation · code de dispositif · importation CLI Grok · sélection de modèles |
170
- | Codex | code de dispositif (recommandé sur DSH distant) · PKCE navigateur |
171
- | Kimi | code de dispositif |
172
- | Claude | PKCE navigateur (un navigateur distant peut coller l'URL complète de redirect localhost) |
173
- | Antigravity | état d'installation de `dsh-agy` + commandes CLI locales au profil |
174
-
175
- La page de configuration est divisée en quatre onglets principaux : **Accounts**, **Gateway**, **Capabilities** et **About**. Les cartes des fournisseurs connectés se replient en un résumé compact et se déplient pour l'édition des modèles. L'aperçu du pull CLI occupe toute la largeur, et le statut d'Imagine s'affiche dans l'onglet Capabilities.
176
-
177
- Le sélecteur ne liste que les routes ayant terminé l'authentification ; les fournisseurs non authentifiés renvoient une liste vide. Les noms de fournisseurs portent `(OAuth)` et le catalogue est rafraîchi via `llm/adapters-updated` après connexion/déconnexion.
178
-
179
- ## Capacités optionnelles
180
-
181
- Les sept options `codexSearch`, `codexImages`, `codexImageEdits`, `codexUsage`, `codexFast`, `grokImagineImage` et `grokImagineVideo` sont désactivées par défaut et s'appliquent à chaud, sans redémarrage. Les limites sont `searchResults` (1–20, défaut 5), `imageCount` (1–4, défaut 1) et `videoArtifactTtlMs` (1 heure–7 jours, défaut 7 jours ; l'interface affiche 1–168 heures). Réduire la rétention raccourcit et nettoie immédiatement les artefacts existants ; l'augmenter ne concerne que les nouveaux.
182
-
183
- ## Passerelle API locale
184
-
185
- Désactivée par défaut. Une fois activée, elle démarre un serveur `node:http` isolé (pas le port web de DSH) sur `127.0.0.1:18080` et réutilise les mêmes sessions OAuth authentifiées :
186
-
187
- ```yaml
188
- gateway:
189
- enabled: false
190
- bind: 127.0.0.1
191
- port: 18080
192
- ```
193
-
194
- Endpoints : `GET /healthz`, `GET /v1/models`, `POST /v1/chat/completions`, `POST /v1/responses`, `POST /v1/messages`. Une clé Bearer est stockée dans `$DSH_HOME/.coding-oauth-gateway.json` (`0600`). La configuration permet de copier l'URL de base OpenAI (base + `/v1`), l'URL de base Anthropic et la clé Bearer actuelle sans la régénérer ; la révélation de la clé est limitée au loopback et n'est pas persistée dans le stockage du navigateur. La rotation est une action destructive avec confirmation. Le port d'écoute peut être modifié directement puis enregistré avec Apply, ou rempli par Random (18100–18999) ; le port choisi est persisté dans le document de passerelle propriétaire-seul, et un listener en cours d'exécution se rebind. Le bind reste configurable uniquement en YAML ; un bind non loopback exige une clé. Ce n'est pas un relais distant.
195
-
196
- ## CLI
197
-
198
- ```bash
199
- # `dsh-grok-build` reste un alias de commande
200
- dsh-coding-oauth login [--pkce] | import | status | logout
201
-
202
- # fournisseurs plus récents
203
- dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
204
- dsh-coding-oauth status all
205
- dsh-coding-oauth logout codex
206
-
207
- # Antigravity (installez d'abord dans le profil web)
208
- dsh plugin --profile web exec dsh-agy login --headless
209
- ```
210
-
211
- > La CLI de `dsh-agy` modifie le pool de comptes en dehors du processus DSH, elle ne peut donc pas émettre d'événement de catalogue dans le processus — fermez et rouvrez le sélecteur de modèles après connexion/déconnexion.
212
-
213
- ## Kimi en Chine
214
-
215
- L'OAuth de l'abonnement Kimi Code utilise `https://auth.kimi.com` ; l'inférence utilise `https://api.kimi.com/coding`. `https://api.moonshot.cn/v1` est le canal de clé API à l'utilisation du **Moonshot Open Platform** — il n'existe aucun « endpoint OAuth Chine » commutable. Ce plugin utilise une route séparée `kimi-code-oauth` et n'affecte pas une configuration `kimi-coding` par clé API existante.
216
-
217
- ## Proxy réseau
218
-
219
- Priorité : `config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`.
220
-
221
- ```yaml
222
- - id: llm-grok-build-oauth
223
- config:
224
- proxy: http://127.0.0.1:7890
225
- proxyKimi: false
226
- ```
227
-
228
- Seuls les domaines d'abonnement examinés sont proxifiés (xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity) ; tout le reste du trafic DSH garde son répartiteur d'origine. Kimi reste direct par défaut et n'utilise le proxy que lorsque `proxyKimi: true`.
229
-
230
- ## Résilience
231
-
232
- Les jetons d'accès OAuth sont renouvelés **cinq minutes** avant l'expiration enregistrée (pi-ai 0.84+). Si l'amont refuse encore un jeton localement valide avec 401/403, le plugin recule le `expires` stocké et l'étape relancée rafraîchit le jeton avant de renvoyer.
233
-
234
- Les nouvelles tentatives suivent la politique du harness : les pannes transitoires (`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`) **et `AUTH`** sont relancées avec un backoff exponentiel (5 essais, 5 s → 10 s → 20 s → 40 s → 80 s (~155 s cumulés), jitter 10 %). L'épuisement de quota et un refresh token mort **ne** sont **pas** relancés. Surcharge par déploiement :
235
-
236
- ```yaml
237
- - id: llm-grok-build-oauth
238
- config:
239
- retryPolicy:
240
- mode: normal
241
- maxRetries: 5
242
- retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
243
- backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }
244
- ```
245
-
246
- ## Identifiants
247
-
248
- Propriétaire-seul `0600`, écriture atomique, verrou de fichier inter-processus :
249
-
250
- - `$DSH_HOME/.grok-build-auth.json`
251
- - `$DSH_HOME/.codex-oauth-auth.json`
252
- - `$DSH_HOME/.kimi-code-oauth-auth.json`
253
- - `$DSH_HOME/.claude-code-oauth-auth.json`
254
-
255
- Les caches de sélection vivent dans les fichiers `*-models.json` correspondants. **Aucun statut HTTP, log ou interface ne peut renvoyer un token.**
256
-
257
- ## Architecture
258
-
259
- ```mermaid
260
- flowchart LR
261
- subgraph DSH["DSH Harness"]
262
- UI[Configuration / Web · Coding OAuth] --> LLM[llm route]
263
- LLM --> ALIA[Adaptateur d'alias de route]
264
- end
265
- ALIA --> PI[fournisseur natif pi-ai<br/>OAuth · refresh · stream]
266
- PI --> GROK[Grok Build]
267
- PI --> COD[Codex]
268
- PI --> KIMI[Kimi]
269
- PI --> CLAU[Claude]
270
- AGY[plugin dsh-agy] --> GAL[Google Antigravity]
271
- ```
272
-
273
- ## Notes techniques
274
-
275
- - **Grok Build** : fournisseur Responses personnalisé sur `cli-chat-proxy.grok.com/v1`, en-têtes d'empreinte CLI, catalogue de modèles dynamique.
276
- - **Codex/Kimi/Claude** : les fournisseurs natifs pi-ai gèrent OAuth et refresh ; l'adaptateur d'alias de route les mappe aux ids natifs tandis que l'identité du modèle reste inchangée.
277
- - Le token d'accès Kimi est explicitement converti en `Authorization: Bearer` — jamais envoyé par erreur comme `x-api-key` d'Anthropic.
278
- - Google Antigravity n'est **pas** rétro-ingénieré ici ; il utilise un plugin DSH dédié épinglé en version.
279
-
280
- ## Conformité
281
-
282
- Utiliser des abonnements de codage via un harness tiers peut se situer dans une zone grise des conditions de chaque vendeur et peut déclencher des contrôles de quota, régionaux ou de risque de compte. **N'utilisez que vos propres comptes** ; ce projet ne prend pas en charge les comptes en masse, la revente de quota, le relais distant, le contournement de paywall ou l'usurpation de client. Pour un usage commercial, préférez les canaux officiels de clé API des vendeurs.
283
-
284
- ## Documentation
285
-
286
- | Document | Objectif |
287
- |---|---|
288
- | [`INSTALL.md`](INSTALL.md) | Détails d'installation et d'utilisation |
289
- | [`CHANGELOG.md`](CHANGELOG.md) | Historique des versions |
290
- | [`docs/00-project-rules.md`](docs/00-project-rules.md) | Versioning, boucle de release, répartition public/privé |
291
- | [`docs/02-architecture.md`](docs/02-architecture.md) | Architecture interne (routes, flux de données, modules, API) · [中文](docs/02-architecture.zh-CN.md) |
292
- | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Guide de contribution |
293
-
294
- ## Lié
295
-
296
- - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) — plugin séparé épinglé pour Google Antigravity.
297
-
298
- ## Contribution
299
-
300
- Les contributions de toute nature sont bienvenues — fonctionnalités, documentation, traductions, rapports de bugs. Voir **[CONTRIBUTING](CONTRIBUTING.md)** pour le flux, les conventions de commit et la boucle de release. Si votre langue n'est pas listée, envoyez un PR avec une traduction du README et nous l'ajouterons au tableau ci-dessus.
301
-
302
- ## Licence
303
-
304
- [Apache-2.0](LICENSE) · voir [NOTICE](NOTICE). Des portions sont dérivées du projet [dsh-xai](https://github.com/MirDie/dsh-xai) (Apache-2.0).
162
+ <sub>Capabilities</sub>
163
+ </td>
164
+ </tr>
165
+ </table>
166
+
167
+ | Fournisseur | Méthodes |
168
+ |---|---|
169
+ | Grok | code d'autorisation · code de dispositif · importation CLI Grok · sélection de modèles |
170
+ | Codex | code de dispositif (recommandé sur DSH distant) · PKCE navigateur |
171
+ | Kimi | code de dispositif |
172
+ | Claude | PKCE navigateur (un navigateur distant peut coller l'URL complète de redirect localhost) |
173
+ | Antigravity | état d'installation de `dsh-agy` + commandes CLI locales au profil |
174
+
175
+ La page de configuration est divisée en quatre onglets principaux : **Accounts**, **Gateway**, **Capabilities** et **About**. Les cartes des fournisseurs connectés se replient en un résumé compact et se déplient pour l'édition des modèles. L'aperçu du pull CLI occupe toute la largeur, et le statut d'Imagine s'affiche dans l'onglet Capabilities.
176
+
177
+ Le sélecteur ne liste que les routes ayant terminé l'authentification ; les fournisseurs non authentifiés renvoient une liste vide. Les noms de fournisseurs portent `(OAuth)` et le catalogue est rafraîchi via `llm/adapters-updated` après connexion/déconnexion.
178
+
179
+ ## Capacités optionnelles
180
+
181
+ Les huit options `codexSearch`, `codexImages`, `codexImageEdits`, `codexImagesAnyModel`, `codexUsage`, `codexFast`, `grokImagineImage` et `grokImagineVideo` sont désactivées par défaut et s'appliquent à chaud, sans redémarrage. Les limites sont `searchResults` (1–20, défaut 5), `imageCount` (1–4, défaut 1) et `videoArtifactTtlMs` (1 heure–7 jours, défaut 7 jours ; l'interface affiche 1–168 heures). Réduire la rétention raccourcit et nettoie immédiatement les artefacts existants ; l'augmenter ne concerne que les nouveaux.
182
+
183
+ ## Passerelle API locale
184
+
185
+ Désactivée par défaut. Une fois activée, elle démarre un serveur `node:http` isolé (pas le port web de DSH) sur `127.0.0.1:18080` et réutilise les mêmes sessions OAuth authentifiées :
186
+
187
+ ```yaml
188
+ gateway:
189
+ enabled: false
190
+ bind: 127.0.0.1
191
+ port: 18080
192
+ ```
193
+
194
+ Endpoints : `GET /healthz`, `GET /v1/models`, `POST /v1/chat/completions`, `POST /v1/responses`, `POST /v1/messages`. Une clé Bearer est stockée dans `$DSH_HOME/.coding-oauth-gateway.json` (`0600`). La configuration permet de copier l'URL de base OpenAI (base + `/v1`), l'URL de base Anthropic et la clé Bearer actuelle sans la régénérer ; la révélation de la clé est limitée au loopback et n'est pas persistée dans le stockage du navigateur. La rotation est une action destructive avec confirmation. Le port d'écoute peut être modifié directement puis enregistré avec Apply, ou rempli par Random (18100–18999) ; le port choisi est persisté dans le document de passerelle propriétaire-seul, et un listener en cours d'exécution se rebind. Le bind reste configurable uniquement en YAML ; un bind non loopback exige une clé. Ce n'est pas un relais distant.
195
+
196
+ ## CLI
197
+
198
+ ```bash
199
+ # `dsh-grok-build` reste un alias de commande
200
+ dsh-coding-oauth login [--pkce] | import | status | logout
201
+
202
+ # fournisseurs plus récents
203
+ dsh-coding-oauth login codex --device-auth | codex --browser | kimi | claude
204
+ dsh-coding-oauth status all
205
+ dsh-coding-oauth logout codex
206
+
207
+ # Antigravity (installez d'abord dans le profil web)
208
+ dsh plugin --profile web exec dsh-agy login --headless
209
+ ```
210
+
211
+ > La CLI de `dsh-agy` modifie le pool de comptes en dehors du processus DSH, elle ne peut donc pas émettre d'événement de catalogue dans le processus — fermez et rouvrez le sélecteur de modèles après connexion/déconnexion.
212
+
213
+ ## Kimi en Chine
214
+
215
+ L'OAuth de l'abonnement Kimi Code utilise `https://auth.kimi.com` ; l'inférence utilise `https://api.kimi.com/coding`. `https://api.moonshot.cn/v1` est le canal de clé API à l'utilisation du **Moonshot Open Platform** — il n'existe aucun « endpoint OAuth Chine » commutable. Ce plugin utilise une route séparée `kimi-code-oauth` et n'affecte pas une configuration `kimi-coding` par clé API existante.
216
+
217
+ ## Proxy réseau
218
+
219
+ Priorité : `config.proxy` → `CODING_OAUTH_PROXY` → `GROK_BUILD_PROXY` → `HTTPS_PROXY`/`HTTP_PROXY`.
220
+
221
+ ```yaml
222
+ - id: llm-grok-build-oauth
223
+ config:
224
+ proxy: http://127.0.0.1:7890
225
+ proxyKimi: false
226
+ ```
227
+
228
+ Seuls les domaines d'abonnement examinés sont proxifiés (xAI/Grok, OpenAI Codex, Claude/Anthropic, Google Antigravity) ; tout le reste du trafic DSH garde son répartiteur d'origine. Kimi reste direct par défaut et n'utilise le proxy que lorsque `proxyKimi: true`.
229
+
230
+ ## Résilience
231
+
232
+ Les jetons d'accès OAuth sont renouvelés **cinq minutes** avant l'expiration enregistrée (pi-ai 0.84+). Si l'amont refuse encore un jeton localement valide avec 401/403, le plugin recule le `expires` stocké et l'étape relancée rafraîchit le jeton avant de renvoyer.
233
+
234
+ Les nouvelles tentatives suivent la politique du harness : les pannes transitoires (`RATE_LIMIT`/`SERVER`/`TIMEOUT`/`TRANSPORT`/`EMPTY_RESPONSE`) **et `AUTH`** sont relancées avec un backoff exponentiel (5 essais, 5 s → 10 s → 20 s → 40 s → 80 s (~155 s cumulés), jitter 10 %). L'épuisement de quota et un refresh token mort **ne** sont **pas** relancés. Surcharge par déploiement :
235
+
236
+ ```yaml
237
+ - id: llm-grok-build-oauth
238
+ config:
239
+ retryPolicy:
240
+ mode: normal
241
+ maxRetries: 5
242
+ retryableCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, TIMEOUT, TRANSPORT, AUTH]
243
+ backoff: { initialDelayMs: 5000, maxDelayMs: 80000, jitterRatio: 0.1 }
244
+ ```
245
+
246
+ ## Identifiants
247
+
248
+ Propriétaire-seul `0600`, écriture atomique, verrou de fichier inter-processus :
249
+
250
+ - `$DSH_HOME/.grok-build-auth.json`
251
+ - `$DSH_HOME/.codex-oauth-auth.json`
252
+ - `$DSH_HOME/.kimi-code-oauth-auth.json`
253
+ - `$DSH_HOME/.claude-code-oauth-auth.json`
254
+
255
+ Les caches de sélection vivent dans les fichiers `*-models.json` correspondants. **Aucun statut HTTP, log ou interface ne peut renvoyer un token.**
256
+
257
+ ## Architecture
258
+
259
+ ```mermaid
260
+ flowchart LR
261
+ subgraph DSH["DSH Harness"]
262
+ UI[Configuration / Web · Coding OAuth] --> LLM[llm route]
263
+ LLM --> ALIA[Adaptateur d'alias de route]
264
+ end
265
+ ALIA --> PI[fournisseur natif pi-ai<br/>OAuth · refresh · stream]
266
+ PI --> GROK[Grok Build]
267
+ PI --> COD[Codex]
268
+ PI --> KIMI[Kimi]
269
+ PI --> CLAU[Claude]
270
+ AGY[plugin dsh-agy] --> GAL[Google Antigravity]
271
+ ```
272
+
273
+ ## Notes techniques
274
+
275
+ - **Grok Build** : fournisseur Responses personnalisé sur `cli-chat-proxy.grok.com/v1`, en-têtes d'empreinte CLI, catalogue de modèles dynamique.
276
+ - **Codex/Kimi/Claude** : les fournisseurs natifs pi-ai gèrent OAuth et refresh ; l'adaptateur d'alias de route les mappe aux ids natifs tandis que l'identité du modèle reste inchangée.
277
+ - Le token d'accès Kimi est explicitement converti en `Authorization: Bearer` — jamais envoyé par erreur comme `x-api-key` d'Anthropic.
278
+ - Google Antigravity n'est **pas** rétro-ingénieré ici ; il utilise un plugin DSH dédié épinglé en version.
279
+
280
+ ## Conformité
281
+
282
+ Utiliser des abonnements de codage via un harness tiers peut se situer dans une zone grise des conditions de chaque vendeur et peut déclencher des contrôles de quota, régionaux ou de risque de compte. **N'utilisez que vos propres comptes** ; ce projet ne prend pas en charge les comptes en masse, la revente de quota, le relais distant, le contournement de paywall ou l'usurpation de client. Pour un usage commercial, préférez les canaux officiels de clé API des vendeurs.
283
+
284
+ ## Documentation
285
+
286
+ | Document | Objectif |
287
+ |---|---|
288
+ | [`INSTALL.md`](INSTALL.md) | Détails d'installation et d'utilisation |
289
+ | [`CHANGELOG.md`](CHANGELOG.md) | Historique des versions |
290
+ | [`docs/00-project-rules.md`](docs/00-project-rules.md) | Versioning, boucle de release, répartition public/privé |
291
+ | [`docs/02-architecture.md`](docs/02-architecture.md) | Architecture interne (routes, flux de données, modules, API) · [中文](docs/02-architecture.zh-CN.md) |
292
+ | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Guide de contribution |
293
+
294
+ ## Lié
295
+
296
+ - [`dsh-agy`](https://www.npmjs.com/package/dsh-agy) — plugin séparé épinglé pour Google Antigravity.
297
+
298
+ ## Contribution
299
+
300
+ Les contributions de toute nature sont bienvenues — fonctionnalités, documentation, traductions, rapports de bugs. Voir **[CONTRIBUTING](CONTRIBUTING.md)** pour le flux, les conventions de commit et la boucle de release. Si votre langue n'est pas listée, envoyez un PR avec une traduction du README et nous l'ajouterons au tableau ci-dessus.
301
+
302
+ ## Licence
303
+
304
+ [Apache-2.0](LICENSE) · voir [NOTICE](NOTICE). Des portions sont dérivées du projet [dsh-xai](https://github.com/MirDie/dsh-xai) (Apache-2.0).