papilot 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +126 -2
- package/README.zh-CN.md +127 -0
- package/bin/papilot.mjs +113 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/assets/Inconsolatazi4-Regular-Dbtq7t_r.otf +0 -0
- package/dist/assets/TeXGyrePagellaX-Bold-CEtYdOXj.otf +0 -0
- package/dist/assets/TeXGyrePagellaX-Italic-CSuYIstn.otf +0 -0
- package/dist/assets/TeXGyrePagellaX-Regular-DQJjZE_L.otf +0 -0
- package/dist/assets/cursor-editorTextHighlight-kG3uUOwL.svg +8 -0
- package/dist/assets/index-BhQFCMTx.js +131 -0
- package/dist/assets/index-CAV3-87U.css +1 -0
- package/dist/assets/pdf-view-DJo0X38w.js +598 -0
- package/dist/assets/pdf.worker.min-CjEcRF4W.mjs +28 -0
- package/dist/favicon.png +0 -0
- package/dist/index.html +4 -0
- package/examples/papilot-paper/.latex-review.json +4 -0
- package/examples/papilot-paper/appendix/proofs.tex +60 -0
- package/examples/papilot-paper/appendix/reference.tex +54 -0
- package/examples/papilot-paper/main.tex +57 -0
- package/examples/papilot-paper/preamble.tex +53 -0
- package/examples/papilot-paper/references.bib +158 -0
- package/examples/papilot-paper/sections/01-introduction.tex +66 -0
- package/examples/papilot-paper/sections/02-using.tex +134 -0
- package/examples/papilot-paper/sections/03-background.tex +97 -0
- package/examples/papilot-paper/sections/04-model.tex +185 -0
- package/examples/papilot-paper/sections/05-conflicts.tex +99 -0
- package/examples/papilot-paper/sections/06-building.tex +70 -0
- package/examples/papilot-paper/sections/07-geometry.tex +193 -0
- package/examples/papilot-paper/sections/08-notes.tex +104 -0
- package/examples/papilot-paper/sections/09-agents.tex +106 -0
- package/examples/papilot-paper/sections/10-usage.tex +56 -0
- package/examples/papilot-paper/sections/11-git.tex +62 -0
- package/examples/papilot-paper/sections/12-security.tex +41 -0
- package/examples/papilot-paper/sections/13-evaluation.tex +106 -0
- package/examples/papilot-paper/sections/14-related.tex +38 -0
- package/examples/papilot-paper/sections/15-conclusion.tex +27 -0
- package/package.json +85 -4
- package/scripts/demo.ts +21 -0
- package/scripts/service.ts +35 -0
- package/src/notes.ts +40 -0
- package/src/server/agents.ts +343 -0
- package/src/server/codex.ts +63 -0
- package/src/server/frontend.ts +15 -0
- package/src/server/main.ts +202 -0
- package/src/server/manuscript.ts +337 -0
- package/src/server/paths.ts +10 -0
- package/src/server/pdf.ts +27 -0
- package/src/server/review.ts +53 -0
- package/src/server/security.ts +15 -0
- package/src/server/store.ts +60 -0
- package/src/server/workspace.ts +529 -0
- package/src/shared.ts +28 -0
- package/vendor/latex-review/LICENSE +21 -0
- package/vendor/latex-review/dist/web/assets/TeXGyrePagellaX-Bold-CEtYdOXj.otf +0 -0
- package/vendor/latex-review/dist/web/assets/TeXGyrePagellaX-Regular-DQJjZE_L.otf +0 -0
- package/vendor/latex-review/dist/web/assets/index-DyzYnIGk.css +1 -0
- package/vendor/latex-review/dist/web/assets/index-HxBK-dls.js +19 -0
- package/vendor/latex-review/dist/web/index.html +18 -0
- package/vendor/latex-review/package-lock.json +3114 -0
- package/vendor/latex-review/package.json +49 -0
- package/vendor/latex-review/src/cli.ts +494 -0
- package/vendor/latex-review/src/client.ts +198 -0
- package/vendor/latex-review/src/core/build.ts +296 -0
- package/vendor/latex-review/src/core/changes.ts +126 -0
- package/vendor/latex-review/src/core/config.ts +270 -0
- package/vendor/latex-review/src/core/diff.ts +54 -0
- package/vendor/latex-review/src/core/files.ts +96 -0
- package/vendor/latex-review/src/core/git.ts +317 -0
- package/vendor/latex-review/src/core/outline.ts +314 -0
- package/vendor/latex-review/src/core/process.ts +111 -0
- package/vendor/latex-review/src/core/publish.ts +339 -0
- package/vendor/latex-review/src/core/review.ts +734 -0
- package/vendor/latex-review/src/core/store.ts +66 -0
- package/vendor/latex-review/src/core/tasks.ts +237 -0
- package/vendor/latex-review/src/render/inline.ts +805 -0
- package/vendor/latex-review/src/render/locate.ts +481 -0
- package/vendor/latex-review/src/render/pdf.ts +281 -0
- package/vendor/latex-review/src/render/pdfdiff.ts +272 -0
- package/vendor/latex-review/src/render/round.ts +236 -0
- package/vendor/latex-review/src/render/worker.ts +10 -0
- package/vendor/latex-review/src/runtime.ts +23 -0
- package/vendor/latex-review/src/server.ts +401 -0
- package/vendor/latex-review/src/types.ts +283 -0
- package/vendor/latex-review/src/web/ChangeMap.tsx +212 -0
- package/vendor/latex-review/src/web/PdfStrip.tsx +77 -0
- package/vendor/latex-review/src/web/fonts/GUST-FONT-LICENSE.txt +29 -0
- package/vendor/latex-review/src/web/fonts/LPPL.txt +415 -0
- package/vendor/latex-review/src/web/fonts/MANIFEST-newpx.txt +20 -0
- package/vendor/latex-review/src/web/fonts/README-newpx.txt +473 -0
- package/vendor/latex-review/src/web/fonts/README.md +12 -0
- package/vendor/latex-review/src/web/fonts/TeXGyrePagellaX-Bold.otf +0 -0
- package/vendor/latex-review/src/web/fonts/TeXGyrePagellaX-Regular.otf +0 -0
- package/vendor/latex-review/src/web/index.html +17 -0
- package/vendor/latex-review/src/web/main.tsx +10 -0
- package/vendor/latex-review/src/web/model.ts +153 -0
- package/vendor/latex-review/src/web/overview.tsx +146 -0
- package/vendor/latex-review/src/web/review.tsx +991 -0
- 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
|
+
}
|