tarsk 0.2.5 → 0.3.0
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 +1 -7
- package/dist/index.d.ts +3 -0
- package/dist/index.js +92 -32
- package/dist/lib/response-builder.d.ts +50 -0
- package/dist/lib/response-builder.js +56 -0
- package/dist/lib/stream-helper.d.ts +39 -0
- package/dist/lib/stream-helper.js +43 -0
- package/dist/managers/ConversationManager.d.ts +83 -0
- package/dist/managers/ConversationManager.js +129 -0
- package/dist/managers/GitManager.d.ts +133 -0
- package/dist/managers/GitManager.js +330 -0
- package/dist/managers/MetadataManager.d.ts +139 -0
- package/dist/managers/MetadataManager.js +309 -0
- package/dist/managers/ModelManager.d.ts +57 -0
- package/dist/managers/ModelManager.js +129 -0
- package/dist/managers/NeovateExecutor.d.ts +40 -0
- package/dist/managers/NeovateExecutor.js +138 -0
- package/dist/managers/ProjectManager.d.ts +162 -0
- package/dist/managers/ProjectManager.js +353 -0
- package/dist/managers/ThreadManager.d.ts +181 -0
- package/dist/managers/ThreadManager.js +325 -0
- package/dist/managers/conversation-manager.d.ts +83 -0
- package/dist/managers/conversation-manager.js +129 -0
- package/dist/managers/git-manager.d.ts +133 -0
- package/dist/managers/git-manager.js +330 -0
- package/dist/managers/metadata-manager.d.ts +139 -0
- package/dist/managers/metadata-manager.js +305 -0
- package/dist/managers/model-manager.d.ts +59 -0
- package/dist/managers/model-manager.js +144 -0
- package/dist/managers/neovate-executor.d.ts +43 -0
- package/dist/managers/neovate-executor.js +205 -0
- package/dist/managers/processing-state-manager.d.ts +40 -0
- package/dist/managers/processing-state-manager.js +27 -0
- package/dist/managers/project-manager.d.ts +199 -0
- package/dist/managers/project-manager.js +465 -0
- package/dist/managers/thread-manager.d.ts +193 -0
- package/dist/managers/thread-manager.js +368 -0
- package/dist/model-info-aihubmix.d.ts +25 -0
- package/dist/model-info-aihubmix.js +117 -0
- package/dist/model-info-openai.d.ts +17 -0
- package/dist/model-info-openai.js +59 -0
- package/dist/model-info-openrouter.d.ts +25 -0
- package/dist/model-info-openrouter.js +101 -0
- package/dist/model-info.d.ts +37 -0
- package/dist/model-info.js +39 -0
- package/dist/provider-data.d.ts +101 -0
- package/dist/provider-data.js +471 -0
- package/dist/provider.d.ts +10 -0
- package/dist/provider.js +192 -0
- package/dist/public/android-chrome-192x192.png +0 -0
- package/dist/public/android-chrome-512x512.png +0 -0
- package/dist/public/apple-touch-icon.png +0 -0
- package/dist/public/assets/index-B443aj9k.js +8506 -0
- package/dist/public/assets/index-CjXGVbI7.css +1 -0
- package/dist/public/assets/index-DJC-p914.js +8506 -0
- package/dist/public/favicon-16x16.png +0 -0
- package/dist/public/favicon-32x32.png +0 -0
- package/dist/public/favicon.ico +0 -0
- package/dist/public/index.html +28 -0
- package/dist/public/manifest.json +82 -0
- package/dist/public/placeholder-logo.svg +1 -0
- package/dist/public/placeholder.svg +1 -0
- package/dist/public/snpro.woff2 +0 -0
- package/dist/public/tarsk-color.svg +12 -0
- package/dist/public/tarsk.png +0 -0
- package/dist/public/tarsk.svg +12 -0
- package/dist/public/zalando-sans.woff2 +0 -0
- package/dist/routes/chat-old.d.ts +21 -0
- package/dist/routes/chat-old.js +251 -0
- package/dist/routes/chat.d.ts +21 -0
- package/dist/routes/chat.js +217 -0
- package/dist/routes/git.d.ts +4 -0
- package/dist/routes/git.js +668 -0
- package/dist/routes/models.d.ts +18 -0
- package/dist/routes/models.js +128 -0
- package/dist/routes/projects-old.d.ts +20 -0
- package/dist/routes/projects-old.js +297 -0
- package/dist/routes/projects.d.ts +20 -0
- package/dist/routes/projects.js +365 -0
- package/dist/routes/providers.d.ts +15 -0
- package/dist/routes/providers.js +130 -0
- package/dist/routes/threads-old.d.ts +14 -0
- package/dist/routes/threads-old.js +393 -0
- package/dist/routes/threads.d.ts +14 -0
- package/dist/routes/threads.js +352 -0
- package/dist/types/models.d.ts +315 -0
- package/dist/types/models.js +11 -0
- package/dist/utils/env-manager.d.ts +3 -0
- package/dist/utils/env-manager.js +60 -0
- package/dist/utils/open-router-models.d.ts +45 -0
- package/dist/utils/open-router-models.js +103 -0
- package/dist/utils/openai-models.d.ts +63 -0
- package/dist/utils/openai-models.js +152 -0
- package/dist/utils/openai-pricing-scraper.d.ts +17 -0
- package/dist/utils/openai-pricing-scraper.js +185 -0
- package/dist/utils/validation.d.ts +10 -0
- package/dist/utils/validation.js +20 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +12 -0
- package/package.json +36 -22
- package/LICENSE.md +0 -7
- package/dist/agent/agent.js +0 -131
- package/dist/agent/interfaces.js +0 -1
- package/dist/api/encryption.js +0 -41
- package/dist/api/models.js +0 -169
- package/dist/api/prompt.js +0 -12
- package/dist/api/settings.js +0 -43
- package/dist/api/test.js +0 -29
- package/dist/api/tools.js +0 -287
- package/dist/api/utils.js +0 -18
- package/dist/interfaces/meta.js +0 -1
- package/dist/interfaces/model.js +0 -1
- package/dist/interfaces/settings.js +0 -1
- package/dist/log/log.js +0 -33
- package/dist/prompt.js +0 -49
- package/dist/tools.js +0 -84
- package/dist/utils/files.js +0 -14
- package/dist/utils/json-file.js +0 -28
- package/dist/utils/strip-markdown.js +0 -5
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model routes for the REST API
|
|
3
|
+
*
|
|
4
|
+
* Handles all model-related operations:
|
|
5
|
+
* - GET /api/models - Get available models for a provider
|
|
6
|
+
* - POST /api/models/:provider/:modelId/enable - Enable a model
|
|
7
|
+
* - POST /api/models/:provider/:modelId/disable - Disable a model
|
|
8
|
+
* - GET /api/models/enabled - Get all enabled models
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { ModelManager } from '../managers/model-manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Creates model routes
|
|
14
|
+
* @param metadataManager - Manager for metadata persistence
|
|
15
|
+
* @returns Hono router with model routes
|
|
16
|
+
*/
|
|
17
|
+
export function createModelRoutes(metadataManager) {
|
|
18
|
+
const router = new Hono();
|
|
19
|
+
const modelManager = new ModelManager(metadataManager);
|
|
20
|
+
/**
|
|
21
|
+
* GET /api/models?provider=openrouter&supportedTools=true
|
|
22
|
+
* Get available models for a provider
|
|
23
|
+
*
|
|
24
|
+
* Query parameters:
|
|
25
|
+
* - provider: Required. Provider name (e.g., "openrouter", "openai")
|
|
26
|
+
* - supportedTools: Optional. If "true", only return models with tools support
|
|
27
|
+
*/
|
|
28
|
+
router.get('/', async (c) => {
|
|
29
|
+
try {
|
|
30
|
+
const provider = c.req.query('provider');
|
|
31
|
+
const supportedTools = c.req.query('supportedTools');
|
|
32
|
+
if (!provider) {
|
|
33
|
+
return c.json({ error: 'provider query parameter is required' }, 400);
|
|
34
|
+
}
|
|
35
|
+
let models = await modelManager.getAvailableModels(provider);
|
|
36
|
+
// Filter by supported tools if requested
|
|
37
|
+
if (supportedTools === 'true' && provider.toLowerCase() === 'openrouter') {
|
|
38
|
+
models = models.filter((m) => m.supportedParameters?.tools === true);
|
|
39
|
+
}
|
|
40
|
+
// Sort models to put enabled ones at the top
|
|
41
|
+
const enabledModels = await modelManager.getEnabledModels(provider);
|
|
42
|
+
const enabledModelIds = new Set(enabledModels.map((m) => m.id));
|
|
43
|
+
models.sort((a, b) => {
|
|
44
|
+
const aEnabled = enabledModelIds.has(a.id) ? 0 : 1;
|
|
45
|
+
const bEnabled = enabledModelIds.has(b.id) ? 0 : 1;
|
|
46
|
+
return aEnabled - bEnabled;
|
|
47
|
+
});
|
|
48
|
+
return c.json({ provider, models });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
52
|
+
return c.json({ error: message }, 500);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* GET /api/models/enabled
|
|
57
|
+
* Get all enabled models across all providers
|
|
58
|
+
*/
|
|
59
|
+
router.get('/enabled', async (c) => {
|
|
60
|
+
try {
|
|
61
|
+
const enabledModels = await modelManager.getAllEnabledModels();
|
|
62
|
+
return c.json({ enabledModels });
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
66
|
+
return c.json({ error: message }, 500);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
/**
|
|
70
|
+
* POST /api/models/:provider/:modelId/enable
|
|
71
|
+
* Enable a model for a provider
|
|
72
|
+
*/
|
|
73
|
+
router.post('/:provider/:modelId/enable', async (c) => {
|
|
74
|
+
try {
|
|
75
|
+
const provider = c.req.param('provider');
|
|
76
|
+
const modelId = c.req.param('modelId');
|
|
77
|
+
if (!provider || !modelId) {
|
|
78
|
+
return c.json({ error: 'provider and modelId are required' }, 400);
|
|
79
|
+
}
|
|
80
|
+
await modelManager.enableModel(provider, modelId);
|
|
81
|
+
return c.json({ success: true, message: `Model ${modelId} enabled for ${provider}` });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
85
|
+
return c.json({ error: message }, 400);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
/**
|
|
89
|
+
* POST /api/models/:provider/:modelId/disable
|
|
90
|
+
* Disable a model for a provider
|
|
91
|
+
*/
|
|
92
|
+
router.post('/:provider/:modelId/disable', async (c) => {
|
|
93
|
+
try {
|
|
94
|
+
const provider = c.req.param('provider');
|
|
95
|
+
const modelId = c.req.param('modelId');
|
|
96
|
+
if (!provider || !modelId) {
|
|
97
|
+
return c.json({ error: 'provider and modelId are required' }, 400);
|
|
98
|
+
}
|
|
99
|
+
await modelManager.disableModel(provider, modelId);
|
|
100
|
+
return c.json({ success: true, message: `Model ${modelId} disabled for ${provider}` });
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
104
|
+
return c.json({ error: message }, 500);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
/**
|
|
108
|
+
* POST /api/models/:provider/refresh
|
|
109
|
+
* Refresh the available models for a provider
|
|
110
|
+
* Note: With provider-data.ts, this is a no-op but kept for backward compatibility
|
|
111
|
+
*/
|
|
112
|
+
router.post('/:provider/refresh', async (c) => {
|
|
113
|
+
try {
|
|
114
|
+
const provider = c.req.param('provider');
|
|
115
|
+
if (!provider) {
|
|
116
|
+
return c.json({ error: 'provider is required' }, 400);
|
|
117
|
+
}
|
|
118
|
+
const models = await modelManager.getAvailableModels(provider);
|
|
119
|
+
return c.json({ success: true, provider, modelCount: models.length });
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
123
|
+
return c.json({ error: message }, 500);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return router;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project routes for the REST API
|
|
3
|
+
*
|
|
4
|
+
* Handles all project-related operations:
|
|
5
|
+
* - POST /api/projects - Create a new project
|
|
6
|
+
* - GET /api/projects - List all projects
|
|
7
|
+
* - GET /api/projects/:id - Get project details
|
|
8
|
+
* - DELETE /api/projects/:id - Delete a project
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { ProjectManager } from '../managers/project-manager.js';
|
|
12
|
+
import { ThreadManager } from '../managers/thread-manager.js';
|
|
13
|
+
/**
|
|
14
|
+
* Creates project routes
|
|
15
|
+
* @param projectManager - The ProjectManager instance
|
|
16
|
+
* @param threadManager - The ThreadManager instance
|
|
17
|
+
* @returns Hono router with project routes
|
|
18
|
+
*/
|
|
19
|
+
export declare function createProjectRoutes(projectManager: ProjectManager, threadManager: ThreadManager): Hono;
|
|
20
|
+
//# sourceMappingURL=projects-old.d.ts.map
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project routes for the REST API
|
|
3
|
+
*
|
|
4
|
+
* Handles all project-related operations:
|
|
5
|
+
* - POST /api/projects - Create a new project
|
|
6
|
+
* - GET /api/projects - List all projects
|
|
7
|
+
* - GET /api/projects/:id - Get project details
|
|
8
|
+
* - DELETE /api/projects/:id - Delete a project
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { AVAILABLE_PROGRAMS } from '../types/models.js';
|
|
12
|
+
import { streamAsyncGenerator } from '../lib/stream-helper.js';
|
|
13
|
+
import { ResponseBuilder } from '../lib/response-builder.js';
|
|
14
|
+
/**
|
|
15
|
+
* Creates project routes
|
|
16
|
+
* @param projectManager - The ProjectManager instance
|
|
17
|
+
* @param threadManager - The ThreadManager instance
|
|
18
|
+
* @returns Hono router with project routes
|
|
19
|
+
*/
|
|
20
|
+
export function createProjectRoutes(projectManager, threadManager) {
|
|
21
|
+
const router = new Hono();
|
|
22
|
+
/**
|
|
23
|
+
* POST /api/projects
|
|
24
|
+
* Create a new project from a git URL
|
|
25
|
+
*
|
|
26
|
+
* Request body:
|
|
27
|
+
* {
|
|
28
|
+
* "gitUrl": "https://github.com/user/repo.git"
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* Response: Newline-delimited JSON stream of ProjectEvent objects
|
|
32
|
+
*
|
|
33
|
+
* Requirements:
|
|
34
|
+
* - 6.2 - THE App SHALL send a POST request with the git URL to the CLI
|
|
35
|
+
* - 8.2 - THE CLI SHALL support streaming responses to the client
|
|
36
|
+
*/
|
|
37
|
+
router.post('/', async (c) => {
|
|
38
|
+
try {
|
|
39
|
+
const body = await c.req.json();
|
|
40
|
+
const { gitUrl } = body;
|
|
41
|
+
// Validate gitUrl is provided
|
|
42
|
+
if (!gitUrl || typeof gitUrl !== 'string') {
|
|
43
|
+
const { response, statusCode } = ResponseBuilder.error('INVALID_REQUEST', 'gitUrl is required and must be a string', 400);
|
|
44
|
+
return c.json(response, statusCode);
|
|
45
|
+
}
|
|
46
|
+
// Stream the project creation events
|
|
47
|
+
return streamAsyncGenerator(c, projectManager.createProject(gitUrl));
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const { response, statusCode } = ResponseBuilder.error('REQUEST_PARSE_ERROR', 'Failed to parse request body', 400, error instanceof Error ? error.message : String(error));
|
|
51
|
+
return c.json(response, statusCode);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* GET /api/projects
|
|
56
|
+
* List all projects with expanded threads
|
|
57
|
+
*
|
|
58
|
+
* Response:
|
|
59
|
+
* [
|
|
60
|
+
* {
|
|
61
|
+
* "projectId": "uuid",
|
|
62
|
+
* "gitUrl": "https://github.com/user/repo.git",
|
|
63
|
+
* "projectPath": "/path/to/project",
|
|
64
|
+
* "threads": [
|
|
65
|
+
* {
|
|
66
|
+
* "threadId": "uuid",
|
|
67
|
+
* "title": "thread-title",
|
|
68
|
+
* "path": "/path/to/thread",
|
|
69
|
+
* "isSelected": false
|
|
70
|
+
* }
|
|
71
|
+
* ]
|
|
72
|
+
* }
|
|
73
|
+
* ]
|
|
74
|
+
*
|
|
75
|
+
* Requirements:
|
|
76
|
+
* - 6.2 - THE CLI SHALL expose REST API endpoints for Project operations
|
|
77
|
+
*/
|
|
78
|
+
router.get('/', async (c) => {
|
|
79
|
+
try {
|
|
80
|
+
const projects = await projectManager.listProjects();
|
|
81
|
+
// Get the currently selected thread
|
|
82
|
+
const selectedThreadId = await threadManager.getSelectedThreadId();
|
|
83
|
+
// Expand threads for each project
|
|
84
|
+
const expandedProjects = await Promise.all(projects.map(async (project) => {
|
|
85
|
+
const threads = await threadManager.listThreads(project.id);
|
|
86
|
+
return {
|
|
87
|
+
projectId: project.id,
|
|
88
|
+
gitUrl: project.gitUrl,
|
|
89
|
+
projectPath: project.path,
|
|
90
|
+
openWith: project.openWith,
|
|
91
|
+
threads: threads.map(thread => ({
|
|
92
|
+
threadId: thread.id,
|
|
93
|
+
title: thread.title,
|
|
94
|
+
path: thread.path,
|
|
95
|
+
isSelected: thread.id === selectedThreadId
|
|
96
|
+
}))
|
|
97
|
+
};
|
|
98
|
+
}));
|
|
99
|
+
return c.json(expandedProjects);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const { response, statusCode } = ResponseBuilder.error('LIST_PROJECTS_ERROR', 'Failed to list projects', 500, error instanceof Error ? error.message : String(error));
|
|
103
|
+
return c.json(response, statusCode);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
/**
|
|
107
|
+
* GET /api/projects/:id
|
|
108
|
+
* Get project details by ID
|
|
109
|
+
*
|
|
110
|
+
* Response:
|
|
111
|
+
* {
|
|
112
|
+
* "id": "uuid",
|
|
113
|
+
* "name": "project-name",
|
|
114
|
+
* "gitUrl": "https://github.com/user/repo.git",
|
|
115
|
+
* "path": "/path/to/project",
|
|
116
|
+
* "createdAt": "2024-01-01T00:00:00Z",
|
|
117
|
+
* "threads": ["thread-id-1", "thread-id-2"]
|
|
118
|
+
* }
|
|
119
|
+
*
|
|
120
|
+
* Requirements:
|
|
121
|
+
* - 6.2 - THE CLI SHALL expose REST API endpoints for Project operations
|
|
122
|
+
*/
|
|
123
|
+
router.get('/:id', async (c) => {
|
|
124
|
+
try {
|
|
125
|
+
const projectId = c.req.param('id');
|
|
126
|
+
if (!projectId) {
|
|
127
|
+
const { response, statusCode } = ResponseBuilder.error('INVALID_REQUEST', 'Project ID is required', 400);
|
|
128
|
+
return c.json(response, statusCode);
|
|
129
|
+
}
|
|
130
|
+
const project = await projectManager.getProject(projectId);
|
|
131
|
+
if (!project) {
|
|
132
|
+
const { response, statusCode } = ResponseBuilder.error('PROJECT_NOT_FOUND', `Project not found: ${projectId}`, 404);
|
|
133
|
+
return c.json(response, statusCode);
|
|
134
|
+
}
|
|
135
|
+
return c.json(project);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const { response, statusCode } = ResponseBuilder.error('GET_PROJECT_ERROR', 'Failed to get project', 500, error instanceof Error ? error.message : String(error));
|
|
139
|
+
return c.json(response, statusCode);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
/**
|
|
143
|
+
* DELETE /api/projects/:id
|
|
144
|
+
* Delete a project and all its threads
|
|
145
|
+
*
|
|
146
|
+
* Response:
|
|
147
|
+
* {
|
|
148
|
+
* "success": true,
|
|
149
|
+
* "message": "Project deleted successfully"
|
|
150
|
+
* }
|
|
151
|
+
*
|
|
152
|
+
* Requirements:
|
|
153
|
+
* - 6.2 - THE CLI SHALL expose REST API endpoints for Project operations
|
|
154
|
+
*/
|
|
155
|
+
router.delete('/:id', async (c) => {
|
|
156
|
+
try {
|
|
157
|
+
const projectId = c.req.param('id');
|
|
158
|
+
if (!projectId) {
|
|
159
|
+
const { response, statusCode } = ResponseBuilder.error('INVALID_REQUEST', 'Project ID is required', 400);
|
|
160
|
+
return c.json(response, statusCode);
|
|
161
|
+
}
|
|
162
|
+
await projectManager.deleteProject(projectId);
|
|
163
|
+
const { response, statusCode } = ResponseBuilder.success({ success: true, message: 'Project deleted successfully' });
|
|
164
|
+
return c.json(response, statusCode);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
168
|
+
// Check if it's a "not found" error
|
|
169
|
+
if (errorMessage.includes('not found')) {
|
|
170
|
+
const { response, statusCode } = ResponseBuilder.error('PROJECT_NOT_FOUND', errorMessage, 404);
|
|
171
|
+
return c.json(response, statusCode);
|
|
172
|
+
}
|
|
173
|
+
const { response, statusCode } = ResponseBuilder.error('DELETE_PROJECT_ERROR', 'Failed to delete project', 500, errorMessage);
|
|
174
|
+
return c.json(response, statusCode);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
/**
|
|
178
|
+
* POST /api/projects/:id/open
|
|
179
|
+
* Open a project in the specified program
|
|
180
|
+
*
|
|
181
|
+
* Request body:
|
|
182
|
+
* {
|
|
183
|
+
* "program": "VS Code" | "Cursor" | "Windsurf" | "Xcode" | "Android Studio" | "Kiro"
|
|
184
|
+
* }
|
|
185
|
+
*
|
|
186
|
+
* Response:
|
|
187
|
+
* {
|
|
188
|
+
* "success": true,
|
|
189
|
+
* "message": "Project opened in VS Code"
|
|
190
|
+
* }
|
|
191
|
+
*/
|
|
192
|
+
router.post('/:id/open', async (c) => {
|
|
193
|
+
try {
|
|
194
|
+
const projectId = c.req.param('id');
|
|
195
|
+
const body = await c.req.json();
|
|
196
|
+
const { program } = body;
|
|
197
|
+
if (!projectId) {
|
|
198
|
+
const errorResponse = {
|
|
199
|
+
error: {
|
|
200
|
+
code: 'INVALID_REQUEST',
|
|
201
|
+
message: 'Project ID is required',
|
|
202
|
+
timestamp: new Date().toISOString()
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
return c.json(errorResponse, 400);
|
|
206
|
+
}
|
|
207
|
+
if (!program) {
|
|
208
|
+
const errorResponse = {
|
|
209
|
+
error: {
|
|
210
|
+
code: 'INVALID_REQUEST',
|
|
211
|
+
message: 'Program is required',
|
|
212
|
+
timestamp: new Date().toISOString()
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
return c.json(errorResponse, 400);
|
|
216
|
+
}
|
|
217
|
+
if (!AVAILABLE_PROGRAMS.includes(program)) {
|
|
218
|
+
const errorResponse = {
|
|
219
|
+
error: {
|
|
220
|
+
code: 'INVALID_REQUEST',
|
|
221
|
+
message: `Invalid program. Must be one of: ${AVAILABLE_PROGRAMS.join(', ')}`,
|
|
222
|
+
timestamp: new Date().toISOString()
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
return c.json(errorResponse, 400);
|
|
226
|
+
}
|
|
227
|
+
const project = await projectManager.getProject(projectId);
|
|
228
|
+
if (!project) {
|
|
229
|
+
const errorResponse = {
|
|
230
|
+
error: {
|
|
231
|
+
code: 'PROJECT_NOT_FOUND',
|
|
232
|
+
message: `Project not found: ${projectId}`,
|
|
233
|
+
timestamp: new Date().toISOString()
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
return c.json(errorResponse, 404);
|
|
237
|
+
}
|
|
238
|
+
await projectManager.openWith(projectId, program);
|
|
239
|
+
const { response, statusCode } = ResponseBuilder.success({ success: true, message: `Project opened in ${program}` });
|
|
240
|
+
return c.json(response, statusCode);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
244
|
+
const { response, statusCode } = ResponseBuilder.error('OPEN_PROGRAM_ERROR', 'Failed to open project', 500, errorMessage);
|
|
245
|
+
return c.json(response, statusCode);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
/**
|
|
249
|
+
* PUT /api/projects/:id/open-with
|
|
250
|
+
* Update the project's open-with program preference
|
|
251
|
+
*
|
|
252
|
+
* Request body:
|
|
253
|
+
* {
|
|
254
|
+
* "program": "VS Code" | "Cursor" | "Windsurf" | "Xcode" | "Android Studio" | "Kiro"
|
|
255
|
+
* }
|
|
256
|
+
*
|
|
257
|
+
* Response:
|
|
258
|
+
* {
|
|
259
|
+
* "success": true,
|
|
260
|
+
* "message": "Open-with program updated"
|
|
261
|
+
* }
|
|
262
|
+
*/
|
|
263
|
+
router.put('/:id/open-with', async (c) => {
|
|
264
|
+
try {
|
|
265
|
+
const projectId = c.req.param('id');
|
|
266
|
+
const body = await c.req.json();
|
|
267
|
+
const { program } = body;
|
|
268
|
+
if (!projectId) {
|
|
269
|
+
const { response, statusCode } = ResponseBuilder.error('INVALID_REQUEST', 'Project ID is required', 400);
|
|
270
|
+
return c.json(response, statusCode);
|
|
271
|
+
}
|
|
272
|
+
if (!program) {
|
|
273
|
+
const { response, statusCode } = ResponseBuilder.error('INVALID_REQUEST', 'Program is required', 400);
|
|
274
|
+
return c.json(response, statusCode);
|
|
275
|
+
}
|
|
276
|
+
if (!AVAILABLE_PROGRAMS.includes(program)) {
|
|
277
|
+
const { response, statusCode } = ResponseBuilder.error('INVALID_REQUEST', `Invalid program. Must be one of: ${AVAILABLE_PROGRAMS.join(', ')}`, 400);
|
|
278
|
+
return c.json(response, statusCode);
|
|
279
|
+
}
|
|
280
|
+
const project = await projectManager.getProject(projectId);
|
|
281
|
+
if (!project) {
|
|
282
|
+
const { response, statusCode } = ResponseBuilder.error('PROJECT_NOT_FOUND', `Project not found: ${projectId}`, 404);
|
|
283
|
+
return c.json(response, statusCode);
|
|
284
|
+
}
|
|
285
|
+
await projectManager.updateOpenWith(projectId, program);
|
|
286
|
+
const { response, statusCode } = ResponseBuilder.success({ success: true, message: 'Open-with program updated' });
|
|
287
|
+
return c.json(response, statusCode);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
291
|
+
const { response, statusCode } = ResponseBuilder.error('UPDATE_PROGRAM_ERROR', 'Failed to update open-with program', 500, errorMessage);
|
|
292
|
+
return c.json(response, statusCode);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
return router;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=projects-old.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project routes for the REST API
|
|
3
|
+
*
|
|
4
|
+
* Handles all project-related operations:
|
|
5
|
+
* - POST /api/projects - Create a new project
|
|
6
|
+
* - GET /api/projects - List all projects
|
|
7
|
+
* - GET /api/projects/:id - Get project details
|
|
8
|
+
* - DELETE /api/projects/:id - Delete a project
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { ProjectManager } from '../managers/project-manager.js';
|
|
12
|
+
import { ThreadManager } from '../managers/thread-manager.js';
|
|
13
|
+
/**
|
|
14
|
+
* Creates project routes
|
|
15
|
+
* @param projectManager - The ProjectManager instance
|
|
16
|
+
* @param threadManager - The ThreadManager instance
|
|
17
|
+
* @returns Hono router with project routes
|
|
18
|
+
*/
|
|
19
|
+
export declare function createProjectRoutes(projectManager: ProjectManager, threadManager: ThreadManager): Hono;
|
|
20
|
+
//# sourceMappingURL=projects.d.ts.map
|