@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,108 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ /**
4
+ * Sync the Prisma schema from @chaaskit/db to the project.
5
+ * Uses Prisma's multi-file schema feature (prismaSchemaFolder).
6
+ *
7
+ * This command:
8
+ * - Copies base.prisma from the package (overwrites existing)
9
+ * - Creates custom.prisma if it doesn't exist (never overwrites)
10
+ * - Preserves any other .prisma files in the schema directory
11
+ */
12
+ export async function dbSync(options = {}) {
13
+ const cwd = process.cwd();
14
+ const targetSchemaDir = path.join(cwd, 'prisma', 'schema');
15
+ // Find the source schema folder in node_modules
16
+ const sourceSchemaDir = path.join(cwd, 'node_modules', '@chaaskit', 'db', 'prisma', 'schema');
17
+ const sourceBasePath = path.join(sourceSchemaDir, 'base.prisma');
18
+ const sourceCustomPath = path.join(sourceSchemaDir, 'custom.prisma');
19
+ const targetBasePath = path.join(targetSchemaDir, 'base.prisma');
20
+ const targetCustomPath = path.join(targetSchemaDir, 'custom.prisma');
21
+ // Check if source schema exists
22
+ try {
23
+ await fs.access(sourceBasePath);
24
+ }
25
+ catch {
26
+ console.error('Error: @chaaskit/db package not found or has old schema format.');
27
+ console.error('Make sure you have installed the latest dependencies: pnpm install');
28
+ process.exit(1);
29
+ }
30
+ // Ensure target schema directory exists
31
+ await fs.mkdir(targetSchemaDir, { recursive: true });
32
+ // Check if this is a migration from single-file schema
33
+ const oldSchemaPath = path.join(cwd, 'prisma', 'schema.prisma');
34
+ let hadOldSchema = false;
35
+ try {
36
+ await fs.access(oldSchemaPath);
37
+ hadOldSchema = true;
38
+ }
39
+ catch {
40
+ // No old schema
41
+ }
42
+ // Check current state
43
+ let targetBaseExists = false;
44
+ let targetCustomExists = false;
45
+ try {
46
+ await fs.access(targetBasePath);
47
+ targetBaseExists = true;
48
+ }
49
+ catch {
50
+ // Base doesn't exist
51
+ }
52
+ try {
53
+ await fs.access(targetCustomPath);
54
+ targetCustomExists = true;
55
+ }
56
+ catch {
57
+ // Custom doesn't exist
58
+ }
59
+ // Copy base.prisma (always overwrite)
60
+ const sourceBaseContent = await fs.readFile(sourceBasePath, 'utf-8');
61
+ let targetBaseContent = '';
62
+ if (targetBaseExists) {
63
+ targetBaseContent = await fs.readFile(targetBasePath, 'utf-8');
64
+ }
65
+ const baseChanged = sourceBaseContent !== targetBaseContent;
66
+ if (baseChanged) {
67
+ await fs.writeFile(targetBasePath, sourceBaseContent, 'utf-8');
68
+ if (targetBaseExists) {
69
+ console.log('Updated: prisma/schema/base.prisma');
70
+ }
71
+ else {
72
+ console.log('Created: prisma/schema/base.prisma');
73
+ }
74
+ }
75
+ else {
76
+ console.log('No changes: prisma/schema/base.prisma is up to date');
77
+ }
78
+ // Create custom.prisma if it doesn't exist (never overwrite)
79
+ if (!targetCustomExists) {
80
+ const sourceCustomContent = await fs.readFile(sourceCustomPath, 'utf-8');
81
+ await fs.writeFile(targetCustomPath, sourceCustomContent, 'utf-8');
82
+ console.log('Created: prisma/schema/custom.prisma');
83
+ }
84
+ else {
85
+ console.log('Preserved: prisma/schema/custom.prisma (your custom models)');
86
+ }
87
+ // Handle migration from old single-file schema
88
+ if (hadOldSchema) {
89
+ console.log('\n--- Migration Notice ---');
90
+ console.log('Found old single-file schema: prisma/schema.prisma');
91
+ console.log('');
92
+ console.log('To migrate your custom models:');
93
+ console.log('1. Open prisma/schema.prisma');
94
+ console.log('2. Copy any custom models you added to prisma/schema/custom.prisma');
95
+ console.log('3. Delete prisma/schema.prisma');
96
+ console.log('');
97
+ console.log('Note: Core models (User, Thread, etc.) are now in base.prisma.');
98
+ console.log('Only copy models YOU created to custom.prisma.');
99
+ }
100
+ printNextSteps();
101
+ }
102
+ function printNextSteps() {
103
+ console.log('\nNext steps:');
104
+ console.log(' 1. Run: pnpm db:generate');
105
+ console.log(' 2. Run: pnpm db:push');
106
+ console.log(' 3. Restart your dev server');
107
+ }
108
+ //# sourceMappingURL=db-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-sync.js","sourceRoot":"","sources":["../../src/commands/db-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,374 @@
1
+ import { pathToFileURL, fileURLToPath } from 'url';
2
+ import path from 'path';
3
+ import fs from 'fs/promises';
4
+ import { createJiti } from 'jiti';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ let config = null;
8
+ let configLoaded = false;
9
+ let programmaticConfig = null;
10
+ /**
11
+ * Set config programmatically. This takes highest precedence.
12
+ * Call this before loadConfigAsync() to use a custom config.
13
+ */
14
+ export function setConfig(newConfig) {
15
+ programmaticConfig = newConfig;
16
+ config = mergeWithDefaults(newConfig);
17
+ configLoaded = true;
18
+ }
19
+ /**
20
+ * Check if a file exists
21
+ */
22
+ async function fileExists(filePath) {
23
+ try {
24
+ await fs.access(filePath);
25
+ return true;
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ // Create jiti instance for loading TypeScript configs
32
+ const jiti = createJiti(import.meta.url, {
33
+ interopDefault: true,
34
+ moduleCache: false, // Don't cache to pick up config changes
35
+ });
36
+ /**
37
+ * Load config from a specific file path
38
+ * Uses jiti to support TypeScript configs without requiring tsx/ts-node
39
+ */
40
+ async function loadFromPath(configPath) {
41
+ let configModule;
42
+ // Determine the actual file path
43
+ let actualPath = configPath;
44
+ if (!configPath.endsWith('.ts') && !configPath.endsWith('.js')) {
45
+ // Try .ts first, then .js
46
+ if (await fileExists(configPath + '.ts')) {
47
+ actualPath = configPath + '.ts';
48
+ }
49
+ else if (await fileExists(configPath + '.js')) {
50
+ actualPath = configPath + '.js';
51
+ }
52
+ }
53
+ // Use jiti for TypeScript files, native import for JavaScript
54
+ if (actualPath.endsWith('.ts')) {
55
+ configModule = await jiti.import(actualPath);
56
+ }
57
+ else {
58
+ configModule = await import(pathToFileURL(actualPath).href);
59
+ }
60
+ const appConfig = configModule.config || configModule.default;
61
+ return mergeWithDefaults(appConfig);
62
+ }
63
+ /**
64
+ * Load configuration with multi-source resolution:
65
+ * 1. Programmatic config (set via setConfig())
66
+ * 2. Environment variable (CHAASKIT_CONFIG_PATH)
67
+ * 3. Well-known paths relative to cwd:
68
+ * - ./config/app.config.ts
69
+ * - ./config/app.config.js
70
+ * 4. Monorepo path (for development within the monorepo)
71
+ * 5. Default config (built-in defaults)
72
+ */
73
+ export async function loadConfigAsync() {
74
+ if (configLoaded && config) {
75
+ return config;
76
+ }
77
+ // 1. Check programmatic config
78
+ if (programmaticConfig) {
79
+ config = mergeWithDefaults(programmaticConfig);
80
+ configLoaded = true;
81
+ console.log('[Config] Using programmatic config');
82
+ logConfig(config);
83
+ return config;
84
+ }
85
+ // 2. Check environment variable
86
+ const envPath = process.env.CHAASKIT_CONFIG_PATH;
87
+ if (envPath) {
88
+ const resolvedEnvPath = path.isAbsolute(envPath)
89
+ ? envPath
90
+ : path.resolve(process.cwd(), envPath);
91
+ if (await fileExists(resolvedEnvPath)) {
92
+ try {
93
+ config = await loadFromPath(resolvedEnvPath);
94
+ configLoaded = true;
95
+ console.log('[Config] Loaded from CHAASKIT_CONFIG_PATH:', resolvedEnvPath);
96
+ logConfig(config);
97
+ return config;
98
+ }
99
+ catch (error) {
100
+ console.warn('[Config] Failed to load from CHAASKIT_CONFIG_PATH:', error);
101
+ }
102
+ }
103
+ }
104
+ // 3. Check well-known paths relative to cwd
105
+ const cwd = process.cwd();
106
+ const wellKnownPaths = [
107
+ 'config/app.config.ts',
108
+ 'config/app.config.js',
109
+ ];
110
+ for (const relativePath of wellKnownPaths) {
111
+ const fullPath = path.join(cwd, relativePath);
112
+ if (await fileExists(fullPath)) {
113
+ try {
114
+ config = await loadFromPath(fullPath);
115
+ configLoaded = true;
116
+ console.log('[Config] Loaded from', fullPath);
117
+ logConfig(config);
118
+ return config;
119
+ }
120
+ catch (error) {
121
+ console.warn(`[Config] Failed to load from ${fullPath}:`, error);
122
+ }
123
+ }
124
+ }
125
+ // 4. Check monorepo path (for development)
126
+ // Navigate from packages/core-server/src/config/ to monorepo root's config/
127
+ const monorepoRoot = path.resolve(__dirname, '..', '..', '..', '..');
128
+ const monorepoConfigPath = path.join(monorepoRoot, 'config', 'app.config');
129
+ const monorepoTsPath = monorepoConfigPath + '.ts';
130
+ const monorepoJsPath = monorepoConfigPath + '.js';
131
+ if (await fileExists(monorepoTsPath)) {
132
+ try {
133
+ config = await loadFromPath(monorepoTsPath);
134
+ configLoaded = true;
135
+ console.log('[Config] Loaded from monorepo:', monorepoTsPath);
136
+ logConfig(config);
137
+ return config;
138
+ }
139
+ catch (error) {
140
+ console.warn('[Config] Failed to load from monorepo:', error);
141
+ }
142
+ }
143
+ else if (await fileExists(monorepoJsPath)) {
144
+ try {
145
+ config = await loadFromPath(monorepoJsPath);
146
+ configLoaded = true;
147
+ console.log('[Config] Loaded from monorepo:', monorepoJsPath);
148
+ logConfig(config);
149
+ return config;
150
+ }
151
+ catch (error) {
152
+ console.warn('[Config] Failed to load from monorepo:', error);
153
+ }
154
+ }
155
+ // 5. Fall back to defaults
156
+ console.log('[Config] No config file found, using defaults');
157
+ config = getDefaultConfig();
158
+ configLoaded = true;
159
+ logConfig(config);
160
+ return config;
161
+ }
162
+ /**
163
+ * Log the loaded config (redacting sensitive values)
164
+ */
165
+ function logConfig(cfg) {
166
+ console.log('[Config] Loaded configuration:');
167
+ console.log(JSON.stringify(cfg, null, 2));
168
+ }
169
+ /**
170
+ * Synchronous version - returns defaults if async load hasn't completed
171
+ */
172
+ export function loadConfig() {
173
+ if (!config) {
174
+ config = getDefaultConfig();
175
+ }
176
+ return config;
177
+ }
178
+ /**
179
+ * Get the current config (loads defaults if not yet loaded)
180
+ */
181
+ export function getConfig() {
182
+ if (!config) {
183
+ return loadConfig();
184
+ }
185
+ return config;
186
+ }
187
+ /**
188
+ * Reset config state (useful for testing)
189
+ */
190
+ export function resetConfig() {
191
+ config = null;
192
+ configLoaded = false;
193
+ programmaticConfig = null;
194
+ }
195
+ function mergeWithDefaults(appConfig) {
196
+ const defaults = getDefaultConfig();
197
+ return {
198
+ ...defaults,
199
+ ...appConfig,
200
+ // Deep merge specific sections that might be partially defined
201
+ mcp: appConfig.mcp || defaults.mcp,
202
+ };
203
+ }
204
+ function getDefaultConfig() {
205
+ return {
206
+ app: {
207
+ name: 'AI Chat',
208
+ description: 'Your AI assistant',
209
+ url: process.env.APP_URL || 'http://localhost:5173',
210
+ },
211
+ ui: {
212
+ welcomeTitle: 'Welcome to AI Chat',
213
+ welcomeSubtitle: 'How can I help you today?',
214
+ inputPlaceholder: 'Type your message...',
215
+ samplePrompts: [
216
+ { label: 'Explain a concept', prompt: 'Explain quantum computing in simple terms' },
217
+ { label: 'Write code', prompt: 'Write a function to sort an array' },
218
+ { label: 'Help me brainstorm', prompt: 'Help me brainstorm ideas for a mobile app' },
219
+ ],
220
+ logo: '/logo.svg',
221
+ },
222
+ theming: {
223
+ defaultTheme: 'light',
224
+ allowUserThemeSwitch: true,
225
+ themes: {
226
+ light: {
227
+ name: 'Light',
228
+ colors: {
229
+ primary: '#6366f1',
230
+ primaryHover: '#4f46e5',
231
+ secondary: '#8b5cf6',
232
+ background: '#ffffff',
233
+ backgroundSecondary: '#f9fafb',
234
+ sidebar: '#f3f4f6',
235
+ textPrimary: '#111827',
236
+ textSecondary: '#6b7280',
237
+ textMuted: '#9ca3af',
238
+ border: '#e5e7eb',
239
+ inputBackground: '#ffffff',
240
+ inputBorder: '#d1d5db',
241
+ userMessageBg: '#6366f1',
242
+ userMessageText: '#ffffff',
243
+ assistantMessageBg: '#f3f4f6',
244
+ assistantMessageText: '#111827',
245
+ success: '#10b981',
246
+ warning: '#f59e0b',
247
+ error: '#ef4444',
248
+ },
249
+ },
250
+ dark: {
251
+ name: 'Dark',
252
+ colors: {
253
+ primary: '#818cf8',
254
+ primaryHover: '#a5b4fc',
255
+ secondary: '#a78bfa',
256
+ background: '#111827',
257
+ backgroundSecondary: '#1f2937',
258
+ sidebar: '#0f172a',
259
+ textPrimary: '#f9fafb',
260
+ textSecondary: '#d1d5db',
261
+ textMuted: '#6b7280',
262
+ border: '#374151',
263
+ inputBackground: '#1f2937',
264
+ inputBorder: '#4b5563',
265
+ userMessageBg: '#4f46e5',
266
+ userMessageText: '#ffffff',
267
+ assistantMessageBg: '#1f2937',
268
+ assistantMessageText: '#f9fafb',
269
+ success: '#34d399',
270
+ warning: '#fbbf24',
271
+ error: '#f87171',
272
+ },
273
+ },
274
+ },
275
+ fonts: {
276
+ sans: 'Inter, system-ui, sans-serif',
277
+ mono: 'JetBrains Mono, Menlo, monospace',
278
+ },
279
+ borderRadius: {
280
+ sm: '0.25rem',
281
+ md: '0.5rem',
282
+ lg: '0.75rem',
283
+ full: '9999px',
284
+ },
285
+ },
286
+ auth: {
287
+ methods: ['email-password'],
288
+ allowUnauthenticated: false,
289
+ magicLink: {
290
+ enabled: true,
291
+ expiresInMinutes: 15,
292
+ },
293
+ },
294
+ agent: {
295
+ type: 'built-in',
296
+ provider: 'openai',
297
+ model: 'gpt-4o-mini',
298
+ systemPrompt: 'You are a helpful AI assistant.',
299
+ maxTokens: 4096,
300
+ },
301
+ payments: {
302
+ enabled: false,
303
+ provider: 'stripe',
304
+ plans: [
305
+ {
306
+ id: 'free',
307
+ name: 'Free',
308
+ type: 'free',
309
+ params: {
310
+ monthlyMessageLimit: 20,
311
+ },
312
+ },
313
+ ],
314
+ },
315
+ legal: {
316
+ privacyPolicyUrl: '/privacy',
317
+ termsOfServiceUrl: '/terms',
318
+ },
319
+ userSettings: {
320
+ fields: [
321
+ {
322
+ key: 'name',
323
+ label: 'Your Name',
324
+ type: 'text',
325
+ placeholder: 'Enter your name',
326
+ },
327
+ {
328
+ key: 'context',
329
+ label: 'Additional Context',
330
+ type: 'textarea',
331
+ placeholder: 'Any context the AI should know about you...',
332
+ },
333
+ ],
334
+ },
335
+ sharing: {
336
+ enabled: false,
337
+ scope: 'public',
338
+ expirationOptions: ['1h', '24h', '7d', '30d', 'never'],
339
+ },
340
+ promptTemplates: {
341
+ enabled: true,
342
+ builtIn: [
343
+ {
344
+ id: 'explain',
345
+ name: 'Explain Code',
346
+ prompt: 'Explain this code:\n\n{{code}}',
347
+ variables: ['code'],
348
+ },
349
+ {
350
+ id: 'review',
351
+ name: 'Code Review',
352
+ prompt: 'Review this code for bugs, security issues, and improvements:\n\n{{code}}',
353
+ variables: ['code'],
354
+ },
355
+ ],
356
+ allowUserTemplates: true,
357
+ },
358
+ queue: {
359
+ enabled: false,
360
+ providerConfig: { type: 'memory' },
361
+ worker: {
362
+ mode: 'in-process',
363
+ concurrency: 5,
364
+ pollInterval: 1000,
365
+ shutdownTimeout: 30000,
366
+ },
367
+ scheduler: {
368
+ enabled: false,
369
+ pollInterval: 60000,
370
+ },
371
+ },
372
+ };
373
+ }
374
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Text extraction system for documents
3
+ * Uses a registry pattern for extensibility
4
+ */
5
+ // Registry of extractors by MIME type
6
+ const extractors = new Map();
7
+ /**
8
+ * Register a text extractor for specific MIME types
9
+ */
10
+ export function registerExtractor(extractor) {
11
+ for (const mimeType of extractor.mimeTypes) {
12
+ extractors.set(mimeType, extractor);
13
+ }
14
+ }
15
+ /**
16
+ * Extract text from a buffer based on its MIME type
17
+ */
18
+ export async function extractText(buffer, mimeType) {
19
+ const extractor = extractors.get(mimeType);
20
+ if (!extractor) {
21
+ // Fall back to treating it as plain text
22
+ return buffer.toString('utf-8');
23
+ }
24
+ return extractor.extract(buffer);
25
+ }
26
+ /**
27
+ * Check if a MIME type is supported for text extraction
28
+ */
29
+ export function isExtractorSupported(mimeType) {
30
+ return extractors.has(mimeType) || isPlainTextMimeType(mimeType);
31
+ }
32
+ /**
33
+ * Check if MIME type is plain text (doesn't need extraction)
34
+ */
35
+ function isPlainTextMimeType(mimeType) {
36
+ return (mimeType.startsWith('text/') ||
37
+ mimeType === 'application/json' ||
38
+ mimeType === 'application/javascript' ||
39
+ mimeType === 'application/typescript' ||
40
+ mimeType === 'application/xml');
41
+ }
42
+ // =============================================================================
43
+ // Built-in Extractors
44
+ // =============================================================================
45
+ /**
46
+ * Plain text extractor - passthrough for text files
47
+ */
48
+ const plainTextExtractor = {
49
+ mimeTypes: [
50
+ 'text/plain',
51
+ 'text/markdown',
52
+ 'text/x-markdown',
53
+ 'text/html',
54
+ 'text/css',
55
+ 'text/javascript',
56
+ 'text/typescript',
57
+ 'text/xml',
58
+ 'application/json',
59
+ 'application/javascript',
60
+ 'application/typescript',
61
+ 'application/xml',
62
+ ],
63
+ async extract(buffer) {
64
+ return buffer.toString('utf-8');
65
+ },
66
+ };
67
+ /**
68
+ * CSV extractor - converts CSV to readable table format
69
+ */
70
+ const csvExtractor = {
71
+ mimeTypes: ['text/csv', 'application/csv'],
72
+ async extract(buffer) {
73
+ const content = buffer.toString('utf-8');
74
+ const lines = content.split('\n').filter((line) => line.trim());
75
+ if (lines.length === 0) {
76
+ return '';
77
+ }
78
+ // Parse CSV manually (simple implementation)
79
+ const rows = lines.map((line) => parseCSVLine(line));
80
+ // Format as readable table
81
+ if (rows.length === 0) {
82
+ return content;
83
+ }
84
+ const headers = rows[0];
85
+ const dataRows = rows.slice(1);
86
+ // Calculate column widths
87
+ const colWidths = headers.map((header, i) => {
88
+ const maxDataWidth = Math.max(...dataRows.map((row) => (row[i] || '').length));
89
+ return Math.max(header.length, maxDataWidth);
90
+ });
91
+ // Build table
92
+ const separator = colWidths.map((w) => '-'.repeat(w)).join(' | ');
93
+ const headerRow = headers.map((h, i) => h.padEnd(colWidths[i])).join(' | ');
94
+ const output = [headerRow, separator];
95
+ for (const row of dataRows) {
96
+ const formattedRow = row.map((cell, i) => (cell || '').padEnd(colWidths[i] || 0)).join(' | ');
97
+ output.push(formattedRow);
98
+ }
99
+ return output.join('\n');
100
+ },
101
+ };
102
+ /**
103
+ * Parse a single CSV line, handling quoted values
104
+ */
105
+ function parseCSVLine(line) {
106
+ const result = [];
107
+ let current = '';
108
+ let inQuotes = false;
109
+ for (let i = 0; i < line.length; i++) {
110
+ const char = line[i];
111
+ if (char === '"') {
112
+ if (inQuotes && line[i + 1] === '"') {
113
+ // Escaped quote
114
+ current += '"';
115
+ i++;
116
+ }
117
+ else {
118
+ // Toggle quote mode
119
+ inQuotes = !inQuotes;
120
+ }
121
+ }
122
+ else if (char === ',' && !inQuotes) {
123
+ result.push(current.trim());
124
+ current = '';
125
+ }
126
+ else {
127
+ current += char;
128
+ }
129
+ }
130
+ result.push(current.trim());
131
+ return result;
132
+ }
133
+ // Register built-in extractors
134
+ registerExtractor(plainTextExtractor);
135
+ registerExtractor(csvExtractor);
136
+ //# sourceMappingURL=extractors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractors.js","sourceRoot":"","sources":["../../src/documents/extractors.ts"],"names":[],"mappings":"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"}