@made-by-moonlight/athene-cli 0.9.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 (315) hide show
  1. package/LICENSE +22 -0
  2. package/dist/assets/plugin-registry.json +67 -0
  3. package/dist/assets/scripts/athene-doctor.ps1 +352 -0
  4. package/dist/assets/scripts/athene-doctor.sh +552 -0
  5. package/dist/assets/scripts/athene-update.ps1 +224 -0
  6. package/dist/assets/scripts/athene-update.sh +252 -0
  7. package/dist/commands/completion.d.ts +3 -0
  8. package/dist/commands/completion.d.ts.map +1 -0
  9. package/dist/commands/completion.js +26 -0
  10. package/dist/commands/completion.js.map +1 -0
  11. package/dist/commands/config.d.ts +11 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +89 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/dashboard.d.ts +3 -0
  16. package/dist/commands/dashboard.d.ts.map +1 -0
  17. package/dist/commands/dashboard.js +103 -0
  18. package/dist/commands/dashboard.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +3 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +329 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/events.d.ts +3 -0
  24. package/dist/commands/events.d.ts.map +1 -0
  25. package/dist/commands/events.js +172 -0
  26. package/dist/commands/events.js.map +1 -0
  27. package/dist/commands/migrate-storage.d.ts +3 -0
  28. package/dist/commands/migrate-storage.d.ts.map +1 -0
  29. package/dist/commands/migrate-storage.js +78 -0
  30. package/dist/commands/migrate-storage.js.map +1 -0
  31. package/dist/commands/notify.d.ts +3 -0
  32. package/dist/commands/notify.d.ts.map +1 -0
  33. package/dist/commands/notify.js +143 -0
  34. package/dist/commands/notify.js.map +1 -0
  35. package/dist/commands/open.d.ts +3 -0
  36. package/dist/commands/open.d.ts.map +1 -0
  37. package/dist/commands/open.js +167 -0
  38. package/dist/commands/open.js.map +1 -0
  39. package/dist/commands/plugin.d.ts +3 -0
  40. package/dist/commands/plugin.d.ts.map +1 -0
  41. package/dist/commands/plugin.js +462 -0
  42. package/dist/commands/plugin.js.map +1 -0
  43. package/dist/commands/project.d.ts +3 -0
  44. package/dist/commands/project.d.ts.map +1 -0
  45. package/dist/commands/project.js +143 -0
  46. package/dist/commands/project.js.map +1 -0
  47. package/dist/commands/report.d.ts +19 -0
  48. package/dist/commands/report.d.ts.map +1 -0
  49. package/dist/commands/report.js +114 -0
  50. package/dist/commands/report.js.map +1 -0
  51. package/dist/commands/review-check.d.ts +3 -0
  52. package/dist/commands/review-check.d.ts.map +1 -0
  53. package/dist/commands/review-check.js +122 -0
  54. package/dist/commands/review-check.js.map +1 -0
  55. package/dist/commands/review.d.ts +3 -0
  56. package/dist/commands/review.d.ts.map +1 -0
  57. package/dist/commands/review.js +215 -0
  58. package/dist/commands/review.js.map +1 -0
  59. package/dist/commands/send.d.ts +3 -0
  60. package/dist/commands/send.d.ts.map +1 -0
  61. package/dist/commands/send.js +187 -0
  62. package/dist/commands/send.js.map +1 -0
  63. package/dist/commands/session.d.ts +3 -0
  64. package/dist/commands/session.d.ts.map +1 -0
  65. package/dist/commands/session.js +439 -0
  66. package/dist/commands/session.js.map +1 -0
  67. package/dist/commands/setup.d.ts +5 -0
  68. package/dist/commands/setup.d.ts.map +1 -0
  69. package/dist/commands/setup.js +297 -0
  70. package/dist/commands/setup.js.map +1 -0
  71. package/dist/commands/spawn.d.ts +4 -0
  72. package/dist/commands/spawn.d.ts.map +1 -0
  73. package/dist/commands/spawn.js +436 -0
  74. package/dist/commands/spawn.js.map +1 -0
  75. package/dist/commands/start.d.ts +21 -0
  76. package/dist/commands/start.d.ts.map +1 -0
  77. package/dist/commands/start.js +1836 -0
  78. package/dist/commands/start.js.map +1 -0
  79. package/dist/commands/status.d.ts +3 -0
  80. package/dist/commands/status.d.ts.map +1 -0
  81. package/dist/commands/status.js +556 -0
  82. package/dist/commands/status.js.map +1 -0
  83. package/dist/commands/update.d.ts +15 -0
  84. package/dist/commands/update.d.ts.map +1 -0
  85. package/dist/commands/update.js +652 -0
  86. package/dist/commands/update.js.map +1 -0
  87. package/dist/commands/verify.d.ts +3 -0
  88. package/dist/commands/verify.d.ts.map +1 -0
  89. package/dist/commands/verify.js +131 -0
  90. package/dist/commands/verify.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +24 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/lib/bun-tmp-janitor.d.ts +18 -0
  96. package/dist/lib/bun-tmp-janitor.d.ts.map +1 -0
  97. package/dist/lib/bun-tmp-janitor.js +127 -0
  98. package/dist/lib/bun-tmp-janitor.js.map +1 -0
  99. package/dist/lib/caller-context.d.ts +13 -0
  100. package/dist/lib/caller-context.d.ts.map +1 -0
  101. package/dist/lib/caller-context.js +20 -0
  102. package/dist/lib/caller-context.js.map +1 -0
  103. package/dist/lib/cli-errors.d.ts +8 -0
  104. package/dist/lib/cli-errors.d.ts.map +1 -0
  105. package/dist/lib/cli-errors.js +20 -0
  106. package/dist/lib/cli-errors.js.map +1 -0
  107. package/dist/lib/completion.d.ts +13 -0
  108. package/dist/lib/completion.d.ts.map +1 -0
  109. package/dist/lib/completion.js +428 -0
  110. package/dist/lib/completion.js.map +1 -0
  111. package/dist/lib/composio-setup.d.ts +65 -0
  112. package/dist/lib/composio-setup.d.ts.map +1 -0
  113. package/dist/lib/composio-setup.js +3255 -0
  114. package/dist/lib/composio-setup.js.map +1 -0
  115. package/dist/lib/config-instruction.d.ts +2 -0
  116. package/dist/lib/config-instruction.d.ts.map +1 -0
  117. package/dist/lib/config-instruction.js +193 -0
  118. package/dist/lib/config-instruction.js.map +1 -0
  119. package/dist/lib/constants.d.ts +3 -0
  120. package/dist/lib/constants.d.ts.map +1 -0
  121. package/dist/lib/constants.js +3 -0
  122. package/dist/lib/constants.js.map +1 -0
  123. package/dist/lib/create-session-manager.d.ts +26 -0
  124. package/dist/lib/create-session-manager.d.ts.map +1 -0
  125. package/dist/lib/create-session-manager.js +55 -0
  126. package/dist/lib/create-session-manager.js.map +1 -0
  127. package/dist/lib/credential-resolver.d.ts +37 -0
  128. package/dist/lib/credential-resolver.d.ts.map +1 -0
  129. package/dist/lib/credential-resolver.js +105 -0
  130. package/dist/lib/credential-resolver.js.map +1 -0
  131. package/dist/lib/daemon.d.ts +69 -0
  132. package/dist/lib/daemon.d.ts.map +1 -0
  133. package/dist/lib/daemon.js +77 -0
  134. package/dist/lib/daemon.js.map +1 -0
  135. package/dist/lib/dashboard-rebuild.d.ts +53 -0
  136. package/dist/lib/dashboard-rebuild.d.ts.map +1 -0
  137. package/dist/lib/dashboard-rebuild.js +188 -0
  138. package/dist/lib/dashboard-rebuild.js.map +1 -0
  139. package/dist/lib/dashboard-setup.d.ts +14 -0
  140. package/dist/lib/dashboard-setup.d.ts.map +1 -0
  141. package/dist/lib/dashboard-setup.js +192 -0
  142. package/dist/lib/dashboard-setup.js.map +1 -0
  143. package/dist/lib/dashboard-url.d.ts +19 -0
  144. package/dist/lib/dashboard-url.d.ts.map +1 -0
  145. package/dist/lib/dashboard-url.js +25 -0
  146. package/dist/lib/dashboard-url.js.map +1 -0
  147. package/dist/lib/desktop-setup.d.ts +21 -0
  148. package/dist/lib/desktop-setup.d.ts.map +1 -0
  149. package/dist/lib/desktop-setup.js +556 -0
  150. package/dist/lib/desktop-setup.js.map +1 -0
  151. package/dist/lib/detect-agent.d.ts +24 -0
  152. package/dist/lib/detect-agent.d.ts.map +1 -0
  153. package/dist/lib/detect-agent.js +69 -0
  154. package/dist/lib/detect-agent.js.map +1 -0
  155. package/dist/lib/detect-env.d.ts +14 -0
  156. package/dist/lib/detect-env.d.ts.map +1 -0
  157. package/dist/lib/detect-env.js +46 -0
  158. package/dist/lib/detect-env.js.map +1 -0
  159. package/dist/lib/discord-setup.d.ts +20 -0
  160. package/dist/lib/discord-setup.d.ts.map +1 -0
  161. package/dist/lib/discord-setup.js +584 -0
  162. package/dist/lib/discord-setup.js.map +1 -0
  163. package/dist/lib/format.d.ts +11 -0
  164. package/dist/lib/format.d.ts.map +1 -0
  165. package/dist/lib/format.js +116 -0
  166. package/dist/lib/format.js.map +1 -0
  167. package/dist/lib/git-utils.d.ts +14 -0
  168. package/dist/lib/git-utils.d.ts.map +1 -0
  169. package/dist/lib/git-utils.js +45 -0
  170. package/dist/lib/git-utils.js.map +1 -0
  171. package/dist/lib/install-helpers.d.ts +24 -0
  172. package/dist/lib/install-helpers.d.ts.map +1 -0
  173. package/dist/lib/install-helpers.js +76 -0
  174. package/dist/lib/install-helpers.js.map +1 -0
  175. package/dist/lib/lifecycle-service.d.ts +11 -0
  176. package/dist/lib/lifecycle-service.d.ts.map +1 -0
  177. package/dist/lib/lifecycle-service.js +65 -0
  178. package/dist/lib/lifecycle-service.js.map +1 -0
  179. package/dist/lib/notifier-routing.d.ts +35 -0
  180. package/dist/lib/notifier-routing.d.ts.map +1 -0
  181. package/dist/lib/notifier-routing.js +133 -0
  182. package/dist/lib/notifier-routing.js.map +1 -0
  183. package/dist/lib/notify-test.d.ts +72 -0
  184. package/dist/lib/notify-test.d.ts.map +1 -0
  185. package/dist/lib/notify-test.js +674 -0
  186. package/dist/lib/notify-test.js.map +1 -0
  187. package/dist/lib/openclaw-probe.d.ts +38 -0
  188. package/dist/lib/openclaw-probe.d.ts.map +1 -0
  189. package/dist/lib/openclaw-probe.js +146 -0
  190. package/dist/lib/openclaw-probe.js.map +1 -0
  191. package/dist/lib/openclaw-setup.d.ts +19 -0
  192. package/dist/lib/openclaw-setup.d.ts.map +1 -0
  193. package/dist/lib/openclaw-setup.js +684 -0
  194. package/dist/lib/openclaw-setup.js.map +1 -0
  195. package/dist/lib/path-equality.d.ts +29 -0
  196. package/dist/lib/path-equality.d.ts.map +1 -0
  197. package/dist/lib/path-equality.js +52 -0
  198. package/dist/lib/path-equality.js.map +1 -0
  199. package/dist/lib/plugin-marketplace.d.ts +24 -0
  200. package/dist/lib/plugin-marketplace.d.ts.map +1 -0
  201. package/dist/lib/plugin-marketplace.js +175 -0
  202. package/dist/lib/plugin-marketplace.js.map +1 -0
  203. package/dist/lib/plugin-scaffold.d.ts +14 -0
  204. package/dist/lib/plugin-scaffold.d.ts.map +1 -0
  205. package/dist/lib/plugin-scaffold.js +174 -0
  206. package/dist/lib/plugin-scaffold.js.map +1 -0
  207. package/dist/lib/plugin-store.d.ts +9 -0
  208. package/dist/lib/plugin-store.d.ts.map +1 -0
  209. package/dist/lib/plugin-store.js +121 -0
  210. package/dist/lib/plugin-store.js.map +1 -0
  211. package/dist/lib/plugins.d.ts +17 -0
  212. package/dist/lib/plugins.d.ts.map +1 -0
  213. package/dist/lib/plugins.js +65 -0
  214. package/dist/lib/plugins.js.map +1 -0
  215. package/dist/lib/portfolio-display.d.ts +10 -0
  216. package/dist/lib/portfolio-display.d.ts.map +1 -0
  217. package/dist/lib/portfolio-display.js +17 -0
  218. package/dist/lib/portfolio-display.js.map +1 -0
  219. package/dist/lib/preflight.d.ts +27 -0
  220. package/dist/lib/preflight.d.ts.map +1 -0
  221. package/dist/lib/preflight.js +77 -0
  222. package/dist/lib/preflight.js.map +1 -0
  223. package/dist/lib/prevent-sleep.d.ts +34 -0
  224. package/dist/lib/prevent-sleep.d.ts.map +1 -0
  225. package/dist/lib/prevent-sleep.js +65 -0
  226. package/dist/lib/prevent-sleep.js.map +1 -0
  227. package/dist/lib/project-detection.d.ts +11 -0
  228. package/dist/lib/project-detection.d.ts.map +1 -0
  229. package/dist/lib/project-detection.js +206 -0
  230. package/dist/lib/project-detection.js.map +1 -0
  231. package/dist/lib/project-resolution.d.ts +10 -0
  232. package/dist/lib/project-resolution.d.ts.map +1 -0
  233. package/dist/lib/project-resolution.js +17 -0
  234. package/dist/lib/project-resolution.js.map +1 -0
  235. package/dist/lib/project-supervisor.d.ts +28 -0
  236. package/dist/lib/project-supervisor.d.ts.map +1 -0
  237. package/dist/lib/project-supervisor.js +167 -0
  238. package/dist/lib/project-supervisor.js.map +1 -0
  239. package/dist/lib/prompts.d.ts +7 -0
  240. package/dist/lib/prompts.d.ts.map +1 -0
  241. package/dist/lib/prompts.js +37 -0
  242. package/dist/lib/prompts.js.map +1 -0
  243. package/dist/lib/repo-utils.d.ts +16 -0
  244. package/dist/lib/repo-utils.d.ts.map +1 -0
  245. package/dist/lib/repo-utils.js +26 -0
  246. package/dist/lib/repo-utils.js.map +1 -0
  247. package/dist/lib/resolve-project.d.ts +113 -0
  248. package/dist/lib/resolve-project.d.ts.map +1 -0
  249. package/dist/lib/resolve-project.js +433 -0
  250. package/dist/lib/resolve-project.js.map +1 -0
  251. package/dist/lib/routes.d.ts +2 -0
  252. package/dist/lib/routes.d.ts.map +1 -0
  253. package/dist/lib/routes.js +5 -0
  254. package/dist/lib/routes.js.map +1 -0
  255. package/dist/lib/running-state.d.ts +76 -0
  256. package/dist/lib/running-state.d.ts.map +1 -0
  257. package/dist/lib/running-state.js +338 -0
  258. package/dist/lib/running-state.js.map +1 -0
  259. package/dist/lib/script-runner.d.ts +10 -0
  260. package/dist/lib/script-runner.d.ts.map +1 -0
  261. package/dist/lib/script-runner.js +189 -0
  262. package/dist/lib/script-runner.js.map +1 -0
  263. package/dist/lib/session-utils.d.ts +14 -0
  264. package/dist/lib/session-utils.d.ts.map +1 -0
  265. package/dist/lib/session-utils.js +58 -0
  266. package/dist/lib/session-utils.js.map +1 -0
  267. package/dist/lib/shell.d.ts +17 -0
  268. package/dist/lib/shell.d.ts.map +1 -0
  269. package/dist/lib/shell.js +90 -0
  270. package/dist/lib/shell.js.map +1 -0
  271. package/dist/lib/shutdown.d.ts +30 -0
  272. package/dist/lib/shutdown.d.ts.map +1 -0
  273. package/dist/lib/shutdown.js +177 -0
  274. package/dist/lib/shutdown.js.map +1 -0
  275. package/dist/lib/slack-setup.d.ts +17 -0
  276. package/dist/lib/slack-setup.d.ts.map +1 -0
  277. package/dist/lib/slack-setup.js +485 -0
  278. package/dist/lib/slack-setup.js.map +1 -0
  279. package/dist/lib/startup-preflight.d.ts +36 -0
  280. package/dist/lib/startup-preflight.d.ts.map +1 -0
  281. package/dist/lib/startup-preflight.js +273 -0
  282. package/dist/lib/startup-preflight.js.map +1 -0
  283. package/dist/lib/update-channel-onboarding.d.ts +52 -0
  284. package/dist/lib/update-channel-onboarding.d.ts.map +1 -0
  285. package/dist/lib/update-channel-onboarding.js +107 -0
  286. package/dist/lib/update-channel-onboarding.js.map +1 -0
  287. package/dist/lib/update-check.d.ts +161 -0
  288. package/dist/lib/update-check.d.ts.map +1 -0
  289. package/dist/lib/update-check.js +504 -0
  290. package/dist/lib/update-check.js.map +1 -0
  291. package/dist/lib/web-dir.d.ts +47 -0
  292. package/dist/lib/web-dir.d.ts.map +1 -0
  293. package/dist/lib/web-dir.js +179 -0
  294. package/dist/lib/web-dir.js.map +1 -0
  295. package/dist/lib/webhook-setup.d.ts +16 -0
  296. package/dist/lib/webhook-setup.d.ts.map +1 -0
  297. package/dist/lib/webhook-setup.js +383 -0
  298. package/dist/lib/webhook-setup.js.map +1 -0
  299. package/dist/options/version.d.ts +2 -0
  300. package/dist/options/version.d.ts.map +1 -0
  301. package/dist/options/version.js +7 -0
  302. package/dist/options/version.js.map +1 -0
  303. package/dist/program.d.ts +3 -0
  304. package/dist/program.d.ts.map +1 -0
  305. package/dist/program.js +63 -0
  306. package/dist/program.js.map +1 -0
  307. package/package.json +80 -0
  308. package/templates/rules/base.md +4 -0
  309. package/templates/rules/go.md +8 -0
  310. package/templates/rules/javascript.md +4 -0
  311. package/templates/rules/nextjs.md +7 -0
  312. package/templates/rules/pnpm-workspaces.md +4 -0
  313. package/templates/rules/python.md +8 -0
  314. package/templates/rules/react.md +8 -0
  315. package/templates/rules/typescript.md +6 -0
@@ -0,0 +1,584 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+ import chalk from "chalk";
3
+ import { parseDocument } from "yaml";
4
+ import { CONFIG_SCHEMA_URL, findConfigFile, isCanonicalGlobalConfigPath } from "@made-by-moonlight/athene-core";
5
+ import { applyNotifierRoutingPreset, getNotifierRoutingState, promptNotifierRoutingPreset, resolveRoutingPresetOption, } from "./notifier-routing.js";
6
+ const DISCORD_APP_URL = "https://discord.com/app";
7
+ const DISCORD_SUPPORT_WEBHOOK_URL = "https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks";
8
+ const DISCORD_WEBHOOK_DOCS_URL = "https://docs.discord.com/developers/resources/webhook";
9
+ const DEFAULT_USERNAME = "Athene";
10
+ const DEFAULT_RETRIES = 2;
11
+ const DEFAULT_RETRY_DELAY_MS = 1000;
12
+ const SETUP_TIMEOUT_MS = 10_000;
13
+ export class DiscordSetupError extends Error {
14
+ exitCode;
15
+ constructor(message, exitCode = 1) {
16
+ super(message);
17
+ this.exitCode = exitCode;
18
+ this.name = "DiscordSetupError";
19
+ }
20
+ }
21
+ function isRecord(value) {
22
+ return value !== null && typeof value === "object" && !Array.isArray(value);
23
+ }
24
+ function stringValue(value) {
25
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
26
+ }
27
+ function validateDiscordWebhookUrl(webhookUrl) {
28
+ let parsed;
29
+ try {
30
+ parsed = new URL(webhookUrl);
31
+ }
32
+ catch {
33
+ throw new DiscordSetupError("Discord webhook URL is invalid.");
34
+ }
35
+ const validHost = parsed.hostname === "discord.com" || parsed.hostname === "discordapp.com";
36
+ if (parsed.protocol !== "https:" || !validHost || !parsed.pathname.startsWith("/api/webhooks/")) {
37
+ throw new DiscordSetupError("Discord webhook URL must look like https://discord.com/api/webhooks/...");
38
+ }
39
+ }
40
+ function validateOptionalHttpUrl(value, label) {
41
+ if (!value)
42
+ return;
43
+ let parsed;
44
+ try {
45
+ parsed = new URL(value);
46
+ }
47
+ catch {
48
+ throw new DiscordSetupError(`${label} is invalid.`);
49
+ }
50
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
51
+ throw new DiscordSetupError(`${label} must start with http:// or https://.`);
52
+ }
53
+ }
54
+ function parseNonNegativeInteger(value, label, fallback) {
55
+ if (value === undefined || value === null || value === "")
56
+ return fallback;
57
+ const parsed = typeof value === "number" ? value : Number(value);
58
+ if (!Number.isInteger(parsed) || parsed < 0) {
59
+ throw new DiscordSetupError(`${label} must be a non-negative integer.`);
60
+ }
61
+ return parsed;
62
+ }
63
+ function existingIntegerText(value, fallback) {
64
+ if (value === undefined || value === null || value === "")
65
+ return String(fallback);
66
+ const parsed = typeof value === "number" ? value : Number(value);
67
+ return Number.isInteger(parsed) && parsed >= 0 ? String(parsed) : String(fallback);
68
+ }
69
+ function readConfigContext() {
70
+ const configPath = findConfigFile() ?? undefined;
71
+ if (!configPath) {
72
+ throw new DiscordSetupError("No agent-orchestrator.yaml found. Run 'athene start' first to create one.");
73
+ }
74
+ const rawYaml = readFileSync(configPath, "utf-8");
75
+ const doc = parseDocument(rawYaml);
76
+ const rawConfig = doc.toJS() ?? {};
77
+ return { configPath, rawConfig };
78
+ }
79
+ function getExistingDiscord(rawConfig) {
80
+ const notifiers = isRecord(rawConfig["notifiers"]) ? rawConfig["notifiers"] : {};
81
+ const existing = notifiers["discord"];
82
+ return isRecord(existing) ? existing : {};
83
+ }
84
+ function formatFetchError(error) {
85
+ if (error instanceof Error)
86
+ return error.message;
87
+ return String(error);
88
+ }
89
+ function effectiveWebhookUrl(webhookUrl, threadId) {
90
+ if (!threadId)
91
+ return webhookUrl;
92
+ const separator = webhookUrl.includes("?") ? "&" : "?";
93
+ return `${webhookUrl}${separator}thread_id=${encodeURIComponent(threadId)}`;
94
+ }
95
+ function buildSetupPayload(resolved) {
96
+ const payload = {
97
+ username: resolved.username,
98
+ content: "AO Discord notifications are ready.",
99
+ embeds: [
100
+ {
101
+ title: "AO Discord notifications are ready",
102
+ description: "This channel is now configured to receive AO notifications.",
103
+ color: 0x57f287,
104
+ timestamp: new Date().toISOString(),
105
+ footer: { text: "Athene" },
106
+ },
107
+ ],
108
+ };
109
+ if (resolved.avatarUrl)
110
+ payload["avatar_url"] = resolved.avatarUrl;
111
+ return payload;
112
+ }
113
+ async function sendSetupProbe(resolved) {
114
+ const controller = new AbortController();
115
+ const timer = setTimeout(() => controller.abort(), SETUP_TIMEOUT_MS);
116
+ const url = effectiveWebhookUrl(resolved.webhookUrl, resolved.threadId);
117
+ try {
118
+ const response = await fetch(url, {
119
+ method: "POST",
120
+ headers: { "Content-Type": "application/json" },
121
+ body: JSON.stringify(buildSetupPayload(resolved)),
122
+ signal: controller.signal,
123
+ });
124
+ if (response.ok || response.status === 204)
125
+ return;
126
+ const body = await response.text().catch(() => "");
127
+ throw new DiscordSetupError(`Discord setup test failed (${response.status}${response.statusText ? ` ${response.statusText}` : ""})${body ? `: ${body}` : ""}`);
128
+ }
129
+ catch (error) {
130
+ if (error instanceof DiscordSetupError)
131
+ throw error;
132
+ throw new DiscordSetupError(`Discord setup test failed: ${formatFetchError(error)}`);
133
+ }
134
+ finally {
135
+ clearTimeout(timer);
136
+ }
137
+ }
138
+ async function shouldReplaceConflictingDiscord(existingPlugin, force, nonInteractive) {
139
+ if (existingPlugin === undefined || existingPlugin === "discord" || force)
140
+ return true;
141
+ if (nonInteractive) {
142
+ throw new DiscordSetupError(`notifiers.discord already uses plugin "${String(existingPlugin)}". Re-run with --force to replace it.`);
143
+ }
144
+ const clack = await import("@clack/prompts");
145
+ const replace = await clack.confirm({
146
+ message: `notifiers.discord already uses plugin "${String(existingPlugin)}". Replace it?`,
147
+ initialValue: false,
148
+ });
149
+ if (clack.isCancel(replace) || !replace) {
150
+ console.log(chalk.dim("Keeping existing Discord notifier config."));
151
+ return false;
152
+ }
153
+ return true;
154
+ }
155
+ function printManualWebhookInstructions() {
156
+ console.log("");
157
+ console.log(chalk.bold("Create a Discord incoming webhook"));
158
+ console.log(` 1. Open ${DISCORD_APP_URL}`);
159
+ console.log(" 2. Open the target server and channel.");
160
+ console.log(" 3. Open Edit Channel > Integrations > Webhooks.");
161
+ console.log(" 4. Create a new webhook.");
162
+ console.log(" 5. Copy the webhook URL and paste it here.");
163
+ console.log(chalk.dim(`Discord help: ${DISCORD_SUPPORT_WEBHOOK_URL}`));
164
+ console.log(chalk.dim(`Developer docs: ${DISCORD_WEBHOOK_DOCS_URL}`));
165
+ console.log("");
166
+ }
167
+ function explainChannelBinding() {
168
+ console.log(chalk.dim("Discord webhook URLs are bound to the channel selected in Discord. To change channels, create a webhook in that channel."));
169
+ }
170
+ function cancelSetup(clack) {
171
+ clack.cancel("Setup cancelled.");
172
+ throw new DiscordSetupError("Setup cancelled.", 0);
173
+ }
174
+ async function promptDiscordWebhookUrl(clack, initialValue) {
175
+ const webhookUrlInput = await clack.text({
176
+ message: "Discord webhook URL:",
177
+ placeholder: "https://discord.com/api/webhooks/...",
178
+ initialValue,
179
+ validate: (value) => {
180
+ if (!value)
181
+ return "Discord webhook URL is required";
182
+ try {
183
+ validateDiscordWebhookUrl(String(value));
184
+ }
185
+ catch (error) {
186
+ return error instanceof Error ? error.message : String(error);
187
+ }
188
+ },
189
+ });
190
+ if (clack.isCancel(webhookUrlInput)) {
191
+ cancelSetup(clack);
192
+ }
193
+ return String(webhookUrlInput);
194
+ }
195
+ async function promptAfterWebhookInstructions(clack, initialValue) {
196
+ printManualWebhookInstructions();
197
+ while (true) {
198
+ const next = await clack.select({
199
+ message: "After creating the Discord webhook, what do you want to do?",
200
+ options: [
201
+ {
202
+ value: "enter-url",
203
+ label: "Paste webhook URL",
204
+ hint: "Continue setup",
205
+ },
206
+ {
207
+ value: "show-steps",
208
+ label: "Show steps again",
209
+ hint: "Reprint the Discord links and steps",
210
+ },
211
+ {
212
+ value: "back",
213
+ label: "Back",
214
+ hint: "Return to the previous options",
215
+ },
216
+ {
217
+ value: "cancel",
218
+ label: "Cancel setup",
219
+ hint: "Do not change config",
220
+ },
221
+ ],
222
+ });
223
+ if (clack.isCancel(next) || next === "cancel") {
224
+ cancelSetup(clack);
225
+ }
226
+ if (next === "back")
227
+ return "back";
228
+ if (next === "show-steps") {
229
+ printManualWebhookInstructions();
230
+ continue;
231
+ }
232
+ if (next === "enter-url") {
233
+ return promptDiscordWebhookUrl(clack, initialValue);
234
+ }
235
+ }
236
+ }
237
+ async function promptChangeWebhookUrl(clack, existingWebhookUrl) {
238
+ while (true) {
239
+ const next = await clack.select({
240
+ message: "How do you want to change the Discord webhook URL?",
241
+ options: [
242
+ {
243
+ value: "enter-url",
244
+ label: "Paste new webhook URL",
245
+ hint: "Use a different Discord webhook URL",
246
+ },
247
+ {
248
+ value: "need-url",
249
+ label: "Show me how to create a new webhook",
250
+ hint: "AO will print Discord steps and wait",
251
+ },
252
+ {
253
+ value: "back",
254
+ label: "Back",
255
+ hint: "Return to the previous options",
256
+ },
257
+ {
258
+ value: "cancel",
259
+ label: "Cancel setup",
260
+ hint: "Do not change config",
261
+ },
262
+ ],
263
+ });
264
+ if (clack.isCancel(next) || next === "cancel") {
265
+ cancelSetup(clack);
266
+ }
267
+ if (next === "back")
268
+ return "back";
269
+ if (next === "enter-url") {
270
+ return promptDiscordWebhookUrl(clack, existingWebhookUrl);
271
+ }
272
+ if (next === "need-url") {
273
+ const result = await promptAfterWebhookInstructions(clack, undefined);
274
+ if (result === "back")
275
+ continue;
276
+ return result;
277
+ }
278
+ }
279
+ }
280
+ async function resolveInteractiveWebhookUrl(clack, opts, existingWebhookUrl) {
281
+ const providedWebhookUrl = stringValue(opts.webhookUrl);
282
+ if (providedWebhookUrl)
283
+ return providedWebhookUrl;
284
+ while (true) {
285
+ const source = existingWebhookUrl
286
+ ? await clack.select({
287
+ message: "Discord notifier is already configured. What do you want to do?",
288
+ options: [
289
+ {
290
+ value: "use-existing",
291
+ label: "Use existing webhook URL",
292
+ hint: "Keep sending to the currently configured Discord channel",
293
+ },
294
+ {
295
+ value: "change-url",
296
+ label: "Change webhook URL",
297
+ hint: "Paste a different Discord webhook URL",
298
+ },
299
+ {
300
+ value: "need-url",
301
+ label: "Show me how to create a new webhook",
302
+ hint: "AO will print Discord steps and wait",
303
+ },
304
+ {
305
+ value: "cancel",
306
+ label: "Cancel setup",
307
+ hint: "Do not change config",
308
+ },
309
+ ],
310
+ })
311
+ : await clack.select({
312
+ message: "Do you already have a Discord webhook URL?",
313
+ options: [
314
+ {
315
+ value: "have-url",
316
+ label: "Yes, I have the URL",
317
+ hint: "Paste the existing Discord webhook URL",
318
+ },
319
+ {
320
+ value: "need-url",
321
+ label: "No, show me how to create one",
322
+ hint: "AO will print Discord steps and wait",
323
+ },
324
+ {
325
+ value: "cancel",
326
+ label: "Cancel setup",
327
+ hint: "Do not change config",
328
+ },
329
+ ],
330
+ });
331
+ if (clack.isCancel(source) || source === "cancel") {
332
+ cancelSetup(clack);
333
+ }
334
+ if (source === "use-existing" && existingWebhookUrl) {
335
+ return existingWebhookUrl;
336
+ }
337
+ if (source === "change-url") {
338
+ const result = await promptChangeWebhookUrl(clack, existingWebhookUrl);
339
+ if (result === "back")
340
+ continue;
341
+ return result;
342
+ }
343
+ if (source === "have-url") {
344
+ return promptDiscordWebhookUrl(clack, undefined);
345
+ }
346
+ if (source === "need-url") {
347
+ const result = await promptAfterWebhookInstructions(clack, undefined);
348
+ if (result === "back")
349
+ continue;
350
+ return result;
351
+ }
352
+ }
353
+ }
354
+ async function resolveInteractiveSetup(opts, existingDiscord, rawConfig) {
355
+ const clack = await import("@clack/prompts");
356
+ const existingWebhookUrl = stringValue(existingDiscord["webhookUrl"]);
357
+ const optionRoutingPreset = resolveDiscordRoutingPreset(opts.routingPreset);
358
+ clack.intro(chalk.bgCyan(chalk.black(" athene setup discord ")));
359
+ explainChannelBinding();
360
+ while (true) {
361
+ const resolvedWebhookUrl = await resolveInteractiveWebhookUrl(clack, opts, existingWebhookUrl);
362
+ const usernameInput = await clack.text({
363
+ message: "Display name AO should request for Discord messages:",
364
+ placeholder: DEFAULT_USERNAME,
365
+ initialValue: stringValue(opts.username) ?? stringValue(existingDiscord["username"]) ?? DEFAULT_USERNAME,
366
+ });
367
+ if (clack.isCancel(usernameInput)) {
368
+ cancelSetup(clack);
369
+ }
370
+ const avatarUrlInput = await clack.text({
371
+ message: "Avatar image URL (optional):",
372
+ placeholder: "https://example.com/avatar.png",
373
+ initialValue: stringValue(opts.avatarUrl) ?? stringValue(existingDiscord["avatarUrl"]),
374
+ validate: (value) => {
375
+ if (!value)
376
+ return undefined;
377
+ try {
378
+ validateOptionalHttpUrl(String(value), "Avatar URL");
379
+ }
380
+ catch (error) {
381
+ return error instanceof Error ? error.message : String(error);
382
+ }
383
+ },
384
+ });
385
+ if (clack.isCancel(avatarUrlInput)) {
386
+ cancelSetup(clack);
387
+ }
388
+ const threadIdInput = await clack.text({
389
+ message: "Thread ID (optional; posts into an existing Discord thread):",
390
+ placeholder: "1234567890",
391
+ initialValue: stringValue(opts.threadId) ?? stringValue(existingDiscord["threadId"]),
392
+ });
393
+ if (clack.isCancel(threadIdInput)) {
394
+ cancelSetup(clack);
395
+ }
396
+ const retriesInput = await clack.text({
397
+ message: "Retries for rate limits, network errors, and 5xx responses:",
398
+ placeholder: String(DEFAULT_RETRIES),
399
+ initialValue: stringValue(opts.retries) ??
400
+ existingIntegerText(existingDiscord["retries"], DEFAULT_RETRIES),
401
+ validate: (value) => {
402
+ try {
403
+ parseNonNegativeInteger(value, "Retries", DEFAULT_RETRIES);
404
+ }
405
+ catch (error) {
406
+ return error instanceof Error ? error.message : String(error);
407
+ }
408
+ },
409
+ });
410
+ if (clack.isCancel(retriesInput)) {
411
+ cancelSetup(clack);
412
+ }
413
+ const retryDelayInput = await clack.text({
414
+ message: "Base retry delay in milliseconds:",
415
+ placeholder: String(DEFAULT_RETRY_DELAY_MS),
416
+ initialValue: stringValue(opts.retryDelayMs) ??
417
+ existingIntegerText(existingDiscord["retryDelayMs"], DEFAULT_RETRY_DELAY_MS),
418
+ validate: (value) => {
419
+ try {
420
+ parseNonNegativeInteger(value, "Retry delay", DEFAULT_RETRY_DELAY_MS);
421
+ }
422
+ catch (error) {
423
+ return error instanceof Error ? error.message : String(error);
424
+ }
425
+ },
426
+ });
427
+ if (clack.isCancel(retryDelayInput)) {
428
+ cancelSetup(clack);
429
+ }
430
+ const routingSelection = optionRoutingPreset ??
431
+ (await promptNotifierRoutingPreset(clack, rawConfig, "discord", "Discord", () => cancelSetup(clack)));
432
+ if (routingSelection === "back")
433
+ continue;
434
+ return buildResolvedSetup(String(resolvedWebhookUrl), stringValue(usernameInput), stringValue(avatarUrlInput), stringValue(threadIdInput), retriesInput, retryDelayInput, routingSelection === "preserve" ? undefined : routingSelection, opts);
435
+ }
436
+ }
437
+ function resolveNonInteractiveSetup(opts, existingDiscord) {
438
+ const webhookUrl = stringValue(opts.webhookUrl) ??
439
+ (opts.refresh ? stringValue(existingDiscord["webhookUrl"]) : undefined);
440
+ if (!webhookUrl) {
441
+ throw new DiscordSetupError("Discord webhook URL is required. Pass --webhook-url, or run `athene setup discord --refresh` with an existing Discord config.");
442
+ }
443
+ return buildResolvedSetup(webhookUrl, stringValue(opts.username) ?? stringValue(existingDiscord["username"]), stringValue(opts.avatarUrl) ?? stringValue(existingDiscord["avatarUrl"]), stringValue(opts.threadId) ?? stringValue(existingDiscord["threadId"]), opts.retries ?? existingDiscord["retries"], opts.retryDelayMs ?? existingDiscord["retryDelayMs"], resolveDiscordRoutingPreset(opts.routingPreset) ?? (opts.refresh ? undefined : "all"), opts);
444
+ }
445
+ function buildResolvedSetup(webhookUrl, username, avatarUrl, threadId, retriesValue, retryDelayMsValue, routingPreset, opts) {
446
+ const normalizedWebhookUrl = webhookUrl.trim();
447
+ validateDiscordWebhookUrl(normalizedWebhookUrl);
448
+ validateOptionalHttpUrl(avatarUrl, "Avatar URL");
449
+ return {
450
+ webhookUrl: normalizedWebhookUrl,
451
+ username: username ?? DEFAULT_USERNAME,
452
+ avatarUrl,
453
+ threadId,
454
+ retries: parseNonNegativeInteger(retriesValue, "Retries", DEFAULT_RETRIES),
455
+ retryDelayMs: parseNonNegativeInteger(retryDelayMsValue, "Retry delay", DEFAULT_RETRY_DELAY_MS),
456
+ shouldSendTest: opts.test !== false,
457
+ routingPreset,
458
+ };
459
+ }
460
+ function resolveDiscordRoutingPreset(value) {
461
+ try {
462
+ return resolveRoutingPresetOption(value, "Discord");
463
+ }
464
+ catch (error) {
465
+ throw new DiscordSetupError(error instanceof Error ? error.message : String(error));
466
+ }
467
+ }
468
+ function writeDiscordConfig(configPath, resolved) {
469
+ const rawYaml = readFileSync(configPath, "utf-8");
470
+ const doc = parseDocument(rawYaml);
471
+ const rawConfig = doc.toJS() ?? {};
472
+ const notifiers = isRecord(rawConfig["notifiers"]) ? rawConfig["notifiers"] : {};
473
+ const existingDiscord = isRecord(notifiers["discord"]) ? notifiers["discord"] : {};
474
+ const discordConfig = {
475
+ ...existingDiscord,
476
+ plugin: "discord",
477
+ webhookUrl: resolved.webhookUrl,
478
+ username: resolved.username,
479
+ retries: resolved.retries,
480
+ retryDelayMs: resolved.retryDelayMs,
481
+ };
482
+ if (resolved.avatarUrl)
483
+ discordConfig["avatarUrl"] = resolved.avatarUrl;
484
+ else
485
+ delete discordConfig["avatarUrl"];
486
+ if (resolved.threadId)
487
+ discordConfig["threadId"] = resolved.threadId;
488
+ else
489
+ delete discordConfig["threadId"];
490
+ notifiers["discord"] = discordConfig;
491
+ rawConfig["notifiers"] = notifiers;
492
+ const defaults = isRecord(rawConfig["defaults"]) ? rawConfig["defaults"] : {};
493
+ rawConfig["defaults"] = defaults;
494
+ applyNotifierRoutingPreset(rawConfig, "discord", resolved.routingPreset);
495
+ if (!isCanonicalGlobalConfigPath(configPath)) {
496
+ const currentSchema = doc.get("$schema");
497
+ if (!(typeof currentSchema === "string" && currentSchema.trim().length > 0)) {
498
+ doc.set("$schema", CONFIG_SCHEMA_URL);
499
+ }
500
+ }
501
+ doc.setIn(["notifiers"], rawConfig["notifiers"]);
502
+ doc.setIn(["defaults"], rawConfig["defaults"]);
503
+ if (rawConfig["notificationRouting"] !== undefined) {
504
+ doc.setIn(["notificationRouting"], rawConfig["notificationRouting"]);
505
+ }
506
+ writeFileSync(configPath, doc.toString({ indent: 2 }));
507
+ }
508
+ function webhookUrlStatus(webhookUrl) {
509
+ if (!webhookUrl)
510
+ return "not configured";
511
+ try {
512
+ return `configured (${new URL(webhookUrl).hostname})`;
513
+ }
514
+ catch {
515
+ return "configured";
516
+ }
517
+ }
518
+ async function printStatus() {
519
+ const context = readConfigContext();
520
+ const existingDiscord = getExistingDiscord(context.rawConfig);
521
+ const plugin = stringValue(existingDiscord["plugin"]);
522
+ const webhookUrl = stringValue(existingDiscord["webhookUrl"]);
523
+ const username = stringValue(existingDiscord["username"]) ?? DEFAULT_USERNAME;
524
+ const avatarUrl = stringValue(existingDiscord["avatarUrl"]);
525
+ const threadId = stringValue(existingDiscord["threadId"]);
526
+ const retries = parseNonNegativeInteger(existingDiscord["retries"], "Retries", DEFAULT_RETRIES);
527
+ const retryDelayMs = parseNonNegativeInteger(existingDiscord["retryDelayMs"], "Retry delay", DEFAULT_RETRY_DELAY_MS);
528
+ console.log(chalk.bold("Discord notifier status"));
529
+ console.log(` Config: ${context.configPath}`);
530
+ console.log(` Plugin: ${plugin ?? chalk.dim("not configured")}`);
531
+ console.log(` Webhook URL: ${webhookUrlStatus(webhookUrl)}`);
532
+ console.log(` Username: ${username}`);
533
+ console.log(` Avatar URL: ${avatarUrl ?? chalk.dim("not configured")}`);
534
+ console.log(` Thread ID: ${threadId ?? chalk.dim("not configured")}`);
535
+ console.log(` Retries: ${retries}`);
536
+ console.log(` Retry delay: ${retryDelayMs}ms`);
537
+ console.log(` Routing: ${getNotifierRoutingState(context.rawConfig, "discord").label}`);
538
+ if (plugin !== "discord" || !webhookUrl)
539
+ return;
540
+ try {
541
+ await sendSetupProbe(buildResolvedSetup(webhookUrl, username, avatarUrl, threadId, retries, retryDelayMs, undefined, {
542
+ test: true,
543
+ }));
544
+ console.log(chalk.green(" Probe: PASS"));
545
+ }
546
+ catch (error) {
547
+ console.log(chalk.red(` Probe: FAIL ${error instanceof Error ? error.message : String(error)}`));
548
+ }
549
+ }
550
+ export async function runDiscordSetupAction(opts) {
551
+ const nonInteractive = opts.nonInteractive || !process.stdin.isTTY;
552
+ const force = Boolean(opts.force);
553
+ if (opts.status) {
554
+ await printStatus();
555
+ return;
556
+ }
557
+ const context = readConfigContext();
558
+ const existingDiscord = getExistingDiscord(context.rawConfig);
559
+ const shouldWire = await shouldReplaceConflictingDiscord(existingDiscord["plugin"], force, nonInteractive);
560
+ if (!shouldWire)
561
+ return;
562
+ const resolved = nonInteractive
563
+ ? resolveNonInteractiveSetup(opts, existingDiscord)
564
+ : await resolveInteractiveSetup(opts, existingDiscord, context.rawConfig);
565
+ if (resolved.shouldSendTest) {
566
+ await sendSetupProbe(resolved);
567
+ console.log(chalk.green("āœ“ Discord setup test passed"));
568
+ }
569
+ else {
570
+ console.log(chalk.dim("Skipped Discord setup test."));
571
+ }
572
+ writeDiscordConfig(context.configPath, resolved);
573
+ console.log(chalk.green(`āœ“ Config written to ${context.configPath}`));
574
+ if (!nonInteractive) {
575
+ const clack = await import("@clack/prompts");
576
+ clack.outro(`${chalk.green("Discord setup complete!")} AO will send notifications through the configured Discord webhook.\n` +
577
+ chalk.dim(" Test it with: athene notify test --to discord --template basic"));
578
+ }
579
+ else {
580
+ console.log(chalk.green("\nāœ“ Discord setup complete."));
581
+ console.log(chalk.dim("Test it with: athene notify test --to discord --template basic"));
582
+ }
583
+ }
584
+ //# sourceMappingURL=discord-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-setup.js","sourceRoot":"","sources":["../../src/lib/discord-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CIStatus, ReviewDecision, ActivityState } from "@made-by-moonlight/athene-core";
2
+ export declare function header(title: string): string;
3
+ export declare function banner(title: string): string;
4
+ export declare function formatAge(epochMs: number): string;
5
+ export declare function statusColor(status: string): string;
6
+ export declare function ciStatusIcon(status: CIStatus | null): string;
7
+ export declare function reviewDecisionIcon(decision: ReviewDecision | null): string;
8
+ export declare function activityIcon(activity: ActivityState | null): string;
9
+ /** Pad/truncate a string to exactly `width` visible characters */
10
+ export declare function padCol(str: string, width: number): string;
11
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE9F,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA4BlD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM,CAY5D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAY1E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAiBnE;AAKD,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAWzD"}