@shendeguize/dsh-agent-sidecar 0.1.1 → 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 (53) hide show
  1. package/README.md +78 -11
  2. package/lib/client.js +8659 -7589
  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 +115 -61
  8. package/src/client/board/board.module.css +72 -151
  9. package/src/client/board/project-view-logic.ts +21 -34
  10. package/src/client/board/project-view.module.css +41 -96
  11. package/src/client/board/project-view.tsx +29 -13
  12. package/src/client/board/strings.ts +68 -107
  13. package/src/client/commands.ts +30 -15
  14. package/src/client/detail/SessionDetail.tsx +92 -58
  15. package/src/client/detail/detail.module.css +62 -218
  16. package/src/client/detail/strings.ts +64 -88
  17. package/src/client/detail-view.module.css +30 -55
  18. package/src/client/detail-view.tsx +80 -108
  19. package/src/client/dsh-tools/LineageTree.tsx +22 -13
  20. package/src/client/dsh-tools/SearchPanel.tsx +18 -11
  21. package/src/client/dsh-tools/dsh-tools.module.css +50 -139
  22. package/src/client/dsh-tools/strings.ts +42 -77
  23. package/src/client/index.ts +285 -124
  24. package/src/client/inject/InjectPanel.tsx +31 -64
  25. package/src/client/inject/inject.module.css +97 -198
  26. package/src/client/lifecycle/handoff.ts +83 -0
  27. package/src/client/locales/en.ts +74 -2
  28. package/src/client/locales/host.ts +131 -0
  29. package/src/client/locales/index.ts +196 -8
  30. package/src/client/locales/react.ts +10 -0
  31. package/src/client/locales/view.ts +38 -0
  32. package/src/client/locales/zh.ts +194 -134
  33. package/src/client/mount.tsx +72 -38
  34. package/src/client/navigation/CenterOverlay.tsx +40 -0
  35. package/src/client/navigation/center-overlay.module.css +51 -0
  36. package/src/client/navigation/center.ts +45 -0
  37. package/src/client/navigation/modal-isolation.ts +152 -0
  38. package/src/client/navigation/modal-surface-anchor.ts +72 -0
  39. package/src/client/navigation/sidebar-entry.module.css +73 -0
  40. package/src/client/navigation/sidebar-entry.ts +309 -0
  41. package/src/client/primitives/StaticPill.tsx +21 -0
  42. package/src/client/settings-card.module.css +35 -119
  43. package/src/client/settings-card.tsx +31 -153
  44. package/src/client/settings-fields.tsx +131 -0
  45. package/src/client/sidebar/SidebarTab.tsx +156 -0
  46. package/src/client/sidebar/model.ts +65 -0
  47. package/src/client/sidebar/sidebar-tab.module.css +118 -0
  48. package/src/client/sidebar-tab.tsx +46 -320
  49. package/src/client/theme/agsc.module.css +31 -0
  50. package/src/client/theme/parts.ts +56 -0
  51. package/src/client/ui-integration.ts +86 -0
  52. package/src/client/widget.tsx +9 -8
  53. 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,42 +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
- }
161
-
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
132
  }
171
133
 
172
134
  /* Current-session highlight (the row the user is inspecting). Brand tint
173
135
  * rides the real brand-primary token — brand-secondary/tertiary do not
174
136
  * exist in the dsh token table (UX-15). */
175
137
  .node[data-current='true'] {
176
- border-color: var(--dsw-alias-brand-primary, #4d6bfe);
177
- background: color-mix(in srgb, var(--dsw-alias-brand-primary, #4d6bfe) 8%, transparent);
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);
178
141
  cursor: default;
179
142
  }
180
143
 
181
144
  .nodeId {
182
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
145
+ font-family: var(--ds-font-family-code);
183
146
  overflow: hidden;
184
147
  text-overflow: ellipsis;
185
148
  white-space: nowrap;
@@ -188,30 +151,24 @@
188
151
  .nodeRole {
189
152
  flex: none;
190
153
  font-size: 11px;
191
- color: var(--dsw-alias-label-tertiary, #6e7781);
154
+ color: var(--dsw-alias-label-tertiary);
192
155
  }
193
156
 
194
157
  .nodeBadge {
195
158
  flex: none;
196
- font-size: 11px;
197
- line-height: 16px;
198
- padding: 0 6px;
199
- border-radius: 999px;
200
- color: var(--dsw-alias-label-secondary, #57606a);
201
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
202
- 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;
203
164
  }
204
165
 
205
166
  .nodeBadge[data-kind='current'] {
206
- color: var(--dsw-alias-brand-primary, #4d6bfe);
207
- border-color: var(--dsw-alias-brand-primary, #4d6bfe);
208
- background: transparent;
167
+ color: var(--agsc-accent);
209
168
  }
210
169
 
211
170
  .nodeBadge[data-kind='live'] {
212
- color: var(--dsw-alias-state-success-primary, #1a7f37);
213
- border-color: var(--dsw-alias-state-success-secondary, rgba(26, 127, 55, 0.32));
214
- background: transparent;
171
+ color: var(--agsc-ok);
215
172
  }
216
173
 
217
174
  /* --------------------------------------------------------- search panel */
@@ -225,47 +182,10 @@
225
182
  .searchInput {
226
183
  flex: 1;
227
184
  min-width: 0;
228
- font-size: 12px;
229
- font-family: inherit;
230
- color: var(--dsw-alias-label-primary, #1f2328);
231
- background: var(--dsw-alias-bg-layer-1, transparent);
232
- border: 1px solid var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
233
- border-radius: 6px;
234
- padding: 4px 8px;
235
- }
236
-
237
- .searchInput:focus-visible {
238
- outline: 2px solid var(--dsw-alias-brand-primary, #4d6bfe);
239
- outline-offset: 0;
240
- }
241
-
242
- .searchSubmit {
243
- flex: none;
244
- font-size: 12px;
245
- font-family: inherit;
246
- color: var(--dsw-alias-label-secondary, #57606a);
247
- background: transparent;
248
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
249
- border-radius: 6px;
250
- padding: 3px 10px;
251
- cursor: pointer;
252
- }
253
-
254
- .searchSubmit:hover {
255
- color: var(--dsw-alias-label-primary, #1f2328);
256
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
257
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
258
185
  }
259
186
 
260
187
  .projectChip {
261
188
  align-self: flex-start;
262
- font-size: 11px;
263
- line-height: 18px;
264
- padding: 0 8px;
265
- border-radius: 999px;
266
- color: var(--dsw-alias-label-secondary, #57606a);
267
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
268
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
269
189
  }
270
190
 
271
191
  .resultList {
@@ -278,24 +198,24 @@
278
198
  .resultItem {
279
199
  display: flex;
280
200
  flex-direction: column;
201
+ align-items: stretch;
202
+ justify-content: flex-start;
281
203
  gap: 3px;
204
+ height: auto;
282
205
  min-width: 0;
283
- font-family: inherit;
284
206
  text-align: left;
285
207
  padding: 6px 10px;
286
- border-radius: 8px;
287
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
288
- background: var(--dsw-alias-bg-layer-1, rgba(0, 0, 0, 0.02));
289
- cursor: pointer;
208
+ border-radius: var(--agsc-radius-control);
209
+ border: 1px solid var(--agsc-border);
210
+ background: var(--agsc-bg-raised);
290
211
  }
291
212
 
292
213
  .resultItem:hover {
293
- border-color: var(--dsw-alias-border-l2, rgba(0, 0, 0, 0.12));
294
- background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));
214
+ border-color: var(--agsc-border-strong);
295
215
  }
296
216
 
297
217
  .resultItem:focus-visible {
298
- outline: 2px solid var(--dsw-alias-brand-primary, #4d6bfe);
218
+ outline: 2px solid var(--agsc-accent);
299
219
  outline-offset: 1px;
300
220
  }
301
221
 
@@ -310,12 +230,12 @@
310
230
  flex: none;
311
231
  font-size: 11px;
312
232
  font-weight: 600;
313
- color: var(--dsw-alias-label-secondary, #57606a);
233
+ color: var(--dsw-alias-label-secondary);
314
234
  }
315
235
 
316
236
  .resultTitle {
317
237
  font-size: 12px;
318
- color: var(--dsw-alias-label-primary, #1f2328);
238
+ color: var(--dsw-alias-label-primary);
319
239
  overflow: hidden;
320
240
  text-overflow: ellipsis;
321
241
  white-space: nowrap;
@@ -324,19 +244,10 @@
324
244
  .matchTag {
325
245
  flex: none;
326
246
  margin-left: auto;
327
- font-size: 11px;
328
- line-height: 16px;
329
- padding: 0 6px;
330
- border-radius: 999px;
331
- color: var(--dsw-alias-label-secondary, #57606a);
332
- background: var(--dsw-alias-bg-layer-2, rgba(0, 0, 0, 0.04));
333
- border: 1px solid var(--dsw-alias-border-l1, rgba(0, 0, 0, 0.08));
334
247
  }
335
248
 
336
249
  .matchTag[data-kind='full-text'] {
337
- color: var(--dsw-alias-brand-primary, #4d6bfe);
338
- border-color: color-mix(in srgb, var(--dsw-alias-brand-primary, #4d6bfe) 32%, transparent);
339
- background: transparent;
250
+ color: var(--agsc-accent);
340
251
  }
341
252
 
342
253
  .resultMeta {
@@ -345,7 +256,7 @@
345
256
  gap: 8px;
346
257
  min-width: 0;
347
258
  font-size: 11px;
348
- color: var(--dsw-alias-label-tertiary, #6e7781);
259
+ color: var(--dsw-alias-label-tertiary);
349
260
  }
350
261
 
351
262
  .resultProject {
@@ -356,21 +267,21 @@
356
267
 
357
268
  .resultId {
358
269
  flex: none;
359
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
270
+ font-family: var(--ds-font-family-code);
360
271
  }
361
272
 
362
273
  .snippet {
363
274
  font-size: 12px;
364
275
  line-height: 18px;
365
- color: var(--dsw-alias-label-secondary, #57606a);
276
+ color: var(--dsw-alias-label-secondary);
366
277
  overflow: hidden;
367
278
  text-overflow: ellipsis;
368
279
  white-space: nowrap;
369
280
  }
370
281
 
371
282
  .snippetMark {
372
- color: var(--dsw-alias-brand-primary, #4d6bfe);
373
- background: color-mix(in srgb, var(--dsw-alias-brand-primary, #4d6bfe) 12%, transparent);
283
+ color: var(--agsc-accent);
284
+ background: color-mix(in srgb, var(--agsc-accent) 12%, transparent);
374
285
  border-radius: 2px;
375
286
  font-weight: 600;
376
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