dr-claw 1.1.2 → 1.1.4

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 (113) hide show
  1. package/README.md +286 -177
  2. package/README.zh-CN.md +286 -174
  3. package/dist/assets/{_basePickBy-C0n1uo4u.js → _basePickBy-7CEpiVqc.js} +1 -1
  4. package/dist/assets/{_baseUniq-BRNmhFkc.js → _baseUniq-yh8GoKah.js} +1 -1
  5. package/dist/assets/{arc-DOMBmC_A.js → arc-xxYot-So.js} +1 -1
  6. package/dist/assets/{architectureDiagram-VXUJARFQ-CtMWglbD.js → architectureDiagram-VXUJARFQ-Bb1NqOFB.js} +1 -1
  7. package/dist/assets/{blockDiagram-VD42YOAC-DK_gTkJy.js → blockDiagram-VD42YOAC-D8xMHk8C.js} +1 -1
  8. package/dist/assets/{c4Diagram-YG6GDRKO-DrDAvsn7.js → c4Diagram-YG6GDRKO-69UiBMVa.js} +1 -1
  9. package/dist/assets/channel-BJdHHkhR.js +1 -0
  10. package/dist/assets/{chunk-4BX2VUAB-CGbhdZcN.js → chunk-4BX2VUAB-DXrPhE6K.js} +1 -1
  11. package/dist/assets/{chunk-55IACEB6-sGeFSxen.js → chunk-55IACEB6-B3sw4AGX.js} +1 -1
  12. package/dist/assets/{chunk-B4BG7PRW-RxgHAU_P.js → chunk-B4BG7PRW-Dd4n17kR.js} +1 -1
  13. package/dist/assets/{chunk-DI55MBZ5-CvHUXZrx.js → chunk-DI55MBZ5-DuTb9gb8.js} +1 -1
  14. package/dist/assets/{chunk-FMBD7UC4-Sn7cXVNU.js → chunk-FMBD7UC4-CGErQ-ud.js} +1 -1
  15. package/dist/assets/{chunk-QN33PNHL-bDKOHppN.js → chunk-QN33PNHL-Bk5fuYbR.js} +1 -1
  16. package/dist/assets/{chunk-QZHKN3VN-B9kN5LGm.js → chunk-QZHKN3VN-2UdZTbge.js} +1 -1
  17. package/dist/assets/{chunk-TZMSLE5B-CCBe6len.js → chunk-TZMSLE5B-Bl-UYKEK.js} +1 -1
  18. package/dist/assets/{classDiagram-2ON5EDUG-DQoMNYlY.js → classDiagram-2ON5EDUG-EaoBDWqJ.js} +1 -1
  19. package/dist/assets/{classDiagram-v2-WZHVMYZB-DQoMNYlY.js → classDiagram-v2-WZHVMYZB-EaoBDWqJ.js} +1 -1
  20. package/dist/assets/clone-CwXTbwxl.js +1 -0
  21. package/dist/assets/{cose-bilkent-S5V4N54A-r6sLiHBW.js → cose-bilkent-S5V4N54A-qXNKLX2R.js} +1 -1
  22. package/dist/assets/{dagre-6UL2VRFP-AbsaR1Oa.js → dagre-6UL2VRFP-DmHvDWep.js} +1 -1
  23. package/dist/assets/{diagram-PSM6KHXK-DjCvdUyy.js → diagram-PSM6KHXK-C_Rj4DX3.js} +1 -1
  24. package/dist/assets/{diagram-QEK2KX5R-CqiocXkH.js → diagram-QEK2KX5R-BVr3mPXW.js} +1 -1
  25. package/dist/assets/{diagram-S2PKOQOG-D5ALeoII.js → diagram-S2PKOQOG-DVx6i0Qe.js} +1 -1
  26. package/dist/assets/{erDiagram-Q2GNP2WA-C1AeOsiz.js → erDiagram-Q2GNP2WA-BJQyv9_t.js} +1 -1
  27. package/dist/assets/{flowDiagram-NV44I4VS-C98ve_DO.js → flowDiagram-NV44I4VS-DCR8sPAE.js} +1 -1
  28. package/dist/assets/{ganttDiagram-JELNMOA3-3zdLvcxD.js → ganttDiagram-JELNMOA3-BcXFAthK.js} +1 -1
  29. package/dist/assets/{gitGraphDiagram-V2S2FVAM-nDuDMsHh.js → gitGraphDiagram-V2S2FVAM-CnS56w1x.js} +1 -1
  30. package/dist/assets/{graph-Blm-emkR.js → graph-DGtZXuDY.js} +1 -1
  31. package/dist/assets/index-C-sL-ag0.css +1 -0
  32. package/dist/assets/index-VdqxIFPL.js +670 -0
  33. package/dist/assets/{infoDiagram-HS3SLOUP-CmzE3q0R.js → infoDiagram-HS3SLOUP-DtI272ZD.js} +1 -1
  34. package/dist/assets/{journeyDiagram-XKPGCS4Q-CYaW7LrP.js → journeyDiagram-XKPGCS4Q-DHp_Kica.js} +1 -1
  35. package/dist/assets/{kanban-definition-3W4ZIXB7-mkmW7p0j.js → kanban-definition-3W4ZIXB7-CjgHMNku.js} +1 -1
  36. package/dist/assets/{layout-Ct2kFIId.js → layout-Cnc-DCSb.js} +1 -1
  37. package/dist/assets/{linear-CKG9EwIJ.js → linear-BtRgmV19.js} +1 -1
  38. package/dist/assets/{mermaid.core-CaKcUnnd.js → mermaid.core-B20uzv6N.js} +5 -5
  39. package/dist/assets/{mindmap-definition-VGOIOE7T-Bct-pYin.js → mindmap-definition-VGOIOE7T-bbcLXkWp.js} +1 -1
  40. package/dist/assets/{pieDiagram-ADFJNKIX-C8wFD4Jr.js → pieDiagram-ADFJNKIX-B4fEzWKO.js} +1 -1
  41. package/dist/assets/{quadrantDiagram-AYHSOK5B-CuiE_f46.js → quadrantDiagram-AYHSOK5B-B5G0SMbK.js} +1 -1
  42. package/dist/assets/{requirementDiagram-UZGBJVZJ-C4v1CqU8.js → requirementDiagram-UZGBJVZJ-DsqtOFgj.js} +1 -1
  43. package/dist/assets/{sankeyDiagram-TZEHDZUN-keAqqs-Y.js → sankeyDiagram-TZEHDZUN-CiGemFRE.js} +1 -1
  44. package/dist/assets/{sequenceDiagram-WL72ISMW-ClNbvKTB.js → sequenceDiagram-WL72ISMW-hEMvYbe9.js} +1 -1
  45. package/dist/assets/{stateDiagram-FKZM4ZOC-D8We-2vq.js → stateDiagram-FKZM4ZOC-Cn8VB7b1.js} +1 -1
  46. package/dist/assets/stateDiagram-v2-4FDKWEC3-DaH0PZOq.js +1 -0
  47. package/dist/assets/{timeline-definition-IT6M3QCI-DsvEMT5T.js → timeline-definition-IT6M3QCI-DChT1GUr.js} +1 -1
  48. package/dist/assets/{treemap-GDKQZRPO-TJrzN7Bj.js → treemap-GDKQZRPO-Dflv6a8z.js} +1 -1
  49. package/dist/assets/{xychartDiagram-PRI3JC2R-BdATmY5F.js → xychartDiagram-PRI3JC2R-Dr4urXR8.js} +1 -1
  50. package/dist/icons/nanoclaude.png +0 -0
  51. package/dist/index.html +2 -2
  52. package/dist/screenshots/screenshot_v1_2.png +0 -0
  53. package/package.json +61 -4
  54. package/public/icons/nanoclaude.png +0 -0
  55. package/public/screenshots/screenshot_v1_2.png +0 -0
  56. package/scripts/build-electron-icons.mjs +40 -0
  57. package/scripts/check-deps.js +28 -0
  58. package/scripts/native-runtime.mjs +128 -0
  59. package/server/__tests__/gemini-api.test.mjs +699 -0
  60. package/server/__tests__/gemini-session-index.test.mjs +95 -0
  61. package/server/__tests__/project-sync-dedup.test.mjs +173 -0
  62. package/server/__tests__/session-delete.test.mjs +152 -0
  63. package/server/claude-sdk.js +175 -14
  64. package/server/cli-chat.js +28 -17
  65. package/server/cli.js +48 -11
  66. package/server/data/news-log-arxiv.json +1 -0
  67. package/server/data/news-log-huggingface.json +1 -0
  68. package/server/data/news-results-arxiv.json +460 -0
  69. package/server/data/news-results-huggingface.json +817 -0
  70. package/server/data/research_interests_arxiv.json +50 -0
  71. package/server/data/research_interests_huggingface.json +4 -0
  72. package/server/database/db.js +101 -5
  73. package/server/database/init.sql +17 -1
  74. package/server/gemini-api.js +1838 -0
  75. package/server/gemini-cli.js +13 -2
  76. package/server/index.js +94 -16
  77. package/server/load-env.js +13 -1
  78. package/server/local-gpu.js +166 -24
  79. package/server/mcp-compute.js +223 -0
  80. package/server/middleware/auth.js +25 -6
  81. package/server/nano-claude-code.js +340 -0
  82. package/server/nanoSessionPaths.js +41 -0
  83. package/server/openai-codex.js +6 -2
  84. package/server/openrouter.js +37 -22
  85. package/server/projects.js +516 -110
  86. package/server/routes/agent.js +32 -7
  87. package/server/routes/auto-research.js +1 -1
  88. package/server/routes/claude-btw.js +55 -0
  89. package/server/routes/cli-auth.js +422 -58
  90. package/server/routes/commands.js +25 -1
  91. package/server/routes/community-tools.js +398 -0
  92. package/server/routes/compute.js +155 -0
  93. package/server/routes/git.js +9 -11
  94. package/server/routes/memory.js +143 -0
  95. package/server/routes/news.js +3 -0
  96. package/server/routes/skills.js +35 -0
  97. package/server/routes/user.js +3 -5
  98. package/server/utils/__tests__/safePath.test.js +93 -0
  99. package/server/utils/cliResolution.js +13 -1
  100. package/server/utils/codexSessionMessages.js +285 -0
  101. package/server/utils/geminiOAuth.js +333 -0
  102. package/server/utils/memoryPrompt.js +78 -0
  103. package/server/utils/safePath.js +51 -0
  104. package/server/utils/sessionIndex.js +2 -0
  105. package/server/utils/skillExpander.js +142 -0
  106. package/server/utils/spawnAsync.js +78 -0
  107. package/shared/modelConstants.js +19 -1
  108. package/dist/assets/channel-BFOE7OyC.js +0 -1
  109. package/dist/assets/clone-BulQSblH.js +0 -1
  110. package/dist/assets/index-B8Yutsnm.css +0 -1
  111. package/dist/assets/index-Cf6gyhc3.js +0 -654
  112. package/dist/assets/stateDiagram-v2-4FDKWEC3-BUURfjrE.js +0 -1
  113. package/scripts/install-python-tools.js +0 -64
@@ -14,6 +14,8 @@ import path from 'path';
14
14
  import os from 'os';
15
15
  import { exec } from 'child_process';
16
16
  import { promisify } from 'util';
17
+ import spawnAsync from './utils/spawnAsync.js';
18
+ import { safePath } from './utils/safePath.js';
17
19
 
18
20
  const execAsync = promisify(exec);
19
21
 
@@ -164,10 +166,9 @@ const TOOL_SCHEMAS = [
164
166
  // ── Tool execution ────────────────────────────────────────────────────────────
165
167
 
166
168
  async function executeTool(name, args, workingDir) {
167
- const resolve = (p) => {
168
- if (!p) return workingDir;
169
- return path.isAbsolute(p) ? p : path.resolve(workingDir, p);
170
- };
169
+ // Constrain all paths to the project root to prevent LLM-driven
170
+ // prompt-injection attacks from reading/writing outside the workspace.
171
+ const resolve = (p) => safePath(p, workingDir);
171
172
  const trunc = (s) =>
172
173
  s.length <= MAX_OUTPUT_CHARS ? s : s.slice(0, MAX_OUTPUT_CHARS) + `\n…(truncated)`;
173
174
 
@@ -210,23 +211,33 @@ async function executeTool(name, args, workingDir) {
210
211
  }
211
212
  case 'Glob': {
212
213
  const dir = resolve(args.path);
213
- const { stdout } = await execAsync(
214
- `rg --files --glob '${args.pattern}' 2>/dev/null | head -300`,
215
- { cwd: dir, timeout: 30_000, maxBuffer: 1024 * 1024 },
216
- ).catch(() =>
217
- execAsync(`find . -name '${args.pattern}' -type f 2>/dev/null | head -300`, {
218
- cwd: dir, timeout: 30_000, maxBuffer: 1024 * 1024,
219
- }),
220
- );
221
- return trunc(stdout || '(no matches)');
214
+ try {
215
+ const { stdout } = await spawnAsync('rg', ['--files', '--glob', args.pattern], {
216
+ cwd: dir, timeout: 30_000,
217
+ });
218
+ const lines = stdout.split('\n').filter(Boolean).slice(0, 300);
219
+ return trunc(lines.join('\n') || '(no matches)');
220
+ } catch {
221
+ try {
222
+ const { stdout } = await spawnAsync('find', ['.', '-name', args.pattern, '-type', 'f'], {
223
+ cwd: dir, timeout: 30_000,
224
+ });
225
+ const lines = stdout.split('\n').filter(Boolean).slice(0, 300);
226
+ return trunc(lines.join('\n') || '(no matches)');
227
+ } catch {
228
+ return '(no matches)';
229
+ }
230
+ }
222
231
  }
223
232
  case 'Grep': {
224
233
  const target = resolve(args.path);
225
- let cmd = `rg --line-number --max-count 100 --max-columns 200`;
226
- if (args.include) cmd += ` --glob '${args.include}'`;
227
- cmd += ` '${args.pattern.replace(/'/g, "'\\''")}' '${target}'`;
234
+ const rgArgs = ['--line-number', '--max-count', '100', '--max-columns', '200'];
235
+ if (args.include) rgArgs.push('--glob', args.include);
236
+ rgArgs.push('-e', args.pattern, '--', target);
228
237
  try {
229
- const { stdout } = await execAsync(cmd, { cwd: workingDir, timeout: 30_000, maxBuffer: 2 * 1024 * 1024 });
238
+ const { stdout } = await spawnAsync('rg', rgArgs, {
239
+ cwd: workingDir, timeout: 30_000,
240
+ });
230
241
  return trunc(stdout || '(no matches)');
231
242
  } catch (err) {
232
243
  if (err.code === 1) return '(no matches)';
package/server/cli.js CHANGED
@@ -37,6 +37,7 @@ const colors = {
37
37
  yellow: '\x1b[33m',
38
38
  blue: '\x1b[34m',
39
39
  magenta: '\x1b[35m',
40
+ red: '\x1b[31m',
40
41
  white: '\x1b[37m',
41
42
  gray: '\x1b[90m',
42
43
  };
@@ -46,7 +47,7 @@ const c = {
46
47
  info: (text) => `${colors.cyan}${text}${colors.reset}`,
47
48
  ok: (text) => `${colors.green}${text}${colors.reset}`,
48
49
  warn: (text) => `${colors.yellow}${text}${colors.reset}`,
49
- error: (text) => `${colors.yellow}${text}${colors.reset}`,
50
+ error: (text) => `${colors.red}${text}${colors.reset}`,
50
51
  tip: (text) => `${colors.blue}${text}${colors.reset}`,
51
52
  bright: (text) => `${colors.bright}${text}${colors.reset}`,
52
53
  dim: (text) => `${colors.dim}${text}${colors.reset}`,
@@ -56,6 +57,18 @@ const c = {
56
57
  const packageJsonPath = path.join(__dirname, '../package.json');
57
58
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
58
59
 
60
+ function stripOptionalEnvQuotes(raw) {
61
+ const v = String(raw).trim();
62
+ if (v.length >= 2) {
63
+ const open = v[0];
64
+ const close = v[v.length - 1];
65
+ if ((open === '"' && close === '"') || (open === "'" && close === "'")) {
66
+ return v.slice(1, -1);
67
+ }
68
+ }
69
+ return v;
70
+ }
71
+
59
72
  // Load environment variables from .env file if it exists
60
73
  function loadEnvFile() {
61
74
  try {
@@ -66,7 +79,7 @@ function loadEnvFile() {
66
79
  if (trimmedLine && !trimmedLine.startsWith('#')) {
67
80
  const [key, ...valueParts] = trimmedLine.split('=');
68
81
  if (key && valueParts.length > 0 && !process.env[key]) {
69
- process.env[key] = valueParts.join('=').trim();
82
+ process.env[key] = stripOptionalEnvQuotes(valueParts.join('='));
70
83
  }
71
84
  }
72
85
  });
@@ -202,8 +215,8 @@ function showVersion() {
202
215
 
203
216
  // Compare semver versions, returns true if v1 > v2
204
217
  function isNewerVersion(v1, v2) {
205
- const parts1 = v1.split('.').map(Number);
206
- const parts2 = v2.split('.').map(Number);
218
+ const parts1 = v1.split('.').map(p => parseInt(p, 10));
219
+ const parts2 = v2.split('.').map(p => parseInt(p, 10));
207
220
  for (let i = 0; i < 3; i++) {
208
221
  if (parts1[i] > parts2[i]) return true;
209
222
  if (parts1[i] < parts2[i]) return false;
@@ -211,16 +224,32 @@ function isNewerVersion(v1, v2) {
211
224
  return false;
212
225
  }
213
226
 
227
+ // Detect install mode: 'git' (cloned repo), 'npx', or 'npm' (global install)
228
+ function getInstallMode() {
229
+ if (fs.existsSync(path.join(__dirname, '..', '.git'))) return 'git';
230
+ const npmExecpath = process.env.npm_execpath || '';
231
+ if (npmExecpath.includes('npx') || process.env.npm_command === 'exec') return 'npx';
232
+ return 'npm';
233
+ }
234
+
214
235
  // Check for updates
215
236
  async function checkForUpdates(silent = false) {
216
237
  try {
217
- const { execSync } = await import('child_process');
218
- const latestVersion = execSync('npm show dr-claw version', { encoding: 'utf8' }).trim();
238
+ const { exec } = await import('child_process');
239
+ const { promisify } = await import('util');
240
+ const execAsync = promisify(exec);
241
+ const { stdout } = await execAsync('npm show dr-claw version', { timeout: 10000 });
242
+ const latestVersion = stdout.trim();
219
243
  const currentVersion = packageJson.version;
244
+ const mode = getInstallMode();
220
245
 
221
246
  if (isNewerVersion(latestVersion, currentVersion)) {
222
247
  console.log(`\n${c.warn('[UPDATE]')} New version available: ${c.bright(latestVersion)} (current: ${currentVersion})`);
223
- console.log(` Run ${c.bright('dr-claw update')} to update\n`);
248
+ if (mode === 'npx') {
249
+ console.log(` Run ${c.bright('npx dr-claw@latest')} to use the new version\n`);
250
+ } else {
251
+ console.log(` Run ${c.bright('dr-claw update')} to update\n`);
252
+ }
224
253
  return { hasUpdate: true, latestVersion, currentVersion };
225
254
  } else if (!silent) {
226
255
  console.log(`${c.ok('[OK]')} You are on the latest version (${currentVersion})`);
@@ -237,9 +266,14 @@ async function checkForUpdates(silent = false) {
237
266
  // Update the package
238
267
  async function updatePackage() {
239
268
  try {
240
- const { execSync } = await import('child_process');
241
- console.log(`${c.info('[INFO]')} Checking for updates...`);
269
+ const mode = getInstallMode();
270
+
271
+ if (mode === 'npx') {
272
+ console.log(`${c.info('[INFO]')} You're running via npx. Run ${c.bright('npx dr-claw@latest')} to get the latest version.`);
273
+ return;
274
+ }
242
275
 
276
+ console.log(`${c.info('[INFO]')} Checking for updates...`);
243
277
  const { hasUpdate, latestVersion, currentVersion } = await checkForUpdates(true);
244
278
 
245
279
  if (!hasUpdate) {
@@ -248,11 +282,14 @@ async function updatePackage() {
248
282
  }
249
283
 
250
284
  console.log(`${c.info('[INFO]')} Updating from ${currentVersion} to ${latestVersion}...`);
251
- execSync('npm update -g dr-claw', { stdio: 'inherit' });
285
+ const { exec } = await import('child_process');
286
+ const { promisify } = await import('util');
287
+ const execAsync = promisify(exec);
288
+ await execAsync('npm update -g dr-claw', { timeout: 120000 });
252
289
  console.log(`${c.ok('[OK]')} Update complete! Restart dr-claw to use the new version.`);
253
290
  } catch (e) {
254
291
  console.error(`${c.error('[ERROR]')} Update failed: ${e.message}`);
255
- console.log(`${c.tip('[TIP]')} Try running manually: npm update -g dr-claw`);
292
+ console.log(`${c.tip('[TIP]')} Try running manually: npm install -g dr-claw@latest`);
256
293
  }
257
294
  }
258
295
 
@@ -0,0 +1 @@
1
+ ["[runtime] Using python3 | Python 3.9.6 | /Library/Developer/CommandLineTools/usr/bin/python3","/Users/dingjiesong/Library/Python/3.9/lib/python/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020","warnings.warn(","11:54:21 [INFO] Loading config from: /Users/dingjiesong/Documents/workspace/ai-scientist/dr-claw/server/data/research_interests_arxiv.json","11:54:21 [INFO] Using current date: 2026-04-09","11:54:21 [INFO] Date windows:","11:54:21 [INFO] Recent 30 days: 2026-03-10 to 2026-04-09","11:54:21 [INFO] Past year (31-365 days): 2025-04-09 to 2026-03-09","11:54:21 [INFO] ======================================================================","11:54:21 [INFO] Step 1: Searching recent papers (last 30 days) from arXiv","11:54:21 [INFO] ======================================================================","11:54:21 [INFO] [arXiv] Searching papers from 2026-03-10 to 2026-04-09","11:54:22 [INFO] [arXiv] Found 200 papers","11:54:22 [INFO] Scored 200 recent papers","11:54:22 [INFO] Skipping Semantic Scholar hot paper search (disabled)","11:54:22 [INFO] ======================================================================","11:54:22 [INFO] Step 3: Merging and ranking results","11:54:22 [INFO] ======================================================================","11:54:22 [INFO] Total unique papers after deduplication: 200","11:54:22 [INFO] Results saved to: /Users/dingjiesong/Documents/workspace/ai-scientist/dr-claw/server/data/news-results-arxiv.json","11:54:22 [INFO] Top 10 papers:","11:54:22 [INFO] 1. TraceSafe: A Systematic Assessment of LLM Guardrails on Mult... (Score: 10.13)","11:54:22 [INFO] 2. Appear2Meaning: A Cross-Cultural Benchmark for Structured Cu... (Score: 8.93)","11:54:22 [INFO] 3. A Systematic Study of Retrieval Pipeline Design for Retrieva... (Score: 8.53)","11:54:22 [INFO] 4. Dynamic Context Evolution for Scalable Synthetic Data Genera... (Score: 8.53)","11:54:22 [INFO] 5. Strategic Persuasion with Trait-Conditioned Multi-Agent Syst... (Score: 8.4)","11:54:22 [INFO] 6. Personalized RewardBench: Evaluating Reward Models with Huma... (Score: 8.13)","11:54:22 [INFO] 7. AgentCity: Constitutional Governance for Autonomous Agent Ec... (Score: 8.0)","11:54:22 [INFO] 8. On the Step Length Confounding in LLM Reasoning Data Selecti... (Score: 7.87)","11:54:22 [INFO] 9. STRIDE-ED: A Strategy-Grounded Stepwise Reasoning Framework ... (Score: 7.73)","11:54:22 [INFO] 10. Differentiable Environment-Trajectory Co-Optimization for Sa... (Score: 7.6)"]
@@ -0,0 +1 @@
1
+ ["[runtime] Using python3 | Python 3.9.6 | /Library/Developer/CommandLineTools/usr/bin/python3","/Users/dingjiesong/Library/Python/3.9/lib/python/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020","warnings.warn(","11:54:28 [INFO] No config provided — showing all HuggingFace Daily Papers","11:54:28 [INFO] Fetching HuggingFace Daily Papers...","11:54:28 [INFO] [HF] Fetched 50 daily paper entries","11:54:28 [INFO] Normalized 50 papers from 50 raw entries","11:54:28 [INFO] Scored 50 papers (0 filtered out by relevance/exclusion)","11:54:28 [INFO] Results saved to: /Users/dingjiesong/Documents/workspace/ai-scientist/dr-claw/server/data/news-results-huggingface.json","11:54:28 [INFO] Top 30 papers:","11:54:28 [INFO] 1. MegaTrain: Full Precision Training of 100B+ Parameter Large ... (Score: 6.09, Upvotes-based popularity: 2.22)","11:54:28 [INFO] 2. ThinkTwice: Jointly Optimizing Large Language Models for Rea... (Score: 6.08, Upvotes-based popularity: 1.98)","11:54:28 [INFO] 3. GBQA: A Game Benchmark for Evaluating LLMs as Quality Assura... (Score: 6.07, Upvotes-based popularity: 2.34)","11:54:28 [INFO] 4. RAGEN-2: Reasoning Collapse in Agentic RL... (Score: 6.0, Upvotes-based popularity: 2.4)","11:54:28 [INFO] 5. Vanast: Virtual Try-On with Human Image Animation via Synthe... (Score: 5.97, Upvotes-based popularity: 2.1)","11:54:28 [INFO] 6. Think in Strokes, Not Pixels: Process-Driven Image Generatio... (Score: 5.85, Upvotes-based popularity: 2.28)","11:54:28 [INFO] 7. Watch Before You Answer: Learning from Visually Grounded Pos... (Score: 5.62, Upvotes-based popularity: 1.62)","11:54:28 [INFO] 8. How Well Do Agentic Skills Work in the Wild: Benchmarking LL... (Score: 5.61, Upvotes-based popularity: 1.74)","11:54:28 [INFO] 9. In-Place Test-Time Training... (Score: 5.08, Upvotes-based popularity: 1.08)","11:54:28 [INFO] 10. SEVerA: Verified Synthesis of Self-Evolving Agents... (Score: 5.0, Upvotes-based popularity: 0.9)","11:54:28 [INFO] 11. MARS: Enabling Autoregressive Models Multi-Token Generation... (Score: 4.96, Upvotes-based popularity: 1.26)","11:54:28 [INFO] 12. INSPATIO-WORLD: A Real-Time 4D World Simulator via Spatiotem... (Score: 4.94, Upvotes-based popularity: 0.84)","11:54:28 [INFO] 13. Paper Circle: An Open-source Multi-agent Research Discovery ... (Score: 4.93, Upvotes-based popularity: 1.2)","11:54:28 [INFO] 14. General Multimodal Protein Design Enables DNA-Encoding of Ch... (Score: 4.81, Upvotes-based popularity: 1.38)","11:54:28 [INFO] 15. DARE: Diffusion Large Language Models Alignment and Reinforc... (Score: 4.71, Upvotes-based popularity: 1.08)","11:54:28 [INFO] 16. ClawsBench: Evaluating Capability and Safety of LLM Producti... (Score: 4.59, Upvotes-based popularity: 1.02)","11:54:28 [INFO] 17. TC-AE: Unlocking Token Capacity for Deep Compression Autoenc... (Score: 4.54, Upvotes-based popularity: 0.54)","11:54:28 [INFO] 18. MMEmb-R1: Reasoning-Enhanced Multimodal Embedding with Pair-... (Score: 4.52, Upvotes-based popularity: 0.42)","11:54:28 [INFO] 19. FP4 Explore, BF16 Train: Diffusion Reinforcement Learning vi... (Score: 4.42, Upvotes-based popularity: 0.42)","11:54:28 [INFO] 20. MedGemma 1.5 Technical Report... (Score: 4.41, Upvotes-based popularity: 0.54)","11:54:28 [INFO] 21. FlowInOne:Unifying Multimodal Generation as Image-in, Image-... (Score: 4.4, Upvotes-based popularity: 0.3)","11:54:28 [INFO] 22. Scientific Graphics Program Synthesis via Dual Self-Consiste... (Score: 4.28, Upvotes-based popularity: 0.18)","11:54:28 [INFO] 23. Graph-Based Chain-of-Thought Pruning for Reducing Redundant ... (Score: 4.23, Upvotes-based popularity: 0.36)","11:54:28 [INFO] 24. Experience Transfer for Multimodal LLM Agents in Minecraft G... (Score: 4.23, Upvotes-based popularity: 0.36)","11:54:28 [INFO] 25. AgentGL: Towards Agentic Graph Learning with LLMs via Reinfo... (Score: 4.22, Upvotes-based popularity: 0.12)","11:54:28 [INFO] 26. Learning to Hint for Reinforcement Learning... (Score: 4.18, Upvotes-based popularity: 0.18)","11:54:28 [INFO] 27. Personalized RewardBench: Evaluating Reward Models with Huma... (Score: 4.18, Upvotes-based popularity: 0.18)","11:54:28 [INFO] 28. REAM: Merging Improves Pruning of Experts in LLMs... (Score: 4.18, Upvotes-based popularity: 0.18)","11:54:28 [INFO] 29. Context-Value-Action Architecture for Value-Driven Large Lan... (Score: 4.18, Upvotes-based popularity: 0.18)","11:54:28 [INFO] 30. Action Images: End-to-End Policy Learning via Multiview Vide... (Score: 4.14, Upvotes-based popularity: 0.54)"]