@struktoai/mirage-cli 0.0.3-alpha.0 → 0.0.3
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/README.md +1 -1
- package/dist/bin/mirage.js +2 -2
- package/dist/bin/mirage.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ await ws.execute('cat /s3/events/2026-05-06.parquet | jq .user')
|
|
|
57
57
|
## About
|
|
58
58
|
|
|
59
59
|
- **One interface instead of N SDKs and M MCPs.** Every service speaks the same filesystem semantics, and pipelines compose across services as naturally as on a local disk.
|
|
60
|
-
- **Around 50 built-in backends:** RAM, Disk, Redis, S3 / R2 / OCI / Supabase / GCS, Gmail / GDrive / GDocs / GSheets / GSlides, GitHub / Linear / Notion / Trello, Slack / Discord /
|
|
60
|
+
- **Around 50 built-in backends:** RAM, Disk, Redis, S3 / R2 / OCI / Supabase / GCS, Gmail / GDrive / GDocs / GSheets / GSlides, GitHub / Linear / Notion / Trello, Slack / Discord / Email, MongoDB / Postgres / LanceDB, SSH, and more, mounted side-by-side under a single root.
|
|
61
61
|
- **Portable workspaces:** clone, snapshot, and version a workspace; agent runs move between machines without restarting or reconfiguring the system.
|
|
62
62
|
- **Embeddable:** the Python and TypeScript SDKs run in-process inside FastAPI, Express, browser apps, or any async runtime; no separate process required.
|
|
63
63
|
- **Agent integrations:** OpenAI Agents SDK, Vercel AI SDK, LangChain, Pydantic AI, CAMEL, and OpenHands via the SDKs; coding agents like Claude Code and Codex via the lightweight CLI + daemon.
|
package/dist/bin/mirage.js
CHANGED
|
@@ -292,7 +292,7 @@ function registerSessionCommands(program) {
|
|
|
292
292
|
// src/workspace.ts
|
|
293
293
|
import { existsSync as existsSync2, readFileSync as readFileSync3 } from "fs";
|
|
294
294
|
import { resolve } from "path";
|
|
295
|
-
import { interpolateEnv,
|
|
295
|
+
import { interpolateEnv, loadWorkspaceConfigFile } from "@struktoai/mirage-server";
|
|
296
296
|
import { parse as yamlParse } from "yaml";
|
|
297
297
|
function buildClient4() {
|
|
298
298
|
return makeClient(loadDaemonSettings());
|
|
@@ -369,7 +369,7 @@ function formatDiff(changes) {
|
|
|
369
369
|
function registerWorkspaceCommands(program) {
|
|
370
370
|
const ws = program.command("workspace").description("Manage workspaces.");
|
|
371
371
|
ws.command("create").description("Create a workspace; daemon auto-spawns if not running.").argument("<config>", "YAML/JSON workspace config").option("--id <id>", "Explicit workspace id").action(async (configPath, opts) => {
|
|
372
|
-
const cfg =
|
|
372
|
+
const cfg = loadWorkspaceConfigFile(configPath);
|
|
373
373
|
const body = { config: cfg };
|
|
374
374
|
if (opts.id !== void 0) body.id = opts.id;
|
|
375
375
|
const c = buildClient4();
|
package/dist/bin/mirage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/main.ts","../../src/daemon.ts","../../src/execute.ts","../../src/job.ts","../../src/provision.ts","../../src/session.ts","../../src/workspace.ts","../../src/bin/mirage.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { Command } from 'commander'\nimport { registerDaemonCommands } from './daemon.ts'\nimport { registerExecuteCommand } from './execute.ts'\nimport { registerJobCommands } from './job.ts'\nimport { registerProvisionCommand } from './provision.ts'\nimport { registerSessionCommands } from './session.ts'\nimport { registerWorkspaceCommands } from './workspace.ts'\n\nfunction resolveVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as {\n name?: string\n version?: string\n }\n if (pkg.name === '@struktoai/mirage-cli' && pkg.version) return pkg.version\n } catch {\n // package.json absent at this level: keep walking up to the package root\n }\n dir = dirname(dir)\n }\n return '0.0.0'\n}\n\nexport function buildProgram(): Command {\n const program = new Command()\n program\n .name('mirage')\n .description('Mirage daemon CLI: manage workspaces and execute commands.')\n .version(resolveVersion())\n registerWorkspaceCommands(program)\n registerSessionCommands(program)\n registerJobCommands(program)\n registerExecuteCommand(program)\n registerProvisionCommand(program)\n registerDaemonCommands(program)\n return program\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, fail, formatAge } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\ninterface DaemonStatus {\n running: boolean\n pid: number | null\n url: string\n uptimeS?: number\n workspaces?: number\n}\n\nfunction formatStatus(d: DaemonStatus): string {\n if (!d.running) return `Daemon not running. URL: ${d.url}`\n const parts: string[] = [`Running. PID ${d.pid !== null ? String(d.pid) : '?'}`]\n if (d.uptimeS !== undefined) {\n parts.push(`uptime ${formatAge(Date.now() / 1000 - d.uptimeS)}`)\n }\n if (d.workspaces !== undefined) {\n parts.push(`${String(d.workspaces)} workspace${d.workspaces === 1 ? '' : 's'}`)\n }\n return parts.join(', ') + `. URL: ${d.url}`\n}\n\nfunction formatStop(d: { via?: string; pid?: number }): string {\n const via = d.via ?? '?'\n return `Stopped (via ${via}${d.pid !== undefined ? `, PID ${String(d.pid)}` : ''}).`\n}\n\nfunction formatRestart(d: { spawnedFresh?: boolean }): string {\n if (d.spawnedFresh === true) return 'Restarted (eager spawn).'\n return 'Restarted; next CLI command will auto-spawn.'\n}\n\nfunction formatKill(d: { killed: boolean; pid?: number | null }): string {\n if (d.killed) return `Killed PID ${String(d.pid ?? '?')}.`\n if (d.pid === null || d.pid === undefined) return 'Daemon not running.'\n return `Already gone (PID ${String(d.pid)}).`\n}\n\nfunction pidFilePath(): string {\n return join(homedir(), '.mirage', 'daemon.pid')\n}\n\nfunction readPid(): number | null {\n const p = pidFilePath()\n if (!existsSync(p)) return null\n const text = readFileSync(p, 'utf-8').trim()\n const pid = Number(text)\n return Number.isFinite(pid) && pid > 0 ? pid : null\n}\n\nfunction processAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === 'ESRCH') return false\n if (code === 'EPERM') return true\n return false\n }\n}\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nasync function waitForUnreachable(timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n while (Date.now() < deadline) {\n const c = buildClient()\n if (!(await c.isReachable(300))) return true\n await new Promise((r) => setTimeout(r, 200))\n }\n return false\n}\n\nexport function registerDaemonCommands(program: Command): void {\n const d = program.command('daemon').description('Manage the daemon process lifecycle.')\n\n d.command('status')\n .description('Show daemon health, PID, uptime, workspace count.')\n .action(async () => {\n const pid = readPid()\n const c = buildClient()\n const url = c.settings.url\n try {\n const r = await c.request('GET', '/v1/health')\n if (r.status !== 200) {\n emit({ running: false, pid, url } as DaemonStatus, formatStatus)\n process.exit(1)\n }\n const body = (await r.json()) as Record<string, unknown>\n emit({ running: true, pid, url, ...body } as DaemonStatus, formatStatus)\n } catch {\n emit({ running: false, pid, url } as DaemonStatus, formatStatus)\n process.exit(1)\n }\n })\n\n d.command('stop')\n .description('Gracefully stop the daemon.')\n .option('--timeout <s>', 'Seconds to wait for graceful exit', '5')\n .action(async (opts: { timeout: string }) => {\n const timeoutMs = Number(opts.timeout) * 1000\n const c = buildClient()\n let r: Response\n try {\n r = await c.request('POST', '/v1/shutdown')\n } catch (err: unknown) {\n fail(`daemon not reachable: ${String(err)}`)\n }\n if (r.status >= 400) fail(`shutdown failed: ${await r.text()}`, 2)\n if (await waitForUnreachable(timeoutMs)) {\n emit({ stopped: true, via: 'graceful' }, formatStop)\n return\n }\n const pid = readPid()\n if (pid !== null && processAlive(pid)) {\n try {\n process.kill(pid, 'SIGTERM')\n emit({ stopped: true, via: 'sigterm', pid }, formatStop)\n return\n } catch {\n // fall through to fail\n }\n }\n fail(`daemon did not exit within ${opts.timeout}s and no live PID found`, 2)\n })\n\n d.command('restart')\n .description('Stop the daemon. Next CLI command auto-spawns a fresh one.')\n .option('--timeout <s>', 'Seconds to wait for graceful exit', '5')\n .option('--eager', 'Spawn a fresh daemon immediately')\n .action(async (opts: { timeout: string; eager?: boolean }) => {\n const timeoutMs = Number(opts.timeout) * 1000\n try {\n await buildClient().request('POST', '/v1/shutdown')\n } catch {\n // already unreachable; fall through to pid cleanup\n }\n if (!(await waitForUnreachable(timeoutMs))) {\n const pid = readPid()\n if (pid !== null && processAlive(pid)) {\n try {\n process.kill(pid, 'SIGTERM')\n } catch {\n // process may have exited between checks\n }\n }\n }\n if (opts.eager === true) {\n await buildClient().ensureRunning({ allowSpawn: true })\n emit({ restarted: true, spawnedFresh: true }, formatRestart)\n return\n }\n emit(\n {\n restarted: true,\n spawnedFresh: false,\n note: 'next workspace create will auto-spawn',\n },\n formatRestart,\n )\n })\n\n d.command('kill')\n .description('SIGKILL the daemon. Last resort -- skips graceful shutdown.')\n .action(() => {\n const pid = readPid()\n if (pid === null) {\n emit({ killed: false, reason: 'no daemon running', pid: null }, formatKill)\n return\n }\n if (!processAlive(pid)) {\n emit({ killed: false, reason: 'process already gone', pid }, formatKill)\n return\n }\n try {\n process.kill(pid, 'SIGKILL')\n } catch {\n emit({ killed: false, reason: 'process gone', pid }, formatKill)\n return\n }\n emit({ killed: true, pid }, formatKill)\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, exitCodeFromResponse, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nexport function registerExecuteCommand(program: Command): void {\n program\n .command('execute')\n .description('Execute a command.')\n .requiredOption('-w, --workspace <id>', 'Workspace id')\n .requiredOption('-c, --command <command>', 'Shell command to execute')\n .option('-s, --session <id>', 'Session id')\n .option('--bg', 'Background; return job_id immediately')\n .action(\n async (opts: { workspace: string; command: string; session?: string; bg?: boolean }) => {\n const body: Record<string, unknown> = { command: opts.command, provision: false }\n if (opts.session !== undefined) body.sessionId = opts.session\n if (opts.bg !== true && !process.stdin.isTTY) {\n body.stdinBase64 = readFileSync(0).toString('base64')\n }\n const path =\n `/v1/workspaces/${opts.workspace}/execute` + (opts.bg === true ? '?background=true' : '')\n const c = makeClient(loadDaemonSettings())\n await c.ensureRunning({ allowSpawn: false })\n const response = await handleResponse(\n await c.request('POST', path, { body: JSON.stringify(body) }),\n )\n emit(response)\n process.exit(exitCodeFromResponse(response))\n },\n )\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, exitCodeFromResponse, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nexport function registerJobCommands(program: Command): void {\n const job = program.command('job').description('Manage daemon jobs.')\n\n job\n .command('list')\n .option('-w, --workspace <id>')\n .action(async (opts: { workspace?: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const path =\n '/v1/jobs' + (opts.workspace !== undefined ? `?workspaceId=${opts.workspace}` : '')\n emit(await handleResponse(await c.request('GET', path)))\n })\n\n job\n .command('get')\n .argument('<id>')\n .action(async (id: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const response = await handleResponse(await c.request('GET', `/v1/jobs/${id}`))\n emit(response)\n process.exit(exitCodeFromResponse(response))\n })\n\n job\n .command('wait')\n .argument('<id>')\n .option('--timeout <s>')\n .action(async (id: string, opts: { timeout?: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const body: Record<string, unknown> = {}\n if (opts.timeout !== undefined) body.timeoutS = Number(opts.timeout)\n const response = await handleResponse(\n await c.request('POST', `/v1/jobs/${id}/wait`, { body: JSON.stringify(body) }),\n )\n emit(response)\n process.exit(exitCodeFromResponse(response))\n })\n\n job\n .command('cancel')\n .argument('<id>')\n .action(async (id: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(await handleResponse(await c.request('DELETE', `/v1/jobs/${id}`)))\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nexport function registerProvisionCommand(program: Command): void {\n program\n .command('provision')\n .description('Estimate cost / preview a command without running it.')\n .requiredOption('-w, --workspace <id>', 'Workspace id')\n .requiredOption('-c, --command <command>', 'Shell command to estimate')\n .option('-s, --session <id>', 'Session id')\n .action(async (opts: { workspace: string; command: string; session?: string }) => {\n const body: Record<string, unknown> = { command: opts.command, provision: true }\n if (opts.session !== undefined) body.sessionId = opts.session\n const c = makeClient(loadDaemonSettings())\n await c.ensureRunning({ allowSpawn: false })\n emit(\n await handleResponse(\n await c.request('POST', `/v1/workspaces/${opts.workspace}/execute`, {\n body: JSON.stringify(body),\n }),\n ),\n )\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nexport function registerSessionCommands(program: Command): void {\n const sess = program.command('session').description('Manage workspace sessions.')\n\n sess\n .command('create')\n .argument('<wsId>')\n .option('--id <sessionId>')\n .option(\n '-m, --mount <prefix>',\n 'restrict session to this mount prefix; repeatable',\n (value: string, prev: string[]) => prev.concat([value]),\n [] as string[],\n )\n .action(async (wsId: string, opts: { id?: string; mount?: string[] }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const body: Record<string, unknown> = {}\n if (opts.id !== undefined) body.sessionId = opts.id\n if (opts.mount !== undefined && opts.mount.length > 0) {\n body.allowedMounts = opts.mount\n }\n emit(\n await handleResponse(\n await c.request('POST', `/v1/workspaces/${wsId}/sessions`, {\n body: JSON.stringify(body),\n }),\n ),\n )\n })\n\n sess\n .command('list')\n .argument('<wsId>')\n .action(async (wsId: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(await handleResponse(await c.request('GET', `/v1/workspaces/${wsId}/sessions`)))\n })\n\n sess\n .command('delete')\n .argument('<wsId>')\n .argument('<sessionId>')\n .action(async (wsId: string, sessionId: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(\n await handleResponse(\n await c.request('DELETE', `/v1/workspaces/${wsId}/sessions/${sessionId}`),\n ),\n )\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Command } from 'commander'\nimport { interpolateEnv, loadWorkspaceConfig } from '@struktoai/mirage-server'\nimport { parse as yamlParse } from 'yaml'\nimport { makeClient } from './client.ts'\nimport { emit, fail, formatAge, formatTable, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nfunction envRecord(): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') out[k] = v\n }\n return out\n}\n\nfunction loadConfigArgument(path: string): unknown {\n if (!existsSync(path)) fail(`config file not found: ${path}`, 2)\n const text = readFileSync(path, 'utf-8')\n try {\n return interpolateEnv(yamlParse(text), envRecord())\n } catch (err: unknown) {\n fail(`invalid config YAML/JSON at ${path}: ${String(err)}`, 2)\n }\n}\n\ninterface WorkspaceBrief {\n id: string\n mode: string\n mountCount: number\n sessionCount: number\n createdAt: number\n}\n\ninterface MountSummary {\n prefix: string\n resource: string\n mode: string\n}\n\ninterface SessionSummary {\n sessionId: string\n cwd: string\n}\n\ninterface Internals {\n cacheBytes: number\n cacheEntries: number\n historyLength: number\n inFlightJobs: number\n}\n\ninterface WorkspaceDetail {\n id: string\n mode: string\n createdAt: number\n mounts?: MountSummary[]\n sessions?: SessionSummary[]\n internals?: Internals | null\n}\n\nfunction formatWorkspaceList(items: WorkspaceBrief[]): string {\n if (items.length === 0) return 'No active workspaces.'\n const rows = items.map((w) => [\n w.id,\n w.mode,\n String(w.mountCount),\n String(w.sessionCount),\n formatAge(w.createdAt),\n ])\n return formatTable(['ID', 'MODE', 'MOUNTS', 'SESSIONS', 'AGE'], rows)\n}\n\nfunction formatWorkspaceDetail(d: WorkspaceDetail): string {\n const lines: string[] = [\n `ID: ${d.id}`,\n `Mode: ${d.mode}`,\n `Created: ${formatAge(d.createdAt)} ago`,\n ]\n if (d.mounts !== undefined && d.mounts.length > 0) {\n const rows = d.mounts.map((m) => [m.prefix, m.resource, m.mode])\n lines.push('', 'Mounts:')\n for (const ln of formatTable(['PREFIX', 'RESOURCE', 'MODE'], rows).split('\\n')) {\n lines.push(' ' + ln)\n }\n }\n if (d.sessions !== undefined && d.sessions.length > 0) {\n const rows = d.sessions.map((s) => [s.sessionId, s.cwd])\n lines.push('', 'Sessions:')\n for (const ln of formatTable(['SESSION', 'CWD'], rows).split('\\n')) {\n lines.push(' ' + ln)\n }\n }\n if (d.internals != null) {\n lines.push('', 'Internals:')\n for (const k of ['cacheBytes', 'cacheEntries', 'historyLength', 'inFlightJobs'] as const) {\n lines.push(` ${k.padEnd(16)} ${String(d.internals[k])}`)\n }\n }\n return lines.join('\\n')\n}\n\ninterface VersionLogItem {\n id: string\n message: string\n}\n\ninterface DiffResult {\n added: string[]\n modified: string[]\n deleted: string[]\n}\n\nfunction formatVersionLog(items: VersionLogItem[]): string {\n if (items.length === 0) return 'No versions.'\n return formatTable(\n ['VERSION', 'MESSAGE'],\n items.map((v) => [v.id.slice(0, 12), v.message]),\n )\n}\n\nfunction formatDiff(changes: DiffResult): string {\n const lines: string[] = []\n for (const kind of ['added', 'modified', 'deleted'] as const) {\n for (const path of changes[kind]) lines.push(`${kind.padEnd(9)} ${path}`)\n }\n return lines.length > 0 ? lines.join('\\n') : 'No changes.'\n}\n\nexport function registerWorkspaceCommands(program: Command): void {\n const ws = program.command('workspace').description('Manage workspaces.')\n\n ws.command('create')\n .description('Create a workspace; daemon auto-spawns if not running.')\n .argument('<config>', 'YAML/JSON workspace config')\n .option('--id <id>', 'Explicit workspace id')\n .action(async (configPath: string, opts: { id?: string }) => {\n const cfg = loadWorkspaceConfig(configPath)\n const body: { config: unknown; id?: string } = { config: cfg }\n if (opts.id !== undefined) body.id = opts.id\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: true })\n const r = await c.request('POST', '/v1/workspaces', { body: JSON.stringify(body) })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n\n ws.command('list')\n .description('List active workspaces.')\n .action(async () => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(\n (await handleResponse(await c.request('GET', '/v1/workspaces'))) as WorkspaceBrief[],\n formatWorkspaceList,\n )\n })\n\n ws.command('get')\n .description('Show full details for one workspace.')\n .argument('<id>')\n .option('--verbose', 'Include cache/dirty/history internals')\n .action(async (id: string, opts: { verbose?: boolean }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const path = `/v1/workspaces/${id}` + (opts.verbose === true ? '?verbose=true' : '')\n emit(\n (await handleResponse(await c.request('GET', path))) as WorkspaceDetail,\n formatWorkspaceDetail,\n )\n })\n\n ws.command('delete')\n .description('Stop and remove a workspace.')\n .argument('<id>')\n .action(async (id: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(\n (await handleResponse(await c.request('DELETE', `/v1/workspaces/${id}`))) as {\n id: string\n },\n (d) => `Deleted workspace ${d.id}.`,\n )\n })\n\n ws.command('clone')\n .description('Clone a workspace, optionally from one of its past versions.')\n .argument('<srcId>')\n .option('--id <id>', 'Explicit id for the clone')\n .option('--at <ref>', 'Clone from a past version (id or branch) not the live state')\n .action(async (srcId: string, opts: { id?: string; at?: string }) => {\n const body: Record<string, unknown> = { sourceId: srcId }\n if (opts.id !== undefined) body.id = opts.id\n if (opts.at !== undefined) body.at = opts.at\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', '/v1/workspaces/clone', { body: JSON.stringify(body) })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n\n ws.command('commit')\n .description(\"Commit the workspace's current state as a version.\")\n .argument('<id>')\n .option('-m, --message <msg>', 'Version message', '')\n .option('-b, --branch <branch>', 'Branch to commit on', 'main')\n .action(async (id: string, opts: { message: string; branch: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/commit`, {\n body: JSON.stringify({ message: opts.message, branch: opts.branch }),\n })\n emit(\n (await handleResponse(r)) as { version: string; branch: string },\n (d) => `Committed ${d.version.slice(0, 12)} on ${d.branch}.`,\n )\n })\n\n ws.command('branch')\n .description(\"Create a branch at another branch's current version.\")\n .argument('<id>')\n .argument('<name>')\n .option('--from <branch>', 'Branch to fork from', 'main')\n .action(async (id: string, name: string, opts: { from: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/branch`, {\n body: JSON.stringify({ name, fromBranch: opts.from }),\n })\n emit(\n (await handleResponse(r)) as { branch: string; version: string },\n (d) => `Created branch ${d.branch} at ${d.version.slice(0, 12)}.`,\n )\n })\n\n ws.command('log')\n .description(\"List a workspace's versions (newest first).\")\n .argument('<id>')\n .option('-b, --branch <branch>', 'Branch', 'main')\n .action(async (id: string, opts: { branch: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('GET', `/v1/workspaces/${id}/versions?branch=${opts.branch}`)\n emit((await handleResponse(r)) as VersionLogItem[], formatVersionLog)\n })\n\n ws.command('diff')\n .description('Show changed files (git-style): live vs HEAD, live vs <a>, or <a> vs <b>.')\n .argument('<id>')\n .argument('[a]', 'Base ref; omit to use live state')\n .argument('[b]', 'Compare ref; omit to use live state')\n .option('-b, --branch <branch>', 'Branch', 'main')\n .action(\n async (\n id: string,\n a: string | undefined,\n b: string | undefined,\n opts: { branch: string },\n ) => {\n const params = new URLSearchParams({ branch: opts.branch })\n if (a !== undefined) params.set('a', a)\n if (b !== undefined) params.set('b', b)\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('GET', `/v1/workspaces/${id}/diff?${params.toString()}`)\n emit((await handleResponse(r)) as DiffResult, formatDiff)\n },\n )\n\n ws.command('checkout')\n .description('Restore a workspace in place to one of its versions.')\n .argument('<id>')\n .argument('<ref>', 'Version id or branch to restore')\n .action(async (id: string, ref: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/checkout`, {\n body: JSON.stringify({ ref }),\n })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n\n ws.command('snapshot')\n .description(\n 'Snapshot a workspace to a tar file. The path is resolved to an absolute path and the daemon writes the tar.',\n )\n .argument('<id>')\n .argument('<output>', 'Path to write the .tar to')\n .action(async (id: string, output: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/snapshot`, {\n body: JSON.stringify({ path: resolve(output) }),\n })\n const d = (await handleResponse(r)) as { id: string; path: string; size: number }\n emit(d, (x) => `Snapshot ${x.id} -> ${x.path} (${x.size.toLocaleString()} bytes).`)\n })\n\n ws.command('load')\n .description('Load a workspace from a tar file.')\n .argument('<tar>', 'Path to a .tar produced by `mirage workspace snapshot`')\n .argument('[config]', 'Workspace YAML/JSON config')\n .option('--id <id>', 'Explicit workspace id')\n .action(async (tarPath: string, configPath: string | undefined, opts: { id?: string }) => {\n if (!existsSync(tarPath)) fail(`tar file not found: ${tarPath}`, 2)\n const body: { path: string; id?: string; override?: unknown } = { path: resolve(tarPath) }\n if (opts.id !== undefined) body.id = opts.id\n if (configPath !== undefined) body.override = loadConfigArgument(configPath)\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: true })\n const r = await c.request('POST', '/v1/workspaces/load', { body: JSON.stringify(body) })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n}\n","#!/usr/bin/env node\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { buildProgram } from '../main.ts'\n\nconst ALIASES: Record<string, string> = {\n '--workspace_id': '--workspace',\n '--session_id': '--session',\n}\n\nfunction rewriteArgv(argv: string[]): string[] {\n return argv.map((arg) => {\n for (const [from, to] of Object.entries(ALIASES)) {\n if (arg === from) return to\n if (arg.startsWith(from + '=')) return to + arg.slice(from.length)\n }\n return arg\n })\n}\n\nbuildProgram()\n .parseAsync(rewriteArgv(process.argv))\n .catch((err: unknown) => {\n console.error(err)\n process.exit(1)\n })\n"],"mappings":"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","names":["readFileSync","join","readFileSync","readFileSync","buildClient","buildClient","existsSync","readFileSync","buildClient","existsSync","readFileSync","readFileSync","join"]}
|
|
1
|
+
{"version":3,"sources":["../../src/main.ts","../../src/daemon.ts","../../src/execute.ts","../../src/job.ts","../../src/provision.ts","../../src/session.ts","../../src/workspace.ts","../../src/bin/mirage.ts"],"sourcesContent":["// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { Command } from 'commander'\nimport { registerDaemonCommands } from './daemon.ts'\nimport { registerExecuteCommand } from './execute.ts'\nimport { registerJobCommands } from './job.ts'\nimport { registerProvisionCommand } from './provision.ts'\nimport { registerSessionCommands } from './session.ts'\nimport { registerWorkspaceCommands } from './workspace.ts'\n\nfunction resolveVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as {\n name?: string\n version?: string\n }\n if (pkg.name === '@struktoai/mirage-cli' && pkg.version) return pkg.version\n } catch {\n // package.json absent at this level: keep walking up to the package root\n }\n dir = dirname(dir)\n }\n return '0.0.0'\n}\n\nexport function buildProgram(): Command {\n const program = new Command()\n program\n .name('mirage')\n .description('Mirage daemon CLI: manage workspaces and execute commands.')\n .version(resolveVersion())\n registerWorkspaceCommands(program)\n registerSessionCommands(program)\n registerJobCommands(program)\n registerExecuteCommand(program)\n registerProvisionCommand(program)\n registerDaemonCommands(program)\n return program\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, fail, formatAge } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\ninterface DaemonStatus {\n running: boolean\n pid: number | null\n url: string\n uptimeS?: number\n workspaces?: number\n}\n\nfunction formatStatus(d: DaemonStatus): string {\n if (!d.running) return `Daemon not running. URL: ${d.url}`\n const parts: string[] = [`Running. PID ${d.pid !== null ? String(d.pid) : '?'}`]\n if (d.uptimeS !== undefined) {\n parts.push(`uptime ${formatAge(Date.now() / 1000 - d.uptimeS)}`)\n }\n if (d.workspaces !== undefined) {\n parts.push(`${String(d.workspaces)} workspace${d.workspaces === 1 ? '' : 's'}`)\n }\n return parts.join(', ') + `. URL: ${d.url}`\n}\n\nfunction formatStop(d: { via?: string; pid?: number }): string {\n const via = d.via ?? '?'\n return `Stopped (via ${via}${d.pid !== undefined ? `, PID ${String(d.pid)}` : ''}).`\n}\n\nfunction formatRestart(d: { spawnedFresh?: boolean }): string {\n if (d.spawnedFresh === true) return 'Restarted (eager spawn).'\n return 'Restarted; next CLI command will auto-spawn.'\n}\n\nfunction formatKill(d: { killed: boolean; pid?: number | null }): string {\n if (d.killed) return `Killed PID ${String(d.pid ?? '?')}.`\n if (d.pid === null || d.pid === undefined) return 'Daemon not running.'\n return `Already gone (PID ${String(d.pid)}).`\n}\n\nfunction pidFilePath(): string {\n return join(homedir(), '.mirage', 'daemon.pid')\n}\n\nfunction readPid(): number | null {\n const p = pidFilePath()\n if (!existsSync(p)) return null\n const text = readFileSync(p, 'utf-8').trim()\n const pid = Number(text)\n return Number.isFinite(pid) && pid > 0 ? pid : null\n}\n\nfunction processAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === 'ESRCH') return false\n if (code === 'EPERM') return true\n return false\n }\n}\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nasync function waitForUnreachable(timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs\n while (Date.now() < deadline) {\n const c = buildClient()\n if (!(await c.isReachable(300))) return true\n await new Promise((r) => setTimeout(r, 200))\n }\n return false\n}\n\nexport function registerDaemonCommands(program: Command): void {\n const d = program.command('daemon').description('Manage the daemon process lifecycle.')\n\n d.command('status')\n .description('Show daemon health, PID, uptime, workspace count.')\n .action(async () => {\n const pid = readPid()\n const c = buildClient()\n const url = c.settings.url\n try {\n const r = await c.request('GET', '/v1/health')\n if (r.status !== 200) {\n emit({ running: false, pid, url } as DaemonStatus, formatStatus)\n process.exit(1)\n }\n const body = (await r.json()) as Record<string, unknown>\n emit({ running: true, pid, url, ...body } as DaemonStatus, formatStatus)\n } catch {\n emit({ running: false, pid, url } as DaemonStatus, formatStatus)\n process.exit(1)\n }\n })\n\n d.command('stop')\n .description('Gracefully stop the daemon.')\n .option('--timeout <s>', 'Seconds to wait for graceful exit', '5')\n .action(async (opts: { timeout: string }) => {\n const timeoutMs = Number(opts.timeout) * 1000\n const c = buildClient()\n let r: Response\n try {\n r = await c.request('POST', '/v1/shutdown')\n } catch (err: unknown) {\n fail(`daemon not reachable: ${String(err)}`)\n }\n if (r.status >= 400) fail(`shutdown failed: ${await r.text()}`, 2)\n if (await waitForUnreachable(timeoutMs)) {\n emit({ stopped: true, via: 'graceful' }, formatStop)\n return\n }\n const pid = readPid()\n if (pid !== null && processAlive(pid)) {\n try {\n process.kill(pid, 'SIGTERM')\n emit({ stopped: true, via: 'sigterm', pid }, formatStop)\n return\n } catch {\n // fall through to fail\n }\n }\n fail(`daemon did not exit within ${opts.timeout}s and no live PID found`, 2)\n })\n\n d.command('restart')\n .description('Stop the daemon. Next CLI command auto-spawns a fresh one.')\n .option('--timeout <s>', 'Seconds to wait for graceful exit', '5')\n .option('--eager', 'Spawn a fresh daemon immediately')\n .action(async (opts: { timeout: string; eager?: boolean }) => {\n const timeoutMs = Number(opts.timeout) * 1000\n try {\n await buildClient().request('POST', '/v1/shutdown')\n } catch {\n // already unreachable; fall through to pid cleanup\n }\n if (!(await waitForUnreachable(timeoutMs))) {\n const pid = readPid()\n if (pid !== null && processAlive(pid)) {\n try {\n process.kill(pid, 'SIGTERM')\n } catch {\n // process may have exited between checks\n }\n }\n }\n if (opts.eager === true) {\n await buildClient().ensureRunning({ allowSpawn: true })\n emit({ restarted: true, spawnedFresh: true }, formatRestart)\n return\n }\n emit(\n {\n restarted: true,\n spawnedFresh: false,\n note: 'next workspace create will auto-spawn',\n },\n formatRestart,\n )\n })\n\n d.command('kill')\n .description('SIGKILL the daemon. Last resort -- skips graceful shutdown.')\n .action(() => {\n const pid = readPid()\n if (pid === null) {\n emit({ killed: false, reason: 'no daemon running', pid: null }, formatKill)\n return\n }\n if (!processAlive(pid)) {\n emit({ killed: false, reason: 'process already gone', pid }, formatKill)\n return\n }\n try {\n process.kill(pid, 'SIGKILL')\n } catch {\n emit({ killed: false, reason: 'process gone', pid }, formatKill)\n return\n }\n emit({ killed: true, pid }, formatKill)\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { readFileSync } from 'node:fs'\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, exitCodeFromResponse, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nexport function registerExecuteCommand(program: Command): void {\n program\n .command('execute')\n .description('Execute a command.')\n .requiredOption('-w, --workspace <id>', 'Workspace id')\n .requiredOption('-c, --command <command>', 'Shell command to execute')\n .option('-s, --session <id>', 'Session id')\n .option('--bg', 'Background; return job_id immediately')\n .action(\n async (opts: { workspace: string; command: string; session?: string; bg?: boolean }) => {\n const body: Record<string, unknown> = { command: opts.command, provision: false }\n if (opts.session !== undefined) body.sessionId = opts.session\n if (opts.bg !== true && !process.stdin.isTTY) {\n body.stdinBase64 = readFileSync(0).toString('base64')\n }\n const path =\n `/v1/workspaces/${opts.workspace}/execute` + (opts.bg === true ? '?background=true' : '')\n const c = makeClient(loadDaemonSettings())\n await c.ensureRunning({ allowSpawn: false })\n const response = await handleResponse(\n await c.request('POST', path, { body: JSON.stringify(body) }),\n )\n emit(response)\n process.exit(exitCodeFromResponse(response))\n },\n )\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, exitCodeFromResponse, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nexport function registerJobCommands(program: Command): void {\n const job = program.command('job').description('Manage daemon jobs.')\n\n job\n .command('list')\n .option('-w, --workspace <id>')\n .action(async (opts: { workspace?: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const path =\n '/v1/jobs' + (opts.workspace !== undefined ? `?workspaceId=${opts.workspace}` : '')\n emit(await handleResponse(await c.request('GET', path)))\n })\n\n job\n .command('get')\n .argument('<id>')\n .action(async (id: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const response = await handleResponse(await c.request('GET', `/v1/jobs/${id}`))\n emit(response)\n process.exit(exitCodeFromResponse(response))\n })\n\n job\n .command('wait')\n .argument('<id>')\n .option('--timeout <s>')\n .action(async (id: string, opts: { timeout?: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const body: Record<string, unknown> = {}\n if (opts.timeout !== undefined) body.timeoutS = Number(opts.timeout)\n const response = await handleResponse(\n await c.request('POST', `/v1/jobs/${id}/wait`, { body: JSON.stringify(body) }),\n )\n emit(response)\n process.exit(exitCodeFromResponse(response))\n })\n\n job\n .command('cancel')\n .argument('<id>')\n .action(async (id: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(await handleResponse(await c.request('DELETE', `/v1/jobs/${id}`)))\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nexport function registerProvisionCommand(program: Command): void {\n program\n .command('provision')\n .description('Estimate cost / preview a command without running it.')\n .requiredOption('-w, --workspace <id>', 'Workspace id')\n .requiredOption('-c, --command <command>', 'Shell command to estimate')\n .option('-s, --session <id>', 'Session id')\n .action(async (opts: { workspace: string; command: string; session?: string }) => {\n const body: Record<string, unknown> = { command: opts.command, provision: true }\n if (opts.session !== undefined) body.sessionId = opts.session\n const c = makeClient(loadDaemonSettings())\n await c.ensureRunning({ allowSpawn: false })\n emit(\n await handleResponse(\n await c.request('POST', `/v1/workspaces/${opts.workspace}/execute`, {\n body: JSON.stringify(body),\n }),\n ),\n )\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport type { Command } from 'commander'\nimport { makeClient } from './client.ts'\nimport { emit, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nexport function registerSessionCommands(program: Command): void {\n const sess = program.command('session').description('Manage workspace sessions.')\n\n sess\n .command('create')\n .argument('<wsId>')\n .option('--id <sessionId>')\n .option(\n '-m, --mount <prefix>',\n 'restrict session to this mount prefix; repeatable',\n (value: string, prev: string[]) => prev.concat([value]),\n [] as string[],\n )\n .action(async (wsId: string, opts: { id?: string; mount?: string[] }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const body: Record<string, unknown> = {}\n if (opts.id !== undefined) body.sessionId = opts.id\n if (opts.mount !== undefined && opts.mount.length > 0) {\n body.allowedMounts = opts.mount\n }\n emit(\n await handleResponse(\n await c.request('POST', `/v1/workspaces/${wsId}/sessions`, {\n body: JSON.stringify(body),\n }),\n ),\n )\n })\n\n sess\n .command('list')\n .argument('<wsId>')\n .action(async (wsId: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(await handleResponse(await c.request('GET', `/v1/workspaces/${wsId}/sessions`)))\n })\n\n sess\n .command('delete')\n .argument('<wsId>')\n .argument('<sessionId>')\n .action(async (wsId: string, sessionId: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(\n await handleResponse(\n await c.request('DELETE', `/v1/workspaces/${wsId}/sessions/${sessionId}`),\n ),\n )\n })\n}\n","// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Command } from 'commander'\nimport { interpolateEnv, loadWorkspaceConfigFile } from '@struktoai/mirage-server'\nimport { parse as yamlParse } from 'yaml'\nimport { makeClient } from './client.ts'\nimport { emit, fail, formatAge, formatTable, handleResponse } from './output.ts'\nimport { loadDaemonSettings } from './settings.ts'\n\nfunction buildClient() {\n return makeClient(loadDaemonSettings())\n}\n\nfunction envRecord(): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') out[k] = v\n }\n return out\n}\n\nfunction loadConfigArgument(path: string): unknown {\n if (!existsSync(path)) fail(`config file not found: ${path}`, 2)\n const text = readFileSync(path, 'utf-8')\n try {\n return interpolateEnv(yamlParse(text), envRecord())\n } catch (err: unknown) {\n fail(`invalid config YAML/JSON at ${path}: ${String(err)}`, 2)\n }\n}\n\ninterface WorkspaceBrief {\n id: string\n mode: string\n mountCount: number\n sessionCount: number\n createdAt: number\n}\n\ninterface MountSummary {\n prefix: string\n resource: string\n mode: string\n}\n\ninterface SessionSummary {\n sessionId: string\n cwd: string\n}\n\ninterface Internals {\n cacheBytes: number\n cacheEntries: number\n historyLength: number\n inFlightJobs: number\n}\n\ninterface WorkspaceDetail {\n id: string\n mode: string\n createdAt: number\n mounts?: MountSummary[]\n sessions?: SessionSummary[]\n internals?: Internals | null\n}\n\nfunction formatWorkspaceList(items: WorkspaceBrief[]): string {\n if (items.length === 0) return 'No active workspaces.'\n const rows = items.map((w) => [\n w.id,\n w.mode,\n String(w.mountCount),\n String(w.sessionCount),\n formatAge(w.createdAt),\n ])\n return formatTable(['ID', 'MODE', 'MOUNTS', 'SESSIONS', 'AGE'], rows)\n}\n\nfunction formatWorkspaceDetail(d: WorkspaceDetail): string {\n const lines: string[] = [\n `ID: ${d.id}`,\n `Mode: ${d.mode}`,\n `Created: ${formatAge(d.createdAt)} ago`,\n ]\n if (d.mounts !== undefined && d.mounts.length > 0) {\n const rows = d.mounts.map((m) => [m.prefix, m.resource, m.mode])\n lines.push('', 'Mounts:')\n for (const ln of formatTable(['PREFIX', 'RESOURCE', 'MODE'], rows).split('\\n')) {\n lines.push(' ' + ln)\n }\n }\n if (d.sessions !== undefined && d.sessions.length > 0) {\n const rows = d.sessions.map((s) => [s.sessionId, s.cwd])\n lines.push('', 'Sessions:')\n for (const ln of formatTable(['SESSION', 'CWD'], rows).split('\\n')) {\n lines.push(' ' + ln)\n }\n }\n if (d.internals != null) {\n lines.push('', 'Internals:')\n for (const k of ['cacheBytes', 'cacheEntries', 'historyLength', 'inFlightJobs'] as const) {\n lines.push(` ${k.padEnd(16)} ${String(d.internals[k])}`)\n }\n }\n return lines.join('\\n')\n}\n\ninterface VersionLogItem {\n id: string\n message: string\n}\n\ninterface DiffResult {\n added: string[]\n modified: string[]\n deleted: string[]\n}\n\nfunction formatVersionLog(items: VersionLogItem[]): string {\n if (items.length === 0) return 'No versions.'\n return formatTable(\n ['VERSION', 'MESSAGE'],\n items.map((v) => [v.id.slice(0, 12), v.message]),\n )\n}\n\nfunction formatDiff(changes: DiffResult): string {\n const lines: string[] = []\n for (const kind of ['added', 'modified', 'deleted'] as const) {\n for (const path of changes[kind]) lines.push(`${kind.padEnd(9)} ${path}`)\n }\n return lines.length > 0 ? lines.join('\\n') : 'No changes.'\n}\n\nexport function registerWorkspaceCommands(program: Command): void {\n const ws = program.command('workspace').description('Manage workspaces.')\n\n ws.command('create')\n .description('Create a workspace; daemon auto-spawns if not running.')\n .argument('<config>', 'YAML/JSON workspace config')\n .option('--id <id>', 'Explicit workspace id')\n .action(async (configPath: string, opts: { id?: string }) => {\n const cfg = loadWorkspaceConfigFile(configPath)\n const body: { config: unknown; id?: string } = { config: cfg }\n if (opts.id !== undefined) body.id = opts.id\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: true })\n const r = await c.request('POST', '/v1/workspaces', { body: JSON.stringify(body) })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n\n ws.command('list')\n .description('List active workspaces.')\n .action(async () => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(\n (await handleResponse(await c.request('GET', '/v1/workspaces'))) as WorkspaceBrief[],\n formatWorkspaceList,\n )\n })\n\n ws.command('get')\n .description('Show full details for one workspace.')\n .argument('<id>')\n .option('--verbose', 'Include cache/dirty/history internals')\n .action(async (id: string, opts: { verbose?: boolean }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const path = `/v1/workspaces/${id}` + (opts.verbose === true ? '?verbose=true' : '')\n emit(\n (await handleResponse(await c.request('GET', path))) as WorkspaceDetail,\n formatWorkspaceDetail,\n )\n })\n\n ws.command('delete')\n .description('Stop and remove a workspace.')\n .argument('<id>')\n .action(async (id: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n emit(\n (await handleResponse(await c.request('DELETE', `/v1/workspaces/${id}`))) as {\n id: string\n },\n (d) => `Deleted workspace ${d.id}.`,\n )\n })\n\n ws.command('clone')\n .description('Clone a workspace, optionally from one of its past versions.')\n .argument('<srcId>')\n .option('--id <id>', 'Explicit id for the clone')\n .option('--at <ref>', 'Clone from a past version (id or branch) not the live state')\n .action(async (srcId: string, opts: { id?: string; at?: string }) => {\n const body: Record<string, unknown> = { sourceId: srcId }\n if (opts.id !== undefined) body.id = opts.id\n if (opts.at !== undefined) body.at = opts.at\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', '/v1/workspaces/clone', { body: JSON.stringify(body) })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n\n ws.command('commit')\n .description(\"Commit the workspace's current state as a version.\")\n .argument('<id>')\n .option('-m, --message <msg>', 'Version message', '')\n .option('-b, --branch <branch>', 'Branch to commit on', 'main')\n .action(async (id: string, opts: { message: string; branch: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/commit`, {\n body: JSON.stringify({ message: opts.message, branch: opts.branch }),\n })\n emit(\n (await handleResponse(r)) as { version: string; branch: string },\n (d) => `Committed ${d.version.slice(0, 12)} on ${d.branch}.`,\n )\n })\n\n ws.command('branch')\n .description(\"Create a branch at another branch's current version.\")\n .argument('<id>')\n .argument('<name>')\n .option('--from <branch>', 'Branch to fork from', 'main')\n .action(async (id: string, name: string, opts: { from: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/branch`, {\n body: JSON.stringify({ name, fromBranch: opts.from }),\n })\n emit(\n (await handleResponse(r)) as { branch: string; version: string },\n (d) => `Created branch ${d.branch} at ${d.version.slice(0, 12)}.`,\n )\n })\n\n ws.command('log')\n .description(\"List a workspace's versions (newest first).\")\n .argument('<id>')\n .option('-b, --branch <branch>', 'Branch', 'main')\n .action(async (id: string, opts: { branch: string }) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('GET', `/v1/workspaces/${id}/versions?branch=${opts.branch}`)\n emit((await handleResponse(r)) as VersionLogItem[], formatVersionLog)\n })\n\n ws.command('diff')\n .description('Show changed files (git-style): live vs HEAD, live vs <a>, or <a> vs <b>.')\n .argument('<id>')\n .argument('[a]', 'Base ref; omit to use live state')\n .argument('[b]', 'Compare ref; omit to use live state')\n .option('-b, --branch <branch>', 'Branch', 'main')\n .action(\n async (\n id: string,\n a: string | undefined,\n b: string | undefined,\n opts: { branch: string },\n ) => {\n const params = new URLSearchParams({ branch: opts.branch })\n if (a !== undefined) params.set('a', a)\n if (b !== undefined) params.set('b', b)\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('GET', `/v1/workspaces/${id}/diff?${params.toString()}`)\n emit((await handleResponse(r)) as DiffResult, formatDiff)\n },\n )\n\n ws.command('checkout')\n .description('Restore a workspace in place to one of its versions.')\n .argument('<id>')\n .argument('<ref>', 'Version id or branch to restore')\n .action(async (id: string, ref: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/checkout`, {\n body: JSON.stringify({ ref }),\n })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n\n ws.command('snapshot')\n .description(\n 'Snapshot a workspace to a tar file. The path is resolved to an absolute path and the daemon writes the tar.',\n )\n .argument('<id>')\n .argument('<output>', 'Path to write the .tar to')\n .action(async (id: string, output: string) => {\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: false })\n const r = await c.request('POST', `/v1/workspaces/${id}/snapshot`, {\n body: JSON.stringify({ path: resolve(output) }),\n })\n const d = (await handleResponse(r)) as { id: string; path: string; size: number }\n emit(d, (x) => `Snapshot ${x.id} -> ${x.path} (${x.size.toLocaleString()} bytes).`)\n })\n\n ws.command('load')\n .description('Load a workspace from a tar file.')\n .argument('<tar>', 'Path to a .tar produced by `mirage workspace snapshot`')\n .argument('[config]', 'Workspace YAML/JSON config')\n .option('--id <id>', 'Explicit workspace id')\n .action(async (tarPath: string, configPath: string | undefined, opts: { id?: string }) => {\n if (!existsSync(tarPath)) fail(`tar file not found: ${tarPath}`, 2)\n const body: { path: string; id?: string; override?: unknown } = { path: resolve(tarPath) }\n if (opts.id !== undefined) body.id = opts.id\n if (configPath !== undefined) body.override = loadConfigArgument(configPath)\n const c = buildClient()\n await c.ensureRunning({ allowSpawn: true })\n const r = await c.request('POST', '/v1/workspaces/load', { body: JSON.stringify(body) })\n emit((await handleResponse(r)) as WorkspaceDetail, formatWorkspaceDetail)\n })\n}\n","#!/usr/bin/env node\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// ========= Copyright 2026 @ Strukto.AI All Rights Reserved. =========\n\nimport { buildProgram } from '../main.ts'\n\nconst ALIASES: Record<string, string> = {\n '--workspace_id': '--workspace',\n '--session_id': '--session',\n}\n\nfunction rewriteArgv(argv: string[]): string[] {\n return argv.map((arg) => {\n for (const [from, to] of Object.entries(ALIASES)) {\n if (arg === from) return to\n if (arg.startsWith(from + '=')) return to + arg.slice(from.length)\n }\n return arg\n })\n}\n\nbuildProgram()\n .parseAsync(rewriteArgv(process.argv))\n .catch((err: unknown) => {\n console.error(err)\n process.exit(1)\n })\n"],"mappings":"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","names":["readFileSync","join","readFileSync","readFileSync","buildClient","buildClient","existsSync","readFileSync","buildClient","existsSync","readFileSync","readFileSync","join"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@struktoai/mirage-cli",
|
|
3
|
-
"version": "0.0.3
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "A Unified Virtual Filesystem For AI Agents",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bash",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"commander": "^14.0.0",
|
|
44
44
|
"yaml": "^2.6.0",
|
|
45
|
-
"@struktoai/mirage-server": "0.0.3
|
|
45
|
+
"@struktoai/mirage-server": "0.0.3"
|
|
46
46
|
},
|
|
47
47
|
"optionalDependencies": {
|
|
48
48
|
"@zkochan/fuse-native": "^0.1.0"
|