feat(channels): allow setting config dir for signal

Create a clawdbot configuration that sets the Signal config directory.
This allows the config dir to be on a volume when clawdbot is running in
docker
This commit is contained in:
Mike 2026-01-26 17:55:22 -08:00
parent 481bd333eb
commit e34a8c39f8
4 changed files with 12 additions and 0 deletions

View File

@ -31,6 +31,8 @@ export type SignalAccountConfig = {
httpPort?: number; httpPort?: number;
/** signal-cli binary path (default: signal-cli). */ /** signal-cli binary path (default: signal-cli). */
cliPath?: string; cliPath?: string;
/** Custom config/data directory for signal-cli (default: ~/.local/share/signal-cli). */
configDir?: string;
/** Auto-start signal-cli daemon (default: true if httpUrl not set). */ /** Auto-start signal-cli daemon (default: true if httpUrl not set). */
autoStart?: boolean; autoStart?: boolean;
/** Max time to wait for signal-cli daemon startup (ms, cap 120000). */ /** Max time to wait for signal-cli daemon startup (ms, cap 120000). */

View File

@ -499,6 +499,7 @@ export const SignalAccountSchemaBase = z
httpHost: z.string().optional(), httpHost: z.string().optional(),
httpPort: z.number().int().positive().optional(), httpPort: z.number().int().positive().optional(),
cliPath: ExecutableTokenSchema.optional(), cliPath: ExecutableTokenSchema.optional(),
configDir: z.string().optional(),
autoStart: z.boolean().optional(), autoStart: z.boolean().optional(),
startupTimeoutMs: z.number().int().min(1000).max(120000).optional(), startupTimeoutMs: z.number().int().min(1000).max(120000).optional(),
receiveMode: z.union([z.literal("on-start"), z.literal("manual")]).optional(), receiveMode: z.union([z.literal("on-start"), z.literal("manual")]).optional(),

View File

@ -10,6 +10,8 @@ export type SignalDaemonOpts = {
ignoreAttachments?: boolean; ignoreAttachments?: boolean;
ignoreStories?: boolean; ignoreStories?: boolean;
sendReadReceipts?: boolean; sendReadReceipts?: boolean;
/** Custom config/data directory for signal-cli. */
configDir?: string;
runtime?: RuntimeEnv; runtime?: RuntimeEnv;
}; };
@ -30,6 +32,9 @@ export function classifySignalCliLogLine(line: string): "log" | "error" | null {
function buildDaemonArgs(opts: SignalDaemonOpts): string[] { function buildDaemonArgs(opts: SignalDaemonOpts): string[] {
const args: string[] = []; const args: string[] = [];
if (opts.configDir) {
args.push("-c", opts.configDir);
}
if (opts.account) { if (opts.account) {
args.push("-a", opts.account); args.push("-a", opts.account);
} }

View File

@ -45,6 +45,8 @@ export type MonitorSignalOpts = {
autoStart?: boolean; autoStart?: boolean;
startupTimeoutMs?: number; startupTimeoutMs?: number;
cliPath?: string; cliPath?: string;
/** Custom config/data directory for signal-cli. */
configDir?: string;
httpHost?: string; httpHost?: string;
httpPort?: number; httpPort?: number;
receiveMode?: "on-start" | "manual"; receiveMode?: "on-start" | "manual";
@ -295,10 +297,12 @@ export async function monitorSignalProvider(opts: MonitorSignalOpts = {}): Promi
if (autoStart) { if (autoStart) {
const cliPath = opts.cliPath ?? accountInfo.config.cliPath ?? "signal-cli"; const cliPath = opts.cliPath ?? accountInfo.config.cliPath ?? "signal-cli";
const configDir = opts.configDir ?? accountInfo.config.configDir;
const httpHost = opts.httpHost ?? accountInfo.config.httpHost ?? "127.0.0.1"; const httpHost = opts.httpHost ?? accountInfo.config.httpHost ?? "127.0.0.1";
const httpPort = opts.httpPort ?? accountInfo.config.httpPort ?? 8080; const httpPort = opts.httpPort ?? accountInfo.config.httpPort ?? 8080;
daemonHandle = spawnSignalDaemon({ daemonHandle = spawnSignalDaemon({
cliPath, cliPath,
configDir,
account, account,
httpHost, httpHost,
httpPort, httpPort,