@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.
- package/dist/api/admin.js +438 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/agents.js +21 -0
- package/dist/api/agents.js.map +1 -0
- package/dist/api/api-keys.js +122 -0
- package/dist/api/api-keys.js.map +1 -0
- package/dist/api/auth.js +399 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/chat.js +900 -0
- package/dist/api/chat.js.map +1 -0
- package/dist/api/config.js +91 -0
- package/dist/api/config.js.map +1 -0
- package/dist/api/documents.js +237 -0
- package/dist/api/documents.js.map +1 -0
- package/dist/api/export.js +107 -0
- package/dist/api/export.js.map +1 -0
- package/dist/api/health.js +25 -0
- package/dist/api/health.js.map +1 -0
- package/dist/api/mcp-server.js +84 -0
- package/dist/api/mcp-server.js.map +1 -0
- package/dist/api/mcp.js +400 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/mentions.js +94 -0
- package/dist/api/mentions.js.map +1 -0
- package/dist/api/oauth.js +366 -0
- package/dist/api/oauth.js.map +1 -0
- package/dist/api/payments.js +473 -0
- package/dist/api/payments.js.map +1 -0
- package/dist/api/projects.js +301 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/scheduled-prompts.js +617 -0
- package/dist/api/scheduled-prompts.js.map +1 -0
- package/dist/api/search.js +85 -0
- package/dist/api/search.js.map +1 -0
- package/dist/api/share.js +188 -0
- package/dist/api/share.js.map +1 -0
- package/dist/api/slack.js +468 -0
- package/dist/api/slack.js.map +1 -0
- package/dist/api/teams.js +693 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/templates.js +134 -0
- package/dist/api/templates.js.map +1 -0
- package/dist/api/threads.js +323 -0
- package/dist/api/threads.js.map +1 -0
- package/dist/api/upload.js +57 -0
- package/dist/api/upload.js.map +1 -0
- package/dist/api/user.js +111 -0
- package/dist/api/user.js.map +1 -0
- package/dist/api/v1/openai.js +245 -0
- package/dist/api/v1/openai.js.map +1 -0
- package/dist/app.js +168 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/cli.js +57 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/db-sync.js +108 -0
- package/dist/commands/db-sync.js.map +1 -0
- package/dist/config/loader.js +374 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/documents/extractors.js +136 -0
- package/dist/documents/extractors.js.map +1 -0
- package/dist/extensions/glob.js +53 -0
- package/dist/extensions/glob.js.map +1 -0
- package/dist/extensions/loader.js +72 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders/index.js +75 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/mcp/client.js +551 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/server.js +335 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/middleware/apiKeyAuth.js +136 -0
- package/dist/middleware/apiKeyAuth.js.map +1 -0
- package/dist/middleware/auth.js +192 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/errorHandler.js +41 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/mcpServerAuth.js +164 -0
- package/dist/middleware/mcpServerAuth.js.map +1 -0
- package/dist/middleware/requestLogger.js +9 -0
- package/dist/middleware/requestLogger.js.map +1 -0
- package/dist/middleware/team.js +132 -0
- package/dist/middleware/team.js.map +1 -0
- package/dist/oauth/server.js +410 -0
- package/dist/oauth/server.js.map +1 -0
- package/dist/queue/cli.js +93 -0
- package/dist/queue/cli.js.map +1 -0
- package/dist/queue/handlers/index.js +91 -0
- package/dist/queue/handlers/index.js.map +1 -0
- package/dist/queue/handlers/scheduled-prompt.js +270 -0
- package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
- package/dist/queue/index.js +91 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/providers/memory.js +296 -0
- package/dist/queue/providers/memory.js.map +1 -0
- package/dist/queue/providers/sqs.js +275 -0
- package/dist/queue/providers/sqs.js.map +1 -0
- package/dist/queue/scheduler.js +355 -0
- package/dist/queue/scheduler.js.map +1 -0
- package/dist/queue/types.js +5 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/queue/worker.js +230 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/registry/index.js +40 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/server.js +207 -0
- package/dist/server.js.map +1 -0
- package/dist/services/agent.js +530 -0
- package/dist/services/agent.js.map +1 -0
- package/dist/services/agents.js +194 -0
- package/dist/services/agents.js.map +1 -0
- package/dist/services/documents.js +507 -0
- package/dist/services/documents.js.map +1 -0
- package/dist/services/email/index.js +91 -0
- package/dist/services/email/index.js.map +1 -0
- package/dist/services/email/providers/ses.js +97 -0
- package/dist/services/email/providers/ses.js.map +1 -0
- package/dist/services/email/templates.js +194 -0
- package/dist/services/email/templates.js.map +1 -0
- package/dist/services/email/types.js +5 -0
- package/dist/services/email/types.js.map +1 -0
- package/dist/services/encryption.js +69 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/oauth-discovery.js +226 -0
- package/dist/services/oauth-discovery.js.map +1 -0
- package/dist/services/pendingConfirmation.js +105 -0
- package/dist/services/pendingConfirmation.js.map +1 -0
- package/dist/services/scheduledPrompts.js +70 -0
- package/dist/services/scheduledPrompts.js.map +1 -0
- package/dist/services/slack/client.js +174 -0
- package/dist/services/slack/client.js.map +1 -0
- package/dist/services/slack/events.js +189 -0
- package/dist/services/slack/events.js.map +1 -0
- package/dist/services/slack/index.js +6 -0
- package/dist/services/slack/index.js.map +1 -0
- package/dist/services/slack/notifications.js +124 -0
- package/dist/services/slack/notifications.js.map +1 -0
- package/dist/services/slack/signature.js +74 -0
- package/dist/services/slack/signature.js.map +1 -0
- package/dist/services/slack/thread-context.js +191 -0
- package/dist/services/slack/thread-context.js.map +1 -0
- package/dist/services/toolConfirmation.js +55 -0
- package/dist/services/toolConfirmation.js.map +1 -0
- package/dist/services/usage.js +241 -0
- package/dist/services/usage.js.map +1 -0
- package/dist/ssr/build.js +90 -0
- package/dist/ssr/build.js.map +1 -0
- package/dist/ssr/components/SSRMessageList.js +120 -0
- package/dist/ssr/components/SSRMessageList.js.map +1 -0
- package/dist/ssr/entry.client.js +8 -0
- package/dist/ssr/entry.client.js.map +1 -0
- package/dist/ssr/entry.server.js +71 -0
- package/dist/ssr/entry.server.js.map +1 -0
- package/dist/ssr/handler.js +51 -0
- package/dist/ssr/handler.js.map +1 -0
- package/dist/ssr/root.js +184 -0
- package/dist/ssr/root.js.map +1 -0
- package/dist/ssr/routes/login.js +140 -0
- package/dist/ssr/routes/login.js.map +1 -0
- package/dist/ssr/routes/pricing.js +195 -0
- package/dist/ssr/routes/pricing.js.map +1 -0
- package/dist/ssr/routes/privacy.js +39 -0
- package/dist/ssr/routes/privacy.js.map +1 -0
- package/dist/ssr/routes/register.js +148 -0
- package/dist/ssr/routes/register.js.map +1 -0
- package/dist/ssr/routes/shared.$shareId.js +153 -0
- package/dist/ssr/routes/shared.$shareId.js.map +1 -0
- package/dist/ssr/routes/terms.js +39 -0
- package/dist/ssr/routes/terms.js.map +1 -0
- package/dist/storage/index.js +43 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/providers/database.js +38 -0
- package/dist/storage/providers/database.js.map +1 -0
- package/dist/storage/providers/filesystem.js +51 -0
- package/dist/storage/providers/filesystem.js.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/tools/documents.js +336 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/get-plan-usage.js +82 -0
- package/dist/tools/get-plan-usage.js.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-scrape.js +145 -0
- package/dist/tools/web-scrape.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAA+B,EAAE;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE3D,gDAAgD;IAChD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,GAAG,EACH,cAAc,EACd,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,QAAQ,CACT,CAAC;IAEF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAErE,gCAAgC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,uDAAuD;IACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAChE,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/B,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,sBAAsB;IACtB,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAChC,gBAAgB,GAAG,IAAI,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAClC,kBAAkB,GAAG,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IAED,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,gBAAgB,EAAE,CAAC;QACrB,iBAAiB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,KAAK,iBAAiB,CAAC;IAE5D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,+CAA+C;IAC/C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,cAAc,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -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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"}
|