dsh-manage-session 0.5.7 → 2.0.4

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 (67) hide show
  1. package/CHANGELOG.ja.md +33 -229
  2. package/CHANGELOG.ko.md +33 -229
  3. package/CHANGELOG.md +33 -363
  4. package/INSTALL.ja.md +164 -164
  5. package/INSTALL.ko.md +164 -164
  6. package/INSTALL.md +164 -164
  7. package/INSTALL.zh.md +164 -164
  8. package/LICENSE +21 -21
  9. package/README.en.md +41 -46
  10. package/README.ja.md +33 -57
  11. package/README.ko.md +32 -55
  12. package/README.md +64 -64
  13. package/cordis.patch.yml +19 -16
  14. package/dsh.plugin.json +4 -4
  15. package/lib/client.js +661 -3082
  16. package/lib/index.d.ts +79 -970
  17. package/lib/index.js +249 -2669
  18. package/locale/de.json +2 -2
  19. package/locale/en.json +2 -2
  20. package/locale/es.json +2 -2
  21. package/locale/fr.json +2 -2
  22. package/locale/it.json +2 -2
  23. package/locale/ja.json +2 -2
  24. package/locale/ko.json +2 -2
  25. package/locale/ru.json +2 -2
  26. package/locale/zh.json +2 -2
  27. package/package.json +15 -25
  28. package/screenshots.json +3 -3
  29. package/src/client/bridge-scope.ts +202 -213
  30. package/src/client/card.tsx +154 -154
  31. package/src/client/health-panel.tsx +49 -49
  32. package/src/client/host-api.ts +72 -6
  33. package/src/client/index.ts +594 -503
  34. package/src/client/locales.ts +893 -893
  35. package/src/client/manage-locales.ts +178 -0
  36. package/src/client/{search/manage.tsx → manage.tsx} +430 -404
  37. package/src/client/panel.tsx +131 -129
  38. package/src/client/session-menu-legacy.ts +2 -3
  39. package/src/client/session-menu.tsx +5 -5
  40. package/src/config.ts +43 -99
  41. package/src/host/health/attribution.ts +118 -118
  42. package/src/host/health/lossless.ts +128 -128
  43. package/src/host/health/repair.ts +2 -2
  44. package/src/host/health/source-kind.ts +350 -350
  45. package/src/host/history/archive-source.ts +250 -250
  46. package/src/host/history/archive.ts +249 -249
  47. package/src/host/history/favorites.ts +71 -71
  48. package/src/host/history/purge.ts +370 -370
  49. package/src/host/history/tombstones.ts +3 -3
  50. package/src/host/registry/archive-registry.ts +317 -317
  51. package/src/host/settings-bridge.ts +222 -264
  52. package/src/index.ts +66 -694
  53. package/src/client/search/card.tsx +0 -563
  54. package/src/client/search/host-api.ts +0 -213
  55. package/src/client/search/locales.ts +0 -861
  56. package/src/client/search/locate.ts +0 -330
  57. package/src/client/search/panel.tsx +0 -940
  58. package/src/client/search/platform.ts +0 -136
  59. package/src/host/index/archive-source.ts +0 -90
  60. package/src/host/index/drs-source.ts +0 -211
  61. package/src/host/index/engine.ts +0 -699
  62. package/src/host/index/extract.ts +0 -272
  63. package/src/host/index/peers.ts +0 -62
  64. package/src/host/index/rebuild.ts +0 -432
  65. package/src/host/index/schema.ts +0 -136
  66. package/src/host/index/snapshot.ts +0 -135
  67. package/src/host/index/sync.ts +0 -413
@@ -1,861 +0,0 @@
1
- /** `switch-search` client dictionaries (zh / en / ja / ko / fr / de / it / ru / es), thinking-levels pattern. */
2
-
3
- /** Dictionary namespace owned by this plugin (the host settings namespace). */
4
- export const NS = 'switch-search'
5
-
6
- /** Simplified Chinese dictionary (the key-set source of truth). */
7
- export const zh = {
8
- 'card.title': '搜索索引',
9
- 'card.description': '侧边栏会话搜索增强:标题搜索与内容搜索一键切换。内容搜索使用插件自建索引,不依赖 DSH 官方全文索引。',
10
- 'card.unavailable': '设置命名空间不可用:请确认插件已装配进 profile。',
11
- 'card.readonly': '只读',
12
- 'card.enabled': '启用会话搜索',
13
- 'card.enabled.desc': '在侧边栏底部显示"搜索"入口。',
14
- 'card.defaultMode': '默认搜索模式',
15
- 'card.defaultMode.desc': '面板打开时默认进入标题搜索还是内容搜索。',
16
- 'card.mode.title': '标题',
17
- 'card.mode.content': '内容',
18
- 'card.autoSync': '自动同步索引',
19
- 'card.autoSync.desc': '后台按水位增量同步会话日志到独立索引。',
20
- 'card.syncInterval': '同步间隔(秒)',
21
- 'card.syncInterval.desc': '两次增量同步之间的最小间隔。',
22
- 'card.archiveKeep': '归档保留份数',
23
- 'card.archiveKeep.desc': '每次整理索引后保留的历史索引文件数量。',
24
- 'card.index': '内容搜索索引',
25
- 'card.index.desc': '索引正常:已收录 {indexed} 个会话。',
26
- 'card.index.archives': ',归档 {archives} 份。',
27
- 'card.index.empty': '独立索引尚未建立。点击"整理索引"从会话日志全量建立。',
28
- 'card.index.reading': '正在读取索引状态…',
29
- 'card.index.rebuilding': '正在整理索引… {done}/{total}(整理期间旧索引仍可搜索)',
30
- 'card.index.syncing': '正在同步索引…',
31
- 'card.index.failures': '{count} 个会话同步失败(详见 Host 日志)。',
32
- 'card.index.rebuildError': '整理失败:{error}',
33
- 'card.index.rebuild': '整理索引',
34
- 'card.index.rebuilding.btn': '整理中…',
35
- 'card.index.rebuild.hint': '非破坏性:构建期间旧索引继续可搜索,完成后原子切换并归档旧索引。',
36
- // The archived count used to be a bare number under a card that cannot act on
37
- // it. Two wordings, because telling a user to install something they already
38
- // have is worse than saying nothing: `archivedMissing` renders only when the
39
- // host actually failed to resolve the peer package.
40
- 'card.index.archivedOwner': '归档会话的浏览与清理由「会话管家」(dsh-manage-session)负责。本插件只读归档集合,把已归档会话排除出索引。',
41
- 'card.index.archivedMissing': '归档会话的浏览与清理需要「会话管家」(dsh-manage-session),当前未安装。本插件只读归档集合,把已归档会话排除出索引。',
42
- 'card.index.export': '导出快照',
43
- 'card.index.import': '导入快照',
44
- 'card.index.exported': '快照已导出为下载文件。',
45
- 'card.index.import.started': '快照导入已开始:正在后台重建索引,完成后自动切换。',
46
- 'card.index.importParse': '快照解析失败或无有效会话。',
47
- 'card.action.failed': '操作失败:{error}',
48
- 'panel.titleSearch': '标题',
49
- 'panel.contentSearch': '内容',
50
- 'panel.searchTitle': '搜索会话标题…',
51
- 'panel.searchContent': '搜索会话内容…',
52
- 'panel.entry': '搜索',
53
- 'panel.buildIndex': '建立索引',
54
- 'panel.archived': '已排除 {count} 个已归档会话',
55
- 'panel.rebuilding': '正在整理索引… {done}/{total}(整理期间旧索引仍可搜索)',
56
- 'panel.unavailable': '独立索引服务不可用:Host 未完成初始化。',
57
- 'panel.notBuilt': '独立索引尚未建立:先建立索引即可启用内容搜索(不依赖 DSH 官方全文索引)。',
58
- 'panel.loadingSessions': '正在读取会话列表…',
59
- 'panel.sessionsError': '读取会话列表失败:{error}',
60
- 'panel.noSessions': '暂无会话',
61
- 'panel.noMatch': '没有匹配的会话。',
62
- 'panel.loadingContent': '正在搜索会话内容…',
63
- 'panel.contentError': '内容搜索失败:{error}',
64
- 'panel.noContent': '没有匹配的内容。',
65
- 'panel.contentHint': '输入内容关键词开始搜索。',
66
- 'panel.noText': '(无文本)',
67
- 'panel.delete': '删除',
68
- 'panel.delete.confirm': '确认删除',
69
- 'panel.delete.hint': '删除该会话(不可逆,与管理端同款链路)',
70
- 'panel.delete.done': '已删除会话 {n} 个',
71
- 'panel.delete.failed': '删除失败:{error}',
72
- 'panel.untitled': '(未命名)',
73
- 'panel.openSession': '打开会话',
74
- 'panel.footer.invoke': '唤出',
75
- 'panel.footer.close': '关闭',
76
- 'filter.all': '全部',
77
- 'filter.user': '用户',
78
- 'filter.reply': '回复',
79
- 'filter.tool': '工具',
80
- 'sort.label': '结果排序',
81
- 'sort.relevance': '相关度',
82
- 'sort.time': '时间',
83
- 'sort.relevance.hint': '按匹配强度排序(默认)。',
84
- 'sort.time.hint': '按会话最后活动时间倒序,更新的排前面;同一时间再按匹配强度。',
85
- 'group.merge': '合并',
86
- 'group.expand': '分开',
87
- 'group.merge.hint': '每个会话只显示最强的一条命中(默认)。',
88
- 'group.expand.hint': '同一会话的多条命中分行显示(每行仍是可跳转的独立命中)。',
89
- 'type.user/message': '用户',
90
- 'type.assistant/message': '回复',
91
- 'type.tool/call': '工具调用',
92
- 'type.tool/result': '工具结果',
93
- // ── R1/R2:检索域 chip 与批量管理台 ──
94
- 'panel.manage': '管理',
95
- 'domain.all': '全部',
96
- 'domain.active': '活跃',
97
- 'domain.archived': '归档',
98
- 'tag.archived': '归档',
99
- 'manage.hint': '按工作区分组,勾选后批量操作;删除不可撤销。',
100
- 'manage.restartHint': '优先走宿主内存 API 即时生效(0.1.7+ 归档/取消归档免重启);不可用时直写存储文件,重启后侧栏生效。',
101
- 'manage.done.restart': '需重启 DSH 后在侧栏完全生效。',
102
- 'manage.group.nocwd': '(未分组)',
103
- 'manage.selectGroup': '全选/取消本组',
104
- 'manage.selected': '已选 {n}',
105
- 'manage.batch.archive': '归档',
106
- 'manage.batch.unarchive': '取消归档',
107
- 'manage.batch.delete': '删除',
108
- 'manage.batch.confirm': '确认删除',
109
- 'manage.batch.working': '执行中…',
110
- 'manage.done.archive': '已归档 {n} 个会话。',
111
- 'manage.done.unarchive': '已取消归档 {n} 个会话。',
112
- 'manage.done.purge': '已清理 {n} 个会话。',
113
- 'manage.done.error': '操作失败:{error}',
114
- 'panel.index.none': '索引未建立',
115
- 'panel.index.count': '索引 {n}',
116
- 'panel.index.rebuilding': '整理中 {done}/{total}',
117
- 'panel.index.rebuild': '整理',
118
- 'filter.favorites': '收藏',
119
- 'date.from': '开始日期',
120
- 'date.to': '结束日期',
121
- 'star.on': '取消收藏',
122
- 'star.off': '收藏',
123
- 'workspace.label': '工作区',
124
- 'workspace.more': '还有 {n} 个',
125
- 'workspace.less': '收起',
126
- 'manage.search': '搜索会话…',
127
- 'group.collapse': '收拢/展开本组',
128
- 'group.expandAll': '全部展开',
129
- 'group.collapseAll': '全部收拢',
130
- } as const
131
-
132
- export type LocaleKey = keyof typeof zh
133
- export type Dict = Record<LocaleKey, string>
134
-
135
- /** English dictionary. */
136
- export const en: Dict = {
137
- 'card.title': 'Search Index',
138
- 'card.description': 'Sidebar session search with title/content mode switching. Content search uses the plugin-owned index and never depends on the official DSH full-text index.',
139
- 'card.unavailable': 'Settings namespace unavailable: make sure the plugin is assembled into the profile.',
140
- 'card.readonly': 'Read-only',
141
- 'card.enabled': 'Enable session search',
142
- 'card.enabled.desc': 'Show the "Search" entry at the bottom of the sidebar.',
143
- 'card.defaultMode': 'Default search mode',
144
- 'card.defaultMode.desc': 'Which mode the panel opens in.',
145
- 'card.mode.title': 'Title',
146
- 'card.mode.content': 'Content',
147
- 'card.autoSync': 'Auto sync index',
148
- 'card.autoSync.desc': 'Incrementally sync session logs into the independent index in the background.',
149
- 'card.syncInterval': 'Sync interval (seconds)',
150
- 'card.syncInterval.desc': 'Minimum interval between two incremental syncs.',
151
- 'card.archiveKeep': 'Archives to keep',
152
- 'card.archiveKeep.desc': 'How many archived index files each rebuild retains.',
153
- 'card.index': 'Content search index',
154
- 'card.index.desc': 'Index ready: {indexed} sessions collected.',
155
- 'card.index.archives': ', {archives} archive(s).',
156
- 'card.index.empty': 'Independent index not built yet. Click "Rebuild index" to build it from session logs.',
157
- 'card.index.reading': 'Reading index status…',
158
- 'card.index.rebuilding': 'Rebuilding index… {done}/{total} (the old index keeps serving during the rebuild)',
159
- 'card.index.syncing': 'Syncing index…',
160
- 'card.index.failures': '{count} session(s) failed to sync (see Host logs).',
161
- 'card.index.rebuildError': 'Rebuild failed: {error}',
162
- 'card.index.rebuild': 'Rebuild index',
163
- 'card.index.rebuilding.btn': 'Rebuilding…',
164
- 'card.index.rebuild.hint': 'Non-destructive: the old index keeps serving while the shadow builds; the swap is atomic and the old index is archived.',
165
- 'card.index.archivedOwner': 'Browsing and disposing of archived sessions belongs to dsh-manage-session. This plugin only reads the archive set and excludes those sessions from the index.',
166
- 'card.index.archivedMissing': 'Browsing and disposing of archived sessions needs dsh-manage-session, which is not installed. This plugin only reads the archive set and excludes those sessions from the index.',
167
- 'card.index.export': 'Export snapshot',
168
- 'card.index.import': 'Import snapshot',
169
- 'card.index.exported': 'Snapshot downloaded.',
170
- 'card.index.import.started': 'Import started: the index rebuilds in the background and swaps in when done.',
171
- 'card.index.importParse': 'Snapshot parse failed or contains no valid session.',
172
- 'card.action.failed': 'Action failed: {error}',
173
- 'panel.titleSearch': 'Title',
174
- 'panel.contentSearch': 'Content',
175
- 'panel.searchTitle': 'Search session titles…',
176
- 'panel.searchContent': 'Search session content…',
177
- 'panel.entry': 'Search',
178
- 'panel.buildIndex': 'Build index',
179
- 'panel.archived': '{count} archived session(s) excluded',
180
- 'panel.rebuilding': 'Rebuilding index… {done}/{total} (the old index keeps serving)',
181
- 'panel.unavailable': 'Independent index service unavailable: Host not initialized.',
182
- 'panel.notBuilt': 'Independent index not built yet: build it once to enable content search (no official FTS index needed).',
183
- 'panel.loadingSessions': 'Loading sessions…',
184
- 'panel.sessionsError': 'Failed to load sessions: {error}',
185
- 'panel.noSessions': 'No sessions',
186
- 'panel.noMatch': 'No matching sessions.',
187
- 'panel.loadingContent': 'Searching content…',
188
- 'panel.contentError': 'Content search failed: {error}',
189
- 'panel.noContent': 'No matching content.',
190
- 'panel.contentHint': 'Type keywords to search content.',
191
- 'panel.noText': '(no text)',
192
- 'panel.delete': 'Delete',
193
- 'panel.delete.confirm': 'Confirm delete',
194
- 'panel.delete.hint': 'Delete this session (irreversible, same pipeline as the manage view)',
195
- 'panel.delete.done': 'Deleted {n} session(s)',
196
- 'panel.delete.failed': 'Delete failed: {error}',
197
- 'panel.untitled': '(untitled)',
198
- 'panel.openSession': 'Open session',
199
- 'panel.footer.invoke': 'Open',
200
- 'panel.footer.close': 'Close',
201
- 'filter.all': 'All',
202
- 'filter.user': 'User',
203
- 'filter.reply': 'Reply',
204
- 'filter.tool': 'Tool',
205
- 'sort.label': 'Result ordering',
206
- 'sort.relevance': 'Relevance',
207
- 'sort.time': 'Time',
208
- 'sort.relevance.hint': 'Order by match strength (default).',
209
- 'sort.time.hint': 'Order by session last-activity, newest first; ties break on match strength.',
210
- 'group.merge': 'Merge',
211
- 'group.expand': 'Expand',
212
- 'group.merge.hint': 'Show only the strongest hit per session (default).',
213
- 'group.expand.hint': 'List every hit of a session as its own row (each row is a jump target).',
214
- 'type.user/message': 'User',
215
- 'type.assistant/message': 'Reply',
216
- 'type.tool/call': 'Tool call',
217
- 'type.tool/result': 'Tool result',
218
- 'panel.manage': 'Manage',
219
- 'domain.all': 'All',
220
- 'domain.active': 'Active',
221
- 'domain.archived': 'Archived',
222
- 'tag.archived': 'Archived',
223
- 'manage.hint': 'Grouped by workspace; tick rows then batch-operate. Deletion is irreversible.',
224
- 'manage.restartHint': 'Prefers host in-memory APIs (0.1.7+ archive/unarchive apply instantly); falls back to direct storage-file edits, which need a restart.',
225
- 'manage.done.restart': 'Restart DSH for the sidebar to fully reflect this.',
226
- 'manage.group.nocwd': '(no workspace)',
227
- 'manage.selectGroup': 'Toggle the whole group',
228
- 'manage.selected': '{n} selected',
229
- 'manage.batch.archive': 'Archive',
230
- 'manage.batch.unarchive': 'Unarchive',
231
- 'manage.batch.delete': 'Delete',
232
- 'manage.batch.confirm': 'Confirm delete',
233
- 'manage.batch.working': 'Working…',
234
- 'manage.done.archive': 'Archived {n} sessions.',
235
- 'manage.done.unarchive': 'Unarchived {n} sessions.',
236
- 'manage.done.purge': 'Purged {n} sessions.',
237
- 'manage.done.error': 'Operation failed: {error}',
238
- 'panel.index.none': 'Index not built',
239
- 'panel.index.count': 'Index {n}',
240
- 'panel.index.rebuilding': 'Rebuilding {done}/{total}',
241
- 'panel.index.rebuild': 'Rebuild',
242
- 'filter.favorites': 'Favorites',
243
- 'date.from': 'From date',
244
- 'date.to': 'To date',
245
- 'star.on': 'Unfavorite',
246
- 'star.off': 'Favorite',
247
- 'workspace.label': 'Workspace',
248
- 'workspace.more': '{n} more',
249
- 'workspace.less': 'Collapse',
250
- 'manage.search': 'Search sessions…',
251
- 'group.collapse': 'Collapse/expand group',
252
- 'group.expandAll': 'Expand all',
253
- 'group.collapseAll': 'Collapse all',
254
- }
255
-
256
- /** Japanese dictionary. */
257
- export const ja: Partial<Dict> = {
258
- 'card.title': '検索インデックス',
259
- 'card.description': 'サイドバーセッション検索の強化:タイトル検索とコンテンツ検索のワンクリック切り替え。コンテンツ検索はプラグイン独自のインデックスを使用し、DSH公式全文インデックスに依存しません。',
260
- 'card.unavailable': '設定名前空間が利用できません:プラグインがプロファイルに組み込まれていることを確認してください。',
261
- 'card.readonly': '読み取り専用',
262
- 'card.enabled': 'セッション検索を有効化',
263
- 'card.enabled.desc': 'サイドバー下部に「検索」エントリを表示します。',
264
- 'card.defaultMode': 'デフォルト検索モード',
265
- 'card.defaultMode.desc': 'パネルを開いたときの初期モード。',
266
- 'card.mode.title': 'タイトル',
267
- 'card.mode.content': 'コンテンツ',
268
- 'card.autoSync': 'インデックス自動同期',
269
- 'card.autoSync.desc': 'バックグラウンドでセッションログを独立インデックスに増分同期します。',
270
- 'card.syncInterval': '同期間隔(秒)',
271
- 'card.syncInterval.desc': '2回の増分同期間の最小間隔。',
272
- 'card.archiveKeep': 'アーカイブ保持数',
273
- 'card.archiveKeep.desc': 'インデックス再構築ごとに保持するアーカイブファイル数。',
274
- 'card.index': 'コンテンツ検索インデックス',
275
- 'card.index.desc': 'インデックス正常:{indexed} セッションを収容済み。',
276
- 'card.index.archives': '、アーカイブ {archives} 件。',
277
- 'card.index.empty': '独立インデックスが未構築です。「インデックス再構築」をクリックしてセッションログから構築してください。',
278
- 'card.index.reading': 'インデックス状態を読み取り中…',
279
- 'card.index.rebuilding': 'インデックス再構築中… {done}/{total}(再構築中も旧インデックスで検索可能)',
280
- 'card.index.syncing': 'インデックス同期中…',
281
- 'card.index.failures': '{count} 件のセッション同期に失敗(Hostログ参照)。',
282
- 'card.index.rebuildError': '再構築失敗:{error}',
283
- 'card.index.rebuild': 'インデックス再構築',
284
- 'card.index.rebuilding.btn': '再構築中…',
285
- 'card.index.rebuild.hint': '非破壊的:構築中も旧インデックスで検索可能、完了後にアトミック切替し旧インデックスをアーカイブ。',
286
- 'card.index.archivedOwner': 'アーカイブ済みセッションの閲覧と清理は「セッション管理者」(dsh-manage-session)が担当。本プラグインはアーカイブ集合を読み取り専用で参照し、アーカイブ済みセッションをインデックスから除外します。',
287
- 'card.index.archivedMissing': 'アーカイブ済みセッションの閲覧と清理には「セッション管理者」(dsh-manage-session)が必要ですが、現在未インストールです。本プラグインはアーカイブ集合を読み取り専用で参照し、アーカイブ済みセッションをインデックスから除外します。',
288
- 'card.index.export': 'スナップショット書出',
289
- 'card.index.import': 'スナップショット読込',
290
- 'card.index.exported': 'スナップショットをダウンロードしました。',
291
- 'card.index.import.started': 'スナップショットのインポートを開始:バックグラウンドでインデックスを再構築し、完了後に自動切替。',
292
- 'card.index.importParse': 'スナップショットの解析に失敗、または有効なセッションがありません。',
293
- 'card.action.failed': '操作失敗:{error}',
294
- 'panel.titleSearch': 'タイトル',
295
- 'panel.contentSearch': 'コンテンツ',
296
- 'panel.searchTitle': 'セッションタイトルを検索…',
297
- 'panel.searchContent': 'セッション内容を検索…',
298
- 'panel.entry': '検索',
299
- 'panel.buildIndex': 'インデックス構築',
300
- 'panel.archived': 'アーカイブ済み {count} 件を除外',
301
- 'panel.rebuilding': 'インデックス再構築中… {done}/{total}(再構築中も旧インデックスで検索可能)',
302
- 'panel.unavailable': '独立インデックスサービス利用不可:Host初期化未完了。',
303
- 'panel.notBuilt': '独立インデックス未構築:構築すればコンテンツ検索が有効になります(DSH公式全文インデックス不要)。',
304
- 'panel.loadingSessions': 'セッション一覧を読み込み中…',
305
- 'panel.sessionsError': 'セッション一覧の読み込み失敗:{error}',
306
- 'panel.noSessions': 'セッションなし',
307
- 'panel.noMatch': '一致するセッションがありません。',
308
- 'panel.loadingContent': 'セッション内容を検索中…',
309
- 'panel.contentError': 'コンテンツ検索失敗:{error}',
310
- 'panel.noContent': '一致するコンテンツがありません。',
311
- 'panel.contentHint': 'キーワードを入力してコンテンツを検索。',
312
- 'panel.noText': '(テキストなし)',
313
- 'panel.delete': '削除',
314
- 'panel.delete.confirm': '削除を確認',
315
- 'panel.delete.hint': 'このセッションを削除(不可逆、管理画面と同じ経路)',
316
- 'panel.delete.done': 'セッション {n} 件を削除しました',
317
- 'panel.delete.failed': '削除に失敗:{error}',
318
- 'panel.untitled': '(無題)',
319
- 'panel.openSession': 'セッションを開く',
320
- 'panel.footer.invoke': '開く',
321
- 'panel.footer.close': '閉じる',
322
- 'filter.all': 'すべて',
323
- 'filter.user': 'ユーザー',
324
- 'filter.reply': '返信',
325
- 'filter.tool': 'ツール',
326
- 'sort.label': '結果の並べ替え',
327
- 'sort.relevance': '関連度',
328
- 'sort.time': '時間',
329
- 'sort.relevance.hint': '一致強度順に並べ替え(デフォルト)。',
330
- 'sort.time.hint': 'セッション最終活動日時の降順、同着時は一致強度順。',
331
- 'group.merge': 'まとめる',
332
- 'group.expand': '展開',
333
- 'group.merge.hint': 'セッションごとに最強の一致1件のみ表示(デフォルト)。',
334
- 'group.expand.hint': '同一セッションの複数一致を行ごとに展開(各行が個別のジャンプ先)。',
335
- 'type.user/message': 'ユーザー',
336
- 'type.assistant/message': '返信',
337
- 'type.tool/call': 'ツール呼び出し',
338
- 'type.tool/result': 'ツール結果',
339
- }
340
-
341
- /** Korean dictionary. */
342
- export const ko: Partial<Dict> = {
343
- 'card.title': '검색 인덱스',
344
- 'card.description': '사이드바 세션 검색 강화: 제목 검색과 콘텐츠 검색 간 원클릭 전환. 콘텐츠 검색은 플러그인 자체 인덱스를 사용하며 DSH 공식 전문 인덱스에 의존하지 않습니다.',
345
- 'card.unavailable': '설정 네임스페이스를 사용할 수 없습니다: 플러그인이 프로파일에 조립되어 있는지 확인하세요.',
346
- 'card.readonly': '읽기 전용',
347
- 'card.enabled': '세션 검색 활성화',
348
- 'card.enabled.desc': '사이드바 하단에 "검색" 항목을 표시합니다.',
349
- 'card.defaultMode': '기본 검색 모드',
350
- 'card.defaultMode.desc': '패널을 열 때 기본 모드.',
351
- 'card.mode.title': '제목',
352
- 'card.mode.content': '콘텐츠',
353
- 'card.autoSync': '인덱스 자동 동기화',
354
- 'card.autoSync.desc': '백그라운드에서 세션 로그를 독립 인덱스에 증분 동기화합니다.',
355
- 'card.syncInterval': '동기화 간격(초)',
356
- 'card.syncInterval.desc': '두 증분 동기화 사이의 최소 간격.',
357
- 'card.archiveKeep': '아카이브 보존 수',
358
- 'card.archiveKeep.desc': '인덱스 재구축 시 보존할 아카이브 파일 수.',
359
- 'card.index': '콘텐츠 검색 인덱스',
360
- 'card.index.desc': '인덱스 정상: {indexed}개 세션 수집 완료.',
361
- 'card.index.archives': ', 아카이브 {archives}건.',
362
- 'card.index.empty': '독립 인덱스가 아직 구축되지 않았습니다. "인덱스 재구축"을 클릭하여 세션 로그에서 구축하세요.',
363
- 'card.index.reading': '인덱스 상태 읽는 중…',
364
- 'card.index.rebuilding': '인덱스 재구축 중… {done}/{total} (재구축 중에도 이전 인덱스로 검색 가능)',
365
- 'card.index.syncing': '인덱스 동기화 중…',
366
- 'card.index.failures': '{count}개 세션 동기화 실패 (Host 로그 참조).',
367
- 'card.index.rebuildError': '재구축 실패: {error}',
368
- 'card.index.rebuild': '인덱스 재구축',
369
- 'card.index.rebuilding.btn': '재구축 중…',
370
- 'card.index.rebuild.hint': '비파괴적: 구축 중에도 이전 인덱스로 검색 가능하며, 완료 후 원자적 전환하고 이전 인덱스를 아카이브합니다.',
371
- 'card.index.archivedOwner': '아카이브된 세션의 탐색 및 정리는 "세션 관리자"(dsh-manage-session)가 담당합니다. 본 플러그인은 아카이브 세트를 읽기 전용으로 참조하여 아카이브된 세션을 인덱스에서 제외합니다.',
372
- 'card.index.archivedMissing': '아카이브된 세션의 탐색 및 정리에는 "세션 관리자"(dsh-manage-session)가 필요하지만 현재 미설치 상태입니다. 본 플러그인은 아카이브 세트를 읽기 전용으로 참조하여 아카이브된 세션을 인덱스에서 제외합니다.',
373
- 'card.index.export': '스냅샷 내보내기',
374
- 'card.index.import': '스냅샷 가져오기',
375
- 'card.index.exported': '스냅샷이 다운로드되었습니다.',
376
- 'card.index.import.started': '스냅샷 가져오기 시작: 백그라운드에서 인덱스를 재구축하며 완료 후 자동 전환됩니다.',
377
- 'card.index.importParse': '스냅샷 파싱 실패 또는 유효한 세션 없음.',
378
- 'card.action.failed': '작업 실패: {error}',
379
- 'panel.titleSearch': '제목',
380
- 'panel.contentSearch': '콘텐츠',
381
- 'panel.searchTitle': '세션 제목 검색…',
382
- 'panel.searchContent': '세션 콘텐츠 검색…',
383
- 'panel.entry': '검색',
384
- 'panel.buildIndex': '인덱스 구축',
385
- 'panel.archived': '아카이브된 {count}개 세션 제외됨',
386
- 'panel.rebuilding': '인덱스 재구축 중… {done}/{total} (재구축 중에도 이전 인덱스로 검색 가능)',
387
- 'panel.unavailable': '독립 인덱스 서비스 사용 불가: Host 초기화 미완료.',
388
- 'panel.notBuilt': '독립 인덱스 미구축: 구축하면 콘텐츠 검색이 활성화됩니다 (DSH 공식 전문 인덱스 불필요).',
389
- 'panel.loadingSessions': '세션 목록 읽는 중…',
390
- 'panel.sessionsError': '세션 목록 읽기 실패: {error}',
391
- 'panel.noSessions': '세션 없음',
392
- 'panel.noMatch': '일치하는 세션이 없습니다.',
393
- 'panel.loadingContent': '세션 콘텐츠 검색 중…',
394
- 'panel.contentError': '콘텐츠 검색 실패: {error}',
395
- 'panel.noContent': '일치하는 콘텐츠가 없습니다.',
396
- 'panel.contentHint': '키워드를 입력하여 콘텐츠를 검색하세요.',
397
- 'panel.noText': '(텍스트 없음)',
398
- 'panel.delete': '삭제',
399
- 'panel.delete.confirm': '삭제 확인',
400
- 'panel.delete.hint': '이 세션 삭제(되돌릴 수 없음, 관리 화면과 동일한 경로)',
401
- 'panel.delete.done': '세션 {n}개 삭제됨',
402
- 'panel.delete.failed': '삭제 실패: {error}',
403
- 'panel.untitled': '(제목 없음)',
404
- 'panel.openSession': '세션 열기',
405
- 'panel.footer.invoke': '열기',
406
- 'panel.footer.close': '닫기',
407
- 'filter.all': '전체',
408
- 'filter.user': '사용자',
409
- 'filter.reply': '답변',
410
- 'filter.tool': '도구',
411
- 'sort.label': '결과 정렬',
412
- 'sort.relevance': '관련도',
413
- 'sort.time': '시간',
414
- 'sort.relevance.hint': '일치 강도순 정렬(기본값).',
415
- 'sort.time.hint': '세션 마지막 활동 시간 내림차순, 동률 시 일치 강도순.',
416
- 'group.merge': '병합',
417
- 'group.expand': '분할',
418
- 'group.merge.hint': '세션별 최강 일치 1건만 표시(기본값).',
419
- 'group.expand.hint': '같은 세션의 여러 일치를 각 행으로 표시(각 행이 개별 이동 대상).',
420
- 'type.user/message': '사용자',
421
- 'type.assistant/message': '답변',
422
- 'type.tool/call': '도구 호출',
423
- 'type.tool/result': '도구 결과',
424
- }
425
-
426
- /** French dictionary. */
427
- export const fr: Partial<Dict> = {
428
- 'card.title': 'Index de recherche',
429
- 'card.description': 'Recherche de sessions dans la barre latérale avec bascule titre/contenu. La recherche de contenu utilise l\'index indépendant du plugin et ne dépend jamais de l\'index full-text officiel DSH.',
430
- 'card.unavailable': 'Espace de noms des paramètres indisponible : vérifiez que le plugin est assemblé dans le profil.',
431
- 'card.readonly': 'Lecture seule',
432
- 'card.enabled': 'Activer la recherche de sessions',
433
- 'card.enabled.desc': 'Afficher l\'entrée « Recherche » en bas de la barre latérale.',
434
- 'card.defaultMode': 'Mode de recherche par défaut',
435
- 'card.defaultMode.desc': 'Mode d\'ouverture du panneau.',
436
- 'card.mode.title': 'Titre',
437
- 'card.mode.content': 'Contenu',
438
- 'card.autoSync': 'Synchronisation automatique de l\'index',
439
- 'card.autoSync.desc': 'Synchronisation incrémentale des journaux de session vers l\'index indépendant en arrière-plan.',
440
- 'card.syncInterval': 'Intervalle de synchronisation (secondes)',
441
- 'card.syncInterval.desc': 'Intervalle minimum entre deux synchronisations incrémentales.',
442
- 'card.archiveKeep': 'Archives à conserver',
443
- 'card.archiveKeep.desc': 'Nombre de fichiers d\'index archivés conservés à chaque reconstruction.',
444
- 'card.index': 'Index de recherche de contenu',
445
- 'card.index.desc': 'Index prêt : {indexed} sessions collectées.',
446
- 'card.index.archives': ', {archives} archive(s).',
447
- 'card.index.empty': 'Index indépendant pas encore construit. Cliquez sur « Reconstruire l\'index » pour le créer à partir des journaux de session.',
448
- 'card.index.reading': 'Lecture de l\'état de l\'index…',
449
- 'card.index.rebuilding': 'Reconstruction de l\'index… {done}/{total} (l\'ancien index reste actif pendant la reconstruction)',
450
- 'card.index.syncing': 'Synchronisation de l\'index…',
451
- 'card.index.failures': '{count} session(s) en échec de synchronisation (voir les journaux Host).',
452
- 'card.index.rebuildError': 'Échec de la reconstruction : {error}',
453
- 'card.index.rebuild': 'Reconstruire l\'index',
454
- 'card.index.rebuilding.btn': 'Reconstruction…',
455
- 'card.index.rebuild.hint': 'Non destructif : l\'ancien index reste actif pendant la construction ; l\'échange est atomique et l\'ancien index est archivé.',
456
- 'card.index.archivedOwner': 'La consultation et la suppression des sessions archivées relèvent de dsh-manage-session. Ce plugin lit uniquement l\'ensemble archivé et exclut ces sessions de l\'index.',
457
- 'card.index.archivedMissing': 'La consultation et la suppression des sessions archivées nécessitent dsh-manage-session, qui n\'est pas installé. Ce plugin lit uniquement l\'ensemble archivé et exclut ces sessions de l\'index.',
458
- 'card.index.export': 'Exporter l\'instantané',
459
- 'card.index.import': 'Importer l\'instantané',
460
- 'card.index.exported': 'Instantané téléchargé.',
461
- 'card.index.import.started': 'Import démarré : l\'index se reconstruit en arrière-plan et bascule une fois terminé.',
462
- 'card.index.importParse': 'Échec de l\'analyse de l\'instantané ou aucune session valide.',
463
- 'card.action.failed': 'Échec de l\'opération : {error}',
464
- 'panel.titleSearch': 'Titre',
465
- 'panel.contentSearch': 'Contenu',
466
- 'panel.searchTitle': 'Rechercher dans les titres…',
467
- 'panel.searchContent': 'Rechercher dans le contenu…',
468
- 'panel.entry': 'Recherche',
469
- 'panel.buildIndex': 'Construire l\'index',
470
- 'panel.archived': '{count} session(s) archivée(s) exclue(s)',
471
- 'panel.rebuilding': 'Reconstruction de l\'index… {done}/{total} (l\'ancien index reste actif)',
472
- 'panel.unavailable': 'Service d\'index indépendant indisponible : Host non initialisé.',
473
- 'panel.notBuilt': 'Index indépendant pas encore construit : construisez-le pour activer la recherche de contenu (aucun index FTS officiel requis).',
474
- 'panel.loadingSessions': 'Chargement des sessions…',
475
- 'panel.sessionsError': 'Échec du chargement des sessions : {error}',
476
- 'panel.noSessions': 'Aucune session',
477
- 'panel.noMatch': 'Aucune session correspondante.',
478
- 'panel.loadingContent': 'Recherche dans le contenu…',
479
- 'panel.contentError': 'Échec de la recherche de contenu : {error}',
480
- 'panel.noContent': 'Aucun contenu correspondant.',
481
- 'panel.contentHint': 'Saisissez des mots-clés pour rechercher dans le contenu.',
482
- 'panel.noText': '(pas de texte)',
483
- 'panel.delete': 'Supprimer',
484
- 'panel.delete.confirm': 'Confirmer la suppression',
485
- 'panel.delete.hint': 'Supprimer cette session (irréversible, même pipeline que la gestion)',
486
- 'panel.delete.done': '{n} session(s) supprimée(s)',
487
- 'panel.delete.failed': 'Échec de suppression : {error}',
488
- 'panel.untitled': '(sans titre)',
489
- 'panel.openSession': 'Ouvrir la session',
490
- 'panel.footer.invoke': 'Ouvrir',
491
- 'panel.footer.close': 'Fermer',
492
- 'filter.all': 'Tout',
493
- 'filter.user': 'Utilisateur',
494
- 'filter.reply': 'Réponse',
495
- 'filter.tool': 'Outil',
496
- 'sort.label': 'Ordre des résultats',
497
- 'sort.relevance': 'Pertinence',
498
- 'sort.time': 'Temps',
499
- 'sort.relevance.hint': 'Trier par force de correspondance (par défaut).',
500
- 'sort.time.hint': 'Trier par dernière activité, plus récent d\'abord ; à égalité, par force de correspondance.',
501
- 'group.merge': 'Fusionner',
502
- 'group.expand': 'Détailler',
503
- 'group.merge.hint': 'Une seule correspondance la plus forte par session (par défaut).',
504
- 'group.expand.hint': 'Afficher chaque correspondance de la session sur sa propre ligne (chacune est une cible de saut).',
505
- 'type.user/message': 'Utilisateur',
506
- 'type.assistant/message': 'Réponse',
507
- 'type.tool/call': 'Appel d\'outil',
508
- 'type.tool/result': 'Résultat d\'outil',
509
- }
510
-
511
- /** German dictionary. */
512
- export const de: Partial<Dict> = {
513
- 'card.title': 'Suchindex',
514
- 'card.description': 'Sidebar-Sitzungssuche mit Titel-/Inhaltsmodus-Umschaltung. Die Inhaltssuche verwendet den plugin-eigenen Index und hängt nie vom offiziellen DSH-Volltextindex ab.',
515
- 'card.unavailable': 'Einstellungs-Namensraum nicht verfügbar: Stellen Sie sicher, dass das Plugin im Profil zusammengestellt ist.',
516
- 'card.readonly': 'Schreibgeschützt',
517
- 'card.enabled': 'Sitzungssuche aktivieren',
518
- 'card.enabled.desc': 'Den „Suche"-Eintrag am unteren Rand der Sidebar anzeigen.',
519
- 'card.defaultMode': 'Standardsuchmodus',
520
- 'card.defaultMode.desc': 'In welchem Modus das Panel geöffnet wird.',
521
- 'card.mode.title': 'Titel',
522
- 'card.mode.content': 'Inhalt',
523
- 'card.autoSync': 'Index automatisch synchronisieren',
524
- 'card.autoSync.desc': 'Sitzungsprotokolle inkrementell in den unabhängigen Index im Hintergrund synchronisieren.',
525
- 'card.syncInterval': 'Synchronisierungsintervall (Sekunden)',
526
- 'card.syncInterval.desc': 'Mindestintervall zwischen zwei inkrementellen Synchronisierungen.',
527
- 'card.archiveKeep': 'Aufzubewahrende Archive',
528
- 'card.archiveKeep.desc': 'Anzahl der archivierten Indexdateien, die jeder Neuaufbau beibehält.',
529
- 'card.index': 'Inhaltssuchindex',
530
- 'card.index.desc': 'Index bereit: {indexed} Sitzungen erfasst.',
531
- 'card.index.archives': ', {archives} Archiv(e).',
532
- 'card.index.empty': 'Unabhängiger Index noch nicht aufgebaut. Klicken Sie auf „Index neu aufbauen", um ihn aus Sitzungsprotokollen zu erstellen.',
533
- 'card.index.reading': 'Indexstatus wird gelesen…',
534
- 'card.index.rebuilding': 'Index wird neu aufgebaut… {done}/{total} (der alte Index bleibt während des Neuaufbaus aktiv)',
535
- 'card.index.syncing': 'Index wird synchronisiert…',
536
- 'card.index.failures': '{count} Sitzung(en) konnten nicht synchronisiert werden (siehe Host-Protokolle).',
537
- 'card.index.rebuildError': 'Neuaufbau fehlgeschlagen: {error}',
538
- 'card.index.rebuild': 'Index neu aufbauen',
539
- 'card.index.rebuilding.btn': 'Wird aufgebaut…',
540
- 'card.index.rebuild.hint': 'Zerstörungsfrei: Der alte Index bleibt aktiv, während der Schatten-Index aufgebaut wird; der Tausch erfolgt atomar und der alte Index wird archiviert.',
541
- 'card.index.archivedOwner': 'Das Durchsuchen und Entsorgen archivierter Sitzungen gehört zu dsh-manage-session. Dieses Plugin liest nur das Archiv-Set und schließt diese Sitzungen aus dem Index aus.',
542
- 'card.index.archivedMissing': 'Das Durchsuchen und Entsorgen archivierter Sitzungen erfordert dsh-manage-session, das nicht installiert ist. Dieses Plugin liest nur das Archiv-Set und schließt diese Sitzungen aus dem Index aus.',
543
- 'card.index.export': 'Snapshot exportieren',
544
- 'card.index.import': 'Snapshot importieren',
545
- 'card.index.exported': 'Snapshot heruntergeladen.',
546
- 'card.index.import.started': 'Import gestartet: Der Index wird im Hintergrund neu aufgebaut und nach Fertigstellung atomar ausgetauscht.',
547
- 'card.index.importParse': 'Snapshot-Analyse fehlgeschlagen oder enthält keine gültige Sitzung.',
548
- 'card.action.failed': 'Aktion fehlgeschlagen: {error}',
549
- 'panel.titleSearch': 'Titel',
550
- 'panel.contentSearch': 'Inhalt',
551
- 'panel.searchTitle': 'Sitzungstitel durchsuchen…',
552
- 'panel.searchContent': 'Sitzungsinhalt durchsuchen…',
553
- 'panel.entry': 'Suche',
554
- 'panel.buildIndex': 'Index aufbauen',
555
- 'panel.archived': '{count} archivierte Sitzung(en) ausgeschlossen',
556
- 'panel.rebuilding': 'Index wird neu aufgebaut… {done}/{total} (der alte Index bleibt aktiv)',
557
- 'panel.unavailable': 'Unabhängiger Indexdienst nicht verfügbar: Host nicht initialisiert.',
558
- 'panel.notBuilt': 'Unabhängiger Index noch nicht aufgebaut: Bauen Sie ihn auf, um die Inhaltssuche zu aktivieren (kein offizieller FTS-Index erforderlich).',
559
- 'panel.loadingSessions': 'Sitzungen werden geladen…',
560
- 'panel.sessionsError': 'Sitzungen konnten nicht geladen werden: {error}',
561
- 'panel.noSessions': 'Keine Sitzungen',
562
- 'panel.noMatch': 'Keine passenden Sitzungen.',
563
- 'panel.loadingContent': 'Inhalt wird durchsucht…',
564
- 'panel.contentError': 'Inhaltssuche fehlgeschlagen: {error}',
565
- 'panel.noContent': 'Kein passender Inhalt.',
566
- 'panel.contentHint': 'Geben Sie Stichwörter ein, um Inhalte zu durchsuchen.',
567
- 'panel.noText': '(kein Text)',
568
- 'panel.delete': 'Löschen',
569
- 'panel.delete.confirm': 'Löschen bestätigen',
570
- 'panel.delete.hint': 'Diese Sitzung löschen (unwiderruflich, gleiche Pipeline wie die Verwaltung)',
571
- 'panel.delete.done': '{n} Sitzung(en) gelöscht',
572
- 'panel.delete.failed': 'Löschen fehlgeschlagen: {error}',
573
- 'panel.untitled': '(unbenannt)',
574
- 'panel.openSession': 'Sitzung öffnen',
575
- 'panel.footer.invoke': 'Öffnen',
576
- 'panel.footer.close': 'Schließen',
577
- 'filter.all': 'Alle',
578
- 'filter.user': 'Benutzer',
579
- 'filter.reply': 'Antwort',
580
- 'filter.tool': 'Werkzeug',
581
- 'sort.label': 'Ergebnissortierung',
582
- 'sort.relevance': 'Relevanz',
583
- 'sort.time': 'Zeit',
584
- 'sort.relevance.hint': 'Nach Übereinstimmungsstärke sortieren (Standard).',
585
- 'sort.time.hint': 'Nach letzter Sitzungsaktivität, neueste zuerst; bei Gleichstand nach Übereinstimmungsstärke.',
586
- 'group.merge': 'Zusammen',
587
- 'group.expand': 'Aufklappen',
588
- 'group.merge.hint': 'Nur der stärkste Treffer je Sitzung (Standard).',
589
- 'group.expand.hint': 'Jeden Treffer einer Sitzung als eigene Zeile anzeigen (jede Zeile ist ein Sprungziel).',
590
- 'type.user/message': 'Benutzer',
591
- 'type.assistant/message': 'Antwort',
592
- 'type.tool/call': 'Werkzeugaufruf',
593
- 'type.tool/result': 'Werkzeugergebnis',
594
- }
595
-
596
- /** Italian dictionary. */
597
- export const it: Partial<Dict> = {
598
- 'card.title': 'Indice di ricerca',
599
- 'card.description': 'Ricerca sessioni nella barra laterale con commutazione titolo/contenuto. La ricerca per contenuto utilizza l\'indice indipendente del plugin e non dipende mai dall\'indice full-text ufficiale DSH.',
600
- 'card.unavailable': 'Namespace delle impostazioni non disponibile: verificare che il plugin sia assemblato nel profilo.',
601
- 'card.readonly': 'Sola lettura',
602
- 'card.enabled': 'Abilita ricerca sessioni',
603
- 'card.enabled.desc': 'Mostra la voce «Ricerca» in fondo alla barra laterale.',
604
- 'card.defaultMode': 'Modalità di ricerca predefinita',
605
- 'card.defaultMode.desc': 'Modalità di apertura del pannello.',
606
- 'card.mode.title': 'Titolo',
607
- 'card.mode.content': 'Contenuto',
608
- 'card.autoSync': 'Sincronizzazione automatica indice',
609
- 'card.autoSync.desc': 'Sincronizza incrementalmente i log delle sessioni nell\'indice indipendente in background.',
610
- 'card.syncInterval': 'Intervallo sincronizzazione (secondi)',
611
- 'card.syncInterval.desc': 'Intervallo minimo tra due sincronizzazioni incrementali.',
612
- 'card.archiveKeep': 'Archivi da conservare',
613
- 'card.archiveKeep.desc': 'Numero di file indice archiviati conservati ad ogni ricostruzione.',
614
- 'card.index': 'Indice ricerca contenuti',
615
- 'card.index.desc': 'Indice pronto: {indexed} sessioni raccolte.',
616
- 'card.index.archives': ', {archives} archivio/i.',
617
- 'card.index.empty': 'Indice indipendente non ancora costruito. Fare clic su «Ricostruisci indice» per crearlo dai log delle sessioni.',
618
- 'card.index.reading': 'Lettura stato indice…',
619
- 'card.index.rebuilding': 'Ricostruzione indice… {done}/{total} (il vecchio indice resta attivo durante la ricostruzione)',
620
- 'card.index.syncing': 'Sincronizzazione indice…',
621
- 'card.index.failures': '{count} sessione/i non sincronizzata/e (vedi log Host).',
622
- 'card.index.rebuildError': 'Ricostruzione fallita: {error}',
623
- 'card.index.rebuild': 'Ricostruisci indice',
624
- 'card.index.rebuilding.btn': 'Ricostruzione…',
625
- 'card.index.rebuild.hint': 'Non distruttivo: il vecchio indice resta attivo durante la costruzione; lo scambio è atomico e il vecchio indice viene archiviato.',
626
- 'card.index.archivedOwner': 'La consultazione e l\'eliminazione delle sessioni archiviate spettano a dsh-manage-session. Questo plugin legge solo l\'insieme archiviato ed esclude tali sessioni dall\'indice.',
627
- 'card.index.archivedMissing': 'La consultazione e l\'eliminazione delle sessioni archiviate richiedono dsh-manage-session, attualmente non installato. Questo plugin legge solo l\'insieme archiviato ed esclude tali sessioni dall\'indice.',
628
- 'card.index.export': 'Esporta snapshot',
629
- 'card.index.import': 'Importa snapshot',
630
- 'card.index.exported': 'Snapshot scaricato.',
631
- 'card.index.import.started': 'Importazione avviata: l\'indice viene ricostruito in background e scambiato al termine.',
632
- 'card.index.importParse': 'Analisi snapshot fallita o nessuna sessione valida.',
633
- 'card.action.failed': 'Operazione fallita: {error}',
634
- 'panel.titleSearch': 'Titolo',
635
- 'panel.contentSearch': 'Contenuto',
636
- 'panel.searchTitle': 'Cerca nei titoli delle sessioni…',
637
- 'panel.searchContent': 'Cerca nel contenuto delle sessioni…',
638
- 'panel.entry': 'Ricerca',
639
- 'panel.buildIndex': 'Costruisci indice',
640
- 'panel.archived': '{count} sessione/i archiviata/e esclusa/e',
641
- 'panel.rebuilding': 'Ricostruzione indice… {done}/{total} (il vecchio indice resta attivo)',
642
- 'panel.unavailable': 'Servizio indice indipendente non disponibile: Host non inizializzato.',
643
- 'panel.notBuilt': 'Indice indipendente non ancora costruito: costruiscilo per abilitare la ricerca per contenuto (nessun indice FTS ufficiale richiesto).',
644
- 'panel.loadingSessions': 'Caricamento sessioni…',
645
- 'panel.sessionsError': 'Caricamento sessioni fallito: {error}',
646
- 'panel.noSessions': 'Nessuna sessione',
647
- 'panel.noMatch': 'Nessuna sessione corrispondente.',
648
- 'panel.loadingContent': 'Ricerca nel contenuto…',
649
- 'panel.contentError': 'Ricerca contenuto fallita: {error}',
650
- 'panel.noContent': 'Nessun contenuto corrispondente.',
651
- 'panel.contentHint': 'Inserisci parole chiave per cercare nel contenuto.',
652
- 'panel.noText': '(nessun testo)',
653
- 'panel.delete': 'Elimina',
654
- 'panel.delete.confirm': 'Conferma eliminazione',
655
- 'panel.delete.hint': 'Elimina questa sessione (irreversibile, stessa pipeline della gestione)',
656
- 'panel.delete.done': 'Eliminate {n} sessione/i',
657
- 'panel.delete.failed': 'Eliminazione non riuscita: {error}',
658
- 'panel.untitled': '(senza titolo)',
659
- 'panel.openSession': 'Apri sessione',
660
- 'panel.footer.invoke': 'Apri',
661
- 'panel.footer.close': 'Chiudi',
662
- 'filter.all': 'Tutti',
663
- 'filter.user': 'Utente',
664
- 'filter.reply': 'Risposta',
665
- 'filter.tool': 'Strumento',
666
- 'sort.label': 'Ordinamento risultati',
667
- 'sort.relevance': 'Pertinenza',
668
- 'sort.time': 'Tempo',
669
- 'sort.relevance.hint': 'Ordina per forza di corrispondenza (predefinito).',
670
- 'sort.time.hint': 'Ordina per ultima attività, più recente prima; a parità, per forza di corrispondenza.',
671
- 'group.merge': 'Unisci',
672
- 'group.expand': 'Espandi',
673
- 'group.merge.hint': 'Mostra solo il risultato più forte per sessione (predefinito).',
674
- 'group.expand.hint': 'Mostra ogni corrispondenza della sessione su riga propria (ogni riga è una destinazione).',
675
- 'type.user/message': 'Utente',
676
- 'type.assistant/message': 'Risposta',
677
- 'type.tool/call': 'Chiamata strumento',
678
- 'type.tool/result': 'Risultato strumento',
679
- }
680
-
681
- /** Russian dictionary. */
682
- export const ru: Partial<Dict> = {
683
- 'card.title': 'Поисковый индекс',
684
- 'card.description': 'Поиск сессий в боковой панели с переключением «заголовки/содержимое». Поиск по содержимому использует собственный индекс плагина и не зависит от официального полнотекстового индекса DSH.',
685
- 'card.unavailable': 'Пространство имён настроек недоступно: убедитесь, что плагин собран в профиле.',
686
- 'card.readonly': 'Только чтение',
687
- 'card.enabled': 'Включить поиск сессий',
688
- 'card.enabled.desc': 'Показывать пункт «Поиск» в нижней части боковой панели.',
689
- 'card.defaultMode': 'Режим поиска по умолчанию',
690
- 'card.defaultMode.desc': 'Режим открытия панели.',
691
- 'card.mode.title': 'Заголовок',
692
- 'card.mode.content': 'Содержимое',
693
- 'card.autoSync': 'Автосинхронизация индекса',
694
- 'card.autoSync.desc': 'Инкрементальная синхронизация журналов сессий в независимый индекс в фоновом режиме.',
695
- 'card.syncInterval': 'Интервал синхронизации (сек)',
696
- 'card.syncInterval.desc': 'Минимальный интервал между двумя инкрементальными синхронизациями.',
697
- 'card.archiveKeep': 'Хранимых архивов',
698
- 'card.archiveKeep.desc': 'Сколько архивных файлов индекса сохранять при каждой пересборке.',
699
- 'card.index': 'Индекс поиска по содержимому',
700
- 'card.index.desc': 'Индекс готов: собрано {indexed} сессий.',
701
- 'card.index.archives': ', архивов: {archives}.',
702
- 'card.index.empty': 'Независимый индекс ещё не построен. Нажмите «Пересобрать индекс», чтобы создать его из журналов сессий.',
703
- 'card.index.reading': 'Чтение состояния индекса…',
704
- 'card.index.rebuilding': 'Пересборка индекса… {done}/{total} (старый индекс остаётся доступным во время пересборки)',
705
- 'card.index.syncing': 'Синхронизация индекса…',
706
- 'card.index.failures': '{count} сессий не синхронизировано (см. журналы Host).',
707
- 'card.index.rebuildError': 'Пересборка не удалась: {error}',
708
- 'card.index.rebuild': 'Пересобрать индекс',
709
- 'card.index.rebuilding.btn': 'Пересборка…',
710
- 'card.index.rebuild.hint': 'Недеструктивно: старый индекс остаётся доступным, пока строится теневой; замена атомарна, старый индекс архивируется.',
711
- 'card.index.archivedOwner': 'Просмотр и удаление архивных сессий — задача dsh-manage-session. Этот плагин только читает набор архива и исключает архивные сессии из индекса.',
712
- 'card.index.archivedMissing': 'Для просмотра и удаления архивных сессий требуется dsh-manage-session, который не установлен. Этот плагин только читает набор архива и исключает архивные сессии из индекса.',
713
- 'card.index.export': 'Экспорт снимка',
714
- 'card.index.import': 'Импорт снимка',
715
- 'card.index.exported': 'Снимок скачан.',
716
- 'card.index.import.started': 'Импорт начат: индекс пересобирается в фоне и переключается по завершении.',
717
- 'card.index.importParse': 'Ошибка разбора снимка или нет допустимых сессий.',
718
- 'card.action.failed': 'Действие не выполнено: {error}',
719
- 'panel.titleSearch': 'Заголовок',
720
- 'panel.contentSearch': 'Содержимое',
721
- 'panel.searchTitle': 'Поиск по заголовкам сессий…',
722
- 'panel.searchContent': 'Поиск по содержимому сессий…',
723
- 'panel.entry': 'Поиск',
724
- 'panel.buildIndex': 'Построить индекс',
725
- 'panel.archived': 'Исключено {count} архивных сессий',
726
- 'panel.rebuilding': 'Пересборка индекса… {done}/{total} (старый индекс остаётся доступным)',
727
- 'panel.unavailable': 'Сервис независимого индекса недоступен: Host не инициализирован.',
728
- 'panel.notBuilt': 'Независимый индекс не построен: постройте его, чтобы включить поиск по содержимому (официальный FTS-индекс не требуется).',
729
- 'panel.loadingSessions': 'Загрузка сессий…',
730
- 'panel.sessionsError': 'Не удалось загрузить сессии: {error}',
731
- 'panel.noSessions': 'Нет сессий',
732
- 'panel.noMatch': 'Нет подходящих сессий.',
733
- 'panel.loadingContent': 'Поиск по содержимому…',
734
- 'panel.contentError': 'Поиск по содержимому не удался: {error}',
735
- 'panel.noContent': 'Нет подходящего содержимого.',
736
- 'panel.contentHint': 'Введите ключевые слова для поиска по содержимому.',
737
- 'panel.noText': '(без текста)',
738
- 'panel.delete': 'Удалить',
739
- 'panel.delete.confirm': 'Подтвердить удаление',
740
- 'panel.delete.hint': 'Удалить эту сессию (необратимо, тот же конвейер, что и в администраторе)',
741
- 'panel.delete.done': 'Удалено сессий: {n}',
742
- 'panel.delete.failed': 'Ошибка удаления: {error}',
743
- 'panel.untitled': '(без названия)',
744
- 'panel.openSession': 'Открыть сессию',
745
- 'panel.footer.invoke': 'Открыть',
746
- 'panel.footer.close': 'Закрыть',
747
- 'filter.all': 'Все',
748
- 'filter.user': 'Пользователь',
749
- 'filter.reply': 'Ответ',
750
- 'filter.tool': 'Инструмент',
751
- 'sort.label': 'Сортировка результатов',
752
- 'sort.relevance': 'Релевантность',
753
- 'sort.time': 'Время',
754
- 'sort.relevance.hint': 'Сортировать по силе совпадения (по умолчанию).',
755
- 'sort.time.hint': 'Сортировать по последней активности, сначала новые; при равенстве — по силе совпадения.',
756
- 'group.merge': 'Объединить',
757
- 'group.expand': 'Развернуть',
758
- 'group.merge.hint': 'По одному сильнейшему совпадению на сессию (по умолчанию).',
759
- 'group.expand.hint': 'Каждое совпадение сессии — отдельной строкой (каждая строка — цель перехода).',
760
- 'type.user/message': 'Пользователь',
761
- 'type.assistant/message': 'Ответ',
762
- 'type.tool/call': 'Вызов инструмента',
763
- 'type.tool/result': 'Результат инструмента',
764
- }
765
-
766
- /** Spanish dictionary. */
767
- export const es: Partial<Dict> = {
768
- 'card.title': 'Índice de búsqueda',
769
- 'card.description': 'Búsqueda de sesiones en la barra lateral con cambio entre título y contenido. La búsqueda de contenido usa el índice propio del plugin y nunca depende del índice de texto completo oficial de DSH.',
770
- 'card.unavailable': 'Espacio de nombres de configuración no disponible: verifique que el plugin esté ensamblado en el perfil.',
771
- 'card.readonly': 'Solo lectura',
772
- 'card.enabled': 'Habilitar búsqueda de sesiones',
773
- 'card.enabled.desc': 'Mostrar la entrada «Buscar» en la parte inferior de la barra lateral.',
774
- 'card.defaultMode': 'Modo de búsqueda predeterminado',
775
- 'card.defaultMode.desc': 'Modo en que se abre el panel.',
776
- 'card.mode.title': 'Título',
777
- 'card.mode.content': 'Contenido',
778
- 'card.autoSync': 'Sincronización automática del índice',
779
- 'card.autoSync.desc': 'Sincroniza incrementalmente los registros de sesión al índice independiente en segundo plano.',
780
- 'card.syncInterval': 'Intervalo de sincronización (segundos)',
781
- 'card.syncInterval.desc': 'Intervalo mínimo entre dos sincronizaciones incrementales.',
782
- 'card.archiveKeep': 'Archivos a conservar',
783
- 'card.archiveKeep.desc': 'Cuántos archivos de índice archivados se conservan en cada reconstrucción.',
784
- 'card.index': 'Índice de búsqueda de contenido',
785
- 'card.index.desc': 'Índice listo: {indexed} sesiones recopiladas.',
786
- 'card.index.archives': ', {archives} archivo(s) de respaldo.',
787
- 'card.index.empty': 'El índice independiente aún no está construido. Haga clic en «Reconstruir índice» para crearlo desde los registros de sesión.',
788
- 'card.index.reading': 'Leyendo estado del índice…',
789
- 'card.index.rebuilding': 'Reconstruyendo índice… {done}/{total} (el índice anterior sigue activo durante la reconstrucción)',
790
- 'card.index.syncing': 'Sincronizando índice…',
791
- 'card.index.failures': '{count} sesión(es) fallaron al sincronizar (ver registros del Host).',
792
- 'card.index.rebuildError': 'Reconstrucción fallida: {error}',
793
- 'card.index.rebuild': 'Reconstruir índice',
794
- 'card.index.rebuilding.btn': 'Reconstruyendo…',
795
- 'card.index.rebuild.hint': 'No destructivo: el índice anterior sigue activo mientras se construye el nuevo; el intercambio es atómico y el índice anterior se archiva.',
796
- 'card.index.archivedOwner': 'La consulta y eliminación de sesiones archivadas corresponde a dsh-manage-session. Este plugin solo lee el conjunto archivado y excluye esas sesiones del índice.',
797
- 'card.index.archivedMissing': 'La consulta y eliminación de sesiones archivadas requiere dsh-manage-session, que no está instalado. Este plugin solo lee el conjunto archivado y excluye esas sesiones del índice.',
798
- 'card.index.export': 'Exportar instantánea',
799
- 'card.index.import': 'Importar instantánea',
800
- 'card.index.exported': 'Instantánea descargada.',
801
- 'card.index.import.started': 'Importación iniciada: el índice se reconstruye en segundo plano y se intercambia al finalizar.',
802
- 'card.index.importParse': 'Error al analizar la instantánea o sin sesiones válidas.',
803
- 'card.action.failed': 'Acción fallida: {error}',
804
- 'panel.titleSearch': 'Título',
805
- 'panel.contentSearch': 'Contenido',
806
- 'panel.searchTitle': 'Buscar títulos de sesión…',
807
- 'panel.searchContent': 'Buscar contenido de sesión…',
808
- 'panel.entry': 'Buscar',
809
- 'panel.buildIndex': 'Construir índice',
810
- 'panel.archived': '{count} sesión(es) archivada(s) excluida(s)',
811
- 'panel.rebuilding': 'Reconstruyendo índice… {done}/{total} (el índice anterior sigue activo)',
812
- 'panel.unavailable': 'Servicio de índice independiente no disponible: Host no inicializado.',
813
- 'panel.notBuilt': 'Índice independiente no construido: constrúyalo para habilitar la búsqueda de contenido (no se requiere índice FTS oficial).',
814
- 'panel.loadingSessions': 'Cargando sesiones…',
815
- 'panel.sessionsError': 'Error al cargar sesiones: {error}',
816
- 'panel.noSessions': 'Sin sesiones',
817
- 'panel.noMatch': 'Sin sesiones coincidentes.',
818
- 'panel.loadingContent': 'Buscando en el contenido…',
819
- 'panel.contentError': 'Búsqueda de contenido fallida: {error}',
820
- 'panel.noContent': 'Sin contenido coincidente.',
821
- 'panel.contentHint': 'Escriba palabras clave para buscar contenido.',
822
- 'panel.noText': '(sin texto)',
823
- 'panel.delete': 'Eliminar',
824
- 'panel.delete.confirm': 'Confirmar borrado',
825
- 'panel.delete.hint': 'Eliminar esta sesión (irreversible, misma ruta que la gestión)',
826
- 'panel.delete.done': '{n} sesión(es) eliminadas',
827
- 'panel.delete.failed': 'Error de borrado: {error}',
828
- 'panel.untitled': '(sin título)',
829
- 'panel.openSession': 'Abrir sesión',
830
- 'panel.footer.invoke': 'Abrir',
831
- 'panel.footer.close': 'Cerrar',
832
- 'filter.all': 'Todos',
833
- 'filter.user': 'Usuario',
834
- 'filter.reply': 'Respuesta',
835
- 'filter.tool': 'Herramienta',
836
- 'sort.label': 'Orden de resultados',
837
- 'sort.relevance': 'Relevancia',
838
- 'sort.time': 'Tiempo',
839
- 'sort.relevance.hint': 'Ordenar por fuerza de coincidencia (predeterminado).',
840
- 'sort.time.hint': 'Ordenar por última actividad, más reciente primero; en caso de empate, por fuerza de coincidencia.',
841
- 'group.merge': 'Unir',
842
- 'group.expand': 'Desplegar',
843
- 'group.merge.hint': 'Solo la coincidencia más fuerte por sesión (predeterminado).',
844
- 'group.expand.hint': 'Mostrar cada coincidencia de la sesión en su propia fila (cada fila es un destino).',
845
- 'type.user/message': 'Usuario',
846
- 'type.assistant/message': 'Respuesta',
847
- 'type.tool/call': 'Llamada de herramienta',
848
- 'type.tool/result': 'Resultado de herramienta',
849
- }
850
-
851
- /** All shipped dictionaries by locale id. */
852
- export const dictionaries: Record<string, Record<string, string>> = { zh, en, ja, ko, fr, de, it, ru, es }
853
-
854
- /** Translate with {param} interpolation; falls back to zh, then the key itself. */
855
- export function translate(locale: ((key: LocaleKey, params?: Record<string, unknown>) => string) | undefined, key: LocaleKey, params?: Record<string, unknown>): string {
856
- const raw = locale?.(key, params)
857
- if (typeof raw === 'string' && raw !== '' && raw !== key) return raw
858
- const template = (dictionaries.zh[key] ?? key) as string
859
- if (params === undefined) return template
860
- return template.replace(/\{(\w+)\}/gu, (_, name: string) => String(params[name] ?? `{${name}}`))
861
- }