dr-claw 1.1.3 → 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 (99) hide show
  1. package/dist/assets/{_basePickBy-CTZ7OJiJ.js → _basePickBy-7CEpiVqc.js} +1 -1
  2. package/dist/assets/{_baseUniq-LYG5erFT.js → _baseUniq-yh8GoKah.js} +1 -1
  3. package/dist/assets/{arc-CYhqYtN8.js → arc-xxYot-So.js} +1 -1
  4. package/dist/assets/{architectureDiagram-VXUJARFQ-B7xb9vYd.js → architectureDiagram-VXUJARFQ-Bb1NqOFB.js} +1 -1
  5. package/dist/assets/{blockDiagram-VD42YOAC-Dz6eN3Yc.js → blockDiagram-VD42YOAC-D8xMHk8C.js} +1 -1
  6. package/dist/assets/{c4Diagram-YG6GDRKO-DIa9rHl5.js → c4Diagram-YG6GDRKO-69UiBMVa.js} +1 -1
  7. package/dist/assets/channel-BJdHHkhR.js +1 -0
  8. package/dist/assets/{chunk-4BX2VUAB-JZVAPeYL.js → chunk-4BX2VUAB-DXrPhE6K.js} +1 -1
  9. package/dist/assets/{chunk-55IACEB6-BoNiAnP-.js → chunk-55IACEB6-B3sw4AGX.js} +1 -1
  10. package/dist/assets/{chunk-B4BG7PRW-BURhBXxZ.js → chunk-B4BG7PRW-Dd4n17kR.js} +1 -1
  11. package/dist/assets/{chunk-DI55MBZ5-Bxa-FsXa.js → chunk-DI55MBZ5-DuTb9gb8.js} +1 -1
  12. package/dist/assets/{chunk-FMBD7UC4-Dn_6iLa4.js → chunk-FMBD7UC4-CGErQ-ud.js} +1 -1
  13. package/dist/assets/{chunk-QN33PNHL-B0N2-K2K.js → chunk-QN33PNHL-Bk5fuYbR.js} +1 -1
  14. package/dist/assets/{chunk-QZHKN3VN-Bd7csSYW.js → chunk-QZHKN3VN-2UdZTbge.js} +1 -1
  15. package/dist/assets/{chunk-TZMSLE5B-DV5aJTr6.js → chunk-TZMSLE5B-Bl-UYKEK.js} +1 -1
  16. package/dist/assets/{classDiagram-2ON5EDUG-iZL_J_xq.js → classDiagram-2ON5EDUG-EaoBDWqJ.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-WZHVMYZB-iZL_J_xq.js → classDiagram-v2-WZHVMYZB-EaoBDWqJ.js} +1 -1
  18. package/dist/assets/clone-CwXTbwxl.js +1 -0
  19. package/dist/assets/{cose-bilkent-S5V4N54A-C_Uhc5Rn.js → cose-bilkent-S5V4N54A-qXNKLX2R.js} +1 -1
  20. package/dist/assets/{dagre-6UL2VRFP-BiW_P9KL.js → dagre-6UL2VRFP-DmHvDWep.js} +1 -1
  21. package/dist/assets/{diagram-PSM6KHXK-uGQgzEbt.js → diagram-PSM6KHXK-C_Rj4DX3.js} +1 -1
  22. package/dist/assets/{diagram-QEK2KX5R-qox_ZDR7.js → diagram-QEK2KX5R-BVr3mPXW.js} +1 -1
  23. package/dist/assets/{diagram-S2PKOQOG-RKFFDPoU.js → diagram-S2PKOQOG-DVx6i0Qe.js} +1 -1
  24. package/dist/assets/{erDiagram-Q2GNP2WA-11Go9j0k.js → erDiagram-Q2GNP2WA-BJQyv9_t.js} +1 -1
  25. package/dist/assets/{flowDiagram-NV44I4VS-DBAiHvAx.js → flowDiagram-NV44I4VS-DCR8sPAE.js} +1 -1
  26. package/dist/assets/{ganttDiagram-JELNMOA3-Dzc11a-7.js → ganttDiagram-JELNMOA3-BcXFAthK.js} +1 -1
  27. package/dist/assets/{gitGraphDiagram-V2S2FVAM-DJVXfOqP.js → gitGraphDiagram-V2S2FVAM-CnS56w1x.js} +1 -1
  28. package/dist/assets/{graph-CJ95S3XQ.js → graph-DGtZXuDY.js} +1 -1
  29. package/dist/assets/index-C-sL-ag0.css +1 -0
  30. package/dist/assets/index-VdqxIFPL.js +670 -0
  31. package/dist/assets/{infoDiagram-HS3SLOUP-DpdkGgBK.js → infoDiagram-HS3SLOUP-DtI272ZD.js} +1 -1
  32. package/dist/assets/{journeyDiagram-XKPGCS4Q-CSGpNz7D.js → journeyDiagram-XKPGCS4Q-DHp_Kica.js} +1 -1
  33. package/dist/assets/{kanban-definition-3W4ZIXB7-BvPB3vMM.js → kanban-definition-3W4ZIXB7-CjgHMNku.js} +1 -1
  34. package/dist/assets/{layout-C96BbhFQ.js → layout-Cnc-DCSb.js} +1 -1
  35. package/dist/assets/{linear-HjDfr5-H.js → linear-BtRgmV19.js} +1 -1
  36. package/dist/assets/{mermaid.core-J7RjAKTD.js → mermaid.core-B20uzv6N.js} +5 -5
  37. package/dist/assets/{mindmap-definition-VGOIOE7T-C6MlEWCC.js → mindmap-definition-VGOIOE7T-bbcLXkWp.js} +1 -1
  38. package/dist/assets/{pieDiagram-ADFJNKIX-Bi5BLoNG.js → pieDiagram-ADFJNKIX-B4fEzWKO.js} +1 -1
  39. package/dist/assets/{quadrantDiagram-AYHSOK5B-Bo14V3Q1.js → quadrantDiagram-AYHSOK5B-B5G0SMbK.js} +1 -1
  40. package/dist/assets/{requirementDiagram-UZGBJVZJ-CP3_EwJ4.js → requirementDiagram-UZGBJVZJ-DsqtOFgj.js} +1 -1
  41. package/dist/assets/{sankeyDiagram-TZEHDZUN-B3wFfI_W.js → sankeyDiagram-TZEHDZUN-CiGemFRE.js} +1 -1
  42. package/dist/assets/{sequenceDiagram-WL72ISMW-fZVhVt_s.js → sequenceDiagram-WL72ISMW-hEMvYbe9.js} +1 -1
  43. package/dist/assets/{stateDiagram-FKZM4ZOC-BooCitAX.js → stateDiagram-FKZM4ZOC-Cn8VB7b1.js} +1 -1
  44. package/dist/assets/stateDiagram-v2-4FDKWEC3-DaH0PZOq.js +1 -0
  45. package/dist/assets/{timeline-definition-IT6M3QCI-CM0zUx-Q.js → timeline-definition-IT6M3QCI-DChT1GUr.js} +1 -1
  46. package/dist/assets/{treemap-GDKQZRPO-B-8ph3e8.js → treemap-GDKQZRPO-Dflv6a8z.js} +1 -1
  47. package/dist/assets/{xychartDiagram-PRI3JC2R-Q2k0EFpn.js → xychartDiagram-PRI3JC2R-Dr4urXR8.js} +1 -1
  48. package/dist/icons/nanoclaude.png +0 -0
  49. package/dist/index.html +2 -2
  50. package/package.json +1 -1
  51. package/public/icons/nanoclaude.png +0 -0
  52. package/scripts/native-runtime.mjs +5 -3
  53. package/server/__tests__/gemini-api.test.mjs +699 -0
  54. package/server/__tests__/gemini-session-index.test.mjs +95 -0
  55. package/server/claude-sdk.js +82 -3
  56. package/server/cli-chat.js +28 -17
  57. package/server/cli.js +13 -1
  58. package/server/data/news-log-arxiv.json +1 -0
  59. package/server/data/news-log-huggingface.json +1 -0
  60. package/server/data/news-results-arxiv.json +460 -0
  61. package/server/data/news-results-huggingface.json +817 -0
  62. package/server/data/research_interests_arxiv.json +50 -0
  63. package/server/data/research_interests_huggingface.json +4 -0
  64. package/server/database/db.js +92 -0
  65. package/server/database/init.sql +17 -1
  66. package/server/gemini-api.js +1838 -0
  67. package/server/gemini-cli.js +13 -2
  68. package/server/index.js +94 -17
  69. package/server/load-env.js +13 -1
  70. package/server/local-gpu.js +3 -1
  71. package/server/nano-claude-code.js +340 -0
  72. package/server/nanoSessionPaths.js +41 -0
  73. package/server/openai-codex.js +6 -2
  74. package/server/openrouter.js +37 -22
  75. package/server/projects.js +207 -0
  76. package/server/routes/agent.js +32 -7
  77. package/server/routes/auto-research.js +1 -1
  78. package/server/routes/claude-btw.js +55 -0
  79. package/server/routes/cli-auth.js +103 -2
  80. package/server/routes/commands.js +25 -1
  81. package/server/routes/community-tools.js +26 -21
  82. package/server/routes/memory.js +143 -0
  83. package/server/routes/news.js +3 -0
  84. package/server/routes/skills.js +35 -0
  85. package/server/routes/user.js +3 -5
  86. package/server/utils/__tests__/safePath.test.js +93 -0
  87. package/server/utils/cliResolution.js +13 -1
  88. package/server/utils/geminiOAuth.js +333 -0
  89. package/server/utils/memoryPrompt.js +78 -0
  90. package/server/utils/safePath.js +51 -0
  91. package/server/utils/sessionIndex.js +2 -0
  92. package/server/utils/skillExpander.js +142 -0
  93. package/server/utils/spawnAsync.js +78 -0
  94. package/shared/modelConstants.js +19 -1
  95. package/dist/assets/channel-Dk-4X8XT.js +0 -1
  96. package/dist/assets/clone-DbPu_xVW.js +0 -1
  97. package/dist/assets/index-1MRmplD1.css +0 -1
  98. package/dist/assets/index-CFbkRzqw.js +0 -664
  99. package/dist/assets/stateDiagram-v2-4FDKWEC3-BzH7qQMD.js +0 -1
@@ -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);
@@ -1839,6 +1869,67 @@ const referencesDb = {
1839
1869
  },
1840
1870
  };
1841
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
+
1842
1933
  export {
1843
1934
  db,
1844
1935
  initializeDatabase,
@@ -1852,5 +1943,6 @@ export {
1852
1943
  tagDb,
1853
1944
  projectDb,
1854
1945
  referencesDb,
1946
+ memoryDb,
1855
1947
  normalizeSessionTimestamp
1856
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);