@oharness/server 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/i18n.js CHANGED
@@ -21,6 +21,28 @@ export const STRINGS = {
21
21
  "composer.placeholder": "Describe a task…",
22
22
  "composer.attach": "Add files, folders and connectors",
23
23
  "composer.workspace": "Where this session runs",
24
+ "effort.title": "Effort",
25
+ "effort.tooltip": "Reasoning effort",
26
+ "effort.faster": "Faster",
27
+ "effort.smarter": "Smarter",
28
+ "effort.off": "Off",
29
+ "effort.low": "Low",
30
+ "effort.medium": "Medium",
31
+ "effort.high": "High",
32
+ "effort.xhigh": "Extra high",
33
+ "effort.max": "Max",
34
+ "effort.short.off": "Off",
35
+ "effort.short.low": "Low",
36
+ "effort.short.medium": "Med",
37
+ "effort.short.high": "High",
38
+ "effort.short.xhigh": "XHigh",
39
+ "effort.short.max": "Max",
40
+ "effort.desc.off": "No reasoning. Answers straight away.",
41
+ "effort.desc.low": "Answers fast, with little deliberation.",
42
+ "effort.desc.medium": "Balanced, and the right default for most work.",
43
+ "effort.desc.high": "Thinks longer on hard, multi-step tasks. Slower and pricier.",
44
+ "effort.desc.xhigh": "Extended reasoning for the hardest problems.",
45
+ "effort.desc.max": "Everything the model has. Slowest and most expensive.",
24
46
  "add.attachFiles": "Attach files or photos",
25
47
  "add.attachFolders": "Attach folders",
26
48
  "add.connectors": "Connectors",
@@ -209,17 +231,23 @@ export const STRINGS = {
209
231
  "account.signedIn": "Signed in",
210
232
  "account.dashboard": "Dashboard",
211
233
  "account.download": "Download the app",
234
+ "account.enterprise": "For teams",
235
+ "account.contact": "Contact us",
212
236
  "theme.label": "Theme",
213
237
  "theme.system": "System",
214
238
  "theme.light": "Light",
215
239
  "theme.dark": "Dark",
216
- "account.plan": "{plan} \u00b7 {status}",
217
240
  "account.noPlan": "No subscription",
218
241
  "account.getCredits": "Subscribe or top up",
219
- // Whose credits the next call spends. A team's balance is the second
220
- // number in the menu while one is chosen, and the entries below switch.
221
- "account.team": "{team} · {credits} team credits",
242
+ // Whose credits the next call spends; the workspace entries switch it.
222
243
  "account.teamRefused": "{team} · no longer on this team",
244
+ // The account card: the unit under the balance, and a plan's status where
245
+ // the pill spells it out (anything but active).
246
+ "account.creditsUnit": "credits",
247
+ "account.status.active": "Active",
248
+ "account.status.trialing": "Trial",
249
+ "account.status.past_due": "Payment failed",
250
+ "account.status.canceled": "Cancelled",
223
251
  "account.teamUnnamed": "team",
224
252
  "account.useTeam": "Bill to {team}",
225
253
  "account.useOwn": "Bill to my own plan",
@@ -258,6 +286,37 @@ export const STRINGS = {
258
286
  "settings.auditExportAll": "Export everything",
259
287
  "settings.auditEmpty": "Nothing recorded in this session yet.",
260
288
  "settings.auditMore": "{n} older entries not shown.",
289
+ "settings.auditOpen": "Open",
290
+ "perms.title": "Permissions",
291
+ "perms.open": "Open",
292
+ "perms.hint": "What runs, what stops to ask, what is refused, and which directories may be written to.",
293
+ "perms.mode": "Mode",
294
+ "perms.writes": "Writable roots",
295
+ "perms.writesHint": "{n} writable roots — a policy gate on tool arguments, not a sandbox: a shell command can still reach any path you can.",
296
+ "perms.mine": "Roots you configured",
297
+ "perms.placeholder": "One absolute path per line",
298
+ "perms.save": "Save roots",
299
+ "perms.saved": "Saved — takes effect the next time the app starts.",
300
+ "perms.derivedAll": "All {n} come from installed plugins and are rebuilt at launch:",
301
+ "perms.derivedMore": "{n} more come from installed plugins and are rebuilt at launch:",
302
+ "perms.noRules": "No rules are set, so every call is judged by the mode above.",
303
+ "perms.more": "{n} more on the page.",
304
+ "perms.rootsCount": "{n} writable roots",
305
+ "audit.elsewhere": "{n} in earlier sessions, on the page.",
306
+ "preview.loading": "Reading…",
307
+ "audit.scope.session": "This session",
308
+ "audit.scope.all": "All sessions",
309
+ "audit.filter.all": "Everything",
310
+ "audit.filter.allowed": "Allowed",
311
+ "audit.filter.denied": "Denied",
312
+ "audit.filter.unanswered": "Unanswered",
313
+ "audit.count": "{n} decisions",
314
+ "audit.countOne": "1 decision",
315
+ "audit.acrossSessions": "across {n} sessions",
316
+ "audit.showMore": "Show more",
317
+ "audit.noneAll": "Nothing has been recorded on this machine yet.",
318
+ "audit.noMatch": "Nothing here matches that filter.",
319
+ "audit.capped": "Only the most recent sessions were read. Export everything for the rest.",
261
320
  "settings.rules": "Permission rules",
262
321
  "settings.rulesHint": "What the agent may do without asking, what stops for a question, and what is refused outright.",
263
322
  "settings.files": "Settings files",
@@ -279,6 +338,14 @@ export const STRINGS = {
279
338
  "usage.value": "Tokens, cache hits and spend, per model and per session",
280
339
  "usage.hint": "Totalled from the transcripts on this machine. Nothing is sent anywhere to work it out.",
281
340
  "usage.open": "Open",
341
+ "usage.range.custom": "Custom",
342
+ "usage.range.apply": "Apply",
343
+ "usage.range.cancel": "Cancel",
344
+ "usage.range.previous": "Previous month",
345
+ "usage.range.next": "Next month",
346
+ "usage.range.days": "{n} days",
347
+ "usage.range.oneDay": "1 day",
348
+ "usage.range.pickEnd": "Pick the last day",
282
349
  "usage.back": "Back to settings",
283
350
  "usage.tokens": "{n} tokens",
284
351
  "usage.cached": "{pct}% cached",
@@ -346,6 +413,27 @@ export const STRINGS = {
346
413
  "ask.tagBash": "Run command",
347
414
  "ask.tagFetch": "Fetch a URL",
348
415
  "ask.tagCall": "Tool call",
416
+ "ask.tagApp": "App action",
417
+ "ask.rule": "Rule {rule}",
418
+ "tool.cloudApps": "Enabled apps",
419
+ "tool.cloudAppTools": "{app} · available tools",
420
+ "tool.ask": "Asked: {header}",
421
+ "tool.catalogApps": "{n} apps enabled: {names}",
422
+ "tool.catalogTools": "{app}: {n} tools",
423
+ "tool.rawResult": "Raw result",
424
+ "question.other": "Something else — type your answer",
425
+ "question.multi": "Choose any",
426
+ "question.skip": "Skip",
427
+ "question.keys": "1–9 choose · Enter continue",
428
+ "question.back": "Back",
429
+ "question.next": "Next",
430
+ "question.submit": "Submit",
431
+ "question.answered": "Answered",
432
+ "question.dismissed": "Skipped",
433
+ "question.note": "Wrote instead: {note}",
434
+ "question.aborted": "The turn stopped before this was answered",
435
+ "question.unavailable": "Nobody was available to answer",
436
+ "question.closed": "Handled in another window",
349
437
  "turn.fork": "Fork from here",
350
438
  "turn.copy": "Copy",
351
439
  "turn.copied": "Copied",
@@ -432,9 +520,153 @@ export const STRINGS = {
432
520
  "memory.summaryLabel": "Summary",
433
521
  "memory.summaryHint": "The one line the model sees without opening the note. Writing the same summary again updates this note rather than adding another.",
434
522
  "memory.bodyLabel": "Note",
435
- "memory.bodyHint": "Read only when the model opens this note by id or finds it by search.",
523
+ "memory.bodyHint": "Attached to a message when the summary matches what is being asked, or read when the model opens the note. Link other notes as [[note-id]].",
436
524
  "memory.tagsLabel": "Tags",
437
- "memory.tagsHint": "Comma separated. Searched along with the summary and the note.",
525
+ "memory.tagsHint": "Comma separated. Add the other words someone might use for this, such as synonyms or the term in another language; recall matches words, not meaning.",
526
+ "memory.recalled": "Recalled {count}: {list}",
527
+ "memory.usage": "{count} of {max} notes",
528
+ "memory.omitted": "{count} older notes are over the limit and not loaded",
529
+ "memory.projectLocation": "Notes for this project",
530
+ "memory.userLocation": "Your notes, used in every project",
531
+ "memory.scopeLabel": "Scope",
532
+ "memory.scopeHint": "Project notes belong to this codebase. Your notes apply in every project.",
533
+ "memory.scopeProject": "Project",
534
+ "memory.scopeUser": "You",
535
+ "memory.typeLabel": "Type",
536
+ "memory.typeNone": "Unspecified",
537
+ "memory.typeUser": "About you",
538
+ "memory.typeFeedback": "Feedback",
539
+ "memory.typeProject": "Project fact",
540
+ "memory.typeReference": "Reference",
541
+ "memory.linksOut": "Links to",
542
+ "memory.linksIn": "Linked from",
543
+ "memory.missing": "No note has this id",
544
+ "memory.confirmDeleteLinked": "{count} other notes link to this one. ",
545
+ "memory.extracted": "Saved {count} from this conversation: {list}",
546
+ "memory.errorProject": "Project notes: {message}",
547
+ "memory.errorUser": "Your notes: {message}",
548
+ "memory.tierFree": "Free plan: cloud sync keeps up to {notes} notes per project and {notes} of your own, {kb} KB each. Notes on this machine are not limited.",
549
+ "memory.recentPulled": "Last pulled from the cloud {when}: {created} added, {updated} changed, {deleted} removed, {merged} merged automatically",
550
+ "memory.recentMerged": "Merged automatically: {summary}",
551
+ "memory.conflictFields": "Both sides changed {fields} in ways that could not be combined.",
552
+ "memory.field.summary": "the summary",
553
+ "memory.field.body": "overlapping lines of the note",
554
+ "memory.field.type": "the type",
555
+ "memory.field.content": "this note, and there is no copy of the last synced version to compare with",
556
+ "memory.fieldSeparator": ", ",
557
+ "memory.base": "Last synced",
558
+ "memory.keepBoth": "Keep both",
559
+ "memory.mergeByHand": "Merge by hand",
560
+ "memory.mergeSave": "Save merged note",
561
+ "memory.recentCreated": "Added: {summary}",
562
+ "memory.recentUpdated": "Changed: {summary}",
563
+ "memory.recentDeleted": "Removed: {summary}",
564
+ "memory.backups": "Backups ({count})",
565
+ "memory.backupsNone": "No backups yet. A copy is kept here whenever a note is deleted or replaced.",
566
+ "memory.restore": "Restore",
567
+ "memory.confirmRestore": "Restore this version? If the note has changed since, the current version is backed up first.",
568
+ "memory.backupReason.delete": "Deleted on this page",
569
+ "memory.backupReason.forget": "Deleted by the model",
570
+ "memory.backupReason.conflict": "Replaced by the cloud version in a conflict",
571
+ "memory.backupReason.sync-update": "Replaced by a sync",
572
+ "memory.backupReason.sync-delete": "Removed by a sync",
573
+ "memory.backupReason.extract-update": "Rewritten by extraction",
574
+ "memory.backupReason.restore": "Replaced by a restore",
575
+ "memory.backupReason.conflict-cloud": "Cloud version set aside in a conflict",
576
+ "memory.backupReason.auto-merge": "Before an automatic merge",
577
+ "memory.backupReason.consolidate": "Before consolidation",
578
+ "memory.aboutStorage": "Where notes are stored",
579
+ "memory.err.configInvalid": "Memory sync settings are invalid, so sync has stopped.",
580
+ "memory.err.stopped": "Memory sync has stopped.",
581
+ "memory.err.disabledHere": "Cloud sync was turned off for these notes.",
582
+ "memory.err.accountChanged": "The signed-in account or Cloud address changed, so memory sync is paused.",
583
+ "memory.err.settingsChanged": "Memory sync settings changed.",
584
+ "memory.err.localUnreadable": "Notes on this machine cannot be read or are invalid. Check the memory folder. Sync is paused and no file was changed.",
585
+ "memory.err.signInFirst": "Sign in to OHarness first.",
586
+ "memory.err.boundElsewhere": "This notes folder is already bound to another account or Cloud. Use a separate notes folder so notes are not uploaded across accounts.",
587
+ "memory.err.verifyFailed": "Account verification failed.",
588
+ "memory.err.syncFailed": "Sync failed.",
589
+ "memory.err.invalidVersion": "The sync service returned an invalid version.",
590
+ "memory.err.waitForSync": "Wait for the current sync to finish.",
591
+ "memory.err.stale": "Notes changed on this machine or another device. Sync, then try again.",
592
+ "memory.err.invalidBatch": "Invalid batch change.",
593
+ "memory.err.batchTooLarge": "Too many notes changed at once. Change them in smaller batches.",
594
+ "memory.err.serverTooOld": "The sync service is too old to sync your own notes. Upgrade the sync service.",
595
+ "memory.err.accountSwitched": "The account changed.",
596
+ "memory.err.invalidChoice": "Invalid conflict choice.",
597
+ "memory.err.localChanged": "Notes on this machine changed. Sync again.",
598
+ "memory.err.oneSideDeleted": "One side deleted this note, so both copies cannot be kept.",
599
+ "memory.err.mergedMissing": "The merged note is missing.",
600
+ "memory.err.secret": "The note seems to contain a credential, so it was not saved.",
601
+ "memory.err.secretFound": "The note seems to contain a credential ({kinds}), so it was not saved.",
602
+ "memory.err.mergedSecret": "The merged note seems to contain a credential, so it was not saved.",
603
+ "memory.err.conflictsPending": "{count} notes were changed on both sides in overlapping ways and could not be merged automatically. Choose which version to keep. Everything else is synced.",
604
+ "memory.err.conflictsRemain": "Some conflicts still need resolving.",
605
+ "memory.err.invalidResponse": "The sync service returned invalid data.",
606
+ "memory.err.signInAgain": "Sign in to OHarness again.",
607
+ "memory.err.requestFailed": "The memory sync request failed or was cancelled. You can try again.",
608
+ "memory.err.cloudChanged": "The cloud version changed. Sync again.",
609
+ "memory.err.rateLimited": "Syncing too often. It will retry automatically.",
610
+ "memory.err.serverNotConfigured": "The sync service has not set up memory sign-in or R2 storage.",
611
+ "memory.err.quotaExceeded": "Over the sync service's memory quota.",
612
+ "memory.err.rejected": "The sync request was refused. Check your account and sync settings.",
613
+ "memory.err.planLimit": "Free cloud sync for memory is full: at most {notes} project notes and {notes} of your own, {kb} KB each. Upgrading removes these limits. Notes on this machine are not affected.",
614
+ "memory.err.planLimitPlain": "Free cloud sync for memory is full. Upgrading removes the limits. Notes on this machine are not affected.",
615
+ "memory.err.responseTooLarge": "The sync response was too large.",
616
+ "memory.err.principalMismatch": "The sync response is for a different account.",
617
+ "memory.err.mergeGone": "The notes to merge no longer exist or have changed.",
618
+ "memory.err.modelNoDraft": "The model did not return a usable merge. You can merge by hand instead.",
619
+ "memory.err.mergeStale": "Notes changed. Suggest the merge again.",
620
+ "memory.err.editStale": "The note changed. Refresh, then edit again.",
621
+ "memory.err.deleteStale": "The note changed. Refresh the page.",
622
+ "memory.err.mergeEmpty": "The merged summary and body cannot be empty.",
623
+ "memory.err.unknownAction": "Unknown memory action.",
624
+ "memory.state.local": "Local only",
625
+ "memory.state.account": "Account changed · sync paused",
626
+ "memory.state.off": "Cloud sync off",
627
+ "memory.state.syncing": "Syncing…",
628
+ "memory.state.error": "Cloud sync needs attention",
629
+ "memory.state.on": "Cloud sync on",
630
+ "memory.stateHint.local": "Notes stay on this machine. Sign in to back them up and use them on your other devices.",
631
+ "memory.stateHint.account": "These notes were synced with a different account. Sign in to that account again, or use a separate notes folder for this one.",
632
+ "memory.stateHint.off": "Notes stay on this machine until you turn sync back on.",
633
+ "memory.stateHint.syncing": "Uploading changes here and fetching notes from your other devices.",
634
+ "memory.stateHint.error": "Notes on this machine are safe and still used. Syncing resumes once the problem below is fixed.",
635
+ "memory.stateHint.on": "Notes sync with your account automatically.",
636
+ "memory.counts": "{count} notes",
637
+ "memory.countsScoped": "{project} for this project · {user} of your own",
638
+ "memory.signIn": "Sign in",
639
+ "memory.notesTitle": "Notes ({count})",
640
+ "memory.emptyTitle": "No notes yet",
641
+ "memory.empty": "Ask the assistant to remember something in a conversation, for example \"remember that I prefer pnpm\". It saves a note here and uses it in later conversations when relevant.",
642
+ "memory.notesIntro": "What the assistant remembers between conversations. It saves a note when you ask it to remember something, and uses notes when they are relevant.",
643
+ "settings.section.workspace": "Workspace",
644
+ "settings.section.sync": "Sync & memory",
645
+ "settings.section.activity": "Activity & privacy",
646
+ "settings.section.advanced": "Advanced",
647
+ "memory.review": "To tidy ({count})",
648
+ "memory.reviewIntro": "Checked on this machine without a model. Nothing changes until you choose.",
649
+ "memory.reviewAutoOn": "Background merging is on: notes about the same subject are merged by the small model, at most once per cooldown. Every other finding waits for you.",
650
+ "memory.reviewLastAuto": "Last background pass {when}: merged {count} groups",
651
+ "memory.reviewNone": "Nothing to tidy.",
652
+ "memory.finding.duplicate": "{count} notes look like the same subject",
653
+ "memory.finding.dangling": "Links to notes that do not exist",
654
+ "memory.finding.stale-path": "Names files that are not in this project",
655
+ "memory.finding.unused": "Not recalled or edited for a long time",
656
+ "memory.finding.oversized": "Very long; consider splitting it",
657
+ "memory.mergeSuggest": "Suggest a merge",
658
+ "memory.mergeThinking": "Asking the model…",
659
+ "memory.mergeManual": "Merge by hand",
660
+ "memory.reviewOpen": "Show note",
661
+ "memory.reviewDismiss": "Dismiss",
662
+ "memory.mergeTitle": "Merge {count} notes",
663
+ "memory.mergeFromModel": "Drafted by the model. Check it before applying: anything left out is no longer in the note, though every original is backed up.",
664
+ "memory.mergeByHandHint": "Every original is combined below. Edit it into one note.",
665
+ "memory.mergeKeeps": "Kept, rewritten: ",
666
+ "memory.mergeRemoves": "Removed: ",
667
+ "memory.mergeApply": "Apply merge",
668
+ "memory.mergeCancel": "Cancel",
669
+ "memory.mergeConfirm": "Apply this merge? The originals are backed up and links to removed notes will point to the kept one. With cloud sync on, notes are synced first and the merge goes to the cloud before this machine.",
438
670
  },
439
671
  zh: {
440
672
  "nav.new": "新建会话",
@@ -447,6 +679,28 @@ export const STRINGS = {
447
679
  "tabs.close": "关闭标签页",
448
680
  "composer.placeholder": "描述一个任务…",
449
681
  "composer.attach": "添加文件、文件夹与连接器",
682
+ "effort.title": "思考强度",
683
+ "effort.tooltip": "推理强度",
684
+ "effort.faster": "更快",
685
+ "effort.smarter": "更聪明",
686
+ "effort.off": "关闭",
687
+ "effort.low": "低",
688
+ "effort.medium": "中",
689
+ "effort.high": "高",
690
+ "effort.xhigh": "超高",
691
+ "effort.max": "最高",
692
+ "effort.short.off": "关闭",
693
+ "effort.short.low": "低",
694
+ "effort.short.medium": "中",
695
+ "effort.short.high": "高",
696
+ "effort.short.xhigh": "超高",
697
+ "effort.short.max": "最高",
698
+ "effort.desc.off": "不推理,直接回答。",
699
+ "effort.desc.low": "回答快,少量思考。",
700
+ "effort.desc.medium": "平衡,适合大多数任务。",
701
+ "effort.desc.high": "在困难的多步任务上想得更久。更慢,也更贵。",
702
+ "effort.desc.xhigh": "为最难的问题做更长的推理。",
703
+ "effort.desc.max": "用尽模型的全部推理。最慢,也最贵。",
450
704
  "composer.workspace": "此会话运行的工作区",
451
705
  "add.attachFiles": "附加文件或图片",
452
706
  "add.attachFolders": "附加文件夹",
@@ -624,15 +878,20 @@ export const STRINGS = {
624
878
  "account.signedIn": "已登录",
625
879
  "account.dashboard": "面板",
626
880
  "account.download": "下载客户端",
881
+ "account.enterprise": "团队方案",
882
+ "account.contact": "联系我们",
627
883
  "theme.label": "主题",
628
884
  "theme.system": "跟随系统",
629
885
  "theme.light": "浅色",
630
886
  "theme.dark": "深色",
631
- "account.plan": "{plan} \u00b7 {status}",
632
887
  "account.noPlan": "未订阅",
633
888
  "account.getCredits": "订阅或充值",
634
- "account.team": "{team} · 团队余额 {credits} 点",
635
889
  "account.teamRefused": "{team} · 已不在这个团队",
890
+ "account.creditsUnit": "点",
891
+ "account.status.active": "生效中",
892
+ "account.status.trialing": "试用中",
893
+ "account.status.past_due": "扣款失败",
894
+ "account.status.canceled": "已取消",
636
895
  "account.teamUnnamed": "团队",
637
896
  "account.useTeam": "由 {team} 付费",
638
897
  "account.useOwn": "用我自己的套餐",
@@ -671,6 +930,37 @@ export const STRINGS = {
671
930
  "settings.auditExportAll": "导出全部",
672
931
  "settings.auditEmpty": "这个会话还没有记录。",
673
932
  "settings.auditMore": "另有 {n} 条更早的记录未显示。",
933
+ "settings.auditOpen": "查看",
934
+ "perms.title": "权限",
935
+ "perms.open": "查看",
936
+ "perms.hint": "什么直接执行、什么要停下来问、什么被拒绝,以及哪些目录可以写入。",
937
+ "perms.mode": "模式",
938
+ "perms.writes": "可写目录",
939
+ "perms.writesHint": "{n} 个可写目录 —— 这是对工具参数的策略检查,不是沙箱:shell 命令仍然能碰到你能碰到的任何路径。",
940
+ "perms.mine": "你配置的目录",
941
+ "perms.placeholder": "每行一个绝对路径",
942
+ "perms.save": "保存目录",
943
+ "perms.saved": "已保存 —— 下次启动生效。",
944
+ "perms.derivedAll": "这 {n} 个全部来自已安装的插件,每次启动时重新生成:",
945
+ "perms.derivedMore": "另有 {n} 个来自已安装的插件,每次启动时重新生成:",
946
+ "perms.noRules": "没有设置任何规则,每次调用都由上面的模式判定。",
947
+ "perms.more": "另有 {n} 条,在页面里。",
948
+ "perms.rootsCount": "{n} 个可写目录",
949
+ "audit.elsewhere": "更早的会话里有 {n} 条,在页面里。",
950
+ "preview.loading": "读取中…",
951
+ "audit.scope.session": "本会话",
952
+ "audit.scope.all": "全部会话",
953
+ "audit.filter.all": "全部",
954
+ "audit.filter.allowed": "已允许",
955
+ "audit.filter.denied": "已拒绝",
956
+ "audit.filter.unanswered": "未答复",
957
+ "audit.count": "{n} 条判定",
958
+ "audit.countOne": "1 条判定",
959
+ "audit.acrossSessions": "来自 {n} 个会话",
960
+ "audit.showMore": "显示更多",
961
+ "audit.noneAll": "本机还没有任何记录。",
962
+ "audit.noMatch": "没有符合该筛选条件的记录。",
963
+ "audit.capped": "只读取了最近的会话。其余的请用「导出全部」。",
674
964
  "settings.rules": "权限规则",
675
965
  "settings.rulesHint": "哪些操作可以直接执行、哪些会停下来询问、哪些直接拒绝。",
676
966
  "settings.files": "设置文件",
@@ -689,6 +979,14 @@ export const STRINGS = {
689
979
  "usage.value": "按模型和会话统计的 token、缓存命中与花费",
690
980
  "usage.hint": "统计自本机保存的对话记录。为了算出这些数字,不会向任何地方发送内容。",
691
981
  "usage.open": "查看",
982
+ "usage.range.custom": "自定义",
983
+ "usage.range.apply": "应用",
984
+ "usage.range.cancel": "取消",
985
+ "usage.range.previous": "上个月",
986
+ "usage.range.next": "下个月",
987
+ "usage.range.days": "{n} 天",
988
+ "usage.range.oneDay": "1 天",
989
+ "usage.range.pickEnd": "再选结束日期",
692
990
  "usage.back": "返回设置",
693
991
  "usage.tokens": "{n} tokens",
694
992
  "usage.cached": "{pct}% 命中缓存",
@@ -754,6 +1052,27 @@ export const STRINGS = {
754
1052
  "ask.tagBash": "执行命令",
755
1053
  "ask.tagFetch": "抓取网址",
756
1054
  "ask.tagCall": "工具调用",
1055
+ "ask.tagApp": "应用操作",
1056
+ "ask.rule": "规则 {rule}",
1057
+ "tool.cloudApps": "查看已启用的应用",
1058
+ "tool.cloudAppTools": "{app} · 可用工具",
1059
+ "tool.ask": "提问:{header}",
1060
+ "tool.catalogApps": "已启用 {n} 个应用:{names}",
1061
+ "tool.catalogTools": "{app}:{n} 个工具",
1062
+ "tool.rawResult": "原始结果",
1063
+ "question.other": "其他——输入你的答案",
1064
+ "question.multi": "可多选",
1065
+ "question.skip": "跳过",
1066
+ "question.keys": "1–9 选择 · Enter 继续",
1067
+ "question.back": "上一题",
1068
+ "question.next": "下一题",
1069
+ "question.submit": "提交",
1070
+ "question.answered": "已回答",
1071
+ "question.dismissed": "已跳过",
1072
+ "question.note": "附言:{note}",
1073
+ "question.aborted": "回合已中断,问题未回答",
1074
+ "question.unavailable": "当时无人可回答",
1075
+ "question.closed": "已在其他窗口处理",
757
1076
  "turn.fork": "从这里分叉",
758
1077
  "turn.copy": "复制",
759
1078
  "turn.copied": "已复制",
@@ -840,9 +1159,153 @@ export const STRINGS = {
840
1159
  "memory.summaryLabel": "摘要",
841
1160
  "memory.summaryHint": "模型不打开笔记就能看到的唯一一行。再写一次同样的摘要会更新这条,而不是新增一条。",
842
1161
  "memory.bodyLabel": "正文",
843
- "memory.bodyHint": "只有模型按 id 打开、或搜索命中这条时才会读到。",
1162
+ "memory.bodyHint": "摘要与当前消息相关时会自动附上,模型也可以按 id 打开。用 [[记忆 id]] 链接其它记忆。",
844
1163
  "memory.tagsLabel": "标签",
845
- "memory.tagsHint": "逗号分隔。搜索时与摘要、正文一起匹配。",
1164
+ "memory.tagsHint": "逗号分隔。补上别人可能用的其它说法,比如同义词或另一种语言的词;回忆按字词匹配,不理解含义。",
1165
+ "memory.recalled": "回忆了 {count} 条记忆:{list}",
1166
+ "memory.usage": "{count} / {max} 条",
1167
+ "memory.omitted": "有 {count} 条较旧的记忆超出上限,未加载",
1168
+ "memory.projectLocation": "这个项目的记忆",
1169
+ "memory.userLocation": "个人记忆,在所有项目中生效",
1170
+ "memory.scopeLabel": "范围",
1171
+ "memory.scopeHint": "项目记忆只属于这个代码库;个人记忆在所有项目中生效。",
1172
+ "memory.scopeProject": "项目",
1173
+ "memory.scopeUser": "个人",
1174
+ "memory.typeLabel": "类型",
1175
+ "memory.typeNone": "未指定",
1176
+ "memory.typeUser": "关于你",
1177
+ "memory.typeFeedback": "反馈",
1178
+ "memory.typeProject": "项目事实",
1179
+ "memory.typeReference": "外部资料",
1180
+ "memory.linksOut": "链接到",
1181
+ "memory.linksIn": "被引用于",
1182
+ "memory.missing": "没有这个 id 的记忆",
1183
+ "memory.confirmDeleteLinked": "有 {count} 条记忆链接到这条。",
1184
+ "memory.extracted": "已从这段对话中保存 {count} 条记忆:{list}",
1185
+ "memory.errorProject": "项目记忆:{message}",
1186
+ "memory.errorUser": "个人记忆:{message}",
1187
+ "memory.tierFree": "免费版:云同步中每个项目最多 {notes} 条,个人记忆最多 {notes} 条,单条不超过 {kb} KB。本机的记忆不受限制。",
1188
+ "memory.recentPulled": "{when} 从云端拉取:新增 {created} 条,修改 {updated} 条,删除 {deleted} 条,自动合并 {merged} 条",
1189
+ "memory.recentMerged": "自动合并:{summary}",
1190
+ "memory.conflictFields": "两边都改了{fields},无法自动合并。",
1191
+ "memory.field.summary": "摘要",
1192
+ "memory.field.body": "正文中相同或相邻的行",
1193
+ "memory.field.type": "类型",
1194
+ "memory.field.content": "这条记忆,且本机没有上次同步时的版本可供比较",
1195
+ "memory.fieldSeparator": "、",
1196
+ "memory.base": "上次同步时",
1197
+ "memory.keepBoth": "两份都留",
1198
+ "memory.mergeByHand": "手动合并",
1199
+ "memory.mergeSave": "保存合并结果",
1200
+ "memory.recentCreated": "新增:{summary}",
1201
+ "memory.recentUpdated": "修改:{summary}",
1202
+ "memory.recentDeleted": "删除:{summary}",
1203
+ "memory.backups": "备份({count})",
1204
+ "memory.backupsNone": "还没有备份。删除或替换记忆时,旧版本会保存在这里。",
1205
+ "memory.restore": "恢复",
1206
+ "memory.confirmRestore": "恢复这个版本?如果这条记忆之后又有改动,当前版本会先备份。",
1207
+ "memory.backupReason.delete": "在本页删除",
1208
+ "memory.backupReason.forget": "由模型删除",
1209
+ "memory.backupReason.conflict": "冲突时被云端版本替换",
1210
+ "memory.backupReason.sync-update": "被同步替换",
1211
+ "memory.backupReason.sync-delete": "被同步删除",
1212
+ "memory.backupReason.extract-update": "被自动抽取改写",
1213
+ "memory.backupReason.restore": "被恢复操作替换",
1214
+ "memory.backupReason.conflict-cloud": "冲突时未采用的云端版本",
1215
+ "memory.backupReason.auto-merge": "自动合并前的版本",
1216
+ "memory.backupReason.consolidate": "整理前的版本",
1217
+ "memory.aboutStorage": "存储位置与同步说明",
1218
+ "memory.err.configInvalid": "Memory 同步配置无效,已停止同步。",
1219
+ "memory.err.stopped": "Memory 同步已停止。",
1220
+ "memory.err.disabledHere": "这些记忆的云同步已手动关闭。",
1221
+ "memory.err.accountChanged": "登录账号或 Cloud 地址已改变,Memory 同步已暂停。",
1222
+ "memory.err.settingsChanged": "Memory 同步设置已改变。",
1223
+ "memory.err.localUnreadable": "本地记忆文件无法读取或格式无效,请检查记忆目录。同步已暂停,原文件未改动。",
1224
+ "memory.err.signInFirst": "请先登录 OHarness。",
1225
+ "memory.err.boundElsewhere": "此记忆目录已绑定另一账号或 Cloud。请使用独立的记忆目录,避免跨账号上传。",
1226
+ "memory.err.verifyFailed": "账号校验失败。",
1227
+ "memory.err.syncFailed": "同步失败。",
1228
+ "memory.err.invalidVersion": "同步服务返回了无效的版本。",
1229
+ "memory.err.waitForSync": "请等待同步结束。",
1230
+ "memory.err.stale": "记忆已在本机或其它设备改变,请同步后重试。",
1231
+ "memory.err.invalidBatch": "无效的批量修改。",
1232
+ "memory.err.batchTooLarge": "一次修改的记忆太多,请分批进行。",
1233
+ "memory.err.serverTooOld": "Sync 服务版本过旧,不支持个人记忆同步,请升级 Sync 服务。",
1234
+ "memory.err.accountSwitched": "账号已改变。",
1235
+ "memory.err.invalidChoice": "无效的冲突处理方式。",
1236
+ "memory.err.localChanged": "本地记忆已改变,请重新同步。",
1237
+ "memory.err.oneSideDeleted": "有一边已删除这条记忆,无法保留两份。",
1238
+ "memory.err.mergedMissing": "缺少合并后的内容。",
1239
+ "memory.err.secret": "记忆里似乎包含凭据,未保存。",
1240
+ "memory.err.secretFound": "记忆里似乎包含凭据({kinds}),未保存。",
1241
+ "memory.err.mergedSecret": "合并后的记忆里似乎包含凭据,未保存。",
1242
+ "memory.err.conflictsPending": "有 {count} 条记忆在两边都改过,改动重叠,无法自动合并,请选择保留哪一边;其余记忆已同步。",
1243
+ "memory.err.conflictsRemain": "还有冲突需要处理。",
1244
+ "memory.err.invalidResponse": "同步服务返回的数据无效。",
1245
+ "memory.err.signInAgain": "请重新登录 OHarness。",
1246
+ "memory.err.requestFailed": "Memory 云同步请求失败或已取消,可以重试。",
1247
+ "memory.err.cloudChanged": "云端版本已改变,请重新同步。",
1248
+ "memory.err.rateLimited": "同步过于频繁,稍后会自动重试。",
1249
+ "memory.err.serverNotConfigured": "Sync 服务尚未配置 Memory 鉴权或 R2 存储。",
1250
+ "memory.err.quotaExceeded": "超出 Sync 服务的记忆配额。",
1251
+ "memory.err.rejected": "同步请求被拒绝,请检查账号和 Sync 配置。",
1252
+ "memory.err.planLimit": "免费版的记忆云同步已达上限:项目记忆最多 {notes} 条,个人记忆最多 {notes} 条,单条不超过 {kb} KB。升级后不限条数和大小,本地记忆不受影响。",
1253
+ "memory.err.planLimitPlain": "免费版的记忆云同步已达上限,升级后不限条数和大小,本地记忆不受影响。",
1254
+ "memory.err.responseTooLarge": "同步响应过大。",
1255
+ "memory.err.principalMismatch": "同步响应属于另一个账号。",
1256
+ "memory.err.mergeGone": "要合并的记忆已不存在或已改变。",
1257
+ "memory.err.modelNoDraft": "模型没有给出可用的合并结果,可以改为手动合并。",
1258
+ "memory.err.mergeStale": "记忆已改变,请重新生成合并建议。",
1259
+ "memory.err.editStale": "记忆已改变,请刷新后编辑。",
1260
+ "memory.err.deleteStale": "记忆已改变,请刷新。",
1261
+ "memory.err.mergeEmpty": "合并后的摘要和正文不能为空。",
1262
+ "memory.err.unknownAction": "未知的 Memory 操作。",
1263
+ "memory.state.local": "仅保存在本机",
1264
+ "memory.state.account": "账号已变更 · 同步已暂停",
1265
+ "memory.state.off": "云同步已关闭",
1266
+ "memory.state.syncing": "正在同步…",
1267
+ "memory.state.error": "云同步出错",
1268
+ "memory.state.on": "云同步已开启",
1269
+ "memory.stateHint.local": "记忆只保存在这台电脑上。登录后可以备份到云端,并在其它设备上使用。",
1270
+ "memory.stateHint.account": "这些记忆之前与另一个账号同步。请重新登录原账号,或为当前账号使用单独的记忆目录。",
1271
+ "memory.stateHint.off": "记忆只保存在本机,重新开启后才会同步。",
1272
+ "memory.stateHint.syncing": "正在上传本机的改动,并获取其它设备上的记忆。",
1273
+ "memory.stateHint.error": "本机记忆不受影响,照常使用;解决下面的问题后会自动继续同步。",
1274
+ "memory.stateHint.on": "记忆会自动与账号同步。",
1275
+ "memory.counts": "{count} 条记忆",
1276
+ "memory.countsScoped": "本项目 {project} 条 · 个人 {user} 条",
1277
+ "memory.signIn": "登录",
1278
+ "memory.notesTitle": "记忆({count})",
1279
+ "memory.emptyTitle": "还没有记忆",
1280
+ "memory.empty": "在对话中让助手记住某件事,比如「记住我习惯用 pnpm」。它会把记忆保存在这里,之后相关时自动用上。",
1281
+ "memory.notesIntro": "助手在不同对话之间记住的内容。你让它记住某件事时会保存,相关时会自动用上。",
1282
+ "settings.section.workspace": "工作区",
1283
+ "settings.section.sync": "同步与记忆",
1284
+ "settings.section.activity": "记录与隐私",
1285
+ "settings.section.advanced": "高级",
1286
+ "memory.review": "待整理({count})",
1287
+ "memory.reviewIntro": "在本机检查,不调用模型。你确认之前不会改动任何记忆。",
1288
+ "memory.reviewAutoOn": "后台整理已开启:同一主题的记忆会由小模型自动合并,每个冷却周期最多一次。其它问题都等你处理。",
1289
+ "memory.reviewLastAuto": "上次后台整理 {when}:合并了 {count} 组",
1290
+ "memory.reviewNone": "没有需要整理的记忆。",
1291
+ "memory.finding.duplicate": "{count} 条记忆像是同一件事",
1292
+ "memory.finding.dangling": "链接到了不存在的记忆",
1293
+ "memory.finding.stale-path": "提到的文件在项目中已不存在",
1294
+ "memory.finding.unused": "很久没有被用到或修改",
1295
+ "memory.finding.oversized": "内容过长,建议拆分",
1296
+ "memory.mergeSuggest": "生成合并建议",
1297
+ "memory.mergeThinking": "正在生成…",
1298
+ "memory.mergeManual": "手动合并",
1299
+ "memory.reviewOpen": "查看",
1300
+ "memory.reviewDismiss": "忽略",
1301
+ "memory.mergeTitle": "合并 {count} 条记忆",
1302
+ "memory.mergeFromModel": "由模型起草。应用前请检查:没保留的内容会从记忆中去掉,但每条原记忆都有备份。",
1303
+ "memory.mergeByHandHint": "下面合并了全部原文,请整理成一条。",
1304
+ "memory.mergeKeeps": "保留并改写:",
1305
+ "memory.mergeRemoves": "删除:",
1306
+ "memory.mergeApply": "应用合并",
1307
+ "memory.mergeCancel": "取消",
1308
+ "memory.mergeConfirm": "确定应用合并吗?原记忆会先备份,指向被删记忆的链接会改为指向保留的那条。开启云同步时,会先同步,合并先写入云端再写入本机。",
846
1309
  },
847
1310
  };
848
1311
  /** Locales offered in the UI, in menu order. */