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.
- package/README.md +286 -177
- package/README.zh-CN.md +286 -174
- package/dist/assets/{_basePickBy-C0n1uo4u.js → _basePickBy-7CEpiVqc.js} +1 -1
- package/dist/assets/{_baseUniq-BRNmhFkc.js → _baseUniq-yh8GoKah.js} +1 -1
- package/dist/assets/{arc-DOMBmC_A.js → arc-xxYot-So.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-CtMWglbD.js → architectureDiagram-VXUJARFQ-Bb1NqOFB.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-DK_gTkJy.js → blockDiagram-VD42YOAC-D8xMHk8C.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-DrDAvsn7.js → c4Diagram-YG6GDRKO-69UiBMVa.js} +1 -1
- package/dist/assets/channel-BJdHHkhR.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-CGbhdZcN.js → chunk-4BX2VUAB-DXrPhE6K.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-sGeFSxen.js → chunk-55IACEB6-B3sw4AGX.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-RxgHAU_P.js → chunk-B4BG7PRW-Dd4n17kR.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-CvHUXZrx.js → chunk-DI55MBZ5-DuTb9gb8.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-Sn7cXVNU.js → chunk-FMBD7UC4-CGErQ-ud.js} +1 -1
- package/dist/assets/{chunk-QN33PNHL-bDKOHppN.js → chunk-QN33PNHL-Bk5fuYbR.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-B9kN5LGm.js → chunk-QZHKN3VN-2UdZTbge.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-CCBe6len.js → chunk-TZMSLE5B-Bl-UYKEK.js} +1 -1
- package/dist/assets/{classDiagram-2ON5EDUG-DQoMNYlY.js → classDiagram-2ON5EDUG-EaoBDWqJ.js} +1 -1
- package/dist/assets/{classDiagram-v2-WZHVMYZB-DQoMNYlY.js → classDiagram-v2-WZHVMYZB-EaoBDWqJ.js} +1 -1
- package/dist/assets/clone-CwXTbwxl.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-r6sLiHBW.js → cose-bilkent-S5V4N54A-qXNKLX2R.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-AbsaR1Oa.js → dagre-6UL2VRFP-DmHvDWep.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-DjCvdUyy.js → diagram-PSM6KHXK-C_Rj4DX3.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-CqiocXkH.js → diagram-QEK2KX5R-BVr3mPXW.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-D5ALeoII.js → diagram-S2PKOQOG-DVx6i0Qe.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-C1AeOsiz.js → erDiagram-Q2GNP2WA-BJQyv9_t.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-C98ve_DO.js → flowDiagram-NV44I4VS-DCR8sPAE.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-3zdLvcxD.js → ganttDiagram-JELNMOA3-BcXFAthK.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-nDuDMsHh.js → gitGraphDiagram-V2S2FVAM-CnS56w1x.js} +1 -1
- package/dist/assets/{graph-Blm-emkR.js → graph-DGtZXuDY.js} +1 -1
- package/dist/assets/index-C-sL-ag0.css +1 -0
- package/dist/assets/index-VdqxIFPL.js +670 -0
- package/dist/assets/{infoDiagram-HS3SLOUP-CmzE3q0R.js → infoDiagram-HS3SLOUP-DtI272ZD.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-CYaW7LrP.js → journeyDiagram-XKPGCS4Q-DHp_Kica.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-mkmW7p0j.js → kanban-definition-3W4ZIXB7-CjgHMNku.js} +1 -1
- package/dist/assets/{layout-Ct2kFIId.js → layout-Cnc-DCSb.js} +1 -1
- package/dist/assets/{linear-CKG9EwIJ.js → linear-BtRgmV19.js} +1 -1
- package/dist/assets/{mermaid.core-CaKcUnnd.js → mermaid.core-B20uzv6N.js} +5 -5
- package/dist/assets/{mindmap-definition-VGOIOE7T-Bct-pYin.js → mindmap-definition-VGOIOE7T-bbcLXkWp.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-C8wFD4Jr.js → pieDiagram-ADFJNKIX-B4fEzWKO.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-CuiE_f46.js → quadrantDiagram-AYHSOK5B-B5G0SMbK.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-C4v1CqU8.js → requirementDiagram-UZGBJVZJ-DsqtOFgj.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-keAqqs-Y.js → sankeyDiagram-TZEHDZUN-CiGemFRE.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-ClNbvKTB.js → sequenceDiagram-WL72ISMW-hEMvYbe9.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-D8We-2vq.js → stateDiagram-FKZM4ZOC-Cn8VB7b1.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-DaH0PZOq.js +1 -0
- package/dist/assets/{timeline-definition-IT6M3QCI-DsvEMT5T.js → timeline-definition-IT6M3QCI-DChT1GUr.js} +1 -1
- package/dist/assets/{treemap-GDKQZRPO-TJrzN7Bj.js → treemap-GDKQZRPO-Dflv6a8z.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-BdATmY5F.js → xychartDiagram-PRI3JC2R-Dr4urXR8.js} +1 -1
- package/dist/icons/nanoclaude.png +0 -0
- package/dist/index.html +2 -2
- package/dist/screenshots/screenshot_v1_2.png +0 -0
- package/package.json +61 -4
- package/public/icons/nanoclaude.png +0 -0
- package/public/screenshots/screenshot_v1_2.png +0 -0
- package/scripts/build-electron-icons.mjs +40 -0
- package/scripts/check-deps.js +28 -0
- package/scripts/native-runtime.mjs +128 -0
- package/server/__tests__/gemini-api.test.mjs +699 -0
- package/server/__tests__/gemini-session-index.test.mjs +95 -0
- package/server/__tests__/project-sync-dedup.test.mjs +173 -0
- package/server/__tests__/session-delete.test.mjs +152 -0
- package/server/claude-sdk.js +175 -14
- package/server/cli-chat.js +28 -17
- package/server/cli.js +48 -11
- package/server/data/news-log-arxiv.json +1 -0
- package/server/data/news-log-huggingface.json +1 -0
- package/server/data/news-results-arxiv.json +460 -0
- package/server/data/news-results-huggingface.json +817 -0
- package/server/data/research_interests_arxiv.json +50 -0
- package/server/data/research_interests_huggingface.json +4 -0
- package/server/database/db.js +101 -5
- package/server/database/init.sql +17 -1
- package/server/gemini-api.js +1838 -0
- package/server/gemini-cli.js +13 -2
- package/server/index.js +94 -16
- package/server/load-env.js +13 -1
- package/server/local-gpu.js +166 -24
- package/server/mcp-compute.js +223 -0
- package/server/middleware/auth.js +25 -6
- package/server/nano-claude-code.js +340 -0
- package/server/nanoSessionPaths.js +41 -0
- package/server/openai-codex.js +6 -2
- package/server/openrouter.js +37 -22
- package/server/projects.js +516 -110
- package/server/routes/agent.js +32 -7
- package/server/routes/auto-research.js +1 -1
- package/server/routes/claude-btw.js +55 -0
- package/server/routes/cli-auth.js +422 -58
- package/server/routes/commands.js +25 -1
- package/server/routes/community-tools.js +398 -0
- package/server/routes/compute.js +155 -0
- package/server/routes/git.js +9 -11
- package/server/routes/memory.js +143 -0
- package/server/routes/news.js +3 -0
- package/server/routes/skills.js +35 -0
- package/server/routes/user.js +3 -5
- package/server/utils/__tests__/safePath.test.js +93 -0
- package/server/utils/cliResolution.js +13 -1
- package/server/utils/codexSessionMessages.js +285 -0
- package/server/utils/geminiOAuth.js +333 -0
- package/server/utils/memoryPrompt.js +78 -0
- package/server/utils/safePath.js +51 -0
- package/server/utils/sessionIndex.js +2 -0
- package/server/utils/skillExpander.js +142 -0
- package/server/utils/spawnAsync.js +78 -0
- package/shared/modelConstants.js +19 -1
- package/dist/assets/channel-BFOE7OyC.js +0 -1
- package/dist/assets/clone-BulQSblH.js +0 -1
- package/dist/assets/index-B8Yutsnm.css +0 -1
- package/dist/assets/index-Cf6gyhc3.js +0 -654
- package/dist/assets/stateDiagram-v2-4FDKWEC3-BUURfjrE.js +0 -1
- package/scripts/install-python-tools.js +0 -64
package/server/routes/agent.js
CHANGED
|
@@ -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 {
|
|
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 "
|
|
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
|
|
987
|
+
console.log('🤖 Starting Gemini session');
|
|
986
988
|
|
|
987
|
-
|
|
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
|
-
|
|
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-
|
|
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;
|