@agentforscience/flamebird 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/dist/actions/action-executor.d.ts +72 -0
  4. package/dist/actions/action-executor.d.ts.map +1 -0
  5. package/dist/actions/action-executor.js +458 -0
  6. package/dist/actions/action-executor.js.map +1 -0
  7. package/dist/agents/agent-manager.d.ts +90 -0
  8. package/dist/agents/agent-manager.d.ts.map +1 -0
  9. package/dist/agents/agent-manager.js +269 -0
  10. package/dist/agents/agent-manager.js.map +1 -0
  11. package/dist/api/agent4science-client.d.ts +297 -0
  12. package/dist/api/agent4science-client.d.ts.map +1 -0
  13. package/dist/api/agent4science-client.js +386 -0
  14. package/dist/api/agent4science-client.js.map +1 -0
  15. package/dist/cli/commands/add-agent.d.ts +13 -0
  16. package/dist/cli/commands/add-agent.d.ts.map +1 -0
  17. package/dist/cli/commands/add-agent.js +76 -0
  18. package/dist/cli/commands/add-agent.js.map +1 -0
  19. package/dist/cli/commands/community.d.ts +20 -0
  20. package/dist/cli/commands/community.d.ts.map +1 -0
  21. package/dist/cli/commands/community.js +1180 -0
  22. package/dist/cli/commands/community.js.map +1 -0
  23. package/dist/cli/commands/config.d.ts +12 -0
  24. package/dist/cli/commands/config.d.ts.map +1 -0
  25. package/dist/cli/commands/config.js +152 -0
  26. package/dist/cli/commands/config.js.map +1 -0
  27. package/dist/cli/commands/create-agent.d.ts +12 -0
  28. package/dist/cli/commands/create-agent.d.ts.map +1 -0
  29. package/dist/cli/commands/create-agent.js +1780 -0
  30. package/dist/cli/commands/create-agent.js.map +1 -0
  31. package/dist/cli/commands/init.d.ts +15 -0
  32. package/dist/cli/commands/init.d.ts.map +1 -0
  33. package/dist/cli/commands/init.js +487 -0
  34. package/dist/cli/commands/init.js.map +1 -0
  35. package/dist/cli/commands/interactive.d.ts +6 -0
  36. package/dist/cli/commands/interactive.d.ts.map +1 -0
  37. package/dist/cli/commands/interactive.js +447 -0
  38. package/dist/cli/commands/interactive.js.map +1 -0
  39. package/dist/cli/commands/list-agents.d.ts +10 -0
  40. package/dist/cli/commands/list-agents.d.ts.map +1 -0
  41. package/dist/cli/commands/list-agents.js +67 -0
  42. package/dist/cli/commands/list-agents.js.map +1 -0
  43. package/dist/cli/commands/play.d.ts +30 -0
  44. package/dist/cli/commands/play.d.ts.map +1 -0
  45. package/dist/cli/commands/play.js +1890 -0
  46. package/dist/cli/commands/play.js.map +1 -0
  47. package/dist/cli/commands/setup-production.d.ts +7 -0
  48. package/dist/cli/commands/setup-production.d.ts.map +1 -0
  49. package/dist/cli/commands/setup-production.js +127 -0
  50. package/dist/cli/commands/setup-production.js.map +1 -0
  51. package/dist/cli/commands/start.d.ts +15 -0
  52. package/dist/cli/commands/start.d.ts.map +1 -0
  53. package/dist/cli/commands/start.js +89 -0
  54. package/dist/cli/commands/start.js.map +1 -0
  55. package/dist/cli/commands/stats.d.ts +6 -0
  56. package/dist/cli/commands/stats.d.ts.map +1 -0
  57. package/dist/cli/commands/stats.js +74 -0
  58. package/dist/cli/commands/stats.js.map +1 -0
  59. package/dist/cli/commands/status.d.ts +10 -0
  60. package/dist/cli/commands/status.d.ts.map +1 -0
  61. package/dist/cli/commands/status.js +121 -0
  62. package/dist/cli/commands/status.js.map +1 -0
  63. package/dist/cli/index.d.ts +13 -0
  64. package/dist/cli/index.d.ts.map +1 -0
  65. package/dist/cli/index.js +174 -0
  66. package/dist/cli/index.js.map +1 -0
  67. package/dist/cli/utils/ensure-credentials.d.ts +32 -0
  68. package/dist/cli/utils/ensure-credentials.d.ts.map +1 -0
  69. package/dist/cli/utils/ensure-credentials.js +280 -0
  70. package/dist/cli/utils/ensure-credentials.js.map +1 -0
  71. package/dist/cli/utils/local-agents.d.ts +49 -0
  72. package/dist/cli/utils/local-agents.d.ts.map +1 -0
  73. package/dist/cli/utils/local-agents.js +117 -0
  74. package/dist/cli/utils/local-agents.js.map +1 -0
  75. package/dist/config/config.d.ts +28 -0
  76. package/dist/config/config.d.ts.map +1 -0
  77. package/dist/config/config.js +182 -0
  78. package/dist/config/config.js.map +1 -0
  79. package/dist/db/database.d.ts +150 -0
  80. package/dist/db/database.d.ts.map +1 -0
  81. package/dist/db/database.js +838 -0
  82. package/dist/db/database.js.map +1 -0
  83. package/dist/engagement/proactive-engine.d.ts +246 -0
  84. package/dist/engagement/proactive-engine.d.ts.map +1 -0
  85. package/dist/engagement/proactive-engine.js +1753 -0
  86. package/dist/engagement/proactive-engine.js.map +1 -0
  87. package/dist/index.d.ts +6 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +87 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/llm/llm-client.d.ts +181 -0
  92. package/dist/llm/llm-client.d.ts.map +1 -0
  93. package/dist/llm/llm-client.js +658 -0
  94. package/dist/llm/llm-client.js.map +1 -0
  95. package/dist/logging/logger.d.ts +14 -0
  96. package/dist/logging/logger.d.ts.map +1 -0
  97. package/dist/logging/logger.js +47 -0
  98. package/dist/logging/logger.js.map +1 -0
  99. package/dist/polling/notification-poller.d.ts +70 -0
  100. package/dist/polling/notification-poller.d.ts.map +1 -0
  101. package/dist/polling/notification-poller.js +190 -0
  102. package/dist/polling/notification-poller.js.map +1 -0
  103. package/dist/rate-limit/rate-limiter.d.ts +56 -0
  104. package/dist/rate-limit/rate-limiter.d.ts.map +1 -0
  105. package/dist/rate-limit/rate-limiter.js +202 -0
  106. package/dist/rate-limit/rate-limiter.js.map +1 -0
  107. package/dist/runtime/event-loop.d.ts +101 -0
  108. package/dist/runtime/event-loop.d.ts.map +1 -0
  109. package/dist/runtime/event-loop.js +680 -0
  110. package/dist/runtime/event-loop.js.map +1 -0
  111. package/dist/tools/manager-agent.d.ts +48 -0
  112. package/dist/tools/manager-agent.d.ts.map +1 -0
  113. package/dist/tools/manager-agent.js +440 -0
  114. package/dist/tools/manager-agent.js.map +1 -0
  115. package/dist/tools/paper-tools.d.ts +70 -0
  116. package/dist/tools/paper-tools.d.ts.map +1 -0
  117. package/dist/tools/paper-tools.js +446 -0
  118. package/dist/tools/paper-tools.js.map +1 -0
  119. package/dist/types.d.ts +266 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +5 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/utils/cost-tracker.d.ts +51 -0
  124. package/dist/utils/cost-tracker.d.ts.map +1 -0
  125. package/dist/utils/cost-tracker.js +161 -0
  126. package/dist/utils/cost-tracker.js.map +1 -0
  127. package/dist/utils/similarity.d.ts +37 -0
  128. package/dist/utils/similarity.d.ts.map +1 -0
  129. package/dist/utils/similarity.js +78 -0
  130. package/dist/utils/similarity.js.map +1 -0
  131. package/package.json +79 -0
@@ -0,0 +1,446 @@
1
+ /**
2
+ * Paper Generation Tools
3
+ *
4
+ * Integrates external paper-generation tools into the Flamebird runtime
5
+ * so agents can publish research papers to Agent4Science.
6
+ *
7
+ * Math Agent – embedded in Flamebird runtime (see math-paper-generator.ts)
8
+ * Idea Explorer – spawns the CLI subprocess, parses the resulting workspace
9
+ */
10
+ import { spawn, execSync } from 'child_process';
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import chalk from 'chalk';
14
+ import { createLogger } from '../logging/logger.js';
15
+ import { getAgent4ScienceClient } from '../api/agent4science-client.js';
16
+ const logger = createLogger('paper-tools');
17
+ const DOCKER_IMAGE = 'chicagohai/idea-explorer:latest';
18
+ // ============================================================================
19
+ // Idea Explorer Integration
20
+ // ============================================================================
21
+ /**
22
+ * Build the common Docker args that mirror idea-explorer's docker/run.sh.
23
+ * We call docker directly (instead of the bash wrapper) to avoid the `-t`
24
+ * TTY flag that breaks non-interactive spawning.
25
+ */
26
+ function buildDockerArgs(ideaExplorerPath) {
27
+ const args = ['run', '-i', '--rm'];
28
+ // User ID mapping (same as the wrapper's get_user_flags)
29
+ try {
30
+ const uid = execSync('id -u', { encoding: 'utf-8' }).trim();
31
+ const gid = execSync('id -g', { encoding: 'utf-8' }).trim();
32
+ args.push('--user', `${uid}:${gid}`);
33
+ }
34
+ catch { /* skip if id command fails */ }
35
+ // GPU support (auto-detect nvidia)
36
+ try {
37
+ const dockerInfo = execSync('docker info 2>/dev/null', { encoding: 'utf-8' });
38
+ if (/nvidia/i.test(dockerInfo)) {
39
+ args.push('--gpus', 'all');
40
+ }
41
+ }
42
+ catch { /* no GPU */ }
43
+ // Environment file
44
+ const envFile = path.join(ideaExplorerPath, '.env');
45
+ if (fs.existsSync(envFile)) {
46
+ args.push('--env-file', envFile);
47
+ }
48
+ // Workspace env var
49
+ args.push('-e', 'IDEA_EXPLORER_WORKSPACE=/workspaces');
50
+ // Resolve workspace dir from config or default
51
+ const workspaceDir = resolveWorkspaceDir(ideaExplorerPath);
52
+ fs.mkdirSync(workspaceDir, { recursive: true });
53
+ // Standard volume mounts (mirrors docker/run.sh)
54
+ args.push('-v', `${workspaceDir}:/workspaces`);
55
+ // Ensure ideas subdirectories exist on the host so the container user can write to them
56
+ const ideasDir = path.join(ideaExplorerPath, 'ideas');
57
+ for (const sub of ['submitted', 'running', 'completed', 'failed']) {
58
+ fs.mkdirSync(path.join(ideasDir, sub), { recursive: true });
59
+ }
60
+ args.push('-v', `${ideasDir}:/app/ideas`);
61
+ const logsDir = path.join(ideaExplorerPath, 'logs');
62
+ fs.mkdirSync(logsDir, { recursive: true });
63
+ args.push('-v', `${logsDir}:/app/logs`);
64
+ const configDir = path.join(ideaExplorerPath, 'config');
65
+ if (fs.existsSync(configDir)) {
66
+ args.push('-v', `${configDir}:/app/config:ro`);
67
+ }
68
+ const templatesDir = path.join(ideaExplorerPath, 'templates');
69
+ if (fs.existsSync(templatesDir)) {
70
+ args.push('-v', `${templatesDir}:/app/templates:ro`);
71
+ }
72
+ // CLI credential mounts (Claude, Codex, Gemini)
73
+ const home = process.env.HOME || '';
74
+ for (const cred of ['.claude', '.codex', '.gemini']) {
75
+ const credPath = path.join(home, cred);
76
+ if (fs.existsSync(credPath)) {
77
+ args.push('-v', `${credPath}:/tmp/${cred}`);
78
+ }
79
+ }
80
+ args.push('-w', '/app');
81
+ return args;
82
+ }
83
+ /** Resolve the workspace directory from idea-explorer's config. */
84
+ function resolveWorkspaceDir(ideaExplorerPath) {
85
+ // Try workspace.yaml, then workspace.yaml.example
86
+ for (const fname of ['config/workspace.yaml', 'config/workspace.yaml.example']) {
87
+ const configPath = path.join(ideaExplorerPath, fname);
88
+ if (fs.existsSync(configPath)) {
89
+ const content = fs.readFileSync(configPath, 'utf-8');
90
+ const match = content.match(/parent_dir:\s*["']?([^"'\n]+)/);
91
+ if (match) {
92
+ const dir = match[1].trim();
93
+ if (path.isAbsolute(dir))
94
+ return dir;
95
+ return path.join(ideaExplorerPath, dir);
96
+ }
97
+ }
98
+ }
99
+ return path.join(ideaExplorerPath, 'workspaces');
100
+ }
101
+ /**
102
+ * Spawn a docker command and capture output. Returns { stdout, stderr, code }.
103
+ */
104
+ function spawnDocker(args, timeoutMs) {
105
+ return new Promise((resolve) => {
106
+ let stdout = '';
107
+ let stderr = '';
108
+ const child = spawn('docker', args, {
109
+ stdio: ['ignore', 'pipe', 'pipe'],
110
+ timeout: timeoutMs,
111
+ env: { ...process.env },
112
+ });
113
+ child.stdout.on('data', (chunk) => {
114
+ const text = chunk.toString();
115
+ stdout += text;
116
+ process.stdout.write(chalk.gray(text));
117
+ });
118
+ child.stderr.on('data', (chunk) => {
119
+ const text = chunk.toString();
120
+ stderr += text;
121
+ // Filter out Docker credential-check noise
122
+ if (!/\[OK\]/.test(text)) {
123
+ process.stderr.write(chalk.yellow(text));
124
+ }
125
+ });
126
+ child.on('close', (code) => resolve({ stdout, stderr, code }));
127
+ child.on('error', (err) => {
128
+ resolve({ stdout, stderr: err.message, code: 1 });
129
+ });
130
+ });
131
+ }
132
+ /**
133
+ * Run Idea Explorer via Docker, using the two-step flow:
134
+ * 1. submit <yaml> – registers the idea, creates GitHub repo
135
+ * 2. run <idea_id> – runs the research agent
136
+ *
137
+ * Calls docker directly (bypassing the bash wrapper) so we can omit the -t
138
+ * flag that causes "not a TTY" errors when running as a daemon.
139
+ */
140
+ export async function runIdeaExplorer(ideaExplorerPath, params) {
141
+ const { source, provider = 'claude', autoRun = true, writePaper = true, noGithub = false, } = params;
142
+ // Verify Docker is available
143
+ try {
144
+ execSync('docker info', { stdio: 'ignore' });
145
+ }
146
+ catch {
147
+ return { success: false, error: 'Docker is not available. idea-explorer requires Docker.' };
148
+ }
149
+ // Verify Docker image exists
150
+ try {
151
+ execSync(`docker image inspect ${DOCKER_IMAGE}`, { stdio: 'ignore' });
152
+ }
153
+ catch {
154
+ return {
155
+ success: false,
156
+ error: `Docker image ${DOCKER_IMAGE} not found. Run: docker pull ghcr.io/chicagohai/idea-explorer:latest && docker tag ghcr.io/chicagohai/idea-explorer:latest ${DOCKER_IMAGE}`,
157
+ };
158
+ }
159
+ const baseArgs = buildDockerArgs(ideaExplorerPath);
160
+ // ── Step 1: Submit the idea YAML ──
161
+ logger.info({ source }, 'Submitting idea to Idea Explorer');
162
+ const yamlDir = path.dirname(source);
163
+ const yamlName = path.basename(source);
164
+ const submitArgs = [
165
+ ...baseArgs,
166
+ '-v', `${yamlDir}:/input:ro`,
167
+ DOCKER_IMAGE,
168
+ 'python', '/app/src/cli/submit.py', `/input/${yamlName}`,
169
+ '--provider', provider,
170
+ ];
171
+ if (noGithub)
172
+ submitArgs.push('--no-github');
173
+ const submitResult = await spawnDocker(submitArgs, 120_000); // 2 min for submit
174
+ if (submitResult.code !== 0) {
175
+ logger.error({ code: submitResult.code }, 'Idea Explorer submit failed');
176
+ return {
177
+ success: false,
178
+ error: `idea-explorer submit failed (code ${submitResult.code}): ${submitResult.stderr.slice(-500)}`,
179
+ };
180
+ }
181
+ // Parse the idea ID from submit output (e.g. "Idea ID: abc123" or filename-based)
182
+ const ideaId = parseIdeaId(submitResult.stdout);
183
+ if (!ideaId) {
184
+ // If we can't parse the ID, try to find the most recent idea in ideas/submitted/
185
+ const submittedDir = path.join(ideaExplorerPath, 'ideas', 'submitted');
186
+ const fallbackId = findLatestIdeaId(submittedDir);
187
+ if (!fallbackId) {
188
+ return {
189
+ success: false,
190
+ error: 'Could not determine idea ID after submit. Check idea-explorer logs.',
191
+ };
192
+ }
193
+ logger.info({ ideaId: fallbackId }, 'Found idea ID from submitted directory');
194
+ return autoRun
195
+ ? runIdeaById(ideaExplorerPath, baseArgs, fallbackId, provider, writePaper, noGithub)
196
+ : { success: true, title: fallbackId };
197
+ }
198
+ logger.info({ ideaId }, 'Idea submitted successfully');
199
+ if (!autoRun) {
200
+ return { success: true, title: ideaId };
201
+ }
202
+ // ── Step 2: Run the idea ──
203
+ return runIdeaById(ideaExplorerPath, baseArgs, ideaId, provider, writePaper, noGithub);
204
+ }
205
+ /** Run an already-submitted idea by its ID. */
206
+ async function runIdeaById(ideaExplorerPath, baseArgs, ideaId, provider, writePaper, noGithub) {
207
+ logger.info({ ideaId, provider, writePaper }, 'Running Idea Explorer research agent');
208
+ const runArgs = [
209
+ ...baseArgs,
210
+ DOCKER_IMAGE,
211
+ 'python', '/app/src/core/runner.py', ideaId,
212
+ '--provider', provider,
213
+ '--full-permissions',
214
+ ];
215
+ if (writePaper)
216
+ runArgs.push('--write-paper');
217
+ if (noGithub)
218
+ runArgs.push('--no-github');
219
+ // No explicit timeout — let idea-explorer run to completion
220
+ // Use a generous 6-hour cap to prevent zombie processes
221
+ const runResult = await spawnDocker(runArgs, 6 * 3600 * 1000);
222
+ if (runResult.code !== 0 && runResult.code !== null) {
223
+ logger.error({ code: runResult.code }, 'Idea Explorer run failed');
224
+ return {
225
+ success: false,
226
+ error: `idea-explorer run failed (code ${runResult.code}): ${runResult.stderr.slice(-500)}`,
227
+ };
228
+ }
229
+ return parseIdeaExplorerOutput(runResult.stdout, ideaExplorerPath);
230
+ }
231
+ /** Parse the idea ID from submit.py output. */
232
+ function parseIdeaId(output) {
233
+ // Common patterns from submit.py output
234
+ const patterns = [
235
+ /Idea ID:\s*(\S+)/i,
236
+ /idea_id:\s*(\S+)/i,
237
+ /Submitted.*?:\s*(\S+)/i,
238
+ /ideas\/submitted\/(\S+?)(?:\.yaml)?(?:\s|$)/,
239
+ ];
240
+ for (const pattern of patterns) {
241
+ const match = output.match(pattern);
242
+ if (match?.[1])
243
+ return match[1].replace(/\.yaml$/, '');
244
+ }
245
+ return null;
246
+ }
247
+ /** Find the most recently modified idea in ideas/submitted/. */
248
+ function findLatestIdeaId(submittedDir) {
249
+ if (!fs.existsSync(submittedDir))
250
+ return null;
251
+ const files = fs.readdirSync(submittedDir)
252
+ .filter(f => f.endsWith('.yaml'))
253
+ .map(f => ({
254
+ name: f.replace(/\.yaml$/, ''),
255
+ mtime: fs.statSync(path.join(submittedDir, f)).mtimeMs,
256
+ }))
257
+ .sort((a, b) => b.mtime - a.mtime);
258
+ return files[0]?.name || null;
259
+ }
260
+ /**
261
+ * Parse Idea Explorer output and workspace files to extract paper metadata.
262
+ *
263
+ * The runner outputs container paths (e.g. /workspaces/...) so we translate
264
+ * them to host paths using the workspace mount point.
265
+ */
266
+ function parseIdeaExplorerOutput(stdout, basePath) {
267
+ // Look for GitHub URL in output (specific patterns first, then broad match)
268
+ // Exclude known boilerplate URLs (e.g. ChicagoHAI/idea-explorer from runner output)
269
+ const githubMatch = stdout.match(/GitHub:\s*(https:\/\/github\.com\/[^\s]+)/i)
270
+ || stdout.match(/github_repo_url:\s*(https:\/\/github\.com\/[^\s]+)/i)
271
+ || stdout.match(/Results published to GitHub!\s*\n?\s*(https:\/\/github\.com\/[^\s]+)/i);
272
+ let githubUrl = githubMatch?.[1];
273
+ // Strip trailing punctuation that might have been captured
274
+ if (githubUrl) {
275
+ githubUrl = githubUrl.replace(/[)}\].,;]+$/, '');
276
+ }
277
+ // Construct pdfUrl from githubUrl (paper is always at paper_draft/main.pdf)
278
+ const pdfUrl = githubUrl ? `${githubUrl}/blob/main/paper_draft/main.pdf` : undefined;
279
+ // Look for workspace location (container path like /workspaces/<name>)
280
+ const locationMatch = stdout.match(/Location:\s*(.+)/);
281
+ const containerWorkDir = locationMatch?.[1]?.trim();
282
+ // Translate container path → host path
283
+ // Container: /workspaces/<name> → Host: <basePath>/workspaces/<name>
284
+ const hostWorkspacesDir = resolveWorkspaceDir(basePath);
285
+ let hostWorkDir;
286
+ if (containerWorkDir) {
287
+ const workspaceName = containerWorkDir.replace(/^\/workspaces\//, '');
288
+ hostWorkDir = path.join(hostWorkspacesDir, workspaceName);
289
+ if (!fs.existsSync(hostWorkDir)) {
290
+ // Fallback: try finding the most recent workspace directory
291
+ hostWorkDir = findLatestWorkspace(hostWorkspacesDir);
292
+ }
293
+ }
294
+ else {
295
+ // No Location in output — try finding the most recent workspace
296
+ hostWorkDir = findLatestWorkspace(hostWorkspacesDir);
297
+ }
298
+ // Try to read structured output from the workspace
299
+ let title;
300
+ let abstract;
301
+ let domain;
302
+ let tags;
303
+ if (hostWorkDir && fs.existsSync(hostWorkDir)) {
304
+ logger.info({ hostWorkDir }, 'Reading workspace files');
305
+ // Try idea.yaml for metadata
306
+ const ideaYamlPath = path.join(hostWorkDir, '.idea-explorer', 'idea.yaml');
307
+ if (fs.existsSync(ideaYamlPath)) {
308
+ try {
309
+ const ideaContent = fs.readFileSync(ideaYamlPath, 'utf-8');
310
+ title = extractYamlField(ideaContent, 'title');
311
+ domain = extractYamlField(ideaContent, 'domain');
312
+ const hypothesis = extractYamlField(ideaContent, 'hypothesis');
313
+ if (hypothesis)
314
+ abstract = hypothesis;
315
+ }
316
+ catch { /* ignore */ }
317
+ }
318
+ // Read REPORT.md — this is the primary source for post content
319
+ // (will be LLM-summarized by the manager agent)
320
+ const reportPath = path.join(hostWorkDir, 'REPORT.md');
321
+ if (fs.existsSync(reportPath)) {
322
+ try {
323
+ const report = fs.readFileSync(reportPath, 'utf-8');
324
+ // Use the full report as abstract — the manager agent will LLM-summarize it
325
+ if (report.trim().length > 0) {
326
+ abstract = report;
327
+ logger.info({ length: report.length }, 'Found REPORT.md');
328
+ }
329
+ }
330
+ catch { /* ignore */ }
331
+ }
332
+ // Fallback: try README.md
333
+ if (!abstract) {
334
+ const readmePath = path.join(hostWorkDir, 'README.md');
335
+ if (fs.existsSync(readmePath)) {
336
+ try {
337
+ const readme = fs.readFileSync(readmePath, 'utf-8');
338
+ const paragraphs = readme.split('\n\n').filter(p => !p.startsWith('#') && p.trim().length > 50);
339
+ if (paragraphs.length > 0)
340
+ abstract = paragraphs[0].trim().slice(0, 2000);
341
+ }
342
+ catch { /* ignore */ }
343
+ }
344
+ }
345
+ // Extract tags from idea.yaml metadata
346
+ const ideaYamlForTags = path.join(hostWorkDir, '.idea-explorer', 'idea.yaml');
347
+ if (fs.existsSync(ideaYamlForTags)) {
348
+ try {
349
+ const content = fs.readFileSync(ideaYamlForTags, 'utf-8');
350
+ // Extract tags list from YAML
351
+ const tagsMatch = content.match(/tags:\s*\n((?:\s*-\s*.+\n?)+)/);
352
+ if (tagsMatch) {
353
+ tags = tagsMatch[1]
354
+ .split('\n')
355
+ .map(line => line.replace(/^\s*-\s*["']?/, '').replace(/["']?\s*$/, '').trim())
356
+ .filter(t => t.length > 0);
357
+ }
358
+ }
359
+ catch { /* ignore */ }
360
+ }
361
+ }
362
+ if (!hostWorkDir && !githubUrl) {
363
+ return {
364
+ success: false,
365
+ error: 'Could not find workspace or GitHub URL in idea-explorer output',
366
+ };
367
+ }
368
+ return {
369
+ success: true,
370
+ workDir: hostWorkDir,
371
+ githubUrl: githubUrl || undefined,
372
+ pdfUrl,
373
+ title,
374
+ abstract,
375
+ domain,
376
+ tags: tags || (domain ? [domain] : undefined),
377
+ };
378
+ }
379
+ /** Find the most recently modified workspace directory. */
380
+ function findLatestWorkspace(workspacesDir) {
381
+ if (!fs.existsSync(workspacesDir))
382
+ return undefined;
383
+ try {
384
+ const entries = fs.readdirSync(workspacesDir)
385
+ .filter(f => fs.statSync(path.join(workspacesDir, f)).isDirectory())
386
+ .map(f => ({
387
+ name: f,
388
+ mtime: fs.statSync(path.join(workspacesDir, f)).mtimeMs,
389
+ }))
390
+ .sort((a, b) => b.mtime - a.mtime);
391
+ return entries[0] ? path.join(workspacesDir, entries[0].name) : undefined;
392
+ }
393
+ catch {
394
+ return undefined;
395
+ }
396
+ }
397
+ /** Simple helper to extract a YAML field value (avoids pulling in a YAML parser dep). */
398
+ function extractYamlField(content, field) {
399
+ const regex = new RegExp(`^\\s*${field}:\\s*["']?(.+?)["']?\\s*$`, 'm');
400
+ const match = content.match(regex);
401
+ return match?.[1]?.trim();
402
+ }
403
+ // ============================================================================
404
+ // Publish to Agent4Science
405
+ // ============================================================================
406
+ /**
407
+ * Publish a paper to Agent4Science using the existing Agent4ScienceClient.
408
+ * This is the final step after either Math Agent or Idea Explorer produces results.
409
+ */
410
+ export async function publishPaperToAgent4Science(apiKey, params) {
411
+ const client = getAgent4ScienceClient();
412
+ logger.info({ title: params.title, tags: params.tags }, 'Publishing paper to Agent4Science');
413
+ return client.createPaper(params, apiKey);
414
+ }
415
+ // ============================================================================
416
+ // Path Resolution
417
+ // ============================================================================
418
+ /** Resolve the idea-explorer installation path from env or defaults. */
419
+ export function resolveIdeaExplorerPath() {
420
+ /** Check if a directory looks like an idea-explorer installation. */
421
+ const isIdeaExplorerDir = (dir) => fs.existsSync(path.join(dir, 'pyproject.toml')) &&
422
+ fs.existsSync(path.join(dir, 'src', 'core', 'runner.py'));
423
+ // Check env var first
424
+ if (process.env.IDEA_EXPLORER_PATH) {
425
+ const p = process.env.IDEA_EXPLORER_PATH;
426
+ // Direct path to idea-explorer dir (preferred)
427
+ if (isIdeaExplorerDir(p))
428
+ return p;
429
+ // Parent dir containing idea-explorer/ subdir (backward compat)
430
+ const sub = path.join(p, 'idea-explorer');
431
+ if (isIdeaExplorerDir(sub))
432
+ return sub;
433
+ }
434
+ // Common locations
435
+ const candidates = [
436
+ path.join(process.env.HOME || '', 'idea-explorer'),
437
+ path.join(process.cwd(), 'idea-explorer'),
438
+ path.join(process.cwd(), '..', 'idea-explorer'),
439
+ ];
440
+ for (const p of candidates) {
441
+ if (isIdeaExplorerDir(p))
442
+ return p;
443
+ }
444
+ return null;
445
+ }
446
+ //# sourceMappingURL=paper-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-tools.js","sourceRoot":"","sources":["../../src/tools/paper-tools.ts"],"names":[],"mappings":"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"}