mirror of
https://github.com/JimLiu/baoyu-skills.git
synced 2026-07-12 22:09:48 +08:00
49e9c46ca4
Expose Codex CLI's built-in image_gen tool through baoyu-image-gen's
standard CLI + batch flow as a dedicated provider. The provider spawns
the bundled scripts/codex-imagegen/main.ts (synced from
packages/baoyu-codex-imagegen/src/) so the skill remains self-contained
and inherits retry, cache, file-lock, and JSONL logging. No
OPENAI_API_KEY required — uses the user's Codex subscription.
New env vars: BAOYU_CODEX_IMAGEGEN_{BIN,CACHE_DIR,TIMEOUT_MS,RETRIES,LOG_FILE}.
Hyphenated provider names now resolve under-scored env vars (e.g.,
BAOYU_IMAGE_GEN_CODEX_CLI_CONCURRENCY). codex-cli is never auto-selected
— pin via --provider or default_provider in EXTEND.md.
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { appendFile, mkdir } from "node:fs/promises";
|
|
import path from "node:path";
|
|
|
|
export interface LogEntry {
|
|
ts: string;
|
|
level: "info" | "warn" | "error";
|
|
event: string;
|
|
[k: string]: unknown;
|
|
}
|
|
|
|
export class JsonLogger {
|
|
constructor(private logFile: string | null, public verbose: boolean) {}
|
|
|
|
async log(level: LogEntry["level"], event: string, extra: Record<string, unknown> = {}): Promise<void> {
|
|
const entry: LogEntry = { ts: new Date().toISOString(), level, event, ...extra };
|
|
const line = JSON.stringify(entry);
|
|
if (this.verbose) process.stderr.write(`[${level}] ${event} ${jsonExtras(extra)}\n`);
|
|
if (this.logFile) {
|
|
await mkdir(path.dirname(this.logFile), { recursive: true });
|
|
await appendFile(this.logFile, line + "\n", "utf-8");
|
|
}
|
|
}
|
|
|
|
info(event: string, extra?: Record<string, unknown>) {
|
|
return this.log("info", event, extra);
|
|
}
|
|
warn(event: string, extra?: Record<string, unknown>) {
|
|
return this.log("warn", event, extra);
|
|
}
|
|
error(event: string, extra?: Record<string, unknown>) {
|
|
return this.log("error", event, extra);
|
|
}
|
|
}
|
|
|
|
function jsonExtras(extra: Record<string, unknown>): string {
|
|
const entries = Object.entries(extra);
|
|
if (entries.length === 0) return "";
|
|
return entries.map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`).join(" ");
|
|
}
|