papilot 0.0.0-stage → 0.1.1

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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -2
  3. package/README.zh-CN.md +127 -0
  4. package/bin/papilot.mjs +113 -0
  5. package/dist/apple-touch-icon.png +0 -0
  6. package/dist/assets/Inconsolatazi4-Regular-Dbtq7t_r.otf +0 -0
  7. package/dist/assets/TeXGyrePagellaX-Bold-CEtYdOXj.otf +0 -0
  8. package/dist/assets/TeXGyrePagellaX-Italic-CSuYIstn.otf +0 -0
  9. package/dist/assets/TeXGyrePagellaX-Regular-DQJjZE_L.otf +0 -0
  10. package/dist/assets/cursor-editorTextHighlight-kG3uUOwL.svg +8 -0
  11. package/dist/assets/index-BhQFCMTx.js +131 -0
  12. package/dist/assets/index-CAV3-87U.css +1 -0
  13. package/dist/assets/pdf-view-DJo0X38w.js +598 -0
  14. package/dist/assets/pdf.worker.min-CjEcRF4W.mjs +28 -0
  15. package/dist/favicon.png +0 -0
  16. package/dist/index.html +4 -0
  17. package/examples/papilot-paper/.latex-review.json +4 -0
  18. package/examples/papilot-paper/appendix/proofs.tex +60 -0
  19. package/examples/papilot-paper/appendix/reference.tex +54 -0
  20. package/examples/papilot-paper/main.tex +57 -0
  21. package/examples/papilot-paper/preamble.tex +53 -0
  22. package/examples/papilot-paper/references.bib +158 -0
  23. package/examples/papilot-paper/sections/01-introduction.tex +66 -0
  24. package/examples/papilot-paper/sections/02-using.tex +134 -0
  25. package/examples/papilot-paper/sections/03-background.tex +97 -0
  26. package/examples/papilot-paper/sections/04-model.tex +185 -0
  27. package/examples/papilot-paper/sections/05-conflicts.tex +99 -0
  28. package/examples/papilot-paper/sections/06-building.tex +70 -0
  29. package/examples/papilot-paper/sections/07-geometry.tex +193 -0
  30. package/examples/papilot-paper/sections/08-notes.tex +104 -0
  31. package/examples/papilot-paper/sections/09-agents.tex +106 -0
  32. package/examples/papilot-paper/sections/10-usage.tex +56 -0
  33. package/examples/papilot-paper/sections/11-git.tex +62 -0
  34. package/examples/papilot-paper/sections/12-security.tex +41 -0
  35. package/examples/papilot-paper/sections/13-evaluation.tex +106 -0
  36. package/examples/papilot-paper/sections/14-related.tex +38 -0
  37. package/examples/papilot-paper/sections/15-conclusion.tex +27 -0
  38. package/package.json +85 -4
  39. package/scripts/demo.ts +21 -0
  40. package/scripts/service.ts +35 -0
  41. package/src/notes.ts +40 -0
  42. package/src/server/agents.ts +343 -0
  43. package/src/server/codex.ts +63 -0
  44. package/src/server/frontend.ts +15 -0
  45. package/src/server/main.ts +202 -0
  46. package/src/server/manuscript.ts +337 -0
  47. package/src/server/paths.ts +11 -0
  48. package/src/server/pdf.ts +27 -0
  49. package/src/server/review.ts +53 -0
  50. package/src/server/security.ts +15 -0
  51. package/src/server/store.ts +60 -0
  52. package/src/server/workspace.ts +530 -0
  53. package/src/shared.ts +28 -0
  54. package/vendor/latex-review/LICENSE +21 -0
  55. package/vendor/latex-review/dist/web/assets/TeXGyrePagellaX-Bold-CEtYdOXj.otf +0 -0
  56. package/vendor/latex-review/dist/web/assets/TeXGyrePagellaX-Regular-DQJjZE_L.otf +0 -0
  57. package/vendor/latex-review/dist/web/assets/index-DyzYnIGk.css +1 -0
  58. package/vendor/latex-review/dist/web/assets/index-HxBK-dls.js +19 -0
  59. package/vendor/latex-review/dist/web/index.html +18 -0
  60. package/vendor/latex-review/package-lock.json +3114 -0
  61. package/vendor/latex-review/package.json +49 -0
  62. package/vendor/latex-review/src/cli.ts +494 -0
  63. package/vendor/latex-review/src/client.ts +198 -0
  64. package/vendor/latex-review/src/core/build.ts +296 -0
  65. package/vendor/latex-review/src/core/changes.ts +126 -0
  66. package/vendor/latex-review/src/core/config.ts +270 -0
  67. package/vendor/latex-review/src/core/diff.ts +54 -0
  68. package/vendor/latex-review/src/core/files.ts +96 -0
  69. package/vendor/latex-review/src/core/git.ts +317 -0
  70. package/vendor/latex-review/src/core/outline.ts +314 -0
  71. package/vendor/latex-review/src/core/process.ts +111 -0
  72. package/vendor/latex-review/src/core/publish.ts +339 -0
  73. package/vendor/latex-review/src/core/review.ts +734 -0
  74. package/vendor/latex-review/src/core/store.ts +66 -0
  75. package/vendor/latex-review/src/core/tasks.ts +237 -0
  76. package/vendor/latex-review/src/render/inline.ts +805 -0
  77. package/vendor/latex-review/src/render/locate.ts +481 -0
  78. package/vendor/latex-review/src/render/pdf.ts +281 -0
  79. package/vendor/latex-review/src/render/pdfdiff.ts +272 -0
  80. package/vendor/latex-review/src/render/round.ts +236 -0
  81. package/vendor/latex-review/src/render/worker.ts +10 -0
  82. package/vendor/latex-review/src/runtime.ts +23 -0
  83. package/vendor/latex-review/src/server.ts +401 -0
  84. package/vendor/latex-review/src/types.ts +283 -0
  85. package/vendor/latex-review/src/web/ChangeMap.tsx +212 -0
  86. package/vendor/latex-review/src/web/PdfStrip.tsx +77 -0
  87. package/vendor/latex-review/src/web/fonts/GUST-FONT-LICENSE.txt +29 -0
  88. package/vendor/latex-review/src/web/fonts/LPPL.txt +415 -0
  89. package/vendor/latex-review/src/web/fonts/MANIFEST-newpx.txt +20 -0
  90. package/vendor/latex-review/src/web/fonts/README-newpx.txt +473 -0
  91. package/vendor/latex-review/src/web/fonts/README.md +12 -0
  92. package/vendor/latex-review/src/web/fonts/TeXGyrePagellaX-Bold.otf +0 -0
  93. package/vendor/latex-review/src/web/fonts/TeXGyrePagellaX-Regular.otf +0 -0
  94. package/vendor/latex-review/src/web/index.html +17 -0
  95. package/vendor/latex-review/src/web/main.tsx +10 -0
  96. package/vendor/latex-review/src/web/model.ts +153 -0
  97. package/vendor/latex-review/src/web/overview.tsx +146 -0
  98. package/vendor/latex-review/src/web/review.tsx +991 -0
  99. package/vendor/latex-review/src/web/style.css +1249 -0
@@ -0,0 +1,146 @@
1
+ import { useEffect, useState } from "react";
2
+ import type { Summary } from "../types.ts";
3
+ export const STATUS: Record<string, string> = {
4
+ editing: "Editing",
5
+ reviewing: "In review",
6
+ revise: "Awaiting revision",
7
+ done: "All decided",
8
+ build_failed: "Publish failed",
9
+ building: "Publishing",
10
+ };
11
+ export function Overview() {
12
+ const [tasks, setTasks] = useState<(Summary & { url: string })[]>([]),
13
+ [search, setSearch] = useState(""),
14
+ [filter, setFilter] = useState("all"),
15
+ [error, setError] = useState("");
16
+ useEffect(() => {
17
+ let cancelled = false,
18
+ timer: ReturnType<typeof setTimeout>;
19
+ async function poll() {
20
+ try {
21
+ const response = await fetch("/api/tasks");
22
+ const data = await response.json();
23
+ if (!response.ok) throw new Error(data.error);
24
+ if (!cancelled) {
25
+ setTasks(data.tasks);
26
+ setError("");
27
+ }
28
+ } catch (e) {
29
+ if (!cancelled) setError((e as Error).message);
30
+ } finally {
31
+ if (!cancelled) timer = setTimeout(poll, 2500);
32
+ }
33
+ }
34
+ void poll();
35
+ return () => {
36
+ cancelled = true;
37
+ clearTimeout(timer);
38
+ };
39
+ }, []);
40
+ const visible = tasks.filter(
41
+ (t) =>
42
+ `${t.title} ${t.task}`.toLowerCase().includes(search.toLowerCase()) &&
43
+ (filter === "all" || t.state === filter),
44
+ );
45
+ return (
46
+ <>
47
+ <header className="bar">
48
+ <a className="brand" href="/">
49
+ LaTeX Review
50
+ </a>
51
+ <span className="status">{tasks.length} open reviews</span>
52
+ </header>
53
+ <main id="paper" className="index">
54
+ <div className="document">
55
+ <div className="overview-heading">
56
+ <h1>All reviews</h1>
57
+ </div>
58
+ <div className="task-tools">
59
+ <input
60
+ type="search"
61
+ aria-label="Search reviews"
62
+ placeholder="Search by title or task name"
63
+ value={search}
64
+ onChange={(e) => setSearch(e.target.value)}
65
+ />
66
+ <select
67
+ aria-label="Filter reviews"
68
+ value={filter}
69
+ onChange={(e) => setFilter(e.target.value)}
70
+ >
71
+ <option value="all">All tasks</option>
72
+ <option value="reviewing">Awaiting your review</option>
73
+ <option value="building">Publishing</option>
74
+ <option value="revise">Awaiting revision</option>
75
+ <option value="done">All decided</option>
76
+ </select>
77
+ </div>
78
+ {error && <p role="alert">{error}</p>}
79
+ <ul className="task-list">
80
+ {visible.map((task) => {
81
+ const total = Object.values(task.counts).reduce(
82
+ (a, b) => a + b,
83
+ 0,
84
+ ),
85
+ decided = total - task.counts.pending;
86
+ return (
87
+ <li key={task.task}>
88
+ <a
89
+ className="task-card"
90
+ href={`/?task=${encodeURIComponent(task.task)}`}
91
+ >
92
+ <div className="task-heading">
93
+ <h2>{task.title}</h2>
94
+ <span className="status" data-state={task.state}>
95
+ {STATUS[task.state]}
96
+ </span>
97
+ </div>
98
+ <div className="task-meta">
99
+ <span className="task-name">{task.task}</span>
100
+ <span>
101
+ {task.round
102
+ ? `Round ${task.round}`
103
+ : "Not published yet"}
104
+ </span>
105
+ </div>
106
+ {total > 0 && (
107
+ <div className="task-progress">
108
+ <span className="track">
109
+ <i style={{ width: `${(100 * decided) / total}%` }} />
110
+ </span>
111
+ <span>
112
+ {decided} of {total} decided
113
+ </span>
114
+ </div>
115
+ )}
116
+ <div className="task-footer">
117
+ <div className="task-counts">
118
+ {Object.entries(task.counts)
119
+ .filter(([, n]) => n)
120
+ .map(([kind, n]) => (
121
+ <span key={kind} data-kind={kind}>
122
+ {n} {kind}
123
+ </span>
124
+ ))}
125
+ </div>
126
+ <span className="task-open">
127
+ {task.counts.pending ? "Review →" : "Open →"}
128
+ </span>
129
+ </div>
130
+ </a>
131
+ </li>
132
+ );
133
+ })}
134
+ </ul>
135
+ {!visible.length && (
136
+ <p className="empty">
137
+ {tasks.length
138
+ ? "No reviews match this filter."
139
+ : "No open reviews yet. Start a task from your document repository."}
140
+ </p>
141
+ )}
142
+ </div>
143
+ </main>
144
+ </>
145
+ );
146
+ }