@package-uploader/core 1.0.2 → 1.3.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/server.js ADDED
@@ -0,0 +1,231 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ require("dotenv/config");
8
+ const express_1 = __importDefault(require("express"));
9
+ const cors_1 = __importDefault(require("cors"));
10
+ const multer_1 = __importDefault(require("multer"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const uploader_client_js_1 = require("./client/uploader-client.js");
14
+ const app = (0, express_1.default)();
15
+ const port = process.env.PORT || 3002;
16
+ app.use((0, cors_1.default)());
17
+ app.use(express_1.default.json());
18
+ // Serve static UI files
19
+ // Priority: 1) ./public in current directory, 2) bundled public in package
20
+ const localPublic = path_1.default.join(process.cwd(), 'public');
21
+ const packagePublic = path_1.default.join(__dirname, '..', 'public');
22
+ const uiPath = fs_1.default.existsSync(localPublic) ? localPublic : packagePublic;
23
+ if (fs_1.default.existsSync(uiPath)) {
24
+ app.use(express_1.default.static(uiPath));
25
+ console.log(`Serving UI from: ${uiPath}`);
26
+ }
27
+ // File upload config
28
+ const upload = (0, multer_1.default)({
29
+ storage: multer_1.default.memoryStorage(),
30
+ limits: { fileSize: 500 * 1024 * 1024 },
31
+ fileFilter: (_req, file, cb) => {
32
+ if (file.mimetype === 'application/zip' ||
33
+ file.mimetype === 'application/x-zip-compressed' ||
34
+ file.originalname.endsWith('.zip')) {
35
+ cb(null, true);
36
+ }
37
+ else {
38
+ cb(new Error('Only ZIP files allowed'));
39
+ }
40
+ },
41
+ });
42
+ // Singleton client (reuses session tokens)
43
+ let client = null;
44
+ function getClient() {
45
+ if (client)
46
+ return client;
47
+ const baseUrl = process.env.UPLOADER_BASE_URL;
48
+ const username = process.env.UPLOADER_USERNAME;
49
+ const password = process.env.UPLOADER_PASSWORD;
50
+ if (!baseUrl || !username || !password) {
51
+ throw new Error('Missing required environment variables: UPLOADER_BASE_URL, UPLOADER_USERNAME, UPLOADER_PASSWORD');
52
+ }
53
+ client = new uploader_client_js_1.PackageUploaderClient({
54
+ baseUrl,
55
+ credentials: { username, password },
56
+ timeout: parseInt(process.env.UPLOADER_TIMEOUT || '30000', 10),
57
+ sessionTTL: parseInt(process.env.UPLOADER_SESSION_TTL || '1800000', 10),
58
+ patchAdams: process.env.PATCH_ADAMS_ENABLED === 'true' && process.env.PATCH_ADAMS_DOMAIN
59
+ ? { enabled: true, remoteDomain: process.env.PATCH_ADAMS_DOMAIN }
60
+ : undefined,
61
+ });
62
+ return client;
63
+ }
64
+ // =============================================================================
65
+ // HEALTH CHECK
66
+ // =============================================================================
67
+ app.get('/api/health', (_req, res) => {
68
+ const c = client;
69
+ const session = c?.getSessionInfo();
70
+ res.json({
71
+ status: 'ok',
72
+ configured: !!(process.env.UPLOADER_BASE_URL &&
73
+ process.env.UPLOADER_USERNAME &&
74
+ process.env.UPLOADER_PASSWORD),
75
+ patchAdamsEnabled: process.env.PATCH_ADAMS_ENABLED === 'true',
76
+ session: session
77
+ ? {
78
+ isAuthenticated: session.isAuthenticated,
79
+ expiresAt: session.expiresAt?.toISOString(),
80
+ }
81
+ : null,
82
+ });
83
+ });
84
+ // =============================================================================
85
+ // FOLDER ROUTES
86
+ // =============================================================================
87
+ app.get('/api/folders', async (_req, res) => {
88
+ try {
89
+ const folders = await getClient().listFolders();
90
+ res.json(folders);
91
+ }
92
+ catch (error) {
93
+ console.error('Error listing folders:', error);
94
+ res.status(500).json({ error: 'Failed to list folders' });
95
+ }
96
+ });
97
+ app.get('/api/folders/:id', async (req, res) => {
98
+ try {
99
+ const folder = await getClient().getFolder(req.params.id);
100
+ res.json(folder);
101
+ }
102
+ catch (error) {
103
+ console.error('Error getting folder:', error);
104
+ res.status(500).json({ error: 'Failed to get folder' });
105
+ }
106
+ });
107
+ app.get('/api/folders/:id/subfolders', async (req, res) => {
108
+ try {
109
+ const subfolders = await getClient().listSubfolders(req.params.id);
110
+ res.json(subfolders);
111
+ }
112
+ catch (error) {
113
+ console.error('Error listing subfolders:', error);
114
+ res.status(500).json({ error: 'Failed to list subfolders' });
115
+ }
116
+ });
117
+ // =============================================================================
118
+ // DOCUMENT ROUTES
119
+ // =============================================================================
120
+ app.get('/api/documents', async (req, res) => {
121
+ try {
122
+ const { folderId, filterText } = req.query;
123
+ let documents;
124
+ if (folderId) {
125
+ documents = await getClient().listFolderDocuments(String(folderId), {
126
+ filterText: filterText,
127
+ includeSharedLinks: true,
128
+ });
129
+ }
130
+ else {
131
+ documents = await getClient().listDocuments({
132
+ filterText: filterText,
133
+ includeSharedLinks: true,
134
+ });
135
+ }
136
+ res.json(documents);
137
+ }
138
+ catch (error) {
139
+ console.error('Error listing documents:', error);
140
+ res.status(500).json({ error: 'Failed to list documents' });
141
+ }
142
+ });
143
+ app.get('/api/documents/:id', async (req, res) => {
144
+ try {
145
+ const document = await getClient().getDocument(req.params.id);
146
+ res.json(document);
147
+ }
148
+ catch (error) {
149
+ console.error('Error getting document:', error);
150
+ res.status(500).json({ error: 'Failed to get document' });
151
+ }
152
+ });
153
+ app.get('/api/documents/:id/launch', async (req, res) => {
154
+ try {
155
+ const url = await getClient().getOrCreateLaunchLink(req.params.id);
156
+ res.json({ url });
157
+ }
158
+ catch (error) {
159
+ console.error('Error getting launch URL:', error);
160
+ res.status(500).json({ error: 'Failed to get launch URL' });
161
+ }
162
+ });
163
+ // =============================================================================
164
+ // UPLOAD ROUTES
165
+ // =============================================================================
166
+ app.post('/api/upload', upload.single('file'), async (req, res) => {
167
+ try {
168
+ if (!req.file) {
169
+ return res.status(400).json({ error: 'No file uploaded' });
170
+ }
171
+ const folderId = req.body.folderId;
172
+ if (!folderId) {
173
+ return res.status(400).json({ error: 'folderId is required' });
174
+ }
175
+ const result = await getClient().uploadCourse(req.file.buffer, req.file.originalname, {
176
+ folderId: String(folderId),
177
+ title: req.body.title,
178
+ description: req.body.description,
179
+ author: req.body.author,
180
+ });
181
+ res.json(result);
182
+ }
183
+ catch (error) {
184
+ console.error('Error uploading course:', error);
185
+ res.status(500).json({
186
+ error: error instanceof Error ? error.message : 'Failed to upload course',
187
+ });
188
+ }
189
+ });
190
+ app.post('/api/upload/version', upload.single('file'), async (req, res) => {
191
+ try {
192
+ if (!req.file) {
193
+ return res.status(400).json({ error: 'No file uploaded' });
194
+ }
195
+ const documentId = req.body.documentId;
196
+ if (!documentId) {
197
+ return res.status(400).json({ error: 'documentId is required' });
198
+ }
199
+ const result = await getClient().uploadVersion(req.file.buffer, req.file.originalname, {
200
+ documentId: String(documentId),
201
+ note: req.body.note,
202
+ });
203
+ res.json(result);
204
+ }
205
+ catch (error) {
206
+ console.error('Error uploading version:', error);
207
+ res.status(500).json({
208
+ error: error instanceof Error ? error.message : 'Failed to upload version',
209
+ });
210
+ }
211
+ });
212
+ // =============================================================================
213
+ // SPA FALLBACK
214
+ // =============================================================================
215
+ app.get('*', (_req, res) => {
216
+ const indexPath = path_1.default.join(uiPath, 'index.html');
217
+ if (fs_1.default.existsSync(indexPath)) {
218
+ res.sendFile(indexPath);
219
+ }
220
+ else {
221
+ res.status(404).json({ error: 'UI not found. Add a public/index.html file.' });
222
+ }
223
+ });
224
+ // =============================================================================
225
+ // START SERVER
226
+ // =============================================================================
227
+ app.listen(port, () => {
228
+ console.log(`Package Uploader Server running at http://localhost:${port}`);
229
+ console.log(`Health check: http://localhost:${port}/api/health`);
230
+ });
231
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;AACA,yBAAuB;AACvB,sDAAqD;AACrD,gDAAwB;AACxB,oDAAoD;AACpD,gDAAwB;AACxB,4CAAoB;AACpB,oEAAoE;AAEpE,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AAEtC,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;AAChB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,wBAAwB;AACxB,2EAA2E;AAC3E,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvD,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC3D,MAAM,MAAM,GAAG,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC;AAExE,IAAI,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,qBAAqB;AACrB,MAAM,MAAM,GAAG,IAAA,gBAAM,EAAC;IACpB,OAAO,EAAE,gBAAM,CAAC,aAAa,EAAE;IAC/B,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;IACvC,UAAU,EAAE,CACV,IAAa,EACb,IAAyB,EACzB,EAAsB,EACtB,EAAE;QACF,IACE,IAAI,CAAC,QAAQ,KAAK,iBAAiB;YACnC,IAAI,CAAC,QAAQ,KAAK,8BAA8B;YAChD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClC,CAAC;YACD,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,2CAA2C;AAC3C,IAAI,MAAM,GAAiC,IAAI,CAAC;AAEhD,SAAS,SAAS;IAChB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE/C,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,IAAI,0CAAqB,CAAC;QACjC,OAAO;QACP,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACnC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,EAAE,EAAE,CAAC;QAC9D,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,SAAS,EAAE,EAAE,CAAC;QACvE,UAAU,EACR,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC1E,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE;YACjE,CAAC,CAAC,SAAS;KAChB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC;IACjB,MAAM,OAAO,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC;IACpC,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,CACZ,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAC9B;QACD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;QAC7D,OAAO,EAAE,OAAO;YACd,CAAC,CAAC;gBACE,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE;aAC5C;YACH,CAAC,CAAC,IAAI;KACT,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC3E,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,SAAS,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAE3C,IAAI,SAAS,CAAC;QACd,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;gBAClE,UAAU,EAAE,UAAoB;gBAChC,kBAAkB,EAAE,IAAI;aACzB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,MAAM,SAAS,EAAE,CAAC,aAAa,CAAC;gBAC1C,UAAU,EAAE,UAAoB;gBAChC,kBAAkB,EAAE,IAAI;aACzB,CAAC,CAAC;QACL,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,GAAG,CAAC,IAAI,CACN,aAAa,EACb,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACrB,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,YAAY,CAC3C,GAAG,CAAC,IAAI,CAAC,MAAM,EACf,GAAG,CAAC,IAAI,CAAC,YAAY,EACrB;YACE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC1B,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;YACrB,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW;YACjC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;SACxB,CACF,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB;SAC1E,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CACF,CAAC;AAEF,GAAG,CAAC,IAAI,CACN,qBAAqB,EACrB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACrB,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC,aAAa,CAC5C,GAAG,CAAC,IAAI,CAAC,MAAM,EACf,GAAG,CAAC,IAAI,CAAC,YAAY,EACrB;YACE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;YAC9B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;SACpB,CACF,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;SAC3E,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CACF,CAAC;AAEF,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC5C,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,uDAAuD,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,aAAa,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC"}
@@ -1,11 +1,28 @@
1
1
  import { z } from 'zod';
2
2
  export declare const UploaderConfigSchema: z.ZodObject<{
3
- /** Base URL for the LMS API (e.g., https://lms.example.com) */
3
+ /** Base URL for the LMS API (e.g., https://core-company.bravais.com) */
4
4
  baseUrl: z.ZodString;
5
- /** API key or Bearer token for authentication */
6
- apiKey: z.ZodString;
5
+ /**
6
+ * Authentication credentials for the Bravais API.
7
+ * The client will authenticate and manage session tokens automatically.
8
+ */
9
+ credentials: z.ZodObject<{
10
+ username: z.ZodString;
11
+ password: z.ZodString;
12
+ }, "strip", z.ZodTypeAny, {
13
+ username: string;
14
+ password: string;
15
+ }, {
16
+ username: string;
17
+ password: string;
18
+ }>;
7
19
  /** Optional timeout in milliseconds (default: 30000) */
8
20
  timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
21
+ /**
22
+ * Session token TTL in milliseconds (default: 1800000 = 30 minutes).
23
+ * Tokens will be refreshed automatically before expiration.
24
+ */
25
+ sessionTTL: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
9
26
  /** Optional: Enable patch-adams integration */
10
27
  patchAdams: z.ZodOptional<z.ZodObject<{
11
28
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -19,8 +36,51 @@ export declare const UploaderConfigSchema: z.ZodObject<{
19
36
  }>>;
20
37
  }, "strip", z.ZodTypeAny, {
21
38
  baseUrl: string;
22
- apiKey: string;
39
+ credentials: {
40
+ username: string;
41
+ password: string;
42
+ };
43
+ timeout: number;
44
+ sessionTTL: number;
45
+ patchAdams?: {
46
+ enabled: boolean;
47
+ remoteDomain: string;
48
+ } | undefined;
49
+ }, {
50
+ baseUrl: string;
51
+ credentials: {
52
+ username: string;
53
+ password: string;
54
+ };
55
+ timeout?: number | undefined;
56
+ sessionTTL?: number | undefined;
57
+ patchAdams?: {
58
+ remoteDomain: string;
59
+ enabled?: boolean | undefined;
60
+ } | undefined;
61
+ }>;
62
+ /**
63
+ * @deprecated Use credentials instead of apiKey.
64
+ * Legacy config schema for backwards compatibility.
65
+ */
66
+ export declare const LegacyUploaderConfigSchema: z.ZodObject<{
67
+ baseUrl: z.ZodString;
68
+ apiKey: z.ZodString;
69
+ timeout: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
70
+ patchAdams: z.ZodOptional<z.ZodObject<{
71
+ enabled: z.ZodDefault<z.ZodBoolean>;
72
+ remoteDomain: z.ZodString;
73
+ }, "strip", z.ZodTypeAny, {
74
+ enabled: boolean;
75
+ remoteDomain: string;
76
+ }, {
77
+ remoteDomain: string;
78
+ enabled?: boolean | undefined;
79
+ }>>;
80
+ }, "strip", z.ZodTypeAny, {
81
+ baseUrl: string;
23
82
  timeout: number;
83
+ apiKey: string;
24
84
  patchAdams?: {
25
85
  enabled: boolean;
26
86
  remoteDomain: string;
@@ -35,6 +95,21 @@ export declare const UploaderConfigSchema: z.ZodObject<{
35
95
  } | undefined;
36
96
  }>;
37
97
  export type UploaderConfig = z.infer<typeof UploaderConfigSchema>;
98
+ export type LegacyUploaderConfig = z.infer<typeof LegacyUploaderConfigSchema>;
99
+ export interface SessionToken {
100
+ /** The session token value (Bravais-prod-us-Context cookie value) */
101
+ value: string;
102
+ /** Timestamp when the token was obtained */
103
+ obtainedAt: number;
104
+ /** Timestamp when the token expires */
105
+ expiresAt: number;
106
+ }
107
+ export interface AuthResponse {
108
+ /** Cookie name returned from authentication */
109
+ name: string;
110
+ /** Cookie/token value */
111
+ value: string;
112
+ }
38
113
  export declare const UploadOptionsSchema: z.ZodObject<{
39
114
  /** Target folder ID in LMS */
40
115
  folderId: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,oBAAoB;IAC/B,+DAA+D;;IAG/D,iDAAiD;;IAGjD,wDAAwD;;IAGxD,+CAA+C;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO/C,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAMlE,eAAO,MAAM,mBAAmB;IAC9B,8BAA8B;;IAG9B,gDAAgD;;IAGhD,+BAA+B;;IAG/B,qCAAqC;;IAGrC,gCAAgC;;IAGhC,8CAA8C;;IAG9C,8BAA8B;;IAG9B,gCAAgC;;IAGhC,gCAAgC;;IAGhC,6BAA6B;;IAG7B,wBAAwB;;IAGxB,gCAAgC;;IAGhC,0CAA0C;;IAG1C,wCAAwC;;IAGxC,6CAA6C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAE7C,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAMhE,eAAO,MAAM,0BAA0B;IACrC,2CAA2C;;IAG3C,6BAA6B;;IAG7B,qCAAqC;;IAGrC,gCAAgC;;IAGhC,8BAA8B;;IAG9B,8BAA8B;;IAG9B,wBAAwB;;IAGxB,gCAAgC;;IAGhC,0CAA0C;;IAG1C,wCAAwC;;IAGxC,6CAA6C;;;;;;;;;;;;;;;;;;;;;;;;;;EAE7C,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAM9E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,iBAAiB,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,eAAe,CAAC;IAC/B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VersionUploadOptionsSchema = exports.UploadOptionsSchema = exports.UploaderConfigSchema = void 0;
3
+ exports.VersionUploadOptionsSchema = exports.UploadOptionsSchema = exports.LegacyUploaderConfigSchema = exports.UploaderConfigSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  // =============================================================================
6
6
  // Configuration Schema
7
7
  // =============================================================================
8
8
  exports.UploaderConfigSchema = zod_1.z.object({
9
- /** Base URL for the LMS API (e.g., https://lms.example.com) */
9
+ /** Base URL for the LMS API (e.g., https://core-company.bravais.com) */
10
10
  baseUrl: zod_1.z.string().url(),
11
- /** API key or Bearer token for authentication */
12
- apiKey: zod_1.z.string().min(1),
11
+ /**
12
+ * Authentication credentials for the Bravais API.
13
+ * The client will authenticate and manage session tokens automatically.
14
+ */
15
+ credentials: zod_1.z.object({
16
+ username: zod_1.z.string().min(1),
17
+ password: zod_1.z.string().min(1),
18
+ }),
13
19
  /** Optional timeout in milliseconds (default: 30000) */
14
20
  timeout: zod_1.z.number().positive().optional().default(30000),
21
+ /**
22
+ * Session token TTL in milliseconds (default: 1800000 = 30 minutes).
23
+ * Tokens will be refreshed automatically before expiration.
24
+ */
25
+ sessionTTL: zod_1.z.number().positive().optional().default(1800000),
15
26
  /** Optional: Enable patch-adams integration */
16
27
  patchAdams: zod_1.z
17
28
  .object({
@@ -20,6 +31,21 @@ exports.UploaderConfigSchema = zod_1.z.object({
20
31
  })
21
32
  .optional(),
22
33
  });
34
+ /**
35
+ * @deprecated Use credentials instead of apiKey.
36
+ * Legacy config schema for backwards compatibility.
37
+ */
38
+ exports.LegacyUploaderConfigSchema = zod_1.z.object({
39
+ baseUrl: zod_1.z.string().url(),
40
+ apiKey: zod_1.z.string().min(1),
41
+ timeout: zod_1.z.number().positive().optional().default(30000),
42
+ patchAdams: zod_1.z
43
+ .object({
44
+ enabled: zod_1.z.boolean().default(true),
45
+ remoteDomain: zod_1.z.string().url(),
46
+ })
47
+ .optional(),
48
+ });
23
49
  // =============================================================================
24
50
  // Upload Options
25
51
  // =============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,18 +1,22 @@
1
1
  {
2
2
  "name": "@package-uploader/core",
3
- "version": "1.0.2",
3
+ "version": "1.3.0",
4
4
  "description": "Patch and upload Rise courses to LMS platforms",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
8
- "package-upload": "./dist/cli.js"
8
+ "package-upload": "./dist/cli.js",
9
+ "package-upload-server": "./dist/server.js"
9
10
  },
10
11
  "files": [
11
- "dist"
12
+ "dist",
13
+ "public",
14
+ ".env.example"
12
15
  ],
13
16
  "scripts": {
14
17
  "build": "tsc",
15
18
  "dev": "tsc --watch",
19
+ "server": "node dist/server.js",
16
20
  "lint": "eslint src --ext .ts",
17
21
  "test": "vitest",
18
22
  "prepublishOnly": "npm run build"
@@ -35,11 +39,18 @@
35
39
  },
36
40
  "dependencies": {
37
41
  "commander": "^12.0.0",
42
+ "cors": "^2.8.5",
43
+ "dotenv": "^16.3.1",
44
+ "express": "^4.18.2",
38
45
  "form-data": "^4.0.0",
46
+ "multer": "^1.4.5-lts.1",
39
47
  "node-fetch": "^3.3.2",
40
48
  "zod": "^3.22.4"
41
49
  },
42
50
  "devDependencies": {
51
+ "@types/cors": "^2.8.17",
52
+ "@types/express": "^4.17.21",
53
+ "@types/multer": "^1.4.11",
43
54
  "@types/node": "^20.11.0",
44
55
  "typescript": "^5.3.3",
45
56
  "vitest": "^1.2.0"
@@ -0,0 +1 @@
1
+ :root{--color-primary: #2563eb;--color-primary-hover: #1d4ed8;--color-success: #10b981;--color-error: #ef4444;--color-warning: #f59e0b;--color-bg: #ffffff;--color-bg-secondary: #f9fafb;--color-border: #e5e7eb;--color-text: #111827;--color-text-muted: #6b7280;--radius: 8px;--shadow: 0 1px 3px rgba(0, 0, 0, .1);--shadow-lg: 0 4px 6px rgba(0, 0, 0, .1)}*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background:var(--color-bg-secondary);color:var(--color-text);line-height:1.5}.app{min-height:100vh;display:flex;flex-direction:column}.header{background:var(--color-bg);border-bottom:1px solid var(--color-border);padding:1rem 2rem;display:flex;align-items:center;justify-content:space-between}.header h1{font-size:1.25rem;font-weight:600}.nav{display:flex;gap:1rem}.nav a{color:var(--color-text-muted);text-decoration:none;padding:.5rem 1rem;border-radius:var(--radius);transition:all .2s}.nav a:hover,.nav a.active{color:var(--color-primary);background:#2563eb1a}.main{flex:1;padding:2rem;max-width:1200px;margin:0 auto;width:100%}.card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius);padding:1.5rem;box-shadow:var(--shadow)}.card+.card{margin-top:1rem}.card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.card-title{font-size:1.125rem;font-weight:600}.btn{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:var(--radius);border:none;font-size:.875rem;font-weight:500;cursor:pointer;transition:all .2s}.btn-primary{background:var(--color-primary);color:#fff}.btn-primary:hover{background:var(--color-primary-hover)}.btn-secondary{background:var(--color-bg);border:1px solid var(--color-border);color:var(--color-text)}.btn-secondary:hover{background:var(--color-bg-secondary)}.btn:disabled{opacity:.5;cursor:not-allowed}.dropzone{border:2px dashed var(--color-border);border-radius:var(--radius);padding:3rem;text-align:center;cursor:pointer;transition:all .2s}.dropzone:hover,.dropzone.active{border-color:var(--color-primary);background:#2563eb0d}.dropzone p{color:var(--color-text-muted);margin-top:.5rem}.file-list{margin-top:1rem}.file-item{display:flex;align-items:center;justify-content:space-between;padding:.75rem;border:1px solid var(--color-border);border-radius:var(--radius);margin-bottom:.5rem}.file-item .name{font-weight:500}.file-item .size{color:var(--color-text-muted);font-size:.875rem}.file-item .status{display:flex;align-items:center;gap:.5rem}.status-pending{color:var(--color-text-muted)}.status-uploading{color:var(--color-primary)}.status-success{color:var(--color-success)}.status-error{color:var(--color-error)}.document-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1rem}.document-card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius);padding:1rem;transition:all .2s}.document-card:hover{box-shadow:var(--shadow-lg)}.document-card .title{font-weight:600;margin-bottom:.25rem}.document-card .meta{color:var(--color-text-muted);font-size:.875rem;margin-bottom:.75rem}.document-card .actions{display:flex;gap:.5rem}.folder-tree{border:1px solid var(--color-border);border-radius:var(--radius);padding:1rem;max-height:400px;overflow-y:auto}.folder-item{padding:.5rem;cursor:pointer;border-radius:var(--radius);display:flex;align-items:center;gap:.5rem}.folder-item:hover{background:var(--color-bg-secondary)}.folder-item.selected{background:#2563eb1a;color:var(--color-primary)}.folder-item .icon{font-size:1.25rem}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal{background:var(--color-bg);border-radius:var(--radius);padding:1.5rem;max-width:500px;width:90%;max-height:80vh;overflow-y:auto}.modal-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.modal-title{font-size:1.125rem;font-weight:600}.modal-close{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-text-muted)}.form-group{margin-bottom:1rem}.form-label{display:block;font-weight:500;margin-bottom:.25rem}.form-input,.form-select{width:100%;padding:.5rem;border:1px solid var(--color-border);border-radius:var(--radius);font-size:1rem}.form-input:focus,.form-select:focus{outline:none;border-color:var(--color-primary)}.spinner{width:20px;height:20px;border:2px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:3rem;color:var(--color-text-muted)}.empty-state h3{color:var(--color-text);margin-bottom:.5rem}.alert{padding:1rem;border-radius:var(--radius);margin-bottom:1rem}.alert-success{background:#10b9811a;border:1px solid var(--color-success);color:var(--color-success)}.alert-error{background:#ef44441a;border:1px solid var(--color-error);color:var(--color-error)}.alert-warning{background:#f59e0b1a;border:1px solid var(--color-warning);color:var(--color-warning)}