@moxt-ai/cli 0.3.2 → 0.3.3-moxt-run.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/file.ts","../src/utils/file-selector.ts","../src/utils/http.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/search-options.ts","../src/utils/run-or-exit.ts","../src/utils/spinner.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/telemetry/client.ts","../src/telemetry/notice.ts","../src/telemetry/instrument.ts"],"sourcesContent":["import { Command } from 'commander'\nimport updateNotifier from 'update-notifier'\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 { 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 = new Command()\n\nprogram\n .name('moxt')\n .description('Moxt CLI - AI Workspace')\n .version(__CLI_VERSION__)\n .action(() => {\n program.help()\n })\n\ninstrumentProgram(program)\ninstallExitHandler()\n\nregisterWhoamiCommand(program)\nregisterWorkspaceCommand(program)\nregisterFileCommand(program)\nregisterMemoryCommand(program)\nregisterMiniappCommand(program)\nregisterTelemetryCommand(program)\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 * 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 { 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 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 // check local file exists\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 // check it is a file, not a directory\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 // check file size (10MB limit)\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 // read file and check for binary content\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","/**\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","// 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","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","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 { 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 { 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":["path","buffer","path","program","path","buffer","program","path","runOrExit","path","program","fs","program","program","program","members","arch","platform","platform","arch","program"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/program.ts","../src/commands/file.ts","../src/utils/file-selector.ts","../src/utils/http.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/search-options.ts","../src/utils/run-or-exit.ts","../src/utils/spinner.ts","../src/commands/memory.ts","../src/utils/miniapp-db.ts","../src/commands/miniapp.ts","../src/run/run-agent.ts","../src/run/capture.ts","../src/run/redaction.ts","../src/run/sanitize.ts","../src/run/session.ts","../src/run/status.ts","../src/run/live-capture.ts","../src/run/moxt-uploader.ts","../src/utils/cf-access.ts","../src/run/process-session.ts","../src/run/repo.ts","../src/run/session-dir.ts","../src/commands/run.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 { registerFileCommand } from './commands/file.js'\nimport { registerMemoryCommand } from './commands/memory.js'\nimport { registerMiniappCommand } from './commands/miniapp.js'\nimport { registerRunCommand } from './commands/run.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 registerWhoamiCommand(program)\n registerWorkspaceCommand(program)\n registerFileCommand(program)\n registerMemoryCommand(program)\n registerRunCommand(program)\n registerMiniappCommand(program)\n registerTelemetryCommand(program)\n\n return program\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 { 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 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 // check local file exists\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 // check it is a file, not a directory\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 // check file size (10MB limit)\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 // read file and check for binary content\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","/**\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","// 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","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","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 { 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 { type ChildProcess, spawn } from 'node:child_process'\nimport { closeSync, fstatSync, openSync, readSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport {\n CaptureOutputPrepareError,\n createCaptureRunId,\n prepareCaptureOutputs,\n withDefaultCaptureOutput,\n writeCaptureDirectoryPayload,\n} from './capture.js'\nimport { redactText } from './redaction.js'\nimport { sanitizeRepo } from './sanitize.js'\nimport {\n type MatchOptions,\n matchKnownSessionFile,\n matchSession,\n recordingFromSessionMatch,\n type SnapshotMap,\n snapshotJsonl,\n} from './session.js'\nimport { classifyExit, signalNumber } from './status.js'\nimport type { CapturePayload, RunAgent, SessionMatch } from './types.js'\nimport { createLiveCapture } from './live-capture.js'\nimport { type RunUploadOptions, uploadRunArtifacts } from './moxt-uploader.js'\nimport { findOpenSessionFile, type OpenSessionFileMatch } from './process-session.js'\nimport { collectRepoFingerprint } from './repo.js'\nimport { agentKnownSessionFile, agentSessionCandidateFilter, agentSessionDir } from './session-dir.js'\nimport { printError } from '../utils/output.js'\n\nconst MAX_TRANSCRIPT_CAPTURE_BYTES = 1024 * 1024\nconst SESSION_SETTLE_TIMEOUT_MS = 1500\nconst SESSION_SETTLE_INTERVAL_MS = 100\nconst PROCESS_SESSION_POLL_INTERVAL_MS = 100\nconst CODEX_OPTIONS_WITH_VALUE = new Set([\n '-a',\n '--add-dir',\n '--ask-for-approval',\n '-c',\n '-C',\n '--cd',\n '--color',\n '--config',\n '-i',\n '--image',\n '--local-provider',\n '-m',\n '--model',\n '-o',\n '--output-last-message',\n '--output-schema',\n '-p',\n '--profile',\n '--remote',\n '--remote-auth-token-env',\n '-s',\n '--sandbox',\n])\n\nexport interface RunLocalAgentOptions {\n readonly agent: RunAgent\n readonly agentArgs: readonly string[]\n readonly upload?: RunUploadOptions\n readonly cwd?: string\n readonly env?: NodeJS.ProcessEnv\n readonly home?: string\n}\n\ninterface WaitResult {\n readonly code: number | null\n readonly signal: NodeJS.Signals | null\n readonly waitAt: number\n readonly errorCode?: string\n}\n\nexport async function runLocalAgent(options: RunLocalAgentOptions): Promise<number> {\n const cwd = options.cwd ?? process.cwd()\n const env = options.env ?? process.env\n const home = options.home ?? env.HOME ?? homedir()\n const startedAtMs = Date.now()\n const startedAt = new Date(startedAtMs).toISOString()\n const runId = createCaptureRunId(startedAt, options.agent)\n const captureEnv = withDefaultCaptureOutput(env, home)\n\n try {\n await prepareCaptureOutputs(captureEnv, runId)\n } catch (error) {\n printPrepareError(options.agent, error)\n return 1\n }\n\n const repo = collectRepoFingerprint(cwd)\n let baselineOk = false\n let before = new Map<string, { mtimeMs: number; size: number }>()\n let sessions = ''\n let isSessionCandidate: ((path: string) => boolean) | undefined\n let knownSessionFile: string | undefined\n let childRootPid: number | undefined\n let openSessionFileMatch: OpenSessionFileMatch = { match: 'none' }\n let processSessionTimer: NodeJS.Timeout | undefined\n const newSessionFilesOnly = shouldUseNewSessionFilesOnly(options.agent, options.agentArgs)\n\n try {\n const sessionOptions = {\n agent: options.agent,\n cwd,\n home,\n env: captureEnv,\n agentArgs: options.agentArgs,\n }\n sessions = agentSessionDir(sessionOptions)\n isSessionCandidate = agentSessionCandidateFilter(sessionOptions)\n knownSessionFile = agentKnownSessionFile(sessionOptions)\n before = snapshotJsonl(sessions)\n baselineOk = true\n } catch {\n baselineOk = false\n }\n\n const rememberOpenSessionFile = (): OpenSessionFileMatch => {\n if (\n !baselineOk ||\n sessions === '' ||\n childRootPid === undefined ||\n openSessionFileMatch.match !== 'none'\n ) {\n return openSessionFileMatch\n }\n\n const matched = findOpenSessionFile({\n rootPid: childRootPid,\n sessionRoot: sessions,\n ...(isSessionCandidate === undefined ? {} : { isCandidate: isSessionCandidate }),\n })\n if (matched.match !== 'none') {\n openSessionFileMatch = matched\n }\n\n return openSessionFileMatch\n }\n\n const stopProcessSessionWatcher = (): void => {\n if (processSessionTimer !== undefined) {\n clearInterval(processSessionTimer)\n processSessionTimer = undefined\n }\n }\n\n const liveCapture = createLiveCapture({\n env: captureEnv,\n runId,\n agent: options.agent,\n startedAt,\n sessions,\n before,\n baselineOk,\n startedAtMs,\n ...(knownSessionFile === undefined ? {} : { knownSessionFile }),\n ...(isSessionCandidate === undefined ? {} : { isSessionCandidate }),\n ...(newSessionFilesOnly ? { newSessionFilesOnly: true as const } : {}),\n openSessionFile: rememberOpenSessionFile,\n })\n\n try {\n await liveCapture.start()\n } catch (error) {\n printError(\n [\n 'moxt: cannot prepare run output',\n `reason: ${errorMessage(error)}`,\n '',\n `${options.agent} was not started because this run cannot be recorded.`,\n ].join('\\n'),\n )\n return 1\n }\n\n const observedSignals = new Set<number>()\n let child: ChildProcess | null = null\n let pendingForward: NodeJS.Signals | null = null\n\n const observe = (signal: NodeJS.Signals): void => {\n const number = signalNumber(signal)\n if (number !== 0) observedSignals.add(number)\n }\n const terminalSignalsReachChild =\n process.stdin.isTTY === true || process.stdout.isTTY === true || process.stderr.isTTY === true\n const forwardInteractiveSignal = (signal: NodeJS.Signals): void => {\n observe(signal)\n if (terminalSignalsReachChild) {\n return\n }\n if (child === null) {\n pendingForward = signal\n return\n }\n\n safeKill(child, signal)\n }\n const onInt = (): void => forwardInteractiveSignal('SIGINT')\n const onQuit = (): void => forwardInteractiveSignal('SIGQUIT')\n const onTerm = (): void => {\n observe('SIGTERM')\n if (child === null) pendingForward = 'SIGTERM'\n else safeKill(child, 'SIGTERM')\n }\n const onHup = (): void => {\n observe('SIGHUP')\n if (child === null) pendingForward = 'SIGHUP'\n else safeKill(child, 'SIGHUP')\n }\n\n process.on('SIGINT', onInt)\n process.on('SIGQUIT', onQuit)\n process.on('SIGTERM', onTerm)\n process.on('SIGHUP', onHup)\n\n const spawned = spawn(options.agent, [...options.agentArgs], {\n cwd,\n env: captureEnv,\n stdio: 'inherit',\n })\n child = spawned\n childRootPid = spawned.pid\n if (childRootPid !== undefined && baselineOk) {\n rememberOpenSessionFile()\n processSessionTimer = setInterval(() => {\n rememberOpenSessionFile()\n }, PROCESS_SESSION_POLL_INTERVAL_MS)\n }\n if (pendingForward !== null) {\n safeKill(spawned, pendingForward)\n }\n\n const exit = await waitForExit(spawned, options.agent)\n stopProcessSessionWatcher()\n\n const onCaptureSignal = (): void => {}\n process.on('SIGINT', onCaptureSignal)\n process.on('SIGQUIT', onCaptureSignal)\n process.on('SIGTERM', onCaptureSignal)\n process.on('SIGHUP', onCaptureSignal)\n process.off('SIGINT', onInt)\n process.off('SIGQUIT', onQuit)\n process.off('SIGTERM', onTerm)\n process.off('SIGHUP', onHup)\n\n const classified = classifyExit(exit, observedSignals)\n const endedAtMs = exit.waitAt\n const endedAt = new Date(endedAtMs).toISOString()\n const durationMs = endedAtMs - startedAtMs\n let after: SnapshotMap | undefined\n if (baselineOk) {\n try {\n after = await waitForSessionSettle(\n sessions,\n before,\n startedAtMs,\n isSessionCandidate,\n newSessionFilesOnly,\n )\n } catch {}\n }\n try {\n await liveCapture.stop()\n } catch {}\n\n const payload = buildPayload({\n agent: options.agent,\n cwd,\n startedAt,\n endedAt,\n durationMs,\n exitCode: classified.code,\n status: classified.status,\n repo: sanitizeRepo(repo),\n baselineOk,\n sessions,\n before,\n after,\n startedAtMs,\n knownSessionFile,\n isSessionCandidate,\n newSessionFilesOnly,\n openSessionFileMatch,\n })\n\n let finalized = false\n try {\n if (liveCapture.enabled) {\n await liveCapture.finalize(payload, new Date().toISOString())\n } else {\n await writeCaptureDirectoryPayload(payload, captureEnv, runId, new Date().toISOString())\n }\n finalized = true\n } catch (error) {\n printError(`moxt: cannot finalize run artifact: ${errorMessage(error)}`)\n } finally {\n process.off('SIGINT', onCaptureSignal)\n process.off('SIGQUIT', onCaptureSignal)\n process.off('SIGTERM', onCaptureSignal)\n process.off('SIGHUP', onCaptureSignal)\n }\n\n if (finalized && options.upload !== undefined) {\n try {\n await uploadRunArtifacts({\n env: captureEnv,\n runId,\n upload: options.upload,\n })\n } catch (error) {\n printError(`moxt: cannot upload run artifact: ${errorMessage(error)}`)\n }\n }\n\n return classified.code\n}\n\nasync function waitForSessionSettle(\n sessions: string,\n before: SnapshotMap,\n startedAtMs: number,\n isSessionCandidate: ((path: string) => boolean) | undefined,\n newSessionFilesOnly: boolean,\n): Promise<SnapshotMap> {\n const deadline = Date.now() + SESSION_SETTLE_TIMEOUT_MS\n let after = snapshotJsonl(sessions)\n\n while (!hasSessionChange(before, after, startedAtMs, isSessionCandidate, newSessionFilesOnly) && Date.now() < deadline) {\n await sleep(SESSION_SETTLE_INTERVAL_MS)\n after = snapshotJsonl(sessions)\n }\n\n return after\n}\n\nfunction hasSessionChange(\n before: SnapshotMap,\n after: SnapshotMap,\n startedAtMs: number,\n isSessionCandidate: ((path: string) => boolean) | undefined,\n newSessionFilesOnly: boolean,\n): boolean {\n const matched = matchSession(before, after, startedAtMs, matchOptions(isSessionCandidate, newSessionFilesOnly))\n if (matched.match !== 'unique') {\n return matched.match !== 'none'\n }\n\n if (matched.sessionFile === null) {\n return false\n }\n\n const snapshot = after.get(matched.sessionFile)\n return snapshot !== undefined && snapshot.size > matched.startOffset\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction safeKill(child: ChildProcess, signal: NodeJS.Signals): void {\n try {\n child.kill(signal)\n } catch {}\n}\n\nfunction waitForExit(child: ChildProcess, agent: RunAgent): Promise<WaitResult> {\n return new Promise<WaitResult>((resolve) => {\n child.once('error', (error: NodeJS.ErrnoException) => {\n const errorCode = error.code ?? 'UNKNOWN'\n const reason = errorCode === 'ENOENT' ? 'command not found' : error.message\n printError(`moxt: cannot start ${agent}: ${reason}`)\n resolve({\n code: null,\n signal: null,\n waitAt: Date.now(),\n errorCode,\n })\n })\n child.once('exit', (code, signal) => {\n resolve({ code, signal, waitAt: Date.now() })\n })\n })\n}\n\ninterface PayloadInput {\n readonly agent: RunAgent\n readonly cwd: string\n readonly startedAt: string\n readonly endedAt: string\n readonly durationMs: number\n readonly exitCode: number\n readonly status: CapturePayload['run']['status']\n readonly repo: CapturePayload['repo']\n readonly baselineOk: boolean\n readonly sessions: string\n readonly before: Map<string, { mtimeMs: number; size: number }>\n readonly after: SnapshotMap | undefined\n readonly startedAtMs: number\n readonly knownSessionFile: string | undefined\n readonly isSessionCandidate: ((path: string) => boolean) | undefined\n readonly newSessionFilesOnly: boolean\n readonly openSessionFileMatch: OpenSessionFileMatch\n}\n\nfunction buildPayload(input: PayloadInput): CapturePayload {\n let sessionMatch: SessionMatch = input.baselineOk ? 'none' : 'prep_failed'\n let transcript: string | undefined\n let redactionFailed = false\n\n if (input.baselineOk) {\n try {\n const after = input.after ?? snapshotJsonl(input.sessions)\n const knownMatched =\n input.knownSessionFile === undefined\n ? null\n : matchKnownSessionFile(input.before, after, input.knownSessionFile)\n const matched =\n knownMatched?.match === 'unique'\n ? knownMatched\n : input.openSessionFileMatch.match === 'unique'\n ? matchKnownSessionFile(input.before, after, input.openSessionFileMatch.sessionFile)\n : input.openSessionFileMatch.match === 'ambiguous'\n ? {\n match: 'ambiguous' as const,\n sessionFile: null,\n startOffset: 0,\n }\n : matchSession(\n input.before,\n after,\n input.startedAtMs,\n matchOptions(input.isSessionCandidate, input.newSessionFilesOnly),\n )\n sessionMatch = matched.match\n if (matched.match === 'unique' && matched.sessionFile !== null) {\n try {\n transcript = redactText(readFileFromOffset(matched.sessionFile, matched.startOffset)).text\n } catch {\n redactionFailed = true\n }\n }\n } catch {\n sessionMatch = 'prep_failed'\n }\n }\n\n return {\n ...(transcript === undefined ? {} : { transcript_redacted: transcript }),\n ...(redactionFailed ? { redaction_failed: true as const } : {}),\n run: {\n agent: input.agent,\n cwd: input.cwd,\n git_root: input.repo?.root ?? null,\n started_at: input.startedAt,\n ended_at: input.endedAt,\n duration_ms: input.durationMs,\n status: input.status,\n exit_code: input.exitCode,\n },\n recording: recordingFromSessionMatch(sessionMatch),\n repo: input.repo,\n }\n}\n\nfunction matchOptions(\n isSessionCandidate: ((path: string) => boolean) | undefined,\n newSessionFilesOnly: boolean,\n): MatchOptions {\n return {\n ...(isSessionCandidate === undefined ? {} : { isCandidate: isSessionCandidate }),\n ...(newSessionFilesOnly ? { newFilesOnly: true as const } : {}),\n }\n}\n\nfunction shouldUseNewSessionFilesOnly(agent: RunAgent, agentArgs: readonly string[]): boolean {\n return agent === 'codex' && !isCodexResumeInvocation(agentArgs)\n}\n\nfunction isCodexResumeInvocation(agentArgs: readonly string[]): boolean {\n const command = nextCodexCommandArg(agentArgs, 0)\n if (command === null) {\n return false\n }\n\n if (command.value === 'resume') {\n return true\n }\n\n if (command.value !== 'exec' && command.value !== 'e') {\n return false\n }\n\n return nextCodexCommandArg(agentArgs, command.index + 1)?.value === 'resume'\n}\n\nfunction nextCodexCommandArg(\n agentArgs: readonly string[],\n startIndex: number,\n): { readonly value: string; readonly index: number } | null {\n for (let index = startIndex; index < agentArgs.length; index += 1) {\n const arg = agentArgs[index]\n if (arg === undefined) {\n continue\n }\n\n if (arg === '--') {\n return null\n }\n\n if (arg.startsWith('-')) {\n if (!arg.includes('=') && CODEX_OPTIONS_WITH_VALUE.has(arg)) {\n index += 1\n }\n continue\n }\n\n return { value: arg, index }\n }\n\n return null\n}\n\nfunction readFileFromOffset(path: string, offset: number): string {\n const fd = openSync(path, 'r')\n try {\n const stat = fstatSync(fd)\n const length = Math.max(0, stat.size - offset)\n if (length > MAX_TRANSCRIPT_CAPTURE_BYTES) {\n throw new Error('transcript capture exceeds maximum size')\n }\n const buffer = Buffer.alloc(length)\n if (length === 0) {\n return ''\n }\n readSync(fd, buffer, 0, length, offset)\n return buffer.toString('utf8')\n } finally {\n closeSync(fd)\n }\n}\n\nfunction printPrepareError(agent: RunAgent, error: unknown): void {\n if (error instanceof CaptureOutputPrepareError) {\n printError(\n [\n 'moxt: cannot create run output directory',\n `path: ${error.path}`,\n `reason: ${error.message}`,\n '',\n `${agent} was not started because this run cannot be recorded.`,\n ].join('\\n'),\n )\n return\n }\n\n printError(\n [\n 'moxt: cannot prepare run output',\n `reason: ${errorMessage(error)}`,\n '',\n `${agent} was not started because this run cannot be recorded.`,\n ].join('\\n'),\n )\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error && error.message !== '') {\n return error.message\n }\n return String(error)\n}\n","import { randomUUID } from 'node:crypto'\nimport { access, mkdir, readdir, readFile, rm, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join, posix, win32 } from 'node:path'\nimport type { CapturePayload, RunAgent } from './types.js'\n\nconst DATA_FILE_TARGET_BYTES = 1024 * 1024\nconst RUNLOG_DIRECTORY_MARKER = '.runlog'\nconst RUNLOG_DIRECTORY_MARKER_SCHEMA = 'runlog.directory.v1'\nconst RUNLOG_MANAGED_OUTPUT_NAMES = new Set([\n '.DS_Store',\n RUNLOG_DIRECTORY_MARKER,\n 'events',\n 'events.jsonl',\n 'run.json',\n 'state.json',\n 'transcript',\n 'transcript.jsonl',\n 'upload.json',\n])\nconst RUNLOG_METADATA_SCHEMAS = {\n 'run.json': 'runlog.capture.v1',\n 'state.json': 'runlog.state.v1',\n 'upload.json': 'runlog.upload.v1',\n} as const\nconst RUNLOG_METADATA_FILE_NAMES = Object.keys(RUNLOG_METADATA_SCHEMAS) as RunlogMetadataFileName[]\n\ntype RunlogMetadataFileName = keyof typeof RUNLOG_METADATA_SCHEMAS\n\ninterface CaptureRunFile {\n readonly schema_version: 'runlog.capture.v1'\n readonly run_id: string\n readonly run: CapturePayload['run']\n readonly recording: CapturePayload['recording']\n readonly repo: CapturePayload['repo']\n readonly redaction_failed?: true\n readonly files: {\n readonly state: 'state.json'\n readonly upload: 'upload.json'\n readonly events: readonly DataFileInfo[]\n readonly transcript: readonly DataFileInfo[]\n }\n}\n\ninterface CaptureStateFile {\n readonly schema_version: 'runlog.state.v1'\n readonly run_id: string\n readonly status: 'open' | 'closed'\n readonly updated_at: string\n}\n\ninterface CaptureUploadFile {\n readonly schema_version: 'runlog.upload.v1'\n readonly run_id: string\n readonly status: 'pending' | 'uploading' | 'partial' | 'uploaded' | 'failed'\n readonly updated_at?: string\n readonly files: Record<string, CaptureUploadFileEntry>\n}\n\nexport interface CaptureUploadFileEntry {\n readonly status: 'uploading' | 'uploaded' | 'failed'\n readonly bytes: number\n readonly sha256: string\n readonly attempts: number\n readonly uploaded_at?: string\n readonly failed_at?: string\n readonly etag?: string\n readonly error?: string\n}\n\nexport interface DataFileInfo {\n readonly path: string\n readonly bytes: number\n readonly lines: number\n readonly oversized_line: boolean\n}\n\ninterface DataFileChunk extends DataFileInfo {\n readonly content: string\n}\n\nexport interface CaptureDirectoryFiles {\n readonly events: readonly DataFileInfo[]\n readonly transcript: readonly DataFileInfo[]\n}\n\nexport interface SerializedAnalysisEvents {\n readonly text: string\n readonly nextSeq: number\n}\n\ntype AnalysisEvent = UserMessageEvent | AssistantMessageEvent | TurnSummaryEvent\n\ninterface BaseAnalysisEvent {\n readonly schema_version: 'runlog.events.v1'\n readonly seq: number\n readonly timestamp?: string\n}\n\ninterface UserMessageEvent extends BaseAnalysisEvent {\n readonly type: 'user_message'\n readonly text: string\n}\n\ninterface AssistantMessageEvent extends BaseAnalysisEvent {\n readonly type: 'assistant_message'\n readonly model?: string\n readonly text: string\n readonly input_tokens?: number\n readonly output_tokens?: number\n}\n\ninterface TurnSummaryEvent extends BaseAnalysisEvent {\n readonly type: 'turn_summary'\n readonly duration_ms?: number\n readonly message_count?: number\n}\n\ninterface RawTranscriptLine {\n readonly type?: unknown\n readonly subtype?: unknown\n readonly timestamp?: unknown\n readonly message?: unknown\n readonly payload?: unknown\n readonly durationMs?: unknown\n readonly messageCount?: unknown\n}\n\ninterface RawMessage {\n readonly content?: unknown\n readonly model?: unknown\n readonly usage?: unknown\n}\n\ninterface RawCodexPayload {\n readonly type?: unknown\n readonly message?: unknown\n readonly duration_ms?: unknown\n}\n\ninterface RawUsage {\n readonly input_tokens?: unknown\n readonly output_tokens?: unknown\n}\n\ninterface JsonObject {\n readonly schema_version?: unknown\n readonly run_id?: unknown\n readonly [key: string]: unknown\n}\n\ninterface RawContentPart {\n readonly type?: unknown\n readonly text?: unknown\n}\n\nexport class CaptureOutputPrepareError extends Error {\n readonly path: string\n\n constructor(path: string, cause: unknown) {\n super(errorMessage(cause))\n this.name = 'CaptureOutputPrepareError'\n this.path = path\n this.cause = cause\n }\n}\n\nexport function defaultCaptureOutputRoot(\n home = homedir(),\n env: NodeJS.ProcessEnv = process.env,\n nodePlatform: NodeJS.Platform = process.platform,\n): string {\n const pathJoin = nodePlatform === 'win32' ? win32.join : posix.join\n\n if (nodePlatform === 'darwin') {\n return pathJoin(home, 'Library', 'Application Support', 'moxt', 'runs')\n }\n\n if (nodePlatform === 'win32') {\n return pathJoin(env.LOCALAPPDATA ?? pathJoin(home, 'AppData', 'Local'), 'Moxt', 'runs')\n }\n\n return pathJoin(env.XDG_DATA_HOME ?? pathJoin(home, '.local', 'share'), 'moxt', 'runs')\n}\n\nexport function withDefaultCaptureOutput(env: NodeJS.ProcessEnv, home = homedir()): NodeJS.ProcessEnv {\n const { outputDir, outputRoot } = captureEnvPaths(env)\n if (hasValue(outputDir) || hasValue(outputRoot)) {\n return env\n }\n\n return {\n ...env,\n MOXT_RUN_OUTPUT_ROOT: defaultCaptureOutputRoot(home, env),\n }\n}\n\nexport async function prepareCaptureOutputs(env: NodeJS.ProcessEnv, runId: string): Promise<void> {\n const { outputDir, outputRoot } = captureEnvPaths(env)\n\n if (hasValue(outputDir)) {\n await prepareOutputPath(outputDir, () => prepareCaptureDirectory(outputDir))\n }\n\n if (hasValue(outputRoot)) {\n const runDir = join(outputRoot, runId)\n await prepareOutputPath(runDir, () => prepareCaptureDirectory(runDir))\n }\n}\n\nexport function captureOutputDirectories(env: NodeJS.ProcessEnv, runId: string): readonly string[] {\n const { outputDir, outputRoot } = captureEnvPaths(env)\n const dirs = new Set<string>()\n\n if (hasValue(outputDir)) {\n dirs.add(outputDir)\n }\n\n if (hasValue(outputRoot)) {\n dirs.add(join(outputRoot, runId))\n }\n\n return [...dirs]\n}\n\nexport async function emitOpenCaptureDirectories(\n env: NodeJS.ProcessEnv,\n runId: string,\n capturedAt: string,\n): Promise<void> {\n await Promise.all(\n captureOutputDirectories(env, runId).map(async (outputDir) => {\n await writeCaptureUploadFile(outputDir, runId)\n await writeCaptureStateFile(outputDir, runId, 'open', capturedAt)\n }),\n )\n}\n\nexport async function finalizeCaptureDirectories(\n payload: CapturePayload,\n env: NodeJS.ProcessEnv,\n runId: string,\n capturedAt: string,\n files: CaptureDirectoryFiles,\n): Promise<void> {\n await Promise.all(\n captureOutputDirectories(env, runId).map(async (outputDir) => {\n await writeCaptureRunFile(outputDir, payload, runId, files)\n await writeCaptureUploadFile(outputDir, runId)\n await writeCaptureStateFile(outputDir, runId, 'closed', capturedAt)\n }),\n )\n}\n\nexport function createCaptureRunId(startedAt: string, agent?: RunAgent): string {\n const timestamp = startedAt.replaceAll(/[^A-Za-z0-9]/g, '-')\n const suffix = randomUUID().replaceAll('-', '').slice(0, 8)\n return agent === undefined ? `${timestamp}-${suffix}` : `${timestamp}-${agent}-${suffix}`\n}\n\nexport async function writeCaptureDirectoryPayload(\n payload: CapturePayload,\n env: NodeJS.ProcessEnv,\n runId: string,\n capturedAt: string,\n): Promise<void> {\n const hasTranscript = payload.transcript_redacted !== undefined\n const transcript = hasTranscript ? normalizeJsonl(payload.transcript_redacted ?? '') : ''\n const transcriptChunks = hasTranscript ? chunkJsonl(transcript, 'transcript', 'transcript') : []\n const eventChunks = hasTranscript\n ? chunkJsonl(serializeEventsFromTranscript(transcript, 1, payload.run.agent).text, 'events', 'events')\n : []\n\n await Promise.all(\n captureOutputDirectories(env, runId).map(async (outputDir) => {\n await prepareCaptureDirectory(outputDir)\n if (hasTranscript) {\n await writeChunks(outputDir, eventChunks)\n await writeChunks(outputDir, transcriptChunks)\n }\n await writeCaptureRunFile(outputDir, payload, runId, {\n events: eventChunks.map(withoutContent),\n transcript: transcriptChunks.map(withoutContent),\n })\n await writeCaptureUploadFile(outputDir, runId)\n await writeCaptureStateFile(outputDir, runId, 'closed', capturedAt)\n }),\n )\n}\n\nexport function serializeEventsFromTranscript(\n transcript: string,\n startSeq: number,\n agent: RunAgent = 'claude',\n): SerializedAnalysisEvents {\n const events = normalizeEvents(transcript, startSeq, agent)\n return {\n text: serializeEvents(events),\n nextSeq: startSeq + events.length,\n }\n}\n\nfunction normalizeJsonl(text: string): string {\n if (text === '') {\n return ''\n }\n return text.endsWith('\\n') ? text : `${text}\\n`\n}\n\nasync function prepareCaptureDirectory(outputDir: string): Promise<void> {\n await mkdir(outputDir, { recursive: true })\n await assertMoxtManagedOutputDir(outputDir)\n await Promise.all([\n rm(join(outputDir, RUNLOG_DIRECTORY_MARKER), { force: true }),\n rm(join(outputDir, 'run.json'), { force: true }),\n rm(join(outputDir, 'state.json'), { force: true }),\n rm(join(outputDir, 'upload.json'), { force: true }),\n rm(join(outputDir, 'events.jsonl'), { force: true }),\n rm(join(outputDir, 'transcript.jsonl'), { force: true }),\n rm(join(outputDir, 'events'), { recursive: true, force: true }),\n rm(join(outputDir, 'transcript'), { recursive: true, force: true }),\n ])\n await writeRunlogDirectoryMarker(outputDir)\n await mkdir(join(outputDir, 'events'), { recursive: true })\n await mkdir(join(outputDir, 'transcript'), { recursive: true })\n}\n\nasync function assertMoxtManagedOutputDir(outputDir: string): Promise<void> {\n const entries = await readdir(outputDir)\n const unmanaged = entries.filter((entry) => !RUNLOG_MANAGED_OUTPUT_NAMES.has(entry))\n if (unmanaged.length > 0) {\n throw new Error(`refusing to use run output directory with unmanaged files: ${unmanaged.slice(0, 5).join(', ')}`)\n }\n\n const meaningfulEntries = entries.filter((entry) => entry !== '.DS_Store')\n if (meaningfulEntries.length === 0) {\n return\n }\n\n if (!entries.includes(RUNLOG_DIRECTORY_MARKER)) {\n throw new Error('refusing to use run output directory without ownership marker')\n }\n await assertRunlogDirectoryMarker(outputDir)\n\n const metadataEntries = RUNLOG_METADATA_FILE_NAMES.filter((entry) => entries.includes(entry))\n if (metadataEntries.length === 0) {\n return\n }\n\n const runIds = await Promise.all(\n metadataEntries.map((entry) => readRunlogMetadataRunId(outputDir, entry)),\n )\n const uniqueRunIds = new Set(runIds)\n if (uniqueRunIds.size > 1) {\n throw new Error('refusing to use run output directory with mismatched run metadata')\n }\n}\n\nasync function readRunlogMetadataRunId(outputDir: string, fileName: RunlogMetadataFileName): Promise<string> {\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(join(outputDir, fileName), 'utf8'))\n } catch (error) {\n throw new Error(`invalid ${fileName}: ${errorMessage(error)}`)\n }\n\n const value = objectValue(parsed)\n if (value === null) {\n throw new Error(`invalid ${fileName}: expected object`)\n }\n\n if (value.schema_version !== RUNLOG_METADATA_SCHEMAS[fileName]) {\n throw new Error(`invalid ${fileName}: unexpected schema_version`)\n }\n\n if (typeof value.run_id !== 'string' || value.run_id.trim() === '') {\n throw new Error(`invalid ${fileName}: missing run_id`)\n }\n\n return value.run_id\n}\n\nasync function assertRunlogDirectoryMarker(outputDir: string): Promise<void> {\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(join(outputDir, RUNLOG_DIRECTORY_MARKER), 'utf8'))\n } catch (error) {\n throw new Error(`invalid ${RUNLOG_DIRECTORY_MARKER}: ${errorMessage(error)}`)\n }\n\n const value = objectValue(parsed)\n if (value?.schema_version !== RUNLOG_DIRECTORY_MARKER_SCHEMA) {\n throw new Error(`invalid ${RUNLOG_DIRECTORY_MARKER}: unexpected schema_version`)\n }\n}\n\nasync function prepareOutputPath(\n path: string,\n prepare: () => Promise<void> = async () => {\n await mkdir(path, { recursive: true })\n },\n): Promise<void> {\n try {\n await prepare()\n } catch (error) {\n throw new CaptureOutputPrepareError(path, error)\n }\n}\n\nasync function writeCaptureRunFile(\n outputDir: string,\n payload: CapturePayload,\n runId: string,\n files: CaptureDirectoryFiles,\n): Promise<void> {\n const runFile: CaptureRunFile = {\n schema_version: 'runlog.capture.v1',\n run_id: runId,\n run: payload.run,\n recording: payload.recording,\n repo: payload.repo,\n ...(payload.redaction_failed ? { redaction_failed: true as const } : {}),\n files: {\n state: 'state.json',\n upload: 'upload.json',\n events: files.events,\n transcript: files.transcript,\n },\n }\n\n await writeFile(join(outputDir, 'run.json'), `${JSON.stringify(runFile, null, 2)}\\n`, 'utf8')\n}\n\nasync function writeRunlogDirectoryMarker(outputDir: string): Promise<void> {\n await writeFile(\n join(outputDir, RUNLOG_DIRECTORY_MARKER),\n `${JSON.stringify({ schema_version: RUNLOG_DIRECTORY_MARKER_SCHEMA }, null, 2)}\\n`,\n 'utf8',\n )\n}\n\nasync function writeCaptureUploadFile(outputDir: string, runId: string): Promise<void> {\n const path = join(outputDir, 'upload.json')\n try {\n await access(path)\n return\n } catch {}\n\n const uploadFile: CaptureUploadFile = {\n schema_version: 'runlog.upload.v1',\n run_id: runId,\n status: 'pending',\n files: {},\n }\n\n await writeFile(path, `${JSON.stringify(uploadFile, null, 2)}\\n`, 'utf8')\n}\n\nasync function writeCaptureStateFile(\n outputDir: string,\n runId: string,\n status: CaptureStateFile['status'],\n capturedAt: string,\n): Promise<void> {\n const stateFile: CaptureStateFile = {\n schema_version: 'runlog.state.v1',\n run_id: runId,\n status,\n updated_at: capturedAt,\n }\n\n await writeFile(join(outputDir, 'state.json'), `${JSON.stringify(stateFile, null, 2)}\\n`, 'utf8')\n}\n\nasync function writeChunks(outputDir: string, chunks: readonly DataFileChunk[]): Promise<void> {\n await Promise.all(chunks.map((chunk) => writeFile(join(outputDir, chunk.path), chunk.content, 'utf8')))\n}\n\nfunction withoutContent(chunk: DataFileChunk): DataFileInfo {\n return {\n path: chunk.path,\n bytes: chunk.bytes,\n lines: chunk.lines,\n oversized_line: chunk.oversized_line,\n }\n}\n\nfunction captureEnvPaths(env: NodeJS.ProcessEnv): {\n readonly outputDir: string | undefined\n readonly outputRoot: string | undefined\n} {\n const { MOXT_RUN_OUTPUT_DIR: outputDir, MOXT_RUN_OUTPUT_ROOT: outputRoot } = env\n return { outputDir, outputRoot }\n}\n\nfunction chunkJsonl(\n text: string,\n dir: 'events' | 'transcript',\n prefix: 'events' | 'transcript',\n): readonly DataFileChunk[] {\n if (text === '') {\n return []\n }\n\n const chunks: DataFileChunk[] = []\n let content = ''\n let bytes = 0\n let lines = 0\n let oversizedLine = false\n\n const flush = (): void => {\n if (content === '') {\n return\n }\n\n const index = String(chunks.length + 1).padStart(6, '0')\n chunks.push({\n path: `${dir}/${prefix}-${index}.jsonl`,\n content,\n bytes,\n lines,\n oversized_line: oversizedLine,\n })\n content = ''\n bytes = 0\n lines = 0\n oversizedLine = false\n }\n\n for (const line of jsonlLines(text)) {\n const lineBytes = Buffer.byteLength(line)\n if (lineBytes > DATA_FILE_TARGET_BYTES) {\n flush()\n content = line\n bytes = lineBytes\n lines = 1\n oversizedLine = true\n flush()\n continue\n }\n\n if (bytes > 0 && bytes + lineBytes > DATA_FILE_TARGET_BYTES) {\n flush()\n }\n\n content += line\n bytes += lineBytes\n lines += 1\n }\n\n flush()\n return chunks\n}\n\nfunction jsonlLines(text: string): readonly string[] {\n const normalized = normalizeJsonl(text)\n if (normalized === '') {\n return []\n }\n\n return normalized\n .slice(0, -1)\n .split('\\n')\n .map((line) => `${line}\\n`)\n}\n\nfunction serializeEvents(events: readonly AnalysisEvent[]): string {\n if (events.length === 0) {\n return ''\n }\n return `${events.map((event) => JSON.stringify(event)).join('\\n')}\\n`\n}\n\nfunction normalizeEvents(transcript: string, startSeq: number, agent: RunAgent): readonly AnalysisEvent[] {\n const events: AnalysisEvent[] = []\n\n for (const line of transcript.split('\\n')) {\n if (line.trim() === '') {\n continue\n }\n\n const raw = parseTranscriptLine(line)\n const event =\n agent === 'codex'\n ? normalizeCodexEvent(raw, startSeq + events.length)\n : normalizeClaudeEvent(raw, startSeq + events.length)\n if (event !== null) {\n events.push(event)\n }\n }\n\n return events\n}\n\nfunction normalizeClaudeEvent(raw: RawTranscriptLine | null, seq: number): AnalysisEvent | null {\n if (raw === null) {\n return null\n }\n\n const timestamp = stringValue(raw.timestamp)\n\n if (raw.type === 'user') {\n const message = messageValue(raw.message)\n const text = textFromContent(message?.content)\n if (text === '') {\n return null\n }\n\n return {\n schema_version: 'runlog.events.v1',\n seq,\n type: 'user_message',\n ...(timestamp === undefined ? {} : { timestamp }),\n text,\n }\n }\n\n if (raw.type === 'assistant') {\n const message = messageValue(raw.message)\n const text = textFromContent(message?.content)\n if (text === '') {\n return null\n }\n\n const usage = usageValue(message?.usage)\n const model = stringValue(message?.model)\n const inputTokens = numberValue(usage?.input_tokens)\n const outputTokens = numberValue(usage?.output_tokens)\n\n return {\n schema_version: 'runlog.events.v1',\n seq,\n type: 'assistant_message',\n ...(timestamp === undefined ? {} : { timestamp }),\n ...(model === undefined ? {} : { model }),\n text,\n ...(inputTokens === undefined ? {} : { input_tokens: inputTokens }),\n ...(outputTokens === undefined ? {} : { output_tokens: outputTokens }),\n }\n }\n\n if (raw.type === 'system' && raw.subtype === 'turn_duration') {\n const durationMs = numberValue(raw.durationMs)\n const messageCount = numberValue(raw.messageCount)\n\n return {\n schema_version: 'runlog.events.v1',\n seq,\n type: 'turn_summary',\n ...(timestamp === undefined ? {} : { timestamp }),\n ...(durationMs === undefined ? {} : { duration_ms: durationMs }),\n ...(messageCount === undefined ? {} : { message_count: messageCount }),\n }\n }\n\n return null\n}\n\nfunction normalizeCodexEvent(raw: RawTranscriptLine | null, seq: number): AnalysisEvent | null {\n if (raw === null || raw.type !== 'event_msg') {\n return null\n }\n\n const timestamp = stringValue(raw.timestamp)\n const payload = codexPayloadValue(raw.payload)\n const payloadType = stringValue(payload?.type)\n\n if (payloadType === 'user_message') {\n const text = stringValue(payload?.message) ?? ''\n if (text === '') {\n return null\n }\n\n return {\n schema_version: 'runlog.events.v1',\n seq,\n type: 'user_message',\n ...(timestamp === undefined ? {} : { timestamp }),\n text,\n }\n }\n\n if (payloadType === 'agent_message') {\n const text = stringValue(payload?.message) ?? ''\n if (text === '') {\n return null\n }\n\n return {\n schema_version: 'runlog.events.v1',\n seq,\n type: 'assistant_message',\n ...(timestamp === undefined ? {} : { timestamp }),\n text,\n }\n }\n\n if (payloadType === 'task_complete') {\n const durationMs = numberValue(payload?.duration_ms)\n return {\n schema_version: 'runlog.events.v1',\n seq,\n type: 'turn_summary',\n ...(timestamp === undefined ? {} : { timestamp }),\n ...(durationMs === undefined ? {} : { duration_ms: durationMs }),\n }\n }\n\n return null\n}\n\nfunction parseTranscriptLine(line: string): RawTranscriptLine | null {\n try {\n const value: unknown = JSON.parse(line)\n return isObject(value) ? value : null\n } catch {\n return null\n }\n}\n\nfunction textFromContent(content: unknown): string {\n if (typeof content === 'string') {\n return content\n }\n\n if (!Array.isArray(content)) {\n return ''\n }\n\n return content\n .map((part) => {\n const contentPart = contentPartValue(part)\n if (contentPart?.type !== 'text') {\n return ''\n }\n return stringValue(contentPart.text) ?? ''\n })\n .filter((text) => text !== '')\n .join('\\n')\n}\n\nfunction messageValue(value: unknown): RawMessage | undefined {\n return isObject(value) ? value : undefined\n}\n\nfunction codexPayloadValue(value: unknown): RawCodexPayload | undefined {\n return isObject(value) ? value : undefined\n}\n\nfunction usageValue(value: unknown): RawUsage | undefined {\n return isObject(value) ? value : undefined\n}\n\nfunction contentPartValue(value: unknown): RawContentPart | undefined {\n return isObject(value) ? value : undefined\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === 'number' ? value : undefined\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction hasValue(value: string | undefined): value is string {\n return value !== undefined && value !== ''\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error && error.message !== '') {\n return error.message\n }\n return String(error)\n}\n\nfunction objectValue(value: unknown): JsonObject | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value) ? (value as JsonObject) : null\n}\n","import { createHmac } from 'node:crypto'\n\nexport interface RedactionHit {\n readonly rule: string\n readonly count: number\n}\n\nexport interface RedactionResult {\n readonly text: string\n readonly hits: readonly RedactionHit[]\n}\n\ninterface RedactionRule {\n readonly name: string\n readonly pattern: RegExp\n readonly replacement: (value: string, salt: string) => string\n}\n\nconst SECRET_RULES: readonly RedactionRule[] = [\n {\n name: 'private_key',\n pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/g,\n replacement: (value, salt) => `<REDACTED:private_key:${tag(value, salt)}>`,\n },\n {\n name: 'bearer',\n pattern: /Bearer\\s+[A-Za-z0-9._~+/=-]+/gi,\n replacement: (value, salt) => `<REDACTED:bearer:${tag(value, salt)}>`,\n },\n {\n name: 'basic',\n pattern: /Basic\\s+[A-Za-z0-9+/=-]+/gi,\n replacement: (value, salt) => `<REDACTED:basic:${tag(value, salt)}>`,\n },\n {\n name: 'jwt',\n pattern: /eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+/g,\n replacement: (value, salt) => `<REDACTED:jwt:${tag(value, salt)}>`,\n },\n {\n name: 'github',\n pattern: /github_pat_[A-Za-z0-9_]{20,}/g,\n replacement: (value, salt) => `<REDACTED:github:${tag(value, salt)}>`,\n },\n {\n name: 'github',\n pattern: /github_pat_[A-Za-z0-9_]{4,}(?:\\u2026|\\.{3})/g,\n replacement: (value, salt) => `<REDACTED:github:${tag(value, salt)}>`,\n },\n {\n name: 'github',\n pattern: /gh[opsu]_[A-Za-z0-9_]{8,}/g,\n replacement: (value, salt) => `<REDACTED:github:${tag(value, salt)}>`,\n },\n {\n name: 'github',\n pattern: /gh[opsu]_[A-Za-z0-9_]{4,}(?:\\u2026|\\.{3})/g,\n replacement: (value, salt) => `<REDACTED:github:${tag(value, salt)}>`,\n },\n {\n name: 'openai',\n pattern: /sk-(?:proj-)?[A-Za-z0-9_-]{20,}/g,\n replacement: (value, salt) => `<REDACTED:openai:${tag(value, salt)}>`,\n },\n {\n name: 'openai',\n pattern: /sk-(?:proj-)?[A-Za-z0-9_-]{4,}(?:\\u2026|\\.{3})/g,\n replacement: (value, salt) => `<REDACTED:openai:${tag(value, salt)}>`,\n },\n {\n name: 'slack',\n pattern: /xox[baprs]-[A-Za-z0-9-]{10,}/g,\n replacement: (value, salt) => `<REDACTED:slack:${tag(value, salt)}>`,\n },\n {\n name: 'stripe',\n pattern: /(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{10,}/g,\n replacement: (value, salt) => `<REDACTED:stripe:${tag(value, salt)}>`,\n },\n {\n name: 'aws_key',\n pattern: /(?:AKIA|ASIA)[0-9A-Z]{16}/g,\n replacement: (value, salt) => `<REDACTED:aws_key:${tag(value, salt)}>`,\n },\n {\n name: 'aws_key',\n pattern: /(?:AKIA|ASIA)[0-9A-Z]{4,}(?:\\u2026|\\.{3})/g,\n replacement: (value, salt) => `<REDACTED:aws_key:${tag(value, salt)}>`,\n },\n]\n\nconst FIELD_QUOTED_PATTERN =\n /([\"']?(?:password|passwd|pwd|secret|client_secret|token|access_token|refresh_token|authorization|cookie|set-cookie|api_key|apikey|private_key)[\"']?\\s*[:=]\\s*)([\"'])(?:\\\\.|(?!\\2)[\\s\\S])*?\\2/gi\n\nconst FIELD_UNQUOTED_PATTERN =\n /([\"']?(?:password|passwd|pwd|secret|client_secret|token|access_token|refresh_token|cookie|set-cookie|api_key|apikey|private_key)[\"']?\\s*[:=]\\s*)[^\"',\\n}\\s]+/gi\n\nexport function redactText(text: string, salt = 'moxt-run-local-salt'): RedactionResult {\n const hitCounts = new Map<string, number>()\n let redacted = text\n\n for (const rule of SECRET_RULES) {\n redacted = redacted.replace(rule.pattern, (value) => {\n addHit(hitCounts, rule.name)\n return rule.replacement(value, salt)\n })\n }\n\n redacted = redacted\n .replace(FIELD_QUOTED_PATTERN, (_match, prefix: string, quote: string) => {\n addHit(hitCounts, 'field')\n return `${prefix}${quote}<REDACTED:field>${quote}`\n })\n .replace(FIELD_UNQUOTED_PATTERN, (_match, prefix: string) => {\n addHit(hitCounts, 'field')\n return `${prefix}<REDACTED:field>`\n })\n\n return {\n text: redacted,\n hits: [...hitCounts.entries()].map(([rule, count]) => ({ rule, count })),\n }\n}\n\nfunction tag(value: string, salt: string): string {\n return createHmac('sha256', salt).update(value).digest('hex').slice(0, 8)\n}\n\nfunction addHit(hitCounts: Map<string, number>, rule: string): void {\n hitCounts.set(rule, (hitCounts.get(rule) ?? 0) + 1)\n}\n","import type { RepoInfo } from './types.js'\n\nexport function stripRemoteCredentials(remote: string): string {\n if (!/^[a-z][a-z0-9+.-]*:\\/\\//i.test(remote)) {\n return remote\n }\n\n try {\n const url = new URL(remote)\n url.username = ''\n url.password = ''\n return url.toString()\n } catch {\n return remote\n }\n}\n\nexport function sanitizeRepo(repo: RepoInfo | null): RepoInfo | null {\n if (repo === null) return null\n return {\n ...repo,\n remote: stripRemoteCredentials(repo.remote),\n }\n}\n","import { existsSync, readdirSync, statSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { RecordingInfo, SessionMatch } from './types.js'\n\nconst SESSION_START_TOLERANCE_MS = 1000\n\nexport interface FileSnapshot {\n readonly mtimeMs: number\n readonly size: number\n}\n\nexport type SnapshotMap = Map<string, FileSnapshot>\n\nexport interface MatchResult {\n readonly match: SessionMatch\n readonly sessionFile: string | null\n readonly startOffset: number\n}\n\nexport interface MatchOptions {\n readonly isCandidate?: (path: string) => boolean\n readonly newFilesOnly?: boolean\n}\n\nexport function snapshotJsonl(root: string): SnapshotMap {\n const snapshot: SnapshotMap = new Map()\n if (!existsSync(root)) {\n return snapshot\n }\n\n collectJsonl(root, snapshot)\n return snapshot\n}\n\nexport function matchSession(\n before: SnapshotMap,\n after: SnapshotMap,\n startedAtMs: number,\n options: MatchOptions = {},\n): MatchResult {\n const candidates: Array<{\n readonly path: string\n readonly startOffset: number\n }> = []\n\n for (const [path, current] of after.entries()) {\n const previous = before.get(path)\n if (previous === undefined) {\n if (wasChangedAfterStart(current, startedAtMs)) {\n candidates.push({ path, startOffset: 0 })\n }\n continue\n }\n\n if (!options.newFilesOnly && current.size > previous.size) {\n candidates.push({ path, startOffset: previous.size })\n }\n }\n\n if (candidates.length === 0) {\n return { match: 'none', sessionFile: null, startOffset: 0 }\n }\n\n const trustedCandidates =\n options.isCandidate === undefined\n ? candidates\n : candidates.filter((candidate) => options.isCandidate?.(candidate.path))\n\n if (trustedCandidates.length === 0) {\n return { match: 'none', sessionFile: null, startOffset: 0 }\n }\n\n if (trustedCandidates.length === 1) {\n const [candidate] = trustedCandidates\n if (candidate !== undefined) {\n return {\n match: 'unique',\n sessionFile: candidate.path,\n startOffset: candidate.startOffset,\n }\n }\n }\n\n return { match: 'ambiguous', sessionFile: null, startOffset: 0 }\n}\n\nexport function matchKnownSessionFile(before: SnapshotMap, after: SnapshotMap, sessionFile: string): MatchResult {\n const current = after.get(sessionFile)\n if (current === undefined) {\n return { match: 'none', sessionFile: null, startOffset: 0 }\n }\n\n const previous = before.get(sessionFile)\n if (previous !== undefined && current.size <= previous.size) {\n return { match: 'none', sessionFile: null, startOffset: 0 }\n }\n\n return {\n match: 'unique',\n sessionFile,\n startOffset: previous?.size ?? 0,\n }\n}\n\nexport function recordingFromSessionMatch(match: SessionMatch): RecordingInfo {\n switch (match) {\n case 'unique':\n return { found_chat: true, quality: 'complete' }\n case 'none':\n return { found_chat: false, quality: 'not_found' }\n case 'ambiguous':\n return { found_chat: false, quality: 'uncertain' }\n case 'prep_failed':\n return { found_chat: false, quality: 'unavailable' }\n }\n}\n\nfunction collectJsonl(dir: string, snapshot: SnapshotMap): void {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, entry.name)\n if (entry.isDirectory()) {\n collectJsonl(path, snapshot)\n continue\n }\n\n if (!entry.isFile() || !entry.name.endsWith('.jsonl')) {\n continue\n }\n\n const stat = statSync(path)\n snapshot.set(path, {\n mtimeMs: stat.mtimeMs,\n size: stat.size,\n })\n }\n}\n\nfunction wasChangedAfterStart(current: FileSnapshot, startedAtMs: number): boolean {\n return current.mtimeMs >= startedAtMs - SESSION_START_TOLERANCE_MS\n}\n","import type { RunStatus } from './types.js'\n\nconst SIGNAL_NUMBERS = new Map<NodeJS.Signals, number>([\n ['SIGHUP', 1],\n ['SIGINT', 2],\n ['SIGQUIT', 3],\n ['SIGKILL', 9],\n ['SIGTERM', 15],\n])\n\nexport interface ExitEvent {\n readonly code: number | null\n readonly signal: NodeJS.Signals | null\n readonly errorCode?: string\n}\n\nexport interface ClassifiedExit {\n readonly code: number\n readonly status: RunStatus\n}\n\nexport function signalNumber(signal: NodeJS.Signals): number {\n return SIGNAL_NUMBERS.get(signal) ?? 0\n}\n\nexport function classifyExit(event: ExitEvent, observedSignals: ReadonlySet<number>): ClassifiedExit {\n if (event.errorCode !== undefined) {\n return {\n code: event.errorCode === 'ENOENT' ? 127 : 126,\n status: 'unknown',\n }\n }\n\n if (event.signal !== null) {\n return {\n code: 128 + signalNumber(event.signal),\n status: 'cancelled',\n }\n }\n\n if (event.code !== null) {\n if (event.code === 0) {\n return { code: 0, status: 'completed' }\n }\n\n const signal = event.code - 128\n return {\n code: event.code,\n status: event.code > 128 && observedSignals.has(signal) ? 'cancelled' : 'failed',\n }\n }\n\n return { code: 1, status: 'unknown' }\n}\n","import { appendFile, open, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport {\n type CaptureDirectoryFiles,\n captureOutputDirectories,\n type DataFileInfo,\n emitOpenCaptureDirectories,\n finalizeCaptureDirectories,\n serializeEventsFromTranscript,\n} from './capture.js'\nimport { redactText } from './redaction.js'\nimport {\n type MatchOptions,\n matchKnownSessionFile,\n matchSession,\n recordingFromSessionMatch,\n type SnapshotMap,\n snapshotJsonl,\n} from './session.js'\nimport type { CapturePayload, SessionMatch } from './types.js'\nimport type { OpenSessionFileMatch } from './process-session.js'\n\nconst DATA_FILE_TARGET_BYTES = 1024 * 1024\nconst LIVE_CAPTURE_INTERVAL_MS = 250\n\ninterface LiveCaptureOptions {\n readonly env: NodeJS.ProcessEnv\n readonly runId: string\n readonly agent: CapturePayload['run']['agent']\n readonly startedAt: string\n readonly sessions: string\n readonly before: SnapshotMap\n readonly baselineOk: boolean\n readonly startedAtMs: number\n readonly knownSessionFile?: string\n readonly isSessionCandidate?: (path: string) => boolean\n readonly newSessionFilesOnly?: boolean\n readonly openSessionFile?: () => OpenSessionFileMatch\n}\n\ninterface ReadResult {\n readonly text: string\n readonly bytes: number\n}\n\ninterface MutableFileInfo {\n readonly path: string\n bytes: number\n lines: number\n oversized_line: boolean\n}\n\nexport function createLiveCapture(options: LiveCaptureOptions): LiveCaptureRecorder {\n return new LiveCaptureRecorder(options)\n}\n\nexport class LiveCaptureRecorder {\n readonly enabled: boolean\n private readonly outputs: readonly CaptureDirectoryOutput[]\n private readonly env: NodeJS.ProcessEnv\n private readonly runId: string\n private readonly agent: CapturePayload['run']['agent']\n private readonly startedAt: string\n private readonly sessions: string\n private readonly before: SnapshotMap\n private readonly baselineOk: boolean\n private readonly startedAtMs: number\n private readonly knownSessionFile: string | undefined\n private readonly isSessionCandidate: ((path: string) => boolean) | undefined\n private readonly newSessionFilesOnly: boolean\n private readonly openSessionFile: (() => OpenSessionFileMatch) | undefined\n private timer: NodeJS.Timeout | undefined\n private pollInFlight: Promise<void> | null = null\n private sessionFile: string | null = null\n private readOffset = 0\n private pendingText = ''\n private nextSeq = 1\n private sessionMatch: SessionMatch\n private captureFailed = false\n\n constructor(options: LiveCaptureOptions) {\n const outputDirs = captureOutputDirectories(options.env, options.runId)\n this.enabled = outputDirs.length > 0\n this.outputs = outputDirs.map((outputDir) => new CaptureDirectoryOutput(outputDir))\n this.env = options.env\n this.runId = options.runId\n this.agent = options.agent\n this.startedAt = options.startedAt\n this.sessions = options.sessions\n this.before = options.before\n this.baselineOk = options.baselineOk\n this.startedAtMs = options.startedAtMs\n this.knownSessionFile = options.knownSessionFile\n this.isSessionCandidate = options.isSessionCandidate\n this.newSessionFilesOnly = options.newSessionFilesOnly ?? false\n this.openSessionFile = options.openSessionFile\n this.sessionMatch = options.baselineOk ? 'none' : 'prep_failed'\n }\n\n async start(): Promise<void> {\n if (!this.enabled) {\n return\n }\n\n await emitOpenCaptureDirectories(this.env, this.runId, this.startedAt)\n if (this.baselineOk) {\n this.timer = setInterval(() => {\n this.queuePoll()\n }, LIVE_CAPTURE_INTERVAL_MS)\n }\n }\n\n async stop(): Promise<void> {\n if (!this.enabled) {\n return\n }\n\n if (this.timer !== undefined) {\n clearInterval(this.timer)\n this.timer = undefined\n }\n\n if (this.pollInFlight !== null) {\n await this.pollInFlight\n }\n\n await this.poll()\n await this.flushPendingText()\n }\n\n async finalize(payload: CapturePayload, capturedAt: string): Promise<void> {\n if (!this.enabled) {\n return\n }\n\n if (!isCompleteRecording(payload)) {\n await Promise.all(this.outputs.map((output) => output.invalidate()))\n }\n\n await finalizeCaptureDirectories(this.directoryPayload(payload), this.env, this.runId, capturedAt, this.files())\n }\n\n private queuePoll(): void {\n if (this.pollInFlight !== null) {\n return\n }\n\n this.pollInFlight = this.poll().finally(() => {\n this.pollInFlight = null\n })\n }\n\n private async poll(): Promise<void> {\n if (!this.baselineOk || this.captureFailed) {\n return\n }\n\n try {\n const snapshot = snapshotJsonl(this.sessions)\n if (this.sessionFile === null) {\n if (this.knownSessionFile !== undefined) {\n const matched = matchKnownSessionFile(this.before, snapshot, this.knownSessionFile)\n if (matched.match === 'unique' && matched.sessionFile !== null) {\n this.sessionMatch = matched.match\n this.sessionFile = matched.sessionFile\n this.readOffset = matched.startOffset\n await this.captureNewText()\n return\n }\n }\n\n const opened = this.openSessionFile?.() ?? { match: 'none' }\n if (opened.match === 'ambiguous') {\n this.sessionMatch = 'ambiguous'\n return\n }\n\n if (opened.match === 'unique') {\n const matched = matchKnownSessionFile(this.before, snapshot, opened.sessionFile)\n this.sessionMatch = matched.match\n if (matched.match === 'unique' && matched.sessionFile !== null) {\n this.sessionFile = matched.sessionFile\n this.readOffset = matched.startOffset\n await this.captureNewText()\n }\n return\n }\n\n const matched = matchSession(this.before, snapshot, this.startedAtMs, this.matchOptions())\n this.sessionMatch = matched.match\n if (matched.match !== 'unique' || matched.sessionFile === null) {\n return\n }\n\n this.sessionFile = matched.sessionFile\n this.readOffset = matched.startOffset\n }\n\n await this.captureNewText()\n } catch {\n this.captureFailed = true\n }\n }\n\n private async captureNewText(): Promise<void> {\n if (this.sessionFile === null) {\n return\n }\n\n const next = await readFileFromOffset(this.sessionFile, this.readOffset)\n if (next.bytes === 0) {\n return\n }\n\n this.readOffset += next.bytes\n await this.captureCompleteLines(next.text)\n }\n\n private async captureCompleteLines(text: string): Promise<void> {\n const combined = `${this.pendingText}${text}`\n const lastNewline = combined.lastIndexOf('\\n')\n if (lastNewline === -1) {\n this.pendingText = combined\n return\n }\n\n const complete = combined.slice(0, lastNewline + 1)\n this.pendingText = combined.slice(lastNewline + 1)\n await this.captureTranscriptText(complete)\n }\n\n private async flushPendingText(): Promise<void> {\n if (this.pendingText === '') {\n return\n }\n\n const text = `${this.pendingText}\\n`\n this.pendingText = ''\n await this.captureTranscriptText(text)\n }\n\n private async captureTranscriptText(text: string): Promise<void> {\n const redacted = redactText(text).text\n const events = serializeEventsFromTranscript(redacted, this.nextSeq, this.agent)\n this.nextSeq = events.nextSeq\n\n await Promise.all(\n this.outputs.map(async (output) => {\n await output.appendTranscript(redacted)\n await output.appendEvents(events.text)\n }),\n )\n }\n\n private directoryPayload(payload: CapturePayload): CapturePayload {\n const recording = isCompleteRecording(payload)\n ? this.sessionFile === null\n ? payload.recording\n : recordingFromSessionMatch(this.sessionMatch)\n : payload.recording\n const keepRedactionFailure = this.captureFailed || (this.files().transcript.length === 0 && payload.redaction_failed)\n const { redaction_failed: _redactionFailed, ...rest } = payload\n\n return {\n ...rest,\n ...(keepRedactionFailure ? { redaction_failed: true as const } : {}),\n recording,\n }\n }\n\n private files(): CaptureDirectoryFiles {\n const [output] = this.outputs\n if (output === undefined) {\n return { events: [], transcript: [] }\n }\n\n return output.files()\n }\n\n private matchOptions(): MatchOptions {\n return {\n ...(this.isSessionCandidate === undefined ? {} : { isCandidate: this.isSessionCandidate }),\n ...(this.newSessionFilesOnly ? { newFilesOnly: true as const } : {}),\n }\n }\n}\n\nclass CaptureDirectoryOutput {\n private readonly transcript: JsonlStreamWriter\n private readonly events: JsonlStreamWriter\n\n constructor(outputDir: string) {\n this.transcript = new JsonlStreamWriter(outputDir, 'transcript', 'transcript')\n this.events = new JsonlStreamWriter(outputDir, 'events', 'events')\n }\n\n async appendTranscript(text: string): Promise<void> {\n await this.transcript.appendText(text)\n }\n\n async appendEvents(text: string): Promise<void> {\n await this.events.appendText(text)\n }\n\n async invalidate(): Promise<void> {\n await Promise.all([this.transcript.invalidate(), this.events.invalidate()])\n }\n\n files(): CaptureDirectoryFiles {\n return {\n events: this.events.files(),\n transcript: this.transcript.files(),\n }\n }\n}\n\nclass JsonlStreamWriter {\n private readonly outputDir: string\n private readonly dir: 'events' | 'transcript'\n private readonly prefix: 'events' | 'transcript'\n private readonly writtenFiles: MutableFileInfo[] = []\n private current: MutableFileInfo | null = null\n\n constructor(outputDir: string, dir: 'events' | 'transcript', prefix: 'events' | 'transcript') {\n this.outputDir = outputDir\n this.dir = dir\n this.prefix = prefix\n }\n\n async appendText(text: string): Promise<void> {\n for (const line of jsonlLines(text)) {\n await this.appendLine(line)\n }\n }\n\n async invalidate(): Promise<void> {\n await Promise.all(\n this.writtenFiles.map(async (file) => {\n file.bytes = 0\n file.lines = 0\n file.oversized_line = false\n await writeFile(join(this.outputDir, file.path), '', 'utf8')\n }),\n )\n this.current = null\n }\n\n files(): readonly DataFileInfo[] {\n return this.writtenFiles.map((file) => ({ ...file }))\n }\n\n private async appendLine(line: string): Promise<void> {\n const lineBytes = Buffer.byteLength(line)\n if (lineBytes > DATA_FILE_TARGET_BYTES) {\n this.current = null\n const file = this.createFile()\n file.bytes += lineBytes\n file.lines += 1\n file.oversized_line = true\n await appendFile(join(this.outputDir, file.path), line, 'utf8')\n this.current = null\n return\n }\n\n if (this.current !== null && this.current.bytes + lineBytes > DATA_FILE_TARGET_BYTES) {\n this.current = null\n }\n\n const file = this.current ?? this.createFile()\n file.bytes += lineBytes\n file.lines += 1\n await appendFile(join(this.outputDir, file.path), line, 'utf8')\n }\n\n private createFile(): MutableFileInfo {\n const index = String(this.writtenFiles.length + 1).padStart(6, '0')\n const file: MutableFileInfo = {\n path: `${this.dir}/${this.prefix}-${index}.jsonl`,\n bytes: 0,\n lines: 0,\n oversized_line: false,\n }\n this.writtenFiles.push(file)\n this.current = file\n return file\n }\n}\n\nfunction isCompleteRecording(payload: CapturePayload): boolean {\n return payload.recording.found_chat && payload.recording.quality === 'complete'\n}\n\nfunction jsonlLines(text: string): readonly string[] {\n if (text === '') {\n return []\n }\n\n const normalized = text.endsWith('\\n') ? text : `${text}\\n`\n return normalized\n .slice(0, -1)\n .split('\\n')\n .map((line) => `${line}\\n`)\n}\n\nasync function readFileFromOffset(path: string, offset: number): Promise<ReadResult> {\n const file = await open(path, 'r')\n try {\n const stat = await file.stat()\n const length = Math.max(0, stat.size - offset)\n if (length === 0) {\n return { text: '', bytes: 0 }\n }\n\n const buffer = Buffer.alloc(length)\n const result = await file.read(buffer, 0, length, offset)\n return { text: buffer.subarray(0, result.bytesRead).toString('utf8'), bytes: result.bytesRead }\n } finally {\n await file.close()\n }\n}\n","import { createHash } from 'node:crypto'\nimport type { Dirent } from 'node:fs'\nimport { readdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { arch, platform } from 'node:os'\nimport { join, relative } from 'node:path'\nimport { type CaptureUploadFileEntry, captureOutputDirectories } from './capture.js'\nimport { cloudflareAccessHeaders } from '../utils/cf-access.js'\n\ndeclare const __CLI_VERSION__: string\n\nconst DEFAULT_HOST = 'api.moxt.ai'\nconst DEFAULT_UPLOAD_TIMEOUT_MS = 30000\n\nexport interface RunUploadOptions {\n readonly workspaceId: string\n}\n\ninterface UploadConfig extends RunUploadOptions {\n readonly timeoutMs?: number\n}\n\ninterface UploadFile {\n readonly artifactPath: string\n readonly bytes: number\n readonly sha256: string\n readonly contentText: string\n}\n\ninterface UploadState {\n readonly schema_version: 'runlog.upload.v1'\n readonly run_id: string\n status: 'pending' | 'uploading' | 'partial' | 'uploaded' | 'failed'\n updated_at: string\n files: Record<string, CaptureUploadFileEntry>\n}\n\ninterface UploadResponse {\n readonly etag?: string\n}\n\nexport interface UploadRunArtifactsOptions {\n readonly env: NodeJS.ProcessEnv\n readonly runId: string\n readonly upload: RunUploadOptions\n}\n\nexport async function uploadRunArtifacts(options: UploadRunArtifactsOptions): Promise<void> {\n const outputDirs = captureOutputDirectories(options.env, options.runId)\n const failures: string[] = []\n\n for (const outputDir of outputDirs) {\n try {\n await uploadDirectory(outputDir, options.runId, options.upload, options.env)\n } catch (error) {\n failures.push(`${outputDir}: ${errorMessage(error)}`)\n }\n }\n\n if (failures.length > 0) {\n throw new Error(failures.join('; '))\n }\n}\n\nexport async function uploadDirectory(\n outputDir: string,\n runId: string,\n config: UploadConfig,\n env: NodeJS.ProcessEnv,\n): Promise<void> {\n const files = await discoverUploadFiles(outputDir)\n const state = await readUploadState(outputDir, runId)\n\n for (const file of files) {\n const previous = state.files[file.artifactPath]\n if (previous?.status === 'uploaded' && previous.sha256 === file.sha256 && previous.bytes === file.bytes) {\n continue\n }\n\n const attempts = (previous?.attempts ?? 0) + 1\n state.files[file.artifactPath] = {\n status: 'uploading',\n bytes: file.bytes,\n sha256: file.sha256,\n attempts,\n }\n state.status = 'uploading'\n state.updated_at = new Date().toISOString()\n await writeUploadState(outputDir, state)\n\n try {\n const response = await uploadFile(runId, file, config, env)\n state.files[file.artifactPath] = {\n status: 'uploaded',\n bytes: file.bytes,\n sha256: file.sha256,\n attempts,\n uploaded_at: new Date().toISOString(),\n ...(response.etag === undefined ? {} : { etag: response.etag }),\n }\n } catch (error) {\n state.files[file.artifactPath] = {\n status: 'failed',\n bytes: file.bytes,\n sha256: file.sha256,\n attempts,\n failed_at: new Date().toISOString(),\n error: errorMessage(error),\n }\n }\n\n state.status = uploadStatus(\n state.files,\n files.map((candidate) => candidate.artifactPath),\n )\n state.updated_at = new Date().toISOString()\n await writeUploadState(outputDir, state)\n }\n\n state.status = uploadStatus(\n state.files,\n files.map((file) => file.artifactPath),\n )\n state.updated_at = new Date().toISOString()\n await writeUploadState(outputDir, state)\n\n if (state.status === 'failed') {\n throw new Error('one or more run files failed to upload')\n }\n}\n\nasync function discoverUploadFiles(outputDir: string): Promise<UploadFile[]> {\n const paths = await uploadPaths(outputDir)\n const files = await Promise.all(\n paths.map(async (path) => {\n const absolute = join(outputDir, path)\n const content = await readFile(absolute)\n return {\n artifactPath: path,\n bytes: content.byteLength,\n sha256: createHash('sha256').update(content).digest('hex'),\n contentText: content.toString('utf8'),\n }\n }),\n )\n return files.sort((a, b) => a.artifactPath.localeCompare(b.artifactPath))\n}\n\nasync function uploadPaths(outputDir: string): Promise<string[]> {\n const paths: string[] = []\n\n for (const name of ['run.json', 'state.json'] as const) {\n const absolute = join(outputDir, name)\n try {\n const fileStat = await stat(absolute)\n if (fileStat.isFile()) {\n paths.push(name)\n }\n } catch {}\n }\n\n for (const dir of ['events', 'transcript'] as const) {\n await collectFiles(outputDir, join(outputDir, dir), paths)\n }\n\n return paths.sort()\n}\n\nasync function collectFiles(outputDir: string, dir: string, paths: string[]): Promise<void> {\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { withFileTypes: true })\n } catch {\n return\n }\n\n for (const entry of entries) {\n const absolute = join(dir, entry.name)\n if (entry.isDirectory()) {\n await collectFiles(outputDir, absolute, paths)\n continue\n }\n\n if (!entry.isFile()) {\n continue\n }\n\n const fileStat = await stat(absolute)\n if (fileStat.size === 0) {\n continue\n }\n\n paths.push(relative(outputDir, absolute).replaceAll('\\\\', '/'))\n }\n}\n\nasync function uploadFile(\n runId: string,\n file: UploadFile,\n config: UploadConfig,\n env: NodeJS.ProcessEnv,\n): Promise<UploadResponse> {\n const apiKey = env.MOXT_API_KEY\n if (apiKey === undefined || apiKey === '') {\n throw new Error('MOXT_API_KEY is required for run upload')\n }\n\n const timeoutMs = config.timeoutMs ?? DEFAULT_UPLOAD_TIMEOUT_MS\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, timeoutMs)\n\n try {\n const response = await fetch(\n `${apiBaseUrl(env)}/workspaces/${encodeURIComponent(config.workspaceId)}/local-agent-runs/${encodeURIComponent(runId)}/files`,\n {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n 'User-Agent': userAgent(),\n ...cloudflareAccessHeaders(env),\n },\n signal: controller.signal,\n body: JSON.stringify({\n schema_version: 'local_agent_run.upload_file.v1',\n artifact_path: file.artifactPath,\n bytes: file.bytes,\n sha256: file.sha256,\n encoding: 'utf8',\n content_text: file.contentText,\n }),\n },\n )\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`)\n }\n\n const headerEtag = response.headers.get('etag') ?? undefined\n const body = await responseJson(response)\n const { etag: bodyEtagValue } = isObject(body) ? body : {}\n const bodyEtag = typeof bodyEtagValue === 'string' ? bodyEtagValue : undefined\n const etag = bodyEtag ?? headerEtag\n return etag === undefined ? {} : { etag }\n } catch (error) {\n if (controller.signal.aborted) {\n throw new Error(`upload timed out after ${timeoutMs}ms`)\n }\n throw error\n } finally {\n clearTimeout(timeout)\n }\n}\n\nasync function readUploadState(outputDir: string, runId: string): Promise<UploadState> {\n try {\n const value: unknown = JSON.parse(await readFile(join(outputDir, 'upload.json'), 'utf8'))\n if (isUploadState(value, runId)) {\n return value\n }\n } catch {}\n\n return {\n schema_version: 'runlog.upload.v1',\n run_id: runId,\n status: 'pending',\n updated_at: new Date().toISOString(),\n files: {},\n }\n}\n\nasync function writeUploadState(outputDir: string, state: UploadState): Promise<void> {\n await writeFile(join(outputDir, 'upload.json'), `${JSON.stringify(state, null, 2)}\\n`, 'utf8')\n}\n\nfunction uploadStatus(\n files: Record<string, CaptureUploadFileEntry>,\n expectedPaths: readonly string[],\n): UploadState['status'] {\n if (expectedPaths.length === 0) {\n return 'pending'\n }\n\n const states = expectedPaths.map((path) => files[path]?.status ?? 'pending')\n if (states.some((status) => status === 'failed')) {\n return 'failed'\n }\n\n if (states.every((status) => status === 'uploaded')) {\n return 'uploaded'\n }\n\n if (states.some((status) => status === 'uploaded')) {\n return 'partial'\n }\n\n return 'uploading'\n}\n\nfunction isUploadState(value: unknown, runId: string): value is UploadState {\n if (!isObject(value)) {\n return false\n }\n\n const { schema_version: schemaVersion, run_id: valueRunId, files } = value\n return schemaVersion === 'runlog.upload.v1' && valueRunId === runId && isObject(files)\n}\n\nasync function responseJson(response: Response): Promise<unknown> {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nfunction apiBaseUrl(env: NodeJS.ProcessEnv): string {\n return `https://${env.MOXT_HOST ?? DEFAULT_HOST}/openapi/v1`\n}\n\nfunction userAgent(): string {\n return `moxt-cli/${__CLI_VERSION__} (${platform()}/${arch()}) node/${process.versions.node}`\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error && error.message !== '') {\n return error.message\n }\n return String(error)\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","export function cloudflareAccessHeaders(env: NodeJS.ProcessEnv = process.env): Record<string, string> {\n const headers: Record<string, string> = {}\n const token = firstValue(env.MOXT_CF_ACCESS_TOKEN, env.CF_ACCESS_TOKEN)\n if (token !== undefined) {\n headers['CF-Access-Token'] = token\n }\n\n const clientId = firstValue(env.MOXT_CF_ACCESS_CLIENT_ID, env.CF_ACCESS_CLIENT_ID)\n const clientSecret = firstValue(env.MOXT_CF_ACCESS_CLIENT_SECRET, env.CF_ACCESS_CLIENT_SECRET)\n if (clientId !== undefined && clientSecret !== undefined) {\n headers['CF-Access-Client-Id'] = clientId\n headers['CF-Access-Client-Secret'] = clientSecret\n }\n\n return headers\n}\n\nfunction firstValue(...values: Array<string | undefined>): string | undefined {\n return values.find((value): value is string => value !== undefined && value !== '')\n}\n","import { execFileSync } from 'node:child_process'\nimport { isAbsolute, relative } from 'node:path'\n\nexport type OpenSessionFileMatch =\n | {\n readonly match: 'unique'\n readonly sessionFile: string\n }\n | {\n readonly match: 'none' | 'ambiguous'\n }\n\nexport interface FindOpenSessionFileOptions {\n readonly rootPid: number\n readonly sessionRoot: string\n readonly isCandidate?: (path: string) => boolean\n readonly platform?: NodeJS.Platform\n}\n\nexport function findOpenSessionFile(options: FindOpenSessionFileOptions): OpenSessionFileMatch {\n if ((options.platform ?? process.platform) !== 'darwin') {\n return { match: 'none' }\n }\n\n try {\n const psOutput = execFileSync('ps', ['-axo', 'pid=,ppid='], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n const pids = processTreePids(options.rootPid, psOutput)\n const lsofOutput = execFileSync('lsof', ['-F', 'pn', '-p', pids.join(',')], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n\n return openSessionFileFromLsof(lsofOutput, {\n sessionRoot: options.sessionRoot,\n ...(options.isCandidate === undefined ? {} : { isCandidate: options.isCandidate }),\n })\n } catch {\n return { match: 'none' }\n }\n}\n\nexport function processTreePids(rootPid: number, psOutput: string): readonly number[] {\n const childrenByParent = new Map<number, number[]>()\n for (const line of psOutput.split('\\n')) {\n const [pidText, ppidText] = line.trim().split(/\\s+/, 2)\n const pid = Number(pidText)\n const ppid = Number(ppidText)\n if (!Number.isInteger(pid) || !Number.isInteger(ppid) || pid <= 0) {\n continue\n }\n\n const children = childrenByParent.get(ppid) ?? []\n children.push(pid)\n childrenByParent.set(ppid, children)\n }\n\n const pids: number[] = []\n const seen = new Set<number>()\n const queue = [rootPid]\n while (queue.length > 0) {\n const pid = queue.shift() as number\n if (seen.has(pid)) {\n continue\n }\n\n seen.add(pid)\n pids.push(pid)\n queue.push(...(childrenByParent.get(pid) ?? []))\n }\n\n return pids\n}\n\nexport function openSessionFileFromLsof(\n lsofOutput: string,\n options: {\n readonly sessionRoot: string\n readonly isCandidate?: (path: string) => boolean\n },\n): OpenSessionFileMatch {\n const files = new Set<string>()\n for (const line of lsofOutput.split('\\n')) {\n if (!line.startsWith('n')) {\n continue\n }\n\n const path = line.slice(1)\n if (!path.endsWith('.jsonl') || !isInside(options.sessionRoot, path)) {\n continue\n }\n\n if (options.isCandidate !== undefined && !options.isCandidate(path)) {\n continue\n }\n\n files.add(alignPathToRoot(options.sessionRoot, path))\n }\n\n if (files.size === 0) {\n return { match: 'none' }\n }\n\n if (files.size === 1) {\n return { match: 'unique', sessionFile: [...files].join('') }\n }\n\n return { match: 'ambiguous' }\n}\n\nfunction isInside(root: string, path: string): boolean {\n if (isPathInside(root, path)) {\n return true\n }\n\n return isPathInside(normalizeDarwinVarPath(root), normalizeDarwinVarPath(path))\n}\n\nfunction isPathInside(root: string, path: string): boolean {\n const fromRoot = relative(root, path)\n return fromRoot === '' || (!fromRoot.startsWith('..') && !isAbsolute(fromRoot))\n}\n\nfunction normalizeDarwinVarPath(path: string): string {\n return path.startsWith('/private/var/') ? path.slice('/private'.length) : path\n}\n\nfunction alignPathToRoot(root: string, path: string): string {\n if (root.startsWith('/var/') && path.startsWith('/private/var/')) {\n return path.slice('/private'.length)\n }\n\n if (root.startsWith('/private/var/') && path.startsWith('/var/')) {\n return `/private${path}`\n }\n\n return path\n}\n","import { execFileSync } from 'node:child_process'\nimport type { RepoInfo } from './types.js'\n\nexport function collectRepoFingerprint(cwd: string): RepoInfo | null {\n const root = git(['rev-parse', '--show-toplevel'], cwd)\n if (root === null) {\n return null\n }\n\n return {\n root,\n remote: git(['config', '--get', 'remote.origin.url'], cwd) ?? '',\n branch: git(['branch', '--show-current'], cwd) ?? '',\n head: git(['rev-parse', 'HEAD'], cwd) ?? '',\n }\n}\n\nfunction git(args: readonly string[], cwd: string): string | null {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n }).trim()\n } catch {\n return null\n }\n}\n","import { closeSync, openSync, readSync, realpathSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport type { RunAgent } from './types.js'\n\nconst CODEX_METADATA_READ_BYTES = 256 * 1024\n\ninterface RawCodexSessionLine {\n readonly type?: unknown\n readonly payload?: unknown\n}\n\ninterface RawCodexSessionPayload {\n readonly cwd?: unknown\n}\n\nexport interface AgentSessionOptions {\n readonly agent: RunAgent\n readonly cwd: string\n readonly home: string\n readonly env: NodeJS.ProcessEnv\n readonly agentArgs: readonly string[]\n}\n\nexport function claudeProjectDir(cwd: string, home: string): string {\n return join(home, '.claude', 'projects', encodeClaudeProjectPath(cwd))\n}\n\nexport function encodeClaudeProjectPath(cwd: string): string {\n return cwd.replaceAll(/[^A-Za-z0-9]/g, '-')\n}\n\nexport function agentSessionDir(options: AgentSessionOptions): string {\n switch (options.agent) {\n case 'claude':\n return claudeProjectDir(options.cwd, options.home)\n case 'codex':\n return codexSessionsDir(options.home, options.env)\n }\n}\n\nexport function agentSessionCandidateFilter(\n options: AgentSessionOptions,\n): ((path: string) => boolean) | undefined {\n switch (options.agent) {\n case 'claude':\n return undefined\n case 'codex': {\n const expectedCwd = expectedCodexCwd(options.cwd, options.agentArgs)\n return (path: string) => {\n try {\n const sessionCwd = codexSessionCwd(path)\n return sessionCwd !== null && sameCodexCwd(sessionCwd, expectedCwd)\n } catch {\n return false\n }\n }\n }\n }\n}\n\nexport function agentKnownSessionFile(options: AgentSessionOptions): string | undefined {\n switch (options.agent) {\n case 'claude': {\n const sessionId =\n claudeSessionIdArg(options.agentArgs) ??\n (claudeForkSessionArg(options.agentArgs) ? undefined : claudeResumeSessionIdArg(options.agentArgs))\n return sessionId === undefined ? undefined : join(claudeProjectDir(options.cwd, options.home), `${sessionId}.jsonl`)\n }\n case 'codex':\n return undefined\n }\n}\n\nexport function codexSessionsDir(home: string, env: NodeJS.ProcessEnv = {}): string {\n return join(codexHome(home, env), 'sessions')\n}\n\nexport function codexHome(home: string, env: NodeJS.ProcessEnv = {}): string {\n const { CODEX_HOME: configured } = env\n return hasValue(configured) ? configured : join(home, '.codex')\n}\n\nexport function expectedCodexCwd(cwd: string, agentArgs: readonly string[]): string {\n const cd = codexCdArg(agentArgs)\n return cd === undefined ? resolve(cwd) : resolve(cwd, cd)\n}\n\nexport function claudeSessionIdArg(agentArgs: readonly string[]): string | undefined {\n const optionArgs = claudeOptionArgs(agentArgs)\n for (let index = 0; index < optionArgs.length; index += 1) {\n const arg = optionArgs[index] as string\n\n if (arg === '--session-id') {\n return optionArgs[index + 1]\n }\n\n if (arg.startsWith('--session-id=')) {\n return arg.slice('--session-id='.length)\n }\n }\n\n return undefined\n}\n\nexport function claudeResumeSessionIdArg(agentArgs: readonly string[]): string | undefined {\n const optionArgs = claudeOptionArgs(agentArgs)\n for (let index = 0; index < optionArgs.length; index += 1) {\n const arg = optionArgs[index] as string\n\n if (arg === '--resume' || arg === '-r') {\n const value = optionArgs[index + 1]\n return isUuid(value) ? value : undefined\n }\n\n if (arg.startsWith('--resume=')) {\n const value = arg.slice('--resume='.length)\n return isUuid(value) ? value : undefined\n }\n }\n\n return undefined\n}\n\nexport function isClaudeResumeInvocation(agentArgs: readonly string[]): boolean {\n for (const arg of claudeOptionArgs(agentArgs)) {\n if (\n arg === '--continue' ||\n arg === '-c' ||\n arg === '--resume' ||\n arg === '-r' ||\n arg.startsWith('--resume=') ||\n arg === '--from-pr' ||\n arg.startsWith('--from-pr=')\n ) {\n return true\n }\n }\n\n return false\n}\n\nexport function codexSessionCwd(path: string): string | null {\n const text = readFilePrefix(path, CODEX_METADATA_READ_BYTES)\n for (const line of text.split('\\n')) {\n const cwd = codexLineCwd(line)\n if (cwd !== null) {\n return cwd\n }\n }\n\n return null\n}\n\nfunction codexCdArg(agentArgs: readonly string[]): string | undefined {\n const optionArgs = codexOptionArgs(agentArgs)\n for (let index = 0; index < optionArgs.length; index += 1) {\n const arg = optionArgs[index] as string\n\n if (arg === '--cd' || arg === '-C') {\n return optionArgs[index + 1]\n }\n\n if (arg.startsWith('--cd=')) {\n return arg.slice('--cd='.length)\n }\n }\n\n return undefined\n}\n\nfunction codexOptionArgs(agentArgs: readonly string[]): readonly string[] {\n const separatorIndex = agentArgs.indexOf('--')\n return separatorIndex === -1 ? agentArgs : agentArgs.slice(0, separatorIndex)\n}\n\nfunction sameCodexCwd(left: string, right: string): boolean {\n return normalizeCodexCwd(left) === normalizeCodexCwd(right)\n}\n\nfunction normalizeCodexCwd(path: string): string {\n try {\n return realpathSync(path)\n } catch {\n return resolve(path)\n }\n}\n\nfunction claudeForkSessionArg(agentArgs: readonly string[]): boolean {\n return claudeOptionArgs(agentArgs).includes('--fork-session')\n}\n\nfunction claudeOptionArgs(agentArgs: readonly string[]): readonly string[] {\n const separatorIndex = agentArgs.indexOf('--')\n return separatorIndex === -1 ? agentArgs : agentArgs.slice(0, separatorIndex)\n}\n\nfunction isUuid(value: string | undefined): value is string {\n return (\n value !== undefined &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{12}$/i.test(value)\n )\n}\n\nfunction codexLineCwd(line: string): string | null {\n if (line.trim() === '') {\n return null\n }\n\n let value: unknown\n try {\n value = JSON.parse(line)\n } catch {\n return null\n }\n\n const entry = rawCodexSessionLine(value)\n if (entry === null) {\n return null\n }\n\n const type = entry.type\n if (type !== 'session_meta' && type !== 'turn_context') {\n return null\n }\n\n const payload = rawCodexSessionPayload(entry.payload)\n const cwd = payload?.cwd\n return typeof cwd === 'string' ? cwd : null\n}\n\nfunction readFilePrefix(path: string, bytes: number): string {\n const fd = openSync(path, 'r')\n try {\n const buffer = Buffer.alloc(bytes)\n const read = readSync(fd, buffer, 0, bytes, 0)\n return buffer.subarray(0, read).toString('utf8')\n } finally {\n closeSync(fd)\n }\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction rawCodexSessionLine(value: unknown): RawCodexSessionLine | null {\n return objectValue(value) as RawCodexSessionLine | null\n}\n\nfunction rawCodexSessionPayload(value: unknown): RawCodexSessionPayload | null {\n return objectValue(value) as RawCodexSessionPayload | null\n}\n\nfunction hasValue(value: string | undefined): value is string {\n return value !== undefined && value !== ''\n}\n","import { Command } from 'commander'\nimport { type RunUploadOptions } from '../run/moxt-uploader.js'\nimport { runLocalAgent } from '../run/run-agent.js'\nimport type { RunAgent } from '../run/types.js'\nimport { printError } from '../utils/output.js'\n\ninterface RunCommandOptions {\n workspace?: string\n}\n\nexport function registerRunCommand(program: Command): void {\n program\n .command('run')\n .description('Run a local agent and capture its work as Moxt context')\n .option('-w, --workspace <workspaceId>', 'Workspace ID for upload mode')\n .argument('<agent>', 'Local agent to run: claude or codex')\n .argument('[agentArgs...]', 'Arguments passed to the local agent after --')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .action(async (agentArg: string, agentArgs: string[] | undefined, options: RunCommandOptions) => {\n const agent = parseAgent(agentArg)\n const upload = resolveUploadOptions(options)\n const exitCode = await runLocalAgentOrExit(agent, agentArgs ?? [], upload)\n process.exit(exitCode)\n })\n}\n\nfunction parseAgent(agent: string): RunAgent {\n if (agent === 'claude' || agent === 'codex') {\n return agent\n }\n printError(`Error: moxt run supports only \"claude\" or \"codex\", got \"${agent}\".`)\n process.exit(1)\n}\n\nfunction resolveUploadOptions(options: RunCommandOptions): RunUploadOptions | undefined {\n const workspaceId = resolveWorkspaceId(options)\n if (workspaceId === undefined) {\n return undefined\n }\n\n if (!process.env.MOXT_API_KEY) {\n printError('Error: MOXT_API_KEY is required when using moxt run upload mode with -w/--workspace or MOXT_WORKSPACE_ID.')\n process.exit(1)\n }\n\n return {\n workspaceId,\n }\n}\n\nfunction resolveWorkspaceId(options: RunCommandOptions): string | undefined {\n return normalizeWorkspaceId(options.workspace) ?? normalizeWorkspaceId(process.env.MOXT_WORKSPACE_ID)\n}\n\nfunction normalizeWorkspaceId(value: string | undefined): string | undefined {\n const trimmed = value?.trim()\n return trimmed === undefined || trimmed === '' ? undefined : trimmed\n}\n\nasync function runLocalAgentOrExit(\n agent: RunAgent,\n agentArgs: readonly string[],\n upload: RunUploadOptions | undefined,\n): Promise<number> {\n return await runLocalAgent({\n agent,\n agentArgs,\n ...(upload === undefined ? {} : { upload }),\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 { 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":["path","buffer","path","program","path","buffer","program","path","runOrExit","path","program","closeSync","openSync","readSync","homedir","path","uploadFile","flush","existsSync","statSync","join","path","current","stat","writeFile","join","DATA_FILE_TARGET_BYTES","matched","jsonlLines","writeFile","join","file","path","stat","buffer","readdir","readFile","writeFile","arch","platform","join","DEFAULT_HOST","errorMessage","path","join","readFile","readdir","isObject","writeFile","platform","arch","relative","path","execFileSync","join","path","hasValue","path","buffer","objectValue","hasValue","homedir","errorMessage","resolve","readFileFromOffset","path","openSync","stat","buffer","readSync","closeSync","program","fs","program","program","program","members","program","arch","platform","platform","arch","program"]}