UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

106 lines (105 loc) 4.13 kB
import { s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js"; import { g as shortenHomePath, p as resolveUserPath } from "./utils-CCC-BEJH.js"; import { n as defaultRuntime } from "./runtime-B4lgFmsS.js"; import { n as resolveDefaultAgentWorkspaceDir } from "./workspace-default-B3AjhIK3.js"; import { r as createConfigIO } from "./io-Gi7-pyU-.js"; import { i as replaceConfigFile } from "./config-C9RxTsn1.js"; import { E as resolveWorkspaceTemplateSearchDirs } from "./workspace-B0bmoo98.js"; import { o as handleReset } from "./onboard-helpers-DXyUiHQ-.js"; import fs from "node:fs"; import path from "node:path"; import os from "node:os"; //#region src/cli/gateway-cli/dev.ts const DEV_IDENTITY_NAME = "C3-PO"; const DEV_IDENTITY_THEME = "protocol droid"; const DEV_IDENTITY_EMOJI = "🤖"; const DEV_AGENT_WORKSPACE_SUFFIX = "dev"; async function loadDevTemplate(name, fallback) { try { const templateDirs = await resolveWorkspaceTemplateSearchDirs(); for (const templateDir of templateDirs) { let raw; try { raw = await fs.promises.readFile(path.join(templateDir, name), "utf-8"); } catch (error) { if (error?.code === "ENOENT") continue; throw error; } if (!raw.startsWith("---")) return raw; const endIndex = raw.indexOf("\n---", 3); if (endIndex === -1) return raw; return raw.slice(endIndex + 4).replace(/^\s+/, ""); } } catch { return fallback; } return fallback; } const resolveDevWorkspaceDir = (env = process.env) => { const baseDir = resolveDefaultAgentWorkspaceDir(env, os.homedir); if (normalizeOptionalLowercaseString(env.OPENCLAW_PROFILE) === "dev") return baseDir; return `${baseDir}-${DEV_AGENT_WORKSPACE_SUFFIX}`; }; async function writeFileIfMissing(filePath, content) { try { await fs.promises.writeFile(filePath, content, { encoding: "utf-8", flag: "wx" }); } catch (err) { if (err.code !== "EEXIST") throw err; } } async function ensureDevWorkspace(dir) { const resolvedDir = resolveUserPath(dir); await fs.promises.mkdir(resolvedDir, { recursive: true }); const [agents, soul, tools, identity, user] = await Promise.all([ loadDevTemplate("AGENTS.dev.md", `# AGENTS.md - OpenClaw Dev Workspace\n\nDefault dev workspace for openclaw gateway --dev.\n`), loadDevTemplate("SOUL.dev.md", `# SOUL.md - Dev Persona\n\nProtocol droid for debugging and operations.\n`), loadDevTemplate("TOOLS.dev.md", `# TOOLS.md - User Tool Notes (editable)\n\nAdd your local tool notes here.\n`), loadDevTemplate("IDENTITY.dev.md", `# IDENTITY.md - Agent Identity\n\n- Name: ${DEV_IDENTITY_NAME}\n- Creature: protocol droid\n- Vibe: ${DEV_IDENTITY_THEME}\n- Emoji: ${DEV_IDENTITY_EMOJI}\n`), loadDevTemplate("USER.dev.md", `# USER.md - User Profile\n\n- Name:\n- Preferred address:\n- Notes:\n`) ]); await writeFileIfMissing(path.join(resolvedDir, "AGENTS.md"), agents); await writeFileIfMissing(path.join(resolvedDir, "SOUL.md"), soul); await writeFileIfMissing(path.join(resolvedDir, "TOOLS.md"), tools); await writeFileIfMissing(path.join(resolvedDir, "IDENTITY.md"), identity); await writeFileIfMissing(path.join(resolvedDir, "USER.md"), user); } async function ensureDevGatewayConfig(opts) { const workspace = resolveDevWorkspaceDir(); if (opts.reset) await handleReset("full", workspace, defaultRuntime); const configPath = createConfigIO().configPath; const configExists = fs.existsSync(configPath); if (!opts.reset && configExists) return; await replaceConfigFile({ nextConfig: { gateway: { mode: "local", bind: "loopback" }, agents: { defaults: { workspace, skipBootstrap: true }, list: [{ id: "dev", default: true, workspace, identity: { name: DEV_IDENTITY_NAME, theme: DEV_IDENTITY_THEME, emoji: DEV_IDENTITY_EMOJI } }] } }, afterWrite: { mode: "auto" } }); await ensureDevWorkspace(workspace); defaultRuntime.log(`Dev config ready: ${shortenHomePath(configPath)}`); defaultRuntime.log(`Dev workspace ready: ${shortenHomePath(resolveUserPath(workspace))}`); } //#endregion export { ensureDevGatewayConfig };