ctx-sync 1.0.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 (145) hide show
  1. package/dist/commands/audit.d.ts +76 -0
  2. package/dist/commands/audit.d.ts.map +1 -0
  3. package/dist/commands/audit.js +367 -0
  4. package/dist/commands/audit.js.map +1 -0
  5. package/dist/commands/config.d.ts +58 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +114 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/dir.d.ts +56 -0
  10. package/dist/commands/dir.d.ts.map +1 -0
  11. package/dist/commands/dir.js +172 -0
  12. package/dist/commands/dir.js.map +1 -0
  13. package/dist/commands/docker.d.ts +140 -0
  14. package/dist/commands/docker.d.ts.map +1 -0
  15. package/dist/commands/docker.js +380 -0
  16. package/dist/commands/docker.js.map +1 -0
  17. package/dist/commands/env.d.ts +96 -0
  18. package/dist/commands/env.d.ts.map +1 -0
  19. package/dist/commands/env.js +352 -0
  20. package/dist/commands/env.js.map +1 -0
  21. package/dist/commands/init.d.ts +89 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +272 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/key.d.ts +92 -0
  26. package/dist/commands/key.d.ts.map +1 -0
  27. package/dist/commands/key.js +274 -0
  28. package/dist/commands/key.js.map +1 -0
  29. package/dist/commands/list.d.ts +38 -0
  30. package/dist/commands/list.d.ts.map +1 -0
  31. package/dist/commands/list.js +84 -0
  32. package/dist/commands/list.js.map +1 -0
  33. package/dist/commands/note.d.ts +151 -0
  34. package/dist/commands/note.d.ts.map +1 -0
  35. package/dist/commands/note.js +411 -0
  36. package/dist/commands/note.js.map +1 -0
  37. package/dist/commands/pull.d.ts +47 -0
  38. package/dist/commands/pull.d.ts.map +1 -0
  39. package/dist/commands/pull.js +94 -0
  40. package/dist/commands/pull.js.map +1 -0
  41. package/dist/commands/push.d.ts +40 -0
  42. package/dist/commands/push.d.ts.map +1 -0
  43. package/dist/commands/push.js +94 -0
  44. package/dist/commands/push.js.map +1 -0
  45. package/dist/commands/restore.d.ts +116 -0
  46. package/dist/commands/restore.d.ts.map +1 -0
  47. package/dist/commands/restore.js +336 -0
  48. package/dist/commands/restore.js.map +1 -0
  49. package/dist/commands/service.d.ts +83 -0
  50. package/dist/commands/service.d.ts.map +1 -0
  51. package/dist/commands/service.js +259 -0
  52. package/dist/commands/service.js.map +1 -0
  53. package/dist/commands/show.d.ts +63 -0
  54. package/dist/commands/show.d.ts.map +1 -0
  55. package/dist/commands/show.js +243 -0
  56. package/dist/commands/show.js.map +1 -0
  57. package/dist/commands/status.d.ts +53 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +150 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/sync.d.ts +105 -0
  62. package/dist/commands/sync.d.ts.map +1 -0
  63. package/dist/commands/sync.js +243 -0
  64. package/dist/commands/sync.js.map +1 -0
  65. package/dist/commands/team.d.ts +79 -0
  66. package/dist/commands/team.d.ts.map +1 -0
  67. package/dist/commands/team.js +233 -0
  68. package/dist/commands/team.js.map +1 -0
  69. package/dist/commands/track.d.ts +109 -0
  70. package/dist/commands/track.d.ts.map +1 -0
  71. package/dist/commands/track.js +406 -0
  72. package/dist/commands/track.js.map +1 -0
  73. package/dist/core/command-validator.d.ts +100 -0
  74. package/dist/core/command-validator.d.ts.map +1 -0
  75. package/dist/core/command-validator.js +299 -0
  76. package/dist/core/command-validator.js.map +1 -0
  77. package/dist/core/config-store.d.ts +76 -0
  78. package/dist/core/config-store.d.ts.map +1 -0
  79. package/dist/core/config-store.js +148 -0
  80. package/dist/core/config-store.js.map +1 -0
  81. package/dist/core/directories-handler.d.ts +116 -0
  82. package/dist/core/directories-handler.d.ts.map +1 -0
  83. package/dist/core/directories-handler.js +199 -0
  84. package/dist/core/directories-handler.js.map +1 -0
  85. package/dist/core/docker-handler.d.ts +183 -0
  86. package/dist/core/docker-handler.d.ts.map +1 -0
  87. package/dist/core/docker-handler.js +515 -0
  88. package/dist/core/docker-handler.js.map +1 -0
  89. package/dist/core/encryption.d.ts +79 -0
  90. package/dist/core/encryption.d.ts.map +1 -0
  91. package/dist/core/encryption.js +111 -0
  92. package/dist/core/encryption.js.map +1 -0
  93. package/dist/core/env-handler.d.ts +128 -0
  94. package/dist/core/env-handler.d.ts.map +1 -0
  95. package/dist/core/env-handler.js +272 -0
  96. package/dist/core/env-handler.js.map +1 -0
  97. package/dist/core/git-sync.d.ts +88 -0
  98. package/dist/core/git-sync.d.ts.map +1 -0
  99. package/dist/core/git-sync.js +143 -0
  100. package/dist/core/git-sync.js.map +1 -0
  101. package/dist/core/key-store.d.ts +51 -0
  102. package/dist/core/key-store.d.ts.map +1 -0
  103. package/dist/core/key-store.js +108 -0
  104. package/dist/core/key-store.js.map +1 -0
  105. package/dist/core/log-sanitizer.d.ts +72 -0
  106. package/dist/core/log-sanitizer.d.ts.map +1 -0
  107. package/dist/core/log-sanitizer.js +202 -0
  108. package/dist/core/log-sanitizer.js.map +1 -0
  109. package/dist/core/path-validator.d.ts +37 -0
  110. package/dist/core/path-validator.d.ts.map +1 -0
  111. package/dist/core/path-validator.js +127 -0
  112. package/dist/core/path-validator.js.map +1 -0
  113. package/dist/core/recipients.d.ts +99 -0
  114. package/dist/core/recipients.d.ts.map +1 -0
  115. package/dist/core/recipients.js +206 -0
  116. package/dist/core/recipients.js.map +1 -0
  117. package/dist/core/services-handler.d.ts +113 -0
  118. package/dist/core/services-handler.d.ts.map +1 -0
  119. package/dist/core/services-handler.js +176 -0
  120. package/dist/core/services-handler.js.map +1 -0
  121. package/dist/core/state-manager.d.ts +96 -0
  122. package/dist/core/state-manager.d.ts.map +1 -0
  123. package/dist/core/state-manager.js +165 -0
  124. package/dist/core/state-manager.js.map +1 -0
  125. package/dist/core/transport.d.ts +28 -0
  126. package/dist/core/transport.d.ts.map +1 -0
  127. package/dist/core/transport.js +79 -0
  128. package/dist/core/transport.js.map +1 -0
  129. package/dist/index.d.ts +20 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/dist/index.js +80 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/types/index.d.ts +5 -0
  134. package/dist/types/index.d.ts.map +1 -0
  135. package/dist/types/index.js +2 -0
  136. package/dist/types/index.js.map +1 -0
  137. package/dist/utils/errors.d.ts +81 -0
  138. package/dist/utils/errors.d.ts.map +1 -0
  139. package/dist/utils/errors.js +191 -0
  140. package/dist/utils/errors.js.map +1 -0
  141. package/dist/utils/secure-memory.d.ts +65 -0
  142. package/dist/utils/secure-memory.d.ts.map +1 -0
  143. package/dist/utils/secure-memory.js +86 -0
  144. package/dist/utils/secure-memory.js.map +1 -0
  145. package/package.json +58 -0
@@ -0,0 +1,352 @@
1
+ /**
2
+ * `ctx-sync env` command group.
3
+ *
4
+ * Subcommands:
5
+ * - `env import <project> <file>` — Import from .env file
6
+ * - `env add <project> <key>` — Add single var (hidden input / stdin)
7
+ * - `env scan <project>` — Scan current shell environment
8
+ * - `env list <project>` — List env vars (values hidden by default)
9
+ *
10
+ * Security:
11
+ * - Secret values are NEVER accepted as CLI arguments.
12
+ * - All env vars encrypted by default (encrypt-by-default).
13
+ * - Values are never displayed in CLI output unless --show-values.
14
+ *
15
+ * @module commands/env
16
+ */
17
+ import * as fs from 'node:fs';
18
+ import * as path from 'node:path';
19
+ import { withErrorHandler } from '../utils/errors.js';
20
+ import { STATE_FILES, DEFAULT_SAFE_LIST } from '@ctx-sync/shared';
21
+ import { identityToRecipient } from 'age-encryption';
22
+ import { loadKey } from '../core/key-store.js';
23
+ import { commitState } from '../core/git-sync.js';
24
+ import { getConfigDir, getSyncDir } from './init.js';
25
+ import { parseEnvFile, importEnvVars, addEnvVar, listEnvVars, validateKeyArg, readValueFromStdin, shouldEncrypt, } from '../core/env-handler.js';
26
+ /**
27
+ * Execute env import from a file or stdin.
28
+ */
29
+ export async function executeEnvImport(options) {
30
+ const configDir = getConfigDir();
31
+ const syncDir = getSyncDir();
32
+ const privateKey = loadKey(configDir);
33
+ const publicKey = await identityToRecipient(privateKey);
34
+ let content;
35
+ if (options.stdin) {
36
+ content = await readValueFromStdin();
37
+ }
38
+ else if (options.file) {
39
+ const filePath = path.resolve(options.file);
40
+ if (!fs.existsSync(filePath)) {
41
+ throw new Error(`File not found: ${filePath}`);
42
+ }
43
+ content = fs.readFileSync(filePath, 'utf-8');
44
+ }
45
+ else {
46
+ throw new Error('Provide a file path or use --stdin.\n' +
47
+ 'Usage: ctx-sync env import <project> <file>\n' +
48
+ ' cat .env | ctx-sync env import <project> --stdin');
49
+ }
50
+ const parsed = parseEnvFile(content);
51
+ if (parsed.length === 0) {
52
+ throw new Error('No environment variables found in input.');
53
+ }
54
+ // Count how many would be encrypted vs plain (informational)
55
+ let encryptedCount = 0;
56
+ let plainCount = 0;
57
+ for (const { key, value } of parsed) {
58
+ if (shouldEncrypt(key, value)) {
59
+ encryptedCount++;
60
+ }
61
+ else if (options.allowPlain) {
62
+ plainCount++;
63
+ }
64
+ else {
65
+ // Without --allow-plain, everything is encrypted
66
+ encryptedCount++;
67
+ }
68
+ }
69
+ // Import all vars (entire .age file is encrypted regardless)
70
+ const importedCount = await importEnvVars(options.project, parsed, syncDir, publicKey, privateKey);
71
+ // Commit
72
+ if (!options.noSync) {
73
+ await commitState(syncDir, [STATE_FILES.ENV_VARS, STATE_FILES.MANIFEST], `feat: import ${importedCount} env vars for ${options.project}`);
74
+ }
75
+ return { importedCount, encryptedCount, plainCount };
76
+ }
77
+ /**
78
+ * Execute env add (single variable).
79
+ */
80
+ export async function executeEnvAdd(options) {
81
+ const configDir = getConfigDir();
82
+ const syncDir = getSyncDir();
83
+ const privateKey = loadKey(configDir);
84
+ const publicKey = await identityToRecipient(privateKey);
85
+ // Validate key does not contain embedded value
86
+ validateKeyArg(options.key);
87
+ let value;
88
+ if (options.value !== undefined) {
89
+ // Value provided programmatically (from hidden prompt or stdin)
90
+ value = options.value;
91
+ }
92
+ else if (options.stdin) {
93
+ value = await readValueFromStdin();
94
+ }
95
+ else {
96
+ throw new Error('A value is required.\n' +
97
+ 'Use interactive prompt or --stdin to provide the value securely.');
98
+ }
99
+ await addEnvVar(options.project, options.key, value, syncDir, publicKey, privateKey);
100
+ // Commit
101
+ if (!options.noSync) {
102
+ await commitState(syncDir, [STATE_FILES.ENV_VARS, STATE_FILES.MANIFEST], `feat: add env var ${options.key} for ${options.project}`);
103
+ }
104
+ }
105
+ /**
106
+ * Scan the current shell environment for project-related variables.
107
+ *
108
+ * Heuristic: exclude common system vars and PATH-like variables.
109
+ * Returns candidates for user to select from.
110
+ */
111
+ export function scanEnvironment() {
112
+ const systemVars = new Set([
113
+ 'PATH', 'HOME', 'USER', 'LOGNAME', 'SHELL', 'TERM',
114
+ 'TMPDIR', 'TEMP', 'TMP', 'LANG', 'LC_ALL', 'LC_CTYPE',
115
+ 'DISPLAY', 'HOSTNAME', 'OLDPWD', 'PWD', 'SHLVL',
116
+ 'COLORTERM', '_', 'TERM_PROGRAM', 'TERM_PROGRAM_VERSION',
117
+ 'TERM_SESSION_ID', 'XPC_FLAGS', 'XPC_SERVICE_NAME',
118
+ 'APPLE_TERMINAL_PROCESS_ID', 'SSH_AUTH_SOCK',
119
+ 'SECURITYSESSIONID', 'LaunchInstanceID', 'ITERM_SESSION_ID',
120
+ 'ITERM_PROFILE', 'COLORFGBG', 'ORIGINAL_XDG_CURRENT_DESKTOP',
121
+ 'MallocNanoZone', '__CF_USER_TEXT_ENCODING', '__CFBundleIdentifier',
122
+ 'COMMAND_MODE',
123
+ // Node/npm specific
124
+ 'NVM_DIR', 'NVM_BIN', 'NVM_INC', 'NVM_CD_FLAGS',
125
+ 'NODE_PATH', 'npm_config_prefix',
126
+ // Test environment
127
+ 'CTX_SYNC_HOME', 'CTX_SYNC_TEST_MODE',
128
+ 'GIT_TERMINAL_PROMPT',
129
+ ]);
130
+ const candidates = [];
131
+ for (const [key, value] of Object.entries(process.env)) {
132
+ if (!value)
133
+ continue;
134
+ if (systemVars.has(key))
135
+ continue;
136
+ // Skip PATH-like vars (contain multiple colon-separated paths)
137
+ if (value.includes(':') && value.includes('/') && value.split(':').length > 2)
138
+ continue;
139
+ // Heuristic: project-related if it looks like an app config var
140
+ const isProjectRelated = key.includes('_KEY') ||
141
+ key.includes('_SECRET') ||
142
+ key.includes('_TOKEN') ||
143
+ key.includes('_URL') ||
144
+ key.includes('_HOST') ||
145
+ key.includes('_PORT') ||
146
+ key.includes('_ENV') ||
147
+ key.includes('DATABASE') ||
148
+ key.includes('REDIS') ||
149
+ key.includes('API') ||
150
+ key.includes('AWS') ||
151
+ key.includes('STRIPE') ||
152
+ DEFAULT_SAFE_LIST.includes(key);
153
+ candidates.push({ key, value, isProjectRelated });
154
+ }
155
+ return candidates.sort((a, b) => {
156
+ // Project-related first, then alphabetical
157
+ if (a.isProjectRelated && !b.isProjectRelated)
158
+ return -1;
159
+ if (!a.isProjectRelated && b.isProjectRelated)
160
+ return 1;
161
+ return a.key.localeCompare(b.key);
162
+ });
163
+ }
164
+ /**
165
+ * Execute env scan — import selected vars from current environment.
166
+ */
167
+ export async function executeEnvScan(options, selectedKeys) {
168
+ const configDir = getConfigDir();
169
+ const syncDir = getSyncDir();
170
+ const privateKey = loadKey(configDir);
171
+ const publicKey = await identityToRecipient(privateKey);
172
+ const vars = selectedKeys
173
+ .map((key) => ({
174
+ key,
175
+ value: process.env[key] ?? '',
176
+ }))
177
+ .filter((v) => v.value !== '');
178
+ if (vars.length === 0) {
179
+ return 0;
180
+ }
181
+ const count = await importEnvVars(options.project, vars, syncDir, publicKey, privateKey);
182
+ // Commit
183
+ if (!options.noSync) {
184
+ await commitState(syncDir, [STATE_FILES.ENV_VARS, STATE_FILES.MANIFEST], `feat: scan ${count} env vars for ${options.project}`);
185
+ }
186
+ return count;
187
+ }
188
+ /**
189
+ * Execute env list.
190
+ */
191
+ export async function executeEnvList(options) {
192
+ const configDir = getConfigDir();
193
+ const syncDir = getSyncDir();
194
+ const privateKey = loadKey(configDir);
195
+ return listEnvVars(options.project, syncDir, privateKey, options.showValues ?? false);
196
+ }
197
+ /**
198
+ * Register the `env` command group on the given Commander program.
199
+ */
200
+ export function registerEnvCommand(program) {
201
+ const env = program
202
+ .command('env')
203
+ .description('Manage environment variables (encrypted by default)');
204
+ // --- env import ---
205
+ env
206
+ .command('import <project> [file]')
207
+ .description('Import environment variables from a .env file')
208
+ .option('--stdin', 'Read .env content from stdin')
209
+ .option('--allow-plain', 'Store safe-listed keys as plaintext (not recommended)')
210
+ .option('--no-sync', 'Skip syncing to Git after import')
211
+ .action(withErrorHandler(async (project, file, opts) => {
212
+ const options = {
213
+ project,
214
+ file,
215
+ stdin: opts['stdin'],
216
+ allowPlain: opts['allowPlain'],
217
+ noSync: opts['sync'] === false,
218
+ };
219
+ const result = await executeEnvImport(options);
220
+ const chalk = (await import('chalk')).default;
221
+ console.log(chalk.green(`✅ Imported ${result.importedCount} env vars`) +
222
+ ` for ${project}`);
223
+ console.log(chalk.dim(` 🔐 All ${result.importedCount} encrypted (encrypt-by-default)`));
224
+ if (result.plainCount > 0) {
225
+ console.log(chalk.dim(` 💡 ${result.plainCount} on safe-list (still encrypted at file level)`));
226
+ }
227
+ console.log(chalk.dim('\n State encrypted and saved to env-vars.age'));
228
+ }));
229
+ // --- env add ---
230
+ env
231
+ .command('add <project> <key>')
232
+ .description('Add a single environment variable (secure input)')
233
+ .option('--stdin', 'Read value from stdin')
234
+ .option('--from-fd <fd>', 'Read value from file descriptor')
235
+ .option('--no-sync', 'Skip syncing to Git')
236
+ .action(withErrorHandler(async (project, key, opts) => {
237
+ const addOptions = {
238
+ project,
239
+ key,
240
+ stdin: opts['stdin'],
241
+ fromFd: opts['fromFd'] !== undefined ? Number(opts['fromFd']) : undefined,
242
+ noSync: opts['sync'] === false,
243
+ };
244
+ // Validate key does not contain embedded value (security check)
245
+ validateKeyArg(key);
246
+ if (addOptions.stdin) {
247
+ // Read from stdin
248
+ addOptions.value = await readValueFromStdin();
249
+ }
250
+ else if (addOptions.fromFd !== undefined) {
251
+ // Read from file descriptor
252
+ try {
253
+ const fd = fs.openSync(`/dev/fd/${addOptions.fromFd}`, 'r');
254
+ const buffer = Buffer.alloc(65536);
255
+ const bytesRead = fs.readSync(fd, buffer, 0, buffer.length, null);
256
+ fs.closeSync(fd);
257
+ addOptions.value = buffer.slice(0, bytesRead).toString('utf-8').trim();
258
+ }
259
+ catch {
260
+ throw new Error(`Failed to read from file descriptor ${addOptions.fromFd}.\n` +
261
+ `Usage: ctx-sync env add ${project} ${key} --from-fd 3 3< <(pass show key)`);
262
+ }
263
+ }
264
+ else {
265
+ // Interactive prompt with hidden input
266
+ const Enquirer = (await import('enquirer')).default;
267
+ const enquirer = new Enquirer();
268
+ const response = await enquirer.prompt({
269
+ type: 'password',
270
+ name: 'value',
271
+ message: `Enter value for ${key}:`,
272
+ });
273
+ addOptions.value = response.value;
274
+ }
275
+ await executeEnvAdd(addOptions);
276
+ const chalk = (await import('chalk')).default;
277
+ console.log(chalk.green(`✅ Added ${key}`) + ` for ${project}`);
278
+ console.log(chalk.dim(' 🔐 Encrypted and saved'));
279
+ }));
280
+ // --- env scan ---
281
+ env
282
+ .command('scan <project>')
283
+ .description('Scan current shell environment for project-related variables')
284
+ .option('--no-sync', 'Skip syncing to Git')
285
+ .action(withErrorHandler(async (project, opts) => {
286
+ const candidates = scanEnvironment();
287
+ if (candidates.length === 0) {
288
+ console.log('No environment variables found to scan.');
289
+ return;
290
+ }
291
+ const projectRelated = candidates.filter((c) => c.isProjectRelated);
292
+ const chalk = (await import('chalk')).default;
293
+ console.log(chalk.bold(`Found ${candidates.length} env vars. `) +
294
+ chalk.dim(`(${projectRelated.length} appear project-related)`));
295
+ // In non-interactive mode, import project-related vars
296
+ const isNonInteractive = process.env['CTX_SYNC_TEST_MODE'] === 'true';
297
+ let selectedKeys;
298
+ if (isNonInteractive) {
299
+ selectedKeys = projectRelated.map((c) => c.key);
300
+ }
301
+ else {
302
+ // Interactive selection
303
+ const Enquirer = (await import('enquirer')).default;
304
+ const enquirer = new Enquirer();
305
+ const response = await enquirer.prompt({
306
+ type: 'multiselect',
307
+ name: 'selectedKeys',
308
+ message: 'Select variables to import:',
309
+ choices: candidates.map((c) => ({
310
+ name: c.key,
311
+ value: c.key,
312
+ hint: c.isProjectRelated ? '(project-related)' : '',
313
+ })),
314
+ initial: projectRelated.map((c) => c.key),
315
+ });
316
+ selectedKeys = response.selectedKeys;
317
+ }
318
+ if (selectedKeys.length === 0) {
319
+ console.log('No variables selected.');
320
+ return;
321
+ }
322
+ const count = await executeEnvScan({ project, noSync: opts['sync'] === false }, selectedKeys);
323
+ console.log(chalk.green(`✅ Imported ${count} env vars`) + ` for ${project}`);
324
+ console.log(chalk.dim(' 🔐 All encrypted (encrypt-by-default)'));
325
+ }));
326
+ // --- env list ---
327
+ env
328
+ .command('list <project>')
329
+ .description('List environment variables for a project')
330
+ .option('--show-values', 'Show decrypted values (use with caution)')
331
+ .action(withErrorHandler(async (project, opts) => {
332
+ const showValues = opts['showValues'];
333
+ const vars = await executeEnvList({ project, showValues });
334
+ if (vars.length === 0) {
335
+ console.log(`No environment variables for project "${project}".`);
336
+ console.log('\nImport from a .env file:');
337
+ console.log(` $ ctx-sync env import ${project} .env`);
338
+ return;
339
+ }
340
+ const chalk = (await import('chalk')).default;
341
+ if (showValues) {
342
+ console.log(chalk.yellow('⚠️ Showing decrypted values — be careful with screen sharing!\n'));
343
+ }
344
+ console.log(chalk.bold(`Environment variables for ${project} (${vars.length}):\n`));
345
+ for (const v of vars) {
346
+ const added = new Date(v.addedAt);
347
+ console.log(` ${chalk.cyan(v.key)} = ${v.value}`);
348
+ console.log(chalk.dim(` Added: ${added.toLocaleDateString()} ${added.toLocaleTimeString()}`));
349
+ }
350
+ }));
351
+ }
352
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAsBhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyB;IAEzB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAExD,IAAI,OAAe,CAAC;IAEpB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACvC,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,uCAAuC;YACrC,+CAA+C;YAC/C,yDAAyD,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,6DAA6D;IAC7D,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC9B,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,aAAa,GAAG,MAAM,aAAa,CACvC,OAAO,CAAC,OAAO,EACf,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,CACX,CAAC;IAEF,SAAS;IACT,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,WAAW,CACf,OAAO,EACP,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC5C,gBAAgB,aAAa,iBAAiB,OAAO,CAAC,OAAO,EAAE,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC;AAaD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA2C;IAE3C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAExD,+CAA+C;IAC/C,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,KAAa,CAAC;IAElB,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,gEAAgE;QAChE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CACb,wBAAwB;YACtB,kEAAkE,CACrE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,CACb,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,GAAG,EACX,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,CACX,CAAC;IAEF,SAAS;IACT,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,WAAW,CACf,OAAO,EACP,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC5C,qBAAqB,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,OAAO,EAAE,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC;AAiBD;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;QACzB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;QAClD,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;QACrD,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO;QAC/C,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,sBAAsB;QACxD,iBAAiB,EAAE,WAAW,EAAE,kBAAkB;QAClD,2BAA2B,EAAE,eAAe;QAC5C,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB;QAC3D,eAAe,EAAE,WAAW,EAAE,8BAA8B;QAC5D,gBAAgB,EAAE,yBAAyB,EAAE,sBAAsB;QACnE,cAAc;QACd,oBAAoB;QACpB,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc;QAC/C,WAAW,EAAE,mBAAmB;QAChC,mBAAmB;QACnB,eAAe,EAAE,oBAAoB;QACrC,qBAAqB;KACtB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,+DAA+D;QAC/D,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAExF,gEAAgE;QAChE,MAAM,gBAAgB,GACpB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;YACpB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtB,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAElC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,2CAA2C;QAC3C,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,gBAAgB;YAAE,OAAO,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,gBAAgB;YAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,YAAsB;IAEtB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG,YAAY;SACtB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,GAAG;QACH,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;KAC9B,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,CAC/B,OAAO,CAAC,OAAO,EACf,IAAI,EACJ,OAAO,EACP,SAAS,EACT,UAAU,CACX,CAAC;IAEF,SAAS;IACT,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,WAAW,CACf,OAAO,EACP,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC5C,cAAc,KAAK,iBAAiB,OAAO,CAAC,OAAO,EAAE,CACtD,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAUD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtC,OAAO,WAAW,CAChB,OAAO,CAAC,OAAO,EACf,OAAO,EACP,UAAU,EACV,OAAO,CAAC,UAAU,IAAI,KAAK,CAC5B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,qDAAqD,CAAC,CAAC;IAEtE,qBAAqB;IACrB,GAAG;SACA,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,SAAS,EAAE,8BAA8B,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,uDAAuD,CAAC;SAChF,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;SACvD,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAe,EAAE,IAAwB,EAAE,IAA6B,EAAE,EAAE;QAC1G,MAAM,OAAO,GAAqB;YAC9B,OAAO;YACP,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,OAAO,CAAwB;YAC3C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAwB;YACrD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;SAC/B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,aAAa,WAAW,CAAC;YACxD,QAAQ,OAAO,EAAE,CACpB,CAAC;QACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,aAAa,iCAAiC,CAAC,CAC9E,CAAC;QAEF,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,SAAS,MAAM,CAAC,UAAU,+CAA+C,CAC1E,CACF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC,CAAC;IAEN,kBAAkB;IAClB,GAAG;SACA,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC;SAC1C,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,CAAC;SAC3D,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAe,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC7F,MAAM,UAAU,GAAuC;YACnD,OAAO;YACP,GAAG;YACH,KAAK,EAAE,IAAI,CAAC,OAAO,CAAwB;YAC3C,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YACzE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK;SAC/B,CAAC;QAEF,gEAAgE;QAChE,cAAc,CAAC,GAAG,CAAC,CAAC;QAEpB,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,kBAAkB;YAClB,UAAU,CAAC,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAChD,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3C,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAClE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACjB,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CACb,uCAAuC,UAAU,CAAC,MAAM,KAAK;oBAC3D,2BAA2B,OAAO,IAAI,GAAG,kCAAkC,CAC9E,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAqB,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACrC,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,mBAAmB,GAAG,GAAG;aACnC,CAAC,CAAC;YACH,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACpC,CAAC;QAED,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC,CAAC;IAEN,mBAAmB;IACnB,GAAG;SACA,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;SAC1C,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAe,EAAE,IAA6B,EAAE,EAAE;QAChF,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;QAEnC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,aAAa,CAAC;YACjD,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,0BAA0B,CAAC,CACjE,CAAC;QAEF,uDAAuD;QACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,MAAM,CAAC;QACtE,IAAI,YAAsB,CAAC;QAE3B,IAAI,gBAAgB,EAAE,CAAC;YACrB,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAA8B,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACrC,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,6BAA6B;gBACtC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,EAAE,CAAC,CAAC,GAAG;oBACX,KAAK,EAAE,CAAC,CAAC,GAAG;oBACZ,IAAI,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE;iBACpD,CAAC,CAAC;gBACH,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;aACD,CAAC,CAAC;YAC5C,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QACvC,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,cAAc,CAChC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,EAC3C,YAAY,CACb,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,cAAc,KAAK,WAAW,CAAC,GAAG,QAAQ,OAAO,EAAE,CAChE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC,CAAC;IAEN,mBAAmB;IACnB,GAAG;SACA,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;SACnE,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAe,EAAE,IAA6B,EAAE,EAAE;QAChF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAwB,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAE3D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,IAAI,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,OAAO,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAE9C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,kEAAkE,CAAC,CACjF,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,6BAA6B,OAAO,KAAK,IAAI,CAAC,MAAM,MAAM,CAAC,CACvE,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,kBAAkB,EAAE,IAAI,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CACrF,CAAC;QACJ,CAAC;IACL,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `ctx-sync init` command.
3
+ *
4
+ * Handles first-time setup (key generation, Git repo init, remote config)
5
+ * and `--restore` flow (key restoration, repo clone, state decryption).
6
+ *
7
+ * @module commands/init
8
+ */
9
+ import type { Command } from 'commander';
10
+ import type { Manifest } from '@ctx-sync/shared';
11
+ /** Options for the init command */
12
+ export interface InitOptions {
13
+ restore?: boolean;
14
+ noInteractive?: boolean;
15
+ skipBackup?: boolean;
16
+ remote?: string;
17
+ stdin?: boolean;
18
+ }
19
+ /** Result of a fresh init */
20
+ export interface InitResult {
21
+ publicKey: string;
22
+ configDir: string;
23
+ syncDir: string;
24
+ remoteUrl?: string;
25
+ manifestCreated: boolean;
26
+ }
27
+ /** Result of a restore init */
28
+ export interface RestoreResult {
29
+ configDir: string;
30
+ syncDir: string;
31
+ remoteUrl?: string;
32
+ projectCount: number;
33
+ projectNames: string[];
34
+ }
35
+ /**
36
+ * Get the config directory path.
37
+ * Uses CTX_SYNC_HOME env var for testing, otherwise ~/.config/ctx-sync.
38
+ */
39
+ export declare function getConfigDir(): string;
40
+ /**
41
+ * Get the sync directory path.
42
+ * Uses CTX_SYNC_HOME env var for testing, otherwise ~/.context-sync.
43
+ */
44
+ export declare function getSyncDir(): string;
45
+ /**
46
+ * Create the initial manifest.json in the sync directory.
47
+ *
48
+ * The manifest is the only plaintext file in the sync repo.
49
+ * It contains only version and timestamps — no sensitive data.
50
+ */
51
+ export declare function createManifest(syncDir: string): Manifest;
52
+ /**
53
+ * Execute the fresh init flow.
54
+ *
55
+ * 1. Generate Age key pair.
56
+ * 2. Save private key to config dir (0o600).
57
+ * 3. Display public key.
58
+ * 4. Handle backup (skip in --no-interactive).
59
+ * 5. Prompt for Git remote URL (or use --remote).
60
+ * 6. Validate remote URL.
61
+ * 7. Initialize sync Git repo.
62
+ * 8. Add remote.
63
+ * 9. Create manifest.json.
64
+ * 10. Commit and push.
65
+ */
66
+ export declare function executeInit(options: InitOptions): Promise<InitResult>;
67
+ /**
68
+ * Execute the restore flow.
69
+ *
70
+ * 1. Accept private key (from --stdin or prompt).
71
+ * 2. Save key with 0o600 permissions.
72
+ * 3. Prompt for Git remote URL (or use --remote).
73
+ * 4. Validate remote URL.
74
+ * 5. Clone the sync repo to ~/.context-sync/.
75
+ * 6. Decrypt manifest, list found projects.
76
+ * 7. Print summary.
77
+ */
78
+ export declare function executeRestore(options: InitOptions & {
79
+ key?: string;
80
+ }): Promise<RestoreResult>;
81
+ /**
82
+ * Read key from stdin (for piped input).
83
+ */
84
+ export declare function readKeyFromStdin(): Promise<string>;
85
+ /**
86
+ * Register the `init` command on the given Commander program.
87
+ */
88
+ export declare function registerInitCommand(program: Command): void;
89
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQjD,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,+BAA+B;AAC/B,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAWxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwC3E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtC,OAAO,CAAC,aAAa,CAAC,CA4ExB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAkBlD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyF1D"}