@syedar/seedar-cli 1.2.0 → 1.3.2

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 (119) hide show
  1. package/README.md +24 -3
  2. package/dist/cli.d.ts +21 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +110 -587
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/doctor.d.ts +2 -0
  7. package/dist/commands/doctor.d.ts.map +1 -0
  8. package/dist/commands/doctor.js +18 -0
  9. package/dist/commands/doctor.js.map +1 -0
  10. package/dist/commands/install.d.ts +3 -0
  11. package/dist/commands/install.d.ts.map +1 -0
  12. package/dist/commands/install.js +35 -0
  13. package/dist/commands/install.js.map +1 -0
  14. package/dist/commands/lifecycle.d.ts +4 -0
  15. package/dist/commands/lifecycle.d.ts.map +1 -0
  16. package/dist/commands/lifecycle.js +65 -0
  17. package/dist/commands/lifecycle.js.map +1 -0
  18. package/dist/commands/logs.d.ts +4 -0
  19. package/dist/commands/logs.d.ts.map +1 -0
  20. package/dist/commands/logs.js +24 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/status.d.ts +4 -0
  23. package/dist/commands/status.d.ts.map +1 -0
  24. package/dist/commands/status.js +243 -0
  25. package/dist/commands/status.js.map +1 -0
  26. package/dist/commands/uninstall.d.ts +5 -0
  27. package/dist/commands/uninstall.d.ts.map +1 -0
  28. package/dist/commands/uninstall.js +166 -0
  29. package/dist/commands/uninstall.js.map +1 -0
  30. package/dist/docker/compose.d.ts +6 -0
  31. package/dist/docker/compose.d.ts.map +1 -0
  32. package/dist/docker/compose.js +55 -0
  33. package/dist/docker/compose.js.map +1 -0
  34. package/dist/docker/health.d.ts +3 -0
  35. package/dist/docker/health.d.ts.map +1 -0
  36. package/dist/docker/health.js +38 -0
  37. package/dist/docker/health.js.map +1 -0
  38. package/dist/docker/ports.d.ts.map +1 -0
  39. package/dist/docker/ports.js.map +1 -0
  40. package/dist/docker/prerequisites.d.ts +2 -0
  41. package/dist/docker/prerequisites.d.ts.map +1 -0
  42. package/dist/docker/prerequisites.js +12 -0
  43. package/dist/docker/prerequisites.js.map +1 -0
  44. package/dist/{process.d.ts → docker/process.d.ts} +2 -1
  45. package/dist/docker/process.d.ts.map +1 -0
  46. package/dist/{process.js → docker/process.js} +11 -0
  47. package/dist/docker/process.js.map +1 -0
  48. package/dist/index.js +1 -5
  49. package/dist/index.js.map +1 -1
  50. package/dist/install/config.d.ts +7 -0
  51. package/dist/install/config.d.ts.map +1 -0
  52. package/dist/install/config.js +82 -0
  53. package/dist/install/config.js.map +1 -0
  54. package/dist/install/flow.d.ts +11 -0
  55. package/dist/install/flow.d.ts.map +1 -0
  56. package/dist/install/flow.js +115 -0
  57. package/dist/install/flow.js.map +1 -0
  58. package/dist/install/output.d.ts +8 -0
  59. package/dist/install/output.d.ts.map +1 -0
  60. package/dist/install/output.js +39 -0
  61. package/dist/install/output.js.map +1 -0
  62. package/dist/install/ports.d.ts +8 -0
  63. package/dist/install/ports.d.ts.map +1 -0
  64. package/dist/install/ports.js +38 -0
  65. package/dist/install/ports.js.map +1 -0
  66. package/dist/install/prompts.d.ts +4 -0
  67. package/dist/install/prompts.d.ts.map +1 -0
  68. package/dist/install/prompts.js +204 -0
  69. package/dist/install/prompts.js.map +1 -0
  70. package/dist/runtime/guards.d.ts +3 -0
  71. package/dist/runtime/guards.d.ts.map +1 -0
  72. package/dist/runtime/guards.js +7 -0
  73. package/dist/runtime/guards.js.map +1 -0
  74. package/dist/{runtime.d.ts → runtime/index.d.ts} +3 -3
  75. package/dist/runtime/index.d.ts.map +1 -0
  76. package/dist/{runtime.js → runtime/index.js} +68 -11
  77. package/dist/runtime/index.js.map +1 -0
  78. package/dist/shared/constants.d.ts +23 -0
  79. package/dist/shared/constants.d.ts.map +1 -0
  80. package/dist/{constants.js → shared/constants.js} +44 -4
  81. package/dist/shared/constants.js.map +1 -0
  82. package/dist/shared/logging.d.ts +3 -0
  83. package/dist/shared/logging.d.ts.map +1 -0
  84. package/dist/shared/logging.js +8 -0
  85. package/dist/shared/logging.js.map +1 -0
  86. package/dist/shared/package.d.ts +2 -0
  87. package/dist/shared/package.d.ts.map +1 -0
  88. package/dist/shared/package.js +2 -0
  89. package/dist/shared/package.js.map +1 -0
  90. package/dist/shared/time.d.ts +2 -0
  91. package/dist/shared/time.d.ts.map +1 -0
  92. package/dist/shared/time.js +4 -0
  93. package/dist/shared/time.js.map +1 -0
  94. package/dist/{types.d.ts → shared/types.d.ts} +9 -0
  95. package/dist/shared/types.d.ts.map +1 -0
  96. package/dist/shared/types.js.map +1 -0
  97. package/dist/shared/ui.d.ts +7 -0
  98. package/dist/shared/ui.d.ts.map +1 -0
  99. package/dist/shared/ui.js +25 -0
  100. package/dist/shared/ui.js.map +1 -0
  101. package/package.json +12 -8
  102. package/dist/constants.d.ts +0 -17
  103. package/dist/constants.d.ts.map +0 -1
  104. package/dist/constants.js.map +0 -1
  105. package/dist/ports.d.ts.map +0 -1
  106. package/dist/ports.js.map +0 -1
  107. package/dist/process.d.ts.map +0 -1
  108. package/dist/process.js.map +0 -1
  109. package/dist/prompts.d.ts +0 -4
  110. package/dist/prompts.d.ts.map +0 -1
  111. package/dist/prompts.js +0 -175
  112. package/dist/prompts.js.map +0 -1
  113. package/dist/runtime.d.ts.map +0 -1
  114. package/dist/runtime.js.map +0 -1
  115. package/dist/types.d.ts.map +0 -1
  116. package/dist/types.js.map +0 -1
  117. /package/dist/{ports.d.ts → docker/ports.d.ts} +0 -0
  118. /package/dist/{ports.js → docker/ports.js} +0 -0
  119. /package/dist/{types.js → shared/types.js} +0 -0
@@ -0,0 +1,166 @@
1
+ import { rm } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { CLI_PACKAGE_NAME } from "../shared/package.js";
5
+ import { runCommand, runDockerCompose, runDockerComposeOrThrow, spawnDetached } from "../docker/process.js";
6
+ import { ensurePrerequisites } from "../docker/prerequisites.js";
7
+ import { printInstallDetail, printInstallStage, printInstallSuccess, printInstallWarn } from "../install/output.js";
8
+ import { writeCliLog } from "../shared/logging.js";
9
+ import { getRuntimeLayout, hasRuntimeConfig, readEnvConfig, writeInstallState, } from "../runtime/index.js";
10
+ import { requireRuntimeConfig } from "../runtime/guards.js";
11
+ async function isGlobalNpmCliInstall() {
12
+ const entryPath = process.argv[1];
13
+ if (!entryPath) {
14
+ return false;
15
+ }
16
+ const npmRootResult = await runCommand("npm", ["root", "-g"]);
17
+ if (npmRootResult.code !== 0) {
18
+ return false;
19
+ }
20
+ const packageRoot = path.resolve(entryPath, "..", "..");
21
+ const expectedRoot = path.resolve(npmRootResult.stdout.trim(), ...CLI_PACKAGE_NAME.split("/"));
22
+ return normalizePathForCompare(packageRoot) === normalizePathForCompare(expectedRoot);
23
+ }
24
+ async function scheduleCliSelfUninstall() {
25
+ if (!(await isGlobalNpmCliInstall())) {
26
+ return false;
27
+ }
28
+ if (process.platform === "win32") {
29
+ spawnDetached("powershell", [
30
+ "-NoProfile",
31
+ "-WindowStyle",
32
+ "Hidden",
33
+ "-Command",
34
+ `Start-Sleep -Seconds 2; npm uninstall -g ${CLI_PACKAGE_NAME}`,
35
+ ]);
36
+ return true;
37
+ }
38
+ spawnDetached("sh", ["-lc", `sleep 2; npm uninstall -g ${CLI_PACKAGE_NAME} >/dev/null 2>&1`]);
39
+ return true;
40
+ }
41
+ export async function uninstallCommand(flags) {
42
+ if (flags.all) {
43
+ await removeAllCommand(flags);
44
+ return;
45
+ }
46
+ const layout = getRuntimeLayout();
47
+ await ensurePrerequisites();
48
+ await requireRuntimeConfig(layout);
49
+ await readEnvConfig(layout);
50
+ await writeCliLog(layout, "开始卸载");
51
+ await runDockerComposeOrThrow(layout, ["down", "--remove-orphans"], {
52
+ stdio: "inherit",
53
+ });
54
+ if (flags.removeData) {
55
+ if (!flags.force && process.stdin.isTTY) {
56
+ console.log("检测到 --remove-data,将删除本地数据目录。若需跳过确认,请附带 --force。");
57
+ throw new Error("请确认后重新执行: seedar uninstall --remove-data --force");
58
+ }
59
+ const resolvedDataPath = path.resolve(layout.dataDir);
60
+ const installRoot = path.resolve(layout.installRoot);
61
+ if (!resolvedDataPath.startsWith(installRoot)) {
62
+ throw new Error(`拒绝删除 installRoot 之外的路径: ${resolvedDataPath}`);
63
+ }
64
+ await rm(layout.dataDir, { recursive: true, force: true });
65
+ await writeCliLog(layout, `已删除数据目录 ${layout.dataDir}`);
66
+ }
67
+ await writeInstallState(layout, "uninstalled");
68
+ await writeCliLog(layout, "卸载完成");
69
+ console.log("Seedar 已卸载。");
70
+ console.log(`配置保留在: ${layout.runtimeDir}`);
71
+ console.log(`备份保留在: ${layout.backupsDir}`);
72
+ if (!flags.removeData) {
73
+ console.log(`数据保留在: ${layout.dataDir}`);
74
+ }
75
+ }
76
+ export async function removeAllCommand(flags) {
77
+ const layout = getRuntimeLayout();
78
+ const installRoot = path.resolve(layout.installRoot);
79
+ if (!flags.force) {
80
+ if (process.stdin.isTTY) {
81
+ console.log("该操作会删除 Seedar 的容器、配置、数据、日志、备份,并尝试卸载全局 CLI。");
82
+ throw new Error("请确认后重新执行: seedar uninstall --all --force");
83
+ }
84
+ throw new Error("非交互模式下执行 remove all 需要 --force");
85
+ }
86
+ printInstallStage("移除 Seedar");
87
+ if (await hasRuntimeConfig(layout)) {
88
+ await readEnvConfig(layout);
89
+ printInstallDetail("开始停止并清理容器");
90
+ const downResult = await runDockerCompose(layout, ["down", "--remove-orphans"]);
91
+ const detail = [downResult.stdout.trim(), downResult.stderr.trim()].filter(Boolean).join("\n");
92
+ if (detail) {
93
+ console.log(detail);
94
+ }
95
+ if (downResult.code !== 0) {
96
+ printInstallWarn("停止容器失败,继续删除本地文件");
97
+ }
98
+ }
99
+ else {
100
+ printInstallDetail("未检测到运行时配置,跳过容器清理");
101
+ }
102
+ const dangerReason = getDangerousDeleteReason(installRoot);
103
+ if (dangerReason) {
104
+ throw new Error(`拒绝删除危险路径: ${installRoot}(${dangerReason})`);
105
+ }
106
+ await rm(installRoot, { recursive: true, force: true });
107
+ printInstallSuccess(`已删除安装目录:${installRoot}`);
108
+ const cliUninstallScheduled = await scheduleCliSelfUninstall();
109
+ if (cliUninstallScheduled) {
110
+ printInstallSuccess(`已安排卸载全局 CLI:${CLI_PACKAGE_NAME}`);
111
+ }
112
+ else {
113
+ printInstallWarn("未检测到 npm 全局安装的 CLI,跳过 CLI 自卸载");
114
+ }
115
+ }
116
+ function normalizePathForCompare(targetPath) {
117
+ return path.resolve(targetPath).replace(/[\\/]+$/, "").toLowerCase();
118
+ }
119
+ function getDangerousDeleteReason(targetPath) {
120
+ const resolved = path.resolve(targetPath);
121
+ const parsed = path.parse(resolved);
122
+ const normalizedTarget = normalizePathForCompare(resolved);
123
+ const normalizedRoot = normalizePathForCompare(parsed.root);
124
+ const normalizedHome = normalizePathForCompare(os.homedir());
125
+ if (normalizedTarget === normalizedRoot) {
126
+ return "目标路径是磁盘根目录";
127
+ }
128
+ if (normalizedTarget === normalizedHome) {
129
+ return "目标路径是用户主目录";
130
+ }
131
+ return null;
132
+ }
133
+ export async function purgeCommand(flags) {
134
+ await removeAllCommand(flags);
135
+ return;
136
+ const layout = getRuntimeLayout();
137
+ const installRoot = path.resolve(layout.installRoot);
138
+ if (!flags.force) {
139
+ if (process.stdin.isTTY) {
140
+ console.log("该操作会彻底删除 Seedar 安装目录(含配置、数据、日志与备份)。");
141
+ throw new Error("请确认后重新执行: seedar purge --force");
142
+ }
143
+ throw new Error("非交互模式下执行 purge 需要 --force");
144
+ }
145
+ const dangerReason = getDangerousDeleteReason(installRoot);
146
+ if (dangerReason) {
147
+ throw new Error(`拒绝删除危险路径: ${installRoot}(${dangerReason})`);
148
+ }
149
+ await writeCliLog(layout, "开始彻底删除安装目录");
150
+ if (await hasRuntimeConfig(layout)) {
151
+ await readEnvConfig(layout);
152
+ const downResult = await runDockerCompose(layout, ["down", "--remove-orphans"]);
153
+ if (downResult.code !== 0) {
154
+ const detail = [downResult.stdout.trim(), downResult.stderr.trim()]
155
+ .filter(Boolean)
156
+ .join("\n");
157
+ console.warn(detail
158
+ ? `停止容器失败,继续删除本地目录:\n${detail}`
159
+ : "停止容器失败,继续删除本地目录。");
160
+ }
161
+ }
162
+ await rm(installRoot, { recursive: true, force: true });
163
+ console.log("Seedar 已彻底删除。");
164
+ console.log(`已删除目录: ${installRoot}`);
165
+ }
166
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RuntimeLayout } from "../shared/types.js";
2
+ export declare function runComposeCommandWithCapturedOutput(layout: RuntimeLayout, args: string[], fallbackMessage: string): Promise<void>;
3
+ export declare function cleanupComposeServices(layout: RuntimeLayout, services: string[]): Promise<void>;
4
+ export declare function parseComposePsOutput(layout: RuntimeLayout): Promise<Record<string, unknown>[]>;
5
+ export declare function getPublishersFromServices(services: Record<string, unknown>[]): Set<string>;
6
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/docker/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,wBAAsB,mCAAmC,CACvD,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAiBpG;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAClC,GAAG,CAAC,MAAM,CAAC,CAsBb"}
@@ -0,0 +1,55 @@
1
+ import { runDockerCompose } from "./process.js";
2
+ export async function runComposeCommandWithCapturedOutput(layout, args, fallbackMessage) {
3
+ const result = await runDockerCompose(layout, args);
4
+ const stdout = result.stdout.trim();
5
+ const stderr = result.stderr.trim();
6
+ if (stdout) {
7
+ console.log(stdout);
8
+ }
9
+ if (result.code !== 0) {
10
+ const detail = [stdout, stderr].filter(Boolean).join("\n");
11
+ throw new Error(detail || fallbackMessage);
12
+ }
13
+ }
14
+ export async function cleanupComposeServices(layout, services) {
15
+ if (services.length === 0) {
16
+ return;
17
+ }
18
+ await runDockerCompose(layout, ["rm", "-sf", ...services]);
19
+ }
20
+ export async function parseComposePsOutput(layout) {
21
+ const result = await runDockerCompose(layout, ["ps", "--all", "--format", "json"]);
22
+ const raw = result.stdout.trim();
23
+ if (!raw) {
24
+ return [];
25
+ }
26
+ try {
27
+ const parsed = JSON.parse(raw);
28
+ return Array.isArray(parsed) ? parsed : [];
29
+ }
30
+ catch {
31
+ return raw
32
+ .split(/\r?\n/)
33
+ .filter(Boolean)
34
+ .map((line) => JSON.parse(line));
35
+ }
36
+ }
37
+ export function getPublishersFromServices(services) {
38
+ const ports = new Set();
39
+ for (const service of services) {
40
+ const publishers = service.Publishers;
41
+ if (!Array.isArray(publishers)) {
42
+ continue;
43
+ }
44
+ for (const publisher of publishers) {
45
+ if (publisher &&
46
+ typeof publisher === "object" &&
47
+ "PublishedPort" in publisher &&
48
+ typeof publisher.PublishedPort === "number") {
49
+ ports.add(String(publisher.PublishedPort));
50
+ }
51
+ }
52
+ }
53
+ return ports;
54
+ }
55
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/docker/compose.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,MAAqB,EACrB,IAAc,EACd,eAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAqB,EACrB,QAAkB;IAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAqB;IAC9D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IACnF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAE,MAAoC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG;aACP,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAAmC;IAEnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IACE,SAAS;gBACT,OAAO,SAAS,KAAK,QAAQ;gBAC7B,eAAe,IAAI,SAAS;gBAC5B,OAAO,SAAS,CAAC,aAAa,KAAK,QAAQ,EAC3C,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RuntimeLayout } from "../shared/types.js";
2
+ export declare function waitForServiceHealthy(layout: RuntimeLayout, service: string, timeoutMs?: number): Promise<void>;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/docker/health.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAaxD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,SAAS,SAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CAkCf"}
@@ -0,0 +1,38 @@
1
+ import { createSpinner } from "../shared/ui.js";
2
+ import { wait } from "../shared/time.js";
3
+ import { runCommand, runDockerCompose } from "./process.js";
4
+ async function getServiceContainerId(layout, service) {
5
+ const result = await runDockerCompose(layout, ["ps", "-q", service]);
6
+ const id = result.stdout.trim();
7
+ return id || null;
8
+ }
9
+ export async function waitForServiceHealthy(layout, service, timeoutMs = 120_000) {
10
+ const startedAt = Date.now();
11
+ const spinner = createSpinner(`等待 ${service} 健康检查`).start();
12
+ while (Date.now() - startedAt < timeoutMs) {
13
+ const containerId = await getServiceContainerId(layout, service);
14
+ if (!containerId) {
15
+ spinner.text = `等待 ${service} 容器启动`;
16
+ await wait(2_000);
17
+ continue;
18
+ }
19
+ const inspectResult = await runCommand("docker", [
20
+ "inspect",
21
+ "--format",
22
+ "{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}",
23
+ containerId,
24
+ ]);
25
+ const state = inspectResult.stdout.trim();
26
+ if (state === "healthy" || state === "running") {
27
+ spinner.succeed(`${service} 已就绪`);
28
+ return;
29
+ }
30
+ if (state === "unhealthy" || state === "exited") {
31
+ throw new Error(`${service} 服务状态异常: ${state}`);
32
+ }
33
+ spinner.text = `等待 ${service} 健康检查,当前状态: ${state || "unknown"}`;
34
+ await wait(3_000);
35
+ }
36
+ throw new Error(`等待 ${service} 服务健康检查超时`);
37
+ }
38
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/docker/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE5D,KAAK,UAAU,qBAAqB,CAClC,MAAqB,EACrB,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,EAAE,IAAI,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAqB,EACrB,OAAe,EACf,SAAS,GAAG,OAAO;IAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,GAAG,MAAM,OAAO,OAAO,CAAC;YACpC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE;YAC/C,SAAS;YACT,UAAU;YACV,8EAA8E;YAC9E,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,YAAY,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,MAAM,OAAO,eAAe,KAAK,IAAI,SAAS,EAAE,CAAC;QAChE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/docker/ports.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASpE;AAED,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,aAAa,GAAE,QAAQ,CAAC,MAAM,CAAM,GACnC,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/docker/ports.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,OAAO,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,gBAAkC,EAAE;IAEpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC;IAEN,KAAK,IAAI,WAAW,GAAG,SAAS,EAAE,WAAW,IAAI,KAAK,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC;QACzE,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,MAAM,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,OAAO,SAAS,YAAY,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ensurePrerequisites(): Promise<void>;
2
+ //# sourceMappingURL=prerequisites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/docker/prerequisites.ts"],"names":[],"mappings":"AAGA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CASzD"}
@@ -0,0 +1,12 @@
1
+ import { MIN_NODE_MAJOR } from "../shared/constants.js";
2
+ import { runCommandOrThrow } from "./process.js";
3
+ export async function ensurePrerequisites() {
4
+ const major = Number(process.versions.node.split(".")[0]);
5
+ if (major < MIN_NODE_MAJOR) {
6
+ throw new Error(`Node.js 版本过低,当前 ${process.version},需要 >= ${MIN_NODE_MAJOR}`);
7
+ }
8
+ await runCommandOrThrow("docker", ["--version"]);
9
+ await runCommandOrThrow("docker", ["compose", "version"]);
10
+ await runCommandOrThrow("docker", ["info"]);
11
+ }
12
+ //# sourceMappingURL=prerequisites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/docker/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,OAAO,UAAU,cAAc,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACjD,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,10 +1,11 @@
1
- import type { RunResult, RuntimeLayout } from "./types.js";
1
+ import type { RunResult, RuntimeLayout } from "../shared/types.js";
2
2
  interface RunCommandOptions {
3
3
  cwd?: string;
4
4
  env?: NodeJS.ProcessEnv;
5
5
  stdio?: "inherit" | "pipe";
6
6
  shell?: boolean;
7
7
  }
8
+ export declare function spawnDetached(command: string, args: string[], options?: Omit<RunCommandOptions, "stdio">): void;
8
9
  export declare function runCommand(command: string, args: string[], options?: RunCommandOptions): Promise<RunResult>;
9
10
  export declare function runCommandOrThrow(command: string, args: string[], options?: RunCommandOptions): Promise<RunResult>;
10
11
  export declare function runDockerCompose(layout: RuntimeLayout, args: string[], options?: RunCommandOptions): Promise<RunResult>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/docker/process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnE,UAAU,iBAAiB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAM,GAC7C,IAAI,CAUN;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAiCpB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAUpB;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CASpB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAUpB"}
@@ -1,4 +1,15 @@
1
1
  import { spawn } from "node:child_process";
2
+ export function spawnDetached(command, args, options = {}) {
3
+ const child = spawn(command, args, {
4
+ cwd: options.cwd,
5
+ env: options.env ?? process.env,
6
+ stdio: "ignore",
7
+ shell: options.shell ?? false,
8
+ detached: true,
9
+ windowsHide: true,
10
+ });
11
+ child.unref();
12
+ }
2
13
  export async function runCommand(command, args, options = {}) {
3
14
  return await new Promise((resolve, reject) => {
4
15
  const child = spawn(command, args, {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/docker/process.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { main } from "./cli.js";
3
- main(process.argv.slice(2)).catch((error) => {
4
- const message = error instanceof Error ? error.message : String(error);
5
- console.error(message);
6
- process.exitCode = 1;
7
- });
3
+ void main(process.argv);
8
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CliFlags, EnvConfig, InstallConfigField, InstallConfigIssue, RuntimeLayout } from "../shared/types.js";
2
+ export declare function collectIssueFields(issues: InstallConfigIssue[]): InstallConfigField[];
3
+ export declare function formatConfigIssues(issues: InstallConfigIssue[]): string;
4
+ export declare function collectInstallConfigIssues(env: EnvConfig): Promise<InstallConfigIssue[]>;
5
+ export declare function runInstallConfigCheck(layout: RuntimeLayout, env: EnvConfig, label: string): Promise<InstallConfigIssue[]>;
6
+ export declare function prepareInstallConfig(layout: RuntimeLayout, env: EnvConfig, flags: CliFlags): Promise<EnvConfig>;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/install/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMrH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,CAErF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAEvE;AAED,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyC9F;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAc/B;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,SAAS,CAAC,CAuBpB"}
@@ -0,0 +1,82 @@
1
+ import { collectProblemInstallConfig } from "./prompts.js";
2
+ import { printInstallDetail, printInstallStage, printInstallSuccess, printInstallWarn } from "./output.js";
3
+ import { PORT_ENV_KEYS, getPortLabel } from "./ports.js";
4
+ import { writeRuntimeFiles } from "../runtime/index.js";
5
+ function isBlank(value) {
6
+ return value.trim().length === 0;
7
+ }
8
+ export function collectIssueFields(issues) {
9
+ return [...new Set(issues.map((issue) => issue.field))];
10
+ }
11
+ export function formatConfigIssues(issues) {
12
+ return issues.map((issue) => `- ${issue.field}: ${issue.message}`).join("\n");
13
+ }
14
+ export async function collectInstallConfigIssues(env) {
15
+ const issues = [];
16
+ if (isBlank(env.SEEDAR_VERSION)) {
17
+ issues.push({ field: "SEEDAR_VERSION", message: "不能为空" });
18
+ }
19
+ if (isBlank(env.DB_HOST)) {
20
+ issues.push({ field: "DB_HOST", message: "不能为空" });
21
+ }
22
+ const dbPort = Number(env.DB_PORT);
23
+ if (!Number.isInteger(dbPort) || dbPort < 1 || dbPort > 65535) {
24
+ issues.push({ field: "DB_PORT", message: "必须是 1-65535 之间的端口" });
25
+ }
26
+ const textChecks = [
27
+ ["DB_DATABASE", env.DB_DATABASE],
28
+ ["DB_USERNAME", env.DB_USERNAME],
29
+ ["DB_PASSWORD", env.DB_PASSWORD],
30
+ ["MYSQL_ROOT_PASSWORD", env.MYSQL_ROOT_PASSWORD],
31
+ ["AI_CHECKPOINT_PG_PASSWORD", env.AI_CHECKPOINT_PG_PASSWORD],
32
+ ["AES_SECRET", env.AES_SECRET],
33
+ ];
34
+ for (const [field, value] of textChecks) {
35
+ if (isBlank(value)) {
36
+ issues.push({ field, message: "不能为空" });
37
+ }
38
+ }
39
+ for (const key of PORT_ENV_KEYS) {
40
+ const port = Number(env[key]);
41
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
42
+ issues.push({
43
+ field: key,
44
+ message: `${getPortLabel(key)} 必须是 1-65535 之间的端口`,
45
+ });
46
+ }
47
+ }
48
+ return issues;
49
+ }
50
+ export async function runInstallConfigCheck(layout, env, label) {
51
+ printInstallStage(label);
52
+ printInstallDetail("开始检查配置项");
53
+ await writeRuntimeFiles(layout, env);
54
+ printInstallDetail("端口冲突将在启动阶段自动避让并持续重试");
55
+ const issues = await collectInstallConfigIssues(env);
56
+ if (issues.length > 0) {
57
+ printInstallWarn("配置检查未通过:");
58
+ console.warn(formatConfigIssues(issues));
59
+ }
60
+ else {
61
+ printInstallSuccess("配置检查通过");
62
+ }
63
+ return issues;
64
+ }
65
+ export async function prepareInstallConfig(layout, env, flags) {
66
+ let issues = await runInstallConfigCheck(layout, env, "检查配置");
67
+ if (issues.length === 0) {
68
+ return env;
69
+ }
70
+ const canReprompt = process.stdin.isTTY && !flags.yes;
71
+ if (!canReprompt) {
72
+ throw new Error(`配置检查未通过,请修改 ${layout.envPath} 后重新执行安装。\n${formatConfigIssues(issues)}`);
73
+ }
74
+ printInstallStage("补充有问题的配置项");
75
+ env = await collectProblemInstallConfig(env, collectIssueFields(issues), flags);
76
+ issues = await runInstallConfigCheck(layout, env, "重新检查配置");
77
+ if (issues.length === 0) {
78
+ return env;
79
+ }
80
+ throw new Error(`配置检查两次仍未通过,请直接修改 ${layout.envPath} 后重新执行安装。\n${formatConfigIssues(issues)}`);
81
+ }
82
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/install/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { EnvConfig, RuntimeLayout } from "../shared/types.js";
2
+ export declare function runMigrations(layout: RuntimeLayout): Promise<void>;
3
+ export declare function runInstallFlow(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
4
+ export declare function pullInstallImages(layout: RuntimeLayout): Promise<void>;
5
+ export declare function startMysqlWithRetry(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
6
+ export declare function startPostgres(layout: RuntimeLayout): Promise<void>;
7
+ export declare function startServerAndWebWithRetry(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
8
+ export declare function runInstallFlowWithValidatedConfig(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
9
+ export declare function startRuntimeServices(layout: RuntimeLayout, env: EnvConfig): Promise<void>;
10
+ export declare function stopRuntimeServices(layout: RuntimeLayout): Promise<void>;
11
+ //# sourceMappingURL=flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/install/flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQnE,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAMxE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzF;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAmC9F;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CASxE;AAED,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCrG;AAED,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/F;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9E"}