@lovelybunch/api 1.0.9 → 1.0.11

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.
@@ -47,34 +47,41 @@ app.get('/ws/terminal/:sessionId', upgradeWebSocket((c) => ({
47
47
  }
48
48
  })));
49
49
  // Import and register API routes
50
- import * as proposals from './routes/api/v1/proposals/route.js';
51
- import * as proposalsById from './routes/api/v1/proposals/[id]/route.js';
52
- import * as terminalSessions from './routes/api/v1/terminal/sessions/route.js';
53
- import * as ai from './routes/api/v1/ai/route.js';
54
- import * as chats from './routes/api/v1/chats/route.js';
55
- import * as chatsById from './routes/api/v1/chats/[id]/route.js';
56
- import * as resources from './routes/api/v1/resources/route.js';
57
- import * as resourcesById from './routes/api/v1/resources/[id]/route.js';
58
- import * as config from './routes/api/v1/config/route.js';
59
- import agentsApp from './routes/api/v1/agents/route.js';
60
- import agentsByIdApp from './routes/api/v1/agents/[id]/route.js';
61
- // Register API routes - individual handlers
62
- app.get('/api/v1/proposals', proposals.GET);
63
- app.post('/api/v1/proposals', proposals.POST);
64
- app.get('/api/v1/proposals/:id', proposalsById.GET);
65
- app.patch('/api/v1/proposals/:id', proposalsById.PATCH);
66
- app.delete('/api/v1/proposals/:id', proposalsById.DELETE);
67
- app.get('/api/v1/terminal/sessions', terminalSessions.GET);
68
- app.post('/api/v1/ai', ai.POST);
69
- app.get('/api/v1/chats', chats.GET);
70
- app.post('/api/v1/chats', chats.POST);
71
- app.get('/api/v1/chats/:id', chatsById.GET);
72
- app.get('/api/v1/resources', resources.GET);
73
- app.get('/api/v1/resources/:id', resourcesById.GET);
74
- app.get('/api/v1/config', config.GET);
75
- // Register API routes - Hono apps
76
- app.route('/api/v1/agents', agentsApp);
77
- app.route('/api/v1/agents', agentsByIdApp);
50
+ import proposals from './routes/api/v1/proposals/index.js';
51
+ import terminalSessions from './routes/api/v1/terminal/sessions/index.js';
52
+ import terminalCreate from './routes/api/v1/terminal/[proposalId]/create/index.js';
53
+ import terminalDestroy from './routes/api/v1/terminal/[proposalId]/destroy/index.js';
54
+ import terminalResize from './routes/api/v1/terminal/[proposalId]/resize/index.js';
55
+ import ai from './routes/api/v1/ai/index.js';
56
+ import chats from './routes/api/v1/chats/index.js';
57
+ import chatsById from './routes/api/v1/chats/[id]/index.js';
58
+ import resources from './routes/api/v1/resources/index.js';
59
+ import resourcesById from './routes/api/v1/resources/[id]/index.js';
60
+ import resourcesThumbnail from './routes/api/v1/resources/[id]/thumbnail/index.js';
61
+ import context from './routes/api/v1/context/index.js';
62
+ import config from './routes/api/v1/config/index.js';
63
+ import user from './routes/api/v1/user/index.js';
64
+ import agents from './routes/api/v1/agents/index.js';
65
+ import agentsById from './routes/api/v1/agents/[id]/index.js';
66
+ // Register API routes FIRST
67
+ console.log('🔗 Registering API routes...');
68
+ app.route('/api/v1/proposals', proposals);
69
+ app.route('/api/v1/terminal/sessions', terminalSessions);
70
+ app.route('/api/v1/terminal/:proposalId/create', terminalCreate);
71
+ app.route('/api/v1/terminal/:proposalId/destroy', terminalDestroy);
72
+ app.route('/api/v1/terminal/:proposalId/resize', terminalResize);
73
+ app.route('/api/v1/ai', ai);
74
+ app.route('/api/v1/chats', chats);
75
+ app.route('/api/v1/chats/:id', chatsById);
76
+ app.route('/api/v1/resources', resources);
77
+ app.route('/api/v1/resources/:id', resourcesById);
78
+ app.route('/api/v1/resources/:id/thumbnail', resourcesThumbnail);
79
+ app.route('/api/v1/context', context);
80
+ app.route('/api/v1/config', config);
81
+ app.route('/api/v1/user', user);
82
+ app.route('/api/v1/agents', agents);
83
+ app.route('/api/v1/agents/:id', agentsById);
84
+ console.log('✅ API routes registered');
78
85
  // Health check endpoint
79
86
  app.get('/api/health', (c) => {
80
87
  return c.json({ status: 'ok', timestamp: new Date().toISOString() });
@@ -87,7 +94,9 @@ const possibleStaticPaths = [
87
94
  // When running from development
88
95
  path.join(__dirname, '../../../frontend/dist'),
89
96
  // When bundled with the API package
90
- path.join(__dirname, '../static')
97
+ path.join(__dirname, '../static'),
98
+ // When running from coconuts globally
99
+ path.join(__dirname, '../../node_modules/@lovelybunch/api/static')
91
100
  ];
92
101
  // Find the first existing static path
93
102
  let staticPath = null;
@@ -104,12 +113,14 @@ for (const possiblePath of possibleStaticPaths) {
104
113
  }
105
114
  }
106
115
  if (staticPath) {
107
- // Serve static assets
116
+ // Serve all static assets (CSS, JS, images, etc.)
108
117
  app.use('/assets/*', serveStatic({ root: staticPath }));
109
118
  // Serve specific static files
110
119
  app.use('/vite.svg', serveStatic({ root: staticPath }));
111
120
  app.use('/favicon.ico', serveStatic({ root: staticPath }));
112
- // Serve index.html for all non-API, non-WebSocket routes (SPA routing)
121
+ }
122
+ // Serve index.html for all non-API, non-WebSocket routes (SPA routing) - LAST
123
+ if (staticPath) {
113
124
  app.get('*', async (c) => {
114
125
  const requestPath = c.req.path;
115
126
  // Don't serve index.html for API or WebSocket routes
@@ -121,10 +132,15 @@ if (staticPath) {
121
132
  return c.html(html);
122
133
  }
123
134
  catch (error) {
135
+ console.error('Failed to serve index.html:', error);
124
136
  return c.text('Not Found', 404);
125
137
  }
126
138
  });
127
139
  }
140
+ else {
141
+ console.warn('⚠️ No static files found. Frontend may not work properly.');
142
+ console.warn(' Run "pnpm run build:bundle" in the api package to bundle frontend files.');
143
+ }
128
144
  // Export function to start the server
129
145
  export async function startServer(options = {}) {
130
146
  const port = options.port || (process.env.PORT ? parseInt(process.env.PORT) : 3000);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lovelybunch/api",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "type": "module",
5
5
  "main": "dist/server-with-static.js",
6
6
  "exports": {
@@ -19,14 +19,14 @@
19
19
  "start:dev": "node dist/server.js",
20
20
  "test": "echo \"Error: no test specified\" && exit 1"
21
21
  },
22
- "keywords": [],
22
+ "keywords": ["api", "server", "hono", "gait", "coconut"],
23
23
  "author": "",
24
24
  "license": "ISC",
25
- "description": "",
25
+ "description": "GAIT API server with Hono and static frontend serving",
26
26
  "dependencies": {
27
27
  "@hono/node-server": "^1.13.7",
28
28
  "@hono/node-ws": "^1.0.6",
29
- "@lovelybunch/types": "^1.0.7",
29
+ "@lovelybunch/types": "^1.0.11",
30
30
  "fuse.js": "^7.0.0",
31
31
  "gray-matter": "^4.0.3",
32
32
  "hono": "^4.9.5",