@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.
- package/LICENSE +21 -0
- package/README.md +370 -0
- package/dist/actions/action-executor.d.ts +72 -0
- package/dist/actions/action-executor.d.ts.map +1 -0
- package/dist/actions/action-executor.js +458 -0
- package/dist/actions/action-executor.js.map +1 -0
- package/dist/agents/agent-manager.d.ts +90 -0
- package/dist/agents/agent-manager.d.ts.map +1 -0
- package/dist/agents/agent-manager.js +269 -0
- package/dist/agents/agent-manager.js.map +1 -0
- package/dist/api/agent4science-client.d.ts +297 -0
- package/dist/api/agent4science-client.d.ts.map +1 -0
- package/dist/api/agent4science-client.js +386 -0
- package/dist/api/agent4science-client.js.map +1 -0
- package/dist/cli/commands/add-agent.d.ts +13 -0
- package/dist/cli/commands/add-agent.d.ts.map +1 -0
- package/dist/cli/commands/add-agent.js +76 -0
- package/dist/cli/commands/add-agent.js.map +1 -0
- package/dist/cli/commands/community.d.ts +20 -0
- package/dist/cli/commands/community.d.ts.map +1 -0
- package/dist/cli/commands/community.js +1180 -0
- package/dist/cli/commands/community.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +152 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/create-agent.d.ts +12 -0
- package/dist/cli/commands/create-agent.d.ts.map +1 -0
- package/dist/cli/commands/create-agent.js +1780 -0
- package/dist/cli/commands/create-agent.js.map +1 -0
- package/dist/cli/commands/init.d.ts +15 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +487 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/interactive.d.ts +6 -0
- package/dist/cli/commands/interactive.d.ts.map +1 -0
- package/dist/cli/commands/interactive.js +447 -0
- package/dist/cli/commands/interactive.js.map +1 -0
- package/dist/cli/commands/list-agents.d.ts +10 -0
- package/dist/cli/commands/list-agents.d.ts.map +1 -0
- package/dist/cli/commands/list-agents.js +67 -0
- package/dist/cli/commands/list-agents.js.map +1 -0
- package/dist/cli/commands/play.d.ts +30 -0
- package/dist/cli/commands/play.d.ts.map +1 -0
- package/dist/cli/commands/play.js +1890 -0
- package/dist/cli/commands/play.js.map +1 -0
- package/dist/cli/commands/setup-production.d.ts +7 -0
- package/dist/cli/commands/setup-production.d.ts.map +1 -0
- package/dist/cli/commands/setup-production.js +127 -0
- package/dist/cli/commands/setup-production.js.map +1 -0
- package/dist/cli/commands/start.d.ts +15 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +89 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +6 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +74 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +121 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +174 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/ensure-credentials.d.ts +32 -0
- package/dist/cli/utils/ensure-credentials.d.ts.map +1 -0
- package/dist/cli/utils/ensure-credentials.js +280 -0
- package/dist/cli/utils/ensure-credentials.js.map +1 -0
- package/dist/cli/utils/local-agents.d.ts +49 -0
- package/dist/cli/utils/local-agents.d.ts.map +1 -0
- package/dist/cli/utils/local-agents.js +117 -0
- package/dist/cli/utils/local-agents.js.map +1 -0
- package/dist/config/config.d.ts +28 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +182 -0
- package/dist/config/config.js.map +1 -0
- package/dist/db/database.d.ts +150 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +838 -0
- package/dist/db/database.js.map +1 -0
- package/dist/engagement/proactive-engine.d.ts +246 -0
- package/dist/engagement/proactive-engine.d.ts.map +1 -0
- package/dist/engagement/proactive-engine.js +1753 -0
- package/dist/engagement/proactive-engine.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/llm-client.d.ts +181 -0
- package/dist/llm/llm-client.d.ts.map +1 -0
- package/dist/llm/llm-client.js +658 -0
- package/dist/llm/llm-client.js.map +1 -0
- package/dist/logging/logger.d.ts +14 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +47 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/polling/notification-poller.d.ts +70 -0
- package/dist/polling/notification-poller.d.ts.map +1 -0
- package/dist/polling/notification-poller.js +190 -0
- package/dist/polling/notification-poller.js.map +1 -0
- package/dist/rate-limit/rate-limiter.d.ts +56 -0
- package/dist/rate-limit/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limit/rate-limiter.js +202 -0
- package/dist/rate-limit/rate-limiter.js.map +1 -0
- package/dist/runtime/event-loop.d.ts +101 -0
- package/dist/runtime/event-loop.d.ts.map +1 -0
- package/dist/runtime/event-loop.js +680 -0
- package/dist/runtime/event-loop.js.map +1 -0
- package/dist/tools/manager-agent.d.ts +48 -0
- package/dist/tools/manager-agent.d.ts.map +1 -0
- package/dist/tools/manager-agent.js +440 -0
- package/dist/tools/manager-agent.js.map +1 -0
- package/dist/tools/paper-tools.d.ts +70 -0
- package/dist/tools/paper-tools.d.ts.map +1 -0
- package/dist/tools/paper-tools.js +446 -0
- package/dist/tools/paper-tools.js.map +1 -0
- package/dist/types.d.ts +266 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cost-tracker.d.ts +51 -0
- package/dist/utils/cost-tracker.d.ts.map +1 -0
- package/dist/utils/cost-tracker.js +161 -0
- package/dist/utils/cost-tracker.js.map +1 -0
- package/dist/utils/similarity.d.ts +37 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +78 -0
- package/dist/utils/similarity.js.map +1 -0
- 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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"}
|