papilot 0.7.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.
- package/README.md +52 -30
- package/README.zh-CN.md +54 -30
- package/bin/doctor.mjs +53 -6
- package/bin/installation.d.mts +2 -0
- package/bin/installation.mjs +7 -1
- package/dist/assets/{_virtual_papilot-licenses-BWIsfrQh.js → _virtual_papilot-licenses-D7ro6ecN.js} +54 -3
- package/dist/assets/index-Cc-awdNn.css +1 -0
- package/dist/assets/index-D_VX51no.js +265 -0
- package/dist/assets/latex-BarqJFtQ.svg +1 -0
- package/dist/assets/{math-BsEl3u6P.js → math-V9uUaUzA.js} +1 -1
- package/dist/assets/pdf-view-Bnb2uIBE.js +598 -0
- package/dist/index.html +2 -2
- package/examples/papilot-paper/main.tex +1 -1
- package/examples/papilot-paper/sections/02-using.tex +3 -1
- package/examples/papilot-paper/sections/09-agents.tex +8 -5
- package/package.json +10 -6
- package/skills/ai-review.md +18 -0
- package/skills/latex-warnings.md +1 -1
- package/src/conversation.ts +6 -0
- package/src/server/acp.ts +354 -0
- package/src/server/agents.ts +220 -43
- package/src/server/ai-review-routes.ts +72 -0
- package/src/server/ai-review.ts +38 -0
- package/src/server/app.ts +53 -11
- package/src/server/build-problems.ts +329 -0
- package/src/server/changes.ts +25 -2
- package/src/server/codex.ts +2 -1
- package/src/server/cursor.ts +153 -0
- package/src/server/latex-installation.ts +43 -0
- package/src/server/manuscript.ts +165 -23
- package/src/server/paths.ts +1 -1
- package/src/server/references.ts +70 -0
- package/src/server/review.ts +3 -3
- package/src/server/skills.ts +5 -8
- package/src/server/store.ts +20 -2
- package/src/server/update-install.ts +53 -2
- package/src/server/update-worker.ts +6 -6
- package/src/server/updates.ts +43 -14
- package/src/server/workspace.ts +183 -29
- package/src/shared.ts +78 -7
- package/src/skill-icons.ts +18 -0
- package/src/skill-metadata.ts +45 -0
- package/vendor/latex-review/dist/web/assets/index-7VKAte5x.js +19 -0
- package/vendor/latex-review/dist/web/assets/index-DEz-LsGl.css +1 -0
- package/vendor/latex-review/dist/web/index.html +2 -2
- package/vendor/latex-review/src/core/bib.ts +692 -0
- package/vendor/latex-review/src/core/changes.ts +39 -0
- package/vendor/latex-review/src/core/review.ts +1 -0
- package/vendor/latex-review/src/core/verify.ts +784 -0
- package/vendor/latex-review/src/core/view.ts +204 -0
- package/vendor/latex-review/src/render/round.ts +11 -0
- package/vendor/latex-review/src/server.ts +65 -0
- package/vendor/latex-review/src/types.ts +125 -0
- package/vendor/latex-review/src/web/effect-preferences.ts +10 -0
- package/vendor/latex-review/src/web/references.tsx +499 -0
- package/vendor/latex-review/src/web/review.tsx +259 -131
- package/vendor/latex-review/src/web/style.css +285 -0
- package/vendor/latex-review/src/web/zh-CN.ts +75 -0
- package/dist/assets/index-CIJEYlP7.js +0 -252
- package/dist/assets/index-hOJEruFc.css +0 -1
- package/dist/assets/pdf-view-Cz9_vK5U.js +0 -598
- package/vendor/latex-review/dist/web/assets/index-Be9CtgcZ.css +0 -1
- package/vendor/latex-review/dist/web/assets/index-TvMWVSaw.js +0 -19
package/README.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
<h1>
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/logo-dark.svg">
|
|
6
|
+
<img src="docs/assets/logo.svg" width="48" height="48" align="absmiddle" alt="Papilot logo">
|
|
7
|
+
</picture>
|
|
8
|
+
Papilot
|
|
9
|
+
</h1>
|
|
7
10
|
|
|
8
|
-
<
|
|
9
|
-
|
|
10
|
-
<p><b>A Cursor-like workspace for your papers:<br>annotate and review PDFs directly without ever touching LaTeX.</b></p>
|
|
11
|
+
<p><b>A Cursor-like workspace for your papers: annotate and review PDFs directly without ever touching LaTeX.</b></p>
|
|
11
12
|
|
|
12
13
|
<p>English · <a href="README.zh-CN.md">简体中文</a></p>
|
|
13
14
|
|
|
@@ -20,51 +21,64 @@
|
|
|
20
21
|
[](https://www.latex-project.org)
|
|
21
22
|
[](https://github.com/cu1ch3n/papilot/pulls)
|
|
22
23
|
|
|
23
|
-
[
|
|
24
|
-
[](#-agents)
|
|
25
|
-
[](#-agents)
|
|
26
|
-
|
|
27
|
-
<br>
|
|
24
|
+
**Contents:** [Features](#-features) · [Quick start](#-quick-start) · [Agents](#-agents) · [Documentation](#-documentation) · [Community](#-community) · [Friends](#-friends) · [License](#-license)
|
|
28
25
|
|
|
29
|
-
<img src="docs/assets/demo.gif" alt="Papilot:
|
|
26
|
+
<img src="docs/assets/demo.gif" alt="Papilot: mark up a passage of the PDF, hand it to an agent, accept the typeset change and commit it" width="100%">
|
|
30
27
|
|
|
31
28
|
</div>
|
|
32
29
|
|
|
33
|
-
<br>
|
|
34
|
-
|
|
35
30
|
You read and mark up the PDF the way a supervisor marks up a draft. An AI agent makes the edits in LaTeX, and every change comes back to you as a before-and-after of the typeset page. Nothing touches your paper until you accept it.
|
|
36
31
|
|
|
32
|
+
> [!TIP]
|
|
33
|
+
> **New in 0.7:** a redesigned workspace, color-grouped notes, files and images in tasks, a skill library, and a choice of where accepted changes go. See the [changelog](CHANGELOG.md).
|
|
34
|
+
|
|
37
35
|
## ✨ Features
|
|
38
36
|
|
|
39
37
|
<table>
|
|
40
38
|
<tr>
|
|
41
39
|
<td width="50%" valign="top">
|
|
42
|
-
<img src="docs/assets/
|
|
40
|
+
<img src="docs/assets/readme-note.jpg" alt="Two passages in a yellow note group and a region note on an equation">
|
|
43
41
|
<h3>📝 Mark up the PDF</h3>
|
|
44
|
-
Select a sentence or
|
|
42
|
+
Select a sentence or box an equation and say what should change. SyncTeX hands the agent the exact LaTeX lines. Color related notes into a group and give the whole group one instruction.
|
|
45
43
|
</td>
|
|
46
44
|
<td width="50%" valign="top">
|
|
47
|
-
<img src="docs/assets/
|
|
45
|
+
<img src="docs/assets/readme-review.jpg" alt="A change shown before and after on the typeset page, with Accept, Reject and Comment">
|
|
48
46
|
<h3>✅ Approve change by change</h3>
|
|
49
|
-
Each edit comes back as a typeset diff. Accept, reject or comment
|
|
50
|
-
|
|
51
|
-
For new tasks, accepting an edit keeps it inside the task until you finish reviewing. Then choose <strong>Apply to working directory</strong> to keep the accepted changes uncommitted, or <strong>Commit to task branch</strong> to save them on a separate <code>papilot/…</code> branch, leaving your current branch and working directory unchanged. You can edit the commit message before saving. Further rounds use the same destination; delivered decisions remain available in History.
|
|
47
|
+
Each edit comes back as a typeset diff, together with the places it moves elsewhere, such as renumbered equations and the table of contents. Accept, reject or comment, and undo any decision.
|
|
52
48
|
</td>
|
|
53
49
|
</tr>
|
|
54
50
|
<tr>
|
|
55
51
|
<td width="50%" valign="top">
|
|
52
|
+
<img src="docs/assets/readme-deliver.jpg" alt="The finished review with an agent-written commit message, Apply to working directory and Commit">
|
|
53
|
+
<h3>📦 Choose where it goes</h3>
|
|
54
|
+
Accepted changes stay inside the task until you finish reviewing. Then apply them to your working directory, or commit them to a separate <code>papilot/…</code> branch with a message the agent writes.
|
|
55
|
+
</td>
|
|
56
|
+
<td width="50%" valign="top">
|
|
57
|
+
<img src="docs/assets/readme-git.jpg" alt="The Git panel with a staged file, a generated commit message, task worktrees and the commit graph">
|
|
58
|
+
<h3>🌿 Git without leaving the page</h3>
|
|
59
|
+
Stage files and commit them with a message an agent writes, then pull and push. Every task's worktree shows in the commit graph, and an agent can resolve conflicts when you merge a co-author's changes.
|
|
60
|
+
</td>
|
|
61
|
+
</tr>
|
|
62
|
+
<tr>
|
|
63
|
+
<td width="50%" valign="top">
|
|
64
|
+
<img src="docs/assets/readme-contents.jpg" alt="The PDF viewer with its contents panel open">
|
|
56
65
|
<h3>📖 Read it like a real PDF</h3>
|
|
57
66
|
Jump to any section from the contents, search every page and zoom in sharply. Selecting text picks exactly the printed words.
|
|
58
67
|
</td>
|
|
59
68
|
<td width="50%" valign="top">
|
|
60
|
-
<h3
|
|
61
|
-
|
|
69
|
+
<h3>🧰 And more</h3>
|
|
70
|
+
<ul>
|
|
71
|
+
<li>✨ <b>Skills</b> such as Polish, Proofread and Check math, one <code>/</code> away. Write your own in Settings.</li>
|
|
72
|
+
<li>📎 <b>Files and images</b> attached to any task or message</li>
|
|
73
|
+
<li>🤖 <b>Codex, Claude, Cursor, Kimi Code, GLM, DeepSeek, Qwen Code, OpenCode or Antigravity</b>: whichever is on your computer, with your own login</li>
|
|
74
|
+
<li>🌳 <b>A Git worktree for every task</b>, up to two running at once</li>
|
|
75
|
+
<li>🌗 <b>Light and dark</b>, in English or Chinese</li>
|
|
76
|
+
<li>📱 <b>Runs on your computer</b>, and you can open it from your phone</li>
|
|
77
|
+
</ul>
|
|
62
78
|
</td>
|
|
63
79
|
</tr>
|
|
64
80
|
</table>
|
|
65
81
|
|
|
66
|
-
Also: ✨ **skills** such as Polish, Proofread and Check math, one `/` away, plus your own · 🤖 **Codex, Claude or Antigravity**, each with your own login · 🌳 **every task in its own Git worktree**, up to two at once · 🌗 **light and dark** · 📱 **runs on your computer**, and you can open it from your phone.
|
|
67
|
-
|
|
68
82
|
## 🚀 Quick start
|
|
69
83
|
|
|
70
84
|
> [!NOTE]
|
|
@@ -75,19 +89,27 @@ npm install -g papilot
|
|
|
75
89
|
papilot demo
|
|
76
90
|
```
|
|
77
91
|
|
|
78
|
-
Open **http://127.0.0.1:7274** and choose **
|
|
92
|
+
Open **http://127.0.0.1:7274** and choose **Manuscript** in the sidebar. The demo adds an example paper to revise: a 26-page LaTeX paper about Papilot itself, full of equations. When you are ready, run `papilot` and choose **Add paper…** from the paper menu to select a LaTeX folder or drop a ZIP. Papilot identifies the main file, prepares Git history and tries compilation, with help for any errors during import.
|
|
79
93
|
|
|
80
94
|
## 🤖 Agents
|
|
81
95
|
|
|
82
96
|
| Agent | Sign in once | How Papilot runs it |
|
|
83
97
|
| --- | --- | --- |
|
|
84
98
|
| **Codex** | `papilot codex login` | Through the Codex app server, in its workspace sandbox. Papilot uses your `codex` if you have one, or installs it on first start. |
|
|
85
|
-
| **Claude** |
|
|
99
|
+
| **Claude** | Install [Claude Code](https://code.claude.com) and run `claude auth login`, or start `papilot` with `ANTHROPIC_API_KEY` set | With Claude Code installed, runs `claude -p` on your own login (your Claude plan or a key), in Claude Code's sandbox. Without it, through the Claude Agent SDK, which needs an API key. |
|
|
100
|
+
| **Cursor** | Start `papilot` with `CURSOR_API_KEY` set | Through the Cursor SDK, downloaded the first time, in Cursor's sandbox. The SDK does not use the Cursor app or CLI login. |
|
|
101
|
+
| **Kimi Code** | Install [Kimi Code CLI](https://www.kimi.com/code/docs/en/kimi-code-cli/guides/getting-started) and run `kimi login` | Runs `kimi acp` with your local configuration; streams replies, resumes sessions and forwards tool approvals. |
|
|
102
|
+
| **GLM** | Start `papilot` with `ZHIPU_API_KEY` (or `ZAI_API_KEY`) set | Claude Code on Zhipu's Anthropic-compatible endpoint, as Zhipu documents for GLM Coding Plan. |
|
|
103
|
+
| **DeepSeek** | Install [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`npm install -g @deepseek-ai/dsh`) and set up a model in it | Runs `dsh acp` in its workspace sandbox; anything outside the worktree asks for approval. |
|
|
104
|
+
| **Qwen Code** | Install [Qwen Code](https://github.com/QwenLM/qwen-code) and sign in by running `qwen` | Runs `qwen --acp` in Auto Edit mode: edits go ahead, commands ask for approval. |
|
|
105
|
+
| **OpenCode** | Install [OpenCode](https://opencode.ai) and connect a provider with `opencode auth login` | Runs `opencode acp` with your providers; commands and anything outside the worktree ask for approval. |
|
|
86
106
|
| **Antigravity** | Install Antigravity and sign in to `agy` | `agy -p`, one process per turn, editing files only. If your region needs it, set `PAPILOT_AGY_PROXY`. |
|
|
87
107
|
|
|
88
|
-
Papilot
|
|
108
|
+
Papilot finds the agents on your computer by itself and offers only those; Codex is always there. After installing or signing in to one while Papilot is running, select **Reconnect**. If a CLI is not on the server’s `PATH`, point `PAPILOT_KIMI_BIN`, `PAPILOT_DSH_BIN`, `PAPILOT_QWEN_BIN` or `PAPILOT_OPENCODE_BIN` at it. See the [agent guide](docs/guide.md#agents) for what each one supports and the tested versions.
|
|
109
|
+
|
|
110
|
+
Papilot never stores your credentials. CLI agents use their own login, and a key you set for Claude, Cursor or GLM goes only to that service. An agent that is found but not signed in shows as unavailable.
|
|
89
111
|
|
|
90
|
-
Having trouble getting started?
|
|
112
|
+
Having trouble getting started? Open **Settings → Runtime** and choose **Agents** for agent setup or **LaTeX** for the detected distribution, version, and location, or run `papilot doctor` for environment checks and fixes and `papilot doctor --repo /path/to/paper` to check a paper too. Add `--json` for a machine-readable report. Diagnostics do not install software, start the server or change your paper. See the [diagnostics guide](docs/guide.md#diagnostics) for what is checked.
|
|
91
113
|
|
|
92
114
|
<details>
|
|
93
115
|
<summary><b>⚙️ Options and remote access</b></summary>
|
|
@@ -105,7 +127,7 @@ When a release is available, **New version** appears next to **Settings**. Click
|
|
|
105
127
|
|
|
106
128
|
Papilot listens only on `127.0.0.1`. To use it from another device, publish it on your tailnet with Tailscale Serve and set `PAPILOT_PUBLIC_ORIGIN` and `PAPILOT_TAILSCALE_LOGIN`. Papilot then checks the host, the browser origin and the Tailscale identity of every request. The [guide](docs/guide.md#remote-access-with-tailscale) has the steps.
|
|
107
129
|
|
|
108
|
-
To invite an advisor or co-authors, give Papilot a public HTTPS address with `PAPILOT_ACCOUNT_ORIGIN` and open **
|
|
130
|
+
To invite an advisor or co-authors, give Papilot a public HTTPS address with `PAPILOT_ACCOUNT_ORIGIN` and open **Settings → Sharing**: each person signs in with a passkey and sees only the papers you share. Invite only people you would trust with access to the computer Papilot runs on; see [Collaborators](docs/guide.md#collaborators).
|
|
109
131
|
|
|
110
132
|
</details>
|
|
111
133
|
|
package/README.zh-CN.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<
|
|
4
|
-
<
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
<h1>
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/logo-dark.svg">
|
|
6
|
+
<img src="docs/assets/logo.svg" width="48" height="48" align="absmiddle" alt="Papilot 标志">
|
|
7
|
+
</picture>
|
|
8
|
+
Papilot
|
|
9
|
+
</h1>
|
|
7
10
|
|
|
8
|
-
<
|
|
9
|
-
|
|
10
|
-
<p><b>像 Cursor 一样改论文:<br>直接在 PDF 上批注和审阅,完全不用碰 LaTeX。</b></p>
|
|
11
|
+
<p><b>像 Cursor 一样改论文:直接在 PDF 上批注和审阅,完全不用碰 LaTeX。</b></p>
|
|
11
12
|
|
|
12
13
|
<p><a href="README.md">English</a> · 简体中文</p>
|
|
13
14
|
|
|
@@ -20,51 +21,64 @@
|
|
|
20
21
|
[](https://www.latex-project.org)
|
|
21
22
|
[](https://github.com/cu1ch3n/papilot/pulls)
|
|
22
23
|
|
|
23
|
-
[
|
|
24
|
-
[](#-智能体)
|
|
25
|
-
[](#-智能体)
|
|
26
|
-
|
|
27
|
-
<br>
|
|
24
|
+
**目录:** [功能](#-功能) · [快速开始](#-快速开始) · [智能体](#-智能体) · [文档](#-文档) · [社区](#-社区) · [友情链接](#-友情链接) · [许可证](#-许可证)
|
|
28
25
|
|
|
29
|
-
<img src="docs/assets/demo.gif" alt="Papilot
|
|
26
|
+
<img src="docs/assets/demo.gif" alt="Papilot:在 PDF 上批注一段文字,交给智能体,接受排版后的改动并提交" width="100%">
|
|
30
27
|
|
|
31
28
|
</div>
|
|
32
29
|
|
|
33
|
-
<br>
|
|
34
|
-
|
|
35
30
|
你像导师批改学生的稿子一样,直接在 PDF 上阅读和批注;AI 智能体去改 LaTeX,每一处改动都以排版后修改前后的对比回到你面前。你点头之前,论文一个字都不会变。
|
|
36
31
|
|
|
32
|
+
> [!TIP]
|
|
33
|
+
> **0.7 新功能**:全新设计的工作台、按颜色分组的批注、任务中附带文件和图片、技能库,以及接受的改动保存到哪里由你选择。详见[更新日志](CHANGELOG.md)。
|
|
34
|
+
|
|
37
35
|
## ✨ 功能
|
|
38
36
|
|
|
39
37
|
<table>
|
|
40
38
|
<tr>
|
|
41
39
|
<td width="50%" valign="top">
|
|
42
|
-
<img src="docs/assets/
|
|
40
|
+
<img src="docs/assets/readme-note.zh-CN.jpg" alt="两段文字在黄色批注组里,一个公式上有区域批注">
|
|
43
41
|
<h3>📝 在 PDF 上批注</h3>
|
|
44
|
-
选中一句话或框出一个公式,写下要怎么改。SyncTeX 会把对应的 LaTeX
|
|
42
|
+
选中一句话或框出一个公式,写下要怎么改。SyncTeX 会把对应的 LaTeX 行准确交给智能体。相关的批注可以用颜色归成一组,整组只写一条要求。
|
|
45
43
|
</td>
|
|
46
44
|
<td width="50%" valign="top">
|
|
47
|
-
<img src="docs/assets/
|
|
45
|
+
<img src="docs/assets/readme-review.zh-CN.jpg" alt="排版页面上改动的修改前后对比,带接受、拒绝和评论按钮">
|
|
48
46
|
<h3>✅ 逐条点头</h3>
|
|
49
|
-
|
|
47
|
+
每处改动都以排版后的差异呈现,连同它在别处引起的变化,比如重新编号的公式和目录。接受、拒绝或评论,任何决定都能撤销。
|
|
48
|
+
</td>
|
|
49
|
+
</tr>
|
|
50
|
+
<tr>
|
|
51
|
+
<td width="50%" valign="top">
|
|
52
|
+
<img src="docs/assets/readme-deliver.zh-CN.jpg" alt="审阅结束后,带智能体写好的提交信息,以及「应用到工作目录」和「提交」按钮">
|
|
53
|
+
<h3>📦 改动去哪由你定</h3>
|
|
54
|
+
审阅结束前,接受的改动只保存在任务里。之后可以应用到工作目录,也可以提交到独立的 <code>papilot/…</code> 分支,提交信息由智能体来写。
|
|
55
|
+
</td>
|
|
56
|
+
<td width="50%" valign="top">
|
|
57
|
+
<img src="docs/assets/readme-git.zh-CN.jpg" alt="Git 面板:已暂存的文件、自动生成的提交信息、任务工作树和提交关系图">
|
|
58
|
+
<h3>🌿 不离开页面用 Git</h3>
|
|
59
|
+
暂存文件,让智能体写提交信息,再 pull、push。每个任务的工作树都显示在提交关系图里;合并合作者的改动时,冲突可以交给智能体解决。
|
|
50
60
|
</td>
|
|
51
61
|
</tr>
|
|
52
62
|
<tr>
|
|
53
63
|
<td width="50%" valign="top">
|
|
64
|
+
<img src="docs/assets/readme-contents.zh-CN.jpg" alt="打开目录面板的 PDF 阅读器">
|
|
54
65
|
<h3>📖 像本地 PDF 一样阅读</h3>
|
|
55
66
|
用目录随意跳转,全文搜索,缩放清晰。选中的文字与印出的词完全对齐。
|
|
56
67
|
</td>
|
|
57
68
|
<td width="50%" valign="top">
|
|
58
|
-
<h3
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
<h3>🧰 还有</h3>
|
|
70
|
+
<ul>
|
|
71
|
+
<li>✨ <b>技能(skill)</b>,如润色、校对、检查数学,输入 <code>/</code> 即可选用,也能在设置里写你自己的</li>
|
|
72
|
+
<li>📎 任务和消息都能附带<b>文件和图片</b></li>
|
|
73
|
+
<li>🤖 <b>Codex、Claude、Cursor、Kimi Code、GLM、DeepSeek、Qwen Code、OpenCode 或 Antigravity</b>:电脑上装了哪个就用哪个,各用你自己的登录</li>
|
|
74
|
+
<li>🌳 <b>每个任务都有独立的 Git 工作树</b>,最多两个同时运行</li>
|
|
75
|
+
<li>🌗 <b>浅色与深色</b>,界面支持中文和英文</li>
|
|
76
|
+
<li>📱 <b>运行在你的电脑上</b>,也能用手机打开</li>
|
|
77
|
+
</ul>
|
|
62
78
|
</td>
|
|
63
79
|
</tr>
|
|
64
80
|
</table>
|
|
65
81
|
|
|
66
|
-
此外:✨ **技能(skill)**,如润色、校对、检查数学,输入 `/` 即可选用,也能添加你自己的 · 🤖 **Codex、Claude 或 Antigravity**,各用你自己的登录 · 🌳 **每个任务都有独立的 Git 工作树**,最多两个同时运行 · 🌗 **浅色与深色** · 📱 **运行在你的电脑上**,也能用手机打开。
|
|
67
|
-
|
|
68
82
|
## 🚀 快速开始
|
|
69
83
|
|
|
70
84
|
> [!NOTE]
|
|
@@ -75,19 +89,27 @@ npm install -g papilot
|
|
|
75
89
|
papilot demo
|
|
76
90
|
```
|
|
77
91
|
|
|
78
|
-
打开 **http://127.0.0.1:7274**,在侧栏选择
|
|
92
|
+
打开 **http://127.0.0.1:7274**,在侧栏选择 **稿件**。demo 会添加一篇示例论文供你修改:一篇讲 Papilot 本身的 26 页 LaTeX 论文,满是公式。准备好之后,运行 `papilot`,在论文菜单中选择 **添加论文…**,选择 LaTeX 文件夹或拖入 ZIP。Papilot 会识别主文件、准备 Git 历史并尝试编译,遇到问题可在导入窗口中重试或请求助手修复。
|
|
79
93
|
|
|
80
94
|
## 🤖 智能体
|
|
81
95
|
|
|
82
96
|
| 智能体 | 登录(一次即可) | Papilot 如何运行它 |
|
|
83
97
|
| --- | --- | --- |
|
|
84
98
|
| **Codex** | `papilot codex login` | 通过 Codex app server 在其工作区沙箱中运行;已装有 `codex` 就直接用,没有则在首次启动时自动安装。 |
|
|
85
|
-
| **Claude** |
|
|
99
|
+
| **Claude** | 安装 [Claude Code](https://code.claude.com) 并运行 `claude auth login`,或设置好 `ANTHROPIC_API_KEY` 再启动 `papilot` | 装了 Claude Code 时,用你自己的登录(Claude 订阅或密钥)运行 `claude -p`,在 Claude Code 的沙箱中工作;没装时通过 Claude Agent SDK 运行,需要 API 密钥。 |
|
|
100
|
+
| **Cursor** | 设置好 `CURSOR_API_KEY` 再启动 `papilot` | 通过 Cursor SDK 在 Cursor 的沙箱中运行,首次使用时下载;该 SDK 不使用 Cursor 应用或 CLI 的登录。 |
|
|
101
|
+
| **Kimi Code** | 安装 [Kimi Code CLI](https://www.kimi.com/code/docs/en/kimi-code-cli/guides/getting-started),运行 `kimi login` | 通过 `kimi acp` 使用本机配置,支持流式回复、会话恢复和工具审批。 |
|
|
102
|
+
| **GLM** | 设置好 `ZHIPU_API_KEY`(或 `ZAI_API_KEY`)再启动 `papilot` | 按智谱为 GLM Coding Plan 给出的方式,让 Claude Code 连接智谱的 Anthropic 兼容接口。 |
|
|
103
|
+
| **DeepSeek** | 安装 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(`npm install -g @deepseek-ai/dsh`)并在其中配置好模型 | 通过 `dsh acp` 在其工作区沙箱中运行;工作树以外的操作需要审批。 |
|
|
104
|
+
| **Qwen Code** | 安装 [Qwen Code](https://github.com/QwenLM/qwen-code),运行 `qwen` 登录 | 以自动编辑模式运行 `qwen --acp`:改文件直接进行,运行命令需要审批。 |
|
|
105
|
+
| **OpenCode** | 安装 [OpenCode](https://opencode.ai),用 `opencode auth login` 连接模型服务商 | 用你配置的服务商运行 `opencode acp`;运行命令和工作树以外的操作需要审批。 |
|
|
86
106
|
| **Antigravity** | 安装 Antigravity 并登录 `agy` | 运行 `agy -p`,每轮一个进程,只编辑文件;所在地区需要代理时设置 `PAPILOT_AGY_PROXY`。 |
|
|
87
107
|
|
|
88
|
-
Papilot
|
|
108
|
+
Papilot 会自动找出电脑上已有的智能体,只列出这些;Codex 始终可用。Papilot 运行期间安装或登录了新的智能体,点击 **重新连接** 即可。如果服务找不到 CLI,可以用 `PAPILOT_KIMI_BIN`、`PAPILOT_DSH_BIN`、`PAPILOT_QWEN_BIN` 或 `PAPILOT_OPENCODE_BIN` 指定其路径。各智能体支持的功能和已验证的版本见[智能体指南](docs/guide.md#agents)。
|
|
89
109
|
|
|
90
|
-
|
|
110
|
+
Papilot 从不保存你的凭据。CLI 智能体使用各自的登录;为 Claude、Cursor 或 GLM 设置的密钥只会交给对应的服务。已找到但没有登录的智能体会显示为不可用。
|
|
111
|
+
|
|
112
|
+
启动遇到问题?打开 **设置 → 运行环境**,在**智能体**中查看智能体配置,或在 **LaTeX** 中查看识别到的发行版、版本和位置,或运行 `papilot doctor` 检查环境并查看修复建议,用 `papilot doctor --repo /path/to/paper` 一并检查论文。加上 `--json` 可输出机器可读的报告。诊断不会安装软件、启动服务或修改论文。检查范围见[诊断指南](docs/guide.md#diagnostics)。
|
|
91
113
|
|
|
92
114
|
<details>
|
|
93
115
|
<summary><b>⚙️ 选项与远程访问</b></summary>
|
|
@@ -101,9 +123,11 @@ papilot service install # macOS:登录后自动启动,退出后自动
|
|
|
101
123
|
npm uninstall -g papilot # 卸载;状态仍保留在 ~/.papilot,可自行删除
|
|
102
124
|
```
|
|
103
125
|
|
|
126
|
+
有新版本时,**设置** 旁会出现 **有新版本**,点击即可在浏览器中安装。Papilot 会等任务和 PDF 编译结束后重启,并重新连接页面。更新会保留你的数据,也会保留上一版安装以便回滚。详见[更新](docs/guide.md#updates)。
|
|
127
|
+
|
|
104
128
|
Papilot 只监听 `127.0.0.1`。若要从其他设备访问,用 Tailscale Serve 把它发布到你的 tailnet,并设置 `PAPILOT_PUBLIC_ORIGIN` 和 `PAPILOT_TAILSCALE_LOGIN`;Papilot 会校验每个请求的主机、浏览器来源和 Tailscale 身份。具体步骤见[指南](docs/guide.md#remote-access-with-tailscale)。
|
|
105
129
|
|
|
106
|
-
要邀请导师或合作者,用 `PAPILOT_ACCOUNT_ORIGIN` 给 Papilot 一个公开的 HTTPS 地址,然后打开
|
|
130
|
+
要邀请导师或合作者,用 `PAPILOT_ACCOUNT_ORIGIN` 给 Papilot 一个公开的 HTTPS 地址,然后打开 **设置 → 共享**:每个人用通行密钥登录,只能看到你共享的论文。只邀请你愿意让其访问运行 Papilot 的这台电脑的人,详见[协作者](docs/guide.md#collaborators)。
|
|
107
131
|
|
|
108
132
|
</details>
|
|
109
133
|
|
package/bin/doctor.mjs
CHANGED
|
@@ -34,6 +34,13 @@ function executable(command, env = process.env) {
|
|
|
34
34
|
try { fs.accessSync(file, fs.constants.X_OK); return fs.statSync(file).isFile(); } catch { return false; }
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
|
+
// Agent CLIs are also looked for where they install themselves, as the server does.
|
|
38
|
+
function agentExecutable(command) {
|
|
39
|
+
if (command.includes('/') || command.includes('\\')) return executable(command);
|
|
40
|
+
const home = process.env.HOME || os.homedir();
|
|
41
|
+
const dirs = ['.local/bin', '.claude/local', '.kimi-code/bin', '.opencode/bin', '.bun/bin', '.npm-global/bin'].map(dir => path.join(home, dir)).concat('/opt/homebrew/bin', '/usr/local/bin');
|
|
42
|
+
return executable(command) || executable(command, { PATH: dirs.join(path.delimiter) });
|
|
43
|
+
}
|
|
37
44
|
function command(file, args, options = {}) {
|
|
38
45
|
return new Promise(resolve => {
|
|
39
46
|
// Never return raw stderr: login commands can print credentials or account data.
|
|
@@ -141,14 +148,24 @@ export async function doctor(args) {
|
|
|
141
148
|
return false;
|
|
142
149
|
}
|
|
143
150
|
async function claudeCheck() {
|
|
151
|
+
// With Claude Code installed, Claude runs claude -p on its own login; only the login state is read.
|
|
152
|
+
const cli = agentExecutable(process.env.PAPILOT_CLAUDE_BIN || 'claude');
|
|
153
|
+
if (cli) {
|
|
154
|
+
const result = await command(cli, ['auth', 'status', '--json']);
|
|
155
|
+
let login = null;
|
|
156
|
+
try { login = JSON.parse(result.stdout); } catch { /* Reported below. */ }
|
|
157
|
+
const ready = Boolean(login?.loggedIn);
|
|
158
|
+
check('agent.claude', ready, 'warn', `${cli}: ${ready ? `Claude Code signed in${login.subscriptionType ? ` (${login.subscriptionType} plan)` : ''}; generation was not tested` : login ? 'Claude Code is not signed in' : result.reason || 'login status unavailable'}.`, 'Run claude auth login, then select Reconnect in Papilot. Set PAPILOT_CLAUDE_BIN if needed.');
|
|
159
|
+
return ready;
|
|
160
|
+
}
|
|
144
161
|
const sdk = installedModule('@anthropic-ai/claude-agent-sdk') || installedModule('@anthropic-ai/claude-agent-sdk', path.join(data, 'agents'));
|
|
145
162
|
const configured = ['ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'CLAUDE_CODE_USE_BEDROCK', 'CLAUDE_CODE_USE_VERTEX', 'CLAUDE_CODE_USE_FOUNDRY'].some(key => Boolean(process.env[key]));
|
|
146
|
-
check('agent.claude', Boolean(sdk && configured), 'warn', !configured ? 'Claude
|
|
163
|
+
check('agent.claude', Boolean(sdk && configured), configured ? 'warn' : 'info', !configured ? 'Claude Code is not installed and no Claude API key is configured, so Papilot does not offer Claude.' : sdk ? 'Claude SDK installed; API credentials configured (not validated).' : 'Claude API credentials configured; the Agent SDK is not installed yet.', !configured ? 'Install Claude Code and sign in with claude auth login to use your Claude plan, or start Papilot with ANTHROPIC_API_KEY or a supported cloud provider configured.' : 'Start papilot once to install the Claude Agent SDK.');
|
|
147
164
|
return Boolean(sdk && configured);
|
|
148
165
|
}
|
|
149
166
|
async function agyCheck() {
|
|
150
|
-
const file =
|
|
151
|
-
if (!file) { check('agent.antigravity', false, '
|
|
167
|
+
const file = agentExecutable(process.env.PAPILOT_AGY_BIN || 'agy');
|
|
168
|
+
if (!file) { check('agent.antigravity', false, 'info', missingAgent('agy', 'PAPILOT_AGY_BIN'), 'Install Antigravity and sign in to agy on this host. If already installed, correct PAPILOT_AGY_BIN or the server PATH, then restart Papilot.'); return false; }
|
|
152
169
|
const proxy = process.env.PAPILOT_AGY_PROXY;
|
|
153
170
|
const env = proxy ? { ...process.env, HTTPS_PROXY: proxy, HTTP_PROXY: proxy, https_proxy: proxy, http_proxy: proxy, NO_PROXY: '127.0.0.1,localhost' } : process.env;
|
|
154
171
|
const result = await command(file, ['models'], { env });
|
|
@@ -156,7 +173,37 @@ export async function doctor(args) {
|
|
|
156
173
|
check('agent.antigravity', ready, 'warn', `${file}: ${ready ? 'model listing succeeded (no generation tested)' : result.reason || 'no models returned'}.`, 'Sign in to agy and try agy models. If your region requires a proxy, set PAPILOT_AGY_PROXY.');
|
|
157
174
|
return ready;
|
|
158
175
|
}
|
|
159
|
-
|
|
176
|
+
// ACP agents: the CLI must offer its ACP mode. Login is not checked, so no credential is read.
|
|
177
|
+
function missingAgent(command, variable) {
|
|
178
|
+
return process.env[variable] ? `${variable} does not resolve to a runnable executable in Papilot's environment.`
|
|
179
|
+
: `${command} was not found on the PATH or in the standard agent folders available to Papilot. It may be installed for a different user or shell.`;
|
|
180
|
+
}
|
|
181
|
+
async function acpCheck(id, name, bin, help, install, update) {
|
|
182
|
+
const file = agentExecutable(process.env[bin.env] || bin.name);
|
|
183
|
+
if (!file) { check(`agent.${id}`, false, 'info', missingAgent(bin.name, bin.env), `${install}. If already installed, correct ${bin.env} or the server PATH, then restart Papilot.`); return false; }
|
|
184
|
+
const result = await command(file, help);
|
|
185
|
+
const ready = result.ok && /\bACP\b|Agent Client Protocol/i.test(result.stdout + '\n' + result.stderr);
|
|
186
|
+
check(`agent.${id}`, ready, 'warn', `${file}: ${ready ? 'ACP command available; login and generation were not tested' : result.reason || 'ACP command unavailable'}.`, `${update} Set ${bin.env} if needed.`);
|
|
187
|
+
return ready;
|
|
188
|
+
}
|
|
189
|
+
const kimiCheck = () => acpCheck('kimi', 'Kimi CLI', { env: 'PAPILOT_KIMI_BIN', name: 'kimi' }, ['acp', '--help'], 'Install Kimi Code CLI and run kimi login', 'Update Kimi Code CLI and run kimi login.');
|
|
190
|
+
const qwenCheck = () => acpCheck('qwen', 'Qwen Code', { env: 'PAPILOT_QWEN_BIN', name: 'qwen' }, ['--help'], 'Install Qwen Code and sign in by running qwen once', 'Update Qwen Code and sign in by running qwen once.');
|
|
191
|
+
const deepseekCheck = () => acpCheck('deepseek', 'DeepSeek Harness (dsh)', { env: 'PAPILOT_DSH_BIN', name: 'dsh' }, ['acp', '--help'], 'Install DeepSeek Harness with npm install -g @deepseek-ai/dsh and set up a model in dsh', 'Update DeepSeek Harness and set up a model in dsh.');
|
|
192
|
+
const opencodeCheck = () => acpCheck('opencode', 'OpenCode', { env: 'PAPILOT_OPENCODE_BIN', name: 'opencode' }, ['acp', '--help'], 'Install OpenCode and connect a provider with opencode auth login', 'Update OpenCode and connect a provider with opencode auth login.');
|
|
193
|
+
// SDK agents: a key in the environment (or the SDK's own login) selects them; keys are not validated.
|
|
194
|
+
async function cursorCheck() {
|
|
195
|
+
const configured = Boolean(process.env.CURSOR_API_KEY) || fs.existsSync(path.join(os.homedir(), '.cursor/sdk/auth.json'));
|
|
196
|
+
const sdk = installedModule('@cursor/sdk') || installedModule('@cursor/sdk', path.join(data, 'agents'));
|
|
197
|
+
check('agent.cursor', Boolean(configured && sdk), configured ? 'warn' : 'info', !configured ? 'Neither CURSOR_API_KEY nor a saved Cursor SDK login was found for the user running Papilot.' : sdk ? 'Cursor SDK installed; SDK credentials detected (not validated).' : 'Cursor SDK credentials detected; the SDK is installed on first use.', !configured ? 'Start Papilot with CURSOR_API_KEY set to a key from the Cursor dashboard, or configure the Cursor SDK login. The Cursor app and CLI login are not used. Restart Papilot after changing its environment.' : 'Start papilot and choose Cursor once to install the SDK.');
|
|
198
|
+
return configured;
|
|
199
|
+
}
|
|
200
|
+
async function glmCheck() {
|
|
201
|
+
const configured = Boolean(process.env.ZHIPU_API_KEY || process.env.ZAI_API_KEY);
|
|
202
|
+
const sdk = installedModule('@anthropic-ai/claude-agent-sdk') || installedModule('@anthropic-ai/claude-agent-sdk', path.join(data, 'agents'));
|
|
203
|
+
check('agent.glm', Boolean(configured && sdk), configured ? 'warn' : 'info', !configured ? 'ZHIPU_API_KEY or ZAI_API_KEY is not set, so Papilot does not offer GLM.' : sdk ? `GLM key configured for ${process.env.ZHIPU_API_KEY ? 'open.bigmodel.cn' : 'api.z.ai'} (not validated).` : 'GLM key configured; the Claude Agent SDK that runs GLM is installed on first use.', !configured ? 'Start Papilot with ZHIPU_API_KEY (open.bigmodel.cn) or ZAI_API_KEY (api.z.ai) set to your GLM Coding Plan or API key.' : 'Start papilot and choose GLM once to install the Claude Agent SDK.');
|
|
204
|
+
return configured;
|
|
205
|
+
}
|
|
206
|
+
const agents = await Promise.all([codexCheck(), claudeCheck(), cursorCheck(), agyCheck(), kimiCheck(), glmCheck(), deepseekCheck(), qwenCheck(), opencodeCheck()]);
|
|
160
207
|
check('agents', agents.some(Boolean), 'warn', agents.some(Boolean) ? 'At least one agent passed its configuration check; live editing was not tested.' : 'No agent passed its configuration check. PDF reading can still be used with a working TeX installation.', 'Configure one agent before starting editing tasks.');
|
|
161
208
|
|
|
162
209
|
if (repo) {
|
|
@@ -232,14 +279,14 @@ export async function doctor(args) {
|
|
|
232
279
|
}
|
|
233
280
|
}
|
|
234
281
|
// Keep reports stable even though independent probes finish in any order.
|
|
235
|
-
const order = ['node', 'dependencies', 'frontend', 'review-engine', 'data', 'git', 'latexmk', 'synctex', 'tex-engines', 'agent.codex', 'agent.claude', 'agent.antigravity', 'agents', 'project', 'project.git', 'project.head', 'project.main', 'project.engine', 'project.worktrees', 'remote', 'server', 'service', 'service.tools', 'service.data'];
|
|
282
|
+
const order = ['node', 'dependencies', 'frontend', 'review-engine', 'data', 'git', 'latexmk', 'synctex', 'tex-engines', 'agent.codex', 'agent.claude', 'agent.cursor', 'agent.antigravity', 'agent.kimi', 'agent.glm', 'agent.deepseek', 'agent.qwen', 'agent.opencode', 'agents', 'project', 'project.git', 'project.head', 'project.main', 'project.engine', 'project.worktrees', 'remote', 'server', 'service', 'service.tools', 'service.data'];
|
|
236
283
|
checks.sort((a, b) => order.indexOf(a.id) - order.indexOf(b.id));
|
|
237
284
|
const report = { name: 'Papilot', version: pkg.version, ok: !checks.some(item => !item.ok && item.severity === 'error'), checks };
|
|
238
285
|
if (json) console.log(JSON.stringify(report, null, 2));
|
|
239
286
|
else {
|
|
240
287
|
console.log(`Papilot ${pkg.version} doctor\n`);
|
|
241
288
|
for (const item of checks) {
|
|
242
|
-
console.log(`${item.ok ? '✓' : item.severity === 'error' ? '✗' : '!'} ${item.id}: ${item.detail}`);
|
|
289
|
+
console.log(`${item.ok ? '✓' : item.severity === 'error' ? '✗' : item.severity === 'info' ? '-' : '!'} ${item.id}: ${item.detail}`);
|
|
243
290
|
if (item.fix) console.log(` Fix: ${item.fix}`);
|
|
244
291
|
}
|
|
245
292
|
const errors = checks.filter(item => !item.ok && item.severity === 'error').length;
|
package/bin/installation.d.mts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export function stableVersion(value: unknown): value is string;
|
|
2
|
+
export function devRevision(value: unknown): string | null;
|
|
3
|
+
export function releaseVersion(value: unknown): value is string;
|
|
2
4
|
export function newerVersion(next: string, current: string): boolean;
|
|
3
5
|
export function readJson(file: string): any;
|
|
4
6
|
export function writeJson(file: string, value: unknown): void;
|
package/bin/installation.mjs
CHANGED
|
@@ -2,6 +2,8 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
|
|
4
4
|
export const stableVersion = value => typeof value === 'string' && /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(value) && value.length < 40;
|
|
5
|
+
export const devRevision = value => typeof value === 'string' && value.length < 100 && /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)-dev\.([a-f0-9]{40})$/.exec(value)?.[4] || null;
|
|
6
|
+
export const releaseVersion = value => stableVersion(value) || Boolean(devRevision(value));
|
|
5
7
|
export function newerVersion(next, current) {
|
|
6
8
|
if (!stableVersion(next)) return false;
|
|
7
9
|
const match = /^(\d+)\.(\d+)\.(\d+)(.*)$/.exec(current);
|
|
@@ -22,7 +24,11 @@ export function writeJson(file, value) {
|
|
|
22
24
|
export function activeInstallation(root, data) {
|
|
23
25
|
const active = readJson(path.join(data, 'updates/active.json'));
|
|
24
26
|
const version = readJson(path.join(root, 'package.json'))?.version;
|
|
25
|
-
if (!active || !
|
|
27
|
+
if (!active || !releaseVersion(active.version)) return root;
|
|
28
|
+
// Explicit channel selections also cover dev builds and returning to stable.
|
|
29
|
+
// Older activation records retain their upgrade-only behavior.
|
|
30
|
+
if (!['stable', 'dev'].includes(active.channel) && !newerVersion(active.version, version)) return root;
|
|
31
|
+
if (active.channel && (active.channel === 'dev') !== Boolean(devRevision(active.version))) return root;
|
|
26
32
|
if (typeof active.root !== 'string') return root;
|
|
27
33
|
try {
|
|
28
34
|
const releases = fs.realpathSync(path.join(data, 'updates/releases')) + path.sep;
|
package/dist/assets/{_virtual_papilot-licenses-BWIsfrQh.js → _virtual_papilot-licenses-D7ro6ecN.js}
RENAMED
|
@@ -2327,7 +2327,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
2327
2327
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
2328
2328
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
2329
2329
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
2330
|
-
SOFTWARE.`}]},{name:`latex-review`,version:`0.2.0`,license:`MIT`,url:`https://github.com/
|
|
2330
|
+
SOFTWARE.`}]},{name:`latex-review`,version:`0.2.0`,license:`MIT`,url:`https://github.com/PapilotAI/papilot/tree/main/vendor/latex-review`,notices:[{name:`LICENSE`,text:`MIT License
|
|
2331
2331
|
|
|
2332
2332
|
Copyright (c) 2026 Cui Chen
|
|
2333
2333
|
|
|
@@ -2378,7 +2378,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
2378
2378
|
|
|
2379
2379
|
The complete list of contributors can be found at:
|
|
2380
2380
|
- https://github.com/hapijs/shot/graphs/contributors
|
|
2381
|
-
- https://github.com/fastify/light-my-request/graphs/contributors`}]},{name:`
|
|
2381
|
+
- https://github.com/fastify/light-my-request/graphs/contributors`}]},{name:`Lobe Icons`,version:`1.101.0`,license:`MIT`,url:`https://github.com/lobehub/lobe-icons`,notices:[{name:`MIT License`,text:`MIT License
|
|
2382
|
+
|
|
2383
|
+
Copyright (c) 2023 LobeHub
|
|
2384
|
+
|
|
2385
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
2386
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
2387
|
+
in the Software without restriction, including without limitation the rights
|
|
2388
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
2389
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
2390
|
+
furnished to do so, subject to the following conditions:
|
|
2391
|
+
|
|
2392
|
+
The above copyright notice and this permission notice shall be included in all
|
|
2393
|
+
copies or substantial portions of the Software.
|
|
2394
|
+
|
|
2395
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
2396
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
2397
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
2398
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
2399
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
2400
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
2401
|
+
SOFTWARE.`},{name:`Icon sources`,text:`Agent icons: @lobehub/icons-static-svg 1.101.0 (MIT), https://github.com/lobehub/lobe-icons. GLM uses the ChatGLM mark.
|
|
2402
|
+
Git and LaTeX icons: simple-icons 16.36.0 (CC0-1.0), https://github.com/simple-icons/simple-icons.
|
|
2403
|
+
Unmodified SVG artwork; rendered locally with CSS masks. Brand marks belong to their respective owners.`}]},{name:`longest-streak`,version:`3.1.0`,license:`MIT`,url:`https://www.npmjs.com/package/longest-streak/v/3.1.0`,notices:[{name:`license`,text:`(The MIT License)
|
|
2382
2404
|
|
|
2383
2405
|
Copyright (c) 2015 Titus Wormer <mailto:tituswormer@gmail.com>
|
|
2384
2406
|
|
|
@@ -6040,7 +6062,36 @@ OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
|
|
|
6040
6062
|
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
|
6041
6063
|
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
6042
6064
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
6043
|
-
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.`}]},{name:`
|
|
6065
|
+
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.`}]},{name:`Simple Icons`,version:`16.36.0`,license:`CC0-1.0`,url:`https://github.com/simple-icons/simple-icons`,notices:[{name:`CC0`,text:`# CC0 1.0 Universal
|
|
6066
|
+
|
|
6067
|
+
## Statement of Purpose
|
|
6068
|
+
|
|
6069
|
+
The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).
|
|
6070
|
+
|
|
6071
|
+
Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
|
|
6072
|
+
|
|
6073
|
+
For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
|
|
6074
|
+
|
|
6075
|
+
1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following:
|
|
6076
|
+
1. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
|
|
6077
|
+
2. moral rights retained by the original author(s) and/or performer(s);
|
|
6078
|
+
3. publicity and privacy rights pertaining to a person’s image or likeness depicted in a Work;
|
|
6079
|
+
4. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(i), below;
|
|
6080
|
+
5. rights protecting the extraction, dissemination, use and reuse of data in a Work;
|
|
6081
|
+
6. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
|
|
6082
|
+
7. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
|
|
6083
|
+
|
|
6084
|
+
2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer’s heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer’s express Statement of Purpose.
|
|
6085
|
+
|
|
6086
|
+
3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer’s express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer’s Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer’s express Statement of Purpose.
|
|
6087
|
+
|
|
6088
|
+
4. Limitations and Disclaimers.
|
|
6089
|
+
1. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
|
|
6090
|
+
2. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
|
|
6091
|
+
3. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person’s Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
|
|
6092
|
+
4. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
|
|
6093
|
+
|
|
6094
|
+
For more information, please see <https://creativecommons.org/publicdomain/zero/1.0>.`}]},{name:`sonic-boom`,version:`4.2.1`,license:`MIT`,url:`https://github.com/pinojs/sonic-boom`,notices:[{name:`LICENSE`,text:`MIT License
|
|
6044
6095
|
|
|
6045
6096
|
Copyright (c) 2017 Matteo Collina
|
|
6046
6097
|
|