@shendeguize/dsh-agent-sidecar 0.1.0 → 0.2.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.
Files changed (58) hide show
  1. package/README.md +78 -11
  2. package/lib/client.js +4708 -2932
  3. package/lib/client.js.map +1 -1
  4. package/package.json +3 -1
  5. package/src/client/analysis/AnalysisPanel.tsx +19 -27
  6. package/src/client/analysis/analysis.module.css +36 -97
  7. package/src/client/board/Board.tsx +255 -48
  8. package/src/client/board/board.module.css +113 -92
  9. package/src/client/board/logic.ts +99 -21
  10. package/src/client/board/project-view-logic.ts +27 -34
  11. package/src/client/board/project-view.module.css +46 -83
  12. package/src/client/board/project-view.tsx +50 -8
  13. package/src/client/board/strings.ts +70 -85
  14. package/src/client/commands.ts +30 -15
  15. package/src/client/controller.ts +27 -7
  16. package/src/client/detail/SessionDetail.tsx +234 -37
  17. package/src/client/detail/detail.module.css +100 -153
  18. package/src/client/detail/logic.ts +220 -29
  19. package/src/client/detail/strings.ts +66 -77
  20. package/src/client/detail-glue.ts +33 -0
  21. package/src/client/detail-view.module.css +43 -35
  22. package/src/client/detail-view.tsx +138 -118
  23. package/src/client/dsh-tools/LineageTree.tsx +22 -13
  24. package/src/client/dsh-tools/SearchPanel.tsx +18 -11
  25. package/src/client/dsh-tools/dsh-tools.module.css +53 -140
  26. package/src/client/dsh-tools/strings.ts +42 -77
  27. package/src/client/index.ts +285 -124
  28. package/src/client/inject/InjectPanel.tsx +81 -61
  29. package/src/client/inject/inject.module.css +97 -197
  30. package/src/client/inject/logic.ts +38 -0
  31. package/src/client/lifecycle/handoff.ts +83 -0
  32. package/src/client/locales/en.ts +91 -4
  33. package/src/client/locales/host.ts +131 -0
  34. package/src/client/locales/index.ts +196 -8
  35. package/src/client/locales/react.ts +10 -0
  36. package/src/client/locales/view.ts +38 -0
  37. package/src/client/locales/zh.ts +200 -125
  38. package/src/client/mount.tsx +75 -41
  39. package/src/client/navigation/CenterOverlay.tsx +40 -0
  40. package/src/client/navigation/center-overlay.module.css +51 -0
  41. package/src/client/navigation/center.ts +45 -0
  42. package/src/client/navigation/modal-isolation.ts +152 -0
  43. package/src/client/navigation/modal-surface-anchor.ts +72 -0
  44. package/src/client/navigation/sidebar-entry.module.css +73 -0
  45. package/src/client/navigation/sidebar-entry.ts +309 -0
  46. package/src/client/primitives/StaticPill.tsx +21 -0
  47. package/src/client/settings-card.module.css +35 -119
  48. package/src/client/settings-card.tsx +31 -153
  49. package/src/client/settings-fields.tsx +131 -0
  50. package/src/client/sidebar/SidebarTab.tsx +156 -0
  51. package/src/client/sidebar/model.ts +65 -0
  52. package/src/client/sidebar/sidebar-tab.module.css +118 -0
  53. package/src/client/sidebar-tab.tsx +46 -320
  54. package/src/client/theme/agsc.module.css +31 -0
  55. package/src/client/theme/parts.ts +56 -0
  56. package/src/client/ui-integration.ts +86 -0
  57. package/src/client/widget.tsx +42 -16
  58. package/src/client/inject/overlay.module.css +0 -22
@@ -1,16 +1,11 @@
1
- /*
2
- * dsh deep-query tools styles (lineage tree + search panel, design §5.1
3
- * view 2 / §5.4): every color rides a --dsw-alias-* design token with a
4
- * neutral fallback — no theme colors are hardcoded as the only value.
5
- * Same posture as board.module.css.
6
- */
1
+ /* dsh deep-query tools over the shared Agent Sidecar / DSH token contract. */
7
2
 
8
3
  .panel {
9
4
  display: flex;
10
5
  flex-direction: column;
11
6
  gap: 8px;
12
7
  min-width: 0;
13
- color: var(--dsw-alias-label-primary, #1f2328);
8
+ color: var(--agsc-fg);
14
9
  }
15
10
 
16
11
  .panelHead {
@@ -23,41 +18,35 @@
23
18
  .panelTitle {
24
19
  font-size: 13px;
25
20
  font-weight: 600;
26
- color: var(--dsw-alias-label-primary, #1f2328);
21
+ color: var(--dsw-alias-label-primary);
27
22
  }
28
23
 
29
24
  .panelCount {
30
- font-size: 11px;
31
25
  flex: none;
32
- color: var(--dsw-alias-label-secondary, #57606a);
33
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
34
- border-radius: 999px;
35
- padding: 0 8px;
36
- line-height: 18px;
37
26
  }
38
27
 
39
28
  /* ------------------------------------------------- shared status bodies */
40
29
 
41
30
  .mutedLine {
42
31
  font-size: 12px;
43
- color: var(--dsw-alias-label-secondary, #57606a);
32
+ color: var(--dsw-alias-label-secondary);
44
33
  }
45
34
 
46
35
  .errorCard {
47
36
  font-size: 12px;
48
37
  line-height: 18px;
49
38
  padding: 8px 10px;
50
- border-radius: 8px;
51
- color: var(--dsw-alias-state-error-primary, #cf222e);
52
- background: var(--dsw-alias-state-error-secondary, rgba(207, 34, 46, 0.08));
53
- border: 1px solid var(--dsw-alias-state-error-secondary, rgba(207, 34, 46, 0.24));
39
+ border-radius: var(--agsc-radius-control);
40
+ color: var(--agsc-err);
41
+ background: var(--dsw-alias-state-error-secondary);
42
+ border: 1px solid var(--dsw-alias-state-error-secondary);
54
43
  }
55
44
 
56
45
  .errorDetail {
57
46
  display: block;
58
47
  margin-top: 2px;
59
48
  font-size: 11px;
60
- color: var(--dsw-alias-label-secondary, #57606a);
49
+ color: var(--dsw-alias-label-secondary);
61
50
  word-break: break-all;
62
51
  }
63
52
 
@@ -67,27 +56,27 @@
67
56
  flex-direction: column;
68
57
  gap: 4px;
69
58
  padding: 10px 12px;
70
- border-radius: 8px;
71
- border: 1px dashed var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
72
- background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));
59
+ border-radius: var(--agsc-radius-control);
60
+ border: 1px dashed var(--agsc-border-strong);
61
+ background: var(--agsc-bg-raised);
73
62
  }
74
63
 
75
64
  .degradeTitle {
76
65
  font-size: 12px;
77
66
  font-weight: 600;
78
- color: var(--dsw-alias-label-primary, #1f2328);
67
+ color: var(--dsw-alias-label-primary);
79
68
  }
80
69
 
81
70
  .degradeBody {
82
71
  font-size: 12px;
83
72
  line-height: 18px;
84
- color: var(--dsw-alias-label-secondary, #57606a);
73
+ color: var(--dsw-alias-label-secondary);
85
74
  }
86
75
 
87
76
  .degradeDetail {
88
77
  font-size: 11px;
89
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
90
- color: var(--dsw-alias-label-tertiary, #6e7781);
78
+ font-family: var(--ds-font-family-code);
79
+ color: var(--dsw-alias-label-tertiary);
91
80
  word-break: break-all;
92
81
  }
93
82
 
@@ -96,10 +85,10 @@
96
85
  font-size: 12px;
97
86
  line-height: 18px;
98
87
  padding: 5px 10px;
99
- border-radius: 8px;
100
- color: var(--dsw-alias-state-warn-label, var(--dsw-alias-state-warn-primary, #9a6700));
101
- background: var(--dsw-alias-state-warn-tertiary, rgba(154, 103, 0, 0.08));
102
- border: 1px solid var(--dsw-alias-state-warn-secondary, rgba(154, 103, 0, 0.24));
88
+ border-radius: var(--agsc-radius-control);
89
+ color: var(--agsc-warn);
90
+ background: var(--dsw-alias-state-warn-tertiary);
91
+ border: 1px solid var(--dsw-alias-state-warn-secondary);
103
92
  }
104
93
 
105
94
  /* --------------------------------------------------------- lineage tree */
@@ -125,16 +114,6 @@
125
114
  padding: 0;
126
115
  font-size: 10px;
127
116
  line-height: 1;
128
- color: var(--dsw-alias-label-tertiary, #6e7781);
129
- background: transparent;
130
- border: none;
131
- border-radius: 4px;
132
- cursor: pointer;
133
- }
134
-
135
- .toggle:hover {
136
- color: var(--dsw-alias-label-primary, #1f2328);
137
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
138
117
  }
139
118
 
140
119
  /* Alignment spacer where a leaf row has no toggle. */
@@ -144,40 +123,26 @@
144
123
  }
145
124
 
146
125
  .node {
147
- display: inline-flex;
148
- align-items: center;
126
+ justify-content: flex-start;
149
127
  gap: 6px;
128
+ height: auto;
150
129
  min-width: 0;
151
- font-family: inherit;
152
- font-size: 12px;
153
130
  text-align: left;
154
131
  padding: 2px 8px;
155
- border-radius: 6px;
156
- border: 1px solid transparent;
157
- background: transparent;
158
- color: var(--dsw-alias-label-primary, #1f2328);
159
- cursor: pointer;
160
132
  }
161
133
 
162
- .node:hover {
163
- border-color: var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
164
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
165
- }
166
-
167
- .node:focus-visible {
168
- outline: 2px solid var(--dsw-alias-brand-primary, #4d6bfe);
169
- outline-offset: 1px;
170
- }
171
-
172
- /* Current-session highlight (the row the user is inspecting). */
134
+ /* Current-session highlight (the row the user is inspecting). Brand tint
135
+ * rides the real brand-primary token brand-secondary/tertiary do not
136
+ * exist in the dsh token table (UX-15). */
173
137
  .node[data-current='true'] {
174
- border-color: var(--dsw-alias-brand-primary, #4d6bfe);
175
- background: var(--dsw-alias-brand-tertiary, rgba(77, 107, 254, 0.08));
138
+ color: var(--agsc-accent);
139
+ background: color-mix(in srgb, var(--agsc-accent) 8%, transparent);
140
+ box-shadow: inset 0 0 0 1px var(--agsc-accent);
176
141
  cursor: default;
177
142
  }
178
143
 
179
144
  .nodeId {
180
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
145
+ font-family: var(--ds-font-family-code);
181
146
  overflow: hidden;
182
147
  text-overflow: ellipsis;
183
148
  white-space: nowrap;
@@ -186,30 +151,24 @@
186
151
  .nodeRole {
187
152
  flex: none;
188
153
  font-size: 11px;
189
- color: var(--dsw-alias-label-tertiary, #6e7781);
154
+ color: var(--dsw-alias-label-tertiary);
190
155
  }
191
156
 
192
157
  .nodeBadge {
193
158
  flex: none;
194
- font-size: 11px;
195
- line-height: 16px;
196
- padding: 0 6px;
197
- border-radius: 999px;
198
- color: var(--dsw-alias-label-secondary, #57606a);
199
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
200
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
159
+ }
160
+
161
+ .nodeBadge > span,
162
+ .matchTag > span {
163
+ color: inherit;
201
164
  }
202
165
 
203
166
  .nodeBadge[data-kind='current'] {
204
- color: var(--dsw-alias-brand-primary, #4d6bfe);
205
- border-color: var(--dsw-alias-brand-primary, #4d6bfe);
206
- background: transparent;
167
+ color: var(--agsc-accent);
207
168
  }
208
169
 
209
170
  .nodeBadge[data-kind='live'] {
210
- color: var(--dsw-alias-state-success-primary, #1a7f37);
211
- border-color: var(--dsw-alias-state-success-secondary, rgba(26, 127, 55, 0.32));
212
- background: transparent;
171
+ color: var(--agsc-ok);
213
172
  }
214
173
 
215
174
  /* --------------------------------------------------------- search panel */
@@ -223,47 +182,10 @@
223
182
  .searchInput {
224
183
  flex: 1;
225
184
  min-width: 0;
226
- font-size: 12px;
227
- font-family: inherit;
228
- color: var(--dsw-alias-label-primary, #1f2328);
229
- background: var(--dsw-alias-bg-layer-1, transparent);
230
- border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
231
- border-radius: 6px;
232
- padding: 4px 8px;
233
- }
234
-
235
- .searchInput:focus-visible {
236
- outline: 2px solid var(--dsw-alias-brand-primary, #4d6bfe);
237
- outline-offset: 0;
238
- }
239
-
240
- .searchSubmit {
241
- flex: none;
242
- font-size: 12px;
243
- font-family: inherit;
244
- color: var(--dsw-alias-label-secondary, #57606a);
245
- background: transparent;
246
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
247
- border-radius: 6px;
248
- padding: 3px 10px;
249
- cursor: pointer;
250
- }
251
-
252
- .searchSubmit:hover {
253
- color: var(--dsw-alias-label-primary, #1f2328);
254
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
255
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
256
185
  }
257
186
 
258
187
  .projectChip {
259
188
  align-self: flex-start;
260
- font-size: 11px;
261
- line-height: 18px;
262
- padding: 0 8px;
263
- border-radius: 999px;
264
- color: var(--dsw-alias-label-secondary, #57606a);
265
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
266
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
267
189
  }
268
190
 
269
191
  .resultList {
@@ -276,24 +198,24 @@
276
198
  .resultItem {
277
199
  display: flex;
278
200
  flex-direction: column;
201
+ align-items: stretch;
202
+ justify-content: flex-start;
279
203
  gap: 3px;
204
+ height: auto;
280
205
  min-width: 0;
281
- font-family: inherit;
282
206
  text-align: left;
283
207
  padding: 6px 10px;
284
- border-radius: 8px;
285
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
286
- background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));
287
- cursor: pointer;
208
+ border-radius: var(--agsc-radius-control);
209
+ border: 1px solid var(--agsc-border);
210
+ background: var(--agsc-bg-raised);
288
211
  }
289
212
 
290
213
  .resultItem:hover {
291
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
292
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
214
+ border-color: var(--agsc-border-strong);
293
215
  }
294
216
 
295
217
  .resultItem:focus-visible {
296
- outline: 2px solid var(--dsw-alias-brand-primary, #4d6bfe);
218
+ outline: 2px solid var(--agsc-accent);
297
219
  outline-offset: 1px;
298
220
  }
299
221
 
@@ -308,12 +230,12 @@
308
230
  flex: none;
309
231
  font-size: 11px;
310
232
  font-weight: 600;
311
- color: var(--dsw-alias-label-secondary, #57606a);
233
+ color: var(--dsw-alias-label-secondary);
312
234
  }
313
235
 
314
236
  .resultTitle {
315
237
  font-size: 12px;
316
- color: var(--dsw-alias-label-primary, #1f2328);
238
+ color: var(--dsw-alias-label-primary);
317
239
  overflow: hidden;
318
240
  text-overflow: ellipsis;
319
241
  white-space: nowrap;
@@ -322,19 +244,10 @@
322
244
  .matchTag {
323
245
  flex: none;
324
246
  margin-left: auto;
325
- font-size: 11px;
326
- line-height: 16px;
327
- padding: 0 6px;
328
- border-radius: 999px;
329
- color: var(--dsw-alias-label-secondary, #57606a);
330
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
331
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
332
247
  }
333
248
 
334
249
  .matchTag[data-kind='full-text'] {
335
- color: var(--dsw-alias-brand-primary, #4d6bfe);
336
- border-color: var(--dsw-alias-brand-secondary, rgba(77, 107, 254, 0.32));
337
- background: transparent;
250
+ color: var(--agsc-accent);
338
251
  }
339
252
 
340
253
  .resultMeta {
@@ -343,7 +256,7 @@
343
256
  gap: 8px;
344
257
  min-width: 0;
345
258
  font-size: 11px;
346
- color: var(--dsw-alias-label-tertiary, #6e7781);
259
+ color: var(--dsw-alias-label-tertiary);
347
260
  }
348
261
 
349
262
  .resultProject {
@@ -354,21 +267,21 @@
354
267
 
355
268
  .resultId {
356
269
  flex: none;
357
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
270
+ font-family: var(--ds-font-family-code);
358
271
  }
359
272
 
360
273
  .snippet {
361
274
  font-size: 12px;
362
275
  line-height: 18px;
363
- color: var(--dsw-alias-label-secondary, #57606a);
276
+ color: var(--dsw-alias-label-secondary);
364
277
  overflow: hidden;
365
278
  text-overflow: ellipsis;
366
279
  white-space: nowrap;
367
280
  }
368
281
 
369
282
  .snippetMark {
370
- color: var(--dsw-alias-brand-primary, #4d6bfe);
371
- background: var(--dsw-alias-brand-tertiary, rgba(77, 107, 254, 0.12));
283
+ color: var(--agsc-accent);
284
+ background: color-mix(in srgb, var(--agsc-accent) 12%, transparent);
372
285
  border-radius: 2px;
373
286
  font-weight: 600;
374
287
  }
@@ -1,90 +1,55 @@
1
- /**
2
- * Centralized user-facing strings for the dsh deep-query tools (design
3
- * §5.1 view 2 dsh 会话专属区: lineage tree / provenance jump / full-text
4
- * search; §5.3 honest degradation wording).
5
- *
6
- * Deliberately a MODULE-LOCAL table (task T5.4 constraint): the main
7
- * locale table (client/locales) and test/locales.test.ts are untouched —
8
- * S7 merges this table into the locale registry in one move. Chinese is
9
- * the primary UI language, same posture as board/strings.ts. Templates
10
- * use `{name}` placeholders resolved by `formatTemplate` in logic.ts.
11
- *
12
- * Pure data module: no imports, no logic.
13
- *
14
- * @module
15
- */
1
+ import { createLocaleView } from '../locales/view.ts'
16
2
 
17
- export const DSH_TOOLS_STRINGS = {
18
- /** Lineage tree panel (dsh 谱系/溯源). */
3
+ /** Dynamic dsh-tools vocabulary; templates are interpolated by `formatTemplate`. */
4
+ export const DSH_TOOLS_STRINGS = createLocaleView({
19
5
  lineage: {
20
- title: '会话谱系',
21
- loading: '谱系加载中…',
22
- /** Transport/HTTP failure headline (the detail carries the cause). */
23
- error: '谱系加载失败',
24
- /** available:true but the trace body is missing — honest empty state. */
25
- empty: '暂无谱系数据',
26
- /** Badge on the session the user is currently inspecting. */
27
- currentBadge: '当前会话',
28
- /** Badge on records live in this dsh process. */
29
- liveBadge: '运行中',
30
- /** Badge on records the trace knows but dsh has not persisted. */
31
- notPersistedBadge: '未持久化',
32
- /** Role labels for tree rows. */
6
+ title: 'dshtools.lineage.title',
7
+ loading: 'dshtools.lineage.loading',
8
+ error: 'dshtools.lineage.error',
9
+ empty: 'dshtools.lineage.empty',
10
+ currentBadge: 'dshtools.lineage.currentBadge',
11
+ liveBadge: 'dshtools.lineage.liveBadge',
12
+ notPersistedBadge: 'dshtools.lineage.notPersistedBadge',
33
13
  role: {
34
- ancestor: '祖先',
35
- target: '目标',
36
- descendant: '子会话',
14
+ ancestor: 'dshtools.lineage.role.ancestor',
15
+ target: 'dshtools.lineage.role.target',
16
+ descendant: 'dshtools.lineage.role.descendant',
37
17
  },
38
- /** Hover title for a clickable node (provenance jump). */
39
- jumpTitle: '跳转到该会话',
40
- /** Hover title for the highlighted current node (no jump). */
41
- currentTitle: '正在查看该会话',
42
- expand: '展开',
43
- collapse: '折叠',
44
- nodeCount: '{n} 个会话',
45
- /** trace.complete === false with a known unresolved parent id. */
46
- incompleteWithId: '谱系不完整:父会话 {id} 无法解析',
47
- /** trace.complete === false without an unresolved parent id. */
48
- incomplete: '谱系不完整:部分父链无法解析',
49
- /** Degradation cards — available:false is data, not an error (§4.e.4). */
18
+ jumpTitle: 'dshtools.lineage.jumpTitle',
19
+ currentTitle: 'dshtools.lineage.currentTitle',
20
+ expand: 'dshtools.lineage.expand',
21
+ collapse: 'dshtools.lineage.collapse',
22
+ nodeCount: 'dshtools.lineage.nodeCount',
23
+ incompleteWithId: 'dshtools.lineage.incompleteWithId',
24
+ incomplete: 'dshtools.lineage.incomplete',
50
25
  degrade: {
51
- /** Client-side reason for sessions of non-dsh agents (task spec copy). */
52
- notDshTitle: '谱系/溯源为 dsh 会话专属',
53
- notDshBody: '当前会话来自外部 agent,dsh 的谱系与溯源能力不适用。',
54
- /** Backend reason `session_query_unavailable`. */
55
- queryUnavailableTitle: 'dsh 谱系服务不可用',
56
- queryUnavailableBody:
57
- '当前 dsh 组合未挂载 sessionQuery,谱系与溯源暂不可用。',
58
- /** Backend reason `trace_failed`. */
59
- traceFailedTitle: '谱系追溯失败',
60
- traceFailedBody: 'dsh 无法解析该会话的谱系。',
61
- /** Any reason outside the known vocabulary (never invent a state). */
62
- unknownTitle: '谱系不可用',
63
- unknownBody: '后端报告谱系不可用(原因: {reason})。',
26
+ notDshTitle: 'dshtools.lineage.degrade.notDshTitle',
27
+ notDshBody: 'dshtools.lineage.degrade.notDshBody',
28
+ queryUnavailableTitle: 'dshtools.lineage.degrade.queryUnavailableTitle',
29
+ queryUnavailableBody: 'dshtools.lineage.degrade.queryUnavailableBody',
30
+ traceFailedTitle: 'dshtools.lineage.degrade.traceFailedTitle',
31
+ traceFailedBody: 'dshtools.lineage.degrade.traceFailedBody',
32
+ unknownTitle: 'dshtools.lineage.degrade.unknownTitle',
33
+ unknownBody: 'dshtools.lineage.degrade.unknownBody',
64
34
  },
65
35
  },
66
- /** Cross-agent search panel (dsh 全文检索 + 降级过滤). */
67
36
  search: {
68
- title: '会话检索',
69
- placeholder: '检索会话(标题 / 项目 / 全文)',
70
- submit: '检索',
71
- loading: '检索中…',
72
- error: '检索失败',
73
- /** Query submitted, zero hits. */
74
- empty: '没有匹配的会话',
75
- /** mode: 'filter-only' degradation bar (task spec copy, verbatim). */
76
- filterOnlyNotice: 'dsh 全文检索不可用,已降级为标题/项目过滤',
77
- /** Active project-filter chip. */
78
- projectFilter: '项目过滤: {project}',
79
- /** matchedBy tags on result rows. */
37
+ title: 'dshtools.search.title',
38
+ placeholder: 'dshtools.search.placeholder',
39
+ submit: 'dshtools.search.submit',
40
+ loading: 'dshtools.search.loading',
41
+ error: 'dshtools.search.error',
42
+ empty: 'dshtools.search.empty',
43
+ filterOnlyNotice: 'dshtools.search.filterOnlyNotice',
44
+ projectFilter: 'dshtools.search.projectFilter',
80
45
  matchedBy: {
81
- 'full-text': '全文',
82
- title: '标题',
83
- project: '项目',
84
- other: '其他',
46
+ 'full-text': 'dshtools.search.matchedBy.full-text',
47
+ title: 'dshtools.search.matchedBy.title',
48
+ project: 'dshtools.search.matchedBy.project',
49
+ other: 'dshtools.search.matchedBy.other',
85
50
  },
86
- untitled: '(无标题)',
51
+ untitled: 'dshtools.search.untitled',
87
52
  },
88
- } as const
53
+ } as const)
89
54
 
90
55
  export type DshToolsStrings = typeof DSH_TOOLS_STRINGS