aivault-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +172 -0
  3. package/dist/cli/cli.d.ts +3 -0
  4. package/dist/cli/cli.d.ts.map +1 -0
  5. package/dist/cli/cli.js +111 -0
  6. package/dist/cli/cli.js.map +1 -0
  7. package/dist/cli/commands/dashboard.d.ts +2 -0
  8. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  9. package/dist/cli/commands/dashboard.js +155 -0
  10. package/dist/cli/commands/dashboard.js.map +1 -0
  11. package/dist/cli/commands/delete.d.ts +2 -0
  12. package/dist/cli/commands/delete.d.ts.map +1 -0
  13. package/dist/cli/commands/delete.js +28 -0
  14. package/dist/cli/commands/delete.js.map +1 -0
  15. package/dist/cli/commands/export.d.ts +2 -0
  16. package/dist/cli/commands/export.d.ts.map +1 -0
  17. package/dist/cli/commands/export.js +27 -0
  18. package/dist/cli/commands/export.js.map +1 -0
  19. package/dist/cli/commands/init.d.ts +2 -0
  20. package/dist/cli/commands/init.d.ts.map +1 -0
  21. package/dist/cli/commands/init.js +32 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/list.d.ts +2 -0
  24. package/dist/cli/commands/list.d.ts.map +1 -0
  25. package/dist/cli/commands/list.js +22 -0
  26. package/dist/cli/commands/list.js.map +1 -0
  27. package/dist/cli/commands/set.d.ts +2 -0
  28. package/dist/cli/commands/set.d.ts.map +1 -0
  29. package/dist/cli/commands/set.js +31 -0
  30. package/dist/cli/commands/set.js.map +1 -0
  31. package/dist/cli/utils.d.ts +4 -0
  32. package/dist/cli/utils.d.ts.map +1 -0
  33. package/dist/cli/utils.js +57 -0
  34. package/dist/cli/utils.js.map +1 -0
  35. package/dist/executor/parser.d.ts +6 -0
  36. package/dist/executor/parser.d.ts.map +1 -0
  37. package/dist/executor/parser.js +17 -0
  38. package/dist/executor/parser.js.map +1 -0
  39. package/dist/executor/runner.d.ts +17 -0
  40. package/dist/executor/runner.d.ts.map +1 -0
  41. package/dist/executor/runner.js +63 -0
  42. package/dist/executor/runner.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +18 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/scrubber/scrubber.d.ts +7 -0
  48. package/dist/scrubber/scrubber.d.ts.map +1 -0
  49. package/dist/scrubber/scrubber.js +40 -0
  50. package/dist/scrubber/scrubber.js.map +1 -0
  51. package/dist/server.d.ts +4 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +87 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/vault/crypto.d.ts +4 -0
  56. package/dist/vault/crypto.d.ts.map +1 -0
  57. package/dist/vault/crypto.js +44 -0
  58. package/dist/vault/crypto.js.map +1 -0
  59. package/dist/vault/store.d.ts +19 -0
  60. package/dist/vault/store.d.ts.map +1 -0
  61. package/dist/vault/store.js +118 -0
  62. package/dist/vault/store.js.map +1 -0
  63. package/dist/vault/types.d.ts +25 -0
  64. package/dist/vault/types.d.ts.map +1 -0
  65. package/dist/vault/types.js +9 -0
  66. package/dist/vault/types.js.map +1 -0
  67. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":";;AAGA,kCAiBC;AApBD,6CAA+C;AAC/C,oCAAuC;AAEvC,SAAgB,WAAW,CAAC,GAAuB,EAAE,QAAgB;IACnE,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,IAAA,mBAAW,EAAC,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setCommand(name: string, description: string, tags: string[], password: string): Promise<void>;
2
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/set.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setCommand = setCommand;
4
+ const store_1 = require("../../vault/store");
5
+ const utils_1 = require("../utils");
6
+ async function setCommand(name, description, tags, password) {
7
+ const store = new store_1.VaultStore(password);
8
+ // Check if secret already exists
9
+ const existing = store.getSecret(name);
10
+ if (existing) {
11
+ const overwrite = await (0, utils_1.promptConfirm)(`Secret ${name} already exists. Overwrite? (y/N): `);
12
+ if (!overwrite) {
13
+ console.log('Aborted.');
14
+ return;
15
+ }
16
+ }
17
+ const value = await (0, utils_1.promptHidden)(`Enter value for ${name}: `);
18
+ if (!value) {
19
+ console.error('Error: Secret value cannot be empty.');
20
+ process.exit(1);
21
+ }
22
+ try {
23
+ store.setSecret(name, value, description, tags);
24
+ console.log(`\n✓ Secret ${name} saved`);
25
+ }
26
+ catch (err) {
27
+ console.error(`Error: ${err.message}`);
28
+ process.exit(1);
29
+ }
30
+ }
31
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/cli/commands/set.ts"],"names":[],"mappings":";;AAGA,gCA+BC;AAlCD,6CAA+C;AAC/C,oCAAuD;AAEhD,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,WAAmB,EACnB,IAAc,EACd,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,QAAQ,CAAC,CAAC;IAEvC,iCAAiC;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,MAAM,IAAA,qBAAa,EAAC,UAAU,IAAI,qCAAqC,CAAC,CAAC;QAC3F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAA,oBAAY,EAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function promptHidden(question: string): Promise<string>;
2
+ export declare function promptConfirm(question: string): Promise<boolean>;
3
+ export declare function formatTable(rows: string[][], headers: string[]): string;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B9D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYhE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAavE"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.promptHidden = promptHidden;
7
+ exports.promptConfirm = promptConfirm;
8
+ exports.formatTable = formatTable;
9
+ const readline_1 = __importDefault(require("readline"));
10
+ function promptHidden(question) {
11
+ return new Promise((resolve) => {
12
+ const rl = readline_1.default.createInterface({
13
+ input: process.stdin,
14
+ output: process.stdout,
15
+ });
16
+ // Mute output for hidden input
17
+ const stdout = process.stdout;
18
+ let muted = false;
19
+ const originalWrite = stdout.write.bind(stdout);
20
+ stdout.write = ((chunk, ...args) => {
21
+ if (muted) {
22
+ // Only suppress the echoed characters, not our prompt
23
+ return true;
24
+ }
25
+ return originalWrite(chunk, ...args);
26
+ });
27
+ rl.question(question, (answer) => {
28
+ muted = false;
29
+ stdout.write = originalWrite;
30
+ stdout.write('\n');
31
+ rl.close();
32
+ resolve(answer);
33
+ });
34
+ muted = true;
35
+ });
36
+ }
37
+ function promptConfirm(question) {
38
+ return new Promise((resolve) => {
39
+ const rl = readline_1.default.createInterface({
40
+ input: process.stdin,
41
+ output: process.stdout,
42
+ });
43
+ rl.question(question, (answer) => {
44
+ rl.close();
45
+ resolve(answer.toLowerCase() === 'y');
46
+ });
47
+ });
48
+ }
49
+ function formatTable(rows, headers) {
50
+ const allRows = [headers, ...rows];
51
+ const colWidths = headers.map((_, i) => Math.max(...allRows.map(row => (row[i] || '').length)));
52
+ const formatRow = (row) => row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');
53
+ const headerLine = formatRow(headers);
54
+ const separator = colWidths.map(w => '-'.repeat(w)).join(' ');
55
+ return [headerLine, separator, ...rows.map(formatRow)].join('\n');
56
+ }
57
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cli/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse $SECRET_NAME references from a command string.
3
+ * Matches $UPPER_CASE_NAME patterns that follow env var naming conventions.
4
+ */
5
+ export declare function parseSecretReferences(command: string): string[];
6
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/executor/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAU/D"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSecretReferences = parseSecretReferences;
4
+ /**
5
+ * Parse $SECRET_NAME references from a command string.
6
+ * Matches $UPPER_CASE_NAME patterns that follow env var naming conventions.
7
+ */
8
+ function parseSecretReferences(command) {
9
+ const regex = /\$([A-Z][A-Z0-9_]*)\b/g;
10
+ const names = new Set();
11
+ let match;
12
+ while ((match = regex.exec(command)) !== null) {
13
+ names.add(match[1]);
14
+ }
15
+ return Array.from(names);
16
+ }
17
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/executor/parser.ts"],"names":[],"mappings":";;AAIA,sDAUC;AAdD;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,MAAM,KAAK,GAAG,wBAAwB,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface RunCommandInput {
2
+ command: string;
3
+ working_directory?: string;
4
+ timeout_seconds?: number;
5
+ }
6
+ export interface RunCommandResult {
7
+ status: 'success' | 'missing_secrets' | 'error';
8
+ exit_code?: number;
9
+ stdout?: string;
10
+ stderr?: string;
11
+ missing?: Array<{
12
+ name: string;
13
+ message: string;
14
+ }>;
15
+ }
16
+ export declare function runCommand(input: RunCommandInput, secretValues: Map<string, string>): RunCommandResult;
17
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/executor/runner.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,gBAAgB,CAwDlB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runCommand = runCommand;
7
+ const child_process_1 = require("child_process");
8
+ const os_1 = __importDefault(require("os"));
9
+ const parser_1 = require("./parser");
10
+ const scrubber_1 = require("../scrubber/scrubber");
11
+ const MAX_TIMEOUT = 300;
12
+ const DEFAULT_TIMEOUT = 30;
13
+ function runCommand(input, secretValues) {
14
+ const { command, working_directory, timeout_seconds } = input;
15
+ // Parse secret references from the command
16
+ const referencedSecrets = (0, parser_1.parseSecretReferences)(command);
17
+ // Check for missing secrets
18
+ const missing = referencedSecrets.filter(name => !secretValues.has(name));
19
+ if (missing.length > 0) {
20
+ return {
21
+ status: 'missing_secrets',
22
+ missing: missing.map(name => ({
23
+ name,
24
+ message: `This secret is not in the vault. Please ask the user to add it using: aivault set ${name} --desc "description of what this secret is for"`,
25
+ })),
26
+ };
27
+ }
28
+ // Build environment with secrets injected
29
+ const env = { ...process.env };
30
+ for (const [name, value] of secretValues) {
31
+ env[name] = value;
32
+ }
33
+ const timeout = Math.min(Math.max(1, timeout_seconds ?? DEFAULT_TIMEOUT), MAX_TIMEOUT) * 1000;
34
+ const cwd = working_directory || os_1.default.homedir();
35
+ try {
36
+ const stdout = (0, child_process_1.execSync)(command, {
37
+ cwd,
38
+ env,
39
+ timeout,
40
+ encoding: 'utf8',
41
+ stdio: ['pipe', 'pipe', 'pipe'],
42
+ shell: '/bin/sh',
43
+ });
44
+ const scrubbedStdout = (0, scrubber_1.scrubOutput)(stdout || '', secretValues);
45
+ return {
46
+ status: 'success',
47
+ exit_code: 0,
48
+ stdout: scrubbedStdout,
49
+ stderr: '',
50
+ };
51
+ }
52
+ catch (err) {
53
+ const stdout = (0, scrubber_1.scrubOutput)(err.stdout?.toString() || '', secretValues);
54
+ const stderr = (0, scrubber_1.scrubOutput)(err.stderr?.toString() || '', secretValues);
55
+ return {
56
+ status: 'error',
57
+ exit_code: err.status ?? 1,
58
+ stdout,
59
+ stderr: stderr || err.message,
60
+ };
61
+ }
62
+ }
63
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/executor/runner.ts"],"names":[],"mappings":";;;;;AAsBA,gCA2DC;AAjFD,iDAAyC;AACzC,4CAAoB;AACpB,qCAAiD;AACjD,mDAAmD;AAEnD,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,eAAe,GAAG,EAAE,CAAC;AAgB3B,SAAgB,UAAU,CACxB,KAAsB,EACtB,YAAiC;IAEjC,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAE9D,2CAA2C;IAC3C,MAAM,iBAAiB,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAEzD,4BAA4B;IAC5B,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI;gBACJ,OAAO,EAAE,qFAAqF,IAAI,kDAAkD;aACrJ,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,GAAG,GAA2B,EAAE,GAAG,OAAO,CAAC,GAA6B,EAAE,CAAC;IACjF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,IAAI,eAAe,CAAC,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC;IAC9F,MAAM,GAAG,GAAG,iBAAiB,IAAI,YAAE,CAAC,OAAO,EAAE,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAC/B,GAAG;YACH,GAAG;YACH,OAAO;YACP,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAA,sBAAW,EAAC,MAAM,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QAE/D,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,CAAC;YACZ,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAA,sBAAW,EAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAA,sBAAW,EAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;QAEvE,OAAO;YACL,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;YAC1B,MAAM;YACN,MAAM,EAAE,MAAM,IAAI,GAAG,CAAC,OAAO;SAC9B,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
5
+ const store_1 = require("./vault/store");
6
+ const server_1 = require("./server");
7
+ async function main() {
8
+ const password = process.env.AIVAULT_MASTER_PASSWORD || undefined;
9
+ const store = password ? new store_1.VaultStore(password) : undefined;
10
+ const server = (0, server_1.createServer)(store);
11
+ const transport = new stdio_js_1.StdioServerTransport();
12
+ await server.connect(transport);
13
+ }
14
+ main().catch((err) => {
15
+ console.error('Fatal error:', err);
16
+ process.exit(1);
17
+ });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,wEAAiF;AACjF,yCAA2C;AAC3C,qCAAwC;AAExC,KAAK,UAAU,IAAI;IACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,SAAS,CAAC;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,kBAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9D,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,KAAK,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Scrub secret values from output text.
3
+ * Replaces any occurrence of a secret value (or common encodings) with [REDACTED:SECRET_NAME].
4
+ * Processes longest values first to prevent partial matches.
5
+ */
6
+ export declare function scrubOutput(output: string, secretValues: Map<string, string>): string;
7
+ //# sourceMappingURL=scrubber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrubber.d.ts","sourceRoot":"","sources":["../../src/scrubber/scrubber.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAkCrF"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scrubOutput = scrubOutput;
4
+ /**
5
+ * Scrub secret values from output text.
6
+ * Replaces any occurrence of a secret value (or common encodings) with [REDACTED:SECRET_NAME].
7
+ * Processes longest values first to prevent partial matches.
8
+ */
9
+ function scrubOutput(output, secretValues) {
10
+ if (!output || secretValues.size === 0) {
11
+ return output;
12
+ }
13
+ // Sort by value length descending to prevent partial match issues
14
+ const entries = Array.from(secretValues.entries()).sort((a, b) => b[1].length - a[1].length);
15
+ let scrubbed = output;
16
+ for (const [name, value] of entries) {
17
+ if (!value)
18
+ continue;
19
+ const redacted = `[REDACTED:${name}]`;
20
+ // Replace raw value
21
+ scrubbed = replaceAll(scrubbed, value, redacted);
22
+ // Replace URL-encoded version
23
+ const urlEncoded = encodeURIComponent(value);
24
+ if (urlEncoded !== value) {
25
+ scrubbed = replaceAll(scrubbed, urlEncoded, redacted);
26
+ }
27
+ // Replace Base64-encoded version
28
+ const base64Encoded = Buffer.from(value).toString('base64');
29
+ if (base64Encoded !== value) {
30
+ scrubbed = replaceAll(scrubbed, base64Encoded, redacted);
31
+ }
32
+ }
33
+ return scrubbed;
34
+ }
35
+ function replaceAll(str, search, replacement) {
36
+ // Escape special regex characters in the search string
37
+ const escaped = search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
38
+ return str.replace(new RegExp(escaped, 'g'), replacement);
39
+ }
40
+ //# sourceMappingURL=scrubber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrubber.js","sourceRoot":"","sources":["../../src/scrubber/scrubber.ts"],"names":[],"mappings":";;AAKA,kCAkCC;AAvCD;;;;GAIG;AACH,SAAgB,WAAW,CAAC,MAAc,EAAE,YAAiC;IAC3E,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kEAAkE;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACpC,CAAC;IAEF,IAAI,QAAQ,GAAG,MAAM,CAAC;IAEtB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,QAAQ,GAAG,aAAa,IAAI,GAAG,CAAC;QAEtC,oBAAoB;QACpB,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEjD,8BAA8B;QAC9B,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QAED,iCAAiC;QACjC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC5B,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,MAAc,EAAE,WAAmB;IAClE,uDAAuD;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { VaultStore } from './vault/store';
3
+ export declare function createServer(store: VaultStore | undefined): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAc3C,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAwFrE"}
package/dist/server.js ADDED
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createServer = createServer;
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const zod_1 = require("zod");
6
+ const runner_1 = require("./executor/runner");
7
+ const types_1 = require("./vault/types");
8
+ function vaultError(store) {
9
+ if (!store) {
10
+ return 'AIVAULT_MASTER_PASSWORD environment variable is not set. Please set it in your MCP server config.';
11
+ }
12
+ if (!store.isInitialized()) {
13
+ return 'Vault not initialized. Please run "aivault init" in your terminal first.';
14
+ }
15
+ return null;
16
+ }
17
+ function createServer(store) {
18
+ const server = new mcp_js_1.McpServer({
19
+ name: 'aivault',
20
+ version: '0.1.0',
21
+ });
22
+ // Tool 1: list_secrets
23
+ server.tool('list_secrets', 'List available secrets (names, descriptions, tags only — never values). Use this to discover what credentials are available.', { tag: zod_1.z.string().optional().describe('Optional tag to filter secrets by (e.g., "project-x")') }, async ({ tag }) => {
24
+ const err = vaultError(store);
25
+ if (err) {
26
+ return { content: [{ type: 'text', text: JSON.stringify({ status: 'error', message: err }) }], isError: true };
27
+ }
28
+ try {
29
+ const secrets = store.listSecrets(tag);
30
+ return { content: [{ type: 'text', text: JSON.stringify({ secrets }, null, 2) }] };
31
+ }
32
+ catch (e) {
33
+ return { content: [{ type: 'text', text: JSON.stringify({ status: 'error', message: e.message }) }], isError: true };
34
+ }
35
+ });
36
+ // Tool 2: run_command
37
+ server.tool('run_command', 'Execute a shell command with secrets injected as environment variables. Reference secrets using $SECRET_NAME syntax. Output is scrubbed of any secret values before returning.', {
38
+ command: zod_1.z.string().describe('The shell command to execute. Reference secrets using $SECRET_NAME syntax.'),
39
+ working_directory: zod_1.z.string().optional().describe('Optional working directory. Defaults to home directory.'),
40
+ timeout_seconds: zod_1.z.number().optional().default(30).describe('Optional timeout in seconds. Defaults to 30, max 300.'),
41
+ }, async ({ command, working_directory, timeout_seconds }) => {
42
+ const err = vaultError(store);
43
+ if (err) {
44
+ return { content: [{ type: 'text', text: JSON.stringify({ status: 'error', message: err }) }], isError: true };
45
+ }
46
+ try {
47
+ const secretValues = store.getAllSecretValues();
48
+ const result = (0, runner_1.runCommand)({ command, working_directory, timeout_seconds }, secretValues);
49
+ return {
50
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
51
+ isError: result.status === 'error',
52
+ };
53
+ }
54
+ catch (e) {
55
+ return { content: [{ type: 'text', text: JSON.stringify({ status: 'error', message: e.message }) }], isError: true };
56
+ }
57
+ });
58
+ // Tool 3: request_secret
59
+ server.tool('request_secret', 'Request a secret that does not exist yet. Returns a user-friendly message the AI can relay to the user.', {
60
+ name: zod_1.z.string().describe('The proposed name for the secret (e.g., GITHUB_TOKEN)'),
61
+ reason: zod_1.z.string().describe('Why the AI needs this secret'),
62
+ suggested_description: zod_1.z.string().optional().describe('A suggested description for the secret'),
63
+ }, async ({ name, reason, suggested_description }) => {
64
+ if (!(0, types_1.isValidSecretName)(name)) {
65
+ return {
66
+ content: [{
67
+ type: 'text',
68
+ text: JSON.stringify({
69
+ status: 'error',
70
+ message: `Invalid secret name "${name}". Must be uppercase letters, numbers, and underscores only, starting with a letter.`,
71
+ }),
72
+ }],
73
+ isError: true,
74
+ };
75
+ }
76
+ const desc = suggested_description || reason;
77
+ const message = `Please add the secret by running:\n\n aivault set ${name} --desc "${desc}"\n\nYou will be prompted to enter the value securely. Once added, I can continue with the task.`;
78
+ return {
79
+ content: [{
80
+ type: 'text',
81
+ text: JSON.stringify({ status: 'secret_requested', message, name, reason }, null, 2),
82
+ }],
83
+ };
84
+ });
85
+ return server;
86
+ }
87
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function deriveKey(password: string, salt: Buffer): Buffer;
2
+ export declare function encrypt(data: string, password: string): Buffer;
3
+ export declare function decrypt(payload: Buffer, password: string): string;
4
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/vault/crypto.ts"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBjE"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deriveKey = deriveKey;
7
+ exports.encrypt = encrypt;
8
+ exports.decrypt = decrypt;
9
+ const crypto_1 = __importDefault(require("crypto"));
10
+ const ALGORITHM = 'aes-256-gcm';
11
+ const KEY_LENGTH = 32;
12
+ const IV_LENGTH = 12;
13
+ const SALT_LENGTH = 32;
14
+ const AUTH_TAG_LENGTH = 16;
15
+ const PBKDF2_ITERATIONS = 100000;
16
+ const PBKDF2_DIGEST = 'sha512';
17
+ function deriveKey(password, salt) {
18
+ return crypto_1.default.pbkdf2Sync(password, salt, PBKDF2_ITERATIONS, KEY_LENGTH, PBKDF2_DIGEST);
19
+ }
20
+ function encrypt(data, password) {
21
+ const salt = crypto_1.default.randomBytes(SALT_LENGTH);
22
+ const iv = crypto_1.default.randomBytes(IV_LENGTH);
23
+ const key = deriveKey(password, salt);
24
+ const cipher = crypto_1.default.createCipheriv(ALGORITHM, key, iv);
25
+ const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);
26
+ const authTag = cipher.getAuthTag();
27
+ // Format: [32 salt][12 iv][16 auth tag][...encrypted data...]
28
+ return Buffer.concat([salt, iv, authTag, encrypted]);
29
+ }
30
+ function decrypt(payload, password) {
31
+ if (payload.length < SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH + 1) {
32
+ throw new Error('Invalid encrypted payload: too short');
33
+ }
34
+ const salt = payload.subarray(0, SALT_LENGTH);
35
+ const iv = payload.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH);
36
+ const authTag = payload.subarray(SALT_LENGTH + IV_LENGTH, SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH);
37
+ const encrypted = payload.subarray(SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH);
38
+ const key = deriveKey(password, salt);
39
+ const decipher = crypto_1.default.createDecipheriv(ALGORITHM, key, iv);
40
+ decipher.setAuthTag(authTag);
41
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
42
+ return decrypted.toString('utf8');
43
+ }
44
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/vault/crypto.ts"],"names":[],"mappings":";;;;;AAWA,8BAEC;AAED,0BAWC;AAED,0BAiBC;AA7CD,oDAA4B;AAG5B,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,iBAAiB,GAAG,MAAO,CAAC;AAClC,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,SAAgB,SAAS,CAAC,QAAgB,EAAE,IAAY;IACtD,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AACzF,CAAC;AAED,SAAgB,OAAO,CAAC,IAAY,EAAE,QAAgB;IACpD,MAAM,IAAI,GAAG,gBAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,gBAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,gBAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpC,8DAA8D;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe,EAAE,QAAgB;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,GAAG,SAAS,EAAE,WAAW,GAAG,SAAS,GAAG,eAAe,CAAC,CAAC;IACrG,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,GAAG,SAAS,GAAG,eAAe,CAAC,CAAC;IAE9E,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,gBAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC7D,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChF,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Secret, SecretMetadata } from './types';
2
+ export declare class VaultStore {
3
+ private password;
4
+ private vaultDir;
5
+ private vaultFile;
6
+ private configFile;
7
+ constructor(password: string, vaultDir?: string);
8
+ isInitialized(): boolean;
9
+ init(): void;
10
+ private readVault;
11
+ private writeVault;
12
+ setSecret(name: string, value: string, description: string, tags?: string[]): void;
13
+ getSecret(name: string): Secret | undefined;
14
+ listSecrets(tag?: string): SecretMetadata[];
15
+ deleteSecret(name: string): boolean;
16
+ getAllSecrets(): Secret[];
17
+ getAllSecretValues(): Map<string, string>;
18
+ }
19
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vault/store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAgC,MAAM,SAAS,CAAC;AAM/E,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAO/C,aAAa,IAAI,OAAO;IAIxB,IAAI,IAAI,IAAI;IAgBZ,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,UAAU;IAMlB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,IAAI;IA+BtF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK3C,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAe3C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAanC,aAAa,IAAI,MAAM,EAAE;IAKzB,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAQ1C"}