@chaaskit/server 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 (189) hide show
  1. package/dist/api/admin.js +438 -0
  2. package/dist/api/admin.js.map +1 -0
  3. package/dist/api/agents.js +21 -0
  4. package/dist/api/agents.js.map +1 -0
  5. package/dist/api/api-keys.js +122 -0
  6. package/dist/api/api-keys.js.map +1 -0
  7. package/dist/api/auth.js +399 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/chat.js +900 -0
  10. package/dist/api/chat.js.map +1 -0
  11. package/dist/api/config.js +91 -0
  12. package/dist/api/config.js.map +1 -0
  13. package/dist/api/documents.js +237 -0
  14. package/dist/api/documents.js.map +1 -0
  15. package/dist/api/export.js +107 -0
  16. package/dist/api/export.js.map +1 -0
  17. package/dist/api/health.js +25 -0
  18. package/dist/api/health.js.map +1 -0
  19. package/dist/api/mcp-server.js +84 -0
  20. package/dist/api/mcp-server.js.map +1 -0
  21. package/dist/api/mcp.js +400 -0
  22. package/dist/api/mcp.js.map +1 -0
  23. package/dist/api/mentions.js +94 -0
  24. package/dist/api/mentions.js.map +1 -0
  25. package/dist/api/oauth.js +366 -0
  26. package/dist/api/oauth.js.map +1 -0
  27. package/dist/api/payments.js +473 -0
  28. package/dist/api/payments.js.map +1 -0
  29. package/dist/api/projects.js +301 -0
  30. package/dist/api/projects.js.map +1 -0
  31. package/dist/api/scheduled-prompts.js +617 -0
  32. package/dist/api/scheduled-prompts.js.map +1 -0
  33. package/dist/api/search.js +85 -0
  34. package/dist/api/search.js.map +1 -0
  35. package/dist/api/share.js +188 -0
  36. package/dist/api/share.js.map +1 -0
  37. package/dist/api/slack.js +468 -0
  38. package/dist/api/slack.js.map +1 -0
  39. package/dist/api/teams.js +693 -0
  40. package/dist/api/teams.js.map +1 -0
  41. package/dist/api/templates.js +134 -0
  42. package/dist/api/templates.js.map +1 -0
  43. package/dist/api/threads.js +323 -0
  44. package/dist/api/threads.js.map +1 -0
  45. package/dist/api/upload.js +57 -0
  46. package/dist/api/upload.js.map +1 -0
  47. package/dist/api/user.js +111 -0
  48. package/dist/api/user.js.map +1 -0
  49. package/dist/api/v1/openai.js +245 -0
  50. package/dist/api/v1/openai.js.map +1 -0
  51. package/dist/app.js +168 -0
  52. package/dist/app.js.map +1 -0
  53. package/dist/bin/cli.js +57 -0
  54. package/dist/bin/cli.js.map +1 -0
  55. package/dist/commands/db-sync.js +108 -0
  56. package/dist/commands/db-sync.js.map +1 -0
  57. package/dist/config/loader.js +374 -0
  58. package/dist/config/loader.js.map +1 -0
  59. package/dist/documents/extractors.js +136 -0
  60. package/dist/documents/extractors.js.map +1 -0
  61. package/dist/extensions/glob.js +53 -0
  62. package/dist/extensions/glob.js.map +1 -0
  63. package/dist/extensions/loader.js +72 -0
  64. package/dist/extensions/loader.js.map +1 -0
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/loaders/index.js +75 -0
  68. package/dist/loaders/index.js.map +1 -0
  69. package/dist/mcp/client.js +551 -0
  70. package/dist/mcp/client.js.map +1 -0
  71. package/dist/mcp/server.js +335 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/middleware/apiKeyAuth.js +136 -0
  74. package/dist/middleware/apiKeyAuth.js.map +1 -0
  75. package/dist/middleware/auth.js +192 -0
  76. package/dist/middleware/auth.js.map +1 -0
  77. package/dist/middleware/errorHandler.js +41 -0
  78. package/dist/middleware/errorHandler.js.map +1 -0
  79. package/dist/middleware/mcpServerAuth.js +164 -0
  80. package/dist/middleware/mcpServerAuth.js.map +1 -0
  81. package/dist/middleware/requestLogger.js +9 -0
  82. package/dist/middleware/requestLogger.js.map +1 -0
  83. package/dist/middleware/team.js +132 -0
  84. package/dist/middleware/team.js.map +1 -0
  85. package/dist/oauth/server.js +410 -0
  86. package/dist/oauth/server.js.map +1 -0
  87. package/dist/queue/cli.js +93 -0
  88. package/dist/queue/cli.js.map +1 -0
  89. package/dist/queue/handlers/index.js +91 -0
  90. package/dist/queue/handlers/index.js.map +1 -0
  91. package/dist/queue/handlers/scheduled-prompt.js +270 -0
  92. package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
  93. package/dist/queue/index.js +91 -0
  94. package/dist/queue/index.js.map +1 -0
  95. package/dist/queue/providers/memory.js +296 -0
  96. package/dist/queue/providers/memory.js.map +1 -0
  97. package/dist/queue/providers/sqs.js +275 -0
  98. package/dist/queue/providers/sqs.js.map +1 -0
  99. package/dist/queue/scheduler.js +355 -0
  100. package/dist/queue/scheduler.js.map +1 -0
  101. package/dist/queue/types.js +5 -0
  102. package/dist/queue/types.js.map +1 -0
  103. package/dist/queue/worker.js +230 -0
  104. package/dist/queue/worker.js.map +1 -0
  105. package/dist/registry/index.js +40 -0
  106. package/dist/registry/index.js.map +1 -0
  107. package/dist/server.js +207 -0
  108. package/dist/server.js.map +1 -0
  109. package/dist/services/agent.js +530 -0
  110. package/dist/services/agent.js.map +1 -0
  111. package/dist/services/agents.js +194 -0
  112. package/dist/services/agents.js.map +1 -0
  113. package/dist/services/documents.js +507 -0
  114. package/dist/services/documents.js.map +1 -0
  115. package/dist/services/email/index.js +91 -0
  116. package/dist/services/email/index.js.map +1 -0
  117. package/dist/services/email/providers/ses.js +97 -0
  118. package/dist/services/email/providers/ses.js.map +1 -0
  119. package/dist/services/email/templates.js +194 -0
  120. package/dist/services/email/templates.js.map +1 -0
  121. package/dist/services/email/types.js +5 -0
  122. package/dist/services/email/types.js.map +1 -0
  123. package/dist/services/encryption.js +69 -0
  124. package/dist/services/encryption.js.map +1 -0
  125. package/dist/services/oauth-discovery.js +226 -0
  126. package/dist/services/oauth-discovery.js.map +1 -0
  127. package/dist/services/pendingConfirmation.js +105 -0
  128. package/dist/services/pendingConfirmation.js.map +1 -0
  129. package/dist/services/scheduledPrompts.js +70 -0
  130. package/dist/services/scheduledPrompts.js.map +1 -0
  131. package/dist/services/slack/client.js +174 -0
  132. package/dist/services/slack/client.js.map +1 -0
  133. package/dist/services/slack/events.js +189 -0
  134. package/dist/services/slack/events.js.map +1 -0
  135. package/dist/services/slack/index.js +6 -0
  136. package/dist/services/slack/index.js.map +1 -0
  137. package/dist/services/slack/notifications.js +124 -0
  138. package/dist/services/slack/notifications.js.map +1 -0
  139. package/dist/services/slack/signature.js +74 -0
  140. package/dist/services/slack/signature.js.map +1 -0
  141. package/dist/services/slack/thread-context.js +191 -0
  142. package/dist/services/slack/thread-context.js.map +1 -0
  143. package/dist/services/toolConfirmation.js +55 -0
  144. package/dist/services/toolConfirmation.js.map +1 -0
  145. package/dist/services/usage.js +241 -0
  146. package/dist/services/usage.js.map +1 -0
  147. package/dist/ssr/build.js +90 -0
  148. package/dist/ssr/build.js.map +1 -0
  149. package/dist/ssr/components/SSRMessageList.js +120 -0
  150. package/dist/ssr/components/SSRMessageList.js.map +1 -0
  151. package/dist/ssr/entry.client.js +8 -0
  152. package/dist/ssr/entry.client.js.map +1 -0
  153. package/dist/ssr/entry.server.js +71 -0
  154. package/dist/ssr/entry.server.js.map +1 -0
  155. package/dist/ssr/handler.js +51 -0
  156. package/dist/ssr/handler.js.map +1 -0
  157. package/dist/ssr/root.js +184 -0
  158. package/dist/ssr/root.js.map +1 -0
  159. package/dist/ssr/routes/login.js +140 -0
  160. package/dist/ssr/routes/login.js.map +1 -0
  161. package/dist/ssr/routes/pricing.js +195 -0
  162. package/dist/ssr/routes/pricing.js.map +1 -0
  163. package/dist/ssr/routes/privacy.js +39 -0
  164. package/dist/ssr/routes/privacy.js.map +1 -0
  165. package/dist/ssr/routes/register.js +148 -0
  166. package/dist/ssr/routes/register.js.map +1 -0
  167. package/dist/ssr/routes/shared.$shareId.js +153 -0
  168. package/dist/ssr/routes/shared.$shareId.js.map +1 -0
  169. package/dist/ssr/routes/terms.js +39 -0
  170. package/dist/ssr/routes/terms.js.map +1 -0
  171. package/dist/storage/index.js +43 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/providers/database.js +38 -0
  174. package/dist/storage/providers/database.js.map +1 -0
  175. package/dist/storage/providers/filesystem.js +51 -0
  176. package/dist/storage/providers/filesystem.js.map +1 -0
  177. package/dist/storage/types.js +2 -0
  178. package/dist/storage/types.js.map +1 -0
  179. package/dist/tools/documents.js +336 -0
  180. package/dist/tools/documents.js.map +1 -0
  181. package/dist/tools/get-plan-usage.js +82 -0
  182. package/dist/tools/get-plan-usage.js.map +1 -0
  183. package/dist/tools/index.js +106 -0
  184. package/dist/tools/index.js.map +1 -0
  185. package/dist/tools/types.js +2 -0
  186. package/dist/tools/types.js.map +1 -0
  187. package/dist/tools/web-scrape.js +145 -0
  188. package/dist/tools/web-scrape.js.map +1 -0
  189. package/package.json +93 -0
@@ -0,0 +1,507 @@
1
+ import { db } from '@chaaskit/db';
2
+ import { getStorageProvider } from '../storage/index.js';
3
+ import { extractText } from '../documents/extractors.js';
4
+ /**
5
+ * Service for managing documents and mentions
6
+ */
7
+ export class DocumentService {
8
+ // ==========================================================================
9
+ // CRUD Operations
10
+ // ==========================================================================
11
+ /**
12
+ * Create a new document
13
+ */
14
+ async create(input, userId) {
15
+ let content = input.content || '';
16
+ let charCount = content.length;
17
+ // If a file buffer is provided, extract text
18
+ if (input.fileBuffer) {
19
+ content = await extractText(input.fileBuffer, input.mimeType || 'text/plain');
20
+ charCount = content.length;
21
+ }
22
+ const doc = await db.document.create({
23
+ data: {
24
+ name: input.name,
25
+ content: content,
26
+ mimeType: input.mimeType || 'text/plain',
27
+ fileSize: input.fileBuffer?.length || Buffer.byteLength(content, 'utf-8'),
28
+ charCount,
29
+ userId,
30
+ teamId: input.teamId || null,
31
+ projectId: input.projectId || null,
32
+ },
33
+ include: {
34
+ team: { select: { id: true, name: true } },
35
+ project: { select: { id: true, name: true } },
36
+ },
37
+ });
38
+ return this.toMentionableDocument(doc);
39
+ }
40
+ /**
41
+ * Update an existing document
42
+ */
43
+ async update(id, input, userId) {
44
+ // Check access
45
+ const existing = await this.get(id, userId);
46
+ if (!existing) {
47
+ return null;
48
+ }
49
+ const updateData = {};
50
+ if (input.name !== undefined) {
51
+ updateData.name = input.name;
52
+ }
53
+ if (input.content !== undefined || input.fileBuffer) {
54
+ let content = input.content || '';
55
+ if (input.fileBuffer) {
56
+ content = await extractText(input.fileBuffer, input.mimeType || 'text/plain');
57
+ }
58
+ updateData.content = content;
59
+ updateData.charCount = content.length;
60
+ updateData.fileSize = Buffer.byteLength(content, 'utf-8');
61
+ if (input.mimeType) {
62
+ updateData.mimeType = input.mimeType;
63
+ }
64
+ }
65
+ const doc = await db.document.update({
66
+ where: { id },
67
+ data: updateData,
68
+ include: {
69
+ team: { select: { id: true, name: true } },
70
+ project: { select: { id: true, name: true } },
71
+ },
72
+ });
73
+ return this.toMentionableDocument(doc);
74
+ }
75
+ /**
76
+ * Archive (soft delete) a document
77
+ */
78
+ async archive(id, userId) {
79
+ const doc = await this.get(id, userId);
80
+ if (!doc) {
81
+ return false;
82
+ }
83
+ await db.document.update({
84
+ where: { id },
85
+ data: { archivedAt: new Date() },
86
+ });
87
+ return true;
88
+ }
89
+ /**
90
+ * Get a document by ID
91
+ */
92
+ async get(id, userId) {
93
+ const doc = await db.document.findFirst({
94
+ where: {
95
+ id,
96
+ archivedAt: null,
97
+ OR: [
98
+ { userId },
99
+ {
100
+ team: {
101
+ members: { some: { userId } },
102
+ },
103
+ },
104
+ {
105
+ project: {
106
+ OR: [
107
+ { userId },
108
+ { team: { members: { some: { userId } } } },
109
+ ],
110
+ },
111
+ },
112
+ ],
113
+ },
114
+ include: {
115
+ team: { select: { id: true, name: true } },
116
+ project: { select: { id: true, name: true } },
117
+ },
118
+ });
119
+ if (!doc) {
120
+ return null;
121
+ }
122
+ return this.toMentionableDocument(doc);
123
+ }
124
+ // ==========================================================================
125
+ // Content Access
126
+ // ==========================================================================
127
+ /**
128
+ * Get document content with optional pagination
129
+ */
130
+ async getContent(id, userId, options) {
131
+ const doc = await db.document.findFirst({
132
+ where: {
133
+ id,
134
+ archivedAt: null,
135
+ OR: [
136
+ { userId },
137
+ { team: { members: { some: { userId } } } },
138
+ {
139
+ project: {
140
+ OR: [{ userId }, { team: { members: { some: { userId } } } }],
141
+ },
142
+ },
143
+ ],
144
+ },
145
+ select: { content: true, storageKey: true },
146
+ });
147
+ if (!doc) {
148
+ return null;
149
+ }
150
+ let content;
151
+ if (doc.content) {
152
+ content = doc.content;
153
+ }
154
+ else if (doc.storageKey) {
155
+ const storage = getStorageProvider();
156
+ const buffer = await storage.download(doc.storageKey);
157
+ content = buffer.toString('utf-8');
158
+ }
159
+ else {
160
+ return { content: '', totalLines: 0, truncated: false };
161
+ }
162
+ const lines = content.split('\n');
163
+ const totalLines = lines.length;
164
+ if (options?.offset !== undefined || options?.limit !== undefined) {
165
+ const offset = options.offset || 0;
166
+ const limit = options.limit || 100;
167
+ const slicedLines = lines.slice(offset, offset + limit);
168
+ return {
169
+ content: slicedLines.join('\n'),
170
+ totalLines,
171
+ truncated: offset + slicedLines.length < totalLines,
172
+ };
173
+ }
174
+ return { content, totalLines, truncated: false };
175
+ }
176
+ // ==========================================================================
177
+ // Search & List
178
+ // ==========================================================================
179
+ /**
180
+ * Search documents accessible by user
181
+ */
182
+ async search(userId, options) {
183
+ const { query, scopes, teamId, projectId, limit = 50 } = options || {};
184
+ // Build scope filter
185
+ const scopeConditions = [];
186
+ if (!scopes || scopes.length === 0 || scopes.includes('my')) {
187
+ scopeConditions.push({
188
+ userId,
189
+ teamId: null,
190
+ projectId: null,
191
+ });
192
+ }
193
+ if (!scopes || scopes.length === 0 || scopes.includes('team')) {
194
+ scopeConditions.push({
195
+ teamId: teamId || { not: null },
196
+ team: { members: { some: { userId } } },
197
+ });
198
+ }
199
+ if (!scopes || scopes.length === 0 || scopes.includes('project')) {
200
+ scopeConditions.push({
201
+ projectId: projectId || { not: null },
202
+ project: {
203
+ OR: [{ userId }, { team: { members: { some: { userId } } } }],
204
+ },
205
+ });
206
+ }
207
+ const docs = await db.document.findMany({
208
+ where: {
209
+ archivedAt: null,
210
+ OR: scopeConditions,
211
+ ...(query && {
212
+ name: { contains: query, mode: 'insensitive' },
213
+ }),
214
+ },
215
+ include: {
216
+ team: { select: { id: true, name: true } },
217
+ project: { select: { id: true, name: true } },
218
+ },
219
+ orderBy: { updatedAt: 'desc' },
220
+ take: limit,
221
+ });
222
+ return docs.map((doc) => this.toMentionableDocument(doc));
223
+ }
224
+ /**
225
+ * List all documents for a user (for Documents page)
226
+ */
227
+ async list(userId, options) {
228
+ return this.search(userId, {
229
+ scopes: options?.scope ? [options.scope] : undefined,
230
+ teamId: options?.teamId,
231
+ projectId: options?.projectId,
232
+ limit: 200,
233
+ });
234
+ }
235
+ // ==========================================================================
236
+ // Path Resolution
237
+ // ==========================================================================
238
+ /**
239
+ * Build the full path for a document
240
+ * Format: @my/name, @team/slug/name, @project/slug/name
241
+ */
242
+ buildPath(doc) {
243
+ if (doc.projectId && doc.project) {
244
+ const slug = this.slugify(doc.project.name);
245
+ return `@project/${slug}/${doc.name}`;
246
+ }
247
+ if (doc.teamId && doc.team) {
248
+ const slug = this.slugify(doc.team.name);
249
+ return `@team/${slug}/${doc.name}`;
250
+ }
251
+ return `@my/${doc.name}`;
252
+ }
253
+ /**
254
+ * Resolve a path to a document
255
+ */
256
+ async resolvePath(path, userId) {
257
+ const parsed = this.parsePath(path);
258
+ if (!parsed) {
259
+ return null;
260
+ }
261
+ const { scope, scopeSlug, name } = parsed;
262
+ let doc;
263
+ if (scope === 'my') {
264
+ doc = await db.document.findFirst({
265
+ where: {
266
+ name,
267
+ userId,
268
+ teamId: null,
269
+ projectId: null,
270
+ archivedAt: null,
271
+ },
272
+ include: {
273
+ team: { select: { id: true, name: true } },
274
+ project: { select: { id: true, name: true } },
275
+ },
276
+ });
277
+ }
278
+ else if (scope === 'team' && scopeSlug) {
279
+ doc = await db.document.findFirst({
280
+ where: {
281
+ name,
282
+ archivedAt: null,
283
+ team: {
284
+ members: { some: { userId } },
285
+ },
286
+ },
287
+ include: {
288
+ team: { select: { id: true, name: true } },
289
+ project: { select: { id: true, name: true } },
290
+ },
291
+ });
292
+ // Filter by slug match
293
+ if (doc && doc.team && this.slugify(doc.team.name) !== scopeSlug) {
294
+ doc = null;
295
+ }
296
+ }
297
+ else if (scope === 'project' && scopeSlug) {
298
+ doc = await db.document.findFirst({
299
+ where: {
300
+ name,
301
+ archivedAt: null,
302
+ project: {
303
+ OR: [{ userId }, { team: { members: { some: { userId } } } }],
304
+ },
305
+ },
306
+ include: {
307
+ team: { select: { id: true, name: true } },
308
+ project: { select: { id: true, name: true } },
309
+ },
310
+ });
311
+ // Filter by slug match
312
+ if (doc && doc.project && this.slugify(doc.project.name) !== scopeSlug) {
313
+ doc = null;
314
+ }
315
+ }
316
+ if (!doc) {
317
+ return null;
318
+ }
319
+ return this.toMentionableDocument(doc);
320
+ }
321
+ /**
322
+ * Resolve multiple paths
323
+ */
324
+ async resolveMany(paths, userId) {
325
+ const results = new Map();
326
+ for (const path of paths) {
327
+ const doc = await this.resolvePath(path, userId);
328
+ results.set(path, doc);
329
+ }
330
+ return results;
331
+ }
332
+ /**
333
+ * Resolve documents and get their content for context injection
334
+ */
335
+ async resolveForContext(paths, userId) {
336
+ const resolved = [];
337
+ for (const path of paths) {
338
+ const doc = await this.resolvePath(path, userId);
339
+ if (!doc)
340
+ continue;
341
+ const contentResult = await this.getContent(doc.id, userId);
342
+ if (!contentResult)
343
+ continue;
344
+ resolved.push({
345
+ id: doc.id,
346
+ path: doc.path,
347
+ name: doc.name,
348
+ content: contentResult.content,
349
+ truncated: contentResult.truncated,
350
+ charCount: doc.charCount,
351
+ });
352
+ }
353
+ return resolved;
354
+ }
355
+ // ==========================================================================
356
+ // Mention Parsing
357
+ // ==========================================================================
358
+ /**
359
+ * Parse mentions from message content
360
+ * Finds patterns like @my/doc-name, @team/slug/name, @project/slug/name
361
+ */
362
+ parseMentions(content) {
363
+ const mentions = [];
364
+ // Match @scope/name or @scope/slug/name patterns
365
+ // Allow alphanumeric, hyphens, underscores, and dots in names/slugs
366
+ const regex = /@(my|team|project)\/([a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_.-]+)?)/g;
367
+ let match;
368
+ while ((match = regex.exec(content)) !== null) {
369
+ mentions.push({
370
+ path: match[0],
371
+ raw: match[0],
372
+ startIndex: match.index,
373
+ endIndex: match.index + match[0].length,
374
+ });
375
+ }
376
+ return mentions;
377
+ }
378
+ // ==========================================================================
379
+ // Permission Checks
380
+ // ==========================================================================
381
+ /**
382
+ * Check if a user can access a document
383
+ */
384
+ async canAccess(documentId, userId) {
385
+ const doc = await this.get(documentId, userId);
386
+ return doc !== null;
387
+ }
388
+ /**
389
+ * Check if a user can edit a document
390
+ */
391
+ async canEdit(documentId, userId) {
392
+ const doc = await db.document.findFirst({
393
+ where: {
394
+ id: documentId,
395
+ archivedAt: null,
396
+ OR: [
397
+ // Owner can always edit
398
+ { userId },
399
+ // Team admin/owner can edit team docs
400
+ {
401
+ teamId: { not: null },
402
+ team: {
403
+ members: {
404
+ some: {
405
+ userId,
406
+ role: { in: ['owner', 'admin'] },
407
+ },
408
+ },
409
+ },
410
+ },
411
+ // Project owner or team admin can edit project docs
412
+ {
413
+ projectId: { not: null },
414
+ project: {
415
+ OR: [
416
+ { userId },
417
+ {
418
+ team: {
419
+ members: {
420
+ some: {
421
+ userId,
422
+ role: { in: ['owner', 'admin'] },
423
+ },
424
+ },
425
+ },
426
+ },
427
+ ],
428
+ },
429
+ },
430
+ ],
431
+ },
432
+ });
433
+ return doc !== null;
434
+ }
435
+ // ==========================================================================
436
+ // Helpers
437
+ // ==========================================================================
438
+ /**
439
+ * Convert DB document to MentionableDocument
440
+ */
441
+ toMentionableDocument(doc) {
442
+ let scope = 'my';
443
+ let scopeName;
444
+ let scopeId;
445
+ if (doc.projectId && doc.project) {
446
+ scope = 'project';
447
+ scopeName = doc.project.name;
448
+ scopeId = doc.project.id;
449
+ }
450
+ else if (doc.teamId && doc.team) {
451
+ scope = 'team';
452
+ scopeName = doc.team.name;
453
+ scopeId = doc.team.id;
454
+ }
455
+ return {
456
+ id: doc.id,
457
+ path: this.buildPath(doc),
458
+ name: doc.name,
459
+ mimeType: doc.mimeType,
460
+ charCount: doc.charCount,
461
+ scope,
462
+ scopeName,
463
+ scopeId,
464
+ createdAt: doc.createdAt.toISOString(),
465
+ updatedAt: doc.updatedAt.toISOString(),
466
+ };
467
+ }
468
+ /**
469
+ * Parse a path string into components
470
+ */
471
+ parsePath(path) {
472
+ // Remove @ prefix if present
473
+ const cleanPath = path.startsWith('@') ? path.slice(1) : path;
474
+ const parts = cleanPath.split('/');
475
+ if (parts.length < 2) {
476
+ return null;
477
+ }
478
+ const scope = parts[0];
479
+ if (!['my', 'team', 'project'].includes(scope)) {
480
+ return null;
481
+ }
482
+ if (scope === 'my') {
483
+ return { scope, name: parts.slice(1).join('/') };
484
+ }
485
+ // For team/project, expect scope/slug/name
486
+ if (parts.length < 3) {
487
+ return null;
488
+ }
489
+ return {
490
+ scope,
491
+ scopeSlug: parts[1],
492
+ name: parts.slice(2).join('/'),
493
+ };
494
+ }
495
+ /**
496
+ * Convert a name to a URL-safe slug
497
+ */
498
+ slugify(name) {
499
+ return name
500
+ .toLowerCase()
501
+ .replace(/[^a-z0-9]+/g, '-')
502
+ .replace(/^-|-$/g, '');
503
+ }
504
+ }
505
+ // Export a singleton instance
506
+ export const documentService = new DocumentService();
507
+ //# sourceMappingURL=documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/services/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ export * from './types.js';
2
+ export * from './templates.js';
3
+ let emailProvider = null;
4
+ let emailConfig = null;
5
+ /**
6
+ * Create an email provider based on configuration.
7
+ * Uses dynamic imports for optional dependencies (SES SDK only loaded if needed).
8
+ */
9
+ export async function createEmailProvider(providerConfig, fromAddress, fromName) {
10
+ switch (providerConfig.type) {
11
+ case 'ses':
12
+ // Dynamic import - @aws-sdk/client-ses is optional peer dependency
13
+ try {
14
+ const { SESEmailProvider } = await import('./providers/ses.js');
15
+ return new SESEmailProvider(providerConfig, fromAddress, fromName);
16
+ }
17
+ catch (e) {
18
+ if (e.code === 'ERR_MODULE_NOT_FOUND') {
19
+ throw new Error('SES provider requires @aws-sdk/client-ses. Install it with: pnpm add @aws-sdk/client-ses');
20
+ }
21
+ throw e;
22
+ }
23
+ default:
24
+ throw new Error(`Unknown email provider type: ${providerConfig.type}`);
25
+ }
26
+ }
27
+ /**
28
+ * Get the email provider singleton.
29
+ * Must be initialized with initializeEmailProvider() first.
30
+ * Throws if not initialized.
31
+ */
32
+ export function getEmailProvider() {
33
+ if (!emailProvider) {
34
+ throw new Error('[Email] Provider not initialized. Call initializeEmailProvider() first.');
35
+ }
36
+ return emailProvider;
37
+ }
38
+ /**
39
+ * Check if email is configured and available
40
+ */
41
+ export function isEmailEnabled() {
42
+ return emailConfig?.enabled === true && emailProvider !== null;
43
+ }
44
+ /**
45
+ * Initialize the email provider singleton.
46
+ * Call this during server startup with the app's email config.
47
+ */
48
+ export async function initializeEmailProvider(config) {
49
+ if (emailProvider) {
50
+ console.warn('[Email] Provider already initialized');
51
+ return emailProvider;
52
+ }
53
+ emailConfig = config;
54
+ if (!config.enabled) {
55
+ console.log('[Email] Email system is disabled');
56
+ return null;
57
+ }
58
+ console.log(`[Email] Initializing ${config.providerConfig.type} provider...`);
59
+ emailProvider = await createEmailProvider(config.providerConfig, config.fromAddress, config.fromName);
60
+ console.log(`[Email] ${emailProvider.name} provider initialized`);
61
+ return emailProvider;
62
+ }
63
+ /**
64
+ * Send an email using the configured provider
65
+ * Convenience wrapper that handles disabled state gracefully
66
+ */
67
+ export async function sendEmail(message) {
68
+ if (!isEmailEnabled()) {
69
+ console.log('[Email] Email disabled, skipping send');
70
+ return null;
71
+ }
72
+ return getEmailProvider().send(message);
73
+ }
74
+ /**
75
+ * Close and reset the email provider (for testing or shutdown)
76
+ */
77
+ export async function closeEmailProvider() {
78
+ if (emailProvider) {
79
+ await emailProvider.close();
80
+ emailProvider = null;
81
+ console.log('[Email] Provider closed');
82
+ }
83
+ }
84
+ /**
85
+ * Reset the email provider singleton (for testing)
86
+ */
87
+ export function resetEmailProvider() {
88
+ emailProvider = null;
89
+ emailConfig = null;
90
+ }
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/email/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAE/B,IAAI,aAAa,GAAyB,IAAI,CAAC;AAC/C,IAAI,WAAW,GAAuB,IAAI,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,cAAmC,EACnC,WAAmB,EACnB,QAAiB;IAEjB,QAAQ,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,KAAK;YACR,mEAAmE;YACnE,IAAI,CAAC;gBACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBAChE,OAAO,IAAI,gBAAgB,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAK,CAA2B,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;oBACjE,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QAEH;YACE,MAAM,IAAI,KAAK,CAAC,gCAAiC,cAAsC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,EAAE,OAAO,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAmB;IAC/D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,WAAW,GAAG,MAAM,CAAC;IAErB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,CAAC;IAC9E,aAAa,GAAG,MAAM,mBAAmB,CACvC,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,QAAQ,CAChB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,CAAC,IAAI,uBAAuB,CAAC,CAAC;IAElE,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAqB;IACnD,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,aAAa,GAAG,IAAI,CAAC;IACrB,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC"}