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.
Files changed (119) hide show
  1. package/README.md +1 -7
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.js +92 -32
  4. package/dist/lib/response-builder.d.ts +50 -0
  5. package/dist/lib/response-builder.js +56 -0
  6. package/dist/lib/stream-helper.d.ts +39 -0
  7. package/dist/lib/stream-helper.js +43 -0
  8. package/dist/managers/ConversationManager.d.ts +83 -0
  9. package/dist/managers/ConversationManager.js +129 -0
  10. package/dist/managers/GitManager.d.ts +133 -0
  11. package/dist/managers/GitManager.js +330 -0
  12. package/dist/managers/MetadataManager.d.ts +139 -0
  13. package/dist/managers/MetadataManager.js +309 -0
  14. package/dist/managers/ModelManager.d.ts +57 -0
  15. package/dist/managers/ModelManager.js +129 -0
  16. package/dist/managers/NeovateExecutor.d.ts +40 -0
  17. package/dist/managers/NeovateExecutor.js +138 -0
  18. package/dist/managers/ProjectManager.d.ts +162 -0
  19. package/dist/managers/ProjectManager.js +353 -0
  20. package/dist/managers/ThreadManager.d.ts +181 -0
  21. package/dist/managers/ThreadManager.js +325 -0
  22. package/dist/managers/conversation-manager.d.ts +83 -0
  23. package/dist/managers/conversation-manager.js +129 -0
  24. package/dist/managers/git-manager.d.ts +133 -0
  25. package/dist/managers/git-manager.js +330 -0
  26. package/dist/managers/metadata-manager.d.ts +139 -0
  27. package/dist/managers/metadata-manager.js +305 -0
  28. package/dist/managers/model-manager.d.ts +59 -0
  29. package/dist/managers/model-manager.js +144 -0
  30. package/dist/managers/neovate-executor.d.ts +43 -0
  31. package/dist/managers/neovate-executor.js +205 -0
  32. package/dist/managers/processing-state-manager.d.ts +40 -0
  33. package/dist/managers/processing-state-manager.js +27 -0
  34. package/dist/managers/project-manager.d.ts +199 -0
  35. package/dist/managers/project-manager.js +465 -0
  36. package/dist/managers/thread-manager.d.ts +193 -0
  37. package/dist/managers/thread-manager.js +368 -0
  38. package/dist/model-info-aihubmix.d.ts +25 -0
  39. package/dist/model-info-aihubmix.js +117 -0
  40. package/dist/model-info-openai.d.ts +17 -0
  41. package/dist/model-info-openai.js +59 -0
  42. package/dist/model-info-openrouter.d.ts +25 -0
  43. package/dist/model-info-openrouter.js +101 -0
  44. package/dist/model-info.d.ts +37 -0
  45. package/dist/model-info.js +39 -0
  46. package/dist/provider-data.d.ts +101 -0
  47. package/dist/provider-data.js +471 -0
  48. package/dist/provider.d.ts +10 -0
  49. package/dist/provider.js +192 -0
  50. package/dist/public/android-chrome-192x192.png +0 -0
  51. package/dist/public/android-chrome-512x512.png +0 -0
  52. package/dist/public/apple-touch-icon.png +0 -0
  53. package/dist/public/assets/index-B443aj9k.js +8506 -0
  54. package/dist/public/assets/index-CjXGVbI7.css +1 -0
  55. package/dist/public/assets/index-DJC-p914.js +8506 -0
  56. package/dist/public/favicon-16x16.png +0 -0
  57. package/dist/public/favicon-32x32.png +0 -0
  58. package/dist/public/favicon.ico +0 -0
  59. package/dist/public/index.html +28 -0
  60. package/dist/public/manifest.json +82 -0
  61. package/dist/public/placeholder-logo.svg +1 -0
  62. package/dist/public/placeholder.svg +1 -0
  63. package/dist/public/snpro.woff2 +0 -0
  64. package/dist/public/tarsk-color.svg +12 -0
  65. package/dist/public/tarsk.png +0 -0
  66. package/dist/public/tarsk.svg +12 -0
  67. package/dist/public/zalando-sans.woff2 +0 -0
  68. package/dist/routes/chat-old.d.ts +21 -0
  69. package/dist/routes/chat-old.js +251 -0
  70. package/dist/routes/chat.d.ts +21 -0
  71. package/dist/routes/chat.js +217 -0
  72. package/dist/routes/git.d.ts +4 -0
  73. package/dist/routes/git.js +668 -0
  74. package/dist/routes/models.d.ts +18 -0
  75. package/dist/routes/models.js +128 -0
  76. package/dist/routes/projects-old.d.ts +20 -0
  77. package/dist/routes/projects-old.js +297 -0
  78. package/dist/routes/projects.d.ts +20 -0
  79. package/dist/routes/projects.js +365 -0
  80. package/dist/routes/providers.d.ts +15 -0
  81. package/dist/routes/providers.js +130 -0
  82. package/dist/routes/threads-old.d.ts +14 -0
  83. package/dist/routes/threads-old.js +393 -0
  84. package/dist/routes/threads.d.ts +14 -0
  85. package/dist/routes/threads.js +352 -0
  86. package/dist/types/models.d.ts +315 -0
  87. package/dist/types/models.js +11 -0
  88. package/dist/utils/env-manager.d.ts +3 -0
  89. package/dist/utils/env-manager.js +60 -0
  90. package/dist/utils/open-router-models.d.ts +45 -0
  91. package/dist/utils/open-router-models.js +103 -0
  92. package/dist/utils/openai-models.d.ts +63 -0
  93. package/dist/utils/openai-models.js +152 -0
  94. package/dist/utils/openai-pricing-scraper.d.ts +17 -0
  95. package/dist/utils/openai-pricing-scraper.js +185 -0
  96. package/dist/utils/validation.d.ts +10 -0
  97. package/dist/utils/validation.js +20 -0
  98. package/dist/utils.d.ts +10 -0
  99. package/dist/utils.js +12 -0
  100. package/package.json +36 -22
  101. package/LICENSE.md +0 -7
  102. package/dist/agent/agent.js +0 -131
  103. package/dist/agent/interfaces.js +0 -1
  104. package/dist/api/encryption.js +0 -41
  105. package/dist/api/models.js +0 -169
  106. package/dist/api/prompt.js +0 -12
  107. package/dist/api/settings.js +0 -43
  108. package/dist/api/test.js +0 -29
  109. package/dist/api/tools.js +0 -287
  110. package/dist/api/utils.js +0 -18
  111. package/dist/interfaces/meta.js +0 -1
  112. package/dist/interfaces/model.js +0 -1
  113. package/dist/interfaces/settings.js +0 -1
  114. package/dist/log/log.js +0 -33
  115. package/dist/prompt.js +0 -49
  116. package/dist/tools.js +0 -84
  117. package/dist/utils/files.js +0 -14
  118. package/dist/utils/json-file.js +0 -28
  119. 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