@soloco/cli 0.3.1-canary.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 +61 -0
- package/README.md +116 -0
- package/dist/index.js +1290 -0
- package/dist/index.js.map +7 -0
- package/package.json +41 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/program.ts", "../../packages/local-runtime/src/cloud-auth.ts", "../src/lib/api.ts", "../src/lib/cloud-login.ts", "../src/lib/env.ts", "../src/lib/goal-text.ts", "../src/lib/print-goal.ts", "../src/lib/format.ts", "../src/lib/monitor.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport * as fs from \"fs\";\nimport * as net from \"net\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as readline from \"readline\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n clearStoredAuth,\n loadStoredAuth,\n saveStoredAuth,\n type StoredAuth,\n} from \"./config/auth-store.js\";\nimport { createApiClient, type ApiClient } from \"./lib/api.js\";\nimport {\n createCloudAuthClient,\n refreshStoredAccessToken,\n} from \"./lib/cloud-auth.js\";\nimport {\n ensureCloudLogin as ensureCloudLoginDefault,\n resolveDefaultCloudBaseUrl,\n runDeviceLogin,\n} from \"./lib/cloud-login.js\";\nimport { resolveApiBase } from \"./lib/env.js\";\nimport {\n extractCurrentGoalId,\n joinGoalParts,\n parseLogLimit,\n} from \"./lib/goal-text.js\";\nimport { printGoal } from \"./lib/print-goal.js\";\nimport { monitorGoal } from \"./lib/monitor.js\";\n\nexport const CLI_SUBCOMMANDS = [\n \"status\",\n \"pause\",\n \"resume\",\n \"abort\",\n \"log\",\n \"setup\",\n \"update\",\n \"steer\",\n \"monitor\",\n \"tail\",\n \"usage\",\n \"usage:backfill\",\n \"login\",\n \"logout\",\n \"whoami\",\n] as const;\n\nexport type CliDeps = {\n apiBase: string;\n api: ApiClient;\n ensureCloudLogin: () => Promise<StoredAuth>;\n sleep: (ms: number) => Promise<void>;\n openBrowser: (url: string) => Promise<void>;\n};\n\nexport function createDefaultCliDeps(): CliDeps {\n const apiBase = resolveApiBase();\n const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n return {\n apiBase,\n api: createApiClient(apiBase),\n ensureCloudLogin: () => ensureCloudLoginDefault({ openBrowser, sleep }),\n sleep,\n openBrowser,\n };\n}\n\nexport function createCliProgram(deps: CliDeps = createDefaultCliDeps()): Command {\n const { api, apiBase, ensureCloudLogin, sleep, openBrowser } = deps;\n const program = new Command();\n\n program\n .name(\"soloco\")\n .description(\"Soloco CLI \u2014 \u7528\u4E00\u53E5\u8BDD\u542F\u52A8 AI \u76EE\u6807\u5FAA\u73AF\")\n .version(resolveCliVersion());\n\n program\n .command(\"login\")\n .description(\"\u767B\u5F55 Soloco Cloud\uFF0C\u7528\u4E8E\u540E\u7EED\u672C\u5730\u8FD0\u884C\u65F6\u540C\u6B65\")\n .option(\n \"--server-url <url>\",\n \"Soloco Cloud URL\",\n resolveDefaultCloudBaseUrl(),\n )\n .option(\"--name <name>\", \"\u5F53\u524D\u8BBE\u5907\u540D\u79F0\", defaultInstallationName())\n .action(async (opts: { serverUrl: string; name?: string }) => {\n try {\n await runDeviceLogin({\n installationName: opts.name,\n openBrowser,\n serverUrl: opts.serverUrl,\n sleep,\n });\n console.log(pc.green(\"\u767B\u5F55\u6210\u529F\uFF0C\u5DF2\u4FDD\u5B58\u672C\u673A Soloco Cloud \u51ED\u8BC1\"));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u767B\u5F55\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"logout\")\n .description(\"\u5220\u9664\u672C\u673A Soloco Cloud \u767B\u5F55\u51ED\u8BC1\")\n .action(async () => {\n await clearStoredAuth();\n console.log(pc.green(\"\u5DF2\u9000\u51FA Soloco Cloud \u767B\u5F55\"));\n });\n\n program\n .command(\"whoami\")\n .description(\"\u6821\u9A8C\u5F53\u524D Soloco Cloud \u767B\u5F55\u72B6\u6001\")\n .action(async () => {\n try {\n const auth = await loadStoredAuth();\n if (!auth) {\n console.error(pc.yellow(\"\u5C1A\u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C soloco login\"));\n process.exit(1);\n }\n const client = createCloudAuthClient(auth.cloudBaseUrl);\n const refreshed = await refreshStoredAccessToken(client, auth);\n await saveStoredAuth(refreshed);\n console.log(`Soloco Cloud: ${pc.bold(refreshed.cloudBaseUrl)}`);\n console.log(`User: ${refreshed.userId}`);\n console.log(`Installation: ${refreshed.installationId}`);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u767B\u5F55\u6821\u9A8C\u5931\u8D25: ${message}`));\n console.error(pc.yellow(\"\u8BF7\u91CD\u65B0\u8FD0\u884C soloco login\"));\n process.exit(1);\n }\n });\n\n program\n .argument(\"[goal...]\", \"\u76EE\u6807\u63CF\u8FF0\")\n .action(async (goalParts: string[], _opts, cmd) => {\n const goal = joinGoalParts(goalParts);\n if (!goal) {\n cmd.help();\n return;\n }\n\n console.log(pc.bold(`\u542F\u52A8\u76EE\u6807: ${goal}`));\n console.log();\n\n let created: { id: string };\n try {\n await ensureCloudLogin();\n created = await api(\"POST\", \"/api/goals\", { description: goal });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u521B\u5EFA\u76EE\u6807\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n\n const goalId = created.id;\n console.log(`\u76EE\u6807\u5DF2\u521B\u5EFA (${pc.dim(goalId)}), \u5F00\u59CB\u8F6E\u8BE2\u8FDB\u5EA6...`);\n console.log(pc.dim(\"\u6309 Ctrl+C \u9000\u51FA\u8F6E\u8BE2 (\u76EE\u6807\u7EE7\u7EED\u5728\u540E\u53F0\u8FD0\u884C)\"));\n console.log();\n\n let lastCycle = -1;\n while (true) {\n try {\n const status = await api<{\n currentCycle?: number;\n lastCycleSummary?: string;\n status?: string;\n }>(\"GET\", `/api/goals/${goalId}`);\n if (status.currentCycle !== lastCycle) {\n lastCycle = status.currentCycle ?? 0;\n const ts = new Date().toLocaleTimeString();\n const summary = status.lastCycleSummary || status.status || \"-\";\n console.log(`${pc.dim(ts)} [\u5FAA\u73AF ${lastCycle}] ${summary}`);\n }\n if ([\"completed\", \"aborted\", \"failed\"].includes(status.status || \"\")) {\n console.log();\n console.log(pc.bold(\"\u76EE\u6807\u7ED3\u675F\"));\n printGoal(status);\n break;\n }\n } catch {\n // server may be briefly unreachable between cycles\n }\n await sleep(3000);\n }\n });\n\n program\n .command(\"status\")\n .description(\"\u67E5\u770B\u76EE\u6807\u72B6\u6001 (\u652F\u6301 --url \u89E3\u6790 Dashboard URL, --json \u673A\u5668\u53EF\u8BFB, --watch \u6301\u7EED\u8F6E\u8BE2)\")\n .argument(\"[goal-id-or-url]\", \"\u76EE\u6807 ID \u6216 Dashboard URL (\u4E0D\u4F20\u5219\u9ED8\u8BA4\u5F53\u524D\u6D3B\u8DC3\u76EE\u6807)\")\n .option(\"--url <url>\", \"Dashboard URL (\u540C\u4F4D\u7F6E\u53C2\u6570, \u4F18\u5148\u7EA7\u66F4\u9AD8)\")\n .option(\"--json\", \"\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA (\u5355\u6B21\u6216 NDJSON \u6D41)\")\n .option(\"--deep\", \"\u4F7F\u7528 /snapshot \u805A\u5408\u7AEF\u70B9 (\u5305\u542B runs/pending/events \u7B49)\")\n .option(\"--watch\", \"\u6301\u7EED\u8F6E\u8BE2\u76F4\u5230\u7EC8\u6B62\u72B6\u6001\")\n .option(\"--interval <seconds>\", \"\u8F6E\u8BE2\u95F4\u9694\u79D2\u6570 (--watch \u6A21\u5F0F)\", \"5\")\n .action(async (\n goalIdOrUrl: string | undefined,\n opts: { url?: string; json?: boolean; deep?: boolean; watch?: boolean; interval?: string },\n ) => {\n try {\n await ensureCloudLogin();\n\n // Resolve goal ID and API base from URL or positional arg\n let resolvedGoalId: string | undefined;\n let resolvedApiBase = apiBase;\n\n const rawUrl = opts.url ?? goalIdOrUrl;\n if (rawUrl && (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\"))) {\n try {\n const parsed = new URL(rawUrl);\n resolvedApiBase = `${parsed.protocol}//${parsed.host}`;\n const idParam = parsed.searchParams.get(\"id\");\n if (idParam) {\n resolvedGoalId = idParam;\n } else {\n const m = parsed.pathname.match(/\\/goals?\\/([a-f0-9-]{36})/i);\n if (m) resolvedGoalId = m[1];\n }\n } catch { /* fallback */ }\n } else if (rawUrl) {\n resolvedGoalId = rawUrl;\n }\n\n const resolvedApi = resolvedApiBase !== apiBase\n ? createApiClient(resolvedApiBase)\n : api;\n\n const fetchSnapshot = async () => {\n if (!resolvedGoalId) {\n const current = await resolvedApi(\"GET\", \"/api/goals/current\");\n const g = Array.isArray(current) ? current[0] : current;\n resolvedGoalId = (g as Record<string, unknown>)?.id as string | undefined;\n }\n if (!resolvedGoalId) return null;\n const endpoint = opts.deep\n ? `/api/goals/${resolvedGoalId}/snapshot`\n : `/api/goals/${resolvedGoalId}`;\n return resolvedApi(\"GET\", endpoint);\n };\n\n const printResult = (data: unknown) => {\n if (opts.json) {\n process.stdout.write(JSON.stringify(data) + \"\\n\");\n } else {\n const g = opts.deep\n ? ((data as Record<string, unknown>).goal ?? data)\n : data;\n printGoal(g as Parameters<typeof printGoal>[0]);\n if (opts.deep) {\n const snap = data as Record<string, unknown>;\n const pending = snap.pending as Record<string, unknown[]> | undefined;\n const activeRuns = snap.activeRuns as unknown[] | undefined;\n if (activeRuns?.length) {\n console.log(pc.dim(`\\n\u6D3B\u8DC3 runs: ${activeRuns.length} \u4E2A`));\n }\n const pendingCount = (pending?.questions?.length ?? 0)\n + (pending?.assumptions?.length ?? 0)\n + (pending?.degradations?.length ?? 0)\n + (pending?.manualUnlocks?.length ?? 0);\n if (pendingCount > 0) {\n console.log(pc.yellow(`\u5F85\u5904\u7406\u9879: ${pendingCount} \u4E2A`));\n }\n }\n }\n };\n\n const terminalStatuses = new Set([\"completed\", \"aborted\", \"failed\"]);\n\n if (opts.watch) {\n const intervalMs = Math.max(1, Number(opts.interval) || 5) * 1000;\n while (true) {\n const data = await fetchSnapshot();\n if (data) {\n printResult(data);\n const status = opts.deep\n ? ((data as Record<string, unknown>).goal as Record<string, unknown>)?.status\n : (data as Record<string, unknown>).status;\n if (terminalStatuses.has(status as string)) break;\n }\n await sleep(intervalMs);\n }\n } else {\n const data = await fetchSnapshot();\n if (!data || (Array.isArray(data) && data.length === 0)) {\n if (!opts.json) console.log(\"\u5F53\u524D\u6CA1\u6709\u6D3B\u8DC3\u76EE\u6807\");\n else process.stdout.write(JSON.stringify(null) + \"\\n\");\n return;\n }\n printResult(data);\n }\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u83B7\u53D6\u72B6\u6001\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"pause\")\n .description(\"\u6682\u505C\u5F53\u524D\u76EE\u6807\u5FAA\u73AF\")\n .action(async () => {\n try {\n await ensureCloudLogin();\n const current = await api(\"GET\", \"/api/goals/current\");\n const id = extractCurrentGoalId(current);\n if (!id) {\n console.log(\"\u6CA1\u6709\u53EF\u6682\u505C\u7684\u6D3B\u8DC3\u76EE\u6807\");\n return;\n }\n await api(\"POST\", `/api/goals/${id}/pause`);\n console.log(pc.yellow(\"\u76EE\u6807\u5DF2\u6682\u505C\"));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u6682\u505C\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"resume\")\n .description(\"\u6062\u590D\u5DF2\u6682\u505C\u7684\u76EE\u6807\u5FAA\u73AF\")\n .action(async () => {\n try {\n await ensureCloudLogin();\n const current = await api(\"GET\", \"/api/goals/current\");\n const id = extractCurrentGoalId(current);\n if (!id) {\n console.log(\"\u6CA1\u6709\u53EF\u6062\u590D\u7684\u76EE\u6807\");\n return;\n }\n await api(\"POST\", `/api/goals/${id}/resume`);\n console.log(pc.green(\"\u76EE\u6807\u5DF2\u6062\u590D\"));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u6062\u590D\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"abort\")\n .description(\"\u7EC8\u6B62\u5F53\u524D\u76EE\u6807\")\n .action(async () => {\n try {\n await ensureCloudLogin();\n const current = await api(\"GET\", \"/api/goals/current\");\n const id = extractCurrentGoalId(current);\n if (!id) {\n console.log(\"\u6CA1\u6709\u53EF\u7EC8\u6B62\u7684\u76EE\u6807\");\n return;\n }\n await api(\"POST\", `/api/goals/${id}/abort`);\n console.log(pc.red(\"\u76EE\u6807\u5DF2\u7EC8\u6B62\"));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u7EC8\u6B62\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"log\")\n .description(\"\u67E5\u770B\u5FAA\u73AF\u5386\u53F2\")\n .option(\"-n, --limit <count>\", \"\u663E\u793A\u6761\u6570\", \"20\")\n .action(async (opts: { limit?: string }) => {\n try {\n await ensureCloudLogin();\n const current = await api(\"GET\", \"/api/goals/current\");\n const id = extractCurrentGoalId(current);\n if (!id) {\n console.log(\"\u6CA1\u6709\u6D3B\u8DC3\u76EE\u6807\");\n return;\n }\n const limit = parseLogLimit(opts.limit);\n const cycles = await api(\"GET\", `/api/goals/${id}/cycles?limit=${limit}`);\n const list = Array.isArray(cycles)\n ? cycles\n : (cycles as { cycles?: unknown[] })?.cycles || [];\n if (list.length === 0) {\n console.log(\"\u6682\u65E0\u5FAA\u73AF\u8BB0\u5F55\");\n return;\n }\n for (const c of list as Array<{\n createdAt?: string;\n cycle?: number;\n number?: number;\n summary?: string;\n status?: string;\n }>) {\n const ts = c.createdAt ? new Date(c.createdAt).toLocaleString() : \"-\";\n console.log(\n `${pc.dim(ts)} [\u5FAA\u73AF ${c.cycle ?? c.number ?? \"-\"}] ${c.summary || c.status || \"-\"}`,\n );\n }\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u83B7\u53D6\u65E5\u5FD7\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"setup\")\n .description(\"\u9996\u6B21\u914D\u7F6E (API key + \u6A21\u578B)\")\n .action(async () => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const ask = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));\n\n console.log(pc.bold(\"Soloco \u9996\u6B21\u914D\u7F6E\"));\n console.log();\n\n const apiKey = await ask(\"\u8BF7\u8F93\u5165 QWEN_API_KEY: \");\n const model = (await ask(\"\u6A21\u578B\u540D\u79F0 (\u9ED8\u8BA4 qwen-plus): \")) || \"qwen-plus\";\n\n rl.close();\n\n const envPath = path.resolve(process.cwd(), \".env\");\n const lines: string[] = [];\n if (fs.existsSync(envPath)) {\n const existing = fs.readFileSync(envPath, \"utf-8\");\n for (const line of existing.split(\"\\n\")) {\n if (line.startsWith(\"QWEN_API_KEY=\") || line.startsWith(\"SOLOCO_MODEL=\")) {\n continue;\n }\n lines.push(line);\n }\n }\n lines.push(`QWEN_API_KEY=${apiKey}`);\n lines.push(`SOLOCO_MODEL=${model}`);\n fs.writeFileSync(envPath, lines.filter((l) => l.trim() !== \"\").join(\"\\n\") + \"\\n\");\n console.log(pc.green(`\u5DF2\u5199\u5165 ${envPath}`));\n\n console.log();\n console.log(\"\u6D4B\u8BD5 API \u8FDE\u901A\u6027...\");\n try {\n await fetch(`${apiBase}/api/health`, { signal: AbortSignal.timeout(5000) });\n console.log(pc.green(\"\u670D\u52A1\u5668\u8FDE\u63A5\u6B63\u5E38\"));\n } catch {\n console.log(pc.yellow(`\u65E0\u6CD5\u8FDE\u63A5 ${apiBase} (\u670D\u52A1\u5668\u53EF\u80FD\u672A\u542F\u52A8\uFF0C\u7A0D\u540E\u518D\u8BD5)`));\n }\n });\n\n program\n .command(\"update\")\n .description(\"\u66F4\u65B0\u76EE\u6807\u7684\u63CF\u8FF0 (Description) \u548C\u6807\u9898 (Title) (Agent Native \u53CB\u597D)\")\n .option(\"-i, --id <goal-id>\", \"\u76EE\u6807 ID (\u4E0D\u4F20\u5219\u9ED8\u8BA4\u5F53\u524D\u6D3B\u8DC3\u76EE\u6807)\")\n .option(\"-t, --title <title>\", \"\u65B0\u7684\u76EE\u6807\u6807\u9898\")\n .requiredOption(\"-d, --description <description>\", \"\u65B0\u7684\u76EE\u6807\u63CF\u8FF0\")\n .action(async (opts: { id?: string; title?: string; description: string }) => {\n try {\n await ensureCloudLogin();\n let goalId = opts.id;\n if (!goalId) {\n const current = await api(\"GET\", \"/api/goals/current\");\n goalId = extractCurrentGoalId(current);\n if (!goalId) {\n console.error(pc.red(\"\u9519\u8BEF: \u6CA1\u6709\u627E\u5230\u6D3B\u8DC3\u76EE\u6807\uFF0C\u8BF7\u663E\u5F0F\u63D0\u4F9B --id <goal-id>\"));\n process.exit(1);\n }\n }\n\n const body: Record<string, string> = { description: opts.description };\n if (opts.title) {\n body.title = opts.title;\n }\n\n await api(\"PATCH\", `/api/goals/${goalId}`, body);\n console.log(pc.green(`\u76EE\u6807 ${goalId} \u66F4\u65B0\u6210\u529F!`));\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u66F4\u65B0\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"steer\")\n .description(\"\u5411\u8FD0\u884C\u4E2D\u7684\u76EE\u6807\u53D1\u9001\u63D2\u961F/\u8F6C\u5411\u6307\u4EE4\u5E76\u9009\u62E9\u6027\u5F3A\u5236\u7EC8\u6B62\u5F53\u524D\u4EFB\u52A1 (Agent Native \u53CB\u597D)\")\n .option(\"-i, --id <goal-id>\", \"\u76EE\u6807 ID (\u4E0D\u4F20\u5219\u9ED8\u8BA4\u5F53\u524D\u6D3B\u8DC3\u76EE\u6807)\")\n .requiredOption(\"-c, --content <content>\", \"\u63D2\u961F/\u8F6C\u5411\u7684\u5177\u4F53\u6307\u4EE4\u5185\u5BB9\")\n .option(\"-f, --force-kill\", \"\u662F\u5426\u7ACB\u5373\u5F3A\u5236\u7EC8\u6B62\u5F53\u524D\u6B63\u5728\u8FD0\u884C\u7684\u5B50\u4EFB\u52A1 (SIGTERM)\")\n .action(async (opts: { id?: string; content: string; forceKill?: boolean }) => {\n try {\n await ensureCloudLogin();\n let goalId = opts.id;\n if (!goalId) {\n const current = await api(\"GET\", \"/api/goals/current\");\n goalId = extractCurrentGoalId(current);\n if (!goalId) {\n console.error(pc.red(\"\u9519\u8BEF: \u6CA1\u6709\u627E\u5230\u6D3B\u8DC3\u76EE\u6807\uFF0C\u8BF7\u663E\u5F0F\u63D0\u4F9B --id <goal-id>\"));\n process.exit(1);\n }\n }\n\n const body: Record<string, unknown> = { content: opts.content };\n if (opts.forceKill) {\n body.forceKill = true;\n }\n\n const res = await api<{ ok: boolean; messageId: string; forceKill: unknown }>(\n \"POST\",\n `/api/goals/${goalId}/steer`,\n body\n );\n\n console.log(pc.green(`\u63D2\u961F/\u8F6C\u5411\u6307\u4EE4\u53D1\u9001\u6210\u529F! Message ID: ${res.messageId}`));\n if (opts.forceKill) {\n console.log(pc.yellow(\"\u5DF2\u89E6\u53D1\u5F3A\u5236\u7EC8\u6B62\u5F53\u524D\u5B50\u4EFB\u52A1\u3002\"));\n }\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u53D1\u9001\u63D2\u961F\u6307\u4EE4\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"monitor\")\n .description(\"\u542F\u52A8\u5F00\u53D1\u8005 Dev Insider \u5B9E\u65F6\u76D1\u63A7\u63A7\u5236\u53F0 (\u652F\u6301 URL/ID \u8BC6\u522B\u4E0E\u952E\u76D8\u5FEB\u6377\u952E\u4EA4\u4E92)\")\n .argument(\"[goal-id-or-url]\", \"\u76EE\u6807 ID \u6216 Dashboard URL (\u4E0D\u4F20\u5219\u9ED8\u8BA4\u5F53\u524D\u6D3B\u8DC3\u76EE\u6807)\")\n .action(async (goalIdOrUrl?: string) => {\n try {\n await ensureCloudLogin();\n let goalId = goalIdOrUrl;\n if (!goalId) {\n const current = await api(\"GET\", \"/api/goals/current\");\n goalId = extractCurrentGoalId(current);\n if (!goalId) {\n console.error(pc.red(\"\u9519\u8BEF: \u6CA1\u6709\u627E\u5230\u6D3B\u8DC3\u76EE\u6807\uFF0C\u8BF7\u63D0\u4F9B\u76EE\u6807 ID \u6216 URL\"));\n process.exit(1);\n }\n } else if (goalId.startsWith(\"http://\") || goalId.startsWith(\"https://\")) {\n try {\n const url = new URL(goalId);\n const idParam = url.searchParams.get(\"id\");\n if (idParam) {\n goalId = idParam;\n } else {\n // Try to extract uuid from path if present\n const match = url.pathname.match(/\\/goals?\\/([a-f0-9-]{36})/i);\n if (match) {\n goalId = match[1];\n }\n }\n } catch {\n // fallback to using it as is\n }\n }\n\n await monitorGoal(goalId, api, apiBase, sleep);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\u76D1\u63A7\u542F\u52A8\u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"tail\")\n .description(\"\u5B9E\u65F6\u6D41\u5F0F\u8F93\u51FA\u76EE\u6807 subprocess run \u7684 stdout/stderr (NDJSON \u5230 stdout)\")\n .argument(\"[goal-id-or-url]\", \"\u76EE\u6807 ID \u6216 Dashboard URL (\u4E0D\u4F20\u5219\u9ED8\u8BA4\u5F53\u524D\u6D3B\u8DC3\u76EE\u6807)\")\n .option(\"--url <url>\", \"Dashboard URL (\u540C\u4F4D\u7F6E\u53C2\u6570)\")\n .action(async (\n goalIdOrUrl: string | undefined,\n opts: { url?: string },\n ) => {\n try {\n await ensureCloudLogin();\n\n let resolvedGoalId: string | undefined;\n let resolvedApiBase = apiBase;\n\n const rawUrl = opts.url ?? goalIdOrUrl;\n if (rawUrl && (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\"))) {\n try {\n const parsed = new URL(rawUrl);\n resolvedApiBase = `${parsed.protocol}//${parsed.host}`;\n const idParam = parsed.searchParams.get(\"id\");\n if (idParam) {\n resolvedGoalId = idParam;\n } else {\n const m = parsed.pathname.match(/\\/goals?\\/([a-f0-9-]{36})/i);\n if (m) resolvedGoalId = m[1];\n }\n } catch { /* fallback */ }\n } else if (rawUrl) {\n resolvedGoalId = rawUrl;\n }\n\n const resolvedApi = resolvedApiBase !== apiBase\n ? createApiClient(resolvedApiBase)\n : api;\n\n if (!resolvedGoalId) {\n const current = await resolvedApi(\"GET\", \"/api/goals/current\");\n const g = Array.isArray(current) ? current[0] : current;\n resolvedGoalId = (g as Record<string, unknown>)?.id as string | undefined;\n }\n if (!resolvedGoalId) {\n console.error(pc.red(\"\u9519\u8BEF: \u6CA1\u6709\u627E\u5230\u6D3B\u8DC3\u76EE\u6807\uFF0C\u8BF7\u63D0\u4F9B\u76EE\u6807 ID \u6216 URL\"));\n process.exit(1);\n }\n\n // Find the latest active run\n const runsData = await resolvedApi<{ runs: Array<Record<string, unknown>> }>(\n \"GET\",\n `/api/goals/${resolvedGoalId}/runs`,\n );\n const runs = runsData?.runs ?? [];\n const active = runs.find((r) => r.status === \"running\" || r.status === \"spawning\");\n const target = active ?? runs[0];\n if (!target) {\n console.error(pc.yellow(\"\u6CA1\u6709\u627E\u5230 subprocess run\"));\n process.exit(1);\n }\n const runId = target.id as string;\n\n // Connect via WebSocket\n const wsBase = resolvedApiBase.replace(/^http/, \"ws\");\n const wsUrl = `${wsBase}/api/goals/${resolvedGoalId}/runs/${runId}/logs/ws`;\n process.stderr.write(pc.dim(`\u8FDE\u63A5 ${wsUrl}\\n`));\n\n const ws = new WebSocket(wsUrl);\n ws.onmessage = (event) => {\n process.stdout.write(String(event.data));\n if (!String(event.data).endsWith(\"\\n\")) process.stdout.write(\"\\n\");\n };\n ws.onerror = (err) => {\n process.stderr.write(pc.red(`WS \u9519\u8BEF: ${(err as ErrorEvent).message ?? err}\\n`));\n };\n ws.onclose = () => {\n process.stderr.write(pc.dim(\"\u8FDE\u63A5\u5DF2\u5173\u95ED\\n\"));\n process.exit(0);\n };\n\n // Keep process alive until ws closes\n await new Promise<void>((resolve) => { ws.onclose = () => resolve(); });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`tail \u5931\u8D25: ${message}`));\n process.exit(1);\n }\n });\n\n program\n .command(\"usage\")\n .description(\"\u67E5\u770B AI \u7528\u91CF\u62A5\u544A (\u6309\u65E5/\u5468/\u6708, \u652F\u6301\u6309 model/agent/goal \u5206\u7EC4)\")\n .argument(\"[period]\", \"\u7EDF\u8BA1\u7C92\u5EA6: daily | weekly | monthly (\u9ED8\u8BA4 daily)\", \"daily\")\n .option(\"--since <date>\", \"\u5F00\u59CB\u65E5\u671F (YYYY-MM-DD)\")\n .option(\"--until <date>\", \"\u7ED3\u675F\u65E5\u671F (YYYY-MM-DD)\")\n .option(\"--by-model\", \"\u6309\u6A21\u578B\u7EC6\u5206\")\n .option(\"--by-agent\", \"\u6309 agent \u7EC6\u5206\")\n .option(\"--by-goal\", \"\u6309\u76EE\u6807\u7EC6\u5206\")\n .option(\"--json\", \"\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\")\n .action(async (\n period: string,\n opts: { since?: string; until?: string; byModel?: boolean; byAgent?: boolean; byGoal?: boolean; json?: boolean },\n ) => {\n if (!['daily', 'weekly', 'monthly'].includes(period)) {\n console.error(pc.red(`\u9519\u8BEF: \u7C92\u5EA6\u5FC5\u987B\u662F daily\u3001weekly \u6216 monthly\uFF0C\u6536\u5230: ${period}`));\n process.exit(1);\n }\n\n // Resolve companyId \u2014 fetch from API\n let companyId: string;\n try {\n await ensureCloudLogin();\n const companies = await api<Array<{ id: string }>>('GET', '/api/companies');\n const first = Array.isArray(companies) ? companies[0] : null;\n if (!first?.id) throw new Error('No company found');\n companyId = first.id;\n } catch (e: unknown) {\n console.error(pc.red(`\u83B7\u53D6\u516C\u53F8\u4FE1\u606F\u5931\u8D25: ${e instanceof Error ? e.message : String(e)}`));\n process.exit(1);\n }\n\n const breakdown = opts.byModel ? 'model' : opts.byAgent ? 'agent' : opts.byGoal ? 'goal' : undefined;\n\n const qs = new URLSearchParams({ granularity: period });\n if (opts.since) qs.set('from', opts.since);\n if (opts.until) qs.set('to', opts.until);\n if (breakdown) qs.set('breakdown', breakdown);\n\n let rows: Array<{\n period: string;\n granularity: string;\n totalCostCents: number;\n inputTokens: number;\n outputTokens: number;\n breakdown?: Array<{ key: string; kind: string; costCents: number; inputTokens: number; outputTokens: number }>;\n }>;\n\n try {\n rows = await api(`GET`, `/api/companies/${companyId}/costs/by-period?${qs}`);\n } catch (e: unknown) {\n console.error(pc.red(`\u83B7\u53D6\u7528\u91CF\u6570\u636E\u5931\u8D25: ${e instanceof Error ? e.message : String(e)}`));\n process.exit(1);\n }\n\n if (opts.json) {\n process.stdout.write(JSON.stringify(rows, null, 2) + '\\n');\n return;\n }\n\n if (!rows.length) {\n console.log(pc.dim('\u6CA1\u6709\u627E\u5230\u7528\u91CF\u6570\u636E'));\n return;\n }\n\n const granularityLabel: Record<string, string> = {\n daily: '\u65E5\u62A5', weekly: '\u5468\u62A5', monthly: '\u6708\u62A5',\n };\n\n console.log();\n console.log(pc.bold(` Soloco AI \u7528\u91CF\u62A5\u544A \u2014 ${granularityLabel[period] ?? period}`));\n console.log();\n\n const fmtCents = (c: number) => `$${(c / 100).toFixed(2)}`;\n const fmtTokens = (t: number) =>\n t >= 1_000_000 ? `${(t / 1_000_000).toFixed(1)}M` : t >= 1_000 ? `${(t / 1_000).toFixed(0)}K` : String(t);\n\n // Column widths\n const COL = { period: 12, input: 9, output: 9, cost: 9 };\n const header = [\n 'Period'.padEnd(COL.period),\n 'Input'.padStart(COL.input),\n 'Output'.padStart(COL.output),\n 'Cost'.padStart(COL.cost),\n ].join(' ');\n\n const divider = '\u2500'.repeat(header.length);\n console.log(pc.dim(divider));\n console.log(pc.bold(header));\n console.log(pc.dim(divider));\n\n let totalCostCents = 0;\n let totalInput = 0;\n let totalOutput = 0;\n\n for (const row of rows) {\n totalCostCents += row.totalCostCents;\n totalInput += row.inputTokens;\n totalOutput += row.outputTokens;\n\n const line = [\n row.period.padEnd(COL.period),\n fmtTokens(row.inputTokens).padStart(COL.input),\n fmtTokens(row.outputTokens).padStart(COL.output),\n pc.green(fmtCents(row.totalCostCents)).padStart(COL.cost),\n ].join(' ');\n console.log(line);\n\n if (row.breakdown?.length) {\n for (const b of row.breakdown.sort((a, z) => z.costCents - a.costCents)) {\n const label = ` ${pc.dim('\u2514')} ${b.key.length > 30 ? b.key.slice(0, 27) + '...' : b.key}`;\n const bLine = [\n label.padEnd(COL.period + 14), // account for color escapes\n fmtTokens(b.inputTokens).padStart(COL.input),\n fmtTokens(b.outputTokens).padStart(COL.output),\n pc.dim(fmtCents(b.costCents)).padStart(COL.cost),\n ].join(' ');\n console.log(bLine);\n }\n }\n }\n\n console.log(pc.dim(divider));\n const totLine = [\n pc.bold('Total').padEnd(COL.period),\n pc.bold(fmtTokens(totalInput)).padStart(COL.input),\n pc.bold(fmtTokens(totalOutput)).padStart(COL.output),\n pc.bold(pc.green(fmtCents(totalCostCents))).padStart(COL.cost),\n ].join(' ');\n console.log(totLine);\n console.log(pc.dim(divider));\n console.log();\n });\n\n // ---------------------------------------------------------------------------\n // worktree \u9694\u79BB\u547D\u4EE4\n // ---------------------------------------------------------------------------\n\n program\n .command(\"worktree:make <name>\")\n .description(\"\u65B0\u5EFA\u9694\u79BB worktree\uFF08git worktree add + \u72EC\u7ACB\u5B9E\u4F8B\u76EE\u5F55 + \u7A7A\u95F2\u7AEF\u53E3 + \u6700\u5C0F seed\uFF09\")\n .action(async (name: string) => {\n const slug = slugifyInstanceId(name);\n if (!slug) {\n console.error(pc.red(\"\u274C name \u53EA\u80FD\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u8FDE\u5B57\u7B26\u3001\u4E0B\u5212\u7EBF\"));\n process.exit(1);\n }\n if (slug === \"default\") {\n console.error(pc.red(\"\u274C 'default' \u662F\u4E3B\u5B9E\u4F8B\u4FDD\u7559\u540D\uFF0C\u8BF7\u6362\u4E00\u4E2A\u540D\u5B57\"));\n process.exit(1);\n }\n\n // \u786E\u8BA4\u5728\u4E3B\u4ED3\u5E93\uFF08.git \u662F\u76EE\u5F55\uFF0C\u4E0D\u662F\u6587\u4EF6\uFF09\n const cwd = process.cwd();\n let gitStat: fs.Stats | null = null;\n try { gitStat = fs.statSync(path.join(cwd, \".git\")); } catch { /* not a git dir */ }\n if (!gitStat || !gitStat.isDirectory()) {\n console.error(pc.red(\"\u274C \u8BF7\u5728\u4E3B\u4ED3\u5E93\u6839\u76EE\u5F55\uFF08.git \u662F\u76EE\u5F55\uFF09\u6267\u884C worktree:make\"));\n console.error(pc.dim(\" \u5F53\u524D\u76EE\u5F55\uFF1A\" + cwd));\n process.exit(1);\n }\n\n const worktreePath = path.resolve(cwd, \"..\", `soloco-${slug}`);\n if (fs.existsSync(worktreePath)) {\n console.error(pc.red(`\u274C \u76EE\u6807\u76EE\u5F55\u5DF2\u5B58\u5728\uFF1A${worktreePath}`));\n process.exit(1);\n }\n\n // \u627E\u7A7A\u95F2\u7AEF\u53E3\n let serverPort: number;\n let pgPort: number;\n try {\n serverPort = await findFreePort(3101);\n pgPort = await findFreePort(54331);\n } catch (e) {\n console.error(pc.red(\"\u274C \u627E\u4E0D\u5230\u7A7A\u95F2\u7AEF\u53E3\uFF1A\" + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n\n // git worktree add\n const { execSync } = await import(\"node:child_process\");\n console.log(pc.dim(`\u6B63\u5728\u521B\u5EFA worktree\uFF1A${worktreePath}`));\n try {\n // \u5148\u5C1D\u8BD5\u65B0\u5EFA\u5206\u652F\uFF0C\u5931\u8D25\u5219\u590D\u7528\u5DF2\u6709\u5206\u652F\n try {\n execSync(`git worktree add \"${worktreePath}\" -b \"${slug}\"`, { cwd, stdio: \"pipe\" });\n } catch {\n execSync(`git worktree add \"${worktreePath}\" \"${slug}\"`, { cwd, stdio: \"pipe\" });\n }\n } catch (e) {\n console.error(pc.red(\"\u274C git worktree add \u5931\u8D25\uFF1A\" + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n\n // \u5199\u5165\u9694\u79BB\u914D\u7F6E\n try {\n writeWorktreeIsolation(worktreePath, slug, serverPort, pgPort);\n } catch (e) {\n console.error(pc.red(\"\u274C \u5199\u5165 .soloco \u914D\u7F6E\u5931\u8D25\uFF1A\" + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n\n console.log(pc.green(\"\u2713 worktree \u5DF2\u521B\u5EFA\u5E76\u5B8C\u6210\u9694\u79BB\u521D\u59CB\u5316\"));\n console.log(\"\");\n console.log(pc.bold(\" \u8DEF\u5F84\uFF1A\") + worktreePath);\n console.log(pc.bold(\" \u5B9E\u4F8B\uFF1A\") + pc.cyan(slug));\n console.log(pc.bold(\" \u7AEF\u53E3\uFF1A\") + serverPort + pc.dim(\" (PG: \" + pgPort + \")\"));\n console.log(\"\");\n console.log(\" \u4E0B\u4E00\u6B65\uFF1A\");\n console.log(pc.dim(` cd ${worktreePath}`));\n console.log(pc.dim(\" pnpm dev\"));\n });\n\n program\n .command(\"worktree init\")\n .description(\"\u5728\u5F53\u524D worktree \u76EE\u5F55\u521D\u59CB\u5316\u9694\u79BB\u5B9E\u4F8B\uFF08.soloco/.env + \u72EC\u7ACB\u6570\u636E\u76EE\u5F55\uFF09\")\n .action(async () => {\n const cwd = process.cwd();\n\n // \u5DF2\u521D\u59CB\u5316\u5219\u76F4\u63A5\u63D0\u793A\n if (fs.existsSync(path.join(cwd, \".soloco\", \".env\"))) {\n console.log(pc.yellow(\"\u2139 \u5F53\u524D\u76EE\u5F55\u5DF2\u521D\u59CB\u5316\uFF08.soloco/.env \u5B58\u5728\uFF09\"));\n console.log(pc.dim(\" SOLOCO_INSTANCE_ID: \" + (readEnvKey(path.join(cwd, \".soloco\", \".env\"), \"SOLOCO_INSTANCE_ID\") ?? \"(\u672A\u77E5)\")));\n return;\n }\n\n // \u4ECE\u76EE\u5F55\u540D\u63A8\u5BFC\u5B9E\u4F8B ID\n const dirName = path.basename(cwd);\n const instanceId = slugifyInstanceId(dirName);\n if (!instanceId) {\n console.error(pc.red(\"\u274C \u65E0\u6CD5\u4ECE\u76EE\u5F55\u540D '\" + dirName + \"' \u63A8\u5BFC\u5408\u6CD5\u7684\u5B9E\u4F8B ID\uFF08\u4EC5\u5141\u8BB8\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u8FDE\u5B57\u7B26\u3001\u4E0B\u5212\u7EBF\uFF09\"));\n console.error(pc.dim(\" \u8BF7\u624B\u52A8\u4F20\u5165 SOLOCO_INSTANCE_ID \u6216\u91CD\u547D\u540D\u76EE\u5F55\u540E\u91CD\u8BD5\"));\n process.exit(1);\n }\n if (instanceId === \"default\") {\n console.error(pc.red(\"\u274C \u76EE\u5F55\u540D\u6620\u5C04\u5230 'default'\uFF0C\u4E0E\u4E3B\u5B9E\u4F8B\u51B2\u7A81\uFF0C\u8BF7\u91CD\u547D\u540D\u76EE\u5F55\u540E\u91CD\u8BD5\"));\n process.exit(1);\n }\n\n // \u627E\u7A7A\u95F2\u7AEF\u53E3\n let serverPort: number;\n let pgPort: number;\n try {\n serverPort = await findFreePort(3101);\n pgPort = await findFreePort(54331);\n } catch (e) {\n console.error(pc.red(\"\u274C \u627E\u4E0D\u5230\u7A7A\u95F2\u7AEF\u53E3\uFF1A\" + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n\n try {\n writeWorktreeIsolation(cwd, instanceId, serverPort, pgPort);\n } catch (e) {\n console.error(pc.red(\"\u274C \u5199\u5165 .soloco \u914D\u7F6E\u5931\u8D25\uFF1A\" + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n\n console.log(pc.green(\"\u2713 \u9694\u79BB\u521D\u59CB\u5316\u5B8C\u6210\"));\n console.log(\"\");\n console.log(pc.bold(\" \u5B9E\u4F8B\uFF1A\") + pc.cyan(instanceId));\n console.log(pc.bold(\" \u7AEF\u53E3\uFF1A\") + serverPort + pc.dim(\" (PG: \" + pgPort + \")\"));\n console.log(pc.bold(\" \u6570\u636E\uFF1A\") + path.join(os.homedir(), \".soloco\", \"instances\", instanceId));\n console.log(\"\");\n console.log(\" \u73B0\u5728\u53EF\u4EE5\u8FD0\u884C\uFF1A\");\n console.log(pc.dim(\" pnpm dev\"));\n });\n\n program\n .command(\"usage:backfill\")\n .description(\"\u8865\u586B\u5386\u53F2 subprocess_runs \u7684 cost \u6570\u636E\uFF08\u626B\u63CF\u65E5\u5FD7\u6587\u4EF6\u56DE\u586B costUsdCents\uFF09\")\n .action(async () => {\n // Resolve companyId\n let companyId: string;\n try {\n await ensureCloudLogin();\n const companies = await api<Array<{ id: string }>>('GET', '/api/companies');\n const first = Array.isArray(companies) ? companies[0] : null;\n if (!first?.id) throw new Error('No company found');\n companyId = first.id;\n } catch (e: unknown) {\n console.error(pc.red('\u83B7\u53D6\u516C\u53F8\u4FE1\u606F\u5931\u8D25: ' + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n\n console.log(pc.dim('\u6B63\u5728\u56DE\u586B\u5386\u53F2\u6210\u672C\u6570\u636E...'));\n try {\n const result = await api<{ updated: number; skipped: number; total: number }>(\n 'POST',\n '/api/companies/' + companyId + '/costs/backfill',\n );\n console.log(pc.green('\u56DE\u586B\u5B8C\u6210:') + ' \u66F4\u65B0 ' + pc.bold(String(result.updated)) + ' \u6761\uFF0C\u8DF3\u8FC7 ' + pc.dim(String(result.skipped)) + ' \u6761\uFF08\u5171 ' + result.total + ' \u6761\uFF09');\n } catch (e: unknown) {\n console.error(pc.red('\u56DE\u586B\u5931\u8D25: ' + (e instanceof Error ? e.message : String(e))));\n process.exit(1);\n }\n });\n\n return program;\n}\n\nfunction resolveCliVersion(): string {\n if (process.env.SOLOCO_VERSION) return process.env.SOLOCO_VERSION;\n // Dev fallback (tsx): read from the package.json adjacent to this file\n try {\n const pkgPath = fileURLToPath(new URL(\"../package.json\", import.meta.url));\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf8\")) as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nasync function openBrowser(url: string): Promise<void> {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n}\n\nfunction defaultInstallationName(): string {\n return `Soloco CLI (${os.hostname()})`;\n}\n\nexport function listSubcommandNames(program: Command): string[] {\n return program.commands.map((command) => command.name());\n}\n\n// ---------------------------------------------------------------------------\n// Worktree \u9694\u79BB\u521D\u59CB\u5316\u5DE5\u5177\u51FD\u6570\n// ---------------------------------------------------------------------------\n\nfunction slugifyInstanceId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const srv = net.createServer();\n let done = false;\n srv.once(\"error\", () => {\n if (!done) { done = true; resolve(false); }\n });\n srv.once(\"listening\", () => {\n if (!done) { done = true; srv.close(() => resolve(true)); }\n });\n srv.listen(port, \"127.0.0.1\");\n });\n}\n\nasync function findFreePort(start: number): Promise<number> {\n for (let p = start; p < start + 200; p++) {\n if (await isPortFree(p)) return p;\n }\n throw new Error(`${start}\u2013${start + 199} \u8303\u56F4\u5185\u6CA1\u6709\u7A7A\u95F2\u7AEF\u53E3`);\n}\n\nfunction writeWorktreeIsolation(\n worktreeRoot: string,\n instanceId: string,\n serverPort: number,\n pgPort: number,\n): void {\n const solocoDir = path.join(worktreeRoot, \".soloco\");\n fs.mkdirSync(solocoDir, { recursive: true });\n\n // .env \u2014 \u88AB server/src/config.ts \u7684 dotenv \u52A0\u8F7D\n const envContent = [\n `SOLOCO_INSTANCE_ID=${instanceId}`,\n `PORT=${serverPort}`,\n ].join(\"\\n\") + \"\\n\";\n fs.writeFileSync(path.join(solocoDir, \".env\"), envContent, \"utf-8\");\n\n // config.json \u2014 \u9700\u8981\u901A\u8FC7 solocoConfigSchema \u89E3\u6790\u4EE5\u643A\u5E26 embeddedPostgresPort\n const instanceBase = `~/.soloco/instances/${instanceId}`;\n const config = {\n $meta: { version: 1, updatedAt: new Date().toISOString(), source: \"onboard\" },\n database: {\n embeddedPostgresDataDir: `${instanceBase}/db`,\n embeddedPostgresPort: pgPort,\n backup: { dir: `${instanceBase}/data/backups` },\n },\n logging: {\n mode: \"file\",\n logDir: `${instanceBase}/logs`,\n },\n storage: {\n localDisk: { baseDir: `${instanceBase}/data/storage` },\n },\n secrets: {\n localEncrypted: { keyFilePath: `${instanceBase}/secrets/master.key` },\n },\n };\n fs.writeFileSync(path.join(solocoDir, \"config.json\"), JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n\n // \u9884\u5EFA\u5B9E\u4F8B\u76EE\u5F55\uFF08\u9632\u6B62\u9996\u6B21 pnpm dev \u65F6\u6743\u9650\u95EE\u9898\uFF09\n fs.mkdirSync(path.join(os.homedir(), \".soloco\", \"instances\", instanceId), { recursive: true });\n}\n\nfunction readEnvKey(envPath: string, key: string): string | null {\n try {\n const content = fs.readFileSync(envPath, \"utf-8\");\n const m = new RegExp(`^${key}=(.*)$`, \"m\").exec(content);\n return m ? m[1].trim() : null;\n } catch {\n return null;\n }\n}\n", "import { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport const DEFAULT_CLOUD_BASE_URL = \"https://soloco.cloud\";\n\nexport interface StoredAuth {\n version: 1;\n cloudBaseUrl: string;\n userId: string;\n installationId: string;\n accessToken: string;\n accessTokenExpiresAt: string;\n refreshToken: string;\n refreshTokenExpiresAt?: string;\n lastLoginAt: string;\n}\n\nexport interface DeviceAuthStartResponse {\n id: string;\n authUrl: string;\n expiresAt?: string;\n pollIntervalMs?: number;\n}\n\nexport type DeviceAuthPollResponse =\n | { status: \"pending\" | \"expired\" }\n | {\n status: \"authorized\";\n accessToken: string;\n refreshToken: string;\n expiresAt: string;\n refreshExpiresAt?: string;\n userId: string;\n installationId: string;\n };\n\nexport interface DeviceAuthRefreshResponse {\n accessToken: string;\n expiresAt: string;\n userId: string;\n installationId: string;\n // Forward-compat: launch server does not rotate refresh tokens yet, but the\n // hardening PR will. When the server starts returning a rotated refresh token\n // these fields let the client persist it with zero further CLI changes.\n refreshToken?: string;\n refreshExpiresAt?: string;\n}\n\nexport interface CloudAuthClient {\n baseUrl: string;\n start: (installationName?: string) => Promise<DeviceAuthStartResponse>;\n poll: (id: string) => Promise<DeviceAuthPollResponse>;\n refresh: (refreshToken: string) => Promise<DeviceAuthRefreshResponse>;\n}\n\nexport type OpenBrowser = (url: string) => Promise<void>;\nexport type Sleep = (ms: number) => Promise<void>;\n\nexport interface DeviceLoginOptions {\n authPath?: string;\n installationName?: string;\n onStarted?: (started: DeviceAuthStartResponse) => void | Promise<void>;\n openBrowser: OpenBrowser;\n serverUrl?: string;\n sleep?: Sleep;\n}\n\nexport interface EnsureCloudLoginOptions extends DeviceLoginOptions {\n clientFactory?: (serverUrl: string) => CloudAuthClient;\n}\n\nexport function resolveDefaultCloudBaseUrl(env: NodeJS.ProcessEnv = process.env): string {\n return env.SOLOCO_CLOUD_URL?.trim() || DEFAULT_CLOUD_BASE_URL;\n}\n\nexport function resolveAuthFilePath(env: NodeJS.ProcessEnv = process.env): string {\n const home = resolveSolocoHomeDir(env);\n return path.resolve(home, \"auth.json\");\n}\n\nexport async function loadStoredAuth(filePath = resolveAuthFilePath()): Promise<StoredAuth | null> {\n try {\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<StoredAuth>;\n if (!isStoredAuth(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport async function saveStoredAuth(auth: StoredAuth, filePath = resolveAuthFilePath()): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });\n // Write atomically: a crash or concurrent writer mid-write must never leave a\n // truncated auth.json (which would force an avoidable re-login). The temp file\n // lives in the same directory so the rename stays on one filesystem.\n const tempPath = `${filePath}.${process.pid}.tmp`;\n await writeFile(tempPath, `${JSON.stringify(auth, null, 2)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n try {\n await rename(tempPath, filePath);\n } catch (err) {\n // Clean up the orphaned temp file so it doesn't accumulate across retries.\n await rm(tempPath, { force: true });\n throw err;\n }\n}\n\nexport async function clearStoredAuth(filePath = resolveAuthFilePath()): Promise<void> {\n await rm(filePath, { force: true });\n}\n\nexport function normalizeCloudBaseUrl(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) throw new Error(\"Cloud server URL is required\");\n return assertHttpUrl(trimmed).replace(/\\/+$/, \"\");\n}\n\nexport function createCloudAuthClient(rawBaseUrl: string): CloudAuthClient {\n const baseUrl = normalizeCloudBaseUrl(rawBaseUrl);\n return {\n baseUrl,\n start: async (installationName?: string) =>\n requestJson<DeviceAuthStartResponse>(baseUrl, \"/api/soloco/device-auth/start\", {\n method: \"POST\",\n body: { installationName },\n }),\n poll: async (id: string) =>\n requestJson<DeviceAuthPollResponse>(\n baseUrl,\n `/api/soloco/device-auth/poll/${encodeURIComponent(id)}`,\n { method: \"GET\" },\n { mapErrorResponse: mapExpiredPollResponse },\n ),\n refresh: async (refreshToken: string) =>\n requestJson<DeviceAuthRefreshResponse>(baseUrl, \"/api/soloco/device-auth/refresh\", {\n method: \"POST\",\n body: { refreshToken },\n }),\n };\n}\n\nexport async function refreshStoredAccessToken(\n client: Pick<CloudAuthClient, \"refresh\">,\n auth: StoredAuth,\n): Promise<StoredAuth> {\n const refreshed = await client.refresh(auth.refreshToken);\n return {\n ...auth,\n accessToken: refreshed.accessToken,\n accessTokenExpiresAt: refreshed.expiresAt,\n // Persist a rotated refresh token when the server returns one; otherwise keep\n // the existing one (launch server does not rotate). Single-use rotation, once\n // enabled server-side, then works without any further client change.\n // Note: DeviceAuthRefreshResponse uses `refreshExpiresAt` (no \"Token\" infix)\n // while StoredAuth uses `refreshTokenExpiresAt` \u2014 intentional asymmetry since\n // the response DTO mirrors the `expiresAt` / `refreshExpiresAt` pair from the\n // server contract, whereas StoredAuth disambiguates access vs refresh locally.\n refreshToken: refreshed.refreshToken ?? auth.refreshToken,\n refreshTokenExpiresAt: refreshed.refreshExpiresAt ?? auth.refreshTokenExpiresAt,\n userId: refreshed.userId,\n installationId: refreshed.installationId,\n };\n}\n\nexport async function ensureCloudLogin(options: EnsureCloudLoginOptions): Promise<StoredAuth> {\n const auth = await loadStoredAuth(options.authPath);\n if (!auth) return runDeviceLogin(options);\n if (isAccessTokenFresh(auth.accessToken)) return auth;\n\n try {\n const client = (options.clientFactory ?? createCloudAuthClient)(auth.cloudBaseUrl);\n const refreshed = await refreshStoredAccessToken(client, auth);\n await saveStoredAuth(refreshed, options.authPath);\n return refreshed;\n } catch {\n return runDeviceLogin({\n ...options,\n serverUrl: auth.cloudBaseUrl || options.serverUrl,\n });\n }\n}\n\nexport async function runDeviceLogin(options: DeviceLoginOptions): Promise<StoredAuth> {\n const serverUrl = options.serverUrl ?? resolveDefaultCloudBaseUrl();\n const client = createCloudAuthClient(serverUrl);\n const started = await client.start(options.installationName ?? defaultInstallationName());\n await options.onStarted?.(started);\n await options.openBrowser(assertHttpUrl(started.authUrl));\n\n const sleep = options.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));\n const intervalMs = Math.max(1000, started.pollIntervalMs ?? 2000);\n const deadline = Date.now() + 10 * 60_000;\n while (Date.now() < deadline) {\n const polled = await client.poll(started.id);\n if (polled.status === \"authorized\") {\n return saveAuthorizedDeviceAuth(client.baseUrl, polled, options.authPath);\n }\n if (polled.status === \"expired\") {\n throw new Error(\"\u767B\u5F55\u6388\u6743\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C soloco login\");\n }\n await sleep(intervalMs);\n }\n throw new Error(\"\u767B\u5F55\u6388\u6743\u8D85\u65F6\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C soloco login\");\n}\n\nexport async function saveAuthorizedDeviceAuth(\n cloudBaseUrl: string,\n polled: Extract<DeviceAuthPollResponse, { status: \"authorized\" }>,\n authPath?: string,\n): Promise<StoredAuth> {\n const auth: StoredAuth = {\n version: 1,\n cloudBaseUrl,\n userId: polled.userId,\n installationId: polled.installationId,\n accessToken: polled.accessToken,\n accessTokenExpiresAt: polled.expiresAt,\n refreshToken: polled.refreshToken,\n refreshTokenExpiresAt: polled.refreshExpiresAt,\n lastLoginAt: new Date().toISOString(),\n };\n await saveStoredAuth(auth, authPath);\n return auth;\n}\n\nexport function isAccessTokenFresh(token: string, now = Date.now(), refreshBufferMs = 60_000): boolean {\n const exp = decodeJwtExp(token);\n if (!exp) return false;\n return exp * 1000 - now > refreshBufferMs;\n}\n\nfunction resolveSolocoHomeDir(env: NodeJS.ProcessEnv): string {\n const raw = env.SOLOCO_HOME?.trim();\n if (!raw) return path.resolve(os.homedir(), \".soloco\");\n if (raw === \"~\") return os.homedir();\n if (raw.startsWith(\"~/\")) return path.resolve(os.homedir(), raw.slice(2));\n return path.resolve(raw);\n}\n\nfunction isStoredAuth(value: Partial<StoredAuth>): value is StoredAuth {\n return (\n value.version === 1 &&\n isNonEmptyString(value.cloudBaseUrl) &&\n isNonEmptyString(value.userId) &&\n isNonEmptyString(value.installationId) &&\n isNonEmptyString(value.accessToken) &&\n isNonEmptyString(value.accessTokenExpiresAt) &&\n isNonEmptyString(value.refreshToken) &&\n isNonEmptyString(value.lastLoginAt)\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nasync function requestJson<T>(\n baseUrl: string,\n endpoint: string,\n opts: { method: string; body?: Record<string, unknown> },\n behavior: {\n mapErrorResponse?: (response: Response) => Promise<T | null>;\n } = {},\n): Promise<T> {\n const response = await fetch(`${baseUrl}${endpoint}`, {\n method: opts.method,\n headers: { \"Content-Type\": \"application/json\" },\n body: opts.body ? JSON.stringify(stripUndefined(opts.body)) : undefined,\n });\n if (!response.ok) {\n const mapped = await behavior.mapErrorResponse?.(response);\n if (mapped) return mapped;\n const text = await response.text().catch(() => \"\");\n throw new Error(`Cloud auth ${opts.method} ${endpoint} failed (${response.status}): ${text}`);\n }\n return response.json() as Promise<T>;\n}\n\nasync function mapExpiredPollResponse(response: Response): Promise<DeviceAuthPollResponse | null> {\n if (response.status !== 410) return null;\n const payload = await response.json().catch(() => null) as { status?: unknown } | null;\n return payload?.status === \"expired\" ? { status: \"expired\" } : null;\n}\n\nfunction stripUndefined(input: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));\n}\n\nfunction decodeJwtExp(token: string): number | null {\n const [, encodedPayload] = token.split(\".\");\n if (!encodedPayload) return null;\n try {\n const payload = JSON.parse(Buffer.from(encodedPayload, \"base64url\").toString(\"utf8\")) as {\n exp?: unknown;\n };\n return typeof payload.exp === \"number\" ? payload.exp : null;\n } catch {\n return null;\n }\n}\n\nfunction defaultInstallationName(): string {\n return `Soloco CLI (${os.hostname()})`;\n}\n\n// Mirrors packages/shared/src/url.ts. Keep this inline so cloud-auth stays a\n// self-contained Node-only contract without a direct @soloco/shared dependency.\nfunction assertHttpUrl(rawUrl: string): string {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n throw new Error(`\u65E0\u6548\u7684\u6388\u6743\u94FE\u63A5\uFF1A${rawUrl}`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(`\u4E0D\u5B89\u5168\u7684\u6388\u6743\u94FE\u63A5\u534F\u8BAE\uFF1A${parsed.protocol}`);\n }\n return rawUrl;\n}\n", "export function createApiClient(apiBase: string) {\n return async function api<T = unknown>(\n method: string,\n endpoint: string,\n body?: unknown,\n ): Promise<T> {\n const url = `${apiBase}${endpoint}`;\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`API ${method} ${endpoint} failed (${res.status}): ${text}`);\n }\n const ct = res.headers.get(\"content-type\") || \"\";\n if (ct.includes(\"application/json\")) return res.json() as Promise<T>;\n return undefined as unknown as T;\n };\n}\n\nexport type ApiClient = ReturnType<typeof createApiClient>;\n", "import pc from \"picocolors\";\nimport {\n DEFAULT_CLOUD_BASE_URL,\n ensureCloudLogin as ensureCloudLoginBase,\n isAccessTokenFresh,\n resolveDefaultCloudBaseUrl,\n runDeviceLogin as runDeviceLoginBase,\n type DeviceAuthStartResponse,\n type DeviceLoginOptions,\n type EnsureCloudLoginOptions,\n type StoredAuth,\n} from \"@soloco/local-runtime/cloud-auth\";\n\nexport {\n DEFAULT_CLOUD_BASE_URL,\n isAccessTokenFresh,\n resolveDefaultCloudBaseUrl,\n};\n\nexport async function ensureCloudLogin(options: EnsureCloudLoginOptions): Promise<StoredAuth> {\n return ensureCloudLoginBase({\n ...options,\n onStarted: printDeviceAuthStart,\n });\n}\n\nexport async function runDeviceLogin(options: DeviceLoginOptions): Promise<StoredAuth> {\n return runDeviceLoginBase({\n ...options,\n onStarted: printDeviceAuthStart,\n });\n}\n\nfunction printDeviceAuthStart(started: DeviceAuthStartResponse): void {\n console.log(pc.bold(\"\u6253\u5F00\u6D4F\u89C8\u5668\u5B8C\u6210 Soloco \u767B\u5F55\u6388\u6743\"));\n console.log(pc.dim(started.authUrl));\n}\n", "const DEFAULT_API_BASE = \"http://localhost:3100\";\n\nexport function resolveApiBase(env: NodeJS.ProcessEnv = process.env): string {\n return env.SOLOCO_API_BASE?.trim() || DEFAULT_API_BASE;\n}\n", "export function joinGoalParts(goalParts: string[]): string {\n return goalParts.join(\" \").trim();\n}\n\nexport function extractCurrentGoalId(current: unknown): string | undefined {\n if (Array.isArray(current)) {\n return (current[0] as { id?: string } | undefined)?.id;\n }\n return (current as { id?: string } | null | undefined)?.id;\n}\n\nexport function parseLogLimit(raw: string | undefined, fallback = 20): number {\n const parsed = Number.parseInt(raw ?? String(fallback), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n", "import pc from \"picocolors\";\nimport { colorStatus } from \"./format.js\";\n\nexport function printGoal(goal: {\n description?: string;\n goal?: string;\n id?: string;\n status?: string;\n progress?: number | null;\n budget?: unknown;\n currentCycle?: number | null;\n}): void {\n console.log(` \u76EE\u6807: ${pc.bold(goal.description || goal.goal || \"-\")}`);\n console.log(` ID: ${goal.id}`);\n console.log(` \u72B6\u6001: ${colorStatus(goal.status || \"-\")}`);\n if (goal.progress != null) console.log(` \u8FDB\u5EA6: ${goal.progress}%`);\n if (goal.budget != null) console.log(` \u9884\u7B97: ${goal.budget}`);\n if (goal.currentCycle != null) console.log(` \u5FAA\u73AF: \u7B2C ${goal.currentCycle} \u8F6E`);\n}\n", "import pc from \"picocolors\";\n\nexport function colorStatus(status: string): string {\n switch (status) {\n case \"running\":\n return pc.green(status);\n case \"paused\":\n return pc.yellow(status);\n case \"completed\":\n return pc.cyan(status);\n case \"aborted\":\n return pc.red(status);\n default:\n return status;\n }\n}\n", "import readline from \"node:readline\";\nimport pc from \"picocolors\";\nimport type { ApiClient } from \"./api.js\";\nimport { colorStatus } from \"./format.js\";\n\ninterface Goal {\n id: string;\n title: string;\n description: string;\n status: string;\n budgetUsd: number;\n spentUsdCents: number;\n currentCycle: number;\n progressPercent: number;\n maxCycles: number;\n conductorModel: string;\n initializationProgress?: {\n state: string;\n currentRound: number;\n maxRounds: number;\n lastIssuesCount?: number;\n lastSummary?: string;\n lastEventAt?: string;\n } | null;\n}\n\ninterface SubprocessRun {\n id: string;\n command: string;\n args: string[];\n status: string;\n pid?: number | null;\n spawnedAt: string;\n startedAt?: string | null;\n endedAt?: string | null;\n costUsdCents: number;\n}\n\nexport async function monitorGoal(\n goalId: string,\n api: ApiClient,\n apiBase: string,\n sleep: (ms: number) => Promise<void>\n): Promise<void> {\n let isRunning = true;\n let isPrompting = false;\n\n // Setup raw mode for keypress listening\n const setupRawMode = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n readline.emitKeypressEvents(process.stdin);\n }\n };\n\n const restoreNormalMode = () => {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n };\n\n setupRawMode();\n\n // Keypress listener\n const onKeypress = async (str: string, key: any) => {\n if (isPrompting) return;\n\n if ((key.ctrl && key.name === \"c\") || key.name === \"q\") {\n isRunning = false;\n restoreNormalMode();\n process.stdin.off(\"keypress\", onKeypress);\n console.clear();\n console.log(pc.green(\"\u2714 \u5DF2\u9000\u51FA\u76D1\u63A7\u6A21\u5F0F\u3002\u76EE\u6807\u5728\u540E\u53F0\u7EE7\u7EED\u8FD0\u884C\u3002\"));\n process.exit(0);\n }\n\n try {\n if (key.name === \"p\") {\n // Pause\n console.log(pc.yellow(\"\\n\u6B63\u5728\u53D1\u9001\u6682\u505C\u8BF7\u6C42...\"));\n await api(\"POST\", `/api/goals/${goalId}/pause`);\n console.log(pc.green(\"\u2714 \u76EE\u6807\u5DF2\u6682\u505C\"));\n await sleep(1000);\n } else if (key.name === \"r\") {\n // Resume\n console.log(pc.green(\"\\n\u6B63\u5728\u53D1\u9001\u6062\u590D\u8BF7\u6C42...\"));\n await api(\"POST\", `/api/goals/${goalId}/resume`);\n console.log(pc.green(\"\u2714 \u76EE\u6807\u5DF2\u6062\u590D\"));\n await sleep(1000);\n } else if (key.name === \"a\") {\n // Abort\n restoreNormalMode();\n isPrompting = true;\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(pc.red(\"\\n\u786E\u5B9A\u8981\u7EC8\u6B62\u8BE5\u76EE\u6807\u5417\uFF1F(y/N): \"), async (answer) => {\n rl.close();\n isPrompting = false;\n setupRawMode();\n if (answer.toLowerCase() === \"y\") {\n console.log(pc.red(\"\u6B63\u5728\u53D1\u9001\u7EC8\u6B62\u8BF7\u6C42...\"));\n await api(\"POST\", `/api/goals/${goalId}/abort`);\n console.log(pc.green(\"\u2714 \u76EE\u6807\u5DF2\u7EC8\u6B62\"));\n await sleep(1000);\n }\n });\n } else if (key.name === \"s\") {\n // Steer\n restoreNormalMode();\n isPrompting = true;\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(pc.cyan(\"\\n\u8BF7\u8F93\u5165\u63D2\u961F/\u8F6C\u5411\u6307\u4EE4\u5185\u5BB9: \"), (content) => {\n if (!content.trim()) {\n rl.close();\n isPrompting = false;\n setupRawMode();\n return;\n }\n rl.question(pc.yellow(\"\u662F\u5426\u7ACB\u5373\u5F3A\u5236\u7EC8\u6B62\u5F53\u524D\u6B63\u5728\u8FD0\u884C\u7684\u5B50\u4EFB\u52A1\uFF1F(y/N): \"), async (forceKillAns) => {\n rl.close();\n isPrompting = false;\n setupRawMode();\n\n const forceKill = forceKillAns.toLowerCase() === \"y\";\n console.log(pc.cyan(\"\u6B63\u5728\u53D1\u9001\u8F6C\u5411\u6307\u4EE4...\"));\n await api(\"POST\", `/api/goals/${goalId}/steer`, {\n content,\n forceKill,\n });\n console.log(pc.green(\"\u2714 \u8F6C\u5411\u6307\u4EE4\u53D1\u9001\u6210\u529F!\"));\n await sleep(1500);\n });\n });\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(pc.red(`\\n\u64CD\u4F5C\u5931\u8D25: ${msg}`));\n await sleep(2000);\n }\n };\n\n process.stdin.on(\"keypress\", onKeypress);\n\n // Main render loop\n while (isRunning) {\n if (isPrompting) {\n await sleep(500);\n continue;\n }\n\n try {\n // 1. Fetch Goal details\n const goal = await api<Goal>(\"GET\", `/api/goals/${goalId}`);\n\n // 2. Fetch Runs\n const runsRes = await api<{ runs: SubprocessRun[] }>(\"GET\", `/api/goals/${goalId}/runs`);\n const runs = runsRes.runs || [];\n const latestRun = runs[0];\n\n // 3. Fetch Logs if there's a latest run\n let stdoutTail = \"\";\n let stderrTail = \"\";\n if (latestRun) {\n try {\n const logs = await api<{ stdoutTail: string; stderrTail: string }>(\n \"GET\",\n `/api/goals/${goalId}/runs/${latestRun.id}/logs/tail?bytes=4096`\n );\n stdoutTail = logs.stdoutTail || \"\";\n stderrTail = logs.stderrTail || \"\";\n } catch {\n // Silent catch if run logs are not ready yet\n }\n }\n\n // Clear screen and draw dashboard\n console.clear();\n drawDashboard(goal, latestRun, stdoutTail, stderrTail);\n } catch (e: unknown) {\n console.clear();\n console.log(pc.red(\"\u26A0\uFE0F \u65E0\u6CD5\u8FDE\u63A5\u5230 Soloco \u63A7\u5236\u9762\u670D\u52A1\u5668\uFF0C\u6B63\u5728\u91CD\u8BD5...\"));\n const msg = e instanceof Error ? e.message : String(e);\n console.log(pc.dim(`\u9519\u8BEF\u8BE6\u60C5: ${msg}`));\n }\n\n await sleep(1500);\n }\n}\n\nfunction drawDashboard(\n goal: Goal,\n latestRun: SubprocessRun | undefined,\n stdoutTail: string,\n stderrTail: string\n) {\n const width = process.stdout.columns || 80;\n const separator = \"\u2500\".repeat(width);\n\n // 1. Header\n console.log(pc.bold(pc.cyan(` Soloco Dev Insider Goal Monitor `).padStart(Math.floor((width + 30) / 2))));\n console.log(pc.dim(separator));\n\n // 2. Goal Info\n const budget = (goal.budgetUsd / 100).toFixed(2);\n const spent = (goal.spentUsdCents / 100).toFixed(2);\n const progressPercent = Math.round(goal.progressPercent || 0);\n const progressBar = drawProgressBar(progressPercent, 20);\n\n console.log(` ${pc.bold(\"\u76EE\u6807\u6807\u9898:\")} ${pc.white(goal.title || goal.description.split(\"\\n\")[0])}`);\n console.log(` ${pc.bold(\"\u76EE\u6807 ID:\")} ${pc.dim(goal.id)}`);\n console.log(\n ` ${pc.bold(\"\u72B6\u6001:\")} ${colorStatus(goal.status)} ${pc.bold(\"\u6A21\u578B:\")} ${pc.magenta(goal.conductorModel || \"-\")}`\n );\n console.log(\n ` ${pc.bold(\"\u5FAA\u73AF:\")} \u7B2C ${pc.yellow(goal.currentCycle)} \u8F6E / \u6700\u591A ${goal.maxCycles} \u8F6E`\n );\n console.log(\n ` ${pc.bold(\"\u9884\u7B97/\u82B1\u8D39:\")} $${pc.green(spent)} / $${pc.red(budget)} USD`\n );\n console.log(` ${pc.bold(\"\u8FDB\u5EA6:\")} ${progressBar} ${pc.cyan(`${progressPercent}%`)}`);\n\n // 3. Initialization Progress (if initializing)\n if (goal.status === \"initializing\" && goal.initializationProgress) {\n const ip = goal.initializationProgress;\n console.log(pc.dim(separator));\n console.log(pc.yellow(` \u2699\uFE0F \u521D\u59CB\u5316\u8FDB\u5EA6: [${ip.state}] \u7B2C ${ip.currentRound}/${ip.maxRounds} \u8F6E\u89C4\u5212\u8BC4\u4F30`));\n if (ip.lastSummary) {\n console.log(` ${pc.dim(\"\u6700\u65B0\u6458\u8981:\")} ${ip.lastSummary}`);\n }\n }\n\n // 4. Active Subprocess Run Info\n console.log(pc.dim(separator));\n if (latestRun) {\n const runDuration = getDuration(latestRun.startedAt, latestRun.endedAt);\n const runCost = (latestRun.costUsdCents / 100).toFixed(4);\n console.log(\n ` ${pc.bold(\"\u6700\u65B0\u5B50\u4EFB\u52A1:\")} ${pc.blue(latestRun.command)} ${pc.dim(latestRun.args.join(\" \"))}`\n );\n console.log(\n ` ${pc.bold(\"\u4EFB\u52A1 ID:\")} ${pc.dim(latestRun.id)}`\n );\n console.log(\n ` ${pc.bold(\"\u4EFB\u52A1\u72B6\u6001:\")} ${colorStatus(latestRun.status)} ${pc.bold(\"\u8017\u65F6:\")} ${runDuration} ${pc.bold(\"\u6210\u672C:\")} $${runCost}`\n );\n\n // 5. Logs Panel\n console.log(pc.dim(separator));\n console.log(` ${pc.bold(\"\uD83D\uDCC4 \u4EFB\u52A1\u6807\u51C6\u8F93\u51FA (Stdout Tail):\")}`);\n if (stdoutTail.trim()) {\n const lines = stdoutTail.split(\"\\n\").slice(-12);\n lines.forEach((line) => {\n console.log(` ${pc.dim(line)}`);\n });\n } else {\n console.log(pc.dim(\" [\u6682\u65E0\u8F93\u51FA\u6216\u6B63\u5728\u542F\u52A8...]\"));\n }\n\n if (stderrTail.trim()) {\n console.log(pc.dim(separator));\n console.log(` ${pc.bold(pc.red(\"\u26A0\uFE0F \u4EFB\u52A1\u9519\u8BEF\u8F93\u51FA (Stderr Tail):\"))}`);\n const lines = stderrTail.split(\"\\n\").slice(-5);\n lines.forEach((line) => {\n console.log(` ${pc.red(line)}`);\n });\n }\n } else {\n console.log(pc.dim(\" \u2139\uFE0F \u5F53\u524D\u6682\u65E0\u5B50\u4EFB\u52A1\u8FD0\u884C\u3002\"));\n }\n\n // 6. Footer / Controls\n console.log(pc.dim(separator));\n console.log(\n ` ${pc.bold(\"\u5FEB\u6377\u952E:\")} [${pc.yellow(\"p\")}] \u6682\u505C [${pc.green(\"r\")}] \u6062\u590D [${pc.red(\"a\")}] \u7EC8\u6B62 [${pc.cyan(\"s\")}] \u8F6C\u5411/\u63D2\u961F\u6307\u4EE4 [${pc.white(\"q\")}] \u9000\u51FA\u76D1\u63A7`\n );\n}\n\nfunction drawProgressBar(percent: number, size: number): string {\n const filledSize = Math.round((percent / 100) * size);\n const emptySize = size - filledSize;\n return pc.green(\"\u2588\".repeat(filledSize)) + pc.dim(\"\u2591\".repeat(emptySize));\n}\n\nfunction getDuration(start: string | null | undefined, end: string | null | undefined): string {\n if (!start) return \"-\";\n const startTime = new Date(start).getTime();\n const endTime = end ? new Date(end).getTime() : Date.now();\n const diffMs = endTime - startTime;\n const secs = Math.floor(diffMs / 1000) % 60;\n const mins = Math.floor(diffMs / 60000);\n return `${mins}m ${secs}s`;\n}\n", "import { createCliProgram } from \"./program.js\";\n\nconst program = createCliProgram();\n\nprogram.parseAsync().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["pc", "os", "path", "readline", "resolve", "ensureCloudLogin", "runDeviceLogin", "pc", "pc", "pc", "pc", "pc", "resolve", "ensureCloudLogin", "openBrowser", "program", "defaultInstallationName", "runDeviceLogin", "pc", "resolve"]
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@soloco/cli",
|
|
3
|
+
"version": "0.3.1-canary.0",
|
|
4
|
+
"description": "Soloco CLI — orchestrate AI agent teams to run a business",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"soloco": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"soloco",
|
|
11
|
+
"ai",
|
|
12
|
+
"agents",
|
|
13
|
+
"orchestration",
|
|
14
|
+
"cli"
|
|
15
|
+
],
|
|
16
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/soloco/soloco.git",
|
|
20
|
+
"directory": "cli"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/soloco/soloco",
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@clack/prompts": "^0.10.0",
|
|
31
|
+
"@soloco/server": "0.3.1-canary.0",
|
|
32
|
+
"commander": "^13.1.0",
|
|
33
|
+
"dotenv": "^17.0.1",
|
|
34
|
+
"drizzle-orm": "0.38.4",
|
|
35
|
+
"embedded-postgres": "^18.1.0-beta.16",
|
|
36
|
+
"picocolors": "^1.1.1",
|
|
37
|
+
"postgres": "^3.4.5",
|
|
38
|
+
"ws": "^8.19.0",
|
|
39
|
+
"zod": "^3.24.2"
|
|
40
|
+
}
|
|
41
|
+
}
|