papilot 0.6.0 → 0.8.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 (85) hide show
  1. package/README.md +58 -30
  2. package/README.zh-CN.md +58 -30
  3. package/bin/doctor.mjs +53 -6
  4. package/bin/installation.d.mts +8 -0
  5. package/bin/installation.mjs +54 -0
  6. package/bin/papilot.mjs +6 -2
  7. package/dist/assets/_virtual_papilot-licenses-D7ro6ecN.js +7597 -0
  8. package/dist/assets/index-Cc-awdNn.css +1 -0
  9. package/dist/assets/index-D_VX51no.js +265 -0
  10. package/dist/assets/latex-BarqJFtQ.svg +1 -0
  11. package/dist/assets/{math-DY-H5SfX.js → math-V9uUaUzA.js} +1 -1
  12. package/dist/assets/pdf-view-Bnb2uIBE.js +598 -0
  13. package/dist/index.html +2 -2
  14. package/examples/papilot-paper/main.tex +1 -1
  15. package/examples/papilot-paper/sections/02-using.tex +3 -1
  16. package/examples/papilot-paper/sections/09-agents.tex +8 -5
  17. package/package.json +15 -7
  18. package/scripts/service.ts +1 -0
  19. package/skills/ai-review.md +18 -0
  20. package/skills/latex-warnings.md +1 -1
  21. package/src/conversation.ts +6 -0
  22. package/src/note-groups.ts +30 -0
  23. package/src/notes.ts +34 -10
  24. package/src/server/acp.ts +354 -0
  25. package/src/server/agents.ts +237 -47
  26. package/src/server/ai-review-routes.ts +72 -0
  27. package/src/server/ai-review.ts +38 -0
  28. package/src/server/annotation-placement.ts +99 -0
  29. package/src/server/app.ts +216 -21
  30. package/src/server/attachments.ts +128 -0
  31. package/src/server/build-problems.ts +329 -0
  32. package/src/server/changes.ts +28 -2
  33. package/src/server/codex.ts +2 -1
  34. package/src/server/cursor.ts +153 -0
  35. package/src/server/diagnostics.ts +45 -0
  36. package/src/server/git-overview.ts +69 -0
  37. package/src/server/imports.ts +205 -0
  38. package/src/server/latex-installation.ts +43 -0
  39. package/src/server/main.ts +8 -42
  40. package/src/server/manuscript.ts +212 -12
  41. package/src/server/note-results.ts +65 -0
  42. package/src/server/paths.ts +1 -1
  43. package/src/server/references.ts +70 -0
  44. package/src/server/review.ts +6 -5
  45. package/src/server/skill-library.ts +113 -0
  46. package/src/server/skill-routes.ts +19 -0
  47. package/src/server/skills.ts +29 -19
  48. package/src/server/start.ts +51 -0
  49. package/src/server/store.ts +44 -4
  50. package/src/server/update-install.ts +124 -0
  51. package/src/server/update-worker.ts +78 -0
  52. package/src/server/updates.ts +152 -0
  53. package/src/server/workspace.ts +450 -60
  54. package/src/shared.ts +120 -10
  55. package/src/skill-icons.ts +18 -0
  56. package/src/skill-metadata.ts +45 -0
  57. package/src/task-caption.ts +20 -0
  58. package/vendor/latex-review/dist/web/assets/index-7VKAte5x.js +19 -0
  59. package/vendor/latex-review/dist/web/assets/index-DEz-LsGl.css +1 -0
  60. package/vendor/latex-review/dist/web/index.html +2 -2
  61. package/vendor/latex-review/src/core/bib.ts +692 -0
  62. package/vendor/latex-review/src/core/build.ts +5 -1
  63. package/vendor/latex-review/src/core/changes.ts +39 -0
  64. package/vendor/latex-review/src/core/delivery.ts +109 -0
  65. package/vendor/latex-review/src/core/review.ts +12 -4
  66. package/vendor/latex-review/src/core/store.ts +3 -0
  67. package/vendor/latex-review/src/core/tasks.ts +5 -2
  68. package/vendor/latex-review/src/core/verify.ts +784 -0
  69. package/vendor/latex-review/src/core/view.ts +204 -0
  70. package/vendor/latex-review/src/render/round.ts +11 -0
  71. package/vendor/latex-review/src/server.ts +81 -1
  72. package/vendor/latex-review/src/types.ts +141 -0
  73. package/vendor/latex-review/src/web/effect-preferences.ts +10 -0
  74. package/vendor/latex-review/src/web/i18n.ts +1 -1
  75. package/vendor/latex-review/src/web/overview.tsx +1 -5
  76. package/vendor/latex-review/src/web/references.tsx +499 -0
  77. package/vendor/latex-review/src/web/review.tsx +381 -230
  78. package/vendor/latex-review/src/web/shortcuts.ts +53 -0
  79. package/vendor/latex-review/src/web/style.css +295 -0
  80. package/vendor/latex-review/src/web/zh-CN.ts +95 -26
  81. package/dist/assets/index-BNGqA0_L.css +0 -1
  82. package/dist/assets/index-Bt9UXsGX.js +0 -222
  83. package/dist/assets/pdf-view-BGp3W-RG.js +0 -598
  84. package/vendor/latex-review/dist/web/assets/index-AFBj4gQ9.js +0 -19
  85. package/vendor/latex-review/dist/web/assets/index-DfC0GURl.css +0 -1
@@ -0,0 +1,53 @@
1
+ // Shared by the standalone review and its host's shortcut settings.
2
+ export const SHORTCUT_STORAGE = 'latex-review:shortcuts';
3
+ export const SHORTCUT_EVENT = 'latex-review:shortcuts-changed';
4
+ export const defaults = {
5
+ accept: ['a'], reject: ['r'], comment: ['c'], next: ['j', 'ArrowRight'],
6
+ previous: ['k', 'ArrowLeft'], pending: ['n'], source: ['s'], undo: ['u'], help: ['?'],
7
+ };
8
+ export type ShortcutAction = keyof typeof defaults;
9
+ export type Shortcuts = Record<ShortcutAction, string[]>;
10
+ export const shortcutActions = Object.keys(defaults) as ShortcutAction[];
11
+ type KeyEvent = Pick<KeyboardEvent, 'key' | 'ctrlKey' | 'metaKey' | 'altKey' | 'shiftKey' | 'isComposing'>;
12
+
13
+ export function keyBinding(event: KeyEvent): string | null {
14
+ if (event.isComposing || ['Control', 'Meta', 'Alt', 'Shift', 'Dead', 'Unidentified', 'Process'].includes(event.key)) return null;
15
+ const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;
16
+ // Punctuation already carries Shift in event.key (for example, '?').
17
+ return [event.ctrlKey && 'Ctrl', event.metaKey && 'Meta', event.altKey && 'Alt', event.shiftKey && (/^[a-z]$/.test(key) || key.length > 1) && 'Shift', key].filter(Boolean).join('+');
18
+ }
19
+
20
+ export function validBinding(binding: string): boolean {
21
+ return /^(?:(?:Ctrl|Meta|Alt|Shift)\+)*(?:[a-z0-9?/,.;'\[\]`=\-]|Arrow(?:Left|Right|Up|Down))$/.test(binding);
22
+ }
23
+
24
+ // Leave text editing, browser navigation and dialog keys with the browser.
25
+ export function reservedBinding(binding: string): boolean {
26
+ return !validBinding(binding) || /^(?:Ctrl|Meta)\+(?:Shift\+)?[acflnpqrstuvwxz=\-]$/.test(binding)
27
+ || /^(?:Alt|Meta)\+Arrow(?:Left|Right)$/.test(binding);
28
+ }
29
+
30
+ export function resolveShortcuts(value: unknown): Shortcuts {
31
+ const saved = value && typeof value === 'object' ? value as Partial<Shortcuts> : {};
32
+ return Object.fromEntries(shortcutActions.map(action => {
33
+ const keys = saved[action];
34
+ return [action, Array.isArray(keys) && keys.length <= 4 && keys.every(key => typeof key === 'string' && !reservedBinding(key)) ? [...new Set(keys)] : [...defaults[action]]];
35
+ })) as Shortcuts;
36
+ }
37
+
38
+ export function parseShortcuts(value: string | null): Shortcuts {
39
+ try { return resolveShortcuts(JSON.parse(value || '{}')); } catch { return resolveShortcuts({}); }
40
+ }
41
+
42
+ export function readShortcuts(): Shortcuts {
43
+ try { return parseShortcuts(localStorage.getItem(SHORTCUT_STORAGE)); } catch { return resolveShortcuts({}); }
44
+ }
45
+
46
+ export function shortcutAction(event: KeyEvent, shortcuts: Shortcuts): ShortcutAction | undefined {
47
+ const binding = keyBinding(event);
48
+ return binding ? shortcutActions.find(action => shortcuts[action].includes(binding)) : undefined;
49
+ }
50
+
51
+ export function bindingLabel(binding: string): string {
52
+ return binding.split('+').map(key => ({ Meta: '⌘', Ctrl: 'Ctrl', Alt: 'Alt', Shift: 'Shift', ArrowRight: '→', ArrowLeft: '←', ArrowUp: '↑', ArrowDown: '↓' })[key] || key.toUpperCase()).join('+');
53
+ }
@@ -32,6 +32,11 @@
32
32
  --after: #eef8f1;
33
33
  --after-edge: #68ab82;
34
34
  --head: #fafafa;
35
+ --warn: #8a5300;
36
+ --warn-soft: #fff8e6;
37
+ --warn-line: #f1d48c;
38
+ --ok-soft: #eef8f1;
39
+ --bad-soft: #fbeeee;
35
40
  --shadow: 0 1px 2px rgb(0 0 0 / 0.06), 0 4px 18px rgb(0 0 0 / 0.05);
36
41
  --paper-top: 24px;
37
42
  font: 14px/1.5 var(--sans);
@@ -151,6 +156,16 @@ kbd {
151
156
  white-space: nowrap;
152
157
  font-variant-numeric: tabular-nums;
153
158
  }
159
+ .review-progress {
160
+ flex: none;
161
+ min-height: 28px;
162
+ padding: 0 2px;
163
+ line-height: 1;
164
+ }
165
+ .review-progress-value {
166
+ color: var(--ink);
167
+ font-weight: 500;
168
+ }
154
169
  .track {
155
170
  width: 120px;
156
171
  height: 2px;
@@ -432,6 +447,14 @@ kbd {
432
447
  .effects-head {
433
448
  font-weight: 600;
434
449
  }
450
+ .effects-toggle {
451
+ font: inherit;
452
+ color: inherit;
453
+ }
454
+ .effects-toggle:focus-visible {
455
+ outline: 2px solid var(--accent);
456
+ outline-offset: 3px;
457
+ }
435
458
  .more-places {
436
459
  margin: 6px 14px 0;
437
460
  font-size: 12px;
@@ -579,6 +602,278 @@ kbd {
579
602
  text-decoration: none;
580
603
  }
581
604
 
605
+ /* Bibliography entries of a .bib change, every field shown, with what the
606
+ online check found. */
607
+ .references {
608
+ border-top: 1px solid var(--line);
609
+ background: var(--paper);
610
+ }
611
+ .reference-entry {
612
+ padding: 10px 14px 12px;
613
+ border-left: 3px solid var(--line);
614
+ }
615
+ .reference-entry + .reference-entry {
616
+ border-top: 1px solid var(--line);
617
+ }
618
+ .reference-entry[data-check="verified"],
619
+ .reference-entry[data-check="confirmed"] {
620
+ border-left-color: var(--accept);
621
+ }
622
+ .reference-entry[data-check="mismatch"],
623
+ .reference-entry[data-check="unreadable"] {
624
+ border-left-color: var(--reject);
625
+ }
626
+ /* Not found is a reason to look, not proof of an error: amber, not red. */
627
+ .reference-entry[data-check="unverified"],
628
+ .reference-entry[data-check="failed"],
629
+ .reference-entry[data-check="skipped"],
630
+ .reference-entry[data-check="off"],
631
+ .reference-entry[data-check="checking"] {
632
+ border-left-color: var(--warn-line);
633
+ }
634
+ .reference-head {
635
+ display: flex;
636
+ flex-wrap: wrap;
637
+ align-items: baseline;
638
+ gap: 4px 10px;
639
+ margin-bottom: 6px;
640
+ }
641
+ .reference-key {
642
+ font:
643
+ 600 12.5px ui-monospace,
644
+ SFMono-Regular,
645
+ Menlo,
646
+ monospace;
647
+ overflow-wrap: anywhere;
648
+ }
649
+ .reference-key del,
650
+ .reference-entry td del {
651
+ background: var(--bad-soft);
652
+ color: var(--reject);
653
+ text-decoration: line-through;
654
+ }
655
+ .reference-key ins,
656
+ .reference-entry td ins {
657
+ background: var(--ok-soft);
658
+ color: var(--accept);
659
+ text-decoration: none;
660
+ }
661
+ .reference-status {
662
+ font-size: 12px;
663
+ color: var(--muted);
664
+ }
665
+ .reference-check {
666
+ font-size: 12px;
667
+ font-weight: 600;
668
+ padding: 0 7px;
669
+ border-radius: 999px;
670
+ border: 1px solid var(--line);
671
+ white-space: nowrap;
672
+ }
673
+ .reference-check[data-check="verified"],
674
+ .reference-check[data-check="confirmed"] {
675
+ color: var(--accept);
676
+ background: var(--ok-soft);
677
+ border-color: transparent;
678
+ }
679
+ .reference-check[data-check="mismatch"] {
680
+ color: var(--reject);
681
+ background: var(--bad-soft);
682
+ border-color: transparent;
683
+ }
684
+ .reference-check[data-check="unverified"],
685
+ .reference-check[data-check="failed"],
686
+ .reference-check[data-check="skipped"],
687
+ .reference-check[data-check="off"],
688
+ .reference-check[data-check="checking"] {
689
+ color: var(--warn);
690
+ background: var(--warn-soft);
691
+ border-color: transparent;
692
+ }
693
+ .reference-lines {
694
+ margin-left: auto;
695
+ font:
696
+ 11px ui-monospace,
697
+ SFMono-Regular,
698
+ Menlo,
699
+ monospace;
700
+ color: var(--muted);
701
+ }
702
+ .reference-problem {
703
+ margin: 4px 0 8px;
704
+ padding: 6px 10px;
705
+ border-radius: 6px;
706
+ background: var(--bad-soft);
707
+ color: var(--reject);
708
+ font-size: 13px;
709
+ }
710
+ .reference-uncited {
711
+ margin: 0;
712
+ border-radius: 0;
713
+ border-top: 1px solid var(--line);
714
+ }
715
+ .reference-fields {
716
+ width: 100%;
717
+ border-collapse: collapse;
718
+ font:
719
+ 12.5px/1.55 ui-monospace,
720
+ SFMono-Regular,
721
+ Menlo,
722
+ monospace;
723
+ }
724
+ .reference-fields th {
725
+ width: 1%;
726
+ padding: 2px 12px 2px 0;
727
+ text-align: left;
728
+ vertical-align: top;
729
+ font-weight: 400;
730
+ color: var(--muted);
731
+ white-space: nowrap;
732
+ }
733
+ .reference-fields td {
734
+ padding: 2px 0;
735
+ overflow-wrap: anywhere;
736
+ }
737
+ .reference-entry[data-status="modified"] tr:not([data-change]) td {
738
+ color: var(--muted);
739
+ }
740
+ .reference-entry[data-status="removed"] td {
741
+ text-decoration: line-through;
742
+ text-decoration-color: var(--reject);
743
+ color: var(--muted);
744
+ }
745
+ .reference-resolved {
746
+ color: var(--muted);
747
+ }
748
+ .reference-cited {
749
+ margin: 6px 0 0;
750
+ font-size: 12px;
751
+ color: var(--muted);
752
+ }
753
+ .reference-verdict {
754
+ margin-top: 8px;
755
+ padding: 8px 10px;
756
+ border-radius: 6px;
757
+ background: var(--head);
758
+ font-size: 13px;
759
+ }
760
+ .reference-verdict p {
761
+ margin: 0;
762
+ }
763
+ .reference-verdict[data-check="mismatch"] {
764
+ background: var(--bad-soft);
765
+ }
766
+ .reference-verdict[data-check="unverified"],
767
+ .reference-verdict[data-check="failed"],
768
+ .reference-verdict[data-check="off"],
769
+ .reference-verdict[data-check="skipped"] {
770
+ background: var(--warn-soft);
771
+ }
772
+ .reference-differences {
773
+ display: grid;
774
+ grid-template-columns: auto 1fr;
775
+ gap: 6px 12px;
776
+ margin: 8px 0 0;
777
+ }
778
+ .reference-differences dt {
779
+ font-weight: 600;
780
+ white-space: nowrap;
781
+ }
782
+ .reference-differences dd {
783
+ margin: 0;
784
+ display: grid;
785
+ gap: 2px;
786
+ min-width: 0;
787
+ overflow-wrap: anywhere;
788
+ }
789
+ .reference-side {
790
+ display: inline-block;
791
+ min-width: 5.5em;
792
+ margin-right: 6px;
793
+ font-size: 11px;
794
+ letter-spacing: 0.02em;
795
+ color: var(--muted);
796
+ }
797
+ .reference-record {
798
+ margin: 8px 0 0 !important;
799
+ overflow-wrap: anywhere;
800
+ }
801
+ .reference-record a {
802
+ color: var(--accent);
803
+ }
804
+ .reference-confirmation {
805
+ margin: 8px 0 0 !important;
806
+ }
807
+ .reference-confirm {
808
+ border: 1px solid var(--line);
809
+ background: var(--paper);
810
+ border-radius: 6px;
811
+ padding: 3px 10px;
812
+ font-size: 12.5px;
813
+ }
814
+ .reference-entry[data-check="confirmed"] .reference-verdict {
815
+ background: var(--head);
816
+ }
817
+ .references-banner summary strong {
818
+ font-weight: 600;
819
+ }
820
+ .references-flagged {
821
+ margin: 6px 0 2px;
822
+ padding-left: 18px;
823
+ }
824
+ .references-flagged li + li {
825
+ margin-top: 3px;
826
+ }
827
+ .references-confirm ul {
828
+ margin: 0 0 12px;
829
+ padding-left: 18px;
830
+ font-size: 13px;
831
+ }
832
+ .references-confirm li + li {
833
+ margin-top: 4px;
834
+ }
835
+ .references-confirm code {
836
+ font-size: 12.5px;
837
+ overflow-wrap: anywhere;
838
+ }
839
+ .references-confirm-actions {
840
+ display: flex;
841
+ justify-content: flex-end;
842
+ gap: 8px;
843
+ flex-wrap: wrap;
844
+ }
845
+ .references-confirm-actions .accept {
846
+ color: var(--accept);
847
+ font-weight: 600;
848
+ }
849
+ @media (max-width: 560px) {
850
+ .reference-fields,
851
+ .reference-fields tbody,
852
+ .reference-fields tr,
853
+ .reference-fields th,
854
+ .reference-fields td {
855
+ display: block;
856
+ width: auto;
857
+ }
858
+ .reference-fields tr + tr {
859
+ margin-top: 4px;
860
+ }
861
+ .reference-fields th {
862
+ padding: 0;
863
+ font-size: 11px;
864
+ }
865
+ .reference-differences {
866
+ grid-template-columns: 1fr;
867
+ gap: 2px;
868
+ }
869
+ .reference-differences dd + dt {
870
+ margin-top: 6px;
871
+ }
872
+ .reference-lines {
873
+ margin-left: 0;
874
+ }
875
+ }
876
+
582
877
  /* Messages above the document */
583
878
  .banner {
584
879
  max-width: 980px;
@@ -1,5 +1,9 @@
1
1
  // Simplified Chinese for the review viewer, keyed by the English text.
2
2
  export const zhCN: Record<string, string> = {
3
+ "Accepted changes are saved in this task. Choose where to save them below.": "已接受的改动保存在此任务中,请在下方选择保存方式。",
4
+ "Accepted changes are committed to the task branch.": "已接受的改动已提交到任务分支。",
5
+ "There are no accepted changes to save.": "没有需要保存的已接受改动。",
6
+
3
7
  // Overview
4
8
  "All reviews": "全部审阅",
5
9
  "Search reviews": "搜索审阅",
@@ -39,34 +43,27 @@ export const zhCN: Record<string, string> = {
39
43
  "Rendering the diff": "正在生成差异",
40
44
  Starting: "正在启动",
41
45
  "Queued…": "排队中…",
42
- "Queued behind {n} other round…": "排在另外 {n} 轮之后…",
43
- "Queued behind {n} other rounds…": "排在另外 {n} 轮之后…",
44
- "Round {round} is ready": "第 {round} 轮已就绪",
46
+ "Queued behind {n} update…": "前面还有 {n} 项更新…",
47
+ "Queued behind {n} updates…": "前面还有 {n} 项更新…",
48
+ "Changes are ready": "修改已就绪",
45
49
 
46
50
  // Toolbar
47
- "Round {round}": "第 {round} 轮",
48
- " (earlier round)": "(较早的轮次)",
49
- " (latest)": "(最新)",
51
+ "Current changes": "当前修改",
50
52
  "{decided} of {total} decided": "已决定 {decided}/{total}",
51
53
  "Accept all ({n})": "全部接受({n})",
52
54
  "Reject all ({n})": "全部拒绝({n})",
53
55
  "Accept all": "全部接受",
54
56
  "Reject all": "全部拒绝",
55
- "Accept the {n} undecided change in this round. Decided and commented changes stay as they are. Undo reverses the whole batch.":
56
- "接受本轮 {n} 处待定修改。已决定和已评论的修改保持不变。撤销会还原整批操作。",
57
- "Accept the {n} undecided changes in this round. Decided and commented changes stay as they are. Undo reverses the whole batch.":
58
- "接受本轮 {n} 处待定修改。已决定和已评论的修改保持不变。撤销会还原整批操作。",
59
- "Reject the {n} undecided change in this round. Decided and commented changes stay as they are. Undo reverses the whole batch.":
60
- "拒绝本轮 {n} 处待定修改。已决定和已评论的修改保持不变。撤销会还原整批操作。",
61
- "Reject the {n} undecided changes in this round. Decided and commented changes stay as they are. Undo reverses the whole batch.":
62
- "拒绝本轮 {n} 处待定修改。已决定和已评论的修改保持不变。撤销会还原整批操作。",
57
+ "Accept {n} undecided change": "接受 {n} 处待定修改",
58
+ "Accept {n} undecided changes": "接受 {n} 处待定修改",
59
+ "Reject {n} undecided change": "拒绝 {n} 处待定修改",
60
+ "Reject {n} undecided changes": "拒绝 {n} 处待定修改",
63
61
  "Reconnecting…": "正在重新连接…",
64
62
  Finished: "已结束",
65
63
  History: "历史",
66
- "Earlier decisions and rounds": "之前的决定和轮次",
64
+ "Review history": "审阅历史",
67
65
  "Keyboard shortcuts": "键盘快捷键",
68
66
  "Review view": "审阅视图",
69
- "Review round": "审阅轮次",
70
67
  "Undo {action} · {changes}": "撤销{action} · {changes}",
71
68
  "Change {list}": "修改 {list}",
72
69
  "Changes {list}": "修改 {list}",
@@ -86,7 +83,7 @@ export const zhCN: Record<string, string> = {
86
83
  Comment: "评论",
87
84
  "Next undecided": "下一处待定",
88
85
  "Review complete": "审阅完成",
89
- "Earlier round": "较早的轮次",
86
+ "Earlier changes": "之前的修改",
90
87
  Text: "文本",
91
88
  Layout: "版式",
92
89
  Moved: "位置移动",
@@ -102,8 +99,7 @@ export const zhCN: Record<string, string> = {
102
99
  "Copy reference": "复制引用",
103
100
  "Show the LaTeX source (S)": "显示 LaTeX 源码(S)",
104
101
  "{n} edits · LaTeX": "{n} 处编辑 · LaTeX",
105
- "Revised after your comment in round {round}: ":
106
- "根据你在第 {round} 轮的评论修订:",
102
+ "Revised after your comment: ": "根据你的评论修订:",
107
103
  "No visible change in the PDF; see the LaTeX source.":
108
104
  "PDF 中没有可见变化,请查看 LaTeX 源码。",
109
105
  "Continued: only line breaks moved here.": "续:这里只有换行位置变化。",
@@ -122,23 +118,21 @@ export const zhCN: Record<string, string> = {
122
118
  "Unchanged text": "未修改的文本",
123
119
  "Unchanged text is folded": "未修改的文本已折叠",
124
120
  "Other changes": "其他修改",
125
- Changes: "修改",
126
- "This round has no changes.": "本轮没有修改。",
121
+ "No changes to review.": "没有待审阅的修改。",
127
122
 
128
123
  // Banners and status
129
124
  "This review is finished. Accepted changes are in your manuscript.":
130
125
  "本次审阅已结束。已接受的修改已写入你的稿件。",
131
126
  "The latest publish failed: ": "最近一次发布失败:",
132
- "The agent is publishing a new round. You can keep reviewing; the new round will include your decisions.":
133
- "智能体正在发布新一轮。你可以继续审阅,新一轮会保留你的决定。",
134
- "You are viewing round {round}.": "你正在查看第 {round} 轮。",
135
- "Go to round {round} →": "前往第 {round} 轮 →",
127
+ "Updating changes…": "正在更新修改…",
128
+ "Viewing earlier changes.": "正在查看之前的修改。",
129
+ "Back to current changes →": "返回当前修改 →",
136
130
  "{n} new LaTeX warning": "{n} 条新的 LaTeX 警告",
137
131
  "{n} new LaTeX warnings": "{n} 条新的 LaTeX 警告",
138
132
  "Agent needs your input": "智能体需要你的回复",
139
133
  "Feedback queued": "反馈已排队",
140
134
  "Feedback sent · Agent is working": "反馈已发送 · 智能体正在处理",
141
- "Preparing the next review…": "正在准备下一轮审阅…",
135
+ "Preparing the next review…": "正在准备修改…",
142
136
  "All changes reviewed": "所有修改均已审阅",
143
137
  "Open Chat to answer the agent's question.": "打开对话回答智能体的问题。",
144
138
  "New changes will appear here when ready.": "新的修改准备好后会显示在这里。",
@@ -225,4 +219,79 @@ export const zhCN: Record<string, string> = {
225
219
  "Finish or abort the merge in the Git panel before staging or reverting changes.":
226
220
  "请先在 Git 面板中完成或中止合并,再暂存或还原修改。",
227
221
  "The last commit changed. The comparison is being updated.": "上次提交已变化,正在更新比较。",
222
+
223
+ // Bibliography entries and their online checks
224
+ Bibliography: "参考文献",
225
+ Title: "标题",
226
+ Authors: "作者",
227
+ Year: "年份",
228
+ DOI: "DOI",
229
+ arXiv: "arXiv",
230
+ "New entry": "新增条目",
231
+ "Changed entry": "修改的条目",
232
+ "Removed entry": "删除的条目",
233
+ Verified: "已核实",
234
+ "Differs from the record": "与记录有出入",
235
+ "Not verified": "未核实",
236
+ "Could not check": "未能核对",
237
+ "Nothing to check": "无从核对",
238
+ "Checking…": "核对中…",
239
+ "Not checked online": "未联网核对",
240
+ "The paper still cites this key, and no entry defines it now.":
241
+ "正文仍在引用这个 key,但现在没有条目定义它。",
242
+ "Another entry in the bibliography has the same key.": "参考文献里还有一个条目用了同一个 key。",
243
+ "BibTeX cannot read this entry.": "BibTeX 读不了这个条目。",
244
+ "The paper does not use this .bib file, so the entry will not appear.":
245
+ "论文没有用到这个 .bib 文件,这个条目不会出现在参考文献里。",
246
+ "No bibliography entry has this key.": "没有参考文献条目用这个 key。",
247
+ "Cited {n} time: {places}": "正文引用 {n} 处:{places}",
248
+ "Cited {n} times: {places}": "正文引用 {n} 处:{places}",
249
+ "Not cited in the paper, so it does not appear in the PDF.": "正文没有引用,所以不会出现在 PDF 里。",
250
+ "{sources} could not be reached.": "无法访问 {sources}。",
251
+ "Looking this entry up in Crossref, DBLP and arXiv…": "正在 Crossref、DBLP 和 arXiv 中查找这个条目…",
252
+ "Online checks are off in Settings, so this entry was not looked up.":
253
+ "设置里关闭了联网核对,这个条目没有查找。",
254
+ "Matches the record in {source}, apart from the small differences below.":
255
+ "与 {source} 的记录一致,只有下面几处小差别。",
256
+ "Matches the record in {source}.": "与 {source} 的记录一致。",
257
+ "{source} has this work with other details. Compare them below.":
258
+ "{source} 里有这篇文献,但信息不一样,请对照下面几项。",
259
+ "The DOI is not registered, and no record matches the title.": "这个 DOI 没有注册,按标题也没有找到对应记录。",
260
+ "No arXiv paper has this identifier, and no record matches the title.":
261
+ "arXiv 上没有这个编号的论文,按标题也没有找到对应记录。",
262
+ "No record in Crossref, DBLP or arXiv matches this entry. Theses, reports and many books are in none of them, so check it yourself.":
263
+ "Crossref、DBLP 和 arXiv 中都没有与这个条目对应的记录。学位论文、技术报告和很多书都不在这些库里,请自己核对。",
264
+ "The sources could not be reached.": "无法访问这些数据源。",
265
+ "The entry has no title, DOI or arXiv identifier to look up.": "这个条目没有标题、DOI 或 arXiv 编号,无从查找。",
266
+ "Check again": "重新核对",
267
+ small: "小差别",
268
+ Entry: "条目",
269
+ Record: "记录",
270
+ "(not registered)": "(未注册)",
271
+ "(no such paper)": "(没有这篇论文)",
272
+ "Closest record": "最接近的记录",
273
+ "{n} entry changed": "{n} 个条目有改动",
274
+ "{n} entries changed": "{n} 个条目有改动",
275
+ "{n} citation without an entry": "{n} 处引用没有对应条目",
276
+ "{n} citations without an entry": "{n} 处引用没有对应条目",
277
+ "{n} verified": "{n} 个已核实",
278
+ "{n} differs from its record": "{n} 个与记录有出入",
279
+ "{n} differ from their records": "{n} 个与记录有出入",
280
+ "{n} not verified": "{n} 个未核实",
281
+ "{n} could not be checked": "{n} 个未能核对",
282
+ "checking {n}…": "核对中 {n} 个…",
283
+ "online checks are off": "联网核对已关闭",
284
+ "Stage bibliography entries that are not verified?": "暂存未核实的参考文献条目?",
285
+ "Accept bibliography entries that are not verified?": "接受未核实的参考文献条目?",
286
+ "An agent can write an entry for a work that does not exist, or with the wrong authors, year or DOI. Check each one before it goes into your paper.":
287
+ "agent 可能写出根本不存在的文献,或者写错作者、年份、DOI。放进论文之前请逐条确认。",
288
+ "Stage anyway": "仍然暂存",
289
+ "Accept anyway": "仍然接受",
290
+ "Cites {key}, which no bibliography entry defines.": "引用了 {key},但没有参考文献条目定义它。",
291
+ "Leaves {n} change with bibliography entries to check.": "留下 {n} 处含待核对参考文献的改动。",
292
+ "Leaves {n} changes with bibliography entries to check.": "留下 {n} 处含待核对参考文献的改动。",
293
+ "Checked by you": "已人工确认",
294
+ "You checked this entry yourself.": "你已人工确认过这个条目。",
295
+ "I checked it myself": "我已人工确认",
296
+ "{n} checked by you": "{n} 个已人工确认",
228
297
  };