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
@@ -10,10 +10,12 @@ import { queryClaudeSDK } from '../claude-sdk.js';
10
10
  import { spawnCursor } from '../cursor-cli.js';
11
11
  import { queryCodex } from '../openai-codex.js';
12
12
  import { spawnGemini } from '../gemini-cli.js';
13
+ import { queryGeminiApi } from '../gemini-api.js';
13
14
  import { queryOpenRouter } from '../openrouter.js';
14
15
  import { queryLocalGPU } from '../local-gpu.js';
16
+ import { spawnNanoClaudeCode } from '../nano-claude-code.js';
15
17
  import { Octokit } from '@octokit/rest';
16
- import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS, GEMINI_MODELS, LOCAL_MODELS, OPENROUTER_MODELS } from '../../shared/modelConstants.js';
18
+ import { CODEX_MODELS, GEMINI_MODELS, LOCAL_MODELS, NANO_CLAUDE_CODE_MODELS, OPENROUTER_MODELS } from '../../shared/modelConstants.js';
17
19
  import { IS_PLATFORM } from '../constants/config.js';
18
20
  import { getGeminiApiKeyForUser, withGeminiApiKeyEnv } from '../utils/geminiApiKey.js';
19
21
 
@@ -859,8 +861,8 @@ router.post('/', validateExternalApiKey, async (req, res) => {
859
861
  return res.status(400).json({ error: 'message is required' });
860
862
  }
861
863
 
862
- if (!['claude', 'cursor', 'codex', 'gemini', 'openrouter', 'local'].includes(provider)) {
863
- return res.status(400).json({ error: 'provider must be "claude", "cursor", "codex", "gemini", "openrouter", or "local"' });
864
+ if (!['claude', 'cursor', 'codex', 'gemini', 'openrouter', 'local', 'nano'].includes(provider)) {
865
+ return res.status(400).json({ error: 'provider must be "claude", "cursor", "codex", "gemini", "openrouter", "local", or "nano"' });
864
866
  }
865
867
 
866
868
  // Validate GitHub branch/PR creation requirements
@@ -982,15 +984,28 @@ router.post('/', validateExternalApiKey, async (req, res) => {
982
984
  permissionMode: 'bypassPermissions'
983
985
  }, writer);
984
986
  } else if (provider === 'gemini') {
985
- console.log('🤖 Starting Gemini CLI session');
987
+ console.log('🤖 Starting Gemini session');
986
988
 
987
- await spawnGemini(message.trim(), {
989
+ const geminiOptions = {
988
990
  projectPath: finalProjectPath,
989
991
  cwd: finalProjectPath,
990
992
  sessionId: null,
991
993
  env: sessionEnv,
992
- model: model || GEMINI_MODELS.DEFAULT
993
- }, writer);
994
+ model: model || GEMINI_MODELS.DEFAULT,
995
+ userId: req.user?.id,
996
+ };
997
+
998
+ const result = await queryGeminiApi(message.trim(), geminiOptions, writer);
999
+ if (result?.authFailed) {
1000
+ console.log('🤖 Falling back to Gemini CLI harness');
1001
+ await spawnGemini(message.trim(), {
1002
+ projectPath: finalProjectPath,
1003
+ cwd: finalProjectPath,
1004
+ sessionId: null,
1005
+ env: sessionEnv,
1006
+ model: model || GEMINI_MODELS.DEFAULT
1007
+ }, writer);
1008
+ }
994
1009
  } else if (provider === 'openrouter') {
995
1010
  console.log('🤖 Starting OpenRouter session');
996
1011
 
@@ -1012,6 +1027,16 @@ router.post('/', validateExternalApiKey, async (req, res) => {
1012
1027
  env: sessionEnv,
1013
1028
  permissionMode: 'bypassPermissions',
1014
1029
  }, writer);
1030
+ } else if (provider === 'nano') {
1031
+ console.log('🤖 Starting Nano Claude Code session');
1032
+
1033
+ await spawnNanoClaudeCode(message.trim(), {
1034
+ projectPath: finalProjectPath,
1035
+ cwd: finalProjectPath,
1036
+ sessionId: null,
1037
+ model: model || NANO_CLAUDE_CODE_MODELS.DEFAULT,
1038
+ env: sessionEnv,
1039
+ }, writer);
1015
1040
  }
1016
1041
 
1017
1042
  // Handle GitHub branch and PR creation after successful agent completion
@@ -27,7 +27,7 @@ function getDefaultModelForProvider(provider) {
27
27
  return CODEX_MODELS.DEFAULT || 'gpt-5.4';
28
28
  }
29
29
  if (provider === 'gemini') {
30
- return GEMINI_MODELS.DEFAULT || 'gemini-3-flash-preview';
30
+ return GEMINI_MODELS.DEFAULT || 'gemini-2.5-flash';
31
31
  }
32
32
  if (provider === 'openrouter') {
33
33
  return OPENROUTER_MODELS.DEFAULT || 'anthropic/claude-sonnet-4';
@@ -0,0 +1,55 @@
1
+ import express from 'express';
2
+ import { runClaudeBtw } from '../claude-sdk.js';
3
+
4
+ const router = express.Router();
5
+
6
+ const MAX_QUESTION_CHARS = 2000;
7
+ const MAX_TRANSCRIPT_CHARS = 150_000;
8
+
9
+ /**
10
+ * POST /api/claude/btw
11
+ * Ephemeral side question (no tools, separate from main chat session).
12
+ */
13
+ router.post('/btw', async (req, res) => {
14
+ try {
15
+ const { question, transcript, projectPath, model } = req.body || {};
16
+ const q = typeof question === 'string' ? question.trim() : '';
17
+ if (!q) {
18
+ return res.status(400).json({ error: 'question is required' });
19
+ }
20
+ if (q.length > MAX_QUESTION_CHARS) {
21
+ return res.status(400).json({ error: `question exceeds ${MAX_QUESTION_CHARS} character limit` });
22
+ }
23
+
24
+ const raw = typeof transcript === 'string' ? transcript : '';
25
+ const text = raw.length > MAX_TRANSCRIPT_CHARS ? raw.slice(raw.length - MAX_TRANSCRIPT_CHARS) : raw;
26
+ const cwd = typeof projectPath === 'string' && projectPath.trim() ? projectPath.trim() : undefined;
27
+ const modelId = typeof model === 'string' && model.trim() ? model.trim() : undefined;
28
+
29
+ const ac = new AbortController();
30
+ res.on('close', () => {
31
+ if (!res.writableFinished) {
32
+ ac.abort();
33
+ }
34
+ });
35
+
36
+ const { answer } = await runClaudeBtw({
37
+ question: q,
38
+ transcript: text,
39
+ cwd,
40
+ model: modelId,
41
+ signal: ac.signal,
42
+ });
43
+
44
+ if (!res.headersSent) {
45
+ res.json({ answer });
46
+ }
47
+ } catch (error) {
48
+ if (!res.headersSent) {
49
+ console.error('[ERROR] /api/claude/btw:', error.message);
50
+ res.status(500).json({ error: error.message || 'btw request failed' });
51
+ }
52
+ }
53
+ });
54
+
55
+ export default router;