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.
@@ -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":"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"}
@@ -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
+ }