agentstudio 0.1.8 → 0.1.10

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 (182) hide show
  1. package/README.md +481 -37
  2. package/README.zh-CN.md +525 -0
  3. package/{dist → backend/dist}/bin/agentstudio.js +7 -5
  4. package/backend/dist/bin/agentstudio.js.map +1 -0
  5. package/backend/dist/index.d.ts +3 -0
  6. package/backend/dist/index.d.ts.map +1 -0
  7. package/{dist → backend/dist}/index.js +9 -28
  8. package/{dist → backend/dist}/index.js.map +1 -1
  9. package/{dist → backend/dist}/routes/settings.js +1 -1
  10. package/{dist → backend/dist}/routes/settings.js.map +1 -1
  11. package/package.json +35 -43
  12. package/.cc-sessions/ppt-editor/session_1756253549429_uau1hm6lh.json +0 -665
  13. package/.cc-sessions/ppt-editor/session_1756257240855_v0wa26mde.json +0 -394
  14. package/.env +0 -15
  15. package/dist/bin/agentstudio.js.map +0 -1
  16. package/dist/index.d.ts +0 -2
  17. package/dist/index.d.ts.map +0 -1
  18. package/docs/chat-clean-1.svg +0 -1
  19. package/docs/chat-clean.md +0 -60
  20. package/docs/chat-comprehensive-1.svg +0 -1
  21. package/docs/chat-comprehensive.md +0 -166
  22. package/docs/chat_api_sequence_diagram.md +0 -58
  23. package/docs/command-detection-logic.md +0 -306
  24. package/docs/command-detection-sequence.md +0 -186
  25. package/frontend/dist/assets/AgentsPage-Dqb_aqAA.js +0 -1
  26. package/frontend/dist/assets/ChatPage-BvQmXfcP.css +0 -1
  27. package/frontend/dist/assets/ChatPage-L8Paywyc.js +0 -91
  28. package/frontend/dist/assets/CommandForm-DLl7EIMS.js +0 -7
  29. package/frontend/dist/assets/CommandsPage-Bzavq0Ec.js +0 -1
  30. package/frontend/dist/assets/DashboardPage-B3o4AYFT.js +0 -15
  31. package/frontend/dist/assets/FileBrowser-DL3ayaqb.js +0 -1
  32. package/frontend/dist/assets/GeneralSettingsPage-CBN_de-V.js +0 -1
  33. package/frontend/dist/assets/LandingPage-Dl4ioKos.js +0 -1
  34. package/frontend/dist/assets/LoginPage-4QqRdiSi.js +0 -12
  35. package/frontend/dist/assets/McpPage-CY3tYiqj.js +0 -39
  36. package/frontend/dist/assets/MemorySettingsPage-DGxrok5K.js +0 -1
  37. package/frontend/dist/assets/ProjectSelector-hgmGYVFh.js +0 -1
  38. package/frontend/dist/assets/ProjectsPage-D399IM0c.js +0 -14
  39. package/frontend/dist/assets/SettingsLayout-CL_K-lzJ.js +0 -1
  40. package/frontend/dist/assets/SubagentForm-DXtTTIKg.js +0 -7
  41. package/frontend/dist/assets/SubagentsPage-Chbhj8p2.js +0 -1
  42. package/frontend/dist/assets/ToastTestPage-DT4wuN5C.js +0 -1
  43. package/frontend/dist/assets/UnifiedToolSelector-CsM9qBvs.js +0 -1
  44. package/frontend/dist/assets/VersionSettingsPage-74Q-LVgA.js +0 -5
  45. package/frontend/dist/assets/agents-ClAzIJTw.js +0 -1
  46. package/frontend/dist/assets/agents-DwCY2K8p.css +0 -1
  47. package/frontend/dist/assets/authFetch-BATQyPG5.js +0 -1
  48. package/frontend/dist/assets/data-structures-DLJedtzx.js +0 -27
  49. package/frontend/dist/assets/dateFormat-CXa8VnEC.js +0 -1
  50. package/frontend/dist/assets/index-B9YHa7XT.css +0 -1
  51. package/frontend/dist/assets/index-B_CTNvca.js +0 -268
  52. package/frontend/dist/assets/monaco-editor-C7Z4sOhS.js +0 -19
  53. package/frontend/dist/assets/syntax-highlighting-YWvMU4Hm.js +0 -24
  54. package/frontend/dist/assets/tabManager-DV8urRBM.js +0 -30
  55. package/frontend/dist/assets/table-D6q1rytw.js +0 -1
  56. package/frontend/dist/assets/tools-C4EPanYi.js +0 -1
  57. package/frontend/dist/assets/ui-components-Cw21Epuw.js +0 -481
  58. package/frontend/dist/assets/useAgents-DwnOE1_k.js +0 -2
  59. package/frontend/dist/assets/useClaudeVersions-CQdGnCqv.js +0 -1
  60. package/frontend/dist/assets/useCommands-CCVaurbt.js +0 -1
  61. package/frontend/dist/cc-studio.png +0 -0
  62. package/frontend/dist/index.html +0 -70
  63. package/frontend/dist/vite.svg +0 -1
  64. package/scripts/README.md +0 -76
  65. package/scripts/fix-project-names.js +0 -113
  66. package/scripts/migrate-projects.js +0 -159
  67. package/shared/index.d.ts +0 -6
  68. package/shared/index.d.ts.map +0 -1
  69. package/shared/index.js +0 -7
  70. package/shared/types/agents.d.ts +0 -80
  71. package/shared/types/agents.d.ts.map +0 -1
  72. package/shared/types/agents.js +0 -145
  73. package/shared/types/claude-history.d.ts +0 -61
  74. package/shared/types/claude-history.d.ts.map +0 -1
  75. package/shared/types/claude-history.js +0 -2
  76. package/shared/types/claude-versions.d.ts +0 -40
  77. package/shared/types/claude-versions.d.ts.map +0 -1
  78. package/shared/types/claude-versions.js +0 -1
  79. package/shared/types/commands.d.ts +0 -48
  80. package/shared/types/commands.d.ts.map +0 -1
  81. package/shared/types/commands.js +0 -19
  82. package/shared/types/projects.d.ts +0 -35
  83. package/shared/types/projects.d.ts.map +0 -1
  84. package/shared/types/projects.js +0 -2
  85. package/shared/types/subagents.d.ts +0 -26
  86. package/shared/types/subagents.d.ts.map +0 -1
  87. package/shared/types/subagents.js +0 -1
  88. package/shared/utils/agentStorage.d.ts +0 -27
  89. package/shared/utils/agentStorage.d.ts.map +0 -1
  90. package/shared/utils/agentStorage.js +0 -392
  91. package/shared/utils/claudeVersionStorage.d.ts +0 -16
  92. package/shared/utils/claudeVersionStorage.d.ts.map +0 -1
  93. package/shared/utils/claudeVersionStorage.js +0 -230
  94. package/shared/utils/projectMetadataStorage.d.ts +0 -94
  95. package/shared/utils/projectMetadataStorage.d.ts.map +0 -1
  96. package/shared/utils/projectMetadataStorage.js +0 -422
  97. package/shared/utils/toolMapping.d.ts +0 -56
  98. package/shared/utils/toolMapping.d.ts.map +0 -1
  99. package/shared/utils/toolMapping.js +0 -71
  100. package/src/bin/agentstudio.ts +0 -130
  101. package/src/index.ts +0 -183
  102. package/src/middleware/auth.ts +0 -26
  103. package/src/routes/agents.ts +0 -884
  104. package/src/routes/auth.ts +0 -73
  105. package/src/routes/commands.ts +0 -441
  106. package/src/routes/files.ts +0 -352
  107. package/src/routes/mcp.ts +0 -751
  108. package/src/routes/media.ts +0 -140
  109. package/src/routes/projects.ts +0 -601
  110. package/src/routes/sessions.ts +0 -809
  111. package/src/routes/settings.ts +0 -718
  112. package/src/routes/slides.ts +0 -170
  113. package/src/routes/subagents.ts +0 -364
  114. package/src/services/claudeSession.ts +0 -293
  115. package/src/services/messageQueue.ts +0 -71
  116. package/src/services/sessionManager.ts +0 -532
  117. package/src/utils/jwt.ts +0 -36
  118. package/tsconfig.json +0 -27
  119. /package/{dist → backend/dist}/bin/agentstudio.d.ts +0 -0
  120. /package/{dist → backend/dist}/bin/agentstudio.d.ts.map +0 -0
  121. /package/{dist → backend/dist}/middleware/auth.d.ts +0 -0
  122. /package/{dist → backend/dist}/middleware/auth.d.ts.map +0 -0
  123. /package/{dist → backend/dist}/middleware/auth.js +0 -0
  124. /package/{dist → backend/dist}/middleware/auth.js.map +0 -0
  125. /package/{dist → backend/dist}/routes/agents.d.ts +0 -0
  126. /package/{dist → backend/dist}/routes/agents.d.ts.map +0 -0
  127. /package/{dist → backend/dist}/routes/agents.js +0 -0
  128. /package/{dist → backend/dist}/routes/agents.js.map +0 -0
  129. /package/{dist → backend/dist}/routes/auth.d.ts +0 -0
  130. /package/{dist → backend/dist}/routes/auth.d.ts.map +0 -0
  131. /package/{dist → backend/dist}/routes/auth.js +0 -0
  132. /package/{dist → backend/dist}/routes/auth.js.map +0 -0
  133. /package/{dist → backend/dist}/routes/commands.d.ts +0 -0
  134. /package/{dist → backend/dist}/routes/commands.d.ts.map +0 -0
  135. /package/{dist → backend/dist}/routes/commands.js +0 -0
  136. /package/{dist → backend/dist}/routes/commands.js.map +0 -0
  137. /package/{dist → backend/dist}/routes/files.d.ts +0 -0
  138. /package/{dist → backend/dist}/routes/files.d.ts.map +0 -0
  139. /package/{dist → backend/dist}/routes/files.js +0 -0
  140. /package/{dist → backend/dist}/routes/files.js.map +0 -0
  141. /package/{dist → backend/dist}/routes/mcp.d.ts +0 -0
  142. /package/{dist → backend/dist}/routes/mcp.d.ts.map +0 -0
  143. /package/{dist → backend/dist}/routes/mcp.js +0 -0
  144. /package/{dist → backend/dist}/routes/mcp.js.map +0 -0
  145. /package/{dist → backend/dist}/routes/media.d.ts +0 -0
  146. /package/{dist → backend/dist}/routes/media.d.ts.map +0 -0
  147. /package/{dist → backend/dist}/routes/media.js +0 -0
  148. /package/{dist → backend/dist}/routes/media.js.map +0 -0
  149. /package/{dist → backend/dist}/routes/projects.d.ts +0 -0
  150. /package/{dist → backend/dist}/routes/projects.d.ts.map +0 -0
  151. /package/{dist → backend/dist}/routes/projects.js +0 -0
  152. /package/{dist → backend/dist}/routes/projects.js.map +0 -0
  153. /package/{dist → backend/dist}/routes/sessions.d.ts +0 -0
  154. /package/{dist → backend/dist}/routes/sessions.d.ts.map +0 -0
  155. /package/{dist → backend/dist}/routes/sessions.js +0 -0
  156. /package/{dist → backend/dist}/routes/sessions.js.map +0 -0
  157. /package/{dist → backend/dist}/routes/settings.d.ts +0 -0
  158. /package/{dist → backend/dist}/routes/settings.d.ts.map +0 -0
  159. /package/{dist → backend/dist}/routes/slides.d.ts +0 -0
  160. /package/{dist → backend/dist}/routes/slides.d.ts.map +0 -0
  161. /package/{dist → backend/dist}/routes/slides.js +0 -0
  162. /package/{dist → backend/dist}/routes/slides.js.map +0 -0
  163. /package/{dist → backend/dist}/routes/subagents.d.ts +0 -0
  164. /package/{dist → backend/dist}/routes/subagents.d.ts.map +0 -0
  165. /package/{dist → backend/dist}/routes/subagents.js +0 -0
  166. /package/{dist → backend/dist}/routes/subagents.js.map +0 -0
  167. /package/{dist → backend/dist}/services/claudeSession.d.ts +0 -0
  168. /package/{dist → backend/dist}/services/claudeSession.d.ts.map +0 -0
  169. /package/{dist → backend/dist}/services/claudeSession.js +0 -0
  170. /package/{dist → backend/dist}/services/claudeSession.js.map +0 -0
  171. /package/{dist → backend/dist}/services/messageQueue.d.ts +0 -0
  172. /package/{dist → backend/dist}/services/messageQueue.d.ts.map +0 -0
  173. /package/{dist → backend/dist}/services/messageQueue.js +0 -0
  174. /package/{dist → backend/dist}/services/messageQueue.js.map +0 -0
  175. /package/{dist → backend/dist}/services/sessionManager.d.ts +0 -0
  176. /package/{dist → backend/dist}/services/sessionManager.d.ts.map +0 -0
  177. /package/{dist → backend/dist}/services/sessionManager.js +0 -0
  178. /package/{dist → backend/dist}/services/sessionManager.js.map +0 -0
  179. /package/{dist → backend/dist}/utils/jwt.d.ts +0 -0
  180. /package/{dist → backend/dist}/utils/jwt.d.ts.map +0 -0
  181. /package/{dist → backend/dist}/utils/jwt.js +0 -0
  182. /package/{dist → backend/dist}/utils/jwt.js.map +0 -0
@@ -1,94 +0,0 @@
1
- import { ProjectMetadata, ProjectWithAgentInfo } from '../types/projects.js';
2
- export declare class ProjectMetadataStorage {
3
- private projectsMetaDir;
4
- private projectsDir;
5
- private agentStorage;
6
- constructor();
7
- private ensureDirectoriesExist;
8
- /**
9
- * Scan ~/.claude/projects directory to discover all project directories
10
- */
11
- private scanProjectDirectories;
12
- /**
13
- * Get all projects by scanning directories and enriching with metadata
14
- */
15
- getAllProjects(): ProjectWithAgentInfo[];
16
- /**
17
- * Get project metadata for a specific project directory
18
- */
19
- getProjectMetadata(dirName: string): ProjectMetadata;
20
- /**
21
- * Create default metadata for a project
22
- */
23
- private createDefaultProjectMetadata;
24
- /**
25
- * Save project metadata
26
- */
27
- saveProjectMetadata(dirName: string, metadata: ProjectMetadata): void;
28
- /**
29
- * Get Claude project directory last modified time from filesystem
30
- */
31
- private getProjectLastModified;
32
- /**
33
- * Enrich project metadata with agent information
34
- */
35
- private enrichProjectWithAgentInfo;
36
- /**
37
- * Add an agent to a project
38
- */
39
- addAgentToProject(dirName: string, agentId: string): void;
40
- /**
41
- * Remove an agent from a project
42
- */
43
- removeAgentFromProject(dirName: string, agentId: string): void;
44
- /**
45
- * Set default agent for a project
46
- */
47
- setDefaultAgent(dirName: string, agentId: string): void;
48
- /**
49
- * Update project tags
50
- */
51
- updateProjectTags(dirName: string, tags: string[]): void;
52
- /**
53
- * Update project custom metadata
54
- */
55
- updateProjectMetadata(dirName: string, customMetadata: Record<string, any>): void;
56
- /**
57
- * Update project basic info
58
- */
59
- updateProjectInfo(dirName: string, updates: {
60
- name?: string;
61
- description?: string;
62
- }): void;
63
- /**
64
- * Record agent usage for a project
65
- */
66
- recordAgentUsage(dirName: string, agentId: string): void;
67
- /**
68
- * Create a new project directory and metadata
69
- */
70
- createProject(dirName: string, initialData: {
71
- name?: string;
72
- description?: string;
73
- agentId?: string;
74
- tags?: string[];
75
- metadata?: Record<string, any>;
76
- }): ProjectMetadata;
77
- /**
78
- * Delete a project (remove metadata, but keep directory)
79
- */
80
- deleteProject(dirName: string): boolean;
81
- /**
82
- * Get project by directory name
83
- */
84
- getProject(dirName: string): ProjectWithAgentInfo | null;
85
- /**
86
- * Extract real project path from jsonl session files
87
- */
88
- private extractRealProjectPath;
89
- /**
90
- * Extract clean project name from directory name and metadata
91
- */
92
- private extractCleanProjectName;
93
- }
94
- //# sourceMappingURL=projectMetadataStorage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projectMetadataStorage.d.ts","sourceRoot":"","sources":["../../src/utils/projectMetadataStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG7E,qBAAa,sBAAsB;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAe;;IAYnC,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,cAAc,IAAI,oBAAoB,EAAE;IAiBxC;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe;IAgBpD;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA0BpC;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI;IAUrE;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA2DlC;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAyBzD;;OAEG;IACH,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAmB9D;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAgBvD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAOxD;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAOjF;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAc1F;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAwBxD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE;QAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,eAAe;IAqCnB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAcvC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAUxD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkC9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;CA0BhC"}
@@ -1,422 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as os from 'os';
4
- import { AgentStorage } from './agentStorage.js';
5
- export class ProjectMetadataStorage {
6
- projectsMetaDir; // ~/.claude-agent/projects/
7
- projectsDir; // ~/.claude/projects/
8
- agentStorage;
9
- constructor() {
10
- const baseDir = path.join(os.homedir(), '.claude-agent');
11
- this.projectsMetaDir = path.join(baseDir, 'projects');
12
- this.projectsDir = path.join(os.homedir(), '.claude', 'projects');
13
- this.agentStorage = new AgentStorage();
14
- // Ensure directories exist
15
- this.ensureDirectoriesExist();
16
- }
17
- ensureDirectoriesExist() {
18
- if (!fs.existsSync(this.projectsMetaDir)) {
19
- fs.mkdirSync(this.projectsMetaDir, { recursive: true });
20
- }
21
- if (!fs.existsSync(this.projectsDir)) {
22
- fs.mkdirSync(this.projectsDir, { recursive: true });
23
- }
24
- }
25
- /**
26
- * Scan ~/.claude/projects directory to discover all project directories
27
- */
28
- scanProjectDirectories() {
29
- try {
30
- const items = fs.readdirSync(this.projectsDir, { withFileTypes: true });
31
- return items
32
- .filter(item => item.isDirectory())
33
- .map(item => item.name)
34
- .sort();
35
- }
36
- catch (error) {
37
- console.error('Failed to scan projects directory:', error);
38
- return [];
39
- }
40
- }
41
- /**
42
- * Get all projects by scanning directories and enriching with metadata
43
- */
44
- getAllProjects() {
45
- const projectDirs = this.scanProjectDirectories();
46
- const projects = [];
47
- for (const dirName of projectDirs) {
48
- try {
49
- const metadata = this.getProjectMetadata(dirName);
50
- const enriched = this.enrichProjectWithAgentInfo(dirName, metadata);
51
- projects.push(enriched);
52
- }
53
- catch (error) {
54
- console.error(`Failed to process project ${dirName}:`, error);
55
- }
56
- }
57
- return projects.sort((a, b) => new Date(b.lastAccessed).getTime() - new Date(a.lastAccessed).getTime());
58
- }
59
- /**
60
- * Get project metadata for a specific project directory
61
- */
62
- getProjectMetadata(dirName) {
63
- const metaFilePath = path.join(this.projectsMetaDir, `${dirName}.json`);
64
- try {
65
- if (fs.existsSync(metaFilePath)) {
66
- const content = fs.readFileSync(metaFilePath, 'utf-8');
67
- return JSON.parse(content);
68
- }
69
- }
70
- catch (error) {
71
- console.error(`Failed to read metadata for project ${dirName}:`, error);
72
- }
73
- // Create default metadata if file doesn't exist
74
- return this.createDefaultProjectMetadata(dirName);
75
- }
76
- /**
77
- * Create default metadata for a project
78
- */
79
- createDefaultProjectMetadata(dirName) {
80
- const projectPath = path.join(this.projectsDir, dirName);
81
- const now = new Date().toISOString();
82
- const metadata = {
83
- id: `project_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
84
- name: dirName, // Temporarily use dirName, will be updated below
85
- description: '',
86
- path: projectPath,
87
- createdAt: now,
88
- lastAccessed: now,
89
- agents: {},
90
- defaultAgent: '',
91
- tags: [],
92
- metadata: {}
93
- };
94
- // Extract clean project name from directory name and metadata
95
- const cleanProjectName = this.extractCleanProjectName(dirName, metadata);
96
- metadata.name = cleanProjectName;
97
- // Save the default metadata
98
- this.saveProjectMetadata(dirName, metadata);
99
- return metadata;
100
- }
101
- /**
102
- * Save project metadata
103
- */
104
- saveProjectMetadata(dirName, metadata) {
105
- try {
106
- const metaFilePath = path.join(this.projectsMetaDir, `${dirName}.json`);
107
- fs.writeFileSync(metaFilePath, JSON.stringify(metadata, null, 2), 'utf-8');
108
- }
109
- catch (error) {
110
- console.error(`Failed to save metadata for project ${dirName}:`, error);
111
- throw error;
112
- }
113
- }
114
- /**
115
- * Get Claude project directory last modified time from filesystem
116
- */
117
- getProjectLastModified(dirName, metadata) {
118
- try {
119
- // Use the Claude project directory path: ~/.claude/projects/{dirName}
120
- const claudeProjectPath = path.join(this.projectsDir, dirName);
121
- // Get the directory stats
122
- const stats = fs.statSync(claudeProjectPath);
123
- return stats.mtime.toISOString();
124
- }
125
- catch (error) {
126
- console.warn(`Failed to get filesystem time for Claude project ${dirName}:`, error);
127
- // Fallback to metadata lastAccessed if filesystem time is unavailable
128
- return metadata.lastAccessed;
129
- }
130
- }
131
- /**
132
- * Enrich project metadata with agent information
133
- */
134
- enrichProjectWithAgentInfo(dirName, metadata) {
135
- const enabledAgents = Object.keys(metadata.agents).filter(agentId => metadata.agents[agentId].enabled);
136
- // Get default agent info
137
- let defaultAgent = metadata.defaultAgent;
138
- let defaultAgentName = '';
139
- let defaultAgentIcon = '';
140
- if (defaultAgent && metadata.agents[defaultAgent]?.enabled) {
141
- const agent = this.agentStorage.getAgent(defaultAgent);
142
- if (agent) {
143
- defaultAgentName = agent.name;
144
- defaultAgentIcon = agent.ui.icon;
145
- }
146
- }
147
- else if (enabledAgents.length > 0) {
148
- // Use the most recently used agent as default
149
- defaultAgent = enabledAgents.reduce((latest, agentId) => {
150
- const latestTime = metadata.agents[latest]?.lastUsed || '';
151
- const currentTime = metadata.agents[agentId]?.lastUsed || '';
152
- return currentTime > latestTime ? agentId : latest;
153
- }, enabledAgents[0]);
154
- const agent = this.agentStorage.getAgent(defaultAgent);
155
- if (agent) {
156
- defaultAgentName = agent.name;
157
- defaultAgentIcon = agent.ui.icon;
158
- // Update metadata with new default
159
- metadata.defaultAgent = defaultAgent;
160
- this.saveProjectMetadata(dirName, metadata);
161
- }
162
- }
163
- // Extract real project path from session files
164
- const realProject = this.extractRealProjectPath(dirName);
165
- // Get actual last modified time from filesystem
166
- const lastAccessed = this.getProjectLastModified(dirName, metadata);
167
- return {
168
- id: metadata.id,
169
- name: metadata.name,
170
- dirName,
171
- path: realProject?.realPath || metadata.path, // Use real path when available
172
- realPath: realProject?.realPath,
173
- description: metadata.description,
174
- createdAt: metadata.createdAt,
175
- lastAccessed: lastAccessed, // Use filesystem time instead of metadata
176
- agents: enabledAgents,
177
- defaultAgent,
178
- defaultAgentName,
179
- defaultAgentIcon,
180
- tags: metadata.tags,
181
- metadata: metadata.metadata
182
- };
183
- }
184
- /**
185
- * Add an agent to a project
186
- */
187
- addAgentToProject(dirName, agentId) {
188
- const metadata = this.getProjectMetadata(dirName);
189
- const now = new Date().toISOString();
190
- if (!metadata.agents[agentId]) {
191
- metadata.agents[agentId] = {
192
- enabled: true,
193
- lastUsed: now,
194
- sessionCount: 0,
195
- customConfig: {}
196
- };
197
- }
198
- else {
199
- metadata.agents[agentId].enabled = true;
200
- metadata.agents[agentId].lastUsed = now;
201
- }
202
- // Set as default if no default agent exists
203
- if (!metadata.defaultAgent) {
204
- metadata.defaultAgent = agentId;
205
- }
206
- metadata.lastAccessed = now;
207
- this.saveProjectMetadata(dirName, metadata);
208
- }
209
- /**
210
- * Remove an agent from a project
211
- */
212
- removeAgentFromProject(dirName, agentId) {
213
- const metadata = this.getProjectMetadata(dirName);
214
- if (metadata.agents[agentId]) {
215
- metadata.agents[agentId].enabled = false;
216
- // If this was the default agent, find a new default
217
- if (metadata.defaultAgent === agentId) {
218
- const enabledAgents = Object.keys(metadata.agents).filter(id => id !== agentId && metadata.agents[id].enabled);
219
- metadata.defaultAgent = enabledAgents.length > 0 ? enabledAgents[0] : '';
220
- }
221
- metadata.lastAccessed = new Date().toISOString();
222
- this.saveProjectMetadata(dirName, metadata);
223
- }
224
- }
225
- /**
226
- * Set default agent for a project
227
- */
228
- setDefaultAgent(dirName, agentId) {
229
- const metadata = this.getProjectMetadata(dirName);
230
- // Ensure the agent is enabled for this project
231
- if (!metadata.agents[agentId]) {
232
- this.addAgentToProject(dirName, agentId);
233
- return;
234
- }
235
- if (metadata.agents[agentId].enabled) {
236
- metadata.defaultAgent = agentId;
237
- metadata.lastAccessed = new Date().toISOString();
238
- this.saveProjectMetadata(dirName, metadata);
239
- }
240
- }
241
- /**
242
- * Update project tags
243
- */
244
- updateProjectTags(dirName, tags) {
245
- const metadata = this.getProjectMetadata(dirName);
246
- metadata.tags = tags;
247
- metadata.lastAccessed = new Date().toISOString();
248
- this.saveProjectMetadata(dirName, metadata);
249
- }
250
- /**
251
- * Update project custom metadata
252
- */
253
- updateProjectMetadata(dirName, customMetadata) {
254
- const metadata = this.getProjectMetadata(dirName);
255
- metadata.metadata = { ...metadata.metadata, ...customMetadata };
256
- metadata.lastAccessed = new Date().toISOString();
257
- this.saveProjectMetadata(dirName, metadata);
258
- }
259
- /**
260
- * Update project basic info
261
- */
262
- updateProjectInfo(dirName, updates) {
263
- const metadata = this.getProjectMetadata(dirName);
264
- if (updates.name !== undefined) {
265
- metadata.name = updates.name;
266
- }
267
- if (updates.description !== undefined) {
268
- metadata.description = updates.description;
269
- }
270
- metadata.lastAccessed = new Date().toISOString();
271
- this.saveProjectMetadata(dirName, metadata);
272
- }
273
- /**
274
- * Record agent usage for a project
275
- */
276
- recordAgentUsage(dirName, agentId) {
277
- const metadata = this.getProjectMetadata(dirName);
278
- const now = new Date().toISOString();
279
- if (!metadata.agents[agentId]) {
280
- metadata.agents[agentId] = {
281
- enabled: true,
282
- lastUsed: now,
283
- sessionCount: 1,
284
- customConfig: {}
285
- };
286
- }
287
- else {
288
- metadata.agents[agentId].lastUsed = now;
289
- metadata.agents[agentId].sessionCount += 1;
290
- metadata.agents[agentId].enabled = true;
291
- }
292
- // Update default agent to the most recently used
293
- metadata.defaultAgent = agentId;
294
- metadata.lastAccessed = now;
295
- this.saveProjectMetadata(dirName, metadata);
296
- }
297
- /**
298
- * Create a new project directory and metadata
299
- */
300
- createProject(dirName, initialData) {
301
- const projectPath = path.join(this.projectsDir, dirName);
302
- // Create project directory
303
- if (!fs.existsSync(projectPath)) {
304
- fs.mkdirSync(projectPath, { recursive: true });
305
- }
306
- const now = new Date().toISOString();
307
- const metadata = {
308
- id: `project_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
309
- name: initialData.name || dirName,
310
- description: initialData.description || '',
311
- path: projectPath,
312
- createdAt: now,
313
- lastAccessed: now,
314
- agents: {},
315
- defaultAgent: '',
316
- tags: initialData.tags || [],
317
- metadata: initialData.metadata || {}
318
- };
319
- // Add initial agent if specified
320
- if (initialData.agentId) {
321
- metadata.agents[initialData.agentId] = {
322
- enabled: true,
323
- lastUsed: now,
324
- sessionCount: 0,
325
- customConfig: {}
326
- };
327
- metadata.defaultAgent = initialData.agentId;
328
- }
329
- this.saveProjectMetadata(dirName, metadata);
330
- return metadata;
331
- }
332
- /**
333
- * Delete a project (remove metadata, but keep directory)
334
- */
335
- deleteProject(dirName) {
336
- try {
337
- const metaFilePath = path.join(this.projectsMetaDir, `${dirName}.json`);
338
- if (fs.existsSync(metaFilePath)) {
339
- fs.unlinkSync(metaFilePath);
340
- return true;
341
- }
342
- return false;
343
- }
344
- catch (error) {
345
- console.error(`Failed to delete project metadata for ${dirName}:`, error);
346
- return false;
347
- }
348
- }
349
- /**
350
- * Get project by directory name
351
- */
352
- getProject(dirName) {
353
- try {
354
- const metadata = this.getProjectMetadata(dirName);
355
- return this.enrichProjectWithAgentInfo(dirName, metadata);
356
- }
357
- catch (error) {
358
- console.error(`Failed to get project ${dirName}:`, error);
359
- return null;
360
- }
361
- }
362
- /**
363
- * Extract real project path from jsonl session files
364
- */
365
- extractRealProjectPath(dirName) {
366
- const projectDir = path.join(this.projectsDir, dirName);
367
- try {
368
- // Find all jsonl files in the project directory
369
- const files = fs.readdirSync(projectDir).filter(file => file.endsWith('.jsonl'));
370
- for (const file of files) {
371
- try {
372
- const filePath = path.join(projectDir, file);
373
- const content = fs.readFileSync(filePath, 'utf-8');
374
- const firstLine = content.split('\n')[0];
375
- if (firstLine) {
376
- const message = JSON.parse(firstLine);
377
- if (message.cwd) {
378
- return {
379
- realPath: message.cwd,
380
- projectName: path.basename(message.cwd)
381
- };
382
- }
383
- }
384
- }
385
- catch (error) {
386
- // Skip this file and try the next one
387
- continue;
388
- }
389
- }
390
- }
391
- catch (error) {
392
- // Directory doesn't exist or can't be read
393
- }
394
- return null;
395
- }
396
- /**
397
- * Extract clean project name from directory name and metadata
398
- */
399
- extractCleanProjectName(dirName, metadata) {
400
- // Try to extract from jsonl session files first
401
- const realProject = this.extractRealProjectPath(dirName);
402
- if (realProject) {
403
- return realProject.projectName;
404
- }
405
- // If metadata has migratedFrom, use the original path to extract the real directory name
406
- if (metadata?.metadata?.migratedFrom) {
407
- const originalPath = metadata.metadata.migratedFrom;
408
- return path.basename(originalPath);
409
- }
410
- // Otherwise, try to extract from the dirName (which is the actual directory name in ~/.claude/projects)
411
- // The dirName is already the real directory name, so we can try to extract meaningful parts
412
- if (dirName.includes('-')) {
413
- // This might be an encoded path, try to extract the last meaningful segment
414
- const segments = dirName.split('-').filter(segment => segment.length > 0);
415
- if (segments.length > 0) {
416
- return segments[segments.length - 1];
417
- }
418
- }
419
- // Fallback to original directory name
420
- return dirName;
421
- }
422
- }
@@ -1,56 +0,0 @@
1
- export declare const TOOL_DISPLAY_MAP: {
2
- readonly Bash: "终端命令";
3
- readonly BashOutput: "终端命令输出";
4
- readonly KillBash: "杀死终端命令";
5
- readonly Edit: "文件编辑";
6
- readonly MultiEdit: "多文件编辑";
7
- readonly Read: "读取文件";
8
- readonly Write: "写入文件";
9
- readonly Glob: "文件搜索";
10
- readonly Grep: "文本搜索";
11
- readonly NotebookEdit: "笔记本编辑";
12
- readonly WebFetch: "网页获取";
13
- readonly WebSearch: "网络搜索";
14
- readonly TodoWrite: "任务管理";
15
- readonly Task: "任务执行";
16
- readonly ExitPlanMode: "退出计划模式";
17
- };
18
- export declare const TOOL_DESCRIPTION_MAP: {
19
- readonly Bash: "执行命令行操作";
20
- readonly BashOutput: "获取终端命令输出";
21
- readonly KillBash: "杀死终端命令";
22
- readonly Edit: "编辑文件内容";
23
- readonly MultiEdit: "批量编辑多个文件";
24
- readonly Read: "读取文件内容";
25
- readonly Write: "创建或覆盖文件";
26
- readonly Glob: "使用通配符搜索文件";
27
- readonly Grep: "在文件中搜索文本";
28
- readonly NotebookEdit: "编辑Jupyter笔记本";
29
- readonly WebFetch: "获取网页内容";
30
- readonly WebSearch: "搜索网络信息";
31
- readonly TodoWrite: "创建和管理待办事项";
32
- readonly Task: "执行复杂任务";
33
- readonly ExitPlanMode: "退出计划模式";
34
- };
35
- /**
36
- * 获取工具的显示名称
37
- * @param toolName 工具的原始名称
38
- * @returns 工具的显示名称,如果没有映射则返回原始名称
39
- */
40
- export declare function getToolDisplayName(toolName: string): string;
41
- /**
42
- * 获取工具的描述
43
- * @param toolName 工具的原始名称
44
- * @returns 工具的描述,如果没有映射则返回空字符串
45
- */
46
- export declare function getToolDescription(toolName: string): string;
47
- /**
48
- * 获取所有可用工具的信息
49
- * @returns 包含工具名称、显示名和描述的对象数组
50
- */
51
- export declare function getAllToolsInfo(): {
52
- name: string;
53
- label: string;
54
- description: string;
55
- }[];
56
- //# sourceMappingURL=toolMapping.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolMapping.d.ts","sourceRoot":"","sources":["../../src/utils/toolMapping.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;CAyBnB,CAAC;AAGX,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAgBvB,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe;;;;IAU9B"}
@@ -1,71 +0,0 @@
1
- // 工具名称映射配置
2
- export const TOOL_DISPLAY_MAP = {
3
- // 文件操作
4
- 'Bash': '终端命令',
5
- 'BashOutput': '终端命令输出',
6
- 'KillBash': '杀死终端命令',
7
- 'Edit': '文件编辑',
8
- 'MultiEdit': '多文件编辑',
9
- 'Read': '读取文件',
10
- 'Write': '写入文件',
11
- // 搜索工具
12
- 'Glob': '文件搜索',
13
- 'Grep': '文本搜索',
14
- // 笔记本工具
15
- 'NotebookEdit': '笔记本编辑',
16
- // 网络工具
17
- 'WebFetch': '网页获取',
18
- 'WebSearch': '网络搜索',
19
- // 任务管理
20
- 'TodoWrite': '任务管理',
21
- 'Task': '任务执行',
22
- 'ExitPlanMode': '退出计划模式',
23
- };
24
- // 工具描述映射
25
- export const TOOL_DESCRIPTION_MAP = {
26
- 'Bash': '执行命令行操作',
27
- 'BashOutput': '获取终端命令输出',
28
- 'KillBash': '杀死终端命令',
29
- 'Edit': '编辑文件内容',
30
- 'MultiEdit': '批量编辑多个文件',
31
- 'Read': '读取文件内容',
32
- 'Write': '创建或覆盖文件',
33
- 'Glob': '使用通配符搜索文件',
34
- 'Grep': '在文件中搜索文本',
35
- 'NotebookEdit': '编辑Jupyter笔记本',
36
- 'WebFetch': '获取网页内容',
37
- 'WebSearch': '搜索网络信息',
38
- 'TodoWrite': '创建和管理待办事项',
39
- 'Task': '执行复杂任务',
40
- 'ExitPlanMode': '退出计划模式',
41
- };
42
- /**
43
- * 获取工具的显示名称
44
- * @param toolName 工具的原始名称
45
- * @returns 工具的显示名称,如果没有映射则返回原始名称
46
- */
47
- export function getToolDisplayName(toolName) {
48
- return TOOL_DISPLAY_MAP[toolName] || toolName;
49
- }
50
- /**
51
- * 获取工具的描述
52
- * @param toolName 工具的原始名称
53
- * @returns 工具的描述,如果没有映射则返回空字符串
54
- */
55
- export function getToolDescription(toolName) {
56
- return TOOL_DESCRIPTION_MAP[toolName] || '';
57
- }
58
- /**
59
- * 获取所有可用工具的信息
60
- * @returns 包含工具名称、显示名和描述的对象数组
61
- */
62
- export function getAllToolsInfo() {
63
- const uniqueTools = new Set([
64
- ...Object.keys(TOOL_DISPLAY_MAP)
65
- ]);
66
- return Array.from(uniqueTools).map(name => ({
67
- name,
68
- label: getToolDisplayName(name),
69
- description: getToolDescription(name)
70
- }));
71
- }