@meego-harness/mara-worker 0.8.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/config.ts","../src/parts.ts","../src/runtime.ts","../src/bridge.ts"],"sourcesContent":["export const MIRA_WORKER_ROLE = 'coder'\nexport const MIRA_WORKER_WORKING_TEXT = 'Mira CLI is working'\nexport const MIRA_WORKER_CONFIG_DIR = '.meego-harness/mara-worker'\n\nexport const COCO_WORKER_ROLE = MIRA_WORKER_ROLE\nexport const COCO_WORKER_WORKING_TEXT = MIRA_WORKER_WORKING_TEXT\nexport const COCO_WORKER_CONFIG_DIR = MIRA_WORKER_CONFIG_DIR\n","import type {\n MiraReasoningEffortSelection,\n MiraWorkerConfig,\n MiraWorkerDoctorReport,\n MiraWorkerListItem,\n MiraWorkerPrompter,\n MiraWorkerSetupInput,\n MiraWorkerSetupResult,\n MiraWorkerState,\n ResolveStoragePathsOptions,\n RunMiraWorkerSetupDependencies,\n} from './types'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, isAbsolute, join } from 'node:path'\nimport { confirm, isCancel, select, text } from '@clack/prompts'\nimport { renderCliPrompt } from '@meego-harness/prompt-registry'\nimport { resolveDefaultWorkerDeviceIdentityFile } from '@meego-harness/worker-sdk'\nimport { z } from 'zod'\nimport { MIRA_WORKER_CONFIG_DIR } from './constants'\n\nconst miraWorkerConfigSchema = z.object({\n serverUrl: z.string().trim().min(1, 'serverUrl is required'),\n email: z.string().trim().min(1, 'email is required'),\n workerId: z.string().trim().min(1, 'workerId is required'),\n capabilitySummary: z.string().trim().min(1, 'capabilitySummary is required'),\n defaultWorkspace: z.string().trim().min(1, 'defaultWorkspace is required'),\n repoMappings: z.record(z.string(), z.string()),\n enabled: z.boolean().default(true),\n permissionPreset: z.enum(['safe', 'default', 'full-access']),\n modelSelection: z.string().trim().min(1, 'modelSelection is required'),\n reasoningEffortDefault: z.enum([\n 'use-mira-default',\n 'use-coco-default',\n 'low',\n 'medium',\n 'high',\n 'xhigh',\n ]),\n})\n\nconst miraWorkerStateSchema = z.object({\n contexts: z.array(\n z.object({\n contextId: z.string(),\n repo: z.string().optional(),\n cwd: z.string(),\n sessionId: z.string().optional(),\n reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh']).optional(),\n planMode: z.boolean(),\n }),\n ),\n})\n\nexport function resolveMiraWorkerStorageDir(options: ResolveStoragePathsOptions = {}) {\n return join(options.homeDir ?? homedir(), MIRA_WORKER_CONFIG_DIR)\n}\n\nexport function resolveMiraWorkerConfigFile(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n return join(resolveMiraWorkerStorageDir(options), `${workerId}.json`)\n}\n\nexport function resolveMiraWorkerStateFile(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n return join(resolveMiraWorkerStorageDir(options), `${workerId}.state.json`)\n}\n\nexport function loadMiraWorkerConfig(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n): MiraWorkerConfig {\n const file = resolveMiraWorkerConfigFile(workerId, options)\n if (!existsSync(file)) {\n throw new Error(`Mira CLI worker config not found for ${workerId}: ${file}`)\n }\n\n return miraWorkerConfigSchema.parse(JSON.parse(readFileSync(file, 'utf8')))\n}\n\nexport function writeMiraWorkerConfig(\n config: MiraWorkerConfig,\n options: ResolveStoragePathsOptions = {},\n) {\n mkdirSync(resolveMiraWorkerStorageDir(options), { recursive: true })\n writeFileSync(\n resolveMiraWorkerConfigFile(config.workerId, options),\n `${JSON.stringify(config, null, 2)}\\n`,\n 'utf8',\n )\n}\n\nexport function loadMiraWorkerState(stateFile: string): MiraWorkerState {\n if (!existsSync(stateFile)) {\n return { contexts: [] }\n }\n\n return miraWorkerStateSchema.parse(JSON.parse(readFileSync(stateFile, 'utf8')))\n}\n\nexport function writeMiraWorkerState(stateFile: string, state: MiraWorkerState) {\n mkdirSync(dirname(stateFile), { recursive: true })\n writeFileSync(stateFile, `${JSON.stringify(state, null, 2)}\\n`, 'utf8')\n}\n\nexport async function runMiraWorkerSetup(\n dependencies: RunMiraWorkerSetupDependencies,\n prompter: MiraWorkerPrompter,\n input: MiraWorkerSetupInput = {},\n): Promise<MiraWorkerSetupResult> {\n const homeDir = dependencies.homeDir\n const serverUrlPrompt = renderCliPrompt('cli.mara-worker.server-url', undefined)\n const serverUrl = await resolveTextInput(input.serverUrl, prompter, {\n message: serverUrlPrompt.message,\n placeholder: serverUrlPrompt.placeholder,\n validate: requiredString('serverUrl'),\n })\n const emailPrompt = renderCliPrompt('cli.mara-worker.email', undefined)\n const email = await resolveTextInput(input.email, prompter, {\n message: emailPrompt.message,\n placeholder: emailPrompt.placeholder,\n validate: requiredString('email'),\n })\n const workerIdPrompt = renderCliPrompt('cli.mara-worker.worker-id', undefined)\n const workerId = await resolveTextInput(input.workerId, prompter, {\n message: workerIdPrompt.message,\n placeholder: workerIdPrompt.placeholder,\n validate: requiredString('workerId'),\n })\n const capabilitySummaryPrompt = renderCliPrompt('cli.mara-worker.capability-summary', undefined)\n const capabilitySummary = await resolveTextInput(input.capabilitySummary, prompter, {\n message: capabilitySummaryPrompt.message,\n placeholder: capabilitySummaryPrompt.placeholder,\n validate: requiredString('capabilitySummary'),\n })\n const defaultWorkspacePrompt = renderCliPrompt('cli.mara-worker.default-workspace', undefined)\n const defaultWorkspace = await resolveTextInput(input.defaultWorkspace, prompter, {\n message: defaultWorkspacePrompt.message,\n placeholder: defaultWorkspacePrompt.placeholder,\n validate: validateDirectory('defaultWorkspace'),\n })\n const permissionPresetPrompt = renderCliPrompt('cli.mara-worker.permission-preset', undefined)\n const permissionPreset = await resolveSelectInput(input.permissionPreset, prompter, {\n message: permissionPresetPrompt.message,\n options: [\n { value: 'safe', label: 'safe' },\n { value: 'default', label: 'default' },\n { value: 'full-access', label: 'full-access' },\n ],\n initialValue: 'default',\n })\n const modelSelectionPrompt = renderCliPrompt('cli.mara-worker.model-selection', undefined)\n const modelSelection = await resolveSelectInput(input.modelSelection, prompter, {\n message: modelSelectionPrompt.message,\n options: requireCliPromptOptions(\n modelSelectionPrompt.options,\n 'cli.mara-worker.model-selection',\n ),\n initialValue: 'use-mira-default',\n })\n const reasoningEffortPrompt = renderCliPrompt('cli.mara-worker.reasoning-effort', undefined)\n const reasoningEffortDefault = (await resolveSelectInput(input.reasoningEffortDefault, prompter, {\n message: reasoningEffortPrompt.message,\n options: [\n { value: 'use-mira-default', label: 'use-mira-default' },\n { value: 'use-coco-default', label: 'use-coco-default' },\n { value: 'low', label: 'low' },\n { value: 'medium', label: 'medium' },\n { value: 'high', label: 'high' },\n { value: 'xhigh', label: 'xhigh' },\n ],\n initialValue: 'use-mira-default',\n })) as MiraReasoningEffortSelection\n\n const repoMappings = input.repoMappings\n ? normalizeRepoMappings(input.repoMappings)\n : await promptRepoMappings(prompter, defaultWorkspace)\n\n const result = miraWorkerConfigSchema.parse({\n serverUrl,\n email,\n workerId,\n capabilitySummary,\n defaultWorkspace,\n repoMappings,\n enabled: input.enabled ?? true,\n permissionPreset,\n modelSelection,\n reasoningEffortDefault,\n })\n\n writeMiraWorkerConfig(result, { homeDir })\n dependencies.logger.info(\n `Configured mara worker ${result.workerId} at ${resolveMiraWorkerConfigFile(result.workerId, { homeDir })}`,\n )\n\n return result\n}\n\nexport function listMiraWorkerConfigs(\n options: ResolveStoragePathsOptions = {},\n): MiraWorkerListItem[] {\n const storageDir = resolveMiraWorkerStorageDir(options)\n if (!existsSync(storageDir)) {\n return []\n }\n\n return readdirSync(storageDir)\n .filter(file => file.endsWith('.json') && !file.endsWith('.state.json'))\n .map((file) => {\n const workerId = file.replace(/\\.json$/u, '')\n const config = loadMiraWorkerConfig(workerId, options)\n\n return {\n ...config,\n configFile: resolveMiraWorkerConfigFile(workerId, options),\n stateFile: resolveMiraWorkerStateFile(workerId, options),\n }\n })\n .sort((left, right) => left.workerId.localeCompare(right.workerId))\n}\n\nexport function getMiraWorkerDoctorReport(\n options: ResolveStoragePathsOptions = {},\n dependencies: { assertCocoCliAvailable?: () => void } = {},\n): MiraWorkerDoctorReport {\n return {\n workers: listMiraWorkerConfigs(options).map((config) => {\n const runtimeErrors: string[] = []\n try {\n dependencies.assertCocoCliAvailable?.()\n }\n catch (error) {\n runtimeErrors.push(error instanceof Error ? error.message : 'Mira CLI is unavailable')\n }\n\n return {\n ...config,\n configStatus: 'ok' as const,\n runtimeStatus: runtimeErrors.length > 0 ? 'error' as const : 'ok' as const,\n errors: runtimeErrors,\n }\n }),\n }\n}\n\nexport function setMiraWorkerEnabled(\n workerId: string,\n enabled: boolean,\n options: ResolveStoragePathsOptions = {},\n) {\n const config = loadMiraWorkerConfig(workerId, options)\n writeMiraWorkerConfig(\n {\n ...config,\n enabled,\n },\n options,\n )\n}\n\nexport function uninstallMiraWorker(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n const configFile = resolveMiraWorkerConfigFile(workerId, options)\n const stateFile = resolveMiraWorkerStateFile(workerId, options)\n const config = existsSync(configFile)\n ? loadMiraWorkerConfig(workerId, options)\n : undefined\n const credentialFile = config\n ? resolveDefaultWorkerDeviceIdentityFile(\n config.serverUrl,\n config.workerId,\n config.email,\n options.homeDir,\n )\n : undefined\n\n const removedConfig = removeFileIfPresent(configFile)\n const removedState = removeFileIfPresent(stateFile)\n const removedCredential = credentialFile\n ? removeFileIfPresent(credentialFile)\n : false\n\n return {\n configFile,\n stateFile,\n credentialFile,\n removedConfig,\n removedState,\n removedCredential,\n }\n}\n\nexport function createClackPrompter(): MiraWorkerPrompter {\n return {\n async text(params) {\n const value = await text({\n message: params.message,\n placeholder: params.placeholder,\n defaultValue: params.initialValue,\n validate: params.validate\n ? input => params.validate?.(input ?? '')\n : undefined,\n })\n const resolved = unwrapCanceledValue(value, 'Mira CLI worker setup canceled')\n return resolved as string\n },\n async select(params) {\n const value = await select({\n message: params.message,\n initialValue: params.initialValue,\n options: params.options.map(option => ({\n value: option.value,\n label: option.label,\n })),\n })\n const resolved = unwrapCanceledValue(value, 'Mira CLI worker setup canceled')\n return resolved as string\n },\n async confirm(params) {\n const value = await confirm({\n message: params.message,\n initialValue: params.initialValue,\n })\n const resolved = unwrapCanceledValue(value, 'Mira CLI worker setup canceled')\n return resolved as boolean\n },\n }\n}\n\nfunction requiredString(field: string) {\n return (value: string) => (value.trim() ? undefined : `${field} is required`)\n}\n\nfunction validateDirectory(field: string) {\n return (value: string) => {\n const normalized = value.trim()\n if (!normalized) {\n return `${field} is required`\n }\n if (!isAbsolute(normalized)) {\n return `${field} must be an absolute path`\n }\n if (!existsSync(normalized)) {\n return `${field} does not exist`\n }\n return undefined\n }\n}\n\nasync function resolveTextInput(\n value: string | undefined,\n prompter: MiraWorkerPrompter,\n params: Parameters<MiraWorkerPrompter['text']>[0],\n) {\n const resolved = value ?? await prompter.text(params)\n const normalized = resolved.trim()\n const validationError = params.validate?.(normalized)\n\n if (validationError) {\n throw new Error(validationError)\n }\n\n return normalized\n}\n\nasync function resolveSelectInput(\n value: string | undefined,\n prompter: MiraWorkerPrompter,\n params: Parameters<MiraWorkerPrompter['select']>[0],\n) {\n const resolved = value ?? await prompter.select(params)\n const normalized = resolved.trim()\n const optionValues = params.options.map(option => option.value)\n\n if (!optionValues.includes(normalized)) {\n throw new Error(`${params.message} must be one of: ${optionValues.join(', ')}`)\n }\n\n return normalized\n}\n\nasync function promptRepoMappings(\n prompter: MiraWorkerPrompter,\n defaultWorkspace: string,\n) {\n const repoMappings: Record<string, string> = {}\n const addFirstPrompt = renderCliPrompt('cli.mara-worker.repo-mapping.add-first', undefined)\n let addAnotherMapping = await prompter.confirm({\n message: addFirstPrompt.message,\n initialValue: false,\n })\n\n while (addAnotherMapping) {\n const repoNamePrompt = renderCliPrompt('cli.mara-worker.repo-mapping.repo-name', undefined)\n const repo = await prompter.text({\n message: repoNamePrompt.message,\n placeholder: repoNamePrompt.placeholder,\n validate: requiredString('repo'),\n })\n const directoryPrompt = renderCliPrompt('cli.mara-worker.repo-mapping.directory', {\n repo,\n defaultWorkspace,\n })\n const cwd = await prompter.text({\n message: directoryPrompt.message,\n placeholder: directoryPrompt.placeholder,\n validate: validateDirectory('cwd'),\n })\n repoMappings[repo.trim()] = cwd.trim()\n const addAnotherPrompt = renderCliPrompt('cli.mara-worker.repo-mapping.add-another', undefined)\n addAnotherMapping = await prompter.confirm({\n message: addAnotherPrompt.message,\n initialValue: false,\n })\n }\n\n return repoMappings\n}\n\nfunction requireCliPromptOptions(\n options: Array<{ value: string, label: string }> | undefined,\n key: string,\n) {\n if (!options?.length) {\n throw new Error(`CLI prompt ${key} did not render selectable options`)\n }\n\n return options\n}\n\nfunction normalizeRepoMappings(repoMappings: Record<string, string>) {\n const normalized: Record<string, string> = {}\n\n for (const [repo, cwd] of Object.entries(repoMappings)) {\n const repoName = repo.trim()\n const directory = cwd.trim()\n const repoError = requiredString('repo')(repoName)\n const directoryError = validateDirectory('cwd')(directory)\n\n if (repoError) {\n throw new Error(repoError)\n }\n if (directoryError) {\n throw new Error(directoryError)\n }\n\n normalized[repoName] = directory\n }\n\n return normalized\n}\n\nfunction unwrapCanceledValue<T>(value: T, message: string) {\n if (isCancel(value)) {\n throw new Error(message)\n }\n return value\n}\n\nfunction removeFileIfPresent(file: string) {\n if (!existsSync(file)) {\n return false\n }\n rmSync(file, { force: true })\n return true\n}\n\nexport const resolveCocoWorkerStorageDir = resolveMiraWorkerStorageDir\nexport const resolveCocoWorkerConfigFile = resolveMiraWorkerConfigFile\nexport const resolveCocoWorkerStateFile = resolveMiraWorkerStateFile\nexport const loadCocoWorkerConfig = loadMiraWorkerConfig\nexport const writeCocoWorkerConfig = writeMiraWorkerConfig\nexport const loadCocoWorkerState = loadMiraWorkerState\nexport const writeCocoWorkerState = writeMiraWorkerState\nexport const runCocoWorkerSetup = runMiraWorkerSetup\nexport const listCocoWorkerConfigs = listMiraWorkerConfigs\nexport const getCocoWorkerDoctorReport = getMiraWorkerDoctorReport\nexport const setCocoWorkerEnabled = setMiraWorkerEnabled\nexport const uninstallCocoWorker = uninstallMiraWorker\n","import type { Part } from '@meego-harness/worker-sdk'\n\nexport function stringifyTaskMessageParts(parts: Part[]) {\n return parts\n .map((part) => {\n if (part.type === 'text') {\n return part.text\n }\n\n if (part.type === 'data') {\n return [\n `[data${part.mimeType ? ` mimeType=${part.mimeType}` : ''}]`,\n JSON.stringify(part.data, null, 2),\n '[/data]',\n ].join('\\n')\n }\n\n return [\n '[file-ref]',\n `uri: ${part.uri}`,\n part.name ? `name: ${part.name}` : undefined,\n part.mimeType ? `mimeType: ${part.mimeType}` : undefined,\n '[/file-ref]',\n ]\n .filter(Boolean)\n .join('\\n')\n })\n .join('\\n\\n')\n .trim()\n}\n","import type { ChildProcess } from 'node:child_process'\nimport type {\n MiraCliTaskExecutionRequest,\n MiraCliTaskExecutionResult,\n MiraCliTaskExecutorConfig,\n} from './types'\nimport { spawn, spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport process from 'node:process'\nimport { createInterface } from 'node:readline'\nimport { fileURLToPath } from 'node:url'\n\nexport class MiraCliTaskExecutor {\n private readonly miraBin: string\n private readonly pythonBin: string\n private readonly runnerScript: string\n private readonly spawnChild: NonNullable<MiraCliTaskExecutorConfig['spawn']>\n\n constructor(config: MiraCliTaskExecutorConfig = {}) {\n this.miraBin = config.miraBin ?? 'mira'\n this.pythonBin = config.pythonBin ?? 'python3'\n this.runnerScript = config.runnerScript ?? resolveDefaultRunnerScript()\n this.spawnChild = config.spawn ?? spawn\n }\n\n async runTurn(\n request: MiraCliTaskExecutionRequest,\n ): Promise<MiraCliTaskExecutionResult> {\n if (request.abortSignal.aborted) {\n throw createAbortError()\n }\n\n const child = this.spawnChild(this.pythonBin, [this.runnerScript], {\n cwd: request.cwd,\n ...(request.env ? { env: { ...process.env, ...request.env } } : {}),\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n return await new Promise<MiraCliTaskExecutionResult>((resolve, reject) => {\n let settled = false\n let stdoutBuffer = ''\n const stderrLines: string[] = []\n\n function settle(callback: () => void) {\n if (settled) {\n return\n }\n settled = true\n request.abortSignal.removeEventListener('abort', onAbort)\n callback()\n }\n\n function onAbort() {\n killChildProcess(child)\n settle(() => reject(createAbortError()))\n }\n\n request.abortSignal.addEventListener('abort', onAbort, { once: true })\n\n child.stdout?.on('data', (chunk) => {\n stdoutBuffer += chunk.toString()\n })\n\n if (child.stderr) {\n const stderr = createInterface({ input: child.stderr })\n stderr.on('line', (line) => {\n const trimmed = line.trim()\n if (!trimmed) {\n return\n }\n stderrLines.push(trimmed)\n while (stderrLines.length > 40) {\n stderrLines.shift()\n }\n })\n }\n\n child.once('error', (error) => {\n settle(() => reject(error))\n })\n\n child.once('close', (code, signal) => {\n if (request.abortSignal.aborted) {\n settle(() => reject(createAbortError()))\n return\n }\n\n let response: Record<string, unknown> | undefined\n try {\n response = parseMiraJsonResponse(stdoutBuffer)\n }\n catch (error) {\n if (code === 0) {\n settle(() => reject(error instanceof Error ? error : new Error('Failed to parse Mira output')))\n return\n }\n }\n\n if (code !== 0) {\n settle(() => reject(new Error(buildMiraExitError({\n code,\n signal,\n stderrLines,\n stdoutText: stdoutBuffer,\n response,\n }))))\n return\n }\n\n if (!response) {\n settle(() => reject(new Error('Mira completed without a JSON response')))\n return\n }\n\n const errorMessage = readString(response.error)\n if (errorMessage) {\n const sessionValue = readString(response.sessionId) || readString(response.session_id)\n const sessionSuffix = sessionValue ? `; sessionId=${sessionValue}` : ''\n settle(() => reject(new Error(`Mira returned an error${sessionSuffix}: ${errorMessage}`)))\n return\n }\n\n const text = readString(response.text) || readString((response.message as { content?: string } | undefined)?.content)\n if (!text) {\n settle(() => reject(new Error(`Mira completed without assistant text for context ${request.contextId}`)))\n return\n }\n\n const sessionId = readString(response.sessionId) || readString(response.session_id)\n if (!sessionId) {\n settle(() => reject(new Error(`Mira did not emit a session id for context ${request.contextId}`)))\n return\n }\n\n settle(() => resolve({ text, sessionId }))\n })\n\n child.stdin?.end(\n JSON.stringify(buildMiraPayload(request)),\n 'utf8',\n )\n })\n }\n}\n\nexport function assertMiraCliAvailable(\n miraBin = 'mira',\n run = spawnSync,\n pythonBin = 'python3',\n) {\n const miraResult = run(miraBin, ['--help'], {\n stdio: 'ignore',\n })\n\n if (miraResult.error) {\n throw new Error(`Unable to execute ${miraBin}: ${miraResult.error.message}`)\n }\n if (typeof miraResult.status === 'number' && miraResult.status !== 0) {\n throw new Error(\n `Mira CLI preflight failed for \"${miraBin} --help\" with exit code ${String(miraResult.status)}`,\n )\n }\n\n const pythonResult = run(pythonBin, ['--version'], {\n stdio: 'ignore',\n })\n\n if (pythonResult.error) {\n throw new Error(`Unable to execute ${pythonBin}: ${pythonResult.error.message}`)\n }\n if (typeof pythonResult.status === 'number' && pythonResult.status !== 0) {\n throw new Error(\n `Python preflight failed for \"${pythonBin} --version\" with exit code ${String(pythonResult.status)}`,\n )\n }\n}\n\nexport function buildMiraPayload(request: MiraCliTaskExecutionRequest) {\n return {\n cwd: request.cwd,\n prompt: request.prompt,\n session_id: request.sessionId,\n model: request.model,\n reasoning_effort: request.reasoningEffort,\n permission_preset: request.permissionPreset,\n disable_remote_capabilities: true,\n }\n}\n\nexport function createAbortError() {\n const error = new Error('Mira run aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function isAbortError(error: unknown) {\n return (\n (error instanceof Error && error.name === 'AbortError')\n || (error instanceof Error && /abort/i.test(error.message))\n )\n}\n\nfunction resolveDefaultRunnerScript() {\n const runnerScript = fileURLToPath(new URL('../python/mira_worker_runner.py', import.meta.url))\n if (!existsSync(runnerScript)) {\n throw new Error(`Mira CLI worker runner script not found: ${runnerScript}`)\n }\n return runnerScript\n}\n\nfunction parseMiraJsonResponse(text: string) {\n const trimmed = text.trim()\n if (!trimmed) {\n throw new Error('Mira produced empty stdout')\n }\n\n try {\n return parseMiraJsonResponseObject(JSON.parse(trimmed))\n }\n catch {\n const firstBrace = trimmed.indexOf('{')\n const lastBrace = trimmed.lastIndexOf('}')\n if (firstBrace < 0 || lastBrace <= firstBrace) {\n throw new Error(`Mira returned invalid JSON: ${summarizeOutput(trimmed.split(/\\r?\\n/u))}`)\n }\n\n return parseMiraJsonResponseObject(JSON.parse(trimmed.slice(firstBrace, lastBrace + 1)))\n }\n}\n\nfunction parseMiraJsonResponseObject(value: unknown) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Mira returned a non-object JSON response')\n }\n return value as Record<string, unknown>\n}\n\nfunction buildMiraExitError(params: {\n code: number | null\n signal: NodeJS.Signals | number | null\n stderrLines: string[]\n stdoutText: string\n response?: Record<string, unknown>\n}) {\n const base = `Mira CLI worker runner exited with code ${params.code}${params.signal ? ` (${params.signal})` : ''}`\n const responseError = params.response && typeof params.response.error === 'string'\n ? params.response.error\n : ''\n if (responseError) {\n return `${base}; error=${responseError}`\n }\n\n const stderrSummary = summarizeOutput(params.stderrLines)\n if (stderrSummary) {\n return `${base}; stderr=${stderrSummary}`\n }\n\n const stdoutSummary = summarizeOutput(params.stdoutText.split(/\\r?\\n/u))\n if (stdoutSummary) {\n return `${base}; stdout=${stdoutSummary}`\n }\n\n return base\n}\n\nfunction summarizeOutput(lines: string[]) {\n const compact = lines.map(line => line.trim()).filter(Boolean)\n if (!compact.length) {\n return ''\n }\n return compact.slice(-5).join(' | ')\n}\n\nfunction readString(value: unknown) {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction killChildProcess(child: ChildProcess) {\n try {\n child.kill('SIGTERM')\n }\n catch {\n }\n}\n\nexport const CocoCliTaskExecutor = MiraCliTaskExecutor\nexport const assertCocoCliAvailable = assertMiraCliAvailable\n","import type { TaskMessageContext } from '@meego-harness/worker-sdk'\nimport type {\n CocoReasoningEffort,\n CocoWorkerBridgeConfig,\n CocoWorkerBridgeDependencies,\n CocoWorkerContextBinding,\n} from './types'\nimport { existsSync, mkdirSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport process from 'node:process'\nimport { parseManagerRunResult } from '@meego-harness/manager-contract'\nimport { renderTextLlmPrompt } from '@meego-harness/prompt-registry'\nimport { WorkerClientSDK } from '@meego-harness/worker-sdk'\nimport { loadCocoWorkerState, writeCocoWorkerState } from './config'\nimport {\n COCO_WORKER_ROLE,\n COCO_WORKER_WORKING_TEXT,\n} from './constants'\nimport { stringifyTaskMessageParts } from './parts'\nimport { isAbortError } from './runtime'\n\ninterface ActiveTaskExecution {\n abortController: AbortController\n canceled: boolean\n}\n\ntype ParsedProjectNodeResult\n = | {\n status: 'completed'\n summary: string\n projectNodeWrites?: ProjectNodeWrite[]\n fieldPatches?: Array<{\n fieldKey: string\n value: string\n reason?: string\n }>\n }\n | {\n status: 'input_required'\n summary: string\n question: string\n reasonType?: ProjectNodeReasonType\n }\n\ntype ProjectNodeReasonType\n = | 'guidance_missing'\n | 'guidance_conflict'\n | 'business_fact_missing'\n | 'permission_missing'\n | 'external_dependency'\n | 'unknown'\n\ntype ProjectNodeWrite\n = | {\n kind: 'set-field'\n fieldKey: string\n value: unknown\n reason?: string\n }\n | {\n kind: 'upload-attachment'\n fieldKey: string\n artifactId: string\n reason?: string\n }\n\nexport class CocoWorkerBridge {\n private readonly config: CocoWorkerBridgeConfig\n private readonly executor: CocoWorkerBridgeDependencies['executor']\n private readonly logger: CocoWorkerBridgeDependencies['logger']\n private readonly client: WorkerClientSDK\n private readonly activeTasks = new Map<string, ActiveTaskExecution>()\n private readonly pendingCanceledTaskIds = new Set<string>()\n private readonly bindings = new Map<string, CocoWorkerContextBinding>()\n private readonly contextQueues = new Map<string, Promise<void>>()\n private readonly stateFile: string\n\n constructor(\n config: CocoWorkerBridgeConfig,\n dependencies: CocoWorkerBridgeDependencies,\n ) {\n this.config = config\n this.executor = dependencies.executor\n this.logger = dependencies.logger\n this.client\n = dependencies.client\n ?? new WorkerClientSDK({\n serverUrl: config.serverUrl,\n reconnectBaseDelayMs: config.reconnectBaseDelayMs,\n reconnectMaxDelayMs: config.reconnectMaxDelayMs,\n })\n this.stateFile = config.stateFile ?? join(process.cwd(), `${config.workerId}.state.json`)\n for (const binding of loadCocoWorkerState(this.stateFile).contexts) {\n this.bindings.set(binding.contextId, binding)\n }\n }\n\n async start(): Promise<this> {\n this.client.onMessage(async (context) => {\n await this.handleTaskMessage(context)\n })\n this.client.onCancel(async ({ taskId }) => {\n await this.handleTaskCancel(taskId)\n })\n this.client.onRoleChange(async (request) => {\n if (request.type === 'promote-to-manager') {\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n role: 'manager',\n managerGrant: request.managerGrant,\n capabilitySummary: this.config.capabilitySummary,\n credentialDeliveryEnabled: true,\n initialAvailability: 'available',\n })\n return\n }\n\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n role: COCO_WORKER_ROLE,\n capabilitySummary: this.config.capabilitySummary,\n credentialDeliveryEnabled: true,\n initialAvailability: 'available',\n })\n })\n\n await this.client.connect()\n await this.client.login({\n workerId: this.config.workerId,\n email: this.config.email,\n role: COCO_WORKER_ROLE,\n capabilitySummary: this.config.capabilitySummary,\n credentialDeliveryEnabled: true,\n initialAvailability: 'available',\n })\n\n return this\n }\n\n async stop(): Promise<void> {\n for (const execution of this.activeTasks.values()) {\n execution.abortController.abort()\n }\n this.activeTasks.clear()\n this.pendingCanceledTaskIds.clear()\n await this.client.disconnect()\n }\n\n private async handleTaskMessage({\n task,\n message,\n history,\n delivery,\n credentials,\n controller,\n }: TaskMessageContext) {\n const previous = this.contextQueues.get(task.contextId) ?? Promise.resolve()\n const current = previous.catch(() => undefined).then(async () => {\n await this.processTaskMessage({ task, message, history, delivery, credentials, controller })\n })\n this.contextQueues.set(task.contextId, current)\n\n try {\n await current\n }\n finally {\n if (this.contextQueues.get(task.contextId) === current) {\n this.contextQueues.delete(task.contextId)\n }\n }\n }\n\n private async processTaskMessage({\n task,\n message,\n credentials,\n controller,\n }: TaskMessageContext) {\n if (this.activeTasks.has(task.id)) {\n this.logger.warn(`Ignoring duplicate active task delivery for ${task.id}`)\n return\n }\n\n if (this.pendingCanceledTaskIds.has(task.id)) {\n this.pendingCanceledTaskIds.delete(task.id)\n return\n }\n\n const execution: ActiveTaskExecution = {\n abortController: new AbortController(),\n canceled: false,\n }\n this.activeTasks.set(task.id, execution)\n\n const requestedRepo = readOptionalStringMetadata(task.metadata, 'repo')\n const existingBinding = this.bindings.get(task.contextId)\n let binding = existingBinding\n let createdBinding = false\n\n try {\n if (!binding) {\n binding = this.createBinding(task.contextId, task.metadata)\n this.bindings.set(task.contextId, binding)\n this.persistState()\n createdBinding = true\n }\n else {\n const hydratedBinding = this.hydrateBindingFromMetadata(binding, task.metadata)\n if (hydratedBinding !== binding) {\n binding = hydratedBinding\n this.bindings.set(task.contextId, binding)\n this.persistState()\n }\n }\n const resolvedBinding = binding\n if (!resolvedBinding) {\n throw new Error(`Missing context binding for ${task.contextId}`)\n }\n\n if (!await this.trySendTaskStatusUpdate(\n task.id,\n 'working',\n async () => await controller.working({\n parts: [\n {\n type: 'text',\n text: COCO_WORKER_WORKING_TEXT,\n },\n ],\n }),\n )) {\n return\n }\n\n const managerRunInput = readManagerRunInput(task.metadata)\n const prompt = managerRunInput\n ? buildManagerRunPrompt(managerRunInput)\n : stringifyTaskMessageParts(message.parts)\n const planModePreamble = renderTextLlmPrompt('worker.mara.plan-mode-preamble', undefined).text\n const finalPrompt\n = !managerRunInput && createdBinding && resolvedBinding.planMode\n ? `${planModePreamble}\\n\\n${prompt}`.trim()\n : prompt\n\n const result = await this.executor.runTurn(buildCocoTaskExecutionRequest(\n task,\n finalPrompt,\n resolvedBinding,\n this.config,\n execution,\n credentials?.env,\n ))\n\n if (this.isTaskCanceled(task.id)) {\n return\n }\n\n if (resolvedBinding.sessionId !== result.sessionId) {\n resolvedBinding.sessionId = result.sessionId\n this.bindings.set(task.contextId, resolvedBinding)\n this.persistState()\n }\n\n if (managerRunInput) {\n const managerRunResult = parseManagerRunResult(parseJsonObjectOrThrow(result.text))\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'completed',\n async () => await controller.complete({\n parts: [\n {\n type: 'text',\n text: managerRunResult.summary,\n },\n ],\n metadata: buildCocoMetadata(resolvedBinding, requestedRepo, {\n managerRunResult,\n }),\n }),\n )\n return\n }\n\n const structuredProtocol = readOptionalStringMetadata(\n task.metadata,\n 'projectNodeResultProtocol',\n )\n const structuredResult = structuredProtocol\n ? await this.resolveStructuredProjectNodeResult(\n task,\n resolvedBinding,\n structuredProtocol,\n result.text,\n execution,\n credentials?.env,\n )\n : {\n status: 'completed' as const,\n summary: result.text,\n }\n\n if (structuredResult.status === 'input_required') {\n await this.trySendTaskStatusUpdate(\n task.id,\n 'input-required',\n async () => await controller.inputRequired({\n parts: [\n {\n type: 'text',\n text: structuredResult.question,\n },\n ],\n metadata: buildCocoMetadata(resolvedBinding, requestedRepo, {\n 'mira.summary': structuredResult.summary,\n 'coco.summary': structuredResult.summary,\n ...(structuredResult.reasonType\n ? { projectNodeReasonType: structuredResult.reasonType }\n : {}),\n }),\n }),\n )\n return\n }\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'completed',\n async () => await controller.complete({\n parts: [\n {\n type: 'text',\n text: structuredResult.summary,\n },\n ],\n metadata: buildCocoMetadata(\n resolvedBinding,\n requestedRepo,\n structuredResult.projectNodeWrites || structuredResult.fieldPatches\n ? {\n ...(structuredResult.fieldPatches\n ? { projectNodeFieldPatches: structuredResult.fieldPatches }\n : {}),\n projectNodeWrites: structuredResult.projectNodeWrites\n ?? toProjectNodeWrites(structuredResult.fieldPatches ?? []),\n }\n : undefined,\n ),\n }),\n )\n }\n catch (error) {\n if (this.isTaskCanceled(task.id) || isAbortError(error)) {\n return\n }\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'failed',\n async () => await controller.fail({\n parts: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : 'Mira run failed',\n },\n ],\n }),\n )\n }\n finally {\n this.activeTasks.delete(task.id)\n this.pendingCanceledTaskIds.delete(task.id)\n }\n }\n\n private async trySendTaskStatusUpdate(\n taskId: string,\n targetState: 'working' | 'input-required' | 'completed' | 'failed',\n action: () => Promise<void>,\n ) {\n try {\n await action()\n return true\n }\n catch (error) {\n if (isTerminalTaskConflictError(error)) {\n this.logger.warn(\n `Ignoring stale terminal task update for ${taskId} while reporting ${targetState}: ${error.message}`,\n )\n return false\n }\n if (isWorkerConnectionClosedError(error)) {\n this.logger.warn(\n `Skipping ${targetState} update for ${taskId} because the worker connection is already closed`,\n )\n return false\n }\n throw error\n }\n }\n\n private async handleTaskCancel(taskId: string) {\n const execution = this.activeTasks.get(taskId)\n if (!execution) {\n this.pendingCanceledTaskIds.add(taskId)\n return\n }\n\n execution.canceled = true\n execution.abortController.abort()\n }\n\n private createBinding(\n contextId: string,\n metadata: Record<string, unknown> | undefined,\n ): CocoWorkerContextBinding {\n const repo = readOptionalStringMetadata(metadata, 'repo')\n const explicitReasoning = readOptionalReasoningEffort(metadata, 'miraReasoningEffort')\n ?? readOptionalReasoningEffort(metadata, 'cocoReasoningEffort')\n const planMode = readOptionalBooleanMetadata(metadata, 'miraPlanMode')\n ?? readOptionalBooleanMetadata(metadata, 'cocoPlanMode')\n ?? false\n const cwd = this.resolveCwd(repo)\n\n return {\n contextId,\n repo,\n cwd,\n reasoningEffort:\n explicitReasoning\n ?? (isDefaultReasoningSelection(this.config.reasoningEffortDefault)\n ? undefined\n : this.config.reasoningEffortDefault as CocoReasoningEffort),\n planMode,\n }\n }\n\n private hydrateBindingFromMetadata(\n binding: CocoWorkerContextBinding,\n metadata: Record<string, unknown> | undefined,\n ) {\n const repo = readOptionalStringMetadata(metadata, 'repo')\n if (!repo || binding.repo) {\n return binding\n }\n\n return {\n ...binding,\n repo,\n cwd: this.resolveCwd(repo),\n }\n }\n\n private resolveCwd(repo?: string) {\n if (!repo) {\n this.ensureDirectory(this.config.defaultWorkspace, 'default workspace')\n return this.config.defaultWorkspace\n }\n\n const mapped = this.config.repoMappings[repo]\n if (Object.keys(this.config.repoMappings).length > 0) {\n if (!mapped) {\n throw new Error(`No repo mapping configured for ${repo}`)\n }\n this.ensureDirectory(mapped, `mapped repo directory for ${repo}`)\n return mapped\n }\n\n const inferred = join(this.config.defaultWorkspace, repo)\n this.ensureDirectory(inferred, `workspace repo directory for ${repo}`)\n return inferred\n }\n\n private ensureDirectory(path: string, label: string) {\n if (!existsSync(path)) {\n throw new Error(`Missing ${label}: ${path}`)\n }\n }\n\n private persistState() {\n mkdirSync(dirname(this.stateFile), { recursive: true })\n writeCocoWorkerState(this.stateFile, {\n contexts: Array.from(this.bindings.values()),\n })\n }\n\n private isTaskCanceled(taskId: string) {\n return (\n this.activeTasks.get(taskId)?.canceled ?? this.pendingCanceledTaskIds.has(taskId)\n )\n }\n\n private async resolveStructuredProjectNodeResult(\n task: TaskMessageContext['task'],\n binding: CocoWorkerContextBinding,\n protocol: string,\n firstText: string,\n execution: ActiveTaskExecution,\n env?: Record<string, string>,\n ): Promise<ParsedProjectNodeResult> {\n const firstParsed = parseProjectNodeResult(protocol, firstText)\n if (firstParsed) {\n return firstParsed\n }\n\n const retryResult = await this.executor.runTurn(buildCocoTaskExecutionRequest(\n task,\n buildStructuredRetryPrompt(protocol),\n binding,\n this.config,\n execution,\n env,\n ))\n\n if (this.isTaskCanceled(task.id)) {\n throw new Error('task canceled before structured retry completed')\n }\n\n if (binding.sessionId !== retryResult.sessionId) {\n binding.sessionId = retryResult.sessionId\n this.bindings.set(task.contextId, binding)\n this.persistState()\n }\n\n const retryParsed = parseProjectNodeResult(protocol, retryResult.text, {\n allowStringRepair: true,\n })\n if (retryParsed) {\n return retryParsed\n }\n\n throw new Error('Mira returned an invalid structured result after one retry')\n }\n}\n\nfunction buildCocoMetadata(\n binding: CocoWorkerContextBinding,\n requestedRepo?: string,\n extraMetadata?: Record<string, unknown>,\n) {\n return {\n 'mira.sessionId': binding.sessionId,\n 'mira.cwd': binding.cwd,\n 'coco.sessionId': binding.sessionId,\n 'coco.cwd': binding.cwd,\n ...(binding.repo ? { 'mira.repo': binding.repo, 'coco.repo': binding.repo } : {}),\n ...(requestedRepo ? { 'mira.requestedRepo': requestedRepo, 'coco.requestedRepo': requestedRepo } : {}),\n ...(binding.reasoningEffort\n ? {\n 'mira.reasoningEffort': binding.reasoningEffort,\n 'coco.reasoningEffort': binding.reasoningEffort,\n }\n : {}),\n 'mira.planMode': binding.planMode,\n 'coco.planMode': binding.planMode,\n ...(extraMetadata ? structuredClone(extraMetadata) : {}),\n }\n}\n\nfunction buildCocoTaskExecutionRequest(\n task: TaskMessageContext['task'],\n prompt: string,\n binding: CocoWorkerContextBinding,\n config: CocoWorkerBridgeConfig,\n execution: ActiveTaskExecution,\n env?: Record<string, string>,\n) {\n return {\n taskId: task.id,\n contextId: task.contextId,\n cwd: binding.cwd,\n prompt,\n sessionId: binding.sessionId,\n model:\n ['use-mira-default', 'use-coco-default'].includes(config.modelSelection)\n ? undefined\n : config.modelSelection,\n reasoningEffort: binding.reasoningEffort,\n permissionPreset: config.permissionPreset,\n abortSignal: execution.abortController.signal,\n ...(env ? { env } : {}),\n }\n}\n\nfunction buildStructuredRetryPrompt(_protocol: string) {\n return renderTextLlmPrompt('worker.mara.structured-retry', undefined).text\n}\n\nfunction buildManagerRunPrompt(input: Record<string, unknown>) {\n return renderTextLlmPrompt('worker.mara.manager-run', {\n managerRunInput: input,\n }).text\n}\n\nfunction isTerminalTaskConflictError(error: unknown): error is Error {\n return error instanceof Error\n && (\n error.message.includes('task is already terminal')\n || error.message.includes('cannot continue a terminal task')\n )\n}\n\nfunction isWorkerConnectionClosedError(error: unknown): error is Error {\n return error instanceof Error && error.message.includes('WebSocket is not connected')\n}\n\nfunction parseProjectNodeResult(\n protocol: string,\n text: string,\n options: {\n allowStringRepair?: boolean\n } = {},\n): ParsedProjectNodeResult | null {\n const parsed = parseProjectNodeResultObject(text, options)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null\n }\n\n if (protocol !== 'v1') {\n return null\n }\n\n if ('status' in parsed) {\n const status = normalizeStatus((parsed as { status?: unknown }).status)\n const summary = normalizeSummary((parsed as { summary?: unknown }).summary)\n if (!status || !summary) {\n return null\n }\n\n if (status === 'completed') {\n const projectNodeWrites = normalizeProjectNodeWrites(\n (parsed as { projectNodeWrites?: unknown }).projectNodeWrites,\n )\n const fieldPatches = normalizeFieldPatches((parsed as { fieldPatches?: unknown }).fieldPatches)\n return {\n status,\n summary,\n ...(projectNodeWrites && projectNodeWrites.length > 0 ? { projectNodeWrites } : {}),\n ...(fieldPatches && fieldPatches.length > 0 ? { fieldPatches } : {}),\n }\n }\n\n const question = normalizeSummary((parsed as { question?: unknown }).question)\n if (!question) {\n return null\n }\n const reasonType = normalizeProjectNodeReasonType(\n (parsed as { reasonType?: unknown }).reasonType,\n ) ?? undefined\n return {\n status,\n summary,\n question,\n ...(reasonType ? { reasonType } : {}),\n }\n }\n\n const choice = normalizeChoicePrefixedResult(parsed as Record<string, unknown>)\n if (!choice) {\n return null\n }\n return choice\n}\n\nfunction parseProjectNodeResultObject(\n text: string,\n options: {\n allowStringRepair?: boolean\n } = {},\n) {\n const trimmed = text.trim()\n if (!trimmed) {\n return null\n }\n\n const jsonText = unwrapJsonCodeFence(trimmed) ?? trimmed\n const parsedObject = parseJsonObjectWithOptionalRepair(\n jsonText,\n options.allowStringRepair ?? false,\n )\n if (parsedObject) {\n return parsedObject\n }\n\n const matched = jsonText.match(/^([12])\\s+(\\{[\\s\\S]+\\})$/)\n if (!matched) {\n return null\n }\n\n const choiceObject = parseJsonObjectWithOptionalRepair(\n matched[2],\n options.allowStringRepair ?? false,\n )\n if (!choiceObject || typeof choiceObject !== 'object' || Array.isArray(choiceObject)) {\n return null\n }\n\n return {\n choice: matched[1],\n ...(choiceObject as Record<string, unknown>),\n }\n}\n\nfunction unwrapJsonCodeFence(text: string) {\n if (!text.startsWith('```') || !text.endsWith('```')) {\n return null\n }\n\n const inner = text.slice(3, -3)\n const normalizedInner = inner.startsWith('\\r\\n')\n ? inner.slice(2)\n : inner.startsWith('\\n')\n ? inner.slice(1)\n : inner\n const newlineIndex = normalizedInner.search(/\\r?\\n/u)\n if (newlineIndex < 0) {\n return null\n }\n\n const header = normalizedInner.slice(0, newlineIndex).trim().toLowerCase()\n if (header && header !== 'json') {\n return null\n }\n\n return normalizedInner.slice(newlineIndex + 1).trim()\n}\n\nfunction parseJsonObjectWithOptionalRepair(\n text: string,\n allowStringRepair: boolean,\n) {\n try {\n return JSON.parse(text) as unknown\n }\n catch {\n if (!allowStringRepair) {\n return null\n }\n }\n\n const repaired = repairUnescapedJsonStringQuotes(text)\n if (!repaired || repaired === text) {\n return null\n }\n\n try {\n return JSON.parse(repaired) as unknown\n }\n catch {\n return null\n }\n}\n\nfunction parseJsonObjectOrThrow(text: string) {\n const trimmed = text.trim()\n const jsonText = unwrapJsonCodeFence(trimmed) ?? trimmed\n try {\n const parsed = JSON.parse(jsonText) as unknown\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('expected a JSON object')\n }\n return parsed\n }\n catch (error) {\n const suffix = error instanceof Error ? `: ${error.message}` : ''\n throw new Error(`Mira returned an invalid manager run result${suffix}`)\n }\n}\n\nfunction repairUnescapedJsonStringQuotes(text: string) {\n let repaired = ''\n let inString = false\n let escaped = false\n let changed = false\n\n for (let index = 0; index < text.length; index += 1) {\n const character = text[index]\n\n if (!inString) {\n repaired += character\n if (character === '\"') {\n inString = true\n }\n continue\n }\n\n if (escaped) {\n repaired += character\n escaped = false\n continue\n }\n\n if (character === '\\\\') {\n repaired += character\n escaped = true\n continue\n }\n\n if (character === '\"') {\n const nextNonWhitespace = findNextNonWhitespaceCharacter(text, index + 1)\n if (\n nextNonWhitespace === undefined\n || nextNonWhitespace === ','\n || nextNonWhitespace === '}'\n || nextNonWhitespace === ']'\n || nextNonWhitespace === ':'\n ) {\n repaired += character\n inString = false\n continue\n }\n\n repaired += '\\\\\"'\n changed = true\n continue\n }\n\n repaired += character\n }\n\n return changed ? repaired : null\n}\n\nfunction findNextNonWhitespaceCharacter(text: string, startIndex: number) {\n for (let index = startIndex; index < text.length; index += 1) {\n const character = text[index]\n if (!/\\s/u.test(character)) {\n return character\n }\n }\n\n return undefined\n}\n\nfunction normalizeStatus(value: unknown) {\n if (value === 'completed' || value === 'input_required') {\n return value\n }\n return null\n}\n\nfunction normalizeSummary(value: unknown) {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : null\n}\n\nfunction normalizeChoicePrefixedResult(\n parsed: Record<string, unknown>,\n): ParsedProjectNodeResult | null {\n const choice = parsed.choice\n const summary = normalizeSummary(parsed.summary)\n if (!summary || (choice !== '1' && choice !== '2')) {\n return null\n }\n\n if (choice === '1') {\n return {\n status: 'completed',\n summary,\n }\n }\n\n const question = normalizeSummary(parsed.question)\n if (!question) {\n return null\n }\n const reasonType = normalizeProjectNodeReasonType(parsed.reasonType) ?? undefined\n\n return {\n status: 'input_required',\n summary,\n question,\n ...(reasonType ? { reasonType } : {}),\n }\n}\n\nfunction normalizeFieldPatches(value: unknown) {\n if (!Array.isArray(value)) {\n return null\n }\n\n const patches = value.flatMap((item) => {\n if (!item || typeof item !== 'object') {\n return []\n }\n\n const record = item as Record<string, unknown>\n const fieldKey = normalizeSummary(record.fieldKey)\n const patchValue = normalizeSummary(record.value)\n const reason = normalizeSummary(record.reason) ?? undefined\n if (!fieldKey || !patchValue) {\n return []\n }\n\n return [{\n fieldKey,\n value: patchValue,\n ...(reason ? { reason } : {}),\n }]\n })\n\n return patches.length > 0 ? patches : null\n}\n\nfunction normalizeProjectNodeWrites(value: unknown): ProjectNodeWrite[] | null {\n if (!Array.isArray(value)) {\n return null\n }\n\n const writes: ProjectNodeWrite[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object') {\n continue\n }\n\n const record = item as Record<string, unknown>\n const kind = record.kind\n const fieldKey = normalizeSummary(record.fieldKey)\n const reason = normalizeSummary(record.reason) ?? undefined\n if (!fieldKey) {\n continue\n }\n\n if (kind === 'set-field') {\n if (!('value' in record) || record.value === undefined) {\n continue\n }\n writes.push({\n kind,\n fieldKey,\n value: record.value,\n ...(reason ? { reason } : {}),\n })\n continue\n }\n\n if (kind === 'upload-attachment') {\n const artifactId = normalizeSummary(record.artifactId)\n if (!artifactId) {\n continue\n }\n writes.push({\n kind,\n fieldKey,\n artifactId,\n ...(reason ? { reason } : {}),\n })\n }\n }\n\n return writes.length > 0 ? writes : null\n}\n\nfunction toProjectNodeWrites(\n patches: NonNullable<Extract<ParsedProjectNodeResult, { status: 'completed' }>['fieldPatches']>,\n) {\n return patches.map(patch => ({\n kind: 'set-field' as const,\n fieldKey: patch.fieldKey,\n value: patch.value,\n ...(patch.reason ? { reason: patch.reason } : {}),\n }))\n}\n\nfunction normalizeProjectNodeReasonType(\n value: unknown,\n): ProjectNodeReasonType | null {\n return value === 'guidance_missing'\n || value === 'guidance_conflict'\n || value === 'business_fact_missing'\n || value === 'permission_missing'\n || value === 'external_dependency'\n || value === 'unknown'\n ? value\n : null\n}\n\nfunction readManagerRunInput(\n metadata: Record<string, unknown> | undefined,\n) {\n const input = metadata?.managerRunInput\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return null\n }\n\n return structuredClone(input) as Record<string, unknown>\n}\n\nfunction readOptionalStringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n) {\n if (!metadata || !(key in metadata) || metadata[key] == null) {\n return undefined\n }\n\n const value = metadata[key]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${key} must be a non-empty string`)\n }\n return value.trim()\n}\n\nfunction readOptionalBooleanMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n) {\n if (!metadata || !(key in metadata) || metadata[key] == null) {\n return undefined\n }\n const value = metadata[key]\n if (typeof value !== 'boolean') {\n throw new TypeError(`${key} must be a boolean`)\n }\n return value\n}\n\nfunction readOptionalReasoningEffort(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): CocoReasoningEffort | undefined {\n const value = readOptionalStringMetadata(metadata, key)\n if (!value) {\n return undefined\n }\n if (!['low', 'medium', 'high', 'xhigh'].includes(value)) {\n throw new Error(`${key} must be one of low, medium, high, xhigh`)\n }\n return value as CocoReasoningEffort\n}\n\nfunction isDefaultReasoningSelection(\n value: string | undefined,\n): value is 'use-mira-default' | 'use-coco-default' {\n return value === 'use-mira-default' || value === 'use-coco-default'\n}\n\nexport { CocoWorkerBridge as MiraWorkerBridge }\n"],"mappings":"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","names":["existsSync","text","existsSync","mkdirSync","dirname","join","process","join","process","existsSync","mkdirSync","dirname","text"]}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ declare function runMiraWorkerCli(argv?: string[]): Promise<void>;
2
+ declare const runCocoWorkerCli: typeof runMiraWorkerCli;
3
+
4
+ export { runCocoWorkerCli, runMiraWorkerCli };
package/dist/cli.js ADDED
@@ -0,0 +1,351 @@
1
+ import {
2
+ CocoWorkerBridge,
3
+ MiraCliTaskExecutor,
4
+ assertCocoCliAvailable,
5
+ createClackPrompter,
6
+ getCocoWorkerDoctorReport,
7
+ listCocoWorkerConfigs,
8
+ loadCocoWorkerConfig,
9
+ resolveCocoWorkerStateFile,
10
+ runCocoWorkerSetup,
11
+ setCocoWorkerEnabled,
12
+ uninstallCocoWorker
13
+ } from "./chunk-VUPAW5X2.js";
14
+
15
+ // src/cli.ts
16
+ import { spawn, spawnSync } from "child_process";
17
+ import process from "process";
18
+ var TMUX_OPTION = "--tmux";
19
+ var TMUX_CHILD_OPTION = "--tmux-worker";
20
+ var TMUX_SESSION_PREFIX = "meego-mara-worker-";
21
+ var JSON_OPTION = "--json";
22
+ var consoleLogger = {
23
+ error(message) {
24
+ console.error(message);
25
+ },
26
+ info(message) {
27
+ console.log(message);
28
+ },
29
+ warn(message) {
30
+ console.warn(message);
31
+ }
32
+ };
33
+ async function runMiraWorkerCli(argv = process.argv.slice(2)) {
34
+ const [command, ...rest] = argv;
35
+ if (command === "setup") {
36
+ const setupResult = await runCocoWorkerSetup(
37
+ {
38
+ logger: consoleLogger
39
+ },
40
+ createClackPrompter(),
41
+ readMiraWorkerSetupInput(rest)
42
+ );
43
+ if (rest.includes(JSON_OPTION)) {
44
+ consoleLogger.info(JSON.stringify(setupResult));
45
+ }
46
+ return;
47
+ }
48
+ if (command === "list") {
49
+ const workers = listCocoWorkerConfigs();
50
+ if (rest.includes(JSON_OPTION)) {
51
+ consoleLogger.info(JSON.stringify(workers));
52
+ return;
53
+ }
54
+ if (workers.length === 0) {
55
+ consoleLogger.warn("No configured Mira CLI workers found");
56
+ return;
57
+ }
58
+ for (const worker of workers) {
59
+ consoleLogger.info(`${worker.workerId} ${worker.enabled ? "enabled" : "disabled"} ${worker.serverUrl}`);
60
+ }
61
+ return;
62
+ }
63
+ if (command === "doctor") {
64
+ const report = getCocoWorkerDoctorReport(
65
+ {},
66
+ {
67
+ assertCocoCliAvailable
68
+ }
69
+ );
70
+ if (rest.includes(JSON_OPTION)) {
71
+ consoleLogger.info(JSON.stringify(report));
72
+ return;
73
+ }
74
+ if (report.workers.length === 0) {
75
+ consoleLogger.warn("No configured Mira CLI workers found");
76
+ return;
77
+ }
78
+ for (const worker of report.workers) {
79
+ consoleLogger.info(`${worker.workerId} config=${worker.configStatus} runtime=${worker.runtimeStatus}`);
80
+ for (const error of worker.errors) {
81
+ consoleLogger.warn(error);
82
+ }
83
+ }
84
+ return;
85
+ }
86
+ if (command === "start") {
87
+ const workerId = parseWorkerId(rest, "start");
88
+ const useTmux = rest.includes(TMUX_OPTION);
89
+ const isTmuxChild = rest.includes(TMUX_CHILD_OPTION);
90
+ assertCocoCliAvailable();
91
+ const config = loadCocoWorkerConfig(workerId);
92
+ if (!config.enabled) {
93
+ throw new Error(
94
+ `Mira CLI worker ${workerId} is disabled. Run meego-mara-worker enable --worker ${workerId} first.`
95
+ );
96
+ }
97
+ if (useTmux && !isTmuxChild) {
98
+ const startedInTmux = startMiraWorkerInTmux(workerId, rest);
99
+ if (startedInTmux) {
100
+ consoleLogger.info(`Mira CLI worker ${workerId} started in tmux`);
101
+ return;
102
+ }
103
+ consoleLogger.warn("tmux is not available, starting in foreground");
104
+ }
105
+ const bridge = new CocoWorkerBridge(
106
+ {
107
+ ...config,
108
+ stateFile: resolveCocoWorkerStateFile(workerId)
109
+ },
110
+ {
111
+ executor: new MiraCliTaskExecutor(),
112
+ logger: consoleLogger
113
+ }
114
+ );
115
+ await bridge.start();
116
+ consoleLogger.info(`Mira CLI worker ${workerId} is connected`);
117
+ await waitForShutdownSignal();
118
+ await bridge.stop();
119
+ return;
120
+ }
121
+ if (command === "enable") {
122
+ const workerId = parseWorkerId(rest, "enable");
123
+ setCocoWorkerEnabled(workerId, true);
124
+ consoleLogger.info(`Enabled Mira CLI worker ${workerId}`);
125
+ return;
126
+ }
127
+ if (command === "disable") {
128
+ const workerId = parseWorkerId(rest, "disable");
129
+ setCocoWorkerEnabled(workerId, false);
130
+ consoleLogger.info(`Disabled Mira CLI worker ${workerId}`);
131
+ return;
132
+ }
133
+ if (command === "uninstall" || command === "remove") {
134
+ const workerId = parseWorkerId(rest, "uninstall");
135
+ const result = uninstallCocoWorker(workerId);
136
+ consoleLogger.info(`Removed mara worker ${workerId}`);
137
+ consoleLogger.info(`- config: ${result.removedConfig ? "deleted" : "missing"} ${result.configFile}`);
138
+ consoleLogger.info(`- state: ${result.removedState ? "deleted" : "missing"} ${result.stateFile}`);
139
+ if (result.credentialFile) {
140
+ consoleLogger.info(
141
+ `- credential: ${result.removedCredential ? "deleted" : "missing"} ${result.credentialFile}`
142
+ );
143
+ }
144
+ return;
145
+ }
146
+ if (command === "stop") {
147
+ const workerId = parseWorkerId(rest, "stop");
148
+ const stopped = stopMiraWorkerInTmux(workerId);
149
+ if (stopped) {
150
+ consoleLogger.info(`Stopped tmux session for Mira CLI worker ${workerId}`);
151
+ } else {
152
+ consoleLogger.warn(`No running tmux session found for Mira CLI worker ${workerId}`);
153
+ }
154
+ return;
155
+ }
156
+ if (command === "stop-all") {
157
+ const stopped = stopAllMiraWorkerSessionsInTmux();
158
+ if (stopped > 0) {
159
+ consoleLogger.info(`Stopped ${stopped} Mira CLI worker tmux session(s)`);
160
+ } else {
161
+ consoleLogger.warn("No running Mira CLI worker tmux session found");
162
+ }
163
+ return;
164
+ }
165
+ printUsage();
166
+ }
167
+ function startMiraWorkerInTmux(workerId, argv) {
168
+ if (!isTmuxAvailable() || !process.argv[1]) {
169
+ return false;
170
+ }
171
+ const sessionName = toTmuxSessionName(workerId);
172
+ const args = sanitizeTmuxArgs(argv).concat(TMUX_CHILD_OPTION);
173
+ try {
174
+ spawn("tmux", ["new-session", "-d", "-s", sessionName, process.execPath, process.argv[1], "start", ...args], {
175
+ stdio: "ignore"
176
+ });
177
+ return true;
178
+ } catch {
179
+ return false;
180
+ }
181
+ }
182
+ function isTmuxAvailable() {
183
+ try {
184
+ const result = spawnSync("tmux", ["-V"], {
185
+ stdio: "ignore"
186
+ });
187
+ return !result.error && result.status === 0;
188
+ } catch {
189
+ return false;
190
+ }
191
+ }
192
+ function stopMiraWorkerInTmux(workerId) {
193
+ if (!isTmuxAvailable()) {
194
+ return false;
195
+ }
196
+ return stopSessionByName(toTmuxSessionName(workerId));
197
+ }
198
+ function stopAllMiraWorkerSessionsInTmux() {
199
+ if (!isTmuxAvailable()) {
200
+ return 0;
201
+ }
202
+ const sessionNames = getActiveMiraWorkerSessions();
203
+ let stopped = 0;
204
+ for (const sessionName of sessionNames) {
205
+ if (stopSessionByName(sessionName)) {
206
+ stopped += 1;
207
+ }
208
+ }
209
+ return stopped;
210
+ }
211
+ function stopSessionByName(sessionName) {
212
+ try {
213
+ const result = spawnSync("tmux", ["kill-session", "-t", sessionName], {
214
+ stdio: "ignore"
215
+ });
216
+ return !result.error && result.status === 0;
217
+ } catch {
218
+ return false;
219
+ }
220
+ }
221
+ function getActiveMiraWorkerSessions() {
222
+ try {
223
+ const result = spawnSync("tmux", ["list-sessions", "-F", "#S"], {
224
+ encoding: "utf8"
225
+ });
226
+ if (result.error || result.status !== 0 || typeof result.stdout !== "string") {
227
+ return [];
228
+ }
229
+ return result.stdout.split("\n").map((line) => line.trim()).filter((line) => line.startsWith(TMUX_SESSION_PREFIX));
230
+ } catch {
231
+ return [];
232
+ }
233
+ }
234
+ function parseWorkerId(argv, commandName) {
235
+ const workerIndex = argv.findIndex((value) => value === "--worker");
236
+ const workerId = workerIndex >= 0 ? argv[workerIndex + 1] : void 0;
237
+ if (!workerId) {
238
+ throw new Error(`${commandName} requires --worker <workerId>`);
239
+ }
240
+ return workerId;
241
+ }
242
+ function readMiraWorkerSetupInput(argv) {
243
+ const input = {};
244
+ const repoMappings = readRepoMappings(argv);
245
+ const serverUrl = readOptionValue(argv, "--server-url");
246
+ const email = readOptionValue(argv, "--email");
247
+ const workerId = readOptionValue(argv, "--worker-id", "--worker");
248
+ const capabilitySummary = readOptionValue(argv, "--capability-summary");
249
+ const defaultWorkspace = readOptionValue(argv, "--default-workspace", "--workspace");
250
+ const permissionPreset = readOptionValue(argv, "--permission-preset");
251
+ const modelSelection = readOptionValue(argv, "--model");
252
+ const reasoningEffortDefault = readOptionValue(argv, "--reasoning-effort");
253
+ if (serverUrl) {
254
+ input.serverUrl = serverUrl;
255
+ }
256
+ if (email) {
257
+ input.email = email;
258
+ }
259
+ if (workerId) {
260
+ input.workerId = workerId;
261
+ }
262
+ if (capabilitySummary) {
263
+ input.capabilitySummary = capabilitySummary;
264
+ }
265
+ if (defaultWorkspace) {
266
+ input.defaultWorkspace = defaultWorkspace;
267
+ }
268
+ if (permissionPreset) {
269
+ input.permissionPreset = permissionPreset;
270
+ }
271
+ if (modelSelection) {
272
+ input.modelSelection = modelSelection;
273
+ }
274
+ if (reasoningEffortDefault) {
275
+ input.reasoningEffortDefault = reasoningEffortDefault;
276
+ }
277
+ if (Object.keys(input).length > 0 || Object.keys(repoMappings).length > 0) {
278
+ input.repoMappings = repoMappings;
279
+ }
280
+ return Object.keys(input).length > 0 ? input : void 0;
281
+ }
282
+ function readOptionValue(argv, ...optionNames) {
283
+ for (const optionName of optionNames) {
284
+ const optionIndex = argv.findIndex((value2) => value2 === optionName);
285
+ if (optionIndex < 0) {
286
+ continue;
287
+ }
288
+ const value = argv[optionIndex + 1];
289
+ if (!value || value.startsWith("--")) {
290
+ throw new Error(`${optionName} requires a value`);
291
+ }
292
+ return value;
293
+ }
294
+ return void 0;
295
+ }
296
+ function readRepoMappings(argv) {
297
+ const repoMappings = {};
298
+ for (let index = 0; index < argv.length; index += 1) {
299
+ if (argv[index] !== "--repo-map") {
300
+ continue;
301
+ }
302
+ const mapping = argv[index + 1];
303
+ if (!mapping || mapping.startsWith("--")) {
304
+ throw new Error("--repo-map requires <repo>=<directory>");
305
+ }
306
+ const separatorIndex = mapping.indexOf("=");
307
+ if (separatorIndex <= 0 || separatorIndex === mapping.length - 1) {
308
+ throw new Error("--repo-map requires <repo>=<directory>");
309
+ }
310
+ repoMappings[mapping.slice(0, separatorIndex)] = mapping.slice(separatorIndex + 1);
311
+ }
312
+ return repoMappings;
313
+ }
314
+ function sanitizeTmuxArgs(argv) {
315
+ return argv.filter((value) => value !== TMUX_OPTION && value !== TMUX_CHILD_OPTION);
316
+ }
317
+ function toTmuxSessionName(workerId) {
318
+ const safeWorkerId = workerId.replace(/[^\w.-]/g, "-");
319
+ return `${TMUX_SESSION_PREFIX}${safeWorkerId}`;
320
+ }
321
+ function printUsage() {
322
+ console.log([
323
+ "Usage:",
324
+ " meego-mara-worker setup [--server-url <url>] [--email <email>] [--json]",
325
+ " meego-mara-worker list [--json]",
326
+ " meego-mara-worker doctor [--json]",
327
+ " meego-mara-worker start --worker <workerId> [--tmux]",
328
+ " meego-mara-worker enable --worker <workerId>",
329
+ " meego-mara-worker disable --worker <workerId>",
330
+ " meego-mara-worker stop --worker <workerId>",
331
+ " meego-mara-worker stop-all",
332
+ " meego-mara-worker uninstall --worker <workerId>"
333
+ ].join("\n"));
334
+ }
335
+ async function waitForShutdownSignal() {
336
+ return await new Promise((resolve) => {
337
+ const handler = () => {
338
+ process.off("SIGINT", handler);
339
+ process.off("SIGTERM", handler);
340
+ resolve();
341
+ };
342
+ process.on("SIGINT", handler);
343
+ process.on("SIGTERM", handler);
344
+ });
345
+ }
346
+ var runCocoWorkerCli = runMiraWorkerCli;
347
+ export {
348
+ runCocoWorkerCli,
349
+ runMiraWorkerCli
350
+ };
351
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import type { CocoWorkerSetupInput } from './types'\nimport { spawn, spawnSync } from 'node:child_process'\nimport process from 'node:process'\nimport { CocoWorkerBridge as MiraWorkerBridge } from './bridge'\nimport {\n createClackPrompter,\n getCocoWorkerDoctorReport,\n listCocoWorkerConfigs,\n loadCocoWorkerConfig,\n resolveCocoWorkerStateFile,\n runCocoWorkerSetup,\n setCocoWorkerEnabled,\n uninstallCocoWorker,\n} from './config'\nimport { assertCocoCliAvailable, MiraCliTaskExecutor } from './runtime'\n\nconst TMUX_OPTION = '--tmux'\nconst TMUX_CHILD_OPTION = '--tmux-worker'\nconst TMUX_SESSION_PREFIX = 'meego-mara-worker-'\nconst JSON_OPTION = '--json'\n\nconst consoleLogger = {\n error(message: string) {\n console.error(message)\n },\n info(message: string) {\n console.log(message)\n },\n warn(message: string) {\n console.warn(message)\n },\n}\n\nexport async function runMiraWorkerCli(argv = process.argv.slice(2)) {\n const [command, ...rest] = argv\n\n if (command === 'setup') {\n const setupResult = await runCocoWorkerSetup(\n {\n logger: consoleLogger,\n },\n createClackPrompter(),\n readMiraWorkerSetupInput(rest),\n )\n if (rest.includes(JSON_OPTION)) {\n consoleLogger.info(JSON.stringify(setupResult))\n }\n return\n }\n\n if (command === 'list') {\n const workers = listCocoWorkerConfigs()\n if (rest.includes(JSON_OPTION)) {\n consoleLogger.info(JSON.stringify(workers))\n return\n }\n\n if (workers.length === 0) {\n consoleLogger.warn('No configured Mira CLI workers found')\n return\n }\n\n for (const worker of workers) {\n consoleLogger.info(`${worker.workerId} ${worker.enabled ? 'enabled' : 'disabled'} ${worker.serverUrl}`)\n }\n return\n }\n\n if (command === 'doctor') {\n const report = getCocoWorkerDoctorReport(\n {},\n {\n assertCocoCliAvailable,\n },\n )\n if (rest.includes(JSON_OPTION)) {\n consoleLogger.info(JSON.stringify(report))\n return\n }\n\n if (report.workers.length === 0) {\n consoleLogger.warn('No configured Mira CLI workers found')\n return\n }\n\n for (const worker of report.workers) {\n consoleLogger.info(`${worker.workerId} config=${worker.configStatus} runtime=${worker.runtimeStatus}`)\n for (const error of worker.errors) {\n consoleLogger.warn(error)\n }\n }\n return\n }\n\n if (command === 'start') {\n const workerId = parseWorkerId(rest, 'start')\n const useTmux = rest.includes(TMUX_OPTION)\n const isTmuxChild = rest.includes(TMUX_CHILD_OPTION)\n assertCocoCliAvailable()\n\n const config = loadCocoWorkerConfig(workerId)\n if (!config.enabled) {\n throw new Error(\n `Mira CLI worker ${workerId} is disabled. Run meego-mara-worker enable --worker ${workerId} first.`,\n )\n }\n\n if (useTmux && !isTmuxChild) {\n const startedInTmux = startMiraWorkerInTmux(workerId, rest)\n\n if (startedInTmux) {\n consoleLogger.info(`Mira CLI worker ${workerId} started in tmux`)\n return\n }\n consoleLogger.warn('tmux is not available, starting in foreground')\n }\n\n const bridge = new MiraWorkerBridge(\n {\n ...config,\n stateFile: resolveCocoWorkerStateFile(workerId),\n },\n {\n executor: new MiraCliTaskExecutor(),\n logger: consoleLogger,\n },\n )\n\n await bridge.start()\n consoleLogger.info(`Mira CLI worker ${workerId} is connected`)\n await waitForShutdownSignal()\n await bridge.stop()\n return\n }\n\n if (command === 'enable') {\n const workerId = parseWorkerId(rest, 'enable')\n setCocoWorkerEnabled(workerId, true)\n consoleLogger.info(`Enabled Mira CLI worker ${workerId}`)\n return\n }\n\n if (command === 'disable') {\n const workerId = parseWorkerId(rest, 'disable')\n setCocoWorkerEnabled(workerId, false)\n consoleLogger.info(`Disabled Mira CLI worker ${workerId}`)\n return\n }\n\n if (command === 'uninstall' || command === 'remove') {\n const workerId = parseWorkerId(rest, 'uninstall')\n const result = uninstallCocoWorker(workerId)\n consoleLogger.info(`Removed mara worker ${workerId}`)\n consoleLogger.info(`- config: ${result.removedConfig ? 'deleted' : 'missing'} ${result.configFile}`)\n consoleLogger.info(`- state: ${result.removedState ? 'deleted' : 'missing'} ${result.stateFile}`)\n if (result.credentialFile) {\n consoleLogger.info(\n `- credential: ${result.removedCredential ? 'deleted' : 'missing'} ${result.credentialFile}`,\n )\n }\n return\n }\n\n if (command === 'stop') {\n const workerId = parseWorkerId(rest, 'stop')\n const stopped = stopMiraWorkerInTmux(workerId)\n if (stopped) {\n consoleLogger.info(`Stopped tmux session for Mira CLI worker ${workerId}`)\n }\n else {\n consoleLogger.warn(`No running tmux session found for Mira CLI worker ${workerId}`)\n }\n return\n }\n\n if (command === 'stop-all') {\n const stopped = stopAllMiraWorkerSessionsInTmux()\n if (stopped > 0) {\n consoleLogger.info(`Stopped ${stopped} Mira CLI worker tmux session(s)`)\n }\n else {\n consoleLogger.warn('No running Mira CLI worker tmux session found')\n }\n return\n }\n\n printUsage()\n}\n\nfunction startMiraWorkerInTmux(workerId: string, argv: string[]) {\n if (!isTmuxAvailable() || !process.argv[1]) {\n return false\n }\n\n const sessionName = toTmuxSessionName(workerId)\n const args = sanitizeTmuxArgs(argv).concat(TMUX_CHILD_OPTION)\n\n try {\n spawn('tmux', ['new-session', '-d', '-s', sessionName, process.execPath, process.argv[1], 'start', ...args], {\n stdio: 'ignore',\n })\n return true\n }\n catch {\n return false\n }\n}\n\nfunction isTmuxAvailable() {\n try {\n const result = spawnSync('tmux', ['-V'], {\n stdio: 'ignore',\n })\n return !result.error && result.status === 0\n }\n catch {\n return false\n }\n}\n\nfunction stopMiraWorkerInTmux(workerId: string) {\n if (!isTmuxAvailable()) {\n return false\n }\n\n return stopSessionByName(toTmuxSessionName(workerId))\n}\n\nfunction stopAllMiraWorkerSessionsInTmux() {\n if (!isTmuxAvailable()) {\n return 0\n }\n\n const sessionNames = getActiveMiraWorkerSessions()\n let stopped = 0\n for (const sessionName of sessionNames) {\n if (stopSessionByName(sessionName)) {\n stopped += 1\n }\n }\n return stopped\n}\n\nfunction stopSessionByName(sessionName: string) {\n try {\n const result = spawnSync('tmux', ['kill-session', '-t', sessionName], {\n stdio: 'ignore',\n })\n return !result.error && result.status === 0\n }\n catch {\n return false\n }\n}\n\nfunction getActiveMiraWorkerSessions() {\n try {\n const result = spawnSync('tmux', ['list-sessions', '-F', '#S'], {\n encoding: 'utf8',\n })\n if (result.error || result.status !== 0 || typeof result.stdout !== 'string') {\n return []\n }\n\n return result.stdout\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line.startsWith(TMUX_SESSION_PREFIX))\n }\n catch {\n return []\n }\n}\n\nfunction parseWorkerId(argv: string[], commandName: 'start' | 'enable' | 'disable' | 'uninstall' | 'stop') {\n const workerIndex = argv.findIndex(value => value === '--worker')\n const workerId = workerIndex >= 0 ? argv[workerIndex + 1] : undefined\n\n if (!workerId) {\n throw new Error(`${commandName} requires --worker <workerId>`)\n }\n\n return workerId\n}\n\nfunction readMiraWorkerSetupInput(argv: string[]): CocoWorkerSetupInput | undefined {\n const input: CocoWorkerSetupInput = {}\n const repoMappings = readRepoMappings(argv)\n const serverUrl = readOptionValue(argv, '--server-url')\n const email = readOptionValue(argv, '--email')\n const workerId = readOptionValue(argv, '--worker-id', '--worker')\n const capabilitySummary = readOptionValue(argv, '--capability-summary')\n const defaultWorkspace = readOptionValue(argv, '--default-workspace', '--workspace')\n const permissionPreset = readOptionValue(argv, '--permission-preset')\n const modelSelection = readOptionValue(argv, '--model')\n const reasoningEffortDefault = readOptionValue(argv, '--reasoning-effort')\n\n if (serverUrl) {\n input.serverUrl = serverUrl\n }\n if (email) {\n input.email = email\n }\n if (workerId) {\n input.workerId = workerId\n }\n if (capabilitySummary) {\n input.capabilitySummary = capabilitySummary\n }\n if (defaultWorkspace) {\n input.defaultWorkspace = defaultWorkspace\n }\n if (permissionPreset) {\n input.permissionPreset = permissionPreset as CocoWorkerSetupInput['permissionPreset']\n }\n if (modelSelection) {\n input.modelSelection = modelSelection\n }\n if (reasoningEffortDefault) {\n input.reasoningEffortDefault = reasoningEffortDefault as CocoWorkerSetupInput['reasoningEffortDefault']\n }\n if (Object.keys(input).length > 0 || Object.keys(repoMappings).length > 0) {\n input.repoMappings = repoMappings\n }\n\n return Object.keys(input).length > 0 ? input : undefined\n}\n\nfunction readOptionValue(argv: string[], ...optionNames: string[]) {\n for (const optionName of optionNames) {\n const optionIndex = argv.findIndex(value => value === optionName)\n if (optionIndex < 0) {\n continue\n }\n\n const value = argv[optionIndex + 1]\n if (!value || value.startsWith('--')) {\n throw new Error(`${optionName} requires a value`)\n }\n\n return value\n }\n\n return undefined\n}\n\nfunction readRepoMappings(argv: string[]) {\n const repoMappings: Record<string, string> = {}\n\n for (let index = 0; index < argv.length; index += 1) {\n if (argv[index] !== '--repo-map') {\n continue\n }\n\n const mapping = argv[index + 1]\n if (!mapping || mapping.startsWith('--')) {\n throw new Error('--repo-map requires <repo>=<directory>')\n }\n\n const separatorIndex = mapping.indexOf('=')\n if (separatorIndex <= 0 || separatorIndex === mapping.length - 1) {\n throw new Error('--repo-map requires <repo>=<directory>')\n }\n\n repoMappings[mapping.slice(0, separatorIndex)] = mapping.slice(separatorIndex + 1)\n }\n\n return repoMappings\n}\n\nfunction sanitizeTmuxArgs(argv: string[]) {\n return argv.filter(value => value !== TMUX_OPTION && value !== TMUX_CHILD_OPTION)\n}\n\nfunction toTmuxSessionName(workerId: string) {\n const safeWorkerId = workerId.replace(/[^\\w.-]/g, '-')\n return `${TMUX_SESSION_PREFIX}${safeWorkerId}`\n}\n\nfunction printUsage() {\n console.log([\n 'Usage:',\n ' meego-mara-worker setup [--server-url <url>] [--email <email>] [--json]',\n ' meego-mara-worker list [--json]',\n ' meego-mara-worker doctor [--json]',\n ' meego-mara-worker start --worker <workerId> [--tmux]',\n ' meego-mara-worker enable --worker <workerId>',\n ' meego-mara-worker disable --worker <workerId>',\n ' meego-mara-worker stop --worker <workerId>',\n ' meego-mara-worker stop-all',\n ' meego-mara-worker uninstall --worker <workerId>',\n ].join('\\n'))\n}\n\nasync function waitForShutdownSignal() {\n return await new Promise<void>((resolve) => {\n const handler = () => {\n process.off('SIGINT', handler)\n process.off('SIGTERM', handler)\n resolve()\n }\n\n process.on('SIGINT', handler)\n process.on('SIGTERM', handler)\n })\n}\n\nexport const runCocoWorkerCli = runMiraWorkerCli\n"],"mappings":"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","names":["value"]}