dsh-hypatia-auto-memory 2.1.1 → 2.2.1

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/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Hypatia Auto Memory",
4
+ "description": "Automatic long-term memory for DSH: logs each session into Hypatia and recalls what matters."
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Hypatia Auto Memory",
4
+ "description": "DSH 自动长期记忆:自动把会话记录进 Hypatia,并在需要时召回。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,18 +1,22 @@
1
1
  {
2
2
  "name": "dsh-hypatia-auto-memory",
3
- "version": "2.1.1",
3
+ "version": "2.2.1",
4
4
  "description": "Event-driven Hypatia memory for DSH: automatic conversation logging via session events, queued background consolidation (span summaries + work-unit extraction) with a dedicated model route, and recall injection — zero per-call model work in the main session.",
5
+ "icon": "./icon.svg",
5
6
  "type": "module",
6
7
  "main": "src/index.js",
7
8
  "exports": {
8
9
  ".": "./src/index.js",
9
10
  "./client": "./lib/client.js",
10
- "./package.json": "./package.json"
11
+ "./package.json": "./package.json",
12
+ "./locale/*.json": "./locale/*.json"
11
13
  },
12
14
  "files": [
15
+ "icon.svg",
13
16
  "src",
14
17
  "lib",
15
18
  "skills",
19
+ "locale/*.json",
16
20
  "cordis.patch.yml",
17
21
  "README.md"
18
22
  ],
package/src/cascade.js CHANGED
@@ -118,7 +118,7 @@ export function createCascade({ cli, llm, selectRoute, getConfig, status, modelL
118
118
  system: 'You produce strict JSON only. You never add prose around it.',
119
119
  messages: [createUserMessage({
120
120
  content: [{ type: 'text', text: `${archiveInstruction(level, rows.length)}\n\n${body}` }],
121
- source: { kind: 'plugin', plugin: PLUGIN_NAME },
121
+ source: { kind: `plugin:${PLUGIN_NAME}`, plugin: PLUGIN_NAME },
122
122
  })],
123
123
  // Thinking stays ON by default here, unlike the extraction call: an
124
124
  // archive is a semantic compression of sixteen summaries, not a
@@ -1,22 +1,75 @@
1
1
  /*
2
- * Bundle-local implementation of the DSH plugin-settings card treatment. The
3
- * card fills its own tab under Settings → Plugins, so it is a plain panel:
4
- * always expanded, no list-item or accordion chrome.
2
+ * Bundle-local wrapper around the shared settings form: the disclosure that
3
+ * holds the form plus the fields this plugin draws itself. The form frame,
4
+ * its fields, its save and its read-only notice are the harness's own
5
+ * (`SettingsForm`, `SettingsValueField`, `Switch`), so this file carries only
6
+ * what is specific to this card: the disclosure header, the fieldset the model
7
+ * priority editor needs, and the spacing between them.
5
8
  */
6
9
 
7
10
  .card {
8
11
  border: 0.5px solid var(--dsw-alias-border-l4);
9
- border-radius: 16px;
12
+ border-radius: var(--dsw-radius-lg);
10
13
  background: var(--dsw-alias-bg-layer-2);
14
+ /* Anything that scrolls inside a card draws the l2 thumb
15
+ (ui-theme styles/scrollbar.css rebinding contract). */
16
+ --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);
17
+ --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);
11
18
  }
12
19
 
13
20
  .header {
14
21
  display: flex;
15
22
  align-items: center;
16
23
  gap: 12px;
17
- padding: 14px 16px;
24
+ padding: 12px 16px;
25
+ }
26
+
27
+ /* The card's whole header is the disclosure control; the state pill beside it
28
+ is not part of the hit area. */
29
+ .toggle {
30
+ display: flex;
31
+ flex: 1;
32
+ min-width: 0;
33
+ align-items: center;
34
+ gap: 8px;
35
+ border: 0;
36
+ padding: 0;
37
+ background: transparent;
38
+ color: inherit;
39
+ font: inherit;
40
+ text-align: left;
41
+ cursor: pointer;
42
+ }
43
+
44
+ .toggle:focus-visible {
45
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
46
+ outline-offset: 2px;
47
+ }
48
+
49
+ .toggle > .chevron {
50
+ transform: rotate(-90deg);
51
+ }
52
+
53
+ .toggle[aria-expanded='true'] > .chevron {
54
+ transform: none;
18
55
  }
19
56
 
57
+ .chevron {
58
+ flex: none;
59
+ color: var(--dsw-alias-label-tertiary);
60
+ }
61
+
62
+ /* The head beside the page's own title, matching the component list's heading
63
+ below it. */
64
+ .sectionName {
65
+ color: var(--dsw-alias-label-primary);
66
+ font-size: 14px;
67
+ font-weight: 500;
68
+ line-height: 20px;
69
+ }
70
+
71
+ /* On the Settings fallback tab the card is the plugin's whole page, so it
72
+ carries the plugin's own name and one-liner. */
20
73
  .headText {
21
74
  display: flex;
22
75
  flex: 1;
@@ -27,9 +80,9 @@
27
80
 
28
81
  .name {
29
82
  color: var(--dsw-alias-label-primary);
30
- font-size: 15px;
31
- font-weight: 600;
32
- line-height: 1.4;
83
+ font-size: 14px;
84
+ font-weight: 500;
85
+ line-height: 20px;
33
86
  }
34
87
 
35
88
  .description {
@@ -38,12 +91,12 @@
38
91
  line-height: 1.5;
39
92
  }
40
93
 
41
- .pending {
94
+ .pending,
95
+ .failedPill {
42
96
  flex: none;
43
97
  border-radius: 999px;
44
98
  corner-shape: round;
45
99
  background: var(--dsw-alias-bg-module-platform);
46
- color: var(--dsw-alias-label-secondary);
47
100
  font-size: 11px;
48
101
  font-weight: 500;
49
102
  line-height: 17px;
@@ -51,24 +104,36 @@
51
104
  white-space: nowrap;
52
105
  }
53
106
 
107
+ .pending {
108
+ color: var(--dsw-alias-label-secondary);
109
+ }
110
+
111
+ /* Shown in the collapsed header so a failed save is not hidden by the fold. */
112
+ .failedPill {
113
+ color: var(--dsw-alias-state-error-primary);
114
+ }
115
+
54
116
  .body {
55
117
  margin: 0 16px;
56
118
  border-top: 0.5px solid var(--dsw-alias-border-l2);
57
119
  padding-bottom: 8px;
58
120
  }
59
121
 
122
+ /* The form stays mounted while collapsed (a staged edit survives the fold), so
123
+ the fold is a visibility change rather than an unmount. */
124
+ .body[hidden] {
125
+ display: none;
126
+ }
127
+
60
128
  .status,
61
- .readOnly,
62
129
  .hint,
63
- .advancedHint,
64
- .error {
130
+ .advancedHint {
65
131
  margin: 0;
66
132
  font-size: 12px;
67
133
  line-height: 1.5;
68
134
  }
69
135
 
70
136
  .status,
71
- .readOnly,
72
137
  .hint,
73
138
  .advancedHint {
74
139
  color: var(--dsw-alias-label-tertiary);
@@ -78,18 +143,18 @@
78
143
  padding: 12px 16px;
79
144
  }
80
145
 
81
- .readOnly {
82
- padding-top: 12px;
83
- }
84
-
85
146
  .field {
86
147
  display: grid;
87
148
  gap: 6px;
88
149
  padding: 12px 0;
89
150
  }
90
151
 
91
- .body > .field + .group,
92
- .body > .group + .field {
152
+ /* The card draws its own separators between the blocks it stacks, the way the
153
+ shared field group draws them between its own children (every adjacent pair,
154
+ not only the ones around the group). */
155
+ .field + .field,
156
+ .field + .group,
157
+ .group + .field {
93
158
  border-top: 0.5px solid var(--dsw-alias-border-l2);
94
159
  }
95
160
 
@@ -119,11 +184,6 @@
119
184
  margin-top: 4px;
120
185
  }
121
186
 
122
- .group > .field:first-of-type {
123
- padding-top: 12px;
124
- }
125
-
126
- .group > .field + .field,
127
187
  .pairedFields {
128
188
  border-top: 0.5px solid var(--dsw-alias-border-l2);
129
189
  }
@@ -175,7 +235,7 @@
175
235
  min-width: 0;
176
236
  height: 32px;
177
237
  border: 0.5px solid var(--dsw-alias-border-l3);
178
- border-radius: 8px;
238
+ border-radius: var(--dsw-radius-sm);
179
239
  background: transparent;
180
240
  color: var(--dsw-alias-label-primary);
181
241
  font: inherit;
@@ -188,13 +248,13 @@
188
248
  }
189
249
 
190
250
  .select:focus-visible {
191
- outline: 2px solid var(--dsw-alias-brand-primary);
192
- outline-offset: 2px;
251
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
252
+ outline-offset: 1px;
193
253
  }
194
254
 
195
255
  .warning {
196
256
  margin: 0;
197
- color: var(--dsw-alias-label-error);
257
+ color: var(--dsw-alias-state-error-primary);
198
258
  font-size: 12px;
199
259
  line-height: 1.5;
200
260
  }
@@ -211,46 +271,6 @@
211
271
  min-width: 0;
212
272
  }
213
273
 
214
- .switch {
215
- box-sizing: border-box;
216
- position: relative;
217
- width: 36px;
218
- height: 20px;
219
- border: 0;
220
- border-radius: 10px;
221
- background: var(--dsw-alias-border-l3);
222
- cursor: pointer;
223
- padding: 2px;
224
- }
225
-
226
- .switchOn {
227
- background: var(--dsw-alias-brand-primary);
228
- }
229
-
230
- .switch:disabled {
231
- cursor: default;
232
- opacity: 0.5;
233
- }
234
-
235
- .switch:focus-visible {
236
- outline: 2px solid var(--dsw-alias-brand-primary);
237
- outline-offset: 2px;
238
- }
239
-
240
- .switchThumb {
241
- display: block;
242
- width: 16px;
243
- height: 16px;
244
- border-radius: 50%;
245
- corner-shape: round;
246
- background: var(--dsw-alias-label-primary-foreground);
247
- transition: transform 120ms ease;
248
- }
249
-
250
- .switchOn .switchThumb {
251
- transform: translateX(16px);
252
- }
253
-
254
274
  .modelSelection {
255
275
  display: grid;
256
276
  gap: 10px;
@@ -269,7 +289,7 @@
269
289
  align-items: center;
270
290
  justify-content: space-between;
271
291
  gap: 12px;
272
- color: var(--dsw-alias-label-error);
292
+ color: var(--dsw-alias-state-error-primary);
273
293
  font-size: 12px;
274
294
  line-height: 1.5;
275
295
  }
@@ -283,6 +303,12 @@
283
303
  padding: 0;
284
304
  }
285
305
 
306
+ .catalogError button:focus-visible,
307
+ .reset:focus-visible {
308
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
309
+ outline-offset: 1px;
310
+ }
311
+
286
312
  .models {
287
313
  display: grid;
288
314
  min-width: 0;
@@ -292,7 +318,7 @@
292
318
  padding: 10px;
293
319
  overflow: auto;
294
320
  border: 0.5px solid var(--dsw-alias-border-l4);
295
- border-radius: 8px;
321
+ border-radius: var(--dsw-radius-sm);
296
322
  }
297
323
 
298
324
  .models legend {
@@ -325,7 +351,7 @@
325
351
  align-items: center;
326
352
  gap: 8px;
327
353
  min-width: 0;
328
- border-radius: 6px;
354
+ border-radius: var(--dsw-radius-xs);
329
355
  cursor: pointer;
330
356
  padding: 6px;
331
357
  }
@@ -341,7 +367,7 @@
341
367
  align-items: center;
342
368
  gap: 8px;
343
369
  min-width: 0;
344
- border-radius: 6px;
370
+ border-radius: var(--dsw-radius-xs);
345
371
  padding: 6px;
346
372
  }
347
373
 
@@ -383,8 +409,8 @@
383
409
  }
384
410
 
385
411
  .effort:focus-visible {
386
- border-color: var(--dsw-alias-brand-primary);
387
- outline: none;
412
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
413
+ outline-offset: 1px;
388
414
  }
389
415
 
390
416
  .rowActions {
@@ -417,6 +443,11 @@
417
443
  opacity: 0.4;
418
444
  }
419
445
 
446
+ .move:focus-visible {
447
+ outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
448
+ outline-offset: 1px;
449
+ }
450
+
420
451
  .modelName,
421
452
  .route {
422
453
  display: block;
@@ -441,24 +472,11 @@
441
472
  font-size: 11px;
442
473
  }
443
474
 
444
- .error {
445
- color: var(--dsw-alias-label-error);
446
- }
447
-
448
475
  .advancedHint {
449
476
  border-top: 0.5px solid var(--dsw-alias-border-l2);
450
477
  padding-top: 12px;
451
478
  }
452
479
 
453
- .footer {
454
- display: flex;
455
- align-items: center;
456
- justify-content: flex-end;
457
- gap: 8px;
458
- border-top: 0.5px solid var(--dsw-alias-border-l2);
459
- padding: 12px 0 4px;
460
- }
461
-
462
480
  @media (max-width: 480px) {
463
481
  .pairedFields {
464
482
  grid-template-columns: minmax(0, 1fr);