super-memory-pro 0.2.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 (107) hide show
  1. package/README.md +247 -0
  2. package/dist/config.d.ts +6 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +25 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/db/connection.d.ts +20 -0
  7. package/dist/db/connection.d.ts.map +1 -0
  8. package/dist/db/connection.js +66 -0
  9. package/dist/db/connection.js.map +1 -0
  10. package/dist/db/migrations/001_initial.sql +102 -0
  11. package/dist/db/migrations.d.ts +14 -0
  12. package/dist/db/migrations.d.ts.map +1 -0
  13. package/dist/db/migrations.js +86 -0
  14. package/dist/db/migrations.js.map +1 -0
  15. package/dist/db/queries.d.ts +24 -0
  16. package/dist/db/queries.d.ts.map +1 -0
  17. package/dist/db/queries.js +179 -0
  18. package/dist/db/queries.js.map +1 -0
  19. package/dist/hooks/event-handler.d.ts +13 -0
  20. package/dist/hooks/event-handler.d.ts.map +1 -0
  21. package/dist/hooks/event-handler.js +80 -0
  22. package/dist/hooks/event-handler.js.map +1 -0
  23. package/dist/hooks/index.d.ts +4 -0
  24. package/dist/hooks/index.d.ts.map +1 -0
  25. package/dist/hooks/index.js +7 -0
  26. package/dist/hooks/index.js.map +1 -0
  27. package/dist/hooks/message-handler.d.ts +13 -0
  28. package/dist/hooks/message-handler.d.ts.map +1 -0
  29. package/dist/hooks/message-handler.js +47 -0
  30. package/dist/hooks/message-handler.js.map +1 -0
  31. package/dist/hooks/session-compactor.d.ts +15 -0
  32. package/dist/hooks/session-compactor.d.ts.map +1 -0
  33. package/dist/hooks/session-compactor.js +40 -0
  34. package/dist/hooks/session-compactor.js.map +1 -0
  35. package/dist/hooks/system-transform.d.ts +27 -0
  36. package/dist/hooks/system-transform.d.ts.map +1 -0
  37. package/dist/hooks/system-transform.js +76 -0
  38. package/dist/hooks/system-transform.js.map +1 -0
  39. package/dist/hooks/tool-handler.d.ts +14 -0
  40. package/dist/hooks/tool-handler.d.ts.map +1 -0
  41. package/dist/hooks/tool-handler.js +94 -0
  42. package/dist/hooks/tool-handler.js.map +1 -0
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +152 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/installer/index.d.ts +19 -0
  48. package/dist/installer/index.d.ts.map +1 -0
  49. package/dist/installer/index.js +553 -0
  50. package/dist/installer/index.js.map +1 -0
  51. package/dist/memory/extractor.d.ts +29 -0
  52. package/dist/memory/extractor.d.ts.map +1 -0
  53. package/dist/memory/extractor.js +426 -0
  54. package/dist/memory/extractor.js.map +1 -0
  55. package/dist/memory/index.d.ts +7 -0
  56. package/dist/memory/index.d.ts.map +1 -0
  57. package/dist/memory/index.js +7 -0
  58. package/dist/memory/index.js.map +1 -0
  59. package/dist/memory/processor.d.ts +50 -0
  60. package/dist/memory/processor.d.ts.map +1 -0
  61. package/dist/memory/processor.js +199 -0
  62. package/dist/memory/processor.js.map +1 -0
  63. package/dist/memory/search.d.ts +35 -0
  64. package/dist/memory/search.d.ts.map +1 -0
  65. package/dist/memory/search.js +170 -0
  66. package/dist/memory/search.js.map +1 -0
  67. package/dist/memory/store.d.ts +32 -0
  68. package/dist/memory/store.d.ts.map +1 -0
  69. package/dist/memory/store.js +112 -0
  70. package/dist/memory/store.js.map +1 -0
  71. package/dist/server/index.d.ts +16 -0
  72. package/dist/server/index.d.ts.map +1 -0
  73. package/dist/server/index.js +49 -0
  74. package/dist/server/index.js.map +1 -0
  75. package/dist/server/middleware/async-handler.d.ts +11 -0
  76. package/dist/server/middleware/async-handler.d.ts.map +1 -0
  77. package/dist/server/middleware/async-handler.js +14 -0
  78. package/dist/server/middleware/async-handler.js.map +1 -0
  79. package/dist/server/middleware/error-handler.d.ts +11 -0
  80. package/dist/server/middleware/error-handler.d.ts.map +1 -0
  81. package/dist/server/middleware/error-handler.js +18 -0
  82. package/dist/server/middleware/error-handler.js.map +1 -0
  83. package/dist/server/routes/health.d.ts +2 -0
  84. package/dist/server/routes/health.d.ts.map +1 -0
  85. package/dist/server/routes/health.js +25 -0
  86. package/dist/server/routes/health.js.map +1 -0
  87. package/dist/server/routes/memory.d.ts +2 -0
  88. package/dist/server/routes/memory.d.ts.map +1 -0
  89. package/dist/server/routes/memory.js +139 -0
  90. package/dist/server/routes/memory.js.map +1 -0
  91. package/dist/server/schemas.d.ts +51 -0
  92. package/dist/server/schemas.d.ts.map +1 -0
  93. package/dist/server/schemas.js +23 -0
  94. package/dist/server/schemas.js.map +1 -0
  95. package/dist/tools/definitions.d.ts +130 -0
  96. package/dist/tools/definitions.d.ts.map +1 -0
  97. package/dist/tools/definitions.js +78 -0
  98. package/dist/tools/definitions.js.map +1 -0
  99. package/dist/tools/index.d.ts +32 -0
  100. package/dist/tools/index.d.ts.map +1 -0
  101. package/dist/tools/index.js +148 -0
  102. package/dist/tools/index.js.map +1 -0
  103. package/dist/types.d.ts +108 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +12 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +70 -0
@@ -0,0 +1,553 @@
1
+ // ─── Ultra Memory Cross-Platform Installer ────────────────────────────────────────
2
+ // Detects platform, installs PostgreSQL if needed, creates database, runs migrations,
3
+ // and performs a health check. Runnable via `npx tsx src/installer/index.ts`.
4
+ // ─────────────────────────────────────────────────────────────────────────────────
5
+ import { execSync } from 'node:child_process';
6
+ import pg from 'pg';
7
+ import { loadConfig } from '../config.js';
8
+ import { createAdminPool } from '../db/connection.js';
9
+ import { runMigrations } from '../db/migrations.js';
10
+ // ─── ANSI Color Helpers ──────────────────────────────────────────────────────────
11
+ const C = {
12
+ green: '\x1b[32m',
13
+ red: '\x1b[31m',
14
+ yellow: '\x1b[33m',
15
+ cyan: '\x1b[36m',
16
+ bold: '\x1b[1m',
17
+ dim: '\x1b[2m',
18
+ reset: '\x1b[0m',
19
+ };
20
+ function log(step, status, message) {
21
+ const icon = status === 'ok' ? '✓' :
22
+ status === 'fail' ? '✗' :
23
+ status === 'warn' ? '⚠' : '→';
24
+ const color = status === 'ok' ? C.green :
25
+ status === 'fail' ? C.red :
26
+ status === 'warn' ? C.yellow : C.cyan;
27
+ console.log(`[UltraMemory] ${color}${icon}${C.reset} ${C.bold}${step}${C.reset}: ${message}`);
28
+ }
29
+ // ─── Shell Command Runner ────────────────────────────────────────────────────────
30
+ function runCommand(command, timeout = 120_000) {
31
+ try {
32
+ const stdout = execSync(command, {
33
+ encoding: 'utf-8',
34
+ timeout,
35
+ windowsHide: true,
36
+ stdio: 'pipe',
37
+ });
38
+ return { stdout: stdout.trim(), stderr: '', exitCode: 0 };
39
+ }
40
+ catch (err) {
41
+ const e = err;
42
+ return {
43
+ stdout: (e.stdout?.toString() ?? '').trim(),
44
+ stderr: (e.stderr?.toString() ?? '').trim(),
45
+ exitCode: e.status ?? 1,
46
+ };
47
+ }
48
+ }
49
+ function sleep(ms) {
50
+ return new Promise((resolve) => setTimeout(resolve, ms));
51
+ }
52
+ /**
53
+ * Get the current system username.
54
+ * Falls back from $USER env var to `whoami` to 'postgres' default.
55
+ */
56
+ function getSystemUser() {
57
+ if (process.env.USER)
58
+ return process.env.USER;
59
+ if (process.env.USERNAME)
60
+ return process.env.USERNAME;
61
+ const result = runCommand('whoami 2>/dev/null');
62
+ if (result.exitCode === 0 && result.stdout) {
63
+ return result.stdout;
64
+ }
65
+ return 'postgres';
66
+ }
67
+ // ─── Step 1: Platform Detection ──────────────────────────────────────────────────
68
+ /**
69
+ * Detect the current platform:
70
+ * - Termux (Android) → 'termux' (via $PREFIX env check)
71
+ * - macOS → 'darwin'
72
+ * - Linux → 'linux'
73
+ * - Windows → 'windows'
74
+ * - Unknown → 'unknown'
75
+ */
76
+ function detectPlatform() {
77
+ // Termux sets $PREFIX to /data/data/com.termux/files/usr
78
+ if (process.env.PREFIX?.includes('com.termux')) {
79
+ return 'termux';
80
+ }
81
+ switch (process.platform) {
82
+ case 'darwin':
83
+ return 'darwin';
84
+ case 'linux':
85
+ return 'linux';
86
+ case 'win32':
87
+ return 'windows';
88
+ default:
89
+ return 'unknown';
90
+ }
91
+ }
92
+ const LINUX_PM_CANDIDATES = [
93
+ { name: 'apt-get', installCmd: 'apt-get install -y', checkCmd: 'command -v apt-get' },
94
+ { name: 'dnf', installCmd: 'dnf install -y', checkCmd: 'command -v dnf' },
95
+ { name: 'yum', installCmd: 'yum install -y', checkCmd: 'command -v yum' },
96
+ { name: 'apk', installCmd: 'apk add', checkCmd: 'command -v apk' },
97
+ { name: 'zypper', installCmd: 'zypper install -y', checkCmd: 'command -v zypper' },
98
+ ];
99
+ const DARWIN_PM_CANDIDATES = [
100
+ { name: 'brew', installCmd: 'brew install', checkCmd: 'command -v brew' },
101
+ ];
102
+ /**
103
+ * Detect the system package manager and return its metadata.
104
+ *
105
+ * - Termux: always `pkg` (no sudo)
106
+ * - macOS: `brew` (no sudo, Homebrew rejects it)
107
+ * - Linux: scans apt-get / dnf / yum / apk / zypper (sudo if available)
108
+ * - Windows: reports unavailable (install guide printed instead)
109
+ */
110
+ function detectPackageManager(platform) {
111
+ // ── Termux ──────────────────────────────────────────────────────────────
112
+ if (platform === 'termux') {
113
+ const available = runCommand('command -v pkg').exitCode === 0;
114
+ return { name: 'pkg', installCmd: 'pkg install', available, requiresSudo: false };
115
+ }
116
+ // ── Windows ─────────────────────────────────────────────────────────────
117
+ if (platform === 'windows') {
118
+ return {
119
+ name: 'unknown',
120
+ installCmd: '',
121
+ available: false,
122
+ requiresSudo: false,
123
+ };
124
+ }
125
+ // ── Darwin / Linux ──────────────────────────────────────────────────────
126
+ const candidates = platform === 'darwin' ? DARWIN_PM_CANDIDATES : LINUX_PM_CANDIDATES;
127
+ // Check if passwordless sudo is available (skip on termux/windows)
128
+ const sudoAvailable = runCommand('sudo -n true 2>/dev/null').exitCode === 0;
129
+ for (const { name, installCmd, checkCmd } of candidates) {
130
+ if (runCommand(checkCmd).exitCode !== 0)
131
+ continue;
132
+ // Homebrew explicitly warns against sudo — never prefix with it
133
+ const requiresSudo = name === 'brew' ? false : sudoAvailable;
134
+ return { name, installCmd, available: true, requiresSudo };
135
+ }
136
+ return { name: 'unknown', installCmd: '', available: false, requiresSudo: false };
137
+ }
138
+ /**
139
+ * Check whether PostgreSQL is already installed using three methods:
140
+ * 1. `psql --version`
141
+ * 2. `pg_isready`
142
+ * 3. `pg_config --version`
143
+ */
144
+ function checkPostgresInstalled() {
145
+ // Method 1: psql --version
146
+ const psql = runCommand('psql --version 2>/dev/null');
147
+ if (psql.exitCode === 0 && psql.stdout.length > 0) {
148
+ return { installed: true, version: psql.stdout };
149
+ }
150
+ // Method 2: pg_isready
151
+ const ready = runCommand('pg_isready 2>/dev/null');
152
+ if (ready.exitCode === 0) {
153
+ return { installed: true, version: 'PostgreSQL (detected via pg_isready)' };
154
+ }
155
+ // Method 3: pg_config --version
156
+ const pgConfig = runCommand('pg_config --version 2>/dev/null');
157
+ if (pgConfig.exitCode === 0 && pgConfig.stdout.length > 0) {
158
+ return { installed: true, version: pgConfig.stdout };
159
+ }
160
+ return { installed: false, version: null };
161
+ }
162
+ // ─── Step 4: PostgreSQL Install + Start ──────────────────────────────────────────
163
+ /** PostgreSQL package name per package manager */
164
+ const PG_PACKAGES = {
165
+ 'apt-get': 'postgresql postgresql-contrib',
166
+ dnf: 'postgresql-server postgresql-contrib',
167
+ yum: 'postgresql-server postgresql-contrib',
168
+ apk: 'postgresql',
169
+ zypper: 'postgresql-server postgresql',
170
+ brew: 'postgresql@17',
171
+ pkg: 'postgresql',
172
+ };
173
+ /**
174
+ * Build the full install command, optionally prefixed with sudo.
175
+ */
176
+ function getInstallCommand(pm) {
177
+ const pgPkg = PG_PACKAGES[pm.name] ?? 'postgresql';
178
+ const cmd = `${pm.installCmd} ${pgPkg}`;
179
+ return pm.requiresSudo ? `sudo ${cmd}` : cmd;
180
+ }
181
+ /**
182
+ * Return a list of shell commands to start PostgreSQL after install.
183
+ * Each is tried in order; the first that succeeds is used.
184
+ */
185
+ function getPostStartCommands(platform) {
186
+ switch (platform) {
187
+ case 'termux': {
188
+ const prefix = process.env.PREFIX ?? '/data/data/com.termux/files/usr';
189
+ const dataDir = `${prefix}/var/lib/postgresql`;
190
+ const logFile = `${prefix}/var/log/postgresql.log`;
191
+ return [
192
+ // InitDB if data directory does not exist yet
193
+ // Use C locale to avoid locale issues in Termux
194
+ `if [ ! -f "${dataDir}/PG_VERSION" ]; then initdb -D "${dataDir}" --locale=C 2>/dev/null || initdb -D "${dataDir}" 2>/dev/null; fi`,
195
+ // Start PostgreSQL
196
+ `pg_ctl -D "${dataDir}" -l "${logFile}" start 2>/dev/null || true`,
197
+ ];
198
+ }
199
+ case 'darwin': {
200
+ return [
201
+ 'brew services start postgresql@17 2>/dev/null || brew services start postgresql 2>/dev/null || pg_ctl -D /usr/local/var/postgresql@17 start 2>/dev/null || pg_ctl -D /opt/homebrew/var/postgresql@17 start 2>/dev/null || true',
202
+ ];
203
+ }
204
+ case 'linux': {
205
+ return [
206
+ // Try systemd first
207
+ `systemctl start postgresql 2>/dev/null || systemctl start postgresql@17-main 2>/dev/null || systemctl start postgresql@16-main 2>/dev/null || systemctl start postgresql@15-main 2>/dev/null || systemctl start postgresql@14-main 2>/dev/null || true`,
208
+ // Fall back to sysvinit / service
209
+ `service postgresql start 2>/dev/null || true`,
210
+ // Fall back to pg_ctlcluster
211
+ `pg_ctlcluster 17 main start 2>/dev/null || pg_ctlcluster 16 main start 2>/dev/null || pg_ctlcluster 15 main start 2>/dev/null || pg_ctlcluster 14 main start 2>/dev/null || true`,
212
+ ];
213
+ }
214
+ default:
215
+ return [];
216
+ }
217
+ }
218
+ /**
219
+ * Wait for PostgreSQL to accept connections (poll pg_isready).
220
+ * Throws if not ready within the timeout.
221
+ */
222
+ async function waitForPostgres(timeout = 30_000) {
223
+ const deadline = Date.now() + timeout;
224
+ while (Date.now() < deadline) {
225
+ const r = runCommand('pg_isready 2>/dev/null');
226
+ if (r.exitCode === 0 && r.stdout.includes('accepting connections')) {
227
+ return;
228
+ }
229
+ // Also treat "accepting connections" match without explicit exit code
230
+ if (r.stdout.includes('accepting connections')) {
231
+ return;
232
+ }
233
+ await sleep(1000);
234
+ }
235
+ // One last try with visible error
236
+ const last = runCommand('pg_isready');
237
+ throw new Error(`PostgreSQL did not become ready within ${(timeout / 1000).toFixed(0)}s.\n` +
238
+ ` Last pg_isready: ${last.stdout || last.stderr || '(no output)'}\n` +
239
+ ` Check the PostgreSQL logs and ensure the service started correctly.`);
240
+ }
241
+ /**
242
+ * Install PostgreSQL via the detected package manager, then start and wait.
243
+ */
244
+ async function installPostgresql(pm, platform) {
245
+ log('Install PostgreSQL', 'info', `Installing PostgreSQL via ${pm.name}...`);
246
+ const installCmd = getInstallCommand(pm);
247
+ log('Install PostgreSQL', 'info', `Running: ${installCmd}`);
248
+ const result = runCommand(installCmd, 300_000); // 5 min for large downloads
249
+ if (result.exitCode !== 0) {
250
+ throw new Error(`Failed to install PostgreSQL.\n` +
251
+ ` Command: ${installCmd}\n` +
252
+ ` Error: ${result.stderr || result.stdout || 'Unknown error'}\n` +
253
+ ` Try installing manually: ${installCmd}`);
254
+ }
255
+ log('Install PostgreSQL', 'ok', 'PostgreSQL installed successfully');
256
+ // Start PostgreSQL service
257
+ log('Install PostgreSQL', 'info', 'Starting PostgreSQL service...');
258
+ const startCmds = getPostStartCommands(platform);
259
+ for (const cmd of startCmds) {
260
+ runCommand(cmd, 30_000);
261
+ }
262
+ await waitForPostgres();
263
+ log('Install PostgreSQL', 'ok', 'PostgreSQL is running and accepting connections');
264
+ }
265
+ // ─── Step 5: Create Database ─────────────────────────────────────────────────────
266
+ /**
267
+ * Ensure the `ultra_memory` database exists.
268
+ *
269
+ * Tries three strategies in order:
270
+ * 1. Connect via node-postgres admin pool
271
+ * 2. CLI `createdb` (if node-postgres auth fails)
272
+ * 3. `sudo -u postgres createdb` (as last resort)
273
+ */
274
+ async function createDatabase(config) {
275
+ log('Create Database', 'info', `Ensuring '${config.db.database}' database exists...`);
276
+ // ── Strategy 1: node-postgres admin pool ──────────────────────────────
277
+ const adminPool = createAdminPool(config);
278
+ try {
279
+ const result = await adminPool.query(`SELECT 1 FROM pg_database WHERE datname = $1`, [config.db.database]);
280
+ if (result.rowCount && result.rowCount > 0) {
281
+ log('Create Database', 'ok', `Database '${config.db.database}' already exists`);
282
+ return;
283
+ }
284
+ await adminPool.query(`CREATE DATABASE "${config.db.database}"`);
285
+ log('Create Database', 'ok', `Database '${config.db.database}' created via SQL`);
286
+ return;
287
+ }
288
+ catch (err) {
289
+ const msg = err instanceof Error ? err.message : String(err);
290
+ log('Create Database', 'warn', `node-postgres create failed: ${msg}`);
291
+ // Fall through to CLI strategies
292
+ }
293
+ finally {
294
+ await adminPool.end().catch(() => { });
295
+ }
296
+ // ── Strategy 2: CLI `createdb` ────────────────────────────────────────
297
+ const cliResult = runCommand(`createdb "${config.db.database}" 2>/dev/null`);
298
+ if (cliResult.exitCode === 0) {
299
+ log('Create Database', 'ok', `Database '${config.db.database}' created via createdb`);
300
+ return;
301
+ }
302
+ // ── Strategy 3: sudo -u postgres createdb ─────────────────────────────
303
+ const sudoResult = runCommand(`sudo -u postgres createdb "${config.db.database}" 2>/dev/null`);
304
+ if (sudoResult.exitCode === 0) {
305
+ log('Create Database', 'ok', `Database '${config.db.database}' created via sudo`);
306
+ return;
307
+ }
308
+ throw new Error(`Failed to create database '${config.db.database}'.\n` +
309
+ ` Tried: node-postgres SQL, createdb, sudo -u postgres createdb\n` +
310
+ ` Create it manually: sudo -u postgres createdb "${config.db.database}"\n` +
311
+ ` Then re-run the installer.`);
312
+ }
313
+ // ─── Step 6: Run Migrations ──────────────────────────────────────────────────────
314
+ /**
315
+ * Run pending database schema migrations.
316
+ */
317
+ async function runDatabaseMigrations(pool) {
318
+ log('Run Migrations', 'info', 'Running schema migrations...');
319
+ const applied = await runMigrations(pool);
320
+ if (applied.length === 0) {
321
+ log('Run Migrations', 'ok', 'All migrations already applied');
322
+ }
323
+ else {
324
+ log('Run Migrations', 'ok', `Applied ${applied.length} migration(s): ${applied.join(', ')}`);
325
+ }
326
+ return applied;
327
+ }
328
+ const EXPECTED_TABLES = ['_migrations', 'projects', 'sessions', 'memories'];
329
+ /**
330
+ * Verify the database is operational and all expected tables exist.
331
+ */
332
+ async function healthCheck(pool) {
333
+ log('Health Check', 'info', 'Running health checks...');
334
+ const result = {
335
+ overall: false,
336
+ dbReachable: false,
337
+ existingTables: [],
338
+ missingTables: [],
339
+ };
340
+ // ── Database reachability ──────────────────────────────────────────────
341
+ try {
342
+ const selectResult = await pool.query('SELECT 1 AS ok');
343
+ result.dbReachable = selectResult.rows[0]?.ok === 1;
344
+ log('Health Check', result.dbReachable ? 'ok' : 'fail', result.dbReachable
345
+ ? 'Database is reachable (SELECT 1 OK)'
346
+ : 'Database unreachable — SELECT 1 returned unexpected value');
347
+ }
348
+ catch (err) {
349
+ const msg = err instanceof Error ? err.message : String(err);
350
+ log('Health Check', 'fail', `Database unreachable: ${msg}`);
351
+ result.overall = false;
352
+ return result;
353
+ }
354
+ // ── Table existence ────────────────────────────────────────────────────
355
+ for (const table of EXPECTED_TABLES) {
356
+ try {
357
+ const tblResult = await pool.query(`SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`, [table]);
358
+ const exists = tblResult.rows[0]?.exists === true;
359
+ if (exists) {
360
+ result.existingTables.push(table);
361
+ log('Health Check', 'ok', `Table '${table}' exists`);
362
+ }
363
+ else {
364
+ result.missingTables.push(table);
365
+ log('Health Check', 'fail', `Table '${table}' NOT found`);
366
+ }
367
+ }
368
+ catch {
369
+ result.missingTables.push(table);
370
+ log('Health Check', 'fail', `Table '${table}' check failed`);
371
+ }
372
+ }
373
+ result.overall = result.dbReachable && result.missingTables.length === 0;
374
+ log('Health Check', result.overall ? 'ok' : 'fail', result.overall ? 'All checks passed' : `${result.missingTables.length} table(s) missing`);
375
+ return result;
376
+ }
377
+ // ─── Step 8: Print Summary ───────────────────────────────────────────────────────
378
+ function printSummary(steps, success) {
379
+ const line = '─'.repeat(50);
380
+ console.log(`\n${C.bold}${line}${C.reset}`);
381
+ console.log(`${C.bold} Ultra Memory — Installation ${success ? 'Complete' : 'Failed'}${C.reset}`);
382
+ console.log(`${C.bold}${line}${C.reset}\n`);
383
+ for (const step of steps) {
384
+ const icon = step.startsWith('✓') ? `${C.green}✓${C.reset}` :
385
+ step.startsWith('✗') ? `${C.red}✗${C.reset}` :
386
+ step.startsWith('⚠') ? `${C.yellow}⚠${C.reset}` : `${C.cyan}→${C.reset}`;
387
+ console.log(` ${icon} ${step.replace(/^[✓✗⚠→]\s*/, '')}`);
388
+ }
389
+ console.log(`\n${C.bold}${line}${C.reset}`);
390
+ if (success) {
391
+ console.log(` ${C.green}${C.bold}✓ Ultra Memory installed successfully${C.reset}`);
392
+ }
393
+ else {
394
+ console.log(` ${C.red}${C.bold}✗ Ultra Memory installation failed${C.reset}`);
395
+ console.log(` ${C.yellow}Fix the issues above and re-run: npx tsx src/installer/index.ts${C.reset}`);
396
+ }
397
+ console.log(`${C.bold}${line}${C.reset}\n`);
398
+ }
399
+ /**
400
+ * Run the full installation pipeline:
401
+ *
402
+ * 1. Detect platform
403
+ * 2. Detect package manager
404
+ * 3. Check PostgreSQL installed
405
+ * 4. Install PostgreSQL (if needed)
406
+ * 5. Create ultra_memory database
407
+ * 6. Run schema migrations
408
+ * 7. Health check
409
+ *
410
+ * Returns a summary with success status and step log.
411
+ */
412
+ export async function runInstaller() {
413
+ const steps = [];
414
+ console.log(`\n${C.bold}${'═'.repeat(54)}${C.reset}`);
415
+ console.log(`${C.bold} Ultra Memory — Cross-Platform Installer${C.reset}`);
416
+ console.log(`${C.bold}${'═'.repeat(54)}${C.reset}\n`);
417
+ // ── Step 1: Detect Platform ───────────────────────────────────────────
418
+ const platform = detectPlatform();
419
+ steps.push(`✓ Detected platform: ${platform}`);
420
+ log('Platform', 'ok', platform);
421
+ if (platform === 'unknown') {
422
+ steps[steps.length - 1] = `✗ Detected platform: ${platform}`;
423
+ log('Platform', 'fail', `Unsupported platform '${process.platform}'. Supported: linux, darwin, termux, windows`);
424
+ return { success: false, steps };
425
+ }
426
+ // ── Step 2: Detect Package Manager ────────────────────────────────────
427
+ const pm = detectPackageManager(platform);
428
+ const pmNote = pm.available
429
+ ? `${pm.name}${pm.requiresSudo ? ' (with sudo)' : ''}`
430
+ : 'none found';
431
+ steps.push(`✓ Package manager: ${pmNote}`);
432
+ log('Package Manager', pm.available ? 'ok' : 'warn', pmNote);
433
+ // ── Step 3: Check PostgreSQL Installed ────────────────────────────────
434
+ const pgCheck = checkPostgresInstalled();
435
+ if (pgCheck.installed) {
436
+ steps.push(`✓ PostgreSQL: ${pgCheck.version}`);
437
+ log('PostgreSQL', 'ok', `Already installed — ${pgCheck.version}`);
438
+ }
439
+ else {
440
+ steps.push(`→ PostgreSQL: not installed`);
441
+ log('PostgreSQL', 'info', 'Not installed');
442
+ // ── Step 4: Install PostgreSQL ──────────────────────────────────────
443
+ if (!pm.available) {
444
+ const msg = platform === 'windows'
445
+ ? 'Install PostgreSQL from https://www.postgresql.org/download/windows/'
446
+ : `No supported package manager found.\nInstall PostgreSQL manually and re-run the installer.`;
447
+ steps.push(`✗ Install PostgreSQL: no package manager available`);
448
+ log('Install PostgreSQL', 'fail', msg);
449
+ return { success: false, steps };
450
+ }
451
+ try {
452
+ await installPostgresql(pm, platform);
453
+ steps.push(`✓ Installed PostgreSQL via ${pm.name}`);
454
+ }
455
+ catch (err) {
456
+ const msg = err instanceof Error ? err.message : String(err);
457
+ steps.push(`✗ Install PostgreSQL: ${msg}`);
458
+ log('Install PostgreSQL', 'fail', msg);
459
+ return { success: false, steps };
460
+ }
461
+ }
462
+ // ── Load Config ────────────────────────────────────────────────────────
463
+ const config = loadConfig();
464
+ // On systems where USER env is not set (e.g., Termux), detect the actual user
465
+ // so we don't fall back to 'postgres' which may not exist as a role.
466
+ if (!process.env.USER && !process.env.UM_DB_USER) {
467
+ const systemUser = getSystemUser();
468
+ if (systemUser !== 'postgres') {
469
+ config.db.user = systemUser;
470
+ log('Config', 'info', `Using system user: ${systemUser} (USER env not set)`);
471
+ }
472
+ }
473
+ log('Config', 'info', `Database: ${config.db.user}@${config.db.host}:${config.db.port}/${config.db.database}`);
474
+ // ── Step 5: Create Database ───────────────────────────────────────────
475
+ try {
476
+ await createDatabase(config);
477
+ steps.push(`✓ Database '${config.db.database}' ready`);
478
+ }
479
+ catch (err) {
480
+ const msg = err instanceof Error ? err.message : String(err);
481
+ steps.push(`✗ Create database: ${msg}`);
482
+ log('Create Database', 'fail', msg);
483
+ return { success: false, steps };
484
+ }
485
+ // ── Step 6: Run Migrations ─────────────────────────────────────────────
486
+ let targetPool;
487
+ try {
488
+ targetPool = new pg.Pool({
489
+ host: config.db.host,
490
+ port: config.db.port,
491
+ database: config.db.database,
492
+ user: config.db.user,
493
+ password: config.db.password,
494
+ max: 1,
495
+ connectionTimeoutMillis: 10_000,
496
+ });
497
+ const applied = await runDatabaseMigrations(targetPool);
498
+ const appliedMsg = applied.length === 0
499
+ ? 'No pending migrations'
500
+ : `Applied: ${applied.join(', ')}`;
501
+ steps.push(`✓ Migrations: ${appliedMsg}`);
502
+ }
503
+ catch (err) {
504
+ const msg = err instanceof Error ? err.message : String(err);
505
+ steps.push(`✗ Migrations: ${msg}`);
506
+ log('Run Migrations', 'fail', msg);
507
+ if (targetPool)
508
+ await targetPool.end().catch(() => { });
509
+ return { success: false, steps };
510
+ }
511
+ // ── Step 7: Health Check ───────────────────────────────────────────────
512
+ try {
513
+ const hc = await healthCheck(targetPool);
514
+ if (hc.overall) {
515
+ steps.push(`✓ Health check passed`);
516
+ }
517
+ else {
518
+ const missing = hc.missingTables.join(', ');
519
+ steps.push(`✗ Health check: missing tables (${missing})`);
520
+ }
521
+ }
522
+ catch (err) {
523
+ const msg = err instanceof Error ? err.message : String(err);
524
+ steps.push(`✗ Health check: ${msg}`);
525
+ log('Health Check', 'fail', msg);
526
+ if (targetPool)
527
+ await targetPool.end().catch(() => { });
528
+ return { success: false, steps };
529
+ }
530
+ // ── Cleanup ────────────────────────────────────────────────────────────
531
+ if (targetPool) {
532
+ await targetPool.end().catch(() => { });
533
+ }
534
+ // ── Step 8: Print Summary ──────────────────────────────────────────────
535
+ const success = steps.every((s) => s.startsWith('✓'));
536
+ printSummary(steps, success);
537
+ return { success, steps };
538
+ }
539
+ // ─── Direct Execution ────────────────────────────────────────────────────────────
540
+ // Allow running directly: npx tsx src/installer/index.ts
541
+ const isMain = process.argv[1]?.includes('installer') ?? false;
542
+ if (isMain) {
543
+ runInstaller()
544
+ .then((r) => {
545
+ process.exit(r.success ? 0 : 1);
546
+ })
547
+ .catch((err) => {
548
+ const msg = err instanceof Error ? err.message : String(err);
549
+ console.error(`\n[UltraMemory] ${C.red}Fatal:${C.reset} ${msg}`);
550
+ process.exit(1);
551
+ });
552
+ }
553
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,sFAAsF;AACtF,8EAA8E;AAC9E,oFAAoF;AAEpF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,oFAAoF;AAEpF,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;CACR,CAAC;AAIX,SAAS,GAAG,CAAC,IAAY,EAAE,MAAgB,EAAE,OAAe;IAC1D,MAAM,IAAI,GACR,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAChC,MAAM,KAAK,GACT,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,oFAAoF;AAEpF,SAAS,UAAU,CACjB,OAAe,EACf,OAAO,GAAG,OAAO;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC/B,QAAQ,EAAE,OAAO;YACjB,OAAO;YACP,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAKT,CAAC;QACF,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAC3C,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC;SACxB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa;IACpB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,oFAAoF;AAEpF;;;;;;;GAOG;AACH,SAAS,cAAc;IACrB,yDAAyD;IACzD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAUD,MAAM,mBAAmB,GAAkB;IACzC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,oBAAoB,EAAE,QAAQ,EAAE,oBAAoB,EAAE;IACrF,EAAE,IAAI,EAAE,KAAK,EAAM,UAAU,EAAE,gBAAgB,EAAM,QAAQ,EAAE,gBAAgB,EAAE;IACjF,EAAE,IAAI,EAAE,KAAK,EAAM,UAAU,EAAE,gBAAgB,EAAM,QAAQ,EAAE,gBAAgB,EAAE;IACjF,EAAE,IAAI,EAAE,KAAK,EAAM,UAAU,EAAE,SAAS,EAAa,QAAQ,EAAE,gBAAgB,EAAE;IACjF,EAAE,IAAI,EAAE,QAAQ,EAAG,UAAU,EAAE,mBAAmB,EAAG,QAAQ,EAAE,mBAAmB,EAAE;CACrF,CAAC;AAEF,MAAM,oBAAoB,GAAkB;IAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,EAAE;CAC1E,CAAC;AAEF;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,QAAkB;IAC9C,2EAA2E;IAC3E,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACpF,CAAC;IAED,2EAA2E;IAC3E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,MAAM,UAAU,GACd,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAErE,mEAAmE;IACnE,MAAM,aAAa,GACjB,UAAU,CAAC,0BAA0B,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;IAExD,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;QACxD,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,KAAK,CAAC;YAAE,SAAS;QAClD,gEAAgE;QAChE,MAAM,YAAY,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAC7D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACpF,CAAC;AASD;;;;;GAKG;AACH,SAAS,sBAAsB;IAC7B,2BAA2B;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACnD,CAAC;IAED,uBAAuB;IACvB,MAAM,KAAK,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC;IAC9E,CAAC;IAED,gCAAgC;IAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,iCAAiC,CAAC,CAAC;IAC/D,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,oFAAoF;AAEpF,kDAAkD;AAClD,MAAM,WAAW,GAAuC;IACtD,SAAS,EAAE,+BAA+B;IAC1C,GAAG,EAAE,sCAAsC;IAC3C,GAAG,EAAE,sCAAsC;IAC3C,GAAG,EAAE,YAAY;IACjB,MAAM,EAAE,8BAA8B;IACtC,IAAI,EAAE,eAAe;IACrB,GAAG,EAAE,YAAY;CAClB,CAAC;AAEF;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAkB;IAC3C,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;IACnD,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,UAAU,IAAI,KAAK,EAAE,CAAC;IACxC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,QAAkB;IAC9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,iCAAiC,CAAC;YACvE,MAAM,OAAO,GAAG,GAAG,MAAM,qBAAqB,CAAC;YAC/C,MAAM,OAAO,GAAG,GAAG,MAAM,yBAAyB,CAAC;YACnD,OAAO;gBACL,8CAA8C;gBAC9C,gDAAgD;gBAChD,cAAc,OAAO,mCAAmC,OAAO,0CAA0C,OAAO,mBAAmB;gBACnI,mBAAmB;gBACnB,cAAc,OAAO,SAAS,OAAO,6BAA6B;aACnE,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO;gBACL,gOAAgO;aACjO,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO;gBACL,oBAAoB;gBACpB,wPAAwP;gBACxP,kCAAkC;gBAClC,8CAA8C;gBAC9C,6BAA6B;gBAC7B,kLAAkL;aACnL,CAAC;QACJ,CAAC;QACD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,OAAO,GAAG,MAAM;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACnE,OAAO;QACT,CAAC;QACD,sEAAsE;QACtE,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,kCAAkC;IAClC,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACtC,MAAM,IAAI,KAAK,CACb,0CAA0C,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACzE,sBAAsB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa,IAAI;QACrE,uEAAuE,CAC1E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAC9B,EAAkB,EAClB,QAAkB;IAElB,GAAG,CAAC,oBAAoB,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC;IAE7E,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,oBAAoB,EAAE,MAAM,EAAE,YAAY,UAAU,EAAE,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B;IAC5E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,iCAAiC;YAC/B,cAAc,UAAU,IAAI;YAC5B,YAAY,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,IAAI;YACjE,8BAA8B,UAAU,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,mCAAmC,CAAC,CAAC;IAErE,2BAA2B;IAC3B,GAAG,CAAC,oBAAoB,EAAE,MAAM,EAAE,gCAAgC,CAAC,CAAC;IAEpE,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,eAAe,EAAE,CAAC;IACxB,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,iDAAiD,CAAC,CAAC;AACrF,CAAC;AAED,oFAAoF;AAEpF;;;;;;;GAOG;AACH,KAAK,UAAU,cAAc,CAAC,MAAqC;IACjE,GAAG,CAAC,iBAAiB,EAAE,MAAM,EAAE,aAAa,MAAM,CAAC,EAAE,CAAC,QAAQ,sBAAsB,CAAC,CAAC;IAEtF,yEAAyE;IACzE,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAClC,8CAA8C,EAC9C,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CACrB,CAAC;QACF,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,EAAE,CAAC,QAAQ,kBAAkB,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QAED,MAAM,SAAS,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC;QACjE,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,EAAE,CAAC,QAAQ,mBAAmB,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,iBAAiB,EAAE,MAAM,EAAE,gCAAgC,GAAG,EAAE,CAAC,CAAC;QACtE,iCAAiC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,yEAAyE;IACzE,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,MAAM,CAAC,EAAE,CAAC,QAAQ,eAAe,CAAC,CAAC;IAC7E,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,EAAE,CAAC,QAAQ,wBAAwB,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,yEAAyE;IACzE,MAAM,UAAU,GAAG,UAAU,CAC3B,8BAA8B,MAAM,CAAC,EAAE,CAAC,QAAQ,eAAe,CAChE,CAAC;IACF,IAAI,UAAU,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,EAAE,CAAC,QAAQ,oBAAoB,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CACb,8BAA8B,MAAM,CAAC,EAAE,CAAC,QAAQ,MAAM;QACpD,mEAAmE;QACnE,oDAAoD,MAAM,CAAC,EAAE,CAAC,QAAQ,KAAK;QAC3E,8BAA8B,CACjC,CAAC;AACJ,CAAC;AAED,oFAAoF;AAEpF;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAClC,IAAa;IAEb,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,8BAA8B,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,gCAAgC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,WAAW,OAAO,CAAC,MAAM,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAWD,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE5E;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAa;IACtC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC;IAExD,MAAM,MAAM,GAAsB;QAChC,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,EAAE;QAClB,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,0EAA0E;IAC1E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACpD,GAAG,CACD,cAAc,EACd,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAClC,MAAM,CAAC,WAAW;YAChB,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,2DAA2D,CAChE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0EAA0E;IAC1E,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAChC,6EAA6E,EAC7E,CAAC,KAAK,CAAC,CACR,CAAC;YACF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;YAClD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,KAAK,aAAa,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,KAAK,gBAAgB,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;IACzE,GAAG,CACD,cAAc,EACd,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,mBAAmB,CACzF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oFAAoF;AAEpF,SAAS,YAAY,CAAC,KAAe,EAAE,OAAgB;IACrD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,iCAAiC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC9C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,wCAAwC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,kEAAkE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AASD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,4CAA4C,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAEtD,yEAAyE;IACzE,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,wBAAwB,QAAQ,EAAE,CAAC;QAC7D,GAAG,CACD,UAAU,EACV,MAAM,EACN,yBAAyB,OAAO,CAAC,QAAQ,8CAA8C,CACxF,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,yEAAyE;IACzE,MAAM,EAAE,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS;QACzB,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE;QACtD,CAAC,CAAC,YAAY,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,EAAE,CAAC,CAAC;IAC3C,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7D,yEAAyE;IACzE,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,uBAAuB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QAE3C,uEAAuE;QACvE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,GAAG,GACP,QAAQ,KAAK,SAAS;gBACpB,CAAC,CAAC,sEAAsE;gBACxE,CAAC,CAAC,4FAA4F,CAAC;YACnG,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACjE,GAAG,CAAC,oBAAoB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;YAC3C,GAAG,CAAC,oBAAoB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,8EAA8E;IAC9E,qEAAqE;IACrE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,UAAU,CAAC;YAC5B,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,sBAAsB,UAAU,qBAAqB,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/G,yEAAyE;IACzE,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,EAAE,CAAC,QAAQ,SAAS,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QACxC,GAAG,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,0EAA0E;IAC1E,IAAI,UAA+B,CAAC;IACpC,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI;YACpB,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI;YACpB,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ;YAC5B,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI;YACpB,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ;YAC5B,GAAG,EAAE,CAAC;YACN,uBAAuB,EAAE,MAAM;SAChC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,UAAU,GACd,OAAO,CAAC,MAAM,KAAK,CAAC;YAClB,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;QACnC,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,UAAU;YAAE,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,mCAAmC,OAAO,GAAG,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;QACrC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,UAAU;YAAE,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,0EAA0E;IAC1E,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,0EAA0E;IAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,oFAAoF;AACpF,yDAAyD;AAEzD,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AAElD,IAAI,MAAM,EAAE,CAAC;IACX,YAAY,EAAE;SACX,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { MemoryType } from '../types.js';
2
+ /**
3
+ * Detect technology mentions in text.
4
+ * Uses a combination of direct name matching and contextual cues.
5
+ */
6
+ export declare function extractTechStack(text: string): string[];
7
+ /**
8
+ * Extract decisions from text.
9
+ * Returns array of { decision, context } where decision is the choice made
10
+ * and context provides surrounding framing.
11
+ */
12
+ export declare function extractDecisions(text: string): {
13
+ decision: string;
14
+ context: string;
15
+ }[];
16
+ /**
17
+ * Extract user preferences from text.
18
+ */
19
+ export declare function extractUserPreferences(text: string): string[];
20
+ /**
21
+ * Extract recurring patterns — commands, workflows, and habitual actions.
22
+ */
23
+ export declare function extractPatterns(text: string): string[];
24
+ /**
25
+ * Determine the most likely MemoryType based on content heuristics.
26
+ * Checks are ordered by specificity (most distinctive patterns first).
27
+ */
28
+ export declare function classifyContent(text: string): MemoryType;
29
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsJ9C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuCvD;AAwBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAmCtF;AAoBD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB7D;AA2CD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiCtD;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAwExD"}