@stoneforge/shared-routes 0.1.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 (59) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +69 -0
  3. package/dist/channels.d.ts +9 -0
  4. package/dist/channels.d.ts.map +1 -0
  5. package/dist/channels.js +413 -0
  6. package/dist/channels.js.map +1 -0
  7. package/dist/documents.d.ts +9 -0
  8. package/dist/documents.d.ts.map +1 -0
  9. package/dist/documents.js +1205 -0
  10. package/dist/documents.js.map +1 -0
  11. package/dist/elements.d.ts +9 -0
  12. package/dist/elements.d.ts.map +1 -0
  13. package/dist/elements.js +87 -0
  14. package/dist/elements.js.map +1 -0
  15. package/dist/entities.d.ts +9 -0
  16. package/dist/entities.d.ts.map +1 -0
  17. package/dist/entities.js +92 -0
  18. package/dist/entities.js.map +1 -0
  19. package/dist/inbox.d.ts +10 -0
  20. package/dist/inbox.d.ts.map +1 -0
  21. package/dist/inbox.js +538 -0
  22. package/dist/inbox.js.map +1 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +17 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/libraries.d.ts +9 -0
  28. package/dist/libraries.d.ts.map +1 -0
  29. package/dist/libraries.js +467 -0
  30. package/dist/libraries.js.map +1 -0
  31. package/dist/messages.d.ts +9 -0
  32. package/dist/messages.d.ts.map +1 -0
  33. package/dist/messages.js +338 -0
  34. package/dist/messages.js.map +1 -0
  35. package/dist/plans.d.ts +10 -0
  36. package/dist/plans.d.ts.map +1 -0
  37. package/dist/plans.js +495 -0
  38. package/dist/plans.js.map +1 -0
  39. package/dist/types.d.ts +128 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +8 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/ws/broadcaster.d.ts +62 -0
  44. package/dist/ws/broadcaster.d.ts.map +1 -0
  45. package/dist/ws/broadcaster.js +146 -0
  46. package/dist/ws/broadcaster.js.map +1 -0
  47. package/dist/ws/handler.d.ts +11 -0
  48. package/dist/ws/handler.d.ts.map +1 -0
  49. package/dist/ws/handler.js +38 -0
  50. package/dist/ws/handler.js.map +1 -0
  51. package/dist/ws/index.d.ts +11 -0
  52. package/dist/ws/index.d.ts.map +1 -0
  53. package/dist/ws/index.js +11 -0
  54. package/dist/ws/index.js.map +1 -0
  55. package/dist/ws/types.d.ts +85 -0
  56. package/dist/ws/types.d.ts.map +1 -0
  57. package/dist/ws/types.js +63 -0
  58. package/dist/ws/types.js.map +1 -0
  59. package/package.json +40 -0
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2026 Adam King
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # @stoneforge/shared-routes
2
+
3
+ Hono route factories for building Stoneforge-compatible HTTP servers.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@stoneforge/shared-routes)](https://www.npmjs.com/package/@stoneforge/shared-routes)
6
+ [![license](https://img.shields.io/npm/l/@stoneforge/shared-routes)](https://github.com/stoneforge-ai/stoneforge/blob/main/LICENSE)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org)
8
+
9
+ ## Overview
10
+
11
+ `@stoneforge/shared-routes` provides pre-built [Hono](https://hono.dev) route factories that expose the Stoneforge data model over HTTP. Each factory returns a Hono app instance that can be mounted at any path. The package also includes WebSocket utilities for real-time event broadcasting. Used by `quarry-server` and `smithy-server` to share API surface.
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install @stoneforge/shared-routes
17
+ ```
18
+
19
+ Requires `hono` as a dependency (included).
20
+
21
+ ## Quick Start
22
+
23
+ ```typescript
24
+ import { Hono } from 'hono';
25
+ import {
26
+ createElementsRoutes,
27
+ createEntityRoutes,
28
+ createChannelRoutes,
29
+ createMessageRoutes,
30
+ } from '@stoneforge/shared-routes';
31
+
32
+ const app = new Hono();
33
+
34
+ // Mount route groups
35
+ app.route('/api/elements', createElementsRoutes(services));
36
+ app.route('/api/entities', createEntityRoutes(services));
37
+ app.route('/api/channels', createChannelRoutes(services));
38
+ app.route('/api/messages', createMessageRoutes(services));
39
+
40
+ export default app;
41
+ ```
42
+
43
+ ## Route Factories
44
+
45
+ | Factory | Endpoints |
46
+ |---------|-----------|
47
+ | `createElementsRoutes(services)` | CRUD for elements (tasks, documents, etc.) |
48
+ | `createEntityRoutes(services)` | Entity registration and lookup |
49
+ | `createChannelRoutes(services)` | Channel creation, membership, listing |
50
+ | `createMessageRoutes(services)` | Send and query messages |
51
+ | `createLibraryRoutes(services)` | Library and playbook management |
52
+ | `createDocumentRoutes(services)` | Document versioning and content |
53
+ | `createInboxRoutes(services)` | Per-entity notification inbox |
54
+ | `createPlanRoutes(services)` | Plan creation and status tracking |
55
+
56
+ All factories accept a `CollaborateServices` (or `CollaborateServicesWithBroadcast`) object that provides the backing `QuarryAPI` and optional broadcast function.
57
+
58
+ ## WebSocket
59
+
60
+ ```typescript
61
+ import { createWsBroadcaster, type WsEventHandler } from '@stoneforge/shared-routes';
62
+
63
+ const broadcast = createWsBroadcaster(wsConnections);
64
+ const services: CollaborateServicesWithBroadcast = { api, broadcast };
65
+ ```
66
+
67
+ ---
68
+
69
+ Part of [Stoneforge](https://github.com/stoneforge-ai/stoneforge) — Apache-2.0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Channel Routes Factory
3
+ *
4
+ * CRUD operations for channels and channel membership.
5
+ */
6
+ import { Hono } from 'hono';
7
+ import type { CollaborateServices } from './types.js';
8
+ export declare function createChannelRoutes(services: CollaborateServices): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
9
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,8EAsehE"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Channel Routes Factory
3
+ *
4
+ * CRUD operations for channels and channel membership.
5
+ */
6
+ import { Hono } from 'hono';
7
+ import { createGroupChannel, createDirectChannel } from '@stoneforge/core';
8
+ export function createChannelRoutes(services) {
9
+ const { api } = services;
10
+ const app = new Hono();
11
+ // GET /api/channels - List channels
12
+ app.get('/api/channels', async (c) => {
13
+ try {
14
+ const url = new URL(c.req.url);
15
+ // Parse pagination and filter parameters
16
+ const limitParam = url.searchParams.get('limit');
17
+ const offsetParam = url.searchParams.get('offset');
18
+ const orderByParam = url.searchParams.get('orderBy');
19
+ const orderDirParam = url.searchParams.get('orderDir');
20
+ const searchParam = url.searchParams.get('search');
21
+ const channelTypeParam = url.searchParams.get('channelType');
22
+ // Build filter
23
+ const filter = {
24
+ type: 'channel',
25
+ };
26
+ if (limitParam) {
27
+ filter.limit = parseInt(limitParam, 10);
28
+ }
29
+ else {
30
+ filter.limit = 50; // Default page size
31
+ }
32
+ if (offsetParam) {
33
+ filter.offset = parseInt(offsetParam, 10);
34
+ }
35
+ if (orderByParam) {
36
+ filter.orderBy = orderByParam;
37
+ }
38
+ else {
39
+ filter.orderBy = 'updated_at';
40
+ }
41
+ if (orderDirParam) {
42
+ filter.orderDir = orderDirParam;
43
+ }
44
+ else {
45
+ filter.orderDir = 'desc';
46
+ }
47
+ // Get paginated results
48
+ const result = await api.listPaginated(filter);
49
+ // Apply client-side filtering for search and channel type
50
+ let filteredItems = result.items;
51
+ if (channelTypeParam && channelTypeParam !== 'all') {
52
+ filteredItems = filteredItems.filter((ch) => {
53
+ const channel = ch;
54
+ return channel.channelType === channelTypeParam;
55
+ });
56
+ }
57
+ if (searchParam) {
58
+ const query = searchParam.toLowerCase();
59
+ filteredItems = filteredItems.filter((ch) => {
60
+ const channel = ch;
61
+ return (channel.name.toLowerCase().includes(query) ||
62
+ channel.id.toLowerCase().includes(query) ||
63
+ (channel.tags || []).some((tag) => tag.toLowerCase().includes(query)));
64
+ });
65
+ }
66
+ // Return paginated response format
67
+ return c.json({
68
+ items: filteredItems,
69
+ total: result.total,
70
+ offset: result.offset,
71
+ limit: result.limit,
72
+ hasMore: result.hasMore,
73
+ });
74
+ }
75
+ catch (error) {
76
+ console.error('[stoneforge] Failed to get channels:', error);
77
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to get channels' } }, 500);
78
+ }
79
+ });
80
+ // GET /api/channels/:id - Get single channel
81
+ app.get('/api/channels/:id', async (c) => {
82
+ try {
83
+ const id = c.req.param('id');
84
+ const channel = await api.get(id);
85
+ if (!channel) {
86
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
87
+ }
88
+ if (channel.type !== 'channel') {
89
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
90
+ }
91
+ return c.json(channel);
92
+ }
93
+ catch (error) {
94
+ console.error('[stoneforge] Failed to get channel:', error);
95
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to get channel' } }, 500);
96
+ }
97
+ });
98
+ // POST /api/channels - Create channel
99
+ app.post('/api/channels', async (c) => {
100
+ try {
101
+ const body = (await c.req.json());
102
+ // Validate channelType
103
+ if (!body.channelType || !['group', 'direct'].includes(body.channelType)) {
104
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'channelType is required and must be "group" or "direct"' } }, 400);
105
+ }
106
+ // Validate createdBy
107
+ if (!body.createdBy || typeof body.createdBy !== 'string') {
108
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'createdBy is required and must be a string' } }, 400);
109
+ }
110
+ let channel;
111
+ if (body.channelType === 'group') {
112
+ // Validate name for group channels
113
+ if (!body.name || typeof body.name !== 'string') {
114
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'name is required for group channels' } }, 400);
115
+ }
116
+ const groupInput = {
117
+ name: body.name,
118
+ createdBy: body.createdBy,
119
+ members: body.members,
120
+ description: body.description,
121
+ visibility: body.visibility,
122
+ joinPolicy: body.joinPolicy,
123
+ tags: body.tags,
124
+ metadata: body.metadata,
125
+ };
126
+ channel = await createGroupChannel(groupInput);
127
+ }
128
+ else {
129
+ // Direct channel
130
+ if (!body.entityA || typeof body.entityA !== 'string') {
131
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'entityA is required for direct channels' } }, 400);
132
+ }
133
+ if (!body.entityB || typeof body.entityB !== 'string') {
134
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'entityB is required for direct channels' } }, 400);
135
+ }
136
+ // Look up entity names for channel naming
137
+ const entityAData = await api.get(body.entityA);
138
+ const entityBData = await api.get(body.entityB);
139
+ const entityAName = entityAData?.name;
140
+ const entityBName = entityBData?.name;
141
+ const directInput = {
142
+ entityA: body.entityA,
143
+ entityB: body.entityB,
144
+ createdBy: body.createdBy,
145
+ ...(entityAName && { entityAName }),
146
+ ...(entityBName && { entityBName }),
147
+ description: body.description,
148
+ tags: body.tags,
149
+ metadata: body.metadata,
150
+ };
151
+ channel = await createDirectChannel(directInput);
152
+ }
153
+ // Create the channel in database
154
+ const created = await api.create(channel);
155
+ return c.json(created, 201);
156
+ }
157
+ catch (error) {
158
+ if (error.code === 'VALIDATION_ERROR') {
159
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: error.message } }, 400);
160
+ }
161
+ console.error('[stoneforge] Failed to create channel:', error);
162
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to create channel' } }, 500);
163
+ }
164
+ });
165
+ // GET /api/channels/:id/messages - Get channel messages
166
+ app.get('/api/channels/:id/messages', async (c) => {
167
+ try {
168
+ const id = c.req.param('id');
169
+ const url = new URL(c.req.url);
170
+ // Parse query params
171
+ const limitParam = url.searchParams.get('limit');
172
+ const offsetParam = url.searchParams.get('offset');
173
+ const hydrateContent = url.searchParams.get('hydrate.content') === 'true';
174
+ // First verify channel exists
175
+ const channel = await api.get(id);
176
+ if (!channel) {
177
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
178
+ }
179
+ if (channel.type !== 'channel') {
180
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
181
+ }
182
+ // Get messages for this channel
183
+ const filter = {
184
+ type: 'message',
185
+ channelId: id,
186
+ orderBy: 'created_at',
187
+ orderDir: 'asc',
188
+ };
189
+ if (limitParam) {
190
+ filter.limit = parseInt(limitParam, 10);
191
+ }
192
+ if (offsetParam) {
193
+ filter.offset = parseInt(offsetParam, 10);
194
+ }
195
+ const messages = await api.list(filter);
196
+ // Optionally hydrate content and attachments
197
+ if (hydrateContent) {
198
+ const hydratedMessages = await Promise.all(messages.map(async (msg) => {
199
+ const message = msg;
200
+ let result = { ...msg };
201
+ // Hydrate content
202
+ if (message.contentRef) {
203
+ const content = await api.get(message.contentRef);
204
+ if (content && content.type === 'document') {
205
+ result._content = content.content;
206
+ }
207
+ }
208
+ // Hydrate attachments (documents referenced by this message)
209
+ const dependencies = await api.getDependencies(message.id);
210
+ const attachmentDeps = dependencies.filter((dep) => dep.blockedId === message.id && dep.type === 'references');
211
+ if (attachmentDeps.length > 0) {
212
+ const attachments = await Promise.all(attachmentDeps.map(async (dep) => {
213
+ const doc = await api.get(dep.blockerId);
214
+ if (doc && doc.type === 'document') {
215
+ return doc;
216
+ }
217
+ return null;
218
+ }));
219
+ result._attachments = attachments.filter(Boolean);
220
+ }
221
+ return result;
222
+ }));
223
+ return c.json(hydratedMessages);
224
+ }
225
+ return c.json(messages);
226
+ }
227
+ catch (error) {
228
+ console.error('[stoneforge] Failed to get channel messages:', error);
229
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to get channel messages' } }, 500);
230
+ }
231
+ });
232
+ // GET /api/channels/:id/members - Get channel members
233
+ app.get('/api/channels/:id/members', async (c) => {
234
+ try {
235
+ const id = c.req.param('id');
236
+ const url = new URL(c.req.url);
237
+ const hydrate = url.searchParams.get('hydrate') === 'true';
238
+ // Verify channel exists
239
+ const channel = await api.get(id);
240
+ if (!channel || channel.type !== 'channel') {
241
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
242
+ }
243
+ const channelData = channel;
244
+ const memberIds = channelData.members || [];
245
+ // Optionally hydrate member entities
246
+ if (hydrate) {
247
+ const hydratedMembers = await Promise.all(memberIds.map(async (memberId) => {
248
+ const entity = await api.get(memberId);
249
+ return entity || { id: memberId, name: memberId, notFound: true };
250
+ }));
251
+ return c.json({
252
+ members: hydratedMembers,
253
+ permissions: channelData.permissions,
254
+ channelType: channelData.channelType,
255
+ });
256
+ }
257
+ return c.json({
258
+ members: memberIds,
259
+ permissions: channelData.permissions,
260
+ channelType: channelData.channelType,
261
+ });
262
+ }
263
+ catch (error) {
264
+ console.error('[stoneforge] Failed to get channel members:', error);
265
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to get channel members' } }, 500);
266
+ }
267
+ });
268
+ // POST /api/channels/:id/members - Add member to channel
269
+ app.post('/api/channels/:id/members', async (c) => {
270
+ try {
271
+ const id = c.req.param('id');
272
+ const body = (await c.req.json());
273
+ // Validate required fields
274
+ if (!body.entityId || typeof body.entityId !== 'string') {
275
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'entityId is required' } }, 400);
276
+ }
277
+ if (!body.actor || typeof body.actor !== 'string') {
278
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'actor is required' } }, 400);
279
+ }
280
+ const result = await api.addChannelMember(id, body.entityId, { actor: body.actor });
281
+ return c.json(result);
282
+ }
283
+ catch (error) {
284
+ const err = error;
285
+ if (err.code === 'NOT_FOUND') {
286
+ return c.json({ error: { code: 'NOT_FOUND', message: err.message || 'Channel or entity not found' } }, 404);
287
+ }
288
+ if (err.code === 'IMMUTABLE') {
289
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'Cannot modify direct channel membership' } }, 403);
290
+ }
291
+ if (err.code === 'MEMBER_REQUIRED') {
292
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'No permission to modify members' } }, 403);
293
+ }
294
+ console.error('[stoneforge] Failed to add channel member:', error);
295
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to add channel member' } }, 500);
296
+ }
297
+ });
298
+ // DELETE /api/channels/:id/members/:entityId - Remove member from channel
299
+ app.delete('/api/channels/:id/members/:entityId', async (c) => {
300
+ try {
301
+ const id = c.req.param('id');
302
+ const entityId = c.req.param('entityId');
303
+ const url = new URL(c.req.url);
304
+ const actor = url.searchParams.get('actor');
305
+ // Validate actor
306
+ if (!actor) {
307
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'actor query parameter is required' } }, 400);
308
+ }
309
+ const result = await api.removeChannelMember(id, entityId, { actor: actor });
310
+ return c.json(result);
311
+ }
312
+ catch (error) {
313
+ const err = error;
314
+ if (err.code === 'NOT_FOUND') {
315
+ return c.json({ error: { code: 'NOT_FOUND', message: err.message || 'Channel not found' } }, 404);
316
+ }
317
+ if (err.code === 'IMMUTABLE') {
318
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'Cannot modify direct channel membership' } }, 403);
319
+ }
320
+ if (err.code === 'MEMBER_REQUIRED') {
321
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'No permission to modify members' } }, 403);
322
+ }
323
+ console.error('[stoneforge] Failed to remove channel member:', error);
324
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to remove channel member' } }, 500);
325
+ }
326
+ });
327
+ // POST /api/channels/:id/leave - Leave channel (self-removal)
328
+ app.post('/api/channels/:id/leave', async (c) => {
329
+ try {
330
+ const id = c.req.param('id');
331
+ const body = (await c.req.json());
332
+ // Validate actor
333
+ if (!body.actor || typeof body.actor !== 'string') {
334
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'actor is required' } }, 400);
335
+ }
336
+ const result = await api.leaveChannel(id, body.actor);
337
+ return c.json(result);
338
+ }
339
+ catch (error) {
340
+ const err = error;
341
+ if (err.code === 'NOT_FOUND') {
342
+ return c.json({ error: { code: 'NOT_FOUND', message: err.message || 'Channel not found' } }, 404);
343
+ }
344
+ if (err.code === 'IMMUTABLE') {
345
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'Cannot leave direct channel' } }, 403);
346
+ }
347
+ if (err.code === 'MEMBER_REQUIRED') {
348
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'Not a member of this channel' } }, 403);
349
+ }
350
+ console.error('[stoneforge] Failed to leave channel:', error);
351
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to leave channel' } }, 500);
352
+ }
353
+ });
354
+ // POST /api/channels/:id/merge - Merge another channel into this one
355
+ app.post('/api/channels/:id/merge', async (c) => {
356
+ try {
357
+ const targetId = c.req.param('id');
358
+ const body = (await c.req.json());
359
+ if (!body.sourceChannelId || typeof body.sourceChannelId !== 'string') {
360
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'sourceChannelId is required' } }, 400);
361
+ }
362
+ if (!body.actor || typeof body.actor !== 'string') {
363
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'actor is required' } }, 400);
364
+ }
365
+ const result = await api.mergeChannels(body.sourceChannelId, targetId, { newName: body.newName, actor: body.actor });
366
+ return c.json(result);
367
+ }
368
+ catch (error) {
369
+ const err = error;
370
+ if (err.code === 'NOT_FOUND') {
371
+ return c.json({ error: { code: 'NOT_FOUND', message: err.message || 'Channel not found' } }, 404);
372
+ }
373
+ if (err.code === 'IMMUTABLE') {
374
+ return c.json({ error: { code: 'FORBIDDEN', message: err.message || 'Cannot merge non-group channels' } }, 403);
375
+ }
376
+ console.error('[stoneforge] Failed to merge channels:', error);
377
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to merge channels' } }, 500);
378
+ }
379
+ });
380
+ // DELETE /api/channels/:id - Delete a channel
381
+ app.delete('/api/channels/:id', async (c) => {
382
+ try {
383
+ const id = c.req.param('id');
384
+ const url = new URL(c.req.url);
385
+ const actor = url.searchParams.get('actor');
386
+ // Validate actor
387
+ if (!actor) {
388
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'actor query parameter is required' } }, 400);
389
+ }
390
+ // Verify channel exists
391
+ const channel = await api.get(id);
392
+ if (!channel) {
393
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
394
+ }
395
+ if (channel.type !== 'channel') {
396
+ return c.json({ error: { code: 'NOT_FOUND', message: 'Channel not found' } }, 404);
397
+ }
398
+ // Delete the channel
399
+ await api.delete(id, { actor: actor, reason: 'Channel deleted by user' });
400
+ return c.json({ success: true });
401
+ }
402
+ catch (error) {
403
+ const err = error;
404
+ if (err.code === 'NOT_FOUND') {
405
+ return c.json({ error: { code: 'NOT_FOUND', message: err.message || 'Channel not found' } }, 404);
406
+ }
407
+ console.error('[stoneforge] Failed to delete channel:', error);
408
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to delete channel' } }, 500);
409
+ }
410
+ });
411
+ return app;
412
+ }
413
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Document Routes Factory
3
+ *
4
+ * CRUD operations for documents, versioning, links, and comments.
5
+ */
6
+ import { Hono } from 'hono';
7
+ import type { CollaborateServices } from './types.js';
8
+ export declare function createDocumentRoutes(services: CollaborateServices): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
9
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../src/documents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAoBtD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,8EAm3CjE"}