scientify 1.0.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 +243 -0
- package/README.zh.md +244 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/src/commands.d.ts +26 -0
- package/dist/src/commands.d.ts.map +1 -0
- package/dist/src/commands.js +261 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/tools/arxiv-tool.d.ts +26 -0
- package/dist/src/tools/arxiv-tool.d.ts.map +1 -0
- package/dist/src/tools/arxiv-tool.js +258 -0
- package/dist/src/tools/arxiv-tool.js.map +1 -0
- package/package.json +47 -0
- package/skills/arxiv/SKILL.md +138 -0
- package/skills/idea-generation/SKILL.md +751 -0
- package/skills/literature-review/SKILL.md +261 -0
- package/skills/research-pipeline/SKILL.md +267 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
const WORKSPACE_ROOT = path.join(os.homedir(), ".openclaw", "workspace", "projects");
|
|
5
|
+
function getActiveProject() {
|
|
6
|
+
const activePath = path.join(WORKSPACE_ROOT, ".active");
|
|
7
|
+
try {
|
|
8
|
+
return fs.readFileSync(activePath, "utf-8").trim();
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function getProjectMeta(projectId) {
|
|
15
|
+
const metaPath = path.join(WORKSPACE_ROOT, projectId, "project.json");
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(fs.readFileSync(metaPath, "utf-8"));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function listProjects() {
|
|
24
|
+
try {
|
|
25
|
+
return fs
|
|
26
|
+
.readdirSync(WORKSPACE_ROOT, { withFileTypes: true })
|
|
27
|
+
.filter((d) => d.isDirectory() && !d.name.startsWith("."))
|
|
28
|
+
.map((d) => d.name);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function formatSize(bytes) {
|
|
35
|
+
if (bytes < 1024)
|
|
36
|
+
return `${bytes}B`;
|
|
37
|
+
if (bytes < 1024 * 1024)
|
|
38
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
39
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
40
|
+
}
|
|
41
|
+
function getDirSize(dirPath) {
|
|
42
|
+
let size = 0;
|
|
43
|
+
try {
|
|
44
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
47
|
+
if (entry.isDirectory()) {
|
|
48
|
+
size += getDirSize(fullPath);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
size += fs.statSync(fullPath).size;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// ignore
|
|
57
|
+
}
|
|
58
|
+
return size;
|
|
59
|
+
}
|
|
60
|
+
function countFiles(dirPath, pattern) {
|
|
61
|
+
let count = 0;
|
|
62
|
+
try {
|
|
63
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
count += countFiles(fullPath, pattern);
|
|
68
|
+
}
|
|
69
|
+
else if (!pattern || pattern.test(entry.name)) {
|
|
70
|
+
count++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// ignore
|
|
76
|
+
}
|
|
77
|
+
return count;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* /research-status - Show workspace status
|
|
81
|
+
*/
|
|
82
|
+
export function handleResearchStatus(_ctx) {
|
|
83
|
+
const activeProject = getActiveProject();
|
|
84
|
+
const projects = listProjects();
|
|
85
|
+
let output = "📁 **Research Workspace Status**\n\n";
|
|
86
|
+
output += `Root: \`${WORKSPACE_ROOT}\`\n`;
|
|
87
|
+
output += `Active: ${activeProject ? `**${activeProject}**` : "(none)"}\n\n`;
|
|
88
|
+
if (projects.length === 0) {
|
|
89
|
+
output += "_No projects found. Use /idea-generation to create one._";
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
output += "**Projects:**\n";
|
|
93
|
+
for (const proj of projects) {
|
|
94
|
+
const isActive = proj === activeProject;
|
|
95
|
+
const papersCount = countFiles(path.join(WORKSPACE_ROOT, proj, "papers"));
|
|
96
|
+
const ideasCount = countFiles(path.join(WORKSPACE_ROOT, proj, "ideas"), /\.md$/);
|
|
97
|
+
let reposCount = 0;
|
|
98
|
+
try {
|
|
99
|
+
const reposDir = path.join(WORKSPACE_ROOT, proj, "repos");
|
|
100
|
+
if (fs.existsSync(reposDir)) {
|
|
101
|
+
reposCount = fs
|
|
102
|
+
.readdirSync(reposDir, { withFileTypes: true })
|
|
103
|
+
.filter((d) => d.isDirectory()).length;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// ignore
|
|
108
|
+
}
|
|
109
|
+
const marker = isActive ? "● " : " ";
|
|
110
|
+
output += `${marker}\`${proj}\` (papers: ${papersCount}, ideas: ${ideasCount}, repos: ${reposCount})\n`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { text: output };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* /papers - List downloaded papers
|
|
117
|
+
*/
|
|
118
|
+
export function handlePapers(ctx) {
|
|
119
|
+
const projectId = ctx.args?.trim() || getActiveProject();
|
|
120
|
+
if (!projectId) {
|
|
121
|
+
return { text: "❌ No active project. Use: `/papers <project-id>`" };
|
|
122
|
+
}
|
|
123
|
+
const papersDir = path.join(WORKSPACE_ROOT, projectId, "papers");
|
|
124
|
+
if (!fs.existsSync(papersDir)) {
|
|
125
|
+
return { text: `📄 **Papers in ${projectId}**\n\n_No papers directory found._` };
|
|
126
|
+
}
|
|
127
|
+
let output = `📄 **Papers in ${projectId}**\n\n`;
|
|
128
|
+
const entries = fs.readdirSync(papersDir, { withFileTypes: true });
|
|
129
|
+
let hasItems = false;
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
if (entry.isDirectory()) {
|
|
132
|
+
const paperDir = path.join(papersDir, entry.name);
|
|
133
|
+
const texFiles = fs.readdirSync(paperDir).filter((f) => f.endsWith(".tex"));
|
|
134
|
+
output += ` [tex] \`${entry.name}\` (${texFiles.length} files)\n`;
|
|
135
|
+
hasItems = true;
|
|
136
|
+
}
|
|
137
|
+
else if (entry.name.endsWith(".pdf")) {
|
|
138
|
+
const size = formatSize(fs.statSync(path.join(papersDir, entry.name)).size);
|
|
139
|
+
output += ` [pdf] \`${entry.name.replace(".pdf", "")}\` (${size})\n`;
|
|
140
|
+
hasItems = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!hasItems) {
|
|
144
|
+
output += "_No papers downloaded yet._";
|
|
145
|
+
}
|
|
146
|
+
return { text: output };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* /ideas - List generated ideas
|
|
150
|
+
*/
|
|
151
|
+
export function handleIdeas(ctx) {
|
|
152
|
+
const projectId = ctx.args?.trim() || getActiveProject();
|
|
153
|
+
if (!projectId) {
|
|
154
|
+
return { text: "❌ No active project. Use: `/ideas <project-id>`" };
|
|
155
|
+
}
|
|
156
|
+
const ideasDir = path.join(WORKSPACE_ROOT, projectId, "ideas");
|
|
157
|
+
if (!fs.existsSync(ideasDir)) {
|
|
158
|
+
return { text: `💡 **Ideas in ${projectId}**\n\n_No ideas directory found._` };
|
|
159
|
+
}
|
|
160
|
+
let output = `💡 **Ideas in ${projectId}**\n\n`;
|
|
161
|
+
const files = fs.readdirSync(ideasDir).filter((f) => f.endsWith(".md"));
|
|
162
|
+
if (files.length === 0) {
|
|
163
|
+
output += "_No ideas generated yet._";
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
for (const file of files) {
|
|
167
|
+
const content = fs.readFileSync(path.join(ideasDir, file), "utf-8");
|
|
168
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
169
|
+
const title = titleMatch ? titleMatch[1] : file;
|
|
170
|
+
const isSelected = file === "selected_idea.md";
|
|
171
|
+
const marker = isSelected ? "⭐ " : " ";
|
|
172
|
+
output += `${marker}\`${file.padEnd(22)}\` ${title}\n`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return { text: output };
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* /projects - List all research projects
|
|
179
|
+
*/
|
|
180
|
+
export function handleProjects(_ctx) {
|
|
181
|
+
const activeProject = getActiveProject();
|
|
182
|
+
const projects = listProjects();
|
|
183
|
+
let output = "📂 **Research Projects**\n\n";
|
|
184
|
+
if (projects.length === 0) {
|
|
185
|
+
output += "_No projects found._";
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
for (const proj of projects) {
|
|
189
|
+
const isActive = proj === activeProject;
|
|
190
|
+
const meta = getProjectMeta(proj);
|
|
191
|
+
const marker = isActive ? "● " : " ";
|
|
192
|
+
output += `${marker}**${proj}**\n`;
|
|
193
|
+
if (meta?.name)
|
|
194
|
+
output += ` name: ${meta.name}\n`;
|
|
195
|
+
if (meta?.created)
|
|
196
|
+
output += ` created: ${meta.created}\n`;
|
|
197
|
+
if (meta?.topics?.length)
|
|
198
|
+
output += ` topics: ${meta.topics.join(", ")}\n`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return { text: output };
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* /project-switch <project-id> - Switch to a different project
|
|
205
|
+
*/
|
|
206
|
+
export function handleProjectSwitch(ctx) {
|
|
207
|
+
const projectId = ctx.args?.trim();
|
|
208
|
+
if (!projectId) {
|
|
209
|
+
return { text: "❌ Usage: `/project-switch <project-id>`" };
|
|
210
|
+
}
|
|
211
|
+
const projectPath = path.join(WORKSPACE_ROOT, projectId);
|
|
212
|
+
if (!fs.existsSync(projectPath)) {
|
|
213
|
+
return { text: `❌ Project '${projectId}' not found.` };
|
|
214
|
+
}
|
|
215
|
+
fs.mkdirSync(WORKSPACE_ROOT, { recursive: true });
|
|
216
|
+
fs.writeFileSync(path.join(WORKSPACE_ROOT, ".active"), projectId);
|
|
217
|
+
return { text: `✓ Switched to project '**${projectId}**'` };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* /project-delete <project-id> - Delete a research project
|
|
221
|
+
*/
|
|
222
|
+
export function handleProjectDelete(ctx) {
|
|
223
|
+
const projectId = ctx.args?.trim();
|
|
224
|
+
if (!projectId) {
|
|
225
|
+
return { text: "❌ Usage: `/project-delete <project-id>`" };
|
|
226
|
+
}
|
|
227
|
+
const projectPath = path.join(WORKSPACE_ROOT, projectId);
|
|
228
|
+
if (!fs.existsSync(projectPath)) {
|
|
229
|
+
return { text: `❌ Project '${projectId}' not found.` };
|
|
230
|
+
}
|
|
231
|
+
const size = formatSize(getDirSize(projectPath));
|
|
232
|
+
const papersCount = countFiles(path.join(projectPath, "papers"));
|
|
233
|
+
const ideasCount = countFiles(path.join(projectPath, "ideas"), /\.md$/);
|
|
234
|
+
// For safety, we'll return info and ask for confirmation
|
|
235
|
+
// Note: Plugin commands don't support interactive confirmation,
|
|
236
|
+
// so we provide a force flag via the args
|
|
237
|
+
if (!ctx.args?.includes("--force")) {
|
|
238
|
+
return {
|
|
239
|
+
text: `⚠️ **About to delete:**\n\n` +
|
|
240
|
+
`- Project: \`${projectId}\`\n` +
|
|
241
|
+
`- Papers: ${papersCount}\n` +
|
|
242
|
+
`- Ideas: ${ideasCount}\n` +
|
|
243
|
+
`- Size: ${size}\n\n` +
|
|
244
|
+
`To confirm, use: \`/project-delete ${projectId} --force\``,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
// Clear active if this is the active project
|
|
248
|
+
const activeProject = getActiveProject();
|
|
249
|
+
if (activeProject === projectId) {
|
|
250
|
+
try {
|
|
251
|
+
fs.unlinkSync(path.join(WORKSPACE_ROOT, ".active"));
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// ignore
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Delete the project directory
|
|
258
|
+
fs.rmSync(projectPath, { recursive: true, force: true });
|
|
259
|
+
return { text: `✓ Deleted project '**${projectId}**'` };
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;AASrF,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,OAAO,EAAE;aACN,WAAW,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACzD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,OAAgB;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,IAAI,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;iBAAM,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA0B;IAC7D,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,IAAI,MAAM,GAAG,sCAAsC,CAAC;IACpD,MAAM,IAAI,WAAW,cAAc,MAAM,CAAC;IAC1C,MAAM,IAAI,WAAW,aAAa,CAAC,CAAC,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC;IAE7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,0DAA0D,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,iBAAiB,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,KAAK,aAAa,CAAC;YACxC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;YACjF,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,UAAU,GAAG,EAAE;yBACZ,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;yBAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC3C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,eAAe,WAAW,YAAY,UAAU,YAAY,UAAU,KAAK,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAyB;IACpD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,gBAAgB,EAAE,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,kDAAkD,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,kBAAkB,SAAS,oCAAoC,EAAE,CAAC;IACnF,CAAC;IAED,IAAI,MAAM,GAAG,kBAAkB,SAAS,QAAQ,CAAC;IACjD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5E,MAAM,IAAI,aAAa,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,MAAM,WAAW,CAAC;YACnE,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5E,MAAM,IAAI,aAAa,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC;YACtE,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,6BAA6B,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAyB;IACnD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,gBAAgB,EAAE,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,iDAAiD,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,iBAAiB,SAAS,mCAAmC,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,MAAM,GAAG,iBAAiB,SAAS,QAAQ,CAAC;IAChD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAExE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,2BAA2B,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,MAAM,UAAU,GAAG,IAAI,KAAK,kBAAkB,CAAC;YAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAA0B;IACvD,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAEhC,IAAI,MAAM,GAAG,8BAA8B,CAAC;IAE5C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,sBAAsB,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,KAAK,aAAa,CAAC;YACxC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,MAAM,CAAC;YACnC,IAAI,IAAI,EAAE,IAAI;gBAAE,MAAM,IAAI,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC;YACrD,IAAI,IAAI,EAAE,OAAO;gBAAE,MAAM,IAAI,gBAAgB,IAAI,CAAC,OAAO,IAAI,CAAC;YAC9D,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM;gBAAE,MAAM,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAChF,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAyB;IAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,cAAc,SAAS,cAAc,EAAE,CAAC;IACzD,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAClE,OAAO,EAAE,IAAI,EAAE,4BAA4B,SAAS,KAAK,EAAE,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAyB;IAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,cAAc,SAAS,cAAc,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAExE,yDAAyD;IACzD,gEAAgE;IAChE,0CAA0C;IAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,IAAI,EACF,6BAA6B;gBAC7B,gBAAgB,SAAS,MAAM;gBAC/B,aAAa,WAAW,IAAI;gBAC5B,YAAY,UAAU,IAAI;gBAC1B,WAAW,IAAI,MAAM;gBACrB,sCAAsC,SAAS,YAAY;SAC9D,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,IAAI,EAAE,wBAAwB,SAAS,KAAK,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const ArxivToolSchema: import("@sinclair/typebox").TObject<{
|
|
2
|
+
query: import("@sinclair/typebox").TString;
|
|
3
|
+
max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
4
|
+
sort_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
5
|
+
date_from: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
|
+
download: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
7
|
+
output_dir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function createArxivTool(): {
|
|
10
|
+
label: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
14
|
+
query: import("@sinclair/typebox").TString;
|
|
15
|
+
max_results: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
|
|
16
|
+
sort_by: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
17
|
+
date_from: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
18
|
+
download: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
19
|
+
output_dir: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
20
|
+
}>;
|
|
21
|
+
execute: (_toolCallId: string, rawArgs: unknown) => Promise<{
|
|
22
|
+
type: "tool_result";
|
|
23
|
+
content: string;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=arxiv-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arxiv-tool.d.ts","sourceRoot":"","sources":["../../../src/tools/arxiv-tool.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe;;;;;;;EA+B1B,CAAC;AA2LH,wBAAgB,eAAe;;;;;;;;;;;;2BAOE,MAAM,WAAW,OAAO;;;;EA6ExD"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import * as tar from "tar";
|
|
6
|
+
const ARXIV_API_URL = "https://export.arxiv.org/api/query";
|
|
7
|
+
const DEFAULT_MAX_RESULTS = 10;
|
|
8
|
+
const MAX_RESULTS_LIMIT = 50;
|
|
9
|
+
export const ArxivToolSchema = Type.Object({
|
|
10
|
+
query: Type.String({ description: "Search query for arXiv papers (e.g. 'graph neural network')." }),
|
|
11
|
+
max_results: Type.Optional(Type.Number({
|
|
12
|
+
description: "Maximum number of results to return (1-50). Default: 10.",
|
|
13
|
+
minimum: 1,
|
|
14
|
+
maximum: MAX_RESULTS_LIMIT,
|
|
15
|
+
})),
|
|
16
|
+
sort_by: Type.Optional(Type.String({
|
|
17
|
+
description: 'Sort order: "relevance" (default), "lastUpdatedDate", or "submittedDate".',
|
|
18
|
+
})),
|
|
19
|
+
date_from: Type.Optional(Type.String({
|
|
20
|
+
description: "Filter papers submitted after this date (YYYY-MM-DD).",
|
|
21
|
+
})),
|
|
22
|
+
download: Type.Optional(Type.Boolean({
|
|
23
|
+
description: "If true, download .tex source for each paper to output_dir. Default: false.",
|
|
24
|
+
})),
|
|
25
|
+
output_dir: Type.Optional(Type.String({
|
|
26
|
+
description: "Directory to download .tex source files into. Default: workspace/papers/",
|
|
27
|
+
})),
|
|
28
|
+
});
|
|
29
|
+
const SORT_MAP = {
|
|
30
|
+
relevance: "relevance",
|
|
31
|
+
lastupdateddate: "lastUpdatedDate",
|
|
32
|
+
submitteddate: "submittedDate",
|
|
33
|
+
};
|
|
34
|
+
function readStringParam(params, key, opts) {
|
|
35
|
+
const value = params[key];
|
|
36
|
+
if (value === undefined || value === null) {
|
|
37
|
+
if (opts?.required) {
|
|
38
|
+
throw new Error(`Missing required parameter: ${key}`);
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return String(value);
|
|
43
|
+
}
|
|
44
|
+
function readNumberParam(params, key, opts) {
|
|
45
|
+
const value = params[key];
|
|
46
|
+
if (value === undefined || value === null)
|
|
47
|
+
return undefined;
|
|
48
|
+
const num = Number(value);
|
|
49
|
+
if (isNaN(num))
|
|
50
|
+
return undefined;
|
|
51
|
+
return opts?.integer ? Math.floor(num) : num;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Download and extract .tex source from arXiv
|
|
55
|
+
*/
|
|
56
|
+
async function downloadTexSource(arxivId, outputDir) {
|
|
57
|
+
const paperDir = path.join(outputDir, arxivId);
|
|
58
|
+
await fs.promises.mkdir(paperDir, { recursive: true });
|
|
59
|
+
const srcUrl = `https://arxiv.org/src/${arxivId}`;
|
|
60
|
+
const tarPath = path.join(paperDir, "source.tar.gz");
|
|
61
|
+
try {
|
|
62
|
+
// Try to download .tex source
|
|
63
|
+
const response = await fetch(srcUrl);
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
// Fallback to PDF
|
|
66
|
+
return await downloadPdfFallback(arxivId, outputDir);
|
|
67
|
+
}
|
|
68
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
69
|
+
await fs.promises.writeFile(tarPath, buffer);
|
|
70
|
+
// Check if it's actually a tar.gz or just a single file
|
|
71
|
+
const isTarGz = buffer[0] === 0x1f && buffer[1] === 0x8b;
|
|
72
|
+
if (isTarGz) {
|
|
73
|
+
// Extract tar.gz
|
|
74
|
+
await tar.x({ file: tarPath, cwd: paperDir });
|
|
75
|
+
await fs.promises.unlink(tarPath); // Remove tar.gz after extraction
|
|
76
|
+
// Find all .tex files
|
|
77
|
+
const files = await findTexFiles(paperDir);
|
|
78
|
+
if (files.length === 0) {
|
|
79
|
+
return await downloadPdfFallback(arxivId, outputDir);
|
|
80
|
+
}
|
|
81
|
+
return { success: true, format: "tex", files };
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Single file (probably .tex directly)
|
|
85
|
+
const texPath = path.join(paperDir, "main.tex");
|
|
86
|
+
await fs.promises.rename(tarPath, texPath);
|
|
87
|
+
return { success: true, format: "tex", files: ["main.tex"] };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Fallback to PDF on any error
|
|
92
|
+
return await downloadPdfFallback(arxivId, outputDir);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async function downloadPdfFallback(arxivId, outputDir) {
|
|
96
|
+
try {
|
|
97
|
+
const pdfUrl = `https://arxiv.org/pdf/${arxivId}.pdf`;
|
|
98
|
+
const response = await fetch(pdfUrl);
|
|
99
|
+
if (!response.ok) {
|
|
100
|
+
return { success: false, format: "pdf", files: [], error: `PDF download failed: ${response.status}` };
|
|
101
|
+
}
|
|
102
|
+
const pdfPath = path.join(outputDir, `${arxivId}.pdf`);
|
|
103
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
104
|
+
await fs.promises.writeFile(pdfPath, buffer);
|
|
105
|
+
return { success: true, format: "pdf", files: [`${arxivId}.pdf`] };
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return { success: false, format: "pdf", files: [], error: String(error) };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function findTexFiles(dir) {
|
|
112
|
+
const files = [];
|
|
113
|
+
const entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
const fullPath = path.join(dir, entry.name);
|
|
116
|
+
if (entry.isDirectory()) {
|
|
117
|
+
const subFiles = await findTexFiles(fullPath);
|
|
118
|
+
files.push(...subFiles.map((f) => path.join(entry.name, f)));
|
|
119
|
+
}
|
|
120
|
+
else if (entry.name.endsWith(".tex")) {
|
|
121
|
+
files.push(entry.name);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return files;
|
|
125
|
+
}
|
|
126
|
+
function buildSearchUrl(query, maxResults, sortBy, dateFrom) {
|
|
127
|
+
let searchQuery = query;
|
|
128
|
+
if (dateFrom) {
|
|
129
|
+
// ArXiv date filter format: submittedDate:[YYYYMMDD0000+TO+*]
|
|
130
|
+
const dateFormatted = dateFrom.replace(/-/g, "");
|
|
131
|
+
searchQuery = `${query} AND submittedDate:[${dateFormatted}0000 TO 99991231]`;
|
|
132
|
+
}
|
|
133
|
+
const params = new URLSearchParams({
|
|
134
|
+
search_query: searchQuery,
|
|
135
|
+
start: "0",
|
|
136
|
+
max_results: String(maxResults),
|
|
137
|
+
sortBy,
|
|
138
|
+
sortOrder: "descending",
|
|
139
|
+
});
|
|
140
|
+
return `${ARXIV_API_URL}?${params.toString()}`;
|
|
141
|
+
}
|
|
142
|
+
function parseAtomXml(xml) {
|
|
143
|
+
const papers = [];
|
|
144
|
+
const entryRegex = /<entry>([\s\S]*?)<\/entry>/g;
|
|
145
|
+
let match;
|
|
146
|
+
while ((match = entryRegex.exec(xml)) !== null) {
|
|
147
|
+
const entry = match[1];
|
|
148
|
+
const getTag = (tag) => {
|
|
149
|
+
const m = entry.match(new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`));
|
|
150
|
+
return m ? m[1].trim() : "";
|
|
151
|
+
};
|
|
152
|
+
const title = getTag("title").replace(/\s+/g, " ");
|
|
153
|
+
const abstract = getTag("summary").replace(/\s+/g, " ");
|
|
154
|
+
const published = getTag("published");
|
|
155
|
+
const updated = getTag("updated");
|
|
156
|
+
// Extract arXiv ID from <id> tag
|
|
157
|
+
const idUrl = getTag("id");
|
|
158
|
+
const arxivId = idUrl.replace("http://arxiv.org/abs/", "").replace(/v\d+$/, "");
|
|
159
|
+
// Extract authors
|
|
160
|
+
const authors = [];
|
|
161
|
+
const authorRegex = /<author>\s*<name>([^<]+)<\/name>/g;
|
|
162
|
+
let authorMatch;
|
|
163
|
+
while ((authorMatch = authorRegex.exec(entry)) !== null) {
|
|
164
|
+
authors.push(authorMatch[1].trim());
|
|
165
|
+
}
|
|
166
|
+
// Extract PDF link
|
|
167
|
+
const pdfMatch = entry.match(/<link[^>]+title="pdf"[^>]+href="([^"]+)"/);
|
|
168
|
+
const pdfUrl = pdfMatch ? pdfMatch[1] : `https://arxiv.org/pdf/${arxivId}`;
|
|
169
|
+
// Extract categories
|
|
170
|
+
const categories = [];
|
|
171
|
+
const catRegex = /<category[^>]+term="([^"]+)"/g;
|
|
172
|
+
let catMatch;
|
|
173
|
+
while ((catMatch = catRegex.exec(entry)) !== null) {
|
|
174
|
+
categories.push(catMatch[1]);
|
|
175
|
+
}
|
|
176
|
+
if (title && arxivId) {
|
|
177
|
+
papers.push({ title, authors, abstract, arxivId, pdfUrl, published, updated, categories });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return papers;
|
|
181
|
+
}
|
|
182
|
+
export function createArxivTool() {
|
|
183
|
+
return {
|
|
184
|
+
label: "ArXiv",
|
|
185
|
+
name: "arxiv",
|
|
186
|
+
description: "Search arXiv.org for academic papers by keyword. Returns titles, authors, abstracts, and IDs. Optionally downloads .tex source files.",
|
|
187
|
+
parameters: ArxivToolSchema,
|
|
188
|
+
execute: async (_toolCallId, rawArgs) => {
|
|
189
|
+
const params = rawArgs;
|
|
190
|
+
const query = readStringParam(params, "query", { required: true });
|
|
191
|
+
const maxResults = Math.min(readNumberParam(params, "max_results", { integer: true }) ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_LIMIT);
|
|
192
|
+
const rawSort = readStringParam(params, "sort_by") ?? "relevance";
|
|
193
|
+
const sortBy = SORT_MAP[rawSort.toLowerCase()] ?? "relevance";
|
|
194
|
+
const dateFrom = readStringParam(params, "date_from");
|
|
195
|
+
const download = params.download === true || params.download === "true";
|
|
196
|
+
const outputDir = readStringParam(params, "output_dir") ??
|
|
197
|
+
path.join(os.homedir(), ".openclaw", "workspace", "papers");
|
|
198
|
+
const url = buildSearchUrl(query, maxResults, sortBy, dateFrom);
|
|
199
|
+
let response;
|
|
200
|
+
try {
|
|
201
|
+
response = await fetch(url);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
return {
|
|
205
|
+
type: "tool_result",
|
|
206
|
+
content: JSON.stringify({
|
|
207
|
+
error: "network_error",
|
|
208
|
+
message: `Failed to reach arXiv API: ${error instanceof Error ? error.message : String(error)}`,
|
|
209
|
+
}),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
if (!response.ok) {
|
|
213
|
+
return {
|
|
214
|
+
type: "tool_result",
|
|
215
|
+
content: JSON.stringify({
|
|
216
|
+
error: "api_error",
|
|
217
|
+
message: `arXiv API returned ${response.status}: ${response.statusText}`,
|
|
218
|
+
}),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const xml = await response.text();
|
|
222
|
+
const papers = parseAtomXml(xml);
|
|
223
|
+
// If download requested, download .tex source for each paper
|
|
224
|
+
let downloads;
|
|
225
|
+
if (download && papers.length > 0) {
|
|
226
|
+
await fs.promises.mkdir(outputDir, { recursive: true });
|
|
227
|
+
downloads = [];
|
|
228
|
+
for (const paper of papers) {
|
|
229
|
+
const result = await downloadTexSource(paper.arxivId, outputDir);
|
|
230
|
+
downloads.push({
|
|
231
|
+
arxiv_id: paper.arxivId,
|
|
232
|
+
format: result.format,
|
|
233
|
+
files: result.files,
|
|
234
|
+
error: result.error,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
type: "tool_result",
|
|
240
|
+
content: JSON.stringify({
|
|
241
|
+
query,
|
|
242
|
+
total: papers.length,
|
|
243
|
+
papers: papers.map((p) => ({
|
|
244
|
+
title: p.title,
|
|
245
|
+
authors: p.authors,
|
|
246
|
+
abstract: p.abstract,
|
|
247
|
+
arxiv_id: p.arxivId,
|
|
248
|
+
pdf_url: p.pdfUrl,
|
|
249
|
+
published: p.published,
|
|
250
|
+
categories: p.categories,
|
|
251
|
+
})),
|
|
252
|
+
...(downloads && { downloads, output_dir: outputDir }),
|
|
253
|
+
}),
|
|
254
|
+
};
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=arxiv-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arxiv-tool.js","sourceRoot":"","sources":["../../../src/tools/arxiv-tool.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "scientify",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Scientify - AI-powered research workflow automation for OpenClaw. Includes idea generation, literature review, research pipeline skills, and arxiv tool.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"skills"
|
|
11
|
+
],
|
|
12
|
+
"keywords": [
|
|
13
|
+
"openclaw",
|
|
14
|
+
"openclaw-plugin",
|
|
15
|
+
"research",
|
|
16
|
+
"arxiv",
|
|
17
|
+
"academic",
|
|
18
|
+
"literature-review",
|
|
19
|
+
"idea-generation"
|
|
20
|
+
],
|
|
21
|
+
"author": "tsingyuai",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/scientify/scientify"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"openclaw": "workspace:*",
|
|
34
|
+
"@sinclair/typebox": "^0.32.0",
|
|
35
|
+
"tar": "^7.0.0",
|
|
36
|
+
"typescript": "^5.3.0",
|
|
37
|
+
"@types/node": "^20.0.0"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"openclaw": ">=2024.0.0"
|
|
41
|
+
},
|
|
42
|
+
"openclaw": {
|
|
43
|
+
"extensions": [
|
|
44
|
+
"./dist/index.js"
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
}
|