@moxt-ai/cli 0.4.0-beta.1 → 0.5.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/README.md +85 -0
- package/dist/index.js +1387 -2094
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/program.ts","../src/utils/output.ts","../src/utils/runtime-context.ts","../src/utils/sandbox-path.ts","../src/commands/auth.ts","../src/commands/file.ts","../src/utils/file-selector.ts","../src/utils/http.ts","../src/utils/config.ts","../src/utils/search-options.ts","../src/utils/run-or-exit.ts","../src/utils/sandbox-client.ts","../src/utils/sandbox-file.ts","../src/utils/spinner.ts","../src/utils/write-content.ts","../src/commands/memory.ts","../src/utils/miniapp-db.ts","../src/commands/miniapp.ts","../src/commands/pull.ts","../src/utils/sandbox-pull.ts","../src/utils/checkout-state.ts","../src/utils/sandbox-push.ts","../src/utils/concurrency.ts","../src/commands/push.ts","../src/utils/checkout-status.ts","../src/commands/status.ts","../src/telemetry/config.ts","../src/telemetry/opt-out.ts","../src/commands/telemetry.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/telemetry/client.ts","../src/telemetry/notice.ts","../src/telemetry/instrument.ts"],"sourcesContent":["import updateNotifier from 'update-notifier'\nimport { createProgram } from './program.js'\nimport { flush } from './telemetry/client.js'\nimport { installExitHandler, instrumentProgram } from './telemetry/instrument.js'\n\ndeclare const __CLI_VERSION__: string\n\nupdateNotifier({\n pkg: { name: '@moxt-ai/cli', version: __CLI_VERSION__ },\n}).notify()\n\nconst program = createProgram(__CLI_VERSION__)\n\ninstrumentProgram(program)\ninstallExitHandler()\n\nprogram\n .parseAsync(process.argv)\n .then(async () => {\n await flush()\n })\n .catch(async (err: unknown) => {\n console.error('CLI Error:', err)\n await flush()\n process.exit(1)\n })\n","import { Command } from 'commander'\nimport { registerAuthCommand } from './commands/auth.js'\nimport { registerFileCommand } from './commands/file.js'\nimport { registerMemoryCommand } from './commands/memory.js'\nimport { registerMiniappCommand } from './commands/miniapp.js'\nimport { registerPullCommand } from './commands/pull.js'\nimport { registerPushCommand } from './commands/push.js'\nimport { registerStatusCommand } from './commands/status.js'\nimport { registerTelemetryCommand } from './commands/telemetry.js'\nimport { registerWhoamiCommand } from './commands/whoami.js'\nimport { registerWorkspaceCommand } from './commands/workspace.js'\n\nexport function createProgram(version: string): Command {\n const program = new Command()\n\n program\n .name('moxt')\n .description('Moxt CLI - AI Workspace')\n .version(version)\n .action(() => {\n program.help()\n })\n\n registerAuthCommand(program)\n registerWhoamiCommand(program)\n registerWorkspaceCommand(program)\n registerFileCommand(program)\n registerMemoryCommand(program)\n registerMiniappCommand(program)\n registerPullCommand(program)\n registerPushCommand(program)\n registerStatusCommand(program)\n registerTelemetryCommand(program)\n\n return program\n}\n","// ANSI colors\nexport const colors = {\n bold: '\\x1b[1m',\n blue: '\\x1b[1;34m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n cyan: '\\x1b[36m',\n dim: '\\x1b[2m',\n reset: '\\x1b[0m',\n}\n\nexport function print(message: string): void {\n console.log(message)\n}\n\nexport function printError(message: string): void {\n console.error(`${colors.red}${message}${colors.reset}`)\n}\n","import { readFileSync } from 'node:fs'\n\nexport interface RepoEntry {\n repoId: string\n name: string\n}\n\nexport interface RepoPayload {\n teams: RepoEntry[]\n personal: RepoEntry\n workspace?: RepoEntry | null\n}\n\nexport interface SandboxRuntimeContext {\n mode: 'sandbox'\n baseApiHost: string\n sandboxToolApiToken: string\n workspaceId: string\n repoPayload: RepoPayload\n}\n\nexport interface UserRuntimeContext {\n mode: 'user'\n host: string\n apiKey: string\n}\n\nexport type RuntimeContext = SandboxRuntimeContext | UserRuntimeContext\n\nconst DEFAULT_USER_HOST = 'api.moxt.ai'\nconst SANDBOX_ENV_FILE_KEY = 'SANDBOX_ENV_FILE'\nexport const SANDBOX_ENV_KEYS = [\n 'BASE_API_HOST',\n 'SANDBOX_TOOL_API_TOKEN',\n 'MOXT_REPO_PAYLOAD',\n 'MOXT_WORKSPACE_ID',\n] as const\n\nexport class RuntimeContextError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'RuntimeContextError'\n }\n}\n\nexport function resolveRuntimeContext(env: NodeJS.ProcessEnv = process.env): RuntimeContext {\n if (hasAnySandboxEnv(env)) {\n return resolveSandboxRuntimeContext(env)\n }\n\n const apiKey = readNonEmptyEnv(env, 'MOXT_API_KEY')\n if (apiKey) {\n return {\n mode: 'user',\n host: readNonEmptyEnv(env, 'MOXT_HOST') ?? DEFAULT_USER_HOST,\n apiKey,\n }\n }\n\n throw new RuntimeContextError('Missing auth. Set sandbox environment variables or MOXT_API_KEY.')\n}\n\nexport function resolveSandboxRuntimeContext(env: NodeJS.ProcessEnv = process.env): SandboxRuntimeContext {\n const directRepoPayload = readNonEmptyEnv(env, 'MOXT_REPO_PAYLOAD')\n const sandboxEnvFile = readNonEmptyEnv(env, SANDBOX_ENV_FILE_KEY)\n const missingKeys = SANDBOX_ENV_KEYS.filter((key) => {\n if (key === 'MOXT_REPO_PAYLOAD') return !directRepoPayload && !sandboxEnvFile\n return !readNonEmptyEnv(env, key)\n })\n if (missingKeys.length > 0) {\n throw new RuntimeContextError(`Incomplete sandbox environment. Missing: ${missingKeys.join(', ')}.`)\n }\n\n let repoPayload = directRepoPayload\n if (!repoPayload) {\n if (!sandboxEnvFile) {\n throw new RuntimeContextError('MOXT_REPO_PAYLOAD is required.')\n }\n repoPayload = readRepoPayloadFromSandboxEnvFile(sandboxEnvFile)\n }\n\n return {\n mode: 'sandbox',\n baseApiHost: normalizeBaseApiHost(readRequiredEnv(env, 'BASE_API_HOST')),\n sandboxToolApiToken: readRequiredEnv(env, 'SANDBOX_TOOL_API_TOKEN'),\n workspaceId: readRequiredEnv(env, 'MOXT_WORKSPACE_ID'),\n repoPayload: parseRepoPayload(repoPayload),\n }\n}\n\nfunction readRepoPayloadFromSandboxEnvFile(path: string): string {\n let parsed: unknown\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'))\n } catch (error) {\n throw new RuntimeContextError(\n `Failed to read SANDBOX_ENV_FILE: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n\n if (!isRecord(parsed)) {\n throw new RuntimeContextError('SANDBOX_ENV_FILE must contain a JSON object.')\n }\n const repoPayload = parsed.MOXT_REPO_PAYLOAD\n if (typeof repoPayload !== 'string' || repoPayload.trim().length === 0) {\n throw new RuntimeContextError('MOXT_REPO_PAYLOAD is missing from SANDBOX_ENV_FILE.')\n }\n return repoPayload.trim()\n}\n\nexport function parseRepoPayload(raw: string): RepoPayload {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n throw new RuntimeContextError(`MOXT_REPO_PAYLOAD must be valid JSON: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n if (!isRecord(parsed)) {\n throw new RuntimeContextError('MOXT_REPO_PAYLOAD must be a JSON object.')\n }\n\n const personal = parseRepoEntry(parsed.personal, 'personal')\n const teamsValue = parsed.teams\n if (!Array.isArray(teamsValue)) {\n throw new RuntimeContextError('MOXT_REPO_PAYLOAD.teams must be an array.')\n }\n const teams = teamsValue.map((entry, index) => parseRepoEntry(entry, `teams[${index}]`))\n const workspace = parsed.workspace == null ? null : parseRepoEntry(parsed.workspace, 'workspace')\n\n return { personal, teams, workspace }\n}\n\nexport function normalizeBaseApiHost(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) {\n throw new RuntimeContextError('BASE_API_HOST must not be empty.')\n }\n return trimmed.replace(/\\/+$/, '')\n}\n\nfunction hasAnySandboxEnv(env: NodeJS.ProcessEnv): boolean {\n return SANDBOX_ENV_KEYS.some((key) => readNonEmptyEnv(env, key) !== undefined)\n}\n\nfunction readRequiredEnv(env: NodeJS.ProcessEnv, key: string): string {\n const value = readNonEmptyEnv(env, key)\n if (!value) {\n throw new RuntimeContextError(`${key} is required.`)\n }\n return value\n}\n\nfunction readNonEmptyEnv(env: NodeJS.ProcessEnv, key: string): string | undefined {\n const value = env[key]\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nfunction parseRepoEntry(value: unknown, path: string): RepoEntry {\n if (!isRecord(value)) {\n throw new RuntimeContextError(`MOXT_REPO_PAYLOAD.${path} must be an object.`)\n }\n const repoId = readStringField(value, 'repoId', path)\n const name = readStringField(value, 'name', path)\n return { repoId, name }\n}\n\nfunction readStringField(record: Record<string, unknown>, field: string, path: string): string {\n const value = record[field]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new RuntimeContextError(`MOXT_REPO_PAYLOAD.${path}.${field} must be a non-empty string.`)\n }\n return value\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { RepoEntry, RepoPayload } from './runtime-context.js'\n\nexport interface ResolvedWorkspacePath {\n repoId: string\n repoName: string\n repoPath: string\n}\n\nexport class WorkspacePathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkspacePathError'\n }\n}\n\nexport function resolveWorkspacePath(repoPayload: RepoPayload, workspacePath: string): ResolvedWorkspacePath {\n const normalizedPath = normalizeWorkspacePath(workspacePath)\n const [repoName, ...repoPathParts] = normalizedPath.split('/')\n const repoEntries = listRepoEntries(repoPayload)\n const repo = repoEntries.find((entry) => entry.name === repoName)\n\n if (!repo) {\n throw new WorkspacePathError(`Workspace path must start with one of: ${repoEntries.map((entry) => entry.name).join(', ')}.`)\n }\n\n return {\n repoId: repo.repoId,\n repoName: repo.name,\n repoPath: repoPathParts.join('/'),\n }\n}\n\nexport function listRepoEntries(repoPayload: RepoPayload): RepoEntry[] {\n return [\n repoPayload.personal,\n ...repoPayload.teams,\n ...(repoPayload.workspace ? [repoPayload.workspace] : []),\n ]\n}\n\nfunction normalizeWorkspacePath(workspacePath: string): string {\n const trimmed = workspacePath.trim()\n if (!trimmed) {\n throw new WorkspacePathError('Workspace path must not be empty.')\n }\n if (trimmed.startsWith('/')) {\n throw new WorkspacePathError('Workspace path must be relative.')\n }\n\n const parts = trimmed.split('/').filter((part) => part.length > 0 && part !== '.')\n if (parts.length === 0) {\n throw new WorkspacePathError('Workspace path must include a repo name.')\n }\n if (parts.some((part) => part === '..')) {\n throw new WorkspacePathError('Workspace path must not contain \"..\".')\n }\n\n return parts.join('/')\n}\n","import { Command } from 'commander'\nimport { colors, print, printError } from '../utils/output.js'\nimport { resolveRuntimeContext, RuntimeContextError } from '../utils/runtime-context.js'\nimport { listRepoEntries } from '../utils/sandbox-path.js'\n\nexport function registerAuthCommand(program: Command): void {\n const auth = program.command('auth').description('Authentication utilities')\n\n auth.command('status')\n .description('Show CLI authentication mode')\n .action(() => {\n try {\n const context = resolveRuntimeContext()\n if (context.mode === 'sandbox') {\n print(`${colors.bold}Mode${colors.reset}: sandbox`)\n print(`${colors.bold}Workspace${colors.reset}: ${context.workspaceId}`)\n print(`${colors.bold}Base API${colors.reset}: ${context.baseApiHost}`)\n print(`${colors.bold}Repos${colors.reset}:`)\n for (const repo of listRepoEntries(context.repoPayload)) {\n print(` ${repo.name}\\t${repo.repoId}`)\n }\n return\n }\n\n print(`${colors.bold}Mode${colors.reset}: user`)\n print(`${colors.bold}Host${colors.reset}: ${context.host}`)\n } catch (error) {\n if (error instanceof RuntimeContextError) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n }\n })\n}\n","import * as fs from 'node:fs'\nimport { Command } from 'commander'\nimport {\n buildFileQueryString,\n isBinaryContent,\n resolveReadMode,\n resolveSpaceSelector,\n resolveWriteMode,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPost, httpPut } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport {\n resolveRuntimeContext,\n RuntimeContextError,\n SANDBOX_ENV_KEYS,\n type RuntimeContext,\n} from '../utils/runtime-context.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { SandboxApiError } from '../utils/sandbox-client.js'\nimport {\n MFS_FILE_SIZE_LIMIT_LABEL,\n MFS_FILE_SIZE_LIMIT_BYTES,\n readSandboxFile,\n SandboxFileError,\n type SandboxFileWritePolicy,\n writeSandboxFile,\n} from '../utils/sandbox-file.js'\nimport { parseSearchLimit, parseSearchMode } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\nimport { readWriteCommandContentOrExit } from '../utils/write-content.js'\n\ninterface FileEntry {\n name: string\n type: 'file' | 'directory'\n size: number | null\n}\n\ninterface FileReadResponse {\n path: string\n type: 'file' | 'directory'\n entries: FileEntry[] | null\n content: string | null\n}\n\ninterface FileWriteResponse {\n path: string\n created: boolean\n}\n\ninterface MkdirResponse {\n path: string\n created: boolean\n}\n\ninterface DeleteResponse {\n path: string\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FieldHighlight {\n text: string\n}\n\ninterface SemanticSnippet {\n content: string\n}\n\ninterface FileSearchItem {\n repoId: string\n fileId: string\n filePath: string\n rank: number\n contentHighlight?: FieldHighlight\n filePathHighlight?: FieldHighlight\n semanticSnippets: SemanticSnippet[]\n}\n\ninterface FileSearchResponse {\n items: FileSearchItem[]\n}\n\ninterface LocalTextFile {\n content: string\n}\n\nfunction addSpaceOptions(cmd: Command): Command {\n return cmd\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('File operations')\n\n addSpaceOptions(\n file.command('search')\n .description('Search files in accessible spaces')\n .argument('<query>', 'Search query')\n .option('-l, --limit <limit>', 'Maximum number of files to return', '30')\n .option('--mode <mode>', 'Keyword matching mode: any or all', 'any'),\n ).action(async (query: string, options: SpaceOptions & { limit?: string; mode?: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const limit = runOrExit(() => parseSearchLimit(options.limit, 30, 80))\n const mode = runOrExit(() => parseSearchMode(options.mode))\n\n startSpinner('Searching files...')\n const response = await httpPost<FileSearchResponse>(\n `/workspaces/${options.workspace}/files/search`,\n {\n query,\n limit,\n mode,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No files found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} file(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. ${item.filePath}${colors.reset}`)\n print(`${colors.dim}repo=${item.repoId} file=${item.fileId}${colors.reset}`)\n const snippet = item.contentHighlight?.text ?? item.semanticSnippets[0]?.content\n if (snippet) {\n print(snippet)\n }\n print('')\n }\n })\n\n addSpaceOptions(\n file.command('get-url')\n .description('Resolve the shareable browser URL for a file')\n .requiredOption('-p, --path <path>', 'File path'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Resolving URL...')\n const response = await httpGet<FileUrlResponse>(\n `/workspaces/${options.workspace}/files/url${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, response.data.path)\n print(`${colors.cyan}${response.data.url}${colors.reset}`)\n })\n\n addSpaceOptions(\n file.command('list')\n .description('List directory contents')\n .option('-p, --path <path>', 'Directory path', '/'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Listing files...')\n const response = await httpGet<FileReadResponse>(\n `/workspaces/${options.workspace}/files/list${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { path, entries } = response.data\n\n if (!entries || entries.length === 0) {\n stopSpinner(true, `${path}: empty directory`)\n return\n }\n\n stopSpinner(true, path)\n for (const entry of entries) {\n if (entry.type === 'directory') {\n print(`${colors.blue}${entry.name}/${colors.reset}`)\n } else {\n print(entry.name)\n }\n }\n })\n\n file.command('read')\n .description('Read file content')\n .argument('[workspacePath]', 'Workspace path in sandbox mode, e.g. personal/docs/readme.md')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .option('--json', 'Print sandbox file content and metadata as JSON')\n .action(async (\n workspacePath: string | undefined,\n options: Partial<SpaceOptions> & { path?: string; url?: string; json?: boolean },\n ) => {\n const sandboxRuntime = resolveSandboxRuntimeContextOrExit()\n if (sandboxRuntime) {\n if (options.url) {\n printError('--url cannot be used in sandbox mode')\n process.exit(1)\n }\n const path = workspacePath ?? options.path\n if (!path) {\n printError('Workspace path is required in sandbox mode')\n process.exit(1)\n }\n\n if (!options.json) startSpinner('Reading file...')\n try {\n const result = await readSandboxFile(sandboxRuntime, path)\n if (options.json) {\n print(JSON.stringify(result, null, 2))\n } else {\n stopSpinner(true, 'Done')\n print(result.content)\n }\n } catch (error) {\n handleSandboxFileError(error, path)\n }\n return\n }\n\n if (options.json) {\n printError('--json is only available for sandbox workspace paths')\n process.exit(1)\n }\n\n if (workspacePath && !options.path) {\n options.path = workspacePath\n }\n const mode = runOrExit(() => resolveReadMode(options))\n\n startSpinner('Reading file...')\n\n let response: { ok: boolean; status: number; data: FileReadResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpGet<FileReadResponse>(\n `/files/read-by-url?url=${encodeURIComponent(mode.url)}`,\n )\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n response = await httpGet<FileReadResponse>(\n `/workspaces/${mode.workspace}/files/read${qs}`,\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { type, content } = response.data\n\n if (type === 'directory') {\n stopSpinner(false, 'Failed')\n print(`${colors.red}☠ ${displayPath} is a directory${colors.reset}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Done')\n print(content ?? '')\n })\n\n file.command('put')\n .description('Upload a file')\n .argument('[workspacePath]', 'Workspace path in sandbox mode, e.g. personal/docs/readme.md')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'Remote file path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .requiredOption('-l, --local-path <localPath>', 'Local file path')\n .option('-r, --recursive', 'Create parent directories if needed')\n .action(\n async (\n workspacePath: string | undefined,\n options: Partial<SpaceOptions> & {\n path?: string\n url?: string\n localPath: string\n recursive?: boolean\n },\n ) => {\n const sandboxRuntime = resolveSandboxRuntimeContextOrExit()\n\n if (sandboxRuntime) {\n if (options.url) {\n printError('--url cannot be used in sandbox mode')\n process.exit(1)\n }\n const path = workspacePath ?? options.path\n if (!path) {\n printError('Workspace path is required in sandbox mode')\n process.exit(1)\n }\n const { content } = readLocalTextFileOrExit(options.localPath)\n\n startSpinner('Uploading...')\n try {\n const response = await writeSandboxFile(sandboxRuntime, path, content, {\n type: 'use-current-sha',\n })\n const action = response.created ? 'Created' : 'Updated'\n stopSpinner(true, `${action}: ${response.path}`)\n } catch (error) {\n handleSandboxFileError(error, path)\n }\n return\n }\n\n if (workspacePath && !options.path) {\n options.path = workspacePath\n }\n const mode = runOrExit(() => resolveWriteMode(options))\n const { content } = readLocalTextFileOrExit(options.localPath)\n\n startSpinner('Uploading...')\n\n let response: { ok: boolean; status: number; data: FileWriteResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpPut<FileWriteResponse>('/files/write-by-url', {\n url: mode.url,\n content,\n })\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n response = await httpPut<FileWriteResponse>(\n `/workspaces/${mode.workspace}/files/write`,\n {\n path: mode.path,\n content,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n if (mode.kind === 'by-url') {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n }\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Updated'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n file.command('write')\n .description('Write file content in sandbox mode')\n .argument('<workspacePath>', 'Workspace path, e.g. personal/docs/readme.md')\n .option('--content <content>', 'Text content to write')\n .option('--content-file <contentFile>', 'Local text file to write')\n .option('--stdin', 'Read text content from stdin (default)')\n .option('--base-sha <sha>', 'Write only if the remote file still has this SHA')\n .option('--force', 'Overwrite an existing remote file without a version condition')\n .action(async (\n workspacePath: string,\n options: {\n content?: string\n contentFile?: string\n stdin?: boolean\n baseSha?: string\n force?: boolean\n },\n ) => {\n const runtime = resolveSandboxRuntimeContextOrExit()\n if (!runtime) {\n printError('file write is only available in sandbox mode')\n process.exit(1)\n }\n\n const policy = resolveSandboxFileWritePolicyOrExit(options)\n const content = readWriteCommandContentOrExit(options, (path) => readLocalTextFileOrExit(path).content)\n startSpinner('Writing file...')\n try {\n const response = await writeSandboxFile(runtime, workspacePath, content, policy)\n const action = response.created ? 'Created' : 'Updated'\n stopSpinner(true, `${action}: ${response.path}`)\n } catch (error) {\n handleSandboxFileError(error, workspacePath)\n }\n })\n\n addSpaceOptions(\n file.command('mkdir')\n .description('Create a directory')\n .requiredOption('-p, --path <path>', 'Directory path')\n .option('-r, --recursive', 'Create parent directories if needed'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n recursive?: boolean\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Creating directory...')\n const response = await httpPost<MkdirResponse>(\n `/workspaces/${options.workspace}/files/mkdir`,\n {\n path: options.path,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Already exists'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('del')\n .description('Delete a file or empty directory')\n .requiredOption('-p, --path <path>', 'File or directory path'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Deleting...')\n const response = await httpDelete<DeleteResponse>(\n `/workspaces/${options.workspace}/files/delete`,\n {\n path: options.path,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Path not found: ${options.path}${colors.reset}`)\n } else if (response.status === 400) {\n print(`${colors.red}☠ Cannot delete non-empty directory${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, `Deleted: ${response.data.path}`)\n },\n )\n}\n\nfunction resolveSandboxFileWritePolicyOrExit(options: {\n baseSha?: string\n force?: boolean\n}): SandboxFileWritePolicy {\n if (options.baseSha && options.force) {\n printError('Only one of --base-sha or --force can be used')\n process.exit(1)\n }\n if (options.baseSha) {\n if (!/^[a-f0-9]{64}$/.test(options.baseSha)) {\n printError('--base-sha must be a lowercase SHA-256 hash')\n process.exit(1)\n }\n return { type: 'base-sha', sha: options.baseSha }\n }\n return options.force ? { type: 'force' } : { type: 'create-only' }\n}\n\nfunction resolveRuntimeContextOrExit(): RuntimeContext {\n try {\n return resolveRuntimeContext()\n } catch (error) {\n if (error instanceof RuntimeContextError) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n }\n}\n\nfunction resolveSandboxRuntimeContextOrExit(): Extract<RuntimeContext, { mode: 'sandbox' }> | undefined {\n // Keep user-mode file commands on their existing OpenAPI path when no sandbox env is present.\n if (!SANDBOX_ENV_KEYS.some((key) => (process.env[key] ?? '').trim().length > 0)) {\n return undefined\n }\n const context = resolveRuntimeContextOrExit()\n return context.mode === 'sandbox' ? context : undefined\n}\n\nfunction readLocalTextFileOrExit(localPath: string): LocalTextFile {\n if (!fs.existsSync(localPath)) {\n print(`${colors.red}☠ Local file not found: ${localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const stats = fs.statSync(localPath)\n if (!stats.isFile()) {\n print(`${colors.red}☠ Not a file: ${localPath}${colors.reset}`)\n process.exit(1)\n }\n\n if (stats.size > MFS_FILE_SIZE_LIMIT_BYTES) {\n print(`${colors.red}☠ File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const buffer = fs.readFileSync(localPath)\n if (isBinaryContent(buffer)) {\n print(`${colors.red}☠ Binary files are not allowed. Only text files can be uploaded.${colors.reset}`)\n process.exit(1)\n }\n\n return { content: buffer.toString('utf8') }\n}\n\nfunction handleSandboxFileError(error: unknown, displayPath: string): never {\n stopSpinner(false, 'Failed')\n if (error instanceof SandboxFileError) {\n if (error.code === 'not-found') {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else if (error.code === 'directory') {\n print(`${colors.red}☠ ${displayPath} is a directory${colors.reset}`)\n } else {\n printError(error.message)\n }\n process.exit(1)\n }\n if (error instanceof SandboxApiError) {\n printError(`Sandbox API error [${error.status}]: ${error.body}`)\n process.exit(1)\n }\n if (error instanceof Error) {\n printError(`Sandbox file operation failed: ${error.message}`)\n process.exit(1)\n }\n printError(`Sandbox file operation failed: ${String(error)}`)\n process.exit(1)\n}\n","/**\n * Pure logic for resolving file-command space selectors and building request URLs.\n *\n * These functions are extracted from commands/file.ts so they can be unit tested\n * without spawning the CLI or mocking process.exit. All error conditions are\n * surfaced as thrown Errors; action handlers are responsible for turning them\n * into user-facing output and exit codes.\n */\n\nexport interface SpaceOptions {\n workspace: string\n space?: string\n personal?: boolean\n teamSpaceId?: string\n teammateId?: string\n}\n\nexport interface SpaceParams {\n space?: string\n teamSpaceId?: string\n agentId?: number\n}\n\n/**\n * Error thrown when selector options violate a contract (mutually exclusive,\n * wrong format, etc). Action handlers catch this and print the message before\n * exiting with code 1.\n */\nexport class SpaceOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SpaceOptionsError'\n }\n}\n\n/**\n * Resolve mutually-exclusive space selector flags into normalized request params.\n *\n * Priority (only one must be set): --team-space-id > --teammate-id > --personal > -s <name>.\n * When none is set, returns empty params (server treats this as personal space).\n */\nexport function resolveSpaceSelector(options: SpaceOptions): SpaceParams {\n // Destructure first so TypeScript's control-flow analysis can narrow each\n // field through the subsequent non-null / non-empty checks without having\n // to re-read options.* at the point of use (which would lose narrowing).\n const { space, teamSpaceId, teammateId } = options\n const personalIsSet = options.personal === true\n\n // Count \"user-set\" selectors explicitly so the mutual-exclusion check\n // reflects intent (\"which flags did the user pass?\") rather than a\n // generic truthiness filter. This keeps the mutual-exclusion check\n // cleanly separated from the downstream format validation (e.g.\n // `parsed <= 0` for teammateId).\n const spaceIsSet = space != null && space !== ''\n const teamSpaceIdIsSet = teamSpaceId != null && teamSpaceId !== ''\n const teammateIdIsSet = teammateId != null && teammateId !== ''\n const selectorCount =\n (spaceIsSet ? 1 : 0) + (personalIsSet ? 1 : 0) + (teamSpaceIdIsSet ? 1 : 0) + (teammateIdIsSet ? 1 : 0)\n if (selectorCount > 1) {\n throw new SpaceOptionsError(\n 'Error: -s, --personal, --team-space-id, and --teammate-id are mutually exclusive.',\n )\n }\n\n // Dispatch via the underlying field checks (not `*IsSet`) so TypeScript\n // narrows each local to `string`, letting us return without `!`.\n if (teamSpaceId != null && teamSpaceId !== '') {\n return { teamSpaceId }\n }\n if (teammateId != null && teammateId !== '') {\n const parsed = Number.parseInt(teammateId, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== teammateId) {\n throw new SpaceOptionsError(\n `Error: --teammate-id must be a positive integer, got \"${teammateId}\".`,\n )\n }\n return { agentId: parsed }\n }\n if (personalIsSet) {\n return { space: 'personal' }\n }\n if (space != null && space !== '') {\n return { space }\n }\n return {}\n}\n\n/**\n * Build the `?path=...&space=...` query string for file endpoints.\n * Returns empty string when no params are set (caller should not append `?`).\n * Values are URL-encoded via URLSearchParams.\n *\n * An empty-string `path` is treated as \"not provided\" and omitted from the query;\n * callers should pass `undefined` rather than `\"\"` when no path is intended.\n */\nexport function buildFileQueryString(path: string | undefined, spaceParams: SpaceParams): string {\n const params = new URLSearchParams()\n if (path != null && path !== '') {\n params.set('path', path)\n }\n if (spaceParams.space) {\n params.set('space', spaceParams.space)\n }\n if (spaceParams.teamSpaceId) {\n params.set('teamSpaceId', spaceParams.teamSpaceId)\n }\n if (spaceParams.agentId != null) {\n params.set('agentId', String(spaceParams.agentId))\n }\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\n/**\n * Detect if a Buffer contains binary content by sampling the first 8192 bytes.\n * Control characters other than tab (9), LF (10), and CR (13) are treated as binary.\n */\nexport function isBinaryContent(buffer: Buffer): boolean {\n const sampleSize = Math.min(buffer.length, 8192)\n\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i]\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Validate `file read` command's top-level mutually-exclusive options (-u vs -w/-p).\n * Returns the resolved mode ('by-url' or 'by-path'). Throws SpaceOptionsError on conflict.\n *\n * Empty strings are treated as \"not provided\" (commander never passes empty strings\n * for optional flags, but callers outside the CLI context should pass undefined instead\n * of \"\" to avoid unexpected branch behaviour).\n */\nexport type ReadMode = { kind: 'by-url'; url: string } | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveReadMode(options: {\n url?: string\n workspace?: string\n path?: string\n}): ReadMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n // At this point both workspace and path are guaranteed non-empty by the guards\n // above. Use explicit checks so TypeScript narrows the types without needing `!`.\n if (!options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n return { kind: 'by-path', workspace: options.workspace, path: options.path }\n}\n\n/**\n * Validate `file put` command's top-level mutually-exclusive options (-u vs -w/-p).\n *\n * By-URL puts overwrite an existing file (the URL already identifies it), so\n * `--recursive` is meaningless in that mode and is rejected outright to keep the\n * user's intent unambiguous.\n */\nexport type WriteMode =\n | { kind: 'by-url'; url: string }\n | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveWriteMode(options: {\n url?: string\n workspace?: string\n path?: string\n recursive?: boolean\n}): WriteMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (options.url && options.recursive) {\n throw new SpaceOptionsError('Error: --recursive cannot be used with --url (the file must already exist)')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n return { kind: 'by-path', workspace: options.workspace!, path: options.path! }\n}\n","import { arch, platform } from 'os'\nimport { getApiBaseUrl, getApiKey } from './config.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport interface ApiResponse<T> {\n ok: boolean\n status: number\n data: T\n}\n\nexport interface RawApiResponse {\n ok: boolean\n status: number\n text: string\n contentType: string | null\n}\n\nfunction getUserAgent(): string {\n return `moxt-cli/${__CLI_VERSION__} (${platform()}/${arch()}) node/${process.versions.node}`\n}\n\nasync function fetchApi(method: string, path: string, body?: unknown): Promise<Response> {\n const apiKey = getApiKey()\n const url = `${getApiBaseUrl()}${path}`\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n 'User-Agent': getUserAgent(),\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n\n if (response.status === 401) {\n console.error('Authentication failed. Check your MOXT_API_KEY.')\n console.error('Get a new key at: https://moxt.ai')\n process.exit(1)\n }\n\n return response\n}\n\nasync function request<T>(method: string, path: string, body?: unknown): Promise<ApiResponse<T>> {\n const response = await fetchApi(method, path, body)\n const contentType = response.headers.get('content-type')\n const data = contentType?.includes('application/json') ? ((await response.json()) as T) : ((await response.text()) as T)\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n }\n}\n\nexport async function httpGet<T>(path: string): Promise<ApiResponse<T>> {\n return request<T>('GET', path)\n}\n\nexport async function httpPut<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PUT', path, body)\n}\n\nexport async function httpPost<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('POST', path, body)\n}\n\nexport async function httpDelete<T>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return request<T>('DELETE', path, body)\n}\n\nexport async function httpRaw(method: 'GET' | 'POST' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<RawApiResponse> {\n const response = await fetchApi(method, path, body)\n return {\n ok: response.ok,\n status: response.status,\n text: await response.text(),\n contentType: response.headers.get('content-type'),\n }\n}\n","const DEFAULT_HOST = 'api.moxt.ai'\n\nexport function getApiBaseUrl(): string {\n const host = process.env.MOXT_HOST ?? DEFAULT_HOST\n return `https://${host}/openapi/v1`\n}\n\nexport function getApiKey(): string {\n const apiKey = process.env.MOXT_API_KEY\n\n if (!apiKey) {\n console.error('MOXT_API_KEY environment variable is not set.')\n console.error('')\n console.error('Get your API key at: https://moxt.ai')\n console.error('')\n console.error('Then set it:')\n console.error(' export MOXT_API_KEY=moxt_...')\n process.exit(1)\n }\n\n return apiKey\n}\n\nexport function getApiKeyOrUndefined(): string | undefined {\n return process.env.MOXT_API_KEY\n}\n","export class SearchOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SearchOptionsError'\n }\n}\n\nexport function parseSearchLimit(raw: string | undefined, defaultValue: number, max: number): number {\n if (raw == null || raw === '') {\n return defaultValue\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --limit must be a positive integer, got \"${raw}\".`)\n }\n if (parsed > max) {\n throw new SearchOptionsError(`Error: --limit must be less than or equal to ${max}.`)\n }\n return parsed\n}\n\nexport function parseSearchMode(raw: string | undefined): 'all' | 'any' {\n if (raw == null || raw === '') {\n return 'any'\n }\n if (raw === 'all' || raw === 'any') {\n return raw\n }\n throw new SearchOptionsError(`Error: --mode must be \"any\" or \"all\", got \"${raw}\".`)\n}\n\nexport function parseTeammateId(raw: string | undefined): number | undefined {\n if (raw == null || raw === '') {\n return undefined\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --teammate-id must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n","import { SpaceOptionsError } from './file-selector.js'\nimport { printError } from './output.js'\nimport { SearchOptionsError } from './search-options.js'\n\n/**\n * Call a pure resolver that may throw a known CLI option error; on error,\n * print the message and exit(1). This keeps the user-facing contract\n * (stderr + exit code 1) consistent across subcommands while letting the\n * resolvers stay pure and unit-testable.\n */\nexport function runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n","import type { SandboxRuntimeContext } from './runtime-context.js'\n\nexport interface SandboxApiResponse<T> {\n status: number\n data: T\n}\n\nexport interface SandboxApiRequestOptions {\n timeoutMs?: number\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000\n\nexport class SandboxApiError extends Error {\n readonly status: number\n readonly body: string\n\n constructor(status: number, body: string) {\n super(`Sandbox API request failed with ${status}: ${body}`)\n this.name = 'SandboxApiError'\n this.status = status\n this.body = body\n }\n}\n\nexport class SandboxMoxtClient {\n constructor(private readonly context: SandboxRuntimeContext) {}\n\n async request<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown,\n options: SandboxApiRequestOptions = {},\n ): Promise<SandboxApiResponse<T>> {\n const signal = AbortSignal.timeout(options.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n const response = await fetch(`${this.context.baseApiHost}${path}`, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.context.sandboxToolApiToken}`,\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n signal,\n })\n\n const contentType = response.headers.get('content-type')\n const data = contentType?.includes('application/json') ? ((await response.json()) as T) : ((await response.text()) as T)\n\n if (!response.ok) {\n throw new SandboxApiError(response.status, typeof data === 'string' ? data : JSON.stringify(data))\n }\n\n return {\n status: response.status,\n data,\n }\n }\n}\n","import { createHash } from 'node:crypto'\nimport { SandboxMoxtClient } from './sandbox-client.js'\nimport type { PresignUrlsResponse } from './sandbox-mfs-types.js'\nimport type { SandboxRuntimeContext } from './runtime-context.js'\nimport { resolveWorkspacePath } from './sandbox-path.js'\n\nconst MFS_FILE_TYPE_REGULAR = 1\nexport const MFS_FILE_SIZE_LIMIT_BYTES = 10 * 1024 * 1024\nexport const MFS_FILE_SIZE_LIMIT_LABEL = `${MFS_FILE_SIZE_LIMIT_BYTES / (1024 * 1024)}MB`\n\ninterface UnifiedPushResponse {\n repoVersions: Record<string, number>\n fileMap: Record<string, Record<string, string>>\n}\n\ninterface SandboxResolvedFilePath {\n repoId: string\n repoName: string\n repoPath: string\n}\n\ninterface RepoTreeEntry {\n path: string\n type: 'blob' | 'tree'\n size: number | null\n sha: string | null\n fileId: string | null\n fileType: number | null\n}\n\ninterface RepoTreeResponse {\n sha: string\n entries: RepoTreeEntry[]\n}\n\nexport interface SandboxFileReadResult {\n path: string\n content: string\n sha: string\n size: number\n fileId: string | null\n fileType: number | null\n}\n\nexport type SandboxFileWritePolicy =\n | { type: 'base-sha'; sha: string }\n | { type: 'create-only' }\n | { type: 'force' }\n | { type: 'use-current-sha' }\n\nexport class SandboxFileError extends Error {\n constructor(\n message: string,\n readonly code: 'not-found' | 'directory' | 'invalid-path' | 'remote' | 'too-large' | 'conflict',\n ) {\n super(message)\n this.name = 'SandboxFileError'\n }\n}\n\nexport async function readSandboxFile(\n context: SandboxRuntimeContext,\n workspacePath: string,\n): Promise<SandboxFileReadResult> {\n const resolved = resolveSandboxFilePath(context, workspacePath)\n const tree = await fetchRepoTree(context, resolved)\n const entry = findTreeEntry(tree, resolved)\n if (!entry) {\n throw new SandboxFileError(`${workspacePath} does not exist`, 'not-found')\n }\n if (entry.type === 'tree') {\n throw new SandboxFileError(`${workspacePath} is a directory`, 'directory')\n }\n if (!entry.sha) {\n throw new SandboxFileError(`${workspacePath} does not have downloadable content`, 'remote')\n }\n if (entry.size !== null && entry.size > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxFileError(`File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${workspacePath}`, 'too-large')\n }\n\n const client = new SandboxMoxtClient(context)\n const presign = await client.request<PresignUrlsResponse>(\n 'POST',\n `/agent/api/pipeline-sandbox/mfs/${encodeURIComponent(resolved.repoId)}/presign-download`,\n { hashes: [entry.sha] },\n )\n const url = presign.data.urls[entry.sha]\n if (!url) {\n throw new SandboxFileError(`No download URL returned for ${workspacePath}`, 'remote')\n }\n\n const response = await fetch(url)\n if (!response.ok) {\n throw new SandboxFileError(`Download failed [${response.status}]`, 'remote')\n }\n const content = await response.text()\n const data = Buffer.from(content, 'utf8')\n if (data.length > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxFileError(`File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${workspacePath}`, 'too-large')\n }\n const actualSha = createHash('sha256').update(data).digest('hex')\n if (actualSha !== entry.sha) {\n throw new SandboxFileError(`Downloaded content hash mismatch: ${workspacePath}`, 'remote')\n }\n return {\n path: workspacePath,\n content,\n sha: entry.sha,\n size: data.length,\n fileId: entry.fileId,\n fileType: entry.fileType,\n }\n}\n\nexport async function writeSandboxFile(\n context: SandboxRuntimeContext,\n workspacePath: string,\n content: string,\n policy: SandboxFileWritePolicy,\n): Promise<{ path: string; created: boolean }> {\n const data = Buffer.from(content, 'utf8')\n if (data.length > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxFileError(`File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${workspacePath}`, 'too-large')\n }\n\n const resolved = resolveSandboxFilePath(context, workspacePath)\n const tree = await fetchRepoTree(context, resolved)\n const existing = findTreeEntry(tree, resolved)\n if (existing?.type === 'tree') {\n throw new SandboxFileError(`${workspacePath} is a directory`, 'directory')\n }\n if (existing && !existing.sha) {\n throw new SandboxFileError(`${workspacePath} does not have base content hash`, 'remote')\n }\n const baseContentHash = resolveBaseContentHash(workspacePath, existing, policy)\n\n const contentHash = createHash('sha256').update(data).digest('hex')\n const client = new SandboxMoxtClient(context)\n const presign = await client.request<PresignUrlsResponse>(\n 'POST',\n `/agent/api/pipeline-sandbox/mfs/${encodeURIComponent(resolved.repoId)}/presign-upload`,\n { hashes: [contentHash] },\n )\n const uploadUrl = presign.data.urls[contentHash]\n if (!uploadUrl) {\n throw new SandboxFileError(`No upload URL returned for ${workspacePath}`, 'remote')\n }\n\n const upload = await fetch(uploadUrl, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/octet-stream' },\n body: new Uint8Array(data),\n })\n if (!upload.ok) {\n throw new SandboxFileError(`Upload failed [${upload.status}]`, 'remote')\n }\n\n const action = existing ? 'update' : 'create'\n await client.request<UnifiedPushResponse>(\n 'POST',\n '/agent/api/pipeline-sandbox/mfs-workspace/unified-push',\n {\n message: `moxt file write ${workspacePath}`,\n repoPushes: [\n {\n repoId: resolved.repoId,\n changes: [\n {\n action,\n ...(existing?.fileId ? { fileId: existing.fileId } : {}),\n path: resolved.repoPath,\n contentHash,\n ...(baseContentHash ? { baseContentHash } : {}),\n size: data.length,\n fileType: MFS_FILE_TYPE_REGULAR,\n },\n ],\n },\n ],\n crossRepoMoves: [],\n },\n )\n\n return { path: workspacePath, created: !existing }\n}\n\nfunction resolveBaseContentHash(\n workspacePath: string,\n existing: RepoTreeEntry | undefined,\n policy: SandboxFileWritePolicy,\n): string | undefined {\n if (policy.type === 'force') return undefined\n if (policy.type === 'use-current-sha') return existing?.sha ?? undefined\n if (policy.type === 'create-only') {\n if (!existing) return undefined\n throw new SandboxFileError(\n `Existing file requires --base-sha or --force: ${workspacePath} (actual ${existing.sha})`,\n 'conflict',\n )\n }\n if (existing?.sha === policy.sha) return policy.sha\n throw new SandboxFileError(\n `File version conflict: ${workspacePath} (expected ${policy.sha}, actual ${existing?.sha ?? 'missing'})`,\n 'conflict',\n )\n}\n\nfunction resolveSandboxFilePath(context: SandboxRuntimeContext, workspacePath: string): SandboxResolvedFilePath {\n let resolved: SandboxResolvedFilePath\n try {\n resolved = resolveWorkspacePath(context.repoPayload, workspacePath)\n } catch (error) {\n throw new SandboxFileError(error instanceof Error ? error.message : String(error), 'invalid-path')\n }\n if (!resolved.repoPath) {\n throw new SandboxFileError(`${workspacePath} is a directory`, 'directory')\n }\n return resolved\n}\n\nasync function fetchRepoTree(\n context: SandboxRuntimeContext,\n resolved: SandboxResolvedFilePath,\n): Promise<RepoTreeResponse> {\n const client = new SandboxMoxtClient(context)\n const params = new URLSearchParams({ entryFilter: 'paths', path: resolved.repoPath })\n const response = await client.request<RepoTreeResponse>(\n 'GET',\n `/agent/api/pipeline-sandbox/mfs/${encodeURIComponent(resolved.repoId)}/tree?${params.toString()}`,\n )\n return response.data\n}\n\nfunction findTreeEntry(tree: RepoTreeResponse, resolved: SandboxResolvedFilePath): RepoTreeEntry | undefined {\n return tree.entries.find((entry) => entry.path === resolved.repoPath)\n}\n","const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nlet intervalId: ReturnType<typeof setInterval> | null = null\nlet frameIndex = 0\n\nexport function startSpinner(message: string): void {\n frameIndex = 0\n process.stdout.write(`${frames[frameIndex]} ${message}`)\n\n intervalId = setInterval(() => {\n frameIndex = (frameIndex + 1) % frames.length\n process.stdout.write(`\\r${frames[frameIndex]} ${message}`)\n }, 80)\n}\n\nexport function stopSpinner(success: boolean, message?: string): void {\n if (intervalId) {\n clearInterval(intervalId)\n intervalId = null\n }\n\n const symbol = success ? '\\x1b[32m✓\\x1b[0m' : '\\x1b[31m✗\\x1b[0m'\n // \\x1b[2K 清除整行,\\r 回到行首\n process.stdout.write(`\\x1b[2K\\r${symbol} ${message ?? ''}\\n`)\n}\n","import * as fs from 'node:fs'\nimport { printError } from './output.js'\n\nexport function readWriteCommandContentOrExit(\n options: { content?: string; contentFile?: string; stdin?: boolean },\n readContentFile: (path: string) => string,\n readStdin: () => string = () => fs.readFileSync(0, 'utf8'),\n): string {\n const inputModes = [options.content !== undefined, options.contentFile !== undefined, options.stdin === true].filter(Boolean)\n if (inputModes.length > 1) {\n printError('Only one of --content, --content-file, or --stdin can be used')\n process.exit(1)\n }\n if (options.content !== undefined) {\n return options.content\n }\n if (options.contentFile !== undefined) {\n return readContentFile(options.contentFile)\n }\n return readStdin()\n}\n","import { Command } from 'commander'\nimport { httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseTeammateId } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface MemorySearchItem {\n rank: number\n pipelineId: string\n chunkId: string\n chunkIndex: number\n content: string\n contentTruncated: boolean\n}\n\ninterface MemorySearchResponse {\n items: MemorySearchItem[]\n}\n\nexport function registerMemoryCommand(program: Command): void {\n const memory = program.command('memory').description('Memory operations')\n\n memory.command('search')\n .description('Search archived agent memory')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('--teammate-id <teammateId>', 'Search a managed AI teammate memory')\n .option('-l, --limit <limit>', 'Maximum number of memory chunks to return', '5')\n .argument('<query>', 'Search query')\n .action(\n async (\n query: string,\n options: {\n workspace: string\n teammateId?: string\n limit?: string\n },\n ) => {\n const limit = runOrExit(() => parseSearchLimit(options.limit, 5, 10))\n const teammateId = runOrExit(() => parseTeammateId(options.teammateId))\n\n startSpinner('Searching memory...')\n const response = await httpPost<MemorySearchResponse>(\n `/workspaces/${options.workspace}/memory/search`,\n {\n query,\n limit,\n ...(teammateId !== undefined ? { agentId: teammateId } : {}),\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No memory found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} memory chunk(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. pipeline=${item.pipelineId} chunk=${item.chunkIndex}${colors.reset}`)\n print(`${colors.dim}chunkId=${item.chunkId}${item.contentTruncated ? ' truncated=true' : ''}${colors.reset}`)\n print(item.content)\n print('')\n }\n },\n )\n}\n","export class MiniappDbOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MiniappDbOptionsError'\n }\n}\n\nconst NON_FILTER_QUERY_PARAMS = new Set([\n 'select',\n 'order',\n 'limit',\n 'offset',\n 'range',\n 'range-unit',\n])\n\nconst ALLOWED_MINIAPP_DB_EMAIL_DOMAINS = ['@paraflow.com', '@moxt.ai', '@kanyun.com']\n\nexport function normalizePostgrestPath(path: string): string {\n const trimmed = path.trim()\n if (!trimmed) {\n throw new MiniappDbOptionsError('Error: PostgREST path is required.')\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\nexport function buildMiniappDbDataPath(workspaceId: string, appId: string, postgrestPath: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/data${normalizePostgrestPath(postgrestPath)}`\n}\n\nexport function buildMiniappDbSchemaPath(workspaceId: string, appId: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/schema`\n}\n\nexport function parseJsonBody(raw: string): unknown {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new MiniappDbOptionsError(`Error: --body must be valid JSON. ${detail}`)\n }\n\n if (parsed === null || (typeof parsed !== 'object' && !Array.isArray(parsed))) {\n throw new MiniappDbOptionsError('Error: --body must be a JSON object or array.')\n }\n return parsed\n}\n\nexport function hasPostgrestFilter(postgrestPath: string): boolean {\n const normalizedPath = normalizePostgrestPath(postgrestPath)\n const parsed = new URL(normalizedPath, 'https://postgrest.local')\n for (const [name] of parsed.searchParams.entries()) {\n if (!NON_FILTER_QUERY_PARAMS.has(name.toLowerCase())) {\n return true\n }\n }\n return false\n}\n\nexport function assertPostgrestFilter(postgrestPath: string, method: 'PATCH' | 'DELETE'): void {\n if (!hasPostgrestFilter(postgrestPath)) {\n throw new MiniappDbOptionsError(\n `Error: ${method.toLowerCase()} requires at least one PostgREST filter query parameter.`,\n )\n }\n}\n\nexport function formatRawResponse(text: string, pretty?: boolean): string {\n if (!pretty || !text) {\n return text\n }\n try {\n return JSON.stringify(JSON.parse(text), null, 2)\n } catch {\n return text\n }\n}\n\nexport function isAllowedMiniappDbUserEmail(email: string): boolean {\n const normalized = email.trim().toLowerCase()\n return ALLOWED_MINIAPP_DB_EMAIL_DOMAINS.some((domain) => normalized.endsWith(domain))\n}\n","import { Command } from 'commander'\nimport {\n assertPostgrestFilter,\n buildMiniappDbDataPath,\n buildMiniappDbSchemaPath,\n formatRawResponse,\n isAllowedMiniappDbUserEmail,\n MiniappDbOptionsError,\n parseJsonBody,\n} from '../utils/miniapp-db.js'\nimport { httpGet, httpRaw } from '../utils/http.js'\nimport { print, printError } from '../utils/output.js'\n\ninterface MiniappDbOptions {\n workspace: string\n appId: string\n pretty?: boolean\n body?: string\n yes?: boolean\n}\n\ninterface MiniappDbSchemaResponse {\n sql: string\n}\n\ninterface WhoamiResponse {\n email: string\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof MiniappDbOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addMiniappDbTargetOptions(command: Command): Command {\n return command\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .requiredOption('--app-id <appId>', 'Miniapp app ID')\n}\n\nfunction handleRawResponse(response: Awaited<ReturnType<typeof httpRaw>>, pretty?: boolean): void {\n if (!response.ok) {\n printError(`Error [${response.status}]: ${response.text}`)\n process.exit(1)\n }\n print(formatRawResponse(response.text, pretty))\n}\n\nasync function ensureAllowedMiniappDbUser(): Promise<void> {\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (!isAllowedMiniappDbUserEmail(response.data.email)) {\n printError('Error: miniapp db commands are only available to @paraflow.com, @moxt.ai, or @kanyun.com users.')\n process.exit(1)\n }\n}\n\nasync function requestDataApi(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n postgrestPath: string,\n options: MiniappDbOptions,\n body?: unknown,\n): Promise<void> {\n await ensureAllowedMiniappDbUser()\n const path = buildMiniappDbDataPath(options.workspace, options.appId, postgrestPath)\n const response = await httpRaw(method, path, body)\n handleRawResponse(response, options.pretty)\n}\n\nexport function registerMiniappCommand(program: Command): void {\n const miniapp = program.command('miniapp', { hidden: true }).description('Miniapp operations')\n const db = miniapp.command('db').description('Miniapp database operations')\n\n addMiniappDbTargetOptions(\n db.command('schema').description('Print the miniapp database schema SQL'),\n ).action(async (options: MiniappDbOptions) => {\n await ensureAllowedMiniappDbUser()\n const response = await httpGet<MiniappDbSchemaResponse>(buildMiniappDbSchemaPath(options.workspace, options.appId))\n\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n print(response.data.sql)\n })\n\n addMiniappDbTargetOptions(\n db.command('get')\n .description('Read miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos?select=*')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n await requestDataApi('GET', postgrestPath, options)\n })\n\n addMiniappDbTargetOptions(\n db.command('post')\n .description('Create miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('POST', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('patch')\n .description('Update miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'PATCH'))\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('PATCH', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('delete')\n .description('Delete miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .option('--yes', 'Confirm the delete operation')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n if (options.yes !== true) {\n printError('Error: delete requires --yes.')\n process.exit(1)\n }\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'DELETE'))\n await requestDataApi('DELETE', postgrestPath, options)\n })\n}\n","import { isAbsolute } from 'node:path'\nimport { Command, Option } from 'commander'\nimport { print, printError } from '../utils/output.js'\nimport { resolveRuntimeContext, RuntimeContextError, type SandboxRuntimeContext } from '../utils/runtime-context.js'\nimport { pullSandboxWorkspace } from '../utils/sandbox-pull.js'\nimport { loadCheckoutState, type CheckoutState } from '../utils/checkout-state.js'\nimport { listRepoEntries } from '../utils/sandbox-path.js'\n\ninterface PullCommandOptions {\n all?: boolean\n dir?: string\n force?: boolean\n scope: string[]\n}\n\ninterface PullInvocation {\n scopes?: string[]\n targetDir: string\n}\n\nexport function registerPullCommand(program: Command): void {\n program\n .command('pull')\n .description('Pull workspace files into the local checkout')\n .argument('[workspacePath]', 'Workspace file or directory to pull')\n .option('--all', 'Pull the entire workspace')\n .option('--force', 'Overwrite changed local files')\n .addOption(new Option('--dir <dir>').hideHelp())\n .addOption(new Option('--scope <workspacePath>').argParser(collectScope).default([]).hideHelp())\n .action(async (workspacePath: string | undefined, options: PullCommandOptions) => {\n const context = resolveSandboxRuntimeContextOrExit()\n\n try {\n const invocation = await resolvePullInvocation(context, workspacePath, options)\n const result = await pullSandboxWorkspace(context, invocation.targetDir, {\n force: Boolean(options.force),\n scopes: invocation.scopes,\n })\n print(`Pulled ${result.fileCount} ${result.fileCount === 1 ? 'file' : 'files'} to ${result.targetDir}`)\n } catch (error) {\n handlePullError(error)\n }\n })\n}\n\nasync function resolvePullInvocation(\n context: SandboxRuntimeContext,\n argument: string | undefined,\n options: PullCommandOptions,\n): Promise<PullInvocation> {\n const legacyTargetDir = argument && isLegacyTargetDirectory(argument) ? argument : undefined\n const workspacePath = legacyTargetDir ? undefined : argument\n if (workspacePath && options.all) {\n throw new Error('Specify either a workspace path or --all, not both')\n }\n if (options.scope.length > 0 && (workspacePath || options.all)) {\n throw new Error('Legacy --scope cannot be combined with a workspace path or --all')\n }\n if (legacyTargetDir && options.dir) {\n throw new Error('Specify the local checkout directory only once')\n }\n\n const state = await loadCheckoutState()\n if (state) validateCheckoutStateContext(state, context)\n const targetDir = options.dir ?? legacyTargetDir ?? state?.checkoutRoot ?? '.'\n\n if (options.all || (legacyTargetDir && options.scope.length === 0)) {\n return { targetDir }\n }\n if (workspacePath) return { targetDir, scopes: [workspacePath] }\n if (options.scope.length > 0) return { targetDir, scopes: options.scope }\n if (!state || state.checkedOutScopes.length === 0) {\n throw new Error('Checkout is not initialized. Run moxt pull <workspace-path> or moxt pull --all first.')\n }\n return {\n targetDir: state.checkoutRoot,\n scopes: state.mode === 'full' ? undefined : state.checkedOutScopes,\n }\n}\n\nfunction isLegacyTargetDirectory(value: string): boolean {\n return value === '.' || value.startsWith('./') || value.startsWith('../') || isAbsolute(value)\n}\n\nfunction validateCheckoutStateContext(state: CheckoutState, context: SandboxRuntimeContext): void {\n if (state.workspaceId !== context.workspaceId) {\n throw new Error(`Checkout state belongs to workspace ${state.workspaceId}, not ${context.workspaceId}`)\n }\n const currentRepos = new Map(listRepoEntries(context.repoPayload).map((repo) => [repo.repoId, repo.name]))\n for (const [repoId, repo] of Object.entries(state.repos)) {\n const currentName = currentRepos.get(repoId)\n if (!currentName) throw new Error(`Checkout state contains unknown repo: ${repoId}`)\n if (currentName !== repo.name) {\n throw new Error(`Checkout state repo name does not match current workspace: ${repo.name}`)\n }\n }\n}\n\nfunction collectScope(value: string, previous: string[]): string[] {\n return [...previous, value]\n}\n\nfunction resolveSandboxRuntimeContextOrExit(): SandboxRuntimeContext {\n let context\n try {\n context = resolveRuntimeContext()\n } catch (error) {\n if (error instanceof RuntimeContextError) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n }\n\n if (context.mode !== 'sandbox') {\n printError('moxt pull is only available in sandbox mode')\n process.exit(1)\n }\n return context\n}\n\nfunction handlePullError(error: unknown): never {\n if (error instanceof Error) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n}\n","import { createHash } from 'node:crypto'\nimport { lstat, mkdir, readFile, rm, writeFile } from 'node:fs/promises'\nimport { dirname, isAbsolute, relative, resolve } from 'node:path'\nimport { loadCheckoutState, saveCheckoutState, type CheckoutState, type CheckoutStateFile } from './checkout-state.js'\nimport { SandboxMoxtClient } from './sandbox-client.js'\nimport type { BatchTreesResponse, MfsTreeEntry, PresignUrlsResponse } from './sandbox-mfs-types.js'\nimport type { RepoEntry, SandboxRuntimeContext } from './runtime-context.js'\nimport { listRepoEntries, resolveWorkspacePath } from './sandbox-path.js'\nimport { MFS_FILE_SIZE_LIMIT_BYTES, MFS_FILE_SIZE_LIMIT_LABEL } from './sandbox-file.js'\n\nexport interface PullSandboxWorkspaceOptions {\n force?: boolean\n scopes?: string[]\n}\n\nexport interface PullSandboxWorkspaceResult {\n fileCount: number\n targetDir: string\n}\n\ninterface PullSelection {\n mode: 'partial' | 'full'\n scopes: string[]\n repos: RepoEntry[]\n}\n\ninterface RepoTreeResponse {\n sha: string\n entries: Array<Omit<MfsTreeEntry, 'repoId' | 'prefixedPath'>>\n}\n\ntype RepoTreeFilter = { type: 'all' } | { type: 'paths'; paths: string[] }\n\ninterface BuildNextCheckoutStateInput {\n context: SandboxRuntimeContext\n checkoutRoot: string\n allRepos: RepoEntry[]\n selection: PullSelection\n previousState: CheckoutState | undefined\n pulledRepos: CheckoutState['repos']\n pulledFiles: CheckoutState['files']\n}\n\ninterface PlannedBlobEntry {\n entry: MfsTreeEntry\n localPath: string\n shouldWrite: boolean\n}\n\ninterface PlannedDeletion {\n localPath: string\n}\n\nexport class SandboxPullError extends Error {\n constructor(\n message: string,\n readonly code: 'invalid-path' | 'directory-conflict' | 'file-conflict' | 'remote' | 'too-large',\n ) {\n super(message)\n this.name = 'SandboxPullError'\n }\n}\n\nexport async function pullSandboxWorkspace(\n context: SandboxRuntimeContext,\n targetDir: string,\n options: PullSandboxWorkspaceOptions = {},\n): Promise<PullSandboxWorkspaceResult> {\n const resolvedTargetDir = resolve(targetDir)\n const repos = listRepoEntries(context.repoPayload)\n const previousState = await loadCheckoutState()\n const compatibleState = resolveCompatibleState(previousState, context, resolvedTargetDir, repos)\n const previousFiles = compatibleState?.files ?? {}\n const selection = resolvePullSelection(context, options.scopes)\n const repoById = new Map(selection.repos.map((repo) => [repo.repoId, repo]))\n const tree = await fetchWorkspaceTree(context, selection)\n const stateRepos = resolveStateRepos(tree, selection.repos)\n const entries = [...tree.entries].sort((a, b) => a.prefixedPath.localeCompare(b.prefixedPath))\n\n const directoryPaths = selection.repos.map((repo) => ({\n workspacePath: repo.name,\n localPath: resolveSafeLocalPath(resolvedTargetDir, repo.name, ''),\n }))\n const blobEntries: Array<{ entry: MfsTreeEntry; localPath: string }> = []\n const remoteBlobPaths = new Set<string>()\n const remotePaths = new Set<string>()\n const matchedScopes = new Set<string>()\n for (const entry of entries) {\n const repo = repoById.get(entry.repoId)\n if (!repo) {\n throw new SandboxPullError(`Remote tree returned unknown repo: ${entry.repoId}`, 'remote')\n }\n\n const expectedWorkspacePath = entry.path ? `${repo.name}/${entry.path}` : repo.name\n if (entry.prefixedPath !== expectedWorkspacePath) {\n throw new SandboxPullError(`Remote tree returned inconsistent path: ${entry.prefixedPath}`, 'remote')\n }\n if (remotePaths.has(expectedWorkspacePath)) {\n throw new SandboxPullError(`Remote tree returned duplicate path: ${expectedWorkspacePath}`, 'remote')\n }\n remotePaths.add(expectedWorkspacePath)\n const localPath = resolveSafeLocalPath(resolvedTargetDir, repo.name, entry.path)\n\n for (const scope of selection.scopes) {\n if (pathIsIncluded(scope, expectedWorkspacePath)) matchedScopes.add(scope)\n }\n if (!selection.scopes.some((scope) => pathsIntersect(scope, expectedWorkspacePath))) continue\n\n if (entry.type === 'tree') {\n directoryPaths.push({ workspacePath: entry.prefixedPath, localPath })\n continue\n }\n\n if (!entry.sha) {\n throw new SandboxPullError(`${entry.prefixedPath} does not have downloadable content`, 'remote')\n }\n if (entry.fileId !== null && (typeof entry.fileId !== 'string' || entry.fileId.length === 0)) {\n throw new SandboxPullError(`${entry.prefixedPath} has invalid file metadata`, 'remote')\n }\n if (entry.fileType !== null && (!Number.isInteger(entry.fileType) || entry.fileType < 0)) {\n throw new SandboxPullError(`${entry.prefixedPath} has invalid file metadata`, 'remote')\n }\n if (entry.size !== null && (!Number.isInteger(entry.size) || entry.size < 0)) {\n throw new SandboxPullError(`${entry.prefixedPath} has invalid file metadata`, 'remote')\n }\n if (entry.size !== null && entry.size > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxPullError(`File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${entry.prefixedPath}`, 'too-large')\n }\n remoteBlobPaths.add(entry.prefixedPath)\n blobEntries.push({ entry, localPath })\n }\n if (selection.mode === 'partial') {\n for (const scope of selection.scopes) {\n const repoRoot = selection.repos.some((repo) => repo.name === scope)\n const previouslyTracked = Object.keys(previousFiles).some((workspacePath) => pathIsIncluded(scope, workspacePath))\n if (!repoRoot && !matchedScopes.has(scope) && !previouslyTracked) {\n throw new SandboxPullError(`Workspace path does not exist: ${scope}`, 'invalid-path')\n }\n }\n }\n\n const plannedBlobs: PlannedBlobEntry[] = []\n for (const { entry, localPath } of blobEntries) {\n plannedBlobs.push({\n entry,\n localPath,\n shouldWrite: await shouldWritePulledFile(\n localPath,\n requireBlobSha(entry),\n entry.prefixedPath,\n previousFiles[entry.prefixedPath],\n Boolean(options.force),\n ),\n })\n }\n const plannedDeletions = await planRemoteDeletions(\n compatibleState,\n selection,\n resolvedTargetDir,\n remoteBlobPaths,\n Boolean(options.force),\n )\n for (const directory of directoryPaths) {\n await assertCanCreateDirectory(directory.localPath, directory.workspacePath)\n }\n\n const blobsToDownload = plannedBlobs.filter((planned) => planned.shouldWrite)\n const downloadUrls = await presignDownloads(context, blobsToDownload.map(({ entry }) => entry))\n const downloadedEntries: Array<PlannedBlobEntry & { content: Buffer }> = []\n for (const planned of blobsToDownload) {\n const { entry, localPath } = planned\n const remoteContent = await downloadBlob(entry, downloadUrls)\n downloadedEntries.push({ ...planned, content: remoteContent })\n }\n\n for (const deletion of plannedDeletions) {\n await rm(deletion.localPath)\n }\n for (const directory of directoryPaths) {\n await mkdir(directory.localPath, { recursive: true })\n }\n for (const downloaded of downloadedEntries) {\n await writePulledFile(downloaded.localPath, downloaded.content)\n }\n const downloadedContentByPath = new Map(\n downloadedEntries.map(({ entry, content }) => [entry.prefixedPath, content] as const),\n )\n const pulledFiles: CheckoutState['files'] = Object.fromEntries(await Promise.all(plannedBlobs.map(async ({ entry, localPath }) => {\n const content = downloadedContentByPath.get(entry.prefixedPath)\n return [\n entry.prefixedPath,\n {\n repoId: entry.repoId,\n repoPath: entry.path,\n fileId: entry.fileId,\n sha: requireBlobSha(entry),\n size:\n content?.length ??\n entry.size ??\n previousFiles[entry.prefixedPath]?.size ??\n await localFileSize(localPath, entry.prefixedPath),\n fileType: entry.fileType ?? 1,\n },\n ] as const\n })))\n await saveCheckoutState(buildNextCheckoutState({\n context,\n checkoutRoot: resolvedTargetDir,\n allRepos: repos,\n selection,\n previousState: compatibleState,\n pulledRepos: stateRepos,\n pulledFiles,\n }))\n\n return {\n fileCount: blobEntries.length,\n targetDir: resolvedTargetDir,\n }\n}\n\nfunction resolveCompatibleState(\n state: CheckoutState | undefined,\n context: SandboxRuntimeContext,\n checkoutRoot: string,\n repos: RepoEntry[],\n): CheckoutState | undefined {\n if (!state || state.workspaceId !== context.workspaceId || state.checkoutRoot !== checkoutRoot) return undefined\n const currentRepos = new Map(repos.map((repo) => [repo.repoId, repo.name]))\n const stateMatchesRepos = Object.entries(state.repos).every(\n ([repoId, repo]) => currentRepos.get(repoId) === repo.name,\n )\n return stateMatchesRepos ? state : undefined\n}\n\nfunction resolvePullSelection(context: SandboxRuntimeContext, requestedScopes: string[] | undefined): PullSelection {\n const repos = listRepoEntries(context.repoPayload)\n if (!requestedScopes || requestedScopes.length === 0) {\n return { mode: 'full', scopes: repos.map((repo) => repo.name), repos }\n }\n\n const resolvedScopes = requestedScopes.map((scope) => {\n const resolved = resolveWorkspacePath(context.repoPayload, scope)\n return {\n path: resolved.repoPath ? `${resolved.repoName}/${resolved.repoPath}` : resolved.repoName,\n repoId: resolved.repoId,\n }\n })\n const scopes = collapseScopes(resolvedScopes.map((scope) => scope.path))\n const repoIds = new Set(resolvedScopes.map((scope) => scope.repoId))\n return {\n mode: 'partial',\n scopes,\n repos: repos.filter((repo) => repoIds.has(repo.repoId)),\n }\n}\n\nfunction buildNextCheckoutState(input: BuildNextCheckoutStateInput): CheckoutState {\n const { context, checkoutRoot, allRepos, selection, previousState, pulledRepos, pulledFiles } = input\n if (selection.mode === 'full') {\n return {\n version: 1,\n workspaceId: context.workspaceId,\n checkoutRoot,\n mode: 'full',\n checkedOutScopes: selection.scopes,\n repos: pulledRepos,\n files: pulledFiles,\n }\n }\n\n const previousFiles = previousState?.files ?? {}\n const preservedFiles = Object.fromEntries(\n Object.entries(previousFiles).filter(\n ([workspacePath]) => !selection.scopes.some((scope) => pathIsIncluded(scope, workspacePath)),\n ),\n )\n const checkedOutScopes = collapseScopes([...(previousState?.checkedOutScopes ?? []), ...selection.scopes])\n const mode = allRepos.every((repo) => checkedOutScopes.includes(repo.name)) ? 'full' : 'partial'\n return {\n version: 1,\n workspaceId: context.workspaceId,\n checkoutRoot,\n mode,\n checkedOutScopes,\n repos: { ...(previousState?.repos ?? {}), ...pulledRepos },\n files: { ...preservedFiles, ...pulledFiles },\n }\n}\n\nfunction collapseScopes(scopes: string[]): string[] {\n const result: string[] = []\n for (const scope of scopes) {\n if (result.some((existing) => pathIsIncluded(existing, scope))) continue\n for (let index = result.length - 1; index >= 0; index--) {\n if (pathIsIncluded(scope, result[index])) result.splice(index, 1)\n }\n result.push(scope)\n }\n return result\n}\n\nfunction pathsIntersect(left: string, right: string): boolean {\n return pathIsIncluded(left, right) || pathIsIncluded(right, left)\n}\n\nfunction pathIsIncluded(scope: string, workspacePath: string): boolean {\n return workspacePath === scope || workspacePath.startsWith(`${scope}/`)\n}\n\nfunction resolveStateRepos(tree: BatchTreesResponse, repos: RepoEntry[]): CheckoutState['repos'] {\n const knownRepoIds = new Set(repos.map((repo) => repo.repoId))\n for (const repoId of Object.keys(tree.repos)) {\n if (!knownRepoIds.has(repoId)) {\n throw new SandboxPullError(`Remote tree returned unknown repo: ${repoId}`, 'remote')\n }\n }\n\n return Object.fromEntries(repos.map((repo) => {\n const remoteRepo = tree.repos[repo.repoId]\n if (!remoteRepo) {\n throw new SandboxPullError(`Remote tree did not return repo: ${repo.repoId}`, 'remote')\n }\n if (remoteRepo.prefix !== repo.name) {\n throw new SandboxPullError(`Remote tree returned unexpected prefix for repo ${repo.repoId}`, 'remote')\n }\n if (typeof remoteRepo.sha !== 'string' || remoteRepo.sha.length === 0) {\n throw new SandboxPullError(`Remote tree did not return a version for repo ${repo.repoId}`, 'remote')\n }\n return [repo.repoId, { name: repo.name, treeSha: remoteRepo.sha }]\n }))\n}\n\nasync function fetchWorkspaceTree(\n context: SandboxRuntimeContext,\n selection: PullSelection,\n): Promise<BatchTreesResponse> {\n const client = new SandboxMoxtClient(context)\n const results = await Promise.all(selection.repos.map(async (repo) => {\n const filter = resolveRepoTreeFilter(repo, selection)\n const params = new URLSearchParams({ entryFilter: filter.type })\n if (filter.type === 'paths') {\n for (const path of filter.paths) params.append('path', path)\n }\n const response = await client.request<RepoTreeResponse>(\n 'GET',\n `/agent/api/pipeline-sandbox/mfs/${encodeURIComponent(repo.repoId)}/tree?${params.toString()}`,\n )\n return { repo, tree: response.data }\n }))\n\n return {\n repos: Object.fromEntries(\n results.map(({ repo, tree }) => [repo.repoId, { sha: tree.sha, prefix: repo.name }]),\n ),\n entries: results.flatMap(({ repo, tree }) =>\n tree.entries.map((entry) => ({\n ...entry,\n repoId: repo.repoId,\n prefixedPath: entry.path ? `${repo.name}/${entry.path}` : repo.name,\n })),\n ),\n }\n}\n\nfunction resolveRepoTreeFilter(repo: RepoEntry, selection: PullSelection): RepoTreeFilter {\n if (selection.mode === 'full') return { type: 'all' }\n\n const repoPaths: string[] = []\n for (const scope of selection.scopes) {\n if (scope === repo.name) return { type: 'all' }\n if (scope.startsWith(`${repo.name}/`)) repoPaths.push(scope.slice(repo.name.length + 1))\n }\n if (repoPaths.length === 0) {\n throw new SandboxPullError(`No pull scope resolved for repo: ${repo.name}`, 'invalid-path')\n }\n return { type: 'paths', paths: repoPaths }\n}\n\nasync function presignDownloads(\n context: SandboxRuntimeContext,\n entries: readonly MfsTreeEntry[],\n): Promise<Map<string, string>> {\n const client = new SandboxMoxtClient(context)\n const entriesByRepo = new Map<string, MfsTreeEntry[]>()\n for (const entry of entries) {\n const existing = entriesByRepo.get(entry.repoId) ?? []\n existing.push(entry)\n entriesByRepo.set(entry.repoId, existing)\n }\n\n const urls = new Map<string, string>()\n for (const [repoId, repoEntries] of entriesByRepo) {\n const hashes = [...new Set(repoEntries.map((entry) => entry.sha).filter((sha): sha is string => Boolean(sha)))]\n if (hashes.length === 0) continue\n\n const response = await client.request<PresignUrlsResponse>(\n 'POST',\n `/agent/api/pipeline-sandbox/mfs/${encodeURIComponent(repoId)}/presign-download`,\n { hashes },\n )\n for (const hash of hashes) {\n const url = response.data.urls[hash]\n if (!url) {\n throw new SandboxPullError(`No download URL returned for ${hash}`, 'remote')\n }\n urls.set(hash, url)\n }\n }\n return urls\n}\n\nasync function downloadBlob(entry: MfsTreeEntry, urls: ReadonlyMap<string, string>): Promise<Buffer> {\n const hash = entry.sha\n if (!hash) {\n throw new SandboxPullError(`${entry.prefixedPath} does not have downloadable content`, 'remote')\n }\n const url = urls.get(hash)\n if (!url) {\n throw new SandboxPullError(`No download URL returned for ${entry.prefixedPath}`, 'remote')\n }\n\n const response = await fetch(url)\n if (!response.ok) {\n throw new SandboxPullError(`Download failed [${response.status}]: ${entry.prefixedPath}`, 'remote')\n }\n\n const content = Buffer.from(await response.arrayBuffer())\n if (content.length > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxPullError(`File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${entry.prefixedPath}`, 'too-large')\n }\n const contentHash = createHash('sha256').update(content).digest('hex')\n if (contentHash !== hash) {\n throw new SandboxPullError(`Downloaded content hash mismatch: ${entry.prefixedPath}`, 'remote')\n }\n return content\n}\n\nasync function shouldWritePulledFile(\n localPath: string,\n remoteContentHash: string,\n workspacePath: string,\n previousFile: CheckoutStateFile | undefined,\n force: boolean,\n): Promise<boolean> {\n const existing = await lstat(localPath).catch((error: unknown) => {\n if (isNodeError(error) && error.code === 'ENOENT') return undefined\n throw error\n })\n if (existing && !existing.isFile()) {\n throw new SandboxPullError(`Refusing to overwrite local path: ${workspacePath}`, 'directory-conflict')\n }\n if (!existing) {\n if (force || !previousFile) return true\n if (remoteContentHash === previousFile.sha) return false\n throw new SandboxPullError(\n `Local file was deleted but remote file changed: ${workspacePath}`,\n 'file-conflict',\n )\n }\n if (force) return true\n\n const localContentHash = await hashLocalFile(localPath)\n if (localContentHash === remoteContentHash) return false\n if (!previousFile) {\n throw new SandboxPullError(\n `Refusing to overwrite modified local file: ${workspacePath}. Use --force to overwrite.`,\n 'file-conflict',\n )\n }\n\n const localChanged = localContentHash !== previousFile.sha\n const remoteChanged = remoteContentHash !== previousFile.sha\n if (!localChanged && remoteChanged) return true\n if (localChanged && !remoteChanged) return false\n if (localChanged && remoteChanged) {\n throw new SandboxPullError(\n `Local and remote file both changed since checkout: ${workspacePath}`,\n 'file-conflict',\n )\n }\n return false\n}\n\nasync function planRemoteDeletions(\n previousState: CheckoutState | undefined,\n selection: PullSelection,\n checkoutRoot: string,\n remoteBlobPaths: ReadonlySet<string>,\n force: boolean,\n): Promise<PlannedDeletion[]> {\n if (!previousState) return []\n\n const deletions: PlannedDeletion[] = []\n for (const [workspacePath, previousFile] of Object.entries(previousState.files)) {\n if (!selection.scopes.some((scope) => pathIsIncluded(scope, workspacePath))) continue\n if (remoteBlobPaths.has(workspacePath)) continue\n\n const repo = previousState.repos[previousFile.repoId]\n if (!repo) {\n throw new SandboxPullError(`Checkout baseline references unknown repo: ${workspacePath}`, 'remote')\n }\n const localPath = resolveSafeLocalPath(checkoutRoot, repo.name, previousFile.repoPath)\n const existing = await lstat(localPath).catch((error: unknown) => {\n if (isNodeError(error) && error.code === 'ENOENT') return undefined\n throw error\n })\n if (!existing) continue\n if (!existing.isFile()) {\n throw new SandboxPullError(`Refusing to overwrite local path: ${workspacePath}`, 'directory-conflict')\n }\n if (!force && await hashLocalFile(localPath) !== previousFile.sha) {\n throw new SandboxPullError(\n `Remote file was deleted but local file changed: ${workspacePath}`,\n 'file-conflict',\n )\n }\n deletions.push({ localPath })\n }\n return deletions\n}\n\nasync function hashLocalFile(localPath: string): Promise<string> {\n return createHash('sha256').update(await readFile(localPath)).digest('hex')\n}\n\nasync function localFileSize(localPath: string, workspacePath: string): Promise<number> {\n const stats = await lstat(localPath)\n if (!stats.isFile()) {\n throw new SandboxPullError(`Cannot determine local file size: ${workspacePath}`, 'directory-conflict')\n }\n return stats.size\n}\n\nfunction requireBlobSha(entry: MfsTreeEntry): string {\n if (!entry.sha) {\n throw new SandboxPullError(`${entry.prefixedPath} does not have downloadable content`, 'remote')\n }\n return entry.sha\n}\n\nasync function assertCanCreateDirectory(localPath: string, workspacePath: string): Promise<void> {\n const existing = await lstat(localPath).catch((error: unknown) => {\n if (isNodeError(error) && error.code === 'ENOENT') return undefined\n throw error\n })\n if (existing && !existing.isDirectory()) {\n throw new SandboxPullError(`Refusing to overwrite local path: ${workspacePath}`, 'directory-conflict')\n }\n}\n\nasync function writePulledFile(localPath: string, remoteContent: Buffer): Promise<void> {\n await mkdir(dirname(localPath), { recursive: true })\n await writeFile(localPath, remoteContent)\n}\n\nfunction resolveSafeLocalPath(targetDir: string, repoName: string, repoPath: string): string {\n const pathParts = [repoName, ...repoPath.split('/').filter((part) => part.length > 0)]\n if (pathParts.some((part) => part === '.' || part === '..' || part.includes('/') || part.includes('\\\\') || part.includes('\\0'))) {\n throw new SandboxPullError(`Remote path is unsafe: ${[repoName, repoPath].filter(Boolean).join('/')}`, 'invalid-path')\n }\n\n const resolved = resolve(targetDir, ...pathParts)\n const relativePath = relative(targetDir, resolved)\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new SandboxPullError(`Remote path escapes target directory: ${repoName}/${repoPath}`, 'invalid-path')\n }\n return resolved\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error\n}\n","import { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { dirname, isAbsolute, join, posix } from 'node:path'\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises'\n\nexport type CheckoutMode = 'partial' | 'full'\n\nexport interface CheckoutStateRepo {\n name: string\n treeSha: string\n}\n\nexport interface CheckoutStateFile {\n repoId: string\n repoPath: string\n fileId: string | null\n sha: string\n size: number\n fileType: number\n}\n\nexport interface CheckoutState {\n version: 1\n workspaceId: string\n checkoutRoot: string\n mode: CheckoutMode\n checkedOutScopes: string[]\n repos: Record<string, CheckoutStateRepo>\n files: Record<string, CheckoutStateFile>\n}\n\nexport class CheckoutStateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'CheckoutStateError'\n }\n}\n\nexport function getCheckoutStatePath(): string {\n return join(homedir(), '.moxt', 'checkout-state.json')\n}\n\nexport async function loadCheckoutState(statePath = getCheckoutStatePath()): Promise<CheckoutState | undefined> {\n let raw: string\n try {\n raw = await readFile(statePath, 'utf8')\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') return undefined\n throw new CheckoutStateError(`Failed to read checkout state: ${errorMessage(error)}`)\n }\n\n let value: unknown\n try {\n value = JSON.parse(raw)\n } catch {\n throw new CheckoutStateError(`Checkout state is not valid JSON: ${statePath}`)\n }\n return validateCheckoutState(value)\n}\n\nexport async function saveCheckoutState(\n state: CheckoutState,\n statePath = getCheckoutStatePath(),\n): Promise<void> {\n const validState = validateCheckoutState(state)\n const stateDir = dirname(statePath)\n const temporaryPath = `${statePath}.${process.pid}.${randomUUID()}.tmp`\n await mkdir(stateDir, { recursive: true })\n try {\n await writeFile(temporaryPath, `${JSON.stringify(validState, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporaryPath, statePath)\n } catch (error) {\n await rm(temporaryPath, { force: true })\n throw new CheckoutStateError(`Failed to save checkout state: ${errorMessage(error)}`)\n }\n}\n\nexport function isCheckoutPathIncluded(state: CheckoutState, workspacePath: string): boolean {\n if (state.mode === 'full') return true\n return state.checkedOutScopes.some(\n (scope) => workspacePath === scope || workspacePath.startsWith(`${scope}/`),\n )\n}\n\nexport function doesCheckoutPathIntersect(state: CheckoutState, workspacePath: string): boolean {\n if (state.mode === 'full') return true\n return state.checkedOutScopes.some(\n (scope) =>\n workspacePath === scope ||\n workspacePath.startsWith(`${scope}/`) ||\n scope.startsWith(`${workspacePath}/`),\n )\n}\n\nfunction validateCheckoutState(value: unknown): CheckoutState {\n const state = requireRecord(value, 'Checkout state')\n if (state.version !== 1) {\n throw new CheckoutStateError(`Unsupported checkout state version: ${String(state.version)}`)\n }\n\n const workspaceId = requireNonEmptyString(state.workspaceId, 'workspaceId')\n const checkoutRoot = requireNonEmptyString(state.checkoutRoot, 'checkoutRoot')\n if (!isAbsolute(checkoutRoot)) throw new CheckoutStateError('checkoutRoot must be an absolute path')\n if (state.mode !== 'partial' && state.mode !== 'full') {\n throw new CheckoutStateError('mode must be partial or full')\n }\n if (!Array.isArray(state.checkedOutScopes)) {\n throw new CheckoutStateError('checkedOutScopes must be an array')\n }\n const checkedOutScopes = state.checkedOutScopes.map((scope, index) =>\n requireWorkspacePath(scope, `checkedOutScopes[${index}]`),\n )\n if (new Set(checkedOutScopes).size !== checkedOutScopes.length) {\n throw new CheckoutStateError('checkedOutScopes must not contain duplicates')\n }\n\n const reposValue = requireRecord(state.repos, 'repos')\n const repos: Record<string, CheckoutStateRepo> = {}\n for (const [repoId, rawRepo] of Object.entries(reposValue)) {\n requireNonEmptyString(repoId, 'repo id')\n const repo = requireRecord(rawRepo, `repos.${repoId}`)\n const name = requireRepoName(repo.name, `repos.${repoId}.name`)\n repos[repoId] = {\n name,\n treeSha: requireNonEmptyString(repo.treeSha, `repos.${repoId}.treeSha`),\n }\n }\n\n const filesValue = requireRecord(state.files, 'files')\n const files: Record<string, CheckoutStateFile> = {}\n for (const [workspacePath, rawFile] of Object.entries(filesValue)) {\n requireWorkspacePath(workspacePath, `files.${workspacePath}`)\n const file = requireRecord(rawFile, `files.${workspacePath}`)\n const repoId = requireNonEmptyString(file.repoId, `files.${workspacePath}.repoId`)\n const repo = repos[repoId]\n if (!repo) throw new CheckoutStateError(`File references unknown repo: ${workspacePath}`)\n const repoPath = requireWorkspacePath(file.repoPath, `files.${workspacePath}.repoPath`)\n if (workspacePath !== `${repo.name}/${repoPath}`) {\n throw new CheckoutStateError(`File path does not match its repo: ${workspacePath}`)\n }\n const fileId = file.fileId === null ? null : requireNonEmptyString(file.fileId, `files.${workspacePath}.fileId`)\n const sha = requireNonEmptyString(file.sha, `files.${workspacePath}.sha`)\n if (!/^[a-f0-9]{64}$/.test(sha)) throw new CheckoutStateError(`Invalid file SHA: ${workspacePath}`)\n files[workspacePath] = {\n repoId,\n repoPath,\n fileId,\n sha,\n size: requireNonNegativeInteger(file.size, `files.${workspacePath}.size`),\n fileType: requireNonNegativeInteger(file.fileType, `files.${workspacePath}.fileType`),\n }\n }\n\n return {\n version: 1,\n workspaceId,\n checkoutRoot,\n mode: state.mode,\n checkedOutScopes,\n repos,\n files,\n }\n}\n\nfunction requireRecord(value: unknown, field: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new CheckoutStateError(`${field} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requireNonEmptyString(value: unknown, field: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new CheckoutStateError(`${field} must be a non-empty string`)\n }\n return value\n}\n\nfunction requireWorkspacePath(value: unknown, field: string): string {\n const path = requireNonEmptyString(value, field)\n if (path.includes('\\\\') || path.includes('\\0') || posix.isAbsolute(path) || posix.normalize(path) !== path) {\n throw new CheckoutStateError(`${field} must be a normalized relative path`)\n }\n return path\n}\n\nfunction requireRepoName(value: unknown, field: string): string {\n const name = requireWorkspacePath(value, field)\n if (name.includes('/')) throw new CheckoutStateError(`${field} must be a single path segment`)\n return name\n}\n\nfunction requireNonNegativeInteger(value: unknown, field: string): number {\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new CheckoutStateError(`${field} must be a non-negative integer`)\n }\n return value\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","import { createHash } from 'node:crypto'\nimport { lstat, readFile, readdir } from 'node:fs/promises'\nimport { isAbsolute, join, relative, resolve } from 'node:path'\nimport {\n doesCheckoutPathIntersect,\n isCheckoutPathIncluded,\n loadCheckoutState,\n saveCheckoutState,\n type CheckoutState,\n type CheckoutStateFile,\n} from './checkout-state.js'\nimport { SandboxMoxtClient } from './sandbox-client.js'\nimport { runWithConcurrency } from './concurrency.js'\nimport { MFS_FILE_SIZE_LIMIT_BYTES, MFS_FILE_SIZE_LIMIT_LABEL } from './sandbox-file.js'\nimport type { BatchTreesResponse, MfsTreeEntry, PresignUrlsResponse } from './sandbox-mfs-types.js'\nimport { listRepoEntries } from './sandbox-path.js'\nimport type { RepoEntry, SandboxRuntimeContext } from './runtime-context.js'\n\nconst MFS_FILE_TYPE_REGULAR = 1\nconst MAX_CONCURRENT_UPLOADS = 8\n\nexport interface PushSandboxWorkspaceOptions {\n message: string\n}\n\nexport interface PushSandboxWorkspaceResult {\n changes: Array<{ action: 'create' | 'update' | 'delete'; workspacePath: string }>\n sourceDir: string\n}\n\ninterface LocalFile {\n repo: RepoEntry\n repoPath: string\n workspacePath: string\n localPath: string\n contentHash: string\n size: number\n}\n\ninterface PlannedWriteChange extends LocalFile {\n action: 'create' | 'update'\n existing?: MfsTreeEntry\n}\n\ninterface PlannedDeleteChange {\n action: 'delete'\n repo: RepoEntry\n repoPath: string\n workspacePath: string\n fileId: string | null\n}\n\ntype PlannedChange = PlannedWriteChange | PlannedDeleteChange\n\ninterface ReconciledFile extends LocalFile {\n remote: MfsTreeEntry\n}\n\ninterface PushPlan {\n changes: PlannedChange[]\n reconciledFiles: ReconciledFile[]\n removedWorkspacePaths: string[]\n}\n\ninterface UnifiedPushResponse {\n repoVersions: Record<string, number>\n fileMap: Record<string, Record<string, string>>\n}\n\nexport class SandboxPushError extends Error {\n constructor(\n message: string,\n readonly code: 'invalid-path' | 'invalid-file' | 'remote' | 'too-large' | 'conflict',\n ) {\n super(message)\n this.name = 'SandboxPushError'\n }\n}\n\nexport async function pushSandboxWorkspace(\n context: SandboxRuntimeContext,\n sourceDir: string,\n options: PushSandboxWorkspaceOptions,\n): Promise<PushSandboxWorkspaceResult> {\n const resolvedSourceDir = resolve(sourceDir)\n await assertWorkspaceRoot(resolvedSourceDir)\n\n const repos = listRepoEntries(context.repoPayload)\n for (const repo of repos) {\n assertSafeRepoName(resolvedSourceDir, repo.name)\n }\n const state = await resolveCheckoutState(context, resolvedSourceDir, repos)\n const checkoutRepos = repos.filter(\n (repo) => state.repos[repo.repoId] && doesCheckoutPathIntersect(state, repo.name),\n )\n if (checkoutRepos.length === 0) {\n throw new SandboxPushError('Checkout state does not contain a pushable scope', 'invalid-path')\n }\n const tree = await fetchWorkspaceTree(context, checkoutRepos)\n const remoteEntries = indexRemoteEntries(tree, checkoutRepos)\n const localFiles = await collectLocalFiles(resolvedSourceDir, checkoutRepos, remoteEntries, state)\n const { changes, reconciledFiles, removedWorkspacePaths } = planChanges(\n localFiles,\n remoteEntries,\n state,\n checkoutRepos,\n )\n\n let pushResponse: UnifiedPushResponse | undefined\n if (changes.length > 0) {\n await uploadChangedFiles(context, changes)\n pushResponse = await pushChanges(context, checkoutRepos, changes, options.message)\n }\n if (changes.length > 0 || reconciledFiles.length > 0 || removedWorkspacePaths.length > 0) {\n await updateCheckoutState(state, changes, reconciledFiles, removedWorkspacePaths, pushResponse)\n }\n\n return {\n changes: changes.map((change) => ({ action: change.action, workspacePath: change.workspacePath })),\n sourceDir: resolvedSourceDir,\n }\n}\n\nasync function resolveCheckoutState(\n context: SandboxRuntimeContext,\n sourceDir: string,\n repos: RepoEntry[],\n): Promise<CheckoutState> {\n const state = await loadCheckoutState()\n if (!state) {\n throw new SandboxPushError('Checkout is not initialized. Run moxt pull first.', 'invalid-path')\n }\n if (state.workspaceId !== context.workspaceId) {\n throw new SandboxPushError(\n `Checkout state belongs to workspace ${state.workspaceId}, not ${context.workspaceId}`,\n 'invalid-path',\n )\n }\n if (state.checkoutRoot !== sourceDir) {\n throw new SandboxPushError(\n `Checkout root is ${state.checkoutRoot}, not ${sourceDir}`,\n 'invalid-path',\n )\n }\n\n const currentRepos = new Map(repos.map((repo) => [repo.repoId, repo.name]))\n for (const [repoId, repo] of Object.entries(state.repos)) {\n if (currentRepos.get(repoId) !== repo.name) {\n throw new SandboxPushError(`Checkout state contains unknown repo: ${repoId}`, 'invalid-path')\n }\n }\n for (const scope of state.checkedOutScopes) {\n const hasRepo = Object.values(state.repos).some(\n (repo) => scope === repo.name || scope.startsWith(`${repo.name}/`),\n )\n if (!hasRepo) throw new SandboxPushError(`Checkout state contains invalid scope: ${scope}`, 'invalid-path')\n }\n return state\n}\n\nasync function assertWorkspaceRoot(sourceDir: string): Promise<void> {\n const stats = await lstat(sourceDir).catch((error: unknown) => {\n if (isNodeError(error) && error.code === 'ENOENT') {\n throw new SandboxPushError(`Local workspace directory does not exist: ${sourceDir}`, 'invalid-path')\n }\n throw error\n })\n if (!stats.isDirectory()) {\n throw new SandboxPushError(`Local workspace path is not a directory: ${sourceDir}`, 'invalid-path')\n }\n}\n\nasync function fetchWorkspaceTree(context: SandboxRuntimeContext, repos: RepoEntry[]): Promise<BatchTreesResponse> {\n const client = new SandboxMoxtClient(context)\n const response = await client.request<BatchTreesResponse>(\n 'POST',\n '/agent/api/pipeline-sandbox/mfs-workspace/batch-trees',\n {\n repos: repos.map((repo) => ({ repoId: repo.repoId, prefix: repo.name })),\n },\n )\n return response.data\n}\n\nfunction indexRemoteEntries(tree: BatchTreesResponse, repos: RepoEntry[]): Map<string, MfsTreeEntry> {\n const knownRepoIds = new Set(repos.map((repo) => repo.repoId))\n const entries = new Map<string, MfsTreeEntry>()\n for (const entry of tree.entries) {\n if (!knownRepoIds.has(entry.repoId)) {\n throw new SandboxPushError(`Remote tree returned unknown repo: ${entry.repoId}`, 'remote')\n }\n const key = remoteEntryKey(entry.repoId, entry.path)\n if (entries.has(key)) {\n throw new SandboxPushError(`Remote tree returned duplicate path: ${entry.prefixedPath}`, 'remote')\n }\n entries.set(key, entry)\n }\n return entries\n}\n\nasync function collectLocalFiles(\n sourceDir: string,\n repos: RepoEntry[],\n remoteEntries: ReadonlyMap<string, MfsTreeEntry>,\n state: CheckoutState,\n): Promise<LocalFile[]> {\n const files: LocalFile[] = []\n for (const repo of repos) {\n const repoRoot = resolveSafeRepoRoot(sourceDir, repo.name)\n const stats = await lstat(repoRoot).catch((error: unknown) => {\n if (isNodeError(error) && error.code === 'ENOENT') return undefined\n throw error\n })\n if (!stats) continue\n if (!stats.isDirectory()) {\n throw new SandboxPushError(`Local repo path is not a directory: ${repo.name}`, 'invalid-path')\n }\n await collectRepoFiles(repoRoot, repo, '', remoteEntries, state, files)\n }\n return files\n}\n\nasync function collectRepoFiles(\n repoRoot: string,\n repo: RepoEntry,\n relativeDir: string,\n remoteEntries: ReadonlyMap<string, MfsTreeEntry>,\n state: CheckoutState,\n files: LocalFile[],\n): Promise<void> {\n const localDir = relativeDir ? join(repoRoot, ...relativeDir.split('/')) : repoRoot\n const entries = await readdir(localDir, { withFileTypes: true })\n entries.sort((a, b) => a.name.localeCompare(b.name))\n\n for (const entry of entries) {\n if (entry.name === '.git') continue\n\n const repoPath = relativeDir ? `${relativeDir}/${entry.name}` : entry.name\n const workspacePath = `${repo.name}/${repoPath}`\n assertSafePathPart(entry.name, workspacePath)\n if (!doesCheckoutPathIntersect(state, workspacePath)) continue\n\n if (entry.isSymbolicLink()) {\n throw new SandboxPushError(`Refusing to push symbolic link: ${workspacePath}`, 'invalid-file')\n }\n if (entry.isDirectory()) {\n const remote = remoteEntries.get(remoteEntryKey(repo.repoId, repoPath))\n if (remote?.type === 'blob') {\n throw new SandboxPushError(`Local directory conflicts with remote file: ${workspacePath}`, 'invalid-file')\n }\n await collectRepoFiles(repoRoot, repo, repoPath, remoteEntries, state, files)\n continue\n }\n if (!entry.isFile()) {\n throw new SandboxPushError(`Refusing to push unsupported file: ${workspacePath}`, 'invalid-file')\n }\n\n const localPath = join(repoRoot, ...repoPath.split('/'))\n const stats = await lstat(localPath)\n if (!stats.isFile()) {\n const kind = stats.isSymbolicLink() ? 'symbolic link' : 'unsupported file'\n throw new SandboxPushError(`Refusing to push ${kind}: ${workspacePath}`, 'invalid-file')\n }\n if (stats.size > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxPushError(\n `File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${workspacePath}`,\n 'too-large',\n )\n }\n const content = await readFile(localPath)\n if (content.length > MFS_FILE_SIZE_LIMIT_BYTES) {\n throw new SandboxPushError(\n `File too large (max ${MFS_FILE_SIZE_LIMIT_LABEL}): ${workspacePath}`,\n 'too-large',\n )\n }\n if (!isCheckoutPathIncluded(state, workspacePath)) continue\n files.push({\n repo,\n repoPath,\n workspacePath,\n localPath,\n contentHash: createHash('sha256').update(content).digest('hex'),\n size: content.length,\n })\n }\n}\n\nfunction planChanges(\n localFiles: LocalFile[],\n remoteEntries: ReadonlyMap<string, MfsTreeEntry>,\n state: CheckoutState,\n repos: RepoEntry[],\n): PushPlan {\n const changes: PlannedChange[] = []\n const reconciledFiles: ReconciledFile[] = []\n const removedWorkspacePaths: string[] = []\n const localWorkspacePaths = new Set(localFiles.map((file) => file.workspacePath))\n const reposById = new Map(repos.map((repo) => [repo.repoId, repo]))\n for (const file of localFiles) {\n const baseline = state.files[file.workspacePath]\n if (baseline?.sha === file.contentHash) continue\n\n const existing = remoteEntries.get(remoteEntryKey(file.repo.repoId, file.repoPath))\n if (existing?.type === 'tree') {\n throw new SandboxPushError(`Local file conflicts with remote directory: ${file.workspacePath}`, 'invalid-file')\n }\n if (existing?.sha === file.contentHash) {\n reconciledFiles.push({ ...file, remote: existing })\n continue\n }\n if (existing && !existing.sha) {\n throw new SandboxPushError(`${file.workspacePath} does not have a base content hash`, 'remote')\n }\n if (baseline && existing?.sha !== baseline.sha) {\n throw new SandboxPushError(`Remote file changed since checkout: ${file.workspacePath}`, 'conflict')\n }\n if (!baseline && existing) {\n throw new SandboxPushError(`Remote file changed since checkout: ${file.workspacePath}`, 'conflict')\n }\n changes.push({\n ...file,\n action: existing ? 'update' : 'create',\n ...(existing ? { existing } : {}),\n })\n }\n\n for (const [workspacePath, baseline] of Object.entries(state.files)) {\n if (localWorkspacePaths.has(workspacePath) || !isCheckoutPathIncluded(state, workspacePath)) continue\n\n const repo = reposById.get(baseline.repoId)\n if (!repo) continue\n const existing = remoteEntries.get(remoteEntryKey(baseline.repoId, baseline.repoPath))\n if (!existing) {\n removedWorkspacePaths.push(workspacePath)\n continue\n }\n if (existing.type !== 'blob' || existing.sha !== baseline.sha) {\n throw new SandboxPushError(`Remote file changed since checkout: ${workspacePath}`, 'conflict')\n }\n changes.push({\n action: 'delete',\n repo,\n repoPath: baseline.repoPath,\n workspacePath,\n fileId: validFileId(existing.fileId) ?? baseline.fileId,\n })\n }\n\n return { changes, reconciledFiles, removedWorkspacePaths }\n}\n\nasync function uploadChangedFiles(context: SandboxRuntimeContext, changes: PlannedChange[]): Promise<void> {\n const writeChanges = changes.filter(isWriteChange)\n if (writeChanges.length === 0) return\n\n const client = new SandboxMoxtClient(context)\n const changesByRepo = groupChangesByRepo(writeChanges)\n const uploadUrlsByRepo = await Promise.all(\n [...changesByRepo].map(async ([repoId, repoChanges]) => {\n const hashes = [...new Set(repoChanges.map((change) => change.contentHash))]\n const response = await client.request<PresignUrlsResponse>(\n 'POST',\n `/agent/api/pipeline-sandbox/mfs/${encodeURIComponent(repoId)}/presign-upload`,\n { hashes },\n )\n return [repoId, response.data.urls] as const\n }),\n )\n const uploadUrls = new Map(uploadUrlsByRepo)\n\n await runWithConcurrency(writeChanges, MAX_CONCURRENT_UPLOADS, async (change) => {\n const uploadUrl = uploadUrls.get(change.repo.repoId)?.[change.contentHash]\n if (!uploadUrl) {\n throw new SandboxPushError(`No upload URL returned for ${change.workspacePath}`, 'remote')\n }\n const content = await readFile(change.localPath)\n const currentHash = createHash('sha256').update(content).digest('hex')\n if (content.length !== change.size || currentHash !== change.contentHash) {\n throw new SandboxPushError(`Local file changed while pushing: ${change.workspacePath}`, 'invalid-file')\n }\n const upload = await fetch(uploadUrl, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/octet-stream' },\n body: new Uint8Array(content),\n })\n if (!upload.ok) {\n throw new SandboxPushError(`Upload failed [${upload.status}]: ${change.workspacePath}`, 'remote')\n }\n })\n}\n\nasync function pushChanges(\n context: SandboxRuntimeContext,\n repos: RepoEntry[],\n changes: PlannedChange[],\n message: string,\n): Promise<UnifiedPushResponse> {\n const client = new SandboxMoxtClient(context)\n const changesByRepo = groupChangesByRepo(changes)\n const response = await client.request<UnifiedPushResponse>(\n 'POST',\n '/agent/api/pipeline-sandbox/mfs-workspace/unified-push',\n {\n message,\n repoPushes: repos.flatMap((repo) => {\n const repoChanges = changesByRepo.get(repo.repoId)\n if (!repoChanges) return []\n return [{\n repoId: repo.repoId,\n changes: repoChanges.map((change) => {\n if (change.action === 'delete') {\n return {\n action: change.action,\n ...(change.fileId ? { fileId: change.fileId } : {}),\n path: change.repoPath,\n }\n }\n return {\n action: change.action,\n ...(change.existing?.fileId ? { fileId: change.existing.fileId } : {}),\n path: change.repoPath,\n contentHash: change.contentHash,\n ...(change.existing?.sha ? { baseContentHash: change.existing.sha } : {}),\n size: change.size,\n fileType: MFS_FILE_TYPE_REGULAR,\n }\n }),\n }]\n }),\n crossRepoMoves: [],\n },\n )\n return response.data\n}\n\nasync function updateCheckoutState(\n state: CheckoutState,\n changes: PlannedChange[],\n reconciledFiles: ReconciledFile[],\n removedWorkspacePaths: string[],\n response: UnifiedPushResponse | undefined,\n): Promise<void> {\n const files = { ...state.files }\n for (const workspacePath of removedWorkspacePaths) delete files[workspacePath]\n for (const file of reconciledFiles) {\n files[file.workspacePath] = checkoutStateFile(\n file,\n validFileId(file.remote.fileId),\n validFileType(file.remote.fileType),\n )\n }\n for (const change of changes) {\n if (change.action === 'delete') {\n delete files[change.workspacePath]\n continue\n }\n const returnedFileId = validFileId(response?.fileMap?.[change.repo.repoId]?.[change.repoPath])\n const fileId = returnedFileId ?? change.existing?.fileId ?? state.files[change.workspacePath]?.fileId ?? null\n files[change.workspacePath] = checkoutStateFile(change, validFileId(fileId), validFileType(change.existing?.fileType))\n }\n await saveCheckoutState({ ...state, files })\n}\n\nfunction isWriteChange(change: PlannedChange): change is PlannedWriteChange {\n return change.action !== 'delete'\n}\n\nfunction checkoutStateFile(\n file: LocalFile,\n fileId: string | null,\n fileType: number | null | undefined,\n): CheckoutStateFile {\n return {\n repoId: file.repo.repoId,\n repoPath: file.repoPath,\n fileId,\n sha: file.contentHash,\n size: file.size,\n fileType: fileType ?? MFS_FILE_TYPE_REGULAR,\n }\n}\n\nfunction validFileId(fileId: unknown): string | null {\n return typeof fileId === 'string' && fileId.length > 0 ? fileId : null\n}\n\nfunction validFileType(fileType: unknown): number | null {\n return typeof fileType === 'number' && Number.isInteger(fileType) && fileType >= 0 ? fileType : null\n}\n\nfunction groupChangesByRepo<T extends PlannedChange>(changes: T[]): Map<string, T[]> {\n const result = new Map<string, T[]>()\n for (const change of changes) {\n const repoChanges = result.get(change.repo.repoId) ?? []\n repoChanges.push(change)\n result.set(change.repo.repoId, repoChanges)\n }\n return result\n}\n\nfunction remoteEntryKey(repoId: string, repoPath: string): string {\n return `${repoId}\\0${repoPath}`\n}\n\nfunction assertSafePathPart(part: string, workspacePath: string): void {\n if (part === '.' || part === '..' || part.includes('/') || part.includes('\\\\') || part.includes('\\0')) {\n throw new SandboxPushError(`Local path is unsafe: ${workspacePath}`, 'invalid-path')\n }\n}\n\nfunction assertSafeRepoName(sourceDir: string, repoName: string): void {\n resolveSafeRepoRoot(sourceDir, repoName)\n}\n\nfunction resolveSafeRepoRoot(sourceDir: string, repoName: string): string {\n assertSafePathPart(repoName, repoName)\n const repoRoot = resolve(sourceDir, repoName)\n const relativePath = relative(sourceDir, repoRoot)\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new SandboxPushError(`Repo path escapes local workspace: ${repoName}`, 'invalid-path')\n }\n return repoRoot\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error\n}\n","export async function runWithConcurrency<T>(\n items: readonly T[],\n concurrency: number,\n action: (item: T) => Promise<void>,\n): Promise<void> {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError('Concurrency must be a positive integer')\n }\n\n let nextIndex = 0\n async function worker(): Promise<void> {\n while (nextIndex < items.length) {\n const item = items[nextIndex]\n nextIndex += 1\n await action(item)\n }\n }\n\n const workerCount = Math.min(concurrency, items.length)\n await Promise.all(Array.from({ length: workerCount }, () => worker()))\n}\n","import { Command } from 'commander'\nimport { print, printError } from '../utils/output.js'\nimport { resolveRuntimeContext, RuntimeContextError, type SandboxRuntimeContext } from '../utils/runtime-context.js'\nimport { pushSandboxWorkspace } from '../utils/sandbox-push.js'\n\nexport function registerPushCommand(program: Command): void {\n program\n .command('push')\n .description('Push local workspace files to the sandbox workspace')\n .argument('[dir]', 'Local workspace directory', '.')\n .option('-m, --message <message>', 'Push message', 'moxt push')\n .action(async (sourceDir: string, options: { message: string }) => {\n const context = resolveSandboxRuntimeContextOrExit()\n\n try {\n const result = await pushSandboxWorkspace(context, sourceDir, { message: options.message })\n for (const change of result.changes) {\n print(`${change.action} ${change.workspacePath}`)\n }\n if (result.changes.length === 0) {\n print('No changes to push')\n return\n }\n\n const fileLabel = result.changes.length === 1 ? 'file' : 'files'\n print(`Pushed ${result.changes.length} ${fileLabel} from ${result.sourceDir}`)\n } catch (error) {\n handlePushError(error)\n }\n })\n}\n\nfunction resolveSandboxRuntimeContextOrExit(): SandboxRuntimeContext {\n let context\n try {\n context = resolveRuntimeContext()\n } catch (error) {\n if (error instanceof RuntimeContextError) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n }\n\n if (context.mode !== 'sandbox') {\n printError('moxt push is only available in sandbox mode')\n process.exit(1)\n }\n return context\n}\n\nfunction handlePushError(error: unknown): never {\n if (error instanceof Error) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n}\n","import { createHash } from 'node:crypto'\nimport { createReadStream } from 'node:fs'\nimport { lstat, readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport {\n doesCheckoutPathIntersect,\n isCheckoutPathIncluded,\n type CheckoutState,\n} from './checkout-state.js'\n\nexport type CheckoutChangeAction = 'added' | 'modified' | 'deleted'\n\nexport interface CheckoutChange {\n action: CheckoutChangeAction\n path: string\n}\n\nexport class CheckoutStatusError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'CheckoutStatusError'\n }\n}\n\nexport async function inspectCheckoutStatus(state: CheckoutState): Promise<CheckoutChange[]> {\n await requireCheckoutDirectory(state.checkoutRoot)\n const localFiles = new Map<string, string>()\n\n for (const repo of Object.values(state.repos)) {\n await scanDirectory(state, repo.name, join(state.checkoutRoot, repo.name), localFiles)\n }\n\n const changes: CheckoutChange[] = []\n for (const [path, sha] of localFiles) {\n const baseline = state.files[path]\n if (!baseline) changes.push({ action: 'added', path })\n else if (baseline.sha !== sha) changes.push({ action: 'modified', path })\n }\n for (const path of Object.keys(state.files)) {\n if (isCheckoutPathIncluded(state, path) && !localFiles.has(path)) changes.push({ action: 'deleted', path })\n }\n return changes.sort((left, right) => left.path.localeCompare(right.path))\n}\n\nasync function requireCheckoutDirectory(checkoutRoot: string): Promise<void> {\n let stats\n try {\n stats = await lstat(checkoutRoot)\n } catch (error) {\n throw new CheckoutStatusError(`Checkout root is not available: ${errorMessage(error)}`)\n }\n if (stats.isSymbolicLink()) throw new CheckoutStatusError(`Refusing to inspect symbolic link: ${checkoutRoot}`)\n if (!stats.isDirectory()) throw new CheckoutStatusError(`Checkout root is not a directory: ${checkoutRoot}`)\n}\n\nasync function scanDirectory(\n state: CheckoutState,\n workspacePath: string,\n localPath: string,\n files: Map<string, string>,\n): Promise<void> {\n let entries\n try {\n entries = await readdir(localPath, { withFileTypes: true })\n } catch (error) {\n if (isNodeError(error) && error.code === 'ENOENT') return\n throw new CheckoutStatusError(`Failed to inspect ${workspacePath}: ${errorMessage(error)}`)\n }\n\n for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n if (entry.name === '.git') continue\n const childWorkspacePath = `${workspacePath}/${entry.name}`\n if (!doesCheckoutPathIntersect(state, childWorkspacePath)) continue\n const childLocalPath = join(localPath, entry.name)\n const stats = await lstat(childLocalPath)\n if (stats.isSymbolicLink()) {\n throw new CheckoutStatusError(`Refusing to inspect symbolic link: ${childWorkspacePath}`)\n }\n if (stats.isDirectory()) {\n await scanDirectory(state, childWorkspacePath, childLocalPath, files)\n } else if (stats.isFile() && isCheckoutPathIncluded(state, childWorkspacePath)) {\n files.set(childWorkspacePath, await hashFile(childLocalPath))\n }\n }\n}\n\nasync function hashFile(path: string): Promise<string> {\n const hash = createHash('sha256')\n const stream = createReadStream(path)\n for await (const chunk of stream) hash.update(chunk)\n return hash.digest('hex')\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","import { Command } from 'commander'\nimport { colors, print, printError } from '../utils/output.js'\nimport { resolveRuntimeContext, RuntimeContextError, type SandboxRuntimeContext } from '../utils/runtime-context.js'\nimport { listRepoEntries } from '../utils/sandbox-path.js'\nimport { loadCheckoutState, type CheckoutMode, type CheckoutState } from '../utils/checkout-state.js'\nimport { inspectCheckoutStatus, type CheckoutChange } from '../utils/checkout-status.js'\n\ninterface UninitializedStatusJson {\n mode: 'sandbox'\n workspaceId: string\n checkout: {\n mode: 'not_initialized'\n checkedOutScopes: string[]\n localChangesTracked: boolean\n }\n repos: Array<{\n name: string\n repoId: string\n }>\n}\n\ninterface InitializedStatusJson {\n mode: 'sandbox'\n workspaceId: string\n checkout: {\n mode: CheckoutMode\n root: string\n checkedOutScopes: string[]\n localChangesTracked: true\n changes: CheckoutChange[]\n }\n repos: Array<{\n name: string\n repoId: string\n }>\n}\n\ntype StatusJson = UninitializedStatusJson | InitializedStatusJson\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command('status')\n .description('Show Moxt workspace checkout status')\n .option('--json', 'Print machine-readable status')\n .action(async (options: { json?: boolean }) => {\n const context = resolveRuntimeContextOrExit()\n if (context.mode !== 'sandbox') {\n printError('moxt status is only available in sandbox mode')\n process.exit(1)\n }\n\n const status = await buildSandboxStatusOrExit(context)\n if (options.json) {\n print(JSON.stringify(status, null, 2))\n return\n }\n\n print(`${colors.bold}Workspace${colors.reset}: ${status.workspaceId}`)\n print(`${colors.bold}Mode${colors.reset}: sandbox`)\n print(`${colors.bold}Checkout${colors.reset}: ${formatCheckoutMode(status.checkout.mode)}`)\n if (status.checkout.mode !== 'not_initialized') {\n print(`${colors.bold}Root${colors.reset}: ${status.checkout.root}`)\n }\n print('')\n print(`${colors.bold}Repos${colors.reset}:`)\n const repoNameWidth = status.repos.reduce((width, repo) => Math.max(width, repo.name.length), 0)\n for (const repo of status.repos) {\n print(` ${repo.name.padEnd(repoNameWidth)} ${repo.repoId}`)\n }\n print('')\n if (status.checkout.mode === 'not_initialized') {\n print(`${colors.bold}Checked out scopes${colors.reset}: none`)\n print(`${colors.bold}Local changes${colors.reset}: not tracked`)\n return\n }\n\n print(`${colors.bold}Checked out scopes${colors.reset}:`)\n for (const scope of status.checkout.checkedOutScopes) print(` ${scope}`)\n print(`${colors.bold}Local changes${colors.reset}:${status.checkout.changes.length === 0 ? ' none' : ''}`)\n for (const change of status.checkout.changes) {\n print(` ${change.action.padEnd(8)} ${change.path}`)\n }\n })\n}\n\nasync function buildSandboxStatusOrExit(context: SandboxRuntimeContext): Promise<StatusJson> {\n const repos = listRepoEntries(context.repoPayload).map((repo) => ({\n name: repo.name,\n repoId: repo.repoId,\n }))\n try {\n const state = await loadCheckoutState()\n if (!state) return buildUninitializedStatus(context.workspaceId, repos)\n validateStateContext(state, context)\n return {\n mode: 'sandbox',\n workspaceId: context.workspaceId,\n checkout: {\n mode: state.mode,\n root: state.checkoutRoot,\n checkedOutScopes: state.checkedOutScopes,\n localChangesTracked: true,\n changes: await inspectCheckoutStatus(state),\n },\n repos,\n }\n } catch (error) {\n printError(error instanceof Error ? error.message : String(error))\n process.exit(1)\n }\n}\n\nfunction buildUninitializedStatus(\n workspaceId: string,\n repos: UninitializedStatusJson['repos'],\n): UninitializedStatusJson {\n return {\n mode: 'sandbox',\n workspaceId,\n checkout: {\n mode: 'not_initialized',\n checkedOutScopes: [],\n localChangesTracked: false,\n },\n repos,\n }\n}\n\nfunction validateStateContext(state: CheckoutState, context: SandboxRuntimeContext): void {\n if (state.workspaceId !== context.workspaceId) {\n throw new Error(`Checkout state belongs to workspace ${state.workspaceId}, not ${context.workspaceId}`)\n }\n const currentRepos = new Map(listRepoEntries(context.repoPayload).map((repo) => [repo.repoId, repo.name]))\n for (const [repoId, repo] of Object.entries(state.repos)) {\n const currentName = currentRepos.get(repoId)\n if (!currentName) throw new Error(`Checkout state contains unknown repo: ${repoId}`)\n if (currentName !== repo.name) {\n throw new Error(`Checkout state repo name does not match current workspace: ${repo.name}`)\n }\n }\n}\n\nfunction resolveRuntimeContextOrExit() {\n try {\n return resolveRuntimeContext()\n } catch (error) {\n if (error instanceof RuntimeContextError) {\n printError(error.message)\n process.exit(1)\n }\n throw error\n }\n}\n\nfunction formatCheckoutMode(mode: StatusJson['checkout']['mode']): string {\n return mode === 'not_initialized' ? 'not initialized' : `${mode} checkout`\n}\n","import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nexport interface TelemetryConfig {\n disabled?: boolean\n noticeShown?: boolean\n}\n\nfunction getConfigPath(): string {\n return path.join(os.homedir(), '.moxt', 'config.json')\n}\n\nexport function readTelemetryConfig(): TelemetryConfig {\n try {\n const raw = fs.readFileSync(getConfigPath(), 'utf8')\n const parsed = JSON.parse(raw) as { telemetry?: TelemetryConfig }\n return parsed.telemetry ?? {}\n } catch {\n return {}\n }\n}\n\nexport function writeTelemetryConfig(update: Partial<TelemetryConfig>): void {\n const configPath = getConfigPath()\n let existing: Record<string, unknown> = {}\n try {\n existing = JSON.parse(fs.readFileSync(configPath, 'utf8')) as Record<string, unknown>\n } catch {\n existing = {}\n }\n const currentTelemetry = (existing.telemetry as TelemetryConfig | undefined) ?? {}\n const next = { ...existing, telemetry: { ...currentTelemetry, ...update } }\n fs.mkdirSync(path.dirname(configPath), { recursive: true })\n fs.writeFileSync(configPath, JSON.stringify(next, null, 2))\n}\n","import { readTelemetryConfig } from './config.js'\n\nexport function isCiEnvironment(): boolean {\n return process.env.CI === 'true' || process.env.CI === '1'\n}\n\nexport function isTelemetryDisabled(): boolean {\n if (process.env.MOXT_TELEMETRY_DISABLED === '1' || process.env.MOXT_TELEMETRY_DISABLED === 'true') {\n return true\n }\n if (process.env.DO_NOT_TRACK === '1' || process.env.DO_NOT_TRACK === 'true') {\n return true\n }\n return readTelemetryConfig().disabled === true\n}\n","import { Command } from 'commander'\nimport { readTelemetryConfig, writeTelemetryConfig } from '../telemetry/config.js'\nimport { isTelemetryDisabled } from '../telemetry/opt-out.js'\nimport { print } from '../utils/output.js'\n\nexport function registerTelemetryCommand(program: Command): void {\n const telemetry = program.command('telemetry').description('Manage Moxt CLI telemetry')\n\n telemetry\n .command('status')\n .description('Show telemetry status')\n .action(() => {\n const cfg = readTelemetryConfig()\n const envOverride =\n process.env.MOXT_TELEMETRY_DISABLED === '1' ||\n process.env.MOXT_TELEMETRY_DISABLED === 'true' ||\n process.env.DO_NOT_TRACK === '1' ||\n process.env.DO_NOT_TRACK === 'true'\n\n const state = isTelemetryDisabled() ? 'disabled' : 'enabled'\n print(`telemetry: ${state}`)\n if (envOverride) {\n print('(disabled via environment variable)')\n } else if (cfg.disabled) {\n print('(disabled via config file)')\n }\n })\n\n telemetry\n .command('enable')\n .description('Enable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: false })\n print('telemetry: enabled')\n })\n\n telemetry\n .command('disable')\n .description('Disable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: true })\n print('telemetry: disabled')\n })\n}\n","import { Command } from 'commander'\nimport { httpGet } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WhoamiResponse {\n nickname: string\n email: string\n}\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n startSpinner('Fetching user info...')\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n\n if (response.ok) {\n stopSpinner(true, 'Done')\n print(`${colors.bold}Nickname${colors.reset}: ${response.data.nickname}`)\n print(`${colors.bold}Email${colors.reset}: ${response.data.email}`)\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander'\nimport { httpGet, httpDelete } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WorkspaceItem {\n workspaceId: string\n name: string\n}\n\ninterface WorkspaceListResponse {\n workspaces: WorkspaceItem[]\n}\n\ninterface MemberItem {\n userId: number\n email: string\n displayName: string | null\n role: string\n}\n\ninterface MembersResponse {\n members: MemberItem[]\n}\n\ninterface SpaceItem {\n type: 'personal' | 'team' | 'teammate'\n name: string\n teamSpaceId: string | null\n agentId: number | null\n}\n\n// Email regex (same as web/src/utils/email.ts)\nconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\n\nfunction isValidEmail(email: string): boolean {\n return emailRegex.test(email)\n}\n\nexport function registerWorkspaceCommand(program: Command): void {\n const workspace = program.command('workspace').description('Workspace management')\n\n workspace\n .command('list')\n .description('List all workspaces you belong to')\n .action(async () => {\n startSpinner('Fetching workspaces...')\n const response = await httpGet<WorkspaceListResponse>('/workspaces')\n\n if (response.ok) {\n const { workspaces } = response.data\n if (workspaces.length === 0) {\n stopSpinner(true, 'No workspaces found.')\n return\n }\n\n stopSpinner(true, `Found ${workspaces.length} workspace(s)`)\n\n for (const ws of workspaces) {\n print(`${colors.bold}${ws.workspaceId}${colors.reset}\\t${ws.name}`)\n }\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n\n const members = program.command('members').description('Manage workspace members')\n\n members\n .command('list')\n .description('List all members in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching workspace members...')\n const response = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { members } = response.data\n if (members.length === 0) {\n stopSpinner(true, 'No members found.')\n return\n }\n\n stopSpinner(true, `Found ${members.length} member(s)`)\n\n for (const member of members) {\n const name = member.displayName || '-'\n print(`${colors.bold}${member.email}${colors.reset}\\t${name}\\t${member.role}`)\n }\n })\n\n members\n .command('remove')\n .description('Remove members from a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .argument('<emails>', 'Emails to remove (comma-separated)')\n .action(async (emailsArg: string, options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n const emails = emailsArg.split(',').map((e) => e.trim()).filter(Boolean)\n if (emails.length === 0) {\n printError('No valid emails provided')\n process.exit(1)\n }\n\n // Validate email format\n const invalidEmails = emails.filter((e) => !isValidEmail(e))\n if (invalidEmails.length > 0) {\n for (const email of invalidEmails) {\n printError(`Invalid email format: ${email}`)\n }\n process.exit(1)\n }\n\n // Fetch members to get userId by email\n startSpinner('Fetching workspace members...')\n const membersResponse = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!membersResponse.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${membersResponse.status}]: ${JSON.stringify(membersResponse.data)}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Members fetched')\n\n const { members } = membersResponse.data\n const emailToMember = new Map(members.map((m) => [m.email.toLowerCase(), m]))\n\n // Remove each member\n for (const email of emails) {\n const member = emailToMember.get(email.toLowerCase())\n if (!member) {\n print(`${colors.red}✗${colors.reset} ${email} - not found in workspace`)\n continue\n }\n\n const deleteResponse = await httpDelete(`/workspaces/${workspaceId}/members/${member.userId}`)\n\n if (deleteResponse.ok) {\n print(`${colors.green}✓${colors.reset} ${email} - removed`)\n } else {\n print(`${colors.red}✗${colors.reset} ${email} - failed: ${JSON.stringify(deleteResponse.data)}`)\n }\n }\n })\n\n const space = program.command('space').description('Manage spaces')\n\n space\n .command('list')\n .description('List accessible spaces in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching spaces...')\n const response = await httpGet<{ spaces: SpaceItem[] }>(`/workspaces/${workspaceId}/spaces`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch spaces')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { spaces } = response.data\n if (spaces.length === 0) {\n stopSpinner(true, 'No spaces found.')\n return\n }\n\n stopSpinner(true, `Found ${spaces.length} space(s)`)\n\n print(\n `${colors.bold}TYPE${colors.reset}\\t${colors.bold}TEAM_SPACE_ID${colors.reset}\\t${colors.bold}TEAMMATE_ID${colors.reset}\\t${colors.bold}NAME${colors.reset}`,\n )\n for (const s of spaces) {\n const teamSpaceId = s.teamSpaceId ?? ''\n const teammateId = s.agentId != null ? String(s.agentId) : ''\n print(`${s.type}\\t${teamSpaceId}\\t${teammateId}\\t${s.name}`)\n }\n })\n\n}\n","import { arch, platform } from 'node:os'\nimport { getApiBaseUrl, getApiKeyOrUndefined } from '../utils/config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport type MetricType = 'counter' | 'gauge' | 'histogram'\n\nexport interface MetricRecord {\n metric_id: string\n metric_type: MetricType\n value: number\n extra_label_name_2_value?: Record<string, string>\n}\n\nconst buffer: MetricRecord[] = []\nconst FLUSH_TIMEOUT_MS = 3000\nconst MAX_BATCH_SIZE = 100\n\nfunction commonLabels(): Record<string, string> {\n return {\n cli_version: __CLI_VERSION__,\n node_version: process.versions.node,\n os: platform(),\n arch: arch(),\n is_ci: isCiEnvironment() ? 'true' : 'false',\n }\n}\n\nexport function record(metric: MetricRecord): void {\n if (isTelemetryDisabled()) {\n debugLog(`record: disabled, dropping ${metric.metric_id}`)\n return\n }\n if (!getApiKeyOrUndefined()) {\n debugLog(`record: no API key, dropping ${metric.metric_id}`)\n return\n }\n buffer.push({\n ...metric,\n extra_label_name_2_value: {\n ...commonLabels(),\n ...(metric.extra_label_name_2_value ?? {}),\n },\n })\n debugLog(`record: buffered ${metric.metric_id} (buffer=${buffer.length})`)\n}\n\nfunction isDebug(): boolean {\n return process.env.MOXT_TELEMETRY_DEBUG === '1' || process.env.MOXT_TELEMETRY_DEBUG === 'true'\n}\n\nfunction debugLog(msg: string, detail?: unknown): void {\n if (!isDebug()) return\n process.stderr.write(`[telemetry] ${msg}${detail !== undefined ? ` ${JSON.stringify(detail)}` : ''}\\n`)\n}\n\nexport async function flush(): Promise<void> {\n if (buffer.length === 0) {\n debugLog('flush: buffer empty, skipping')\n return\n }\n const apiKey = getApiKeyOrUndefined()\n if (!apiKey) {\n debugLog('flush: no API key, dropping buffer')\n buffer.length = 0\n return\n }\n\n const batch = buffer.splice(0, MAX_BATCH_SIZE)\n const payload = {\n release_id: __CLI_VERSION__,\n client_type: 'cli',\n metric_data_list: batch.map((m) => ({\n profile: 'cli',\n metric_id: m.metric_id,\n metric_type: m.metric_type,\n value: m.value,\n extra_label_name_2_value: m.extra_label_name_2_value,\n })),\n }\n\n const url = `${getApiBaseUrl()}/cli-metrics`\n debugLog(`flush: POST ${url} with ${batch.length} metrics`, payload)\n\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, FLUSH_TIMEOUT_MS)\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n debugLog(`flush: response status=${res.status}`)\n } finally {\n clearTimeout(timeout)\n }\n } catch (err) {\n debugLog('flush: failed', err instanceof Error ? err.message : String(err))\n // fire-and-forget — never surface telemetry failures to the user\n }\n}\n","import { readTelemetryConfig, writeTelemetryConfig } from './config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\nconst NOTICE = [\n '',\n 'Attention: Moxt CLI now collects anonymous telemetry regarding usage.',\n \"This information is used to shape Moxt CLI's roadmap and prioritize features.\",\n '',\n 'You may opt out by setting MOXT_TELEMETRY_DISABLED=1 in your env',\n 'or by running `moxt telemetry disable`.',\n 'Details: https://www.npmjs.com/package/@moxt-ai/cli#telemetry',\n '',\n]\n\nexport function maybeShowTelemetryNotice(): void {\n if (isTelemetryDisabled()) return\n if (isCiEnvironment()) return\n if (readTelemetryConfig().noticeShown) return\n\n for (const line of NOTICE) {\n process.stderr.write(`${line}\\n`)\n }\n\n try {\n writeTelemetryConfig({ noticeShown: true })\n } catch {\n // persistence failure is not user-visible — we'll just show the notice again next run\n }\n}\n","import type { Command } from 'commander'\nimport { flush, record } from './client.js'\nimport { maybeShowTelemetryNotice } from './notice.js'\n\ninterface RunningCommand {\n name: string\n subcommand?: string\n startedAt: number\n}\n\nlet current: RunningCommand | null = null\n\nfunction commandPath(cmd: Command): { command: string; subcommand?: string } {\n const names: string[] = []\n let node: Command | null = cmd\n while (node && node.parent) {\n names.unshift(node.name())\n node = node.parent\n }\n if (names.length === 0) return { command: 'unknown' }\n if (names.length === 1) return { command: names[0] }\n return { command: names[0], subcommand: names.slice(1).join(' ') }\n}\n\nexport function instrumentProgram(program: Command): void {\n program.hook('preAction', (_thisCommand, actionCommand) => {\n const { command, subcommand } = commandPath(actionCommand)\n if (command !== 'telemetry') {\n maybeShowTelemetryNotice()\n }\n current = { name: command, subcommand, startedAt: Date.now() }\n record({\n metric_id: 'client.cli.command_invocation.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command,\n ...(subcommand ? { subcommand } : {}),\n status: 'started',\n },\n })\n })\n\n program.hook('postAction', async () => {\n await reportOutcome('success')\n })\n}\n\nasync function reportOutcome(status: 'success' | 'error', errorCode?: string): Promise<void> {\n if (!current) return\n const { name, subcommand, startedAt } = current\n const durationSeconds = (Date.now() - startedAt) / 1000\n\n record({\n metric_id: 'client.cli.command_duration_seconds',\n metric_type: 'histogram',\n value: durationSeconds,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n status,\n },\n })\n\n if (status === 'error') {\n record({\n metric_id: 'client.cli.command_error.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n ...(errorCode ? { error_code: errorCode } : {}),\n },\n })\n }\n\n current = null\n await flush()\n}\n\n/**\n * Wire a final error/exit hook. Call before program.parseAsync so we can capture\n * failures routed through process.exit or unhandled rejections.\n *\n * Best-effort only: `reportOutcome` is fire-and-forget, and the subsequent\n * `process.exit(1)` terminates the process before `flush()` can complete — so\n * the error metric recorded here will typically be dropped. Reliable crash\n * reporting belongs to Sentry/APM, not this telemetry path.\n */\nexport function installExitHandler(): void {\n const handleError = (errorCode: string): void => {\n void reportOutcome('error', errorCode)\n }\n\n process.on('uncaughtException', () => {\n handleError('uncaught_exception')\n process.exit(1)\n })\n process.on('unhandledRejection', () => {\n handleError('unhandled_rejection')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":["Command","path","record","program","fs","path","buffer","path","path","program","path","content","response","action","buffer","program","path","runOrExit","path","program","isAbsolute","createHash","mkdir","readFile","rm","writeFile","dirname","isAbsolute","path","rm","mkdir","path","createHash","isNodeError","readFile","dirname","writeFile","isAbsolute","program","resolveSandboxRuntimeContextOrExit","isAbsolute","createHash","lstat","readFile","isAbsolute","join","relative","resolve","MFS_FILE_TYPE_REGULAR","resolve","fetchWorkspaceTree","lstat","isNodeError","join","readFile","createHash","relative","isAbsolute","program","resolveSandboxRuntimeContextOrExit","createHash","lstat","readdir","join","join","path","lstat","errorMessage","readdir","isNodeError","createHash","program","resolveRuntimeContextOrExit","fs","program","program","program","members","program","Command","arch","platform","platform","arch","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/program.ts","../src/commands/file.ts","../src/commands/file-comment.ts","../src/utils/file-selector.ts","../src/utils/http.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/spinner.ts","../src/utils/search-options.ts","../src/utils/run-or-exit.ts","../src/commands/memory.ts","../src/utils/miniapp-db.ts","../src/commands/miniapp.ts","../src/telemetry/config.ts","../src/telemetry/opt-out.ts","../src/commands/telemetry.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/commands/workflow.ts","../src/telemetry/client.ts","../src/telemetry/notice.ts","../src/telemetry/instrument.ts"],"sourcesContent":["import updateNotifier from 'update-notifier'\nimport { createProgram } from './program.js'\nimport { flush } from './telemetry/client.js'\nimport { installExitHandler, instrumentProgram } from './telemetry/instrument.js'\n\ndeclare const __CLI_VERSION__: string\n\nupdateNotifier({\n pkg: { name: '@moxt-ai/cli', version: __CLI_VERSION__ },\n}).notify()\n\nconst program = createProgram(__CLI_VERSION__)\n\ninstrumentProgram(program)\ninstallExitHandler()\n\nprogram\n .parseAsync(process.argv)\n .then(async () => {\n await flush()\n })\n .catch(async (err: unknown) => {\n console.error('CLI Error:', err)\n await flush()\n process.exit(1)\n })\n","import { Command } from 'commander'\nimport { registerFileCommand } from './commands/file.js'\nimport { registerMemoryCommand } from './commands/memory.js'\nimport { registerMiniappCommand } from './commands/miniapp.js'\nimport { registerTelemetryCommand } from './commands/telemetry.js'\nimport { registerWhoamiCommand } from './commands/whoami.js'\nimport { registerWorkspaceCommand } from './commands/workspace.js'\nimport { registerWorkflowCommand } from './commands/workflow.js'\n\nexport function createProgram(version: string): Command {\n const program = new Command()\n\n program\n .name('moxt')\n .description('Moxt CLI - AI Workspace')\n .version(version)\n .action(() => {\n program.help()\n })\n\n registerWhoamiCommand(program)\n registerWorkspaceCommand(program)\n registerFileCommand(program)\n registerMemoryCommand(program)\n registerWorkflowCommand(program)\n registerMiniappCommand(program)\n registerTelemetryCommand(program)\n\n return program\n}\n","import * as fs from 'node:fs'\nimport { Command } from 'commander'\nimport { registerFileCommentCommands } from './file-comment.js'\nimport {\n buildFileQueryString,\n isBinaryContent,\n resolveReadMode,\n resolveSpaceSelector,\n resolveWriteMode,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPost, httpPut } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseSearchMode } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface FileEntry {\n name: string\n type: 'file' | 'directory'\n size: number | null\n}\n\ninterface FileReadResponse {\n path: string\n type: 'file' | 'directory'\n entries: FileEntry[] | null\n content: string | null\n}\n\ninterface FileWriteResponse {\n path: string\n created: boolean\n}\n\ninterface MkdirResponse {\n path: string\n created: boolean\n}\n\ninterface DeleteResponse {\n path: string\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FieldHighlight {\n text: string\n}\n\ninterface SemanticSnippet {\n content: string\n}\n\ninterface FileSearchItem {\n repoId: string\n fileId: string\n filePath: string\n rank: number\n contentHighlight?: FieldHighlight\n filePathHighlight?: FieldHighlight\n semanticSnippets: SemanticSnippet[]\n}\n\ninterface FileSearchResponse {\n items: FileSearchItem[]\n}\n\nfunction addSpaceOptions(cmd: Command): Command {\n return cmd\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('File operations')\n\n registerFileCommentCommands(file)\n\n addSpaceOptions(\n file.command('search')\n .description('Search files in accessible spaces')\n .argument('<query>', 'Search query')\n .option('-l, --limit <limit>', 'Maximum number of files to return', '30')\n .option('--mode <mode>', 'Keyword matching mode: any or all', 'any'),\n ).action(async (query: string, options: SpaceOptions & { limit?: string; mode?: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const limit = runOrExit(() => parseSearchLimit(options.limit, 30, 80))\n const mode = runOrExit(() => parseSearchMode(options.mode))\n\n startSpinner('Searching files...')\n const response = await httpPost<FileSearchResponse>(\n `/workspaces/${options.workspace}/files/search`,\n {\n query,\n limit,\n mode,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No files found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} file(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. ${item.filePath}${colors.reset}`)\n print(`${colors.dim}repo=${item.repoId} file=${item.fileId}${colors.reset}`)\n const snippet = item.contentHighlight?.text ?? item.semanticSnippets[0]?.content\n if (snippet) {\n print(snippet)\n }\n print('')\n }\n })\n\n addSpaceOptions(\n file.command('get-url')\n .description('Resolve the shareable browser URL for a file')\n .requiredOption('-p, --path <path>', 'File path'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Resolving URL...')\n const response = await httpGet<FileUrlResponse>(\n `/workspaces/${options.workspace}/files/url${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, response.data.path)\n print(`${colors.cyan}${response.data.url}${colors.reset}`)\n })\n\n addSpaceOptions(\n file.command('list')\n .description('List directory contents')\n .option('-p, --path <path>', 'Directory path', '/'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Listing files...')\n const response = await httpGet<FileReadResponse>(\n `/workspaces/${options.workspace}/files/list${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { path, entries } = response.data\n\n if (!entries || entries.length === 0) {\n stopSpinner(true, `${path}: empty directory`)\n return\n }\n\n stopSpinner(true, path)\n for (const entry of entries) {\n if (entry.type === 'directory') {\n print(`${colors.blue}${entry.name}/${colors.reset}`)\n } else {\n print(entry.name)\n }\n }\n })\n\n file.command('read')\n .description('Read file content')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .action(async (options: Partial<SpaceOptions> & { path?: string; url?: string }) => {\n const mode = runOrExit(() => resolveReadMode(options))\n\n startSpinner('Reading file...')\n\n let response: { ok: boolean; status: number; data: FileReadResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpGet<FileReadResponse>(\n `/files/read-by-url?url=${encodeURIComponent(mode.url)}`,\n )\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n response = await httpGet<FileReadResponse>(\n `/workspaces/${mode.workspace}/files/read${qs}`,\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { type, content } = response.data\n\n if (type === 'directory') {\n stopSpinner(false, 'Failed')\n print(`${colors.red}☠ ${displayPath} is a directory${colors.reset}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Done')\n print(content ?? '')\n })\n\n file.command('put')\n .description('Upload a file')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'Remote file path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .requiredOption('-l, --local-path <localPath>', 'Local file path')\n .option('-r, --recursive', 'Create parent directories if needed')\n .action(\n async (options: Partial<SpaceOptions> & {\n path?: string\n url?: string\n localPath: string\n recursive?: boolean\n }) => {\n const mode = runOrExit(() => resolveWriteMode(options))\n\n if (!fs.existsSync(options.localPath)) {\n print(`${colors.red}☠ Local file not found: ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const stats = fs.statSync(options.localPath)\n if (!stats.isFile()) {\n print(`${colors.red}☠ Not a file: ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const maxSize = 10 * 1024 * 1024\n if (stats.size > maxSize) {\n print(`${colors.red}☠ File too large (max 10MB): ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const buffer = fs.readFileSync(options.localPath)\n if (isBinaryContent(buffer)) {\n print(`${colors.red}☠ Binary files are not allowed. Only text files can be uploaded.${colors.reset}`)\n process.exit(1)\n }\n\n const content = buffer.toString('utf8')\n\n startSpinner('Uploading...')\n\n let response: { ok: boolean; status: number; data: FileWriteResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpPut<FileWriteResponse>('/files/write-by-url', {\n url: mode.url,\n content,\n })\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n response = await httpPut<FileWriteResponse>(\n `/workspaces/${mode.workspace}/files/write`,\n {\n path: mode.path,\n content,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n if (mode.kind === 'by-url') {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n }\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Updated'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('mkdir')\n .description('Create a directory')\n .requiredOption('-p, --path <path>', 'Directory path')\n .option('-r, --recursive', 'Create parent directories if needed'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n recursive?: boolean\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Creating directory...')\n const response = await httpPost<MkdirResponse>(\n `/workspaces/${options.workspace}/files/mkdir`,\n {\n path: options.path,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Already exists'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('del')\n .description('Delete a file or empty directory')\n .requiredOption('-p, --path <path>', 'File or directory path'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Deleting...')\n const response = await httpDelete<DeleteResponse>(\n `/workspaces/${options.workspace}/files/delete`,\n {\n path: options.path,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Path not found: ${options.path}${colors.reset}`)\n } else if (response.status === 400) {\n print(`${colors.red}☠ Cannot delete non-empty directory${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, `Deleted: ${response.data.path}`)\n },\n )\n}\n","import * as fs from 'node:fs'\nimport { TextDecoder } from 'node:util'\nimport { Command } from 'commander'\nimport {\n buildFileQueryString,\n ReadMode,\n resolveReadMode,\n resolveSpaceSelector,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpGet, httpPatch } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\n// The comment/thread ID column is a nanoid, and canonical file URLs embed a UUID fileId.\n// Mirror the server contract (server-ts openapi-file-comment.vo.ts / openapi-file-url.controller.ts)\n// so the CLI rejects malformed URLs locally instead of forwarding them to the API.\nconst FILE_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst URL_FORMAT_HINT =\n 'Error: invalid Moxt URL format. Expected https://moxt.ai/w/{workspaceId}/{fileId} ' +\n 'or https://moxt.ai/w/{workspaceId}/c/{agentId}[/{sessionId}]?file={fileId}'\n\ninterface FileCommentAuthor {\n humanId: number | null\n assistantId: number | null\n teammateId: number | null\n authorName: string | null\n authorAvatarUrl: string | null\n}\n\ninterface FileCommentItem extends FileCommentAuthor {\n id: string\n threadId: string\n content: string\n createdAt: string\n editedAt: string | null\n}\n\ninterface FileCommentThread {\n threadId: string\n items: FileCommentItem[]\n createdAt: string\n createdBy: FileCommentAuthor\n resolvedAt: string | null\n quotedText: string | null\n fileId: string\n}\n\ninterface ListFileCommentsResponse {\n items: FileCommentThread[]\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FileCommentOptions extends Partial<SpaceOptions> {\n path?: string\n url?: string\n}\n\n/**\n * Error thrown when a file comment command's local option/content validation fails.\n * Handlers catch it via {@link runOrExit} and turn it into stderr + exit code 1.\n */\nclass FileCommentOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FileCommentOptionsError'\n }\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof FileCommentOptionsError || err instanceof SpaceOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\n/**\n * Extract the workspace/file identifiers a comment API call needs from a canonical\n * Moxt file URL. Supports the workspace-mode shape `/w/{workspaceId}/{fileId}` and the\n * chat deeplink `/w/{workspaceId}/c/{agentId}[/{sessionId}]?file={fileId}`.\n */\nfunction parseMoxtFileUrl(url: string): { workspaceId: string; fileId: string } {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length < 3 || segments[0] !== 'w') {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n const workspaceId = segments[1]\n\n let fileId: string | undefined\n if (segments[2] === 'c') {\n fileId = parsed.searchParams.get('file') ?? undefined\n } else if (segments.length === 3) {\n fileId = segments[2]\n }\n\n if (!fileId || !FILE_ID_UUID_RE.test(fileId)) {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n return { workspaceId, fileId }\n}\n\n/**\n * Resolve the target file for a comment command. URL mode reads the identifiers directly;\n * path mode calls the existing `file get-url` endpoint to obtain a stable URL, then parses it.\n */\nasync function resolveFileTarget(options: FileCommentOptions): Promise<{ workspaceId: string; fileId: string }> {\n const mode: ReadMode = runOrExit(() => resolveReadMode(options))\n if (mode.kind === 'by-url') {\n return runOrExit(() => parseMoxtFileUrl(mode.url))\n }\n\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n\n startSpinner('Resolving file...')\n const response = await httpGet<FileUrlResponse>(`/workspaces/${mode.workspace}/files/url${qs}`)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${mode.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n stopSpinner(true, response.data.path)\n return runOrExit(() => parseMoxtFileUrl(response.data.url))\n}\n\nfunction readCommentContentFile(path: string): string {\n if (!fs.existsSync(path)) {\n throw new FileCommentOptionsError(`Error: comment content file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new FileCommentOptionsError(`Error: comment content path is not a file: ${path}`)\n }\n const buffer = fs.readFileSync(path)\n if (buffer.includes(0)) {\n throw new FileCommentOptionsError('Error: comment content file must not contain NUL bytes.')\n }\n let content: string\n try {\n content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer)\n } catch {\n throw new FileCommentOptionsError('Error: comment content file must contain valid UTF-8 text.')\n }\n // The file comment API only requires a non-empty body (server schema: z.string().min(1));\n // there is no server-side max length, so the CLI must not impose a client-only cap.\n if (content.length === 0) {\n throw new FileCommentOptionsError('Error: comment content file must not be empty.')\n }\n return content\n}\n\nfunction parseResolveState(state: string | undefined): boolean {\n if (state === 'resolved') return true\n if (state === 'open') return false\n throw new FileCommentOptionsError('Error: --state must be \"resolved\" or \"open\".')\n}\n\ntype DetailScalar = string | number | boolean | null\n\nfunction indentation(size: number): string {\n return ' '.repeat(size)\n}\n\n// Escape terminal control characters so untrusted comment content, author names, and\n// avatar URLs cannot inject ANSI/OSC sequences into the operator's terminal.\nfunction escapeTerminalControlCharacters(value: string): string {\n return value\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n )\n}\n\nfunction formatDetailScalar(value: DetailScalar): string {\n if (value === null) return 'null'\n if (typeof value === 'string') {\n const escaped = escapeTerminalControlCharacters(value)\n if (escaped === '') return '\"\"'\n if (/\\n/.test(escaped)) return JSON.stringify(escaped)\n return escaped\n }\n return String(value)\n}\n\nfunction printDetailField(name: string, value: DetailScalar, indent = 0): void {\n print(`${indentation(indent)}${name}: ${formatDetailScalar(value)}`)\n}\n\nfunction printDetailTextField(name: string, value: string | null, indent = 0): void {\n if (value === null || value === '') {\n printDetailField(name, value, indent)\n return\n }\n const escaped = escapeTerminalControlCharacters(value)\n print(`${indentation(indent)}${name}:`)\n for (const line of escaped.split('\\n')) {\n print(`${indentation(indent + 2)}${line}`)\n }\n}\n\nfunction printAuthorFields(author: FileCommentAuthor, indent: number): void {\n printDetailField('humanId', author.humanId, indent)\n printDetailField('assistantId', author.assistantId, indent)\n printDetailField('teammateId', author.teammateId, indent)\n printDetailField('authorName', author.authorName, indent)\n printDetailField('authorAvatarUrl', author.authorAvatarUrl, indent)\n}\n\nfunction printCommentItem(item: FileCommentItem, indent = 0): void {\n print(`${indentation(indent)}${colors.bold}Comment${colors.reset}`)\n printDetailField('id', item.id, indent + 2)\n printDetailField('threadId', item.threadId, indent + 2)\n printAuthorFields(item, indent + 2)\n printDetailTextField('content', item.content, indent + 2)\n printDetailField('createdAt', item.createdAt, indent + 2)\n printDetailField('editedAt', item.editedAt, indent + 2)\n}\n\nfunction printThread(thread: FileCommentThread): void {\n print(`${colors.bold}Thread${colors.reset}`)\n printDetailField('threadId', thread.threadId, 2)\n printDetailField('fileId', thread.fileId, 2)\n printDetailTextField('quotedText', thread.quotedText, 2)\n printDetailField('resolvedAt', thread.resolvedAt, 2)\n print(`${indentation(2)}createdBy:`)\n printAuthorFields(thread.createdBy, 4)\n printDetailField('createdAt', thread.createdAt, 2)\n print(`${indentation(2)}comments:`)\n thread.items.forEach((item) => printCommentItem(item, 4))\n}\n\nfunction addFileSelectorOptions(cmd: Command): Command {\n return cmd\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n}\n\nexport function registerFileCommentCommands(file: Command): void {\n const comment = file.command('comment').description('File comment operations')\n\n addFileSelectorOptions(\n comment.command('list').description('List comment threads on a file'),\n ).action(async (options: FileCommentOptions) => {\n const target = await resolveFileTarget(options)\n\n startSpinner('Fetching comments...')\n const response = await httpGet<ListFileCommentsResponse>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comment-threads`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (response.data.items.length === 0) {\n stopSpinner(true, 'No comments found.')\n return\n }\n stopSpinner(true, `Found ${response.data.items.length} thread(s)`)\n response.data.items.forEach((thread, index) => {\n if (index > 0) print('')\n printThread(thread)\n })\n })\n\n addFileSelectorOptions(\n comment.command('update')\n .description('Update a comment you created')\n .argument('<commentId>')\n .requiredOption('--content-path <localPath>', 'Local UTF-8 text file for comment content'),\n ).action(async (commentId: string, options: FileCommentOptions & { contentPath: string }) => {\n // Validate the local content file before any network call so invalid input\n // never leaves the CLI (path-mode resolution below issues an HTTP request).\n const content = runOrExit(() => readCommentContentFile(options.contentPath))\n const target = await resolveFileTarget(options)\n\n startSpinner('Updating comment...')\n const response = await httpPatch<FileCommentItem>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comments/${commentId}`,\n { content },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n stopSpinner(true, 'Comment updated')\n printCommentItem(response.data)\n })\n\n addFileSelectorOptions(\n comment.command('resolve')\n .description('Resolve or reopen a comment thread')\n .argument('<threadId>')\n .requiredOption('--state <state>', 'Thread state: resolved or open'),\n ).action(async (threadId: string, options: FileCommentOptions & { state: string }) => {\n const resolved = runOrExit(() => parseResolveState(options.state))\n const target = await resolveFileTarget(options)\n\n startSpinner(resolved ? 'Resolving thread...' : 'Reopening thread...')\n const response = await httpPatch<unknown>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comment-threads/${threadId}/resolve`,\n { resolved },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n stopSpinner(true, resolved ? `Resolved: ${threadId}` : `Reopened: ${threadId}`)\n })\n}\n","/**\n * Pure logic for resolving file-command space selectors and building request URLs.\n *\n * These functions are extracted from commands/file.ts so they can be unit tested\n * without spawning the CLI or mocking process.exit. All error conditions are\n * surfaced as thrown Errors; action handlers are responsible for turning them\n * into user-facing output and exit codes.\n */\n\nexport interface SpaceOptions {\n workspace: string\n space?: string\n personal?: boolean\n teamSpaceId?: string\n teammateId?: string\n}\n\nexport interface SpaceParams {\n space?: string\n teamSpaceId?: string\n agentId?: number\n}\n\n/**\n * Error thrown when selector options violate a contract (mutually exclusive,\n * wrong format, etc). Action handlers catch this and print the message before\n * exiting with code 1.\n */\nexport class SpaceOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SpaceOptionsError'\n }\n}\n\n/**\n * Resolve mutually-exclusive space selector flags into normalized request params.\n *\n * Priority (only one must be set): --team-space-id > --teammate-id > --personal > -s <name>.\n * When none is set, returns empty params (server treats this as personal space).\n */\nexport function resolveSpaceSelector(options: SpaceOptions): SpaceParams {\n // Destructure first so TypeScript's control-flow analysis can narrow each\n // field through the subsequent non-null / non-empty checks without having\n // to re-read options.* at the point of use (which would lose narrowing).\n const { space, teamSpaceId, teammateId } = options\n const personalIsSet = options.personal === true\n\n // Count \"user-set\" selectors explicitly so the mutual-exclusion check\n // reflects intent (\"which flags did the user pass?\") rather than a\n // generic truthiness filter. This keeps the mutual-exclusion check\n // cleanly separated from the downstream format validation (e.g.\n // `parsed <= 0` for teammateId).\n const spaceIsSet = space != null && space !== ''\n const teamSpaceIdIsSet = teamSpaceId != null && teamSpaceId !== ''\n const teammateIdIsSet = teammateId != null && teammateId !== ''\n const selectorCount =\n (spaceIsSet ? 1 : 0) + (personalIsSet ? 1 : 0) + (teamSpaceIdIsSet ? 1 : 0) + (teammateIdIsSet ? 1 : 0)\n if (selectorCount > 1) {\n throw new SpaceOptionsError(\n 'Error: -s, --personal, --team-space-id, and --teammate-id are mutually exclusive.',\n )\n }\n\n // Dispatch via the underlying field checks (not `*IsSet`) so TypeScript\n // narrows each local to `string`, letting us return without `!`.\n if (teamSpaceId != null && teamSpaceId !== '') {\n return { teamSpaceId }\n }\n if (teammateId != null && teammateId !== '') {\n const parsed = Number.parseInt(teammateId, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== teammateId) {\n throw new SpaceOptionsError(\n `Error: --teammate-id must be a positive integer, got \"${teammateId}\".`,\n )\n }\n return { agentId: parsed }\n }\n if (personalIsSet) {\n return { space: 'personal' }\n }\n if (space != null && space !== '') {\n return { space }\n }\n return {}\n}\n\n/**\n * Build the `?path=...&space=...` query string for file endpoints.\n * Returns empty string when no params are set (caller should not append `?`).\n * Values are URL-encoded via URLSearchParams.\n *\n * An empty-string `path` is treated as \"not provided\" and omitted from the query;\n * callers should pass `undefined` rather than `\"\"` when no path is intended.\n */\nexport function buildFileQueryString(path: string | undefined, spaceParams: SpaceParams): string {\n const params = new URLSearchParams()\n if (path != null && path !== '') {\n params.set('path', path)\n }\n if (spaceParams.space) {\n params.set('space', spaceParams.space)\n }\n if (spaceParams.teamSpaceId) {\n params.set('teamSpaceId', spaceParams.teamSpaceId)\n }\n if (spaceParams.agentId != null) {\n params.set('agentId', String(spaceParams.agentId))\n }\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\n/**\n * Detect if a Buffer contains binary content by sampling the first 8192 bytes.\n * Control characters other than tab (9), LF (10), and CR (13) are treated as binary.\n */\nexport function isBinaryContent(buffer: Buffer): boolean {\n const sampleSize = Math.min(buffer.length, 8192)\n\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i]\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Validate `file read` command's top-level mutually-exclusive options (-u vs -w/-p).\n * Returns the resolved mode ('by-url' or 'by-path'). Throws SpaceOptionsError on conflict.\n *\n * Empty strings are treated as \"not provided\" (commander never passes empty strings\n * for optional flags, but callers outside the CLI context should pass undefined instead\n * of \"\" to avoid unexpected branch behaviour).\n */\nexport type ReadMode = { kind: 'by-url'; url: string } | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveReadMode(options: {\n url?: string\n workspace?: string\n path?: string\n}): ReadMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n // At this point both workspace and path are guaranteed non-empty by the guards\n // above. Use explicit checks so TypeScript narrows the types without needing `!`.\n if (!options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n return { kind: 'by-path', workspace: options.workspace, path: options.path }\n}\n\n/**\n * Validate `file put` command's top-level mutually-exclusive options (-u vs -w/-p).\n *\n * By-URL puts overwrite an existing file (the URL already identifies it), so\n * `--recursive` is meaningless in that mode and is rejected outright to keep the\n * user's intent unambiguous.\n */\nexport type WriteMode =\n | { kind: 'by-url'; url: string }\n | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveWriteMode(options: {\n url?: string\n workspace?: string\n path?: string\n recursive?: boolean\n}): WriteMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (options.url && options.recursive) {\n throw new SpaceOptionsError('Error: --recursive cannot be used with --url (the file must already exist)')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n return { kind: 'by-path', workspace: options.workspace!, path: options.path! }\n}\n","import { arch, platform } from 'os'\nimport { getApiBaseUrl, getApiKey } from './config.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport interface ApiResponse<T> {\n ok: boolean\n status: number\n data: T\n}\n\nexport interface RawApiResponse {\n ok: boolean\n status: number\n text: string\n contentType: string | null\n}\n\nfunction getUserAgent(): string {\n return `moxt-cli/${__CLI_VERSION__} (${platform()}/${arch()}) node/${process.versions.node}`\n}\n\nasync function fetchApi(method: string, path: string, body?: unknown): Promise<Response> {\n const apiKey = getApiKey()\n const url = `${getApiBaseUrl()}${path}`\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n 'User-Agent': getUserAgent(),\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n\n if (response.status === 401) {\n console.error('Authentication failed. Check your MOXT_API_KEY.')\n console.error('Get a new key at: https://moxt.ai')\n process.exit(1)\n }\n\n return response\n}\n\nasync function request<T>(method: string, path: string, body?: unknown): Promise<ApiResponse<T>> {\n const response = await fetchApi(method, path, body)\n const contentType = response.headers.get('content-type')\n const data = contentType?.includes('application/json') ? ((await response.json()) as T) : ((await response.text()) as T)\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n }\n}\n\nexport async function httpGet<T>(path: string): Promise<ApiResponse<T>> {\n return request<T>('GET', path)\n}\n\nexport async function httpPut<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PUT', path, body)\n}\n\nexport async function httpPost<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('POST', path, body)\n}\n\nexport async function httpPatch<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PATCH', path, body)\n}\n\nexport async function httpDelete<T>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return request<T>('DELETE', path, body)\n}\n\nexport async function httpRaw(method: 'GET' | 'POST' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<RawApiResponse> {\n const response = await fetchApi(method, path, body)\n return {\n ok: response.ok,\n status: response.status,\n text: await response.text(),\n contentType: response.headers.get('content-type'),\n }\n}\n","const DEFAULT_HOST = 'api.moxt.ai'\n\nexport function getApiBaseUrl(): string {\n const host = process.env.MOXT_HOST ?? DEFAULT_HOST\n return `https://${host}/openapi/v1`\n}\n\nexport function getApiKey(): string {\n const apiKey = process.env.MOXT_API_KEY\n\n if (!apiKey) {\n console.error('MOXT_API_KEY environment variable is not set.')\n console.error('')\n console.error('Get your API key at: https://moxt.ai')\n console.error('')\n console.error('Then set it:')\n console.error(' export MOXT_API_KEY=moxt_...')\n process.exit(1)\n }\n\n return apiKey\n}\n\nexport function getApiKeyOrUndefined(): string | undefined {\n return process.env.MOXT_API_KEY\n}\n","// ANSI colors\nexport const colors = {\n bold: '\\x1b[1m',\n blue: '\\x1b[1;34m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n cyan: '\\x1b[36m',\n dim: '\\x1b[2m',\n reset: '\\x1b[0m',\n}\n\nexport function print(message: string): void {\n console.log(message)\n}\n\nexport function printError(message: string): void {\n console.error(`${colors.red}${message}${colors.reset}`)\n}\n","const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nlet intervalId: ReturnType<typeof setInterval> | null = null\nlet frameIndex = 0\n\nexport function startSpinner(message: string): void {\n frameIndex = 0\n process.stdout.write(`${frames[frameIndex]} ${message}`)\n\n intervalId = setInterval(() => {\n frameIndex = (frameIndex + 1) % frames.length\n process.stdout.write(`\\r${frames[frameIndex]} ${message}`)\n }, 80)\n}\n\nexport function stopSpinner(success: boolean, message?: string): void {\n if (intervalId) {\n clearInterval(intervalId)\n intervalId = null\n }\n\n const symbol = success ? '\\x1b[32m✓\\x1b[0m' : '\\x1b[31m✗\\x1b[0m'\n // \\x1b[2K 清除整行,\\r 回到行首\n process.stdout.write(`\\x1b[2K\\r${symbol} ${message ?? ''}\\n`)\n}\n","export class SearchOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SearchOptionsError'\n }\n}\n\nexport function parseSearchLimit(raw: string | undefined, defaultValue: number, max: number): number {\n if (raw == null || raw === '') {\n return defaultValue\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --limit must be a positive integer, got \"${raw}\".`)\n }\n if (parsed > max) {\n throw new SearchOptionsError(`Error: --limit must be less than or equal to ${max}.`)\n }\n return parsed\n}\n\nexport function parseSearchMode(raw: string | undefined): 'all' | 'any' {\n if (raw == null || raw === '') {\n return 'any'\n }\n if (raw === 'all' || raw === 'any') {\n return raw\n }\n throw new SearchOptionsError(`Error: --mode must be \"any\" or \"all\", got \"${raw}\".`)\n}\n\nexport function parseTeammateId(raw: string | undefined): number | undefined {\n if (raw == null || raw === '') {\n return undefined\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --teammate-id must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n","import { SpaceOptionsError } from './file-selector.js'\nimport { printError } from './output.js'\nimport { SearchOptionsError } from './search-options.js'\n\n/**\n * Call a pure resolver that may throw a known CLI option error; on error,\n * print the message and exit(1). This keeps the user-facing contract\n * (stderr + exit code 1) consistent across subcommands while letting the\n * resolvers stay pure and unit-testable.\n */\nexport function runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n","import { Command } from 'commander'\nimport { httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseTeammateId } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface MemorySearchItem {\n rank: number\n pipelineId: string\n chunkId: string\n chunkIndex: number\n content: string\n contentTruncated: boolean\n}\n\ninterface MemorySearchResponse {\n items: MemorySearchItem[]\n}\n\nexport function registerMemoryCommand(program: Command): void {\n const memory = program.command('memory').description('Memory operations')\n\n memory.command('search')\n .description('Search archived agent memory')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('--teammate-id <teammateId>', 'Search a managed AI teammate memory')\n .option('-l, --limit <limit>', 'Maximum number of memory chunks to return', '5')\n .argument('<query>', 'Search query')\n .action(\n async (\n query: string,\n options: {\n workspace: string\n teammateId?: string\n limit?: string\n },\n ) => {\n const limit = runOrExit(() => parseSearchLimit(options.limit, 5, 10))\n const teammateId = runOrExit(() => parseTeammateId(options.teammateId))\n\n startSpinner('Searching memory...')\n const response = await httpPost<MemorySearchResponse>(\n `/workspaces/${options.workspace}/memory/search`,\n {\n query,\n limit,\n ...(teammateId !== undefined ? { agentId: teammateId } : {}),\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No memory found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} memory chunk(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. pipeline=${item.pipelineId} chunk=${item.chunkIndex}${colors.reset}`)\n print(`${colors.dim}chunkId=${item.chunkId}${item.contentTruncated ? ' truncated=true' : ''}${colors.reset}`)\n print(item.content)\n print('')\n }\n },\n )\n}\n","export class MiniappDbOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MiniappDbOptionsError'\n }\n}\n\nconst NON_FILTER_QUERY_PARAMS = new Set([\n 'select',\n 'order',\n 'limit',\n 'offset',\n 'range',\n 'range-unit',\n])\n\nconst ALLOWED_MINIAPP_DB_EMAIL_DOMAINS = ['@paraflow.com', '@moxt.ai', '@kanyun.com']\n\nexport function normalizePostgrestPath(path: string): string {\n const trimmed = path.trim()\n if (!trimmed) {\n throw new MiniappDbOptionsError('Error: PostgREST path is required.')\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\nexport function buildMiniappDbDataPath(workspaceId: string, appId: string, postgrestPath: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/data${normalizePostgrestPath(postgrestPath)}`\n}\n\nexport function buildMiniappDbSchemaPath(workspaceId: string, appId: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/schema`\n}\n\nexport function parseJsonBody(raw: string): unknown {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new MiniappDbOptionsError(`Error: --body must be valid JSON. ${detail}`)\n }\n\n if (parsed === null || (typeof parsed !== 'object' && !Array.isArray(parsed))) {\n throw new MiniappDbOptionsError('Error: --body must be a JSON object or array.')\n }\n return parsed\n}\n\nexport function hasPostgrestFilter(postgrestPath: string): boolean {\n const normalizedPath = normalizePostgrestPath(postgrestPath)\n const parsed = new URL(normalizedPath, 'https://postgrest.local')\n for (const [name] of parsed.searchParams.entries()) {\n if (!NON_FILTER_QUERY_PARAMS.has(name.toLowerCase())) {\n return true\n }\n }\n return false\n}\n\nexport function assertPostgrestFilter(postgrestPath: string, method: 'PATCH' | 'DELETE'): void {\n if (!hasPostgrestFilter(postgrestPath)) {\n throw new MiniappDbOptionsError(\n `Error: ${method.toLowerCase()} requires at least one PostgREST filter query parameter.`,\n )\n }\n}\n\nexport function formatRawResponse(text: string, pretty?: boolean): string {\n if (!pretty || !text) {\n return text\n }\n try {\n return JSON.stringify(JSON.parse(text), null, 2)\n } catch {\n return text\n }\n}\n\nexport function isAllowedMiniappDbUserEmail(email: string): boolean {\n const normalized = email.trim().toLowerCase()\n return ALLOWED_MINIAPP_DB_EMAIL_DOMAINS.some((domain) => normalized.endsWith(domain))\n}\n","import { Command } from 'commander'\nimport {\n assertPostgrestFilter,\n buildMiniappDbDataPath,\n buildMiniappDbSchemaPath,\n formatRawResponse,\n isAllowedMiniappDbUserEmail,\n MiniappDbOptionsError,\n parseJsonBody,\n} from '../utils/miniapp-db.js'\nimport { httpGet, httpRaw } from '../utils/http.js'\nimport { print, printError } from '../utils/output.js'\n\ninterface MiniappDbOptions {\n workspace: string\n appId: string\n pretty?: boolean\n body?: string\n yes?: boolean\n}\n\ninterface MiniappDbSchemaResponse {\n sql: string\n}\n\ninterface WhoamiResponse {\n email: string\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof MiniappDbOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addMiniappDbTargetOptions(command: Command): Command {\n return command\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .requiredOption('--app-id <appId>', 'Miniapp app ID')\n}\n\nfunction handleRawResponse(response: Awaited<ReturnType<typeof httpRaw>>, pretty?: boolean): void {\n if (!response.ok) {\n printError(`Error [${response.status}]: ${response.text}`)\n process.exit(1)\n }\n print(formatRawResponse(response.text, pretty))\n}\n\nasync function ensureAllowedMiniappDbUser(): Promise<void> {\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (!isAllowedMiniappDbUserEmail(response.data.email)) {\n printError('Error: miniapp db commands are only available to @paraflow.com, @moxt.ai, or @kanyun.com users.')\n process.exit(1)\n }\n}\n\nasync function requestDataApi(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n postgrestPath: string,\n options: MiniappDbOptions,\n body?: unknown,\n): Promise<void> {\n await ensureAllowedMiniappDbUser()\n const path = buildMiniappDbDataPath(options.workspace, options.appId, postgrestPath)\n const response = await httpRaw(method, path, body)\n handleRawResponse(response, options.pretty)\n}\n\nexport function registerMiniappCommand(program: Command): void {\n const miniapp = program.command('miniapp', { hidden: true }).description('Miniapp operations')\n const db = miniapp.command('db').description('Miniapp database operations')\n\n addMiniappDbTargetOptions(\n db.command('schema').description('Print the miniapp database schema SQL'),\n ).action(async (options: MiniappDbOptions) => {\n await ensureAllowedMiniappDbUser()\n const response = await httpGet<MiniappDbSchemaResponse>(buildMiniappDbSchemaPath(options.workspace, options.appId))\n\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n print(response.data.sql)\n })\n\n addMiniappDbTargetOptions(\n db.command('get')\n .description('Read miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos?select=*')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n await requestDataApi('GET', postgrestPath, options)\n })\n\n addMiniappDbTargetOptions(\n db.command('post')\n .description('Create miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('POST', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('patch')\n .description('Update miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'PATCH'))\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('PATCH', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('delete')\n .description('Delete miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .option('--yes', 'Confirm the delete operation')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n if (options.yes !== true) {\n printError('Error: delete requires --yes.')\n process.exit(1)\n }\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'DELETE'))\n await requestDataApi('DELETE', postgrestPath, options)\n })\n}\n","import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nexport interface TelemetryConfig {\n disabled?: boolean\n noticeShown?: boolean\n}\n\nfunction getConfigPath(): string {\n return path.join(os.homedir(), '.moxt', 'config.json')\n}\n\nexport function readTelemetryConfig(): TelemetryConfig {\n try {\n const raw = fs.readFileSync(getConfigPath(), 'utf8')\n const parsed = JSON.parse(raw) as { telemetry?: TelemetryConfig }\n return parsed.telemetry ?? {}\n } catch {\n return {}\n }\n}\n\nexport function writeTelemetryConfig(update: Partial<TelemetryConfig>): void {\n const configPath = getConfigPath()\n let existing: Record<string, unknown> = {}\n try {\n existing = JSON.parse(fs.readFileSync(configPath, 'utf8')) as Record<string, unknown>\n } catch {\n existing = {}\n }\n const currentTelemetry = (existing.telemetry as TelemetryConfig | undefined) ?? {}\n const next = { ...existing, telemetry: { ...currentTelemetry, ...update } }\n fs.mkdirSync(path.dirname(configPath), { recursive: true })\n fs.writeFileSync(configPath, JSON.stringify(next, null, 2))\n}\n","import { readTelemetryConfig } from './config.js'\n\nexport function isCiEnvironment(): boolean {\n return process.env.CI === 'true' || process.env.CI === '1'\n}\n\nexport function isTelemetryDisabled(): boolean {\n if (process.env.MOXT_TELEMETRY_DISABLED === '1' || process.env.MOXT_TELEMETRY_DISABLED === 'true') {\n return true\n }\n if (process.env.DO_NOT_TRACK === '1' || process.env.DO_NOT_TRACK === 'true') {\n return true\n }\n return readTelemetryConfig().disabled === true\n}\n","import { Command } from 'commander'\nimport { readTelemetryConfig, writeTelemetryConfig } from '../telemetry/config.js'\nimport { isTelemetryDisabled } from '../telemetry/opt-out.js'\nimport { print } from '../utils/output.js'\n\nexport function registerTelemetryCommand(program: Command): void {\n const telemetry = program.command('telemetry').description('Manage Moxt CLI telemetry')\n\n telemetry\n .command('status')\n .description('Show telemetry status')\n .action(() => {\n const cfg = readTelemetryConfig()\n const envOverride =\n process.env.MOXT_TELEMETRY_DISABLED === '1' ||\n process.env.MOXT_TELEMETRY_DISABLED === 'true' ||\n process.env.DO_NOT_TRACK === '1' ||\n process.env.DO_NOT_TRACK === 'true'\n\n const state = isTelemetryDisabled() ? 'disabled' : 'enabled'\n print(`telemetry: ${state}`)\n if (envOverride) {\n print('(disabled via environment variable)')\n } else if (cfg.disabled) {\n print('(disabled via config file)')\n }\n })\n\n telemetry\n .command('enable')\n .description('Enable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: false })\n print('telemetry: enabled')\n })\n\n telemetry\n .command('disable')\n .description('Disable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: true })\n print('telemetry: disabled')\n })\n}\n","import { Command } from 'commander'\nimport { httpGet } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WhoamiResponse {\n nickname: string\n email: string\n}\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n startSpinner('Fetching user info...')\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n\n if (response.ok) {\n stopSpinner(true, 'Done')\n print(`${colors.bold}Nickname${colors.reset}: ${response.data.nickname}`)\n print(`${colors.bold}Email${colors.reset}: ${response.data.email}`)\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander'\nimport { httpGet, httpDelete } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WorkspaceItem {\n workspaceId: string\n name: string\n}\n\ninterface WorkspaceListResponse {\n workspaces: WorkspaceItem[]\n}\n\ninterface MemberItem {\n userId: number\n email: string\n displayName: string | null\n role: string\n}\n\ninterface MembersResponse {\n members: MemberItem[]\n}\n\ninterface SpaceItem {\n type: 'personal' | 'team' | 'teammate'\n name: string\n teamSpaceId: string | null\n agentId: number | null\n}\n\n// Email regex (same as web/src/utils/email.ts)\nconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\n\nfunction isValidEmail(email: string): boolean {\n return emailRegex.test(email)\n}\n\nexport function registerWorkspaceCommand(program: Command): void {\n const workspace = program.command('workspace').description('Workspace management')\n\n workspace\n .command('list')\n .description('List all workspaces you belong to')\n .action(async () => {\n startSpinner('Fetching workspaces...')\n const response = await httpGet<WorkspaceListResponse>('/workspaces')\n\n if (response.ok) {\n const { workspaces } = response.data\n if (workspaces.length === 0) {\n stopSpinner(true, 'No workspaces found.')\n return\n }\n\n stopSpinner(true, `Found ${workspaces.length} workspace(s)`)\n\n for (const ws of workspaces) {\n print(`${colors.bold}${ws.workspaceId}${colors.reset}\\t${ws.name}`)\n }\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n\n const members = program.command('members').description('Manage workspace members')\n\n members\n .command('list')\n .description('List all members in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching workspace members...')\n const response = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { members } = response.data\n if (members.length === 0) {\n stopSpinner(true, 'No members found.')\n return\n }\n\n stopSpinner(true, `Found ${members.length} member(s)`)\n\n for (const member of members) {\n const name = member.displayName || '-'\n print(`${colors.bold}${member.email}${colors.reset}\\t${name}\\t${member.role}`)\n }\n })\n\n members\n .command('remove')\n .description('Remove members from a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .argument('<emails>', 'Emails to remove (comma-separated)')\n .action(async (emailsArg: string, options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n const emails = emailsArg.split(',').map((e) => e.trim()).filter(Boolean)\n if (emails.length === 0) {\n printError('No valid emails provided')\n process.exit(1)\n }\n\n // Validate email format\n const invalidEmails = emails.filter((e) => !isValidEmail(e))\n if (invalidEmails.length > 0) {\n for (const email of invalidEmails) {\n printError(`Invalid email format: ${email}`)\n }\n process.exit(1)\n }\n\n // Fetch members to get userId by email\n startSpinner('Fetching workspace members...')\n const membersResponse = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!membersResponse.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${membersResponse.status}]: ${JSON.stringify(membersResponse.data)}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Members fetched')\n\n const { members } = membersResponse.data\n const emailToMember = new Map(members.map((m) => [m.email.toLowerCase(), m]))\n\n // Remove each member\n for (const email of emails) {\n const member = emailToMember.get(email.toLowerCase())\n if (!member) {\n print(`${colors.red}✗${colors.reset} ${email} - not found in workspace`)\n continue\n }\n\n const deleteResponse = await httpDelete(`/workspaces/${workspaceId}/members/${member.userId}`)\n\n if (deleteResponse.ok) {\n print(`${colors.green}✓${colors.reset} ${email} - removed`)\n } else {\n print(`${colors.red}✗${colors.reset} ${email} - failed: ${JSON.stringify(deleteResponse.data)}`)\n }\n }\n })\n\n const space = program.command('space').description('Manage spaces')\n\n space\n .command('list')\n .description('List accessible spaces in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching spaces...')\n const response = await httpGet<{ spaces: SpaceItem[] }>(`/workspaces/${workspaceId}/spaces`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch spaces')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { spaces } = response.data\n if (spaces.length === 0) {\n stopSpinner(true, 'No spaces found.')\n return\n }\n\n stopSpinner(true, `Found ${spaces.length} space(s)`)\n\n print(\n `${colors.bold}TYPE${colors.reset}\\t${colors.bold}TEAM_SPACE_ID${colors.reset}\\t${colors.bold}TEAMMATE_ID${colors.reset}\\t${colors.bold}NAME${colors.reset}`,\n )\n for (const s of spaces) {\n const teamSpaceId = s.teamSpaceId ?? ''\n const teammateId = s.agentId != null ? String(s.agentId) : ''\n print(`${s.type}\\t${teamSpaceId}\\t${teammateId}\\t${s.name}`)\n }\n })\n\n}\n","import * as fs from 'node:fs'\nimport { TextDecoder } from 'node:util'\nimport { Command } from 'commander'\nimport {\n isBinaryContent,\n resolveSpaceSelector,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPatch, httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { parseSearchLimit, SearchOptionsError } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\nconst MAX_DESC_LENGTH = 5000\nconst MAX_COMMENT_CONTENT_LENGTH = 5000\nconst MAX_COMMENT_CONTENT_BYTES = MAX_COMMENT_CONTENT_LENGTH * 4\n\ntype WorkflowStatusTypeValue = 1 | 2 | 3\ntype WorkflowTaskPriorityValue = 0 | 1 | 2 | 3\n\ninterface WorkflowItem {\n fileId: string\n ownerHumanId: number | null\n desc: string | null\n}\n\ninterface WorkflowListResponse {\n workflows: WorkflowItem[]\n}\n\ninterface WorkflowDetailResponse extends WorkflowItem {\n statusList: WorkflowStatusItem[]\n transitions: WorkflowTransitionItem[]\n}\n\ninterface WorkflowStatusItem {\n scopedId: number\n name: string\n desc: string | null\n type: WorkflowStatusTypeValue\n preferredAssignee: AssigneeInfo | null\n order: number\n}\n\ninterface WorkflowTransitionItem {\n statusFromScopedId: number\n statusToScopedId: number\n}\n\ninterface WorkflowTaskItem {\n scopedId: number\n workflowFileId: string\n ownerHumanId: number | null\n title: string\n desc: string | null\n statusScopedId: number\n priority: WorkflowTaskPriorityValue\n assignee: AssigneeInfo | null\n linkedFileIds: string[]\n subscribed: boolean\n runningAgentRuns: Array<{\n pipelineId: string\n executor: AssigneeInfo | null\n }>\n createdAt: string\n latestActAt: string\n}\n\ninterface WorkflowTaskListResponse {\n tasks: WorkflowTaskItem[]\n nextCursor: string | null\n}\n\ninterface WorkflowTaskCreateResponse {\n taskScopedId: number\n}\n\ninterface WorkflowPipelineStatusItem {\n workflowPipelineTriggerId: number\n pipelineStatus: string\n}\n\ninterface WorkflowCommentItem {\n id: number\n workflowFileId: string\n workflowTaskScopedId: number\n content: string\n createdBy: AssigneeInfo | null\n createdAt: string\n updatedAt: string\n}\n\ninterface WorkflowCommentListResponse {\n items: WorkflowCommentItem[]\n}\n\ntype AssigneeInfo =\n | { type: 'human'; humanId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'assistant'; aiAssistantId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'teammate'; aiTeammateId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'unknown'; humanId: number | null; aiAssistantId: number | null; aiTeammateId: number | null }\n\ninterface WorkflowSpaceOptions extends SpaceOptions {\n path: string\n descFile?: string\n ownerHumanId?: string\n}\n\ninterface AssigneeOptions {\n humanId?: string\n assistantId?: string\n teammateId?: string\n clear?: boolean\n}\n\ninterface PreferredAssigneeOptions {\n preferredHumanId?: string\n preferredAssistantId?: string\n preferredTeammateId?: string\n clearPreferredAssignee?: boolean\n}\n\nclass WorkflowOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkflowOptionsError'\n }\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof WorkflowOptionsError || err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addWorkspaceOption(command: Command): Command {\n return command.requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n}\n\nfunction addSpaceOptions(command: Command): Command {\n return addWorkspaceOption(command)\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nfunction addAssigneeOptions(command: Command): Command {\n return command\n .option('--human-id <humanId>', 'Human assignee ID')\n .option('--assistant-id <assistantId>', 'AI assistant assignee ID')\n .option('--teammate-id <teammateId>', 'AI teammate assignee ID')\n}\n\nfunction addPreferredAssigneeOptions(command: Command): Command {\n return command\n .option('--preferred-human-id <humanId>', 'Preferred human assignee ID')\n .option('--preferred-assistant-id <assistantId>', 'Preferred AI assistant assignee ID')\n .option('--preferred-teammate-id <teammateId>', 'Preferred AI teammate assignee ID')\n}\n\nfunction parsePositiveInteger(raw: string, label: string): number {\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new WorkflowOptionsError(`Error: ${label} must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n\nfunction parseOptionalPositiveInteger(raw: string | undefined, label: string): number | undefined {\n if (raw == null || raw === '') return undefined\n return parsePositiveInteger(raw, label)\n}\n\nfunction parseStatusType(raw: string | undefined): WorkflowStatusTypeValue | undefined {\n if (raw == null || raw === '') return undefined\n const parsed = Number.parseInt(raw, 10)\n if ((parsed === 1 || parsed === 2 || parsed === 3) && String(parsed) === raw) return parsed\n throw new WorkflowOptionsError('Error: --type must be one of 1 (todo), 2 (in-progress), or 3 (done).')\n}\n\nfunction parseRequiredStatusType(raw: string | undefined): WorkflowStatusTypeValue {\n const value = parseStatusType(raw)\n if (value === undefined) {\n throw new WorkflowOptionsError('Error: --type is required.')\n }\n return value\n}\n\nfunction parsePriority(raw: string | undefined): WorkflowTaskPriorityValue | undefined {\n if (raw == null || raw === '') return undefined\n if (raw === 'urgent') return 0\n if (raw === 'high') return 1\n if (raw === 'medium') return 2\n if (raw === 'low') return 3\n throw new WorkflowOptionsError('Error: --priority must be \"urgent\", \"high\", \"medium\", or \"low\".')\n}\n\nfunction parseRequiredPriority(raw: string | undefined): WorkflowTaskPriorityValue {\n return parsePriority(raw ?? 'medium') ?? 2\n}\n\nfunction parseWorkflowScope(raw: string | undefined): 'all' | 'owner_is_me' {\n if (raw == null || raw === '') return 'all'\n if (raw === 'all' || raw === 'owner_is_me') return raw\n throw new WorkflowOptionsError('Error: --scope must be \"all\" or \"owner_is_me\".')\n}\n\nfunction parseTaskScope(raw: string | undefined): 'all' | 'assigned_to_me' | 'subscribed_by_me' | 'owner_is_me' {\n if (raw == null || raw === '') return 'all'\n if (raw === 'all' || raw === 'assigned_to_me' || raw === 'subscribed_by_me' || raw === 'owner_is_me') {\n return raw\n }\n throw new WorkflowOptionsError(\n 'Error: --scope must be \"all\", \"assigned_to_me\", \"subscribed_by_me\", or \"owner_is_me\".',\n )\n}\n\nfunction parseFileIds(raw: string | undefined, label = '--file-ids'): string[] | undefined {\n if (raw == null || raw === '') return undefined\n const ids = raw.split(',').map((item) => item.trim()).filter(Boolean)\n if (ids.length === 0) {\n throw new WorkflowOptionsError(`Error: ${label} must include at least one file ID.`)\n }\n return ids\n}\n\nfunction readDescFile(path: string | undefined): string | undefined {\n if (path == null || path === '') return undefined\n if (!fs.existsSync(path)) {\n throw new WorkflowOptionsError(`Error: desc file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new WorkflowOptionsError(`Error: desc file is not a file: ${path}`)\n }\n const buffer = fs.readFileSync(path)\n if (isBinaryContent(buffer)) {\n throw new WorkflowOptionsError('Error: desc file must be UTF-8 text, not binary content.')\n }\n const content = buffer.toString('utf8')\n if (content.length > MAX_DESC_LENGTH) {\n throw new WorkflowOptionsError(`Error: desc file must be at most ${MAX_DESC_LENGTH} characters.`)\n }\n return content\n}\n\nfunction readCommentContentFile(path: string): string {\n if (!fs.existsSync(path)) {\n throw new WorkflowOptionsError(`Error: comment content file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new WorkflowOptionsError(`Error: comment content path is not a file: ${path}`)\n }\n if (stat.size > MAX_COMMENT_CONTENT_BYTES) {\n throw new WorkflowOptionsError(\n `Error: comment content file must be at most ${MAX_COMMENT_CONTENT_LENGTH} characters.`,\n )\n }\n const buffer = fs.readFileSync(path)\n if (buffer.includes(0)) {\n throw new WorkflowOptionsError('Error: comment content file must not contain NUL bytes.')\n }\n if (isBinaryContent(buffer)) {\n throw new WorkflowOptionsError('Error: comment content file must be UTF-8 text, not binary content.')\n }\n let content: string\n try {\n content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer)\n } catch {\n throw new WorkflowOptionsError('Error: comment content file must contain valid UTF-8 text.')\n }\n if (content.length === 0) {\n throw new WorkflowOptionsError('Error: comment content file must not be empty.')\n }\n if (content.length > MAX_COMMENT_CONTENT_LENGTH) {\n throw new WorkflowOptionsError(\n `Error: comment content file must be at most ${MAX_COMMENT_CONTENT_LENGTH} characters.`,\n )\n }\n return content\n}\n\nfunction parseAssigneeBody(options: AssigneeOptions, allowClear: boolean): Record<string, number | null> {\n const hasClear = options.clear === true\n const humanId = parseOptionalPositiveInteger(options.humanId, '--human-id')\n const assistantId = parseOptionalPositiveInteger(options.assistantId, '--assistant-id')\n const teammateId = parseOptionalPositiveInteger(options.teammateId, '--teammate-id')\n const count =\n (humanId !== undefined ? 1 : 0) + (assistantId !== undefined ? 1 : 0) + (teammateId !== undefined ? 1 : 0)\n if (hasClear && !allowClear) {\n throw new WorkflowOptionsError('Error: --clear is not supported here.')\n }\n if (hasClear && count > 0) {\n throw new WorkflowOptionsError('Error: --clear cannot be used with assignee ID options.')\n }\n if (count > 1) {\n throw new WorkflowOptionsError('Error: assignee ID options are mutually exclusive.')\n }\n if (hasClear) return {}\n if (humanId !== undefined) return { assigneeHumanId: humanId }\n if (assistantId !== undefined) return { assigneeAiAssistantId: assistantId }\n if (teammateId !== undefined) return { assigneeAiTeammateId: teammateId }\n return {}\n}\n\nfunction parsePreferredAssigneeBody(options: PreferredAssigneeOptions): Record<string, number | null> {\n const hasClear = options.clearPreferredAssignee === true\n const humanId = parseOptionalPositiveInteger(options.preferredHumanId, '--preferred-human-id')\n const assistantId = parseOptionalPositiveInteger(options.preferredAssistantId, '--preferred-assistant-id')\n const teammateId = parseOptionalPositiveInteger(options.preferredTeammateId, '--preferred-teammate-id')\n const count =\n (humanId !== undefined ? 1 : 0) + (assistantId !== undefined ? 1 : 0) + (teammateId !== undefined ? 1 : 0)\n if (hasClear && count > 0) {\n throw new WorkflowOptionsError('Error: --clear-preferred-assignee cannot be used with preferred assignee ID options.')\n }\n if (count > 1) {\n throw new WorkflowOptionsError('Error: preferred assignee ID options are mutually exclusive.')\n }\n if (hasClear) return { preferredAssigneeHumanId: null }\n if (humanId !== undefined) return { preferredAssigneeHumanId: humanId }\n if (assistantId !== undefined) return { preferredAssigneeAiAssistantId: assistantId }\n if (teammateId !== undefined) return { preferredAssigneeAiTeammateId: teammateId }\n return {}\n}\n\nfunction assertNonEmptyBody(body: Record<string, unknown>): void {\n if (Object.keys(body).length === 0) {\n throw new WorkflowOptionsError('Error: at least one update option must be provided.')\n }\n}\n\nfunction buildQuery(params: Record<string, string | number | undefined>): string {\n const query = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n query.set(key, String(value))\n }\n }\n const text = query.toString()\n return text ? `?${text}` : ''\n}\n\nfunction failResponse(response: { status: number; data: unknown }): never {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n}\n\nfunction priorityLabel(value: WorkflowTaskPriorityValue): string {\n switch (value) {\n case 0: return 'urgent'\n case 1: return 'high'\n case 2: return 'medium'\n case 3: return 'low'\n default: {\n const unsupportedValue: never = value\n throw new Error(`Unsupported workflow task priority: ${String(unsupportedValue)}`)\n }\n }\n}\n\nfunction statusTypeLabel(value: WorkflowStatusTypeValue): string {\n switch (value) {\n case 1: return 'todo'\n case 2: return 'in-progress'\n case 3: return 'done'\n default: {\n const unsupportedValue: never = value\n throw new Error(`Unsupported workflow status type: ${String(unsupportedValue)}`)\n }\n }\n}\n\nfunction formatAssignee(assignee: AssigneeInfo | null): string {\n if (!assignee) return '-'\n if (assignee.type === 'human') return assignee.displayName ?? `human:${assignee.humanId}`\n if (assignee.type === 'assistant') return assignee.displayName ?? `assistant:${assignee.aiAssistantId}`\n if (assignee.type === 'teammate') return assignee.displayName ?? `teammate:${assignee.aiTeammateId}`\n return 'unknown'\n}\n\nfunction printWorkflow(item: WorkflowItem): void {\n print(`${colors.bold}${item.fileId}${colors.reset}\\towner=${item.ownerHumanId ?? '-'}\\tdesc=${item.desc ?? '-'}`)\n}\n\ntype DetailScalar = string | number | boolean | null\n\nfunction indentation(size: number): string {\n return ' '.repeat(size)\n}\n\nfunction escapeTerminalControlCharacters(value: string): string {\n return value\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n )\n}\n\nfunction formatDetailScalar(value: DetailScalar): string {\n if (value === null) return 'null'\n if (typeof value === 'string') {\n const escaped = escapeTerminalControlCharacters(value)\n if (escaped === '') return '\"\"'\n if (/\\n/.test(escaped)) return JSON.stringify(escaped)\n return escaped\n }\n return String(value)\n}\n\nfunction printDetailField(name: string, value: DetailScalar, indent = 0): void {\n print(`${indentation(indent)}${name}: ${formatDetailScalar(value)}`)\n}\n\nfunction printDetailTextField(name: string, value: string | null, indent = 0): void {\n if (value === null || value === '') {\n printDetailField(name, value, indent)\n return\n }\n\n const escaped = escapeTerminalControlCharacters(value)\n print(`${indentation(indent)}${name}:`)\n for (const line of escaped.split('\\n')) {\n print(`${indentation(indent + 2)}${line}`)\n }\n}\n\nfunction printAssigneeDetail(name: string, assignee: AssigneeInfo | null, indent = 0): void {\n if (assignee === null) {\n printDetailField(name, null, indent)\n return\n }\n\n print(`${indentation(indent)}${name}:`)\n printDetailField('type', assignee.type, indent + 2)\n switch (assignee.type) {\n case 'human':\n printDetailField('humanId', assignee.humanId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'assistant':\n printDetailField('aiAssistantId', assignee.aiAssistantId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'teammate':\n printDetailField('aiTeammateId', assignee.aiTeammateId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'unknown':\n printDetailField('humanId', assignee.humanId, indent + 2)\n printDetailField('aiAssistantId', assignee.aiAssistantId, indent + 2)\n printDetailField('aiTeammateId', assignee.aiTeammateId, indent + 2)\n }\n}\n\nfunction printStatusRemainingFields(item: WorkflowStatusItem, indent: number): void {\n printDetailField('name', item.name, indent)\n printDetailTextField('desc', item.desc, indent)\n printDetailField('type', `${item.type} (${statusTypeLabel(item.type)})`, indent)\n printAssigneeDetail('preferredAssignee', item.preferredAssignee, indent)\n printDetailField('order', item.order, indent)\n}\n\nfunction printStatusDetail(item: WorkflowStatusItem): void {\n print(`${colors.bold}Status${colors.reset}`)\n printDetailField('scopedId', item.scopedId)\n printStatusRemainingFields(item, 0)\n}\n\nfunction printWorkflowDetail(item: WorkflowDetailResponse): void {\n print(`${colors.bold}Workflow${colors.reset}`)\n printDetailField('fileId', item.fileId)\n printDetailField('ownerHumanId', item.ownerHumanId)\n printDetailTextField('desc', item.desc)\n\n if (item.statusList.length === 0) {\n print('statusList: []')\n } else {\n print('statusList:')\n for (const status of item.statusList) {\n print(` - scopedId: ${status.scopedId}`)\n printStatusRemainingFields(status, 4)\n }\n }\n\n if (item.transitions.length === 0) {\n print('transitions: []')\n } else {\n print('transitions:')\n for (const transition of item.transitions) {\n print(` - statusFromScopedId: ${transition.statusFromScopedId}`)\n printDetailField('statusToScopedId', transition.statusToScopedId, 4)\n }\n }\n}\n\nfunction printTaskSummary(item: WorkflowTaskItem): void {\n const runIds = item.runningAgentRuns.map((run) => run.pipelineId).join(',') || '-'\n print(\n `${colors.bold}#${item.scopedId}${colors.reset}\\t${item.title}\\tstatus=${item.statusScopedId}\\tpriority=${priorityLabel(item.priority)}\\tassignee=${formatAssignee(item.assignee)}\\truns=${runIds}`,\n )\n}\n\nfunction printTaskDetail(item: WorkflowTaskItem): void {\n print(`${colors.bold}Task${colors.reset}`)\n printDetailField('scopedId', item.scopedId)\n printDetailField('workflowFileId', item.workflowFileId)\n printDetailField('ownerHumanId', item.ownerHumanId)\n printDetailField('title', item.title)\n printDetailTextField('desc', item.desc)\n printDetailField('statusScopedId', item.statusScopedId)\n printDetailField('priority', `${item.priority} (${priorityLabel(item.priority)})`)\n printAssigneeDetail('assignee', item.assignee)\n\n if (item.linkedFileIds.length === 0) {\n print('linkedFileIds: []')\n } else {\n print('linkedFileIds:')\n for (const fileId of item.linkedFileIds) print(` - ${fileId}`)\n }\n\n printDetailField('subscribed', item.subscribed)\n if (item.runningAgentRuns.length === 0) {\n print('runningAgentRuns: []')\n } else {\n print('runningAgentRuns:')\n for (const run of item.runningAgentRuns) {\n print(` - pipelineId: ${run.pipelineId}`)\n printAssigneeDetail('executor', run.executor, 4)\n }\n }\n printDetailField('createdAt', item.createdAt)\n printDetailField('latestActAt', item.latestActAt)\n}\n\nfunction printCommentDetail(item: WorkflowCommentItem): void {\n print(`${colors.bold}Comment${colors.reset}`)\n printDetailField('id', item.id)\n printDetailField('workflowFileId', item.workflowFileId)\n printDetailField('workflowTaskScopedId', item.workflowTaskScopedId)\n printDetailTextField('content', item.content)\n printAssigneeDetail('createdBy', item.createdBy)\n printDetailField('createdAt', item.createdAt)\n printDetailField('updatedAt', item.updatedAt)\n}\n\nexport function registerWorkflowCommand(program: Command): void {\n const workflow = program.command('workflow').description('Workflow operations')\n\n addWorkspaceOption(\n workflow.command('list')\n .description('List accessible workflows')\n .option('--scope <scope>', 'Workflow scope: all or owner_is_me', 'all'),\n ).action(async (options: { workspace: string; scope?: string }) => {\n const scope = runOrExit(() => parseWorkflowScope(options.scope))\n\n startSpinner('Fetching workflows...')\n const response = await httpGet<WorkflowListResponse>(\n `/workspaces/${options.workspace}/workflows${buildQuery({ scope })}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.workflows.length === 0) {\n stopSpinner(true, 'No workflows found.')\n return\n }\n stopSpinner(true, `Found ${response.data.workflows.length} workflow(s)`)\n for (const item of response.data.workflows) printWorkflow(item)\n })\n\n addSpaceOptions(\n workflow.command('create')\n .description('Create a blank workflow')\n .requiredOption('-p, --path <path>', 'Target .workflow path')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for workflow description')\n .option('--owner-human-id <humanId>', 'Workflow owner human ID'),\n ).action(async (options: WorkflowSpaceOptions) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n path: options.path,\n ...resolveSpaceSelector(options),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n return next\n })\n\n startSpinner('Creating workflow...')\n const response = await httpPost<WorkflowItem>(`/workspaces/${options.workspace}/workflows`, body)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow created')\n printWorkflow(response.data)\n })\n\n addWorkspaceOption(workflow.command('get').description('Get a workflow').argument('<workflowFileId>')).action(\n async (workflowFileId: string, options: { workspace: string }) => {\n startSpinner('Fetching workflow...')\n const response = await httpGet<WorkflowDetailResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow fetched')\n printWorkflowDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n workflow.command('update')\n .description('Update workflow metadata')\n .argument('<workflowFileId>')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for workflow description')\n .option('--owner-human-id <humanId>', 'Workflow owner human ID'),\n ).action(async (workflowFileId: string, options: { workspace: string; descFile?: string; ownerHumanId?: string }) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {}\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n assertNonEmptyBody(next)\n return next\n })\n\n startSpinner('Updating workflow...')\n const response = await httpPatch<WorkflowItem>(`/workspaces/${options.workspace}/workflows/${workflowFileId}`, body)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow updated')\n printWorkflow(response.data)\n })\n\n addWorkspaceOption(\n workflow.command('delete')\n .description('Delete a workflow')\n .argument('<workflowFileId>')\n .option('--message <message>', 'Commit message'),\n ).action(async (workflowFileId: string, options: { workspace: string; message?: string }) => {\n startSpinner('Deleting workflow...')\n const response = await httpDelete<{ fileId: string }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}`,\n options.message ? { message: options.message } : {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.fileId}`)\n })\n\n addWorkspaceOption(workflow.command('duplicate').description('Duplicate a workflow').argument('<workflowFileId>')).action(\n async (workflowFileId: string, options: { workspace: string }) => {\n startSpinner('Duplicating workflow...')\n const response = await httpPost<WorkflowItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/duplicate`,\n {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow duplicated')\n printWorkflow(response.data)\n },\n )\n\n registerStatusCommands(workflow)\n registerTransitionCommands(workflow)\n registerTaskCommands(workflow)\n registerCommentCommands(workflow)\n registerRunCommands(workflow)\n}\n\nfunction registerStatusCommands(workflow: Command): void {\n const status = workflow.command('status').description('Workflow status operations')\n\n addPreferredAssigneeOptions(\n addWorkspaceOption(\n status.command('create')\n .description('Create a workflow status')\n .argument('<workflowFileId>')\n .requiredOption('--name <name>', 'Status name')\n .requiredOption('--type <type>', 'Status type value: 1=todo, 2=in-progress, 3=done')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for status description'),\n ),\n ).action(\n async (\n workflowFileId: string,\n options: { workspace: string; name: string; type?: string; descFile?: string } & PreferredAssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n name: options.name,\n type: parseRequiredStatusType(options.type),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n Object.assign(next, parsePreferredAssigneeBody(options))\n return next\n })\n startSpinner('Creating status...')\n const response = await httpPost<WorkflowStatusItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status created')\n printStatusDetail(response.data)\n },\n )\n\n addPreferredAssigneeOptions(\n addWorkspaceOption(\n status.command('update')\n .description('Update a workflow status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>')\n .option('--name <name>', 'Status name')\n .option('--type <type>', 'Status type value: 1=todo, 2=in-progress, 3=done')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for status description')\n .option('--clear-desc', 'Clear status description')\n .option('--clear-preferred-assignee', 'Clear preferred assignee'),\n ),\n ).action(\n async (\n workflowFileId: string,\n statusScopedId: string,\n options: {\n workspace: string\n name?: string\n type?: string\n descFile?: string\n clearDesc?: boolean\n } & PreferredAssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n if (options.descFile && options.clearDesc) {\n throw new WorkflowOptionsError('Error: --desc-file cannot be used with --clear-desc.')\n }\n const next: Record<string, unknown> = {}\n if (options.name) next.name = options.name\n const type = parseStatusType(options.type)\n if (type !== undefined) next.type = type\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n if (options.clearDesc) next.desc = null\n Object.assign(next, parsePreferredAssigneeBody(options))\n assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(statusScopedId, 'statusScopedId'))\n startSpinner('Updating status...')\n const response = await httpPatch<WorkflowStatusItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status updated')\n printStatusDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n status.command('move-after')\n .description('Move a workflow status after another status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>')\n .option('--after <statusScopedId>', 'Anchor status scoped ID')\n .option('--first', 'Move to first position'),\n ).action(\n async (\n workflowFileId: string,\n statusScopedId: string,\n options: { workspace: string; after?: string; first?: boolean },\n ) => {\n const { id, anchoredStatusScopedId } = runOrExit(() => {\n if (options.after && options.first) {\n throw new WorkflowOptionsError('Error: --after cannot be used with --first.')\n }\n if (!options.after && !options.first) {\n throw new WorkflowOptionsError('Error: either --after or --first is required.')\n }\n return {\n id: parsePositiveInteger(statusScopedId, 'statusScopedId'),\n anchoredStatusScopedId: options.first ? null : parsePositiveInteger(options.after!, '--after'),\n }\n })\n startSpinner('Moving status...')\n const response = await httpPost<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}/move-after`,\n { anchoredStatusScopedId },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status moved')\n },\n )\n\n addWorkspaceOption(\n status.command('delete')\n .description('Delete a workflow status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>'),\n ).action(async (workflowFileId: string, statusScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(statusScopedId, 'statusScopedId'))\n startSpinner('Deleting status...')\n const response = await httpDelete<{ scopedId: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.scopedId}`)\n })\n}\n\nfunction registerTransitionCommands(workflow: Command): void {\n const transition = workflow.command('transition').description('Workflow transition operations')\n\n for (const action of ['create', 'delete'] as const) {\n addWorkspaceOption(\n transition.command(action)\n .description(`${action === 'create' ? 'Create' : 'Delete'} a workflow transition`)\n .argument('<workflowFileId>')\n .requiredOption('--from <statusScopedId>', 'Source status scoped ID')\n .requiredOption('--to <statusScopedId>', 'Target status scoped ID'),\n ).action(async (workflowFileId: string, options: { workspace: string; from: string; to: string }) => {\n const body = runOrExit(() => ({\n statusFromScopedId: parsePositiveInteger(options.from, '--from'),\n statusToScopedId: parsePositiveInteger(options.to, '--to'),\n }))\n startSpinner(`${action === 'create' ? 'Creating' : 'Deleting'} transition...`)\n const response =\n action === 'create'\n ? await httpPost<WorkflowTransitionItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/transitions`,\n body,\n )\n : await httpDelete<WorkflowTransitionItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/transitions`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, action === 'create' ? 'Transition created' : 'Transition deleted')\n print(`${response.data.statusFromScopedId} -> ${response.data.statusToScopedId}`)\n })\n }\n}\n\nfunction registerTaskCommands(workflow: Command): void {\n const task = workflow.command('task').description('Workflow task operations')\n\n addWorkspaceOption(\n task.command('list')\n .description('List workflow tasks')\n .option('--workflow-file-id <workflowFileId>', 'Filter by workflow file ID')\n .option('--scope <scope>', 'Task scope', 'all')\n .option('-l, --limit <limit>', 'Maximum number of tasks to return', '20')\n .option('--cursor <cursor>', 'Pagination cursor'),\n ).action(\n async (options: { workspace: string; workflowFileId?: string; scope?: string; limit?: string; cursor?: string }) => {\n const query = runOrExit(() => buildQuery({\n scope: parseTaskScope(options.scope),\n limit: parseSearchLimit(options.limit, 20, 100),\n cursor: options.cursor,\n workflowFileId: options.workflowFileId,\n }))\n startSpinner('Fetching workflow tasks...')\n const response = await httpGet<WorkflowTaskListResponse>(`/workspaces/${options.workspace}/workflow-tasks-v2${query}`)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.tasks.length === 0) {\n stopSpinner(true, 'No workflow tasks found.')\n return\n }\n stopSpinner(true, `Found ${response.data.tasks.length} task(s)`)\n for (const item of response.data.tasks) printTaskSummary(item)\n if (response.data.nextCursor) print(`${colors.dim}nextCursor=${response.data.nextCursor}${colors.reset}`)\n },\n )\n\n addWorkspaceOption(\n task.command('get')\n .description('Get a workflow task')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Fetching task...')\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task fetched')\n printTaskDetail(response.data)\n })\n\n addAssigneeOptions(\n addWorkspaceOption(\n task.command('create')\n .description('Create a workflow task')\n .argument('<workflowFileId>')\n .requiredOption('--title <title>', 'Task title')\n .requiredOption('--status <statusScopedId>', 'Status scoped ID')\n .option('--priority <priority>', 'Priority: urgent, high, medium, or low', 'medium')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for task description')\n .option('--owner-human-id <humanId>', 'Task owner human ID')\n ),\n ).action(\n async (\n workflowFileId: string,\n options: {\n workspace: string\n title: string\n status: string\n priority?: string\n descFile?: string\n ownerHumanId?: string\n } & AssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n title: options.title,\n statusScopedId: parsePositiveInteger(options.status, '--status'),\n priority: parseRequiredPriority(options.priority),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n Object.assign(next, parseAssigneeBody(options, false))\n return next\n })\n startSpinner('Creating task...')\n const createResponse = await httpPost<WorkflowTaskCreateResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2`,\n body,\n )\n if (!createResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(createResponse)\n }\n const response = await getWorkflowTask(\n options.workspace,\n workflowFileId,\n createResponse.data.taskScopedId,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task created')\n printTaskDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n task.command('update')\n .description('Update workflow task metadata')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .option('--title <title>', 'Task title')\n .option('--priority <priority>', 'Priority: urgent, high, medium, or low')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for task description')\n .option('--clear-desc', 'Clear task description')\n .option('--owner-human-id <humanId>', 'Task owner human ID')\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: {\n workspace: string\n title?: string\n priority?: string\n descFile?: string\n clearDesc?: boolean\n ownerHumanId?: string\n },\n ) => {\n const body = runOrExit(() => {\n if (options.descFile && options.clearDesc) {\n throw new WorkflowOptionsError('Error: --desc-file cannot be used with --clear-desc.')\n }\n const next: Record<string, unknown> = {}\n if (options.title) next.title = options.title\n const priority = parsePriority(options.priority)\n if (priority !== undefined) next.priority = priority\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n if (options.clearDesc) next.desc = null\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Updating task...')\n const updateResponse = await httpPatch<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/metadata`,\n body,\n )\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task updated')\n printTaskDetail(response.data)\n },\n )\n\n for (const action of ['add-linked-files', 'remove-linked-files'] as const) {\n addWorkspaceOption(\n task.command(action)\n .description(`${action === 'add-linked-files' ? 'Add' : 'Remove'} linked files on a workflow task`)\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--file-ids <ids>', 'Comma-separated file IDs'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: { workspace: string; fileIds: string },\n ) => {\n const { id, fileIds } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n fileIds: parseFileIds(options.fileIds, '--file-ids')!,\n }))\n startSpinner(action === 'add-linked-files' ? 'Adding linked files...' : 'Removing linked files...')\n const path = `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/linked-files`\n const updateResponse =\n action === 'add-linked-files'\n ? await httpPost<void>(path, { fileIds })\n : await httpDelete<void>(path, { fileIds })\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, action === 'add-linked-files' ? 'Linked files added' : 'Linked files removed')\n printTaskDetail(response.data)\n },\n )\n }\n\n addWorkspaceOption(\n task.command('move')\n .description('Move a workflow task to another status')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--status <statusScopedId>', 'Target status scoped ID'),\n ).action(\n async (workflowFileId: string, taskScopedId: string, options: { workspace: string; status: string }) => {\n const { id, statusScopedId } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n statusScopedId: parsePositiveInteger(options.status, '--status'),\n }))\n startSpinner('Moving task...')\n const updateResponse = await httpPatch<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/status`,\n { statusScopedId },\n )\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task moved')\n printTaskDetail(response.data)\n },\n )\n\n addAssigneeOptions(\n addWorkspaceOption(\n task.command('assign')\n .description('Update workflow task assignee')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .option('--clear', 'Clear assignee'),\n ),\n ).action(\n async (workflowFileId: string, taskScopedId: string, options: { workspace: string } & AssigneeOptions) => {\n const body = runOrExit(() => {\n const next = parseAssigneeBody(options, true)\n if (Object.keys(next).length === 0 && options.clear !== true) assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Updating task assignee...')\n const updateResponse = await httpPatch<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/assignee`,\n body,\n )\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task assignee updated')\n printTaskDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n task.command('delete')\n .description('Delete a workflow task')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Deleting task...')\n const response = await httpDelete<{ scopedId: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.scopedId}`)\n })\n}\n\nfunction getWorkflowTask(workspaceId: string, workflowFileId: string, taskScopedId: number) {\n return httpGet<WorkflowTaskItem>(\n `/workspaces/${workspaceId}/workflows/${workflowFileId}/tasks-v2/${taskScopedId}`,\n )\n}\n\nfunction registerCommentCommands(workflow: Command): void {\n const comment = workflow.command('comment').description('Workflow task comment operations')\n\n addWorkspaceOption(\n comment.command('create')\n .description('Create a workflow task comment')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--content-path <localPath>', 'Local UTF-8 text file for comment content'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: { workspace: string; contentPath: string },\n ) => {\n const { id, content } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n content: readCommentContentFile(options.contentPath),\n }))\n startSpinner('Creating comment...')\n const response = await httpPost<WorkflowCommentItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/comments`,\n { content },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Comment created')\n printCommentDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n comment.command('list')\n .description('List workflow task comments')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Fetching comments...')\n const response = await httpGet<WorkflowCommentListResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/comments`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.items.length === 0) {\n stopSpinner(true, 'No comments found.')\n return\n }\n stopSpinner(true, `Found ${response.data.items.length} comment(s)`)\n response.data.items.forEach((item, index) => {\n if (index > 0) print('')\n printCommentDetail(item)\n })\n })\n\n addWorkspaceOption(\n comment.command('delete')\n .description('Delete a workflow task comment')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .argument('<commentId>'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n commentId: string,\n options: { workspace: string },\n ) => {\n const ids = runOrExit(() => ({\n task: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n comment: parsePositiveInteger(commentId, 'commentId'),\n }))\n startSpinner('Deleting comment...')\n const response = await httpDelete<{ id: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${ids.task}/comments/${ids.comment}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.id}`)\n },\n )\n}\n\nfunction registerRunCommands(workflow: Command): void {\n const run = workflow.command('run').description('Workflow agent run operations')\n\n addWorkspaceOption(\n run.command('status')\n .description('Get workflow agent run statuses')\n .argument('<workflowFileId>')\n .argument('<triggerIds...>'),\n ).action(async (workflowFileId: string, triggerIds: string[], options: { workspace: string }) => {\n const workflowPipelineTriggerIds = runOrExit(() =>\n triggerIds.map((triggerId) => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId')),\n )\n startSpinner('Fetching run statuses...')\n const response = await httpPost<WorkflowPipelineStatusItem[]>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/triggers/statuses`,\n { workflowPipelineTriggerIds },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Found ${response.data.length} run status item(s)`)\n for (const item of response.data) {\n print(`${colors.bold}${item.workflowPipelineTriggerId}${colors.reset}\\t${item.pipelineStatus}`)\n }\n })\n\n addWorkspaceOption(\n run.command('abort')\n .description('Abort a workflow agent run')\n .argument('<workflowFileId>')\n .argument('<triggerId>'),\n ).action(async (workflowFileId: string, triggerId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId'))\n startSpinner('Aborting run...')\n const response = await httpPost<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/trigger/${id}/abort`,\n {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Abort accepted: ${id}`)\n })\n}\n","import { arch, platform } from 'node:os'\nimport { getApiBaseUrl, getApiKeyOrUndefined } from '../utils/config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport type MetricType = 'counter' | 'gauge' | 'histogram'\n\nexport interface MetricRecord {\n metric_id: string\n metric_type: MetricType\n value: number\n extra_label_name_2_value?: Record<string, string>\n}\n\nconst buffer: MetricRecord[] = []\nconst FLUSH_TIMEOUT_MS = 3000\nconst MAX_BATCH_SIZE = 100\n\nfunction commonLabels(): Record<string, string> {\n return {\n cli_version: __CLI_VERSION__,\n node_version: process.versions.node,\n os: platform(),\n arch: arch(),\n is_ci: isCiEnvironment() ? 'true' : 'false',\n }\n}\n\nexport function record(metric: MetricRecord): void {\n if (isTelemetryDisabled()) {\n debugLog(`record: disabled, dropping ${metric.metric_id}`)\n return\n }\n if (!getApiKeyOrUndefined()) {\n debugLog(`record: no API key, dropping ${metric.metric_id}`)\n return\n }\n buffer.push({\n ...metric,\n extra_label_name_2_value: {\n ...commonLabels(),\n ...(metric.extra_label_name_2_value ?? {}),\n },\n })\n debugLog(`record: buffered ${metric.metric_id} (buffer=${buffer.length})`)\n}\n\nfunction isDebug(): boolean {\n return process.env.MOXT_TELEMETRY_DEBUG === '1' || process.env.MOXT_TELEMETRY_DEBUG === 'true'\n}\n\nfunction debugLog(msg: string, detail?: unknown): void {\n if (!isDebug()) return\n process.stderr.write(`[telemetry] ${msg}${detail !== undefined ? ` ${JSON.stringify(detail)}` : ''}\\n`)\n}\n\nexport async function flush(): Promise<void> {\n if (buffer.length === 0) {\n debugLog('flush: buffer empty, skipping')\n return\n }\n const apiKey = getApiKeyOrUndefined()\n if (!apiKey) {\n debugLog('flush: no API key, dropping buffer')\n buffer.length = 0\n return\n }\n\n const batch = buffer.splice(0, MAX_BATCH_SIZE)\n const payload = {\n release_id: __CLI_VERSION__,\n client_type: 'cli',\n metric_data_list: batch.map((m) => ({\n profile: 'cli',\n metric_id: m.metric_id,\n metric_type: m.metric_type,\n value: m.value,\n extra_label_name_2_value: m.extra_label_name_2_value,\n })),\n }\n\n const url = `${getApiBaseUrl()}/cli-metrics`\n debugLog(`flush: POST ${url} with ${batch.length} metrics`, payload)\n\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, FLUSH_TIMEOUT_MS)\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n debugLog(`flush: response status=${res.status}`)\n } finally {\n clearTimeout(timeout)\n }\n } catch (err) {\n debugLog('flush: failed', err instanceof Error ? err.message : String(err))\n // fire-and-forget — never surface telemetry failures to the user\n }\n}\n","import { readTelemetryConfig, writeTelemetryConfig } from './config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\nconst NOTICE = [\n '',\n 'Attention: Moxt CLI now collects anonymous telemetry regarding usage.',\n \"This information is used to shape Moxt CLI's roadmap and prioritize features.\",\n '',\n 'You may opt out by setting MOXT_TELEMETRY_DISABLED=1 in your env',\n 'or by running `moxt telemetry disable`.',\n 'Details: https://www.npmjs.com/package/@moxt-ai/cli#telemetry',\n '',\n]\n\nexport function maybeShowTelemetryNotice(): void {\n if (isTelemetryDisabled()) return\n if (isCiEnvironment()) return\n if (readTelemetryConfig().noticeShown) return\n\n for (const line of NOTICE) {\n process.stderr.write(`${line}\\n`)\n }\n\n try {\n writeTelemetryConfig({ noticeShown: true })\n } catch {\n // persistence failure is not user-visible — we'll just show the notice again next run\n }\n}\n","import type { Command } from 'commander'\nimport { flush, record } from './client.js'\nimport { maybeShowTelemetryNotice } from './notice.js'\n\ninterface RunningCommand {\n name: string\n subcommand?: string\n startedAt: number\n}\n\nlet current: RunningCommand | null = null\n\nfunction commandPath(cmd: Command): { command: string; subcommand?: string } {\n const names: string[] = []\n let node: Command | null = cmd\n while (node && node.parent) {\n names.unshift(node.name())\n node = node.parent\n }\n if (names.length === 0) return { command: 'unknown' }\n if (names.length === 1) return { command: names[0] }\n return { command: names[0], subcommand: names.slice(1).join(' ') }\n}\n\nexport function instrumentProgram(program: Command): void {\n program.hook('preAction', (_thisCommand, actionCommand) => {\n const { command, subcommand } = commandPath(actionCommand)\n if (command !== 'telemetry') {\n maybeShowTelemetryNotice()\n }\n current = { name: command, subcommand, startedAt: Date.now() }\n record({\n metric_id: 'client.cli.command_invocation.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command,\n ...(subcommand ? { subcommand } : {}),\n status: 'started',\n },\n })\n })\n\n program.hook('postAction', async () => {\n await reportOutcome('success')\n })\n}\n\nasync function reportOutcome(status: 'success' | 'error', errorCode?: string): Promise<void> {\n if (!current) return\n const { name, subcommand, startedAt } = current\n const durationSeconds = (Date.now() - startedAt) / 1000\n\n record({\n metric_id: 'client.cli.command_duration_seconds',\n metric_type: 'histogram',\n value: durationSeconds,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n status,\n },\n })\n\n if (status === 'error') {\n record({\n metric_id: 'client.cli.command_error.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n ...(errorCode ? { error_code: errorCode } : {}),\n },\n })\n }\n\n current = null\n await flush()\n}\n\n/**\n * Wire a final error/exit hook. Call before program.parseAsync so we can capture\n * failures routed through process.exit or unhandled rejections.\n *\n * Best-effort only: `reportOutcome` is fire-and-forget, and the subsequent\n * `process.exit(1)` terminates the process before `flush()` can complete — so\n * the error metric recorded here will typically be dropped. Reliable crash\n * reporting belongs to Sentry/APM, not this telemetry path.\n */\nexport function installExitHandler(): void {\n const handleError = (errorCode: string): void => {\n void reportOutcome('error', errorCode)\n }\n\n process.on('uncaughtException', () => {\n handleError('uncaught_exception')\n process.exit(1)\n })\n process.on('unhandledRejection', () => {\n handleError('unhandled_rejection')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":["fs","path","buffer","path","path","buffer","runOrExit","program","runOrExit","path","buffer","program","runOrExit","path","runOrExit","path","program","fs","program","program","program","members","fs","TextDecoder","runOrExit","addSpaceOptions","path","buffer","readCommentContentFile","TextDecoder","indentation","escapeTerminalControlCharacters","formatDetailScalar","printDetailField","printDetailTextField","program","program","arch","platform","platform","arch","program"]}
|