@godmode-team/godmode 1.0.0
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.
- package/LICENSE +62 -0
- package/README.md +88 -0
- package/dist/deck/assets/index-Dq6YBWDo.css +10 -0
- package/dist/deck/assets/index-OeRjiyQU.js +83 -0
- package/dist/deck/index.html +17 -0
- package/dist/godmode-ui/assets/index-BPHog2ro.css +1 -0
- package/dist/godmode-ui/assets/index-D7TzQ2zb.js +4985 -0
- package/dist/godmode-ui/caleb-avatar.jpg +0 -0
- package/dist/godmode-ui/favicon-new.svg +3 -0
- package/dist/godmode-ui/favicon.ico.svg +3 -0
- package/dist/godmode-ui/favicon.svg +3 -0
- package/dist/godmode-ui/index.html +21 -0
- package/dist/godmode-ui/lightning-icon.svg +3 -0
- package/dist/godmode-ui/vite.svg +1 -0
- package/dist/index.js +7909 -0
- package/dist/index.js.map +1 -0
- package/openclaw.plugin.json +31 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-paths.ts","../src/lib/agent-log.ts","../src/lib/openclaw-state.ts","../src/lib/workspace-session-store.ts","../src/lib/workspaces-config.ts","../src/methods/workspaces.ts","../src/lib/team-feed.ts","../src/lib/workspace-sync-service.ts","../src/services/curation-agent.ts","../src/lib/team-workspace-scaffold.ts","../src/hooks/team-bootstrap.ts","../src/hooks/team-memory-route.ts","../index.ts","../src/methods/agent-log.ts","../src/methods/brief-notes.ts","../src/methods/calendar.ts","../src/protocol.ts","../src/methods/clickup.ts","../src/methods/consciousness.ts","../src/methods/daily-brief.ts","../src/methods/data-sources.ts","../src/methods/goals.ts","../src/methods/inner-work.ts","../src/methods/life-dashboards.ts","../src/methods/lifetracks.ts","../src/methods/onboarding.ts","../src/methods/people-data.ts","../src/methods/projects.ts","../src/methods/subagent-runs.ts","../src/methods/tasks.ts","../src/methods/team-comms.ts","../src/methods/team-curation.ts","../src/methods/team-workspace.ts","../src/tools/team-message.ts","../src/tools/team-memory.ts","../src/methods/ui-slots.ts","../src/methods/focus-pulse.ts","../src/methods/focus-pulse-scorer.ts","../src/methods/options.ts","../src/services/agent-log-writer.ts","../src/static-server.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/**\n * GodMode workspace root and shared directory paths.\n * All GodMode data, memory, skills, and docs live under ~/godmode/.\n */\n\n/** GodMode workspace root: ~/godmode (overridable via GODMODE_ROOT env var) */\nexport const GODMODE_ROOT = process.env.GODMODE_ROOT || join(homedir(), \"godmode\");\n\n/** Root data directory: ~/godmode/data */\nexport const DATA_DIR = join(GODMODE_ROOT, \"data\");\n\n/** Root memory directory: ~/godmode/memory */\nexport const MEMORY_DIR = join(GODMODE_ROOT, \"memory\");\n","import fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { GODMODE_ROOT } from \"../data-paths.js\";\n\nconst AGENT_LOG_DIR = path.join(GODMODE_ROOT, \"memory\", \"agent-log\");\n\nexport type ReviewItem = {\n item: string;\n link?: string;\n priority: string;\n notes?: string;\n addedAt: number;\n};\n\nexport type CompletedItem = {\n item: string;\n output?: string;\n duration?: string;\n completedAt: number;\n userPrompt?: string;\n toolSummary?: string;\n filesRead?: string[];\n filesWritten?: string[];\n messagesSent?: number;\n cronAdds?: number;\n model?: string;\n provider?: string;\n assistantPreview?: string;\n channel?: string;\n channelType?: string;\n};\n\nexport type ErrorEntry = {\n time: number;\n channel: string;\n channelType: string;\n error: string;\n duration?: string;\n model?: string;\n};\n\nexport type QueueItem = {\n task: string;\n assignedTo?: string;\n blockedBy?: string;\n addedAt: number;\n};\n\nexport type ActivityEntry = {\n time: number;\n text: string;\n};\n\nexport type AgentLogState = {\n date: string;\n needsReview: ReviewItem[];\n completed: CompletedItem[];\n errors: ErrorEntry[];\n queue: QueueItem[];\n activity: ActivityEntry[];\n notes: string[];\n};\n\nexport type ActiveRun = {\n runId: string;\n sessionKey: string;\n startedAt: number;\n durationMs: number;\n};\n\nexport type AppendCategory = \"review\" | \"completed\" | \"queue\" | \"note\" | \"activity\";\n\nexport type AppendEntryParams = {\n category: AppendCategory;\n item: string;\n link?: string;\n output?: string;\n priority?: string;\n notes?: string;\n assignedTo?: string;\n blockedBy?: string;\n};\n\nfunction todayDate(): string {\n return new Date().toLocaleDateString(\"en-CA\", { timeZone: \"America/Chicago\" });\n}\n\nfunction formatTime(ts: number): string {\n return new Date(ts).toLocaleTimeString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: \"America/Chicago\",\n });\n}\n\nfunction jsonFilePath(date: string): string {\n return path.join(AGENT_LOG_DIR, `${date}.json`);\n}\n\nfunction mdFilePath(date: string): string {\n return path.join(AGENT_LOG_DIR, `${date}.md`);\n}\n\nfunction emptyState(date: string): AgentLogState {\n return {\n date,\n needsReview: [],\n completed: [],\n errors: [],\n queue: [],\n activity: [],\n notes: [],\n };\n}\n\nasync function ensureDir(): Promise<void> {\n await fsp.mkdir(AGENT_LOG_DIR, { recursive: true });\n}\n\nfunction escapeCell(s: string): string {\n return String(s ?? \"\")\n .replaceAll(\"|\", \"\\\\|\")\n .replaceAll(\"\\n\", \" \")\n .trim();\n}\n\nfunction renderMarkdown(state: AgentLogState, activeRuns: ActiveRun[]): string {\n const day = new Date(`${state.date}T12:00:00`);\n const dayLabel = day.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n const lines: string[] = [];\n\n lines.push(`# Agent Log — ${dayLabel}`);\n lines.push(\"\");\n lines.push(`*Last updated: ${formatTime(Date.now())} CT — Auto-managed by GodMode.*`);\n lines.push(\"\");\n\n lines.push(\"### Today at a Glance\");\n lines.push(\n `- Active: **${activeRuns.length}** · Completed: **${state.completed.length}** · Needs review: **${state.needsReview.length}** · Queued: **${state.queue.length}** · Errors: **${state.errors.length}**`,\n );\n lines.push(\"\");\n\n if (state.needsReview.length > 0) {\n lines.push(\"## Needs Review\");\n lines.push(\"\");\n lines.push(\"| Item | Link | Priority | Notes |\");\n lines.push(\"|---|---|---|---|\");\n for (const entry of state.needsReview) {\n lines.push(\n `| ${escapeCell(entry.item)} | ${escapeCell(entry.link ?? \"—\")} | ${escapeCell(entry.priority || \"MEDIUM\")} | ${escapeCell(entry.notes ?? \"\")} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (activeRuns.length > 0) {\n lines.push(\"## Active Now\");\n lines.push(\"\");\n lines.push(\"| Session | Started | Elapsed |\");\n lines.push(\"|---|---|---|\");\n for (const run of activeRuns) {\n const elapsedSec = Math.max(0, Math.round(run.durationMs / 1000));\n lines.push(\n `| ${escapeCell(run.sessionKey)} | ${escapeCell(formatTime(run.startedAt))} | ${elapsedSec}s |`,\n );\n }\n lines.push(\"\");\n }\n\n if (state.completed.length > 0) {\n lines.push(\"## Completed Today\");\n lines.push(\"\");\n lines.push(\"| Item | Deliverable | Duration |\");\n lines.push(\"|---|---|---|\");\n const sorted = [...state.completed].sort((a, b) => b.completedAt - a.completedAt);\n for (const entry of sorted) {\n lines.push(\n `| ${escapeCell(entry.item)} | ${escapeCell(entry.output ?? \"—\")} | ${escapeCell(entry.duration ?? \"—\")} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (state.queue.length > 0) {\n lines.push(\"## Queue\");\n lines.push(\"\");\n lines.push(\"| Task | Assigned To | Blocked By |\");\n lines.push(\"|---|---|---|\");\n for (const entry of state.queue) {\n lines.push(\n `| ${escapeCell(entry.task)} | ${escapeCell(entry.assignedTo ?? \"—\")} | ${escapeCell(entry.blockedBy ?? \"—\")} |`,\n );\n }\n lines.push(\"\");\n }\n\n if (state.errors.length > 0) {\n lines.push(`## Errors (${state.errors.length})`);\n lines.push(\"\");\n const sorted = [...state.errors].sort((a, b) => b.time - a.time);\n for (const entry of sorted) {\n const detail = [entry.channel, entry.duration, entry.model].filter(Boolean).join(\" · \");\n const prefix = detail ? `${detail} — ` : \"\";\n lines.push(`- **${formatTime(entry.time)}** ${prefix}${entry.error}`);\n }\n lines.push(\"\");\n }\n\n if (state.notes.length > 0) {\n lines.push(\"## Notes\");\n lines.push(\"\");\n for (const note of state.notes) {\n lines.push(`- ${note}`);\n }\n lines.push(\"\");\n }\n\n if (state.activity.length > 0) {\n lines.push(\"<details>\");\n lines.push(\"<summary><strong>Activity Log</strong></summary>\");\n lines.push(\"\");\n const sorted = [...state.activity].sort((a, b) => b.time - a.time);\n for (const entry of sorted) {\n lines.push(`- **${formatTime(entry.time)}** ${entry.text}`);\n }\n lines.push(\"\");\n lines.push(\"</details>\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function loadStateFromDisk(date: string): Promise<AgentLogState> {\n try {\n const raw = await fsp.readFile(jsonFilePath(date), \"utf-8\");\n const parsed = JSON.parse(raw) as Partial<AgentLogState>;\n return {\n date,\n needsReview: Array.isArray(parsed.needsReview) ? parsed.needsReview : [],\n completed: Array.isArray(parsed.completed) ? parsed.completed : [],\n errors: Array.isArray(parsed.errors) ? parsed.errors : [],\n queue: Array.isArray(parsed.queue) ? parsed.queue : [],\n activity: Array.isArray(parsed.activity) ? parsed.activity : [],\n notes: Array.isArray(parsed.notes) ? parsed.notes : [],\n };\n } catch {\n return emptyState(date);\n }\n}\n\nasync function saveStateToDisk(state: AgentLogState): Promise<void> {\n await ensureDir();\n await fsp.writeFile(jsonFilePath(state.date), JSON.stringify(state, null, 2), \"utf-8\");\n await fsp.writeFile(mdFilePath(state.date), renderMarkdown(state, []), \"utf-8\");\n}\n\nexport function getActiveRuns(): ActiveRun[] {\n return [];\n}\n\nexport async function appendEntry(params: AppendEntryParams): Promise<void> {\n const date = todayDate();\n const state = await loadStateFromDisk(date);\n const now = Date.now();\n\n if (params.category === \"review\") {\n state.needsReview.push({\n item: params.item,\n link: params.link,\n priority: params.priority || \"MEDIUM\",\n notes: params.notes,\n addedAt: now,\n });\n } else if (params.category === \"completed\") {\n state.completed.push({\n item: params.item,\n output: params.output || params.link,\n completedAt: now,\n });\n } else if (params.category === \"queue\") {\n state.queue.push({\n task: params.item,\n assignedTo: params.assignedTo,\n blockedBy: params.blockedBy,\n addedAt: now,\n });\n } else if (params.category === \"note\") {\n state.notes.push(params.item);\n } else {\n state.activity.push({ time: now, text: params.item });\n }\n\n await saveStateToDisk(state);\n}\n\nexport async function resolveReviewItem(itemName: string): Promise<boolean> {\n const date = todayDate();\n const state = await loadStateFromDisk(date);\n const needle = itemName.toLowerCase();\n const idx = state.needsReview.findIndex((entry) => entry.item.toLowerCase().includes(needle));\n if (idx < 0) {\n return false;\n }\n state.needsReview.splice(idx, 1);\n await saveStateToDisk(state);\n return true;\n}\n\nexport async function resolveQueueItem(taskName: string): Promise<boolean> {\n const date = todayDate();\n const state = await loadStateFromDisk(date);\n const needle = taskName.toLowerCase();\n const idx = state.queue.findIndex((entry) => entry.task.toLowerCase().includes(needle));\n if (idx < 0) {\n return false;\n }\n state.queue.splice(idx, 1);\n await saveStateToDisk(state);\n return true;\n}\n\nexport async function readDailyLog(\n date: string,\n): Promise<{ content: string; updatedAt: string; sourcePath: string } | null> {\n const normalizedDate = date.trim() || todayDate();\n\n if (normalizedDate === todayDate()) {\n const state = await loadStateFromDisk(normalizedDate);\n const content = renderMarkdown(state, getActiveRuns());\n if (!content.trim()) {\n return null;\n }\n await ensureDir();\n await fsp.writeFile(mdFilePath(normalizedDate), content, \"utf-8\");\n return {\n content,\n updatedAt: new Date().toISOString(),\n sourcePath: `~/godmode/memory/agent-log/${normalizedDate}.md`,\n };\n }\n\n try {\n const pathname = mdFilePath(normalizedDate);\n const stat = await fsp.stat(pathname);\n const content = await fsp.readFile(pathname, \"utf-8\");\n if (!content.trim()) {\n return null;\n }\n return {\n content,\n updatedAt: new Date(stat.mtimeMs).toISOString(),\n sourcePath: `~/godmode/memory/agent-log/${normalizedDate}.md`,\n };\n } catch {\n try {\n const state = await loadStateFromDisk(normalizedDate);\n const content = renderMarkdown(state, []);\n if (!content.trim()) {\n return null;\n }\n return {\n content,\n updatedAt: new Date().toISOString(),\n sourcePath: `~/godmode/memory/agent-log/${normalizedDate}.md`,\n };\n } catch {\n return null;\n }\n }\n}\n","import { existsSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst LEGACY_STATE_DIRS = [\".clawdbot\", \".moldbot\", \".moltbot\"] as const;\n\nfunction expandHome(input: string): string {\n const trimmed = input.trim();\n if (!trimmed) {\n return trimmed;\n }\n if (trimmed === \"~\") {\n return os.homedir();\n }\n if (trimmed.startsWith(\"~/\")) {\n return path.join(os.homedir(), trimmed.slice(2));\n }\n return trimmed;\n}\n\nexport function resolveStateDir(env: NodeJS.ProcessEnv = process.env): string {\n const explicit = env.OPENCLAW_STATE_DIR?.trim() || env.CLAWDBOT_STATE_DIR?.trim();\n if (explicit) {\n return path.resolve(expandHome(explicit));\n }\n\n const home = os.homedir();\n const canonical = path.join(home, \".openclaw\");\n if (existsSync(canonical)) {\n return canonical;\n }\n\n for (const legacy of LEGACY_STATE_DIRS) {\n const legacyPath = path.join(home, legacy);\n if (existsSync(legacyPath)) {\n return legacyPath;\n }\n }\n\n return canonical;\n}\n\nexport const STATE_DIR = resolveStateDir();\n\nexport function resolveConfigPath(env: NodeJS.ProcessEnv = process.env): string {\n const explicit = env.OPENCLAW_CONFIG_PATH?.trim() || env.CLAWDBOT_CONFIG_PATH?.trim();\n if (explicit) {\n return path.resolve(expandHome(explicit));\n }\n return path.join(resolveStateDir(env), \"openclaw.json\");\n}\n","import fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport JSON5 from \"json5\";\nimport { resolveConfigPath, resolveStateDir } from \"./openclaw-state.js\";\n\nexport type SessionStoreEntry = {\n sessionId?: string;\n updatedAt?: number;\n displayName?: string;\n label?: string;\n subject?: string;\n workspaceId?: string;\n workspaceSubfolder?: string | null;\n [key: string]: unknown;\n};\n\nexport type OpenClawConfigLite = {\n session?: {\n store?: string;\n mainKey?: string;\n scope?: \"per-sender\" | \"global\";\n };\n};\n\nfunction normalizeSessionKey(key: string): string {\n return key.trim().toLowerCase();\n}\n\nfunction expandHome(input: string): string {\n const trimmed = input.trim();\n if (trimmed === \"~\") {\n return process.env.HOME || \"\";\n }\n if (trimmed.startsWith(\"~/\")) {\n return path.join(process.env.HOME || \"\", trimmed.slice(2));\n }\n return trimmed;\n}\n\nasync function safeReadText(pathname: string): Promise<string | null> {\n try {\n return await fsp.readFile(pathname, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nasync function readJson5Object(pathname: string): Promise<Record<string, unknown> | null> {\n const raw = await safeReadText(pathname);\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON5.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function resolveStorePath(store?: string): string {\n if (typeof store === \"string\" && store.trim()) {\n const template = expandHome(store.trim());\n if (!template.includes(\"{agentId}\")) {\n return path.resolve(template);\n }\n }\n return path.join(resolveStateDir(), \"sessions\", \"sessions.json\");\n}\n\nexport async function loadConfig(): Promise<OpenClawConfigLite> {\n const cfgPath = resolveConfigPath();\n const parsed = await readJson5Object(cfgPath);\n if (!parsed) {\n return {};\n }\n return parsed as OpenClawConfigLite;\n}\n\nexport async function loadSessionStore(storePath: string): Promise<Record<string, SessionStoreEntry>> {\n const parsed = await readJson5Object(storePath);\n if (!parsed) {\n return {};\n }\n const out: Record<string, SessionStoreEntry> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n continue;\n }\n out[key] = value as SessionStoreEntry;\n }\n return out;\n}\n\nasync function listAgentStorePaths(): Promise<string[]> {\n const stateDir = resolveStateDir();\n const agentsDir = path.join(stateDir, \"agents\");\n try {\n const entries = await fsp.readdir(agentsDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(agentsDir, entry.name, \"sessions\", \"sessions.json\"));\n } catch {\n return [];\n }\n}\n\nexport async function listSessionStorePaths(cfg: OpenClawConfigLite): Promise<string[]> {\n const paths = new Set<string>();\n const configured = cfg.session?.store;\n\n if (typeof configured === \"string\" && configured.trim()) {\n const normalized = expandHome(configured.trim());\n if (normalized.includes(\"{agentId}\")) {\n for (const pathname of await listAgentStorePaths()) {\n paths.add(pathname);\n }\n } else {\n paths.add(path.resolve(normalized));\n }\n } else {\n paths.add(resolveStorePath());\n for (const pathname of await listAgentStorePaths()) {\n paths.add(pathname);\n }\n }\n\n return Array.from(paths);\n}\n\nexport async function updateSessionStore(\n storePath: string,\n updater: (store: Record<string, SessionStoreEntry>) => void,\n): Promise<void> {\n const current = await loadSessionStore(storePath);\n updater(current);\n await fsp.mkdir(path.dirname(storePath), { recursive: true });\n await fsp.writeFile(storePath, `${JSON.stringify(current, null, 2)}\\n`, \"utf-8\");\n}\n\nexport function isCronSessionKey(key: string): boolean {\n const lower = key.toLowerCase();\n return lower.includes(\":cron:\") || lower.startsWith(\"cron:\") || lower.includes(\"[cron:\");\n}\n\nconst DERIVED_TITLE_MAX_LEN = 60;\n\nfunction truncateTitle(text: string, maxLen: number): string {\n if (text.length <= maxLen) {\n return text;\n }\n const cut = text.slice(0, maxLen - 1);\n const lastSpace = cut.lastIndexOf(\" \");\n if (lastSpace > maxLen * 0.6) {\n return cut.slice(0, lastSpace) + \"…\";\n }\n return cut + \"…\";\n}\n\nexport function deriveSessionTitle(entry: SessionStoreEntry | undefined, firstUserMessage?: string | null): string | undefined {\n if (!entry) {\n return undefined;\n }\n if (typeof entry.displayName === \"string\" && entry.displayName.trim()) {\n return entry.displayName.trim();\n }\n if (typeof entry.subject === \"string\" && entry.subject.trim()) {\n return entry.subject.trim();\n }\n if (firstUserMessage?.trim()) {\n const normalized = firstUserMessage.replace(/\\s+/g, \" \").trim();\n return truncateTitle(normalized, DERIVED_TITLE_MAX_LEN);\n }\n if (typeof entry.sessionId === \"string\" && entry.sessionId) {\n return entry.sessionId.slice(0, 8);\n }\n return undefined;\n}\n\nexport function findStoreKeysIgnoreCase(store: Record<string, unknown>, targetKey: string): string[] {\n const lowered = targetKey.toLowerCase();\n const out: string[] = [];\n for (const key of Object.keys(store)) {\n if (key.toLowerCase() === lowered) {\n out.push(key);\n }\n }\n return out;\n}\n\nexport function pruneLegacyStoreKeys(params: {\n store: Record<string, unknown>;\n canonicalKey: string;\n candidates: Iterable<string>;\n}): void {\n const keysToDelete = new Set<string>();\n for (const candidateRaw of params.candidates) {\n const candidate = String(candidateRaw || \"\").trim();\n if (!candidate) {\n continue;\n }\n if (candidate !== params.canonicalKey) {\n keysToDelete.add(candidate);\n }\n for (const match of findStoreKeysIgnoreCase(params.store, candidate)) {\n if (match !== params.canonicalKey) {\n keysToDelete.add(match);\n }\n }\n }\n for (const key of keysToDelete) {\n delete params.store[key];\n }\n}\n\nexport async function resolveGatewaySessionStoreTarget(params: {\n cfg: OpenClawConfigLite;\n key: string;\n scanLegacyKeys?: boolean;\n store?: Record<string, SessionStoreEntry>;\n}): Promise<{\n storePath: string;\n canonicalKey: string;\n storeKeys: string[];\n}> {\n const key = String(params.key || \"\").trim();\n const canonicalKey = normalizeSessionKey(key);\n const storePath = resolveStorePath(params.cfg.session?.store);\n\n const storeKeys = new Set<string>([canonicalKey]);\n if (key && key !== canonicalKey) {\n storeKeys.add(key);\n }\n\n if (params.scanLegacyKeys !== false) {\n const store = params.store || (await loadSessionStore(storePath));\n for (const legacyKey of findStoreKeysIgnoreCase(store, canonicalKey)) {\n storeKeys.add(legacyKey);\n }\n }\n\n return {\n storePath,\n canonicalKey,\n storeKeys: Array.from(storeKeys),\n };\n}\n\nfunction mergeSessionEntry(\n current: SessionStoreEntry | undefined,\n incoming: SessionStoreEntry,\n): SessionStoreEntry {\n const currentUpdatedAt = typeof current?.updatedAt === \"number\" ? current.updatedAt : 0;\n const incomingUpdatedAt = typeof incoming?.updatedAt === \"number\" ? incoming.updatedAt : 0;\n if (!current || incomingUpdatedAt >= currentUpdatedAt) {\n return { ...current, ...incoming };\n }\n return { ...incoming, ...current };\n}\n\nexport async function loadCombinedSessionStoreForGateway(cfg: OpenClawConfigLite): Promise<{\n storePath: string;\n store: Record<string, SessionStoreEntry>;\n}> {\n const paths = await listSessionStorePaths(cfg);\n const combined: Record<string, SessionStoreEntry> = {};\n\n await Promise.all(\n paths.map(async (storePath) => {\n const store = await loadSessionStore(storePath);\n for (const [key, entry] of Object.entries(store)) {\n const canonicalKey = normalizeSessionKey(key);\n combined[canonicalKey] = mergeSessionEntry(combined[canonicalKey], entry);\n }\n }),\n );\n\n return {\n storePath:\n typeof cfg.session?.store === \"string\" && cfg.session.store.trim()\n ? cfg.session.store.trim()\n : \"(multiple)\",\n store: combined,\n };\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport JSON5 from \"json5\";\n\nexport type WorkspaceType = \"personal\" | \"project\" | \"team\";\n\nexport type WorkspaceGitSyncConfig = {\n type: \"git\";\n remote?: string;\n branch: string;\n autoPull: {\n enabled: boolean;\n interval?: string;\n };\n autoPush: {\n enabled: boolean;\n debounceMs: number;\n };\n};\n\nexport type TeamWorkspaceConfig = {\n github?: string;\n role?: \"admin\" | \"member\";\n agentName?: string;\n memberId?: string;\n};\n\nexport type WorkspaceCurationConfig = {\n enabled: boolean;\n schedule?: string;\n threshold?: number;\n};\n\nexport type WorkspaceConfigEntry = {\n id: string;\n name: string;\n emoji: string;\n type: WorkspaceType;\n path: string;\n keywords: string[];\n pinned: string[];\n pinnedSessions: string[];\n /** Directories (relative to path) scanned for artifacts. Defaults to [\"outputs\"]. */\n artifactDirs: string[];\n sync?: WorkspaceGitSyncConfig;\n team?: TeamWorkspaceConfig;\n curation?: WorkspaceCurationConfig;\n};\n\nexport type WorkspaceConfigFile = {\n version: string;\n workspaces: WorkspaceConfigEntry[];\n};\n\nconst WORKSPACES_CONFIG_VERSION = \"1.0\";\nconst WORKSPACES_FILENAME = \"workspaces.json5\";\n\nexport function resolveGodModeRoot(): string {\n const configuredRoot = String(process.env.GODMODE_ROOT ?? \"\").trim();\n if (configuredRoot) {\n return path.resolve(expandPath(configuredRoot));\n }\n return path.join(os.homedir(), \"godmode\");\n}\n\nexport const CANONICAL_WORKSPACES_CONFIG_PATH = path.join(\n resolveGodModeRoot(),\n \"data\",\n WORKSPACES_FILENAME,\n);\n\nconst LEGACY_WORKSPACES_CONFIG_PATHS = [path.join(os.homedir(), \".godmode\", WORKSPACES_FILENAME)];\n\nexport function expandPath(input: string): string {\n const value = String(input ?? \"\").trim();\n if (!value) {\n return value;\n }\n if (value === \"~\") {\n return os.homedir();\n }\n if (value.startsWith(\"~/\")) {\n return path.join(os.homedir(), value.slice(2));\n }\n return value;\n}\n\nexport function collapsePath(input: string): string {\n const absolute = path.resolve(input);\n const home = os.homedir();\n if (absolute === home) {\n return \"~\";\n }\n if (absolute.startsWith(home + path.sep)) {\n return `~${absolute.slice(home.length)}`;\n }\n return absolute;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction normalizeId(input: string): string {\n return String(input ?? \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n}\n\nfunction humanizeName(id: string): string {\n return id\n .split(\"-\")\n .filter(Boolean)\n .map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nfunction normalizeType(input: unknown): WorkspaceType {\n const value = (typeof input === \"string\" ? input : \"\").trim().toLowerCase();\n if (value === \"personal\") {\n return \"personal\";\n }\n if (value === \"project\") {\n return \"project\";\n }\n if (value === \"team\" || value === \"team-workspace\") {\n return \"team\";\n }\n return \"project\";\n}\n\nfunction dedupeNonEmpty(values: unknown[]): string[] {\n const seen = new Set<string>();\n const output: string[] = [];\n for (const raw of values) {\n const value = (\n typeof raw === \"string\" ? raw : typeof raw === \"number\" ? String(raw) : \"\"\n ).trim();\n if (!value) {\n continue;\n }\n if (seen.has(value)) {\n continue;\n }\n seen.add(value);\n output.push(value);\n }\n return output;\n}\n\nfunction defaultEmoji(type: WorkspaceType): string {\n if (type === \"personal\") {\n return \"🌱\";\n }\n if (type === \"team\") {\n return \"👥\";\n }\n return \"📁\";\n}\n\nfunction normalizePositiveNumber(raw: unknown, fallback: number): number {\n const value = typeof raw === \"number\" ? raw : Number(raw);\n if (!Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return value;\n}\n\nfunction normalizeWorkspaceSyncConfig(raw: unknown): WorkspaceGitSyncConfig | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return undefined;\n }\n\n const candidate = raw as Record<string, unknown>;\n const syncType = typeof candidate.type === \"string\" ? candidate.type.trim().toLowerCase() : \"\";\n if (syncType !== \"git\") {\n return undefined;\n }\n\n const autoPullRaw =\n candidate.autoPull && typeof candidate.autoPull === \"object\" && !Array.isArray(candidate.autoPull)\n ? (candidate.autoPull as Record<string, unknown>)\n : {};\n const autoPushRaw =\n candidate.autoPush && typeof candidate.autoPush === \"object\" && !Array.isArray(candidate.autoPush)\n ? (candidate.autoPush as Record<string, unknown>)\n : {};\n\n const remote =\n typeof candidate.remote === \"string\" && candidate.remote.trim()\n ? candidate.remote.trim()\n : undefined;\n const branch =\n typeof candidate.branch === \"string\" && candidate.branch.trim()\n ? candidate.branch.trim()\n : \"main\";\n const autoPullInterval =\n typeof autoPullRaw.interval === \"string\" && autoPullRaw.interval.trim()\n ? autoPullRaw.interval.trim()\n : undefined;\n\n return {\n type: \"git\",\n remote,\n branch,\n autoPull: {\n enabled: Boolean(autoPullRaw.enabled),\n interval: autoPullInterval,\n },\n autoPush: {\n enabled: Boolean(autoPushRaw.enabled),\n debounceMs: normalizePositiveNumber(autoPushRaw.debounceMs, 15_000),\n },\n };\n}\n\nfunction normalizeTeamConfig(raw: unknown): TeamWorkspaceConfig | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return undefined;\n }\n const candidate = raw as Record<string, unknown>;\n const github =\n typeof candidate.github === \"string\" && candidate.github.trim()\n ? candidate.github.trim()\n : undefined;\n const roleRaw = typeof candidate.role === \"string\" ? candidate.role.trim().toLowerCase() : \"\";\n const role = roleRaw === \"admin\" ? \"admin\" : roleRaw === \"member\" ? \"member\" : undefined;\n const agentName =\n typeof candidate.agentName === \"string\" && candidate.agentName.trim()\n ? candidate.agentName.trim()\n : undefined;\n const memberId =\n typeof candidate.memberId === \"string\" && candidate.memberId.trim()\n ? candidate.memberId.trim()\n : undefined;\n\n if (!github && !role && !agentName && !memberId) {\n return undefined;\n }\n return { github, role, agentName, memberId };\n}\n\nfunction normalizeCurationConfig(raw: unknown): WorkspaceCurationConfig | undefined {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return undefined;\n }\n const candidate = raw as Record<string, unknown>;\n const enabled = Boolean(candidate.enabled);\n const schedule =\n typeof candidate.schedule === \"string\" && candidate.schedule.trim()\n ? candidate.schedule.trim()\n : undefined;\n const threshold =\n typeof candidate.threshold === \"number\" && Number.isFinite(candidate.threshold) && candidate.threshold > 0\n ? candidate.threshold\n : undefined;\n\n return { enabled, schedule, threshold };\n}\n\nfunction normalizeWorkspaceEntry(\n raw: Record<string, unknown>,\n index: number,\n seenIds: Set<string>,\n): WorkspaceConfigEntry {\n const normalizedType = normalizeType(raw.type);\n const providedName = (typeof raw.name === \"string\" ? raw.name : \"\").trim();\n const fallbackName =\n providedName ||\n humanizeName(typeof raw.id === \"string\" ? raw.id : \"\") ||\n `Workspace ${index + 1}`;\n let id = normalizeId(typeof raw.id === \"string\" ? raw.id : fallbackName);\n if (!id) {\n id = `workspace-${index + 1}`;\n }\n if (seenIds.has(id)) {\n let suffix = 2;\n while (seenIds.has(`${id}-${suffix}`)) {\n suffix += 1;\n }\n id = `${id}-${suffix}`;\n }\n seenIds.add(id);\n\n const resolvedPath = path.resolve(\n expandPath(\n (typeof raw.path === \"string\" ? raw.path : \"\").trim() ||\n path.join(os.homedir(), \"godmode\", \"memory\", \"projects\", id),\n ),\n );\n const keywords = dedupeNonEmpty(\n Array.isArray(raw.keywords) ? (raw.keywords as unknown[]) : [id, fallbackName.toLowerCase()],\n ).map((entry) => entry.toLowerCase());\n\n return {\n id,\n name: fallbackName,\n emoji: (typeof raw.emoji === \"string\" ? raw.emoji : \"\").trim() || defaultEmoji(normalizedType),\n type: normalizedType,\n path: resolvedPath,\n keywords,\n pinned: dedupeNonEmpty(Array.isArray(raw.pinned) ? (raw.pinned as unknown[]) : []),\n pinnedSessions: dedupeNonEmpty(\n Array.isArray(raw.pinnedSessions) ? (raw.pinnedSessions as unknown[]) : [],\n ),\n artifactDirs: dedupeNonEmpty(\n Array.isArray(raw.artifactDirs) ? (raw.artifactDirs as unknown[]) : [\"outputs\"],\n ),\n sync: normalizeWorkspaceSyncConfig(raw.sync),\n team: normalizeTeamConfig(raw.team),\n curation: normalizeCurationConfig(raw.curation),\n };\n}\n\nfunction normalizeWorkspaceConfig(raw: unknown): WorkspaceConfigFile {\n const data = raw && typeof raw === \"object\" ? (raw as Record<string, unknown>) : {};\n const workspacesRaw = Array.isArray(data.workspaces) ? (data.workspaces as unknown[]) : [];\n const seenIds = new Set<string>();\n const workspaces = workspacesRaw\n .filter((entry) => entry && typeof entry === \"object\")\n .map((entry, index) =>\n normalizeWorkspaceEntry(entry as Record<string, unknown>, index, seenIds),\n );\n\n return {\n version: WORKSPACES_CONFIG_VERSION,\n workspaces,\n };\n}\n\nasync function listSubdirectories(root: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(root, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory() && !entry.name.startsWith(\".\"))\n .map((entry) => entry.name)\n .sort((a: string, b: string) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\nfunction inferKeywords(name: string, id: string): string[] {\n const words = `${name} ${id}`\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \" \")\n .split(/[\\s-]+/)\n .map((part) => part.trim())\n .filter(Boolean);\n return dedupeNonEmpty(words);\n}\n\nasync function buildDefaultWorkspaceConfig(): Promise<WorkspaceConfigFile> {\n const root = resolveGodModeRoot();\n const clientsRoot = path.join(root, \"clients\");\n const projectsRoot = path.join(root, \"memory\", \"projects\");\n const personalRoot = path.join(root, \"memory\", \"personal\");\n\n await fs.mkdir(personalRoot, { recursive: true });\n\n const entries: WorkspaceConfigEntry[] = [];\n\n const lifeId = \"life\";\n entries.push({\n id: lifeId,\n name: \"Life\",\n emoji: \"🌱\",\n type: \"personal\",\n path: personalRoot,\n keywords: [\"life\", \"personal\", \"health\", \"family\"],\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\"],\n });\n\n const projectFolders = await listSubdirectories(projectsRoot);\n for (const folder of projectFolders) {\n const id = normalizeId(folder);\n if (!id || entries.some((entry) => entry.id === id)) {\n continue;\n }\n const workspacePath = path.join(projectsRoot, folder);\n entries.push({\n id,\n name: humanizeName(id),\n emoji: id === \"godmode\" ? \"⚡\" : \"📁\",\n type: \"project\",\n path: workspacePath,\n keywords: inferKeywords(folder, id),\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\"],\n });\n }\n\n const clientFolders = await listSubdirectories(clientsRoot);\n for (const folder of clientFolders) {\n const id = normalizeId(folder);\n if (!id || entries.some((entry) => entry.id === id)) {\n continue;\n }\n const workspacePath = path.join(clientsRoot, folder);\n entries.push({\n id,\n name: humanizeName(id),\n emoji: \"👥\",\n type: \"team\",\n path: workspacePath,\n keywords: inferKeywords(folder, id),\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\"],\n });\n }\n\n return {\n version: WORKSPACES_CONFIG_VERSION,\n workspaces: entries,\n };\n}\n\nasync function findExistingConfigPath(): Promise<string | null> {\n const candidates = [CANONICAL_WORKSPACES_CONFIG_PATH, ...LEGACY_WORKSPACES_CONFIG_PATHS];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nasync function readConfigFile(configPath: string): Promise<WorkspaceConfigFile> {\n const raw = await fs.readFile(configPath, \"utf-8\");\n const parsed = JSON5.parse(raw);\n return normalizeWorkspaceConfig(parsed);\n}\n\nexport async function writeWorkspaceConfig(config: WorkspaceConfigFile): Promise<void> {\n const normalized = normalizeWorkspaceConfig(config);\n await fs.mkdir(path.dirname(CANONICAL_WORKSPACES_CONFIG_PATH), { recursive: true });\n await fs.writeFile(\n CANONICAL_WORKSPACES_CONFIG_PATH,\n `${JSON.stringify(normalized, null, 2)}\\n`,\n \"utf-8\",\n );\n}\n\nexport async function readWorkspaceConfig(opts?: {\n initializeIfMissing?: boolean;\n migrateLegacyToCanonical?: boolean;\n}): Promise<WorkspaceConfigFile> {\n const initializeIfMissing = opts?.initializeIfMissing !== false;\n const migrateLegacyToCanonical = opts?.migrateLegacyToCanonical !== false;\n const existingPath = await findExistingConfigPath();\n\n if (existingPath) {\n const config = await readConfigFile(existingPath);\n if (migrateLegacyToCanonical && existingPath !== CANONICAL_WORKSPACES_CONFIG_PATH) {\n try {\n await writeWorkspaceConfig(config);\n } catch {\n // Migration is best-effort — don't break reads if the write fails\n // (e.g. disk full, permissions). The legacy path still works fine.\n }\n }\n return config;\n }\n\n if (!initializeIfMissing) {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] };\n }\n\n const generated = await buildDefaultWorkspaceConfig();\n await writeWorkspaceConfig(generated);\n return generated;\n}\n\nexport function findWorkspaceById(\n config: WorkspaceConfigFile,\n workspaceId: string,\n): WorkspaceConfigEntry | null {\n const id = normalizeId(workspaceId);\n return config.workspaces.find((entry) => entry.id === id) ?? null;\n}\n\nfunction normalizeRelativePathInsideWorkspace(workspacePath: string, value: string): string | null {\n const trimmed = String(value ?? \"\").trim();\n if (!trimmed) {\n return null;\n }\n const absoluteWorkspace = path.resolve(workspacePath);\n const absoluteCandidate = path.isAbsolute(trimmed)\n ? path.resolve(trimmed)\n : path.resolve(absoluteWorkspace, trimmed);\n if (\n absoluteCandidate !== absoluteWorkspace &&\n !absoluteCandidate.startsWith(absoluteWorkspace + path.sep)\n ) {\n return null;\n }\n const relative = path.relative(absoluteWorkspace, absoluteCandidate);\n if (!relative || relative === \".\") {\n return null;\n }\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function normalizePinnedPath(workspacePath: string, filePath: string): string | null {\n return normalizeRelativePathInsideWorkspace(workspacePath, filePath);\n}\n\nexport function resolvePathInWorkspace(\n workspacePath: string,\n maybeRelativePath: string,\n): string | null {\n const relative = normalizeRelativePathInsideWorkspace(workspacePath, maybeRelativePath);\n if (!relative) {\n return null;\n }\n return path.resolve(workspacePath, relative);\n}\n\nexport function detectWorkspaceFromText(\n config: WorkspaceConfigFile,\n text: string,\n): { workspaceId: string | null; score: number; matchedKeyword?: string } {\n const normalizedText = String(text ?? \"\").toLowerCase();\n if (!normalizedText.trim()) {\n return { workspaceId: null, score: 0 };\n }\n\n let best: { workspaceId: string | null; score: number; matchedKeyword?: string } = {\n workspaceId: null,\n score: 0,\n };\n\n for (const workspace of config.workspaces) {\n const keywords = dedupeNonEmpty([workspace.id, workspace.name, ...workspace.keywords]).map(\n (entry) => entry.toLowerCase(),\n );\n\n for (const keyword of keywords) {\n if (!keyword) {\n continue;\n }\n if (!normalizedText.includes(keyword)) {\n continue;\n }\n const score = keyword.length;\n if (score > best.score) {\n best = {\n workspaceId: workspace.id,\n score,\n matchedKeyword: keyword,\n };\n }\n }\n }\n\n return best;\n}\n\nexport async function ensureWorkspaceFolders(\n workspacePath: string,\n type?: WorkspaceType,\n): Promise<void> {\n await fs.mkdir(workspacePath, { recursive: true });\n await fs.mkdir(path.join(workspacePath, \"sessions\"), { recursive: true });\n await fs.mkdir(path.join(workspacePath, \"outputs\"), { recursive: true });\n\n if (type === \"team\") {\n const teamDirs = [\n \".godmode\",\n \".godmode/local\",\n \"memory\",\n \"skills\",\n \"tools\",\n \"comms\",\n \"artifacts\",\n \"artifacts/docs\",\n \"artifacts/templates\",\n \"artifacts/generated\",\n \"artifacts/exports\",\n \"clients\",\n \"integrations\",\n ];\n for (const dir of teamDirs) {\n await fs.mkdir(path.join(workspacePath, dir), { recursive: true });\n }\n }\n}\n\nexport function getWorkspaceConfigPathCandidates(): string[] {\n return [CANONICAL_WORKSPACES_CONFIG_PATH, ...LEGACY_WORKSPACES_CONFIG_PATHS];\n}\n\nexport function createWorkspaceId(name: string, existingIds: Set<string>): string {\n const base = normalizeId(name) || \"workspace\";\n if (!existingIds.has(base)) {\n return base;\n }\n let suffix = 2;\n while (existingIds.has(`${base}-${suffix}`)) {\n suffix += 1;\n }\n return `${base}-${suffix}`;\n}\n\nexport function toDisplayPath(value: string): string {\n return collapsePath(value);\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n deriveSessionTitle,\n loadCombinedSessionStoreForGateway,\n loadConfig,\n pruneLegacyStoreKeys,\n resolveGatewaySessionStoreTarget,\n updateSessionStore,\n isCronSessionKey,\n type SessionStoreEntry,\n} from \"../lib/workspace-session-store.js\";\nimport {\n CANONICAL_WORKSPACES_CONFIG_PATH,\n createWorkspaceId,\n detectWorkspaceFromText,\n ensureWorkspaceFolders,\n expandPath,\n findWorkspaceById,\n normalizePinnedPath,\n readWorkspaceConfig,\n resolveGodModeRoot,\n resolvePathInWorkspace,\n toDisplayPath,\n type WorkspaceConfigEntry,\n type WorkspaceConfigFile,\n type WorkspaceType,\n writeWorkspaceConfig,\n} from \"../lib/workspaces-config.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst ErrorCodes = {\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UNAVAILABLE: \"UNAVAILABLE\",\n} as const;\n\nfunction errorShape(code: string, message: string): { code: string; message: string } {\n return { code, message };\n}\n\n/** Max file size for workspaces.readFile (1MB). */\nconst MAX_READ_SIZE = 1_000_000;\n/** Max image file size for workspaces.readFile (8MB). */\nconst MAX_IMAGE_READ_SIZE = 8_000_000;\n\n/** Max concurrent fs.stat calls while scanning. */\nconst STAT_CONCURRENCY = 20;\n\n/** Keep workspace sections compact; this is not a full file explorer. */\nconst MAX_WORKSPACE_SECTION_ITEMS = 200;\n/** Bound text indexing for workspace search. */\nconst MAX_SEARCH_TEXT_FILES = 120;\nconst MAX_SEARCH_TEXT_BYTES = 16_000;\n\nconst SKIP_NAMES = new Set([\"node_modules\", \"__pycache__\", \"venv\", \".git\", \"dist\", \"build\"]);\n\nconst TEXT_EXTENSIONS = new Set([\n \".md\",\n \".txt\",\n \".json\",\n \".json5\",\n \".yaml\",\n \".yml\",\n \".toml\",\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".py\",\n \".sh\",\n \".css\",\n \".scss\",\n \".html\",\n \".xml\",\n \".csv\",\n \".env\",\n \".ini\",\n \".cfg\",\n \".conf\",\n \".log\",\n \".rs\",\n \".go\",\n \".java\",\n \".rb\",\n \".lua\",\n]);\n\nconst ARTIFACT_EXTENSIONS = new Set([\n \".md\",\n \".txt\",\n \".html\",\n \".htm\",\n \".json\",\n \".json5\",\n \".yaml\",\n \".yml\",\n \".toml\",\n \".csv\",\n \".pdf\",\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".svg\",\n \".doc\",\n \".docx\",\n \".ppt\",\n \".pptx\",\n \".xls\",\n \".xlsx\",\n \".xml\",\n]);\n\nconst IMAGE_MIME_BY_EXT: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n};\n\ntype WorkspaceItem = {\n id: string;\n name: string;\n type: \"file\" | \"directory\";\n path: string;\n modifiedAt?: number;\n size?: number;\n children?: WorkspaceItem[];\n};\n\ntype WorkspaceFileEntry = {\n path: string;\n name: string;\n type: \"markdown\" | \"html\" | \"image\" | \"json\" | \"text\" | \"folder\";\n size: number;\n modified: string;\n isDirectory?: boolean;\n searchText?: string;\n};\n\ntype WorkspaceSessionEntry = {\n id: string;\n key: string;\n title: string;\n created: string;\n status: \"running\" | \"complete\" | \"blocked\";\n workspaceSubfolder: string | null;\n};\n\nfunction pathToId(p: string): string {\n return p\n .replace(/[^a-zA-Z0-9]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n}\n\nfunction workspaceTypeToLegacyType(\n type: WorkspaceType,\n): \"projects\" | \"clients\" | \"vault\" | \"custom\" {\n if (type === \"team\") {\n return \"clients\";\n }\n if (type === \"personal\") {\n return \"vault\";\n }\n if (type === \"project\") {\n return \"projects\";\n }\n return \"custom\";\n}\n\nfunction inferFileType(fileName: string, isDirectory: boolean): WorkspaceFileEntry[\"type\"] {\n if (isDirectory) {\n return \"folder\";\n }\n const ext = path.extname(fileName).toLowerCase();\n if (ext === \".md\") {\n return \"markdown\";\n }\n if (ext === \".html\" || ext === \".htm\") {\n return \"html\";\n }\n if ([\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".svg\"].includes(ext)) {\n return \"image\";\n }\n if ([\".json\", \".json5\"].includes(ext)) {\n return \"json\";\n }\n return \"text\";\n}\n\n/**\n * Scan a directory for workspace items with recursive support and batched stat calls.\n */\nexport async function scanDirectory(\n dirPath: string,\n maxDepth: number = 1,\n currentDepth: number = 0,\n): Promise<WorkspaceItem[]> {\n if (currentDepth >= maxDepth) {\n return [];\n }\n\n let rawEntries: import(\"node:fs\").Dirent[];\n try {\n rawEntries = await fs.readdir(dirPath, { withFileTypes: true });\n } catch {\n return [];\n }\n\n const visible = rawEntries.filter((entry) => {\n const name = String(entry.name);\n return !name.startsWith(\".\") && !SKIP_NAMES.has(name);\n });\n\n visible.sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) {\n return -1;\n }\n if (!a.isDirectory() && b.isDirectory()) {\n return 1;\n }\n return String(a.name).localeCompare(String(b.name));\n });\n\n const items: WorkspaceItem[] = [];\n for (let i = 0; i < visible.length; i += STAT_CONCURRENCY) {\n const batch = visible.slice(i, i + STAT_CONCURRENCY);\n const stats = await Promise.allSettled(\n batch.map(async (entry) => {\n const name = String(entry.name);\n const fullPath = path.join(dirPath, name);\n const stat = await fs.stat(fullPath);\n return { entry, fullPath, stat, name };\n }),\n );\n\n for (const result of stats) {\n if (result.status !== \"fulfilled\") {\n continue;\n }\n const { entry, fullPath, stat, name } = result.value;\n const isDirectory = entry.isDirectory();\n const item: WorkspaceItem = {\n id: pathToId(fullPath),\n name,\n type: isDirectory ? \"directory\" : \"file\",\n path: toDisplayPath(fullPath),\n modifiedAt: stat.mtimeMs,\n };\n if (!isDirectory) {\n item.size = stat.size;\n }\n if (isDirectory && currentDepth + 1 < maxDepth) {\n item.children = await scanDirectory(fullPath, maxDepth, currentDepth + 1);\n }\n items.push(item);\n }\n }\n\n return items;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction normalizeSessionWorkspaceSubfolder(value: unknown): string | null {\n if (value == null) {\n return null;\n }\n const normalized = (\n typeof value === \"string\" ? value : typeof value === \"number\" ? String(value) : \"\"\n )\n .trim()\n .replace(/^\\/+|\\/+$/g, \"\");\n return normalized ? normalized.split(path.sep).join(\"/\") : null;\n}\n\nfunction normalizeWorkspaceRelativePath(input: string): string {\n const normalized = input\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\/+/, \"\")\n .replace(/\\/{2,}/g, \"/\");\n return normalized.replace(/^\\/+/, \"\");\n}\n\nfunction dedupeWorkspaceEntries(entries: WorkspaceFileEntry[]): WorkspaceFileEntry[] {\n const byPath = new Map<string, WorkspaceFileEntry>();\n for (const entry of entries) {\n const normalizedPath = normalizeWorkspaceRelativePath(entry.path);\n if (!normalizedPath) {\n continue;\n }\n const existing = byPath.get(normalizedPath);\n if (!existing || entry.modified > existing.modified) {\n byPath.set(normalizedPath, {\n ...entry,\n path: normalizedPath,\n });\n }\n }\n return Array.from(byPath.values());\n}\n\nfunction sortAndCapWorkspaceEntries(entries: WorkspaceFileEntry[]): WorkspaceFileEntry[] {\n const sorted = dedupeWorkspaceEntries(entries).sort((a, b) =>\n b.modified.localeCompare(a.modified),\n );\n return sorted.slice(0, MAX_WORKSPACE_SECTION_ITEMS);\n}\n\nfunction canIndexTextForSearch(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n if (!ext) {\n return false;\n }\n return TEXT_EXTENSIONS.has(ext);\n}\n\nasync function loadWorkspaceEntrySearchText(\n workspacePath: string,\n relativePath: string,\n): Promise<string | undefined> {\n if (!canIndexTextForSearch(relativePath)) {\n return undefined;\n }\n const absolutePath = resolvePathInWorkspace(workspacePath, relativePath);\n if (!absolutePath) {\n return undefined;\n }\n let stat: import(\"node:fs\").Stats;\n try {\n stat = await fs.stat(absolutePath);\n } catch {\n return undefined;\n }\n if (stat.isDirectory() || stat.size <= 0 || stat.size > MAX_SEARCH_TEXT_BYTES) {\n return undefined;\n }\n try {\n const raw = await fs.readFile(absolutePath, \"utf-8\");\n const normalized = raw.replace(/\\s+/g, \" \").trim();\n if (!normalized) {\n return undefined;\n }\n return normalized.slice(0, MAX_SEARCH_TEXT_BYTES);\n } catch {\n return undefined;\n }\n}\n\nasync function enrichWorkspaceEntriesForSearch(\n workspace: WorkspaceConfigEntry,\n entries: WorkspaceFileEntry[],\n): Promise<WorkspaceFileEntry[]> {\n if (entries.length === 0) {\n return entries;\n }\n const limited = entries.slice(0, MAX_SEARCH_TEXT_FILES);\n const textByPath = new Map<string, string>();\n\n await Promise.all(\n limited.map(async (entry) => {\n const searchText = await loadWorkspaceEntrySearchText(workspace.path, entry.path);\n if (!searchText) {\n return;\n }\n textByPath.set(normalizeWorkspaceRelativePath(entry.path), searchText);\n }),\n );\n\n if (textByPath.size === 0) {\n return entries;\n }\n\n return entries.map((entry) => {\n const key = normalizeWorkspaceRelativePath(entry.path);\n const searchText = textByPath.get(key);\n return searchText ? { ...entry, searchText } : entry;\n });\n}\n\nfunction flattenArtifactItems(workspacePath: string, items: WorkspaceItem[]): WorkspaceFileEntry[] {\n const flattened: WorkspaceFileEntry[] = [];\n const walk = (nodes: WorkspaceItem[]) => {\n for (const node of nodes) {\n if (node.type === \"directory\") {\n if (node.children) {\n walk(node.children);\n }\n continue;\n }\n const ext = path.extname(node.name).toLowerCase();\n if (!ARTIFACT_EXTENSIONS.has(ext)) {\n continue;\n }\n const absolutePath = expandPath(node.path);\n const relative = path.relative(workspacePath, absolutePath).split(path.sep).join(\"/\");\n flattened.push({\n path: relative,\n name: node.name,\n type: inferFileType(node.name, false),\n size: node.size ?? 0,\n modified: new Date(node.modifiedAt ?? Date.now()).toISOString(),\n });\n }\n };\n walk(items);\n return flattened;\n}\n\nasync function listWorkspaceOutputs(\n workspace: WorkspaceConfigEntry,\n): Promise<WorkspaceFileEntry[]> {\n const allArtifacts: WorkspaceFileEntry[] = [];\n\n for (const dir of workspace.artifactDirs) {\n const dirPath = path.join(workspace.path, dir);\n const items = await scanDirectory(dirPath, 4);\n allArtifacts.push(...flattenArtifactItems(workspace.path, items));\n }\n\n return sortAndCapWorkspaceEntries(allArtifacts);\n}\n\nasync function getPinnedEntries(\n workspace: WorkspaceConfigEntry,\n outputs: WorkspaceFileEntry[],\n): Promise<WorkspaceFileEntry[]> {\n const outputByPath = new Map(outputs.map((entry) => [entry.path, entry]));\n\n const pinned: WorkspaceFileEntry[] = [];\n for (const pinnedPath of workspace.pinned) {\n const normalized = pinnedPath.split(path.sep).join(\"/\");\n const existing = outputByPath.get(normalized);\n if (existing) {\n pinned.push(existing);\n continue;\n }\n\n const absolutePath = resolvePathInWorkspace(workspace.path, normalized);\n if (!absolutePath) {\n continue;\n }\n try {\n const stat = await fs.stat(absolutePath);\n if (stat.isDirectory()) {\n continue;\n }\n pinned.push({\n path: normalized,\n name: path.basename(normalized),\n type: inferFileType(normalized, false),\n size: stat.size,\n modified: new Date(stat.mtimeMs).toISOString(),\n });\n } catch {\n // ignore stale pinned file\n }\n }\n\n return pinned.sort((a, b) => b.modified.localeCompare(a.modified));\n}\n\nfunction deriveSessionStatus(updatedAtMs: number): \"running\" | \"complete\" | \"blocked\" {\n const ageMs = Date.now() - updatedAtMs;\n if (ageMs < 2 * 60 * 1000) {\n return \"running\";\n }\n return \"complete\";\n}\n\nfunction resolveWorkspaceSessionTitle(key: string, entry: Record<string, unknown>): string {\n const displayName = typeof entry.displayName === \"string\" ? entry.displayName.trim() : \"\";\n if (displayName) {\n return displayName;\n }\n const label = typeof entry.label === \"string\" ? entry.label.trim() : \"\";\n if (label) {\n return label;\n }\n const subject = typeof entry.subject === \"string\" ? entry.subject.trim() : \"\";\n if (subject) {\n return subject;\n }\n const derived = deriveSessionTitle(entry as SessionStoreEntry);\n if (derived) {\n return derived;\n }\n return key;\n}\n\nasync function listWorkspaceSessions(\n workspaceId: string,\n workspaceConfig?: WorkspaceConfigFile,\n): Promise<WorkspaceSessionEntry[]> {\n const cfg = await loadConfig();\n const combined = (await loadCombinedSessionStoreForGateway(cfg)).store;\n\n const rows: WorkspaceSessionEntry[] = [];\n for (const [key, entry] of Object.entries(combined)) {\n if (isCronSessionKey(key)) {\n continue;\n }\n const rawWorkspaceId = (entry as Record<string, unknown>).workspaceId;\n const entryWorkspaceId = (typeof rawWorkspaceId === \"string\" ? rawWorkspaceId : \"\").trim();\n let resolvedWorkspaceId = entryWorkspaceId;\n if (!resolvedWorkspaceId && workspaceConfig) {\n const titleSource = [\n key,\n String(entry.displayName ?? \"\"),\n String(entry.label ?? \"\"),\n String(entry.subject ?? \"\"),\n String(entry.groupChannel ?? \"\"),\n ]\n .join(\" \")\n .trim();\n if (titleSource) {\n const detection = detectWorkspaceFromText(workspaceConfig, titleSource);\n if (detection.workspaceId && detection.score >= 3) {\n resolvedWorkspaceId = detection.workspaceId;\n }\n }\n }\n if (!resolvedWorkspaceId || resolvedWorkspaceId !== workspaceId) {\n continue;\n }\n const workspaceSubfolder = normalizeSessionWorkspaceSubfolder(\n (entry as Record<string, unknown>).workspaceSubfolder,\n );\n const updatedAt = Number(entry.updatedAt ?? Date.now());\n const sessionId =\n typeof entry.sessionId === \"string\" && entry.sessionId.trim() ? entry.sessionId : key;\n rows.push({\n id: sessionId,\n key,\n title: resolveWorkspaceSessionTitle(key, entry as Record<string, unknown>),\n created: new Date(updatedAt).toISOString(),\n status: deriveSessionStatus(updatedAt),\n workspaceSubfolder,\n });\n }\n\n rows.sort((a, b) => b.created.localeCompare(a.created));\n return rows;\n}\n\nfunction resolveWorkspaceSummary(\n workspace: WorkspaceConfigEntry,\n artifactCount: number,\n sessions: WorkspaceSessionEntry[],\n): {\n id: string;\n name: string;\n emoji: string;\n type: WorkspaceType;\n path: string;\n artifactCount: number;\n sessionCount: number;\n lastUpdated: string;\n lastScanned: number;\n legacyType: \"projects\" | \"clients\" | \"vault\" | \"custom\";\n} {\n const sessionCount = sessions.length;\n const sessionUpdated = sessions\n .map((entry) => Date.parse(entry.created))\n .filter((value) => Number.isFinite(value))\n .reduce((acc, value) => Math.max(acc, value), 0);\n const lastUpdatedMs = sessionUpdated || Date.now();\n\n return {\n id: workspace.id,\n name: workspace.name,\n emoji: workspace.emoji,\n type: workspace.type,\n path: toDisplayPath(workspace.path),\n artifactCount,\n sessionCount,\n lastUpdated: new Date(lastUpdatedMs).toISOString(),\n lastScanned: Date.now(),\n legacyType: workspaceTypeToLegacyType(workspace.type),\n };\n}\n\nasync function normalizePathForRead(\n params: Record<string, unknown>,\n config: WorkspaceConfigFile,\n): Promise<{ absolutePath: string | null; error?: string }> {\n const explicitWorkspaceId =\n typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const filePath = typeof params.filePath === \"string\" ? String(params.filePath).trim() : \"\";\n\n if (explicitWorkspaceId && filePath) {\n if (filePath.includes(\"\\0\")) {\n return { absolutePath: null, error: \"invalid path\" };\n }\n const workspace = findWorkspaceById(config, explicitWorkspaceId);\n if (!workspace) {\n return { absolutePath: null, error: `workspace not found: ${explicitWorkspaceId}` };\n }\n const absolute = resolvePathInWorkspace(workspace.path, filePath);\n if (!absolute) {\n return { absolutePath: null, error: \"filePath is outside workspace\" };\n }\n // Resolve symlinks to prevent escape via symlink pointing outside workspace\n let realPath: string;\n try {\n realPath = await fs.realpath(absolute);\n } catch {\n return { absolutePath: null, error: \"path does not exist\" };\n }\n let realRoot: string;\n try {\n realRoot = await fs.realpath(workspace.path);\n } catch {\n return { absolutePath: null, error: \"workspace root does not exist\" };\n }\n if (realPath !== realRoot && !realPath.startsWith(realRoot + path.sep)) {\n return { absolutePath: null, error: \"filePath is outside workspace\" };\n }\n return { absolutePath: realPath };\n }\n\n const legacyPath = typeof params.path === \"string\" ? String(params.path).trim() : \"\";\n if (!legacyPath) {\n return { absolutePath: null, error: \"path is required\" };\n }\n\n if (legacyPath.includes(\"\\0\")) {\n return { absolutePath: null, error: \"invalid path\" };\n }\n\n const absolutePath = path.resolve(expandPath(legacyPath));\n // Resolve symlinks to prevent escape via symlink pointing outside workspace\n let resolvedPath: string;\n try {\n resolvedPath = await fs.realpath(absolutePath);\n } catch {\n return { absolutePath: null, error: \"path does not exist\" };\n }\n const allowedRoots: string[] = [];\n for (const workspace of config.workspaces) {\n try {\n allowedRoots.push(await fs.realpath(path.resolve(workspace.path)));\n } catch {\n // skip workspaces whose root doesn't exist\n }\n }\n const isAllowed = allowedRoots.some(\n (root) => resolvedPath === root || resolvedPath.startsWith(root + path.sep),\n );\n if (!isAllowed) {\n return {\n absolutePath: null,\n error: \"path is outside allowed workspace directories\",\n };\n }\n\n return { absolutePath: resolvedPath };\n}\n\nfunction getImageMimeTypeForExtension(extension: string): string | null {\n if (!extension) {\n return null;\n }\n return IMAGE_MIME_BY_EXT[extension] ?? null;\n}\n\nasync function readFileForWorkspace(absolutePath: string): Promise<{\n content: string | null;\n size?: number;\n modifiedAt?: number;\n mime?: string;\n contentType?: string;\n error?: string;\n}> {\n let stat: import(\"node:fs\").Stats;\n try {\n stat = await fs.stat(absolutePath);\n } catch (err) {\n return { content: null, error: err instanceof Error ? err.message : String(err) };\n }\n\n if (stat.isDirectory()) {\n return { content: null, error: \"path is a directory, not a file\" };\n }\n\n const extension = path.extname(absolutePath).toLowerCase();\n const imageMime = getImageMimeTypeForExtension(extension);\n if (imageMime) {\n if (stat.size > MAX_IMAGE_READ_SIZE) {\n return {\n content: null,\n size: stat.size,\n error: `image too large (${Math.round(stat.size / 1024)}KB, max ${Math.round(MAX_IMAGE_READ_SIZE / 1024)}KB)`,\n };\n }\n try {\n const raw = await fs.readFile(absolutePath);\n const content = `data:${imageMime};base64,${raw.toString(\"base64\")}`;\n return {\n content,\n size: stat.size,\n modifiedAt: stat.mtimeMs,\n mime: imageMime,\n contentType: imageMime,\n };\n } catch (err) {\n return { content: null, error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n if (stat.size > MAX_READ_SIZE) {\n return {\n content: null,\n size: stat.size,\n error: `file too large (${Math.round(stat.size / 1024)}KB, max ${Math.round(MAX_READ_SIZE / 1024)}KB)`,\n };\n }\n\n if (extension && !TEXT_EXTENSIONS.has(extension)) {\n return {\n content: null,\n error: `unsupported file type: ${extension}`,\n mime: \"application/octet-stream\",\n };\n }\n\n let content: string;\n try {\n content = await fs.readFile(absolutePath, \"utf-8\");\n } catch (err) {\n return { content: null, error: err instanceof Error ? err.message : String(err) };\n }\n const mime =\n extension === \".md\"\n ? \"text/markdown\"\n : extension === \".html\" || extension === \".htm\"\n ? \"text/html\"\n : extension === \".json\" || extension === \".json5\"\n ? \"application/json\"\n : \"text/plain\";\n\n return {\n content,\n size: stat.size,\n modifiedAt: stat.mtimeMs,\n mime,\n contentType: mime,\n };\n}\n\nfunction resolveWorkspacePathByType(type: WorkspaceType, id: string): string {\n const root = resolveGodModeRoot();\n if (type === \"team\") {\n return path.join(root, \"clients\", id);\n }\n if (type === \"personal\") {\n return path.join(root, \"memory\", \"personal\", id);\n }\n return path.join(root, \"memory\", \"projects\", id);\n}\n\nfunction normalizeCreateType(value: unknown): WorkspaceType {\n const normalized = (typeof value === \"string\" ? value : \"project\").trim().toLowerCase();\n if (normalized === \"team\" || normalized === \"team-workspace\") {\n return \"team\";\n }\n if (normalized === \"personal\") {\n return \"personal\";\n }\n return \"project\";\n}\n\nasync function findSessionKeyFromSessionId(sessionId: string): Promise<string | null> {\n const cfg = await loadConfig();\n const combined = (await loadCombinedSessionStoreForGateway(cfg)).store;\n for (const [key, entry] of Object.entries(combined)) {\n if (entry.sessionId === sessionId) {\n return key;\n }\n }\n return null;\n}\n\nconst list: GatewayRequestHandler = async ({ respond }) => {\n const config = await readWorkspaceConfig();\n\n const summaries = await Promise.all(\n config.workspaces.map(async (workspace) => {\n const outputs = await listWorkspaceOutputs(workspace);\n const sessions = await listWorkspaceSessions(workspace.id, config);\n const summary = resolveWorkspaceSummary(workspace, outputs.length, sessions);\n return {\n id: summary.id,\n name: summary.name,\n emoji: summary.emoji,\n type: summary.type,\n path: summary.path,\n artifactCount: summary.artifactCount,\n sessionCount: summary.sessionCount,\n lastUpdated: summary.lastUpdated,\n lastScanned: summary.lastScanned,\n legacyType: summary.legacyType,\n };\n }),\n );\n\n respond(true, {\n configPath: CANONICAL_WORKSPACES_CONFIG_PATH,\n workspaces: summaries,\n sources: summaries.map((workspace) => workspace.path),\n });\n};\n\nconst get: GatewayRequestHandler = async ({ params, respond }) => {\n const id = typeof params.id === \"string\" ? String(params.id).trim() : \"\";\n if (!id) {\n respond(true, { workspace: null, error: \"id is required\" });\n return;\n }\n\n const config = await readWorkspaceConfig();\n const workspace = findWorkspaceById(config, id);\n if (!workspace) {\n respond(true, { workspace: null, error: `workspace not found: ${id}` });\n return;\n }\n\n const rawOutputs = await listWorkspaceOutputs(workspace);\n const outputs = await enrichWorkspaceEntriesForSearch(workspace, rawOutputs);\n const sessions = await listWorkspaceSessions(workspace.id, config);\n const pinned = await getPinnedEntries(workspace, outputs);\n const summary = resolveWorkspaceSummary(workspace, outputs.length, sessions);\n\n // Resolve pinned sessions\n const cfg = await loadConfig();\n const combinedStore = (await loadCombinedSessionStoreForGateway(cfg)).store;\n const pinnedSessions: WorkspaceSessionEntry[] = [];\n for (const sessionKey of workspace.pinnedSessions) {\n const canonicalSessionKey = sessionKey.trim().toLowerCase();\n const entry = combinedStore[canonicalSessionKey] as Record<string, unknown> | undefined;\n if (!entry) {\n continue;\n }\n const updatedAt = Number(entry.updatedAt ?? Date.now());\n pinnedSessions.push({\n id: typeof entry.sessionId === \"string\" ? entry.sessionId : \"\",\n key: sessionKey,\n title: resolveWorkspaceSessionTitle(sessionKey, entry),\n created: new Date(updatedAt).toISOString(),\n status: deriveSessionStatus(updatedAt),\n workspaceSubfolder: null,\n });\n }\n\n respond(true, {\n workspace: {\n ...workspace,\n path: summary.path,\n artifactCount: summary.artifactCount,\n sessionCount: summary.sessionCount,\n lastUpdated: summary.lastUpdated,\n type: workspace.type,\n legacyType: summary.legacyType,\n lastScanned: Date.now(),\n },\n pinned,\n pinnedSessions,\n outputs,\n sessions,\n });\n};\n\nconst readFile: GatewayRequestHandler = async ({ params, respond }) => {\n const config = await readWorkspaceConfig();\n const resolved = await normalizePathForRead(params, config);\n if (!resolved.absolutePath) {\n respond(true, { content: null, error: resolved.error ?? \"path is required\" });\n return;\n }\n\n const result = await readFileForWorkspace(resolved.absolutePath);\n respond(true, {\n ...result,\n path: toDisplayPath(resolved.absolutePath),\n });\n};\n\nconst pin: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId =\n typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const filePath = typeof params.filePath === \"string\" ? String(params.filePath).trim() : \"\";\n\n if (!workspaceId || !filePath) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId and filePath are required\"),\n );\n return;\n }\n\n const config = await readWorkspaceConfig();\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, `workspace not found: ${workspaceId}`),\n );\n return;\n }\n\n const normalized = normalizePinnedPath(workspace.path, filePath);\n if (!normalized) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"filePath is outside workspace\"),\n );\n return;\n }\n\n if (!workspace.pinned.includes(normalized)) {\n workspace.pinned = [...workspace.pinned, normalized];\n await writeWorkspaceConfig(config);\n }\n\n respond(true, {\n ok: true,\n workspaceId,\n pinned: workspace.pinned,\n });\n};\n\nconst unpin: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId =\n typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const filePath = typeof params.filePath === \"string\" ? String(params.filePath).trim() : \"\";\n\n if (!workspaceId || !filePath) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId and filePath are required\"),\n );\n return;\n }\n\n const config = await readWorkspaceConfig();\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, `workspace not found: ${workspaceId}`),\n );\n return;\n }\n\n const normalized = normalizePinnedPath(workspace.path, filePath);\n if (!normalized) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"filePath is outside workspace\"),\n );\n return;\n }\n\n workspace.pinned = workspace.pinned.filter((entry) => entry !== normalized);\n await writeWorkspaceConfig(config);\n\n respond(true, {\n ok: true,\n workspaceId,\n pinned: workspace.pinned,\n });\n};\n\nconst fileSession: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId =\n typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const sessionId = typeof params.sessionId === \"string\" ? String(params.sessionId).trim() : \"\";\n const sessionKeyInput =\n typeof params.sessionKey === \"string\" ? String(params.sessionKey).trim() : \"\";\n const workspaceSubfolderInput =\n typeof params.workspaceSubfolder === \"string\" ? String(params.workspaceSubfolder).trim() : \"\";\n\n if (!workspaceId || (!sessionId && !sessionKeyInput)) {\n respond(false, undefined, {\n ...errorShape(\n ErrorCodes.INVALID_REQUEST,\n \"workspaceId and one of sessionId/sessionKey are required\",\n ),\n });\n return;\n }\n\n const workspacesConfig = await readWorkspaceConfig();\n const workspace = findWorkspaceById(workspacesConfig, workspaceId);\n if (!workspace) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, `workspace not found: ${workspaceId}`),\n );\n return;\n }\n\n const resolvedSessionKey = sessionKeyInput || (await findSessionKeyFromSessionId(sessionId));\n if (!resolvedSessionKey) {\n respond(false, undefined, {\n ...errorShape(\n ErrorCodes.INVALID_REQUEST,\n \"session not found for provided sessionId/sessionKey\",\n ),\n });\n return;\n }\n\n const workspaceSubfolder = workspaceSubfolderInput\n ? normalizePinnedPath(workspace.path, workspaceSubfolderInput)\n : null;\n\n const cfg = await loadConfig();\n const target = await resolveGatewaySessionStoreTarget({ cfg, key: resolvedSessionKey });\n\n try {\n await updateSessionStore(target.storePath, (store) => {\n const existing = target.storeKeys.map((key) => store[key]).find(Boolean);\n if (!existing) {\n return;\n }\n\n store[target.canonicalKey] = {\n ...existing,\n updatedAt: Date.now(),\n workspaceId: workspace.id,\n workspaceSubfolder: workspaceSubfolder ?? null,\n } as typeof existing & { workspaceId: string; workspaceSubfolder: string | null };\n\n pruneLegacyStoreKeys({\n store,\n canonicalKey: target.canonicalKey,\n candidates: target.storeKeys,\n });\n });\n } catch (err) {\n respond(\n false,\n undefined,\n errorShape(\n ErrorCodes.UNAVAILABLE,\n `failed to update session workspace metadata: ${String(err)}`,\n ),\n );\n return;\n }\n\n respond(true, {\n ok: true,\n sessionKey: target.canonicalKey,\n workspaceId: workspace.id,\n workspaceSubfolder: workspaceSubfolder ?? null,\n });\n};\n\nconst detectFromMessage: GatewayRequestHandler = async ({ params, respond }) => {\n const text = typeof params.text === \"string\" ? String(params.text) : \"\";\n const config = await readWorkspaceConfig();\n const result = detectWorkspaceFromText(config, text);\n respond(true, result);\n};\n\nconst createWorkspace: GatewayRequestHandler = async ({ params, respond }) => {\n const name = typeof params.name === \"string\" ? String(params.name).trim() : \"\";\n const type = normalizeCreateType(params.type);\n const explicitPath = typeof params.path === \"string\" ? String(params.path).trim() : \"\";\n const emoji = typeof params.emoji === \"string\" ? String(params.emoji).trim() : \"\";\n const keywordsRaw = Array.isArray(params.keywords) ? (params.keywords as unknown[]) : [];\n\n if (!name) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"name is required\"));\n return;\n }\n\n const config = await readWorkspaceConfig();\n const existingIds = new Set(config.workspaces.map((workspace) => workspace.id));\n const id = createWorkspaceId(name, existingIds);\n\n const workspacePath = path.resolve(\n explicitPath ? expandPath(explicitPath) : resolveWorkspacePathByType(type, id),\n );\n\n const keywords = Array.from(\n new Set(\n [\n ...keywordsRaw.map((entry) =>\n (typeof entry === \"string\" ? entry : \"\").trim().toLowerCase(),\n ),\n ...name\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean),\n id,\n ].filter(Boolean),\n ),\n );\n\n const workspace: WorkspaceConfigEntry = {\n id,\n name,\n emoji: emoji || (type === \"team\" ? \"👥\" : type === \"personal\" ? \"🌱\" : \"📁\"),\n type,\n path: workspacePath,\n keywords,\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\"],\n };\n\n await ensureWorkspaceFolders(workspace.path);\n config.workspaces.push(workspace);\n await writeWorkspaceConfig(config);\n\n respond(true, {\n workspace: {\n ...workspace,\n path: toDisplayPath(workspace.path),\n },\n });\n};\n\nconst scan: GatewayRequestHandler = async ({ respond }) => {\n const config = await readWorkspaceConfig();\n\n const results = await Promise.all(\n config.workspaces.map(async (workspace) => {\n const exists = await pathExists(workspace.path);\n const outputs = await listWorkspaceOutputs(workspace);\n return {\n path: toDisplayPath(workspace.path),\n found: exists,\n artifactCount: outputs.length,\n workspaceId: workspace.id,\n };\n }),\n );\n\n respond(true, {\n scanned: true,\n timestamp: Date.now(),\n configPath: CANONICAL_WORKSPACES_CONFIG_PATH,\n results,\n });\n};\n\nconst pinSession: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId =\n typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const sessionKey = typeof params.sessionKey === \"string\" ? String(params.sessionKey).trim() : \"\";\n\n if (!workspaceId || !sessionKey) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId and sessionKey are required\"),\n );\n return;\n }\n\n const config = await readWorkspaceConfig();\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, `workspace not found: ${workspaceId}`),\n );\n return;\n }\n\n if (!workspace.pinnedSessions.includes(sessionKey)) {\n workspace.pinnedSessions = [...workspace.pinnedSessions, sessionKey];\n await writeWorkspaceConfig(config);\n }\n\n respond(true, { ok: true, workspaceId, pinnedSessions: workspace.pinnedSessions });\n};\n\nconst unpinSession: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId =\n typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const sessionKey = typeof params.sessionKey === \"string\" ? String(params.sessionKey).trim() : \"\";\n\n if (!workspaceId || !sessionKey) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId and sessionKey are required\"),\n );\n return;\n }\n\n const config = await readWorkspaceConfig();\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, `workspace not found: ${workspaceId}`),\n );\n return;\n }\n\n workspace.pinnedSessions = workspace.pinnedSessions.filter((key) => key !== sessionKey);\n await writeWorkspaceConfig(config);\n\n respond(true, { ok: true, workspaceId, pinnedSessions: workspace.pinnedSessions });\n};\n\nexport const workspacesHandlers: GatewayRequestHandlers = {\n \"workspaces.list\": list,\n \"workspaces.get\": get,\n \"workspaces.scan\": scan,\n \"workspaces.readFile\": readFile,\n \"workspaces.pin\": pin,\n \"workspaces.unpin\": unpin,\n \"workspaces.pinSession\": pinSession,\n \"workspaces.unpinSession\": unpinSession,\n \"workspaces.fileSession\": fileSession,\n \"workspaces.detectFromMessage\": detectFromMessage,\n \"workspaces.create\": createWorkspace,\n};\n\nexport { expandPath };\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type FeedMessageType = \"handoff\" | \"question\" | \"alert\" | \"blocked\" | \"fyi\";\n\nexport const FEED_MESSAGE_TYPES: readonly FeedMessageType[] = [\n \"handoff\",\n \"question\",\n \"alert\",\n \"blocked\",\n \"fyi\",\n] as const;\n\nexport type FeedMessage = {\n ts: string;\n id: string;\n from: string;\n type: FeedMessageType;\n to?: string;\n re?: string;\n msg: string;\n context?: Record<string, unknown>;\n};\n\nexport type FeedCursor = {\n lastReadId?: string;\n lastReadTs?: string;\n updatedAt: string;\n};\n\nfunction generateId(): string {\n return crypto.randomUUID().slice(0, 12);\n}\n\nexport function createFeedMessage(params: {\n from: string;\n type: FeedMessageType;\n msg: string;\n to?: string;\n re?: string;\n context?: Record<string, unknown>;\n}): FeedMessage {\n return {\n ts: new Date().toISOString(),\n id: generateId(),\n from: params.from,\n type: params.type,\n msg: params.msg,\n to: params.to,\n re: params.re,\n context: params.context,\n };\n}\n\nexport async function appendFeedMessage(feedPath: string, message: FeedMessage): Promise<void> {\n await fs.mkdir(path.dirname(feedPath), { recursive: true });\n const line = JSON.stringify(message) + \"\\n\";\n await fs.appendFile(feedPath, line, \"utf-8\");\n}\n\nexport async function readFeed(\n feedPath: string,\n opts?: { since?: string; limit?: number },\n): Promise<FeedMessage[]> {\n let raw: string;\n try {\n raw = await fs.readFile(feedPath, \"utf-8\");\n } catch {\n return [];\n }\n\n const lines = raw.split(\"\\n\").filter(Boolean);\n let messages: FeedMessage[] = [];\n\n for (const line of lines) {\n try {\n messages.push(JSON.parse(line) as FeedMessage);\n } catch {\n // Skip malformed lines\n }\n }\n\n if (opts?.since) {\n const sinceTs = opts.since;\n messages = messages.filter((m) => m.ts > sinceTs);\n }\n\n if (opts?.limit && opts.limit > 0) {\n messages = messages.slice(-opts.limit);\n }\n\n return messages;\n}\n\nexport function resolveFeedPath(workspacePath: string): string {\n return path.join(workspacePath, \"comms\", \"feed.jsonl\");\n}\n\nexport function resolveCursorPath(workspacePath: string, memberId: string): string {\n return path.join(workspacePath, \".godmode\", \"local\", `${memberId}-feed-cursor.json`);\n}\n\nexport async function readFeedCursor(\n workspacePath: string,\n memberId: string,\n): Promise<FeedCursor | null> {\n const cursorPath = resolveCursorPath(workspacePath, memberId);\n try {\n const raw = await fs.readFile(cursorPath, \"utf-8\");\n return JSON.parse(raw) as FeedCursor;\n } catch {\n return null;\n }\n}\n\nexport async function writeFeedCursor(\n workspacePath: string,\n memberId: string,\n cursor: FeedCursor,\n): Promise<void> {\n const cursorPath = resolveCursorPath(workspacePath, memberId);\n await fs.mkdir(path.dirname(cursorPath), { recursive: true });\n await fs.writeFile(cursorPath, JSON.stringify(cursor, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport async function getUnreadMessages(\n workspacePath: string,\n memberId: string,\n): Promise<FeedMessage[]> {\n const feedPath = resolveFeedPath(workspacePath);\n const cursor = await readFeedCursor(workspacePath, memberId);\n\n const all = await readFeed(feedPath);\n if (!cursor?.lastReadTs) {\n return all;\n }\n\n return all.filter((m) => m.ts > cursor.lastReadTs!);\n}\n\nexport async function markFeedRead(\n workspacePath: string,\n memberId: string,\n messages: FeedMessage[],\n): Promise<void> {\n if (messages.length === 0) return;\n const last = messages[messages.length - 1];\n await writeFeedCursor(workspacePath, memberId, {\n lastReadId: last.id,\n lastReadTs: last.ts,\n updatedAt: new Date().toISOString(),\n });\n}\n","import { execFile as execFileCb } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport chokidar, { type FSWatcher } from \"chokidar\";\nimport type { WorkspaceConfigEntry, WorkspaceConfigFile } from \"./workspaces-config.js\";\nimport { readWorkspaceConfig } from \"./workspaces-config.js\";\n\nconst execFile = promisify(execFileCb);\n\ntype Logger = {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n};\n\nexport type WorkspaceSyncState =\n | \"synced\"\n | \"syncing\"\n | \"conflict\"\n | \"error\"\n | \"paused\"\n | \"unpushed\";\n\nexport type WorkspaceSyncStatus = {\n status: WorkspaceSyncState;\n lastSyncAt?: number;\n lastActivityAt?: number;\n lastError?: string;\n paused?: boolean;\n dirty?: boolean;\n};\n\nfunction createDefaultLogger(): Logger {\n return {\n info: (message) => console.log(message),\n warn: (message) => console.warn(message),\n error: (message) => console.error(message),\n };\n}\n\nfunction normalizeIntervalMs(raw: string | undefined): number {\n const input = String(raw ?? \"\")\n .trim()\n .toLowerCase();\n if (!input) {\n return 5 * 60 * 1000;\n }\n const match = input.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) {\n return 5 * 60 * 1000;\n }\n const value = Number(match[1]);\n const unit = match[2] ?? \"ms\";\n if (!Number.isFinite(value) || value <= 0) {\n return 5 * 60 * 1000;\n }\n if (unit === \"h\") {\n return value * 60 * 60 * 1000;\n }\n if (unit === \"m\") {\n return value * 60 * 1000;\n }\n if (unit === \"s\") {\n return value * 1000;\n }\n return value;\n}\n\nfunction normalizeGitError(err: unknown): string {\n if (err instanceof Error) {\n return err.message;\n }\n return String(err);\n}\n\nfunction looksLikeConflict(message: string): boolean {\n const value = message.toLowerCase();\n return (\n value.includes(\"conflict\") ||\n value.includes(\"non-fast-forward\") ||\n value.includes(\"rebase\") ||\n value.includes(\"merge\")\n );\n}\n\nexport class WorkspaceSyncService {\n private readonly log: Logger;\n private readonly status = new Map<string, WorkspaceSyncStatus>();\n private readonly pullTimers = new Map<string, ReturnType<typeof setInterval>>();\n private readonly pushTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly watchers = new Map<string, FSWatcher>();\n private readonly workspaceById = new Map<string, WorkspaceConfigEntry>();\n private readonly logFilePath = path.join(os.homedir(), \"godmode\", \"data\", \"workspace-sync.log\");\n private started = false;\n\n constructor(logger?: Partial<Logger>) {\n const fallback = createDefaultLogger();\n this.log = {\n info: logger?.info ?? fallback.info,\n warn: logger?.warn ?? fallback.warn,\n error: logger?.error ?? fallback.error,\n };\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n await this.appendLog(\"Workspace sync service started\");\n\n try {\n const config = await readWorkspaceConfig();\n await this.refreshFromConfig(config);\n } catch (err) {\n const message = `Workspace sync start failed: ${normalizeGitError(err)}`;\n this.log.warn(message);\n await this.appendLog(message);\n }\n }\n\n async stop(): Promise<void> {\n if (!this.started) {\n return;\n }\n this.started = false;\n\n for (const timer of this.pullTimers.values()) {\n clearInterval(timer);\n }\n this.pullTimers.clear();\n\n for (const timer of this.pushTimers.values()) {\n clearTimeout(timer);\n }\n this.pushTimers.clear();\n\n const closeTasks: Promise<void>[] = [];\n for (const watcher of this.watchers.values()) {\n closeTasks.push(watcher.close());\n }\n this.watchers.clear();\n await Promise.allSettled(closeTasks);\n\n await this.appendLog(\"Workspace sync service stopped\");\n }\n\n getStatus(workspaceId: string): WorkspaceSyncStatus | null {\n return this.status.get(workspaceId) ?? null;\n }\n\n listStatuses(): Record<string, WorkspaceSyncStatus> {\n const result: Record<string, WorkspaceSyncStatus> = {};\n for (const [id, value] of this.status.entries()) {\n result[id] = { ...value };\n }\n return result;\n }\n\n async refreshFromConfig(config: WorkspaceConfigFile): Promise<void> {\n if (!this.started) {\n return;\n }\n\n const syncable = new Map<string, WorkspaceConfigEntry>();\n for (const workspace of config.workspaces) {\n if (!workspace.sync || workspace.sync.type !== \"git\") {\n continue;\n }\n syncable.set(workspace.id, workspace);\n }\n\n for (const existingId of this.workspaceById.keys()) {\n if (syncable.has(existingId)) {\n continue;\n }\n await this.teardownWorkspace(existingId);\n this.workspaceById.delete(existingId);\n this.status.delete(existingId);\n }\n\n for (const [workspaceId, workspace] of syncable.entries()) {\n this.workspaceById.set(workspaceId, workspace);\n if (!this.status.has(workspaceId)) {\n this.status.set(workspaceId, {\n status: \"synced\",\n lastActivityAt: Date.now(),\n paused: false,\n });\n }\n\n if (workspace.sync?.autoPull.enabled) {\n this.ensureAutoPull(workspace);\n } else {\n const timer = this.pullTimers.get(workspaceId);\n if (timer) {\n clearInterval(timer);\n this.pullTimers.delete(workspaceId);\n }\n }\n\n if (workspace.sync?.autoPush.enabled) {\n await this.ensureAutoPushWatcher(workspace);\n } else {\n const watcher = this.watchers.get(workspaceId);\n if (watcher) {\n await watcher.close();\n this.watchers.delete(workspaceId);\n }\n }\n }\n }\n\n async manualSync(workspaceId: string): Promise<WorkspaceSyncStatus> {\n const workspace = this.workspaceById.get(workspaceId);\n if (!workspace || !workspace.sync) {\n const status: WorkspaceSyncStatus = {\n status: \"error\",\n lastActivityAt: Date.now(),\n lastError: \"Workspace has no git sync configuration\",\n };\n this.status.set(workspaceId, status);\n return status;\n }\n\n await this.runPull(workspaceId, \"manual\");\n await this.runPush(workspaceId, \"manual\");\n\n return (\n this.status.get(workspaceId) ?? {\n status: \"error\",\n lastActivityAt: Date.now(),\n lastError: \"Sync status unavailable\",\n }\n );\n }\n\n /** Cancel any pending debounce timer and push immediately. */\n async pushNow(workspaceId: string): Promise<WorkspaceSyncStatus> {\n const existing = this.pushTimers.get(workspaceId);\n if (existing) {\n clearTimeout(existing);\n this.pushTimers.delete(workspaceId);\n }\n await this.runPush(workspaceId, \"manual\");\n return (\n this.status.get(workspaceId) ?? {\n status: \"error\",\n lastActivityAt: Date.now(),\n lastError: \"Push status unavailable\",\n }\n );\n }\n\n /** Run a git pull immediately (bypasses interval timer). */\n async pullNow(workspaceId: string): Promise<WorkspaceSyncStatus> {\n await this.runPull(workspaceId, \"manual\");\n return (\n this.status.get(workspaceId) ?? {\n status: \"error\",\n lastActivityAt: Date.now(),\n lastError: \"Pull status unavailable\",\n }\n );\n }\n\n private async teardownWorkspace(workspaceId: string): Promise<void> {\n const pull = this.pullTimers.get(workspaceId);\n if (pull) {\n clearInterval(pull);\n this.pullTimers.delete(workspaceId);\n }\n\n const push = this.pushTimers.get(workspaceId);\n if (push) {\n clearTimeout(push);\n this.pushTimers.delete(workspaceId);\n }\n\n const watcher = this.watchers.get(workspaceId);\n if (watcher) {\n await watcher.close();\n this.watchers.delete(workspaceId);\n }\n }\n\n private ensureAutoPull(workspace: WorkspaceConfigEntry): void {\n if (this.pullTimers.has(workspace.id)) {\n return;\n }\n const intervalMs = normalizeIntervalMs(workspace.sync?.autoPull.interval);\n const timer = setInterval(() => {\n void this.runPull(workspace.id, \"auto\");\n }, intervalMs);\n this.pullTimers.set(workspace.id, timer);\n }\n\n private async ensureAutoPushWatcher(workspace: WorkspaceConfigEntry): Promise<void> {\n if (this.watchers.has(workspace.id)) {\n return;\n }\n const watcher = chokidar.watch(workspace.path, {\n ignoreInitial: true,\n ignored: [\n /(^|[\\\\/])\\.git([\\\\/]|$)/,\n /(^|[\\\\/])node_modules([\\\\/]|$)/,\n /(^|[\\\\/])dist([\\\\/]|$)/,\n /(^|[\\\\/])build([\\\\/]|$)/,\n ],\n });\n\n watcher.on(\"all\", (_event: string, changedPath: string) => {\n if (changedPath.includes(`${path.sep}.git${path.sep}`)) {\n return;\n }\n this.schedulePush(workspace.id);\n });\n\n this.watchers.set(workspace.id, watcher);\n }\n\n private schedulePush(workspaceId: string): void {\n const workspace = this.workspaceById.get(workspaceId);\n if (!workspace?.sync?.autoPush.enabled) {\n return;\n }\n\n const existing = this.pushTimers.get(workspaceId);\n if (existing) {\n clearTimeout(existing);\n }\n\n const timeout = setTimeout(\n () => {\n this.pushTimers.delete(workspaceId);\n void this.runPush(workspaceId, \"auto\");\n },\n Math.max(1000, workspace.sync.autoPush.debounceMs),\n );\n\n this.pushTimers.set(workspaceId, timeout);\n this.status.set(workspaceId, {\n ...(this.status.get(workspaceId) ?? { status: \"synced\" }),\n status: \"unpushed\",\n dirty: true,\n lastActivityAt: Date.now(),\n });\n }\n\n private async runGit(workspace: WorkspaceConfigEntry, args: string[]): Promise<string> {\n const result = await execFile(\"git\", args, {\n cwd: workspace.path,\n maxBuffer: 5 * 1024 * 1024,\n });\n return `${result.stdout ?? \"\"}${result.stderr ?? \"\"}`;\n }\n\n private async ensureRepo(workspace: WorkspaceConfigEntry): Promise<boolean> {\n try {\n await this.runGit(workspace, [\"rev-parse\", \"--is-inside-work-tree\"]);\n return true;\n } catch {\n const status: WorkspaceSyncStatus = {\n status: \"error\",\n lastActivityAt: Date.now(),\n lastError: \"Workspace is not a git repository\",\n };\n this.status.set(workspace.id, status);\n return false;\n }\n }\n\n /** Ensure the workspace has a .gitignore that excludes common sensitive patterns. */\n private async ensureGitignore(workspace: WorkspaceConfigEntry): Promise<void> {\n const gitignorePath = path.join(workspace.path, \".gitignore\");\n try {\n await fs.access(gitignorePath);\n // .gitignore already exists, don't overwrite\n } catch {\n const defaultGitignore = [\n \"# Auto-generated by workspace sync — prevent accidental secret commits\",\n \".env\",\n \".env.*\",\n \"*.pem\",\n \"*.key\",\n \"*.p12\",\n \"*.pfx\",\n \"credentials.json\",\n \"auth.json\",\n \"secrets.json\",\n \"*.secret\",\n \".DS_Store\",\n \"node_modules/\",\n \"\",\n ].join(\"\\n\");\n try {\n await fs.writeFile(gitignorePath, defaultGitignore, \"utf-8\");\n await this.appendLog(`[${workspace.id}] created default .gitignore`);\n } catch (err) {\n this.log.warn(\n `Failed to create .gitignore in ${workspace.path}: ${normalizeGitError(err)}`,\n );\n }\n }\n }\n\n private async isDirty(workspace: WorkspaceConfigEntry): Promise<boolean> {\n try {\n const output = await this.runGit(workspace, [\"status\", \"--porcelain\"]);\n return output.trim().length > 0;\n } catch {\n return false;\n }\n }\n\n private async runPull(workspaceId: string, reason: \"auto\" | \"manual\"): Promise<void> {\n const workspace = this.workspaceById.get(workspaceId);\n if (!workspace?.sync) {\n return;\n }\n if (!(await this.ensureRepo(workspace))) {\n return;\n }\n\n this.status.set(workspaceId, {\n ...(this.status.get(workspaceId) ?? { status: \"synced\" }),\n status: \"syncing\",\n paused: false,\n lastActivityAt: Date.now(),\n lastError: undefined,\n });\n\n try {\n const args = workspace.sync.remote\n ? [\"pull\", \"--rebase\", workspace.sync.remote, workspace.sync.branch]\n : [\"pull\", \"--rebase\"];\n await this.runGit(workspace, args);\n const dirty = await this.isDirty(workspace);\n this.status.set(workspaceId, {\n status: dirty ? \"unpushed\" : \"synced\",\n lastSyncAt: Date.now(),\n lastActivityAt: Date.now(),\n paused: false,\n dirty,\n });\n await this.appendLog(\n `[${workspaceId}] pull (${reason}) ok ${workspace.sync.remote || \"origin\"}/${workspace.sync.branch}`,\n );\n } catch (err) {\n const message = normalizeGitError(err);\n if (looksLikeConflict(message)) {\n this.status.set(workspaceId, {\n status: \"conflict\",\n paused: true,\n dirty: true,\n lastActivityAt: Date.now(),\n lastError: message,\n });\n } else {\n this.status.set(workspaceId, {\n status: \"error\",\n paused: false,\n lastActivityAt: Date.now(),\n lastError: message,\n });\n }\n this.log.warn(`[WorkspaceSync] pull failed for ${workspaceId}: ${message}`);\n await this.appendLog(`[${workspaceId}] pull (${reason}) failed: ${message}`);\n }\n }\n\n private async runPush(workspaceId: string, reason: \"auto\" | \"manual\"): Promise<void> {\n const workspace = this.workspaceById.get(workspaceId);\n if (!workspace?.sync) {\n return;\n }\n if (!(await this.ensureRepo(workspace))) {\n return;\n }\n\n const current = this.status.get(workspaceId);\n if (current?.paused && current.status === \"conflict\" && reason === \"auto\") {\n return;\n }\n\n const dirty = await this.isDirty(workspace);\n if (!dirty) {\n this.status.set(workspaceId, {\n status: \"synced\",\n paused: false,\n dirty: false,\n lastSyncAt: current?.lastSyncAt ?? Date.now(),\n lastActivityAt: Date.now(),\n });\n return;\n }\n\n this.status.set(workspaceId, {\n ...(current ?? { status: \"synced\" }),\n status: \"syncing\",\n paused: false,\n dirty: true,\n lastActivityAt: Date.now(),\n lastError: undefined,\n });\n\n try {\n await this.ensureGitignore(workspace);\n await this.runGit(workspace, [\"add\", \"-A\"]);\n\n try {\n await this.runGit(workspace, [\"commit\", \"-m\", `Auto-sync: ${new Date().toISOString()}`]);\n } catch (err) {\n const commitMessage = normalizeGitError(err);\n if (!commitMessage.toLowerCase().includes(\"nothing to commit\")) {\n throw err;\n }\n }\n\n const pushArgs = workspace.sync.remote\n ? [\"push\", workspace.sync.remote, workspace.sync.branch]\n : [\"push\"];\n await this.runGit(workspace, pushArgs);\n\n this.status.set(workspaceId, {\n status: \"synced\",\n paused: false,\n dirty: false,\n lastSyncAt: Date.now(),\n lastActivityAt: Date.now(),\n });\n await this.appendLog(`[${workspaceId}] push (${reason}) ok`);\n } catch (err) {\n const message = normalizeGitError(err);\n if (looksLikeConflict(message)) {\n this.status.set(workspaceId, {\n status: \"conflict\",\n paused: true,\n dirty: true,\n lastActivityAt: Date.now(),\n lastError: message,\n });\n } else {\n this.status.set(workspaceId, {\n status: \"error\",\n paused: false,\n dirty: true,\n lastActivityAt: Date.now(),\n lastError: message,\n });\n }\n this.log.warn(`[WorkspaceSync] push failed for ${workspaceId}: ${message}`);\n await this.appendLog(`[${workspaceId}] push (${reason}) failed: ${message}`);\n }\n }\n\n private async appendLog(message: string): Promise<void> {\n const line = `${new Date().toISOString()} ${message}\\n`;\n try {\n await fs.mkdir(path.dirname(this.logFilePath), { recursive: true });\n await fs.appendFile(this.logFilePath, line, \"utf-8\");\n } catch {\n // Keep sync loop resilient even when file logging fails.\n }\n }\n}\n\nlet singleton: WorkspaceSyncService | null = null;\n\nexport function getWorkspaceSyncService(logger?: Partial<Logger>): WorkspaceSyncService {\n if (!singleton) {\n singleton = new WorkspaceSyncService(logger);\n }\n return singleton;\n}\n\nexport async function startWorkspaceSyncService(\n logger?: Partial<Logger>,\n): Promise<WorkspaceSyncService> {\n const service = getWorkspaceSyncService(logger);\n await service.start();\n return service;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { getWorkspaceSyncService } from \"../lib/workspace-sync-service.js\";\nimport { readWorkspaceConfig, type WorkspaceConfigEntry } from \"../lib/workspaces-config.js\";\n\ntype Logger = {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n};\n\ntype CurationState = {\n lastRunAt?: number;\n chunksProcessed: number;\n pendingChunks: number;\n nextScheduledRun?: number;\n};\n\nconst DEFAULT_THRESHOLD = 10;\nconst DEFAULT_SCHEDULE_MS = 24 * 60 * 60 * 1000; // 24 hours\n\n/**\n * Service that manages workspace memory curation.\n *\n * Monitors team workspaces for new memory files and triggers curation\n * when either the threshold is reached or the schedule fires. Curation\n * involves: git pull -> load memory -> invoke LLM summarization ->\n * write updated files -> git commit + push.\n */\nexport class CurationAgentService {\n private readonly log: Logger;\n private readonly stateByWorkspace = new Map<string, CurationState>();\n private readonly configCache = new Map<string, { threshold?: number; schedule?: string }>();\n private scheduleTimer: ReturnType<typeof setInterval> | null = null;\n private started = false;\n\n constructor(logger: Logger) {\n this.log = logger;\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n\n // Initialize state for team workspaces with curation enabled\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n for (const workspace of config.workspaces) {\n if (workspace.type !== \"team\" || !workspace.curation?.enabled) continue;\n this.stateByWorkspace.set(workspace.id, {\n chunksProcessed: 0,\n pendingChunks: 0,\n });\n // Cache curation config\n this.configCache.set(workspace.id, {\n threshold: workspace.curation.threshold,\n schedule: workspace.curation.schedule,\n });\n }\n\n // Schedule periodic check\n this.scheduleTimer = setInterval(() => {\n void this.checkScheduledCurations();\n }, 60 * 60 * 1000); // Check hourly\n\n this.log.info(`[Curation] Service started, tracking ${this.stateByWorkspace.size} workspace(s)`);\n }\n\n stop(): void {\n if (!this.started) return;\n this.started = false;\n if (this.scheduleTimer) {\n clearInterval(this.scheduleTimer);\n this.scheduleTimer = null;\n }\n this.log.info(\"[Curation] Service stopped\");\n }\n\n /** Called when a new memory chunk is written to a workspace. */\n notifyMemoryWrite(workspaceId: string): void {\n const state = this.stateByWorkspace.get(workspaceId);\n if (!state) return;\n state.pendingChunks += 1;\n\n const config = this.getCurationConfig(workspaceId);\n const threshold = config?.threshold ?? DEFAULT_THRESHOLD;\n\n if (state.pendingChunks >= threshold) {\n this.log.info(`[Curation] Threshold reached for ${workspaceId} (${state.pendingChunks}/${threshold})`);\n void this.runCuration(workspaceId);\n }\n }\n\n /** Manually trigger curation for a workspace. */\n async runCuration(workspaceId: string): Promise<{ ok: boolean; error?: string }> {\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = config.workspaces.find((w) => w.id === workspaceId);\n if (!workspace || workspace.type !== \"team\") {\n return { ok: false, error: \"Not a team workspace\" };\n }\n\n const state = this.stateByWorkspace.get(workspaceId) ?? {\n chunksProcessed: 0,\n pendingChunks: 0,\n };\n\n this.log.info(`[Curation] Running curation for ${workspaceId}`);\n\n try {\n // Pull latest from remote\n const syncService = getWorkspaceSyncService();\n await syncService.pullNow(workspaceId);\n\n // Load memory files\n const memoryDir = path.join(workspace.path, \"memory\");\n const memoryFiles = await loadMemoryFiles(memoryDir);\n if (memoryFiles.length === 0) {\n this.log.info(`[Curation] No memory files found for ${workspaceId}`);\n state.pendingChunks = 0;\n state.lastRunAt = Date.now();\n this.stateByWorkspace.set(workspaceId, state);\n return { ok: true };\n }\n\n // Load current MEMORY.md\n const memoryMdPath = path.join(memoryDir, \"MEMORY.md\");\n let currentMemory = \"\";\n try {\n currentMemory = await fs.readFile(memoryMdPath, \"utf-8\");\n } catch {\n // No existing memory\n }\n\n // Load SOPs\n const agentsMdPath = path.join(workspace.path, \"AGENTS.md\");\n let currentSops = \"\";\n try {\n currentSops = await fs.readFile(agentsMdPath, \"utf-8\");\n } catch {\n // No existing SOPs\n }\n\n // Build curation prompt\n const curationResult = await runCurationLLM({\n workspace,\n memoryFiles,\n currentMemory,\n currentSops,\n log: this.log,\n });\n\n if (curationResult.updatedMemory) {\n await fs.writeFile(memoryMdPath, curationResult.updatedMemory, \"utf-8\");\n }\n\n if (curationResult.sopCandidates) {\n const candidatesPath = path.join(memoryDir, \"sop-candidates.md\");\n await fs.writeFile(candidatesPath, curationResult.sopCandidates, \"utf-8\");\n }\n\n // Commit and push\n await syncService.pushNow(workspaceId);\n\n state.chunksProcessed += memoryFiles.length;\n state.pendingChunks = 0;\n state.lastRunAt = Date.now();\n this.stateByWorkspace.set(workspaceId, state);\n\n this.log.info(`[Curation] Completed for ${workspaceId}, processed ${memoryFiles.length} files`);\n return { ok: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n this.log.error(`[Curation] Failed for ${workspaceId}: ${message}`);\n return { ok: false, error: message };\n }\n }\n\n getStatus(workspaceId: string): CurationState | null {\n return this.stateByWorkspace.get(workspaceId) ?? null;\n }\n\n listStatuses(): Record<string, CurationState> {\n const result: Record<string, CurationState> = {};\n for (const [id, state] of this.stateByWorkspace.entries()) {\n result[id] = { ...state };\n }\n return result;\n }\n\n private getCurationConfig(workspaceId: string): { threshold?: number; schedule?: string } | null {\n return this.configCache.get(workspaceId) ?? null;\n }\n\n private async checkScheduledCurations(): Promise<void> {\n if (!this.started) return;\n const now = Date.now();\n\n for (const [workspaceId, state] of this.stateByWorkspace.entries()) {\n const lastRun = state.lastRunAt ?? 0;\n if (now - lastRun >= DEFAULT_SCHEDULE_MS && state.pendingChunks > 0) {\n this.log.info(`[Curation] Scheduled run for ${workspaceId}`);\n await this.runCuration(workspaceId);\n }\n }\n }\n}\n\n// ── Memory file loading ──────────────────────────────────────────\n\ntype MemoryFile = {\n name: string;\n content: string;\n};\n\nasync function loadMemoryFiles(memoryDir: string): Promise<MemoryFile[]> {\n const files: MemoryFile[] = [];\n try {\n const entries = await fs.readdir(memoryDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n // Skip MEMORY.md itself and sop-candidates.md\n if (entry.name === \"MEMORY.md\" || entry.name === \"sop-candidates.md\") continue;\n if (!entry.name.endsWith(\".md\")) continue;\n try {\n const content = await fs.readFile(path.join(memoryDir, entry.name), \"utf-8\");\n if (content.trim()) {\n files.push({ name: entry.name, content: content.trim() });\n }\n } catch {\n // Skip unreadable files\n }\n }\n } catch {\n // Memory dir may not exist\n }\n return files;\n}\n\n// ── LLM Curation ──────────────────────────────────────────────────\n\ntype CurationLLMResult = {\n updatedMemory?: string;\n sopCandidates?: string;\n};\n\nconst CURATION_MODEL = \"claude-haiku-4-5-20251001\";\nconst CURATION_MAX_TOKENS = 4096;\n\nfunction buildCurationPrompt(params: {\n memoryFiles: MemoryFile[];\n currentMemory: string;\n currentSops: string;\n}): string {\n const chunks = params.memoryFiles\n .map((f) => `### ${f.name}\\n\\n${f.content.slice(0, 3000)}`)\n .join(\"\\n\\n---\\n\\n\");\n\n return `You are a team knowledge curator. Your job is to consolidate memory entries into a coherent, deduplicated MEMORY.md and identify SOP candidates.\n\n## Current MEMORY.md\n${params.currentMemory || \"(empty)\"}\n\n## Current AGENTS.md (SOPs)\n${params.currentSops || \"(none)\"}\n\n## New Memory Entries\n${chunks}\n\n## Instructions\n1. Produce an updated MEMORY.md that:\n - Merges new information with existing content\n - Deduplicates: if a new entry covers something already in MEMORY.md, integrate don't append\n - Keeps the most specific/actionable version of conflicting info\n - Stays under 200 lines\n - Uses clear markdown headers for organization\n\n2. Identify SOP candidates — patterns or rules that appear across multiple entries and should be promoted to AGENTS.md. Only list candidates NOT already in AGENTS.md.\n\n## Output Format\nRespond with EXACTLY this structure (no other text):\n\n<memory>\n(the full updated MEMORY.md content)\n</memory>\n\n<sop-candidates>\n(bulleted list of SOP candidates, or \"none\" if there are no new candidates)\n</sop-candidates>`;\n}\n\nfunction parseCurationResponse(text: string): CurationLLMResult {\n const memoryMatch = text.match(/<memory>\\s*([\\s\\S]*?)\\s*<\\/memory>/);\n const sopMatch = text.match(/<sop-candidates>\\s*([\\s\\S]*?)\\s*<\\/sop-candidates>/);\n\n const updatedMemory = memoryMatch?.[1]?.trim() || undefined;\n const rawSop = sopMatch?.[1]?.trim();\n const sopCandidates = rawSop && rawSop.toLowerCase() !== \"none\" ? rawSop : undefined;\n\n return { updatedMemory, sopCandidates };\n}\n\nasync function runCurationLLM(params: {\n workspace: WorkspaceConfigEntry;\n memoryFiles: MemoryFile[];\n currentMemory: string;\n currentSops: string;\n log: Logger;\n}): Promise<CurationLLMResult> {\n const { workspace, memoryFiles, currentMemory, currentSops, log } = params;\n\n // Try LLM-based curation first\n const apiKey = process.env.ANTHROPIC_API_KEY;\n if (apiKey) {\n try {\n const prompt = buildCurationPrompt({ memoryFiles, currentMemory, currentSops });\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: CURATION_MODEL,\n max_tokens: CURATION_MAX_TOKENS,\n messages: [{ role: \"user\", content: prompt }],\n }),\n signal: AbortSignal.timeout(30_000),\n });\n\n if (response.ok) {\n const body = (await response.json()) as {\n content: Array<{ type: string; text?: string }>;\n };\n const text = body.content\n ?.filter((b) => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\");\n\n if (text) {\n const result = parseCurationResponse(text);\n if (result.updatedMemory) {\n log.info(`[Curation] LLM curation completed for ${workspace.id}`);\n return result;\n }\n }\n } else {\n log.warn(`[Curation] LLM API returned ${response.status} — falling back to merge`);\n }\n } catch (err) {\n log.warn(`[Curation] LLM call failed: ${err instanceof Error ? err.message : String(err)} — falling back to merge`);\n }\n } else {\n log.info(\"[Curation] No ANTHROPIC_API_KEY — using merge-based curation\");\n }\n\n // Fallback: simple merge-based curation\n return runMergeCuration(params);\n}\n\nfunction runMergeCuration(params: {\n workspace: WorkspaceConfigEntry;\n memoryFiles: MemoryFile[];\n currentMemory: string;\n log: Logger;\n}): CurationLLMResult {\n const { workspace, memoryFiles, currentMemory, log } = params;\n\n const newEntries: string[] = [];\n for (const file of memoryFiles) {\n if (currentMemory.includes(file.name)) continue;\n newEntries.push(`\\n## From: ${file.name}\\n\\n${file.content.slice(0, 2000)}`);\n }\n\n let updatedMemory: string | undefined;\n if (newEntries.length > 0) {\n updatedMemory = currentMemory.trimEnd() + \"\\n\" + newEntries.join(\"\\n\") + \"\\n\";\n log.info(`[Curation] Merge: added ${newEntries.length} entries to MEMORY.md for ${workspace.id}`);\n }\n\n return { updatedMemory };\n}\n\n// ── Singleton ────────────────────────────────────────────────────\n\nlet singleton: CurationAgentService | null = null;\n\nexport function getCurationAgentService(logger?: Logger): CurationAgentService {\n if (!singleton) {\n singleton = new CurationAgentService(\n logger ?? {\n info: (msg) => console.log(msg),\n warn: (msg) => console.warn(msg),\n error: (msg) => console.error(msg),\n },\n );\n }\n return singleton;\n}\n","import { execFile as execFileCb } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { ensureWorkspaceFolders } from \"./workspaces-config.js\";\n\nconst execFile = promisify(execFileCb);\n\nexport type WorkspaceMetadata = {\n name: string;\n id: string;\n created: string;\n github?: string;\n members: WorkspaceMember[];\n};\n\nexport type WorkspaceMember = {\n id: string;\n name: string;\n role: \"admin\" | \"member\";\n joined: string;\n};\n\nexport type ScaffoldParams = {\n workspacePath: string;\n name: string;\n id: string;\n github?: string;\n creatorName: string;\n creatorId: string;\n};\n\nasync function writeIfMissing(filePath: string, content: string): Promise<void> {\n try {\n await fs.access(filePath);\n } catch {\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n}\n\nexport async function resolveGitMemberId(workspacePath: string): Promise<string> {\n try {\n const result = await execFile(\"git\", [\"config\", \"user.name\"], {\n cwd: workspacePath,\n maxBuffer: 1024 * 1024,\n });\n const name = (result.stdout ?? \"\").trim();\n if (name) {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40);\n }\n } catch {\n // Fall through to hostname\n }\n\n const os = await import(\"node:os\");\n return os.hostname().toLowerCase().replace(/[^a-z0-9]+/g, \"-\").slice(0, 40) || \"unknown\";\n}\n\nexport async function scaffoldTeamWorkspace(params: ScaffoldParams): Promise<WorkspaceMetadata> {\n const { workspacePath, name, id, github, creatorName, creatorId } = params;\n\n await ensureWorkspaceFolders(workspacePath, \"team\");\n\n const metadata: WorkspaceMetadata = {\n name,\n id,\n created: new Date().toISOString(),\n github,\n members: [\n {\n id: creatorId,\n name: creatorName,\n role: \"admin\",\n joined: new Date().toISOString(),\n },\n ],\n };\n\n const metadataPath = path.join(workspacePath, \".godmode\", \"workspace.json\");\n await writeIfMissing(metadataPath, JSON.stringify(metadata, null, 2) + \"\\n\");\n\n const commsYaml = `# Team communication configuration\nfeed:\n enabled: true\n path: comms/feed.jsonl\nnotifications:\n slack: null\n`;\n await writeIfMissing(path.join(workspacePath, \".godmode\", \"comms.yaml\"), commsYaml);\n\n const syncYaml = `# Sync configuration\ninclude:\n - memory/\n - skills/\n - tools/\n - comms/\n - artifacts/\n - clients/\n - integrations/\n - AGENTS.md\nexclude:\n - .godmode/local/\n - \"*.secret\"\n - .env\n - .env.*\n`;\n await writeIfMissing(path.join(workspacePath, \".godmode\", \"sync.yaml\"), syncYaml);\n\n const agentsMd = `# ${name} — Agent SOPs\n\n## Overview\nShared operating procedures for all agents working in this workspace.\n\n## Rules\n- Write memory entries to \\`memory/\\` after significant discoveries or decisions\n- Use \\`team_message\\` tool to communicate with other agents\n- Follow the patterns documented in \\`skills/\\` for recurring tasks\n\n## Conventions\n- File names: kebab-case\n- Memory entries: \\`YYYY-MM-DD-topic.md\\`\n- Commit messages: descriptive, prefixed with workspace name\n`;\n await writeIfMissing(path.join(workspacePath, \"AGENTS.md\"), agentsMd);\n\n const memoryMd = `# ${name} — Shared Memory\n\nTeam knowledge base. Updated by agents and curated nightly.\n`;\n await writeIfMissing(path.join(workspacePath, \"memory\", \"MEMORY.md\"), memoryMd);\n\n const gitignore = `# GodMode team workspace\n.godmode/local/\n.env\n.env.*\n*.pem\n*.key\n*.secret\n.DS_Store\nnode_modules/\n`;\n await writeIfMissing(path.join(workspacePath, \".gitignore\"), gitignore);\n\n const readme = `# ${name}\n\nGodMode team workspace. Synced via git.\n\n## Structure\n- \\`memory/\\` — Shared team knowledge\n- \\`skills/\\` — Reusable agent skills\n- \\`tools/\\` — Tool configurations and docs\n- \\`comms/\\` — Inter-agent communication feed\n- \\`artifacts/\\` — Shared documents, templates, exports\n- \\`clients/\\` — Client-specific folders\n- \\`integrations/\\` — External service configs\n- \\`AGENTS.md\\` — Agent SOPs (emergent operating procedures)\n`;\n await writeIfMissing(path.join(workspacePath, \"README.md\"), readme);\n\n return metadata;\n}\n\nexport async function readWorkspaceMetadata(\n workspacePath: string,\n): Promise<WorkspaceMetadata | null> {\n const metadataPath = path.join(workspacePath, \".godmode\", \"workspace.json\");\n try {\n const raw = await fs.readFile(metadataPath, \"utf-8\");\n return JSON.parse(raw) as WorkspaceMetadata;\n } catch {\n return null;\n }\n}\n\nexport async function addMemberToWorkspace(params: {\n workspacePath: string;\n memberId: string;\n memberName: string;\n role?: \"admin\" | \"member\";\n}): Promise<WorkspaceMetadata | null> {\n const metadata = await readWorkspaceMetadata(params.workspacePath);\n if (!metadata) {\n return null;\n }\n\n const existing = metadata.members.find((m) => m.id === params.memberId);\n if (existing) {\n return metadata;\n }\n\n metadata.members.push({\n id: params.memberId,\n name: params.memberName,\n role: params.role ?? \"member\",\n joined: new Date().toISOString(),\n });\n\n const metadataPath = path.join(params.workspacePath, \".godmode\", \"workspace.json\");\n await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2) + \"\\n\", \"utf-8\");\n\n return metadata;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n loadCombinedSessionStoreForGateway,\n loadConfig,\n} from \"../lib/workspace-session-store.js\";\nimport { findWorkspaceById, readWorkspaceConfig } from \"../lib/workspaces-config.js\";\n\n/** Max total chars for injected team context (~15KB, roughly 4K tokens). */\nconst CONTEXT_BUDGET = 15_000;\nconst MAX_SINGLE_FILE = 8_000;\n\nasync function safeReadText(filePath: string, maxSize: number): Promise<string | null> {\n try {\n const stat = await fs.stat(filePath);\n if (!stat.isFile() || stat.size > maxSize) {\n return null;\n }\n return await fs.readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nasync function loadGlobFiles(dir: string, pattern: string): Promise<{ name: string; content: string }[]> {\n const results: { name: string; content: string }[] = [];\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const ext = path.extname(entry.name).toLowerCase();\n if (pattern === \"*.md\" && ext !== \".md\") continue;\n if (pattern === \"*.yaml\" && ext !== \".yaml\" && ext !== \".yml\") continue;\n const content = await safeReadText(path.join(dir, entry.name), MAX_SINGLE_FILE);\n if (content) {\n results.push({ name: entry.name, content });\n }\n }\n } catch {\n // Directory may not exist\n }\n return results;\n}\n\ntype PrioritizedSection = {\n label: string;\n content: string;\n priority: number; // lower = more important\n};\n\n/**\n * Fits sections into the budget by priority order, truncating the last\n * section if needed to stay within budget.\n */\nfunction fitToBudget(sections: PrioritizedSection[], budget: number): string[] {\n const sorted = [...sections].sort((a, b) => a.priority - b.priority);\n const result: string[] = [];\n let remaining = budget;\n\n for (const section of sorted) {\n if (remaining <= 0) break;\n if (section.content.length <= remaining) {\n result.push(section.content);\n remaining -= section.content.length;\n } else {\n // Truncate the last section that fits partially\n const truncated = section.content.slice(0, remaining - 30) + \"\\n\\n_(truncated)_\";\n result.push(truncated);\n remaining = 0;\n }\n }\n\n return result;\n}\n\n/**\n * Resolves team workspace files for the current session and returns them\n * as a prepend context string for the system prompt.\n *\n * Budget-capped at ~15KB to avoid context explosion. Priority order:\n * 1. AGENTS.md (SOPs) — highest priority\n * 2. MEMORY.md (team knowledge)\n * 3. Skills (*.md)\n * 4. Tools (*.yaml) — lowest priority\n *\n * Called from the `before_prompt_build` plugin hook.\n */\nexport async function handleTeamBootstrap(\n _event: { prompt: string; messages: unknown[] },\n ctx: { sessionKey?: string },\n): Promise<{ prependContext?: string } | void> {\n const sessionKey = ctx.sessionKey;\n if (!sessionKey) return;\n\n // Resolve workspace for this session\n const cfg = await loadConfig();\n const { store } = await loadCombinedSessionStoreForGateway(cfg);\n const sessionEntry = store[sessionKey];\n const workspaceId = sessionEntry?.workspaceId;\n if (!workspaceId) return;\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace || workspace.type !== \"team\") return;\n\n const sections: PrioritizedSection[] = [];\n\n // Priority 0: AGENTS.md (SOPs) — most important\n const agentsMd = await safeReadText(path.join(workspace.path, \"AGENTS.md\"), MAX_SINGLE_FILE);\n if (agentsMd) {\n sections.push({\n label: \"SOPs\",\n content: `## Team SOPs (${workspace.name})\\n\\n${agentsMd}`,\n priority: 0,\n });\n }\n\n // Priority 1: MEMORY.md (team knowledge)\n const memoryMd = await safeReadText(path.join(workspace.path, \"memory\", \"MEMORY.md\"), MAX_SINGLE_FILE);\n if (memoryMd) {\n sections.push({\n label: \"Memory\",\n content: `## Team Memory (${workspace.name})\\n\\n${memoryMd}`,\n priority: 1,\n });\n }\n\n // Priority 2: Skills\n const skills = await loadGlobFiles(path.join(workspace.path, \"skills\"), \"*.md\");\n for (const skill of skills) {\n sections.push({\n label: `Skill: ${skill.name}`,\n content: `## Team Skill: ${skill.name} (${workspace.name})\\n\\n${skill.content}`,\n priority: 2,\n });\n }\n\n // Priority 3: Tools\n const tools = await loadGlobFiles(path.join(workspace.path, \"tools\"), \"*.yaml\");\n for (const tool of tools) {\n sections.push({\n label: `Tool: ${tool.name}`,\n content: `## Team Tool: ${tool.name} (${workspace.name})\\n\\n\\`\\`\\`yaml\\n${tool.content}\\n\\`\\`\\``,\n priority: 3,\n });\n }\n\n if (sections.length === 0) return;\n\n const header = `# Team Workspace: ${workspace.name}\\n\\nYou are working in the \"${workspace.name}\" team workspace. The following shared context has been loaded from the team repository.\\n\\n`;\n const fitted = fitToBudget(sections, CONTEXT_BUDGET - header.length);\n\n if (fitted.length === 0) return;\n\n return {\n prependContext: header + fitted.join(\"\\n\\n---\\n\\n\"),\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n loadCombinedSessionStoreForGateway,\n loadConfig,\n} from \"../lib/workspace-session-store.js\";\nimport { getWorkspaceSyncService } from \"../lib/workspace-sync-service.js\";\nimport { findWorkspaceById, readWorkspaceConfig } from \"../lib/workspaces-config.js\";\n\n/**\n * Hook for `before_reset` — when a session ends or resets, write a memory\n * entry to the team workspace if the session belongs to one.\n *\n * Instead of building a naive text summary, we write a lightweight index\n * entry referencing the full session file. Curation can later read the\n * session logs if it needs the full content.\n */\nexport async function handleTeamMemoryRoute(\n event: { sessionFile?: string; messages?: unknown[]; reason?: string },\n ctx: { sessionKey?: string; agentId?: string },\n): Promise<void> {\n const sessionKey = ctx.sessionKey;\n if (!sessionKey) return;\n\n const cfg = await loadConfig();\n const { store } = await loadCombinedSessionStoreForGateway(cfg);\n const sessionEntry = store[sessionKey];\n const workspaceId = sessionEntry?.workspaceId;\n if (!workspaceId) return;\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace || workspace.type !== \"team\") return;\n\n const entry = buildSessionEntry(event, ctx, sessionEntry.displayName);\n if (!entry) return;\n\n const now = new Date();\n const dateStr = now.toISOString().slice(0, 10);\n const timeStr = now.toISOString().slice(11, 19).replace(/:/g, \"\");\n const fileName = `${dateStr}-${timeStr}-session.md`;\n const memoryDir = path.join(workspace.path, \"memory\");\n\n try {\n await fs.mkdir(memoryDir, { recursive: true });\n await fs.writeFile(path.join(memoryDir, fileName), entry, \"utf-8\");\n } catch {\n // Non-fatal — don't break session reset\n return;\n }\n\n // Push immediately so other team members see the memory\n try {\n const syncService = getWorkspaceSyncService();\n await syncService.pushNow(workspace.id);\n } catch {\n // Non-fatal\n }\n}\n\nfunction buildSessionEntry(\n event: { sessionFile?: string; messages?: unknown[]; reason?: string },\n ctx: { sessionKey?: string; agentId?: string },\n sessionTitle?: string,\n): string | null {\n const title = sessionTitle || \"Session\";\n const now = new Date().toISOString();\n const lines: string[] = [`# ${title}`, \"\", `_Captured: ${now}_`];\n\n if (ctx.agentId) {\n lines.push(`_Agent: ${ctx.agentId}_`);\n }\n if (event.reason) {\n lines.push(`_Reason: ${event.reason}_`);\n }\n\n // Reference the session file for full context (avoids duplicating large content)\n if (event.sessionFile) {\n lines.push(\"\", `**Session log**: \\`${event.sessionFile}\\``);\n }\n\n // Extract a concise topic line from the first user message (if available)\n const topic = extractFirstUserTopic(event.messages);\n if (topic) {\n lines.push(\"\", `**Topic**: ${topic}`);\n }\n\n // Only produce an entry if there's meaningful content\n if (!event.sessionFile && !topic) return null;\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction extractFirstUserTopic(messages: unknown[] | undefined): string | null {\n if (!messages || messages.length === 0) return null;\n\n for (const msg of messages) {\n if (!msg || typeof msg !== \"object\") continue;\n const m = msg as Record<string, unknown>;\n if (m.role !== \"user\") continue;\n const content = typeof m.content === \"string\" ? m.content.trim() : \"\";\n if (!content) continue;\n // Take just the first line, capped at 200 chars\n const firstLine = content.split(\"\\n\")[0].slice(0, 200);\n return firstLine;\n }\n\n return null;\n}\n","/**\n * GodMode Plugin — Personal AI Operating System\n *\n * Registers all GodMode gateway methods, UI routes, and services\n * into the OpenClaw plugin system.\n *\n * IMPORTANT: register() is intentionally SYNCHRONOUS so the plugin loader\n * can't silently drop it. License validation is deferred to first RPC call\n * via a license gate wrapper.\n */\n\nimport { createReadStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport {\n request as httpRequest,\n type IncomingHttpHeaders,\n type IncomingMessage,\n type OutgoingHttpHeaders,\n type ServerResponse,\n} from \"node:http\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\n// Method handler imports\nimport { agentLogHandlers } from \"./src/methods/agent-log.js\";\nimport { briefNotesHandlers } from \"./src/methods/brief-notes.js\";\nimport { calendarHandlers } from \"./src/methods/calendar.js\";\nimport { clickupHandlers } from \"./src/methods/clickup.js\";\nimport { consciousnessHandlers } from \"./src/methods/consciousness.js\";\nimport { dailyBriefHandlers } from \"./src/methods/daily-brief.js\";\nimport { dataSourcesHandlers } from \"./src/methods/data-sources.js\";\nimport { goalsHandlers } from \"./src/methods/goals.js\";\nimport { innerWorkHandlers } from \"./src/methods/inner-work.js\";\nimport { lifeDashboardsHandlers } from \"./src/methods/life-dashboards.js\";\nimport { lifetracksHandlers } from \"./src/methods/lifetracks.js\";\nimport { onboardingHandlers } from \"./src/methods/onboarding.js\";\nimport { peopleDataHandlers } from \"./src/methods/people-data.js\";\nimport { projectsHandlers } from \"./src/methods/projects.js\";\nimport { subagentRunsHandlers } from \"./src/methods/subagent-runs.js\";\nimport { tasksHandlers } from \"./src/methods/tasks.js\";\nimport { teamCommsHandlers } from \"./src/methods/team-comms.js\";\nimport { teamCurationHandlers } from \"./src/methods/team-curation.js\";\nimport { teamWorkspaceHandlers } from \"./src/methods/team-workspace.js\";\nimport { createTeamMessageTool } from \"./src/tools/team-message.js\";\nimport { createTeamMemoryWriteTool } from \"./src/tools/team-memory.js\";\n// therapy handlers deprecated — old code, not shipping in plugin\nimport { uiSlotsHandlers } from \"./src/methods/ui-slots.js\";\nimport { workspacesHandlers } from \"./src/methods/workspaces.js\";\nimport { focusPulseHandlers } from \"./src/methods/focus-pulse.js\";\nimport { optionsHandlers } from \"./src/methods/options.js\";\nimport { initAgentLogWriter } from \"./src/services/agent-log-writer.js\";\n// Static file server for UIs\nimport { createStaticFileHandler } from \"./src/static-server.js\";\n\n// ── Version ───────────────────────────────────────────────────────────\n// Read from package.json at load time so it can't drift\nlet pluginVersion = \"1.0.0\";\ntry {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const packageJsonCandidates = [join(moduleDir, \"package.json\"), join(moduleDir, \"..\", \"package.json\")];\n for (const candidate of packageJsonCandidates) {\n if (!existsSync(candidate)) {\n continue;\n }\n const pkg = JSON.parse(readFileSync(candidate, \"utf8\"));\n pluginVersion = pkg.version ?? pluginVersion;\n break;\n }\n} catch {\n // Bundled installs may not have package.json alongside index.js\n}\n\n// ── License validation ─────────────────────────────────────────────\n// Each installation requires a valid license key in openclaw.json:\n// { \"plugins\": { \"entries\": { \"godmode\": { \"config\": { \"licenseKey\": \"GM-...\" } } } } }\n// Keys are validated lazily on first RPC call — register() stays synchronous.\n\nconst LICENSE_API_URL = \"https://lifeongodmode.com/api/v1/license/validate\";\nconst LICENSE_CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ntype LicenseState = {\n status: \"pending\" | \"validating\" | \"valid\" | \"invalid\" | \"no-key\";\n tier?: string;\n checkedAt?: number;\n error?: string;\n};\n\nlet licenseState: LicenseState = { status: \"pending\" };\nlet validationPromise: Promise<boolean> | null = null;\n\nfunction isDevKey(key: string): boolean {\n return key.startsWith(\"GM-DEV-\") || key === \"GM-INTERNAL\";\n}\n\nasync function validateLicense(\n key: string,\n logger: { warn: (msg: string) => void; info: (msg: string) => void },\n): Promise<boolean> {\n // Dev/internal keys bypass remote validation\n if (isDevKey(key)) {\n licenseState = { status: \"valid\", checkedAt: Date.now(), tier: \"developer\" };\n return true;\n }\n\n // Check cache\n if (\n licenseState.status === \"valid\" &&\n licenseState.checkedAt &&\n Date.now() - licenseState.checkedAt < LICENSE_CACHE_TTL_MS\n ) {\n return true;\n }\n\n licenseState = { ...licenseState, status: \"validating\" };\n\n try {\n const res = await fetch(LICENSE_API_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ key }),\n signal: AbortSignal.timeout(5000),\n });\n if (res.ok) {\n const body = (await res.json()) as { valid: boolean; tier?: string };\n if (body.valid) {\n licenseState = { status: \"valid\", checkedAt: Date.now(), tier: body.tier };\n logger.info(`[GodMode] License validated (tier: ${body.tier ?? \"standard\"})`);\n return true;\n }\n licenseState = {\n status: \"invalid\",\n checkedAt: Date.now(),\n error: \"License key rejected by server\",\n };\n return false;\n }\n // Non-OK response\n licenseState = {\n status: \"invalid\",\n checkedAt: Date.now(),\n error: `License server returned ${res.status}`,\n };\n return false;\n } catch (err) {\n // Network error — allow grace period if previously validated\n if (licenseState.checkedAt && licenseState.tier) {\n logger.warn(\"[GodMode] License server unreachable — using cached validation\");\n licenseState = {\n status: \"valid\",\n checkedAt: licenseState.checkedAt,\n tier: licenseState.tier,\n };\n return true;\n }\n licenseState = {\n status: \"invalid\",\n checkedAt: Date.now(),\n error: `Network error: ${err instanceof Error ? err.message : \"unknown\"}`,\n };\n return false;\n }\n}\n\n/**\n * Wraps an RPC handler with a license gate. On first call, triggers async\n * license validation. Subsequent calls use cached result. If license is\n * invalid, responds with LICENSE_REQUIRED error.\n */\nfunction withLicenseGate(\n key: string | undefined,\n logger: { warn: (msg: string) => void; info: (msg: string) => void },\n handler: Function,\n): Function {\n return async (ctx: { respond: Function; [k: string]: unknown }) => {\n // No key configured\n if (!key) {\n ctx.respond(false, undefined, {\n code: \"LICENSE_REQUIRED\",\n message:\n \"GodMode license key not configured. Add licenseKey to your plugin config in openclaw.json.\",\n });\n return;\n }\n\n // Dev keys pass through immediately\n if (isDevKey(key)) {\n if (licenseState.status === \"pending\") {\n licenseState = { status: \"valid\", checkedAt: Date.now(), tier: \"developer\" };\n }\n return handler(ctx);\n }\n\n // First caller triggers validation; concurrent callers wait on same promise\n if (licenseState.status === \"pending\" || licenseState.status === \"validating\") {\n if (!validationPromise) {\n validationPromise = validateLicense(key, logger).finally(() => {\n validationPromise = null;\n });\n }\n await validationPromise;\n }\n\n // Re-validate if cache expired\n if (\n licenseState.status === \"valid\" &&\n licenseState.checkedAt &&\n Date.now() - licenseState.checkedAt >= LICENSE_CACHE_TTL_MS\n ) {\n if (!validationPromise) {\n validationPromise = validateLicense(key, logger).finally(() => {\n validationPromise = null;\n });\n }\n await validationPromise;\n }\n\n if (licenseState.status !== \"valid\") {\n ctx.respond(false, undefined, {\n code: \"LICENSE_INVALID\",\n message: licenseState.error ?? \"GodMode license is invalid or expired.\",\n });\n return;\n }\n\n return handler(ctx);\n };\n}\n\nconst OPS_PROXY_PREFIX = \"/ops\";\nconst OPS_PROXY_HOST = \"127.0.0.1\";\nconst OPS_PROXY_PORT = 3456;\nconst OPS_PROXY_ORIGIN = `http://${OPS_PROXY_HOST}:${OPS_PROXY_PORT}`;\n\nfunction isOpsPath(pathname: string): boolean {\n return pathname === OPS_PROXY_PREFIX || pathname.startsWith(`${OPS_PROXY_PREFIX}/`);\n}\n\nfunction requestPathname(url: string): string {\n try {\n return new URL(url, \"http://localhost\").pathname;\n } catch {\n const [pathname] = url.split(\"?\", 1);\n return pathname || \"/\";\n }\n}\n\nfunction stripOpsPrefix(pathname: string): string {\n if (pathname === OPS_PROXY_PREFIX || pathname === `${OPS_PROXY_PREFIX}/`) {\n return \"/\";\n }\n const stripped = pathname.slice(OPS_PROXY_PREFIX.length);\n return stripped.startsWith(\"/\") ? stripped : `/${stripped}`;\n}\n\nfunction firstHeaderValue(value: string | string[] | undefined): string | undefined {\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction appendForwardedFor(\n existing: string | string[] | undefined,\n remoteAddress?: string | null,\n): string | undefined {\n const prior = Array.isArray(existing) ? existing.join(\", \") : existing;\n if (remoteAddress && prior) {\n return `${prior}, ${remoteAddress}`;\n }\n return remoteAddress ?? prior;\n}\n\nfunction isApiPath(pathname: string): boolean {\n return pathname === \"/api\" || pathname.startsWith(\"/api/\");\n}\n\nfunction isOpsReferer(referer: string): boolean {\n try {\n return isOpsPath(new URL(referer, \"http://localhost\").pathname);\n } catch {\n return referer === OPS_PROXY_PREFIX || referer.startsWith(`${OPS_PROXY_PREFIX}/`);\n }\n}\n\nfunction shouldProxyOpsApiRequest(req: IncomingMessage, pathname: string): boolean {\n if (!isApiPath(pathname)) {\n return false;\n }\n const referer = firstHeaderValue(req.headers.referer);\n if (!referer) {\n return false;\n }\n return isOpsReferer(referer);\n}\n\nfunction rewriteOpsLocationHeader(location: string): string {\n if (location.startsWith(`${OPS_PROXY_PREFIX}/`) || location === OPS_PROXY_PREFIX) {\n return location;\n }\n\n if (location.startsWith(\"/\")) {\n return `${OPS_PROXY_PREFIX}${location}`;\n }\n\n try {\n const parsed = new URL(location);\n if (parsed.origin === OPS_PROXY_ORIGIN) {\n return `${OPS_PROXY_PREFIX}${parsed.pathname}${parsed.search}${parsed.hash}`;\n }\n } catch {\n // Non-URL location header; forward as-is.\n }\n\n return location;\n}\n\nfunction buildOpsProxyHeaders(req: IncomingMessage): OutgoingHttpHeaders {\n const headers: OutgoingHttpHeaders = { ...req.headers };\n headers.host = `${OPS_PROXY_HOST}:${OPS_PROXY_PORT}`;\n headers[\"x-forwarded-prefix\"] = OPS_PROXY_PREFIX;\n\n const forwardedHost = firstHeaderValue(req.headers.host);\n if (forwardedHost) {\n headers[\"x-forwarded-host\"] = forwardedHost;\n }\n headers[\"x-forwarded-proto\"] = firstHeaderValue(req.headers[\"x-forwarded-proto\"]) ?? \"http\";\n\n const forwardedFor = appendForwardedFor(req.headers[\"x-forwarded-for\"], req.socket.remoteAddress);\n if (forwardedFor) {\n headers[\"x-forwarded-for\"] = forwardedFor;\n }\n\n return headers;\n}\n\nfunction rewriteOpsResponseHeaders(proxyHeaders: IncomingHttpHeaders): OutgoingHttpHeaders {\n const headers: OutgoingHttpHeaders = { ...proxyHeaders };\n const location = proxyHeaders.location;\n if (typeof location === \"string\") {\n headers.location = rewriteOpsLocationHeader(location);\n }\n return headers;\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n}\n\nfunction renderOpsUnavailablePage(errorDetail?: string): string {\n const detail = errorDetail\n ? `<p><strong>Connection error:</strong> <code>${escapeHtml(errorDetail)}</code></p>`\n : \"\";\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\" />\n<title>Mission Control sidecar unavailable</title>\n<style>\nbody{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;max-width:760px;margin:56px auto;padding:0 24px;color:#e5e7eb;background:#0b1220}\nh1{font-size:28px;margin:0 0 16px}\np{line-height:1.5;color:#cbd5e1}\ncode{background:#16213e;color:#a5f3fc;padding:2px 6px;border-radius:6px}\npre{background:#111827;color:#d1fae5;padding:12px;border-radius:10px;overflow:auto}\na{color:#67e8f9}\n</style>\n</head>\n<body>\n<h1>Mission Control sidecar is not running</h1>\n<p>The Mission tab proxies <code>/ops</code> to <code>${OPS_PROXY_ORIGIN}</code>. Start the dashboard sidecar, then reload this page.</p>\n${detail}\n<p>Start command:</p>\n<pre>~/Projects/GodMode/scripts/start-ops-dashboard.sh</pre>\n<p>If the dashboard is already running, verify it is reachable at <a href=\"${OPS_PROXY_ORIGIN}\" target=\"_blank\" rel=\"noreferrer\">${OPS_PROXY_ORIGIN}</a>.</p>\n</body>\n</html>`;\n}\n\nasync function proxyOpsRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const rawUrl = req.url ?? OPS_PROXY_PREFIX;\n const requestUrl = (() => {\n try {\n return new URL(rawUrl, \"http://localhost\");\n } catch {\n return new URL(OPS_PROXY_PREFIX, \"http://localhost\");\n }\n })();\n const targetPath = isOpsPath(requestUrl.pathname)\n ? `${stripOpsPrefix(requestUrl.pathname)}${requestUrl.search}`\n : `${requestUrl.pathname}${requestUrl.search}`;\n const headers = buildOpsProxyHeaders(req);\n const method = req.method ?? \"GET\";\n\n await new Promise<void>((resolvePromise) => {\n let settled = false;\n const settle = () => {\n if (settled) {\n return;\n }\n settled = true;\n resolvePromise();\n };\n\n const proxyReq = httpRequest(\n {\n protocol: \"http:\",\n hostname: OPS_PROXY_HOST,\n port: OPS_PROXY_PORT,\n method,\n path: targetPath,\n headers,\n },\n (proxyRes) => {\n const responseHeaders = rewriteOpsResponseHeaders(proxyRes.headers);\n res.writeHead(proxyRes.statusCode ?? 502, responseHeaders);\n proxyRes.pipe(res);\n proxyRes.on(\"end\", settle);\n proxyRes.on(\"error\", settle);\n },\n );\n\n proxyReq.setTimeout(15_000, () => {\n proxyReq.destroy(new Error(\"Timed out connecting to Mission Control sidecar\"));\n });\n\n proxyReq.on(\"error\", (err) => {\n if (!res.headersSent) {\n const code = (err as NodeJS.ErrnoException).code;\n const unavailable =\n code === \"ECONNREFUSED\" ||\n code === \"ECONNRESET\" ||\n code === \"ENOTFOUND\" ||\n code === \"EHOSTUNREACH\";\n if (unavailable) {\n res.writeHead(503, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(renderOpsUnavailablePage(err.message));\n } else {\n res.writeHead(502, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(`Mission Control proxy error: ${err.message}`);\n }\n }\n settle();\n });\n\n req.on(\"aborted\", () => {\n proxyReq.destroy();\n settle();\n });\n\n req.pipe(proxyReq);\n });\n}\n\n// ── Plugin definition ──────────────────────────────────────────────\n\nconst godmodePlugin = {\n id: \"godmode\",\n name: \"GodMode\",\n description: \"Personal AI Operating System for entrepreneurs\",\n\n // SYNCHRONOUS register — no async, no race condition\n register(api: OpenClawPluginApi) {\n const licenseKey = (api.pluginConfig as { licenseKey?: string } | undefined)?.licenseKey;\n\n if (!licenseKey) {\n licenseState = { status: \"no-key\" };\n api.logger.warn(\"[GodMode] No license key configured.\");\n api.logger.warn(\"[GodMode] Add to openclaw.json: plugins.entries.godmode.config.licenseKey\");\n // Continue registering — methods will return LICENSE_REQUIRED errors\n } else if (isDevKey(licenseKey)) {\n licenseState = { status: \"valid\", checkedAt: Date.now(), tier: \"developer\" };\n api.logger.info(`[GodMode] License validated (tier: developer)`);\n } else {\n // Kick off background validation — don't await\n licenseState = { status: \"pending\" };\n validateLicense(licenseKey, api.logger).catch(() => {});\n api.logger.info(\"[GodMode] License validation started (will complete on first RPC call)\");\n }\n\n // ── 1. Register all gateway RPC methods (license-gated) ───────\n\n const allHandlers: Record<string, unknown> = {\n ...projectsHandlers,\n ...tasksHandlers,\n ...workspacesHandlers,\n ...dailyBriefHandlers,\n ...lifeDashboardsHandlers,\n ...lifetracksHandlers,\n ...innerWorkHandlers,\n ...goalsHandlers,\n ...peopleDataHandlers,\n ...dataSourcesHandlers,\n ...agentLogHandlers,\n ...briefNotesHandlers,\n ...clickupHandlers,\n ...calendarHandlers,\n ...subagentRunsHandlers,\n ...uiSlotsHandlers,\n ...onboardingHandlers,\n ...consciousnessHandlers,\n ...teamWorkspaceHandlers,\n ...teamCommsHandlers,\n ...teamCurationHandlers,\n ...focusPulseHandlers,\n ...optionsHandlers,\n };\n\n for (const [method, handler] of Object.entries(allHandlers)) {\n const gated = withLicenseGate(licenseKey, api.logger, handler as Function);\n api.registerGatewayMethod(method, gated as Parameters<typeof api.registerGatewayMethod>[1]);\n }\n\n api.logger.info(\n `[GodMode] Registered ${Object.keys(allHandlers).length} gateway methods (plugin v${pluginVersion})`,\n );\n\n // ── 2. Resolve UI asset paths ─────────────────────────────────\n const sourceDir = dirname(api.source);\n const pluginRoot = basename(sourceDir) === \"dist\" ? resolve(sourceDir, \"..\") : sourceDir;\n const monorepoRoot = resolve(pluginRoot, \"../..\");\n\n const godmodeUiCandidates = [\n join(pluginRoot, \"dist\", \"godmode-ui\"),\n join(pluginRoot, \"godmode-ui\", \"dist\"),\n join(pluginRoot, \"assets\", \"godmode-ui\"),\n join(monorepoRoot, \"dist\", \"control-ui\"),\n ];\n const godmodeUiRoot = godmodeUiCandidates.find((p) => {\n const index = join(p, \"index.html\");\n if (!existsSync(index)) {\n return false;\n }\n try {\n const html = readFileSync(index, \"utf8\");\n return /<godmode-app\\b/i.test(html);\n } catch {\n return false;\n }\n });\n\n const deckUiCandidates = [\n join(pluginRoot, \"dist\", \"deck\"),\n join(pluginRoot, \"assets\", \"deck\"),\n join(pluginRoot, \"deck\", \"dist\"),\n join(pluginRoot, \"..\", \"openclaw-deck\", \"dist\"),\n join(pluginRoot, \"..\", \"GodMode\", \"dist\", \"deck\"),\n join(monorepoRoot, \"dist\", \"deck\"),\n join(monorepoRoot, \"deck\", \"dist\"),\n ];\n const deckUiRoot = deckUiCandidates.find((p) => {\n const index = join(p, \"index.html\");\n if (!existsSync(index)) {\n return false;\n }\n try {\n const html = readFileSync(index, \"utf8\");\n // Reject dev-source HTML (e.g. <script src=\"/src/main.tsx\">)\n return !/\\/src\\/main\\.[jt]sx?/.test(html);\n } catch {\n return false;\n }\n });\n\n // ── 3. Serve UIs + health endpoint via HTTP ───────────────────\n const godmodeHandler = godmodeUiRoot\n ? createStaticFileHandler(godmodeUiRoot, \"/godmode\")\n : null;\n const deckHandler = deckUiRoot ? createStaticFileHandler(deckUiRoot, \"/deck\") : null;\n\n api.registerHttpHandler(async (req, res) => {\n const url = req.url ?? \"/\";\n const pathname = requestPathname(url);\n\n // Health endpoint — always available, even without UI\n if (pathname === \"/godmode/health\" || pathname === \"/godmode/health/\") {\n const health = {\n plugin: \"godmode\",\n version: pluginVersion,\n license: {\n status: licenseState.status,\n tier: licenseState.tier ?? null,\n ...(licenseState.error ? { error: licenseState.error } : {}),\n },\n ui: godmodeUiRoot ? \"available\" : \"not-built\",\n deck: deckUiRoot ? \"available\" : \"not-built\",\n methods: Object.keys(allHandlers).length,\n };\n res.writeHead(200, { \"Content-Type\": \"application/json\", \"Cache-Control\": \"no-cache\" });\n res.end(JSON.stringify(health, null, 2));\n return true;\n }\n\n // Mission Control sidecar proxy (/ops/* -> http://127.0.0.1:3456/*)\n if (isOpsPath(pathname)) {\n await proxyOpsRequest(req, res);\n return true;\n }\n\n // Mission Control API fallback: some dashboard actions still call\n // absolute /api/* paths. Proxy those only when the request originated\n // from /ops so core gateway APIs remain untouched.\n if (shouldProxyOpsApiRequest(req, pathname)) {\n await proxyOpsRequest(req, res);\n return true;\n }\n\n // GodMode UI\n if (pathname === \"/godmode\" || pathname.startsWith(\"/godmode/\")) {\n if (godmodeHandler) {\n godmodeHandler(req, res);\n } else {\n // Serve a helpful error page instead of silent 404\n res.writeHead(503, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(`<!DOCTYPE html>\n<html><head><title>GodMode — UI Not Built</title>\n<style>body{font-family:system-ui;max-width:600px;margin:80px auto;padding:0 20px;color:#e0e0e0;background:#1a1a2e}\nh1{color:#ff6b6b}code{background:#16213e;padding:2px 8px;border-radius:4px}a{color:#4ecdc4}</style></head>\n<body><h1>GodMode UI Not Available</h1>\n<p>The GodMode plugin is loaded but the UI assets haven't been built yet.</p>\n<p>Run: <code>pnpm build</code> in the plugin repo, then restart gateway.</p>\n<p>Then restart the gateway.</p>\n<p><a href=\"/godmode/health\">Check plugin health →</a></p>\n</body></html>`);\n }\n return true;\n }\n\n // Deck UI\n if (pathname === \"/deck\" || pathname.startsWith(\"/deck/\")) {\n if (deckHandler) {\n deckHandler(req, res);\n } else {\n res.writeHead(503, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(`<!DOCTYPE html>\n<html><head><title>Deck — UI Not Built</title>\n<style>body{font-family:system-ui;max-width:600px;margin:80px auto;padding:0 20px;color:#e0e0e0;background:#1a1a2e}\nh1{color:#ff6b6b}code{background:#16213e;padding:2px 8px;border-radius:4px}a{color:#4ecdc4}</style></head>\n<body><h1>Deck UI Not Available</h1>\n<p>The GodMode plugin is loaded but Deck assets haven't been bundled yet.</p>\n<p>Run: <code>pnpm build</code> in <code>~/Projects/godmode-plugin</code>, then restart gateway.</p>\n<p><a href=\"/godmode/health\">Check plugin health →</a></p>\n</body></html>`);\n }\n return true;\n }\n\n return false;\n });\n\n if (godmodeUiRoot) {\n api.logger.info(`[GodMode] Serving UI at /godmode from ${godmodeUiRoot}`);\n } else {\n api.logger.warn(\"[GodMode] No built UI found. Run 'pnpm build' in the plugin repo.\");\n }\n\n if (deckUiRoot) {\n api.logger.info(`[GodMode] Serving Deck at /deck from ${deckUiRoot}`);\n } else {\n api.logger.warn(\"[GodMode] No built Deck found. Run 'pnpm deck:build' first.\");\n }\n\n // ── 4. Plugin status RPC (not license-gated — for diagnostics) ─\n const methodCount = Object.keys(allHandlers).length;\n api.registerGatewayMethod(\"godmode.status\", (async ({ respond }: { respond: Function }) => {\n respond(true, {\n plugin: true,\n version: pluginVersion,\n license: {\n status: licenseState.status,\n tier: licenseState.tier ?? null,\n configured: !!licenseKey,\n },\n methods: methodCount + 1,\n ui: godmodeUiRoot ? \"available\" : \"not built\",\n deck: deckUiRoot ? \"available\" : \"not built\",\n source: \"plugin\",\n });\n }) as Parameters<typeof api.registerGatewayMethod>[1]);\n\n // ── 5. Lifecycle hooks ────────────────────────────────────────\n api.on(\"gateway_start\", async () => {\n api.logger.info(\"[GodMode] Gateway started — plugin active\");\n\n // Agent log writer\n try {\n const started = await initAgentLogWriter();\n if (started) {\n api.logger.info(\"[GodMode] agent-log writer initialized\");\n } else {\n api.logger.warn(\"[GodMode] agent-log writer unavailable in this runtime\");\n }\n } catch (err) {\n api.logger.warn(`[GodMode] agent-log writer failed to initialize: ${String(err)}`);\n }\n\n // Curation agent service\n try {\n const { getCurationAgentService } = await import(\"./src/services/curation-agent.js\");\n const curation = getCurationAgentService(api.logger);\n await curation.start();\n } catch (err) {\n api.logger.warn(`[GodMode] curation service failed to start: ${String(err)}`);\n }\n });\n\n api.on(\"gateway_stop\", async () => {\n try {\n const { getCurationAgentService } = await import(\"./src/services/curation-agent.js\");\n getCurationAgentService().stop();\n } catch {\n // Non-fatal\n }\n });\n\n // Team workspace bootstrap — inject team files into agent system prompt\n api.on(\"before_prompt_build\", async (event, ctx) => {\n try {\n const { handleTeamBootstrap } = await import(\"./src/hooks/team-bootstrap.js\");\n return await handleTeamBootstrap(event, ctx);\n } catch (err) {\n api.logger.warn(`[GodMode] team bootstrap hook error: ${String(err)}`);\n }\n });\n\n // Team memory routing — write session memory to team workspace on reset\n api.on(\"before_reset\", async (event, ctx) => {\n try {\n const { handleTeamMemoryRoute } = await import(\"./src/hooks/team-memory-route.js\");\n await handleTeamMemoryRoute(event, ctx);\n } catch (err) {\n api.logger.warn(`[GodMode] team memory route hook error: ${String(err)}`);\n }\n });\n\n // Team tools — message + memory write\n api.registerTool((ctx) => createTeamMessageTool(ctx));\n api.registerTool((ctx) => createTeamMemoryWriteTool(ctx));\n\n // ── 6. Register CLI commands ──────────────────────────────────\n api.registerCli(\n ({ program }) => {\n const godmode = program.command(\"godmode\").description(\"GodMode commands\");\n\n godmode\n .command(\"status\")\n .description(\"Show GodMode plugin status\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts: { json?: boolean }) => {\n const status = {\n plugin: \"godmode\",\n version: pluginVersion,\n license: {\n status: licenseState.status,\n tier: licenseState.tier ?? \"none\",\n configured: !!licenseKey,\n },\n methods: methodCount,\n ui: godmodeUiRoot ? \"available\" : \"not built\",\n deck: deckUiRoot ? \"available\" : \"not built\",\n };\n\n if (opts.json) {\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n console.log(\"GodMode Plugin Status\");\n console.log(\"─\".repeat(40));\n console.log(` Version: ${status.version}`);\n console.log(` License: ${status.license.status} (${status.license.tier})`);\n console.log(` Methods: ${status.methods}`);\n console.log(` UI: ${status.ui}`);\n console.log(` Deck: ${status.deck}`);\n });\n\n godmode\n .command(\"activate <key>\")\n .description(\"Activate GodMode with your license key\")\n .action(async (key: string) => {\n if (!key || (!key.startsWith(\"GM-\") && key !== \"GM-INTERNAL\")) {\n console.error(\n \"\\x1b[31mInvalid license key.\\x1b[0m Keys start with GM-PROD-, GM-DEV-, or GM-INTERNAL.\",\n );\n process.exit(1);\n }\n\n // Resolve config path\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n const stateDir = process.env.OPENCLAW_STATE_DIR || join(homeDir, \".openclaw\");\n const configPath = process.env.OPENCLAW_CONFIG_PATH || join(stateDir, \"openclaw.json\");\n\n let config: Record<string, unknown> = {};\n try {\n if (existsSync(configPath)) {\n config = JSON.parse(readFileSync(configPath, \"utf8\"));\n }\n } catch {\n console.warn(`Could not parse ${configPath} — will create a fresh config.`);\n }\n\n // Deep-merge into plugins.entries.godmode\n const plugins = (config.plugins ?? {}) as Record<string, unknown>;\n const entries = (plugins.entries ?? {}) as Record<string, unknown>;\n const godmodeEntry = (entries.godmode ?? {}) as Record<string, unknown>;\n const godmodeConfig = (godmodeEntry.config ?? {}) as Record<string, unknown>;\n\n godmodeConfig.licenseKey = key;\n godmodeEntry.enabled = true;\n godmodeEntry.config = godmodeConfig;\n entries.godmode = godmodeEntry;\n plugins.entries = entries;\n config.plugins = plugins;\n\n const { writeFileSync, mkdirSync } = await import(\"node:fs\");\n mkdirSync(dirname(configPath), { recursive: true });\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n\n console.log(`\\n\\x1b[32m✓\\x1b[0m License key saved to ${configPath}`);\n console.log(`\\x1b[32m✓\\x1b[0m GodMode plugin enabled\\n`);\n console.log(\"Next steps:\");\n console.log(\" 1. Start the gateway: \\x1b[36mopenclaw gateway run\\x1b[0m\");\n console.log(\" 2. Open GodMode: \\x1b[36mhttp://localhost:18789/godmode\\x1b[0m\");\n console.log(\" 3. Check health: \\x1b[36mopenclaw godmode doctor\\x1b[0m\\n\");\n });\n\n godmode\n .command(\"doctor\")\n .description(\"Diagnose GodMode plugin health\")\n .action(async () => {\n const checks: { name: string; ok: boolean; detail: string }[] = [];\n\n // 1. License key configured\n checks.push({\n name: \"License key configured\",\n ok: !!licenseKey,\n detail: licenseKey\n ? `Key: ${licenseKey.slice(0, 6)}...`\n : \"Missing — add licenseKey to plugin config in openclaw.json\",\n });\n\n // 2. License validation\n if (licenseKey) {\n if (licenseState.status === \"pending\" || licenseState.status === \"validating\") {\n const valid = await validateLicense(licenseKey, api.logger);\n checks.push({\n name: \"License valid\",\n ok: valid,\n detail: valid\n ? `Tier: ${licenseState.tier}`\n : (licenseState.error ?? \"Validation failed\"),\n });\n } else {\n checks.push({\n name: \"License valid\",\n ok: licenseState.status === \"valid\",\n detail:\n licenseState.status === \"valid\"\n ? `Tier: ${licenseState.tier}`\n : (licenseState.error ?? `Status: ${licenseState.status}`),\n });\n }\n }\n\n // 3. UI assets\n checks.push({\n name: \"GodMode UI built\",\n ok: !!godmodeUiRoot,\n detail: godmodeUiRoot ?? \"Not found — run: pnpm build (plugin repo)\",\n });\n\n // 4. Deck assets\n checks.push({\n name: \"Deck UI built\",\n ok: !!deckUiRoot,\n detail: deckUiRoot ?? \"Not found — run: pnpm deck:build\",\n });\n\n // 5. Data directory\n const workspaceRoot =\n (api.pluginConfig as { workspaceRoot?: string } | undefined)?.workspaceRoot ??\n \"~/godmode\";\n const expandedRoot = workspaceRoot.replace(/^~/, process.env.HOME ?? \"\");\n checks.push({\n name: \"Workspace directory exists\",\n ok: existsSync(expandedRoot),\n detail: existsSync(expandedRoot) ? expandedRoot : `Missing: ${expandedRoot}`,\n });\n\n const dataDir = join(expandedRoot, \"data\");\n checks.push({\n name: \"Data directory exists\",\n ok: existsSync(dataDir),\n detail: existsSync(dataDir) ? dataDir : `Missing: ${dataDir}`,\n });\n\n // 6. Health endpoint reachable\n checks.push({\n name: \"Health endpoint registered\",\n ok: true,\n detail: \"GET /godmode/health\",\n });\n\n // 7. Gateway methods\n checks.push({\n name: \"Gateway methods registered\",\n ok: methodCount > 0,\n detail: `${methodCount} methods`,\n });\n\n // Print results\n console.log(\"\\nGodMode Doctor\");\n console.log(\"═\".repeat(50));\n let failures = 0;\n for (const check of checks) {\n const icon = check.ok ? \"✓\" : \"✗\";\n const color = check.ok ? \"\\x1b[32m\" : \"\\x1b[31m\";\n console.log(` ${color}${icon}\\x1b[0m ${check.name}`);\n if (!check.ok) {\n console.log(` → ${check.detail}`);\n failures++;\n }\n }\n console.log(\"═\".repeat(50));\n if (failures === 0) {\n console.log(\" \\x1b[32mAll checks passed.\\x1b[0m\\n\");\n } else {\n console.log(` \\x1b[31m${failures} issue(s) found.\\x1b[0m\\n`);\n }\n });\n // ── Team workspace commands ─────────────────────────────────\n const workspace = godmode.command(\"workspace\").description(\"Team workspace management\");\n\n workspace\n .command(\"create\")\n .description(\"Create a new team workspace\")\n .requiredOption(\"--name <name>\", \"Workspace name\")\n .option(\"--github <org/repo>\", \"GitHub repository (org/repo or full URL)\")\n .option(\"--branch <branch>\", \"Git branch\", \"main\")\n .action(async (opts: { name: string; github?: string; branch: string }) => {\n const { createWorkspaceId, readWorkspaceConfig, resolveGodModeRoot, writeWorkspaceConfig, ensureWorkspaceFolders } = await import(\"./src/lib/workspaces-config.js\");\n const { scaffoldTeamWorkspace, resolveGitMemberId } = await import(\"./src/lib/team-workspace-scaffold.js\");\n\n const config = await readWorkspaceConfig();\n const existingIds = new Set(config.workspaces.map((w) => w.id));\n const id = createWorkspaceId(opts.name, existingIds);\n const workspacePath = join(resolveGodModeRoot(), \"clients\", id);\n\n const memberId = await resolveGitMemberId(workspacePath).catch(() => \"local\");\n await ensureWorkspaceFolders(workspacePath, \"team\");\n await scaffoldTeamWorkspace({\n workspacePath,\n name: opts.name,\n id,\n github: opts.github,\n creatorName: memberId,\n creatorId: memberId,\n });\n\n config.workspaces.push({\n id,\n name: opts.name,\n emoji: \"👥\",\n type: \"team\",\n path: workspacePath,\n keywords: [id, opts.name.toLowerCase()],\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\", \"artifacts\"],\n sync: {\n type: \"git\",\n remote: opts.github ? \"origin\" : undefined,\n branch: opts.branch,\n autoPull: { enabled: true, interval: \"30s\" },\n autoPush: { enabled: true, debounceMs: 5000 },\n },\n team: { github: opts.github, role: \"admin\", memberId },\n curation: { enabled: true },\n });\n await writeWorkspaceConfig(config);\n\n console.log(`\\x1b[32m✓\\x1b[0m Created team workspace: ${opts.name} (${id})`);\n console.log(` Path: ${workspacePath}`);\n if (opts.github) {\n console.log(` GitHub: ${opts.github}`);\n }\n });\n\n workspace\n .command(\"join <url>\")\n .description(\"Join an existing team workspace via GitHub URL\")\n .option(\"--branch <branch>\", \"Git branch\", \"main\")\n .action(async (url: string, opts: { branch: string }) => {\n console.log(`Joining team workspace from: ${url}`);\n console.log(`Use the gateway RPC method 'workspace.joinTeam' for full clone + setup.`);\n console.log(` openclaw rpc workspace.joinTeam '{\"github\":\"${url}\",\"branch\":\"${opts.branch}\"}'`);\n });\n\n workspace\n .command(\"sync [id]\")\n .description(\"Trigger immediate sync for a workspace\")\n .action(async (id?: string) => {\n if (!id) {\n console.error(\"Usage: openclaw godmode workspace sync <workspace-id>\");\n return;\n }\n console.log(`Triggering sync for workspace: ${id}`);\n console.log(`Use gateway RPC: openclaw rpc workspace.syncNow '{\"workspaceId\":\"${id}\"}'`);\n });\n\n workspace\n .command(\"list\")\n .description(\"List all team workspaces\")\n .action(async () => {\n const { readWorkspaceConfig, toDisplayPath } = await import(\"./src/lib/workspaces-config.js\");\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const teams = config.workspaces.filter((w) => w.type === \"team\");\n if (teams.length === 0) {\n console.log(\"No team workspaces configured.\");\n return;\n }\n console.log(`\\nTeam Workspaces (${teams.length}):`);\n console.log(\"─\".repeat(50));\n for (const w of teams) {\n const sync = w.sync ? \"git-synced\" : \"local\";\n const github = w.team?.github ? ` (${w.team.github})` : \"\";\n console.log(` ${w.emoji} ${w.name} [${w.id}] — ${sync}${github}`);\n console.log(` ${toDisplayPath(w.path)}`);\n }\n });\n\n // ── Comms commands ───────────────────────────────────────────\n const comms = godmode.command(\"comms\").description(\"Team communication\");\n\n comms\n .command(\"send\")\n .description(\"Send a message to the team feed\")\n .requiredOption(\"--workspace <id>\", \"Workspace ID\")\n .requiredOption(\"--type <type>\", \"Message type (handoff/question/alert/blocked/fyi)\")\n .requiredOption(\"--msg <message>\", \"Message body\")\n .option(\"--to <recipient>\", \"Optional recipient\")\n .action(async (opts: { workspace: string; type: string; msg: string; to?: string }) => {\n const { createFeedMessage, appendFeedMessage, resolveFeedPath } = await import(\"./src/lib/team-feed.js\");\n const { findWorkspaceById, readWorkspaceConfig } = await import(\"./src/lib/workspaces-config.js\");\n const { resolveGitMemberId } = await import(\"./src/lib/team-workspace-scaffold.js\");\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, opts.workspace);\n if (!workspace) {\n console.error(`Workspace not found: ${opts.workspace}`);\n process.exit(1);\n }\n\n const memberId = workspace.team?.memberId || await resolveGitMemberId(workspace.path);\n const feedPath = resolveFeedPath(workspace.path);\n const message = createFeedMessage({\n from: memberId,\n type: opts.type as \"fyi\",\n msg: opts.msg,\n to: opts.to,\n });\n\n await appendFeedMessage(feedPath, message);\n console.log(`\\x1b[32m✓\\x1b[0m Message sent (${message.id}): [${opts.type}] ${opts.msg}`);\n });\n\n comms\n .command(\"feed\")\n .description(\"Read recent messages from the team feed\")\n .requiredOption(\"--workspace <id>\", \"Workspace ID\")\n .option(\"--since <date>\", \"Show messages since ISO date\")\n .option(\"--limit <n>\", \"Max messages to show\", \"20\")\n .action(async (opts: { workspace: string; since?: string; limit: string }) => {\n const { readFeed, resolveFeedPath } = await import(\"./src/lib/team-feed.js\");\n const { findWorkspaceById, readWorkspaceConfig } = await import(\"./src/lib/workspaces-config.js\");\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, opts.workspace);\n if (!workspace) {\n console.error(`Workspace not found: ${opts.workspace}`);\n process.exit(1);\n }\n\n const feedPath = resolveFeedPath(workspace.path);\n const messages = await readFeed(feedPath, {\n since: opts.since,\n limit: Number(opts.limit) || 20,\n });\n\n if (messages.length === 0) {\n console.log(\"No messages.\");\n return;\n }\n\n console.log(`\\nFeed (${messages.length} messages):`);\n console.log(\"─\".repeat(60));\n for (const m of messages) {\n const to = m.to ? ` → ${m.to}` : \"\";\n console.log(` [${m.type}] ${m.from}${to}: ${m.msg}`);\n console.log(` ${m.ts} (${m.id})`);\n }\n });\n\n // ── Curation commands ────────────────────────────────────────\n const curation = godmode.command(\"curation\").description(\"Workspace memory curation\");\n\n curation\n .command(\"run\")\n .description(\"Manually trigger curation for a workspace\")\n .requiredOption(\"--workspace <id>\", \"Workspace ID\")\n .action(async (opts: { workspace: string }) => {\n const { getCurationAgentService } = await import(\"./src/services/curation-agent.js\");\n const service = getCurationAgentService();\n const result = await service.runCuration(opts.workspace);\n if (result.ok) {\n console.log(`\\x1b[32m✓\\x1b[0m Curation completed for ${opts.workspace}`);\n } else {\n console.error(`\\x1b[31m✗\\x1b[0m Curation failed: ${result.error}`);\n }\n });\n\n curation\n .command(\"candidates\")\n .description(\"Show SOP candidates for a workspace\")\n .requiredOption(\"--workspace <id>\", \"Workspace ID\")\n .action(async (opts: { workspace: string }) => {\n const { findWorkspaceById, readWorkspaceConfig } = await import(\"./src/lib/workspaces-config.js\");\n const fsp = await import(\"node:fs/promises\");\n const pathMod = await import(\"node:path\");\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, opts.workspace);\n if (!workspace) {\n console.error(`Workspace not found: ${opts.workspace}`);\n process.exit(1);\n }\n\n try {\n const content = await fsp.readFile(\n pathMod.join(workspace.path, \"memory\", \"sop-candidates.md\"),\n \"utf-8\",\n );\n console.log(content);\n } catch {\n console.log(\"No SOP candidates yet.\");\n }\n });\n },\n { commands: [\"godmode\"] },\n );\n },\n};\n\nexport default godmodePlugin;\n","/**\n * Agent Log gateway handlers.\n *\n * Self-contained plugin implementation (no core server-method imports).\n */\n\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n readDailyLog,\n appendEntry,\n getActiveRuns,\n resolveReviewItem,\n resolveQueueItem,\n type AppendCategory,\n} from \"../lib/agent-log.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst AGENT_DAY_CANDIDATES = [\n path.join(os.homedir(), \"godmode\", \"memory\", \"AGENT-DAY.md\"),\n path.join(os.homedir(), \"godmode\", \"AGENT-DAY.md\"),\n];\n\nconst VALID_CATEGORIES = new Set<AppendCategory>([\n \"review\",\n \"completed\",\n \"queue\",\n \"note\",\n \"activity\",\n]);\n\nfunction todayDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\nasync function readLegacyAgentDay(): Promise<{\n content: string;\n updatedAt: string;\n sourcePath: string;\n} | null> {\n for (const candidate of AGENT_DAY_CANDIDATES) {\n try {\n const stat = await fsp.stat(candidate);\n const content = await fsp.readFile(candidate, \"utf-8\");\n if (!content.trim()) {\n continue;\n }\n\n const home = os.homedir();\n const displayPath = candidate.startsWith(home) ? \"~\" + candidate.slice(home.length) : candidate;\n return {\n content,\n updatedAt: new Date(stat.mtimeMs).toISOString(),\n sourcePath: displayPath,\n };\n } catch {\n continue;\n }\n }\n return null;\n}\n\nexport const agentLogHandlers: GatewayRequestHandlers = {\n \"agentLog.get\": async ({ params, respond }) => {\n const p = params as { date?: string };\n const date = typeof p.date === \"string\" && p.date.trim() ? p.date.trim() : todayDate();\n\n if (date === todayDate()) {\n const curated = await readLegacyAgentDay();\n if (curated) {\n const updatedDate = curated.updatedAt.split(\"T\")[0];\n if (updatedDate === date) {\n respond(\n true,\n {\n date,\n content: curated.content,\n updatedAt: curated.updatedAt,\n sourcePath: curated.sourcePath,\n activeRuns: getActiveRuns(),\n },\n undefined,\n );\n return;\n }\n }\n }\n\n const daily = await readDailyLog(date);\n if (daily) {\n respond(\n true,\n {\n date,\n content: daily.content,\n updatedAt: daily.updatedAt,\n sourcePath: daily.sourcePath,\n activeRuns: date === todayDate() ? getActiveRuns() : undefined,\n },\n undefined,\n );\n return;\n }\n\n respond(true, { date, content: null, updatedAt: null, sourcePath: null }, undefined);\n },\n\n \"agentLog.append\": async ({ params, respond, context }) => {\n const p = params as {\n category?: string;\n item?: string;\n text?: string;\n link?: string;\n output?: string;\n priority?: string;\n notes?: string;\n assignedTo?: string;\n blockedBy?: string;\n };\n\n const item = (p.item || p.text || \"\").trim();\n if (!item) {\n respond(false, undefined, { code: \"INVALID_REQUEST\", message: \"item (or text) is required\" });\n return;\n }\n\n const category = (\n p.category && VALID_CATEGORIES.has(p.category as AppendCategory) ? p.category : \"activity\"\n ) as AppendCategory;\n\n await appendEntry({\n category,\n item,\n link: p.link,\n output: p.output,\n priority: p.priority,\n notes: p.notes,\n assignedTo: p.assignedTo,\n blockedBy: p.blockedBy,\n });\n\n const date = todayDate();\n context.broadcast(\"agent-log:update\", { date }, { dropIfSlow: true });\n respond(true, { ok: true, date, category }, undefined);\n },\n\n \"agentLog.resolve\": async ({ params, respond, context }) => {\n const p = params as { section?: string; item?: string };\n const item = (p.item || \"\").trim();\n const section = (p.section || \"\").trim();\n\n if (!item) {\n respond(false, undefined, { code: \"INVALID_REQUEST\", message: \"item is required\" });\n return;\n }\n if (section !== \"review\" && section !== \"queue\") {\n respond(false, undefined, {\n code: \"INVALID_REQUEST\",\n message: 'section must be \"review\" or \"queue\"',\n });\n return;\n }\n\n const resolved =\n section === \"review\" ? await resolveReviewItem(item) : await resolveQueueItem(item);\n\n if (resolved) {\n const date = todayDate();\n context.broadcast(\"agent-log:update\", { date }, { dropIfSlow: true });\n respond(true, { ok: true, resolved: true }, undefined);\n return;\n }\n\n respond(true, { ok: true, resolved: false, reason: \"item not found\" }, undefined);\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst BRIEF_NOTES_FILE = join(DATA_DIR, \"brief-notes.json\");\n\ntype BriefNotesData = {\n notes: Record<string, Record<string, string>>;\n};\n\nasync function ensureDataDir(): Promise<void> {\n try {\n await mkdir(DATA_DIR, { recursive: true });\n } catch {\n // Directory already exists or creation failed\n }\n}\n\nasync function readBriefNotes(): Promise<BriefNotesData> {\n try {\n const raw = await readFile(BRIEF_NOTES_FILE, \"utf-8\");\n return JSON.parse(raw) as BriefNotesData;\n } catch {\n return { notes: {} };\n }\n}\n\nasync function writeBriefNotes(data: BriefNotesData): Promise<void> {\n await ensureDataDir();\n await writeFile(BRIEF_NOTES_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nconst getBriefNotes: GatewayRequestHandler = async ({ params, respond }) => {\n const { date } = params as { date?: string };\n if (!date || typeof date !== \"string\") {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing or invalid date parameter\" });\n return;\n }\n\n const data = await readBriefNotes();\n const notesForDate = data.notes[date] ?? {};\n respond(true, { notes: notesForDate });\n};\n\nconst updateBriefNotes: GatewayRequestHandler = async ({ params, respond }) => {\n const { date, section, text } = params as { date?: string; section?: string; text?: string };\n\n if (!date || typeof date !== \"string\") {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing or invalid date parameter\" });\n return;\n }\n\n if (!section || typeof section !== \"string\") {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing or invalid section parameter\" });\n return;\n }\n\n if (typeof text !== \"string\") {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing or invalid text parameter\" });\n return;\n }\n\n const data = await readBriefNotes();\n\n if (!data.notes[date]) {\n data.notes[date] = {};\n }\n\n if (text.trim() === \"\") {\n delete data.notes[date][section];\n } else {\n data.notes[date][section] = text;\n }\n\n await writeBriefNotes(data);\n\n const notesForDate = data.notes[date] ?? {};\n respond(true, { notes: notesForDate });\n};\n\nexport const briefNotesHandlers: GatewayRequestHandlers = {\n \"briefNotes.get\": getBriefNotes,\n \"briefNotes.update\": updateBriefNotes,\n};\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst execAsync = promisify(exec);\n\nconst GOG_ACCOUNT = process.env.GOG_CALENDAR_ACCOUNT || \"\";\nconst GOG_CLIENT = process.env.GOG_CLIENT || \"godmode\";\nconst GOG_ACCOUNT_FLAG = GOG_ACCOUNT ? `--account ${GOG_ACCOUNT}` : \"\";\n\nconst CACHE_TTL_MS = 2 * 60 * 1000;\nlet cachedEvents: { events: CalendarEvent[]; fetchedAt: number } | null = null;\n\ntype CalendarEvent = {\n id: string;\n title: string;\n startTime: number;\n endTime?: number;\n duration?: number;\n location?: string;\n description?: string;\n allDay?: boolean;\n};\n\nexport function parseGogOutput(output: string): CalendarEvent[] {\n const lines = output\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim());\n const events: CalendarEvent[] = [];\n\n for (const line of lines) {\n const parts = line.split(/\\s{2,}|\\t/).map((p) => p.trim());\n if (parts.length < 4) continue;\n\n const [id, startStr, endStr, ...titleParts] = parts;\n const title = titleParts.join(\" \");\n\n try {\n const startTime = new Date(startStr).getTime();\n const endTime = new Date(endStr).getTime();\n const duration = Math.round((endTime - startTime) / (1000 * 60));\n\n events.push({ id, title, startTime, endTime, duration });\n } catch {\n console.error(\"[Calendar] Failed to parse line:\", line);\n }\n }\n\n return events;\n}\n\nasync function fetchGogEvents(): Promise<CalendarEvent[]> {\n if (cachedEvents && Date.now() - cachedEvents.fetchedAt < CACHE_TTL_MS) {\n return cachedEvents.events;\n }\n\n const { stdout } = await execAsync(\n `gog calendar events ${GOG_ACCOUNT_FLAG} --client ${GOG_CLIENT}`,\n {\n timeout: 12_000,\n env: { ...process.env, PATH: `/opt/homebrew/bin:${process.env.PATH}` },\n },\n );\n\n const events = parseGogOutput(stdout);\n cachedEvents = { events, fetchedAt: Date.now() };\n return events;\n}\n\nconst eventsToday: GatewayRequestHandler = async ({ respond }) => {\n const now = new Date();\n\n if (!GOG_ACCOUNT) {\n console.warn(\"[Calendar] GOG_CALENDAR_ACCOUNT not set — returning empty events\");\n respond(true, {\n events: [],\n date: now.toISOString().split(\"T\")[0],\n source: \"google\",\n warning: \"GOG_CALENDAR_ACCOUNT not configured\",\n });\n return;\n }\n\n try {\n const allEvents = await fetchGogEvents();\n const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n const todayEnd = todayStart + 24 * 60 * 60 * 1000;\n const todayEvents = allEvents.filter(\n (e) => e.startTime >= todayStart && e.startTime < todayEnd,\n );\n todayEvents.sort((a, b) => a.startTime - b.startTime);\n\n respond(true, {\n events: todayEvents,\n date: now.toISOString().split(\"T\")[0],\n source: \"google\",\n });\n } catch (err) {\n console.error(\"[Calendar] gog CLI error:\", err);\n respond(true, {\n events: [],\n date: now.toISOString().split(\"T\")[0],\n source: \"google\",\n error: err instanceof Error ? err.message : \"Failed to fetch calendar\",\n });\n }\n};\n\nconst eventsRange: GatewayRequestHandler = async ({ params, respond }) => {\n const { startDate, endDate } = params as { startDate?: string; endDate?: string };\n\n if (!startDate || !endDate) {\n respond(true, {\n events: [],\n startDate: startDate ?? null,\n endDate: endDate ?? null,\n source: \"google\",\n warning: \"startDate and endDate are required for range queries\",\n });\n return;\n }\n\n if (!GOG_ACCOUNT) {\n respond(true, {\n events: [],\n startDate,\n endDate,\n source: \"google\",\n warning: \"GOG_CALENDAR_ACCOUNT not configured\",\n });\n return;\n }\n\n try {\n const allEvents = await fetchGogEvents();\n const rangeStart = new Date(startDate).getTime();\n const rangeEnd = new Date(endDate).getTime() + 24 * 60 * 60 * 1000;\n const rangeEvents = allEvents.filter(\n (e) => e.startTime >= rangeStart && e.startTime < rangeEnd,\n );\n rangeEvents.sort((a, b) => a.startTime - b.startTime);\n\n respond(true, { events: rangeEvents, startDate, endDate, source: \"google\" });\n } catch (err) {\n console.error(\"[Calendar] gog CLI error:\", err);\n respond(true, {\n events: [],\n startDate,\n endDate,\n source: \"google\",\n error: err instanceof Error ? err.message : \"Failed to fetch calendar\",\n });\n }\n};\n\nexport const calendarHandlers: GatewayRequestHandlers = {\n \"calendar.events.today\": eventsToday,\n \"calendar.events.range\": eventsRange,\n};\n","/**\n * Error codes and shape helper for gateway method responses.\n * Local copy to avoid deep imports from core.\n */\n\nexport const ErrorCodes = {\n NOT_LINKED: \"NOT_LINKED\",\n NOT_PAIRED: \"NOT_PAIRED\",\n AGENT_TIMEOUT: \"AGENT_TIMEOUT\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UNAVAILABLE: \"UNAVAILABLE\",\n INTERNAL: \"INTERNAL\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\nexport type ErrorShape = {\n code: string;\n message: string;\n details?: unknown;\n retryable?: boolean;\n retryAfterMs?: number;\n};\n\nexport function errorShape(\n code: ErrorCode,\n message: string,\n opts?: { details?: unknown; retryable?: boolean; retryAfterMs?: number },\n): ErrorShape {\n return {\n code,\n message,\n ...opts,\n };\n}\n","import { ErrorCodes, errorShape } from \"../protocol.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst CLICKUP_BASE_URL = \"https://api.clickup.com/api/v2\";\nconst CLICKUP_TIMEOUT_MS = 15_000;\n\nfunction fetchWithTimeout(url: string, init?: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), CLICKUP_TIMEOUT_MS);\n return fetch(url, { ...init, signal: controller.signal }).finally(() => clearTimeout(timer));\n}\n\nfunction getClickUpApiKey(): string | null {\n return process.env.CLICKUP_API_KEY || null;\n}\n\nfunction getMainQueueId(): string | null {\n return process.env.CLICKUP_LIST_ID || null;\n}\n\nfunction getPersonalTasksId(): string | null {\n return process.env.CLICKUP_PERSONAL_LIST_ID || null;\n}\n\ntype ClickUpTask = {\n id: string;\n name: string;\n description: string;\n status: string;\n priority: number;\n tags: string[];\n assignees: string[];\n dateCreated: number;\n dueDate: number | null;\n url: string;\n listId: string;\n};\n\nfunction mapTaskFromApi(task: Record<string, unknown>, listId: string): ClickUpTask {\n const status = task.status as Record<string, unknown> | undefined;\n const priority = task.priority as Record<string, unknown> | undefined;\n const tags = (task.tags || []) as Array<Record<string, unknown>>;\n const assignees = (task.assignees || []) as Array<Record<string, unknown>>;\n return {\n id: task.id as string,\n name: task.name as string,\n description: (task.description as string) || \"\",\n status: (status?.status as string)?.toLowerCase() || \"to do\",\n priority: (priority?.orderindex as number) ?? 4,\n tags: tags.map((tag) => tag.name as string),\n assignees: assignees.map((a) => (a.username as string) || (a.email as string)),\n dateCreated: parseInt(task.date_created as string, 10),\n dueDate: task.due_date ? parseInt(task.due_date as string, 10) : null,\n url: `https://app.clickup.com/t/${String(task.id)}`,\n listId,\n };\n}\n\nasync function fetchTasksFromList(\n listId: string,\n apiKey: string,\n includeClosed = false,\n): Promise<ClickUpTask[]> {\n const url = `${CLICKUP_BASE_URL}/list/${listId}/task?include_closed=${includeClosed}&subtasks=false`;\n const response = await fetchWithTimeout(url, {\n headers: { Authorization: apiKey, \"Content-Type\": \"application/json\" },\n });\n if (!response.ok) {\n throw new Error(`ClickUp API error: ${response.status} ${response.statusText}`);\n }\n const data = (await response.json()) as { tasks?: unknown[] };\n return (data.tasks || []).map((t) => mapTaskFromApi(t as Record<string, unknown>, listId));\n}\n\nasync function fetchTasksWithFilters(\n listId: string,\n apiKey: string,\n filters: {\n tags?: string[];\n dueDateGt?: number;\n dueDateLt?: number;\n includeClosed?: boolean;\n },\n): Promise<ClickUpTask[]> {\n const params = new URLSearchParams({\n archived: \"false\",\n include_closed: String(filters.includeClosed ?? false),\n subtasks: \"false\",\n });\n if (filters.tags && filters.tags.length > 0) {\n for (const tag of filters.tags) {\n params.append(\"tags[]\", tag);\n }\n }\n if (filters.dueDateGt !== undefined) {\n params.set(\"due_date_gt\", String(filters.dueDateGt));\n }\n if (filters.dueDateLt !== undefined) {\n params.set(\"due_date_lt\", String(filters.dueDateLt));\n }\n const url = `${CLICKUP_BASE_URL}/list/${listId}/task?${params}`;\n const response = await fetchWithTimeout(url, {\n headers: { Authorization: apiKey, \"Content-Type\": \"application/json\" },\n });\n if (!response.ok) {\n throw new Error(`ClickUp API error: ${response.status} ${response.statusText}`);\n }\n const data = (await response.json()) as { tasks?: unknown[] };\n return (data.tasks || []).map((t) => mapTaskFromApi(t as Record<string, unknown>, listId));\n}\n\nasync function createTask(\n listId: string,\n name: string,\n description: string,\n status: string,\n apiKey: string,\n): Promise<ClickUpTask> {\n const response = await fetchWithTimeout(`${CLICKUP_BASE_URL}/list/${listId}/task`, {\n method: \"POST\",\n headers: { Authorization: apiKey, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name, description, status }),\n });\n if (!response.ok) {\n throw new Error(`ClickUp API error: ${response.status} ${response.statusText}`);\n }\n const task = (await response.json()) as Record<string, unknown>;\n const taskList = task.list as Record<string, unknown> | undefined;\n return mapTaskFromApi(task, (taskList?.id as string) || listId);\n}\n\nexport const clickupHandlers: GatewayRequestHandlers = {\n \"clickup.tasks.list\": async ({ params, respond }) => {\n const apiKey = getClickUpApiKey();\n if (!apiKey) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_API_KEY not configured\"));\n return;\n }\n const p = params as { listId?: string; queue?: \"main\" | \"personal\" | \"all\"; includeClosed?: boolean };\n try {\n let tasks: ClickUpTask[] = [];\n if (p.listId) {\n tasks = await fetchTasksFromList(p.listId, apiKey, p.includeClosed);\n } else {\n const queue = p.queue || \"main\";\n const mainQueueId = getMainQueueId();\n const personalTasksId = getPersonalTasksId();\n if (queue === \"main\" || queue === \"all\") {\n if (!mainQueueId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_LIST_ID not configured. Set it in your .env file.\"));\n return;\n }\n tasks = tasks.concat(await fetchTasksFromList(mainQueueId, apiKey, p.includeClosed));\n }\n if (queue === \"personal\" || queue === \"all\") {\n if (!personalTasksId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_PERSONAL_LIST_ID not configured. Set it in your .env file.\"));\n return;\n }\n tasks = tasks.concat(await fetchTasksFromList(personalTasksId, apiKey, p.includeClosed));\n }\n }\n respond(true, { tasks, count: tasks.length }, undefined);\n } catch (err) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `ClickUp API error: ${String(err)}`));\n }\n },\n\n \"clickup.tasks.myDay\": async ({ params, respond }) => {\n const apiKey = getClickUpApiKey();\n if (!apiKey) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_API_KEY not configured\"));\n return;\n }\n const p = params as { queue?: \"main\" | \"personal\" | \"all\" };\n try {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const todayStart = today.getTime();\n const todayEnd = todayStart + 24 * 60 * 60 * 1000 - 1;\n const queue = p.queue || \"all\";\n const listIds: string[] = [];\n const mainQueueId = getMainQueueId();\n const personalTasksId = getPersonalTasksId();\n if (queue === \"main\" || queue === \"all\") {\n if (!mainQueueId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_LIST_ID not configured. Set it in your .env file.\"));\n return;\n }\n listIds.push(mainQueueId);\n }\n if (queue === \"personal\" || queue === \"all\") {\n if (!personalTasksId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_PERSONAL_LIST_ID not configured. Set it in your .env file.\"));\n return;\n }\n listIds.push(personalTasksId);\n }\n const taskMap = new Map<string, ClickUpTask>();\n for (const listId of listIds) {\n const dueTodayTasks = await fetchTasksWithFilters(listId, apiKey, {\n dueDateGt: todayStart - 1,\n dueDateLt: todayEnd + 1,\n includeClosed: false,\n });\n for (const task of dueTodayTasks) {\n taskMap.set(task.id, task);\n }\n const taggedTasks = await fetchTasksWithFilters(listId, apiKey, {\n tags: [\"my-day\"],\n includeClosed: false,\n });\n for (const task of taggedTasks) {\n taskMap.set(task.id, task);\n }\n }\n const tasks = Array.from(taskMap.values());\n respond(true, { tasks, count: tasks.length }, undefined);\n } catch (err) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `ClickUp API error: ${String(err)}`));\n }\n },\n\n \"clickup.tasks.get\": async ({ params, respond }) => {\n const apiKey = getClickUpApiKey();\n if (!apiKey) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_API_KEY not configured\"));\n return;\n }\n const p = params as { taskId: string };\n if (!p.taskId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"taskId required\"));\n return;\n }\n try {\n const response = await fetchWithTimeout(`${CLICKUP_BASE_URL}/task/${p.taskId}`, {\n headers: { Authorization: apiKey, \"Content-Type\": \"application/json\" },\n });\n if (!response.ok) {\n throw new Error(`ClickUp API error: ${response.status} ${response.statusText}`);\n }\n const task = (await response.json()) as Record<string, unknown>;\n const taskList = task.list as Record<string, unknown> | undefined;\n const formatted = mapTaskFromApi(task, (taskList?.id as string) || \"\");\n respond(true, { task: formatted }, undefined);\n } catch (err) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `ClickUp API error: ${String(err)}`));\n }\n },\n\n \"clickup.tasks.update\": async ({ params, respond }) => {\n const apiKey = getClickUpApiKey();\n if (!apiKey) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_API_KEY not configured\"));\n return;\n }\n const p = params as { taskId: string; status?: string; name?: string; description?: string };\n if (!p.taskId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"taskId required\"));\n return;\n }\n try {\n const updatePayload: Record<string, unknown> = {};\n if (p.status) updatePayload.status = p.status;\n if (p.name) updatePayload.name = p.name;\n if (p.description !== undefined) updatePayload.description = p.description;\n const response = await fetchWithTimeout(`${CLICKUP_BASE_URL}/task/${p.taskId}`, {\n method: \"PUT\",\n headers: { Authorization: apiKey, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(updatePayload),\n });\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`ClickUp API ${response.status}: ${errorBody}`);\n }\n const task = (await response.json()) as Record<string, unknown>;\n respond(true, { updated: true, taskId: task.id }, undefined);\n } catch (err) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, String(err)));\n }\n },\n\n \"clickup.tasks.create\": async ({ params, respond }) => {\n const apiKey = getClickUpApiKey();\n if (!apiKey) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"CLICKUP_API_KEY not configured\"));\n return;\n }\n const p = params as { name: string; description?: string; status?: string; listId?: string; queue?: \"main\" | \"personal\" };\n if (!p.name) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"name required\"));\n return;\n }\n try {\n let listId = p.listId;\n if (!listId) {\n const targetId = p.queue === \"personal\" ? getPersonalTasksId() : getMainQueueId();\n if (!targetId) {\n const missingVar = p.queue === \"personal\" ? \"CLICKUP_PERSONAL_LIST_ID\" : \"CLICKUP_LIST_ID\";\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `${missingVar} not configured. Set it in your .env file.`));\n return;\n }\n listId = targetId;\n }\n const task = await createTask(listId, p.name, p.description || \"\", p.status || \"to do\", apiKey);\n respond(true, { task }, undefined);\n } catch (err) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, `ClickUp API error: ${String(err)}`));\n }\n },\n\n \"clickup.config\": async ({ respond }) => {\n const apiKey = getClickUpApiKey();\n const mainQueueId = getMainQueueId();\n const personalTasksId = getPersonalTasksId();\n respond(\n true,\n {\n configured: !!apiKey && !!mainQueueId,\n apiKeySet: !!apiKey,\n mainQueueId,\n personalTasksId,\n missingConfig: [\n !apiKey && \"CLICKUP_API_KEY\",\n !mainQueueId && \"CLICKUP_LIST_ID\",\n !personalTasksId && \"CLICKUP_PERSONAL_LIST_ID\",\n ].filter(Boolean),\n },\n undefined,\n );\n },\n};\n","/**\n * GodMode — Consciousness Heartbeat\n *\n * `godmode.consciousness.flush` — runs consciousness-sync.sh and returns\n * the generated CONSCIOUSNESS.md so the UI can show a confirmation.\n *\n * `godmode.consciousness.read` — fetches the current CONSCIOUSNESS.md\n * without regenerating it.\n */\n\nimport { exec as nodeExec } from \"node:child_process\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\nimport { GODMODE_ROOT, MEMORY_DIR } from \"../data-paths.js\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst CONSCIOUSNESS_SCRIPT = join(GODMODE_ROOT, \"scripts\", \"consciousness-sync.sh\");\nconst CONSCIOUSNESS_FILE = join(MEMORY_DIR, \"CONSCIOUSNESS.md\");\nconst EXEC_TIMEOUT_MS = 90_000; // full sync: harvest + ClawVault + heartbeat\n\nfunction runScript(): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n nodeExec(\n `bash \"${CONSCIOUSNESS_SCRIPT}\"`,\n { timeout: EXEC_TIMEOUT_MS, env: { ...process.env, HOME: process.env.HOME } },\n (err, stdout, stderr) => {\n if (err) {\n reject(new Error(`Script failed: ${stderr || err.message}`));\n return;\n }\n resolve({ stdout, stderr });\n },\n );\n });\n}\n\nfunction readConsciousness(): string | null {\n try {\n return readFileSync(CONSCIOUSNESS_FILE, \"utf8\");\n } catch {\n return null;\n }\n}\n\nconst flush: GatewayRequestHandler = async ({ respond }) => {\n if (!existsSync(CONSCIOUSNESS_SCRIPT)) {\n respond(false, undefined, {\n code: \"NOT_FOUND\",\n message: \"consciousness-sync.sh not found\",\n });\n return;\n }\n try {\n const { stdout } = await runScript();\n const content = readConsciousness();\n const lineCount = content ? content.split(\"\\n\").length : 0;\n respond(true, {\n ok: true,\n message: stdout.trim() || `Consciousness updated (${lineCount} lines)`,\n content,\n lineCount,\n updatedAt: new Date().toISOString(),\n });\n } catch (err) {\n respond(false, undefined, {\n code: \"UNAVAILABLE\",\n message: String(err),\n });\n }\n};\n\nconst read: GatewayRequestHandler = async ({ respond }) => {\n const content = readConsciousness();\n if (!content) {\n respond(false, undefined, {\n code: \"NOT_FOUND\",\n message: \"CONSCIOUSNESS.md not found — run a flush first\",\n });\n return;\n }\n const lineCount = content.split(\"\\n\").length;\n const stat = statSync(CONSCIOUSNESS_FILE);\n respond(true, {\n content,\n lineCount,\n updatedAt: stat.mtime.toISOString(),\n });\n};\n\nexport const consciousnessHandlers: GatewayRequestHandlers = {\n \"godmode.consciousness.flush\": flush,\n \"godmode.consciousness.read\": read,\n};\n","import { readFile, writeFile, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nfunction getVaultPath(): string | null {\n return process.env.OBSIDIAN_VAULT_PATH || null;\n}\n\nfunction getDailyFolder(): string {\n return process.env.DAILY_BRIEF_FOLDER || \"01-Daily\";\n}\n\ntype DailyBriefSummary = {\n readiness: number | null;\n readinessMode: string | null;\n weather: {\n temp: number;\n condition: string;\n icon: string;\n } | null;\n tasks: {\n total: number;\n completed: number;\n };\n};\n\ntype DailyBriefData = {\n date: string;\n content: string;\n summary: DailyBriefSummary;\n sections: string[];\n updatedAt: string;\n};\n\ntype EveningCaptureParams = {\n date?: string;\n response?: string;\n reflection?: string;\n tomorrowHandoff?: string;\n};\n\nclass EveningCaptureError extends Error {\n code: string;\n constructor(code: string, message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport type EveningCaptureResult = {\n date: string;\n updatedAt: string;\n capturedAt: string;\n sectionsUpdated: string[];\n reflection?: string;\n tomorrowHandoff?: string;\n};\n\nfunction parseReadiness(content: string): { readiness: number | null; mode: string | null } {\n const tableMatch = content.match(/\\|\\s*\\*\\*(\\d+)\\*\\*\\s*\\u{1F7E1}?\\s*\\|/u);\n if (tableMatch) {\n const readiness = parseInt(tableMatch[1], 10);\n const modeMatch = content.match(\n /Mode\\s*\\|\\s*\\n\\|[^|]+\\|[^|]+\\|[^|]+\\|[^|]+\\|\\s*[\\u26A1\\u{1F7E2}\\u{1F7E1}\\u{1F534}]?\\s*(\\w+)/iu,\n );\n return { readiness, mode: modeMatch ? modeMatch[1] : null };\n }\n const readinessMatch = content.match(/readiness[:\\s]+(\\d+)/i);\n return {\n readiness: readinessMatch ? parseInt(readinessMatch[1], 10) : null,\n mode: null,\n };\n}\n\nfunction parseWeather(content: string): DailyBriefSummary[\"weather\"] {\n const weatherMatch = content.match(/\\*\\*Weather:\\*\\*\\s*(\\S+)\\s+([^,]+),\\s*(\\d+)\\u00B0F/);\n if (weatherMatch) {\n return {\n icon: weatherMatch[1],\n condition: weatherMatch[2].trim(),\n temp: parseInt(weatherMatch[3], 10),\n };\n }\n const altMatch = content.match(/Weather[:\\s]+(\\S+)[^,]*,?\\s*(\\d+)\\u00B0/i);\n if (altMatch) {\n return { icon: altMatch[1], condition: \"Unknown\", temp: parseInt(altMatch[2], 10) };\n }\n return null;\n}\n\nfunction parseTasks(content: string): DailyBriefSummary[\"tasks\"] {\n const missionMatch = content.match(\n /##\\s*(?:\\u{1F3AF}\\s*)?(?:Win The Day|Today's Mission)([\\s\\S]*?)(?=^##\\s|$)/mu,\n );\n const missionContent = missionMatch ? missionMatch[1] : content;\n const unchecked = (missionContent.match(/- \\[ \\]/g) || []).length;\n const checked = (missionContent.match(/- \\[x\\]/gi) || []).length;\n return { total: unchecked + checked, completed: checked };\n}\n\nfunction parseSections(content: string): string[] {\n const sections: string[] = [];\n const headerRegex = /^##\\s+(.+)$/gm;\n let match;\n while ((match = headerRegex.exec(content)) !== null) {\n const title = match[1]\n .replace(\n /[\\u{1F4CA}\\u{1F3AF}\\u26A1\\u{1F4C5}\\u{1F4F1}\\u{1F4CB}\\u{1F9ED}\\u{1F3C3}\\u{1F4DD}\\u{1F3C1}]+/gu,\n \"\",\n )\n .trim();\n if (title) {\n sections.push(title);\n }\n }\n return sections;\n}\n\nfunction getTodayDate(): string {\n return new Date().toISOString().split(\"T\")[0];\n}\n\ntype MarkdownSection = { heading: string; start: number; end: number };\n\nfunction normalizeHeading(value: string): string {\n return value.replace(/[^a-zA-Z0-9 ]+/g, \" \").replace(/\\s+/g, \" \").trim().toLowerCase();\n}\n\nfunction listH2Sections(content: string): MarkdownSection[] {\n const headingRegex = /^##\\s+(.+)$/gm;\n const matches = Array.from(content.matchAll(headingRegex));\n const sections: MarkdownSection[] = [];\n for (let i = 0; i < matches.length; i++) {\n const match = matches[i];\n const start = match.index ?? 0;\n const nextStart =\n i + 1 < matches.length ? (matches[i + 1].index ?? content.length) : content.length;\n sections.push({ heading: (match[1] ?? \"\").trim(), start, end: nextStart });\n }\n return sections;\n}\n\nfunction findSectionByAliases(\n sections: MarkdownSection[],\n aliases: readonly string[],\n): MarkdownSection | null {\n const normalizedAliases = aliases.map((alias) => normalizeHeading(alias));\n for (const section of sections) {\n const normalizedHeading = normalizeHeading(section.heading);\n if (normalizedAliases.some((alias) => normalizedHeading.includes(alias))) {\n return section;\n }\n }\n return null;\n}\n\nfunction upsertH2Section(\n content: string,\n opts: { heading: string; aliases: readonly string[]; body: string },\n): string {\n const sectionText = `## ${opts.heading}\\n${opts.body.trim()}\\n`;\n const sections = listH2Sections(content);\n const existing = findSectionByAliases(sections, [opts.heading, ...opts.aliases]);\n if (existing) {\n return `${content.slice(0, existing.start)}${sectionText}${content.slice(existing.end)}`;\n }\n if (content.trim().length === 0) {\n return sectionText;\n }\n const separator = content.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return `${content}${separator}${sectionText}`;\n}\n\nfunction parseEveningResponse(response: string): { reflection: string; tomorrowHandoff: string } {\n const trimmed = response.trim();\n if (!trimmed) {\n return { reflection: \"\", tomorrowHandoff: \"\" };\n }\n const lines = trimmed.split(\"\\n\");\n const tomorrowLineRegex =\n /^\\s*[-*]?\\s*(tomorrow(?:\\s+(?:handoff|plan|priorities))?|roll(?:\\s|-)?over)\\b[:-]?\\s*/i;\n const lineIndex = lines.findIndex((line) => tomorrowLineRegex.test(line));\n if (lineIndex !== -1) {\n const reflection = lines.slice(0, lineIndex).join(\"\\n\").trim();\n const tomorrow = lines.slice(lineIndex).join(\"\\n\").replace(tomorrowLineRegex, \"\").trim();\n return { reflection, tomorrowHandoff: tomorrow };\n }\n const inlineTomorrowRegex =\n /\\b(tomorrow(?:\\s+(?:handoff|plan|priorities))?|roll(?:\\s|-)?over)\\b[:-]\\s*/i;\n const inlineMatch = inlineTomorrowRegex.exec(trimmed);\n if (inlineMatch && inlineMatch.index !== undefined) {\n const reflection = trimmed.slice(0, inlineMatch.index).trim();\n const tomorrow = trimmed.slice(inlineMatch.index + inlineMatch[0].length).trim();\n return { reflection, tomorrowHandoff: tomorrow };\n }\n return { reflection: trimmed, tomorrowHandoff: \"\" };\n}\n\nfunction preferNonEmpty(primary: unknown, fallback: string): string {\n if (typeof primary === \"string\" && primary.trim().length > 0) {\n return primary.trim();\n }\n return fallback.trim();\n}\n\nfunction buildCapturedBody(text: string, capturedAtIso: string): string {\n return `Captured at: ${capturedAtIso}\\n\\n${text.trim()}`;\n}\n\nfunction ensureCaptureInput(params: EveningCaptureParams): {\n response?: string;\n reflection?: string;\n tomorrowHandoff?: string;\n} {\n const hasResponse = typeof params.response === \"string\" && params.response.trim().length > 0;\n const hasReflection =\n typeof params.reflection === \"string\" && params.reflection.trim().length > 0;\n const hasTomorrow =\n typeof params.tomorrowHandoff === \"string\" && params.tomorrowHandoff.trim().length > 0;\n if (!hasResponse && !hasReflection && !hasTomorrow) {\n throw new EveningCaptureError(\n \"INVALID_REQUEST\",\n \"Provide response, reflection, or tomorrowHandoff\",\n );\n }\n return {\n response: hasResponse ? params.response?.trim() : undefined,\n reflection: hasReflection ? params.reflection?.trim() : undefined,\n tomorrowHandoff: hasTomorrow ? params.tomorrowHandoff?.trim() : undefined,\n };\n}\n\nasync function readDailyBriefForCapture(filePath: string, date: string): Promise<string> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return `# Daily Brief - ${date}\\n`;\n }\n throw new EveningCaptureError(\n \"UNAVAILABLE\",\n err instanceof Error ? err.message : \"Failed to read daily brief\",\n );\n }\n}\n\nexport async function captureEveningReviewToDailyBrief(\n params: EveningCaptureParams,\n): Promise<EveningCaptureResult> {\n const vaultPath = getVaultPath();\n if (!vaultPath) {\n throw new EveningCaptureError(\"INVALID_REQUEST\", \"OBSIDIAN_VAULT_PATH not configured\");\n }\n const briefDate = params.date || getTodayDate();\n const input = ensureCaptureInput(params);\n const filePath = join(vaultPath, getDailyFolder(), `${briefDate}.md`);\n const content = await readDailyBriefForCapture(filePath, briefDate);\n\n const parsed =\n typeof input.response === \"string\"\n ? parseEveningResponse(input.response)\n : { reflection: \"\", tomorrowHandoff: \"\" };\n const finalReflection = preferNonEmpty(input.reflection, parsed.reflection);\n const finalTomorrowHandoff = preferNonEmpty(input.tomorrowHandoff, parsed.tomorrowHandoff);\n if (!finalReflection && !finalTomorrowHandoff) {\n throw new EveningCaptureError(\n \"INVALID_REQUEST\",\n \"Could not parse any reflection or tomorrow handoff content\",\n );\n }\n\n const capturedAt = new Date().toISOString();\n let updated = content;\n const sectionsUpdated: string[] = [];\n\n if (finalReflection) {\n updated = upsertH2Section(updated, {\n heading: \"Evening Reflection\",\n aliases: [\"Reflection\", \"Caleb Reflection\"],\n body: buildCapturedBody(finalReflection, capturedAt),\n });\n sectionsUpdated.push(\"Evening Reflection\");\n }\n\n if (finalTomorrowHandoff) {\n updated = upsertH2Section(updated, {\n heading: \"Tomorrow Handoff\",\n aliases: [\"Tomorrow Plan\", \"Tomorrow Priorities\", \"Rollover\"],\n body: buildCapturedBody(finalTomorrowHandoff, capturedAt),\n });\n sectionsUpdated.push(\"Tomorrow Handoff\");\n }\n\n try {\n await writeFile(filePath, updated, \"utf-8\");\n } catch (err) {\n throw new EveningCaptureError(\n \"UNAVAILABLE\",\n err instanceof Error ? err.message : \"Failed to write daily brief\",\n );\n }\n\n return {\n date: briefDate,\n updatedAt: new Date().toISOString(),\n capturedAt,\n sectionsUpdated,\n reflection: finalReflection || undefined,\n tomorrowHandoff: finalTomorrowHandoff || undefined,\n };\n}\n\nconst getDailyBrief: GatewayRequestHandler = async ({ params, respond }) => {\n const vaultPath = getVaultPath();\n if (!vaultPath) {\n respond(true, null);\n return;\n }\n\n const { date } = params as { date?: string };\n const briefDate = date || getTodayDate();\n const filePath = join(vaultPath, getDailyFolder(), `${briefDate}.md`);\n\n try {\n const stats = await stat(filePath);\n const content = await readFile(filePath, \"utf-8\");\n const { readiness, mode } = parseReadiness(content);\n const weather = parseWeather(content);\n const tasks = parseTasks(content);\n const sections = parseSections(content);\n\n const briefData: DailyBriefData = {\n date: briefDate,\n content,\n summary: { readiness, readinessMode: mode, weather, tasks },\n sections,\n updatedAt: stats.mtime.toISOString(),\n };\n\n respond(true, briefData);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n respond(true, null);\n } else {\n console.error(\"[DailyBrief] Error reading brief:\", err);\n respond(true, {\n date: briefDate,\n error: err instanceof Error ? err.message : \"Failed to read daily brief\",\n });\n }\n }\n};\n\nconst updateDailyBrief: GatewayRequestHandler = async ({ params, respond }) => {\n const vaultPath = getVaultPath();\n if (!vaultPath) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"OBSIDIAN_VAULT_PATH not configured\" });\n return;\n }\n\n const { date, content } = params as { date?: string; content?: string };\n const briefDate = date || getTodayDate();\n\n if (typeof content !== \"string\") {\n respond(false, null, {\n code: \"INVALID_REQUEST\",\n message: \"Missing or invalid content parameter\",\n });\n return;\n }\n\n const filePath = join(vaultPath, getDailyFolder(), `${briefDate}.md`);\n\n try {\n await writeFile(filePath, content, \"utf-8\");\n console.log(`[DailyBrief] Updated brief for ${briefDate}`);\n respond(true, { date: briefDate, updatedAt: new Date().toISOString() });\n } catch (err) {\n console.error(\"[DailyBrief] Error writing brief:\", err);\n respond(false, null, {\n code: \"UNAVAILABLE\",\n message: err instanceof Error ? err.message : \"Failed to write daily brief\",\n });\n }\n};\n\nconst captureEveningReview: GatewayRequestHandler = async ({ params, respond }) => {\n try {\n const result = await captureEveningReviewToDailyBrief(params as EveningCaptureParams);\n respond(true, result);\n } catch (err) {\n if (err instanceof EveningCaptureError) {\n respond(false, null, { code: err.code, message: err.message });\n return;\n }\n respond(false, null, {\n code: \"UNAVAILABLE\",\n message: err instanceof Error ? err.message : \"Failed to capture evening review\",\n });\n }\n};\n\nexport const dailyBriefHandlers: GatewayRequestHandlers = {\n \"dailyBrief.get\": getDailyBrief,\n \"dailyBrief.update\": updateDailyBrief,\n \"dailyBrief.eveningCapture\": captureEveningReview,\n \"eveningReview.capture\": captureEveningReview,\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst DATA_SOURCES_FILE = join(DATA_DIR, \"data-sources.json\");\n\ntype DataSource = {\n id: string;\n name: string;\n type: string;\n status: string;\n skill: string;\n lastSync?: string;\n};\n\ntype DataSourcesData = {\n sources: DataSource[];\n};\n\nasync function readDataSources(): Promise<DataSourcesData> {\n try {\n const raw = await readFile(DATA_SOURCES_FILE, \"utf-8\");\n return JSON.parse(raw) as DataSourcesData;\n } catch {\n return { sources: [] };\n }\n}\n\nconst listDataSources: GatewayRequestHandler = async ({ respond }) => {\n const data = await readDataSources();\n respond(true, { sources: data.sources });\n};\n\nconst getDataSource: GatewayRequestHandler = async ({ params, respond }) => {\n const { id } = params as { id?: string };\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing data source id\" });\n return;\n }\n const data = await readDataSources();\n const source = data.sources.find((s) => s.id === id);\n if (!source) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Data source not found\" });\n return;\n }\n respond(true, source);\n};\n\nconst updateDataSource: GatewayRequestHandler = async ({ params, respond }) => {\n const { id, name, type, status, skill, lastSync } = params as {\n id?: string;\n name?: string;\n type?: string;\n status?: string;\n skill?: string;\n lastSync?: string;\n };\n\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing data source id\" });\n return;\n }\n\n const data = await readDataSources();\n const sourceIndex = data.sources.findIndex((s) => s.id === id);\n\n if (sourceIndex === -1) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Data source not found\" });\n return;\n }\n\n const source = data.sources[sourceIndex];\n if (name !== undefined) {\n source.name = name;\n }\n if (type !== undefined) {\n source.type = type;\n }\n if (status !== undefined) {\n source.status = status;\n }\n if (skill !== undefined) {\n source.skill = skill;\n }\n if (lastSync !== undefined) {\n source.lastSync = lastSync;\n }\n\n await writeFile(DATA_SOURCES_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n respond(true, source);\n};\n\nexport const dataSourcesHandlers: GatewayRequestHandlers = {\n \"dataSources.list\": listDataSources,\n \"dataSources.get\": getDataSource,\n \"dataSources.update\": updateDataSource,\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler, GatewayRequestHandlerOptions } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst GOALS_FILE = join(DATA_DIR, \"goals.json\");\n\ntype Goal = {\n id: string;\n title: string;\n area?: string;\n target?: string;\n progress?: number;\n status: \"active\" | \"completed\" | \"paused\";\n};\n\ntype GoalsData = {\n goals: Goal[];\n updatedAt: string | null;\n};\n\nasync function readGoals(): Promise<GoalsData> {\n try {\n const raw = await readFile(GOALS_FILE, \"utf-8\");\n return JSON.parse(raw) as GoalsData;\n } catch {\n return { goals: [], updatedAt: null };\n }\n}\n\nconst getGoals: GatewayRequestHandler = async ({ respond }) => {\n const data = await readGoals();\n respond(true, data);\n};\n\nconst updateGoals: GatewayRequestHandler = async ({ params, respond }) => {\n const { goals } = params as { goals?: Goal[] };\n if (!goals || !Array.isArray(goals)) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing goals array\" });\n return;\n }\n const data: GoalsData = { goals, updatedAt: new Date().toISOString() };\n await writeFile(GOALS_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n respond(true, data);\n};\n\nexport const goalsHandlers: GatewayRequestHandlers = {\n \"goals.get\": getGoals,\n \"goals.update\": updateGoals,\n};\n","import type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\ntype InnerWorkMessage = {\n role: \"user\" | \"sage\";\n content: string;\n timestamp: number;\n sessionType?: string;\n};\n\ntype SessionType =\n | \"reflection\"\n | \"meditation\"\n | \"journaling\"\n | \"gratitude\"\n | \"intention-setting\"\n | \"general\";\n\nconst send: GatewayRequestHandler = async ({ params, respond }) => {\n const { sessionType, message } = params as {\n sessionType?: SessionType;\n message?: string;\n };\n\n const validSessionTypes: SessionType[] = [\n \"reflection\",\n \"meditation\",\n \"journaling\",\n \"gratitude\",\n \"intention-setting\",\n \"general\",\n ];\n\n const type = sessionType && validSessionTypes.includes(sessionType) ? sessionType : \"general\";\n\n let responseContent: string;\n\n if (!message || message.trim() === \"\") {\n switch (type) {\n case \"reflection\":\n responseContent =\n \"What's on your mind today? Take a moment to notice what thoughts or feelings are present.\";\n break;\n case \"meditation\":\n responseContent =\n \"Let's begin. Take three deep breaths and settle into this moment. What do you notice in your body?\";\n break;\n case \"journaling\":\n responseContent =\n \"Your journal awaits. What would you like to explore through writing today?\";\n break;\n case \"gratitude\":\n responseContent =\n \"Let's cultivate appreciation. What are three things you're grateful for right now?\";\n break;\n case \"intention-setting\":\n responseContent =\n \"What intention would you like to set for today? Consider what quality or focus you'd like to bring.\";\n break;\n default:\n responseContent = \"I'm here to support your inner work. How are you feeling today?\";\n }\n } else {\n responseContent = `I hear you. ${message.length > 50 ? \"Thank you for sharing that with me. \" : \"\"}Tell me more about that...`;\n }\n\n const response: InnerWorkMessage = {\n role: \"sage\",\n content: responseContent,\n timestamp: Date.now(),\n sessionType: type,\n };\n\n respond(true, {\n response,\n source: \"placeholder\",\n });\n};\n\nconst history: GatewayRequestHandler = async ({ params, respond }) => {\n const { sessionType, limit } = params as {\n sessionType?: string;\n limit?: number;\n };\n\n const maxMessages = Math.min(100, Math.max(1, limit ?? 50));\n\n respond(true, {\n messages: [] as InnerWorkMessage[],\n sessionType: sessionType ?? null,\n limit: maxMessages,\n source: \"placeholder\",\n });\n};\n\nexport const innerWorkHandlers: GatewayRequestHandlers = {\n \"innerwork.send\": send,\n \"innerwork.history\": history,\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\n/**\n * Life Dashboards - Wheel of Life + Vision Board handlers\n *\n * Data stored in ~/.openclaw/dashboards/data/\n * STATE_DIR is resolved dynamically to avoid hard dependency on core config/paths.\n */\n\nfunction getStateDir(): string {\n // Use STATE_DIR from env, or default to ~/.openclaw\n return process.env.OPENCLAW_STATE_DIR || path.join(process.env.HOME || \"\", \".openclaw\");\n}\n\n// Types\n\ntype SpokeTrend = \"up\" | \"down\" | \"stable\";\n\ntype SpokeData = {\n current: number;\n target: number;\n trend: SpokeTrend;\n lastUpdated: string;\n};\n\ntype WheelOfLifeData = {\n asOf: string;\n scores: Record<string, SpokeData>;\n history: Array<{ date: string; scores: Record<string, number> }>;\n};\n\ntype KeyResult = { kr: string; current: number | null; target: number };\n\ntype AnnualTheme = {\n id: string;\n theme: string;\n description: string;\n progress: number;\n wheelSpokes: string[];\n keyResults: KeyResult[];\n};\n\ntype ChiefDefiniteAim = {\n statement: string;\n deadline: string;\n progress: number;\n lastUpdated: string;\n};\n\ntype VisionBoardData = {\n chiefDefiniteAim: ChiefDefiniteAim;\n annualThemes: AnnualTheme[];\n values: string[];\n identityStatements: string[];\n antiGoals: string[];\n};\n\n// Paths — lazily resolved\nfunction getDashboardsDir(): string {\n return path.join(getStateDir(), \"dashboards\", \"data\");\n}\n\nfunction getWheelPath(): string {\n return path.join(getDashboardsDir(), \"wheel-of-life.json\");\n}\n\nfunction getVisionPath(): string {\n return path.join(getDashboardsDir(), \"vision-board.json\");\n}\n\nconst DEFAULT_WHEEL_OF_LIFE: WheelOfLifeData = {\n asOf: new Date().toISOString().split(\"T\")[0],\n scores: Object.fromEntries(\n [\"health\", \"wealth\", \"career\", \"relationships\", \"fun\", \"environment\", \"growth\", \"contribution\"].map(\n (key) => [\n key,\n {\n current: 5,\n target: 8,\n trend: \"stable\" as SpokeTrend,\n lastUpdated: new Date().toISOString().split(\"T\")[0],\n },\n ],\n ),\n ),\n history: [],\n};\n\nconst DEFAULT_VISION_BOARD: VisionBoardData = {\n chiefDefiniteAim: {\n statement: \"Define your Chief Definite Aim here.\",\n deadline: \"2030-12-31\",\n progress: 0,\n lastUpdated: new Date().toISOString().split(\"T\")[0],\n },\n annualThemes: [],\n values: [\"Value 1\", \"Value 2\", \"Value 3\"],\n identityStatements: [\"I am becoming who I want to be.\"],\n antiGoals: [],\n};\n\nasync function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch {\n // exists\n }\n}\n\nasync function readJsonFile<T>(filePath: string, defaultData: T): Promise<T> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch {\n return defaultData;\n }\n}\n\nasync function writeJsonFile<T>(filePath: string, data: T): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nconst getWheelOfLife: GatewayRequestHandler = async ({ respond }) => {\n const data = await readJsonFile(getWheelPath(), DEFAULT_WHEEL_OF_LIFE);\n const scores = Object.values(data.scores);\n const currentSum = scores.reduce((sum, s) => sum + s.current, 0);\n const overallBalance = currentSum / scores.length;\n const lowestSpoke = Object.entries(data.scores).reduce(\n (min, [key, val]) => (val.current < min.value ? { key, value: val.current } : min),\n { key: \"\", value: 11 },\n );\n const biggestGap = Object.entries(data.scores).reduce(\n (max, [key, val]) => {\n const gap = val.target - val.current;\n return gap > max.gap ? { key, gap } : max;\n },\n { key: \"\", gap: -1 },\n );\n respond(true, {\n ...data,\n overallBalance: Math.round(overallBalance * 100) / 100,\n lowestSpoke: lowestSpoke.key,\n biggestGap: biggestGap.key,\n });\n};\n\nconst updateWheelOfLife: GatewayRequestHandler = async ({ params, respond }) => {\n const { updates } = params as { updates?: Record<string, { current?: number; target?: number }> };\n if (!updates || Object.keys(updates).length === 0) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"updates is required\" });\n return;\n }\n const data = await readJsonFile(getWheelPath(), DEFAULT_WHEEL_OF_LIFE);\n const today = new Date().toISOString().split(\"T\")[0];\n const oldScores: Record<string, number> = {};\n for (const [key, val] of Object.entries(data.scores)) {\n oldScores[key] = val.current;\n }\n for (const [spoke, update] of Object.entries(updates)) {\n if (!data.scores[spoke]) continue;\n const oldValue = data.scores[spoke].current;\n let newValue = oldValue;\n if (typeof update.current === \"number\" && update.current >= 1 && update.current <= 10) {\n newValue = update.current;\n data.scores[spoke].current = newValue;\n }\n if (typeof update.target === \"number\" && update.target >= 1 && update.target <= 10) {\n data.scores[spoke].target = update.target;\n }\n if (newValue > oldValue) data.scores[spoke].trend = \"up\";\n else if (newValue < oldValue) data.scores[spoke].trend = \"down\";\n data.scores[spoke].lastUpdated = today;\n }\n data.asOf = today;\n data.history = [{ date: today, scores: oldScores }, ...data.history].slice(0, 52);\n await writeJsonFile(getWheelPath(), data);\n respond(true, { updated: true, asOf: today });\n};\n\nconst getWheelHistory: GatewayRequestHandler = async ({ params, respond }) => {\n const { limit } = params as { limit?: number };\n const maxEntries = Math.min(52, Math.max(1, limit ?? 12));\n const data = await readJsonFile(getWheelPath(), DEFAULT_WHEEL_OF_LIFE);\n respond(true, { history: data.history.slice(0, maxEntries), totalEntries: data.history.length });\n};\n\nconst getVisionBoard: GatewayRequestHandler = async ({ respond }) => {\n const data = await readJsonFile(getVisionPath(), DEFAULT_VISION_BOARD);\n respond(true, data);\n};\n\nconst updateVisionBoard: GatewayRequestHandler = async ({ params, respond }) => {\n const data = await readJsonFile(getVisionPath(), DEFAULT_VISION_BOARD);\n const today = new Date().toISOString().split(\"T\")[0];\n const { chiefDefiniteAim, annualThemes, values, identityStatements, antiGoals } =\n params as Partial<VisionBoardData>;\n if (chiefDefiniteAim) {\n if (typeof chiefDefiniteAim.statement === \"string\") data.chiefDefiniteAim.statement = chiefDefiniteAim.statement;\n if (typeof chiefDefiniteAim.deadline === \"string\") data.chiefDefiniteAim.deadline = chiefDefiniteAim.deadline;\n if (typeof chiefDefiniteAim.progress === \"number\") data.chiefDefiniteAim.progress = Math.max(0, Math.min(1, chiefDefiniteAim.progress));\n data.chiefDefiniteAim.lastUpdated = today;\n }\n if (Array.isArray(annualThemes)) data.annualThemes = annualThemes;\n if (Array.isArray(values)) data.values = values;\n if (Array.isArray(identityStatements)) data.identityStatements = identityStatements;\n if (Array.isArray(antiGoals)) data.antiGoals = antiGoals;\n await writeJsonFile(getVisionPath(), data);\n respond(true, { updated: true });\n};\n\nconst getIdentityToday: GatewayRequestHandler = async ({ respond }) => {\n const data = await readJsonFile(getVisionPath(), DEFAULT_VISION_BOARD);\n if (data.identityStatements.length === 0) {\n respond(true, { identity: null, index: -1, total: 0 });\n return;\n }\n const now = new Date();\n const startOfYear = new Date(now.getFullYear(), 0, 0);\n const diff = now.getTime() - startOfYear.getTime();\n const dayOfYear = Math.floor(diff / (1000 * 60 * 60 * 24));\n const index = dayOfYear % data.identityStatements.length;\n respond(true, { identity: data.identityStatements[index], index, total: data.identityStatements.length });\n};\n\nexport const lifeDashboardsHandlers: GatewayRequestHandlers = {\n \"wheelOfLife.get\": getWheelOfLife,\n \"wheelOfLife.update\": updateWheelOfLife,\n \"wheelOfLife.history\": getWheelHistory,\n \"visionBoard.get\": getVisionBoard,\n \"visionBoard.update\": updateVisionBoard,\n \"visionBoard.identityToday\": getIdentityToday,\n};\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { GODMODE_ROOT } from \"../data-paths.js\";\nimport { STATE_DIR } from \"../lib/openclaw-state.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nexport type LifetrackEntry = {\n date: string;\n url: string;\n pathname: string;\n contentType?: string;\n size?: number;\n title?: string;\n generatedAt?: string;\n};\n\ntype WheelOfLifeData = {\n scores: Record<string, { current: number; target: number }>;\n};\n\ntype VisionBoardData = {\n chiefDefiniteAim?: { statement: string };\n values?: string[];\n identityStatements?: string[];\n annualThemes?: Array<{ theme: string; description: string }>;\n};\n\ntype DailyLogContext = {\n weather?: string;\n calendarHighlights?: string[];\n todayPriorities?: string[];\n yesterdayWins?: string[];\n energyReadiness?: string;\n};\n\ntype MeditationTheme = string;\n\ntype CustomThemeRequest = {\n durationMinutes: number;\n topic: string;\n};\n\ntype LifeTrackContext = {\n chiefDefiniteAim?: string;\n identityStatements?: string[];\n values?: string[];\n annualThemes?: Array<{ theme: string; description: string }>;\n wheelScores?: Record<string, { current: number; target: number }>;\n lowestSpokes?: string[];\n dayOfWeek?: string;\n weather?: string;\n calendarHighlights?: string[];\n todayPriorities?: string[];\n yesterdayWins?: string[];\n energyReadiness?: string;\n};\n\ntype LifeTrackConfig = {\n enabled?: boolean;\n schedule?: Record<string, unknown>;\n voice?: Record<string, unknown>;\n generation?: {\n defaultTheme?: MeditationTheme;\n [key: string]: unknown;\n };\n retention?: {\n days?: number;\n [key: string]: unknown;\n };\n stats?: {\n totalGenerated?: number;\n lastGenerated?: string;\n estimatedCost?: number;\n [key: string]: unknown;\n };\n};\n\ntype ThemeEntry = {\n id: string;\n label: string;\n description: string;\n durationMinutes: number;\n defaultBackingTrack?: string;\n};\n\ntype LifeTrackGenerationResult = {\n success: boolean;\n error?: string;\n trackEntry?: LifetrackEntry;\n audioPath?: string;\n scriptPath?: string;\n duration?: number;\n cost?: number;\n chunkCount?: number;\n theme?: MeditationTheme;\n warnings?: string[];\n};\n\ntype LifetrackModule = {\n generateLifeTrack: (args: {\n date: string;\n context: LifeTrackContext;\n theme: MeditationTheme;\n customTheme?: CustomThemeRequest;\n }) => Promise<LifeTrackGenerationResult>;\n getAllTracks: () => Promise<LifetrackEntry[]>;\n getTodayTrack: () => Promise<LifetrackEntry | null>;\n hasTrackForDate: (date: string) => Promise<boolean>;\n readConfig: () => Promise<LifeTrackConfig>;\n writeConfig: (config: LifeTrackConfig) => Promise<void>;\n checkFfmpegAvailable: () => Promise<boolean>;\n THEME_REGISTRY: Record<string, ThemeEntry>;\n};\n\nconst DASHBOARDS_DIR = path.join(STATE_DIR, \"dashboards\", \"data\");\nconst WHEEL_OF_LIFE_PATH = path.join(DASHBOARDS_DIR, \"wheel-of-life.json\");\nconst VISION_BOARD_PATH = path.join(DASHBOARDS_DIR, \"vision-board.json\");\nconst DAILY_LOG_DIR = path.join(GODMODE_ROOT, \"memory\", \"daily\");\n\nlet modulePromise: Promise<LifetrackModule | null> | null = null;\n\nfunction resolveModuleCandidates(): string[] {\n const thisFile = fileURLToPath(import.meta.url);\n const methodsDir = path.dirname(thisFile);\n const pluginRoot = path.resolve(methodsDir, \"..\", \"..\");\n const monorepoRoot = path.resolve(pluginRoot, \"..\", \"..\");\n\n const explicit = (process.env.GODMODE_LIFETRACK_MODULE || \"\").trim();\n\n const candidates = [\n explicit,\n path.join(pluginRoot, \"src\", \"lifetrack\", \"index.js\"),\n path.join(pluginRoot, \"dist\", \"lifetrack\", \"index.js\"),\n path.join(monorepoRoot, \"src\", \"lifetrack\", \"index.js\"),\n path.join(monorepoRoot, \"dist\", \"lifetrack\", \"index.js\"),\n ].filter(Boolean);\n\n return Array.from(new Set(candidates));\n}\n\nasync function loadLifetrackModule(): Promise<LifetrackModule | null> {\n if (modulePromise) {\n return modulePromise;\n }\n\n modulePromise = (async () => {\n for (const candidate of resolveModuleCandidates()) {\n try {\n const url =\n candidate.startsWith(\"file://\") || candidate.startsWith(\"node:\")\n ? candidate\n : pathToFileURL(candidate).href;\n const mod = (await import(url)) as Partial<LifetrackModule>;\n if (\n typeof mod.generateLifeTrack === \"function\" &&\n typeof mod.getAllTracks === \"function\" &&\n typeof mod.getTodayTrack === \"function\" &&\n typeof mod.hasTrackForDate === \"function\" &&\n typeof mod.readConfig === \"function\" &&\n typeof mod.writeConfig === \"function\" &&\n typeof mod.checkFfmpegAvailable === \"function\" &&\n mod.THEME_REGISTRY &&\n typeof mod.THEME_REGISTRY === \"object\"\n ) {\n return mod as LifetrackModule;\n }\n } catch {\n continue;\n }\n }\n return null;\n })();\n\n return modulePromise;\n}\n\nasync function withLifetrackModule<T>(\n run: (mod: LifetrackModule) => Promise<T>,\n fallback: () => Promise<T>,\n): Promise<T> {\n const mod = await loadLifetrackModule();\n if (!mod) {\n return fallback();\n }\n return run(mod);\n}\n\nfunction unavailablePayload() {\n return {\n code: \"UNAVAILABLE\",\n message:\n \"LifeTracks generation library is unavailable. Set GODMODE_LIFETRACK_MODULE or install with OpenClaw core sources.\",\n };\n}\n\nasync function readJsonFile<T>(filePath: string, defaultData: T): Promise<T> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch {\n return defaultData;\n }\n}\n\nfunction extractSection(content: string, ...keywords: string[]): string | null {\n for (const keyword of keywords) {\n const pattern = new RegExp(\n `^##\\\\s+[^\\\\n]*${keyword.replace(/[.*+?^${}()|[\\\\]\\\\]/g, \"\\\\$&\")}[^\\\\n]*$`,\n \"mi\",\n );\n const match = content.match(pattern);\n if (match && match.index !== undefined) {\n const start = match.index + match[0].length;\n const nextHeading = content.indexOf(\"\\n## \", start);\n const sectionText =\n nextHeading !== -1 ? content.slice(start, nextHeading) : content.slice(start);\n return sectionText.trim();\n }\n }\n return null;\n}\n\nasync function parseDailyLog(dateStr: string): Promise<DailyLogContext> {\n const result: DailyLogContext = {};\n const logPath = path.join(DAILY_LOG_DIR, `${dateStr}.md`);\n\n let content: string;\n try {\n content = await fs.readFile(logPath, \"utf-8\");\n } catch {\n return result;\n }\n\n const headerMatch = content.match(/\\*\\*Day\\s+\\d+\\*\\*\\s*·\\s*([^·\\n]+)/);\n if (headerMatch) {\n const rawWeather = headerMatch[1].replace(/\\([^)]+\\)/g, \"\").trim();\n if (rawWeather) {\n result.weather = rawWeather;\n }\n }\n\n const calendarSection = extractSection(content, \"Today's Calendar\", \"Calendar\");\n if (calendarSection) {\n const events = calendarSection\n .split(\"\\n\")\n .filter((line) => line.match(/^\\s*[-*]\\s+\\*\\*/))\n .map((line) =>\n line\n .replace(/^\\s*[-*]\\s+/, \"\")\n .replace(/\\*\\*/g, \"\")\n .trim(),\n )\n .filter((e) => e.length > 0)\n .slice(0, 5);\n if (events.length > 0) {\n result.calendarHighlights = events;\n }\n }\n\n const prioritiesSection = extractSection(content, \"Win The Day\");\n if (prioritiesSection) {\n const priorities = prioritiesSection\n .split(\"\\n\")\n .filter((line) => line.match(/^\\s*-\\s*\\[/))\n .map((line) =>\n line\n .replace(/^\\s*-\\s*\\[.\\]\\s*/, \"\")\n .replace(/\\*\\*/g, \"\")\n .trim(),\n )\n .filter((p) => p.length > 0)\n .slice(0, 6);\n if (priorities.length > 0) {\n result.todayPriorities = priorities;\n }\n }\n\n const yesterdaySection = extractSection(content, \"Yesterday's Impact\");\n if (yesterdaySection) {\n const highlightsStart = yesterdaySection.indexOf(\"Highlights:\");\n if (highlightsStart !== -1) {\n const highlightsText = yesterdaySection.slice(highlightsStart);\n const wins = highlightsText\n .split(\"\\n\")\n .filter((line) => line.match(/^\\s*-\\s/))\n .map((line) => line.replace(/^\\s*-\\s+/, \"\").trim())\n .filter((w) => w.length > 0)\n .slice(0, 4);\n if (wins.length > 0) {\n result.yesterdayWins = wins;\n }\n }\n }\n\n const statusSection = extractSection(content, \"Body Check\", \"Status\", \"LifeTracker\");\n if (statusSection) {\n const compactMatch = statusSection.match(\n /Readiness:\\s*(\\d+)\\s*[\\u{1F7E1}\\u{1F7E2}\\u{1F534}\\u{1F7E0}\\u26AA]\\s*(\\w[\\w\\s]*?)\\*?\\*/u,\n );\n if (compactMatch) {\n const parts: string[] = [`Readiness: ${compactMatch[1]}`];\n const sleepMatch = statusSection.match(/Sleep\\s+(\\d+)/);\n if (sleepMatch) {\n parts.push(`Sleep: ${sleepMatch[1]}`);\n }\n if (compactMatch[2]?.trim()) {\n parts.push(compactMatch[2].trim());\n }\n result.energyReadiness = parts.join(\", \");\n } else {\n const tableRows = statusSection\n .split(\"\\n\")\n .filter((line) => line.includes(\"|\") && !line.includes(\"---\"));\n const dataRow = tableRows.length >= 2 ? tableRows[1] : undefined;\n if (dataRow) {\n const cells = dataRow\n .split(\"|\")\n .map((c) => c.trim())\n .filter((c) => c.length > 0);\n if (cells.length >= 6) {\n const mode = cells[5]?.replace(/[\\u{1F7E1}\\u{1F7E2}\\u{1F534}\\u26AA]/gu, \"\").trim();\n const parts: string[] = [];\n if (cells[0] && cells[0] !== \"N/A\") {\n parts.push(`Readiness: ${cells[0]}`);\n }\n if (cells[1] && cells[1] !== \"N/A\") {\n parts.push(`Sleep: ${cells[1]}`);\n }\n if (mode) {\n parts.push(mode);\n }\n if (parts.length > 0) {\n result.energyReadiness = parts.join(\", \");\n }\n }\n }\n }\n }\n\n return result;\n}\n\nasync function buildGenerationContext(): Promise<LifeTrackContext> {\n const today = new Date().toISOString().split(\"T\")[0];\n const [wheelData, visionData, dailyLog] = await Promise.all([\n readJsonFile<WheelOfLifeData>(WHEEL_OF_LIFE_PATH, { scores: {} }),\n readJsonFile<VisionBoardData>(VISION_BOARD_PATH, {}),\n parseDailyLog(today),\n ]);\n\n const spokeScores = Object.entries(wheelData.scores || {}).map(([key, val]) => ({\n key,\n current: val.current,\n target: val.target,\n }));\n spokeScores.sort((a, b) => a.current - b.current);\n const lowestSpokes = spokeScores.slice(0, 3).map((s) => s.key);\n\n const wheelScores: Record<string, { current: number; target: number }> = {};\n for (const [key, val] of Object.entries(wheelData.scores || {})) {\n wheelScores[key] = { current: val.current, target: val.target };\n }\n\n return {\n chiefDefiniteAim: visionData.chiefDefiniteAim?.statement,\n identityStatements: visionData.identityStatements,\n values: visionData.values,\n annualThemes: visionData.annualThemes,\n wheelScores,\n lowestSpokes,\n dayOfWeek: new Date().toLocaleDateString(\"en-US\", { weekday: \"long\" }),\n weather: dailyLog.weather,\n calendarHighlights: dailyLog.calendarHighlights,\n todayPriorities: dailyLog.todayPriorities,\n yesterdayWins: dailyLog.yesterdayWins,\n energyReadiness: dailyLog.energyReadiness,\n };\n}\n\nconst getLifetracksConfig: GatewayRequestHandler = async ({ respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const config = await mod.readConfig();\n const ffmpegAvailable = await mod.checkFfmpegAvailable();\n respond(true, { ...config, ffmpegAvailable });\n },\n async () => {\n respond(true, {\n enabled: false,\n ffmpegAvailable: false,\n unavailable: true,\n message: unavailablePayload().message,\n });\n },\n );\n};\n\nconst updateLifetracksConfig: GatewayRequestHandler = async ({ params, respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const updates = params as Partial<LifeTrackConfig>;\n const config = await mod.readConfig();\n\n if (typeof updates.enabled === \"boolean\") {\n config.enabled = updates.enabled;\n }\n if (updates.schedule) {\n config.schedule = { ...config.schedule, ...updates.schedule };\n }\n if (updates.voice) {\n config.voice = { ...config.voice, ...updates.voice };\n }\n if (updates.generation) {\n config.generation = { ...config.generation, ...updates.generation };\n }\n if (updates.retention) {\n config.retention = { ...config.retention, ...updates.retention };\n }\n\n await mod.writeConfig(config);\n respond(true, { updated: true, config });\n },\n async () => {\n respond(false, null, unavailablePayload());\n },\n );\n};\n\nconst getLifetracks: GatewayRequestHandler = async ({ respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const config = await mod.readConfig();\n if (!config.enabled) {\n respond(true, {\n lifetracks: [],\n total: 0,\n enabled: false,\n message:\n \"LifeTracks is not enabled. Enable it in Settings > Life > LifeTracks to generate personalized daily affirmations (~$0.16/track).\",\n });\n return;\n }\n\n const tracks = await mod.getAllTracks();\n if (tracks.length === 0) {\n respond(true, {\n lifetracks: [],\n total: 0,\n enabled: true,\n needsGeneration: true,\n message:\n \"LifeTracks is enabled but no tracks generated yet. Click 'Generate Today's Track' to create your first personalized affirmation.\",\n });\n return;\n }\n\n respond(true, { lifetracks: tracks, total: tracks.length, enabled: true });\n },\n async () => {\n respond(true, {\n lifetracks: [],\n total: 0,\n enabled: false,\n unavailable: true,\n message: unavailablePayload().message,\n });\n },\n );\n};\n\nconst getLifetrackToday: GatewayRequestHandler = async ({ respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const config = await mod.readConfig();\n if (!config.enabled) {\n respond(true, { lifetrack: null, enabled: false });\n return;\n }\n\n const todayTrack = await mod.getTodayTrack();\n const allTracks = await mod.getAllTracks();\n const mostRecent = allTracks[0] ?? null;\n\n respond(true, {\n lifetrack: todayTrack || mostRecent,\n isToday: !!todayTrack,\n enabled: true,\n hasAnyTracks: allTracks.length > 0,\n });\n },\n async () => {\n respond(true, { lifetrack: null, enabled: false, unavailable: true });\n },\n );\n};\n\nconst generateLifetrack: GatewayRequestHandler = async ({ params, respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const { date, force, theme, customTopic, customDuration } = params as {\n date?: string;\n force?: boolean;\n theme?: MeditationTheme;\n customTopic?: string;\n customDuration?: number;\n };\n const targetDate = date || new Date().toISOString().split(\"T\")[0];\n\n const config = await mod.readConfig();\n if (!config.enabled) {\n respond(false, null, {\n code: \"NOT_ENABLED\",\n message: \"LifeTracks is not enabled. Enable it first in settings.\",\n });\n return;\n }\n\n if (!force && (await mod.hasTrackForDate(targetDate))) {\n const existingTrack = await mod.getTodayTrack();\n respond(true, {\n generated: false,\n alreadyExists: true,\n track: existingTrack,\n message: `Track for ${targetDate} already exists. Use force=true to regenerate.`,\n });\n return;\n }\n\n const context = await buildGenerationContext();\n\n let customTheme: CustomThemeRequest | undefined;\n if (customTopic) {\n customTheme = {\n durationMinutes: customDuration || 5,\n topic: customTopic,\n };\n }\n\n const result = await mod.generateLifeTrack({\n date: targetDate,\n context,\n theme: customTheme ? \"custom\" : theme || config.generation?.defaultTheme || \"morning\",\n customTheme,\n });\n\n if (!result.success) {\n respond(false, null, {\n code: \"GENERATION_FAILED\",\n message: result.error || \"Failed to generate LifeTrack\",\n });\n return;\n }\n\n respond(true, {\n generated: true,\n track: result.trackEntry,\n audioPath: result.audioPath,\n scriptPath: result.scriptPath,\n duration: result.duration,\n cost: result.cost,\n chunkCount: result.chunkCount,\n theme: result.theme,\n warnings: result.warnings,\n });\n },\n async () => {\n respond(false, null, unavailablePayload());\n },\n );\n};\n\nconst getCostEstimate: GatewayRequestHandler = async ({ respond }) => {\n respond(true, {\n estimatedCost: 0.16,\n breakdown: {\n scriptGeneration: 0.01,\n voiceSynthesis: 0.15,\n },\n monthly: {\n daily: 4.8,\n weekly: 1.12,\n },\n });\n};\n\nconst getGenerationStats: GatewayRequestHandler = async ({ respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const config = await mod.readConfig();\n const tracks = await mod.getAllTracks();\n respond(true, {\n totalGenerated: config.stats?.totalGenerated || 0,\n lastGenerated: config.stats?.lastGenerated || null,\n estimatedTotalCost: config.stats?.estimatedCost || 0,\n currentTrackCount: tracks.length,\n retentionDays: config.retention?.days || 7,\n });\n },\n async () => {\n respond(true, {\n totalGenerated: 0,\n lastGenerated: null,\n estimatedTotalCost: 0,\n currentTrackCount: 0,\n retentionDays: 7,\n unavailable: true,\n });\n },\n );\n};\n\nconst checkPrerequisites: GatewayRequestHandler = async ({ respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const ffmpegAvailable = await mod.checkFfmpegAvailable();\n const hasAnthropicKey = !!process.env.ANTHROPIC_API_KEY;\n const hasElevenLabsKey = !!(process.env.ELEVENLABS_API_KEY || process.env.XI_API_KEY);\n\n respond(true, {\n ready: ffmpegAvailable && hasAnthropicKey && hasElevenLabsKey,\n ffmpeg: ffmpegAvailable,\n anthropicKey: hasAnthropicKey,\n elevenLabsKey: hasElevenLabsKey,\n missingItems: [\n !ffmpegAvailable && \"ffmpeg (brew install ffmpeg)\",\n !hasAnthropicKey && \"ANTHROPIC_API_KEY\",\n !hasElevenLabsKey && \"ELEVENLABS_API_KEY\",\n ].filter(Boolean),\n });\n },\n async () => {\n respond(true, {\n ready: false,\n ffmpeg: false,\n anthropicKey: !!process.env.ANTHROPIC_API_KEY,\n elevenLabsKey: !!(process.env.ELEVENLABS_API_KEY || process.env.XI_API_KEY),\n missingItems: [\"LifeTracks module unavailable\"],\n });\n },\n );\n};\n\nconst serveAudio: GatewayRequestHandler = async ({ params, respond }) => {\n const { date } = params as { date: string };\n if (!date) {\n respond(false, null, { code: \"MISSING_DATE\", message: \"date parameter required\" });\n return;\n }\n\n const audioPath = path.join(STATE_DIR, \"lifetracks\", \"audio\", `${date}.mp3`);\n if (!existsSync(audioPath)) {\n respond(false, null, { code: \"NOT_FOUND\", message: `No audio for date: ${date}` });\n return;\n }\n\n respond(true, {\n audioPath,\n url: `file://${audioPath}`,\n date,\n });\n};\n\nconst getThemes: GatewayRequestHandler = async ({ respond }) => {\n await withLifetrackModule(\n async (mod) => {\n const themes = Object.values(mod.THEME_REGISTRY).map((theme) => ({\n id: theme.id,\n label: theme.label,\n description: theme.description,\n durationMinutes: theme.durationMinutes,\n defaultBackingTrack: theme.defaultBackingTrack,\n }));\n respond(true, { themes, supportsCustom: true });\n },\n async () => {\n respond(true, { themes: [], supportsCustom: true, unavailable: true });\n },\n );\n};\n\nexport const lifetracksHandlers: GatewayRequestHandlers = {\n \"lifetracks.list\": getLifetracks,\n \"lifetracks.today\": getLifetrackToday,\n \"lifetracks.config.get\": getLifetracksConfig,\n \"lifetracks.config.update\": updateLifetracksConfig,\n \"lifetracks.generate\": generateLifetrack,\n \"lifetracks.themes\": getThemes,\n \"lifetracks.cost.estimate\": getCostEstimate,\n \"lifetracks.stats\": getGenerationStats,\n \"lifetracks.prerequisites\": checkPrerequisites,\n \"lifetracks.audio\": serveAudio,\n};\n","/**\n * Onboarding Gateway Methods\n *\n * Manages the 6-phase onboarding state for new GodMode users:\n * Phase 0: Welcome (full-screen)\n * Phase 1: Identity (name, mission, avatar)\n * Phase 2: Your World (projects, people, goals — agent-driven)\n * Phase 3: Connect Tools (integration grid + chat)\n * Phase 4: GodMode Audit (agent analysis)\n * Phase 5: First Win (agent demo)\n * Phase 6: Grand Reveal (summary + full UI)\n *\n * State persisted to ~/godmode/data/onboarding.json\n */\n\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst ONBOARDING_FILE = join(DATA_DIR, \"onboarding.json\");\n\ntype OnboardingPhase = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\ntype ToolConnection = {\n\tid: string;\n\tname: string;\n\tstatus: \"connected\" | \"pending\" | \"skipped\";\n\ticon?: string;\n};\n\ntype AuditFinding = {\n\tproblem: string;\n\tskill: string | null;\n\timpact: \"high\" | \"medium\" | \"low\";\n\testimatedTimeSaved?: string;\n};\n\ntype OnboardingState = {\n\tphase: OnboardingPhase;\n\tstartedAt: string;\n\tidentity: {\n\t\tname: string;\n\t\tmission: string;\n\t\temoji: string;\n\t} | null;\n\tcompletedPhases: number[];\n\ttools: ToolConnection[];\n\taudit: {\n\t\tfindings: AuditFinding[];\n\t};\n\tsummary: {\n\t\tprojects: number;\n\t\tpeople: number;\n\t\tgoals: number;\n\t\ttoolsConnected: number;\n\t\tautomations: number;\n\t} | null;\n\tcompletedAt: string | null;\n};\n\nconst DEFAULT_STATE: OnboardingState = {\n\tphase: 0,\n\tstartedAt: new Date().toISOString(),\n\tidentity: null,\n\tcompletedPhases: [],\n\ttools: [],\n\taudit: { findings: [] },\n\tsummary: null,\n\tcompletedAt: null,\n};\n\nasync function readOnboarding(): Promise<OnboardingState> {\n\ttry {\n\t\tconst raw = await readFile(ONBOARDING_FILE, \"utf-8\");\n\t\treturn JSON.parse(raw) as OnboardingState;\n\t} catch {\n\t\treturn { ...DEFAULT_STATE, startedAt: new Date().toISOString() };\n\t}\n}\n\nasync function writeOnboarding(state: OnboardingState): Promise<void> {\n\tawait mkdir(DATA_DIR, { recursive: true });\n\tawait writeFile(ONBOARDING_FILE, JSON.stringify(state, null, 2) + \"\\n\");\n}\n\nexport const onboardingHandlers: GatewayRequestHandlers = {\n\t/**\n\t * Get current onboarding status.\n\t * Returns the full onboarding state including phase, identity, tools, audit.\n\t */\n\t\"onboarding.status\": async ({ respond }) => {\n\t\tconst state = await readOnboarding();\n\t\trespond(true, state);\n\t},\n\n\t/**\n\t * Update onboarding state. Accepts partial updates:\n\t * - phase: advance to a specific phase\n\t * - identity: save name/mission/emoji\n\t * - tools: update tool connections array\n\t * - audit: update audit findings\n\t * - summary: update completion summary\n\t * - completePhase: mark a specific phase as completed\n\t */\n\t\"onboarding.update\": async ({ params, respond, context }) => {\n\t\tconst state = await readOnboarding();\n\n\t\tif (typeof params.phase === \"number\" && params.phase >= 0 && params.phase <= 6) {\n\t\t\tstate.phase = params.phase as OnboardingPhase;\n\t\t}\n\n\t\tif (params.identity && typeof params.identity === \"object\") {\n\t\t\tconst id = params.identity as Record<string, unknown>;\n\t\t\tstate.identity = {\n\t\t\t\tname: String(id.name ?? state.identity?.name ?? \"\"),\n\t\t\t\tmission: String(id.mission ?? state.identity?.mission ?? \"\"),\n\t\t\t\temoji: String(id.emoji ?? state.identity?.emoji ?? \"\"),\n\t\t\t};\n\t\t}\n\n\t\tif (Array.isArray(params.tools)) {\n\t\t\tstate.tools = params.tools as ToolConnection[];\n\t\t}\n\n\t\tif (params.audit && typeof params.audit === \"object\") {\n\t\t\tconst audit = params.audit as Record<string, unknown>;\n\t\t\tif (Array.isArray(audit.findings)) {\n\t\t\t\tstate.audit.findings = audit.findings as AuditFinding[];\n\t\t\t}\n\t\t}\n\n\t\tif (params.summary && typeof params.summary === \"object\") {\n\t\t\tstate.summary = params.summary as OnboardingState[\"summary\"];\n\t\t}\n\n\t\tif (typeof params.completePhase === \"number\") {\n\t\t\tif (!state.completedPhases.includes(params.completePhase)) {\n\t\t\t\tstate.completedPhases.push(params.completePhase);\n\t\t\t\tstate.completedPhases.sort();\n\t\t\t}\n\t\t}\n\n\t\tawait writeOnboarding(state);\n\n\t\t// Broadcast update event so UI reacts in real-time\n\t\ttry {\n\t\t\tcontext?.broadcast?.(\"onboarding:update\", state);\n\t\t} catch {\n\t\t\t// broadcast not available in all contexts\n\t\t}\n\n\t\trespond(true, state);\n\t},\n\n\t/**\n\t * Mark onboarding as complete. Writes final timestamp and phase 6.\n\t */\n\t\"onboarding.complete\": async ({ params, respond, context }) => {\n\t\tconst state = await readOnboarding();\n\t\tstate.phase = 6;\n\t\tstate.completedAt = new Date().toISOString();\n\n\t\t// Add phase 6 to completed if not already there\n\t\tif (!state.completedPhases.includes(6)) {\n\t\t\tstate.completedPhases.push(6);\n\t\t\tstate.completedPhases.sort();\n\t\t}\n\n\t\t// Accept optional summary data\n\t\tif (params.summary && typeof params.summary === \"object\") {\n\t\t\tstate.summary = params.summary as OnboardingState[\"summary\"];\n\t\t}\n\n\t\tawait writeOnboarding(state);\n\n\t\ttry {\n\t\t\tcontext?.broadcast?.(\"onboarding:update\", state);\n\t\t} catch {}\n\n\t\trespond(true, state);\n\t},\n\n\t/**\n\t * Reset onboarding to Phase 0. Used for \"start over\" or testing.\n\t */\n\t\"onboarding.reset\": async ({ respond, context }) => {\n\t\tconst state: OnboardingState = {\n\t\t\t...DEFAULT_STATE,\n\t\t\tstartedAt: new Date().toISOString(),\n\t\t};\n\t\tawait writeOnboarding(state);\n\n\t\ttry {\n\t\t\tcontext?.broadcast?.(\"onboarding:update\", state);\n\t\t} catch {}\n\n\t\trespond(true, state);\n\t},\n};\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst PEOPLE_DIR = join(DATA_DIR, \"people\");\n\ntype Person = {\n id: string;\n name: string;\n emoji?: string;\n company?: string;\n role?: string;\n tags: string[];\n email?: string;\n phone?: string;\n birthday?: string;\n lastContact?: string;\n notes?: string;\n projects?: string[];\n};\n\nasync function readPerson(id: string): Promise<Person | null> {\n try {\n const raw = await readFile(join(PEOPLE_DIR, `${id}.json`), \"utf-8\");\n return JSON.parse(raw) as Person;\n } catch {\n return null;\n }\n}\n\nconst listPeople: GatewayRequestHandler = async ({ respond }) => {\n try {\n const files = await readdir(PEOPLE_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const people: Person[] = [];\n for (const file of jsonFiles) {\n try {\n const raw = await readFile(join(PEOPLE_DIR, file), \"utf-8\");\n people.push(JSON.parse(raw) as Person);\n } catch {\n // Skip unreadable files\n }\n }\n respond(true, { people });\n } catch {\n respond(true, { people: [] });\n }\n};\n\nconst getPerson: GatewayRequestHandler = async ({ params, respond }) => {\n const { id } = params as { id?: string };\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing person id\" });\n return;\n }\n const person = await readPerson(id);\n respond(true, person);\n};\n\nconst searchPeople: GatewayRequestHandler = async ({ params, respond }) => {\n const { query } = params as { query?: string };\n if (!query) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing search query\" });\n return;\n }\n const q = query.toLowerCase();\n try {\n const files = await readdir(PEOPLE_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const results: Person[] = [];\n for (const file of jsonFiles) {\n try {\n const raw = await readFile(join(PEOPLE_DIR, file), \"utf-8\");\n const person = JSON.parse(raw) as Person;\n const searchable = [person.name, person.company, person.role, ...(person.tags ?? [])]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n if (searchable.includes(q)) {\n results.push(person);\n }\n } catch {\n // Skip unreadable files\n }\n }\n respond(true, { people: results });\n } catch {\n respond(true, { people: [] });\n }\n};\n\nexport const peopleDataHandlers: GatewayRequestHandlers = {\n \"people.list\": listPeople,\n \"people.get\": getPerson,\n \"people.search\": searchPeople,\n};\n","import { randomUUID } from \"node:crypto\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join, extname } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst PROJECTS_FILE = join(DATA_DIR, \"projects.json\");\n\ntype Project = {\n id: string;\n name: string;\n emoji: string;\n folder?: string | null;\n tasks: Array<{ id: string; title: string; status: string; dueDate?: string }>;\n outputs: Array<{ id: string; title: string; url?: string; type: string }>;\n people: string[];\n skills: string[];\n automations?: string[];\n status: \"active\" | \"archived\" | \"paused\";\n};\n\ntype ProjectsData = { projects: Project[] };\n\nasync function readProjects(): Promise<ProjectsData> {\n try {\n const raw = await readFile(PROJECTS_FILE, \"utf-8\");\n return JSON.parse(raw) as ProjectsData;\n } catch {\n return { projects: [] };\n }\n}\n\nconst MAX_KEY_FILES = 20;\n\nconst KEY_NAMES = new Set([\n \"readme.md\", \"readme\", \"index.ts\", \"index.js\", \"index.html\",\n \"package.json\", \"tsconfig.json\", \"vite.config.ts\", \"vite.config.js\",\n \"claude.md\", \"runbook.md\", \"playbook.md\", \".env.example\",\n \"dockerfile\", \"docker-compose.yml\", \"docker-compose.yaml\",\n \"makefile\", \"cargo.toml\", \"pyproject.toml\", \"go.mod\",\n]);\n\nconst KEY_EXTENSIONS = new Set([\n \".md\", \".html\", \".json\", \".yaml\", \".yml\", \".toml\",\n \".ts\", \".js\", \".py\", \".sh\", \".css\",\n]);\n\nconst SKIP_DIRS = new Set([\n \"node_modules\", \"dist\", \"build\", \".git\", \"__pycache__\",\n \"venv\", \".next\", \".nuxt\", \"coverage\", \".turbo\", \".cache\",\n]);\n\ntype ScannedItem = {\n id: string;\n name: string;\n type: \"file\" | \"directory\";\n path: string;\n size?: number;\n modifiedAt?: number;\n children?: ScannedItem[];\n};\n\nfunction filterKeyFiles(items: ScannedItem[]): ScannedItem[] {\n const result: ScannedItem[] = [];\n function collect(nodes: ScannedItem[]) {\n for (const node of nodes) {\n if (result.length >= MAX_KEY_FILES) return;\n if (node.type === \"directory\") {\n if (SKIP_DIRS.has(node.name.toLowerCase())) continue;\n if (node.children) collect(node.children);\n continue;\n }\n const lower = node.name.toLowerCase();\n const ext = extname(lower);\n if (KEY_NAMES.has(lower) || KEY_EXTENSIONS.has(ext)) {\n result.push({ ...node, children: undefined });\n }\n }\n }\n collect(items);\n return result;\n}\n\nconst listProjects: GatewayRequestHandler = async ({ respond }) => {\n const data = await readProjects();\n respond(true, data);\n};\n\nconst getProject: GatewayRequestHandler = async ({ params, respond }) => {\n const { id, includeFiles, depth } = params as {\n id?: string;\n includeFiles?: boolean;\n depth?: number;\n };\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing project id\" });\n return;\n }\n const data = await readProjects();\n const project = data.projects.find((p) => p.id === id);\n if (!project) {\n respond(true, null);\n return;\n }\n\n if (includeFiles && project.folder) {\n try {\n // Dynamic import to avoid circular deps — expandPath and scanDirectory\n // come from the workspaces handler\n const { expandPath, scanDirectory } = await import(\"./workspaces.js\");\n const expandedPath = expandPath(project.folder);\n const rawFiles = await scanDirectory(expandedPath, Math.min(depth ?? 2, 4));\n const files = filterKeyFiles(rawFiles);\n respond(true, { ...project, files });\n } catch (err) {\n console.warn(\"[Projects] Failed to scan folder:\", err);\n respond(true, { ...project, files: [] });\n }\n } else {\n respond(true, project);\n }\n};\n\nconst createProject: GatewayRequestHandler = async ({ params, respond }) => {\n const { name, emoji, folder, status } = params as {\n name?: string;\n emoji?: string;\n folder?: string;\n status?: \"active\" | \"archived\" | \"paused\";\n };\n if (!name) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing project name\" });\n return;\n }\n\n const project: Project = {\n id: randomUUID(),\n name,\n emoji: emoji || \"\\u{1F4C1}\",\n folder: folder || null,\n tasks: [],\n outputs: [],\n people: [],\n skills: [],\n automations: [],\n status: status || \"active\",\n };\n\n if (project.folder) {\n try {\n const { expandPath } = await import(\"./workspaces.js\");\n const expandedFolder = expandPath(project.folder);\n await mkdir(expandedFolder, { recursive: true });\n } catch (err) {\n console.warn(\"[Projects] mkdir warning:\", err);\n }\n }\n\n const data = await readProjects();\n data.projects.push(project);\n await writeFile(PROJECTS_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n respond(true, project);\n};\n\nconst updateProjects: GatewayRequestHandler = async ({ params, respond }) => {\n const { projects } = params as { projects?: Project[] };\n if (!projects || !Array.isArray(projects)) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing projects array\" });\n return;\n }\n const data: ProjectsData = { projects };\n await writeFile(PROJECTS_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n respond(true, data);\n};\n\nexport const projectsHandlers: GatewayRequestHandlers = {\n \"projects.list\": listProjects,\n \"projects.get\": getProject,\n \"projects.create\": createProject,\n \"projects.update\": updateProjects,\n};\n","/**\n * Subagent runs handlers backed by on-disk session stores.\n */\n\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { STATE_DIR } from \"../lib/openclaw-state.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\ntype SessionEntry = {\n sessionId?: string;\n updatedAt?: number;\n spawnedBy?: string;\n displayName?: string;\n label?: string;\n subject?: string;\n model?: string;\n modelOverride?: string;\n abortedLastRun?: boolean;\n spawnDepth?: number;\n};\n\ntype SessionStore = Record<string, SessionEntry>;\n\ntype SerializedRun = {\n runId: string;\n childSessionKey: string;\n requesterSessionKey: string;\n task: string;\n label: string | null;\n model: string | null;\n spawnMode: \"run\" | \"session\";\n cleanup: \"delete\" | \"keep\";\n createdAt: number;\n startedAt: number | null;\n endedAt: number | null;\n endedReason: string | null;\n outcome: { status: \"ok\" | \"error\" | \"timeout\"; error: string | null } | null;\n};\n\nconst ACTIVE_WINDOW_MS = 2 * 60 * 1000;\n\nfunction deriveRequesterSessionKey(childSessionKey: string, entry: SessionEntry): string {\n const explicit = typeof entry.spawnedBy === \"string\" ? entry.spawnedBy.trim() : \"\";\n if (explicit) {\n return explicit;\n }\n\n const marker = \":subagent:\";\n const idx = childSessionKey.lastIndexOf(marker);\n if (idx > 0) {\n return childSessionKey.slice(0, idx);\n }\n return childSessionKey;\n}\n\nfunction deriveTaskName(key: string, entry: SessionEntry): string {\n const title =\n (typeof entry.displayName === \"string\" && entry.displayName.trim()) ||\n (typeof entry.label === \"string\" && entry.label.trim()) ||\n (typeof entry.subject === \"string\" && entry.subject.trim()) ||\n \"\";\n if (title) {\n return title;\n }\n\n const tail = key.split(\":subagent:\").pop();\n return tail && tail.trim() ? tail.trim() : \"Subagent task\";\n}\n\nfunction normalizeUpdatedAt(entry: SessionEntry): number {\n return typeof entry.updatedAt === \"number\" && Number.isFinite(entry.updatedAt)\n ? entry.updatedAt\n : Date.now();\n}\n\nfunction toRun(key: string, entry: SessionEntry): SerializedRun {\n const updatedAt = normalizeUpdatedAt(entry);\n const active = Date.now() - updatedAt < ACTIVE_WINDOW_MS;\n const endedAt = active ? null : updatedAt;\n const isError = !!entry.abortedLastRun;\n\n return {\n runId: entry.sessionId || `subagent:${key}`,\n childSessionKey: key,\n requesterSessionKey: deriveRequesterSessionKey(key, entry),\n task: deriveTaskName(key, entry),\n label: typeof entry.label === \"string\" ? entry.label : null,\n model:\n (typeof entry.model === \"string\" && entry.model) ||\n (typeof entry.modelOverride === \"string\" && entry.modelOverride) ||\n null,\n spawnMode: \"run\",\n cleanup: \"keep\",\n createdAt: updatedAt,\n startedAt: updatedAt,\n endedAt,\n endedReason: endedAt ? (isError ? \"error\" : \"complete\") : null,\n outcome: endedAt\n ? {\n status: isError ? \"error\" : \"ok\",\n error: isError ? \"Session ended with abortedLastRun=true\" : null,\n }\n : null,\n };\n}\n\nasync function safeReadJson(pathname: string): Promise<SessionStore | null> {\n try {\n const raw = await fsp.readFile(pathname, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n return parsed as SessionStore;\n } catch {\n return null;\n }\n}\n\nasync function listSessionStores(): Promise<string[]> {\n const stores = new Set<string>();\n stores.add(path.join(STATE_DIR, \"sessions\", \"sessions.json\"));\n\n try {\n const agentsDir = path.join(STATE_DIR, \"agents\");\n const entries = await fsp.readdir(agentsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n stores.add(path.join(agentsDir, entry.name, \"sessions\", \"sessions.json\"));\n }\n } catch {\n // Ignore missing agents directory.\n }\n\n return Array.from(stores);\n}\n\nasync function loadSubagentRunsFromSessions(): Promise<SerializedRun[]> {\n const merged = new Map<string, SessionEntry>();\n\n const stores = await listSessionStores();\n await Promise.all(\n stores.map(async (pathname) => {\n const store = await safeReadJson(pathname);\n if (!store) {\n return;\n }\n for (const [key, entry] of Object.entries(store)) {\n const isSubagentKey = key.includes(\":subagent:\");\n const isSpawned = (entry.spawnDepth ?? 0) > 0;\n if (!isSubagentKey && !isSpawned) {\n continue;\n }\n const previous = merged.get(key);\n const prevUpdatedAt = previous?.updatedAt ?? 0;\n const nextUpdatedAt = entry?.updatedAt ?? 0;\n if (!previous || nextUpdatedAt >= prevUpdatedAt) {\n merged.set(key, entry || {});\n }\n }\n }),\n );\n\n return Array.from(merged.entries()).map(([key, entry]) => toRun(key, entry));\n}\n\nfunction sortRuns(runs: SerializedRun[]): SerializedRun[] {\n const out = [...runs];\n out.sort((a, b) => {\n if (!a.endedAt && b.endedAt) {\n return -1;\n }\n if (a.endedAt && !b.endedAt) {\n return 1;\n }\n if (!a.endedAt && !b.endedAt) {\n return (b.startedAt ?? b.createdAt) - (a.startedAt ?? a.createdAt);\n }\n return (b.endedAt ?? 0) - (a.endedAt ?? 0);\n });\n return out;\n}\n\nfunction isDescendantRun(rootSessionKey: string, run: SerializedRun): boolean {\n if (!rootSessionKey) {\n return false;\n }\n if (run.childSessionKey.startsWith(`${rootSessionKey}:subagent:`)) {\n return true;\n }\n if (run.requesterSessionKey === rootSessionKey) {\n return true;\n }\n return run.requesterSessionKey.startsWith(`${rootSessionKey}:subagent:`);\n}\n\nexport const subagentRunsHandlers: GatewayRequestHandlers = {\n \"subagents.list\": async ({ params, respond }) => {\n const p = params as {\n requesterSessionKey?: string;\n activeOnly?: boolean;\n limit?: number;\n };\n\n const limit = typeof p.limit === \"number\" ? Math.min(p.limit, 500) : 100;\n let runs = await loadSubagentRunsFromSessions();\n\n if (typeof p.requesterSessionKey === \"string\" && p.requesterSessionKey.trim()) {\n const requester = p.requesterSessionKey.trim();\n runs = runs.filter((run) => run.requesterSessionKey === requester);\n }\n\n if (p.activeOnly) {\n runs = runs.filter((run) => !run.endedAt);\n }\n\n const sorted = sortRuns(runs);\n const limited = sorted.slice(0, limit);\n const activeCount = sorted.filter((run) => !run.endedAt).length;\n\n respond(\n true,\n {\n runs: limited,\n activeCount,\n totalCount: sorted.length,\n },\n undefined,\n );\n },\n\n \"subagents.countDescendants\": async ({ params, respond }) => {\n const p = params as { rootSessionKey?: string };\n const rootSessionKey = typeof p.rootSessionKey === \"string\" ? p.rootSessionKey.trim() : \"\";\n if (!rootSessionKey) {\n respond(true, { count: 0 }, undefined);\n return;\n }\n\n const runs = await loadSubagentRunsFromSessions();\n const count = runs.filter((run) => !run.endedAt && isDescendantRun(rootSessionKey, run)).length;\n respond(true, { count }, undefined);\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { DATA_DIR } from \"../data-paths.js\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst TASKS_FILE = join(DATA_DIR, \"tasks.json\");\n\ntype NativeTask = {\n id: string;\n title: string;\n status: \"pending\" | \"complete\";\n project: string | null;\n dueDate: string | null;\n priority: \"high\" | \"medium\" | \"low\";\n createdAt: string;\n completedAt: string | null;\n carryOver: boolean;\n source: \"chat\" | \"cron\" | \"import\";\n};\n\ntype TasksData = {\n tasks: NativeTask[];\n updatedAt: string | null;\n};\n\nasync function readTasks(): Promise<TasksData> {\n try {\n const raw = await readFile(TASKS_FILE, \"utf-8\");\n return JSON.parse(raw) as TasksData;\n } catch {\n return { tasks: [], updatedAt: null };\n }\n}\n\nasync function writeTasks(data: TasksData): Promise<void> {\n data.updatedAt = new Date().toISOString();\n await writeFile(TASKS_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n}\n\nfunction todayDateStr(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nconst listTasks: GatewayRequestHandler = async ({ params, respond }) => {\n const { status, project, dueDate, dueBefore, dueAfter } = params as {\n status?: string;\n project?: string;\n dueDate?: string;\n dueBefore?: string;\n dueAfter?: string;\n };\n const data = await readTasks();\n let filtered = data.tasks;\n\n if (status) {\n filtered = filtered.filter((t) => t.status === status);\n }\n if (project) {\n filtered = filtered.filter((t) => t.project === project);\n }\n if (dueDate) {\n filtered = filtered.filter((t) => t.dueDate === dueDate);\n }\n if (dueBefore) {\n filtered = filtered.filter((t) => t.dueDate != null && t.dueDate < dueBefore);\n }\n if (dueAfter) {\n filtered = filtered.filter((t) => t.dueDate != null && t.dueDate > dueAfter);\n }\n\n respond(true, { tasks: filtered, updatedAt: data.updatedAt });\n};\n\nconst todayTasks: GatewayRequestHandler = async ({ respond }) => {\n const data = await readTasks();\n const today = todayDateStr();\n const tasks = data.tasks.filter(\n (t) => t.status === \"pending\" && t.dueDate != null && t.dueDate <= today,\n );\n respond(true, { tasks });\n};\n\nconst upcomingTasks: GatewayRequestHandler = async ({ respond }) => {\n const data = await readTasks();\n const today = todayDateStr();\n const tasks = data.tasks.filter(\n (t) => t.status === \"pending\" && t.dueDate != null && t.dueDate > today,\n );\n respond(true, { tasks });\n};\n\nconst getTask: GatewayRequestHandler = async ({ params, respond }) => {\n const { id } = params as { id?: string };\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing task id\" });\n return;\n }\n const data = await readTasks();\n const task = data.tasks.find((t) => t.id === id);\n if (!task) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Task not found\" });\n return;\n }\n respond(true, task);\n};\n\nconst createTask: GatewayRequestHandler = async ({ params, respond }) => {\n const { title, project, dueDate, priority, source } = params as {\n title?: string;\n project?: string | null;\n dueDate?: string | null;\n priority?: \"high\" | \"medium\" | \"low\";\n source?: \"chat\" | \"cron\" | \"import\";\n };\n if (!title) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing task title\" });\n return;\n }\n const task: NativeTask = {\n id: crypto.randomUUID(),\n title,\n status: \"pending\",\n project: project ?? null,\n dueDate: dueDate ?? null,\n priority: priority ?? \"medium\",\n createdAt: new Date().toISOString(),\n completedAt: null,\n carryOver: false,\n source: source ?? \"chat\",\n };\n const data = await readTasks();\n data.tasks.push(task);\n await writeTasks(data);\n respond(true, task);\n};\n\nconst updateTask: GatewayRequestHandler = async ({ params, respond }) => {\n const { id, ...updates } = params as { id?: string } & Partial<NativeTask>;\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing task id\" });\n return;\n }\n const data = await readTasks();\n const idx = data.tasks.findIndex((t) => t.id === id);\n if (idx === -1) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Task not found\" });\n return;\n }\n const task = data.tasks[idx];\n const allowedKeys: (keyof NativeTask)[] = [\n \"title\",\n \"status\",\n \"project\",\n \"dueDate\",\n \"priority\",\n \"completedAt\",\n \"carryOver\",\n \"source\",\n ];\n for (const key of allowedKeys) {\n if (key in updates) {\n (task as Record<string, unknown>)[key] = (updates as Record<string, unknown>)[key];\n }\n }\n if (updates.status === \"complete\" && !task.completedAt) {\n task.completedAt = new Date().toISOString();\n }\n data.tasks[idx] = task;\n await writeTasks(data);\n respond(true, task);\n};\n\nconst deleteTask: GatewayRequestHandler = async ({ params, respond }) => {\n const { id } = params as { id?: string };\n if (!id) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Missing task id\" });\n return;\n }\n const data = await readTasks();\n const idx = data.tasks.findIndex((t) => t.id === id);\n if (idx === -1) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Task not found\" });\n return;\n }\n const removed = data.tasks.splice(idx, 1)[0];\n await writeTasks(data);\n respond(true, removed);\n};\n\nconst carryOverTasks: GatewayRequestHandler = async ({ respond }) => {\n const data = await readTasks();\n const today = todayDateStr();\n let count = 0;\n for (const task of data.tasks) {\n if (task.status === \"pending\" && task.dueDate != null && task.dueDate < today) {\n task.carryOver = true;\n count++;\n }\n }\n if (count > 0) {\n await writeTasks(data);\n }\n respond(true, { carried: count });\n};\n\nexport const tasksHandlers: GatewayRequestHandlers = {\n \"tasks.list\": listTasks,\n \"tasks.today\": todayTasks,\n \"tasks.upcoming\": upcomingTasks,\n \"tasks.get\": getTask,\n \"tasks.create\": createTask,\n \"tasks.update\": updateTask,\n \"tasks.delete\": deleteTask,\n \"tasks.carryOver\": carryOverTasks,\n};\n","import type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\nimport {\n appendFeedMessage,\n createFeedMessage,\n FEED_MESSAGE_TYPES,\n getUnreadMessages,\n markFeedRead,\n readFeed,\n resolveFeedPath,\n type FeedMessageType,\n} from \"../lib/team-feed.js\";\nimport { getWorkspaceSyncService } from \"../lib/workspace-sync-service.js\";\nimport { findWorkspaceById, readWorkspaceConfig } from \"../lib/workspaces-config.js\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst ErrorCodes = {\n INVALID_REQUEST: \"INVALID_REQUEST\",\n NOT_FOUND: \"NOT_FOUND\",\n} as const;\n\nfunction errorShape(code: string, message: string) {\n return { code, message };\n}\n\nconst VALID_TYPES = new Set<string>(FEED_MESSAGE_TYPES);\n\n/**\n * comms.send — append a message to the team feed.\n *\n * Params:\n * - workspaceId (string, required)\n * - from (string, required) — sender identifier\n * - type (string, required) — handoff | question | alert | blocked | fyi\n * - msg (string, required) — message body\n * - to (string, optional) — recipient identifier\n * - re (string, optional) — reference to another message id\n * - context (object, optional) — extra metadata\n */\nconst send: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const from = typeof params.from === \"string\" ? String(params.from).trim() : \"\";\n const type = typeof params.type === \"string\" ? String(params.type).trim().toLowerCase() : \"\";\n const msg = typeof params.msg === \"string\" ? String(params.msg).trim() : \"\";\n const to = typeof params.to === \"string\" ? String(params.to).trim() : undefined;\n const re = typeof params.re === \"string\" ? String(params.re).trim() : undefined;\n const context =\n params.context && typeof params.context === \"object\" && !Array.isArray(params.context)\n ? (params.context as Record<string, unknown>)\n : undefined;\n\n if (!workspaceId || !from || !type || !msg) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId, from, type, and msg are required\"),\n );\n return;\n }\n\n if (!VALID_TYPES.has(type)) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, `Invalid type: ${type}. Must be one of: ${[...VALID_TYPES].join(\", \")}`),\n );\n return;\n }\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(false, undefined, errorShape(ErrorCodes.NOT_FOUND, `workspace not found: ${workspaceId}`));\n return;\n }\n\n const feedPath = resolveFeedPath(workspace.path);\n const message = createFeedMessage({\n from,\n type: type as FeedMessageType,\n msg,\n to,\n re,\n context,\n });\n\n await appendFeedMessage(feedPath, message);\n\n // Push to git immediately\n try {\n const syncService = getWorkspaceSyncService();\n await syncService.pushNow(workspace.id);\n } catch {\n // Non-fatal\n }\n\n respond(true, { message });\n};\n\n/**\n * comms.feed — read recent messages from the team feed.\n *\n * Params:\n * - workspaceId (string, required)\n * - since (string, optional) — ISO timestamp\n * - limit (number, optional, default 50)\n */\nconst feed: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const since = typeof params.since === \"string\" ? String(params.since).trim() : undefined;\n const limit = typeof params.limit === \"number\" ? params.limit : 50;\n\n if (!workspaceId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId is required\"));\n return;\n }\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(false, undefined, errorShape(ErrorCodes.NOT_FOUND, `workspace not found: ${workspaceId}`));\n return;\n }\n\n const feedPath = resolveFeedPath(workspace.path);\n const messages = await readFeed(feedPath, { since, limit });\n respond(true, { messages, count: messages.length });\n};\n\n/**\n * comms.unread — get unread messages for a member.\n *\n * Params:\n * - workspaceId (string, required)\n * - memberId (string, required)\n * - markRead (boolean, optional, default false)\n */\nconst unread: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const memberId = typeof params.memberId === \"string\" ? String(params.memberId).trim() : \"\";\n const shouldMarkRead = Boolean(params.markRead);\n\n if (!workspaceId || !memberId) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId and memberId are required\"),\n );\n return;\n }\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(false, undefined, errorShape(ErrorCodes.NOT_FOUND, `workspace not found: ${workspaceId}`));\n return;\n }\n\n const messages = await getUnreadMessages(workspace.path, memberId);\n\n if (shouldMarkRead && messages.length > 0) {\n await markFeedRead(workspace.path, memberId, messages);\n }\n\n respond(true, { messages, count: messages.length });\n};\n\nexport const teamCommsHandlers: GatewayRequestHandlers = {\n \"comms.send\": send,\n \"comms.feed\": feed,\n \"comms.unread\": unread,\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\nimport { getCurationAgentService } from \"../services/curation-agent.js\";\nimport { findWorkspaceById, readWorkspaceConfig } from \"../lib/workspaces-config.js\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst ErrorCodes = {\n INVALID_REQUEST: \"INVALID_REQUEST\",\n NOT_FOUND: \"NOT_FOUND\",\n} as const;\n\nfunction errorShape(code: string, message: string) {\n return { code, message };\n}\n\n/**\n * curation.run — manually trigger curation for a workspace.\n *\n * Params:\n * - workspaceId (string, required)\n */\nconst run: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n\n if (!workspaceId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId is required\"));\n return;\n }\n\n const service = getCurationAgentService();\n const result = await service.runCuration(workspaceId);\n respond(result.ok, result.ok ? { workspaceId, ...result } : undefined, result.ok ? undefined : errorShape(\"CURATION_FAILED\", result.error || \"unknown\"));\n};\n\n/**\n * curation.status — get curation status for a workspace.\n *\n * Params:\n * - workspaceId (string, optional) — if omitted, returns all\n */\nconst status: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const service = getCurationAgentService();\n\n if (workspaceId) {\n const state = service.getStatus(workspaceId);\n respond(true, { workspaceId, curation: state });\n } else {\n const statuses = service.listStatuses();\n respond(true, { statuses });\n }\n};\n\n/**\n * curation.candidates — read SOP candidates file for a workspace.\n *\n * Params:\n * - workspaceId (string, required)\n */\nconst candidates: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n\n if (!workspaceId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId is required\"));\n return;\n }\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(false, undefined, errorShape(ErrorCodes.NOT_FOUND, `workspace not found: ${workspaceId}`));\n return;\n }\n\n const candidatesPath = path.join(workspace.path, \"memory\", \"sop-candidates.md\");\n try {\n const content = await fs.readFile(candidatesPath, \"utf-8\");\n respond(true, { workspaceId, content });\n } catch {\n respond(true, { workspaceId, content: null });\n }\n};\n\nexport const teamCurationHandlers: GatewayRequestHandlers = {\n \"curation.run\": run,\n \"curation.status\": status,\n \"curation.candidates\": candidates,\n};\n","import { execFile as execFileCb } from \"node:child_process\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\nimport {\n addMemberToWorkspace,\n readWorkspaceMetadata,\n resolveGitMemberId,\n scaffoldTeamWorkspace,\n} from \"../lib/team-workspace-scaffold.js\";\nimport { getWorkspaceSyncService } from \"../lib/workspace-sync-service.js\";\nimport {\n createWorkspaceId,\n ensureWorkspaceFolders,\n findWorkspaceById,\n readWorkspaceConfig,\n resolveGodModeRoot,\n toDisplayPath,\n writeWorkspaceConfig,\n type WorkspaceConfigEntry,\n} from \"../lib/workspaces-config.js\";\n\nconst execFile = promisify(execFileCb);\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst ErrorCodes = {\n INVALID_REQUEST: \"INVALID_REQUEST\",\n GIT_ERROR: \"GIT_ERROR\",\n NOT_FOUND: \"NOT_FOUND\",\n} as const;\n\nfunction errorShape(code: string, message: string) {\n return { code, message };\n}\n\nasync function gitClone(repoUrl: string, targetPath: string, branch?: string): Promise<void> {\n const args = [\"clone\"];\n if (branch) {\n args.push(\"--branch\", branch);\n }\n args.push(repoUrl, targetPath);\n await execFile(\"git\", args, { maxBuffer: 10 * 1024 * 1024 });\n}\n\nasync function gitInit(targetPath: string): Promise<void> {\n await execFile(\"git\", [\"init\"], { cwd: targetPath, maxBuffer: 1024 * 1024 });\n}\n\nasync function gitAddCommitPush(\n targetPath: string,\n message: string,\n remote?: string,\n branch?: string,\n): Promise<void> {\n const opts = { cwd: targetPath, maxBuffer: 5 * 1024 * 1024 };\n await execFile(\"git\", [\"add\", \"-A\"], opts);\n try {\n await execFile(\"git\", [\"commit\", \"-m\", message], opts);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.toLowerCase().includes(\"nothing to commit\")) {\n throw err;\n }\n }\n if (remote) {\n await execFile(\"git\", [\"push\", remote, branch || \"main\"], opts);\n }\n}\n\nfunction resolveGithubUrl(github: string): string {\n if (github.startsWith(\"http://\") || github.startsWith(\"https://\") || github.startsWith(\"git@\")) {\n return github;\n }\n // \"org/repo\" shorthand\n return `https://github.com/${github}.git`;\n}\n\n/**\n * workspace.createTeam — create a new team workspace backed by a GitHub repo.\n *\n * Params:\n * - name (string, required)\n * - github (string, optional) — \"org/repo\" or full URL. If provided, clones; otherwise inits locally.\n * - branch (string, optional, default \"main\")\n * - path (string, optional) — override workspace path\n */\nconst createTeam: GatewayRequestHandler = async ({ params, respond }) => {\n const name = typeof params.name === \"string\" ? String(params.name).trim() : \"\";\n const github = typeof params.github === \"string\" ? String(params.github).trim() : \"\";\n const branch = typeof params.branch === \"string\" ? String(params.branch).trim() : \"main\";\n const explicitPath = typeof params.path === \"string\" ? String(params.path).trim() : \"\";\n\n if (!name) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"name is required\"));\n return;\n }\n\n const config = await readWorkspaceConfig();\n const existingIds = new Set(config.workspaces.map((w) => w.id));\n const id = createWorkspaceId(name, existingIds);\n\n const root = resolveGodModeRoot();\n const workspacePath = explicitPath\n ? path.resolve(explicitPath)\n : path.join(root, \"clients\", id);\n\n try {\n if (github) {\n await gitClone(resolveGithubUrl(github), workspacePath, branch);\n } else {\n await ensureWorkspaceFolders(workspacePath, \"team\");\n await gitInit(workspacePath);\n }\n } catch (err) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.GIT_ERROR, `Git setup failed: ${err instanceof Error ? err.message : String(err)}`),\n );\n return;\n }\n\n const creatorId = await resolveGitMemberId(workspacePath);\n const metadata = await scaffoldTeamWorkspace({\n workspacePath,\n name,\n id,\n github: github || undefined,\n creatorName: creatorId,\n creatorId,\n });\n\n // Initial commit + push if remote exists\n try {\n const remote = github ? \"origin\" : undefined;\n await gitAddCommitPush(workspacePath, `Initialize ${name} team workspace`, remote, branch);\n } catch {\n // Push may fail if repo is empty or no remote — non-fatal\n }\n\n const workspace: WorkspaceConfigEntry = {\n id,\n name,\n emoji: \"👥\",\n type: \"team\",\n path: workspacePath,\n keywords: [id, name.toLowerCase()],\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\", \"artifacts\"],\n sync: {\n type: \"git\",\n remote: github ? \"origin\" : undefined,\n branch,\n autoPull: { enabled: true, interval: \"30s\" },\n autoPush: { enabled: true, debounceMs: 5000 },\n },\n team: {\n github: github || undefined,\n role: \"admin\",\n memberId: creatorId,\n },\n curation: { enabled: true },\n };\n\n config.workspaces.push(workspace);\n await writeWorkspaceConfig(config);\n\n // Refresh sync service to pick up the new workspace\n const syncService = getWorkspaceSyncService();\n await syncService.refreshFromConfig(config);\n\n respond(true, {\n workspace: { ...workspace, path: toDisplayPath(workspace.path) },\n metadata,\n });\n};\n\n/**\n * workspace.joinTeam — clone an existing team workspace and join as a member.\n *\n * Params:\n * - github (string, required) — \"org/repo\" or full URL\n * - branch (string, optional, default \"main\")\n * - path (string, optional)\n */\nconst joinTeam: GatewayRequestHandler = async ({ params, respond }) => {\n const github = typeof params.github === \"string\" ? String(params.github).trim() : \"\";\n const branch = typeof params.branch === \"string\" ? String(params.branch).trim() : \"main\";\n const explicitPath = typeof params.path === \"string\" ? String(params.path).trim() : \"\";\n\n if (!github) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"github is required\"));\n return;\n }\n\n const config = await readWorkspaceConfig();\n\n // Derive name from github \"org/repo\" or URL\n const repoName = github.split(\"/\").pop()?.replace(/\\.git$/, \"\") || \"team\";\n const existingIds = new Set(config.workspaces.map((w) => w.id));\n const id = createWorkspaceId(repoName, existingIds);\n\n const root = resolveGodModeRoot();\n const workspacePath = explicitPath\n ? path.resolve(explicitPath)\n : path.join(root, \"clients\", id);\n\n try {\n await gitClone(resolveGithubUrl(github), workspacePath, branch);\n } catch (err) {\n respond(\n false,\n undefined,\n errorShape(ErrorCodes.GIT_ERROR, `Clone failed: ${err instanceof Error ? err.message : String(err)}`),\n );\n return;\n }\n\n const metadata = await readWorkspaceMetadata(workspacePath);\n if (!metadata) {\n // Not a GodMode team workspace — clean up and fail\n try {\n const { rm } = await import(\"node:fs/promises\");\n await rm(workspacePath, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n respond(\n false,\n undefined,\n errorShape(\n ErrorCodes.INVALID_REQUEST,\n \"Repository is not a GodMode team workspace (missing .godmode/workspace.json). \" +\n \"Use 'workspace.createTeam' to initialize a new team workspace instead.\",\n ),\n );\n return;\n }\n\n const memberId = await resolveGitMemberId(workspacePath);\n const displayName = metadata.name || repoName;\n\n // Add ourselves as a member\n if (metadata) {\n await addMemberToWorkspace({\n workspacePath,\n memberId,\n memberName: memberId,\n role: \"member\",\n });\n\n try {\n await gitAddCommitPush(workspacePath, `${memberId} joined workspace`, \"origin\", branch);\n } catch {\n // Non-fatal — push may fail\n }\n }\n\n const workspace: WorkspaceConfigEntry = {\n id,\n name: displayName,\n emoji: \"👥\",\n type: \"team\",\n path: workspacePath,\n keywords: [id, displayName.toLowerCase()],\n pinned: [],\n pinnedSessions: [],\n artifactDirs: [\"outputs\", \"artifacts\"],\n sync: {\n type: \"git\",\n remote: \"origin\",\n branch,\n autoPull: { enabled: true, interval: \"30s\" },\n autoPush: { enabled: true, debounceMs: 5000 },\n },\n team: {\n github,\n role: \"member\",\n memberId,\n },\n curation: metadata ? { enabled: true } : undefined,\n };\n\n config.workspaces.push(workspace);\n await writeWorkspaceConfig(config);\n\n const syncService = getWorkspaceSyncService();\n await syncService.refreshFromConfig(config);\n\n respond(true, {\n workspace: { ...workspace, path: toDisplayPath(workspace.path) },\n metadata,\n });\n};\n\n/**\n * workspace.leaveTeam — remove a team workspace from local config.\n *\n * Params:\n * - workspaceId (string, required)\n * - removeMember (boolean, optional) — also remove self from workspace.json\n */\nconst leaveTeam: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const removeMember = Boolean(params.removeMember);\n\n if (!workspaceId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId is required\"));\n return;\n }\n\n const config = await readWorkspaceConfig();\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace) {\n respond(false, undefined, errorShape(ErrorCodes.NOT_FOUND, `workspace not found: ${workspaceId}`));\n return;\n }\n\n if (workspace.type !== \"team\") {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"workspace is not a team workspace\"));\n return;\n }\n\n if (removeMember) {\n const metadata = await readWorkspaceMetadata(workspace.path);\n if (metadata) {\n const memberId = workspace.team?.memberId || (await resolveGitMemberId(workspace.path));\n metadata.members = metadata.members.filter((m) => m.id !== memberId);\n const { writeFile } = await import(\"node:fs/promises\");\n const metadataPath = path.join(workspace.path, \".godmode\", \"workspace.json\");\n await writeFile(metadataPath, JSON.stringify(metadata, null, 2) + \"\\n\", \"utf-8\");\n\n try {\n await gitAddCommitPush(workspace.path, `${memberId} left workspace`);\n } catch {\n // Non-fatal\n }\n }\n }\n\n config.workspaces = config.workspaces.filter((w) => w.id !== workspace.id);\n await writeWorkspaceConfig(config);\n\n const syncService = getWorkspaceSyncService();\n await syncService.refreshFromConfig(config);\n\n respond(true, { ok: true, removed: workspaceId });\n};\n\n/**\n * workspace.syncNow — trigger immediate git sync for a workspace.\n *\n * Params:\n * - workspaceId (string, required)\n */\nconst syncNow: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n\n if (!workspaceId) {\n respond(false, undefined, errorShape(ErrorCodes.INVALID_REQUEST, \"workspaceId is required\"));\n return;\n }\n\n const syncService = getWorkspaceSyncService();\n const status = await syncService.manualSync(workspaceId);\n respond(true, { workspaceId, sync: status });\n};\n\n/**\n * workspace.syncStatus — get current sync state for a workspace.\n *\n * Params:\n * - workspaceId (string, optional) — if omitted, returns all\n */\nconst syncStatus: GatewayRequestHandler = async ({ params, respond }) => {\n const workspaceId = typeof params.workspaceId === \"string\" ? String(params.workspaceId).trim() : \"\";\n const syncService = getWorkspaceSyncService();\n\n if (workspaceId) {\n const status = syncService.getStatus(workspaceId);\n respond(true, { workspaceId, sync: status });\n } else {\n const statuses = syncService.listStatuses();\n respond(true, { statuses });\n }\n};\n\nexport const teamWorkspaceHandlers: GatewayRequestHandlers = {\n \"workspace.createTeam\": createTeam,\n \"workspace.joinTeam\": joinTeam,\n \"workspace.leaveTeam\": leaveTeam,\n \"workspace.syncNow\": syncNow,\n \"workspace.syncStatus\": syncStatus,\n};\n","import { type AnyAgentTool, jsonResult } from \"openclaw/plugin-sdk\";\nimport {\n appendFeedMessage,\n createFeedMessage,\n FEED_MESSAGE_TYPES,\n resolveFeedPath,\n type FeedMessageType,\n} from \"../lib/team-feed.js\";\nimport { getWorkspaceSyncService } from \"../lib/workspace-sync-service.js\";\nimport {\n loadCombinedSessionStoreForGateway,\n loadConfig,\n} from \"../lib/workspace-session-store.js\";\nimport { findWorkspaceById, readWorkspaceConfig } from \"../lib/workspaces-config.js\";\n\n/**\n * Creates the `team_message` agent tool.\n * Checks team workspace at call time; returns an error result if not in a team session.\n */\nexport function createTeamMessageTool(ctx: {\n sessionKey?: string;\n agentId?: string;\n}): AnyAgentTool {\n return {\n name: \"team_message\",\n label: \"Team Message\",\n description:\n \"Send a message to the team feed in the current workspace. \" +\n \"Use this to communicate with other agents or notify team members. \" +\n \"Types: handoff (task handover), question (needs input), alert (urgent), \" +\n \"blocked (stuck on something), fyi (informational).\",\n parameters: {\n type: \"object\",\n properties: {\n type: {\n type: \"string\",\n description: \"Message type: handoff, question, alert, blocked, or fyi\",\n },\n message: {\n type: \"string\",\n description: \"The message content\",\n },\n to: {\n type: \"string\",\n description: \"Optional: recipient agent or member id\",\n },\n },\n required: [\"type\", \"message\"],\n },\n execute: async (_toolCallId: string, params: Record<string, unknown>) => {\n const msgTypeRaw = typeof params.type === \"string\" ? params.type.trim().toLowerCase() : \"\";\n const msgBody = typeof params.message === \"string\" ? params.message.trim() : \"\";\n const toRaw = typeof params.to === \"string\" ? params.to.trim() : undefined;\n\n if (!msgBody) {\n return jsonResult({ error: \"message is required\" });\n }\n\n if (!FEED_MESSAGE_TYPES.includes(msgTypeRaw as FeedMessageType)) {\n return jsonResult({ error: `Invalid type: ${msgTypeRaw}. Use one of: ${FEED_MESSAGE_TYPES.join(\", \")}` });\n }\n\n const sessionKey = ctx.sessionKey;\n if (!sessionKey) {\n return jsonResult({ error: \"No active session\" });\n }\n\n const cfg = await loadConfig();\n const { store } = await loadCombinedSessionStoreForGateway(cfg);\n const sessionEntry = store[sessionKey];\n const workspaceId = sessionEntry?.workspaceId;\n if (!workspaceId) {\n return jsonResult({ error: \"Current session is not associated with a team workspace\" });\n }\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace || workspace.type !== \"team\") {\n return jsonResult({ error: \"Current workspace is not a team workspace\" });\n }\n\n const from = workspace.team?.memberId || workspace.team?.agentName || ctx.agentId || \"unknown\";\n const feedPath = resolveFeedPath(workspace.path);\n const message = createFeedMessage({\n from,\n type: msgTypeRaw as FeedMessageType,\n msg: msgBody,\n to: toRaw,\n });\n\n await appendFeedMessage(feedPath, message);\n\n try {\n const syncService = getWorkspaceSyncService();\n await syncService.pushNow(workspace.id);\n } catch {\n // Non-fatal\n }\n\n return jsonResult({\n sent: true,\n id: message.id,\n type: message.type,\n to: message.to || \"all\",\n });\n },\n } as AnyAgentTool;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { type AnyAgentTool, jsonResult } from \"openclaw/plugin-sdk\";\nimport { getCurationAgentService } from \"../services/curation-agent.js\";\nimport { getWorkspaceSyncService } from \"../lib/workspace-sync-service.js\";\nimport {\n loadCombinedSessionStoreForGateway,\n loadConfig,\n} from \"../lib/workspace-session-store.js\";\nimport { findWorkspaceById, readWorkspaceConfig } from \"../lib/workspaces-config.js\";\n\n/**\n * Creates the `team_memory_write` agent tool.\n * Writes knowledge entries to the team workspace memory directory.\n */\nexport function createTeamMemoryWriteTool(ctx: {\n sessionKey?: string;\n agentId?: string;\n}): AnyAgentTool {\n return {\n name: \"team_memory_write\",\n label: \"Team Memory Write\",\n description:\n \"Write a knowledge entry to the team workspace memory. \" +\n \"Use this to persist important discoveries, decisions, or learnings \" +\n \"that should be shared with the entire team. \" +\n \"Content is written to the team's shared memory directory and synced via git.\",\n parameters: {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description: \"Topic slug for the memory file (e.g. 'api-conventions', 'deployment-process')\",\n },\n content: {\n type: \"string\",\n description: \"The memory content to write (markdown format)\",\n },\n append: {\n type: \"boolean\",\n description: \"If true, append to existing file instead of overwriting. Default: false\",\n },\n },\n required: [\"topic\", \"content\"],\n },\n execute: async (_toolCallId: string, params: Record<string, unknown>) => {\n const topic = typeof params.topic === \"string\" ? params.topic.trim() : \"\";\n const content = typeof params.content === \"string\" ? params.content.trim() : \"\";\n const append = Boolean(params.append);\n\n if (!topic || !content) {\n return jsonResult({ error: \"topic and content are required\" });\n }\n\n // Sanitize topic to safe filename\n const safeTopic = topic\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 60);\n if (!safeTopic) {\n return jsonResult({ error: \"Invalid topic name\" });\n }\n\n const sessionKey = ctx.sessionKey;\n if (!sessionKey) {\n return jsonResult({ error: \"No active session\" });\n }\n\n const cfg = await loadConfig();\n const { store } = await loadCombinedSessionStoreForGateway(cfg);\n const sessionEntry = store[sessionKey];\n const workspaceId = sessionEntry?.workspaceId;\n if (!workspaceId) {\n return jsonResult({ error: \"Current session is not associated with a team workspace\" });\n }\n\n const config = await readWorkspaceConfig({ initializeIfMissing: false });\n const workspace = findWorkspaceById(config, workspaceId);\n if (!workspace || workspace.type !== \"team\") {\n return jsonResult({ error: \"Current workspace is not a team workspace\" });\n }\n\n const memoryDir = path.join(workspace.path, \"memory\");\n const filePath = path.join(memoryDir, `${safeTopic}.md`);\n\n try {\n await fs.mkdir(memoryDir, { recursive: true });\n\n if (append) {\n // Atomic append — no read-then-write race\n const separator = \"\\n\\n---\\n\\n\";\n await fs.appendFile(filePath, separator + content + \"\\n\", \"utf-8\");\n } else {\n await fs.writeFile(filePath, content + \"\\n\", \"utf-8\");\n }\n } catch (err) {\n return jsonResult({ error: `Failed to write: ${err instanceof Error ? err.message : String(err)}` });\n }\n\n // Push to git\n try {\n const syncService = getWorkspaceSyncService();\n await syncService.pushNow(workspace.id);\n } catch {\n // Non-fatal\n }\n\n // Notify curation agent\n try {\n const curationService = getCurationAgentService();\n curationService.notifyMemoryWrite(workspace.id);\n } catch {\n // Non-fatal\n }\n\n return jsonResult({\n written: true,\n file: `memory/${safeTopic}.md`,\n mode: append ? \"append\" : \"overwrite\",\n });\n },\n } as AnyAgentTool;\n}\n","import type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nexport type SlotUpdatePayload = {\n tabId: string;\n html: string | null;\n mode?: \"replace\" | \"append\";\n};\n\nexport const uiSlotsHandlers: GatewayRequestHandlers = {\n \"ui.slot.update\": async ({ params, respond, context }) => {\n const tabId = params.tabId as string | undefined;\n const html = (params.html as string | null) ?? null;\n const mode = (params.mode as \"replace\" | \"append\") ?? \"replace\";\n\n if (!tabId) {\n respond(false, undefined, { code: \"INVALID_REQUEST\", message: \"tabId is required\" });\n return;\n }\n\n const payload: SlotUpdatePayload = { tabId, html, mode };\n context.broadcast(\"ui.slot.update\", payload, { dropIfSlow: true });\n respond(true, { ok: true });\n },\n\n \"ui.slot.clear\": async ({ params, respond, context }) => {\n const tabId = params.tabId as string | undefined;\n if (!tabId) {\n respond(false, undefined, { code: \"INVALID_REQUEST\", message: \"tabId is required\" });\n return;\n }\n\n const payload: SlotUpdatePayload = { tabId, html: null, mode: \"replace\" };\n context.broadcast(\"ui.slot.update\", payload, { dropIfSlow: true });\n respond(true, { ok: true });\n },\n};\n","/**\n * focus-pulse.ts — Gateway methods for Focus Pulse daily priority tracking.\n *\n * Source of truth: Win The Day section in the Obsidian daily note.\n * Runtime state: ~/godmode/data/focus-pulse.json\n */\n\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\nimport { DATA_DIR, MEMORY_DIR } from \"../data-paths.js\";\nimport { scorePulseCheck, calculateDailyScore, type FocusItem, type PulseCheckResult } from \"./focus-pulse-scorer.js\";\nimport type { AgentLogState, CompletedItem, ActivityEntry } from \"../lib/agent-log.js\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst STATE_FILE = join(DATA_DIR, \"focus-pulse.json\");\n\n// --- Types ---\n\ntype FocusPulseState = {\n date: string;\n active: boolean;\n morningSetDone: boolean;\n currentFocus: FocusItem | null;\n items: FocusItem[];\n pulseChecks: PulseCheckResult[];\n score: number;\n streak: number;\n};\n\n// --- Helpers ---\n\nfunction getTodayDate(): string {\n return new Date().toLocaleDateString(\"en-CA\", { timeZone: \"America/Chicago\" });\n}\n\nfunction emptyState(date: string): FocusPulseState {\n return {\n date,\n active: false,\n morningSetDone: false,\n currentFocus: null,\n items: [],\n pulseChecks: [],\n score: 0,\n streak: 0,\n };\n}\n\nasync function readState(): Promise<FocusPulseState> {\n try {\n const raw = await readFile(STATE_FILE, \"utf-8\");\n const parsed = JSON.parse(raw) as FocusPulseState;\n // Reset if stale (different day)\n const today = getTodayDate();\n if (parsed.date !== today) {\n return { ...emptyState(today), streak: parsed.streak };\n }\n return parsed;\n } catch {\n return emptyState(getTodayDate());\n }\n}\n\nasync function writeState(state: FocusPulseState): Promise<void> {\n await mkdir(dirname(STATE_FILE), { recursive: true });\n await writeFile(STATE_FILE, JSON.stringify(state, null, 2), \"utf-8\");\n}\n\nfunction getVaultPath(): string | null {\n return process.env.OBSIDIAN_VAULT_PATH || null;\n}\n\nfunction getDailyFolder(): string {\n return process.env.DAILY_BRIEF_FOLDER || \"01-Daily\";\n}\n\n/**\n * Parse Win The Day items from a daily note's markdown content.\n *\n * Supports two formats:\n * 1. `1. [ ] **Title** — Context` (numbered + checkbox + bold)\n * 2. `- [ ] **Title** — Context` (bullet + checkbox + bold)\n */\nfunction parseWinTheDay(content: string): FocusItem[] {\n // Extract the Win The Day / Today's Mission section\n const sectionMatch = content.match(\n /##\\s*(?:\\u{1F3AF}\\s*)?(?:Win The Day|Today's Mission)([\\s\\S]*?)(?=^##\\s|$)/mu,\n );\n if (!sectionMatch) return [];\n\n const sectionContent = sectionMatch[1];\n const items: FocusItem[] = [];\n // Match numbered items: `1. [ ] **Title** — Context` or `1. [x] **Title** — Context`\n const numberedRegex = /^(\\d+)\\.\\s*\\[([ x])\\]\\s*\\*\\*(.+?)\\*\\*(?:\\s*[—–-]\\s*(.+))?$/gm;\n let match;\n while ((match = numberedRegex.exec(sectionContent)) !== null) {\n items.push({\n index: parseInt(match[1], 10),\n title: match[3].trim(),\n context: match[4]?.trim() ?? \"\",\n completed: match[2] === \"x\",\n });\n }\n\n // If no numbered items, try bullet items: `- [ ] **Title** — Context`\n if (items.length === 0) {\n const bulletRegex = /^[-*]\\s*\\[([ x])\\]\\s*\\*\\*(.+?)\\*\\*(?:\\s*[—–-]\\s*(.+))?$/gm;\n let idx = 1;\n while ((match = bulletRegex.exec(sectionContent)) !== null) {\n items.push({\n index: idx++,\n title: match[2].trim(),\n context: match[3]?.trim() ?? \"\",\n completed: match[1] === \"x\",\n });\n }\n }\n\n return items;\n}\n\n/**\n * Read today's daily note content from Obsidian vault.\n */\nasync function readDailyNote(date: string): Promise<string | null> {\n const vaultPath = getVaultPath();\n if (!vaultPath) return null;\n const filePath = join(vaultPath, getDailyFolder(), `${date}.md`);\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * Update a checkbox in the daily note ([ ] → [x] for an item by title).\n */\nasync function markItemCompleteInNote(date: string, title: string): Promise<boolean> {\n const vaultPath = getVaultPath();\n if (!vaultPath) return false;\n const filePath = join(vaultPath, getDailyFolder(), `${date}.md`);\n try {\n let content = await readFile(filePath, \"utf-8\");\n const escaped = title.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = new RegExp(\n `^(\\\\d+\\\\.\\\\s*)\\\\[ \\\\](\\\\s*\\\\*\\\\*${escaped}\\\\*\\\\*)`,\n \"m\",\n );\n const updated = content.replace(pattern, \"$1[x]$2\");\n if (updated === content) {\n // Try bullet format\n const bulletPattern = new RegExp(\n `^([-*]\\\\s*)\\\\[ \\\\](\\\\s*\\\\*\\\\*${escaped}\\\\*\\\\*)`,\n \"m\",\n );\n content = content.replace(bulletPattern, \"$1[x]$2\");\n if (content === updated) return false;\n await writeFile(filePath, content, \"utf-8\");\n return true;\n }\n await writeFile(filePath, updated, \"utf-8\");\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Read today's agent log state from disk.\n */\nasync function readAgentLog(date: string): Promise<AgentLogState> {\n const logPath = join(MEMORY_DIR, \"agent-log\", `${date}.json`);\n try {\n const raw = await readFile(logPath, \"utf-8\");\n return JSON.parse(raw) as AgentLogState;\n } catch {\n return { date, needsReview: [], completed: [], errors: [], queue: [], activity: [], notes: [] };\n }\n}\n\ntype RescueTimeRow = [string, number, number, string, string, number];\n\n/**\n * Read today's RescueTime data.\n */\nasync function readRescueTimeData(date: string): Promise<RescueTimeRow[]> {\n const rtPath = join(DATA_DIR, \"rescuetime\", `${date}.json`);\n try {\n const raw = await readFile(rtPath, \"utf-8\");\n const parsed = JSON.parse(raw) as { rows?: RescueTimeRow[] };\n return parsed.rows ?? [];\n } catch {\n return [];\n }\n}\n\n// --- Broadcast helper ---\n\nfunction broadcastState(\n context: Parameters<GatewayRequestHandler>[0][\"context\"],\n state: FocusPulseState,\n): void {\n // Build a slim payload for the UI\n const currentFocus = state.currentFocus;\n const lastCheck = state.pulseChecks[state.pulseChecks.length - 1];\n context.broadcast(\n \"focusPulse:update\",\n {\n active: state.active,\n morningSetDone: state.morningSetDone,\n currentFocus: currentFocus\n ? { index: currentFocus.index, title: currentFocus.title, context: currentFocus.context }\n : null,\n items: state.items,\n score: state.score,\n streak: state.streak,\n aligned: lastCheck?.aligned ?? true,\n lastCheckReason: lastCheck?.reason ?? \"\",\n },\n { dropIfSlow: true },\n );\n}\n\n// --- Gateway Methods ---\n\nconst getState: GatewayRequestHandler = async ({ respond, context }) => {\n const state = await readState();\n const currentFocus = state.currentFocus;\n const lastCheck = state.pulseChecks[state.pulseChecks.length - 1];\n respond(true, {\n active: state.active,\n morningSetDone: state.morningSetDone,\n currentFocus: currentFocus\n ? { index: currentFocus.index, title: currentFocus.title, context: currentFocus.context }\n : null,\n items: state.items,\n score: state.score,\n streak: state.streak,\n aligned: lastCheck?.aligned ?? true,\n lastCheckReason: lastCheck?.reason ?? \"\",\n });\n};\n\nconst startMorningSet: GatewayRequestHandler = async ({ respond, context }) => {\n const today = getTodayDate();\n const noteContent = await readDailyNote(today);\n\n let items: FocusItem[] = [];\n if (noteContent) {\n items = parseWinTheDay(noteContent);\n }\n\n // Update state: morning set started, items loaded\n const state = await readState();\n state.date = today;\n state.active = true;\n state.items = items.length > 0 ? items : state.items;\n await writeState(state);\n\n respond(true, {\n items,\n noteFound: noteContent !== null,\n message: items.length > 0\n ? `Found ${items.length} Win The Day items. Review and pick your #1 focus.`\n : \"No Win The Day items found in today's daily note. You can set priorities manually.\",\n });\n};\n\nconst setFocus: GatewayRequestHandler = async ({ params, respond, context }) => {\n const { index, title } = params as { index?: number; title?: string };\n const state = await readState();\n\n if (!state.active) {\n respond(false, null, { code: \"NOT_ACTIVE\", message: \"Focus Pulse is not active. Start morning set first.\" });\n return;\n }\n\n let focus: FocusItem | null = null;\n\n if (index != null) {\n focus = state.items.find((i) => i.index === index) ?? null;\n } else if (title) {\n focus = state.items.find((i) => i.title.toLowerCase().includes(title.toLowerCase())) ?? null;\n // Allow setting a custom focus not in the items list\n if (!focus) {\n focus = { index: state.items.length + 1, title, context: \"\", completed: false };\n state.items.push(focus);\n }\n }\n\n if (!focus) {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"Could not find item. Provide index or title.\" });\n return;\n }\n\n state.currentFocus = focus;\n state.morningSetDone = true;\n state.score = calculateDailyScore(\n state.pulseChecks,\n state.items.filter((i) => i.completed).length,\n state.items.length,\n true,\n state.streak,\n );\n await writeState(state);\n broadcastState(context, state);\n\n respond(true, {\n currentFocus: focus,\n message: `Focus set: ${focus.title}`,\n });\n};\n\nconst pulseCheck: GatewayRequestHandler = async ({ respond, context }) => {\n const state = await readState();\n\n if (!state.active || !state.currentFocus) {\n respond(true, { skipped: true, reason: \"No active focus set\" });\n return;\n }\n\n const today = getTodayDate();\n const agentLog = await readAgentLog(today);\n const rtRows = await readRescueTimeData(today);\n\n const check = scorePulseCheck(\n state.currentFocus,\n agentLog.completed,\n agentLog.activity,\n rtRows,\n );\n\n state.pulseChecks.push(check);\n state.score = calculateDailyScore(\n state.pulseChecks,\n state.items.filter((i) => i.completed).length,\n state.items.length,\n state.morningSetDone,\n state.streak,\n );\n await writeState(state);\n broadcastState(context, state);\n\n respond(true, check);\n};\n\nconst completeFocus: GatewayRequestHandler = async ({ params, respond, context }) => {\n const state = await readState();\n\n if (!state.currentFocus) {\n respond(false, null, { code: \"NO_FOCUS\", message: \"No current focus to complete\" });\n return;\n }\n\n // Mark completed in state\n const focusIndex = state.currentFocus.index;\n const item = state.items.find((i) => i.index === focusIndex);\n if (item) item.completed = true;\n state.currentFocus.completed = true;\n\n // Update checkbox in daily note\n const today = getTodayDate();\n await markItemCompleteInNote(today, state.currentFocus.title);\n\n // Promote next incomplete item\n const next = state.items.find((i) => !i.completed && i.index !== focusIndex);\n state.currentFocus = next ?? null;\n\n state.score = calculateDailyScore(\n state.pulseChecks,\n state.items.filter((i) => i.completed).length,\n state.items.length,\n state.morningSetDone,\n state.streak,\n );\n await writeState(state);\n broadcastState(context, state);\n\n respond(true, {\n completed: item?.title ?? \"Unknown\",\n nextFocus: next ? next.title : null,\n message: next\n ? `Completed! Next focus: ${next.title}`\n : \"All items completed! Great work today.\",\n });\n};\n\nconst endDay: GatewayRequestHandler = async ({ respond, context }) => {\n const state = await readState();\n\n const completedCount = state.items.filter((i) => i.completed).length;\n const totalItems = state.items.length;\n const finalScore = calculateDailyScore(\n state.pulseChecks,\n completedCount,\n totalItems,\n state.morningSetDone,\n state.streak,\n );\n\n // Update streak: increment if #1 item was completed, otherwise reset\n const firstItem = state.items.find((i) => i.index === 1);\n const primaryCompleted = firstItem?.completed ?? false;\n const newStreak = primaryCompleted ? state.streak + 1 : 0;\n\n state.score = finalScore;\n state.streak = newStreak;\n state.active = false;\n await writeState(state);\n\n // Log summary to agent log\n try {\n const { appendEntry } = await import(\"../lib/agent-log.js\");\n await appendEntry({\n category: \"activity\",\n item: `Focus Pulse: ${finalScore}/100 · ${completedCount}/${totalItems} done · Streak: ${newStreak}d`,\n });\n } catch {\n // Agent log write is best-effort\n }\n\n broadcastState(context, state);\n\n respond(true, {\n score: finalScore,\n streak: newStreak,\n completed: completedCount,\n total: totalItems,\n primaryCompleted,\n message: primaryCompleted\n ? `Day complete! Score: ${finalScore}/100, Streak: ${newStreak} days`\n : `Day done. Score: ${finalScore}/100. Streak reset (primary task incomplete).`,\n });\n};\n\n// --- Export ---\n\nexport const focusPulseHandlers: GatewayRequestHandlers = {\n \"focusPulse.getState\": getState,\n \"focusPulse.startMorningSet\": startMorningSet,\n \"focusPulse.setFocus\": setFocus,\n \"focusPulse.pulseCheck\": pulseCheck,\n \"focusPulse.complete\": completeFocus,\n \"focusPulse.endDay\": endDay,\n};\n","/**\n * focus-pulse-scorer.ts — Pure scoring functions for Focus Pulse.\n * No I/O; all inputs passed as arguments.\n */\n\nimport type { CompletedItem, ActivityEntry } from \"../lib/agent-log.js\";\n\nexport type FocusItem = {\n index: number;\n title: string;\n context: string;\n completed: boolean;\n};\n\nexport type PulseCheckResult = {\n time: string;\n score: number;\n topActivity: string;\n aligned: boolean;\n reason: string;\n};\n\ntype RescueTimeRow = [string, number, number, string, string, number];\n\n/**\n * Score a single pulse check by comparing recent activity against the current focus.\n *\n * Heuristic: look for keyword overlap between the focus title/context and\n * agent-log completed items + RescueTime top activities.\n */\nexport function scorePulseCheck(\n focus: FocusItem,\n completedItems: CompletedItem[],\n activityEntries: ActivityEntry[],\n rescueTimeRows: RescueTimeRow[],\n): PulseCheckResult {\n const now = new Date();\n const time = `${String(now.getHours()).padStart(2, \"0\")}:${String(now.getMinutes()).padStart(2, \"0\")}`;\n\n // Build focus keywords from title + context\n const focusWords = extractKeywords(`${focus.title} ${focus.context}`);\n\n // Find top RescueTime activity by time spent\n const topRT = findTopActivity(rescueTimeRows);\n\n // Score agent log alignment (recent 30min of completions + activity)\n const thirtyMinAgo = Date.now() - 30 * 60 * 1000;\n const recentCompleted = completedItems.filter((c) => c.completedAt > thirtyMinAgo);\n const recentActivity = activityEntries.filter((a) => a.time > thirtyMinAgo);\n\n let agentScore = 0;\n let agentReason = \"\";\n\n if (recentCompleted.length > 0 || recentActivity.length > 0) {\n const agentText = [\n ...recentCompleted.map((c) => `${c.item} ${c.output ?? \"\"}`),\n ...recentActivity.map((a) => a.text),\n ].join(\" \");\n const agentWords = extractKeywords(agentText);\n const overlap = countOverlap(focusWords, agentWords);\n agentScore = Math.min(overlap * 25, 100); // 25 points per keyword match, cap 100\n agentReason = recentCompleted.length > 0\n ? `${recentCompleted.length} task(s) completed recently`\n : `${recentActivity.length} activity entries`;\n }\n\n // Score RescueTime alignment\n let rtScore = 50; // neutral if no data\n let rtReason = \"No RescueTime data\";\n\n if (topRT) {\n const rtWords = extractKeywords(`${topRT.activity} ${topRT.category}`);\n const rtOverlap = countOverlap(focusWords, rtWords);\n // Productivity score from RescueTime: -2 to 2\n // 2 = very productive, 1 = productive, 0 = neutral, -1 = distracting, -2 = very distracting\n const productivityBonus = topRT.productivity >= 1 ? 20 : topRT.productivity <= -1 ? -20 : 0;\n rtScore = Math.min(rtOverlap * 20 + 40 + productivityBonus, 100);\n rtReason = `Top: ${topRT.activity} (${Math.round(topRT.seconds / 60)}min)`;\n }\n\n // Weighted average: 60% agent log, 40% RescueTime\n const score = Math.round(agentScore * 0.6 + rtScore * 0.4);\n const aligned = score >= 50;\n const reason = agentReason\n ? `${agentReason}. ${rtReason}`\n : rtReason;\n\n return { time, score, topActivity: topRT?.activity ?? \"Unknown\", aligned, reason };\n}\n\n/**\n * Calculate the overall daily score.\n * Weights: 40% alignment (avg pulse checks), 40% completion, 20% consistency.\n */\nexport function calculateDailyScore(\n pulseChecks: PulseCheckResult[],\n completedCount: number,\n totalItems: number,\n morningSetDone: boolean,\n currentStreak: number,\n): number {\n // Alignment: average of pulse check scores\n const alignmentScore = pulseChecks.length > 0\n ? pulseChecks.reduce((sum, p) => sum + p.score, 0) / pulseChecks.length\n : 50;\n\n // Completion: items done / total\n const completionScore = totalItems > 0 ? (completedCount / totalItems) * 100 : 0;\n\n // Consistency: morning set done + streak bonus\n const morningSetBonus = morningSetDone ? 50 : 0;\n const streakBonus = Math.min(currentStreak * 10, 50); // up to 50 for 5-day streak\n const consistencyScore = morningSetBonus + streakBonus;\n\n return Math.round(alignmentScore * 0.4 + completionScore * 0.4 + consistencyScore * 0.2);\n}\n\n// --- Helpers ---\n\nfunction extractKeywords(text: string): Set<string> {\n const stopWords = new Set([\n \"the\", \"a\", \"an\", \"and\", \"or\", \"but\", \"in\", \"on\", \"at\", \"to\", \"for\",\n \"of\", \"with\", \"by\", \"from\", \"is\", \"it\", \"this\", \"that\", \"was\", \"are\",\n ]);\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 2 && !stopWords.has(w)),\n );\n}\n\nfunction countOverlap(a: Set<string>, b: Set<string>): number {\n let count = 0;\n for (const word of a) {\n if (b.has(word)) count++;\n }\n return count;\n}\n\nfunction findTopActivity(\n rows: RescueTimeRow[],\n): { activity: string; category: string; seconds: number; productivity: number } | null {\n if (rows.length === 0) return null;\n let top = rows[0];\n for (const row of rows) {\n if (row[1] > top[1]) top = row;\n }\n return { activity: top[3], category: top[4], seconds: top[1], productivity: top[5] };\n}\n","/**\n * options.ts — Gateway methods for GodMode feature options.\n *\n * Stores feature flags and settings in ~/godmode/data/godmode-options.json.\n * The UI reads/writes this file via RPC to toggle features on/off.\n */\n\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport type { GatewayRequestHandler } from \"openclaw/plugin-sdk\";\nimport { DATA_DIR } from \"../data-paths.js\";\n\ntype GatewayRequestHandlers = Record<string, GatewayRequestHandler>;\n\nconst OPTIONS_FILE = join(DATA_DIR, \"godmode-options.json\");\n\ntype GodModeOptions = Record<string, unknown>;\n\nconst DEFAULTS: GodModeOptions = {\n \"focusPulse.enabled\": false,\n};\n\nasync function readOptions(): Promise<GodModeOptions> {\n try {\n const raw = await readFile(OPTIONS_FILE, \"utf-8\");\n const parsed = JSON.parse(raw) as GodModeOptions;\n return { ...DEFAULTS, ...parsed };\n } catch {\n return { ...DEFAULTS };\n }\n}\n\nasync function writeOptions(options: GodModeOptions): Promise<void> {\n await mkdir(dirname(OPTIONS_FILE), { recursive: true });\n await writeFile(OPTIONS_FILE, JSON.stringify(options, null, 2), \"utf-8\");\n}\n\nconst getOptions: GatewayRequestHandler = async ({ respond }) => {\n const options = await readOptions();\n respond(true, options);\n};\n\nconst setOption: GatewayRequestHandler = async ({ params, respond, context }) => {\n const { key, value } = params as { key?: string; value?: unknown };\n\n if (!key || typeof key !== \"string\") {\n respond(false, null, { code: \"INVALID_REQUEST\", message: \"key is required (string)\" });\n return;\n }\n\n const options = await readOptions();\n options[key] = value;\n await writeOptions(options);\n\n context.broadcast(\"godmode.options:update\", options, { dropIfSlow: true });\n respond(true, { key, value, options });\n};\n\nexport const optionsHandlers: GatewayRequestHandlers = {\n \"godmode.options.get\": getOptions,\n \"godmode.options.set\": setOption,\n};\n","import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\ntype AgentLogWriterModule = {\n initAgentLogWriter?: () => void;\n stopAgentLogWriter?: () => Promise<void>;\n};\n\nlet loaded: AgentLogWriterModule | null = null;\nlet attempted = false;\n\nfunction resolveCandidates(): string[] {\n const thisFile = fileURLToPath(import.meta.url);\n const servicesDir = path.dirname(thisFile);\n const pluginRoot = path.resolve(servicesDir, \"..\", \"..\");\n const monorepoRoot = path.resolve(pluginRoot, \"..\", \"..\");\n\n const explicit = (process.env.GODMODE_AGENT_LOG_WRITER_MODULE || \"\").trim();\n\n return [\n explicit,\n path.join(monorepoRoot, \"src\", \"infra\", \"agent-log-writer.js\"),\n path.join(monorepoRoot, \"dist\", \"infra\", \"agent-log-writer.js\"),\n path.join(process.cwd(), \"src\", \"infra\", \"agent-log-writer.js\"),\n path.join(process.cwd(), \"dist\", \"infra\", \"agent-log-writer.js\"),\n ].filter(Boolean);\n}\n\nasync function loadModule(): Promise<AgentLogWriterModule | null> {\n if (loaded) {\n return loaded;\n }\n if (attempted) {\n return null;\n }\n attempted = true;\n\n for (const candidate of resolveCandidates()) {\n try {\n const url =\n candidate.startsWith(\"file://\") || candidate.startsWith(\"node:\")\n ? candidate\n : pathToFileURL(candidate).href;\n const mod = (await import(url)) as AgentLogWriterModule;\n if (typeof mod.initAgentLogWriter === \"function\") {\n loaded = mod;\n return loaded;\n }\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\nexport async function initAgentLogWriter(): Promise<boolean> {\n const mod = await loadModule();\n if (!mod?.initAgentLogWriter) {\n return false;\n }\n mod.initAgentLogWriter();\n return true;\n}\n\nexport async function stopAgentLogWriter(): Promise<boolean> {\n const mod = await loadModule();\n if (!mod?.stopAgentLogWriter) {\n return false;\n }\n await mod.stopAgentLogWriter();\n return true;\n}\n","/**\n * Static file server for serving built UI assets.\n * Handles SPA routing (fallback to index.html) and correct MIME types.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, extname } from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"application/javascript; charset=utf-8\",\n \".mjs\": \"application/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"video/mp4\",\n \".webm\": \"video/webm\",\n \".wasm\": \"application/wasm\",\n \".map\": \"application/json\",\n};\n\nconst SECURITY_HEADERS: Record<string, string> = {\n \"X-Content-Type-Options\": \"nosniff\",\n \"X-Frame-Options\": \"SAMEORIGIN\",\n \"Referrer-Policy\": \"strict-origin-when-cross-origin\",\n};\n\n/**\n * Create an HTTP handler that serves static files from a directory\n * with SPA fallback to index.html.\n */\nexport function createStaticFileHandler(\n root: string,\n basePath: string,\n): (req: IncomingMessage, res: ServerResponse) => void {\n const normalizedBase = basePath.endsWith(\"/\") ? basePath : basePath + \"/\";\n\n return (req: IncomingMessage, res: ServerResponse) => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.writeHead(405, { Allow: \"GET, HEAD\" });\n res.end();\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n let pathname = url.pathname;\n\n // Redirect /basePath to /basePath/\n if (pathname === basePath || pathname === basePath.replace(/\\/$/, \"\")) {\n res.writeHead(302, { Location: `${normalizedBase}${url.search}` });\n res.end();\n return;\n }\n\n // Strip base path\n if (pathname.startsWith(normalizedBase)) {\n pathname = pathname.slice(normalizedBase.length - 1);\n }\n if (!pathname.startsWith(\"/\")) {\n pathname = \"/\" + pathname;\n }\n\n // Resolve file path — prevent directory traversal\n const filePath = join(root, pathname);\n if (!filePath.startsWith(root)) {\n res.writeHead(403, SECURITY_HEADERS);\n res.end(\"Forbidden\");\n return;\n }\n\n // Try exact file, then SPA fallback to index.html\n const target = existsSync(filePath) && !filePath.endsWith(\"/\")\n ? filePath\n : join(root, \"index.html\");\n\n if (!existsSync(target)) {\n res.writeHead(404, { ...SECURITY_HEADERS, \"Content-Type\": \"text/plain\" });\n res.end(\"Not Found\");\n return;\n }\n\n const ext = extname(target).toLowerCase();\n const mime = MIME[ext] || \"application/octet-stream\";\n\n // Cache hashed assets (vite fingerprints) aggressively; HTML never cached\n const isHtml = ext === \".html\";\n const cacheControl = isHtml\n ? \"no-cache, must-revalidate\"\n : \"public, max-age=31536000, immutable\";\n\n try {\n const content = readFileSync(target);\n res.writeHead(200, {\n \"Content-Type\": mime,\n \"Content-Length\": content.length,\n \"Cache-Control\": cacheControl,\n ...SECURITY_HEADERS,\n });\n if (req.method === \"HEAD\") {\n res.end();\n } else {\n res.end(content);\n }\n } catch {\n res.writeHead(500, { ...SECURITY_HEADERS, \"Content-Type\": \"text/plain\" });\n res.end(\"Internal Server Error\");\n }\n };\n}\n"],"mappings":"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","names":["run","stat","existsSync","os","path","fsp","path","expandHome","fs","os","path","JSON5","candidates","fs","path","errorShape","stat","pathExists","content","ErrorCodes","readFile","workspace","crypto","fs","path","fs","os","path","promisify","status","fs","path","singleton","execFileCb","fs","path","promisify","execFile","os","fs","path","safeReadText","stat","fs","path","existsSync","readFileSync","dirname","join","fileURLToPath","fsp","path","todayDate","stat","join","status","join","resolve","stat","readFile","writeFile","join","readFile","writeFile","join","status","readFile","writeFile","join","path","ensureDir","existsSync","fs","path","candidates","run","readJsonFile","readFile","writeFile","mkdir","join","readFile","join","readFile","writeFile","mkdir","join","expandPath","scanDirectory","status","fsp","path","run","readFile","writeFile","join","status","createTask","ErrorCodes","errorShape","send","fs","path","ErrorCodes","errorShape","execFileCb","path","promisify","execFile","ErrorCodes","errorShape","writeFile","status","fs","path","jsonResult","readFile","writeFile","mkdir","join","join","getTodayDate","emptyState","readFile","mkdir","writeFile","getVaultPath","getDailyFolder","appendEntry","readFile","writeFile","mkdir","join","dirname","path","fileURLToPath","pathToFileURL","readFileSync","existsSync","join","extname","dirname","fileURLToPath","join","existsSync","readFileSync","getCurationAgentService","handleTeamBootstrap","handleTeamMemoryRoute","status","createWorkspaceId","readWorkspaceConfig","resolveGodModeRoot","writeWorkspaceConfig","ensureWorkspaceFolders","scaffoldTeamWorkspace","resolveGitMemberId","toDisplayPath","createFeedMessage","appendFeedMessage","resolveFeedPath","findWorkspaceById","workspace","readFeed","fsp"]}
|