@waifucave/discord-waifus 1.5.154

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 (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +230 -0
  3. package/THIRD_PARTY_NOTICES.md +26 -0
  4. package/assets/ocr/eng.traineddata +0 -0
  5. package/bin/waifus.mjs +36 -0
  6. package/dist/api/errors.d.ts +9 -0
  7. package/dist/api/errors.js +23 -0
  8. package/dist/api/errors.js.map +1 -0
  9. package/dist/api/server.d.ts +19 -0
  10. package/dist/api/server.js +1290 -0
  11. package/dist/api/server.js.map +1 -0
  12. package/dist/backend/logger.d.ts +20 -0
  13. package/dist/backend/logger.js +65 -0
  14. package/dist/backend/logger.js.map +1 -0
  15. package/dist/backend/migrations.d.ts +4 -0
  16. package/dist/backend/migrations.js +521 -0
  17. package/dist/backend/migrations.js.map +1 -0
  18. package/dist/backend/redaction.d.ts +1 -0
  19. package/dist/backend/redaction.js +22 -0
  20. package/dist/backend/redaction.js.map +1 -0
  21. package/dist/backend/runtime.d.ts +30 -0
  22. package/dist/backend/runtime.js +49 -0
  23. package/dist/backend/runtime.js.map +1 -0
  24. package/dist/backend/server.d.ts +18 -0
  25. package/dist/backend/server.js +581 -0
  26. package/dist/backend/server.js.map +1 -0
  27. package/dist/cli/commands.d.ts +35 -0
  28. package/dist/cli/commands.js +510 -0
  29. package/dist/cli/commands.js.map +1 -0
  30. package/dist/cli/main.d.ts +1 -0
  31. package/dist/cli/main.js +12 -0
  32. package/dist/cli/main.js.map +1 -0
  33. package/dist/cli/parser.d.ts +10 -0
  34. package/dist/cli/parser.js +64 -0
  35. package/dist/cli/parser.js.map +1 -0
  36. package/dist/config/appConfig.d.ts +3 -0
  37. package/dist/config/appConfig.js +27 -0
  38. package/dist/config/appConfig.js.map +1 -0
  39. package/dist/config/layout.d.ts +13 -0
  40. package/dist/config/layout.js +173 -0
  41. package/dist/config/layout.js.map +1 -0
  42. package/dist/config/paths.d.ts +5 -0
  43. package/dist/config/paths.js +20 -0
  44. package/dist/config/paths.js.map +1 -0
  45. package/dist/config/prebuiltWaifus.d.ts +3 -0
  46. package/dist/config/prebuiltWaifus.js +106 -0
  47. package/dist/config/prebuiltWaifus.js.map +1 -0
  48. package/dist/discord/client.d.ts +394 -0
  49. package/dist/discord/client.js +1196 -0
  50. package/dist/discord/client.js.map +1 -0
  51. package/dist/discord/contextBuilder.d.ts +15 -0
  52. package/dist/discord/contextBuilder.js +18 -0
  53. package/dist/discord/contextBuilder.js.map +1 -0
  54. package/dist/discord/intents.d.ts +5 -0
  55. package/dist/discord/intents.js +21 -0
  56. package/dist/discord/intents.js.map +1 -0
  57. package/dist/discord/memberCache.d.ts +12 -0
  58. package/dist/discord/memberCache.js +55 -0
  59. package/dist/discord/memberCache.js.map +1 -0
  60. package/dist/discord/normalization.d.ts +34 -0
  61. package/dist/discord/normalization.js +330 -0
  62. package/dist/discord/normalization.js.map +1 -0
  63. package/dist/discord/rateLimit.d.ts +9 -0
  64. package/dist/discord/rateLimit.js +11 -0
  65. package/dist/discord/rateLimit.js.map +1 -0
  66. package/dist/orchestration/context.d.ts +85 -0
  67. package/dist/orchestration/context.js +200 -0
  68. package/dist/orchestration/context.js.map +1 -0
  69. package/dist/orchestration/decisions.d.ts +52 -0
  70. package/dist/orchestration/decisions.js +61 -0
  71. package/dist/orchestration/decisions.js.map +1 -0
  72. package/dist/orchestration/messageSplit.d.ts +6 -0
  73. package/dist/orchestration/messageSplit.js +118 -0
  74. package/dist/orchestration/messageSplit.js.map +1 -0
  75. package/dist/orchestration/ocr.d.ts +43 -0
  76. package/dist/orchestration/ocr.js +504 -0
  77. package/dist/orchestration/ocr.js.map +1 -0
  78. package/dist/orchestration/ocrPackages.d.ts +24 -0
  79. package/dist/orchestration/ocrPackages.js +85 -0
  80. package/dist/orchestration/ocrPackages.js.map +1 -0
  81. package/dist/orchestration/promptBlocks.d.ts +28 -0
  82. package/dist/orchestration/promptBlocks.js +232 -0
  83. package/dist/orchestration/promptBlocks.js.map +1 -0
  84. package/dist/orchestration/replyQuote.d.ts +7 -0
  85. package/dist/orchestration/replyQuote.js +198 -0
  86. package/dist/orchestration/replyQuote.js.map +1 -0
  87. package/dist/orchestration/reviewer.d.ts +5 -0
  88. package/dist/orchestration/reviewer.js +5 -0
  89. package/dist/orchestration/reviewer.js.map +1 -0
  90. package/dist/orchestration/runtime.d.ts +152 -0
  91. package/dist/orchestration/runtime.js +3535 -0
  92. package/dist/orchestration/runtime.js.map +1 -0
  93. package/dist/orchestration/session.d.ts +30 -0
  94. package/dist/orchestration/session.js +41 -0
  95. package/dist/orchestration/session.js.map +1 -0
  96. package/dist/orchestration/stageManager.d.ts +42 -0
  97. package/dist/orchestration/stageManager.js +50 -0
  98. package/dist/orchestration/stageManager.js.map +1 -0
  99. package/dist/providers/catalog.d.ts +6 -0
  100. package/dist/providers/catalog.js +212 -0
  101. package/dist/providers/catalog.js.map +1 -0
  102. package/dist/providers/pipelines.d.ts +13 -0
  103. package/dist/providers/pipelines.js +2388 -0
  104. package/dist/providers/pipelines.js.map +1 -0
  105. package/dist/providers/types.d.ts +91 -0
  106. package/dist/providers/types.js +2 -0
  107. package/dist/providers/types.js.map +1 -0
  108. package/dist/shared/queryLog.d.ts +39 -0
  109. package/dist/shared/queryLog.js +80 -0
  110. package/dist/shared/queryLog.js.map +1 -0
  111. package/dist/shared/schemas/common.d.ts +21 -0
  112. package/dist/shared/schemas/common.js +27 -0
  113. package/dist/shared/schemas/common.js.map +1 -0
  114. package/dist/shared/schemas/config.d.ts +57 -0
  115. package/dist/shared/schemas/config.js +49 -0
  116. package/dist/shared/schemas/config.js.map +1 -0
  117. package/dist/shared/schemas/domain.d.ts +825 -0
  118. package/dist/shared/schemas/domain.js +444 -0
  119. package/dist/shared/schemas/domain.js.map +1 -0
  120. package/dist/storage/atomic.d.ts +6 -0
  121. package/dist/storage/atomic.js +60 -0
  122. package/dist/storage/atomic.js.map +1 -0
  123. package/dist/storage/errors.d.ts +12 -0
  124. package/dist/storage/errors.js +23 -0
  125. package/dist/storage/errors.js.map +1 -0
  126. package/dist/storage/locks.d.ts +9 -0
  127. package/dist/storage/locks.js +42 -0
  128. package/dist/storage/locks.js.map +1 -0
  129. package/dist/storage/storageService.d.ts +25 -0
  130. package/dist/storage/storageService.js +66 -0
  131. package/dist/storage/storageService.js.map +1 -0
  132. package/dist-frontend/assets/index-B2bB3_2r.js +39 -0
  133. package/dist-frontend/assets/index-B2bB3_2r.js.map +1 -0
  134. package/dist-frontend/assets/index-Dj1L8Px-.css +1 -0
  135. package/dist-frontend/index.html +14 -0
  136. package/docs/api.md +162 -0
  137. package/docs/old-orchestrator-prompt.md +123 -0
  138. package/package.json +81 -0
@@ -0,0 +1,510 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { stdin as input, stdout as output } from "node:process";
4
+ import { open, readFile, rm, stat } from "node:fs/promises";
5
+ import { ensureDataLayout } from "../config/layout.js";
6
+ import { appDataPath, DATA_ROOT_ENV, getDataRoot, resolveDataPath } from "../config/paths.js";
7
+ import { loadAppConfig } from "../config/appConfig.js";
8
+ import { startBackend } from "../backend/server.js";
9
+ import { RuntimeStateSchema } from "../backend/runtime.js";
10
+ import { diagnoseBundledOcr } from "../orchestration/ocrPackages.js";
11
+ import { StorageService } from "../storage/storageService.js";
12
+ import { DiscordBotsFileSchema, ProviderCredentialsFileSchema, createEmptyRevisionedFile } from "../shared/schemas/domain.js";
13
+ import { flagBoolean, flagNumber, flagString } from "./parser.js";
14
+ const LEGACY_PACKAGE_NAME = "@starlight-ai/discord-waifus";
15
+ const UPDATE_PACKAGE_NAME = "@waifucave/discord-waifus";
16
+ const UPDATE_PACKAGE_SPEC = `${UPDATE_PACKAGE_NAME}@latest`;
17
+ const GITHUB_RELEASES_API = "https://api.github.com/repos/waifucave/discord-waifus/releases/latest";
18
+ const GITHUB_RELEASE_TARBALL_PACKAGES = [UPDATE_PACKAGE_NAME, LEGACY_PACKAGE_NAME];
19
+ const DETACHED_START_TIMEOUT_MS = 30_000;
20
+ export async function runCommand(parsed, options = {}) {
21
+ const dataRoot = resolveCliDataRoot(parsed, options.env ?? process.env);
22
+ switch (parsed.command) {
23
+ case "help":
24
+ printHelp();
25
+ return 0;
26
+ case "start":
27
+ return startCommand(parsed, dataRoot, "start", options);
28
+ case "dev":
29
+ return startCommand(parsed, dataRoot, "dev", options);
30
+ case "stop":
31
+ return stopCommand(dataRoot);
32
+ case "restart": {
33
+ const stopCode = await stopCommand(dataRoot, { quiet: true });
34
+ if (stopCode !== 0) {
35
+ return stopCode;
36
+ }
37
+ return startCommand(parsed, dataRoot, "start", options);
38
+ }
39
+ case "status":
40
+ return statusCommand(dataRoot);
41
+ case "doctor":
42
+ return doctorCommand(dataRoot);
43
+ case "clean":
44
+ return cleanCommand(parsed, dataRoot);
45
+ case "update":
46
+ return updateCommand(parsed, options);
47
+ }
48
+ }
49
+ function resolveCliDataRoot(parsed, env) {
50
+ const explicit = flagString(parsed.flags, "dataRoot");
51
+ return getDataRoot(explicit ? { ...env, [DATA_ROOT_ENV]: explicit } : env);
52
+ }
53
+ function printHelp() {
54
+ console.log(`waifus commands
55
+
56
+ Usage:
57
+ waifus help
58
+ waifus start [--host 127.0.0.1] [--port 3888] [--data-root PATH]
59
+ waifus dev [--host 127.0.0.1] [--port 3888] [--data-root PATH]
60
+ waifus stop [--data-root PATH]
61
+ waifus restart [--host 127.0.0.1] [--port 3888] [--data-root PATH]
62
+ waifus status [--data-root PATH]
63
+ waifus doctor [--data-root PATH]
64
+ waifus clean [--force] [--include-logs] [--data-root PATH]
65
+ waifus update [--npm | --github]
66
+
67
+ Environment:
68
+ ${DATA_ROOT_ENV}=PATH overrides the default ~/.dc-waifus data root.
69
+ `);
70
+ }
71
+ async function startCommand(parsed, dataRoot, mode, options) {
72
+ await ensureDataLayout(dataRoot);
73
+ if (mode === "start" && !flagBoolean(parsed.flags, "foreground")) {
74
+ return startDetachedCommand(parsed, dataRoot, options);
75
+ }
76
+ return startForegroundCommand(parsed, dataRoot, mode);
77
+ }
78
+ async function startDetachedCommand(parsed, dataRoot, options) {
79
+ const existing = await readRuntimeFile(dataRoot, "pid.json");
80
+ const processAlive = options.processAlive ?? isProcessAlive;
81
+ if (existing && processAlive(existing.pid)) {
82
+ console.log(`waifus backend already running at http://127.0.0.1:${existing.port}`);
83
+ console.log(`data root: ${dataRoot}`);
84
+ return 0;
85
+ }
86
+ if (existing) {
87
+ await rm(appDataPath(dataRoot, "pid.json"), { force: true });
88
+ }
89
+ const argv = options.argv ?? process.argv;
90
+ const entrypoint = argv[1];
91
+ if (!entrypoint) {
92
+ throw new Error("Cannot locate waifus CLI entrypoint for detached start.");
93
+ }
94
+ const detachedSpawner = options.detachedSpawner ?? spawn;
95
+ const child = detachedSpawner(options.execPath ?? process.execPath, [entrypoint, "start", "--foreground", ...backendStartArgs(parsed, dataRoot)], {
96
+ cwd: options.cwd ?? process.cwd(),
97
+ detached: true,
98
+ env: options.env ?? process.env,
99
+ stdio: "ignore"
100
+ });
101
+ child.unref();
102
+ if (!child.pid) {
103
+ throw new Error("Failed to spawn detached waifus backend.");
104
+ }
105
+ const runtime = await (options.detachedBackendWaiter ?? waitForBackendStart)(dataRoot, child.pid, DETACHED_START_TIMEOUT_MS);
106
+ if (!runtime) {
107
+ if (processAlive(child.pid)) {
108
+ console.log(`waifus backend is still starting after 30s; spawned pid ${child.pid}`);
109
+ console.log(`data root: ${dataRoot}`);
110
+ console.log(`logs: ${appDataPath(dataRoot, "logs", "backend.log")}`);
111
+ return 0;
112
+ }
113
+ console.error(`waifus backend did not start within 30s; spawned pid ${child.pid} exited`);
114
+ console.error(`logs: ${appDataPath(dataRoot, "logs", "backend.log")}`);
115
+ return 1;
116
+ }
117
+ console.log(`waifus backend running at http://127.0.0.1:${runtime.port}`);
118
+ if (runtime.discord.connecting) {
119
+ console.log("Discord auto-connect is still connecting; dashboard/status will update when ready.");
120
+ }
121
+ console.log(`data root: ${dataRoot}`);
122
+ return 0;
123
+ }
124
+ async function startForegroundCommand(parsed, dataRoot, mode) {
125
+ const port = flagNumber(parsed.flags, "port");
126
+ const host = flagString(parsed.flags, "host");
127
+ const running = await startBackend({ dataRoot, port, host, mode });
128
+ console.log(`waifus backend running at ${running.url}`);
129
+ console.log(`data root: ${dataRoot}`);
130
+ const shutdown = async (signal) => {
131
+ console.log(`received ${signal}, stopping waifus backend`);
132
+ await running.close();
133
+ process.exit(0);
134
+ };
135
+ process.once("SIGINT", shutdown);
136
+ process.once("SIGTERM", shutdown);
137
+ await new Promise(() => undefined);
138
+ return 0;
139
+ }
140
+ function backendStartArgs(parsed, dataRoot) {
141
+ const args = ["--data-root", dataRoot];
142
+ const host = flagString(parsed.flags, "host");
143
+ const port = flagString(parsed.flags, "port");
144
+ if (host) {
145
+ args.push("--host", host);
146
+ }
147
+ if (port) {
148
+ args.push("--port", port);
149
+ }
150
+ return args;
151
+ }
152
+ async function stopCommand(dataRoot, options = {}) {
153
+ const pidState = await readRuntimeFile(dataRoot, "pid.json");
154
+ if (!pidState) {
155
+ if (!options.quiet) {
156
+ console.log("waifus backend is not running: no pid file found");
157
+ }
158
+ return 0;
159
+ }
160
+ if (!isProcessAlive(pidState.pid)) {
161
+ await rm(appDataPath(dataRoot, "pid.json"), { force: true });
162
+ if (!options.quiet) {
163
+ console.log(`waifus backend is not running: stale pid ${pidState.pid} removed`);
164
+ }
165
+ return 0;
166
+ }
167
+ const logFile = appDataPath(dataRoot, "logs", "backend.log");
168
+ const logStartOffset = await fileSize(logFile);
169
+ const tailController = new AbortController();
170
+ const tailDone = options.quiet
171
+ ? Promise.resolve()
172
+ : tailShutdownLog(logFile, logStartOffset, tailController.signal);
173
+ if (!options.quiet) {
174
+ console.log(`sending SIGTERM to pid ${pidState.pid}`);
175
+ }
176
+ process.kill(pidState.pid, "SIGTERM");
177
+ let stopped = await waitForExit(pidState.pid, 20_000);
178
+ if (!stopped) {
179
+ if (!options.quiet) {
180
+ console.log(`pid ${pidState.pid} did not exit within 20s of SIGTERM; escalating to SIGKILL`);
181
+ }
182
+ try {
183
+ process.kill(pidState.pid, "SIGKILL");
184
+ }
185
+ catch (error) {
186
+ if (error.code !== "ESRCH") {
187
+ tailController.abort();
188
+ await tailDone;
189
+ throw error;
190
+ }
191
+ }
192
+ stopped = await waitForExit(pidState.pid, 3_000);
193
+ }
194
+ tailController.abort();
195
+ await tailDone;
196
+ if (!stopped) {
197
+ console.error(`pid ${pidState.pid} is still alive after SIGKILL`);
198
+ return 1;
199
+ }
200
+ await rm(appDataPath(dataRoot, "pid.json"), { force: true });
201
+ if (!options.quiet) {
202
+ console.log(`stopped waifus backend pid ${pidState.pid}`);
203
+ }
204
+ return 0;
205
+ }
206
+ async function statusCommand(dataRoot) {
207
+ const runtime = await readRuntimeFile(dataRoot, "runtime.json");
208
+ const pidState = await readRuntimeFile(dataRoot, "pid.json");
209
+ const running = pidState ? isProcessAlive(pidState.pid) : false;
210
+ console.log(JSON.stringify({
211
+ running,
212
+ pid: pidState?.pid,
213
+ url: runtime ? `http://127.0.0.1:${runtime.port}` : undefined,
214
+ dataRoot,
215
+ runtime
216
+ }, null, 2));
217
+ return running ? 0 : 1;
218
+ }
219
+ async function doctorCommand(dataRoot) {
220
+ await ensureDataLayout(dataRoot);
221
+ const config = await loadAppConfig(dataRoot);
222
+ const storage = new StorageService(dataRoot);
223
+ const providerFile = await storage.readJson("user/providers.json", ProviderCredentialsFileSchema, ProviderCredentialsFileSchema.parse(createEmptyRevisionedFile({ providers: {} })));
224
+ const discordFile = await storage.readJson("user/discord-bots.json", DiscordBotsFileSchema, DiscordBotsFileSchema.parse(createEmptyRevisionedFile({ orchestrator: null, waifus: [] })));
225
+ const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
226
+ const bundledOcr = await diagnoseBundledOcr();
227
+ const result = {
228
+ node: {
229
+ version: process.versions.node,
230
+ ok: nodeMajor >= 20
231
+ },
232
+ dataRoot,
233
+ config,
234
+ ocr: {
235
+ config: config.ocr,
236
+ platform: process.platform,
237
+ arch: process.arch,
238
+ bundled: bundledOcr
239
+ },
240
+ providersConfigured: Object.keys(providerFile.providers),
241
+ discord: {
242
+ orchestratorConfigured: discordFile.orchestrator?.token !== undefined,
243
+ waifuBotCount: discordFile.waifus.length,
244
+ warnings: [
245
+ "MESSAGE_CONTENT intent must be enabled for complete Discord channel context.",
246
+ "GUILD_MEMBERS intent is optional unless full member refreshes are required."
247
+ ]
248
+ }
249
+ };
250
+ console.log(JSON.stringify(result, null, 2));
251
+ return result.node.ok ? 0 : 1;
252
+ }
253
+ async function cleanCommand(parsed, dataRoot) {
254
+ const force = flagBoolean(parsed.flags, "force");
255
+ const includeLogs = flagBoolean(parsed.flags, "includeLogs");
256
+ if (!force) {
257
+ const confirmed = await confirm(`Delete saved Discord Waifus user data in ${dataRoot}? Type "delete" to continue: `);
258
+ if (!confirmed) {
259
+ console.log("clean cancelled");
260
+ return 1;
261
+ }
262
+ }
263
+ await Promise.all([
264
+ rm(resolveDataPath(dataRoot, "user"), { recursive: true, force: true }),
265
+ rm(resolveDataPath(dataRoot, "config.toml"), { force: true }),
266
+ rm(appDataPath(dataRoot, "cache"), { recursive: true, force: true }),
267
+ includeLogs ? rm(appDataPath(dataRoot, "logs"), { recursive: true, force: true }) : Promise.resolve()
268
+ ]);
269
+ await ensureDataLayout(dataRoot);
270
+ console.log(`cleaned user data in ${dataRoot}`);
271
+ return 0;
272
+ }
273
+ async function updateCommand(parsed, options) {
274
+ const runner = options.processRunner ?? defaultProcessRunner;
275
+ const forceNpm = flagBoolean(parsed.flags, "npm") || flagBoolean(parsed.flags, "global");
276
+ const forceGithub = flagBoolean(parsed.flags, "github") || flagBoolean(parsed.flags, "release");
277
+ if (flagBoolean(parsed.flags, "git")) {
278
+ console.error("waifus update only updates installed packages. For source checkouts, run git pull, npm install, and npm run build yourself.");
279
+ return 1;
280
+ }
281
+ if (forceNpm && forceGithub) {
282
+ console.error("Use either --npm/--global or --github/--release, not both.");
283
+ return 1;
284
+ }
285
+ if (forceGithub) {
286
+ return updateGithubReleasePackage(runner, options);
287
+ }
288
+ return updateGlobalNpmPackage(runner, options);
289
+ }
290
+ async function updateGlobalNpmPackage(runner, options) {
291
+ const npm = npmCommand(options.platform ?? process.platform);
292
+ console.log(`Updating ${UPDATE_PACKAGE_NAME} from npm...`);
293
+ const code = await runner.run(npm, ["install", "-g", UPDATE_PACKAGE_SPEC, "--force"], {
294
+ env: options.env ?? process.env
295
+ });
296
+ if (code !== 0) {
297
+ console.error(`Failed to update ${UPDATE_PACKAGE_NAME}; npm exited with code ${code}.`);
298
+ return code;
299
+ }
300
+ console.log(`Updated ${UPDATE_PACKAGE_NAME} globally. Restart any running waifus backend to use the new version.`);
301
+ return 0;
302
+ }
303
+ async function updateGithubReleasePackage(runner, options) {
304
+ const fetchRelease = options.githubReleaseFetcher ?? fetchLatestGithubRelease;
305
+ console.log(`Checking latest GitHub release for ${UPDATE_PACKAGE_NAME}...`);
306
+ const release = await fetchRelease();
307
+ const asset = selectGithubReleaseTarball(release);
308
+ if (!asset) {
309
+ console.error(`Latest GitHub release does not include a ${GITHUB_RELEASE_TARBALL_PACKAGES.map(npmPackTarballPrefix).join("*.tgz or ")}*.tgz asset.`);
310
+ return 1;
311
+ }
312
+ const npm = npmCommand(options.platform ?? process.platform);
313
+ const label = release.tag_name ? ` ${release.tag_name}` : "";
314
+ console.log(`Updating ${UPDATE_PACKAGE_NAME} from GitHub release${label}...`);
315
+ const code = await runner.run(npm, ["install", "-g", asset.browser_download_url, "--force"], {
316
+ env: options.env ?? process.env
317
+ });
318
+ if (code !== 0) {
319
+ console.error(`Failed to update ${UPDATE_PACKAGE_NAME}; npm exited with code ${code}.`);
320
+ return code;
321
+ }
322
+ console.log(`Updated ${UPDATE_PACKAGE_NAME} from GitHub release. Restart any running waifus backend to use the new version.`);
323
+ return 0;
324
+ }
325
+ const defaultProcessRunner = {
326
+ run: runProcess
327
+ };
328
+ async function runProcess(command, args, options = {}) {
329
+ return new Promise((resolve) => {
330
+ let settled = false;
331
+ const settle = (code) => {
332
+ if (!settled) {
333
+ settled = true;
334
+ resolve(code);
335
+ }
336
+ };
337
+ const child = spawn(command, args, {
338
+ cwd: options.cwd,
339
+ env: options.env ?? process.env,
340
+ stdio: "inherit"
341
+ });
342
+ child.once("error", (error) => {
343
+ console.error(`Failed to start ${command}: ${error.message}`);
344
+ settle(1);
345
+ });
346
+ child.once("exit", (code, signal) => {
347
+ if (signal) {
348
+ console.error(`${command} exited from signal ${signal}.`);
349
+ settle(1);
350
+ return;
351
+ }
352
+ settle(code ?? 1);
353
+ });
354
+ });
355
+ }
356
+ async function fetchLatestGithubRelease() {
357
+ const response = await fetch(GITHUB_RELEASES_API, {
358
+ headers: {
359
+ accept: "application/vnd.github+json",
360
+ "user-agent": "discord-waifus-cli"
361
+ }
362
+ });
363
+ if (!response.ok) {
364
+ throw new Error(`GitHub release lookup failed: ${response.status} ${response.statusText}`);
365
+ }
366
+ return (await response.json());
367
+ }
368
+ function selectGithubReleaseTarball(release) {
369
+ for (const packageName of GITHUB_RELEASE_TARBALL_PACKAGES) {
370
+ const asset = selectPackageTarball(release, packageName);
371
+ if (asset) {
372
+ return asset;
373
+ }
374
+ }
375
+ return undefined;
376
+ }
377
+ function npmPackTarballPrefix(packageName) {
378
+ return `${packageName.replace(/^@/u, "").replace(/\//gu, "-")}-`;
379
+ }
380
+ function selectPackageTarball(release, packageName) {
381
+ const prefix = npmPackTarballPrefix(packageName);
382
+ return release.assets?.find((asset) => asset.name.startsWith(prefix) && asset.name.endsWith(".tgz") && looksLikeNpmPackVersion(asset.name, prefix));
383
+ }
384
+ function looksLikeNpmPackVersion(assetName, prefix) {
385
+ const suffix = assetName.slice(prefix.length, -".tgz".length);
386
+ return /^\d+\.\d+\.\d+(?:[-+].*)?$/u.test(suffix);
387
+ }
388
+ function npmCommand(platform) {
389
+ return platform === "win32" ? "npm.cmd" : "npm";
390
+ }
391
+ async function readRuntimeFile(dataRoot, name) {
392
+ try {
393
+ const raw = await readFile(appDataPath(dataRoot, name), "utf8");
394
+ return RuntimeStateSchema.parse(JSON.parse(raw));
395
+ }
396
+ catch (error) {
397
+ if (error.code === "ENOENT") {
398
+ return undefined;
399
+ }
400
+ throw error;
401
+ }
402
+ }
403
+ function isProcessAlive(pid) {
404
+ try {
405
+ process.kill(pid, 0);
406
+ return true;
407
+ }
408
+ catch (error) {
409
+ return error.code === "EPERM";
410
+ }
411
+ }
412
+ async function waitForExit(pid, timeoutMs) {
413
+ const started = Date.now();
414
+ while (Date.now() - started < timeoutMs) {
415
+ if (!isProcessAlive(pid)) {
416
+ return true;
417
+ }
418
+ await new Promise((resolve) => setTimeout(resolve, 100));
419
+ }
420
+ return !isProcessAlive(pid);
421
+ }
422
+ async function fileSize(filePath) {
423
+ try {
424
+ const info = await stat(filePath);
425
+ return info.size;
426
+ }
427
+ catch (error) {
428
+ if (error.code === "ENOENT") {
429
+ return 0;
430
+ }
431
+ throw error;
432
+ }
433
+ }
434
+ async function tailShutdownLog(logFile, fromOffset, signal) {
435
+ let offset = fromOffset;
436
+ let pending = "";
437
+ while (!signal.aborted) {
438
+ let size;
439
+ try {
440
+ size = (await stat(logFile)).size;
441
+ }
442
+ catch (error) {
443
+ if (error.code !== "ENOENT")
444
+ throw error;
445
+ await new Promise((resolve) => setTimeout(resolve, 100));
446
+ continue;
447
+ }
448
+ if (size > offset) {
449
+ const handle = await open(logFile, "r");
450
+ try {
451
+ const buf = Buffer.alloc(size - offset);
452
+ await handle.read(buf, 0, buf.length, offset);
453
+ offset = size;
454
+ pending += buf.toString("utf8");
455
+ const lines = pending.split("\n");
456
+ pending = lines.pop() ?? "";
457
+ for (const line of lines) {
458
+ if (!line.trim())
459
+ continue;
460
+ let entry;
461
+ try {
462
+ entry = JSON.parse(line);
463
+ }
464
+ catch {
465
+ continue;
466
+ }
467
+ const message = typeof entry.message === "string" ? entry.message : "";
468
+ const step = typeof entry.context?.step === "string" ? entry.context.step : undefined;
469
+ if (message === "Shutdown step start" && step) {
470
+ console.log(` ${step} ...`);
471
+ }
472
+ else if (message === "Shutdown step done" && step) {
473
+ const ms = typeof entry.context?.ms === "number" ? entry.context.ms : undefined;
474
+ console.log(` ${step} done${ms !== undefined ? ` in ${ms}ms` : ""}`);
475
+ }
476
+ else if (message === "Backend stopped") {
477
+ const totalMs = typeof entry.context?.totalMs === "number" ? entry.context.totalMs : undefined;
478
+ console.log(` backend stopped${totalMs !== undefined ? ` (total ${totalMs}ms)` : ""}`);
479
+ }
480
+ }
481
+ }
482
+ finally {
483
+ await handle.close();
484
+ }
485
+ }
486
+ await new Promise((resolve) => setTimeout(resolve, 100));
487
+ }
488
+ }
489
+ async function waitForBackendStart(dataRoot, pid, timeoutMs) {
490
+ const started = Date.now();
491
+ while (Date.now() - started < timeoutMs) {
492
+ const runtime = await readRuntimeFile(dataRoot, "runtime.json");
493
+ if (runtime?.pid === pid && isProcessAlive(pid)) {
494
+ return runtime;
495
+ }
496
+ await new Promise((resolve) => setTimeout(resolve, 100));
497
+ }
498
+ return undefined;
499
+ }
500
+ async function confirm(prompt) {
501
+ const rl = createInterface({ input, output });
502
+ try {
503
+ const answer = await rl.question(prompt);
504
+ return answer.trim().toLowerCase() === "delete";
505
+ }
506
+ finally {
507
+ rl.close();
508
+ }
509
+ }
510
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { parseCliArgs } from "./parser.js";
2
+ import { runCommand } from "./commands.js";
3
+ const parsed = parseCliArgs(process.argv.slice(2));
4
+ try {
5
+ const code = await runCommand(parsed);
6
+ process.exitCode = code;
7
+ }
8
+ catch (error) {
9
+ console.error(error instanceof Error ? error.message : String(error));
10
+ process.exitCode = 1;
11
+ }
12
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnD,IAAI,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type CliCommand = "help" | "start" | "stop" | "restart" | "status" | "doctor" | "clean" | "update" | "dev";
2
+ export type ParsedCli = {
3
+ command: CliCommand;
4
+ flags: Record<string, string | boolean>;
5
+ positional: string[];
6
+ };
7
+ export declare function parseCliArgs(argv: string[]): ParsedCli;
8
+ export declare function flagString(flags: Record<string, string | boolean>, key: string): string | undefined;
9
+ export declare function flagBoolean(flags: Record<string, string | boolean>, key: string): boolean;
10
+ export declare function flagNumber(flags: Record<string, string | boolean>, key: string): number | undefined;
@@ -0,0 +1,64 @@
1
+ const COMMANDS = new Set([
2
+ "help",
3
+ "start",
4
+ "stop",
5
+ "restart",
6
+ "status",
7
+ "doctor",
8
+ "clean",
9
+ "update",
10
+ "dev"
11
+ ]);
12
+ export function parseCliArgs(argv) {
13
+ const [first, ...rest] = argv;
14
+ const command = COMMANDS.has(first) ? first : "help";
15
+ const args = command === "help" && first && !first.startsWith("-") && first !== "help" ? argv : rest;
16
+ const flags = {};
17
+ const positional = [];
18
+ for (let index = 0; index < args.length; index += 1) {
19
+ const arg = args[index];
20
+ if (arg === "--") {
21
+ positional.push(...args.slice(index + 1));
22
+ break;
23
+ }
24
+ if (!arg.startsWith("--")) {
25
+ positional.push(arg);
26
+ continue;
27
+ }
28
+ const withoutPrefix = arg.slice(2);
29
+ const equalsIndex = withoutPrefix.indexOf("=");
30
+ if (equalsIndex >= 0) {
31
+ flags[toCamel(withoutPrefix.slice(0, equalsIndex))] = withoutPrefix.slice(equalsIndex + 1);
32
+ continue;
33
+ }
34
+ const key = toCamel(withoutPrefix);
35
+ const next = args[index + 1];
36
+ if (next && !next.startsWith("--")) {
37
+ flags[key] = next;
38
+ index += 1;
39
+ }
40
+ else {
41
+ flags[key] = true;
42
+ }
43
+ }
44
+ return { command, flags, positional };
45
+ }
46
+ export function flagString(flags, key) {
47
+ const value = flags[key];
48
+ return typeof value === "string" ? value : undefined;
49
+ }
50
+ export function flagBoolean(flags, key) {
51
+ return flags[key] === true || flags[key] === "true";
52
+ }
53
+ export function flagNumber(flags, key) {
54
+ const value = flagString(flags, key);
55
+ if (value === undefined) {
56
+ return undefined;
57
+ }
58
+ const parsed = Number.parseInt(value, 10);
59
+ return Number.isFinite(parsed) ? parsed : undefined;
60
+ }
61
+ function toCamel(input) {
62
+ return input.replace(/-([a-z])/g, (_match, char) => char.toUpperCase());
63
+ }
64
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { AppConfig } from "../shared/schemas/config.js";
2
+ export declare function loadAppConfig(dataRoot: string): Promise<AppConfig>;
3
+ export declare function saveAppConfig(dataRoot: string, config: AppConfig): Promise<AppConfig>;