dbctx 1.5.0 → 2.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 (127) hide show
  1. package/dist/index.mjs +6012 -188
  2. package/package.json +12 -9
  3. package/dist/app/assemble.d.mts +0 -5
  4. package/dist/app/assemble.d.mts.map +0 -1
  5. package/dist/app/assemble.mjs +0 -166
  6. package/dist/app/config.d.mts +0 -9
  7. package/dist/app/config.d.mts.map +0 -1
  8. package/dist/app/config.mjs +0 -49
  9. package/dist/app/db.d.mts +0 -9
  10. package/dist/app/db.d.mts.map +0 -1
  11. package/dist/app/db.mjs +0 -182
  12. package/dist/app/detect.d.mts +0 -14
  13. package/dist/app/detect.d.mts.map +0 -1
  14. package/dist/app/detect.mjs +0 -108
  15. package/dist/app/index.d.mts +0 -3
  16. package/dist/app/index.d.mts.map +0 -1
  17. package/dist/app/index.mjs +0 -156
  18. package/dist/app/open-url.d.mts +0 -4
  19. package/dist/app/open-url.d.mts.map +0 -1
  20. package/dist/app/open-url.mjs +0 -28
  21. package/dist/app/session.d.mts +0 -8
  22. package/dist/app/session.d.mts.map +0 -1
  23. package/dist/app/session.mjs +0 -155
  24. package/dist/app/ssh.d.mts +0 -3
  25. package/dist/app/ssh.d.mts.map +0 -1
  26. package/dist/app/ssh.mjs +0 -218
  27. package/dist/db/analyze.d.mts +0 -3
  28. package/dist/db/analyze.d.mts.map +0 -1
  29. package/dist/db/analyze.mjs +0 -16
  30. package/dist/db/attributes.d.mts +0 -16
  31. package/dist/db/attributes.d.mts.map +0 -1
  32. package/dist/db/attributes.mjs +0 -37
  33. package/dist/db/enums.d.mts +0 -8
  34. package/dist/db/enums.d.mts.map +0 -1
  35. package/dist/db/enums.mjs +0 -24
  36. package/dist/db/file-stats.d.mts +0 -11
  37. package/dist/db/file-stats.d.mts.map +0 -1
  38. package/dist/db/file-stats.mjs +0 -43
  39. package/dist/db/foreign-keys.d.mts +0 -14
  40. package/dist/db/foreign-keys.d.mts.map +0 -1
  41. package/dist/db/foreign-keys.mjs +0 -44
  42. package/dist/db/index.d.mts +0 -10
  43. package/dist/db/index.d.mts.map +0 -1
  44. package/dist/db/index.mjs +0 -10
  45. package/dist/db/indexes.d.mts +0 -16
  46. package/dist/db/indexes.d.mts.map +0 -1
  47. package/dist/db/indexes.mjs +0 -38
  48. package/dist/db/relations.d.mts +0 -11
  49. package/dist/db/relations.d.mts.map +0 -1
  50. package/dist/db/relations.mjs +0 -32
  51. package/dist/db/stats.d.mts +0 -12
  52. package/dist/db/stats.d.mts.map +0 -1
  53. package/dist/db/stats.mjs +0 -34
  54. package/dist/db/version.d.mts +0 -14
  55. package/dist/db/version.d.mts.map +0 -1
  56. package/dist/db/version.mjs +0 -27
  57. package/dist/index.d.mts +0 -23
  58. package/dist/index.d.mts.map +0 -1
  59. package/dist/lib/env.d.mts +0 -2
  60. package/dist/lib/env.d.mts.map +0 -1
  61. package/dist/lib/env.mjs +0 -4
  62. package/dist/lib/trpc-url.d.mts +0 -2
  63. package/dist/lib/trpc-url.d.mts.map +0 -1
  64. package/dist/lib/trpc-url.mjs +0 -5
  65. package/dist/lib/trpc.d.mts +0 -7
  66. package/dist/lib/trpc.d.mts.map +0 -1
  67. package/dist/lib/trpc.mjs +0 -37
  68. package/dist/lib/trpc.react.d.mts +0 -4
  69. package/dist/lib/trpc.react.d.mts.map +0 -1
  70. package/dist/lib/trpc.react.mjs +0 -3
  71. package/dist/lib/version.d.mts +0 -2
  72. package/dist/lib/version.d.mts.map +0 -1
  73. package/dist/lib/version.mjs +0 -5
  74. package/dist/logger.d.mts +0 -3
  75. package/dist/logger.d.mts.map +0 -1
  76. package/dist/logger.mjs +0 -8
  77. package/dist/providers/TrpcProvider.d.ts +0 -9
  78. package/dist/providers/TrpcProvider.d.ts.map +0 -1
  79. package/dist/providers/TrpcProvider.js +0 -41
  80. package/dist/store.d.mts +0 -83
  81. package/dist/store.d.mts.map +0 -1
  82. package/dist/store.mjs +0 -84
  83. package/dist/types/connection.d.mts +0 -17
  84. package/dist/types/connection.d.mts.map +0 -1
  85. package/dist/types/connection.mjs +0 -2
  86. package/dist/ui/App.d.ts +0 -10
  87. package/dist/ui/App.d.ts.map +0 -1
  88. package/dist/ui/App.js +0 -23
  89. package/dist/ui/components/DB.d.ts +0 -10
  90. package/dist/ui/components/DB.d.ts.map +0 -1
  91. package/dist/ui/components/DB.js +0 -22
  92. package/dist/ui/components/Error.d.ts +0 -7
  93. package/dist/ui/components/Error.d.ts.map +0 -1
  94. package/dist/ui/components/Error.js +0 -6
  95. package/dist/ui/components/Gate.d.ts +0 -10
  96. package/dist/ui/components/Gate.d.ts.map +0 -1
  97. package/dist/ui/components/Gate.js +0 -15
  98. package/dist/ui/components/Introspect.d.ts +0 -10
  99. package/dist/ui/components/Introspect.d.ts.map +0 -1
  100. package/dist/ui/components/Introspect.js +0 -66
  101. package/dist/ui/components/OutputJson.d.ts +0 -10
  102. package/dist/ui/components/OutputJson.d.ts.map +0 -1
  103. package/dist/ui/components/OutputJson.js +0 -18
  104. package/dist/ui/components/PasswordInput.d.ts +0 -7
  105. package/dist/ui/components/PasswordInput.d.ts.map +0 -1
  106. package/dist/ui/components/PasswordInput.js +0 -32
  107. package/dist/ui/components/SSH.d.ts +0 -10
  108. package/dist/ui/components/SSH.d.ts.map +0 -1
  109. package/dist/ui/components/SSH.js +0 -22
  110. package/dist/ui/components/Session.d.ts +0 -10
  111. package/dist/ui/components/Session.d.ts.map +0 -1
  112. package/dist/ui/components/Session.js +0 -47
  113. package/dist/ui/components/Spinner.d.ts +0 -3
  114. package/dist/ui/components/Spinner.d.ts.map +0 -1
  115. package/dist/ui/components/Spinner.js +0 -18
  116. package/dist/ui/components/Splash.d.ts +0 -3
  117. package/dist/ui/components/Splash.d.ts.map +0 -1
  118. package/dist/ui/components/Splash.js +0 -13
  119. package/dist/ui/components/TextInput.d.ts +0 -11
  120. package/dist/ui/components/TextInput.d.ts.map +0 -1
  121. package/dist/ui/components/TextInput.js +0 -286
  122. package/dist/ui/components/UserExplanation.d.ts +0 -10
  123. package/dist/ui/components/UserExplanation.d.ts.map +0 -1
  124. package/dist/ui/components/UserExplanation.js +0 -34
  125. package/dist/validatePaths.d.mts +0 -13
  126. package/dist/validatePaths.d.mts.map +0 -1
  127. package/dist/validatePaths.mjs +0 -54
@@ -1,108 +0,0 @@
1
- import { existsSync } from 'fs';
2
- import { hostname, totalmem, userInfo } from 'os';
3
- import { basename, join } from 'path';
4
- import { cwd, env, platform } from 'process';
5
- export const detectOS = () => platform === 'darwin'
6
- ? 'macos'
7
- : platform === 'win32'
8
- ? 'windows'
9
- : 'linux';
10
- export const detectShell = () => {
11
- if (platform === 'win32') {
12
- return 'powershell';
13
- }
14
- const shell = env.SHELL;
15
- if (!shell) {
16
- return 'other';
17
- }
18
- const name = basename(shell);
19
- const known = {
20
- bash: 'bash',
21
- zsh: 'zsh',
22
- ksh: 'ksh',
23
- fish: 'fish',
24
- ash: 'ash',
25
- };
26
- return known[name] ?? 'other';
27
- };
28
- export const detectWSL = () => !!(env.WSL_DISTRO_NAME || env.WSLENV);
29
- const GB = 1024 ** 3;
30
- export const detectSystemMemory = () => {
31
- const bytes = totalmem();
32
- if (bytes < 12 * GB) {
33
- return '8g';
34
- }
35
- if (bytes < 20 * GB) {
36
- return '16g';
37
- }
38
- if (bytes < 28 * GB) {
39
- return '24g';
40
- }
41
- if (bytes < 48 * GB) {
42
- return '32g';
43
- }
44
- return 'more';
45
- };
46
- export const detectPackageManager = () => {
47
- const agent = env.npm_config_user_agent ?? '';
48
- const known = [
49
- 'pnpm',
50
- 'yarn',
51
- 'bun',
52
- 'deno',
53
- ];
54
- const match = known.find((pm) => agent.startsWith(pm));
55
- return match ?? 'npm';
56
- };
57
- // TODO: Implement hostname → provider mapping
58
- export const detectProvider = (hostname) => {
59
- const rules = [
60
- ['.neon.tech', 'neon'],
61
- ['.rds.amazonaws.com', 'aws'],
62
- ['.amazonaws.com', 'aws'],
63
- ['.supabase.co', 'supabase'],
64
- ['.supabase.com', 'supabase'],
65
- ['.database.azure.com', 'azure'],
66
- ['.cloudsql.', 'gcp'],
67
- ['.sql.goog', 'gcp'],
68
- ['.railway.app', 'railway'],
69
- ['.render.com', 'render'],
70
- ['.aivencloud.com', 'avien'],
71
- ['.aiven.io', 'avien'],
72
- ['.timescaledb.io', 'timescale_cloud'],
73
- ['.herokuapp.com', 'heroku'],
74
- ['.fly.dev', 'fly'],
75
- ['.koyeb.app', 'koyeb'],
76
- ['.db.ondigitalocean.com', 'digital_ocean'],
77
- ['.alibabaclouddb.com', 'alibada_cloud'],
78
- ];
79
- const lower = hostname.toLowerCase();
80
- const found = rules.find(([suffix]) => lower.includes(suffix));
81
- return found?.[1] ?? 'other';
82
- };
83
- const aiAssistantRules = [
84
- ['cursor', ['.cursor', '.cursorrules']],
85
- ['claude_code', ['.claude', 'CLAUDE.md']],
86
- ['opencode', ['.opencode']],
87
- ['aider', ['.aider.conf.yml', '.aider.chat.history.md']],
88
- ['openai_codex', ['.codex']],
89
- ['github_copilot', ['.github/copilot-instructions.md']],
90
- ];
91
- export const detectAIAssistants = () => {
92
- const root = cwd();
93
- return aiAssistantRules
94
- .filter(([, paths]) => paths.some((p) => existsSync(join(root, p))))
95
- .map(([name]) => name);
96
- };
97
- export const detectDocker = () => existsSync('/.dockerenv');
98
- export const detectSSHSession = () => !!(env.SSH_CONNECTION || env.SSH_CLIENT || env.SSH_TTY);
99
- export const detectHostname = () => hostname();
100
- export const detectUsername = () => userInfo().username;
101
- export const isLocalhost = (hostname) => {
102
- const lower = hostname.toLowerCase();
103
- return (lower === 'localhost' ||
104
- lower === '127.0.0.1' ||
105
- lower === '::1' ||
106
- lower === '0.0.0.0');
107
- };
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0Lm1qcyIsInNvdXJjZVJvb3QiOiIuL3NyYy8iLCJzb3VyY2VzIjpbImFwcC9kZXRlY3QubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxJQUFJLENBQUM7QUFDOUIsT0FBTyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQ2hELE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQVczQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBUSxFQUFFLENBQzlCLFFBQVEsS0FBSyxRQUFRO0lBQ2pCLENBQUMsQ0FBQyxPQUFPO0lBQ1QsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPO1FBQ3BCLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUVwQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBVyxFQUFFO0lBQ3BDLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO0lBRXhCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNULE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQTJCO1FBQ2xDLElBQUksRUFBRSxNQUFNO1FBQ1osR0FBRyxFQUFFLEtBQUs7UUFDVixHQUFHLEVBQUUsS0FBSztRQUNWLElBQUksRUFBRSxNQUFNO1FBQ1osR0FBRyxFQUFFLEtBQUs7S0FDYixDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElB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R0FBRyxHQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO0FBRWhFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQWdCLEVBQVcsRUFBRTtJQUNyRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFckMsT0FBTyxDQUNILEtBQUssS0FBSyxXQUFXO1FBQ3JCLEtBQUssS0FBSyxXQUFXO1FBQ3JCLEtBQUssS0FBSyxLQUFLO1FBQ2YsS0FBSyxLQUFLLFNBQVMsQ0FDdEIsQ0FBQztBQUNOLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXhpc3RzU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtob3N0bmFtZSwgdG90YWxtZW0sIHVzZXJJbmZvfSBmcm9tICdvcyc7XG5pbXBvcnQge2Jhc2VuYW1lLCBqb2lufSBmcm9tICdwYXRoJztcbmltcG9ydCB7Y3dkLCBlbnYsIHBsYXRmb3JtfSBmcm9tICdwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIFRBSUFzc2lzdGFudCxcbiAgICBURGF0YWJhc2VQcm92aWRlcixcbiAgICBUT3MsXG4gICAgVFNoZWxsLFxuICAgIFRTeXN0ZW1NZW1vcnksXG4gICAgVFBhY2thZ2VNYW5hZ2VyLFxufSBmcm9tICdAZGJjdHgvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RPUyA9ICgpOiBUT3MgPT5cbiAgICBwbGF0Zm9ybSA9PT0gJ2RhcndpbidcbiAgICAgICAgPyAnbWFjb3MnXG4gICAgICAgIDogcGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICAgICAgICA/ICd3aW5kb3dzJ1xuICAgICAgICAgIDogJ2xpbnV4JztcblxuZXhwb3J0IGNvbnN0IGRldGVjdFNoZWxsID0gKCk6IFRTaGVsbCA9PiB7XG4gICAgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIHJldHVybiAncG93ZXJzaGVsbCc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hlbGwgPSBlbnYuU0hFTEw7XG5cbiAgICBpZiAoIXNoZWxsKSB7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShzaGVsbCk7XG4gICAgY29uc3Qga25vd246IFJlY29yZDxzdHJpbmcsIFRTaGVsbD4gPSB7XG4gICAgICAgIGJhc2g6ICdiYXNoJyxcbiAgICAgICAgenNoOiAnenNoJyxcbiAgICAgICAga3NoOiAna3NoJyxcbiAgICAgICAgZmlzaDogJ2Zpc2gnLFxuICAgICAgICBhc2g6ICdhc2gnLFxuICAgIH07XG5cbiAgICByZXR1cm4ga25vd25bbmFtZV0gPz8gJ290aGVyJztcbn07XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RXU0wgPSAoKTogYm9vbGVhbiA9PiAhIShlbnYuV1NMX0RJU1RST19OQU1FIHx8IGVudi5XU0xFTlYpO1xuXG5jb25zdCBHQiA9IDEwMjQgKiogMztcblxuZXhwb3J0IGNvbnN0IGRldGVjdFN5c3RlbU1lbW9yeSA9ICgpOiBUU3lzdGVtTWVtb3J5ID0+IHtcbiAgICBjb25zdCBieXRlcyA9IHRvdGFsbWVtKCk7XG5cbiAgICBpZiAoYnl0ZXMgPCAxMiAqIEdCKSB7XG4gICAgICAgIHJldHVybiAnOGcnO1xuICAgIH1cbiAgICBpZiAoYnl0ZXMgPCAyMCAqIEdCKSB7XG4gICAgICAgIHJldHVybiAnMTZnJztcbiAgICB9XG4gICAgaWYgKGJ5dGVzIDwgMjggKiBHQikge1xuICAgICAgICByZXR1cm4gJzI0Zyc7XG4gICAgfVxuICAgIGlmIChieXRlcyA8IDQ4ICogR0IpIHtcbiAgICAgICAgcmV0dXJuICczMmcnO1xuICAgIH1cblxuICAgIHJldHVybiAnbW9yZSc7XG59O1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0UGFja2FnZU1hbmFnZXIgPSAoKTogVFBhY2thZ2VNYW5hZ2VyID0+IHtcbiAgICBjb25zdCBhZ2VudCA9IGVudi5ucG1fY29uZmlnX3VzZXJfYWdlbnQgPz8gJyc7XG4gICAgY29uc3Qga25vd246IHJlYWRvbmx5IFRQYWNrYWdlTWFuYWdlcltdID0gW1xuICAgICAgICAncG5wbScsXG4gICAgICAgICd5YXJuJyxcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICdkZW5vJyxcbiAgICBdIGFzIGNvbnN0O1xuXG4gICAgY29uc3QgbWF0Y2ggPSBrbm93bi5maW5kKChwbSkgPT4gYWdlbnQuc3RhcnRzV2l0aChwbSkpO1xuXG4gICAgcmV0dXJuIG1hdGNoID8/ICducG0nO1xufTtcblxuLy8gVE9ETzogSW1wbGVtZW50IGhvc3RuYW1lIOKGkiBwcm92aWRlciBtYXBwaW5nXG5leHBvcnQgY29uc3QgZGV0ZWN0UHJvdmlkZXIgPSAoaG9zdG5hbWU6IHN0cmluZyk6IFREYXRhYmFzZVByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBydWxlczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBURGF0YWJhc2VQcm92aWRlcl0+ID0gW1xuICAgICAgICBbJy5uZW9uLnRlY2gnLCAnbmVvbiddLFxuICAgICAgICBbJy5yZHMuYW1hem9uYXdzLmNvbScsICdhd3MnXSxcbiAgICAgICAgWycuYW1hem9uYXdzLmNvbScsICdhd3MnXSxcbiAgICAgICAgWycuc3VwYWJhc2UuY28nLCAnc3VwYWJhc2UnXSxcbiAgICAgICAgWycuc3VwYWJhc2UuY29tJywgJ3N1cGFiYXNlJ10sXG4gICAgICAgIFsnLmRhdGFiYXNlLmF6dXJlLmNvbScsICdhenVyZSddLFxuICAgICAgICBbJy5jbG91ZHNxbC4nLCAnZ2NwJ10sXG4gICAgICAgIFsnLnNxbC5nb29nJywgJ2djcCddLFxuICAgICAgICBbJy5yYWlsd2F5LmFwcCcsICdyYWlsd2F5J10sXG4gICAgICAgIFsnLnJlbmRlci5jb20nLCAncmVuZGVyJ10sXG4gICAgICAgIFsnLmFpdmVuY2xvdWQuY29tJywgJ2F2aWVuJ10sXG4gICAgICAgIFsnLmFpdmVuLmlvJywgJ2F2aWVuJ10sXG4gICAgICAgIFsnLnRpbWVzY2FsZWRiLmlvJywgJ3RpbWVzY2FsZV9jbG91ZCddLFxuICAgICAgICBbJy5oZXJva3VhcHAuY29tJywgJ2hlcm9rdSddLFxuICAgICAgICBbJy5mbHkuZGV2JywgJ2ZseSddLFxuICAgICAgICBbJy5rb3llYi5hcHAnLCAna295ZWInXSxcbiAgICAgICAgWycuZGIub25kaWdpdGFsb2NlYW4uY29tJywgJ2RpZ2l0YWxfb2NlYW4nXSxcbiAgICAgICAgWycuYWxpYmFiYWNsb3VkZGIuY29tJywgJ2FsaWJhZGFfY2xvdWQnXSxcbiAgICBdO1xuXG4gICAgY29uc3QgbG93ZXIgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZvdW5kID0gcnVsZXMuZmluZCgoW3N1ZmZpeF0pID0+IGxvd2VyLmluY2x1ZGVzKHN1ZmZpeCkpO1xuXG4gICAgcmV0dXJuIGZvdW5kPy5bMV0gPz8gJ290aGVyJztcbn07XG5cbmNvbnN0IGFpQXNzaXN0YW50UnVsZXM6IFJlYWRvbmx5QXJyYXk8XG4gICAgcmVhZG9ubHkgW1RBSUFzc2lzdGFudCwgUmVhZG9ubHlBcnJheTxzdHJpbmc+XVxuPiA9IFtcbiAgICBbJ2N1cnNvcicsIFsnLmN1cnNvcicsICcuY3Vyc29ycnVsZXMnXV0sXG4gICAgWydjbGF1ZGVfY29kZScsIFsnLmNsYXVkZScsICdDTEFVREUubWQnXV0sXG4gICAgWydvcGVuY29kZScsIFsnLm9wZW5jb2RlJ11dLFxuICAgIFsnYWlkZXInLCBbJy5haWRlci5jb25mLnltbCcsICcuYWlkZXIuY2hhdC5oaXN0b3J5Lm1kJ11dLFxuICAgIFsnb3BlbmFpX2NvZGV4JywgWycuY29kZXgnXV0sXG4gICAgWydnaXRodWJfY29waWxvdCcsIFsnLmdpdGh1Yi9jb3BpbG90LWluc3RydWN0aW9ucy5tZCddXSxcbl07XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RBSUFzc2lzdGFudHMgPSAoKTogVEFJQXNzaXN0YW50W10gPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBjd2QoKTtcblxuICAgIHJldHVybiBhaUFzc2lzdGFudFJ1bGVzXG4gICAgICAgIC5maWx0ZXIoKFssIHBhdGhzXSkgPT4gcGF0aHMuc29tZSgocCkgPT4gZXhpc3RzU3luYyhqb2luKHJvb3QsIHApKSkpXG4gICAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0RG9ja2VyID0gKCk6IGJvb2xlYW4gPT4gZXhpc3RzU3luYygnLy5kb2NrZXJlbnYnKTtcblxuZXhwb3J0IGNvbnN0IGRldGVjdFNTSFNlc3Npb24gPSAoKTogYm9vbGVhbiA9PlxuICAgICEhKGVudi5TU0hfQ09OTkVDVElPTiB8fCBlbnYuU1NIX0NMSUVOVCB8fCBlbnYuU1NIX1RUWSk7XG5cbmV4cG9ydCBjb25zdCBkZXRlY3RIb3N0bmFtZSA9ICgpOiBzdHJpbmcgPT4gaG9zdG5hbWUoKTtcblxuZXhwb3J0IGNvbnN0IGRldGVjdFVzZXJuYW1lID0gKCk6IHN0cmluZyA9PiB1c2VySW5mbygpLnVzZXJuYW1lO1xuXG5leHBvcnQgY29uc3QgaXNMb2NhbGhvc3QgPSAoaG9zdG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGxvd2VyID0gaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIGxvd2VyID09PSAnbG9jYWxob3N0JyB8fFxuICAgICAgICBsb3dlciA9PT0gJzEyNy4wLjAuMScgfHxcbiAgICAgICAgbG93ZXIgPT09ICc6OjEnIHx8XG4gICAgICAgIGxvd2VyID09PSAnMC4wLjAuMCdcbiAgICApO1xufTtcbiJdfQ==
@@ -1,3 +0,0 @@
1
- import { TStore } from '../store.mjs';
2
- export declare function run(store: TStore): Promise<void>;
3
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"./src/","sources":["app/index.mts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAgBpC,wBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,iBAyLtC"}
@@ -1,156 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import { mkdir, writeFile } from 'node:fs/promises';
3
- import { dirname } from 'node:path';
4
- import { connectSSH } from './ssh.mjs';
5
- import { connectDB } from './db.mjs';
6
- import { assembleDatabase } from './assemble.mjs';
7
- import { createSession, waitForAuthorization, connectAccount, checkGate, } from './session.mjs';
8
- import { readConfig, flushConfig } from './config.mjs';
9
- import { TRPCClientError } from '@trpc/client';
10
- import { when, runInAction } from 'mobx';
11
- import { DBCTX_DEV } from '#client/lib/env.mjs';
12
- import { logger } from '../logger.mjs';
13
- export async function run(store) {
14
- try {
15
- const cleanupSSH = await connectSSH(store);
16
- if (store.steps.sshConnection.enabled) {
17
- await when(() => ['connected', 'error'].includes(store.steps.sshConnection.state));
18
- if (store.steps.sshConnection.state === 'error') {
19
- cleanupSSH?.();
20
- return;
21
- }
22
- if (store.outputOptions.stopAfter === 'ssh-connect') {
23
- cleanupSSH?.();
24
- process.exit(0);
25
- }
26
- }
27
- const db = await connectDB(store);
28
- await when(() => ['connected', 'error'].includes(store.steps.databaseConnection.state));
29
- if (store.steps.databaseConnection.state === 'error') {
30
- db?.cleanup();
31
- cleanupSSH?.();
32
- return;
33
- }
34
- if (store.outputOptions.stopAfter === 'db-connect') {
35
- db?.cleanup();
36
- cleanupSSH?.();
37
- process.exit(0);
38
- }
39
- if (db) {
40
- const result = await assembleDatabase(db.pool, store);
41
- if (DBCTX_DEV) {
42
- const { databaseIntrospectionSchema } = await import('@dbctx/core/schemas/introspection');
43
- databaseIntrospectionSchema.parse(result);
44
- }
45
- if (store.outputOptions.stopAfter === 'introspection') {
46
- db.pool.end();
47
- cleanupSSH?.();
48
- process.exit(0);
49
- }
50
- // Account + gate check (before explanation prompt)
51
- const config = await readConfig();
52
- try {
53
- const sessionId = await createSession(db.pool, result, store, config.token ?? null, config.device_id);
54
- if (config.token) {
55
- try {
56
- await connectAccount(config.token, store);
57
- const canContinue = await checkGate(config.token, store);
58
- if (!canContinue) {
59
- db.pool.end();
60
- return;
61
- }
62
- }
63
- catch (err) {
64
- if (err instanceof TRPCClientError &&
65
- (err.data?.code === 'UNAUTHORIZED' ||
66
- err.data?.code === 'NOT_FOUND')) {
67
- await flushConfig();
68
- }
69
- else {
70
- throw err;
71
- }
72
- }
73
- }
74
- if (store.steps.account.state !== 'connected') {
75
- await waitForAuthorization(sessionId, store);
76
- const freshToken = (await readConfig()).token;
77
- if (freshToken) {
78
- const canContinue = await checkGate(freshToken, store);
79
- if (!canContinue) {
80
- db.pool.end();
81
- return;
82
- }
83
- }
84
- }
85
- }
86
- catch (err) {
87
- runInAction(() => {
88
- store.steps.account.state = 'error';
89
- store.steps.account.error =
90
- err instanceof Error
91
- ? err.message
92
- : 'Session creation failed';
93
- });
94
- }
95
- // User explanation step
96
- if (store.outputOptions.explanation) {
97
- runInAction(() => {
98
- store.steps.userExplanation.state = 'done';
99
- store.steps.userExplanation.value =
100
- store.outputOptions.explanation;
101
- });
102
- result.userExplanation = store.outputOptions.explanation;
103
- }
104
- else {
105
- runInAction(() => {
106
- store.steps.userExplanation.state = 'prompting';
107
- });
108
- await when(() => store.steps.userExplanation.state === 'done');
109
- result.userExplanation = store.steps.userExplanation.value;
110
- }
111
- if (store.outputOptions.outputIntrospectionJson) {
112
- const outputPath = store.outputOptions.outputIntrospectionJson;
113
- if (existsSync(outputPath) && !store.outputOptions.overwrite) {
114
- runInAction(() => {
115
- store.steps.outputJson.state = 'prompting-overwrite';
116
- store.steps.outputJson.path = outputPath;
117
- });
118
- await when(() => store.steps.outputJson.confirmed !== null);
119
- if (!store.steps.outputJson.confirmed) {
120
- db.pool.end();
121
- cleanupSSH?.();
122
- process.exit(0);
123
- }
124
- }
125
- runInAction(() => {
126
- store.steps.outputJson.state = 'writing';
127
- store.steps.outputJson.path = outputPath;
128
- });
129
- try {
130
- await mkdir(dirname(outputPath), { recursive: true });
131
- await writeFile(outputPath, JSON.stringify(result, null, 2));
132
- runInAction(() => {
133
- store.steps.outputJson.state = 'done';
134
- });
135
- }
136
- catch (err) {
137
- runInAction(() => {
138
- store.steps.outputJson.state = 'error';
139
- store.steps.outputJson.error =
140
- err instanceof Error ? err.message : String(err);
141
- });
142
- db.pool.end();
143
- cleanupSSH?.();
144
- return;
145
- }
146
- }
147
- db.pool.end();
148
- }
149
- }
150
- catch (err) {
151
- if (DBCTX_DEV) {
152
- logger.error(`${err}`, { error: err });
153
- }
154
- }
155
- }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL2luZGV4Lm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdsQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUNILGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsR0FBRyxDQUFDLEtBQWE7SUFDbkMsSUFBSSxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0MsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDWixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFR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LENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pELENBQUMsQ0FBQyxDQUFDO29CQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2QsVUFBVSxFQUFFLEVBQUUsQ0FBQztvQkFDZixPQUFPO2dCQUNYLENBQUM7WUFDTCxDQUFDO1lBRUQsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0wsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDWCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ1osTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtleGlzdHNTeW5jfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7bWtkaXIsIHdyaXRlRmlsZX0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQge2Rpcm5hbWV9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHtjb25uZWN0U1NIfSBmcm9tICcuL3NzaC5tanMnO1xuaW1wb3J0IHtjb25uZWN0REJ9IGZyb20gJy4vZGIubWpzJztcbmltcG9ydCB7YXNzZW1ibGVEYXRhYmFzZX0gZnJvbSAnLi9hc3NlbWJsZS5tanMnO1xuaW1wb3J0IHtcbiAgICBjcmVhdGVTZXNzaW9uLFxuICAgIHdhaXRGb3JBdXRob3JpemF0aW9uLFxuICAgIGNvbm5lY3RBY2NvdW50LFxuICAgIGNoZWNrR2F0ZSxcbn0gZnJvbSAnLi9zZXNzaW9uLm1qcyc7XG5pbXBvcnQge3JlYWRDb25maWcsIGZsdXNoQ29uZmlnfSBmcm9tICcuL2NvbmZpZy5tanMnO1xuaW1wb3J0IHtUUlBDQ2xpZW50RXJyb3J9IGZyb20gJ0B0cnBjL2NsaWVudCc7XG5pbXBvcnQge3doZW4sIHJ1bkluQWN0aW9ufSBmcm9tICdtb2J4JztcbmltcG9ydCB7REJDVFhfREVWfSBmcm9tICcjY2xpZW50L2xpYi9lbnYubWpzJztcbmltcG9ydCB7bG9nZ2VyfSBmcm9tICcuLi9sb2dnZXIubWpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bihzdG9yZTogVFN0b3JlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xlYW51cFNTSCA9IGF3YWl0IGNvbm5lY3RTU0goc3RvcmUpO1xuXG4gICAgICAgIGlmIChzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHdoZW4oKCkgPT5cbiAgICAgICAgICAgICAgICBbJ2Nvbm5lY3RlZCcsICdlcnJvciddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5zc2hDb25uZWN0aW9uLnN0YXRlLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc3RvcmUuc3RlcHMuc3NoQ29ubmVjdGlvbi5zdGF0ZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgIGNsZWFudXBTU0g/LigpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3JlLm91dHB1dE9wdGlvbnMuc3RvcEFmdGVyID09PSAnc3NoLWNvbm5lY3QnKSB7XG4gICAgICAgICAgICAgICAgY2xlYW51cFNTSD8uKCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBjb25uZWN0REIoc3RvcmUpO1xuXG4gICAgICAgIGF3YWl0IHdoZW4oKCkgPT5cbiAgICAgICAgICAgIFsnY29ubmVjdGVkJywgJ2Vycm9yJ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnN0YXRlLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoc3RvcmUuc3RlcHMuZGF0YWJhc2VDb25uZWN0aW9uLnN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBkYj8uY2xlYW51cCgpO1xuICAgICAgICAgICAgY2xlYW51cFNTSD8uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RvcmUub3V0cHV0T3B0aW9ucy5zdG9wQWZ0ZXIgPT09ICdkYi1jb25uZWN0Jykge1xuICAgICAgICAgICAgZGI/LmNsZWFudXAoKTtcbiAgICAgICAgICAgIGNsZWFudXBTU0g/LigpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRiKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhc3NlbWJsZURhdGFiYXNlKGRiLnBvb2wsIHN0b3JlKTtcblxuICAgICAgICAgICAgaWYgKERCQ1RYX0RFVikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtkYXRhYmFzZUludHJvc3BlY3Rpb25TY2hlbWF9ID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaW1wb3J0KCdAZGJjdHgvY29yZS9zY2hlbWFzL2ludHJvc3BlY3Rpb24nKTtcbiAgICAgICAgICAgICAgICBkYXRhYmFzZUludHJvc3BlY3Rpb25TY2hlbWEucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3JlLm91dHB1dE9wdGlvbnMuc3RvcEFmdGVyID09PSAnaW50cm9zcGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBkYi5wb29sLmVuZCgpO1xuICAgICAgICAgICAgICAgIGNsZWFudXBTU0g/LigpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWNjb3VudCArIGdhdGUgY2hlY2sgKGJlZm9yZSBleHBsYW5hdGlvbiBwcm9tcHQpXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZWFkQ29uZmlnKCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gYXdhaXQgY3JlYXRlU2Vzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgZGIucG9vbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRva2VuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5kZXZpY2VfaWQsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RBY2NvdW50KGNvbmZpZy50b2tlbiwgc3RvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuQ29udGludWUgPSBhd2FpdCBjaGVja0dhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuQ29udGludWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5wb29sLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgVFJQQ0NsaWVudEVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyci5kYXRhPy5jb2RlID09PSAnVU5BVVRIT1JJWkVEJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuZGF0YT8uY29kZSA9PT0gJ05PVF9GT1VORCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmbHVzaENvbmZpZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RvcmUuc3RlcHMuYWNjb3VudC5zdGF0ZSAhPT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd2FpdEZvckF1dGhvcml6YXRpb24oc2Vzc2lvbklkLCBzdG9yZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJlc2hUb2tlbiA9IChhd2FpdCByZWFkQ29uZmlnKCkpLnRva2VuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FuQ29udGludWUgPSBhd2FpdCBjaGVja0dhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbkNvbnRpbnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIucG9vbC5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LmVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1Nlc3Npb24gY3JlYXRpb24gZmFpbGVkJztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXNlciBleHBsYW5hdGlvbiBzdGVwXG4gICAgICAgICAgICBpZiAoc3RvcmUub3V0cHV0T3B0aW9ucy5leHBsYW5hdGlvbikge1xuICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMudXNlckV4cGxhbmF0aW9uLnN0YXRlID0gJ2RvbmUnO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy51c2VyRXhwbGFuYXRpb24udmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUub3V0cHV0T3B0aW9ucy5leHBsYW5hdGlvbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXN1bHQudXNlckV4cGxhbmF0aW9uID0gc3RvcmUub3V0cHV0T3B0aW9ucy5leHBsYW5hdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy51c2VyRXhwbGFuYXRpb24uc3RhdGUgPSAncHJvbXB0aW5nJztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3aGVuKCgpID0+IHN0b3JlLnN0ZXBzLnVzZXJFeHBsYW5hdGlvbi5zdGF0ZSA9PT0gJ2RvbmUnKTtcbiAgICAgICAgICAgICAgICByZXN1bHQudXNlckV4cGxhbmF0aW9uID0gc3RvcmUuc3RlcHMudXNlckV4cGxhbmF0aW9uLnZhbHVlITtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0b3JlLm91dHB1dE9wdGlvbnMub3V0cHV0SW50cm9zcGVjdGlvbkpzb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gc3RvcmUub3V0cHV0T3B0aW9ucy5vdXRwdXRJbnRyb3NwZWN0aW9uSnNvbjtcblxuICAgICAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKG91dHB1dFBhdGgpICYmICFzdG9yZS5vdXRwdXRPcHRpb25zLm92ZXJ3cml0ZSkge1xuICAgICAgICAgICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5vdXRwdXRKc29uLnN0YXRlID0gJ3Byb21wdGluZy1vdmVyd3JpdGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMub3V0cHV0SnNvbi5wYXRoID0gb3V0cHV0UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgd2hlbigoKSA9PiBzdG9yZS5zdGVwcy5vdXRwdXRKc29uLmNvbmZpcm1lZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9yZS5zdGVwcy5vdXRwdXRKc29uLmNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGIucG9vbC5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBTU0g/LigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5vdXRwdXRKc29uLnN0YXRlID0gJ3dyaXRpbmcnO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5vdXRwdXRKc29uLnBhdGggPSBvdXRwdXRQYXRoO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShvdXRwdXRQYXRoKSwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMub3V0cHV0SnNvbi5zdGF0ZSA9ICdkb25lJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLnN0ZXBzLm91dHB1dEpzb24uc3RhdGUgPSAnZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMub3V0cHV0SnNvbi5lcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGIucG9vbC5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cFNTSD8uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRiLnBvb2wuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKERCQ1RYX0RFVikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGAke2Vycn1gLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
@@ -1,4 +0,0 @@
1
- export declare const shouldOpenBrowser: () => boolean;
2
- export declare const buildSessionURL: (sessionId: string) => string;
3
- export declare const openSessionURL: (url: string) => Promise<void>;
4
- //# sourceMappingURL=open-url.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open-url.d.mts","sourceRoot":"./src/","sources":["app/open-url.mts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,QAAO,OAQpC,CAAC;AAMF,eAAO,MAAM,eAAe,GAAI,WAAW,MAAM,KAAG,MACH,CAAC;AAElD,eAAO,MAAM,cAAc,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAW9D,CAAC"}
@@ -1,28 +0,0 @@
1
- import { env } from 'process';
2
- import { DBCTX_DEV } from '#client/lib/env.mjs';
3
- const SKIP_VALUES = new Set(['none', 'false', '0']);
4
- const isDocker = () => !!(env.DOCKER || env.container || env.DOCKER_CONTAINER);
5
- export const shouldOpenBrowser = () => {
6
- if (isDocker()) {
7
- return false;
8
- }
9
- const browser = env.BROWSER?.toLowerCase();
10
- return !browser || !SKIP_VALUES.has(browser);
11
- };
12
- const SESSION_BASE_URL = !DBCTX_DEV
13
- ? 'https://dbctx.io/authorize/session'
14
- : 'http://localhost:12002/authorize/session';
15
- export const buildSessionURL = (sessionId) => `${SESSION_BASE_URL}?session-id=${sessionId}`;
16
- export const openSessionURL = async (url) => {
17
- if (!shouldOpenBrowser()) {
18
- return;
19
- }
20
- try {
21
- const { default: open } = await import('open');
22
- await open(url);
23
- }
24
- catch {
25
- // Browser opening is best-effort — no-op on failure
26
- }
27
- };
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi11cmwubWpzIiwic291cmNlUm9vdCI6Ii4vc3JjLyIsInNvdXJjZXMiOlsiYXBwL29wZW4tdXJsLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUVwRCxNQUFNLFFBQVEsR0FBRyxHQUFZLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUMzQyxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDYixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUUzQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsU0FBUztJQUMvQixDQUFDLENBQUMsb0NBQW9DO0lBQ3RDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQztBQUVqRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUUsQ0FDekQsR0FBRyxnQkFBZ0IsZUFBZSxTQUFTLEVBQUUsQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLEdBQVcsRUFBaUIsRUFBRTtJQUMvRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU87SUFDWCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsTUFBTSxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ0wsb0RBQW9EO0lBQ3hELENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Vudn0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQge0RCQ1RYX0RFVn0gZnJvbSAnI2NsaWVudC9saWIvZW52Lm1qcyc7XG5cbmNvbnN0IFNLSVBfVkFMVUVTID0gbmV3IFNldChbJ25vbmUnLCAnZmFsc2UnLCAnMCddKTtcblxuY29uc3QgaXNEb2NrZXIgPSAoKTogYm9vbGVhbiA9PlxuICAgICEhKGVudi5ET0NLRVIgfHwgZW52LmNvbnRhaW5lciB8fCBlbnYuRE9DS0VSX0NPTlRBSU5FUik7XG5cbmV4cG9ydCBjb25zdCBzaG91bGRPcGVuQnJvd3NlciA9ICgpOiBib29sZWFuID0+IHtcbiAgICBpZiAoaXNEb2NrZXIoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYnJvd3NlciA9IGVudi5CUk9XU0VSPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuICFicm93c2VyIHx8ICFTS0lQX1ZBTFVFUy5oYXMoYnJvd3Nlcik7XG59O1xuXG5jb25zdCBTRVNTSU9OX0JBU0VfVVJMID0gIURCQ1RYX0RFVlxuICAgID8gJ2h0dHBzOi8vZGJjdHguaW8vYXV0aG9yaXplL3Nlc3Npb24nXG4gICAgOiAnaHR0cDovL2xvY2FsaG9zdDoxMjAwMi9hdXRob3JpemUvc2Vzc2lvbic7XG5cbmV4cG9ydCBjb25zdCBidWlsZFNlc3Npb25VUkwgPSAoc2Vzc2lvbklkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICBgJHtTRVNTSU9OX0JBU0VfVVJMfT9zZXNzaW9uLWlkPSR7c2Vzc2lvbklkfWA7XG5cbmV4cG9ydCBjb25zdCBvcGVuU2Vzc2lvblVSTCA9IGFzeW5jICh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghc2hvdWxkT3BlbkJyb3dzZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RlZmF1bHQ6IG9wZW59ID0gYXdhaXQgaW1wb3J0KCdvcGVuJyk7XG4gICAgICAgIGF3YWl0IG9wZW4odXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQnJvd3NlciBvcGVuaW5nIGlzIGJlc3QtZWZmb3J0IOKAlCBuby1vcCBvbiBmYWlsdXJlXG4gICAgfVxufTtcbiJdfQ==
@@ -1,8 +0,0 @@
1
- import type { Pool } from 'pg';
2
- import type { TStore } from '../store.mjs';
3
- import type { TDatabaseIntrospection } from '@dbctx/core';
4
- export declare const checkGate: (token: string, store: TStore) => Promise<boolean>;
5
- export declare const connectAccount: (token: string, store: TStore) => Promise<void>;
6
- export declare const createSession: (pool: Pool, result: TDatabaseIntrospection, store: TStore, token: string | null, device_id: string) => Promise<string>;
7
- export declare const waitForAuthorization: (sessionId: string, store: TStore) => Promise<void>;
8
- //# sourceMappingURL=session.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.mts","sourceRoot":"./src/","sources":["app/session.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,IAAI,CAAC;AAG7B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAqJxD,eAAO,MAAM,SAAS,GAClB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAkBjB,CAAC;AAEF,eAAO,MAAM,cAAc,GACvB,OAAO,MAAM,EACb,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAed,CAAC;AAEF,eAAO,MAAM,aAAa,GACtB,MAAM,IAAI,EACV,QAAQ,sBAAsB,EAC9B,OAAO,MAAM,EACb,OAAO,MAAM,GAAG,IAAI,EACpB,WAAW,MAAM,KAClB,OAAO,CAAC,MAAM,CA0BhB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC7B,WAAW,MAAM,EACjB,OAAO,MAAM,KACd,OAAO,CAAC,IAAI,CAYd,CAAC"}
@@ -1,155 +0,0 @@
1
- import { runInAction } from 'mobx';
2
- import { fetchRelationFileStats } from '../db/index.mjs';
3
- import { trpc, createAuthenticatedTRPCClient } from '#client/lib/trpc.mjs';
4
- import { detectAIAssistants, detectDocker, detectOS, detectShell, detectHostname, detectUsername, detectWSL, detectSystemMemory, detectPackageManager, detectProvider, isLocalhost, } from './detect.mjs';
5
- import { buildSessionURL } from './open-url.mjs';
6
- import { writeConfig } from './config.mjs';
7
- import { CLIENT_VERSION } from '#client/lib/version.mjs';
8
- const checkIsReplica = async (pool) => {
9
- const result = await pool.query('SELECT pg_is_in_recovery() AS is_replica');
10
- return result.rows[0].is_replica;
11
- };
12
- const collectMedianFileAge = async (pool, tableNames, store) => {
13
- if (tableNames.length === 0) {
14
- return null;
15
- }
16
- try {
17
- const first = await fetchRelationFileStats(pool, tableNames[0]);
18
- if (!first?.modification_time) {
19
- runInAction(() => {
20
- store.steps.introspection.fileStatsSkipped = true;
21
- });
22
- return null;
23
- }
24
- const times = [first.modification_time];
25
- const remaining = await Promise.all(tableNames.slice(1).map(async (name) => {
26
- try {
27
- const stats = await fetchRelationFileStats(pool, name);
28
- return stats?.modification_time ?? null;
29
- }
30
- catch {
31
- return null;
32
- }
33
- }));
34
- remaining.forEach((t) => {
35
- if (t) {
36
- times.push(t);
37
- }
38
- });
39
- const sorted = [...times].sort((a, b) => a.getTime() - b.getTime());
40
- const mid = Math.floor(sorted.length / 2);
41
- const median = sorted.length % 2 === 0
42
- ? new Date((sorted[mid - 1].getTime() + sorted[mid].getTime()) / 2)
43
- : sorted[mid];
44
- return median.toISOString();
45
- }
46
- catch {
47
- runInAction(() => {
48
- store.steps.introspection.fileStatsSkipped = true;
49
- });
50
- return null;
51
- }
52
- };
53
- const buildSessionInput = (result, store, isReplica, medianFileAge) => {
54
- const relations = Object.values(result.relations);
55
- return {
56
- database_name: result.name,
57
- database_object_statistics: {
58
- parent_tables: relations.filter((r) => r.kind === 'partitioned_table').length,
59
- tables: relations.filter((r) => r.kind === 'table').length,
60
- views: relations.filter((r) => r.kind === 'view').length,
61
- materialized_views: relations.filter((r) => r.kind === 'materialized_view').length,
62
- enums: store.steps.introspection.counts.enums,
63
- indexes: store.steps.introspection.counts.indexes,
64
- foreign_key_references: store.steps.introspection.counts.foreignKeys,
65
- },
66
- is_database_replica: isReplica,
67
- median_table_file_age: medianFileAge,
68
- database_type: result.type,
69
- database_version: result.version.version_number.toString(),
70
- database_version_string: result.version.version_string,
71
- database_provider: detectProvider(store.steps.databaseConnection.pickedHostname),
72
- is_local: isLocalhost(store.steps.databaseConnection.pickedHostname),
73
- is_docker: detectDocker(),
74
- is_accessed_over_ssh: store.steps.sshConnection.enabled,
75
- shell: detectShell(),
76
- os: detectOS(),
77
- is_wsl: detectWSL(),
78
- system_memory: detectSystemMemory(),
79
- package_manager: detectPackageManager(),
80
- username: detectUsername(),
81
- hostname: detectHostname(),
82
- ai_assistants: detectAIAssistants(),
83
- };
84
- };
85
- const waitForToken = (sessionId) => new Promise((resolve, reject) => {
86
- const sub = trpc.session.onAuthorization.subscribe({ session_id: sessionId }, {
87
- onData: (data) => {
88
- sub.unsubscribe();
89
- resolve(data.token);
90
- },
91
- onError: (err) => {
92
- sub.unsubscribe();
93
- reject(err);
94
- },
95
- });
96
- });
97
- export const checkGate = async (token, store) => {
98
- runInAction(() => {
99
- store.steps.gate.state = 'checking';
100
- });
101
- const authClient = createAuthenticatedTRPCClient(() => Promise.resolve(token));
102
- const result = await authClient.session.shouldContinue.query({
103
- client_version: CLIENT_VERSION,
104
- });
105
- runInAction(() => {
106
- store.steps.gate.state = result.continue ? 'passed' : 'blocked';
107
- store.steps.gate.message = result.message;
108
- });
109
- return result.continue;
110
- };
111
- export const connectAccount = async (token, store) => {
112
- runInAction(() => {
113
- store.steps.account.state = 'fetching-account';
114
- });
115
- const authClient = createAuthenticatedTRPCClient(() => Promise.resolve(token));
116
- const account = await authClient.account.getAccount.query({});
117
- runInAction(() => {
118
- store.steps.account.state = 'connected';
119
- store.steps.account.email = account.emails[0] ?? null;
120
- store.steps.account.name = account.name;
121
- });
122
- };
123
- export const createSession = async (pool, result, store, token, device_id) => {
124
- runInAction(() => {
125
- store.steps.account.state = 'creating-session';
126
- });
127
- const tableNames = Object.values(result.relations)
128
- .filter((r) => r.kind === 'table' || r.kind === 'partitioned_table')
129
- .map((r) => r.name);
130
- const [isReplica, medianFileAge] = await Promise.all([
131
- checkIsReplica(pool),
132
- collectMedianFileAge(pool, tableNames, store),
133
- ]);
134
- const input = {
135
- ...buildSessionInput(result, store, isReplica, medianFileAge),
136
- device_id,
137
- };
138
- const client = token
139
- ? createAuthenticatedTRPCClient(() => Promise.resolve(token))
140
- : trpc;
141
- const session = await client.session.create.mutate(input);
142
- return session.id;
143
- };
144
- export const waitForAuthorization = async (sessionId, store) => {
145
- const url = buildSessionURL(sessionId);
146
- runInAction(() => {
147
- store.steps.account.state = 'waiting';
148
- store.steps.account.url = url;
149
- store.steps.account.sessionId = sessionId;
150
- });
151
- const token = await waitForToken(sessionId);
152
- await writeConfig(token);
153
- await connectAccount(token, store);
154
- };
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5tanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJhcHAvc2Vzc2lvbi5tdHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUlqQyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUNILGtCQUFrQixFQUNsQixZQUFZLEVBQ1osUUFBUSxFQUNSLFdBQVcsRUFDWCxjQUFjLEVBQ2QsY0FBYyxFQUNkLFNBQVMsRUFDVCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxXQUFXLEdBQ2QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE1BQU0sY0FBYyxHQUFHLEtBQUssRUFBRSxJQUFVLEVBQW9CLEVBQUU7SUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUMzQiwwQ0FBMEMsQ0FDN0MsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDckMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQzlCLElBQVUsRUFDVixVQUE2QixFQUM3QixLQUFhLEVBQ1MsRUFBRTtJQUN4QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE1BQU0sc0JB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QUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxFQUNyQyxTQUFpQixFQUNqQixLQUFhLEVBQ0EsRUFBRTtJQUNmLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2QyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN0QyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQzlCLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1Bvb2x9IGZyb20gJ3BnJztcbmltcG9ydCB7cnVuSW5BY3Rpb259IGZyb20gJ21vYngnO1xuXG5pbXBvcnQgdHlwZSB7VFN0b3JlfSBmcm9tICcuLi9zdG9yZS5tanMnO1xuaW1wb3J0IHR5cGUge1REYXRhYmFzZUludHJvc3BlY3Rpb259IGZyb20gJ0BkYmN0eC9jb3JlJztcbmltcG9ydCB7ZmV0Y2hSZWxhdGlvbkZpbGVTdGF0c30gZnJvbSAnLi4vZGIvaW5kZXgubWpzJztcbmltcG9ydCB7dHJwYywgY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnR9IGZyb20gJyNjbGllbnQvbGliL3RycGMubWpzJztcbmltcG9ydCB7XG4gICAgZGV0ZWN0QUlBc3Npc3RhbnRzLFxuICAgIGRldGVjdERvY2tlcixcbiAgICBkZXRlY3RPUyxcbiAgICBkZXRlY3RTaGVsbCxcbiAgICBkZXRlY3RIb3N0bmFtZSxcbiAgICBkZXRlY3RVc2VybmFtZSxcbiAgICBkZXRlY3RXU0wsXG4gICAgZGV0ZWN0U3lzdGVtTWVtb3J5LFxuICAgIGRldGVjdFBhY2thZ2VNYW5hZ2VyLFxuICAgIGRldGVjdFByb3ZpZGVyLFxuICAgIGlzTG9jYWxob3N0LFxufSBmcm9tICcuL2RldGVjdC5tanMnO1xuaW1wb3J0IHtidWlsZFNlc3Npb25VUkx9IGZyb20gJy4vb3Blbi11cmwubWpzJztcbmltcG9ydCB7d3JpdGVDb25maWd9IGZyb20gJy4vY29uZmlnLm1qcyc7XG5pbXBvcnQge0NMSUVOVF9WRVJTSU9OfSBmcm9tICcjY2xpZW50L2xpYi92ZXJzaW9uLm1qcyc7XG5cbmNvbnN0IGNoZWNrSXNSZXBsaWNhID0gYXN5bmMgKHBvb2w6IFBvb2wpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5PHtpc19yZXBsaWNhOiBib29sZWFufT4oXG4gICAgICAgICdTRUxFQ1QgcGdfaXNfaW5fcmVjb3ZlcnkoKSBBUyBpc19yZXBsaWNhJyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzWzBdLmlzX3JlcGxpY2E7XG59O1xuXG5jb25zdCBjb2xsZWN0TWVkaWFuRmlsZUFnZSA9IGFzeW5jIChcbiAgICBwb29sOiBQb29sLFxuICAgIHRhYmxlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICBpZiAodGFibGVOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlyc3QgPSBhd2FpdCBmZXRjaFJlbGF0aW9uRmlsZVN0YXRzKHBvb2wsIHRhYmxlTmFtZXNbMF0pO1xuXG4gICAgICAgIGlmICghZmlyc3Q/Lm1vZGlmaWNhdGlvbl90aW1lKSB7XG4gICAgICAgICAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5maWxlU3RhdHNTa2lwcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVzOiBEYXRlW10gPSBbZmlyc3QubW9kaWZpY2F0aW9uX3RpbWVdO1xuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdGFibGVOYW1lcy5zbGljZSgxKS5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZldGNoUmVsYXRpb25GaWxlU3RhdHMocG9vbCwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0cz8ubW9kaWZpY2F0aW9uX3RpbWUgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVtYWluaW5nLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICAgdGltZXMucHVzaCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRpbWVzXS5zb3J0KChhLCBiKSA9PiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpKTtcbiAgICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcihzb3J0ZWQubGVuZ3RoIC8gMik7XG4gICAgICAgIGNvbnN0IG1lZGlhbiA9XG4gICAgICAgICAgICBzb3J0ZWQubGVuZ3RoICUgMiA9PT0gMFxuICAgICAgICAgICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgKHNvcnRlZFttaWQgLSAxXS5nZXRUaW1lKCkgKyBzb3J0ZWRbbWlkXS5nZXRUaW1lKCkpIC8gMixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHNvcnRlZFttaWRdO1xuXG4gICAgICAgIHJldHVybiBtZWRpYW4udG9JU09TdHJpbmcoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICAgICAgc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5maWxlU3RhdHNTa2lwcGVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcblxuY29uc3QgYnVpbGRTZXNzaW9uSW5wdXQgPSAoXG4gICAgcmVzdWx0OiBURGF0YWJhc2VJbnRyb3NwZWN0aW9uLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgaXNSZXBsaWNhOiBib29sZWFuLFxuICAgIG1lZGlhbkZpbGVBZ2U6IHN0cmluZyB8IG51bGwsXG4pID0+IHtcbiAgICBjb25zdCByZWxhdGlvbnMgPSBPYmplY3QudmFsdWVzKHJlc3VsdC5yZWxhdGlvbnMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YWJhc2VfbmFtZTogcmVzdWx0Lm5hbWUsXG4gICAgICAgIGRhdGFiYXNlX29iamVjdF9zdGF0aXN0aWNzOiB7XG4gICAgICAgICAgICBwYXJlbnRfdGFibGVzOiByZWxhdGlvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChyKSA9PiByLmtpbmQgPT09ICdwYXJ0aXRpb25lZF90YWJsZScsXG4gICAgICAgICAgICApLmxlbmd0aCxcbiAgICAgICAgICAgIHRhYmxlczogcmVsYXRpb25zLmZpbHRlcigocikgPT4gci5raW5kID09PSAndGFibGUnKS5sZW5ndGgsXG4gICAgICAgICAgICB2aWV3czogcmVsYXRpb25zLmZpbHRlcigocikgPT4gci5raW5kID09PSAndmlldycpLmxlbmd0aCxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZF92aWV3czogcmVsYXRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocikgPT4gci5raW5kID09PSAnbWF0ZXJpYWxpemVkX3ZpZXcnLFxuICAgICAgICAgICAgKS5sZW5ndGgsXG4gICAgICAgICAgICBlbnVtczogc3RvcmUuc3RlcHMuaW50cm9zcGVjdGlvbi5jb3VudHMuZW51bXMsXG4gICAgICAgICAgICBpbmRleGVzOiBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLmNvdW50cy5pbmRleGVzLFxuICAgICAgICAgICAgZm9yZWlnbl9rZXlfcmVmZXJlbmNlczpcbiAgICAgICAgICAgICAgICBzdG9yZS5zdGVwcy5pbnRyb3NwZWN0aW9uLmNvdW50cy5mb3JlaWduS2V5cyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNfZGF0YWJhc2VfcmVwbGljYTogaXNSZXBsaWNhLFxuICAgICAgICBtZWRpYW5fdGFibGVfZmlsZV9hZ2U6IG1lZGlhbkZpbGVBZ2UsXG4gICAgICAgIGRhdGFiYXNlX3R5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgICBkYXRhYmFzZV92ZXJzaW9uOiByZXN1bHQudmVyc2lvbi52ZXJzaW9uX251bWJlci50b1N0cmluZygpLFxuICAgICAgICBkYXRhYmFzZV92ZXJzaW9uX3N0cmluZzogcmVzdWx0LnZlcnNpb24udmVyc2lvbl9zdHJpbmcsXG4gICAgICAgIGRhdGFiYXNlX3Byb3ZpZGVyOiBkZXRlY3RQcm92aWRlcihcbiAgICAgICAgICAgIHN0b3JlLnN0ZXBzLmRhdGFiYXNlQ29ubmVjdGlvbi5waWNrZWRIb3N0bmFtZSEsXG4gICAgICAgICksXG4gICAgICAgIGlzX2xvY2FsOiBpc0xvY2FsaG9zdChzdG9yZS5zdGVwcy5kYXRhYmFzZUNvbm5lY3Rpb24ucGlja2VkSG9zdG5hbWUhKSxcbiAgICAgICAgaXNfZG9ja2VyOiBkZXRlY3REb2NrZXIoKSxcbiAgICAgICAgaXNfYWNjZXNzZWRfb3Zlcl9zc2g6IHN0b3JlLnN0ZXBzLnNzaENvbm5lY3Rpb24uZW5hYmxlZCxcbiAgICAgICAgc2hlbGw6IGRldGVjdFNoZWxsKCksXG4gICAgICAgIG9zOiBkZXRlY3RPUygpLFxuICAgICAgICBpc193c2w6IGRldGVjdFdTTCgpLFxuICAgICAgICBzeXN0ZW1fbWVtb3J5OiBkZXRlY3RTeXN0ZW1NZW1vcnkoKSxcbiAgICAgICAgcGFja2FnZV9tYW5hZ2VyOiBkZXRlY3RQYWNrYWdlTWFuYWdlcigpLFxuICAgICAgICB1c2VybmFtZTogZGV0ZWN0VXNlcm5hbWUoKSxcbiAgICAgICAgaG9zdG5hbWU6IGRldGVjdEhvc3RuYW1lKCksXG4gICAgICAgIGFpX2Fzc2lzdGFudHM6IGRldGVjdEFJQXNzaXN0YW50cygpLFxuICAgIH0gYXMgY29uc3Q7XG59O1xuXG5jb25zdCB3YWl0Rm9yVG9rZW4gPSAoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT5cbiAgICBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgc3ViID0gdHJwYy5zZXNzaW9uLm9uQXV0aG9yaXphdGlvbi5zdWJzY3JpYmUoXG4gICAgICAgICAgICB7c2Vzc2lvbl9pZDogc2Vzc2lvbklkfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvbkRhdGE6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEudG9rZW4pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfSk7XG5cbmV4cG9ydCBjb25zdCBjaGVja0dhdGUgPSBhc3luYyAoXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBzdG9yZTogVFN0b3JlLFxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5nYXRlLnN0YXRlID0gJ2NoZWNraW5nJztcbiAgICB9KTtcblxuICAgIGNvbnN0IGF1dGhDbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkVFJQQ0NsaWVudCgoKSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUodG9rZW4pLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXV0aENsaWVudC5zZXNzaW9uLnNob3VsZENvbnRpbnVlLnF1ZXJ5KHtcbiAgICAgICAgY2xpZW50X3ZlcnNpb246IENMSUVOVF9WRVJTSU9OLFxuICAgIH0pO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5nYXRlLnN0YXRlID0gcmVzdWx0LmNvbnRpbnVlID8gJ3Bhc3NlZCcgOiAnYmxvY2tlZCc7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmdhdGUubWVzc2FnZSA9IHJlc3VsdC5tZXNzYWdlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5jb250aW51ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0QWNjb3VudCA9IGFzeW5jIChcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSAnZmV0Y2hpbmctYWNjb3VudCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdXRoQ2xpZW50ID0gY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnQoKCkgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRva2VuKSxcbiAgICApO1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBhdXRoQ2xpZW50LmFjY291bnQuZ2V0QWNjb3VudC5xdWVyeSh7fSk7XG5cbiAgICBydW5JbkFjdGlvbigoKSA9PiB7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQuc3RhdGUgPSAnY29ubmVjdGVkJztcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5lbWFpbCA9IGFjY291bnQuZW1haWxzWzBdID8/IG51bGw7XG4gICAgICAgIHN0b3JlLnN0ZXBzLmFjY291bnQubmFtZSA9IGFjY291bnQubmFtZTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTZXNzaW9uID0gYXN5bmMgKFxuICAgIHBvb2w6IFBvb2wsXG4gICAgcmVzdWx0OiBURGF0YWJhc2VJbnRyb3NwZWN0aW9uLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgdG9rZW46IHN0cmluZyB8IG51bGwsXG4gICAgZGV2aWNlX2lkOiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIHJ1bkluQWN0aW9uKCgpID0+IHtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zdGF0ZSA9ICdjcmVhdGluZy1zZXNzaW9uJztcbiAgICB9KTtcblxuICAgIGNvbnN0IHRhYmxlTmFtZXMgPSBPYmplY3QudmFsdWVzKHJlc3VsdC5yZWxhdGlvbnMpXG4gICAgICAgIC5maWx0ZXIoKHIpID0+IHIua2luZCA9PT0gJ3RhYmxlJyB8fCByLmtpbmQgPT09ICdwYXJ0aXRpb25lZF90YWJsZScpXG4gICAgICAgIC5tYXAoKHIpID0+IHIubmFtZSk7XG5cbiAgICBjb25zdCBbaXNSZXBsaWNhLCBtZWRpYW5GaWxlQWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgY2hlY2tJc1JlcGxpY2EocG9vbCksXG4gICAgICAgIGNvbGxlY3RNZWRpYW5GaWxlQWdlKHBvb2wsIHRhYmxlTmFtZXMsIHN0b3JlKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgICAuLi5idWlsZFNlc3Npb25JbnB1dChyZXN1bHQsIHN0b3JlLCBpc1JlcGxpY2EsIG1lZGlhbkZpbGVBZ2UpLFxuICAgICAgICBkZXZpY2VfaWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGNsaWVudCA9IHRva2VuXG4gICAgICAgID8gY3JlYXRlQXV0aGVudGljYXRlZFRSUENDbGllbnQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRva2VuKSlcbiAgICAgICAgOiB0cnBjO1xuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGNsaWVudC5zZXNzaW9uLmNyZWF0ZS5tdXRhdGUoaW5wdXQpO1xuXG4gICAgcmV0dXJuIHNlc3Npb24uaWQ7XG59O1xuXG5leHBvcnQgY29uc3Qgd2FpdEZvckF1dGhvcml6YXRpb24gPSBhc3luYyAoXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgc3RvcmU6IFRTdG9yZSxcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHVybCA9IGJ1aWxkU2Vzc2lvblVSTChzZXNzaW9uSWQpO1xuXG4gICAgcnVuSW5BY3Rpb24oKCkgPT4ge1xuICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LnN0YXRlID0gJ3dhaXRpbmcnO1xuICAgICAgICBzdG9yZS5zdGVwcy5hY2NvdW50LnVybCA9IHVybDtcbiAgICAgICAgc3RvcmUuc3RlcHMuYWNjb3VudC5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHdhaXRGb3JUb2tlbihzZXNzaW9uSWQpO1xuICAgIGF3YWl0IHdyaXRlQ29uZmlnKHRva2VuKTtcbiAgICBhd2FpdCBjb25uZWN0QWNjb3VudCh0b2tlbiwgc3RvcmUpO1xufTtcbiJdfQ==
@@ -1,3 +0,0 @@
1
- import type { TStore } from '../store.mjs';
2
- export declare const connectSSH: (store: TStore) => Promise<(() => void) | undefined>;
3
- //# sourceMappingURL=ssh.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ssh.d.mts","sourceRoot":"./src/","sources":["app/ssh.mts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AA8DzC,eAAO,MAAM,UAAU,GACnB,OAAO,MAAM,KACd,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CA+MlC,CAAC"}