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
@@ -0,0 +1,50 @@
1
+ {
2
+ "research_domains": {
3
+ "Large Language Models": {
4
+ "keywords": [
5
+ "large language model",
6
+ "LLM",
7
+ "transformer",
8
+ "foundation model"
9
+ ],
10
+ "arxiv_categories": [
11
+ "cs.AI",
12
+ "cs.LG",
13
+ "cs.CL"
14
+ ],
15
+ "priority": 5
16
+ },
17
+ "Multimodal": {
18
+ "keywords": [
19
+ "vision-language",
20
+ "multimodal",
21
+ "image-text",
22
+ "visual"
23
+ ],
24
+ "arxiv_categories": [
25
+ "cs.CV",
26
+ "cs.MM",
27
+ "cs.CL"
28
+ ],
29
+ "priority": 4
30
+ },
31
+ "AI Agents": {
32
+ "keywords": [
33
+ "agent",
34
+ "multi-agent",
35
+ "orchestration",
36
+ "autonomous",
37
+ "planning"
38
+ ],
39
+ "arxiv_categories": [
40
+ "cs.AI",
41
+ "cs.MA",
42
+ "cs.RO"
43
+ ],
44
+ "priority": 4
45
+ }
46
+ },
47
+ "top_n": 10,
48
+ "max_results": 200,
49
+ "categories": "cs.AI,cs.LG,cs.CL,cs.CV,cs.MM,cs.MA,cs.RO"
50
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "research_domains": {},
3
+ "top_n": 30
4
+ }
@@ -162,6 +162,36 @@ const runMigrations = () => {
162
162
  CREATE INDEX IF NOT EXISTS idx_session_tag_links_tag ON session_tag_links(tag_id);
163
163
  `);
164
164
 
165
+ // Migration: user_memories table
166
+ db.exec(`
167
+ CREATE TABLE IF NOT EXISTS user_memories (
168
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
169
+ user_id INTEGER NOT NULL,
170
+ content TEXT NOT NULL,
171
+ category TEXT DEFAULT 'general',
172
+ is_enabled BOOLEAN DEFAULT 1,
173
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
174
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
175
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
176
+ );
177
+ CREATE INDEX IF NOT EXISTS idx_user_memories_user ON user_memories(user_id);
178
+ CREATE INDEX IF NOT EXISTS idx_user_memories_user_enabled ON user_memories(user_id, is_enabled);
179
+ `);
180
+
181
+ // Migration: per-user memory_enabled column
182
+ if (!columnNames.includes('memory_enabled')) {
183
+ console.log('Running migration: Adding memory_enabled column');
184
+ db.exec('ALTER TABLE users ADD COLUMN memory_enabled BOOLEAN DEFAULT 1');
185
+ }
186
+
187
+ // Performance indexes for session_metadata last_activity sorting
188
+ db.exec(`
189
+ CREATE INDEX IF NOT EXISTS idx_session_metadata_last_activity
190
+ ON session_metadata(last_activity);
191
+ CREATE INDEX IF NOT EXISTS idx_session_metadata_project_activity
192
+ ON session_metadata(project_name, last_activity);
193
+ `);
194
+
165
195
  console.log('Database migrations completed successfully');
166
196
  } catch (error) {
167
197
  console.error('Error running migrations:', error.message);
@@ -1475,12 +1505,16 @@ const projectDb = {
1475
1505
  // Get project by its file-system path (uses idx_projects_path index)
1476
1506
  getProjectByPath: (projectPath, userId = null) => {
1477
1507
  try {
1478
- const query = userId
1479
- ? 'SELECT * FROM projects WHERE path = ? AND user_id = ?'
1480
- : 'SELECT * FROM projects WHERE path = ?';
1481
1508
  const row = userId
1482
- ? db.prepare(query).get(projectPath, userId)
1483
- : db.prepare(query).get(projectPath);
1509
+ ? db.prepare(`
1510
+ SELECT *
1511
+ FROM projects
1512
+ WHERE path = ?
1513
+ AND (user_id = ? OR user_id IS NULL)
1514
+ ORDER BY CASE WHEN user_id = ? THEN 0 ELSE 1 END
1515
+ LIMIT 1
1516
+ `).get(projectPath, userId, userId)
1517
+ : db.prepare('SELECT * FROM projects WHERE path = ?').get(projectPath);
1484
1518
  if (row && row.metadata) {
1485
1519
  row.metadata = JSON.parse(row.metadata);
1486
1520
  }
@@ -1835,6 +1869,67 @@ const referencesDb = {
1835
1869
  },
1836
1870
  };
1837
1871
 
1872
+ // User memories database operations
1873
+ // User memories database operations
1874
+ const MAX_MEMORIES_PER_USER = 50;
1875
+ const MAX_MEMORY_CONTENT_LENGTH = 500;
1876
+
1877
+ const memoryDb = {
1878
+ create: (userId, content, category = 'general') => {
1879
+ const count = db.prepare('SELECT COUNT(*) as count FROM user_memories WHERE user_id = ?').get(userId);
1880
+ if (count.count >= MAX_MEMORIES_PER_USER) {
1881
+ throw new Error(`Maximum of ${MAX_MEMORIES_PER_USER} memories per user reached`);
1882
+ }
1883
+ const stmt = db.prepare('INSERT INTO user_memories (user_id, content, category) VALUES (?, ?, ?)');
1884
+ const result = stmt.run(userId, content.slice(0, MAX_MEMORY_CONTENT_LENGTH), category);
1885
+ return db.prepare('SELECT * FROM user_memories WHERE id = ?').get(result.lastInsertRowid);
1886
+ },
1887
+
1888
+ getAll: (userId) => {
1889
+ return db.prepare('SELECT * FROM user_memories WHERE user_id = ? ORDER BY created_at DESC').all(userId);
1890
+ },
1891
+
1892
+ getEnabled: (userId) => {
1893
+ return db.prepare('SELECT * FROM user_memories WHERE user_id = ? AND is_enabled = 1 ORDER BY created_at DESC').all(userId);
1894
+ },
1895
+
1896
+ getById: (userId, memoryId) => {
1897
+ return db.prepare('SELECT * FROM user_memories WHERE id = ? AND user_id = ?').get(memoryId, userId);
1898
+ },
1899
+
1900
+ update: (userId, memoryId, { content, category }) => {
1901
+ const fields = [];
1902
+ const params = [];
1903
+ if (content !== undefined) { fields.push('content = ?'); params.push(content.slice(0, MAX_MEMORY_CONTENT_LENGTH)); }
1904
+ if (category !== undefined) { fields.push('category = ?'); params.push(category); }
1905
+ if (fields.length === 0) return null;
1906
+ fields.push('updated_at = CURRENT_TIMESTAMP');
1907
+ params.push(memoryId, userId);
1908
+ db.prepare(`UPDATE user_memories SET ${fields.join(', ')} WHERE id = ? AND user_id = ?`).run(...params);
1909
+ return db.prepare('SELECT * FROM user_memories WHERE id = ? AND user_id = ?').get(memoryId, userId);
1910
+ },
1911
+
1912
+ toggle: (userId, memoryId) => {
1913
+ db.prepare('UPDATE user_memories SET is_enabled = NOT is_enabled, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND user_id = ?').run(memoryId, userId);
1914
+ return db.prepare('SELECT * FROM user_memories WHERE id = ? AND user_id = ?').get(memoryId, userId);
1915
+ },
1916
+
1917
+ delete: (userId, memoryId) => {
1918
+ const result = db.prepare('DELETE FROM user_memories WHERE id = ? AND user_id = ?').run(memoryId, userId);
1919
+ return result.changes > 0;
1920
+ },
1921
+
1922
+ getMemoryEnabled: (userId) => {
1923
+ const row = db.prepare('SELECT memory_enabled FROM users WHERE id = ?').get(userId);
1924
+ return row ? row.memory_enabled !== 0 : true; // default true
1925
+ },
1926
+
1927
+ setMemoryEnabled: (userId, enabled) => {
1928
+ db.prepare('UPDATE users SET memory_enabled = ? WHERE id = ?').run(enabled ? 1 : 0, userId);
1929
+ return enabled;
1930
+ },
1931
+ };
1932
+
1838
1933
  export {
1839
1934
  db,
1840
1935
  initializeDatabase,
@@ -1848,5 +1943,6 @@ export {
1848
1943
  tagDb,
1849
1944
  projectDb,
1850
1945
  referencesDb,
1946
+ memoryDb,
1851
1947
  normalizeSessionTimestamp
1852
1948
  };
@@ -12,7 +12,8 @@ CREATE TABLE IF NOT EXISTS users (
12
12
  is_active BOOLEAN DEFAULT 1,
13
13
  git_name TEXT,
14
14
  git_email TEXT,
15
- has_completed_onboarding BOOLEAN DEFAULT 0
15
+ has_completed_onboarding BOOLEAN DEFAULT 0,
16
+ memory_enabled BOOLEAN DEFAULT 1
16
17
  );
17
18
 
18
19
  -- Indexes for performance
@@ -192,3 +193,18 @@ CREATE TABLE IF NOT EXISTS reference_tags (
192
193
  );
193
194
 
194
195
  CREATE INDEX IF NOT EXISTS idx_reference_tags_ref ON reference_tags(reference_id);
196
+
197
+ -- User memories table (for remembering user preferences, habits, context)
198
+ CREATE TABLE IF NOT EXISTS user_memories (
199
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
200
+ user_id INTEGER NOT NULL,
201
+ content TEXT NOT NULL,
202
+ category TEXT DEFAULT 'general', -- general | preference | context | workflow
203
+ is_enabled BOOLEAN DEFAULT 1,
204
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
205
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
206
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
207
+ );
208
+
209
+ CREATE INDEX IF NOT EXISTS idx_user_memories_user ON user_memories(user_id);
210
+ CREATE INDEX IF NOT EXISTS idx_user_memories_user_enabled ON user_memories(user_id, is_enabled);