@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.
- package/LICENSE +13 -0
- package/README.md +69 -0
- package/dist/channels.d.ts +9 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +413 -0
- package/dist/channels.js.map +1 -0
- package/dist/documents.d.ts +9 -0
- package/dist/documents.d.ts.map +1 -0
- package/dist/documents.js +1205 -0
- package/dist/documents.js.map +1 -0
- package/dist/elements.d.ts +9 -0
- package/dist/elements.d.ts.map +1 -0
- package/dist/elements.js +87 -0
- package/dist/elements.js.map +1 -0
- package/dist/entities.d.ts +9 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +92 -0
- package/dist/entities.js.map +1 -0
- package/dist/inbox.d.ts +10 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +538 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/libraries.d.ts +9 -0
- package/dist/libraries.d.ts.map +1 -0
- package/dist/libraries.js +467 -0
- package/dist/libraries.js.map +1 -0
- package/dist/messages.d.ts +9 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +338 -0
- package/dist/messages.js.map +1 -0
- package/dist/plans.d.ts +10 -0
- package/dist/plans.d.ts.map +1 -0
- package/dist/plans.js +495 -0
- package/dist/plans.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/ws/broadcaster.d.ts +62 -0
- package/dist/ws/broadcaster.d.ts.map +1 -0
- package/dist/ws/broadcaster.js +146 -0
- package/dist/ws/broadcaster.js.map +1 -0
- package/dist/ws/handler.d.ts +11 -0
- package/dist/ws/handler.d.ts.map +1 -0
- package/dist/ws/handler.js +38 -0
- package/dist/ws/handler.js.map +1 -0
- package/dist/ws/index.d.ts +11 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +11 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/types.d.ts +85 -0
- package/dist/ws/types.d.ts.map +1 -0
- package/dist/ws/types.js +63 -0
- package/dist/ws/types.js.map +1 -0
- 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
|
+
[](https://www.npmjs.com/package/@stoneforge/shared-routes)
|
|
6
|
+
[](https://github.com/stoneforge-ai/stoneforge/blob/main/LICENSE)
|
|
7
|
+
[](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"}
|
package/dist/channels.js
ADDED
|
@@ -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"}
|