@moxt-ai/cli 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -228,7 +228,6 @@ moxt workflow comment delete -w <workspace-id> <workflow-file-id> <task-id> <com
228
228
 
229
229
  # Inspect or abort workflow agent runs
230
230
  moxt workflow run status -w <workspace-id> <workflow-file-id> <trigger-id> [trigger-id...]
231
- moxt workflow run output -w <workspace-id> <workflow-file-id> <trigger-id>
232
231
  moxt workflow run abort -w <workspace-id> <workflow-file-id> <trigger-id>
233
232
  ```
234
233
 
package/dist/index.js CHANGED
@@ -153,7 +153,7 @@ function getApiKeyOrUndefined() {
153
153
 
154
154
  // src/utils/http.ts
155
155
  function getUserAgent() {
156
- return `moxt-cli/${"0.4.0"} (${platform()}/${arch()}) node/${process.versions.node}`;
156
+ return `moxt-cli/${"0.5.0"} (${platform()}/${arch()}) node/${process.versions.node}`;
157
157
  }
158
158
  async function fetchApi(method, path2, body) {
159
159
  const apiKey = getApiKey();
@@ -1513,7 +1513,7 @@ function printWorkflowDetail(item) {
1513
1513
  }
1514
1514
  }
1515
1515
  function printTaskSummary(item) {
1516
- const runIds = item.agentRuns.map((run) => run.pipelineTriggerId).join(",") || "-";
1516
+ const runIds = item.runningAgentRuns.map((run) => run.pipelineId).join(",") || "-";
1517
1517
  print(
1518
1518
  `${colors.bold}#${item.scopedId}${colors.reset} ${item.title} status=${item.statusScopedId} priority=${priorityLabel(item.priority)} assignee=${formatAssignee(item.assignee)} runs=${runIds}`
1519
1519
  );
@@ -1535,12 +1535,12 @@ function printTaskDetail(item) {
1535
1535
  for (const fileId of item.linkedFileIds) print(` - ${fileId}`);
1536
1536
  }
1537
1537
  printDetailField2("subscribed", item.subscribed);
1538
- if (item.agentRuns.length === 0) {
1539
- print("agentRuns: []");
1538
+ if (item.runningAgentRuns.length === 0) {
1539
+ print("runningAgentRuns: []");
1540
1540
  } else {
1541
- print("agentRuns:");
1542
- for (const run of item.agentRuns) {
1543
- print(` - pipelineTriggerId: ${run.pipelineTriggerId}`);
1541
+ print("runningAgentRuns:");
1542
+ for (const run of item.runningAgentRuns) {
1543
+ print(` - pipelineId: ${run.pipelineId}`);
1544
1544
  printAssigneeDetail("executor", run.executor, 4);
1545
1545
  }
1546
1546
  }
@@ -1820,7 +1820,7 @@ function registerTaskCommands(workflow) {
1820
1820
  workflowFileId: options.workflowFileId
1821
1821
  }));
1822
1822
  startSpinner("Fetching workflow tasks...");
1823
- const response = await httpGet(`/workspaces/${options.workspace}/workflow-tasks${query}`);
1823
+ const response = await httpGet(`/workspaces/${options.workspace}/workflow-tasks-v2${query}`);
1824
1824
  if (!response.ok) {
1825
1825
  stopSpinner(false, "Failed");
1826
1826
  failResponse(response);
@@ -1839,9 +1839,7 @@ function registerTaskCommands(workflow) {
1839
1839
  ).action(async (workflowFileId, taskScopedId, options) => {
1840
1840
  const id = runOrExit4(() => parsePositiveInteger(taskScopedId, "taskScopedId"));
1841
1841
  startSpinner("Fetching task...");
1842
- const response = await httpGet(
1843
- `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}`
1844
- );
1842
+ const response = await getWorkflowTask(options.workspace, workflowFileId, id);
1845
1843
  if (!response.ok) {
1846
1844
  stopSpinner(false, "Failed");
1847
1845
  failResponse(response);
@@ -1869,10 +1867,19 @@ function registerTaskCommands(workflow) {
1869
1867
  return next;
1870
1868
  });
1871
1869
  startSpinner("Creating task...");
1872
- const response = await httpPost(
1873
- `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks`,
1870
+ const createResponse = await httpPost(
1871
+ `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2`,
1874
1872
  body
1875
1873
  );
1874
+ if (!createResponse.ok) {
1875
+ stopSpinner(false, "Failed");
1876
+ failResponse(createResponse);
1877
+ }
1878
+ const response = await getWorkflowTask(
1879
+ options.workspace,
1880
+ workflowFileId,
1881
+ createResponse.data.taskScopedId
1882
+ );
1876
1883
  if (!response.ok) {
1877
1884
  stopSpinner(false, "Failed");
1878
1885
  failResponse(response);
@@ -1903,10 +1910,15 @@ function registerTaskCommands(workflow) {
1903
1910
  });
1904
1911
  const id = runOrExit4(() => parsePositiveInteger(taskScopedId, "taskScopedId"));
1905
1912
  startSpinner("Updating task...");
1906
- const response = await httpPatch(
1907
- `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/metadata`,
1913
+ const updateResponse = await httpPatch(
1914
+ `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/metadata`,
1908
1915
  body
1909
1916
  );
1917
+ if (!updateResponse.ok) {
1918
+ stopSpinner(false, "Failed");
1919
+ failResponse(updateResponse);
1920
+ }
1921
+ const response = await getWorkflowTask(options.workspace, workflowFileId, id);
1910
1922
  if (!response.ok) {
1911
1923
  stopSpinner(false, "Failed");
1912
1924
  failResponse(response);
@@ -1925,8 +1937,13 @@ function registerTaskCommands(workflow) {
1925
1937
  fileIds: parseFileIds(options.fileIds, "--file-ids")
1926
1938
  }));
1927
1939
  startSpinner(action === "add-linked-files" ? "Adding linked files..." : "Removing linked files...");
1928
- const path2 = `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/linked-files`;
1929
- const response = action === "add-linked-files" ? await httpPost(path2, { fileIds }) : await httpDelete(path2, { fileIds });
1940
+ const path2 = `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/linked-files`;
1941
+ const updateResponse = action === "add-linked-files" ? await httpPost(path2, { fileIds }) : await httpDelete(path2, { fileIds });
1942
+ if (!updateResponse.ok) {
1943
+ stopSpinner(false, "Failed");
1944
+ failResponse(updateResponse);
1945
+ }
1946
+ const response = await getWorkflowTask(options.workspace, workflowFileId, id);
1930
1947
  if (!response.ok) {
1931
1948
  stopSpinner(false, "Failed");
1932
1949
  failResponse(response);
@@ -1945,10 +1962,15 @@ function registerTaskCommands(workflow) {
1945
1962
  statusScopedId: parsePositiveInteger(options.status, "--status")
1946
1963
  }));
1947
1964
  startSpinner("Moving task...");
1948
- const response = await httpPatch(
1949
- `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/status`,
1965
+ const updateResponse = await httpPatch(
1966
+ `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/status`,
1950
1967
  { statusScopedId }
1951
1968
  );
1969
+ if (!updateResponse.ok) {
1970
+ stopSpinner(false, "Failed");
1971
+ failResponse(updateResponse);
1972
+ }
1973
+ const response = await getWorkflowTask(options.workspace, workflowFileId, id);
1952
1974
  if (!response.ok) {
1953
1975
  stopSpinner(false, "Failed");
1954
1976
  failResponse(response);
@@ -1970,10 +1992,15 @@ function registerTaskCommands(workflow) {
1970
1992
  });
1971
1993
  const id = runOrExit4(() => parsePositiveInteger(taskScopedId, "taskScopedId"));
1972
1994
  startSpinner("Updating task assignee...");
1973
- const response = await httpPatch(
1974
- `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/assignee`,
1995
+ const updateResponse = await httpPatch(
1996
+ `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/assignee`,
1975
1997
  body
1976
1998
  );
1999
+ if (!updateResponse.ok) {
2000
+ stopSpinner(false, "Failed");
2001
+ failResponse(updateResponse);
2002
+ }
2003
+ const response = await getWorkflowTask(options.workspace, workflowFileId, id);
1977
2004
  if (!response.ok) {
1978
2005
  stopSpinner(false, "Failed");
1979
2006
  failResponse(response);
@@ -1997,6 +2024,11 @@ function registerTaskCommands(workflow) {
1997
2024
  stopSpinner(true, `Deleted: ${response.data.scopedId}`);
1998
2025
  });
1999
2026
  }
2027
+ function getWorkflowTask(workspaceId, workflowFileId, taskScopedId) {
2028
+ return httpGet(
2029
+ `/workspaces/${workspaceId}/workflows/${workflowFileId}/tasks-v2/${taskScopedId}`
2030
+ );
2031
+ }
2000
2032
  function registerCommentCommands(workflow) {
2001
2033
  const comment = workflow.command("comment").description("Workflow task comment operations");
2002
2034
  addWorkspaceOption(
@@ -2084,21 +2116,6 @@ function registerRunCommands(workflow) {
2084
2116
  print(`${colors.bold}${item.workflowPipelineTriggerId}${colors.reset} ${item.pipelineStatus}`);
2085
2117
  }
2086
2118
  });
2087
- addWorkspaceOption(
2088
- run.command("output").description("Get workflow agent run output events").argument("<workflowFileId>").argument("<triggerId>")
2089
- ).action(async (workflowFileId, triggerId, options) => {
2090
- const id = runOrExit4(() => parsePositiveInteger(triggerId, "workflowPipelineTriggerId"));
2091
- startSpinner("Fetching run output...");
2092
- const response = await httpGet(
2093
- `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/trigger/${id}/output`
2094
- );
2095
- if (!response.ok) {
2096
- stopSpinner(false, "Failed");
2097
- failResponse(response);
2098
- }
2099
- stopSpinner(true, `Run ${response.data.workflowPipelineTriggerId}`);
2100
- for (const event of response.data.pipelineEvents) print(event);
2101
- });
2102
2119
  addWorkspaceOption(
2103
2120
  run.command("abort").description("Abort a workflow agent run").argument("<workflowFileId>").argument("<triggerId>")
2104
2121
  ).action(async (workflowFileId, triggerId, options) => {
@@ -2139,7 +2156,7 @@ var FLUSH_TIMEOUT_MS = 3e3;
2139
2156
  var MAX_BATCH_SIZE = 100;
2140
2157
  function commonLabels() {
2141
2158
  return {
2142
- cli_version: "0.4.0",
2159
+ cli_version: "0.5.0",
2143
2160
  node_version: process.versions.node,
2144
2161
  os: platform2(),
2145
2162
  arch: arch2(),
@@ -2185,7 +2202,7 @@ async function flush() {
2185
2202
  }
2186
2203
  const batch = buffer.splice(0, MAX_BATCH_SIZE);
2187
2204
  const payload = {
2188
- release_id: "0.4.0",
2205
+ release_id: "0.5.0",
2189
2206
  client_type: "cli",
2190
2207
  metric_data_list: batch.map((m) => ({
2191
2208
  profile: "cli",
@@ -2326,9 +2343,9 @@ function installExitHandler() {
2326
2343
 
2327
2344
  // src/index.ts
2328
2345
  updateNotifier({
2329
- pkg: { name: "@moxt-ai/cli", version: "0.4.0" }
2346
+ pkg: { name: "@moxt-ai/cli", version: "0.5.0" }
2330
2347
  }).notify();
2331
- var program = createProgram("0.4.0");
2348
+ var program = createProgram("0.5.0");
2332
2349
  instrumentProgram(program);
2333
2350
  installExitHandler();
2334
2351
  program.parseAsync(process.argv).then(async () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/program.ts","../src/commands/file.ts","../src/commands/file-comment.ts","../src/utils/file-selector.ts","../src/utils/http.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/spinner.ts","../src/utils/search-options.ts","../src/utils/run-or-exit.ts","../src/commands/memory.ts","../src/utils/miniapp-db.ts","../src/commands/miniapp.ts","../src/telemetry/config.ts","../src/telemetry/opt-out.ts","../src/commands/telemetry.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/commands/workflow.ts","../src/telemetry/client.ts","../src/telemetry/notice.ts","../src/telemetry/instrument.ts"],"sourcesContent":["import updateNotifier from 'update-notifier'\nimport { createProgram } from './program.js'\nimport { flush } from './telemetry/client.js'\nimport { installExitHandler, instrumentProgram } from './telemetry/instrument.js'\n\ndeclare const __CLI_VERSION__: string\n\nupdateNotifier({\n pkg: { name: '@moxt-ai/cli', version: __CLI_VERSION__ },\n}).notify()\n\nconst program = createProgram(__CLI_VERSION__)\n\ninstrumentProgram(program)\ninstallExitHandler()\n\nprogram\n .parseAsync(process.argv)\n .then(async () => {\n await flush()\n })\n .catch(async (err: unknown) => {\n console.error('CLI Error:', err)\n await flush()\n process.exit(1)\n })\n","import { Command } from 'commander'\nimport { registerFileCommand } from './commands/file.js'\nimport { registerMemoryCommand } from './commands/memory.js'\nimport { registerMiniappCommand } from './commands/miniapp.js'\nimport { registerTelemetryCommand } from './commands/telemetry.js'\nimport { registerWhoamiCommand } from './commands/whoami.js'\nimport { registerWorkspaceCommand } from './commands/workspace.js'\nimport { registerWorkflowCommand } from './commands/workflow.js'\n\nexport function createProgram(version: string): Command {\n const program = new Command()\n\n program\n .name('moxt')\n .description('Moxt CLI - AI Workspace')\n .version(version)\n .action(() => {\n program.help()\n })\n\n registerWhoamiCommand(program)\n registerWorkspaceCommand(program)\n registerFileCommand(program)\n registerMemoryCommand(program)\n registerWorkflowCommand(program)\n registerMiniappCommand(program)\n registerTelemetryCommand(program)\n\n return program\n}\n","import * as fs from 'node:fs'\nimport { Command } from 'commander'\nimport { registerFileCommentCommands } from './file-comment.js'\nimport {\n buildFileQueryString,\n isBinaryContent,\n resolveReadMode,\n resolveSpaceSelector,\n resolveWriteMode,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPost, httpPut } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseSearchMode } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface FileEntry {\n name: string\n type: 'file' | 'directory'\n size: number | null\n}\n\ninterface FileReadResponse {\n path: string\n type: 'file' | 'directory'\n entries: FileEntry[] | null\n content: string | null\n}\n\ninterface FileWriteResponse {\n path: string\n created: boolean\n}\n\ninterface MkdirResponse {\n path: string\n created: boolean\n}\n\ninterface DeleteResponse {\n path: string\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FieldHighlight {\n text: string\n}\n\ninterface SemanticSnippet {\n content: string\n}\n\ninterface FileSearchItem {\n repoId: string\n fileId: string\n filePath: string\n rank: number\n contentHighlight?: FieldHighlight\n filePathHighlight?: FieldHighlight\n semanticSnippets: SemanticSnippet[]\n}\n\ninterface FileSearchResponse {\n items: FileSearchItem[]\n}\n\nfunction addSpaceOptions(cmd: Command): Command {\n return cmd\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('File operations')\n\n registerFileCommentCommands(file)\n\n addSpaceOptions(\n file.command('search')\n .description('Search files in accessible spaces')\n .argument('<query>', 'Search query')\n .option('-l, --limit <limit>', 'Maximum number of files to return', '30')\n .option('--mode <mode>', 'Keyword matching mode: any or all', 'any'),\n ).action(async (query: string, options: SpaceOptions & { limit?: string; mode?: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const limit = runOrExit(() => parseSearchLimit(options.limit, 30, 80))\n const mode = runOrExit(() => parseSearchMode(options.mode))\n\n startSpinner('Searching files...')\n const response = await httpPost<FileSearchResponse>(\n `/workspaces/${options.workspace}/files/search`,\n {\n query,\n limit,\n mode,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No files found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} file(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. ${item.filePath}${colors.reset}`)\n print(`${colors.dim}repo=${item.repoId} file=${item.fileId}${colors.reset}`)\n const snippet = item.contentHighlight?.text ?? item.semanticSnippets[0]?.content\n if (snippet) {\n print(snippet)\n }\n print('')\n }\n })\n\n addSpaceOptions(\n file.command('get-url')\n .description('Resolve the shareable browser URL for a file')\n .requiredOption('-p, --path <path>', 'File path'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Resolving URL...')\n const response = await httpGet<FileUrlResponse>(\n `/workspaces/${options.workspace}/files/url${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, response.data.path)\n print(`${colors.cyan}${response.data.url}${colors.reset}`)\n })\n\n addSpaceOptions(\n file.command('list')\n .description('List directory contents')\n .option('-p, --path <path>', 'Directory path', '/'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Listing files...')\n const response = await httpGet<FileReadResponse>(\n `/workspaces/${options.workspace}/files/list${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { path, entries } = response.data\n\n if (!entries || entries.length === 0) {\n stopSpinner(true, `${path}: empty directory`)\n return\n }\n\n stopSpinner(true, path)\n for (const entry of entries) {\n if (entry.type === 'directory') {\n print(`${colors.blue}${entry.name}/${colors.reset}`)\n } else {\n print(entry.name)\n }\n }\n })\n\n file.command('read')\n .description('Read file content')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .action(async (options: Partial<SpaceOptions> & { path?: string; url?: string }) => {\n const mode = runOrExit(() => resolveReadMode(options))\n\n startSpinner('Reading file...')\n\n let response: { ok: boolean; status: number; data: FileReadResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpGet<FileReadResponse>(\n `/files/read-by-url?url=${encodeURIComponent(mode.url)}`,\n )\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n response = await httpGet<FileReadResponse>(\n `/workspaces/${mode.workspace}/files/read${qs}`,\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { type, content } = response.data\n\n if (type === 'directory') {\n stopSpinner(false, 'Failed')\n print(`${colors.red}☠ ${displayPath} is a directory${colors.reset}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Done')\n print(content ?? '')\n })\n\n file.command('put')\n .description('Upload a file')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'Remote file path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .requiredOption('-l, --local-path <localPath>', 'Local file path')\n .option('-r, --recursive', 'Create parent directories if needed')\n .action(\n async (options: Partial<SpaceOptions> & {\n path?: string\n url?: string\n localPath: string\n recursive?: boolean\n }) => {\n const mode = runOrExit(() => resolveWriteMode(options))\n\n if (!fs.existsSync(options.localPath)) {\n print(`${colors.red}☠ Local file not found: ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const stats = fs.statSync(options.localPath)\n if (!stats.isFile()) {\n print(`${colors.red}☠ Not a file: ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const maxSize = 10 * 1024 * 1024\n if (stats.size > maxSize) {\n print(`${colors.red}☠ File too large (max 10MB): ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const buffer = fs.readFileSync(options.localPath)\n if (isBinaryContent(buffer)) {\n print(`${colors.red}☠ Binary files are not allowed. Only text files can be uploaded.${colors.reset}`)\n process.exit(1)\n }\n\n const content = buffer.toString('utf8')\n\n startSpinner('Uploading...')\n\n let response: { ok: boolean; status: number; data: FileWriteResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpPut<FileWriteResponse>('/files/write-by-url', {\n url: mode.url,\n content,\n })\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n response = await httpPut<FileWriteResponse>(\n `/workspaces/${mode.workspace}/files/write`,\n {\n path: mode.path,\n content,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n if (mode.kind === 'by-url') {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n }\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Updated'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('mkdir')\n .description('Create a directory')\n .requiredOption('-p, --path <path>', 'Directory path')\n .option('-r, --recursive', 'Create parent directories if needed'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n recursive?: boolean\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Creating directory...')\n const response = await httpPost<MkdirResponse>(\n `/workspaces/${options.workspace}/files/mkdir`,\n {\n path: options.path,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Already exists'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('del')\n .description('Delete a file or empty directory')\n .requiredOption('-p, --path <path>', 'File or directory path'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Deleting...')\n const response = await httpDelete<DeleteResponse>(\n `/workspaces/${options.workspace}/files/delete`,\n {\n path: options.path,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Path not found: ${options.path}${colors.reset}`)\n } else if (response.status === 400) {\n print(`${colors.red}☠ Cannot delete non-empty directory${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, `Deleted: ${response.data.path}`)\n },\n )\n}\n","import * as fs from 'node:fs'\nimport { TextDecoder } from 'node:util'\nimport { Command } from 'commander'\nimport {\n buildFileQueryString,\n ReadMode,\n resolveReadMode,\n resolveSpaceSelector,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpGet, httpPatch } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\n// The comment/thread ID column is a nanoid, and canonical file URLs embed a UUID fileId.\n// Mirror the server contract (server-ts openapi-file-comment.vo.ts / openapi-file-url.controller.ts)\n// so the CLI rejects malformed URLs locally instead of forwarding them to the API.\nconst FILE_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst URL_FORMAT_HINT =\n 'Error: invalid Moxt URL format. Expected https://moxt.ai/w/{workspaceId}/{fileId} ' +\n 'or https://moxt.ai/w/{workspaceId}/c/{agentId}[/{sessionId}]?file={fileId}'\n\ninterface FileCommentAuthor {\n humanId: number | null\n assistantId: number | null\n teammateId: number | null\n authorName: string | null\n authorAvatarUrl: string | null\n}\n\ninterface FileCommentItem extends FileCommentAuthor {\n id: string\n threadId: string\n content: string\n createdAt: string\n editedAt: string | null\n}\n\ninterface FileCommentThread {\n threadId: string\n items: FileCommentItem[]\n createdAt: string\n createdBy: FileCommentAuthor\n resolvedAt: string | null\n quotedText: string | null\n fileId: string\n}\n\ninterface ListFileCommentsResponse {\n items: FileCommentThread[]\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FileCommentOptions extends Partial<SpaceOptions> {\n path?: string\n url?: string\n}\n\n/**\n * Error thrown when a file comment command's local option/content validation fails.\n * Handlers catch it via {@link runOrExit} and turn it into stderr + exit code 1.\n */\nclass FileCommentOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FileCommentOptionsError'\n }\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof FileCommentOptionsError || err instanceof SpaceOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\n/**\n * Extract the workspace/file identifiers a comment API call needs from a canonical\n * Moxt file URL. Supports the workspace-mode shape `/w/{workspaceId}/{fileId}` and the\n * chat deeplink `/w/{workspaceId}/c/{agentId}[/{sessionId}]?file={fileId}`.\n */\nfunction parseMoxtFileUrl(url: string): { workspaceId: string; fileId: string } {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length < 3 || segments[0] !== 'w') {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n const workspaceId = segments[1]\n\n let fileId: string | undefined\n if (segments[2] === 'c') {\n fileId = parsed.searchParams.get('file') ?? undefined\n } else if (segments.length === 3) {\n fileId = segments[2]\n }\n\n if (!fileId || !FILE_ID_UUID_RE.test(fileId)) {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n return { workspaceId, fileId }\n}\n\n/**\n * Resolve the target file for a comment command. URL mode reads the identifiers directly;\n * path mode calls the existing `file get-url` endpoint to obtain a stable URL, then parses it.\n */\nasync function resolveFileTarget(options: FileCommentOptions): Promise<{ workspaceId: string; fileId: string }> {\n const mode: ReadMode = runOrExit(() => resolveReadMode(options))\n if (mode.kind === 'by-url') {\n return runOrExit(() => parseMoxtFileUrl(mode.url))\n }\n\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n\n startSpinner('Resolving file...')\n const response = await httpGet<FileUrlResponse>(`/workspaces/${mode.workspace}/files/url${qs}`)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${mode.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n stopSpinner(true, response.data.path)\n return runOrExit(() => parseMoxtFileUrl(response.data.url))\n}\n\nfunction readCommentContentFile(path: string): string {\n if (!fs.existsSync(path)) {\n throw new FileCommentOptionsError(`Error: comment content file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new FileCommentOptionsError(`Error: comment content path is not a file: ${path}`)\n }\n const buffer = fs.readFileSync(path)\n if (buffer.includes(0)) {\n throw new FileCommentOptionsError('Error: comment content file must not contain NUL bytes.')\n }\n let content: string\n try {\n content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer)\n } catch {\n throw new FileCommentOptionsError('Error: comment content file must contain valid UTF-8 text.')\n }\n // The file comment API only requires a non-empty body (server schema: z.string().min(1));\n // there is no server-side max length, so the CLI must not impose a client-only cap.\n if (content.length === 0) {\n throw new FileCommentOptionsError('Error: comment content file must not be empty.')\n }\n return content\n}\n\nfunction parseResolveState(state: string | undefined): boolean {\n if (state === 'resolved') return true\n if (state === 'open') return false\n throw new FileCommentOptionsError('Error: --state must be \"resolved\" or \"open\".')\n}\n\ntype DetailScalar = string | number | boolean | null\n\nfunction indentation(size: number): string {\n return ' '.repeat(size)\n}\n\n// Escape terminal control characters so untrusted comment content, author names, and\n// avatar URLs cannot inject ANSI/OSC sequences into the operator's terminal.\nfunction escapeTerminalControlCharacters(value: string): string {\n return value\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n )\n}\n\nfunction formatDetailScalar(value: DetailScalar): string {\n if (value === null) return 'null'\n if (typeof value === 'string') {\n const escaped = escapeTerminalControlCharacters(value)\n if (escaped === '') return '\"\"'\n if (/\\n/.test(escaped)) return JSON.stringify(escaped)\n return escaped\n }\n return String(value)\n}\n\nfunction printDetailField(name: string, value: DetailScalar, indent = 0): void {\n print(`${indentation(indent)}${name}: ${formatDetailScalar(value)}`)\n}\n\nfunction printDetailTextField(name: string, value: string | null, indent = 0): void {\n if (value === null || value === '') {\n printDetailField(name, value, indent)\n return\n }\n const escaped = escapeTerminalControlCharacters(value)\n print(`${indentation(indent)}${name}:`)\n for (const line of escaped.split('\\n')) {\n print(`${indentation(indent + 2)}${line}`)\n }\n}\n\nfunction printAuthorFields(author: FileCommentAuthor, indent: number): void {\n printDetailField('humanId', author.humanId, indent)\n printDetailField('assistantId', author.assistantId, indent)\n printDetailField('teammateId', author.teammateId, indent)\n printDetailField('authorName', author.authorName, indent)\n printDetailField('authorAvatarUrl', author.authorAvatarUrl, indent)\n}\n\nfunction printCommentItem(item: FileCommentItem, indent = 0): void {\n print(`${indentation(indent)}${colors.bold}Comment${colors.reset}`)\n printDetailField('id', item.id, indent + 2)\n printDetailField('threadId', item.threadId, indent + 2)\n printAuthorFields(item, indent + 2)\n printDetailTextField('content', item.content, indent + 2)\n printDetailField('createdAt', item.createdAt, indent + 2)\n printDetailField('editedAt', item.editedAt, indent + 2)\n}\n\nfunction printThread(thread: FileCommentThread): void {\n print(`${colors.bold}Thread${colors.reset}`)\n printDetailField('threadId', thread.threadId, 2)\n printDetailField('fileId', thread.fileId, 2)\n printDetailTextField('quotedText', thread.quotedText, 2)\n printDetailField('resolvedAt', thread.resolvedAt, 2)\n print(`${indentation(2)}createdBy:`)\n printAuthorFields(thread.createdBy, 4)\n printDetailField('createdAt', thread.createdAt, 2)\n print(`${indentation(2)}comments:`)\n thread.items.forEach((item) => printCommentItem(item, 4))\n}\n\nfunction addFileSelectorOptions(cmd: Command): Command {\n return cmd\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n}\n\nexport function registerFileCommentCommands(file: Command): void {\n const comment = file.command('comment').description('File comment operations')\n\n addFileSelectorOptions(\n comment.command('list').description('List comment threads on a file'),\n ).action(async (options: FileCommentOptions) => {\n const target = await resolveFileTarget(options)\n\n startSpinner('Fetching comments...')\n const response = await httpGet<ListFileCommentsResponse>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comment-threads`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (response.data.items.length === 0) {\n stopSpinner(true, 'No comments found.')\n return\n }\n stopSpinner(true, `Found ${response.data.items.length} thread(s)`)\n response.data.items.forEach((thread, index) => {\n if (index > 0) print('')\n printThread(thread)\n })\n })\n\n addFileSelectorOptions(\n comment.command('update')\n .description('Update a comment you created')\n .argument('<commentId>')\n .requiredOption('--content-path <localPath>', 'Local UTF-8 text file for comment content'),\n ).action(async (commentId: string, options: FileCommentOptions & { contentPath: string }) => {\n // Validate the local content file before any network call so invalid input\n // never leaves the CLI (path-mode resolution below issues an HTTP request).\n const content = runOrExit(() => readCommentContentFile(options.contentPath))\n const target = await resolveFileTarget(options)\n\n startSpinner('Updating comment...')\n const response = await httpPatch<FileCommentItem>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comments/${commentId}`,\n { content },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n stopSpinner(true, 'Comment updated')\n printCommentItem(response.data)\n })\n\n addFileSelectorOptions(\n comment.command('resolve')\n .description('Resolve or reopen a comment thread')\n .argument('<threadId>')\n .requiredOption('--state <state>', 'Thread state: resolved or open'),\n ).action(async (threadId: string, options: FileCommentOptions & { state: string }) => {\n const resolved = runOrExit(() => parseResolveState(options.state))\n const target = await resolveFileTarget(options)\n\n startSpinner(resolved ? 'Resolving thread...' : 'Reopening thread...')\n const response = await httpPatch<unknown>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comment-threads/${threadId}/resolve`,\n { resolved },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n stopSpinner(true, resolved ? `Resolved: ${threadId}` : `Reopened: ${threadId}`)\n })\n}\n","/**\n * Pure logic for resolving file-command space selectors and building request URLs.\n *\n * These functions are extracted from commands/file.ts so they can be unit tested\n * without spawning the CLI or mocking process.exit. All error conditions are\n * surfaced as thrown Errors; action handlers are responsible for turning them\n * into user-facing output and exit codes.\n */\n\nexport interface SpaceOptions {\n workspace: string\n space?: string\n personal?: boolean\n teamSpaceId?: string\n teammateId?: string\n}\n\nexport interface SpaceParams {\n space?: string\n teamSpaceId?: string\n agentId?: number\n}\n\n/**\n * Error thrown when selector options violate a contract (mutually exclusive,\n * wrong format, etc). Action handlers catch this and print the message before\n * exiting with code 1.\n */\nexport class SpaceOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SpaceOptionsError'\n }\n}\n\n/**\n * Resolve mutually-exclusive space selector flags into normalized request params.\n *\n * Priority (only one must be set): --team-space-id > --teammate-id > --personal > -s <name>.\n * When none is set, returns empty params (server treats this as personal space).\n */\nexport function resolveSpaceSelector(options: SpaceOptions): SpaceParams {\n // Destructure first so TypeScript's control-flow analysis can narrow each\n // field through the subsequent non-null / non-empty checks without having\n // to re-read options.* at the point of use (which would lose narrowing).\n const { space, teamSpaceId, teammateId } = options\n const personalIsSet = options.personal === true\n\n // Count \"user-set\" selectors explicitly so the mutual-exclusion check\n // reflects intent (\"which flags did the user pass?\") rather than a\n // generic truthiness filter. This keeps the mutual-exclusion check\n // cleanly separated from the downstream format validation (e.g.\n // `parsed <= 0` for teammateId).\n const spaceIsSet = space != null && space !== ''\n const teamSpaceIdIsSet = teamSpaceId != null && teamSpaceId !== ''\n const teammateIdIsSet = teammateId != null && teammateId !== ''\n const selectorCount =\n (spaceIsSet ? 1 : 0) + (personalIsSet ? 1 : 0) + (teamSpaceIdIsSet ? 1 : 0) + (teammateIdIsSet ? 1 : 0)\n if (selectorCount > 1) {\n throw new SpaceOptionsError(\n 'Error: -s, --personal, --team-space-id, and --teammate-id are mutually exclusive.',\n )\n }\n\n // Dispatch via the underlying field checks (not `*IsSet`) so TypeScript\n // narrows each local to `string`, letting us return without `!`.\n if (teamSpaceId != null && teamSpaceId !== '') {\n return { teamSpaceId }\n }\n if (teammateId != null && teammateId !== '') {\n const parsed = Number.parseInt(teammateId, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== teammateId) {\n throw new SpaceOptionsError(\n `Error: --teammate-id must be a positive integer, got \"${teammateId}\".`,\n )\n }\n return { agentId: parsed }\n }\n if (personalIsSet) {\n return { space: 'personal' }\n }\n if (space != null && space !== '') {\n return { space }\n }\n return {}\n}\n\n/**\n * Build the `?path=...&space=...` query string for file endpoints.\n * Returns empty string when no params are set (caller should not append `?`).\n * Values are URL-encoded via URLSearchParams.\n *\n * An empty-string `path` is treated as \"not provided\" and omitted from the query;\n * callers should pass `undefined` rather than `\"\"` when no path is intended.\n */\nexport function buildFileQueryString(path: string | undefined, spaceParams: SpaceParams): string {\n const params = new URLSearchParams()\n if (path != null && path !== '') {\n params.set('path', path)\n }\n if (spaceParams.space) {\n params.set('space', spaceParams.space)\n }\n if (spaceParams.teamSpaceId) {\n params.set('teamSpaceId', spaceParams.teamSpaceId)\n }\n if (spaceParams.agentId != null) {\n params.set('agentId', String(spaceParams.agentId))\n }\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\n/**\n * Detect if a Buffer contains binary content by sampling the first 8192 bytes.\n * Control characters other than tab (9), LF (10), and CR (13) are treated as binary.\n */\nexport function isBinaryContent(buffer: Buffer): boolean {\n const sampleSize = Math.min(buffer.length, 8192)\n\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i]\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Validate `file read` command's top-level mutually-exclusive options (-u vs -w/-p).\n * Returns the resolved mode ('by-url' or 'by-path'). Throws SpaceOptionsError on conflict.\n *\n * Empty strings are treated as \"not provided\" (commander never passes empty strings\n * for optional flags, but callers outside the CLI context should pass undefined instead\n * of \"\" to avoid unexpected branch behaviour).\n */\nexport type ReadMode = { kind: 'by-url'; url: string } | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveReadMode(options: {\n url?: string\n workspace?: string\n path?: string\n}): ReadMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n // At this point both workspace and path are guaranteed non-empty by the guards\n // above. Use explicit checks so TypeScript narrows the types without needing `!`.\n if (!options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n return { kind: 'by-path', workspace: options.workspace, path: options.path }\n}\n\n/**\n * Validate `file put` command's top-level mutually-exclusive options (-u vs -w/-p).\n *\n * By-URL puts overwrite an existing file (the URL already identifies it), so\n * `--recursive` is meaningless in that mode and is rejected outright to keep the\n * user's intent unambiguous.\n */\nexport type WriteMode =\n | { kind: 'by-url'; url: string }\n | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveWriteMode(options: {\n url?: string\n workspace?: string\n path?: string\n recursive?: boolean\n}): WriteMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (options.url && options.recursive) {\n throw new SpaceOptionsError('Error: --recursive cannot be used with --url (the file must already exist)')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n return { kind: 'by-path', workspace: options.workspace!, path: options.path! }\n}\n","import { arch, platform } from 'os'\nimport { getApiBaseUrl, getApiKey } from './config.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport interface ApiResponse<T> {\n ok: boolean\n status: number\n data: T\n}\n\nexport interface RawApiResponse {\n ok: boolean\n status: number\n text: string\n contentType: string | null\n}\n\nfunction getUserAgent(): string {\n return `moxt-cli/${__CLI_VERSION__} (${platform()}/${arch()}) node/${process.versions.node}`\n}\n\nasync function fetchApi(method: string, path: string, body?: unknown): Promise<Response> {\n const apiKey = getApiKey()\n const url = `${getApiBaseUrl()}${path}`\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n 'User-Agent': getUserAgent(),\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n\n if (response.status === 401) {\n console.error('Authentication failed. Check your MOXT_API_KEY.')\n console.error('Get a new key at: https://moxt.ai')\n process.exit(1)\n }\n\n return response\n}\n\nasync function request<T>(method: string, path: string, body?: unknown): Promise<ApiResponse<T>> {\n const response = await fetchApi(method, path, body)\n const contentType = response.headers.get('content-type')\n const data = contentType?.includes('application/json') ? ((await response.json()) as T) : ((await response.text()) as T)\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n }\n}\n\nexport async function httpGet<T>(path: string): Promise<ApiResponse<T>> {\n return request<T>('GET', path)\n}\n\nexport async function httpPut<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PUT', path, body)\n}\n\nexport async function httpPost<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('POST', path, body)\n}\n\nexport async function httpPatch<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PATCH', path, body)\n}\n\nexport async function httpDelete<T>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return request<T>('DELETE', path, body)\n}\n\nexport async function httpRaw(method: 'GET' | 'POST' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<RawApiResponse> {\n const response = await fetchApi(method, path, body)\n return {\n ok: response.ok,\n status: response.status,\n text: await response.text(),\n contentType: response.headers.get('content-type'),\n }\n}\n","const DEFAULT_HOST = 'api.moxt.ai'\n\nexport function getApiBaseUrl(): string {\n const host = process.env.MOXT_HOST ?? DEFAULT_HOST\n return `https://${host}/openapi/v1`\n}\n\nexport function getApiKey(): string {\n const apiKey = process.env.MOXT_API_KEY\n\n if (!apiKey) {\n console.error('MOXT_API_KEY environment variable is not set.')\n console.error('')\n console.error('Get your API key at: https://moxt.ai')\n console.error('')\n console.error('Then set it:')\n console.error(' export MOXT_API_KEY=moxt_...')\n process.exit(1)\n }\n\n return apiKey\n}\n\nexport function getApiKeyOrUndefined(): string | undefined {\n return process.env.MOXT_API_KEY\n}\n","// ANSI colors\nexport const colors = {\n bold: '\\x1b[1m',\n blue: '\\x1b[1;34m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n cyan: '\\x1b[36m',\n dim: '\\x1b[2m',\n reset: '\\x1b[0m',\n}\n\nexport function print(message: string): void {\n console.log(message)\n}\n\nexport function printError(message: string): void {\n console.error(`${colors.red}${message}${colors.reset}`)\n}\n","const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nlet intervalId: ReturnType<typeof setInterval> | null = null\nlet frameIndex = 0\n\nexport function startSpinner(message: string): void {\n frameIndex = 0\n process.stdout.write(`${frames[frameIndex]} ${message}`)\n\n intervalId = setInterval(() => {\n frameIndex = (frameIndex + 1) % frames.length\n process.stdout.write(`\\r${frames[frameIndex]} ${message}`)\n }, 80)\n}\n\nexport function stopSpinner(success: boolean, message?: string): void {\n if (intervalId) {\n clearInterval(intervalId)\n intervalId = null\n }\n\n const symbol = success ? '\\x1b[32m✓\\x1b[0m' : '\\x1b[31m✗\\x1b[0m'\n // \\x1b[2K 清除整行,\\r 回到行首\n process.stdout.write(`\\x1b[2K\\r${symbol} ${message ?? ''}\\n`)\n}\n","export class SearchOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SearchOptionsError'\n }\n}\n\nexport function parseSearchLimit(raw: string | undefined, defaultValue: number, max: number): number {\n if (raw == null || raw === '') {\n return defaultValue\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --limit must be a positive integer, got \"${raw}\".`)\n }\n if (parsed > max) {\n throw new SearchOptionsError(`Error: --limit must be less than or equal to ${max}.`)\n }\n return parsed\n}\n\nexport function parseSearchMode(raw: string | undefined): 'all' | 'any' {\n if (raw == null || raw === '') {\n return 'any'\n }\n if (raw === 'all' || raw === 'any') {\n return raw\n }\n throw new SearchOptionsError(`Error: --mode must be \"any\" or \"all\", got \"${raw}\".`)\n}\n\nexport function parseTeammateId(raw: string | undefined): number | undefined {\n if (raw == null || raw === '') {\n return undefined\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --teammate-id must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n","import { SpaceOptionsError } from './file-selector.js'\nimport { printError } from './output.js'\nimport { SearchOptionsError } from './search-options.js'\n\n/**\n * Call a pure resolver that may throw a known CLI option error; on error,\n * print the message and exit(1). This keeps the user-facing contract\n * (stderr + exit code 1) consistent across subcommands while letting the\n * resolvers stay pure and unit-testable.\n */\nexport function runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n","import { Command } from 'commander'\nimport { httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseTeammateId } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface MemorySearchItem {\n rank: number\n pipelineId: string\n chunkId: string\n chunkIndex: number\n content: string\n contentTruncated: boolean\n}\n\ninterface MemorySearchResponse {\n items: MemorySearchItem[]\n}\n\nexport function registerMemoryCommand(program: Command): void {\n const memory = program.command('memory').description('Memory operations')\n\n memory.command('search')\n .description('Search archived agent memory')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('--teammate-id <teammateId>', 'Search a managed AI teammate memory')\n .option('-l, --limit <limit>', 'Maximum number of memory chunks to return', '5')\n .argument('<query>', 'Search query')\n .action(\n async (\n query: string,\n options: {\n workspace: string\n teammateId?: string\n limit?: string\n },\n ) => {\n const limit = runOrExit(() => parseSearchLimit(options.limit, 5, 10))\n const teammateId = runOrExit(() => parseTeammateId(options.teammateId))\n\n startSpinner('Searching memory...')\n const response = await httpPost<MemorySearchResponse>(\n `/workspaces/${options.workspace}/memory/search`,\n {\n query,\n limit,\n ...(teammateId !== undefined ? { agentId: teammateId } : {}),\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No memory found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} memory chunk(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. pipeline=${item.pipelineId} chunk=${item.chunkIndex}${colors.reset}`)\n print(`${colors.dim}chunkId=${item.chunkId}${item.contentTruncated ? ' truncated=true' : ''}${colors.reset}`)\n print(item.content)\n print('')\n }\n },\n )\n}\n","export class MiniappDbOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MiniappDbOptionsError'\n }\n}\n\nconst NON_FILTER_QUERY_PARAMS = new Set([\n 'select',\n 'order',\n 'limit',\n 'offset',\n 'range',\n 'range-unit',\n])\n\nconst ALLOWED_MINIAPP_DB_EMAIL_DOMAINS = ['@paraflow.com', '@moxt.ai', '@kanyun.com']\n\nexport function normalizePostgrestPath(path: string): string {\n const trimmed = path.trim()\n if (!trimmed) {\n throw new MiniappDbOptionsError('Error: PostgREST path is required.')\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\nexport function buildMiniappDbDataPath(workspaceId: string, appId: string, postgrestPath: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/data${normalizePostgrestPath(postgrestPath)}`\n}\n\nexport function buildMiniappDbSchemaPath(workspaceId: string, appId: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/schema`\n}\n\nexport function parseJsonBody(raw: string): unknown {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new MiniappDbOptionsError(`Error: --body must be valid JSON. ${detail}`)\n }\n\n if (parsed === null || (typeof parsed !== 'object' && !Array.isArray(parsed))) {\n throw new MiniappDbOptionsError('Error: --body must be a JSON object or array.')\n }\n return parsed\n}\n\nexport function hasPostgrestFilter(postgrestPath: string): boolean {\n const normalizedPath = normalizePostgrestPath(postgrestPath)\n const parsed = new URL(normalizedPath, 'https://postgrest.local')\n for (const [name] of parsed.searchParams.entries()) {\n if (!NON_FILTER_QUERY_PARAMS.has(name.toLowerCase())) {\n return true\n }\n }\n return false\n}\n\nexport function assertPostgrestFilter(postgrestPath: string, method: 'PATCH' | 'DELETE'): void {\n if (!hasPostgrestFilter(postgrestPath)) {\n throw new MiniappDbOptionsError(\n `Error: ${method.toLowerCase()} requires at least one PostgREST filter query parameter.`,\n )\n }\n}\n\nexport function formatRawResponse(text: string, pretty?: boolean): string {\n if (!pretty || !text) {\n return text\n }\n try {\n return JSON.stringify(JSON.parse(text), null, 2)\n } catch {\n return text\n }\n}\n\nexport function isAllowedMiniappDbUserEmail(email: string): boolean {\n const normalized = email.trim().toLowerCase()\n return ALLOWED_MINIAPP_DB_EMAIL_DOMAINS.some((domain) => normalized.endsWith(domain))\n}\n","import { Command } from 'commander'\nimport {\n assertPostgrestFilter,\n buildMiniappDbDataPath,\n buildMiniappDbSchemaPath,\n formatRawResponse,\n isAllowedMiniappDbUserEmail,\n MiniappDbOptionsError,\n parseJsonBody,\n} from '../utils/miniapp-db.js'\nimport { httpGet, httpRaw } from '../utils/http.js'\nimport { print, printError } from '../utils/output.js'\n\ninterface MiniappDbOptions {\n workspace: string\n appId: string\n pretty?: boolean\n body?: string\n yes?: boolean\n}\n\ninterface MiniappDbSchemaResponse {\n sql: string\n}\n\ninterface WhoamiResponse {\n email: string\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof MiniappDbOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addMiniappDbTargetOptions(command: Command): Command {\n return command\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .requiredOption('--app-id <appId>', 'Miniapp app ID')\n}\n\nfunction handleRawResponse(response: Awaited<ReturnType<typeof httpRaw>>, pretty?: boolean): void {\n if (!response.ok) {\n printError(`Error [${response.status}]: ${response.text}`)\n process.exit(1)\n }\n print(formatRawResponse(response.text, pretty))\n}\n\nasync function ensureAllowedMiniappDbUser(): Promise<void> {\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (!isAllowedMiniappDbUserEmail(response.data.email)) {\n printError('Error: miniapp db commands are only available to @paraflow.com, @moxt.ai, or @kanyun.com users.')\n process.exit(1)\n }\n}\n\nasync function requestDataApi(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n postgrestPath: string,\n options: MiniappDbOptions,\n body?: unknown,\n): Promise<void> {\n await ensureAllowedMiniappDbUser()\n const path = buildMiniappDbDataPath(options.workspace, options.appId, postgrestPath)\n const response = await httpRaw(method, path, body)\n handleRawResponse(response, options.pretty)\n}\n\nexport function registerMiniappCommand(program: Command): void {\n const miniapp = program.command('miniapp', { hidden: true }).description('Miniapp operations')\n const db = miniapp.command('db').description('Miniapp database operations')\n\n addMiniappDbTargetOptions(\n db.command('schema').description('Print the miniapp database schema SQL'),\n ).action(async (options: MiniappDbOptions) => {\n await ensureAllowedMiniappDbUser()\n const response = await httpGet<MiniappDbSchemaResponse>(buildMiniappDbSchemaPath(options.workspace, options.appId))\n\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n print(response.data.sql)\n })\n\n addMiniappDbTargetOptions(\n db.command('get')\n .description('Read miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos?select=*')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n await requestDataApi('GET', postgrestPath, options)\n })\n\n addMiniappDbTargetOptions(\n db.command('post')\n .description('Create miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('POST', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('patch')\n .description('Update miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'PATCH'))\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('PATCH', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('delete')\n .description('Delete miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .option('--yes', 'Confirm the delete operation')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n if (options.yes !== true) {\n printError('Error: delete requires --yes.')\n process.exit(1)\n }\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'DELETE'))\n await requestDataApi('DELETE', postgrestPath, options)\n })\n}\n","import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nexport interface TelemetryConfig {\n disabled?: boolean\n noticeShown?: boolean\n}\n\nfunction getConfigPath(): string {\n return path.join(os.homedir(), '.moxt', 'config.json')\n}\n\nexport function readTelemetryConfig(): TelemetryConfig {\n try {\n const raw = fs.readFileSync(getConfigPath(), 'utf8')\n const parsed = JSON.parse(raw) as { telemetry?: TelemetryConfig }\n return parsed.telemetry ?? {}\n } catch {\n return {}\n }\n}\n\nexport function writeTelemetryConfig(update: Partial<TelemetryConfig>): void {\n const configPath = getConfigPath()\n let existing: Record<string, unknown> = {}\n try {\n existing = JSON.parse(fs.readFileSync(configPath, 'utf8')) as Record<string, unknown>\n } catch {\n existing = {}\n }\n const currentTelemetry = (existing.telemetry as TelemetryConfig | undefined) ?? {}\n const next = { ...existing, telemetry: { ...currentTelemetry, ...update } }\n fs.mkdirSync(path.dirname(configPath), { recursive: true })\n fs.writeFileSync(configPath, JSON.stringify(next, null, 2))\n}\n","import { readTelemetryConfig } from './config.js'\n\nexport function isCiEnvironment(): boolean {\n return process.env.CI === 'true' || process.env.CI === '1'\n}\n\nexport function isTelemetryDisabled(): boolean {\n if (process.env.MOXT_TELEMETRY_DISABLED === '1' || process.env.MOXT_TELEMETRY_DISABLED === 'true') {\n return true\n }\n if (process.env.DO_NOT_TRACK === '1' || process.env.DO_NOT_TRACK === 'true') {\n return true\n }\n return readTelemetryConfig().disabled === true\n}\n","import { Command } from 'commander'\nimport { readTelemetryConfig, writeTelemetryConfig } from '../telemetry/config.js'\nimport { isTelemetryDisabled } from '../telemetry/opt-out.js'\nimport { print } from '../utils/output.js'\n\nexport function registerTelemetryCommand(program: Command): void {\n const telemetry = program.command('telemetry').description('Manage Moxt CLI telemetry')\n\n telemetry\n .command('status')\n .description('Show telemetry status')\n .action(() => {\n const cfg = readTelemetryConfig()\n const envOverride =\n process.env.MOXT_TELEMETRY_DISABLED === '1' ||\n process.env.MOXT_TELEMETRY_DISABLED === 'true' ||\n process.env.DO_NOT_TRACK === '1' ||\n process.env.DO_NOT_TRACK === 'true'\n\n const state = isTelemetryDisabled() ? 'disabled' : 'enabled'\n print(`telemetry: ${state}`)\n if (envOverride) {\n print('(disabled via environment variable)')\n } else if (cfg.disabled) {\n print('(disabled via config file)')\n }\n })\n\n telemetry\n .command('enable')\n .description('Enable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: false })\n print('telemetry: enabled')\n })\n\n telemetry\n .command('disable')\n .description('Disable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: true })\n print('telemetry: disabled')\n })\n}\n","import { Command } from 'commander'\nimport { httpGet } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WhoamiResponse {\n nickname: string\n email: string\n}\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n startSpinner('Fetching user info...')\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n\n if (response.ok) {\n stopSpinner(true, 'Done')\n print(`${colors.bold}Nickname${colors.reset}: ${response.data.nickname}`)\n print(`${colors.bold}Email${colors.reset}: ${response.data.email}`)\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander'\nimport { httpGet, httpDelete } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WorkspaceItem {\n workspaceId: string\n name: string\n}\n\ninterface WorkspaceListResponse {\n workspaces: WorkspaceItem[]\n}\n\ninterface MemberItem {\n userId: number\n email: string\n displayName: string | null\n role: string\n}\n\ninterface MembersResponse {\n members: MemberItem[]\n}\n\ninterface SpaceItem {\n type: 'personal' | 'team' | 'teammate'\n name: string\n teamSpaceId: string | null\n agentId: number | null\n}\n\n// Email regex (same as web/src/utils/email.ts)\nconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\n\nfunction isValidEmail(email: string): boolean {\n return emailRegex.test(email)\n}\n\nexport function registerWorkspaceCommand(program: Command): void {\n const workspace = program.command('workspace').description('Workspace management')\n\n workspace\n .command('list')\n .description('List all workspaces you belong to')\n .action(async () => {\n startSpinner('Fetching workspaces...')\n const response = await httpGet<WorkspaceListResponse>('/workspaces')\n\n if (response.ok) {\n const { workspaces } = response.data\n if (workspaces.length === 0) {\n stopSpinner(true, 'No workspaces found.')\n return\n }\n\n stopSpinner(true, `Found ${workspaces.length} workspace(s)`)\n\n for (const ws of workspaces) {\n print(`${colors.bold}${ws.workspaceId}${colors.reset}\\t${ws.name}`)\n }\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n\n const members = program.command('members').description('Manage workspace members')\n\n members\n .command('list')\n .description('List all members in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching workspace members...')\n const response = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { members } = response.data\n if (members.length === 0) {\n stopSpinner(true, 'No members found.')\n return\n }\n\n stopSpinner(true, `Found ${members.length} member(s)`)\n\n for (const member of members) {\n const name = member.displayName || '-'\n print(`${colors.bold}${member.email}${colors.reset}\\t${name}\\t${member.role}`)\n }\n })\n\n members\n .command('remove')\n .description('Remove members from a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .argument('<emails>', 'Emails to remove (comma-separated)')\n .action(async (emailsArg: string, options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n const emails = emailsArg.split(',').map((e) => e.trim()).filter(Boolean)\n if (emails.length === 0) {\n printError('No valid emails provided')\n process.exit(1)\n }\n\n // Validate email format\n const invalidEmails = emails.filter((e) => !isValidEmail(e))\n if (invalidEmails.length > 0) {\n for (const email of invalidEmails) {\n printError(`Invalid email format: ${email}`)\n }\n process.exit(1)\n }\n\n // Fetch members to get userId by email\n startSpinner('Fetching workspace members...')\n const membersResponse = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!membersResponse.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${membersResponse.status}]: ${JSON.stringify(membersResponse.data)}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Members fetched')\n\n const { members } = membersResponse.data\n const emailToMember = new Map(members.map((m) => [m.email.toLowerCase(), m]))\n\n // Remove each member\n for (const email of emails) {\n const member = emailToMember.get(email.toLowerCase())\n if (!member) {\n print(`${colors.red}✗${colors.reset} ${email} - not found in workspace`)\n continue\n }\n\n const deleteResponse = await httpDelete(`/workspaces/${workspaceId}/members/${member.userId}`)\n\n if (deleteResponse.ok) {\n print(`${colors.green}✓${colors.reset} ${email} - removed`)\n } else {\n print(`${colors.red}✗${colors.reset} ${email} - failed: ${JSON.stringify(deleteResponse.data)}`)\n }\n }\n })\n\n const space = program.command('space').description('Manage spaces')\n\n space\n .command('list')\n .description('List accessible spaces in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching spaces...')\n const response = await httpGet<{ spaces: SpaceItem[] }>(`/workspaces/${workspaceId}/spaces`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch spaces')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { spaces } = response.data\n if (spaces.length === 0) {\n stopSpinner(true, 'No spaces found.')\n return\n }\n\n stopSpinner(true, `Found ${spaces.length} space(s)`)\n\n print(\n `${colors.bold}TYPE${colors.reset}\\t${colors.bold}TEAM_SPACE_ID${colors.reset}\\t${colors.bold}TEAMMATE_ID${colors.reset}\\t${colors.bold}NAME${colors.reset}`,\n )\n for (const s of spaces) {\n const teamSpaceId = s.teamSpaceId ?? ''\n const teammateId = s.agentId != null ? String(s.agentId) : ''\n print(`${s.type}\\t${teamSpaceId}\\t${teammateId}\\t${s.name}`)\n }\n })\n\n}\n","import * as fs from 'node:fs'\nimport { TextDecoder } from 'node:util'\nimport { Command } from 'commander'\nimport {\n isBinaryContent,\n resolveSpaceSelector,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPatch, httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { parseSearchLimit, SearchOptionsError } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\nconst MAX_DESC_LENGTH = 5000\nconst MAX_COMMENT_CONTENT_LENGTH = 5000\nconst MAX_COMMENT_CONTENT_BYTES = MAX_COMMENT_CONTENT_LENGTH * 4\n\ntype WorkflowStatusTypeValue = 1 | 2 | 3\ntype WorkflowTaskPriorityValue = 0 | 1 | 2 | 3\n\ninterface WorkflowItem {\n fileId: string\n ownerHumanId: number | null\n desc: string | null\n}\n\ninterface WorkflowListResponse {\n workflows: WorkflowItem[]\n}\n\ninterface WorkflowDetailResponse extends WorkflowItem {\n statusList: WorkflowStatusItem[]\n transitions: WorkflowTransitionItem[]\n}\n\ninterface WorkflowStatusItem {\n scopedId: number\n name: string\n desc: string | null\n type: WorkflowStatusTypeValue\n preferredAssignee: AssigneeInfo | null\n order: number\n}\n\ninterface WorkflowTransitionItem {\n statusFromScopedId: number\n statusToScopedId: number\n}\n\ninterface WorkflowTaskItem {\n scopedId: number\n workflowFileId: string\n ownerHumanId: number | null\n title: string\n desc: string | null\n statusScopedId: number\n priority: WorkflowTaskPriorityValue\n assignee: AssigneeInfo | null\n linkedFileIds: string[]\n subscribed: boolean\n agentRuns: Array<{\n pipelineTriggerId: number\n executor: AssigneeInfo | null\n }>\n createdAt: string\n latestActAt: string\n}\n\ninterface WorkflowTaskListResponse {\n tasks: WorkflowTaskItem[]\n nextCursor: string | null\n}\n\ninterface WorkflowPipelineStatusItem {\n workflowPipelineTriggerId: number\n pipelineStatus: string\n}\n\ninterface WorkflowPipelineOutputResponse {\n workflowPipelineTriggerId: number\n pipelineEvents: string[]\n}\n\ninterface WorkflowCommentItem {\n id: number\n workflowFileId: string\n workflowTaskScopedId: number\n content: string\n createdBy: AssigneeInfo | null\n createdAt: string\n updatedAt: string\n}\n\ninterface WorkflowCommentListResponse {\n items: WorkflowCommentItem[]\n}\n\ntype AssigneeInfo =\n | { type: 'human'; humanId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'assistant'; aiAssistantId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'teammate'; aiTeammateId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'unknown'; humanId: number | null; aiAssistantId: number | null; aiTeammateId: number | null }\n\ninterface WorkflowSpaceOptions extends SpaceOptions {\n path: string\n descFile?: string\n ownerHumanId?: string\n}\n\ninterface AssigneeOptions {\n humanId?: string\n assistantId?: string\n teammateId?: string\n clear?: boolean\n}\n\ninterface PreferredAssigneeOptions {\n preferredHumanId?: string\n preferredAssistantId?: string\n preferredTeammateId?: string\n clearPreferredAssignee?: boolean\n}\n\nclass WorkflowOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkflowOptionsError'\n }\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof WorkflowOptionsError || err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addWorkspaceOption(command: Command): Command {\n return command.requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n}\n\nfunction addSpaceOptions(command: Command): Command {\n return addWorkspaceOption(command)\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nfunction addAssigneeOptions(command: Command): Command {\n return command\n .option('--human-id <humanId>', 'Human assignee ID')\n .option('--assistant-id <assistantId>', 'AI assistant assignee ID')\n .option('--teammate-id <teammateId>', 'AI teammate assignee ID')\n}\n\nfunction addPreferredAssigneeOptions(command: Command): Command {\n return command\n .option('--preferred-human-id <humanId>', 'Preferred human assignee ID')\n .option('--preferred-assistant-id <assistantId>', 'Preferred AI assistant assignee ID')\n .option('--preferred-teammate-id <teammateId>', 'Preferred AI teammate assignee ID')\n}\n\nfunction parsePositiveInteger(raw: string, label: string): number {\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new WorkflowOptionsError(`Error: ${label} must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n\nfunction parseOptionalPositiveInteger(raw: string | undefined, label: string): number | undefined {\n if (raw == null || raw === '') return undefined\n return parsePositiveInteger(raw, label)\n}\n\nfunction parseStatusType(raw: string | undefined): WorkflowStatusTypeValue | undefined {\n if (raw == null || raw === '') return undefined\n const parsed = Number.parseInt(raw, 10)\n if ((parsed === 1 || parsed === 2 || parsed === 3) && String(parsed) === raw) return parsed\n throw new WorkflowOptionsError('Error: --type must be one of 1 (todo), 2 (in-progress), or 3 (done).')\n}\n\nfunction parseRequiredStatusType(raw: string | undefined): WorkflowStatusTypeValue {\n const value = parseStatusType(raw)\n if (value === undefined) {\n throw new WorkflowOptionsError('Error: --type is required.')\n }\n return value\n}\n\nfunction parsePriority(raw: string | undefined): WorkflowTaskPriorityValue | undefined {\n if (raw == null || raw === '') return undefined\n if (raw === 'urgent') return 0\n if (raw === 'high') return 1\n if (raw === 'medium') return 2\n if (raw === 'low') return 3\n throw new WorkflowOptionsError('Error: --priority must be \"urgent\", \"high\", \"medium\", or \"low\".')\n}\n\nfunction parseRequiredPriority(raw: string | undefined): WorkflowTaskPriorityValue {\n return parsePriority(raw ?? 'medium') ?? 2\n}\n\nfunction parseWorkflowScope(raw: string | undefined): 'all' | 'owner_is_me' {\n if (raw == null || raw === '') return 'all'\n if (raw === 'all' || raw === 'owner_is_me') return raw\n throw new WorkflowOptionsError('Error: --scope must be \"all\" or \"owner_is_me\".')\n}\n\nfunction parseTaskScope(raw: string | undefined): 'all' | 'assigned_to_me' | 'subscribed_by_me' | 'owner_is_me' {\n if (raw == null || raw === '') return 'all'\n if (raw === 'all' || raw === 'assigned_to_me' || raw === 'subscribed_by_me' || raw === 'owner_is_me') {\n return raw\n }\n throw new WorkflowOptionsError(\n 'Error: --scope must be \"all\", \"assigned_to_me\", \"subscribed_by_me\", or \"owner_is_me\".',\n )\n}\n\nfunction parseFileIds(raw: string | undefined, label = '--file-ids'): string[] | undefined {\n if (raw == null || raw === '') return undefined\n const ids = raw.split(',').map((item) => item.trim()).filter(Boolean)\n if (ids.length === 0) {\n throw new WorkflowOptionsError(`Error: ${label} must include at least one file ID.`)\n }\n return ids\n}\n\nfunction readDescFile(path: string | undefined): string | undefined {\n if (path == null || path === '') return undefined\n if (!fs.existsSync(path)) {\n throw new WorkflowOptionsError(`Error: desc file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new WorkflowOptionsError(`Error: desc file is not a file: ${path}`)\n }\n const buffer = fs.readFileSync(path)\n if (isBinaryContent(buffer)) {\n throw new WorkflowOptionsError('Error: desc file must be UTF-8 text, not binary content.')\n }\n const content = buffer.toString('utf8')\n if (content.length > MAX_DESC_LENGTH) {\n throw new WorkflowOptionsError(`Error: desc file must be at most ${MAX_DESC_LENGTH} characters.`)\n }\n return content\n}\n\nfunction readCommentContentFile(path: string): string {\n if (!fs.existsSync(path)) {\n throw new WorkflowOptionsError(`Error: comment content file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new WorkflowOptionsError(`Error: comment content path is not a file: ${path}`)\n }\n if (stat.size > MAX_COMMENT_CONTENT_BYTES) {\n throw new WorkflowOptionsError(\n `Error: comment content file must be at most ${MAX_COMMENT_CONTENT_LENGTH} characters.`,\n )\n }\n const buffer = fs.readFileSync(path)\n if (buffer.includes(0)) {\n throw new WorkflowOptionsError('Error: comment content file must not contain NUL bytes.')\n }\n if (isBinaryContent(buffer)) {\n throw new WorkflowOptionsError('Error: comment content file must be UTF-8 text, not binary content.')\n }\n let content: string\n try {\n content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer)\n } catch {\n throw new WorkflowOptionsError('Error: comment content file must contain valid UTF-8 text.')\n }\n if (content.length === 0) {\n throw new WorkflowOptionsError('Error: comment content file must not be empty.')\n }\n if (content.length > MAX_COMMENT_CONTENT_LENGTH) {\n throw new WorkflowOptionsError(\n `Error: comment content file must be at most ${MAX_COMMENT_CONTENT_LENGTH} characters.`,\n )\n }\n return content\n}\n\nfunction parseAssigneeBody(options: AssigneeOptions, allowClear: boolean): Record<string, number | null> {\n const hasClear = options.clear === true\n const humanId = parseOptionalPositiveInteger(options.humanId, '--human-id')\n const assistantId = parseOptionalPositiveInteger(options.assistantId, '--assistant-id')\n const teammateId = parseOptionalPositiveInteger(options.teammateId, '--teammate-id')\n const count =\n (humanId !== undefined ? 1 : 0) + (assistantId !== undefined ? 1 : 0) + (teammateId !== undefined ? 1 : 0)\n if (hasClear && !allowClear) {\n throw new WorkflowOptionsError('Error: --clear is not supported here.')\n }\n if (hasClear && count > 0) {\n throw new WorkflowOptionsError('Error: --clear cannot be used with assignee ID options.')\n }\n if (count > 1) {\n throw new WorkflowOptionsError('Error: assignee ID options are mutually exclusive.')\n }\n if (hasClear) return {}\n if (humanId !== undefined) return { assigneeHumanId: humanId }\n if (assistantId !== undefined) return { assigneeAiAssistantId: assistantId }\n if (teammateId !== undefined) return { assigneeAiTeammateId: teammateId }\n return {}\n}\n\nfunction parsePreferredAssigneeBody(options: PreferredAssigneeOptions): Record<string, number | null> {\n const hasClear = options.clearPreferredAssignee === true\n const humanId = parseOptionalPositiveInteger(options.preferredHumanId, '--preferred-human-id')\n const assistantId = parseOptionalPositiveInteger(options.preferredAssistantId, '--preferred-assistant-id')\n const teammateId = parseOptionalPositiveInteger(options.preferredTeammateId, '--preferred-teammate-id')\n const count =\n (humanId !== undefined ? 1 : 0) + (assistantId !== undefined ? 1 : 0) + (teammateId !== undefined ? 1 : 0)\n if (hasClear && count > 0) {\n throw new WorkflowOptionsError('Error: --clear-preferred-assignee cannot be used with preferred assignee ID options.')\n }\n if (count > 1) {\n throw new WorkflowOptionsError('Error: preferred assignee ID options are mutually exclusive.')\n }\n if (hasClear) return { preferredAssigneeHumanId: null }\n if (humanId !== undefined) return { preferredAssigneeHumanId: humanId }\n if (assistantId !== undefined) return { preferredAssigneeAiAssistantId: assistantId }\n if (teammateId !== undefined) return { preferredAssigneeAiTeammateId: teammateId }\n return {}\n}\n\nfunction assertNonEmptyBody(body: Record<string, unknown>): void {\n if (Object.keys(body).length === 0) {\n throw new WorkflowOptionsError('Error: at least one update option must be provided.')\n }\n}\n\nfunction buildQuery(params: Record<string, string | number | undefined>): string {\n const query = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n query.set(key, String(value))\n }\n }\n const text = query.toString()\n return text ? `?${text}` : ''\n}\n\nfunction failResponse(response: { status: number; data: unknown }): never {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n}\n\nfunction priorityLabel(value: WorkflowTaskPriorityValue): string {\n switch (value) {\n case 0: return 'urgent'\n case 1: return 'high'\n case 2: return 'medium'\n case 3: return 'low'\n default: {\n const unsupportedValue: never = value\n throw new Error(`Unsupported workflow task priority: ${String(unsupportedValue)}`)\n }\n }\n}\n\nfunction statusTypeLabel(value: WorkflowStatusTypeValue): string {\n switch (value) {\n case 1: return 'todo'\n case 2: return 'in-progress'\n case 3: return 'done'\n default: {\n const unsupportedValue: never = value\n throw new Error(`Unsupported workflow status type: ${String(unsupportedValue)}`)\n }\n }\n}\n\nfunction formatAssignee(assignee: AssigneeInfo | null): string {\n if (!assignee) return '-'\n if (assignee.type === 'human') return assignee.displayName ?? `human:${assignee.humanId}`\n if (assignee.type === 'assistant') return assignee.displayName ?? `assistant:${assignee.aiAssistantId}`\n if (assignee.type === 'teammate') return assignee.displayName ?? `teammate:${assignee.aiTeammateId}`\n return 'unknown'\n}\n\nfunction printWorkflow(item: WorkflowItem): void {\n print(`${colors.bold}${item.fileId}${colors.reset}\\towner=${item.ownerHumanId ?? '-'}\\tdesc=${item.desc ?? '-'}`)\n}\n\ntype DetailScalar = string | number | boolean | null\n\nfunction indentation(size: number): string {\n return ' '.repeat(size)\n}\n\nfunction escapeTerminalControlCharacters(value: string): string {\n return value\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n )\n}\n\nfunction formatDetailScalar(value: DetailScalar): string {\n if (value === null) return 'null'\n if (typeof value === 'string') {\n const escaped = escapeTerminalControlCharacters(value)\n if (escaped === '') return '\"\"'\n if (/\\n/.test(escaped)) return JSON.stringify(escaped)\n return escaped\n }\n return String(value)\n}\n\nfunction printDetailField(name: string, value: DetailScalar, indent = 0): void {\n print(`${indentation(indent)}${name}: ${formatDetailScalar(value)}`)\n}\n\nfunction printDetailTextField(name: string, value: string | null, indent = 0): void {\n if (value === null || value === '') {\n printDetailField(name, value, indent)\n return\n }\n\n const escaped = escapeTerminalControlCharacters(value)\n print(`${indentation(indent)}${name}:`)\n for (const line of escaped.split('\\n')) {\n print(`${indentation(indent + 2)}${line}`)\n }\n}\n\nfunction printAssigneeDetail(name: string, assignee: AssigneeInfo | null, indent = 0): void {\n if (assignee === null) {\n printDetailField(name, null, indent)\n return\n }\n\n print(`${indentation(indent)}${name}:`)\n printDetailField('type', assignee.type, indent + 2)\n switch (assignee.type) {\n case 'human':\n printDetailField('humanId', assignee.humanId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'assistant':\n printDetailField('aiAssistantId', assignee.aiAssistantId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'teammate':\n printDetailField('aiTeammateId', assignee.aiTeammateId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'unknown':\n printDetailField('humanId', assignee.humanId, indent + 2)\n printDetailField('aiAssistantId', assignee.aiAssistantId, indent + 2)\n printDetailField('aiTeammateId', assignee.aiTeammateId, indent + 2)\n }\n}\n\nfunction printStatusRemainingFields(item: WorkflowStatusItem, indent: number): void {\n printDetailField('name', item.name, indent)\n printDetailTextField('desc', item.desc, indent)\n printDetailField('type', `${item.type} (${statusTypeLabel(item.type)})`, indent)\n printAssigneeDetail('preferredAssignee', item.preferredAssignee, indent)\n printDetailField('order', item.order, indent)\n}\n\nfunction printStatusDetail(item: WorkflowStatusItem): void {\n print(`${colors.bold}Status${colors.reset}`)\n printDetailField('scopedId', item.scopedId)\n printStatusRemainingFields(item, 0)\n}\n\nfunction printWorkflowDetail(item: WorkflowDetailResponse): void {\n print(`${colors.bold}Workflow${colors.reset}`)\n printDetailField('fileId', item.fileId)\n printDetailField('ownerHumanId', item.ownerHumanId)\n printDetailTextField('desc', item.desc)\n\n if (item.statusList.length === 0) {\n print('statusList: []')\n } else {\n print('statusList:')\n for (const status of item.statusList) {\n print(` - scopedId: ${status.scopedId}`)\n printStatusRemainingFields(status, 4)\n }\n }\n\n if (item.transitions.length === 0) {\n print('transitions: []')\n } else {\n print('transitions:')\n for (const transition of item.transitions) {\n print(` - statusFromScopedId: ${transition.statusFromScopedId}`)\n printDetailField('statusToScopedId', transition.statusToScopedId, 4)\n }\n }\n}\n\nfunction printTaskSummary(item: WorkflowTaskItem): void {\n const runIds = item.agentRuns.map((run) => run.pipelineTriggerId).join(',') || '-'\n print(\n `${colors.bold}#${item.scopedId}${colors.reset}\\t${item.title}\\tstatus=${item.statusScopedId}\\tpriority=${priorityLabel(item.priority)}\\tassignee=${formatAssignee(item.assignee)}\\truns=${runIds}`,\n )\n}\n\nfunction printTaskDetail(item: WorkflowTaskItem): void {\n print(`${colors.bold}Task${colors.reset}`)\n printDetailField('scopedId', item.scopedId)\n printDetailField('workflowFileId', item.workflowFileId)\n printDetailField('ownerHumanId', item.ownerHumanId)\n printDetailField('title', item.title)\n printDetailTextField('desc', item.desc)\n printDetailField('statusScopedId', item.statusScopedId)\n printDetailField('priority', `${item.priority} (${priorityLabel(item.priority)})`)\n printAssigneeDetail('assignee', item.assignee)\n\n if (item.linkedFileIds.length === 0) {\n print('linkedFileIds: []')\n } else {\n print('linkedFileIds:')\n for (const fileId of item.linkedFileIds) print(` - ${fileId}`)\n }\n\n printDetailField('subscribed', item.subscribed)\n if (item.agentRuns.length === 0) {\n print('agentRuns: []')\n } else {\n print('agentRuns:')\n for (const run of item.agentRuns) {\n print(` - pipelineTriggerId: ${run.pipelineTriggerId}`)\n printAssigneeDetail('executor', run.executor, 4)\n }\n }\n printDetailField('createdAt', item.createdAt)\n printDetailField('latestActAt', item.latestActAt)\n}\n\nfunction printCommentDetail(item: WorkflowCommentItem): void {\n print(`${colors.bold}Comment${colors.reset}`)\n printDetailField('id', item.id)\n printDetailField('workflowFileId', item.workflowFileId)\n printDetailField('workflowTaskScopedId', item.workflowTaskScopedId)\n printDetailTextField('content', item.content)\n printAssigneeDetail('createdBy', item.createdBy)\n printDetailField('createdAt', item.createdAt)\n printDetailField('updatedAt', item.updatedAt)\n}\n\nexport function registerWorkflowCommand(program: Command): void {\n const workflow = program.command('workflow').description('Workflow operations')\n\n addWorkspaceOption(\n workflow.command('list')\n .description('List accessible workflows')\n .option('--scope <scope>', 'Workflow scope: all or owner_is_me', 'all'),\n ).action(async (options: { workspace: string; scope?: string }) => {\n const scope = runOrExit(() => parseWorkflowScope(options.scope))\n\n startSpinner('Fetching workflows...')\n const response = await httpGet<WorkflowListResponse>(\n `/workspaces/${options.workspace}/workflows${buildQuery({ scope })}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.workflows.length === 0) {\n stopSpinner(true, 'No workflows found.')\n return\n }\n stopSpinner(true, `Found ${response.data.workflows.length} workflow(s)`)\n for (const item of response.data.workflows) printWorkflow(item)\n })\n\n addSpaceOptions(\n workflow.command('create')\n .description('Create a blank workflow')\n .requiredOption('-p, --path <path>', 'Target .workflow path')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for workflow description')\n .option('--owner-human-id <humanId>', 'Workflow owner human ID'),\n ).action(async (options: WorkflowSpaceOptions) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n path: options.path,\n ...resolveSpaceSelector(options),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n return next\n })\n\n startSpinner('Creating workflow...')\n const response = await httpPost<WorkflowItem>(`/workspaces/${options.workspace}/workflows`, body)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow created')\n printWorkflow(response.data)\n })\n\n addWorkspaceOption(workflow.command('get').description('Get a workflow').argument('<workflowFileId>')).action(\n async (workflowFileId: string, options: { workspace: string }) => {\n startSpinner('Fetching workflow...')\n const response = await httpGet<WorkflowDetailResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow fetched')\n printWorkflowDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n workflow.command('update')\n .description('Update workflow metadata')\n .argument('<workflowFileId>')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for workflow description')\n .option('--owner-human-id <humanId>', 'Workflow owner human ID'),\n ).action(async (workflowFileId: string, options: { workspace: string; descFile?: string; ownerHumanId?: string }) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {}\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n assertNonEmptyBody(next)\n return next\n })\n\n startSpinner('Updating workflow...')\n const response = await httpPatch<WorkflowItem>(`/workspaces/${options.workspace}/workflows/${workflowFileId}`, body)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow updated')\n printWorkflow(response.data)\n })\n\n addWorkspaceOption(\n workflow.command('delete')\n .description('Delete a workflow')\n .argument('<workflowFileId>')\n .option('--message <message>', 'Commit message'),\n ).action(async (workflowFileId: string, options: { workspace: string; message?: string }) => {\n startSpinner('Deleting workflow...')\n const response = await httpDelete<{ fileId: string }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}`,\n options.message ? { message: options.message } : {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.fileId}`)\n })\n\n addWorkspaceOption(workflow.command('duplicate').description('Duplicate a workflow').argument('<workflowFileId>')).action(\n async (workflowFileId: string, options: { workspace: string }) => {\n startSpinner('Duplicating workflow...')\n const response = await httpPost<WorkflowItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/duplicate`,\n {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow duplicated')\n printWorkflow(response.data)\n },\n )\n\n registerStatusCommands(workflow)\n registerTransitionCommands(workflow)\n registerTaskCommands(workflow)\n registerCommentCommands(workflow)\n registerRunCommands(workflow)\n}\n\nfunction registerStatusCommands(workflow: Command): void {\n const status = workflow.command('status').description('Workflow status operations')\n\n addPreferredAssigneeOptions(\n addWorkspaceOption(\n status.command('create')\n .description('Create a workflow status')\n .argument('<workflowFileId>')\n .requiredOption('--name <name>', 'Status name')\n .requiredOption('--type <type>', 'Status type value: 1=todo, 2=in-progress, 3=done')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for status description'),\n ),\n ).action(\n async (\n workflowFileId: string,\n options: { workspace: string; name: string; type?: string; descFile?: string } & PreferredAssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n name: options.name,\n type: parseRequiredStatusType(options.type),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n Object.assign(next, parsePreferredAssigneeBody(options))\n return next\n })\n startSpinner('Creating status...')\n const response = await httpPost<WorkflowStatusItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status created')\n printStatusDetail(response.data)\n },\n )\n\n addPreferredAssigneeOptions(\n addWorkspaceOption(\n status.command('update')\n .description('Update a workflow status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>')\n .option('--name <name>', 'Status name')\n .option('--type <type>', 'Status type value: 1=todo, 2=in-progress, 3=done')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for status description')\n .option('--clear-desc', 'Clear status description')\n .option('--clear-preferred-assignee', 'Clear preferred assignee'),\n ),\n ).action(\n async (\n workflowFileId: string,\n statusScopedId: string,\n options: {\n workspace: string\n name?: string\n type?: string\n descFile?: string\n clearDesc?: boolean\n } & PreferredAssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n if (options.descFile && options.clearDesc) {\n throw new WorkflowOptionsError('Error: --desc-file cannot be used with --clear-desc.')\n }\n const next: Record<string, unknown> = {}\n if (options.name) next.name = options.name\n const type = parseStatusType(options.type)\n if (type !== undefined) next.type = type\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n if (options.clearDesc) next.desc = null\n Object.assign(next, parsePreferredAssigneeBody(options))\n assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(statusScopedId, 'statusScopedId'))\n startSpinner('Updating status...')\n const response = await httpPatch<WorkflowStatusItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status updated')\n printStatusDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n status.command('move-after')\n .description('Move a workflow status after another status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>')\n .option('--after <statusScopedId>', 'Anchor status scoped ID')\n .option('--first', 'Move to first position'),\n ).action(\n async (\n workflowFileId: string,\n statusScopedId: string,\n options: { workspace: string; after?: string; first?: boolean },\n ) => {\n const { id, anchoredStatusScopedId } = runOrExit(() => {\n if (options.after && options.first) {\n throw new WorkflowOptionsError('Error: --after cannot be used with --first.')\n }\n if (!options.after && !options.first) {\n throw new WorkflowOptionsError('Error: either --after or --first is required.')\n }\n return {\n id: parsePositiveInteger(statusScopedId, 'statusScopedId'),\n anchoredStatusScopedId: options.first ? null : parsePositiveInteger(options.after!, '--after'),\n }\n })\n startSpinner('Moving status...')\n const response = await httpPost<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}/move-after`,\n { anchoredStatusScopedId },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status moved')\n },\n )\n\n addWorkspaceOption(\n status.command('delete')\n .description('Delete a workflow status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>'),\n ).action(async (workflowFileId: string, statusScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(statusScopedId, 'statusScopedId'))\n startSpinner('Deleting status...')\n const response = await httpDelete<{ scopedId: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.scopedId}`)\n })\n}\n\nfunction registerTransitionCommands(workflow: Command): void {\n const transition = workflow.command('transition').description('Workflow transition operations')\n\n for (const action of ['create', 'delete'] as const) {\n addWorkspaceOption(\n transition.command(action)\n .description(`${action === 'create' ? 'Create' : 'Delete'} a workflow transition`)\n .argument('<workflowFileId>')\n .requiredOption('--from <statusScopedId>', 'Source status scoped ID')\n .requiredOption('--to <statusScopedId>', 'Target status scoped ID'),\n ).action(async (workflowFileId: string, options: { workspace: string; from: string; to: string }) => {\n const body = runOrExit(() => ({\n statusFromScopedId: parsePositiveInteger(options.from, '--from'),\n statusToScopedId: parsePositiveInteger(options.to, '--to'),\n }))\n startSpinner(`${action === 'create' ? 'Creating' : 'Deleting'} transition...`)\n const response =\n action === 'create'\n ? await httpPost<WorkflowTransitionItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/transitions`,\n body,\n )\n : await httpDelete<WorkflowTransitionItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/transitions`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, action === 'create' ? 'Transition created' : 'Transition deleted')\n print(`${response.data.statusFromScopedId} -> ${response.data.statusToScopedId}`)\n })\n }\n}\n\nfunction registerTaskCommands(workflow: Command): void {\n const task = workflow.command('task').description('Workflow task operations')\n\n addWorkspaceOption(\n task.command('list')\n .description('List workflow tasks')\n .option('--workflow-file-id <workflowFileId>', 'Filter by workflow file ID')\n .option('--scope <scope>', 'Task scope', 'all')\n .option('-l, --limit <limit>', 'Maximum number of tasks to return', '20')\n .option('--cursor <cursor>', 'Pagination cursor'),\n ).action(\n async (options: { workspace: string; workflowFileId?: string; scope?: string; limit?: string; cursor?: string }) => {\n const query = runOrExit(() => buildQuery({\n scope: parseTaskScope(options.scope),\n limit: parseSearchLimit(options.limit, 20, 100),\n cursor: options.cursor,\n workflowFileId: options.workflowFileId,\n }))\n startSpinner('Fetching workflow tasks...')\n const response = await httpGet<WorkflowTaskListResponse>(`/workspaces/${options.workspace}/workflow-tasks${query}`)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.tasks.length === 0) {\n stopSpinner(true, 'No workflow tasks found.')\n return\n }\n stopSpinner(true, `Found ${response.data.tasks.length} task(s)`)\n for (const item of response.data.tasks) printTaskSummary(item)\n if (response.data.nextCursor) print(`${colors.dim}nextCursor=${response.data.nextCursor}${colors.reset}`)\n },\n )\n\n addWorkspaceOption(\n task.command('get')\n .description('Get a workflow task')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Fetching task...')\n const response = await httpGet<WorkflowTaskItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task fetched')\n printTaskDetail(response.data)\n })\n\n addAssigneeOptions(\n addWorkspaceOption(\n task.command('create')\n .description('Create a workflow task')\n .argument('<workflowFileId>')\n .requiredOption('--title <title>', 'Task title')\n .requiredOption('--status <statusScopedId>', 'Status scoped ID')\n .option('--priority <priority>', 'Priority: urgent, high, medium, or low', 'medium')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for task description')\n .option('--owner-human-id <humanId>', 'Task owner human ID')\n ),\n ).action(\n async (\n workflowFileId: string,\n options: {\n workspace: string\n title: string\n status: string\n priority?: string\n descFile?: string\n ownerHumanId?: string\n } & AssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n title: options.title,\n statusScopedId: parsePositiveInteger(options.status, '--status'),\n priority: parseRequiredPriority(options.priority),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n Object.assign(next, parseAssigneeBody(options, false))\n return next\n })\n startSpinner('Creating task...')\n const response = await httpPost<WorkflowTaskItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task created')\n printTaskDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n task.command('update')\n .description('Update workflow task metadata')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .option('--title <title>', 'Task title')\n .option('--priority <priority>', 'Priority: urgent, high, medium, or low')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for task description')\n .option('--clear-desc', 'Clear task description')\n .option('--owner-human-id <humanId>', 'Task owner human ID')\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: {\n workspace: string\n title?: string\n priority?: string\n descFile?: string\n clearDesc?: boolean\n ownerHumanId?: string\n },\n ) => {\n const body = runOrExit(() => {\n if (options.descFile && options.clearDesc) {\n throw new WorkflowOptionsError('Error: --desc-file cannot be used with --clear-desc.')\n }\n const next: Record<string, unknown> = {}\n if (options.title) next.title = options.title\n const priority = parsePriority(options.priority)\n if (priority !== undefined) next.priority = priority\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n if (options.clearDesc) next.desc = null\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Updating task...')\n const response = await httpPatch<WorkflowTaskItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/metadata`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task updated')\n printTaskDetail(response.data)\n },\n )\n\n for (const action of ['add-linked-files', 'remove-linked-files'] as const) {\n addWorkspaceOption(\n task.command(action)\n .description(`${action === 'add-linked-files' ? 'Add' : 'Remove'} linked files on a workflow task`)\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--file-ids <ids>', 'Comma-separated file IDs'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: { workspace: string; fileIds: string },\n ) => {\n const { id, fileIds } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n fileIds: parseFileIds(options.fileIds, '--file-ids')!,\n }))\n startSpinner(action === 'add-linked-files' ? 'Adding linked files...' : 'Removing linked files...')\n const path = `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/linked-files`\n const response =\n action === 'add-linked-files'\n ? await httpPost<WorkflowTaskItem>(path, { fileIds })\n : await httpDelete<WorkflowTaskItem>(path, { fileIds })\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, action === 'add-linked-files' ? 'Linked files added' : 'Linked files removed')\n printTaskDetail(response.data)\n },\n )\n }\n\n addWorkspaceOption(\n task.command('move')\n .description('Move a workflow task to another status')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--status <statusScopedId>', 'Target status scoped ID'),\n ).action(\n async (workflowFileId: string, taskScopedId: string, options: { workspace: string; status: string }) => {\n const { id, statusScopedId } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n statusScopedId: parsePositiveInteger(options.status, '--status'),\n }))\n startSpinner('Moving task...')\n const response = await httpPatch<WorkflowTaskItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/status`,\n { statusScopedId },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task moved')\n printTaskDetail(response.data)\n },\n )\n\n addAssigneeOptions(\n addWorkspaceOption(\n task.command('assign')\n .description('Update workflow task assignee')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .option('--clear', 'Clear assignee'),\n ),\n ).action(\n async (workflowFileId: string, taskScopedId: string, options: { workspace: string } & AssigneeOptions) => {\n const body = runOrExit(() => {\n const next = parseAssigneeBody(options, true)\n if (Object.keys(next).length === 0 && options.clear !== true) assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Updating task assignee...')\n const response = await httpPatch<WorkflowTaskItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/assignee`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task assignee updated')\n printTaskDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n task.command('delete')\n .description('Delete a workflow task')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Deleting task...')\n const response = await httpDelete<{ scopedId: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.scopedId}`)\n })\n}\n\nfunction registerCommentCommands(workflow: Command): void {\n const comment = workflow.command('comment').description('Workflow task comment operations')\n\n addWorkspaceOption(\n comment.command('create')\n .description('Create a workflow task comment')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--content-path <localPath>', 'Local UTF-8 text file for comment content'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: { workspace: string; contentPath: string },\n ) => {\n const { id, content } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n content: readCommentContentFile(options.contentPath),\n }))\n startSpinner('Creating comment...')\n const response = await httpPost<WorkflowCommentItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/comments`,\n { content },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Comment created')\n printCommentDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n comment.command('list')\n .description('List workflow task comments')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Fetching comments...')\n const response = await httpGet<WorkflowCommentListResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/comments`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.items.length === 0) {\n stopSpinner(true, 'No comments found.')\n return\n }\n stopSpinner(true, `Found ${response.data.items.length} comment(s)`)\n response.data.items.forEach((item, index) => {\n if (index > 0) print('')\n printCommentDetail(item)\n })\n })\n\n addWorkspaceOption(\n comment.command('delete')\n .description('Delete a workflow task comment')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .argument('<commentId>'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n commentId: string,\n options: { workspace: string },\n ) => {\n const ids = runOrExit(() => ({\n task: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n comment: parsePositiveInteger(commentId, 'commentId'),\n }))\n startSpinner('Deleting comment...')\n const response = await httpDelete<{ id: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${ids.task}/comments/${ids.comment}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.id}`)\n },\n )\n}\n\nfunction registerRunCommands(workflow: Command): void {\n const run = workflow.command('run').description('Workflow agent run operations')\n\n addWorkspaceOption(\n run.command('status')\n .description('Get workflow agent run statuses')\n .argument('<workflowFileId>')\n .argument('<triggerIds...>'),\n ).action(async (workflowFileId: string, triggerIds: string[], options: { workspace: string }) => {\n const workflowPipelineTriggerIds = runOrExit(() =>\n triggerIds.map((triggerId) => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId')),\n )\n startSpinner('Fetching run statuses...')\n const response = await httpPost<WorkflowPipelineStatusItem[]>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/triggers/statuses`,\n { workflowPipelineTriggerIds },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Found ${response.data.length} run status item(s)`)\n for (const item of response.data) {\n print(`${colors.bold}${item.workflowPipelineTriggerId}${colors.reset}\\t${item.pipelineStatus}`)\n }\n })\n\n addWorkspaceOption(\n run.command('output')\n .description('Get workflow agent run output events')\n .argument('<workflowFileId>')\n .argument('<triggerId>'),\n ).action(async (workflowFileId: string, triggerId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId'))\n startSpinner('Fetching run output...')\n const response = await httpGet<WorkflowPipelineOutputResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/trigger/${id}/output`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Run ${response.data.workflowPipelineTriggerId}`)\n for (const event of response.data.pipelineEvents) print(event)\n })\n\n addWorkspaceOption(\n run.command('abort')\n .description('Abort a workflow agent run')\n .argument('<workflowFileId>')\n .argument('<triggerId>'),\n ).action(async (workflowFileId: string, triggerId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId'))\n startSpinner('Aborting run...')\n const response = await httpPost<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/trigger/${id}/abort`,\n {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Abort accepted: ${id}`)\n })\n}\n","import { arch, platform } from 'node:os'\nimport { getApiBaseUrl, getApiKeyOrUndefined } from '../utils/config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport type MetricType = 'counter' | 'gauge' | 'histogram'\n\nexport interface MetricRecord {\n metric_id: string\n metric_type: MetricType\n value: number\n extra_label_name_2_value?: Record<string, string>\n}\n\nconst buffer: MetricRecord[] = []\nconst FLUSH_TIMEOUT_MS = 3000\nconst MAX_BATCH_SIZE = 100\n\nfunction commonLabels(): Record<string, string> {\n return {\n cli_version: __CLI_VERSION__,\n node_version: process.versions.node,\n os: platform(),\n arch: arch(),\n is_ci: isCiEnvironment() ? 'true' : 'false',\n }\n}\n\nexport function record(metric: MetricRecord): void {\n if (isTelemetryDisabled()) {\n debugLog(`record: disabled, dropping ${metric.metric_id}`)\n return\n }\n if (!getApiKeyOrUndefined()) {\n debugLog(`record: no API key, dropping ${metric.metric_id}`)\n return\n }\n buffer.push({\n ...metric,\n extra_label_name_2_value: {\n ...commonLabels(),\n ...(metric.extra_label_name_2_value ?? {}),\n },\n })\n debugLog(`record: buffered ${metric.metric_id} (buffer=${buffer.length})`)\n}\n\nfunction isDebug(): boolean {\n return process.env.MOXT_TELEMETRY_DEBUG === '1' || process.env.MOXT_TELEMETRY_DEBUG === 'true'\n}\n\nfunction debugLog(msg: string, detail?: unknown): void {\n if (!isDebug()) return\n process.stderr.write(`[telemetry] ${msg}${detail !== undefined ? ` ${JSON.stringify(detail)}` : ''}\\n`)\n}\n\nexport async function flush(): Promise<void> {\n if (buffer.length === 0) {\n debugLog('flush: buffer empty, skipping')\n return\n }\n const apiKey = getApiKeyOrUndefined()\n if (!apiKey) {\n debugLog('flush: no API key, dropping buffer')\n buffer.length = 0\n return\n }\n\n const batch = buffer.splice(0, MAX_BATCH_SIZE)\n const payload = {\n release_id: __CLI_VERSION__,\n client_type: 'cli',\n metric_data_list: batch.map((m) => ({\n profile: 'cli',\n metric_id: m.metric_id,\n metric_type: m.metric_type,\n value: m.value,\n extra_label_name_2_value: m.extra_label_name_2_value,\n })),\n }\n\n const url = `${getApiBaseUrl()}/cli-metrics`\n debugLog(`flush: POST ${url} with ${batch.length} metrics`, payload)\n\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, FLUSH_TIMEOUT_MS)\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n debugLog(`flush: response status=${res.status}`)\n } finally {\n clearTimeout(timeout)\n }\n } catch (err) {\n debugLog('flush: failed', err instanceof Error ? err.message : String(err))\n // fire-and-forget — never surface telemetry failures to the user\n }\n}\n","import { readTelemetryConfig, writeTelemetryConfig } from './config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\nconst NOTICE = [\n '',\n 'Attention: Moxt CLI now collects anonymous telemetry regarding usage.',\n \"This information is used to shape Moxt CLI's roadmap and prioritize features.\",\n '',\n 'You may opt out by setting MOXT_TELEMETRY_DISABLED=1 in your env',\n 'or by running `moxt telemetry disable`.',\n 'Details: https://www.npmjs.com/package/@moxt-ai/cli#telemetry',\n '',\n]\n\nexport function maybeShowTelemetryNotice(): void {\n if (isTelemetryDisabled()) return\n if (isCiEnvironment()) return\n if (readTelemetryConfig().noticeShown) return\n\n for (const line of NOTICE) {\n process.stderr.write(`${line}\\n`)\n }\n\n try {\n writeTelemetryConfig({ noticeShown: true })\n } catch {\n // persistence failure is not user-visible — we'll just show the notice again next run\n }\n}\n","import type { Command } from 'commander'\nimport { flush, record } from './client.js'\nimport { maybeShowTelemetryNotice } from './notice.js'\n\ninterface RunningCommand {\n name: string\n subcommand?: string\n startedAt: number\n}\n\nlet current: RunningCommand | null = null\n\nfunction commandPath(cmd: Command): { command: string; subcommand?: string } {\n const names: string[] = []\n let node: Command | null = cmd\n while (node && node.parent) {\n names.unshift(node.name())\n node = node.parent\n }\n if (names.length === 0) return { command: 'unknown' }\n if (names.length === 1) return { command: names[0] }\n return { command: names[0], subcommand: names.slice(1).join(' ') }\n}\n\nexport function instrumentProgram(program: Command): void {\n program.hook('preAction', (_thisCommand, actionCommand) => {\n const { command, subcommand } = commandPath(actionCommand)\n if (command !== 'telemetry') {\n maybeShowTelemetryNotice()\n }\n current = { name: command, subcommand, startedAt: Date.now() }\n record({\n metric_id: 'client.cli.command_invocation.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command,\n ...(subcommand ? { subcommand } : {}),\n status: 'started',\n },\n })\n })\n\n program.hook('postAction', async () => {\n await reportOutcome('success')\n })\n}\n\nasync function reportOutcome(status: 'success' | 'error', errorCode?: string): Promise<void> {\n if (!current) return\n const { name, subcommand, startedAt } = current\n const durationSeconds = (Date.now() - startedAt) / 1000\n\n record({\n metric_id: 'client.cli.command_duration_seconds',\n metric_type: 'histogram',\n value: durationSeconds,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n status,\n },\n })\n\n if (status === 'error') {\n record({\n metric_id: 'client.cli.command_error.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n ...(errorCode ? { error_code: errorCode } : {}),\n },\n })\n }\n\n current = null\n await flush()\n}\n\n/**\n * Wire a final error/exit hook. Call before program.parseAsync so we can capture\n * failures routed through process.exit or unhandled rejections.\n *\n * Best-effort only: `reportOutcome` is fire-and-forget, and the subsequent\n * `process.exit(1)` terminates the process before `flush()` can complete — so\n * the error metric recorded here will typically be dropped. Reliable crash\n * reporting belongs to Sentry/APM, not this telemetry path.\n */\nexport function installExitHandler(): void {\n const handleError = (errorCode: string): void => {\n void reportOutcome('error', errorCode)\n }\n\n process.on('uncaughtException', () => {\n handleError('uncaught_exception')\n process.exit(1)\n })\n process.on('unhandledRejection', () => {\n handleError('unhandled_rejection')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":["fs","path","buffer","path","path","buffer","runOrExit","program","runOrExit","path","buffer","program","runOrExit","path","runOrExit","path","program","fs","program","program","program","members","fs","TextDecoder","runOrExit","addSpaceOptions","path","buffer","readCommentContentFile","TextDecoder","indentation","escapeTerminalControlCharacters","formatDetailScalar","printDetailField","printDetailTextField","program","program","arch","platform","platform","arch","program"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/program.ts","../src/commands/file.ts","../src/commands/file-comment.ts","../src/utils/file-selector.ts","../src/utils/http.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/spinner.ts","../src/utils/search-options.ts","../src/utils/run-or-exit.ts","../src/commands/memory.ts","../src/utils/miniapp-db.ts","../src/commands/miniapp.ts","../src/telemetry/config.ts","../src/telemetry/opt-out.ts","../src/commands/telemetry.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/commands/workflow.ts","../src/telemetry/client.ts","../src/telemetry/notice.ts","../src/telemetry/instrument.ts"],"sourcesContent":["import updateNotifier from 'update-notifier'\nimport { createProgram } from './program.js'\nimport { flush } from './telemetry/client.js'\nimport { installExitHandler, instrumentProgram } from './telemetry/instrument.js'\n\ndeclare const __CLI_VERSION__: string\n\nupdateNotifier({\n pkg: { name: '@moxt-ai/cli', version: __CLI_VERSION__ },\n}).notify()\n\nconst program = createProgram(__CLI_VERSION__)\n\ninstrumentProgram(program)\ninstallExitHandler()\n\nprogram\n .parseAsync(process.argv)\n .then(async () => {\n await flush()\n })\n .catch(async (err: unknown) => {\n console.error('CLI Error:', err)\n await flush()\n process.exit(1)\n })\n","import { Command } from 'commander'\nimport { registerFileCommand } from './commands/file.js'\nimport { registerMemoryCommand } from './commands/memory.js'\nimport { registerMiniappCommand } from './commands/miniapp.js'\nimport { registerTelemetryCommand } from './commands/telemetry.js'\nimport { registerWhoamiCommand } from './commands/whoami.js'\nimport { registerWorkspaceCommand } from './commands/workspace.js'\nimport { registerWorkflowCommand } from './commands/workflow.js'\n\nexport function createProgram(version: string): Command {\n const program = new Command()\n\n program\n .name('moxt')\n .description('Moxt CLI - AI Workspace')\n .version(version)\n .action(() => {\n program.help()\n })\n\n registerWhoamiCommand(program)\n registerWorkspaceCommand(program)\n registerFileCommand(program)\n registerMemoryCommand(program)\n registerWorkflowCommand(program)\n registerMiniappCommand(program)\n registerTelemetryCommand(program)\n\n return program\n}\n","import * as fs from 'node:fs'\nimport { Command } from 'commander'\nimport { registerFileCommentCommands } from './file-comment.js'\nimport {\n buildFileQueryString,\n isBinaryContent,\n resolveReadMode,\n resolveSpaceSelector,\n resolveWriteMode,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPost, httpPut } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseSearchMode } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface FileEntry {\n name: string\n type: 'file' | 'directory'\n size: number | null\n}\n\ninterface FileReadResponse {\n path: string\n type: 'file' | 'directory'\n entries: FileEntry[] | null\n content: string | null\n}\n\ninterface FileWriteResponse {\n path: string\n created: boolean\n}\n\ninterface MkdirResponse {\n path: string\n created: boolean\n}\n\ninterface DeleteResponse {\n path: string\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FieldHighlight {\n text: string\n}\n\ninterface SemanticSnippet {\n content: string\n}\n\ninterface FileSearchItem {\n repoId: string\n fileId: string\n filePath: string\n rank: number\n contentHighlight?: FieldHighlight\n filePathHighlight?: FieldHighlight\n semanticSnippets: SemanticSnippet[]\n}\n\ninterface FileSearchResponse {\n items: FileSearchItem[]\n}\n\nfunction addSpaceOptions(cmd: Command): Command {\n return cmd\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nexport function registerFileCommand(program: Command): void {\n const file = program.command('file').description('File operations')\n\n registerFileCommentCommands(file)\n\n addSpaceOptions(\n file.command('search')\n .description('Search files in accessible spaces')\n .argument('<query>', 'Search query')\n .option('-l, --limit <limit>', 'Maximum number of files to return', '30')\n .option('--mode <mode>', 'Keyword matching mode: any or all', 'any'),\n ).action(async (query: string, options: SpaceOptions & { limit?: string; mode?: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const limit = runOrExit(() => parseSearchLimit(options.limit, 30, 80))\n const mode = runOrExit(() => parseSearchMode(options.mode))\n\n startSpinner('Searching files...')\n const response = await httpPost<FileSearchResponse>(\n `/workspaces/${options.workspace}/files/search`,\n {\n query,\n limit,\n mode,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No files found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} file(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. ${item.filePath}${colors.reset}`)\n print(`${colors.dim}repo=${item.repoId} file=${item.fileId}${colors.reset}`)\n const snippet = item.contentHighlight?.text ?? item.semanticSnippets[0]?.content\n if (snippet) {\n print(snippet)\n }\n print('')\n }\n })\n\n addSpaceOptions(\n file.command('get-url')\n .description('Resolve the shareable browser URL for a file')\n .requiredOption('-p, --path <path>', 'File path'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Resolving URL...')\n const response = await httpGet<FileUrlResponse>(\n `/workspaces/${options.workspace}/files/url${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, response.data.path)\n print(`${colors.cyan}${response.data.url}${colors.reset}`)\n })\n\n addSpaceOptions(\n file.command('list')\n .description('List directory contents')\n .option('-p, --path <path>', 'Directory path', '/'),\n ).action(async (options: SpaceOptions & { path: string }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n const qs = buildFileQueryString(options.path, spaceParams)\n\n startSpinner('Listing files...')\n const response = await httpGet<FileReadResponse>(\n `/workspaces/${options.workspace}/files/list${qs}`,\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${options.path} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { path, entries } = response.data\n\n if (!entries || entries.length === 0) {\n stopSpinner(true, `${path}: empty directory`)\n return\n }\n\n stopSpinner(true, path)\n for (const entry of entries) {\n if (entry.type === 'directory') {\n print(`${colors.blue}${entry.name}/${colors.reset}`)\n } else {\n print(entry.name)\n }\n }\n })\n\n file.command('read')\n .description('Read file content')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .action(async (options: Partial<SpaceOptions> & { path?: string; url?: string }) => {\n const mode = runOrExit(() => resolveReadMode(options))\n\n startSpinner('Reading file...')\n\n let response: { ok: boolean; status: number; data: FileReadResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpGet<FileReadResponse>(\n `/files/read-by-url?url=${encodeURIComponent(mode.url)}`,\n )\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n response = await httpGet<FileReadResponse>(\n `/workspaces/${mode.workspace}/files/read${qs}`,\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const { type, content } = response.data\n\n if (type === 'directory') {\n stopSpinner(false, 'Failed')\n print(`${colors.red}☠ ${displayPath} is a directory${colors.reset}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Done')\n print(content ?? '')\n })\n\n file.command('put')\n .description('Upload a file')\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'Remote file path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n .requiredOption('-l, --local-path <localPath>', 'Local file path')\n .option('-r, --recursive', 'Create parent directories if needed')\n .action(\n async (options: Partial<SpaceOptions> & {\n path?: string\n url?: string\n localPath: string\n recursive?: boolean\n }) => {\n const mode = runOrExit(() => resolveWriteMode(options))\n\n if (!fs.existsSync(options.localPath)) {\n print(`${colors.red}☠ Local file not found: ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const stats = fs.statSync(options.localPath)\n if (!stats.isFile()) {\n print(`${colors.red}☠ Not a file: ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const maxSize = 10 * 1024 * 1024\n if (stats.size > maxSize) {\n print(`${colors.red}☠ File too large (max 10MB): ${options.localPath}${colors.reset}`)\n process.exit(1)\n }\n\n const buffer = fs.readFileSync(options.localPath)\n if (isBinaryContent(buffer)) {\n print(`${colors.red}☠ Binary files are not allowed. Only text files can be uploaded.${colors.reset}`)\n process.exit(1)\n }\n\n const content = buffer.toString('utf8')\n\n startSpinner('Uploading...')\n\n let response: { ok: boolean; status: number; data: FileWriteResponse }\n let displayPath: string\n\n if (mode.kind === 'by-url') {\n displayPath = mode.url\n response = await httpPut<FileWriteResponse>('/files/write-by-url', {\n url: mode.url,\n content,\n })\n } else {\n displayPath = mode.path\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n response = await httpPut<FileWriteResponse>(\n `/workspaces/${mode.workspace}/files/write`,\n {\n path: mode.path,\n content,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n }\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n if (mode.kind === 'by-url') {\n print(`${colors.red}☠ ${displayPath} does not exist${colors.reset}`)\n } else {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n }\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Updated'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('mkdir')\n .description('Create a directory')\n .requiredOption('-p, --path <path>', 'Directory path')\n .option('-r, --recursive', 'Create parent directories if needed'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n recursive?: boolean\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Creating directory...')\n const response = await httpPost<MkdirResponse>(\n `/workspaces/${options.workspace}/files/mkdir`,\n {\n path: options.path,\n recursive: options.recursive ?? false,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Parent directory does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n const action = response.data.created ? 'Created' : 'Already exists'\n stopSpinner(true, `${action}: ${response.data.path}`)\n },\n )\n\n addSpaceOptions(\n file.command('del')\n .description('Delete a file or empty directory')\n .requiredOption('-p, --path <path>', 'File or directory path'),\n ).action(\n async (options: SpaceOptions & {\n path: string\n }) => {\n const spaceParams = runOrExit(() => resolveSpaceSelector(options))\n\n startSpinner('Deleting...')\n const response = await httpDelete<DeleteResponse>(\n `/workspaces/${options.workspace}/files/delete`,\n {\n path: options.path,\n ...spaceParams,\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ Path not found: ${options.path}${colors.reset}`)\n } else if (response.status === 400) {\n print(`${colors.red}☠ Cannot delete non-empty directory${colors.reset}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n\n stopSpinner(true, `Deleted: ${response.data.path}`)\n },\n )\n}\n","import * as fs from 'node:fs'\nimport { TextDecoder } from 'node:util'\nimport { Command } from 'commander'\nimport {\n buildFileQueryString,\n ReadMode,\n resolveReadMode,\n resolveSpaceSelector,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpGet, httpPatch } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\n// The comment/thread ID column is a nanoid, and canonical file URLs embed a UUID fileId.\n// Mirror the server contract (server-ts openapi-file-comment.vo.ts / openapi-file-url.controller.ts)\n// so the CLI rejects malformed URLs locally instead of forwarding them to the API.\nconst FILE_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst URL_FORMAT_HINT =\n 'Error: invalid Moxt URL format. Expected https://moxt.ai/w/{workspaceId}/{fileId} ' +\n 'or https://moxt.ai/w/{workspaceId}/c/{agentId}[/{sessionId}]?file={fileId}'\n\ninterface FileCommentAuthor {\n humanId: number | null\n assistantId: number | null\n teammateId: number | null\n authorName: string | null\n authorAvatarUrl: string | null\n}\n\ninterface FileCommentItem extends FileCommentAuthor {\n id: string\n threadId: string\n content: string\n createdAt: string\n editedAt: string | null\n}\n\ninterface FileCommentThread {\n threadId: string\n items: FileCommentItem[]\n createdAt: string\n createdBy: FileCommentAuthor\n resolvedAt: string | null\n quotedText: string | null\n fileId: string\n}\n\ninterface ListFileCommentsResponse {\n items: FileCommentThread[]\n}\n\ninterface FileUrlResponse {\n path: string\n url: string\n}\n\ninterface FileCommentOptions extends Partial<SpaceOptions> {\n path?: string\n url?: string\n}\n\n/**\n * Error thrown when a file comment command's local option/content validation fails.\n * Handlers catch it via {@link runOrExit} and turn it into stderr + exit code 1.\n */\nclass FileCommentOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'FileCommentOptionsError'\n }\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof FileCommentOptionsError || err instanceof SpaceOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\n/**\n * Extract the workspace/file identifiers a comment API call needs from a canonical\n * Moxt file URL. Supports the workspace-mode shape `/w/{workspaceId}/{fileId}` and the\n * chat deeplink `/w/{workspaceId}/c/{agentId}[/{sessionId}]?file={fileId}`.\n */\nfunction parseMoxtFileUrl(url: string): { workspaceId: string; fileId: string } {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length < 3 || segments[0] !== 'w') {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n const workspaceId = segments[1]\n\n let fileId: string | undefined\n if (segments[2] === 'c') {\n fileId = parsed.searchParams.get('file') ?? undefined\n } else if (segments.length === 3) {\n fileId = segments[2]\n }\n\n if (!fileId || !FILE_ID_UUID_RE.test(fileId)) {\n throw new FileCommentOptionsError(URL_FORMAT_HINT)\n }\n return { workspaceId, fileId }\n}\n\n/**\n * Resolve the target file for a comment command. URL mode reads the identifiers directly;\n * path mode calls the existing `file get-url` endpoint to obtain a stable URL, then parses it.\n */\nasync function resolveFileTarget(options: FileCommentOptions): Promise<{ workspaceId: string; fileId: string }> {\n const mode: ReadMode = runOrExit(() => resolveReadMode(options))\n if (mode.kind === 'by-url') {\n return runOrExit(() => parseMoxtFileUrl(mode.url))\n }\n\n const spaceParams = runOrExit(() => resolveSpaceSelector(options as SpaceOptions))\n const qs = buildFileQueryString(mode.path, spaceParams)\n\n startSpinner('Resolving file...')\n const response = await httpGet<FileUrlResponse>(`/workspaces/${mode.workspace}/files/url${qs}`)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n if (response.status === 404) {\n print(`${colors.red}☠ ${mode.path} does not exist${colors.reset}`)\n } else if (response.status === 400) {\n printError(`Error: ${JSON.stringify(response.data)}`)\n } else {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n }\n process.exit(1)\n }\n stopSpinner(true, response.data.path)\n return runOrExit(() => parseMoxtFileUrl(response.data.url))\n}\n\nfunction readCommentContentFile(path: string): string {\n if (!fs.existsSync(path)) {\n throw new FileCommentOptionsError(`Error: comment content file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new FileCommentOptionsError(`Error: comment content path is not a file: ${path}`)\n }\n const buffer = fs.readFileSync(path)\n if (buffer.includes(0)) {\n throw new FileCommentOptionsError('Error: comment content file must not contain NUL bytes.')\n }\n let content: string\n try {\n content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer)\n } catch {\n throw new FileCommentOptionsError('Error: comment content file must contain valid UTF-8 text.')\n }\n // The file comment API only requires a non-empty body (server schema: z.string().min(1));\n // there is no server-side max length, so the CLI must not impose a client-only cap.\n if (content.length === 0) {\n throw new FileCommentOptionsError('Error: comment content file must not be empty.')\n }\n return content\n}\n\nfunction parseResolveState(state: string | undefined): boolean {\n if (state === 'resolved') return true\n if (state === 'open') return false\n throw new FileCommentOptionsError('Error: --state must be \"resolved\" or \"open\".')\n}\n\ntype DetailScalar = string | number | boolean | null\n\nfunction indentation(size: number): string {\n return ' '.repeat(size)\n}\n\n// Escape terminal control characters so untrusted comment content, author names, and\n// avatar URLs cannot inject ANSI/OSC sequences into the operator's terminal.\nfunction escapeTerminalControlCharacters(value: string): string {\n return value\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n )\n}\n\nfunction formatDetailScalar(value: DetailScalar): string {\n if (value === null) return 'null'\n if (typeof value === 'string') {\n const escaped = escapeTerminalControlCharacters(value)\n if (escaped === '') return '\"\"'\n if (/\\n/.test(escaped)) return JSON.stringify(escaped)\n return escaped\n }\n return String(value)\n}\n\nfunction printDetailField(name: string, value: DetailScalar, indent = 0): void {\n print(`${indentation(indent)}${name}: ${formatDetailScalar(value)}`)\n}\n\nfunction printDetailTextField(name: string, value: string | null, indent = 0): void {\n if (value === null || value === '') {\n printDetailField(name, value, indent)\n return\n }\n const escaped = escapeTerminalControlCharacters(value)\n print(`${indentation(indent)}${name}:`)\n for (const line of escaped.split('\\n')) {\n print(`${indentation(indent + 2)}${line}`)\n }\n}\n\nfunction printAuthorFields(author: FileCommentAuthor, indent: number): void {\n printDetailField('humanId', author.humanId, indent)\n printDetailField('assistantId', author.assistantId, indent)\n printDetailField('teammateId', author.teammateId, indent)\n printDetailField('authorName', author.authorName, indent)\n printDetailField('authorAvatarUrl', author.authorAvatarUrl, indent)\n}\n\nfunction printCommentItem(item: FileCommentItem, indent = 0): void {\n print(`${indentation(indent)}${colors.bold}Comment${colors.reset}`)\n printDetailField('id', item.id, indent + 2)\n printDetailField('threadId', item.threadId, indent + 2)\n printAuthorFields(item, indent + 2)\n printDetailTextField('content', item.content, indent + 2)\n printDetailField('createdAt', item.createdAt, indent + 2)\n printDetailField('editedAt', item.editedAt, indent + 2)\n}\n\nfunction printThread(thread: FileCommentThread): void {\n print(`${colors.bold}Thread${colors.reset}`)\n printDetailField('threadId', thread.threadId, 2)\n printDetailField('fileId', thread.fileId, 2)\n printDetailTextField('quotedText', thread.quotedText, 2)\n printDetailField('resolvedAt', thread.resolvedAt, 2)\n print(`${indentation(2)}createdBy:`)\n printAuthorFields(thread.createdBy, 4)\n printDetailField('createdAt', thread.createdAt, 2)\n print(`${indentation(2)}comments:`)\n thread.items.forEach((item) => printCommentItem(item, 4))\n}\n\nfunction addFileSelectorOptions(cmd: Command): Command {\n return cmd\n .option('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n .option('-p, --path <path>', 'File path')\n .option('-u, --url <url>', 'Moxt file URL (e.g., https://moxt.ai/w/{workspaceId}/{fileId})')\n}\n\nexport function registerFileCommentCommands(file: Command): void {\n const comment = file.command('comment').description('File comment operations')\n\n addFileSelectorOptions(\n comment.command('list').description('List comment threads on a file'),\n ).action(async (options: FileCommentOptions) => {\n const target = await resolveFileTarget(options)\n\n startSpinner('Fetching comments...')\n const response = await httpGet<ListFileCommentsResponse>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comment-threads`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (response.data.items.length === 0) {\n stopSpinner(true, 'No comments found.')\n return\n }\n stopSpinner(true, `Found ${response.data.items.length} thread(s)`)\n response.data.items.forEach((thread, index) => {\n if (index > 0) print('')\n printThread(thread)\n })\n })\n\n addFileSelectorOptions(\n comment.command('update')\n .description('Update a comment you created')\n .argument('<commentId>')\n .requiredOption('--content-path <localPath>', 'Local UTF-8 text file for comment content'),\n ).action(async (commentId: string, options: FileCommentOptions & { contentPath: string }) => {\n // Validate the local content file before any network call so invalid input\n // never leaves the CLI (path-mode resolution below issues an HTTP request).\n const content = runOrExit(() => readCommentContentFile(options.contentPath))\n const target = await resolveFileTarget(options)\n\n startSpinner('Updating comment...')\n const response = await httpPatch<FileCommentItem>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comments/${commentId}`,\n { content },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n stopSpinner(true, 'Comment updated')\n printCommentItem(response.data)\n })\n\n addFileSelectorOptions(\n comment.command('resolve')\n .description('Resolve or reopen a comment thread')\n .argument('<threadId>')\n .requiredOption('--state <state>', 'Thread state: resolved or open'),\n ).action(async (threadId: string, options: FileCommentOptions & { state: string }) => {\n const resolved = runOrExit(() => parseResolveState(options.state))\n const target = await resolveFileTarget(options)\n\n startSpinner(resolved ? 'Resolving thread...' : 'Reopening thread...')\n const response = await httpPatch<unknown>(\n `/workspaces/${target.workspaceId}/files/${target.fileId}/comment-threads/${threadId}/resolve`,\n { resolved },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n stopSpinner(true, resolved ? `Resolved: ${threadId}` : `Reopened: ${threadId}`)\n })\n}\n","/**\n * Pure logic for resolving file-command space selectors and building request URLs.\n *\n * These functions are extracted from commands/file.ts so they can be unit tested\n * without spawning the CLI or mocking process.exit. All error conditions are\n * surfaced as thrown Errors; action handlers are responsible for turning them\n * into user-facing output and exit codes.\n */\n\nexport interface SpaceOptions {\n workspace: string\n space?: string\n personal?: boolean\n teamSpaceId?: string\n teammateId?: string\n}\n\nexport interface SpaceParams {\n space?: string\n teamSpaceId?: string\n agentId?: number\n}\n\n/**\n * Error thrown when selector options violate a contract (mutually exclusive,\n * wrong format, etc). Action handlers catch this and print the message before\n * exiting with code 1.\n */\nexport class SpaceOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SpaceOptionsError'\n }\n}\n\n/**\n * Resolve mutually-exclusive space selector flags into normalized request params.\n *\n * Priority (only one must be set): --team-space-id > --teammate-id > --personal > -s <name>.\n * When none is set, returns empty params (server treats this as personal space).\n */\nexport function resolveSpaceSelector(options: SpaceOptions): SpaceParams {\n // Destructure first so TypeScript's control-flow analysis can narrow each\n // field through the subsequent non-null / non-empty checks without having\n // to re-read options.* at the point of use (which would lose narrowing).\n const { space, teamSpaceId, teammateId } = options\n const personalIsSet = options.personal === true\n\n // Count \"user-set\" selectors explicitly so the mutual-exclusion check\n // reflects intent (\"which flags did the user pass?\") rather than a\n // generic truthiness filter. This keeps the mutual-exclusion check\n // cleanly separated from the downstream format validation (e.g.\n // `parsed <= 0` for teammateId).\n const spaceIsSet = space != null && space !== ''\n const teamSpaceIdIsSet = teamSpaceId != null && teamSpaceId !== ''\n const teammateIdIsSet = teammateId != null && teammateId !== ''\n const selectorCount =\n (spaceIsSet ? 1 : 0) + (personalIsSet ? 1 : 0) + (teamSpaceIdIsSet ? 1 : 0) + (teammateIdIsSet ? 1 : 0)\n if (selectorCount > 1) {\n throw new SpaceOptionsError(\n 'Error: -s, --personal, --team-space-id, and --teammate-id are mutually exclusive.',\n )\n }\n\n // Dispatch via the underlying field checks (not `*IsSet`) so TypeScript\n // narrows each local to `string`, letting us return without `!`.\n if (teamSpaceId != null && teamSpaceId !== '') {\n return { teamSpaceId }\n }\n if (teammateId != null && teammateId !== '') {\n const parsed = Number.parseInt(teammateId, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== teammateId) {\n throw new SpaceOptionsError(\n `Error: --teammate-id must be a positive integer, got \"${teammateId}\".`,\n )\n }\n return { agentId: parsed }\n }\n if (personalIsSet) {\n return { space: 'personal' }\n }\n if (space != null && space !== '') {\n return { space }\n }\n return {}\n}\n\n/**\n * Build the `?path=...&space=...` query string for file endpoints.\n * Returns empty string when no params are set (caller should not append `?`).\n * Values are URL-encoded via URLSearchParams.\n *\n * An empty-string `path` is treated as \"not provided\" and omitted from the query;\n * callers should pass `undefined` rather than `\"\"` when no path is intended.\n */\nexport function buildFileQueryString(path: string | undefined, spaceParams: SpaceParams): string {\n const params = new URLSearchParams()\n if (path != null && path !== '') {\n params.set('path', path)\n }\n if (spaceParams.space) {\n params.set('space', spaceParams.space)\n }\n if (spaceParams.teamSpaceId) {\n params.set('teamSpaceId', spaceParams.teamSpaceId)\n }\n if (spaceParams.agentId != null) {\n params.set('agentId', String(spaceParams.agentId))\n }\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\n/**\n * Detect if a Buffer contains binary content by sampling the first 8192 bytes.\n * Control characters other than tab (9), LF (10), and CR (13) are treated as binary.\n */\nexport function isBinaryContent(buffer: Buffer): boolean {\n const sampleSize = Math.min(buffer.length, 8192)\n\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i]\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Validate `file read` command's top-level mutually-exclusive options (-u vs -w/-p).\n * Returns the resolved mode ('by-url' or 'by-path'). Throws SpaceOptionsError on conflict.\n *\n * Empty strings are treated as \"not provided\" (commander never passes empty strings\n * for optional flags, but callers outside the CLI context should pass undefined instead\n * of \"\" to avoid unexpected branch behaviour).\n */\nexport type ReadMode = { kind: 'by-url'; url: string } | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveReadMode(options: {\n url?: string\n workspace?: string\n path?: string\n}): ReadMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n // At this point both workspace and path are guaranteed non-empty by the guards\n // above. Use explicit checks so TypeScript narrows the types without needing `!`.\n if (!options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n return { kind: 'by-path', workspace: options.workspace, path: options.path }\n}\n\n/**\n * Validate `file put` command's top-level mutually-exclusive options (-u vs -w/-p).\n *\n * By-URL puts overwrite an existing file (the URL already identifies it), so\n * `--recursive` is meaningless in that mode and is rejected outright to keep the\n * user's intent unambiguous.\n */\nexport type WriteMode =\n | { kind: 'by-url'; url: string }\n | { kind: 'by-path'; workspace: string; path: string }\n\nexport function resolveWriteMode(options: {\n url?: string\n workspace?: string\n path?: string\n recursive?: boolean\n}): WriteMode {\n if (options.url && options.workspace) {\n throw new SpaceOptionsError('Error: --url cannot be used with --workspace')\n }\n if (options.url && options.path) {\n throw new SpaceOptionsError('Error: --url cannot be used with --path')\n }\n if (options.url && options.recursive) {\n throw new SpaceOptionsError('Error: --recursive cannot be used with --url (the file must already exist)')\n }\n if (!options.url && !options.workspace) {\n throw new SpaceOptionsError('Error: Either --url or --workspace is required')\n }\n if (!options.url && !options.path) {\n throw new SpaceOptionsError('Error: --path is required when not using --url')\n }\n\n if (options.url) {\n return { kind: 'by-url', url: options.url }\n }\n return { kind: 'by-path', workspace: options.workspace!, path: options.path! }\n}\n","import { arch, platform } from 'os'\nimport { getApiBaseUrl, getApiKey } from './config.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport interface ApiResponse<T> {\n ok: boolean\n status: number\n data: T\n}\n\nexport interface RawApiResponse {\n ok: boolean\n status: number\n text: string\n contentType: string | null\n}\n\nfunction getUserAgent(): string {\n return `moxt-cli/${__CLI_VERSION__} (${platform()}/${arch()}) node/${process.versions.node}`\n}\n\nasync function fetchApi(method: string, path: string, body?: unknown): Promise<Response> {\n const apiKey = getApiKey()\n const url = `${getApiBaseUrl()}${path}`\n\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n 'User-Agent': getUserAgent(),\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n\n if (response.status === 401) {\n console.error('Authentication failed. Check your MOXT_API_KEY.')\n console.error('Get a new key at: https://moxt.ai')\n process.exit(1)\n }\n\n return response\n}\n\nasync function request<T>(method: string, path: string, body?: unknown): Promise<ApiResponse<T>> {\n const response = await fetchApi(method, path, body)\n const contentType = response.headers.get('content-type')\n const data = contentType?.includes('application/json') ? ((await response.json()) as T) : ((await response.text()) as T)\n\n return {\n ok: response.ok,\n status: response.status,\n data,\n }\n}\n\nexport async function httpGet<T>(path: string): Promise<ApiResponse<T>> {\n return request<T>('GET', path)\n}\n\nexport async function httpPut<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PUT', path, body)\n}\n\nexport async function httpPost<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('POST', path, body)\n}\n\nexport async function httpPatch<T>(path: string, body: unknown): Promise<ApiResponse<T>> {\n return request<T>('PATCH', path, body)\n}\n\nexport async function httpDelete<T>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return request<T>('DELETE', path, body)\n}\n\nexport async function httpRaw(method: 'GET' | 'POST' | 'PATCH' | 'DELETE', path: string, body?: unknown): Promise<RawApiResponse> {\n const response = await fetchApi(method, path, body)\n return {\n ok: response.ok,\n status: response.status,\n text: await response.text(),\n contentType: response.headers.get('content-type'),\n }\n}\n","const DEFAULT_HOST = 'api.moxt.ai'\n\nexport function getApiBaseUrl(): string {\n const host = process.env.MOXT_HOST ?? DEFAULT_HOST\n return `https://${host}/openapi/v1`\n}\n\nexport function getApiKey(): string {\n const apiKey = process.env.MOXT_API_KEY\n\n if (!apiKey) {\n console.error('MOXT_API_KEY environment variable is not set.')\n console.error('')\n console.error('Get your API key at: https://moxt.ai')\n console.error('')\n console.error('Then set it:')\n console.error(' export MOXT_API_KEY=moxt_...')\n process.exit(1)\n }\n\n return apiKey\n}\n\nexport function getApiKeyOrUndefined(): string | undefined {\n return process.env.MOXT_API_KEY\n}\n","// ANSI colors\nexport const colors = {\n bold: '\\x1b[1m',\n blue: '\\x1b[1;34m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n cyan: '\\x1b[36m',\n dim: '\\x1b[2m',\n reset: '\\x1b[0m',\n}\n\nexport function print(message: string): void {\n console.log(message)\n}\n\nexport function printError(message: string): void {\n console.error(`${colors.red}${message}${colors.reset}`)\n}\n","const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']\n\nlet intervalId: ReturnType<typeof setInterval> | null = null\nlet frameIndex = 0\n\nexport function startSpinner(message: string): void {\n frameIndex = 0\n process.stdout.write(`${frames[frameIndex]} ${message}`)\n\n intervalId = setInterval(() => {\n frameIndex = (frameIndex + 1) % frames.length\n process.stdout.write(`\\r${frames[frameIndex]} ${message}`)\n }, 80)\n}\n\nexport function stopSpinner(success: boolean, message?: string): void {\n if (intervalId) {\n clearInterval(intervalId)\n intervalId = null\n }\n\n const symbol = success ? '\\x1b[32m✓\\x1b[0m' : '\\x1b[31m✗\\x1b[0m'\n // \\x1b[2K 清除整行,\\r 回到行首\n process.stdout.write(`\\x1b[2K\\r${symbol} ${message ?? ''}\\n`)\n}\n","export class SearchOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SearchOptionsError'\n }\n}\n\nexport function parseSearchLimit(raw: string | undefined, defaultValue: number, max: number): number {\n if (raw == null || raw === '') {\n return defaultValue\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --limit must be a positive integer, got \"${raw}\".`)\n }\n if (parsed > max) {\n throw new SearchOptionsError(`Error: --limit must be less than or equal to ${max}.`)\n }\n return parsed\n}\n\nexport function parseSearchMode(raw: string | undefined): 'all' | 'any' {\n if (raw == null || raw === '') {\n return 'any'\n }\n if (raw === 'all' || raw === 'any') {\n return raw\n }\n throw new SearchOptionsError(`Error: --mode must be \"any\" or \"all\", got \"${raw}\".`)\n}\n\nexport function parseTeammateId(raw: string | undefined): number | undefined {\n if (raw == null || raw === '') {\n return undefined\n }\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new SearchOptionsError(`Error: --teammate-id must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n","import { SpaceOptionsError } from './file-selector.js'\nimport { printError } from './output.js'\nimport { SearchOptionsError } from './search-options.js'\n\n/**\n * Call a pure resolver that may throw a known CLI option error; on error,\n * print the message and exit(1). This keeps the user-facing contract\n * (stderr + exit code 1) consistent across subcommands while letting the\n * resolvers stay pure and unit-testable.\n */\nexport function runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n","import { Command } from 'commander'\nimport { httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { runOrExit } from '../utils/run-or-exit.js'\nimport { parseSearchLimit, parseTeammateId } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface MemorySearchItem {\n rank: number\n pipelineId: string\n chunkId: string\n chunkIndex: number\n content: string\n contentTruncated: boolean\n}\n\ninterface MemorySearchResponse {\n items: MemorySearchItem[]\n}\n\nexport function registerMemoryCommand(program: Command): void {\n const memory = program.command('memory').description('Memory operations')\n\n memory.command('search')\n .description('Search archived agent memory')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .option('--teammate-id <teammateId>', 'Search a managed AI teammate memory')\n .option('-l, --limit <limit>', 'Maximum number of memory chunks to return', '5')\n .argument('<query>', 'Search query')\n .action(\n async (\n query: string,\n options: {\n workspace: string\n teammateId?: string\n limit?: string\n },\n ) => {\n const limit = runOrExit(() => parseSearchLimit(options.limit, 5, 10))\n const teammateId = runOrExit(() => parseTeammateId(options.teammateId))\n\n startSpinner('Searching memory...')\n const response = await httpPost<MemorySearchResponse>(\n `/workspaces/${options.workspace}/memory/search`,\n {\n query,\n limit,\n ...(teammateId !== undefined ? { agentId: teammateId } : {}),\n },\n )\n\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { items } = response.data\n if (items.length === 0) {\n stopSpinner(true, 'No memory found.')\n return\n }\n\n stopSpinner(true, `Found ${items.length} memory chunk(s)`)\n for (const item of items) {\n print(`${colors.bold}${item.rank}. pipeline=${item.pipelineId} chunk=${item.chunkIndex}${colors.reset}`)\n print(`${colors.dim}chunkId=${item.chunkId}${item.contentTruncated ? ' truncated=true' : ''}${colors.reset}`)\n print(item.content)\n print('')\n }\n },\n )\n}\n","export class MiniappDbOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MiniappDbOptionsError'\n }\n}\n\nconst NON_FILTER_QUERY_PARAMS = new Set([\n 'select',\n 'order',\n 'limit',\n 'offset',\n 'range',\n 'range-unit',\n])\n\nconst ALLOWED_MINIAPP_DB_EMAIL_DOMAINS = ['@paraflow.com', '@moxt.ai', '@kanyun.com']\n\nexport function normalizePostgrestPath(path: string): string {\n const trimmed = path.trim()\n if (!trimmed) {\n throw new MiniappDbOptionsError('Error: PostgREST path is required.')\n }\n return trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n}\n\nexport function buildMiniappDbDataPath(workspaceId: string, appId: string, postgrestPath: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/data${normalizePostgrestPath(postgrestPath)}`\n}\n\nexport function buildMiniappDbSchemaPath(workspaceId: string, appId: string): string {\n return `/workspaces/${encodeURIComponent(workspaceId)}/miniapps/${encodeURIComponent(appId)}/db/schema`\n}\n\nexport function parseJsonBody(raw: string): unknown {\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error)\n throw new MiniappDbOptionsError(`Error: --body must be valid JSON. ${detail}`)\n }\n\n if (parsed === null || (typeof parsed !== 'object' && !Array.isArray(parsed))) {\n throw new MiniappDbOptionsError('Error: --body must be a JSON object or array.')\n }\n return parsed\n}\n\nexport function hasPostgrestFilter(postgrestPath: string): boolean {\n const normalizedPath = normalizePostgrestPath(postgrestPath)\n const parsed = new URL(normalizedPath, 'https://postgrest.local')\n for (const [name] of parsed.searchParams.entries()) {\n if (!NON_FILTER_QUERY_PARAMS.has(name.toLowerCase())) {\n return true\n }\n }\n return false\n}\n\nexport function assertPostgrestFilter(postgrestPath: string, method: 'PATCH' | 'DELETE'): void {\n if (!hasPostgrestFilter(postgrestPath)) {\n throw new MiniappDbOptionsError(\n `Error: ${method.toLowerCase()} requires at least one PostgREST filter query parameter.`,\n )\n }\n}\n\nexport function formatRawResponse(text: string, pretty?: boolean): string {\n if (!pretty || !text) {\n return text\n }\n try {\n return JSON.stringify(JSON.parse(text), null, 2)\n } catch {\n return text\n }\n}\n\nexport function isAllowedMiniappDbUserEmail(email: string): boolean {\n const normalized = email.trim().toLowerCase()\n return ALLOWED_MINIAPP_DB_EMAIL_DOMAINS.some((domain) => normalized.endsWith(domain))\n}\n","import { Command } from 'commander'\nimport {\n assertPostgrestFilter,\n buildMiniappDbDataPath,\n buildMiniappDbSchemaPath,\n formatRawResponse,\n isAllowedMiniappDbUserEmail,\n MiniappDbOptionsError,\n parseJsonBody,\n} from '../utils/miniapp-db.js'\nimport { httpGet, httpRaw } from '../utils/http.js'\nimport { print, printError } from '../utils/output.js'\n\ninterface MiniappDbOptions {\n workspace: string\n appId: string\n pretty?: boolean\n body?: string\n yes?: boolean\n}\n\ninterface MiniappDbSchemaResponse {\n sql: string\n}\n\ninterface WhoamiResponse {\n email: string\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof MiniappDbOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addMiniappDbTargetOptions(command: Command): Command {\n return command\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .requiredOption('--app-id <appId>', 'Miniapp app ID')\n}\n\nfunction handleRawResponse(response: Awaited<ReturnType<typeof httpRaw>>, pretty?: boolean): void {\n if (!response.ok) {\n printError(`Error [${response.status}]: ${response.text}`)\n process.exit(1)\n }\n print(formatRawResponse(response.text, pretty))\n}\n\nasync function ensureAllowedMiniappDbUser(): Promise<void> {\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n if (!isAllowedMiniappDbUserEmail(response.data.email)) {\n printError('Error: miniapp db commands are only available to @paraflow.com, @moxt.ai, or @kanyun.com users.')\n process.exit(1)\n }\n}\n\nasync function requestDataApi(\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE',\n postgrestPath: string,\n options: MiniappDbOptions,\n body?: unknown,\n): Promise<void> {\n await ensureAllowedMiniappDbUser()\n const path = buildMiniappDbDataPath(options.workspace, options.appId, postgrestPath)\n const response = await httpRaw(method, path, body)\n handleRawResponse(response, options.pretty)\n}\n\nexport function registerMiniappCommand(program: Command): void {\n const miniapp = program.command('miniapp', { hidden: true }).description('Miniapp operations')\n const db = miniapp.command('db').description('Miniapp database operations')\n\n addMiniappDbTargetOptions(\n db.command('schema').description('Print the miniapp database schema SQL'),\n ).action(async (options: MiniappDbOptions) => {\n await ensureAllowedMiniappDbUser()\n const response = await httpGet<MiniappDbSchemaResponse>(buildMiniappDbSchemaPath(options.workspace, options.appId))\n\n if (!response.ok) {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n print(response.data.sql)\n })\n\n addMiniappDbTargetOptions(\n db.command('get')\n .description('Read miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos?select=*')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n await requestDataApi('GET', postgrestPath, options)\n })\n\n addMiniappDbTargetOptions(\n db.command('post')\n .description('Create miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path, for example /todos')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('POST', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('patch')\n .description('Update miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .requiredOption('--body <json>', 'JSON object or array request body')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'PATCH'))\n const body = runOrExit(() => parseJsonBody(options.body ?? ''))\n await requestDataApi('PATCH', postgrestPath, options, body)\n })\n\n addMiniappDbTargetOptions(\n db.command('delete')\n .description('Delete miniapp data through PostgREST')\n .argument('<path>', 'PostgREST path with a filter, for example /todos?id=eq.1')\n .option('--yes', 'Confirm the delete operation')\n .option('--pretty', 'Pretty-print JSON responses'),\n ).action(async (postgrestPath: string, options: MiniappDbOptions) => {\n if (options.yes !== true) {\n printError('Error: delete requires --yes.')\n process.exit(1)\n }\n runOrExit(() => assertPostgrestFilter(postgrestPath, 'DELETE'))\n await requestDataApi('DELETE', postgrestPath, options)\n })\n}\n","import * as fs from 'node:fs'\nimport * as os from 'node:os'\nimport * as path from 'node:path'\n\nexport interface TelemetryConfig {\n disabled?: boolean\n noticeShown?: boolean\n}\n\nfunction getConfigPath(): string {\n return path.join(os.homedir(), '.moxt', 'config.json')\n}\n\nexport function readTelemetryConfig(): TelemetryConfig {\n try {\n const raw = fs.readFileSync(getConfigPath(), 'utf8')\n const parsed = JSON.parse(raw) as { telemetry?: TelemetryConfig }\n return parsed.telemetry ?? {}\n } catch {\n return {}\n }\n}\n\nexport function writeTelemetryConfig(update: Partial<TelemetryConfig>): void {\n const configPath = getConfigPath()\n let existing: Record<string, unknown> = {}\n try {\n existing = JSON.parse(fs.readFileSync(configPath, 'utf8')) as Record<string, unknown>\n } catch {\n existing = {}\n }\n const currentTelemetry = (existing.telemetry as TelemetryConfig | undefined) ?? {}\n const next = { ...existing, telemetry: { ...currentTelemetry, ...update } }\n fs.mkdirSync(path.dirname(configPath), { recursive: true })\n fs.writeFileSync(configPath, JSON.stringify(next, null, 2))\n}\n","import { readTelemetryConfig } from './config.js'\n\nexport function isCiEnvironment(): boolean {\n return process.env.CI === 'true' || process.env.CI === '1'\n}\n\nexport function isTelemetryDisabled(): boolean {\n if (process.env.MOXT_TELEMETRY_DISABLED === '1' || process.env.MOXT_TELEMETRY_DISABLED === 'true') {\n return true\n }\n if (process.env.DO_NOT_TRACK === '1' || process.env.DO_NOT_TRACK === 'true') {\n return true\n }\n return readTelemetryConfig().disabled === true\n}\n","import { Command } from 'commander'\nimport { readTelemetryConfig, writeTelemetryConfig } from '../telemetry/config.js'\nimport { isTelemetryDisabled } from '../telemetry/opt-out.js'\nimport { print } from '../utils/output.js'\n\nexport function registerTelemetryCommand(program: Command): void {\n const telemetry = program.command('telemetry').description('Manage Moxt CLI telemetry')\n\n telemetry\n .command('status')\n .description('Show telemetry status')\n .action(() => {\n const cfg = readTelemetryConfig()\n const envOverride =\n process.env.MOXT_TELEMETRY_DISABLED === '1' ||\n process.env.MOXT_TELEMETRY_DISABLED === 'true' ||\n process.env.DO_NOT_TRACK === '1' ||\n process.env.DO_NOT_TRACK === 'true'\n\n const state = isTelemetryDisabled() ? 'disabled' : 'enabled'\n print(`telemetry: ${state}`)\n if (envOverride) {\n print('(disabled via environment variable)')\n } else if (cfg.disabled) {\n print('(disabled via config file)')\n }\n })\n\n telemetry\n .command('enable')\n .description('Enable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: false })\n print('telemetry: enabled')\n })\n\n telemetry\n .command('disable')\n .description('Disable telemetry')\n .action(() => {\n writeTelemetryConfig({ disabled: true })\n print('telemetry: disabled')\n })\n}\n","import { Command } from 'commander'\nimport { httpGet } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WhoamiResponse {\n nickname: string\n email: string\n}\n\nexport function registerWhoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n startSpinner('Fetching user info...')\n const response = await httpGet<WhoamiResponse>('/users/whoami')\n\n if (response.ok) {\n stopSpinner(true, 'Done')\n print(`${colors.bold}Nickname${colors.reset}: ${response.data.nickname}`)\n print(`${colors.bold}Email${colors.reset}: ${response.data.email}`)\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander'\nimport { httpGet, httpDelete } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\ninterface WorkspaceItem {\n workspaceId: string\n name: string\n}\n\ninterface WorkspaceListResponse {\n workspaces: WorkspaceItem[]\n}\n\ninterface MemberItem {\n userId: number\n email: string\n displayName: string | null\n role: string\n}\n\ninterface MembersResponse {\n members: MemberItem[]\n}\n\ninterface SpaceItem {\n type: 'personal' | 'team' | 'teammate'\n name: string\n teamSpaceId: string | null\n agentId: number | null\n}\n\n// Email regex (same as web/src/utils/email.ts)\nconst emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/\n\nfunction isValidEmail(email: string): boolean {\n return emailRegex.test(email)\n}\n\nexport function registerWorkspaceCommand(program: Command): void {\n const workspace = program.command('workspace').description('Workspace management')\n\n workspace\n .command('list')\n .description('List all workspaces you belong to')\n .action(async () => {\n startSpinner('Fetching workspaces...')\n const response = await httpGet<WorkspaceListResponse>('/workspaces')\n\n if (response.ok) {\n const { workspaces } = response.data\n if (workspaces.length === 0) {\n stopSpinner(true, 'No workspaces found.')\n return\n }\n\n stopSpinner(true, `Found ${workspaces.length} workspace(s)`)\n\n for (const ws of workspaces) {\n print(`${colors.bold}${ws.workspaceId}${colors.reset}\\t${ws.name}`)\n }\n } else {\n stopSpinner(false, 'Failed')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n })\n\n const members = program.command('members').description('Manage workspace members')\n\n members\n .command('list')\n .description('List all members in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching workspace members...')\n const response = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { members } = response.data\n if (members.length === 0) {\n stopSpinner(true, 'No members found.')\n return\n }\n\n stopSpinner(true, `Found ${members.length} member(s)`)\n\n for (const member of members) {\n const name = member.displayName || '-'\n print(`${colors.bold}${member.email}${colors.reset}\\t${name}\\t${member.role}`)\n }\n })\n\n members\n .command('remove')\n .description('Remove members from a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .argument('<emails>', 'Emails to remove (comma-separated)')\n .action(async (emailsArg: string, options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n const emails = emailsArg.split(',').map((e) => e.trim()).filter(Boolean)\n if (emails.length === 0) {\n printError('No valid emails provided')\n process.exit(1)\n }\n\n // Validate email format\n const invalidEmails = emails.filter((e) => !isValidEmail(e))\n if (invalidEmails.length > 0) {\n for (const email of invalidEmails) {\n printError(`Invalid email format: ${email}`)\n }\n process.exit(1)\n }\n\n // Fetch members to get userId by email\n startSpinner('Fetching workspace members...')\n const membersResponse = await httpGet<MembersResponse>(`/workspaces/${workspaceId}/members`)\n\n if (!membersResponse.ok) {\n stopSpinner(false, 'Failed to fetch members')\n printError(`Error [${membersResponse.status}]: ${JSON.stringify(membersResponse.data)}`)\n process.exit(1)\n }\n\n stopSpinner(true, 'Members fetched')\n\n const { members } = membersResponse.data\n const emailToMember = new Map(members.map((m) => [m.email.toLowerCase(), m]))\n\n // Remove each member\n for (const email of emails) {\n const member = emailToMember.get(email.toLowerCase())\n if (!member) {\n print(`${colors.red}✗${colors.reset} ${email} - not found in workspace`)\n continue\n }\n\n const deleteResponse = await httpDelete(`/workspaces/${workspaceId}/members/${member.userId}`)\n\n if (deleteResponse.ok) {\n print(`${colors.green}✓${colors.reset} ${email} - removed`)\n } else {\n print(`${colors.red}✗${colors.reset} ${email} - failed: ${JSON.stringify(deleteResponse.data)}`)\n }\n }\n })\n\n const space = program.command('space').description('Manage spaces')\n\n space\n .command('list')\n .description('List accessible spaces in a workspace')\n .requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n .action(async (options: { workspace: string }) => {\n const { workspace: workspaceId } = options\n\n startSpinner('Fetching spaces...')\n const response = await httpGet<{ spaces: SpaceItem[] }>(`/workspaces/${workspaceId}/spaces`)\n\n if (!response.ok) {\n stopSpinner(false, 'Failed to fetch spaces')\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n }\n\n const { spaces } = response.data\n if (spaces.length === 0) {\n stopSpinner(true, 'No spaces found.')\n return\n }\n\n stopSpinner(true, `Found ${spaces.length} space(s)`)\n\n print(\n `${colors.bold}TYPE${colors.reset}\\t${colors.bold}TEAM_SPACE_ID${colors.reset}\\t${colors.bold}TEAMMATE_ID${colors.reset}\\t${colors.bold}NAME${colors.reset}`,\n )\n for (const s of spaces) {\n const teamSpaceId = s.teamSpaceId ?? ''\n const teammateId = s.agentId != null ? String(s.agentId) : ''\n print(`${s.type}\\t${teamSpaceId}\\t${teammateId}\\t${s.name}`)\n }\n })\n\n}\n","import * as fs from 'node:fs'\nimport { TextDecoder } from 'node:util'\nimport { Command } from 'commander'\nimport {\n isBinaryContent,\n resolveSpaceSelector,\n SpaceOptions,\n SpaceOptionsError,\n} from '../utils/file-selector.js'\nimport { httpDelete, httpGet, httpPatch, httpPost } from '../utils/http.js'\nimport { colors, print, printError } from '../utils/output.js'\nimport { parseSearchLimit, SearchOptionsError } from '../utils/search-options.js'\nimport { startSpinner, stopSpinner } from '../utils/spinner.js'\n\nconst MAX_DESC_LENGTH = 5000\nconst MAX_COMMENT_CONTENT_LENGTH = 5000\nconst MAX_COMMENT_CONTENT_BYTES = MAX_COMMENT_CONTENT_LENGTH * 4\n\ntype WorkflowStatusTypeValue = 1 | 2 | 3\ntype WorkflowTaskPriorityValue = 0 | 1 | 2 | 3\n\ninterface WorkflowItem {\n fileId: string\n ownerHumanId: number | null\n desc: string | null\n}\n\ninterface WorkflowListResponse {\n workflows: WorkflowItem[]\n}\n\ninterface WorkflowDetailResponse extends WorkflowItem {\n statusList: WorkflowStatusItem[]\n transitions: WorkflowTransitionItem[]\n}\n\ninterface WorkflowStatusItem {\n scopedId: number\n name: string\n desc: string | null\n type: WorkflowStatusTypeValue\n preferredAssignee: AssigneeInfo | null\n order: number\n}\n\ninterface WorkflowTransitionItem {\n statusFromScopedId: number\n statusToScopedId: number\n}\n\ninterface WorkflowTaskItem {\n scopedId: number\n workflowFileId: string\n ownerHumanId: number | null\n title: string\n desc: string | null\n statusScopedId: number\n priority: WorkflowTaskPriorityValue\n assignee: AssigneeInfo | null\n linkedFileIds: string[]\n subscribed: boolean\n runningAgentRuns: Array<{\n pipelineId: string\n executor: AssigneeInfo | null\n }>\n createdAt: string\n latestActAt: string\n}\n\ninterface WorkflowTaskListResponse {\n tasks: WorkflowTaskItem[]\n nextCursor: string | null\n}\n\ninterface WorkflowTaskCreateResponse {\n taskScopedId: number\n}\n\ninterface WorkflowPipelineStatusItem {\n workflowPipelineTriggerId: number\n pipelineStatus: string\n}\n\ninterface WorkflowCommentItem {\n id: number\n workflowFileId: string\n workflowTaskScopedId: number\n content: string\n createdBy: AssigneeInfo | null\n createdAt: string\n updatedAt: string\n}\n\ninterface WorkflowCommentListResponse {\n items: WorkflowCommentItem[]\n}\n\ntype AssigneeInfo =\n | { type: 'human'; humanId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'assistant'; aiAssistantId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'teammate'; aiTeammateId: number; displayName: string | null; avatarUrl: string | null }\n | { type: 'unknown'; humanId: number | null; aiAssistantId: number | null; aiTeammateId: number | null }\n\ninterface WorkflowSpaceOptions extends SpaceOptions {\n path: string\n descFile?: string\n ownerHumanId?: string\n}\n\ninterface AssigneeOptions {\n humanId?: string\n assistantId?: string\n teammateId?: string\n clear?: boolean\n}\n\ninterface PreferredAssigneeOptions {\n preferredHumanId?: string\n preferredAssistantId?: string\n preferredTeammateId?: string\n clearPreferredAssignee?: boolean\n}\n\nclass WorkflowOptionsError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkflowOptionsError'\n }\n}\n\nfunction runOrExit<T>(fn: () => T): T {\n try {\n return fn()\n } catch (err) {\n if (err instanceof WorkflowOptionsError || err instanceof SpaceOptionsError || err instanceof SearchOptionsError) {\n printError(err.message)\n process.exit(1)\n }\n throw err\n }\n}\n\nfunction addWorkspaceOption(command: Command): Command {\n return command.requiredOption('-w, --workspace <workspaceId>', 'Workspace ID')\n}\n\nfunction addSpaceOptions(command: Command): Command {\n return addWorkspaceOption(command)\n .option('-s, --space <name>', 'Space name (personal or teamspace name)')\n .option('--personal', 'Use personal space (default)')\n .option('--team-space-id <teamSpaceId>', 'Team space ID')\n .option('--teammate-id <teammateId>', 'Teammate ID (teammate space)')\n}\n\nfunction addAssigneeOptions(command: Command): Command {\n return command\n .option('--human-id <humanId>', 'Human assignee ID')\n .option('--assistant-id <assistantId>', 'AI assistant assignee ID')\n .option('--teammate-id <teammateId>', 'AI teammate assignee ID')\n}\n\nfunction addPreferredAssigneeOptions(command: Command): Command {\n return command\n .option('--preferred-human-id <humanId>', 'Preferred human assignee ID')\n .option('--preferred-assistant-id <assistantId>', 'Preferred AI assistant assignee ID')\n .option('--preferred-teammate-id <teammateId>', 'Preferred AI teammate assignee ID')\n}\n\nfunction parsePositiveInteger(raw: string, label: string): number {\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isInteger(parsed) || parsed <= 0 || String(parsed) !== raw) {\n throw new WorkflowOptionsError(`Error: ${label} must be a positive integer, got \"${raw}\".`)\n }\n return parsed\n}\n\nfunction parseOptionalPositiveInteger(raw: string | undefined, label: string): number | undefined {\n if (raw == null || raw === '') return undefined\n return parsePositiveInteger(raw, label)\n}\n\nfunction parseStatusType(raw: string | undefined): WorkflowStatusTypeValue | undefined {\n if (raw == null || raw === '') return undefined\n const parsed = Number.parseInt(raw, 10)\n if ((parsed === 1 || parsed === 2 || parsed === 3) && String(parsed) === raw) return parsed\n throw new WorkflowOptionsError('Error: --type must be one of 1 (todo), 2 (in-progress), or 3 (done).')\n}\n\nfunction parseRequiredStatusType(raw: string | undefined): WorkflowStatusTypeValue {\n const value = parseStatusType(raw)\n if (value === undefined) {\n throw new WorkflowOptionsError('Error: --type is required.')\n }\n return value\n}\n\nfunction parsePriority(raw: string | undefined): WorkflowTaskPriorityValue | undefined {\n if (raw == null || raw === '') return undefined\n if (raw === 'urgent') return 0\n if (raw === 'high') return 1\n if (raw === 'medium') return 2\n if (raw === 'low') return 3\n throw new WorkflowOptionsError('Error: --priority must be \"urgent\", \"high\", \"medium\", or \"low\".')\n}\n\nfunction parseRequiredPriority(raw: string | undefined): WorkflowTaskPriorityValue {\n return parsePriority(raw ?? 'medium') ?? 2\n}\n\nfunction parseWorkflowScope(raw: string | undefined): 'all' | 'owner_is_me' {\n if (raw == null || raw === '') return 'all'\n if (raw === 'all' || raw === 'owner_is_me') return raw\n throw new WorkflowOptionsError('Error: --scope must be \"all\" or \"owner_is_me\".')\n}\n\nfunction parseTaskScope(raw: string | undefined): 'all' | 'assigned_to_me' | 'subscribed_by_me' | 'owner_is_me' {\n if (raw == null || raw === '') return 'all'\n if (raw === 'all' || raw === 'assigned_to_me' || raw === 'subscribed_by_me' || raw === 'owner_is_me') {\n return raw\n }\n throw new WorkflowOptionsError(\n 'Error: --scope must be \"all\", \"assigned_to_me\", \"subscribed_by_me\", or \"owner_is_me\".',\n )\n}\n\nfunction parseFileIds(raw: string | undefined, label = '--file-ids'): string[] | undefined {\n if (raw == null || raw === '') return undefined\n const ids = raw.split(',').map((item) => item.trim()).filter(Boolean)\n if (ids.length === 0) {\n throw new WorkflowOptionsError(`Error: ${label} must include at least one file ID.`)\n }\n return ids\n}\n\nfunction readDescFile(path: string | undefined): string | undefined {\n if (path == null || path === '') return undefined\n if (!fs.existsSync(path)) {\n throw new WorkflowOptionsError(`Error: desc file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new WorkflowOptionsError(`Error: desc file is not a file: ${path}`)\n }\n const buffer = fs.readFileSync(path)\n if (isBinaryContent(buffer)) {\n throw new WorkflowOptionsError('Error: desc file must be UTF-8 text, not binary content.')\n }\n const content = buffer.toString('utf8')\n if (content.length > MAX_DESC_LENGTH) {\n throw new WorkflowOptionsError(`Error: desc file must be at most ${MAX_DESC_LENGTH} characters.`)\n }\n return content\n}\n\nfunction readCommentContentFile(path: string): string {\n if (!fs.existsSync(path)) {\n throw new WorkflowOptionsError(`Error: comment content file not found: ${path}`)\n }\n const stat = fs.statSync(path)\n if (!stat.isFile()) {\n throw new WorkflowOptionsError(`Error: comment content path is not a file: ${path}`)\n }\n if (stat.size > MAX_COMMENT_CONTENT_BYTES) {\n throw new WorkflowOptionsError(\n `Error: comment content file must be at most ${MAX_COMMENT_CONTENT_LENGTH} characters.`,\n )\n }\n const buffer = fs.readFileSync(path)\n if (buffer.includes(0)) {\n throw new WorkflowOptionsError('Error: comment content file must not contain NUL bytes.')\n }\n if (isBinaryContent(buffer)) {\n throw new WorkflowOptionsError('Error: comment content file must be UTF-8 text, not binary content.')\n }\n let content: string\n try {\n content = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(buffer)\n } catch {\n throw new WorkflowOptionsError('Error: comment content file must contain valid UTF-8 text.')\n }\n if (content.length === 0) {\n throw new WorkflowOptionsError('Error: comment content file must not be empty.')\n }\n if (content.length > MAX_COMMENT_CONTENT_LENGTH) {\n throw new WorkflowOptionsError(\n `Error: comment content file must be at most ${MAX_COMMENT_CONTENT_LENGTH} characters.`,\n )\n }\n return content\n}\n\nfunction parseAssigneeBody(options: AssigneeOptions, allowClear: boolean): Record<string, number | null> {\n const hasClear = options.clear === true\n const humanId = parseOptionalPositiveInteger(options.humanId, '--human-id')\n const assistantId = parseOptionalPositiveInteger(options.assistantId, '--assistant-id')\n const teammateId = parseOptionalPositiveInteger(options.teammateId, '--teammate-id')\n const count =\n (humanId !== undefined ? 1 : 0) + (assistantId !== undefined ? 1 : 0) + (teammateId !== undefined ? 1 : 0)\n if (hasClear && !allowClear) {\n throw new WorkflowOptionsError('Error: --clear is not supported here.')\n }\n if (hasClear && count > 0) {\n throw new WorkflowOptionsError('Error: --clear cannot be used with assignee ID options.')\n }\n if (count > 1) {\n throw new WorkflowOptionsError('Error: assignee ID options are mutually exclusive.')\n }\n if (hasClear) return {}\n if (humanId !== undefined) return { assigneeHumanId: humanId }\n if (assistantId !== undefined) return { assigneeAiAssistantId: assistantId }\n if (teammateId !== undefined) return { assigneeAiTeammateId: teammateId }\n return {}\n}\n\nfunction parsePreferredAssigneeBody(options: PreferredAssigneeOptions): Record<string, number | null> {\n const hasClear = options.clearPreferredAssignee === true\n const humanId = parseOptionalPositiveInteger(options.preferredHumanId, '--preferred-human-id')\n const assistantId = parseOptionalPositiveInteger(options.preferredAssistantId, '--preferred-assistant-id')\n const teammateId = parseOptionalPositiveInteger(options.preferredTeammateId, '--preferred-teammate-id')\n const count =\n (humanId !== undefined ? 1 : 0) + (assistantId !== undefined ? 1 : 0) + (teammateId !== undefined ? 1 : 0)\n if (hasClear && count > 0) {\n throw new WorkflowOptionsError('Error: --clear-preferred-assignee cannot be used with preferred assignee ID options.')\n }\n if (count > 1) {\n throw new WorkflowOptionsError('Error: preferred assignee ID options are mutually exclusive.')\n }\n if (hasClear) return { preferredAssigneeHumanId: null }\n if (humanId !== undefined) return { preferredAssigneeHumanId: humanId }\n if (assistantId !== undefined) return { preferredAssigneeAiAssistantId: assistantId }\n if (teammateId !== undefined) return { preferredAssigneeAiTeammateId: teammateId }\n return {}\n}\n\nfunction assertNonEmptyBody(body: Record<string, unknown>): void {\n if (Object.keys(body).length === 0) {\n throw new WorkflowOptionsError('Error: at least one update option must be provided.')\n }\n}\n\nfunction buildQuery(params: Record<string, string | number | undefined>): string {\n const query = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n query.set(key, String(value))\n }\n }\n const text = query.toString()\n return text ? `?${text}` : ''\n}\n\nfunction failResponse(response: { status: number; data: unknown }): never {\n printError(`Error [${response.status}]: ${JSON.stringify(response.data)}`)\n process.exit(1)\n}\n\nfunction priorityLabel(value: WorkflowTaskPriorityValue): string {\n switch (value) {\n case 0: return 'urgent'\n case 1: return 'high'\n case 2: return 'medium'\n case 3: return 'low'\n default: {\n const unsupportedValue: never = value\n throw new Error(`Unsupported workflow task priority: ${String(unsupportedValue)}`)\n }\n }\n}\n\nfunction statusTypeLabel(value: WorkflowStatusTypeValue): string {\n switch (value) {\n case 1: return 'todo'\n case 2: return 'in-progress'\n case 3: return 'done'\n default: {\n const unsupportedValue: never = value\n throw new Error(`Unsupported workflow status type: ${String(unsupportedValue)}`)\n }\n }\n}\n\nfunction formatAssignee(assignee: AssigneeInfo | null): string {\n if (!assignee) return '-'\n if (assignee.type === 'human') return assignee.displayName ?? `human:${assignee.humanId}`\n if (assignee.type === 'assistant') return assignee.displayName ?? `assistant:${assignee.aiAssistantId}`\n if (assignee.type === 'teammate') return assignee.displayName ?? `teammate:${assignee.aiTeammateId}`\n return 'unknown'\n}\n\nfunction printWorkflow(item: WorkflowItem): void {\n print(`${colors.bold}${item.fileId}${colors.reset}\\towner=${item.ownerHumanId ?? '-'}\\tdesc=${item.desc ?? '-'}`)\n}\n\ntype DetailScalar = string | number | boolean | null\n\nfunction indentation(size: number): string {\n return ' '.repeat(size)\n}\n\nfunction escapeTerminalControlCharacters(value: string): string {\n return value\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F]/g, (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n )\n}\n\nfunction formatDetailScalar(value: DetailScalar): string {\n if (value === null) return 'null'\n if (typeof value === 'string') {\n const escaped = escapeTerminalControlCharacters(value)\n if (escaped === '') return '\"\"'\n if (/\\n/.test(escaped)) return JSON.stringify(escaped)\n return escaped\n }\n return String(value)\n}\n\nfunction printDetailField(name: string, value: DetailScalar, indent = 0): void {\n print(`${indentation(indent)}${name}: ${formatDetailScalar(value)}`)\n}\n\nfunction printDetailTextField(name: string, value: string | null, indent = 0): void {\n if (value === null || value === '') {\n printDetailField(name, value, indent)\n return\n }\n\n const escaped = escapeTerminalControlCharacters(value)\n print(`${indentation(indent)}${name}:`)\n for (const line of escaped.split('\\n')) {\n print(`${indentation(indent + 2)}${line}`)\n }\n}\n\nfunction printAssigneeDetail(name: string, assignee: AssigneeInfo | null, indent = 0): void {\n if (assignee === null) {\n printDetailField(name, null, indent)\n return\n }\n\n print(`${indentation(indent)}${name}:`)\n printDetailField('type', assignee.type, indent + 2)\n switch (assignee.type) {\n case 'human':\n printDetailField('humanId', assignee.humanId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'assistant':\n printDetailField('aiAssistantId', assignee.aiAssistantId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'teammate':\n printDetailField('aiTeammateId', assignee.aiTeammateId, indent + 2)\n printDetailField('displayName', assignee.displayName, indent + 2)\n printDetailField('avatarUrl', assignee.avatarUrl, indent + 2)\n return\n case 'unknown':\n printDetailField('humanId', assignee.humanId, indent + 2)\n printDetailField('aiAssistantId', assignee.aiAssistantId, indent + 2)\n printDetailField('aiTeammateId', assignee.aiTeammateId, indent + 2)\n }\n}\n\nfunction printStatusRemainingFields(item: WorkflowStatusItem, indent: number): void {\n printDetailField('name', item.name, indent)\n printDetailTextField('desc', item.desc, indent)\n printDetailField('type', `${item.type} (${statusTypeLabel(item.type)})`, indent)\n printAssigneeDetail('preferredAssignee', item.preferredAssignee, indent)\n printDetailField('order', item.order, indent)\n}\n\nfunction printStatusDetail(item: WorkflowStatusItem): void {\n print(`${colors.bold}Status${colors.reset}`)\n printDetailField('scopedId', item.scopedId)\n printStatusRemainingFields(item, 0)\n}\n\nfunction printWorkflowDetail(item: WorkflowDetailResponse): void {\n print(`${colors.bold}Workflow${colors.reset}`)\n printDetailField('fileId', item.fileId)\n printDetailField('ownerHumanId', item.ownerHumanId)\n printDetailTextField('desc', item.desc)\n\n if (item.statusList.length === 0) {\n print('statusList: []')\n } else {\n print('statusList:')\n for (const status of item.statusList) {\n print(` - scopedId: ${status.scopedId}`)\n printStatusRemainingFields(status, 4)\n }\n }\n\n if (item.transitions.length === 0) {\n print('transitions: []')\n } else {\n print('transitions:')\n for (const transition of item.transitions) {\n print(` - statusFromScopedId: ${transition.statusFromScopedId}`)\n printDetailField('statusToScopedId', transition.statusToScopedId, 4)\n }\n }\n}\n\nfunction printTaskSummary(item: WorkflowTaskItem): void {\n const runIds = item.runningAgentRuns.map((run) => run.pipelineId).join(',') || '-'\n print(\n `${colors.bold}#${item.scopedId}${colors.reset}\\t${item.title}\\tstatus=${item.statusScopedId}\\tpriority=${priorityLabel(item.priority)}\\tassignee=${formatAssignee(item.assignee)}\\truns=${runIds}`,\n )\n}\n\nfunction printTaskDetail(item: WorkflowTaskItem): void {\n print(`${colors.bold}Task${colors.reset}`)\n printDetailField('scopedId', item.scopedId)\n printDetailField('workflowFileId', item.workflowFileId)\n printDetailField('ownerHumanId', item.ownerHumanId)\n printDetailField('title', item.title)\n printDetailTextField('desc', item.desc)\n printDetailField('statusScopedId', item.statusScopedId)\n printDetailField('priority', `${item.priority} (${priorityLabel(item.priority)})`)\n printAssigneeDetail('assignee', item.assignee)\n\n if (item.linkedFileIds.length === 0) {\n print('linkedFileIds: []')\n } else {\n print('linkedFileIds:')\n for (const fileId of item.linkedFileIds) print(` - ${fileId}`)\n }\n\n printDetailField('subscribed', item.subscribed)\n if (item.runningAgentRuns.length === 0) {\n print('runningAgentRuns: []')\n } else {\n print('runningAgentRuns:')\n for (const run of item.runningAgentRuns) {\n print(` - pipelineId: ${run.pipelineId}`)\n printAssigneeDetail('executor', run.executor, 4)\n }\n }\n printDetailField('createdAt', item.createdAt)\n printDetailField('latestActAt', item.latestActAt)\n}\n\nfunction printCommentDetail(item: WorkflowCommentItem): void {\n print(`${colors.bold}Comment${colors.reset}`)\n printDetailField('id', item.id)\n printDetailField('workflowFileId', item.workflowFileId)\n printDetailField('workflowTaskScopedId', item.workflowTaskScopedId)\n printDetailTextField('content', item.content)\n printAssigneeDetail('createdBy', item.createdBy)\n printDetailField('createdAt', item.createdAt)\n printDetailField('updatedAt', item.updatedAt)\n}\n\nexport function registerWorkflowCommand(program: Command): void {\n const workflow = program.command('workflow').description('Workflow operations')\n\n addWorkspaceOption(\n workflow.command('list')\n .description('List accessible workflows')\n .option('--scope <scope>', 'Workflow scope: all or owner_is_me', 'all'),\n ).action(async (options: { workspace: string; scope?: string }) => {\n const scope = runOrExit(() => parseWorkflowScope(options.scope))\n\n startSpinner('Fetching workflows...')\n const response = await httpGet<WorkflowListResponse>(\n `/workspaces/${options.workspace}/workflows${buildQuery({ scope })}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.workflows.length === 0) {\n stopSpinner(true, 'No workflows found.')\n return\n }\n stopSpinner(true, `Found ${response.data.workflows.length} workflow(s)`)\n for (const item of response.data.workflows) printWorkflow(item)\n })\n\n addSpaceOptions(\n workflow.command('create')\n .description('Create a blank workflow')\n .requiredOption('-p, --path <path>', 'Target .workflow path')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for workflow description')\n .option('--owner-human-id <humanId>', 'Workflow owner human ID'),\n ).action(async (options: WorkflowSpaceOptions) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n path: options.path,\n ...resolveSpaceSelector(options),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n return next\n })\n\n startSpinner('Creating workflow...')\n const response = await httpPost<WorkflowItem>(`/workspaces/${options.workspace}/workflows`, body)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow created')\n printWorkflow(response.data)\n })\n\n addWorkspaceOption(workflow.command('get').description('Get a workflow').argument('<workflowFileId>')).action(\n async (workflowFileId: string, options: { workspace: string }) => {\n startSpinner('Fetching workflow...')\n const response = await httpGet<WorkflowDetailResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow fetched')\n printWorkflowDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n workflow.command('update')\n .description('Update workflow metadata')\n .argument('<workflowFileId>')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for workflow description')\n .option('--owner-human-id <humanId>', 'Workflow owner human ID'),\n ).action(async (workflowFileId: string, options: { workspace: string; descFile?: string; ownerHumanId?: string }) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {}\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n assertNonEmptyBody(next)\n return next\n })\n\n startSpinner('Updating workflow...')\n const response = await httpPatch<WorkflowItem>(`/workspaces/${options.workspace}/workflows/${workflowFileId}`, body)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow updated')\n printWorkflow(response.data)\n })\n\n addWorkspaceOption(\n workflow.command('delete')\n .description('Delete a workflow')\n .argument('<workflowFileId>')\n .option('--message <message>', 'Commit message'),\n ).action(async (workflowFileId: string, options: { workspace: string; message?: string }) => {\n startSpinner('Deleting workflow...')\n const response = await httpDelete<{ fileId: string }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}`,\n options.message ? { message: options.message } : {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.fileId}`)\n })\n\n addWorkspaceOption(workflow.command('duplicate').description('Duplicate a workflow').argument('<workflowFileId>')).action(\n async (workflowFileId: string, options: { workspace: string }) => {\n startSpinner('Duplicating workflow...')\n const response = await httpPost<WorkflowItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/duplicate`,\n {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Workflow duplicated')\n printWorkflow(response.data)\n },\n )\n\n registerStatusCommands(workflow)\n registerTransitionCommands(workflow)\n registerTaskCommands(workflow)\n registerCommentCommands(workflow)\n registerRunCommands(workflow)\n}\n\nfunction registerStatusCommands(workflow: Command): void {\n const status = workflow.command('status').description('Workflow status operations')\n\n addPreferredAssigneeOptions(\n addWorkspaceOption(\n status.command('create')\n .description('Create a workflow status')\n .argument('<workflowFileId>')\n .requiredOption('--name <name>', 'Status name')\n .requiredOption('--type <type>', 'Status type value: 1=todo, 2=in-progress, 3=done')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for status description'),\n ),\n ).action(\n async (\n workflowFileId: string,\n options: { workspace: string; name: string; type?: string; descFile?: string } & PreferredAssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n name: options.name,\n type: parseRequiredStatusType(options.type),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n Object.assign(next, parsePreferredAssigneeBody(options))\n return next\n })\n startSpinner('Creating status...')\n const response = await httpPost<WorkflowStatusItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status created')\n printStatusDetail(response.data)\n },\n )\n\n addPreferredAssigneeOptions(\n addWorkspaceOption(\n status.command('update')\n .description('Update a workflow status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>')\n .option('--name <name>', 'Status name')\n .option('--type <type>', 'Status type value: 1=todo, 2=in-progress, 3=done')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for status description')\n .option('--clear-desc', 'Clear status description')\n .option('--clear-preferred-assignee', 'Clear preferred assignee'),\n ),\n ).action(\n async (\n workflowFileId: string,\n statusScopedId: string,\n options: {\n workspace: string\n name?: string\n type?: string\n descFile?: string\n clearDesc?: boolean\n } & PreferredAssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n if (options.descFile && options.clearDesc) {\n throw new WorkflowOptionsError('Error: --desc-file cannot be used with --clear-desc.')\n }\n const next: Record<string, unknown> = {}\n if (options.name) next.name = options.name\n const type = parseStatusType(options.type)\n if (type !== undefined) next.type = type\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n if (options.clearDesc) next.desc = null\n Object.assign(next, parsePreferredAssigneeBody(options))\n assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(statusScopedId, 'statusScopedId'))\n startSpinner('Updating status...')\n const response = await httpPatch<WorkflowStatusItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status updated')\n printStatusDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n status.command('move-after')\n .description('Move a workflow status after another status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>')\n .option('--after <statusScopedId>', 'Anchor status scoped ID')\n .option('--first', 'Move to first position'),\n ).action(\n async (\n workflowFileId: string,\n statusScopedId: string,\n options: { workspace: string; after?: string; first?: boolean },\n ) => {\n const { id, anchoredStatusScopedId } = runOrExit(() => {\n if (options.after && options.first) {\n throw new WorkflowOptionsError('Error: --after cannot be used with --first.')\n }\n if (!options.after && !options.first) {\n throw new WorkflowOptionsError('Error: either --after or --first is required.')\n }\n return {\n id: parsePositiveInteger(statusScopedId, 'statusScopedId'),\n anchoredStatusScopedId: options.first ? null : parsePositiveInteger(options.after!, '--after'),\n }\n })\n startSpinner('Moving status...')\n const response = await httpPost<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}/move-after`,\n { anchoredStatusScopedId },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Status moved')\n },\n )\n\n addWorkspaceOption(\n status.command('delete')\n .description('Delete a workflow status')\n .argument('<workflowFileId>')\n .argument('<statusScopedId>'),\n ).action(async (workflowFileId: string, statusScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(statusScopedId, 'statusScopedId'))\n startSpinner('Deleting status...')\n const response = await httpDelete<{ scopedId: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/statuses/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.scopedId}`)\n })\n}\n\nfunction registerTransitionCommands(workflow: Command): void {\n const transition = workflow.command('transition').description('Workflow transition operations')\n\n for (const action of ['create', 'delete'] as const) {\n addWorkspaceOption(\n transition.command(action)\n .description(`${action === 'create' ? 'Create' : 'Delete'} a workflow transition`)\n .argument('<workflowFileId>')\n .requiredOption('--from <statusScopedId>', 'Source status scoped ID')\n .requiredOption('--to <statusScopedId>', 'Target status scoped ID'),\n ).action(async (workflowFileId: string, options: { workspace: string; from: string; to: string }) => {\n const body = runOrExit(() => ({\n statusFromScopedId: parsePositiveInteger(options.from, '--from'),\n statusToScopedId: parsePositiveInteger(options.to, '--to'),\n }))\n startSpinner(`${action === 'create' ? 'Creating' : 'Deleting'} transition...`)\n const response =\n action === 'create'\n ? await httpPost<WorkflowTransitionItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/transitions`,\n body,\n )\n : await httpDelete<WorkflowTransitionItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/transitions`,\n body,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, action === 'create' ? 'Transition created' : 'Transition deleted')\n print(`${response.data.statusFromScopedId} -> ${response.data.statusToScopedId}`)\n })\n }\n}\n\nfunction registerTaskCommands(workflow: Command): void {\n const task = workflow.command('task').description('Workflow task operations')\n\n addWorkspaceOption(\n task.command('list')\n .description('List workflow tasks')\n .option('--workflow-file-id <workflowFileId>', 'Filter by workflow file ID')\n .option('--scope <scope>', 'Task scope', 'all')\n .option('-l, --limit <limit>', 'Maximum number of tasks to return', '20')\n .option('--cursor <cursor>', 'Pagination cursor'),\n ).action(\n async (options: { workspace: string; workflowFileId?: string; scope?: string; limit?: string; cursor?: string }) => {\n const query = runOrExit(() => buildQuery({\n scope: parseTaskScope(options.scope),\n limit: parseSearchLimit(options.limit, 20, 100),\n cursor: options.cursor,\n workflowFileId: options.workflowFileId,\n }))\n startSpinner('Fetching workflow tasks...')\n const response = await httpGet<WorkflowTaskListResponse>(`/workspaces/${options.workspace}/workflow-tasks-v2${query}`)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.tasks.length === 0) {\n stopSpinner(true, 'No workflow tasks found.')\n return\n }\n stopSpinner(true, `Found ${response.data.tasks.length} task(s)`)\n for (const item of response.data.tasks) printTaskSummary(item)\n if (response.data.nextCursor) print(`${colors.dim}nextCursor=${response.data.nextCursor}${colors.reset}`)\n },\n )\n\n addWorkspaceOption(\n task.command('get')\n .description('Get a workflow task')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Fetching task...')\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task fetched')\n printTaskDetail(response.data)\n })\n\n addAssigneeOptions(\n addWorkspaceOption(\n task.command('create')\n .description('Create a workflow task')\n .argument('<workflowFileId>')\n .requiredOption('--title <title>', 'Task title')\n .requiredOption('--status <statusScopedId>', 'Status scoped ID')\n .option('--priority <priority>', 'Priority: urgent, high, medium, or low', 'medium')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for task description')\n .option('--owner-human-id <humanId>', 'Task owner human ID')\n ),\n ).action(\n async (\n workflowFileId: string,\n options: {\n workspace: string\n title: string\n status: string\n priority?: string\n descFile?: string\n ownerHumanId?: string\n } & AssigneeOptions,\n ) => {\n const body = runOrExit(() => {\n const next: Record<string, unknown> = {\n title: options.title,\n statusScopedId: parsePositiveInteger(options.status, '--status'),\n priority: parseRequiredPriority(options.priority),\n }\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n Object.assign(next, parseAssigneeBody(options, false))\n return next\n })\n startSpinner('Creating task...')\n const createResponse = await httpPost<WorkflowTaskCreateResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2`,\n body,\n )\n if (!createResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(createResponse)\n }\n const response = await getWorkflowTask(\n options.workspace,\n workflowFileId,\n createResponse.data.taskScopedId,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task created')\n printTaskDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n task.command('update')\n .description('Update workflow task metadata')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .option('--title <title>', 'Task title')\n .option('--priority <priority>', 'Priority: urgent, high, medium, or low')\n .option('--desc-file <localPath>', 'Local UTF-8 text file for task description')\n .option('--clear-desc', 'Clear task description')\n .option('--owner-human-id <humanId>', 'Task owner human ID')\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: {\n workspace: string\n title?: string\n priority?: string\n descFile?: string\n clearDesc?: boolean\n ownerHumanId?: string\n },\n ) => {\n const body = runOrExit(() => {\n if (options.descFile && options.clearDesc) {\n throw new WorkflowOptionsError('Error: --desc-file cannot be used with --clear-desc.')\n }\n const next: Record<string, unknown> = {}\n if (options.title) next.title = options.title\n const priority = parsePriority(options.priority)\n if (priority !== undefined) next.priority = priority\n const desc = readDescFile(options.descFile)\n if (desc !== undefined) next.desc = desc\n if (options.clearDesc) next.desc = null\n const ownerHumanId = parseOptionalPositiveInteger(options.ownerHumanId, '--owner-human-id')\n if (ownerHumanId !== undefined) next.ownerHumanId = ownerHumanId\n assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Updating task...')\n const updateResponse = await httpPatch<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/metadata`,\n body,\n )\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task updated')\n printTaskDetail(response.data)\n },\n )\n\n for (const action of ['add-linked-files', 'remove-linked-files'] as const) {\n addWorkspaceOption(\n task.command(action)\n .description(`${action === 'add-linked-files' ? 'Add' : 'Remove'} linked files on a workflow task`)\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--file-ids <ids>', 'Comma-separated file IDs'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: { workspace: string; fileIds: string },\n ) => {\n const { id, fileIds } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n fileIds: parseFileIds(options.fileIds, '--file-ids')!,\n }))\n startSpinner(action === 'add-linked-files' ? 'Adding linked files...' : 'Removing linked files...')\n const path = `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/linked-files`\n const updateResponse =\n action === 'add-linked-files'\n ? await httpPost<void>(path, { fileIds })\n : await httpDelete<void>(path, { fileIds })\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, action === 'add-linked-files' ? 'Linked files added' : 'Linked files removed')\n printTaskDetail(response.data)\n },\n )\n }\n\n addWorkspaceOption(\n task.command('move')\n .description('Move a workflow task to another status')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--status <statusScopedId>', 'Target status scoped ID'),\n ).action(\n async (workflowFileId: string, taskScopedId: string, options: { workspace: string; status: string }) => {\n const { id, statusScopedId } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n statusScopedId: parsePositiveInteger(options.status, '--status'),\n }))\n startSpinner('Moving task...')\n const updateResponse = await httpPatch<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/status`,\n { statusScopedId },\n )\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task moved')\n printTaskDetail(response.data)\n },\n )\n\n addAssigneeOptions(\n addWorkspaceOption(\n task.command('assign')\n .description('Update workflow task assignee')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .option('--clear', 'Clear assignee'),\n ),\n ).action(\n async (workflowFileId: string, taskScopedId: string, options: { workspace: string } & AssigneeOptions) => {\n const body = runOrExit(() => {\n const next = parseAssigneeBody(options, true)\n if (Object.keys(next).length === 0 && options.clear !== true) assertNonEmptyBody(next)\n return next\n })\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Updating task assignee...')\n const updateResponse = await httpPatch<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks-v2/${id}/assignee`,\n body,\n )\n if (!updateResponse.ok) {\n stopSpinner(false, 'Failed')\n failResponse(updateResponse)\n }\n const response = await getWorkflowTask(options.workspace, workflowFileId, id)\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Task assignee updated')\n printTaskDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n task.command('delete')\n .description('Delete a workflow task')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Deleting task...')\n const response = await httpDelete<{ scopedId: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.scopedId}`)\n })\n}\n\nfunction getWorkflowTask(workspaceId: string, workflowFileId: string, taskScopedId: number) {\n return httpGet<WorkflowTaskItem>(\n `/workspaces/${workspaceId}/workflows/${workflowFileId}/tasks-v2/${taskScopedId}`,\n )\n}\n\nfunction registerCommentCommands(workflow: Command): void {\n const comment = workflow.command('comment').description('Workflow task comment operations')\n\n addWorkspaceOption(\n comment.command('create')\n .description('Create a workflow task comment')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .requiredOption('--content-path <localPath>', 'Local UTF-8 text file for comment content'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n options: { workspace: string; contentPath: string },\n ) => {\n const { id, content } = runOrExit(() => ({\n id: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n content: readCommentContentFile(options.contentPath),\n }))\n startSpinner('Creating comment...')\n const response = await httpPost<WorkflowCommentItem>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/comments`,\n { content },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, 'Comment created')\n printCommentDetail(response.data)\n },\n )\n\n addWorkspaceOption(\n comment.command('list')\n .description('List workflow task comments')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>'),\n ).action(async (workflowFileId: string, taskScopedId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(taskScopedId, 'taskScopedId'))\n startSpinner('Fetching comments...')\n const response = await httpGet<WorkflowCommentListResponse>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${id}/comments`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n if (response.data.items.length === 0) {\n stopSpinner(true, 'No comments found.')\n return\n }\n stopSpinner(true, `Found ${response.data.items.length} comment(s)`)\n response.data.items.forEach((item, index) => {\n if (index > 0) print('')\n printCommentDetail(item)\n })\n })\n\n addWorkspaceOption(\n comment.command('delete')\n .description('Delete a workflow task comment')\n .argument('<workflowFileId>')\n .argument('<taskScopedId>')\n .argument('<commentId>'),\n ).action(\n async (\n workflowFileId: string,\n taskScopedId: string,\n commentId: string,\n options: { workspace: string },\n ) => {\n const ids = runOrExit(() => ({\n task: parsePositiveInteger(taskScopedId, 'taskScopedId'),\n comment: parsePositiveInteger(commentId, 'commentId'),\n }))\n startSpinner('Deleting comment...')\n const response = await httpDelete<{ id: number }>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/tasks/${ids.task}/comments/${ids.comment}`,\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Deleted: ${response.data.id}`)\n },\n )\n}\n\nfunction registerRunCommands(workflow: Command): void {\n const run = workflow.command('run').description('Workflow agent run operations')\n\n addWorkspaceOption(\n run.command('status')\n .description('Get workflow agent run statuses')\n .argument('<workflowFileId>')\n .argument('<triggerIds...>'),\n ).action(async (workflowFileId: string, triggerIds: string[], options: { workspace: string }) => {\n const workflowPipelineTriggerIds = runOrExit(() =>\n triggerIds.map((triggerId) => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId')),\n )\n startSpinner('Fetching run statuses...')\n const response = await httpPost<WorkflowPipelineStatusItem[]>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/triggers/statuses`,\n { workflowPipelineTriggerIds },\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Found ${response.data.length} run status item(s)`)\n for (const item of response.data) {\n print(`${colors.bold}${item.workflowPipelineTriggerId}${colors.reset}\\t${item.pipelineStatus}`)\n }\n })\n\n addWorkspaceOption(\n run.command('abort')\n .description('Abort a workflow agent run')\n .argument('<workflowFileId>')\n .argument('<triggerId>'),\n ).action(async (workflowFileId: string, triggerId: string, options: { workspace: string }) => {\n const id = runOrExit(() => parsePositiveInteger(triggerId, 'workflowPipelineTriggerId'))\n startSpinner('Aborting run...')\n const response = await httpPost<void>(\n `/workspaces/${options.workspace}/workflows/${workflowFileId}/pipeline/trigger/${id}/abort`,\n {},\n )\n if (!response.ok) {\n stopSpinner(false, 'Failed')\n failResponse(response)\n }\n stopSpinner(true, `Abort accepted: ${id}`)\n })\n}\n","import { arch, platform } from 'node:os'\nimport { getApiBaseUrl, getApiKeyOrUndefined } from '../utils/config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\ndeclare const __CLI_VERSION__: string\n\nexport type MetricType = 'counter' | 'gauge' | 'histogram'\n\nexport interface MetricRecord {\n metric_id: string\n metric_type: MetricType\n value: number\n extra_label_name_2_value?: Record<string, string>\n}\n\nconst buffer: MetricRecord[] = []\nconst FLUSH_TIMEOUT_MS = 3000\nconst MAX_BATCH_SIZE = 100\n\nfunction commonLabels(): Record<string, string> {\n return {\n cli_version: __CLI_VERSION__,\n node_version: process.versions.node,\n os: platform(),\n arch: arch(),\n is_ci: isCiEnvironment() ? 'true' : 'false',\n }\n}\n\nexport function record(metric: MetricRecord): void {\n if (isTelemetryDisabled()) {\n debugLog(`record: disabled, dropping ${metric.metric_id}`)\n return\n }\n if (!getApiKeyOrUndefined()) {\n debugLog(`record: no API key, dropping ${metric.metric_id}`)\n return\n }\n buffer.push({\n ...metric,\n extra_label_name_2_value: {\n ...commonLabels(),\n ...(metric.extra_label_name_2_value ?? {}),\n },\n })\n debugLog(`record: buffered ${metric.metric_id} (buffer=${buffer.length})`)\n}\n\nfunction isDebug(): boolean {\n return process.env.MOXT_TELEMETRY_DEBUG === '1' || process.env.MOXT_TELEMETRY_DEBUG === 'true'\n}\n\nfunction debugLog(msg: string, detail?: unknown): void {\n if (!isDebug()) return\n process.stderr.write(`[telemetry] ${msg}${detail !== undefined ? ` ${JSON.stringify(detail)}` : ''}\\n`)\n}\n\nexport async function flush(): Promise<void> {\n if (buffer.length === 0) {\n debugLog('flush: buffer empty, skipping')\n return\n }\n const apiKey = getApiKeyOrUndefined()\n if (!apiKey) {\n debugLog('flush: no API key, dropping buffer')\n buffer.length = 0\n return\n }\n\n const batch = buffer.splice(0, MAX_BATCH_SIZE)\n const payload = {\n release_id: __CLI_VERSION__,\n client_type: 'cli',\n metric_data_list: batch.map((m) => ({\n profile: 'cli',\n metric_id: m.metric_id,\n metric_type: m.metric_type,\n value: m.value,\n extra_label_name_2_value: m.extra_label_name_2_value,\n })),\n }\n\n const url = `${getApiBaseUrl()}/cli-metrics`\n debugLog(`flush: POST ${url} with ${batch.length} metrics`, payload)\n\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => {\n controller.abort()\n }, FLUSH_TIMEOUT_MS)\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n debugLog(`flush: response status=${res.status}`)\n } finally {\n clearTimeout(timeout)\n }\n } catch (err) {\n debugLog('flush: failed', err instanceof Error ? err.message : String(err))\n // fire-and-forget — never surface telemetry failures to the user\n }\n}\n","import { readTelemetryConfig, writeTelemetryConfig } from './config.js'\nimport { isCiEnvironment, isTelemetryDisabled } from './opt-out.js'\n\nconst NOTICE = [\n '',\n 'Attention: Moxt CLI now collects anonymous telemetry regarding usage.',\n \"This information is used to shape Moxt CLI's roadmap and prioritize features.\",\n '',\n 'You may opt out by setting MOXT_TELEMETRY_DISABLED=1 in your env',\n 'or by running `moxt telemetry disable`.',\n 'Details: https://www.npmjs.com/package/@moxt-ai/cli#telemetry',\n '',\n]\n\nexport function maybeShowTelemetryNotice(): void {\n if (isTelemetryDisabled()) return\n if (isCiEnvironment()) return\n if (readTelemetryConfig().noticeShown) return\n\n for (const line of NOTICE) {\n process.stderr.write(`${line}\\n`)\n }\n\n try {\n writeTelemetryConfig({ noticeShown: true })\n } catch {\n // persistence failure is not user-visible — we'll just show the notice again next run\n }\n}\n","import type { Command } from 'commander'\nimport { flush, record } from './client.js'\nimport { maybeShowTelemetryNotice } from './notice.js'\n\ninterface RunningCommand {\n name: string\n subcommand?: string\n startedAt: number\n}\n\nlet current: RunningCommand | null = null\n\nfunction commandPath(cmd: Command): { command: string; subcommand?: string } {\n const names: string[] = []\n let node: Command | null = cmd\n while (node && node.parent) {\n names.unshift(node.name())\n node = node.parent\n }\n if (names.length === 0) return { command: 'unknown' }\n if (names.length === 1) return { command: names[0] }\n return { command: names[0], subcommand: names.slice(1).join(' ') }\n}\n\nexport function instrumentProgram(program: Command): void {\n program.hook('preAction', (_thisCommand, actionCommand) => {\n const { command, subcommand } = commandPath(actionCommand)\n if (command !== 'telemetry') {\n maybeShowTelemetryNotice()\n }\n current = { name: command, subcommand, startedAt: Date.now() }\n record({\n metric_id: 'client.cli.command_invocation.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command,\n ...(subcommand ? { subcommand } : {}),\n status: 'started',\n },\n })\n })\n\n program.hook('postAction', async () => {\n await reportOutcome('success')\n })\n}\n\nasync function reportOutcome(status: 'success' | 'error', errorCode?: string): Promise<void> {\n if (!current) return\n const { name, subcommand, startedAt } = current\n const durationSeconds = (Date.now() - startedAt) / 1000\n\n record({\n metric_id: 'client.cli.command_duration_seconds',\n metric_type: 'histogram',\n value: durationSeconds,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n status,\n },\n })\n\n if (status === 'error') {\n record({\n metric_id: 'client.cli.command_error.count',\n metric_type: 'counter',\n value: 1,\n extra_label_name_2_value: {\n command: name,\n ...(subcommand ? { subcommand } : {}),\n ...(errorCode ? { error_code: errorCode } : {}),\n },\n })\n }\n\n current = null\n await flush()\n}\n\n/**\n * Wire a final error/exit hook. Call before program.parseAsync so we can capture\n * failures routed through process.exit or unhandled rejections.\n *\n * Best-effort only: `reportOutcome` is fire-and-forget, and the subsequent\n * `process.exit(1)` terminates the process before `flush()` can complete — so\n * the error metric recorded here will typically be dropped. Reliable crash\n * reporting belongs to Sentry/APM, not this telemetry path.\n */\nexport function installExitHandler(): void {\n const handleError = (errorCode: string): void => {\n void reportOutcome('error', errorCode)\n }\n\n process.on('uncaughtException', () => {\n handleError('uncaught_exception')\n process.exit(1)\n })\n process.on('unhandledRejection', () => {\n handleError('unhandled_rejection')\n process.exit(1)\n })\n}\n"],"mappings":"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","names":["fs","path","buffer","path","path","buffer","runOrExit","program","runOrExit","path","buffer","program","runOrExit","path","runOrExit","path","program","fs","program","program","program","members","fs","TextDecoder","runOrExit","addSpaceOptions","path","buffer","readCommentContentFile","TextDecoder","indentation","escapeTerminalControlCharacters","formatDetailScalar","printDetailField","printDetailTextField","program","program","arch","platform","platform","arch","program"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moxt-ai/cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Moxt - The Agent-Native Workspace",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",