dsh-date-wrapper 0.2.0 → 0.4.0
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/CHANGELOG.de.md +84 -0
- package/CHANGELOG.es.md +84 -0
- package/CHANGELOG.fr.md +84 -0
- package/CHANGELOG.it.md +84 -0
- package/CHANGELOG.ja.md +31 -0
- package/CHANGELOG.ko.md +31 -0
- package/CHANGELOG.md +57 -0
- package/CHANGELOG.ru.md +84 -0
- package/INSTALL.de.md +130 -0
- package/INSTALL.es.md +130 -0
- package/INSTALL.fr.md +130 -0
- package/INSTALL.it.md +130 -0
- package/INSTALL.ja.md +16 -1
- package/INSTALL.ko.md +16 -1
- package/INSTALL.md +16 -1
- package/INSTALL.ru.md +130 -0
- package/INSTALL.zh.md +16 -1
- package/README.de.md +236 -0
- package/README.es.md +236 -0
- package/README.fr.md +236 -0
- package/README.it.md +236 -0
- package/README.ja.md +32 -8
- package/README.ko.md +32 -8
- package/README.md +40 -18
- package/README.ru.md +236 -0
- package/README.zh.md +37 -16
- package/dsh.plugin.json +2 -2
- package/package.json +11 -12
package/README.fr.md
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# dsh-date-wrapper
|
|
2
|
+
|
|
3
|
+
- [English README](./README.md)
|
|
4
|
+
- [中文 README](./README.zh.md)
|
|
5
|
+
- [日本語 README](./README.ja.md)
|
|
6
|
+
- [한국어 README](./README.ko.md)
|
|
7
|
+
- [Français README](./README.fr.md)
|
|
8
|
+
- [Deutsch README](./README.de.md)
|
|
9
|
+
- [Italiano README](./README.it.md)
|
|
10
|
+
- [Русский README](./README.ru.md)
|
|
11
|
+
- [Español README](./README.es.md)
|
|
12
|
+
- [Installation guide](./INSTALL.md)
|
|
13
|
+
- [中文安装指南](./INSTALL.zh.md)
|
|
14
|
+
- [日本語インストールガイド](./INSTALL.ja.md)
|
|
15
|
+
- [한국어 설치 안내](./INSTALL.ko.md)
|
|
16
|
+
- [Guide d'installation](./INSTALL.fr.md)
|
|
17
|
+
- [Installationsanleitung](./INSTALL.de.md)
|
|
18
|
+
- [Guida all'installazione](./INSTALL.it.md)
|
|
19
|
+
- [Руководство по установке](./INSTALL.ru.md)
|
|
20
|
+
- [Guía de instalación](./INSTALL.es.md)
|
|
21
|
+
- [Changelog](./CHANGELOG.md)
|
|
22
|
+
- [日本語 changelog](./CHANGELOG.ja.md)
|
|
23
|
+
- [한국어 changelog](./CHANGELOG.ko.md)
|
|
24
|
+
- [Français changelog](./CHANGELOG.fr.md)
|
|
25
|
+
- [Deutsch changelog](./CHANGELOG.de.md)
|
|
26
|
+
- [Italiano changelog](./CHANGELOG.it.md)
|
|
27
|
+
- [Русский changelog](./CHANGELOG.ru.md)
|
|
28
|
+
- [Español changelog](./CHANGELOG.es.md)
|
|
29
|
+
|
|
30
|
+
> La liste des versions de DSH prises en charge est **gérée par script, non rédigée à la main** — voir le bloc généré ci-dessous (source unique : `scripts/hosts.mjs` ; distribué par `scripts/sync-hosts.mjs` vers `package.json` peerDependencies + engines.dsh, `dsh.plugin.json` et ce README en neuf langues). Le contrat côté hôte du plugin est unique : `systemPrompt.context({ name, order, text })` ; il n'enregistre aucun espace de noms de réglages, ne lit aucune donnée de session et n'effectue aucun appel RPC — les réécritures côté hôte ne le touchent pas.
|
|
31
|
+
|
|
32
|
+
> Une ligne de date minimaliste : elle suspend `Current date: 2026-09-08 Asia/Shanghai Tuesday` (46 caractères, ~12 tokens) à l'instantané du contexte d'exécution que DSH envoie déjà.
|
|
33
|
+
> Elle ne charge **pas** `@deepseek-ai/dsh-time-context`, n'ajoute **aucun** message de session supplémentaire, ne modifie **pas** le code source de DSH et ne nécessite aucune PR.
|
|
34
|
+
|
|
35
|
+
- [Fonctionnement : sessions DSH, JSONL et assemblage des requêtes](./docs/dsh-session-and-context-mechanics.md) (en chinois)
|
|
36
|
+
- [HANDOVER.md](./HANDOVER.md) (en chinois)
|
|
37
|
+
|
|
38
|
+
<!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
|
|
39
|
+
- **Hôtes DSH pris en charge :** `0.1.0-rc.2` `0.1.0-rc.3` `0.1.0-rc.6` `0.1.0-rc.7` `0.1.0-rc.8` `0.1.1-rc.1` `0.1.1-rc.2` `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` (15 rc sur les lignes 0.1.0 / 0.1.1 / 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0)
|
|
40
|
+
- **Vérifié à l'exécution :** `0.1.0-rc.2`, `0.1.0-rc.3`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.0-rc.8`, `0.1.1-rc.1`, `0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, `0.2.0-rc.2` — preuves dans `.compat-results/`
|
|
41
|
+
<!-- host-compat:end -->
|
|
42
|
+
|
|
43
|
+
## Ce que ce plugin résout
|
|
44
|
+
|
|
45
|
+
Le `@deepseek-ai/dsh-time-context` intégré à DSH injecte environ **280 caractères** de métadonnées à chaque requête :
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Time sampled while preparing turn 3, step 2: 2026-09-08T16:05:36+08:00[Asia/Shanghai]
|
|
49
|
+
Browser time zone for this request: Asia/Shanghai. Interpret otherwise-unqualified dates and times in this zone.
|
|
50
|
+
Elapsed since the preceding model-visible message: 2m 34s.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Ce plugin compresse la même information en une seule ligne de **46 caractères** et change son point d'arrivée — elle ne va plus dans le flux de messages :
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Current date: 2026-09-08 Asia/Shanghai Tuesday
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Dimension | `dsh-time-context` | `dsh-date-wrapper` |
|
|
60
|
+
|-----------|--------------------|--------------------|
|
|
61
|
+
| Texte injecté | ~280 caractères | 46 caractères (↓84 %), ~12 tokens |
|
|
62
|
+
| Point d'arrivée | Un message par pre-step (`user/message`) | L'instantané du contexte d'exécution de la plateforme (`systemPrompt.context`) |
|
|
63
|
+
| Fréquence | Un événement par step éligible | Renvoyé avec l'instantané uniquement quand le texte change (0 événement dans une même journée) |
|
|
64
|
+
| Dépendance | Service `agents` | Service `systemPrompt` |
|
|
65
|
+
| Dépendances d'exécution | — | aucune |
|
|
66
|
+
|
|
67
|
+
## Compatibilité des versions
|
|
68
|
+
|
|
69
|
+
| Élément | Verdict |
|
|
70
|
+
|------|---------|
|
|
71
|
+
| Versions DSH ciblées | énumération gérée par script — `scripts/hosts.mjs` (15 rc sur les lignes 0.1.0 → 0.2.0) ; liste vérifiée à l'exécution dans le bloc généré en tête |
|
|
72
|
+
| API settings | **Non applicable** : le plugin n'enregistre aucun réglage et n'exporte aucun `Config` schemastery |
|
|
73
|
+
| Points de contrat utilisés | Un seul — `systemPrompt.context()` |
|
|
74
|
+
| Conflit avec une fonctionnalité native | Chevauche `@deepseek-ai/dsh-time-context` ; **ne pas utiliser les deux**. Non installé par défaut = désactivé par défaut |
|
|
75
|
+
| Partie navigateur | **Aucune** : pas de slot, pas de DOM, pas de token sémantique CSS |
|
|
76
|
+
| Imports de paquets DSH | **Zéro** : rien de `@deepseek-ai/*`, ce qui est plus strict que le motif « détection à l'exécution + repli sur double API » |
|
|
77
|
+
|
|
78
|
+
| Point de contrat | 0.1.0-rc.7 | 0.1.1-rc.2 | 0.1.2-rc.1 | 0.1.3-alpha.2 | 0.1.7-rc.2 | 0.2.0-rc.1 |
|
|
79
|
+
|---|---|---|---|---|---|---|
|
|
80
|
+
| `systemPrompt.context(ctx): () => void` | oui | oui (vérifié sur cet hôte) | oui | oui | oui | oui (diff par rapport à 0.1.7-rc.2 : chaîne de version uniquement) |
|
|
81
|
+
| `PromptContext = { name, order, text }`, sans champ `complete` | oui | oui | oui | oui | oui | oui |
|
|
82
|
+
| `includeRuntimeContext` / `suppressRuntimeContext` | oui | oui | oui | oui | oui | oui |
|
|
83
|
+
| déduplication par texte du `project()` d'agent-loop et `surfaceOp: "append"` | oui | oui | oui | non comparé | oui | oui |
|
|
84
|
+
| `order: 116` sans collision (110 / 115 / 120 déjà pris) | oui | oui | oui | oui | oui | oui |
|
|
85
|
+
|
|
86
|
+
> Méthode : `npm pack @deepseek-ai/dsh-system-prompt@<version>`, décompression, puis comparaison de `lib/types/index.d.ts` et `lib/index.js` ; idem pour `@deepseek-ai/dsh-agent-loop`.
|
|
87
|
+
> Entre `dsh-v0.1.7-rc.2` et `dsh-v0.2.0-rc.1`, le diff de `packages/core/system-prompt` tient en une seule ligne de version, les sites d'appel `systemPrompt.context` en 110/115/120 sont inchangés et le guide de migration des plugins ne mentionne aucun `systemPrompt`.
|
|
88
|
+
> Seule la 0.1.1-rc.2 a été vérifiée **à l'exécution** sur cet hôte ; le test de fumée à l'exécution de la 0.2.0-rc.1 est suivi dans `HANDOVER.md` §7.
|
|
89
|
+
|
|
90
|
+
## Pourquoi un instantané du contexte d'exécution plutôt qu'un message
|
|
91
|
+
|
|
92
|
+
La première tentative imitait `dsh-time-context` en ajoutant un `user/message` dans `agent/pre-step`. Le coût mesuré était trop élevé : chaque événement JSONL pèse **339 octets** (le texte n'en représente que 46, car `content` et `sections` stockent chacun une copie) et il en écrivait **un à chaque tour**.
|
|
93
|
+
|
|
94
|
+
Enregistrer un contexte d'exécution à la place fond la date dans le message d'instantané que la plateforme envoie déjà :
|
|
95
|
+
|
|
96
|
+
- La plateforme **déduplique les instantanés par texte** (`RuntimeContextProjection.project()` dans `dsh-agent-loop` : `if (this.retained?.text === snapshot) return`) ; tant que la date ne change pas, **pas un seul événement supplémentaire n'est écrit** ;
|
|
97
|
+
- Les instantanés **ajoutent** un nouveau message (`surfaceOp: 'append'`) au lieu de réécrire en place, la séquence de requêtes ne fait que croître → **le cache de préfixe est préservé** ;
|
|
98
|
+
- Notre coût marginal se limite à ces 46 octets, et uniquement quand l'instantané est renvoyé parce que son texte a changé.
|
|
99
|
+
|
|
100
|
+
Mesuré sur cet hôte (une session réelle, 10 tours / 231 étapes) :
|
|
101
|
+
|
|
102
|
+
| Élément | Mesuré |
|
|
103
|
+
|------|----------|
|
|
104
|
+
| Instantanés de contexte d'exécution de la plateforme | 2 événements, 1133 o chacun, 2,3 Ko au total |
|
|
105
|
+
| Vrais messages utilisateur | 10 événements, 396 o chacun |
|
|
106
|
+
| Ancienne approche (un message par tour) | 10 × 339 o ≈ 3,4 Ko |
|
|
107
|
+
| Cette approche | 0 événement supplémentaire ; ~46 o fondus dans un instantané existant |
|
|
108
|
+
|
|
109
|
+
## Configuration
|
|
110
|
+
|
|
111
|
+
Livré avec `cordis.patch.yml` ; redémarrer après modification :
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
- insert:
|
|
115
|
+
- id: date-wrapper
|
|
116
|
+
name: dsh-date-wrapper
|
|
117
|
+
config:
|
|
118
|
+
timeZone: Asia/Shanghai # IANA zone; omit to use the process zone
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- Un `timeZone` invalide lève une exception au démarrage (**aucun** repli silencieux sur UTC).
|
|
122
|
+
- Le nom de zone dans le texte est le nom IANA résolu (le nom de la zone du processus quand `timeZone` est omis).
|
|
123
|
+
- L'entrée de contexte d'exécution s'appelle `date-wrapper:date` avec l'ordre `116` (déjà pris : 110 sandbox, 115 approval, 120 subagent).
|
|
124
|
+
- Le plugin n'exporte **aucun `Config` schemastery** : sa configuration échappe à la validation de schéma de l'hôte ; tout est validé à la main dans `validateConfig()`. C'est aussi pourquoi la page Settings → Plugins n'affiche aucun formulaire de configuration pour lui.
|
|
125
|
+
|
|
126
|
+
## Marche/arrêt : l'activation du plugin fait office d'interrupteur, il n'y a pas de bouton dans un panneau
|
|
127
|
+
|
|
128
|
+
Le plugin n'embarque **ni** bouton dans un panneau de réglages **ni** champ de configuration `enabled`, parce que :
|
|
129
|
+
|
|
130
|
+
- L'interrupteur, c'est *l'état actif de la ligne du plugin*. Inactive → `apply()` ne s'exécute jamais → l'entrée de contexte d'exécution n'existe pas → pas un seul caractère injecté.
|
|
131
|
+
- Il n'y a pas de partie navigateur (`dsh.client`), donc l'UI ne possède aucun widget de notre part.
|
|
132
|
+
- La page **Settings → Plugins** intégrée à DSH affiche déjà chaque entrée comme `enabled / disabled` (en lecture seule).
|
|
133
|
+
|
|
134
|
+
### Comment le désactiver
|
|
135
|
+
|
|
136
|
+
Surchargez-le par `id` dans **votre propre** couche de patch de profil — `C:\Users\<you>\.dsh\profiles\web\cordis.patch.yml` :
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
- id: date-wrapper
|
|
140
|
+
disabled: true # disabled; set back to false to restore
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- **À chaud, sans redémarrage** : ce fichier est surveillé par le HMR de Cordis, et `disabled: true` détruit directement la fiber de la ligne.
|
|
144
|
+
- Si la ligne `date-wrapper` n'existe pas encore (non installé), ce patch se contente d'un avertissement `entry "date-wrapper" not found` dans les logs ; le démarrage réussit quand même.
|
|
145
|
+
- ⚠️ Le fichier doit être un **tableau YAML de premier niveau** ; s'il est mal formé, **le démarrage échoue** (DSH est fail-loud pour les couches de patch utilisateur).
|
|
146
|
+
|
|
147
|
+
### Comment le supprimer complètement
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
dsh plugin --profile web remove dsh-date-wrapper
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
La suppression passe par la couche bundle et **nécessite un redémarrage** de dsh web (les patches de bundle ne sont pas rechargés à chaud).
|
|
154
|
+
|
|
155
|
+
## Installation
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
dsh plugin --profile web add github:drscrewdriver/dsh-date-wrapper
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Redémarrez dsh web et rafraîchissez la page. Chemins locaux, mode link et dépannage : [INSTALL.fr.md](./INSTALL.fr.md).
|
|
162
|
+
|
|
163
|
+
## Vérification
|
|
164
|
+
|
|
165
|
+
| # | Comment | Attendu |
|
|
166
|
+
|---|-----|----------|
|
|
167
|
+
| A1 | Ouvrir une nouvelle session et envoyer un message | L'instantané du contexte d'exécution contient `Current date: YYYY-MM-DD <zone> <weekday>` (affiché comme une ligne de contexte injecté provenant de `system-prompt`) |
|
|
168
|
+
| A2 | Vérifier cette ligne | ≤50 caractères (46 mesurés ; le seuil PRD de 30 a été assoupli pour le format demandé) |
|
|
169
|
+
| A3 | Désactiver le plugin (patch de profil `disabled: true`) | La ligne n'apparaît plus dans les instantanés des sessions suivantes |
|
|
170
|
+
| A4 | Chercher dans le journal de session | Aucun `Time sampled` / `Elapsed since` / `Browser time zone` |
|
|
171
|
+
| A5 | Mettre `timeZone` à `UTC` et redémarrer | La date suit UTC (peut différer d'un jour à cheval sur deux zones) |
|
|
172
|
+
|
|
173
|
+
## Notes d'implémentation
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
dsh-date-wrapper/
|
|
177
|
+
├── package.json # name / type: module / main / exports["."] / dsh.bundle.patch / files
|
|
178
|
+
├── cordis.patch.yml # one insert row (no patch-level id → lands at the profile root = host plane)
|
|
179
|
+
├── src/
|
|
180
|
+
│ ├── format.js # pure functions: resolveZone / renderDate / createDateContextText / validateConfig / TEXT_LABEL
|
|
181
|
+
│ └── index.js # apply(ctx, config) → ctx.inject(['systemPrompt'], …) → systemPrompt.context(...)
|
|
182
|
+
└── tests/
|
|
183
|
+
├── format.test.mjs # 11 cases (zone projection, weekday, format and length, degradation, config validation)
|
|
184
|
+
└── context.test.mjs # 7 cases (registration contract against a fake ctx)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- **Ligne côté hôte** : `ctx.inject(['systemPrompt'], …)` ouvre une fiber enfant ; si le service est absent, le plugin n'enregistre rien silencieusement au lieu de faire échouer tout le démarrage.
|
|
188
|
+
- **Fournisseur de texte fail-soft** : une exception pendant l'assemblage du prompt ferait échouer **chaque** requête ; un échec de rendu renvoie donc une chaîne vide (la plateforme filtre le texte vide).
|
|
189
|
+
- **Pas de `complete`** : le définir masquerait la totalité du prompt système.
|
|
190
|
+
- **La déduplication est l'affaire de la plateforme** : aucun état par agent n'est conservé ; au passage de minuit, l'instantané porte simplement la nouvelle date.
|
|
191
|
+
- **Cycle de vie** : l'enregistrement appartient à la fiber enfant de `ctx.inject` et est récupéré quand le plugin est désactivé.
|
|
192
|
+
|
|
193
|
+
## Développement : TDD + lint
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npm install # devDependencies only (eslint / @eslint/js); zero runtime dependencies
|
|
197
|
+
|
|
198
|
+
npm run tdd # watch mode: rerun on src/ or tests/ changes (node --test --watch)
|
|
199
|
+
npm test # one full run: node --test "tests/*.test.mjs"
|
|
200
|
+
node tests/format.test.mjs # run a single file (most reliable under a sandbox: no child process)
|
|
201
|
+
|
|
202
|
+
npm run lint # eslint . (src + tests + eslint.config.mjs)
|
|
203
|
+
npm run lint:fix # auto-fix what can be fixed
|
|
204
|
+
npm run verify # lint + test; run this before committing
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Rouge-vert-refactorisation
|
|
208
|
+
|
|
209
|
+
Les cas de test correspondent directement aux critères d'acceptation : écrire d'abord une assertion qui échoue, puis la faire passer.
|
|
210
|
+
|
|
211
|
+
| Étape | Action | Commande |
|
|
212
|
+
|------|--------|---------|
|
|
213
|
+
| 1 rouge | Ajouter dans `tests/*.test.mjs` une assertion nommée d'après le critère d'acceptation, qui affirme un comportement que vous n'avez **pas** encore | `npm run tdd` |
|
|
214
|
+
| 2 vert | Écrire dans `src/` l'implémentation minimale pour la faire passer, sans toucher aux autres assertions | `npm run tdd` |
|
|
215
|
+
| 3 refactorisation | Renommer et extraire des fonctions pures en restant au vert ; `src/format.js` concentre toute la logique pure, `src/index.js` ne fait qu'enregistrer | `npm run tdd` |
|
|
216
|
+
| 4 barrière | Lancer lint + la suite complète avant de committer | `npm run verify` |
|
|
217
|
+
|
|
218
|
+
18 assertions aujourd'hui : `format.test.mjs` (11) couvre les fonctions pures, `context.test.mjs` (7) vérifie le contrat d'enregistrement contre un ctx factice.
|
|
219
|
+
|
|
220
|
+
### Points marquants de la configuration lint
|
|
221
|
+
|
|
222
|
+
- ESLint 10 en configuration plate (`eslint.config.mjs`) avec `@eslint/js` recommended comme base.
|
|
223
|
+
- Règles resserrées : `eqeqeq`, `prefer-const`, `object-shorthand`, `no-unused-vars` (préfixe `_` exempté).
|
|
224
|
+
- Les globales Node `crypto` / `console` / `process` sont déclarées explicitement, sinon `no-undef` produit de faux positifs.
|
|
225
|
+
|
|
226
|
+
## Limitations connues
|
|
227
|
+
|
|
228
|
+
- **Inactif sous les presets à prompt fixe** : si la persona d'un preset définit `includeRuntimeContext: false` (c'est le cas du `minimal` officiel et du `simple-reply` local), `assemble()` renvoie `contexts: []` et l'entrée de ce plugin est jetée en bloc. Ces presets sont conçus pour interdire aux listeners ultérieurs d'ajouter quoi que ce soit au prompt.
|
|
229
|
+
- **Les anciens instantanés restent dans l'historique** : quand la date change, la plateforme ajoute un nouvel instantané (l'ancien est conservé) et le nouveau prend effet grâce à sa propre déclaration « This snapshot supersedes earlier runtime-context snapshots » — de la même manière que la plateforme gère les changements de cwd / sandbox / politique d'approbation.
|
|
230
|
+
- **Les patches de bundle ne sont pas rechargés à chaud** : modifier `cordis.patch.yml` ou mettre à jour le plugin impose un redémarrage de dsh web (changer `disabled` dans le patch de profil est hot).
|
|
231
|
+
- **`dsh-time-context` n'est ni chargé ni filtré** : si vous le montez explicitement dans un preset, son texte verbeux apparaît comme d'habitude. Ne pas utiliser les deux.
|
|
232
|
+
- **Pas de sonde à l'exécution pour le point de contrat** : `systemPrompt.context` est appelé sans garde ; un futur renommage côté DSH se manifestera donc par un échec de chargement du plugin plutôt que par une dégradation silencieuse (voir `HANDOVER.md` §7).
|
|
233
|
+
|
|
234
|
+
## Licence
|
|
235
|
+
|
|
236
|
+
MIT
|
package/README.it.md
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# dsh-date-wrapper
|
|
2
|
+
|
|
3
|
+
- [English README](./README.md)
|
|
4
|
+
- [中文 README](./README.zh.md)
|
|
5
|
+
- [日本語 README](./README.ja.md)
|
|
6
|
+
- [한국어 README](./README.ko.md)
|
|
7
|
+
- [Français README](./README.fr.md)
|
|
8
|
+
- [Deutsch README](./README.de.md)
|
|
9
|
+
- [Italiano README](./README.it.md)
|
|
10
|
+
- [Русский README](./README.ru.md)
|
|
11
|
+
- [Español README](./README.es.md)
|
|
12
|
+
- [Installation guide](./INSTALL.md)
|
|
13
|
+
- [中文安装指南](./INSTALL.zh.md)
|
|
14
|
+
- [日本語インストールガイド](./INSTALL.ja.md)
|
|
15
|
+
- [한국어 설치 안내](./INSTALL.ko.md)
|
|
16
|
+
- [Guide d'installation](./INSTALL.fr.md)
|
|
17
|
+
- [Installationsanleitung](./INSTALL.de.md)
|
|
18
|
+
- [Guida all'installazione](./INSTALL.it.md)
|
|
19
|
+
- [Руководство по установке](./INSTALL.ru.md)
|
|
20
|
+
- [Guía de instalación](./INSTALL.es.md)
|
|
21
|
+
- [Changelog](./CHANGELOG.md)
|
|
22
|
+
- [日本語 changelog](./CHANGELOG.ja.md)
|
|
23
|
+
- [한국어 changelog](./CHANGELOG.ko.md)
|
|
24
|
+
- [Français changelog](./CHANGELOG.fr.md)
|
|
25
|
+
- [Deutsch changelog](./CHANGELOG.de.md)
|
|
26
|
+
- [Italiano changelog](./CHANGELOG.it.md)
|
|
27
|
+
- [Русский changelog](./CHANGELOG.ru.md)
|
|
28
|
+
- [Español changelog](./CHANGELOG.es.md)
|
|
29
|
+
|
|
30
|
+
> L'elenco delle versioni DSH supportate è **gestito da script, non scritto a mano** — vedi il blocco generato sotto (fonte unica: `scripts/hosts.mjs`; distribuito da `scripts/sync-hosts.mjs` a `package.json` peerDependencies + engines.dsh, `dsh.plugin.json` e questo README in nove lingue). L'unico contratto lato host del plugin è `systemPrompt.context({ name, order, text })`; non registra namespace di impostazioni, non legge dati di sessione e non fa chiamate RPC — le riscritture lato host non lo toccano.
|
|
31
|
+
|
|
32
|
+
> Una riga di data minimale: appende `Current date: 2026-09-08 Asia/Shanghai Tuesday` (46 caratteri, ~12 token) allo snapshot del contesto di runtime che DSH invia già di suo.
|
|
33
|
+
> **Non** carica `@deepseek-ai/dsh-time-context`, **non** aggiunge messaggi di sessione extra, **non** patcha il sorgente di DSH e non richiede PR.
|
|
34
|
+
|
|
35
|
+
- [Come funziona: sessioni DSH, JSONL e assemblaggio delle richieste](./docs/dsh-session-and-context-mechanics.md) (cinese)
|
|
36
|
+
- [HANDOVER.md](./HANDOVER.md) (cinese)
|
|
37
|
+
|
|
38
|
+
<!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
|
|
39
|
+
- **Host DSH supportati:** `0.1.0-rc.2` `0.1.0-rc.3` `0.1.0-rc.6` `0.1.0-rc.7` `0.1.0-rc.8` `0.1.1-rc.1` `0.1.1-rc.2` `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` (15 rc attraverso le linee 0.1.0 / 0.1.1 / 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0)
|
|
40
|
+
- **Verificato a runtime:** `0.1.0-rc.2`, `0.1.0-rc.3`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.0-rc.8`, `0.1.1-rc.1`, `0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, `0.2.0-rc.2` — prove in `.compat-results/`
|
|
41
|
+
<!-- host-compat:end -->
|
|
42
|
+
|
|
43
|
+
## Che problema risolve questo plugin
|
|
44
|
+
|
|
45
|
+
Il `@deepseek-ai/dsh-time-context` di DSH inietta circa **280 caratteri** di metadati a ogni richiesta:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
Time sampled while preparing turn 3, step 2: 2026-09-08T16:05:36+08:00[Asia/Shanghai]
|
|
49
|
+
Browser time zone for this request: Asia/Shanghai. Interpret otherwise-unqualified dates and times in this zone.
|
|
50
|
+
Elapsed since the preceding model-visible message: 2m 34s.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Questo plugin comprime la stessa informazione in un'unica riga di **46 caratteri** e ne cambia il punto di arrivo — non va più nel flusso dei messaggi:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Current date: 2026-09-08 Asia/Shanghai Tuesday
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Dimensione | `dsh-time-context` | `dsh-date-wrapper` |
|
|
60
|
+
|-----------|--------------------|--------------------|
|
|
61
|
+
| Testo iniettato | ~280 caratteri | 46 caratteri (↓84%), ~12 token |
|
|
62
|
+
| Punto di arrivo | Un messaggio per ogni pre-step (`user/message`) | Lo snapshot del contesto di runtime della piattaforma (`systemPrompt.context`) |
|
|
63
|
+
| Frequenza | Un evento per ogni step idoneo | Reinviate con lo snapshot solo quando il testo cambia (0 eventi nello stesso giorno) |
|
|
64
|
+
| Dipendenza | Servizio `agents` | Servizio `systemPrompt` |
|
|
65
|
+
| Dipendenze di runtime | — | nessuna |
|
|
66
|
+
|
|
67
|
+
## Compatibilità delle versioni
|
|
68
|
+
|
|
69
|
+
| Voce | Verdetto |
|
|
70
|
+
|------|---------|
|
|
71
|
+
| Versioni DSH target | enum gestita da script — `scripts/hosts.mjs` (15 rc sulle linee 0.1.0 → 0.2.0); lista verificata a runtime nel blocco generato in testa |
|
|
72
|
+
| API settings | **Non applicabile**: il plugin non registra impostazioni né esporta un `Config` schemastery |
|
|
73
|
+
| Punti di contratto usati | Esattamente uno — `systemPrompt.context()` |
|
|
74
|
+
| Conflitto con una funzionalità nativa | Si sovrappone a `@deepseek-ai/dsh-time-context`; **non usare entrambi**. Non installato per default = disattivato per default |
|
|
75
|
+
| Metà browser | **Nessuna**: nessuno slot, nessun DOM, nessun token semantico CSS |
|
|
76
|
+
| Import di pacchetti DSH | **Zero**: niente da `@deepseek-ai/*`, il che è più rigido del pattern «rilevamento a runtime + fallback su doppia API» |
|
|
77
|
+
|
|
78
|
+
| Punto di contratto | 0.1.0-rc.7 | 0.1.1-rc.2 | 0.1.2-rc.1 | 0.1.3-alpha.2 | 0.1.7-rc.2 | 0.2.0-rc.1 |
|
|
79
|
+
|---|---|---|---|---|---|---|
|
|
80
|
+
| `systemPrompt.context(ctx): () => void` | sì | sì (verificato su questo host) | sì | sì | sì | sì (diff rispetto a 0.1.7-rc.2: solo la stringa di versione) |
|
|
81
|
+
| `PromptContext = { name, order, text }`, senza campo `complete` | sì | sì | sì | sì | sì | sì |
|
|
82
|
+
| `includeRuntimeContext` / `suppressRuntimeContext` | sì | sì | sì | sì | sì | sì |
|
|
83
|
+
| deduplica per testo del `project()` di agent-loop e `surfaceOp: "append"` | sì | sì | sì | non confrontato | sì | sì |
|
|
84
|
+
| `order: 116` senza collisioni (110 / 115 / 120 occupati) | sì | sì | sì | sì | sì | sì |
|
|
85
|
+
|
|
86
|
+
> Metodo: `npm pack @deepseek-ai/dsh-system-prompt@<version>`, scompattare e confrontare `lib/types/index.d.ts` e `lib/index.js`; identico per `@deepseek-ai/dsh-agent-loop`.
|
|
87
|
+
> Tra `dsh-v0.1.7-rc.2` e `dsh-v0.2.0-rc.1` il diff di `packages/core/system-prompt` è una sola riga di versione, i punti di chiamata `systemPrompt.context` su 110/115/120 sono invariati e la guida alla migrazione dei plugin non ha alcuna voce `systemPrompt`.
|
|
88
|
+
> Solo 0.1.1-rc.2 è stata verificata **a runtime** su questo host; lo smoke test a runtime di 0.2.0-rc.1 è tracciato in `HANDOVER.md` §7.
|
|
89
|
+
|
|
90
|
+
## Perché uno snapshot del contesto di runtime invece di un messaggio
|
|
91
|
+
|
|
92
|
+
Il primo tentativo copiava `dsh-time-context` e aggiungeva un `user/message` in `agent/pre-step`. Il costo misurato era troppo alto: ogni evento JSONL pesa **339 byte** (il testo ne occupa solo 46, perché `content` e `sections` ne conservano ciascuno una copia) e ne veniva scritto **uno a ogni turno**.
|
|
93
|
+
|
|
94
|
+
Registrando invece un contesto di runtime, la data si fonde nel messaggio di snapshot che la piattaforma invia già:
|
|
95
|
+
|
|
96
|
+
- La piattaforma **deduplica gli snapshot per testo** (`RuntimeContextProjection.project()` in `dsh-agent-loop`: `if (this.retained?.text === snapshot) return`), quindi finché la data non cambia **non viene scritto nemmeno un evento extra**;
|
|
97
|
+
- Gli snapshot **aggiungono** un nuovo messaggio (`surfaceOp: 'append'`) invece di riscrivere sul posto, quindi la sequenza delle richieste fa solo crescere → **la cache dei prefissi resta preservata**;
|
|
98
|
+
- Il nostro costo marginale sono quei 46 byte, e solo quando lo snapshot viene reinvato perché il suo testo è cambiato.
|
|
99
|
+
|
|
100
|
+
Misurato su questo host (una sessione reale, 10 turni / 231 step):
|
|
101
|
+
|
|
102
|
+
| Voce | Misurato |
|
|
103
|
+
|------|----------|
|
|
104
|
+
| Snapshot del contesto di runtime della piattaforma | 2 eventi, 1133 B ciascuno, 2,3 KB in totale |
|
|
105
|
+
| Messaggi reali dell'utente | 10 eventi, 396 B ciascuno |
|
|
106
|
+
| Approccio vecchio (un messaggio per turno) | 10 × 339 B ≈ 3,4 KB |
|
|
107
|
+
| Questo approccio | 0 eventi extra; ~46 B ripiegati in uno snapshot esistente |
|
|
108
|
+
|
|
109
|
+
## Configurazione
|
|
110
|
+
|
|
111
|
+
Spedito con `cordis.patch.yml`; riavviare dopo averlo modificato:
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
- insert:
|
|
115
|
+
- id: date-wrapper
|
|
116
|
+
name: dsh-date-wrapper
|
|
117
|
+
config:
|
|
118
|
+
timeZone: Asia/Shanghai # IANA zone; omit to use the process zone
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- Un `timeZone` non valido lancia un'eccezione all'avvio (**nessun** fallback silenzioso su UTC).
|
|
122
|
+
- Il nome della zona nel testo è il nome IANA risolto (il nome della zona del processo quando `timeZone` è omesso).
|
|
123
|
+
- La voce del contesto di runtime si chiama `date-wrapper:date` con order `116` (già occupati: 110 sandbox, 115 approval, 120 subagent).
|
|
124
|
+
- Il plugin **non esporta alcun `Config` schemastery**, quindi la sua configurazione salta la validazione dello schema dell'host; tutto è validato a mano in `validateConfig()`. Ecco anche perché la pagina Settings → Plugins non ha un form di configurazione per esso.
|
|
125
|
+
|
|
126
|
+
## On/off: l'attivazione del plugin è l'interruttore, non esiste un toggle nel pannello
|
|
127
|
+
|
|
128
|
+
Il plugin non include **né** un toggle nel pannello impostazioni **né** un campo di configurazione `enabled`, perché:
|
|
129
|
+
|
|
130
|
+
- L'interruttore di funzione *è* lo stato attivo della riga del plugin. Inattiva → `apply()` non viene mai eseguito → la voce del contesto di runtime non esiste → non viene iniettato nemmeno un carattere.
|
|
131
|
+
- Non c'è metà browser (`dsh.client`), quindi l'UI non possiede alcun widget nostro.
|
|
132
|
+
- La pagina **Settings → Plugins** integrata in DSH mostra già ogni voce come `enabled / disabled` (sola lettura).
|
|
133
|
+
|
|
134
|
+
### Come disattivarlo
|
|
135
|
+
|
|
136
|
+
Sovrascrivetelo per `id` nel **vostro** layer di patch del profilo — `C:\Users\<you>\.dsh\profiles\web\cordis.patch.yml`:
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
- id: date-wrapper
|
|
140
|
+
disabled: true # disabled; set back to false to restore
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- **A caldo, senza riavvio**: il file è sorvegliato dall'HMR di Cordis e `disabled: true` dispose direttamente la fiber della riga.
|
|
144
|
+
- Se la riga `date-wrapper` non esiste ancora (non installato), questa patch si limita a registrare un avviso `entry "date-wrapper" not found`; l'avvio riesce comunque.
|
|
145
|
+
- ⚠️ Il file deve essere un **array YAML di primo livello**; se è malformato, **l'avvio fallisce** (DSH è fail-loud per i layer di patch utente).
|
|
146
|
+
|
|
147
|
+
### Come rimuoverlo completamente
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
dsh plugin --profile web remove dsh-date-wrapper
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
La rimozione passa per il layer bundle e **richiede un riavvio** di dsh web (le patch bundle non fanno hot-reload).
|
|
154
|
+
|
|
155
|
+
## Installazione
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
dsh plugin --profile web add github:drscrewdriver/dsh-date-wrapper
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Riavviate dsh web e ricaricate la pagina. Percorsi locali, modalità link e risoluzione dei problemi: [INSTALL.it.md](./INSTALL.it.md).
|
|
162
|
+
|
|
163
|
+
## Verifica
|
|
164
|
+
|
|
165
|
+
| # | Come | Atteso |
|
|
166
|
+
|---|-----|----------|
|
|
167
|
+
| A1 | Aprire una nuova sessione e inviare un messaggio | Lo snapshot del contesto di runtime contiene `Current date: YYYY-MM-DD <zone> <weekday>` (mostrato come una riga di contesto iniettato proveniente da `system-prompt`) |
|
|
168
|
+
| A2 | Controllare quella riga | ≤50 caratteri (46 misurati; la soglia PRD di 30 è stata rilassata per il formato richiesto) |
|
|
169
|
+
| A3 | Disattivare il plugin (patch del profilo `disabled: true`) | La riga non compare più negli snapshot delle sessioni successive |
|
|
170
|
+
| A4 | Cercare nel log di sessione | Nessun `Time sampled` / `Elapsed since` / `Browser time zone` |
|
|
171
|
+
| A5 | Impostare `timeZone` su `UTC` e riavviare | La data segue UTC (può differire di un giorno a cavallo di un confine di zona) |
|
|
172
|
+
|
|
173
|
+
## Note di implementazione
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
dsh-date-wrapper/
|
|
177
|
+
├── package.json # name / type: module / main / exports["."] / dsh.bundle.patch / files
|
|
178
|
+
├── cordis.patch.yml # one insert row (no patch-level id → lands at the profile root = host plane)
|
|
179
|
+
├── src/
|
|
180
|
+
│ ├── format.js # pure functions: resolveZone / renderDate / createDateContextText / validateConfig / TEXT_LABEL
|
|
181
|
+
│ └── index.js # apply(ctx, config) → ctx.inject(['systemPrompt'], …) → systemPrompt.context(...)
|
|
182
|
+
└── tests/
|
|
183
|
+
├── format.test.mjs # 11 cases (zone projection, weekday, format and length, degradation, config validation)
|
|
184
|
+
└── context.test.mjs # 7 cases (registration contract against a fake ctx)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- **Riga lato host**: `ctx.inject(['systemPrompt'], …)` apre una fiber figlia; se il servizio manca, il plugin non registra nulla in silenzio invece di far fallire l'intero boot.
|
|
188
|
+
- **Provider di testo fail-soft**: un'eccezione durante l'assemblaggio del prompt farebbe fallire **ogni** richiesta; un errore di rendering restituisce quindi una stringa vuota (la piattaforma filtra il testo vuoto).
|
|
189
|
+
- **Niente `complete`**: impostarlo oscurerebbe l'intero system prompt.
|
|
190
|
+
- **La deduplica è compito della piattaforma**: non viene mantenuto alcuno stato per agente; a cavallo della mezzanotte lo snapshot porta semplicemente la nuova data.
|
|
191
|
+
- **Ciclo di vita**: la registrazione appartiene alla fiber figlia di `ctx.inject` e viene recuperata quando il plugin viene disattivato.
|
|
192
|
+
|
|
193
|
+
## Sviluppo: TDD + lint
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npm install # devDependencies only (eslint / @eslint/js); zero runtime dependencies
|
|
197
|
+
|
|
198
|
+
npm run tdd # watch mode: rerun on src/ or tests/ changes (node --test --watch)
|
|
199
|
+
npm test # one full run: node --test "tests/*.test.mjs"
|
|
200
|
+
node tests/format.test.mjs # run a single file (most reliable under a sandbox: no child process)
|
|
201
|
+
|
|
202
|
+
npm run lint # eslint . (src + tests + eslint.config.mjs)
|
|
203
|
+
npm run lint:fix # auto-fix what can be fixed
|
|
204
|
+
npm run verify # lint + test; run this before committing
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Red-green-refactor
|
|
208
|
+
|
|
209
|
+
I casi di test corrispondono direttamente ai criteri di accettazione: prima si scrive un'asserzione che fallisce, poi la si fa passare.
|
|
210
|
+
|
|
211
|
+
| Passo | Azione | Comando |
|
|
212
|
+
|------|--------|---------|
|
|
213
|
+
| 1 rosso | Aggiungere in `tests/*.test.mjs` un'asserzione intitolata al criterio di accettazione, che affermi un comportamento che **non** avete ancora | `npm run tdd` |
|
|
214
|
+
| 2 verde | Scrivere in `src/` l'implementazione minima per farla passare, senza toccare le altre asserzioni | `npm run tdd` |
|
|
215
|
+
| 3 refactor | Rinominare ed estrarre funzioni pure restando nel verde; `src/format.js` contiene tutta la logica pura, `src/index.js` si limita a registrare | `npm run tdd` |
|
|
216
|
+
| 4 gate | Eseguire lint + la suite completa prima di fare commit | `npm run verify` |
|
|
217
|
+
|
|
218
|
+
Oggi 18 asserzioni: `format.test.mjs` (11) copre le funzioni pure, `context.test.mjs` (7) asserisce il contratto di registrazione contro uno ctx finto.
|
|
219
|
+
|
|
220
|
+
### Punti salienti della configurazione lint
|
|
221
|
+
|
|
222
|
+
- ESLint 10 flat config (`eslint.config.mjs`) con `@eslint/js` recommended come baseline.
|
|
223
|
+
- Regole inasprite: `eqeqeq`, `prefer-const`, `object-shorthand`, `no-unused-vars` (prefisso `_` esente).
|
|
224
|
+
- Le global Node `crypto` / `console` / `process` sono dichiarate esplicitamente, altrimenti `no-undef` dà falsi positivi.
|
|
225
|
+
|
|
226
|
+
## Limitazioni note
|
|
227
|
+
|
|
228
|
+
- **Inattivo con i preset a prompt fisso**: se la persona di un preset imposta `includeRuntimeContext: false` (lo fanno sia il `minimal` ufficiale sia il `simple-reply` locale), `assemble()` restituisce `contexts: []` e la voce di questo plugin viene scartata in blocco. Quei preset sono pensati per vietare ai listener successivi di aggiungere qualsiasi cosa al prompt.
|
|
229
|
+
- **I vecchi snapshot restano nella cronologia**: quando la data cambia la piattaforma aggiunge un nuovo snapshot (quello vecchio resta) e il nuovo fa effetto tramite la sua dichiarazione "This snapshot supersedes earlier runtime-context snapshots" — allo stesso modo con cui la piattaforma gestisce i cambi di cwd / sandbox / policy di approvazione.
|
|
230
|
+
- **Le patch bundle non fanno hot-reload**: modificare `cordis.patch.yml` o aggiornare il plugin richiede un riavvio di dsh web (cambiare `disabled` nella patch del profilo è a caldo).
|
|
231
|
+
- **`dsh-time-context` non viene né caricato né filtrato**: se lo montate esplicitamente in un preset, il suo testo verboso appare come al solito. Non usare entrambi.
|
|
232
|
+
- **Nessuna sonda a runtime per il punto di contratto**: `systemPrompt.context` è chiamato senza protezioni, quindi un futuro rinomina da parte di DSH si manifesterebbe come un fallimento di caricamento del plugin invece che come un degrado silenzioso (vedi `HANDOVER.md` §7).
|
|
233
|
+
|
|
234
|
+
## Licenza
|
|
235
|
+
|
|
236
|
+
MIT
|
package/README.ja.md
CHANGED
|
@@ -4,13 +4,28 @@
|
|
|
4
4
|
- [中文 README](./README.zh.md)
|
|
5
5
|
- [日本語 README](./README.ja.md)
|
|
6
6
|
- [한국어 README](./README.ko.md)
|
|
7
|
+
- [Français README](./README.fr.md)
|
|
8
|
+
- [Deutsch README](./README.de.md)
|
|
9
|
+
- [Italiano README](./README.it.md)
|
|
10
|
+
- [Русский README](./README.ru.md)
|
|
11
|
+
- [Español README](./README.es.md)
|
|
7
12
|
- [Installation guide](./INSTALL.md)
|
|
8
13
|
- [中文安装指南](./INSTALL.zh.md)
|
|
9
14
|
- [日本語インストールガイド](./INSTALL.ja.md)
|
|
10
15
|
- [한국어 설치 안내](./INSTALL.ko.md)
|
|
16
|
+
- [Guide d'installation](./INSTALL.fr.md)
|
|
17
|
+
- [Installationsanleitung](./INSTALL.de.md)
|
|
18
|
+
- [Guida all'installazione](./INSTALL.it.md)
|
|
19
|
+
- [Руководство по установке](./INSTALL.ru.md)
|
|
20
|
+
- [Guía de instalación](./INSTALL.es.md)
|
|
11
21
|
- [Changelog](./CHANGELOG.md)
|
|
12
22
|
- [日本語 changelog](./CHANGELOG.ja.md)
|
|
13
23
|
- [한국어 changelog](./CHANGELOG.ko.md)
|
|
24
|
+
- [Français changelog](./CHANGELOG.fr.md)
|
|
25
|
+
- [Deutsch changelog](./CHANGELOG.de.md)
|
|
26
|
+
- [Italiano changelog](./CHANGELOG.it.md)
|
|
27
|
+
- [Русский changelog](./CHANGELOG.ru.md)
|
|
28
|
+
- [Español changelog](./CHANGELOG.es.md)
|
|
14
29
|
|
|
15
30
|
> 最小限の日付行です。DSH がすでに送信しているランタイムコンテキストスナップショットに `Current date: 2026-09-08 Asia/Shanghai Tuesday`(46文字、約12トークン)をぶら下げるだけです。
|
|
16
31
|
> `@deepseek-ai/dsh-time-context` を**読み込まず**、余分なセッションメッセージを**追加せず**、DSH のソースを**パッチせず**、PR も必要ありません。
|
|
@@ -18,6 +33,11 @@
|
|
|
18
33
|
- [動作原理: DSH のセッション、JSONL、リクエスト組み立て](./docs/dsh-session-and-context-mechanics.md)(中国語)
|
|
19
34
|
- [HANDOVER.md](./HANDOVER.md)(中国語)
|
|
20
35
|
|
|
36
|
+
<!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
|
|
37
|
+
- **対応する DSH ホスト:** `0.1.0-rc.2` `0.1.0-rc.3` `0.1.0-rc.6` `0.1.0-rc.7` `0.1.0-rc.8` `0.1.1-rc.1` `0.1.1-rc.2` `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2`(0.1.0 / 0.1.1 / 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 の 15 rc)
|
|
38
|
+
- **ランタイム検証済み:** `0.1.0-rc.2`, `0.1.0-rc.3`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.0-rc.8`, `0.1.1-rc.1`, `0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, `0.2.0-rc.2`(証跡は `.compat-results/`)
|
|
39
|
+
<!-- host-compat:end -->
|
|
40
|
+
|
|
21
41
|
## このプラグインが解決する課題
|
|
22
42
|
|
|
23
43
|
DSH 自身の `@deepseek-ai/dsh-time-context` は、リクエストごとに約 **280文字** のメタデータを注入します:
|
|
@@ -46,22 +66,26 @@ Current date: 2026-09-08 Asia/Shanghai Tuesday
|
|
|
46
66
|
|
|
47
67
|
| 項目 | 判定 |
|
|
48
68
|
|------|---------|
|
|
49
|
-
| 対象 DSH バージョン | 0.1.0
|
|
69
|
+
| 対象 DSH バージョン | スクリプト管理の列挙 — `scripts/hosts.mjs`(0.1.0 → 0.2.0 の 6 ライン計 15 rc)。ランタイム検証済みリストは冒頭の自動生成ブロックを参照 |
|
|
50
70
|
| settings API | **該当なし**: プラグインは設定を登録せず、schemastery の `Config` もエクスポートしません |
|
|
51
71
|
| 使用しているコントラクトポイント | ちょうど 1 つ — `systemPrompt.context()` |
|
|
52
72
|
| ネイティブ機能との競合 | `@deepseek-ai/dsh-time-context` と重複します。**両方を同時に使わないでください**。デフォルトではインストールされない = デフォルトでオフ |
|
|
53
73
|
| ブラウザ側 | **なし**: スロットも DOM も CSS セマンティックトークンもありません |
|
|
54
74
|
| DSH パッケージのインポート | **ゼロ**: `@deepseek-ai/*` から何も取り込みません。これは「実行時検出 + デュアル API フォールバック」パターンよりも厳格です |
|
|
55
75
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
|
59
|
-
|
|
60
|
-
| `
|
|
61
|
-
|
|
|
76
|
+
歴史的静的監査(npm pack 型比較、記録用。**バージョン対応の宣言は列挙 + ランタイム行列が優先され、この表は参照用**):
|
|
77
|
+
|
|
78
|
+
| コントラクトポイント | 0.1.0-rc.7 | 0.1.1-rc.2 | 0.1.2-rc.1 | 0.1.3-alpha.2 | 0.1.7-rc.2 | 0.2.0-rc.1 |
|
|
79
|
+
|---|---|---|---|---|---|---|
|
|
80
|
+
| `systemPrompt.context(ctx): () => void` | yes | yes(このホストで検証済み) | yes | yes | yes | yes(0.1.7-rc.2 との差分はバージョン文字列のみ) |
|
|
81
|
+
| `PromptContext = { name, order, text }`、`complete` フィールドなし | yes | yes | yes | yes | yes | yes |
|
|
82
|
+
| `includeRuntimeContext` / `suppressRuntimeContext` | yes | yes | yes | yes | yes | yes |
|
|
83
|
+
| agent-loop の `project()` によるテキスト重複排除と `surfaceOp: "append"` | yes | yes | yes | 未比較 | yes | yes |
|
|
84
|
+
| `order: 116` の衝突なし(110 / 115 / 120 は使用中) | yes | yes | yes | yes | yes | yes |
|
|
62
85
|
|
|
63
86
|
> 方法: `npm pack @deepseek-ai/dsh-system-prompt@<version>` で取得して展開し、`lib/types/index.d.ts` と `lib/index.js` を比較。`@deepseek-ai/dsh-agent-loop` も同様。
|
|
64
|
-
>
|
|
87
|
+
> `dsh-v0.1.7-rc.2` と `dsh-v0.2.0-rc.1` の間で `packages/core/system-prompt` の差分はバージョン 1 行のみで、110/115/120 の `systemPrompt.context` 呼び出し箇所はそのまま、プラグイン移行ガイドに `systemPrompt` の項目はありません。
|
|
88
|
+
> ランタイム検証は現在、ホスト rc ごとに**ローカル分離マトリクス**で実施します(`scripts/test-host-compat.mjs`、証跡は `.compat-results/`)。グリーンリストは冒頭の自動生成ブロックです。`HANDOVER.md` §7 の 0.1.1-rc.2 の記録はマトリクス以前のものです。
|
|
65
89
|
|
|
66
90
|
## メッセージではなくランタイムコンテキストスナップショットを使う理由
|
|
67
91
|
|
package/README.ko.md
CHANGED
|
@@ -4,13 +4,28 @@
|
|
|
4
4
|
- [中文 README](./README.zh.md)
|
|
5
5
|
- [日本語 README](./README.ja.md)
|
|
6
6
|
- [한국어 README](./README.ko.md)
|
|
7
|
+
- [Français README](./README.fr.md)
|
|
8
|
+
- [Deutsch README](./README.de.md)
|
|
9
|
+
- [Italiano README](./README.it.md)
|
|
10
|
+
- [Русский README](./README.ru.md)
|
|
11
|
+
- [Español README](./README.es.md)
|
|
7
12
|
- [Installation guide](./INSTALL.md)
|
|
8
13
|
- [中文安装指南](./INSTALL.zh.md)
|
|
9
14
|
- [日本語インストールガイド](./INSTALL.ja.md)
|
|
10
15
|
- [한국어 설치 안내](./INSTALL.ko.md)
|
|
16
|
+
- [Guide d'installation](./INSTALL.fr.md)
|
|
17
|
+
- [Installationsanleitung](./INSTALL.de.md)
|
|
18
|
+
- [Guida all'installazione](./INSTALL.it.md)
|
|
19
|
+
- [Руководство по установке](./INSTALL.ru.md)
|
|
20
|
+
- [Guía de instalación](./INSTALL.es.md)
|
|
11
21
|
- [Changelog](./CHANGELOG.md)
|
|
12
22
|
- [日本語 changelog](./CHANGELOG.ja.md)
|
|
13
23
|
- [한국어 changelog](./CHANGELOG.ko.md)
|
|
24
|
+
- [Français changelog](./CHANGELOG.fr.md)
|
|
25
|
+
- [Deutsch changelog](./CHANGELOG.de.md)
|
|
26
|
+
- [Italiano changelog](./CHANGELOG.it.md)
|
|
27
|
+
- [Русский changelog](./CHANGELOG.ru.md)
|
|
28
|
+
- [Español changelog](./CHANGELOG.es.md)
|
|
14
29
|
|
|
15
30
|
> 최소한의 날짜 한 줄: DSH가 이미 전송하고 있는 런타임 컨텍스트 스냅샷에 `Current date: 2026-09-08 Asia/Shanghai Tuesday`(46 characters, ~12 tokens)를 얹습니다.
|
|
16
31
|
> `@deepseek-ai/dsh-time-context`를 로드하지 **않고**, 추가 세션 메시지를 넣지 **않으며**, DSH 소스를 패치하지 **않고**, PR도 필요하지 않습니다.
|
|
@@ -18,6 +33,11 @@
|
|
|
18
33
|
- [동작 원리: DSH 세션, JSONL, 요청 조립](./docs/dsh-session-and-context-mechanics.md) (중국어)
|
|
19
34
|
- [HANDOVER.md](./HANDOVER.md) (중국어)
|
|
20
35
|
|
|
36
|
+
<!-- host-compat:begin — generated by scripts/sync-hosts.mjs from scripts/hosts.mjs; DO NOT EDIT -->
|
|
37
|
+
- **지원하는 DSH 호스트:** `0.1.0-rc.2` `0.1.0-rc.3` `0.1.0-rc.6` `0.1.0-rc.7` `0.1.0-rc.8` `0.1.1-rc.1` `0.1.1-rc.2` `0.1.2-rc.1` `0.1.5-rc.1` `0.1.5-rc.2` `0.1.5-rc.3` `0.1.7-rc.1` `0.1.7-rc.2` `0.2.0-rc.1` `0.2.0-rc.2` (0.1.0 / 0.1.1 / 0.1.2 / 0.1.5 / 0.1.7 / 0.2.0 라인의 15개 rc)
|
|
38
|
+
- **런타임 검증됨:** `0.1.0-rc.2`, `0.1.0-rc.3`, `0.1.0-rc.6`, `0.1.0-rc.7`, `0.1.0-rc.8`, `0.1.1-rc.1`, `0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.5-rc.3`, `0.1.7-rc.1`, `0.1.7-rc.2`, `0.2.0-rc.1`, `0.2.0-rc.2` (증적은 `.compat-results/`)
|
|
39
|
+
<!-- host-compat:end -->
|
|
40
|
+
|
|
21
41
|
## 이 플러그인이 해결하는 문제
|
|
22
42
|
|
|
23
43
|
DSH 자체의 `@deepseek-ai/dsh-time-context`는 매 요청마다 약 **280 characters**의 메타데이터를 주입합니다:
|
|
@@ -46,22 +66,26 @@ Current date: 2026-09-08 Asia/Shanghai Tuesday
|
|
|
46
66
|
|
|
47
67
|
| 항목 | 판정 |
|
|
48
68
|
|------|---------|
|
|
49
|
-
| 대상 DSH 버전 | 0.1.0
|
|
69
|
+
| 대상 DSH 버전 | 스크립트 관리 열거 — `scripts/hosts.mjs` (0.1.0 → 0.2.0 6개 라인 총 15개 rc). 런타임 검증 목록은 문서 상단 자동 생성 블록 참조 |
|
|
50
70
|
| settings API | **해당 없음**: 이 플러그인은 settings를 등록하지 않고 schemastery `Config`도 내보내지 않습니다 |
|
|
51
71
|
| 사용하는 계약 지점 | 정확히 하나 — `systemPrompt.context()` |
|
|
52
72
|
| 네이티브 기능과의 충돌 | `@deepseek-ai/dsh-time-context`와 중복됩니다; **둘 다 사용하지 마십시오**. 기본 미설치 = 기본 꺼짐 |
|
|
53
73
|
| 브라우저 절반 | **없음**: 슬롯 없음, DOM 없음, CSS 시맨틱 토큰 없음 |
|
|
54
74
|
| DSH 패키지 임포트 | **0건**: `@deepseek-ai/*`에서 아무것도 가져오지 않으며, 이는 "런타임 감지 + 이중 API 폴백" 패턴보다 더 엄격합니다 |
|
|
55
75
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
|
59
|
-
|
|
60
|
-
| `
|
|
61
|
-
|
|
|
76
|
+
역사적 정적 감사(npm pack 타입 비교, 기록용. **버전 지원 선언은 열거 + 런타임 매트릭스가 우선하며 이 표는 참조용**):
|
|
77
|
+
|
|
78
|
+
| 계약 지점 | 0.1.0-rc.7 | 0.1.1-rc.2 | 0.1.2-rc.1 | 0.1.3-alpha.2 | 0.1.7-rc.2 | 0.2.0-rc.1 |
|
|
79
|
+
|---|---|---|---|---|---|---|
|
|
80
|
+
| `systemPrompt.context(ctx): () => void` | 예 | 예(이 호스트에서 검증됨) | 예 | 예 | 예 | 예(0.1.7-rc.2 대비 diff는 버전 문자열 1줄뿐) |
|
|
81
|
+
| `PromptContext = { name, order, text }`, `complete` 필드 없음 | 예 | 예 | 예 | 예 | 예 | 예 |
|
|
82
|
+
| `includeRuntimeContext` / `suppressRuntimeContext` | 예 | 예 | 예 | 예 | 예 | 예 |
|
|
83
|
+
| agent-loop의 `project()` 텍스트 중복 제거와 `surfaceOp: "append"` | 예 | 예 | 예 | 비교하지 않음 | 예 | 예 |
|
|
84
|
+
| `order: 116` 충돌 없음(110 / 115 / 120 사용 중) | 예 | 예 | 예 | 예 | 예 | 예 |
|
|
62
85
|
|
|
63
86
|
> 방법: `npm pack @deepseek-ai/dsh-system-prompt@<version>`으로 묶은 뒤 풀고 `lib/types/index.d.ts`와 `lib/index.js`를 비교합니다; `@deepseek-ai/dsh-agent-loop`도 같은 방식입니다.
|
|
64
|
-
>
|
|
87
|
+
> `dsh-v0.1.7-rc.2`와 `dsh-v0.2.0-rc.1` 사이 `packages/core/system-prompt`의 diff는 버전 1줄뿐이고, 110/115/120의 `systemPrompt.context` 호출 지점은 그대로이며, 플러그인 마이그레이션 가이드에는 `systemPrompt` 항목이 없습니다.
|
|
88
|
+
> 런타임 검증은 이제 호스트 rc별로 **로컬 격리 매트릭스**에서 수행합니다(`scripts/test-host-compat.mjs`, 증적은 `.compat-results/`). 그린 리스트는 문서 상단 자동 생성 블록입니다. `HANDOVER.md` §7의 0.1.1-rc.2 기록은 매트릭스 이전의 것입니다.
|
|
65
89
|
|
|
66
90
|
## 메시지가 아니라 런타임 컨텍스트 스냅샷인 이유
|
|
67
91
|
|