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
@@ -15,11 +15,15 @@ import path from 'path';
15
15
  import os from 'os';
16
16
  import { exec } from 'child_process';
17
17
  import { promisify } from 'util';
18
+ import spawnAsync from './utils/spawnAsync.js';
18
19
  import { encodeProjectPath, ensureProjectSkillLinks, reconcileOpenRouterSessionIndex } from './projects.js';
19
20
  import { writeProjectTemplates } from './templates/index.js';
20
21
  import { classifyError } from '../shared/errorClassifier.js';
21
22
  import { applyStageTagsToSession, recordIndexedSession } from './utils/sessionIndex.js';
22
23
  import { createRequestId, waitForToolApproval, matchesToolPermission } from './utils/permissions.js';
24
+ import { buildMemoryBlock } from './utils/memoryPrompt.js';
25
+ import { expandSkillCommand } from './utils/skillExpander.js';
26
+ import { safePath } from './utils/safePath.js';
23
27
 
24
28
  const execAsync = promisify(exec);
25
29
 
@@ -220,10 +224,9 @@ function sendMessage(ws, data) {
220
224
  // ---------------------------------------------------------------------------
221
225
 
222
226
  async function executeTool(name, args, workingDir) {
223
- const resolve = (p) => {
224
- if (!p) return workingDir;
225
- return path.isAbsolute(p) ? p : path.resolve(workingDir, p);
226
- };
227
+ // Constrain all paths to the project root to prevent LLM-driven
228
+ // prompt-injection attacks from reading/writing outside the workspace.
229
+ const resolve = (p) => safePath(p, workingDir);
227
230
  const trunc = (s) =>
228
231
  s.length <= MAX_OUTPUT_CHARS ? s : s.slice(0, MAX_OUTPUT_CHARS) + `\n…(truncated, ${s.length} total chars)`;
229
232
 
@@ -276,25 +279,33 @@ async function executeTool(name, args, workingDir) {
276
279
 
277
280
  case 'Glob': {
278
281
  const dir = resolve(args.path);
279
- const { stdout } = await execAsync(
280
- `rg --files --glob '${args.pattern}' 2>/dev/null | head -300`,
281
- { cwd: dir, timeout: 30_000, maxBuffer: 1024 * 1024 },
282
- ).catch(() =>
283
- execAsync(`find . -name '${args.pattern}' -type f 2>/dev/null | head -300`, {
284
- cwd: dir, timeout: 30_000, maxBuffer: 1024 * 1024,
285
- }),
286
- );
287
- return trunc(stdout || '(no matches)');
282
+ try {
283
+ const { stdout } = await spawnAsync('rg', ['--files', '--glob', args.pattern], {
284
+ cwd: dir, timeout: 30_000,
285
+ });
286
+ const lines = stdout.split('\n').filter(Boolean).slice(0, 300);
287
+ return trunc(lines.join('\n') || '(no matches)');
288
+ } catch {
289
+ try {
290
+ const { stdout } = await spawnAsync('find', ['.', '-name', args.pattern, '-type', 'f'], {
291
+ cwd: dir, timeout: 30_000,
292
+ });
293
+ const lines = stdout.split('\n').filter(Boolean).slice(0, 300);
294
+ return trunc(lines.join('\n') || '(no matches)');
295
+ } catch {
296
+ return '(no matches)';
297
+ }
298
+ }
288
299
  }
289
300
 
290
301
  case 'Grep': {
291
302
  const target = resolve(args.path);
292
- let cmd = `rg --line-number --max-count 100 --max-columns 200`;
293
- if (args.include) cmd += ` --glob '${args.include}'`;
294
- cmd += ` '${args.pattern.replace(/'/g, "'\\''")}' '${target}'`;
303
+ const rgArgs = ['--line-number', '--max-count', '100', '--max-columns', '200'];
304
+ if (args.include) rgArgs.push('--glob', args.include);
305
+ rgArgs.push('-e', args.pattern, '--', target);
295
306
  try {
296
- const { stdout } = await execAsync(cmd, {
297
- cwd: workingDir, timeout: 30_000, maxBuffer: 2 * 1024 * 1024,
307
+ const { stdout } = await spawnAsync('rg', rgArgs, {
308
+ cwd: workingDir, timeout: 30_000,
298
309
  });
299
310
  return trunc(stdout || '(no matches)');
300
311
  } catch (err) {
@@ -645,8 +656,9 @@ export async function queryOpenRouter(command, options = {}, ws) {
645
656
  projectName: workingDirectory ? encodeProjectPath(workingDirectory) : undefined,
646
657
  });
647
658
 
648
- // ── Build conversation ─────────────────────────────────────────────
649
- const systemContent = customSystemPrompt || await buildSystemPrompt(workingDirectory);
659
+ // ── Build conversation ───────────────────���─────────────────────────
660
+ const memoryBlock = options.userId ? buildMemoryBlock(options.userId) : '';
661
+ const systemContent = (customSystemPrompt || await buildSystemPrompt(workingDirectory)) + memoryBlock;
650
662
  const messages = [{ role: 'system', content: systemContent }];
651
663
 
652
664
  if (sessionId) {
@@ -657,8 +669,11 @@ export async function queryOpenRouter(command, options = {}, ws) {
657
669
  }
658
670
  }
659
671
 
660
- messages.push({ role: 'user', content: command });
661
- await appendSession(currentSessionId, { role: 'user', content: command }).catch(() => {});
672
+ // Expand /skill-name slash commands into full SKILL.md instructions
673
+ const expandedCommand = await expandSkillCommand(command?.trim() || command, workingDirectory);
674
+
675
+ messages.push({ role: 'user', content: expandedCommand });
676
+ await appendSession(currentSessionId, { role: 'user', content: expandedCommand }).catch(() => {});
662
677
 
663
678
  const tools = permissionMode === 'plan'
664
679
  ? TOOL_SCHEMAS.filter((t) => READ_ONLY_TOOLS.has(t.function.name))