| import type { Command } from "commander"; |
| import { messageCommand } from "../../../commands/message.js"; |
| import { danger, setVerbose } from "../../../globals.js"; |
| import { CHANNEL_TARGET_DESCRIPTION } from "../../../infra/outbound/channel-target.js"; |
| import { runGlobalGatewayStopSafely } from "../../../plugins/hook-runner-global.js"; |
| import { defaultRuntime } from "../../../runtime.js"; |
| import { runCommandWithRuntime } from "../../cli-utils.js"; |
| import { createDefaultDeps } from "../../deps.js"; |
| import { ensurePluginRegistryLoaded } from "../../plugin-registry.js"; |
|
|
| export type MessageCliHelpers = { |
| withMessageBase: (command: Command) => Command; |
| withMessageTarget: (command: Command) => Command; |
| withRequiredMessageTarget: (command: Command) => Command; |
| runMessageAction: (action: string, opts: Record<string, unknown>) => Promise<void>; |
| }; |
|
|
| function normalizeMessageOptions(opts: Record<string, unknown>): Record<string, unknown> { |
| const { account, ...rest } = opts; |
| return { |
| ...rest, |
| accountId: typeof account === "string" ? account : undefined, |
| }; |
| } |
|
|
| async function runPluginStopHooks(): Promise<void> { |
| await runGlobalGatewayStopSafely({ |
| event: { reason: "cli message action complete" }, |
| ctx: {}, |
| onError: (err) => defaultRuntime.error(danger(`gateway_stop hook failed: ${String(err)}`)), |
| }); |
| } |
|
|
| export function createMessageCliHelpers( |
| message: Command, |
| messageChannelOptions: string, |
| ): MessageCliHelpers { |
| const withMessageBase = (command: Command) => |
| command |
| .option("--channel <channel>", `Channel: ${messageChannelOptions}`) |
| .option("--account <id>", "Channel account id (accountId)") |
| .option("--json", "Output result as JSON", false) |
| .option("--dry-run", "Print payload and skip sending", false) |
| .option("--verbose", "Verbose logging", false); |
|
|
| const withMessageTarget = (command: Command) => |
| command.option("-t, --target <dest>", CHANNEL_TARGET_DESCRIPTION); |
| const withRequiredMessageTarget = (command: Command) => |
| command.requiredOption("-t, --target <dest>", CHANNEL_TARGET_DESCRIPTION); |
|
|
| const runMessageAction = async (action: string, opts: Record<string, unknown>) => { |
| setVerbose(Boolean(opts.verbose)); |
| ensurePluginRegistryLoaded(); |
| const deps = createDefaultDeps(); |
| let failed = false; |
| await runCommandWithRuntime( |
| defaultRuntime, |
| async () => { |
| await messageCommand( |
| { |
| ...normalizeMessageOptions(opts), |
| action, |
| }, |
| deps, |
| defaultRuntime, |
| ); |
| }, |
| (err) => { |
| failed = true; |
| defaultRuntime.error(danger(String(err))); |
| }, |
| ); |
| await runPluginStopHooks(); |
| defaultRuntime.exit(failed ? 1 : 0); |
| }; |
|
|
| |
| |
| void message; |
|
|
| return { |
| withMessageBase, |
| withMessageTarget, |
| withRequiredMessageTarget, |
| runMessageAction, |
| }; |
| } |
|
|