@alphalawyer/alpha-classic-cli 0.1.1 → 0.1.2
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 +13 -0
- package/dist/index.js +36 -12
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/auth/login.ts","../src/util/base-url.ts","../src/config/environments.ts","../src/util/errors.ts","../src/http/api-client.ts","../src/util/jwt.ts","../src/output/envelope.ts","../src/commands/api.ts","../src/commands/appro.ts","../src/commands/capabilities.ts","../src/install/install.ts","../src/install/templates.ts","../src/commands/doctor.ts","../src/commands/env.ts","../src/commands/matter.ts","../src/commands/version.ts","../src/session/store.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\n\nimport { Command } from \"commander\";\n\nimport {\n createLoginDeviceAuthorization,\n pollLoginDeviceAuthorization,\n runLogin,\n} from \"./auth/login.js\";\nimport { runApiCommand } from \"./commands/api.js\";\nimport { runApproDetail, runApproInitiators, runApproList } from \"./commands/appro.js\";\nimport { runCapabilities } from \"./commands/capabilities.js\";\nimport { runDoctor } from \"./commands/doctor.js\";\nimport { runEnvCommand } from \"./commands/env.js\";\nimport {\n runMatterDetail,\n runMatterSearch,\n runMatterTaskDetail,\n runMatterTaskList,\n} from \"./commands/matter.js\";\nimport { runVersion } from \"./commands/version.js\";\nimport {\n installAgentGuides,\n type AgentInstallTarget,\n uninstallAgentGuides,\n} from \"./install/install.js\";\nimport { printError, printSuccess } from \"./output/envelope.js\";\nimport { SessionStore } from \"./session/store.js\";\n\nconst require = createRequire(import.meta.url);\nconst packageJson = require(\"../package.json\") as {\n name?: string;\n version?: string;\n};\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid number: ${value}`);\n }\n return parsed;\n}\n\nasync function main(): Promise<void> {\n const sessionStore = new SessionStore();\n const program = new Command();\n\n program\n .name(\"alpha-classic-cli\")\n .description(\"Alpha Classic AI-friendly CLI for Alpha web app\")\n .version(packageJson.version ?? \"0.0.0\");\n\n program\n .command(\"install\")\n .description(\"Install agent guides for Codex, Claude Code, Alpha-claw, or all supported agents\")\n .option(\"--agent <agent>\", \"Agent target: codex, claude, alphaclaw, all\", \"codex\")\n .action(async (options: { agent?: string }) => {\n const agent = parseAgentInstallTarget(options.agent);\n const result = await installAgentGuides({ agent });\n printSuccess(result);\n });\n\n program\n .command(\"uninstall\")\n .description(\"Uninstall agent guides for Codex, Claude Code, Alpha-claw, or all supported agents\")\n .option(\"--agent <agent>\", \"Agent target: codex, claude, alphaclaw, all\", \"codex\")\n .action(async (options: { agent?: string }) => {\n const agent = parseAgentInstallTarget(options.agent);\n const result = await uninstallAgentGuides({ agent });\n printSuccess(result);\n });\n\n program\n .command(\"capabilities\")\n .description(\"Print machine-readable CLI capabilities for agents\")\n .action(() => {\n runCapabilities(packageJson.version ?? \"0.0.0\");\n });\n\n program\n .command(\"version\")\n .description(\"Print machine-readable CLI version\")\n .action(() => {\n runVersion({\n name: packageJson.name ?? \"alpha-classic-cli\",\n version: packageJson.version ?? \"0.0.0\",\n });\n });\n\n program\n .command(\"login\")\n .description(\"Start Alpha CLI device authorization login\")\n .option(\"--token <token>\", \"Debug fallback token\")\n .option(\"--user-id <id>\", \"Current user id\")\n .option(\"--office-id <id>\", \"Current office id\")\n .option(\"--name <name>\", \"Current user name\")\n .option(\"--no-wait\", \"Create device authorization and print JSON only\")\n .option(\"--json\", \"Print final result as JSON envelope\")\n .option(\"--device-code <deviceCode>\", \"Poll an existing device code\")\n .option(\"--timeout-ms <ms>\", \"Device authorization wait timeout\", parseInteger)\n .option(\"--no-open-browser\", \"Do not open browser when token is missing\")\n .action(\n async (options: {\n token?: string;\n userId?: string;\n officeId?: string;\n name?: string;\n noWait?: boolean;\n wait?: boolean;\n json?: boolean;\n deviceCode?: string;\n timeoutMs?: number;\n openBrowser?: boolean;\n }) => {\n const progress = (message: string) => {\n console.error(message);\n };\n if (options.noWait || options.wait === false) {\n const result = await createLoginDeviceAuthorization(\n {\n timeoutMs: options.timeoutMs,\n onProgress: progress,\n },\n sessionStore,\n );\n printSuccess({\n verification_url: result.auth.verificationUriComplete,\n verification_uri: result.auth.verificationUri,\n user_code: result.auth.userCode,\n device_code: result.auth.deviceCode,\n expires_in: result.auth.expiresIn,\n interval: result.auth.interval,\n hint: `请将 verification_url 原样交给用户打开确认;确认后执行:alpha-classic-cli login --device-code ${result.auth.deviceCode}`,\n });\n return;\n }\n\n const session = options.deviceCode\n ? await pollLoginDeviceAuthorization(\n {\n timeoutMs: options.timeoutMs,\n onProgress: progress,\n },\n sessionStore,\n options.deviceCode,\n )\n : await runLogin(\n {\n token: options.token,\n userId: options.userId,\n officeId: options.officeId,\n name: options.name,\n timeoutMs: options.timeoutMs,\n openBrowser: options.openBrowser,\n onProgress: progress,\n },\n sessionStore,\n );\n printSuccess({\n event: \"login_success\",\n userId: session.userId,\n userName: session.userName ?? session.name,\n officeId: session.officeId,\n officeName: session.officeName,\n deviceType: session.deviceType ?? \"ai\",\n updatedAt: session.updatedAt,\n });\n },\n );\n\n program\n .command(\"logout\")\n .description(\"Clear local session and identity cache\")\n .action(async () => {\n await sessionStore.clearAuthState();\n printSuccess({ session: \"cleared\", identityCache: \"cleared\" });\n });\n\n program\n .command(\"doctor\")\n .description(\"Inspect config, session, skill install, and API health\")\n .action(async () => {\n await runDoctor(sessionStore);\n });\n\n program\n .command(\"env\")\n .description(\"Inspect the build-time environment\")\n .argument(\"[action]\", \"Action: list, current\")\n .argument(\"[name]\", \"Environment name for list/current only\")\n .action(async (action: string | undefined, name: string | undefined) => {\n await runEnvCommand(action, name, sessionStore);\n });\n\n program\n .command(\"api\")\n .description(\"Call a raw API endpoint\")\n .argument(\"<method>\", \"HTTP method\")\n .argument(\"<path>\", \"API path\")\n .option(\"--params <json>\", \"Query params JSON object\")\n .option(\"--data <json>\", \"Request body JSON\")\n .action(\n async (\n method: string,\n apiPath: string,\n options: { params?: string; data?: string },\n ) => {\n await runApiCommand(method, apiPath, options, sessionStore);\n },\n );\n\n const matter = program\n .command(\"matter\")\n .alias(\"project\")\n .description(\"Matter/project commands\");\n matter\n .command(\"search\")\n .description(\"Search matters by keyword\")\n .option(\"--keyword <keyword>\", \"Matter keyword\")\n .option(\"--status <status>\", \"Matter status: 预立项, 进行中, 进行中+预立项, 已完结, 已搁置, 已归档, 全部\")\n .option(\"--scope <scope>\", \"Matter scope: 所有项目, 我关注的, 已加入的\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .action(async (options: { keyword?: string; status?: string; scope?: string; limit?: number; page?: number }) => {\n await runMatterSearch(options, sessionStore);\n });\n matter\n .command(\"detail\")\n .description(\"Show matter overview details\")\n .requiredOption(\"--id <matterId>\", \"Matter id\")\n .option(\"--logs <number>\", \"Recent dynamic count, 0 to skip\", parseInteger)\n .action(async (options: { id: string; logs?: number }) => {\n await runMatterDetail(options, sessionStore);\n });\n matter\n .command(\"task\")\n .description(\"List tasks for a matter/project\")\n .requiredOption(\"--id <matterId>\", \"Matter id\")\n .option(\"--state <state>\", \"Task state: all, 未完成, 已完成\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--type <type>\", \"Task type: task or group\")\n .option(\"--attention <type>\", \"Attention filter: all, 我关注的\")\n .action(\n async (options: {\n id: string;\n state?: string;\n page?: number;\n limit?: number;\n type?: string;\n attention?: string;\n }) => {\n await runMatterTaskList(\n {\n matterId: options.id,\n state: options.state,\n page: options.page,\n limit: options.limit,\n type: options.type,\n attention: options.attention,\n },\n sessionStore,\n );\n },\n );\n matter\n .command(\"task-detail\")\n .description(\"Show task details for a matter/project task\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .option(\"--comments <number>\", \"Recent task dynamic/comment count, 0 to skip\", parseInteger)\n .action(async (options: { id: string; comments?: number }) => {\n await runMatterTaskDetail(\n {\n id: options.id,\n comments: options.comments,\n },\n sessionStore,\n );\n });\n\n const appro = program.command(\"appro\").description(\"Approval commands\");\n appro\n .command(\"list\")\n .description(\"List approvals\")\n .option(\n \"--scope <scope>\",\n \"Approval scope: my, started, cc, all, 我审批的, 我发起的, 抄送我的, 全部审批\",\n \"my\",\n )\n .option(\"--keyword <keyword>\", \"Approval keyword\")\n .option(\"--status <status>\", \"Approval status code, Chinese status name, or all\")\n .option(\"--appro-type <ids>\", \"Approval type ids, comma-separated\")\n .option(\"--starter-id <id>\", \"Approval starter user id\")\n .option(\"--starter-name <name>\", \"Approval starter name; resolved through appro initiators\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--count-only\", \"Only print the matched approval count\")\n .action(\n async (options: {\n scope?: string;\n keyword?: string;\n status?: string;\n approType?: string;\n starterId?: string;\n starterName?: string;\n limit?: number;\n page?: number;\n countOnly?: boolean;\n }) => {\n await runApproList(options, sessionStore);\n },\n );\n appro\n .command(\"initiators\")\n .description(\"List approval initiators\")\n .option(\"--keyword <keyword>\", \"Initiator name keyword\")\n .option(\"--include-left\", \"Include inactive/left users\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: { keyword?: string; includeLeft?: boolean; limit?: number }) => {\n await runApproInitiators(options, sessionStore);\n },\n );\n appro\n .command(\"detail\")\n .description(\"Show approval details\")\n .requiredOption(\"--id <approId>\", \"Approval id\")\n .option(\"--comments <number>\", \"Recent comment count, 0 to skip\", parseInteger)\n .action(async (options: { id: string; comments?: number }) => {\n await runApproDetail(options, sessionStore);\n });\n\n await program.parseAsync(process.argv);\n}\n\nfunction parseAgentInstallTarget(value: string | undefined): AgentInstallTarget {\n const target = (value ?? \"codex\").trim().toLowerCase();\n if (target === \"codex\" || target === \"claude\" || target === \"alphaclaw\" || target === \"all\") {\n return target;\n }\n throw new Error(`Invalid agent target: ${value}. Supported: codex, claude, alphaclaw, all`);\n}\n\nmain().catch((error) => {\n printError(\"runtime\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n","import { createRequire } from \"node:module\";\nimport os from \"node:os\";\n\nimport open from \"open\";\n\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { ApiClient } from \"../http/api-client.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport type { CliDeviceAuthCreateVO, UserLoginVO } from \"../types.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\nimport { ApiError } from \"../util/errors.js\";\nimport { decodeAlphaJwtClaims } from \"../util/jwt.js\";\n\ninterface CurrentUserResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: CurrentUserData;\n}\n\ninterface CurrentUserData {\n accid?: string;\n id?: string;\n user_id?: string;\n name?: string;\n userName?: string;\n office_id?: string;\n officeId?: string;\n officeName?: string;\n}\n\ninterface QrCodeTerminal {\n generate: (\n value: string,\n options: { small?: boolean },\n callback: (qrcode: string) => void,\n ) => void;\n}\n\nexport interface LoginOptions {\n token?: string;\n userId?: string;\n officeId?: string;\n name?: string;\n timeoutMs?: number;\n apiClient?: ApiClient;\n openBrowser?: boolean | ((url: string) => Promise<void> | void);\n onProgress?: (message: string) => void;\n}\n\nexport interface LoginDeviceAuthorizationResult {\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n auth: CliDeviceAuthCreateVO;\n}\n\nconst CLIENT_NAME = \"alpha-classic-cli\";\nconst DEVICE_TYPE_AI = \"ai\";\nconst DEFAULT_LOGIN_TIMEOUT_MS = 300_000;\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst PENDING_AUTHORIZATION_MESSAGE_PREFIX = \"授权尚未确认\";\nconst require = createRequire(import.meta.url);\nconst qrCodeTerminal = require(\"qrcode-terminal\") as QrCodeTerminal;\n\nexport async function createLoginDeviceAuthorization(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<LoginDeviceAuthorizationResult> {\n const context = await resolveLoginContext(options, sessionStore);\n emitProgress(options.onProgress, \"login: creating CLI device authorization\");\n const auth = await context.apiClient.createCliDeviceAuth(context.baseUrl, {\n client: CLIENT_NAME,\n deviceName: buildDeviceName(),\n });\n await sessionStore.saveConfig({\n environment: context.environment.name,\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n timeoutMs: context.timeoutMs,\n });\n return {\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n timeoutMs: context.timeoutMs,\n auth,\n };\n}\n\nexport async function pollLoginDeviceAuthorization(\n options: LoginOptions,\n sessionStore: SessionStore,\n deviceCode: string,\n): Promise<SessionRecord> {\n const context = await resolveLoginContext(options, sessionStore);\n const auth: CliDeviceAuthCreateVO = {\n deviceCode,\n verificationUriComplete: \"\",\n };\n emitProgress(options.onProgress, \"login: waiting for browser authorization\");\n const loginVO = await waitForDeviceAuthorization(\n context.apiClient,\n context.baseUrl,\n auth,\n context.timeoutMs,\n options.onProgress,\n );\n return saveLoginSession(context, loginVO, sessionStore, options);\n}\n\nexport async function runLogin(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<SessionRecord> {\n if (options.token) {\n return runTokenLogin(options, sessionStore);\n }\n\n const context = await resolveLoginContext(options, sessionStore);\n const authResult = await createLoginDeviceAuthorization(\n {\n ...options,\n apiClient: context.apiClient,\n timeoutMs: context.timeoutMs,\n },\n sessionStore,\n );\n emitDeviceAuthorizationPrompt(authResult.auth, options.onProgress);\n\n if (options.openBrowser !== false) {\n const openBrowser =\n typeof options.openBrowser === \"function\"\n ? options.openBrowser\n : async (url: string) => {\n await open(url, { wait: false });\n };\n try {\n await openBrowser(authResult.auth.verificationUriComplete);\n } catch {\n emitProgress(\n options.onProgress,\n `login: failed to open browser automatically, please open ${authResult.auth.verificationUriComplete}`,\n );\n }\n }\n\n emitProgress(options.onProgress, \"login: waiting for browser authorization\");\n const loginVO = await waitForDeviceAuthorization(\n context.apiClient,\n context.baseUrl,\n authResult.auth,\n context.timeoutMs,\n options.onProgress,\n );\n emitProgress(options.onProgress, \"login: browser authorization completed\");\n return saveLoginSession(context, loginVO, sessionStore, options);\n}\n\nasync function runTokenLogin(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<SessionRecord> {\n if (!options.token) {\n throw new Error(\"Missing token.\");\n }\n const environment = getDefaultEnvironmentPreset();\n const currentUser = await verifyToken(environment.apiBaseUrl, options.token);\n const currentUserData = getCurrentUserData(currentUser);\n const userId = options.userId ?? currentUserData?.accid ?? currentUserData?.id ?? currentUserData?.user_id;\n const userName =\n options.name ?? currentUserData?.name ?? currentUserData?.userName;\n const officeId = options.officeId ?? currentUserData?.office_id ?? currentUserData?.officeId;\n const officeName = currentUserData?.officeName;\n const session: SessionRecord = {\n token: options.token,\n baseUrl: environment.baseUrl,\n apiBaseUrl: environment.apiBaseUrl,\n deviceType: DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n ...(userId ? { userId } : {}),\n ...(userName ? { name: userName, userName } : {}),\n ...(officeId ? { officeId } : {}),\n ...(officeName ? { officeName } : {}),\n };\n\n await sessionStore.saveConfig({\n environment: environment.name,\n baseUrl: environment.baseUrl,\n apiBaseUrl: environment.apiBaseUrl,\n ...(officeId ? { defaultOfficeId: officeId } : {}),\n });\n await sessionStore.saveSession(session);\n return session;\n}\n\nasync function resolveLoginContext(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<{\n environment: ReturnType<typeof getDefaultEnvironmentPreset>;\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n apiClient: ApiClient;\n}> {\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const baseUrl = normalizeBaseUrl(config.baseUrl ?? environment.baseUrl);\n const apiBaseUrl = normalizeBaseUrl(config.apiBaseUrl ?? environment.apiBaseUrl);\n const timeoutMs = options.timeoutMs ?? config.timeoutMs ?? DEFAULT_LOGIN_TIMEOUT_MS;\n const apiClient =\n options.apiClient ??\n new ApiClient({\n sessionStore,\n apiBaseUrl,\n timeoutMs,\n });\n return {\n environment,\n baseUrl,\n apiBaseUrl,\n timeoutMs,\n apiClient,\n };\n}\n\nasync function waitForDeviceAuthorization(\n apiClient: ApiClient,\n baseUrl: string,\n auth: CliDeviceAuthCreateVO,\n timeoutMs: number,\n reporter: ((message: string) => void) | undefined,\n): Promise<UserLoginVO> {\n const deadline = resolveDeadline(auth, timeoutMs);\n const intervalMs = resolvePollIntervalMs(auth);\n while (Date.now() <= deadline) {\n try {\n return await apiClient.pollCliDeviceAuth(baseUrl, auth.deviceCode);\n } catch (error) {\n if (!isPendingAuthorization(error)) {\n throw error;\n }\n emitProgress(reporter, \"login: authorization is still pending\");\n }\n await sleep(Math.min(intervalMs, Math.max(0, deadline - Date.now())));\n }\n throw new Error(\"Timed out waiting for Alpha device authorization.\");\n}\n\nasync function saveLoginSession(\n context: {\n environment: ReturnType<typeof getDefaultEnvironmentPreset>;\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n },\n loginVO: UserLoginVO,\n sessionStore: SessionStore,\n options: LoginOptions,\n): Promise<SessionRecord> {\n const tokenDto = loginVO.jwtTokenDTO;\n if (!tokenDto?.token) {\n throw new Error(\"Device authorization succeeded but token payload is incomplete.\");\n }\n const jwtClaims = decodeAlphaJwtClaims(tokenDto.token);\n const userInfo = loginVO.userDTO ?? loginVO.userVO ?? loginVO;\n const userName = userInfo.name ?? userInfo.userName ?? jwtClaims?.user_name;\n const userId = userInfo.id ?? jwtClaims?.user_id;\n const officeId = userInfo.officeId ?? userInfo.office_id ?? loginVO.officeId ?? jwtClaims?.office_id;\n const officeName = userInfo.officeName ?? loginVO.officeName ?? jwtClaims?.office_name;\n const session: SessionRecord = {\n token: tokenDto.token,\n ...(tokenDto.refreshToken ? { refreshToken: tokenDto.refreshToken } : {}),\n ...(tokenDto.tokenExpireTime !== undefined || jwtClaims?.exp !== undefined\n ? { tokenExpireTime: tokenDto.tokenExpireTime ?? jwtClaims?.exp }\n : {}),\n ...(tokenDto.refreshTokenExpireTime !== undefined\n ? { refreshTokenExpireTime: tokenDto.refreshTokenExpireTime }\n : {}),\n ...(userId ? { userId } : {}),\n ...(userName ? { userName, name: userName } : {}),\n ...(officeId ? { officeId } : {}),\n ...(officeName ? { officeName } : {}),\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n deviceType: DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n };\n\n emitProgress(options.onProgress, \"login: saving local config and session\");\n await sessionStore.saveConfig({\n environment: context.environment.name,\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n timeoutMs: context.timeoutMs,\n ...(officeId ? { defaultOfficeId: officeId } : {}),\n });\n await sessionStore.saveSession(session);\n emitProgress(options.onProgress, \"login: local session saved\");\n return session;\n}\n\nfunction getCurrentUserData(response: CurrentUserResponse | CurrentUserData): CurrentUserData | undefined {\n return \"data\" in response && response.data ? response.data : response as CurrentUserData;\n}\n\nasync function verifyToken(apiBaseUrl: string, token: string): Promise<CurrentUserResponse> {\n const url = new URL(\"/im/v1/users/me\", apiBaseUrl);\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n token,\n deviceType: DEVICE_TYPE_AI,\n },\n });\n\n const text = await response.text();\n const body = text ? parseJson(text) : {};\n if (!response.ok) {\n throw new Error(`Login verification failed: ${response.status} ${response.statusText}`);\n }\n\n const currentUser = body as CurrentUserResponse;\n if (currentUser.isSuccess === false) {\n throw new Error(currentUser.resultMsg ?? \"Login verification failed.\");\n }\n return currentUser;\n}\n\nfunction emitDeviceAuthorizationPrompt(\n auth: CliDeviceAuthCreateVO,\n reporter: ((message: string) => void) | undefined,\n): void {\n emitProgress(reporter, `login: user code ${auth.userCode ?? \"(not provided)\"}`);\n const qrcode = buildTerminalQrCode(auth.verificationUriComplete);\n if (qrcode) {\n emitProgress(reporter, \"login: scan this QR code to authorize\");\n emitRawProgress(reporter, `\\n${qrcode}\\n`);\n }\n emitProgress(reporter, `login: open ${auth.verificationUriComplete}`);\n}\n\nfunction emitProgress(\n reporter: ((message: string) => void) | undefined,\n message: string,\n): void {\n reporter?.(`[${new Date().toLocaleTimeString(\"zh-CN\", { hour12: false })}] ${message}`);\n}\n\nfunction emitRawProgress(\n reporter: ((message: string) => void) | undefined,\n message: string,\n): void {\n reporter?.(message);\n}\n\nfunction buildTerminalQrCode(value: string): string {\n let rendered = \"\";\n qrCodeTerminal.generate(value, { small: true }, (qrcode) => {\n rendered = qrcode;\n });\n return rendered;\n}\n\nfunction buildDeviceName(): string {\n return `${os.hostname()} (${process.platform} ${process.arch})`;\n}\n\nfunction isPendingAuthorization(error: unknown): boolean {\n return (\n error instanceof ApiError &&\n error.message.startsWith(PENDING_AUTHORIZATION_MESSAGE_PREFIX)\n );\n}\n\nfunction resolveDeadline(auth: CliDeviceAuthCreateVO, timeoutMs: number): number {\n const serverExpireMs =\n typeof auth.expiresIn === \"number\" && auth.expiresIn > 0\n ? auth.expiresIn * 1000\n : timeoutMs;\n return Date.now() + Math.min(timeoutMs, serverExpireMs);\n}\n\nfunction resolvePollIntervalMs(auth: CliDeviceAuthCreateVO): number {\n if (typeof auth.interval !== \"number\" || auth.interval <= 0) {\n return DEFAULT_POLL_INTERVAL_MS;\n }\n return Math.max(1_000, auth.interval * 1000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","export function normalizeBaseUrl(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(\"Base URL is required.\");\n }\n return trimmed.replace(/\\/+$/, \"\");\n}\n","import { normalizeBaseUrl } from \"../util/base-url.js\";\n\nexport type EnvironmentName = \"local\" | \"dev\" | \"test\" | \"prod\";\n\ndeclare const __ALPHA_CLASSIC_CLI_ENV__: string | undefined;\n\nexport interface EnvironmentPreset {\n name: EnvironmentName;\n label: string;\n baseUrl: string;\n apiBaseUrl: string;\n}\n\nexport const DEFAULT_ENVIRONMENT_NAME: EnvironmentName = \"dev\";\n\n// Environment presets are intentionally compiled into the CLI. Runtime switching is\n// disabled so a built binary cannot accidentally point at another Alpha environment.\nconst PRESETS: Record<EnvironmentName, Omit<EnvironmentPreset, \"name\">> = {\n local: {\n label: \"Local development\",\n baseUrl: \"http://localhost:3000\",\n apiBaseUrl: \"http://localhost:8080\",\n },\n dev: {\n label: \"Development\",\n baseUrl: \"https://dev.alphalawyer.cn\",\n apiBaseUrl: \"https://dev.alphalawyer.cn\",\n },\n test: {\n label: \"Testing\",\n baseUrl: \"https://test.alphalawyer.cn\",\n apiBaseUrl: \"https://test.alphalawyer.cn\",\n },\n prod: {\n label: \"Production\",\n baseUrl: \"https://alphalawyer.cn\",\n apiBaseUrl: \"https://alphalawyer.cn\",\n },\n};\n\nexport const BUILD_ENVIRONMENT_NAME = resolveBuildEnvironmentName();\n\nexport function listEnvironmentPresets(): EnvironmentPreset[] {\n return (Object.keys(PRESETS) as EnvironmentName[]).map((name) =>\n normalizePreset(name, PRESETS[name]),\n );\n}\n\nexport function getEnvironmentPreset(name: string | undefined): EnvironmentPreset | undefined {\n if (!name) {\n return undefined;\n }\n const normalized = name.trim().toLowerCase() as EnvironmentName;\n const preset = PRESETS[normalized];\n return preset ? normalizePreset(normalized, preset) : undefined;\n}\n\nexport function getEnvironmentPresetOrThrow(name: string): EnvironmentPreset {\n const preset = getEnvironmentPreset(name);\n if (!preset) {\n throw new Error(\n `Unknown environment: ${name}. Supported: ${listEnvironmentPresets()\n .map((item) => item.name)\n .join(\", \")}`,\n );\n }\n return preset;\n}\n\nexport function getDefaultEnvironmentPreset(): EnvironmentPreset {\n return getEnvironmentPresetOrThrow(BUILD_ENVIRONMENT_NAME);\n}\n\nfunction normalizePreset(\n name: EnvironmentName,\n preset: Omit<EnvironmentPreset, \"name\">,\n): EnvironmentPreset {\n return {\n name,\n label: preset.label,\n baseUrl: normalizeBaseUrl(preset.baseUrl),\n apiBaseUrl: normalizeBaseUrl(preset.apiBaseUrl),\n };\n}\n\nfunction resolveBuildEnvironmentName(): EnvironmentName {\n // tsup replaces __ALPHA_CLASSIC_CLI_ENV__ during build. Falling back to dev keeps local\n // source runs predictable while production-like binaries stay build-time locked.\n const rawName =\n typeof __ALPHA_CLASSIC_CLI_ENV__ === \"string\" && __ALPHA_CLASSIC_CLI_ENV__.trim()\n ? __ALPHA_CLASSIC_CLI_ENV__\n : DEFAULT_ENVIRONMENT_NAME;\n const normalized = rawName.trim().toLowerCase() as EnvironmentName;\n if (normalized in PRESETS) {\n return normalized;\n }\n return DEFAULT_ENVIRONMENT_NAME;\n}\n","export class ApiError extends Error {\n constructor(\n message: string,\n readonly code?: number | string,\n readonly status?: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class AuthError extends ApiError {\n constructor(message: string, code?: number | string, status?: number) {\n super(message, code, status);\n this.name = \"AuthError\";\n }\n}\n\nexport class PermissionError extends ApiError {\n constructor(message: string, code?: number | string, status?: number) {\n super(message, code, status);\n this.name = \"PermissionError\";\n }\n}\n","import type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport type {\n CliDeviceAuthCreateRequest,\n CliDeviceAuthCreateVO,\n JwtTokenDTO,\n ResultEnvelope,\n UserLoginVO,\n} from \"../types.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\nimport { ApiError, AuthError, PermissionError } from \"../util/errors.js\";\n\nexport interface ApiClientOptions {\n sessionStore: SessionStore;\n apiBaseUrl?: string;\n timeoutMs?: number;\n}\n\nconst RESULT_CODE_SUCCESS = 200;\nconst RESULT_CODE_AUTH = 401;\nconst RESULT_CODE_PERMISSION = 403;\nconst DEVICE_TYPE_AI = \"ai\";\n\nexport class ApiClient {\n private readonly sessionStore: SessionStore;\n private readonly apiBaseUrl?: string;\n private readonly timeoutMs: number;\n\n constructor(options: ApiClientOptions) {\n this.sessionStore = options.sessionStore;\n this.apiBaseUrl = options.apiBaseUrl ? normalizeBaseUrl(options.apiBaseUrl) : undefined;\n this.timeoutMs = options.timeoutMs ?? 15_000;\n }\n\n async createCliDeviceAuth(\n baseUrl: string,\n payload: CliDeviceAuthCreateRequest,\n ): Promise<CliDeviceAuthCreateVO> {\n return this.postEnvelope<CliDeviceAuthCreateVO>(\n baseUrl,\n \"/user/api/v1/cli-device-auth/create\",\n payload,\n { session: null },\n );\n }\n\n async pollCliDeviceAuth(\n baseUrl: string,\n deviceCode: string,\n ): Promise<UserLoginVO> {\n return this.postEnvelope<UserLoginVO>(\n baseUrl,\n `/user/api/v1/cli-device-auth/poll/${encodeURIComponent(deviceCode)}`,\n {},\n { session: null },\n );\n }\n\n async refreshSession(session?: SessionRecord): Promise<SessionRecord> {\n const current = session ?? (await this.sessionStore.getSession());\n if (!current?.refreshToken) {\n throw new AuthError(\"Token invalid or expired. Run: alpha-classic-cli login\");\n }\n const baseUrl = current.baseUrl ?? current.apiBaseUrl;\n const nextTokens = await this.postEnvelope<JwtTokenDTO>(\n baseUrl,\n \"/user/api/v1/token/refresh\",\n current.refreshToken,\n {\n contentType: \"text/plain;charset=UTF-8\",\n session: current,\n allowRefresh: false,\n },\n );\n const nextSession: SessionRecord = {\n ...current,\n token: nextTokens.token,\n refreshToken: nextTokens.refreshToken ?? current.refreshToken,\n tokenExpireTime: nextTokens.tokenExpireTime ?? current.tokenExpireTime,\n refreshTokenExpireTime:\n nextTokens.refreshTokenExpireTime ?? current.refreshTokenExpireTime,\n deviceType: current.deviceType ?? DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n };\n await this.sessionStore.saveSession(nextSession);\n return nextSession;\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n data?: unknown;\n headers?: Record<string, string>;\n requireAuth?: boolean;\n },\n ): Promise<T> {\n const session = await this.sessionStore.getSession();\n if (options?.requireAuth !== false && !session?.token) {\n throw new Error(\"Not logged in. Run: alpha-classic-cli login\");\n }\n\n const baseUrl = this.apiBaseUrl ?? session?.apiBaseUrl ?? session?.baseUrl;\n if (!baseUrl) {\n throw new Error(\"API base URL is not configured. Rebuild this CLI with npm run build:<env>.\");\n }\n\n return this.requestWithSession<T>(method, baseUrl, path, {\n ...options,\n session,\n allowRefresh: true,\n });\n }\n\n async check(): Promise<unknown> {\n return this.request(\"GET\", \"/im/v1/users/me\", { requireAuth: true });\n }\n\n private async postEnvelope<T>(\n baseUrl: string,\n path: string,\n data: unknown,\n options?: {\n contentType?: string;\n session?: SessionRecord | null;\n allowRefresh?: boolean;\n },\n ): Promise<T> {\n const response = await this.fetchJson(\n \"POST\",\n baseUrl,\n path,\n {\n data,\n headers: {\n \"Content-Type\": options?.contentType ?? \"application/json\",\n },\n session: options?.session ?? null,\n },\n );\n return this.unwrapResponse<T>(\"POST\", baseUrl, path, response, {\n data,\n contentType: options?.contentType,\n session: options?.session ?? null,\n allowRefresh: options?.allowRefresh ?? false,\n });\n }\n\n private async requestWithSession<T>(\n method: string,\n baseUrl: string,\n path: string,\n options: {\n params?: Record<string, unknown>;\n data?: unknown;\n headers?: Record<string, string>;\n session: SessionRecord | null;\n allowRefresh: boolean;\n },\n ): Promise<T> {\n const response = await this.fetchJson(method, baseUrl, path, options);\n return this.unwrapResponse<T>(method, baseUrl, path, response, {\n data: options.data,\n headers: options.headers,\n session: options.session,\n allowRefresh: options.allowRefresh,\n params: options.params,\n });\n }\n\n private async unwrapResponse<T>(\n method: string,\n baseUrl: string,\n path: string,\n response: { status: number; statusText: string; body: unknown },\n retry: {\n data?: unknown;\n headers?: Record<string, string>;\n contentType?: string;\n params?: Record<string, unknown>;\n session: SessionRecord | null;\n allowRefresh: boolean;\n },\n ): Promise<T> {\n const envelope = asResultEnvelope<T>(response.body);\n if (envelope) {\n const code = envelope.code ?? envelope.resultCode;\n const success = envelope.success ?? envelope.isSuccess;\n if (success !== false && (code === undefined || Number(code) === RESULT_CODE_SUCCESS)) {\n return envelope.data;\n }\n if (Number(code) === RESULT_CODE_AUTH && retry.allowRefresh) {\n return this.retryAfterRefresh<T>(method, baseUrl, path, retry);\n }\n throwApiEnvelopeError(envelope, response.status);\n }\n\n if (response.status === RESULT_CODE_AUTH && retry.allowRefresh) {\n return this.retryAfterRefresh<T>(method, baseUrl, path, retry);\n }\n if (response.status === RESULT_CODE_AUTH) {\n throw new AuthError(\"Token invalid or expired.\", undefined, response.status);\n }\n if (response.status === RESULT_CODE_PERMISSION) {\n throw new PermissionError(\"Permission denied.\", undefined, response.status);\n }\n if (response.status >= 200 && response.status < 300) {\n return response.body as T;\n }\n throw new ApiError(\n `API request failed: ${response.status} ${response.statusText}`,\n undefined,\n response.status,\n );\n }\n\n private async retryAfterRefresh<T>(\n method: string,\n baseUrl: string,\n path: string,\n retry: {\n data?: unknown;\n headers?: Record<string, string>;\n contentType?: string;\n params?: Record<string, unknown>;\n session: SessionRecord | null;\n allowRefresh: boolean;\n },\n ): Promise<T> {\n if (!retry.session) {\n throw new AuthError(\"Token invalid or expired. Run: alpha-classic-cli login\");\n }\n const nextSession = await this.refreshSession(retry.session);\n return this.requestWithSession<T>(method, baseUrl, path, {\n data: retry.data,\n params: retry.params,\n headers: {\n ...(retry.headers ?? {}),\n ...(retry.contentType ? { \"Content-Type\": retry.contentType } : {}),\n },\n session: nextSession,\n allowRefresh: false,\n });\n }\n\n private async fetchJson(\n method: string,\n baseUrl: string,\n path: string,\n options: {\n params?: Record<string, unknown>;\n data?: unknown;\n headers?: Record<string, string>;\n session: SessionRecord | null;\n },\n ): Promise<{ status: number; statusText: string; body: unknown }> {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, normalizeBaseUrl(baseUrl));\n for (const [key, value] of Object.entries(options.params ?? {})) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await fetch(url, {\n method: method.toUpperCase(),\n headers: {\n Accept: \"application/json\",\n ...(options.data !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(options.headers ?? {}),\n ...(options.session?.token ? { token: options.session.token } : {}),\n deviceType: options.session?.deviceType ?? DEVICE_TYPE_AI,\n },\n body: options.data !== undefined\n ? typeof options.data === \"string\"\n ? options.data\n : JSON.stringify(options.data)\n : undefined,\n signal: controller.signal,\n });\n const text = await response.text();\n return {\n status: response.status,\n statusText: response.statusText,\n body: text ? parseJson(text) : null,\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new ApiError(\n `${error.message} - ${method.toUpperCase()} ${normalizeBaseUrl(baseUrl)}${path}`,\n );\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction asResultEnvelope<T>(value: unknown): ResultEnvelope<T> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n const hasModernEnvelope =\n typeof record.success === \"boolean\" &&\n (record.code === undefined || typeof record.code === \"number\") &&\n (record.msg === undefined || typeof record.msg === \"string\");\n const hasLegacyEnvelope =\n typeof record.isSuccess === \"boolean\" &&\n (record.resultCode === undefined ||\n typeof record.resultCode === \"number\" ||\n typeof record.resultCode === \"string\") &&\n (record.resultMsg === undefined || typeof record.resultMsg === \"string\");\n if (\"data\" in record && (hasModernEnvelope || hasLegacyEnvelope)) {\n return value as ResultEnvelope<T>;\n }\n return null;\n}\n\nfunction throwApiEnvelopeError(envelope: ResultEnvelope<unknown>, status: number): never {\n const code = envelope.code ?? envelope.resultCode;\n const message =\n envelope.msg ??\n envelope.resultMsg ??\n envelope.message ??\n \"API request failed.\";\n if (Number(code) === RESULT_CODE_AUTH) {\n throw new AuthError(message, code, status);\n }\n if (Number(code) === RESULT_CODE_PERMISSION) {\n throw new PermissionError(message, code, status);\n }\n throw new ApiError(message, code, status);\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","export interface AlphaJwtClaims {\n exp?: number;\n office_id?: string;\n office_name?: string;\n user_id?: string;\n user_name?: string;\n}\n\nexport function decodeAlphaJwtClaims(token: string | undefined): AlphaJwtClaims | null {\n if (!token) {\n return null;\n }\n const [, payload] = token.split(\".\");\n if (!payload) {\n return null;\n }\n try {\n return JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as AlphaJwtClaims;\n } catch {\n return null;\n }\n}\n","export interface SuccessEnvelope<T> {\n ok: true;\n data: T;\n meta?: Record<string, unknown>;\n}\n\nexport interface ErrorEnvelope {\n ok: false;\n error: {\n type: string;\n message: string;\n hint?: string;\n detail?: unknown;\n };\n}\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport function printSuccess<T>(\n data: T,\n meta?: Record<string, unknown>,\n): void {\n const envelope: SuccessEnvelope<T> = {\n ok: true,\n data,\n ...(meta ? { meta } : {}),\n };\n printJson(envelope);\n}\n\nexport function printError(\n type: string,\n message: string,\n options?: {\n hint?: string;\n detail?: unknown;\n },\n): void {\n const envelope: ErrorEnvelope = {\n ok: false,\n error: {\n type,\n message,\n ...(options?.hint ? { hint: options.hint } : {}),\n ...(options?.detail !== undefined ? { detail: options.detail } : {}),\n },\n };\n console.error(JSON.stringify(envelope, null, 2));\n}\n","import { ApiClient } from \"../http/api-client.js\";\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\nexport async function runApiCommand(\n method: string,\n apiPath: string,\n options: {\n params?: string;\n data?: string;\n },\n sessionStore: SessionStore,\n): Promise<void> {\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const data = await client.request(method, apiPath, {\n params: options.params ? parseJsonObject(options.params, \"--params\") : undefined,\n data: options.data ? JSON.parse(options.data) : undefined,\n });\n printSuccess(data);\n}\n\nfunction parseJsonObject(value: string, flagName: string): Record<string, unknown> {\n const parsed = JSON.parse(value) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`${flagName} must be a JSON object.`);\n }\n return parsed as Record<string, unknown>;\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { ApiClient } from \"../http/api-client.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\ntype ApproScope = \"my\" | \"started\" | \"cc\" | \"all\";\n\ninterface ApproListOptions {\n scope?: string;\n keyword?: string;\n status?: string;\n approType?: string;\n starterId?: string;\n starterName?: string;\n page?: number;\n limit?: number;\n countOnly?: boolean;\n}\n\ninterface ApproInitiatorsOptions {\n keyword?: string;\n includeLeft?: boolean;\n limit?: number;\n}\n\ninterface ApproDetailOptions {\n id: string;\n comments?: number;\n}\n\ninterface ApproStatusFilter {\n status?: number;\n preStatus?: number;\n label: string;\n}\n\ninterface AlphaApproSearchResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n items?: AlphaApproItem[];\n };\n}\n\ninterface AlphaApproDetailResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaApproDetail;\n}\n\ninterface AlphaApproFeedsResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: {\n No?: number;\n pageIndex?: number;\n pageSize?: number;\n entityCount?: number;\n totalCount?: number;\n entities?: AlphaApproFeed[];\n items?: AlphaApproFeed[];\n };\n}\n\ninterface AlphaApproInitiatorsResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaApproInitiator[];\n}\n\ninterface AlphaCommonFileBatchResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaCommonFileInfo[];\n}\n\ninterface AlphaApproInitiator {\n id?: string;\n user_id?: string;\n userId?: string;\n name?: string;\n userName?: string;\n phone?: string;\n email?: string;\n status?: number | string;\n deleted?: number | string | boolean;\n}\n\ninterface AlphaApproDetail {\n approDO?: AlphaApproItem & Record<string, unknown>;\n matterId?: string;\n matterName?: string;\n matterType?: string;\n pMatterTypeName?: string;\n matterTypeName?: string;\n matterNo?: string;\n matterStatus?: string;\n matterOwner?: string;\n depOrOwnerName?: string;\n flowTaskId?: string;\n flowNodeType?: string;\n countFeeds?: number;\n code?: string;\n fieldsDtos?: AlphaApproFormField[];\n formFields?: Record<string, unknown>;\n flowsDto?: AlphaApproFlow[];\n flows?: AlphaApproFlow[];\n files?: AlphaApproFile[];\n feedList?: unknown[];\n feedStr?: string;\n}\n\ninterface AlphaApproItem {\n id?: number | string;\n approType?: number | string;\n approTypeName?: string;\n outlook?: string;\n matterId?: string;\n matterName?: string;\n matterNo?: string;\n customerStr?: string;\n startUserId?: string;\n startUserName?: string;\n status?: number | string;\n statusStr?: string;\n preStatus?: number | string;\n nodeName?: string;\n createDate?: string | number;\n arriveCurrentNodeDate?: string | number;\n modifyDate?: string | number;\n flowTaskId?: string;\n flowNodeType?: string;\n extra?: Record<string, unknown>;\n expandApproVO?: Record<string, unknown>;\n}\n\ninterface AlphaApproFormField {\n fieldId?: string;\n widgetName?: string;\n label?: string;\n value?: unknown;\n extraValue?: unknown;\n props?: Record<string, unknown>;\n}\n\ninterface ApproBusinessField {\n \"字段名称\": string;\n \"值\": unknown;\n}\n\ninterface ApproBusinessGroup {\n \"分组名称\": string;\n \"字段\": ApproBusinessField[];\n}\n\ninterface ApproBusinessGroupPattern {\n \"分组名称\": string;\n labels: string[];\n}\n\ninterface AlphaApproFlow {\n id?: number | string;\n name?: string;\n nodeType?: string;\n status?: number | string;\n hasOperation?: boolean;\n isCurrentNode?: boolean;\n currentNode?: boolean;\n approvalOperateType?: string;\n modifyDate?: string | number;\n createDate?: string | number;\n arriveDate?: string | number;\n flowUsers?: AlphaApproFlowUser[];\n}\n\ninterface AlphaApproFlowUser {\n id?: number | string;\n userId?: string;\n name?: string;\n status?: number | string;\n userStatus?: number | string;\n modifyDate?: string | number;\n createDate?: string | number;\n}\n\ninterface AlphaApproFile {\n id?: number | string;\n fileName?: string;\n path?: string;\n fileSize?: number;\n createDate?: string | number;\n modifiedDate?: string | number;\n}\n\ninterface AlphaCommonFileInfo {\n id?: string;\n fileName?: string;\n filePath?: string;\n fileSize?: number;\n boxRepoId?: string;\n handleType?: string;\n applicationId?: number;\n isValid?: number;\n gmtCreate?: string | number;\n gmtUpdate?: string | number;\n}\n\ninterface ApproAttachmentRef {\n fileId: string;\n ticket?: string;\n fieldLabel?: string;\n legacyFile?: AlphaApproFile;\n}\n\ninterface AlphaApproFeed {\n id?: number | string;\n content?: string;\n feedType?: number | string;\n action?: string;\n createUserId?: string;\n createUserName?: string;\n createUserPic?: string;\n gmtCreate?: string | number;\n gmtModified?: string | number;\n createTimeFormat?: string;\n}\n\nconst APPRO_SCOPE_TO_ENUM: Record<ApproScope, string> = {\n my: \"SELF_APPROVAL\",\n started: \"SELF_STARTED\",\n cc: \"CC_SELF\",\n all: \"ALL_APPROVAL\",\n};\n\nexport async function runApproList(\n options: ApproListOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const scope = parseApproScope(options.scope);\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 10);\n const approTypes = parseNumberList(options.approType);\n const status = parseApproStatus(options.status);\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n const starter = await resolveStarterFilter(client, options);\n\n // This mirrors Alpha Web's approval center search request. The backend fills\n // userId/officeId from the token, so the CLI does not duplicate identity state.\n const response = await client.request<AlphaApproSearchResponse>(\n \"POST\",\n \"/appro/api/v2/approval/search\",\n {\n data: {\n approvalAboutSelfEnum: APPRO_SCOPE_TO_ENUM[scope],\n limit,\n offset: (page - 1) * limit,\n orderType: \"DESC\",\n outlook: options.keyword?.trim() ?? \"\",\n pageIndex: page,\n pageSize: limit,\n selectApproFlow: 0,\n approTypes,\n startUserIds: starter.ids,\n ...(status.status !== undefined ? { status: status.status } : {}),\n ...(status.preStatus !== undefined ? { preStatus: status.preStatus } : {}),\n },\n },\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro list request failed.\");\n }\n\n const responseData = unwrapEnvelopeData<NonNullable<AlphaApproSearchResponse[\"data\"]>>(response);\n const items = responseData?.items ?? [];\n if (options.countOnly) {\n printSuccess({\n \"范围\": formatApproScope(scope),\n \"状态\": status.label,\n \"发起人\": starter.names,\n \"总数\": responseData?.totalCount ?? items.length,\n });\n return;\n }\n\n printSuccess({\n \"范围\": formatApproScope(scope),\n \"总数\": responseData?.totalCount ?? items.length,\n \"页码\": responseData?.pageIndex ?? page,\n \"每页数量\": responseData?.pageSize ?? limit,\n \"发起人筛选\": starter.names,\n \"审批列表\": items.map((item) => toApproSummary(item, scope)),\n });\n}\n\nexport async function runApproInitiators(\n options: ApproInitiatorsOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const limit = clampLimit(options.limit ?? 50);\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n const initiators = await fetchApproInitiators(client, {\n includeLeft: options.includeLeft ?? false,\n });\n const keyword = options.keyword?.trim();\n const filtered = keyword\n ? initiators.filter((user) => user.name.includes(keyword))\n : initiators;\n\n printSuccess({\n \"总数\": filtered.length,\n \"发起人列表\": filtered.slice(0, limit).map((user) => ({\n \"发起人ID\": user.id,\n \"姓名\": user.name,\n \"手机号\": user.phone,\n \"邮箱\": user.email,\n \"状态\": user.status,\n })),\n });\n}\n\nexport async function runApproDetail(\n options: ApproDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const approId = options.id.trim();\n if (!approId) {\n throw new Error(\"Missing appro id. Use: alpha-classic-cli appro detail --id <approId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n // Alpha Web's approval center opens detail dialogs from this read endpoint.\n // Keep the CLI read-only and return a cleaned, Chinese-keyed structure.\n const response = await client.request<AlphaApproDetailResponse>(\n \"GET\",\n `/appro/api/v2/appros/${encodeURIComponent(approId)}`,\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro detail request failed.\");\n }\n const detail = unwrapEnvelopeData<AlphaApproDetail>(response);\n if (!detail?.approDO) {\n throw new Error(\"审批不存在或当前用户无权查看。\");\n }\n\n const commentsLimit = clampCommentLimit(options.comments ?? 10);\n const feeds =\n commentsLimit > 0\n ? await fetchApproFeeds(client, detail, {\n approId,\n limit: commentsLimit,\n })\n : {\n \"用户评论\": { \"总数\": 0, \"评论列表\": [] },\n \"审批动态\": { \"总数\": 0, \"动态列表\": [] },\n };\n\n const attachmentDetails = await fetchApproAttachmentDetails(client, detail);\n printSuccess(toApproDetailOutput(detail, feeds, attachmentDetails));\n}\n\nfunction toApproSummary(item: AlphaApproItem, _scope: ApproScope): Record<string, unknown> {\n const merged = {\n ...(item.extra ?? {}),\n ...(item.expandApproVO ?? {}),\n };\n\n return {\n \"审批ID\": item.id ?? \"\",\n \"审批类型\": item.approTypeName ?? formatApproType(item.approType),\n \"重要信息\": stripHtml(item.outlook ?? stringField(merged, \"outlook\")),\n \"项目ID\": item.matterId ?? \"\",\n \"项目名称\": item.matterName ?? stringField(merged, \"matterName\"),\n \"项目编号\": item.matterNo ?? \"\",\n \"客户\": item.customerStr ?? \"\",\n \"发起人\": item.startUserName ?? \"\",\n // Approval list rows use the approval lifecycle status from Alpha Web's\n // statusMap. This is different from filter statuses under \"我审批的\".\n \"状态\": item.statusStr ?? formatApproStatus(item.status, item.preStatus, \"all\"),\n \"当前节点\": item.nodeName ?? \"\",\n \"发起时间\": formatDateTime(item.createDate),\n \"到达当前节点时间\": formatDateTime(item.arriveCurrentNodeDate),\n \"流程任务ID\": item.flowTaskId ?? \"\",\n };\n}\n\nasync function resolveStarterFilter(\n client: ApiClient,\n options: ApproListOptions,\n): Promise<{ ids: string[]; names: string[] }> {\n const starterId = options.starterId?.trim();\n if (starterId) {\n return { ids: [starterId], names: [starterId] };\n }\n\n const starterName = options.starterName?.trim();\n if (!starterName) {\n return { ids: [], names: [] };\n }\n\n const initiators = await fetchApproInitiators(client, { includeLeft: false });\n const exactMatches = initiators.filter((user) => user.name === starterName);\n const fuzzyMatches = exactMatches.length\n ? exactMatches\n : initiators.filter((user) => user.name.includes(starterName));\n\n if (fuzzyMatches.length === 0) {\n throw new Error(`未找到发起人:${starterName}。可先运行 alpha-classic-cli appro initiators --keyword ${starterName}`);\n }\n if (fuzzyMatches.length > 1) {\n const candidates = fuzzyMatches\n .slice(0, 10)\n .map((user) => `${user.name}(${user.id})`)\n .join(\",\");\n throw new Error(`发起人名称不唯一:${starterName}。候选:${candidates}。请改用 --starter-id。`);\n }\n\n const [match] = fuzzyMatches;\n return { ids: [match.id], names: [match.name] };\n}\n\nasync function fetchApproInitiators(\n client: ApiClient,\n options: { includeLeft: boolean },\n): Promise<Array<{ id: string; name: string; phone: string; email: string; status: string }>> {\n // Alpha Web uses this user service to build the approval initiator filter.\n // Default excludes deleted and inactive users; includeLeft mirrors the broader\n // \"all approval user\" list used by the page for old approval detail context.\n const response = await client.request<AlphaApproInitiatorsResponse>(\n \"GET\",\n \"/user/api/v1/users/listOfficeUser\",\n {\n params: {\n deleted: 0,\n ...(options.includeLeft ? {} : { status: 1 }),\n },\n },\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro initiators request failed.\");\n }\n\n const data = unwrapEnvelopeData<AlphaApproInitiatorsResponse[\"data\"]>(response);\n return (data ?? [])\n .map((user) => ({\n id: user.id ?? user.user_id ?? user.userId ?? \"\",\n name: user.name ?? user.userName ?? \"\",\n phone: user.phone ?? \"\",\n email: user.email ?? \"\",\n status: formatRawStatus(user.status),\n }))\n .filter((user) => user.id && user.name);\n}\n\nfunction toApproDetailOutput(\n detail: AlphaApproDetail,\n feeds: Record<string, unknown>,\n attachmentDetails: Map<string, AlphaCommonFileInfo>,\n): Record<string, unknown> {\n const appro = detail.approDO ?? {};\n const files = detail.files ?? [];\n const flows = detail.flowsDto?.length ? detail.flowsDto : (detail.flows ?? []);\n const attachments = getApproAttachmentRefs(detail);\n\n return {\n \"审批概览\": {\n \"审批ID\": appro.id ?? \"\",\n \"审批类型\": appro.approTypeName ?? formatApproType(appro.approType),\n \"重要信息\": stripHtml(appro.outlook ?? \"\"),\n \"状态\": appro.statusStr ?? formatApproStatus(appro.status, appro.preStatus, \"started\"),\n \"当前节点\": appro.nodeName ?? \"\",\n \"发起人\": appro.startUserName ?? \"\",\n \"发起时间\": formatDateTime(appro.createDate),\n \"更新时间\": formatDateTime(appro.modifyDate),\n \"审批编号\": detail.code ?? appro.code ?? \"\",\n \"评论和动态数量\": detail.countFeeds ?? 0,\n \"流程任务ID\": detail.flowTaskId ?? \"\",\n },\n \"项目信息\": {\n \"项目ID\": detail.matterId ?? appro.matterId ?? \"\",\n \"项目名称\": detail.matterName ?? appro.matterName ?? \"\",\n \"项目编号\": detail.matterNo ?? appro.matterNo ?? \"\",\n \"项目类型\": [detail.pMatterTypeName, detail.matterTypeName, detail.matterType ?? appro.matterType]\n .filter(Boolean)\n .join(\" / \"),\n \"项目状态\": detail.matterStatus ?? appro.matterStatus ?? \"\",\n \"项目所属\": detail.depOrOwnerName ?? detail.matterOwner ?? appro.matterOwner ?? \"\",\n \"客户\": appro.customerStr ?? \"\",\n },\n \"审批表单\": formatApproForm(detail),\n \"审批流程\": flows.map(toApproFlowSummary),\n \"附件\": attachments.length\n ? attachments.map((attachment) => toApproAttachmentSummary(attachment, attachmentDetails.get(attachment.fileId)))\n : files.map((file) => toApproFileSummary(file)),\n ...feeds,\n };\n}\n\nasync function fetchApproAttachmentDetails(\n client: ApiClient,\n detail: AlphaApproDetail,\n): Promise<Map<string, AlphaCommonFileInfo>> {\n const refsWithTicket = getApproAttachmentRefs(detail).filter((ref) => ref.fileId && ref.ticket);\n const groups = new Map<string, string[]>();\n for (const ref of refsWithTicket) {\n const ticket = ref.ticket ?? \"\";\n groups.set(ticket, [...(groups.get(ticket) ?? []), ref.fileId]);\n }\n\n const details = new Map<string, AlphaCommonFileInfo>();\n await Promise.all(\n [...groups.entries()].map(async ([ticket, fileIds]) => {\n const response = await client.request<AlphaCommonFileBatchResponse>(\n \"GET\",\n \"/common/api/v1/file/batch\",\n {\n params: {\n fileIds: [...new Set(fileIds)].join(\",\"),\n },\n headers: {\n \"deviceType\": \"web\",\n \"file-ticket\": ticket,\n },\n },\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro attachment detail request failed.\");\n }\n const data = unwrapEnvelopeData<AlphaCommonFileBatchResponse[\"data\"]>(response);\n for (const file of data ?? []) {\n if (file.id) {\n details.set(file.id, file);\n }\n }\n }),\n );\n return details;\n}\n\nfunction getApproAttachmentRefs(detail: AlphaApproDetail): ApproAttachmentRef[] {\n const refs: ApproAttachmentRef[] = [];\n for (const file of detail.files ?? []) {\n const fileId = file.id === undefined || file.id === null ? \"\" : String(file.id);\n if (fileId) {\n refs.push({ fileId, legacyFile: file });\n }\n }\n for (const field of detail.fieldsDtos ?? []) {\n if (field.widgetName !== \"Attachment\") {\n continue;\n }\n const fileIds = normalizeStringList(field.value);\n const ticket = typeof field.extraValue === \"string\" ? field.extraValue : undefined;\n for (const fileId of fileIds) {\n refs.push({\n fileId,\n ticket,\n fieldLabel: field.label,\n });\n }\n }\n return dedupeApproAttachmentRefs(refs);\n}\n\nfunction dedupeApproAttachmentRefs(refs: ApproAttachmentRef[]): ApproAttachmentRef[] {\n const seen = new Set<string>();\n return refs.filter((ref) => {\n if (!ref.fileId || seen.has(ref.fileId)) {\n return false;\n }\n seen.add(ref.fileId);\n return true;\n });\n}\n\nasync function fetchApproFeeds(\n client: ApiClient,\n detail: AlphaApproDetail,\n options: { approId: string; limit: number },\n): Promise<Record<string, unknown>> {\n const approType = detail.approDO?.approType;\n if (approType === undefined || approType === null || approType === \"\") {\n return {\n \"用户评论\": { \"总数\": 0, \"评论列表\": [] },\n \"审批动态\": { \"总数\": 0, \"动态列表\": [] },\n \"提示\": \"审批类型缺失,无法查询评论和动态。\",\n };\n }\n\n const [comments, dynamics] = await Promise.all([\n fetchApproFeedPage(client, {\n approId: options.approId,\n approType,\n feedType: 1,\n limit: options.limit,\n }),\n fetchApproFeedPage(client, {\n approId: options.approId,\n approType,\n feedType: 2,\n limit: options.limit,\n }),\n ]);\n\n const { items: commentItems, ...commentPage } = comments;\n const { items: dynamicItems, ...dynamicPage } = dynamics;\n return {\n \"用户评论\": {\n ...commentPage,\n \"评论列表\": commentItems.map(toApproCommentSummary),\n },\n \"审批动态\": {\n ...dynamicPage,\n \"动态列表\": dynamicItems.map(toApproDynamicSummary),\n },\n };\n}\n\nasync function fetchApproFeedPage(\n client: ApiClient,\n options: {\n approId: string;\n approType: number | string;\n feedType: 1 | 2;\n limit: number;\n },\n): Promise<{\n \"总数\": number;\n \"页码\": number;\n \"每页数量\": number;\n items: AlphaApproFeed[];\n \"提示\"?: string;\n}> {\n try {\n const response = await client.request<AlphaApproFeedsResponse>(\"GET\", \"/appro/api/v1/feeds\", {\n params: {\n approveId: options.approId,\n approveType: options.approType,\n // Alpha Web uses feedType, not seedType:\n // 1 = user comments, 2 = approval dynamics.\n feedType: options.feedType,\n pageIndex: 1,\n pageSize: options.limit,\n orderBy: \"gmt_create\",\n orderType: \"desc\",\n },\n });\n\n if (response.isSuccess === false) {\n return {\n \"总数\": 0,\n \"页码\": 1,\n \"每页数量\": options.limit,\n items: [],\n \"提示\": response.resultMsg ?? response.message ?? \"查询失败。\",\n };\n }\n\n const data = unwrapEnvelopeData<NonNullable<AlphaApproFeedsResponse[\"data\"]>>(response) ?? {};\n const items = data.items ?? data.entities ?? [];\n return {\n \"总数\": data.totalCount ?? data.entityCount ?? items.length,\n \"页码\": data.pageIndex ?? data.No ?? 1,\n \"每页数量\": data.pageSize ?? options.limit,\n items,\n };\n } catch (error) {\n return {\n \"总数\": 0,\n \"页码\": 1,\n \"每页数量\": options.limit,\n items: [],\n \"提示\": error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction unwrapEnvelopeData<T>(response: T | { data?: T; isSuccess?: boolean; resultMsg?: string; message?: string }): T | undefined {\n if (response && typeof response === \"object\" && \"data\" in response && (\"isSuccess\" in response || \"resultMsg\" in response || \"message\" in response)) {\n return (response as { data?: T }).data;\n }\n return response as T;\n}\n\nfunction formatApproForm(detail: AlphaApproDetail): Record<string, unknown> {\n const approType = detail.approDO?.approType;\n const approTypeName = detail.approDO?.approTypeName ?? formatApproType(approType);\n return {\n \"表单类型\": approTypeName,\n \"业务分组\": formatApproBusinessGroups(detail),\n };\n}\n\nfunction formatApproBusinessGroups(detail: AlphaApproDetail): ApproBusinessGroup[] {\n const approType = numericCode(detail.approDO?.approType);\n if (approType === 1) {\n return formatInvoiceBusinessGroups(detail);\n }\n\n const fields = formatApproBusinessFields(detail);\n const patterns = getApproBusinessGroupPatterns(approType);\n return withSupplementFields(detail, splitBusinessFieldsIntoGroups(fields, patterns));\n}\n\nfunction formatInvoiceBusinessGroups(detail: AlphaApproDetail): ApproBusinessGroup[] {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n const invoiceDto = objectField(appro as Record<string, unknown>, \"invoiceDTO\");\n const invoiceInfo = objectField(invoiceDto, \"invoiceInfoVO\");\n const relationIncomes = valueFrom(invoiceDto, record, \"relationInvoceDTOS\");\n const relationContracts = record.relationInvoiceContractDTOS ?? record.contracts;\n\n return withSupplementFields(detail, [\n buildBusinessGroup(\"基本信息\", (add) => {\n add(\"申请人\", invoiceInfo.applicantName ?? appro.startUserName);\n add(\"所属项目\", invoiceInfo.matterName ?? appro.matterName ?? detail.matterName);\n add(\"项目编号\", invoiceInfo.matterNo ?? appro.matterNo ?? detail.matterNo);\n add(\"所属\", invoiceInfo.departmentName ?? record.depOrOwnerName ?? appro.matterOwner);\n add(\"客户\", invoiceInfo.customers ?? record.clientNameForSearch ?? appro.customerStr);\n }),\n buildBusinessGroup(\"关联收款信息\", (add) => {\n add(\"收款列表\", relationIncomes);\n }),\n buildBusinessGroup(\"关联合同信息\", (add) => {\n add(\"合同列表\", relationContracts);\n }),\n buildBusinessGroup(\"专票信息\", (add) => {\n add(\"发票抬头\", invoiceInfo.invoiceTitle ?? appro.company);\n add(\"纳税人识别号\", invoiceInfo.taxPayerId ?? appro.taxNumber);\n add(\"发票类型\", formatInvoiceType(invoiceInfo.invoiceType ?? appro.invoiceType));\n add(\"税金类型\", invoiceInfo.vatTypeName ?? appro.vatTypeName ?? invoiceInfo.vatType);\n add(\"发票金额\", invoiceInfo.invoiceTotal ?? appro.money);\n add(\"律师费金额\", invoiceInfo.lawyerValue ?? record.lawyerValue);\n add(\"税金\", invoiceInfo.vatValue ?? record.vatValue);\n add(\"开户行\", invoiceInfo.openBank ?? appro.bank);\n add(\"账号\", invoiceInfo.account ?? appro.account);\n add(\"电话\", invoiceInfo.phoneNumber ?? appro.phone);\n add(\"单位地址\", invoiceInfo.workAddress ?? appro.address);\n add(\"邮编\", invoiceInfo.zipCode ?? appro.postCode);\n add(\"发票日期\", invoiceInfo.invoiceDate);\n add(\"发票号码\", invoiceInfo.invoiceNumber);\n }),\n buildBusinessGroup(\"备注\", (add) => {\n add(\"备注\", invoiceInfo.remark ?? appro.remark ?? record.remark);\n }),\n ]);\n}\n\nfunction getApproBusinessGroupPatterns(approType: number | undefined): ApproBusinessGroupPattern[] {\n switch (approType) {\n case 0:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"重要信息\", \"关联项目\", \"项目编号\", \"项目所属\"] },\n { \"分组名称\": \"盖章信息\", labels: [\"盖章文书\"] },\n { \"分组名称\": \"备注\", labels: [\"备注\", \"原因\", \"结果说明\"] },\n ];\n case 2:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"关联项目\", \"项目编号\", \"申请日期\"] },\n { \"分组名称\": \"报销明细\", labels: [\"报销总额\", \"报销明细\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 3:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"项目名称\", \"项目编号\"] },\n {\n \"分组名称\": \"金额汇总\",\n labels: [\"合同总额\", \"发票总额\", \"收款总额\", \"账单总额\", \"费用总额\", \"应收总额\"],\n },\n { \"分组名称\": \"结项说明\", labels: [\"结项说明\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 4:\n return [\n { \"分组名称\": \"合同信息\", labels: [\"合同名称\", \"关联项目\", \"项目编号\", \"合同编号\", \"委托方\", \"合同金额\", \"标的额\", \"权益金额\", \"计费方式\", \"生效日期\", \"结束日期\"] },\n { \"分组名称\": \"盖章信息\", labels: [\"盖章申请人\", \"印章类型\", \"签署方式\", \"盖章份数\", \"签署方\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 5:\n case 7:\n case 8:\n case 9:\n case 10:\n case 11:\n case 12:\n case 16:\n return [\n { \"分组名称\": \"项目基本信息\", labels: [\"项目名称\", \"项目编号\", \"项目类型\", \"项目状态\", \"项目等级\", \"法律领域\", \"项目所属\", \"案源律师\", \"承办律师\", \"客户\", \"对方当事人\", \"其他当事人\", \"开始日期\", \"结束日期\"] },\n { \"分组名称\": \"项目补充信息\", labels: [\"项目补充信息\"] },\n { \"分组名称\": \"当前程序信息\", labels: [\"当前程序信息\"] },\n { \"分组名称\": \"项目详情\", labels: [\"项目详情\", \"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n { \"分组名称\": \"项目成员\", labels: [\"项目成员\"] },\n ];\n case 13:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"关联项目\"] },\n { \"分组名称\": \"任务名称\", labels: [\"任务列表\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 14:\n return [\n { \"分组名称\": \"项目基本信息\", labels: [\"项目名称\", \"项目编号\"] },\n { \"分组名称\": \"归档信息\", labels: [\"归档编号\"] },\n { \"分组名称\": \"项目变动信息\", labels: [\"项目变动信息\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 15:\n return [\n { \"分组名称\": \"项目基本信息\", labels: [\"项目名称\", \"项目编号\"] },\n { \"分组名称\": \"借阅信息\", labels: [\"借阅信息\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n default:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n }\n}\n\nfunction splitBusinessFieldsIntoGroups(\n fields: ApproBusinessField[],\n patterns: ApproBusinessGroupPattern[],\n): ApproBusinessGroup[] {\n const matched = new Set<string>();\n const groups: ApproBusinessGroup[] = [];\n\n // 先按审批类型的业务语义分组,再把无法识别的字段放到兜底组里。\n for (const pattern of patterns) {\n const fieldLabels = new Set(pattern.labels);\n const groupFields = fields.filter((field) => fieldLabels.has(field[\"字段名称\"]));\n for (const field of groupFields) {\n matched.add(field[\"字段名称\"]);\n }\n if (groupFields.length) {\n groups.push({\n \"分组名称\": pattern[\"分组名称\"],\n \"字段\": groupFields,\n });\n }\n }\n\n const leftovers = fields.filter((field) => !matched.has(field[\"字段名称\"]));\n if (leftovers.length) {\n groups.push({\n \"分组名称\": \"其他信息\",\n \"字段\": leftovers,\n });\n }\n\n return groups.length ? groups : [{ \"分组名称\": \"业务信息\", \"字段\": fields }];\n}\n\nfunction withSupplementFields(\n detail: AlphaApproDetail,\n groups: ApproBusinessGroup[],\n): ApproBusinessGroup[] {\n const supplementFields = formatApproCustomFields(detail).map((field) => ({\n \"字段名称\": String(field[\"字段名称\"] ?? \"\"),\n \"值\": field[\"值\"],\n })).filter((field) => field[\"字段名称\"]);\n if (!supplementFields.length) {\n return groups;\n }\n return [\n ...groups,\n {\n \"分组名称\": \"补充信息\",\n \"字段\": supplementFields,\n },\n ];\n}\n\nfunction buildBusinessGroup(\n name: string,\n build: (add: (label: string, value: unknown) => void) => void,\n): ApproBusinessGroup {\n const fields: ApproBusinessField[] = [];\n build((label, value) => addBusinessField(fields, label, value));\n return {\n \"分组名称\": name,\n \"字段\": fields,\n };\n}\n\nfunction formatApproBusinessFields(detail: AlphaApproDetail): ApproBusinessField[] {\n const approType = numericCode(detail.approDO?.approType);\n const fields: ApproBusinessField[] = [];\n const add = (label: string, value: unknown): void => addBusinessField(fields, label, value);\n\n if ([5, 7, 8, 9, 10, 11, 12, 16].includes(approType ?? -999)) {\n addProjectBusinessFields(detail, add);\n } else {\n switch (approType) {\n case 0:\n addSealBusinessFields(detail, add);\n break;\n case 1:\n addInvoiceBusinessFields(detail, add);\n break;\n case 2:\n addReimburseBusinessFields(detail, add);\n break;\n case 3:\n addCloseMatterBusinessFields(detail, add);\n break;\n case 4:\n addContractBusinessFields(detail, add);\n break;\n case 13:\n addTaskBusinessFields(detail, add);\n break;\n case 14:\n addFilingBusinessFields(detail, add);\n break;\n case 15:\n addBorrowBusinessFields(detail, add);\n break;\n default:\n addGenericBusinessFields(detail, add);\n break;\n }\n }\n\n addGenericBusinessFields(detail, add);\n return dedupeBusinessFields(fields);\n}\n\nfunction formatApproCustomFields(detail: AlphaApproDetail): Record<string, unknown>[] {\n if (detail.fieldsDtos?.length) {\n return detail.fieldsDtos\n .map((field) => ({\n \"字段名称\": field.label ?? \"\",\n \"值\": formatApproCustomFieldValue(field),\n }))\n .filter((field) => field[\"字段名称\"]);\n }\n\n return Object.entries(detail.formFields ?? {}).map(([key, value]) => ({\n \"字段名称\": key,\n \"值\": normalizeFieldValue(value),\n }));\n}\n\nfunction formatApproCustomFieldValue(field: AlphaApproFormField): unknown {\n switch (field.widgetName) {\n case \"Attachment\":\n return formatAttachmentFieldValue(field.value);\n case \"RelateClientField\":\n case \"RelateMemberField\":\n case \"RelateDepartmentField\":\n case \"RelateMatterField\":\n return namesFromExtraValue(field.extraValue);\n case \"DateRangeField\": {\n const values = normalizeStringList(field.value);\n return values.length ? values.join(\" ~ \") : \"\";\n }\n default:\n return normalizeFieldValue(field.value);\n }\n}\n\nfunction namesFromExtraValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === \"object\") {\n const record = item as Record<string, unknown>;\n return record.name ?? record.userName ?? record.departmentName ?? record.matterName;\n }\n return item;\n })\n .map((item) => String(item ?? \"\").trim())\n .filter(Boolean)\n .join(\",\");\n }\n return typeof value === \"string\" ? stripHtml(value) : \"\";\n}\n\nfunction formatReimburseDetails(value: unknown): unknown {\n const parsed = normalizeBusinessValue(value);\n if (!Array.isArray(parsed)) {\n return parsed ?? \"\";\n }\n return parsed.map((item) => {\n if (!item || typeof item !== \"object\") {\n return normalizeBusinessValue(item);\n }\n const record = item as Record<string, unknown>;\n return {\n \"费用金额\": formatFeeAmount(record.amount ?? record.feeSpendAmount),\n \"费用类型\": record.feeTypeName ?? record.expenseType ?? record.feeCurrency,\n \"费用日期\": normalizeBusinessValue(record.feeDate ?? record.createDate, \"费用日期\"),\n \"经手人\": record.handlerName,\n \"备注\": record.remark,\n \"附件个数\": countFileIds(record.fileIds),\n };\n });\n}\n\nfunction formatFeeAmount(value: unknown): unknown {\n if (typeof value === \"number\") {\n return value > 1000 && Number.isInteger(value) ? value / 100 : value;\n }\n return value ?? \"\";\n}\n\nfunction countFileIds(value: unknown): number {\n return normalizeStringList(value).length;\n}\n\nfunction addProjectBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"项目名称\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"项目类型\", [record.pMatterTypeName, record.matterTypeName, detail.matterType ?? appro.matterType]);\n add(\"项目状态\", detail.matterStatus ?? appro.matterStatus);\n add(\"项目等级\", formatMatterLevel(record.level));\n add(\"法律领域\", record.lawField);\n add(\"项目所属\", record.belong ?? detail.depOrOwnerName ?? detail.matterOwner ?? appro.matterOwner);\n add(\"客户\", record.clientNameForSearch ?? record.clients ?? appro.customerStr);\n add(\"对方当事人\", record.litigants);\n add(\"其他当事人\", record.relevants);\n add(\"案源律师\", record.attorneys);\n add(\"承办律师\", record.undertakeAttorneys);\n add(\"项目成员\", record.members);\n add(\"开始日期\", record.beginDate);\n add(\"结束日期\", record.endDate);\n add(\"项目详情\", record.remark);\n add(\"当前程序信息\", record.process);\n add(\"项目补充信息\", record.expandInfo ?? record.expandInfoList);\n}\n\nfunction addContractBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"合同名称\", record.contractName ?? record.contractNameForSearch);\n add(\"关联项目\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"委托方\", record.contractEntrustClientsList ?? record.contractEntrustClients);\n add(\"合同金额\", record.estimatedContractAmount);\n add(\"标的额\", record.targetAmount);\n add(\"权益金额\", record.equityAmount);\n add(\"计费方式\", record.paymentTypes);\n add(\"生效日期\", record.effectiveDate);\n add(\"结束日期\", record.endDate);\n add(\"合同编号\", record.code);\n add(\"盖章申请人\", record.stampApplicantName);\n add(\"印章类型\", record.stampTypeNames);\n add(\"签署方式\", formatSignType(record.signType));\n add(\"盖章份数\", record.stampAmount);\n add(\"签署方\", record.signatoryList);\n}\n\nfunction addInvoiceBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n const invoice = objectField(appro as Record<string, unknown>, \"invoiceDTO\");\n add(\"关联项目\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"发票类型\", formatInvoiceType(valueFrom(invoice, appro, \"invoiceType\")));\n add(\"开票单位\", valueFrom(invoice, appro, \"company\"));\n add(\"发票金额\", valueFrom(invoice, appro, \"money\"));\n add(\"税号\", valueFrom(invoice, appro, \"taxNumber\"));\n add(\"开户行及账号\", valueFrom(invoice, appro, \"account\"));\n add(\"单位地址\", valueFrom(invoice, appro, \"address\"));\n add(\"电话\", valueFrom(invoice, appro, \"phone\"));\n add(\"邮编\", valueFrom(invoice, appro, \"postCode\"));\n add(\"关联合同\", record.contracts);\n}\n\nfunction addReimburseBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"报销总额\", record.totalMoney);\n add(\"申请日期\", record.applyDate ?? appro.createDate);\n add(\"关联项目\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"报销明细\", formatReimburseDetails(record.feeSpendDetails));\n}\n\nfunction addSealBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"关联项目\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"项目所属\", detail.depOrOwnerName ?? record.depOrOwnerName);\n add(\"盖章文书\", record.sealApproDOs ?? record.files);\n}\n\nfunction addCloseMatterBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const additional = objectField(record, \"matterAdditional\");\n add(\"项目名称\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"合同总额\", additional.contractValue);\n add(\"发票总额\", additional.invoiceValue);\n add(\"收款总额\", additional.incomeValue);\n add(\"账单总额\", additional.billValue);\n add(\"费用总额\", additional.expenseValue);\n add(\"应收总额\", additional.shouldValue);\n add(\"结项说明\", record.resultDesc);\n}\n\nfunction addTaskBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"关联项目\", detail.matterName ?? record.matterName);\n add(\"任务列表\", record.taskSimpleDTOList);\n}\n\nfunction addFilingBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"项目名称\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"归档编号\", record.filingNo);\n add(\"项目变动信息\", objectField(record, \"differencesDTO\").differences);\n}\n\nfunction addBorrowBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"项目名称\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"借阅信息\", record.borrowInfo ?? record.borrowRecord ?? record.archiveBorrow);\n}\n\nfunction addGenericBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"重要信息\", appro.outlook);\n add(\"备注\", record.remark ?? appro.remark);\n add(\"原因\", record.reason ?? appro.reason);\n add(\"结果说明\", record.resultDesc ?? record.result);\n}\n\nfunction addBusinessField(fields: ApproBusinessField[], label: string, value: unknown): void {\n const normalized = normalizeBusinessValue(value, label);\n if (isEmptyBusinessValue(normalized)) {\n return;\n }\n fields.push({\n \"字段名称\": label,\n \"值\": normalized,\n });\n}\n\nfunction dedupeBusinessFields(fields: ApproBusinessField[]): ApproBusinessField[] {\n const seen = new Set<string>();\n return fields.filter((field) => {\n if (seen.has(field[\"字段名称\"])) {\n return false;\n }\n seen.add(field[\"字段名称\"]);\n return true;\n });\n}\n\nfunction detailRecord(detail: AlphaApproDetail): Record<string, unknown> {\n return detail as Record<string, unknown>;\n}\n\nfunction objectField(source: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = source[key];\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return {};\n}\n\nfunction valueFrom(\n preferred: Record<string, unknown>,\n fallback: Record<string, unknown>,\n key: string,\n): unknown {\n return preferred[key] ?? fallback[key];\n}\n\nfunction numericCode(value: number | string | undefined): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\nfunction normalizeBusinessValue(value: unknown, label?: string): unknown {\n if (\n (typeof value === \"number\" || typeof value === \"string\") &&\n label &&\n (label.includes(\"日期\") || label.includes(\"时间\"))\n ) {\n return formatDateTime(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeBusinessValue(item))\n .filter((item) => !isEmptyBusinessValue(item));\n }\n if (typeof value === \"string\") {\n const trimmed = stripHtml(value);\n if (!trimmed) {\n return \"\";\n }\n const parsed = parseMaybeJson(trimmed);\n if (parsed !== undefined) {\n return normalizeBusinessValue(parsed);\n }\n return trimmed;\n }\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const compact: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(record)) {\n const normalized = normalizeBusinessValue(item);\n if (!isEmptyBusinessValue(normalized)) {\n compact[key] = normalized;\n }\n }\n return compact;\n }\n return value ?? \"\";\n}\n\nfunction parseMaybeJson(value: string): unknown {\n if (!/^[\\[{]/.test(value)) {\n return undefined;\n }\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction isEmptyBusinessValue(value: unknown): boolean {\n if (value === undefined || value === null || value === \"\") {\n return true;\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>).length === 0;\n }\n return false;\n}\n\nfunction toApproFlowSummary(flow: AlphaApproFlow): Record<string, unknown> {\n return {\n \"节点ID\": flow.id ?? \"\",\n \"节点名称\": flow.name ?? \"\",\n \"节点类型\": flow.nodeType ?? \"\",\n \"节点状态\": formatFlowStatus(flow.status),\n \"是否当前节点\": flow.isCurrentNode ?? flow.currentNode ?? false,\n \"审批方式\": flow.approvalOperateType ?? \"\",\n \"操作时间\": formatDateTime(flow.modifyDate ?? flow.arriveDate ?? flow.createDate),\n \"审批人\": (flow.flowUsers ?? []).map(toApproFlowUserSummary),\n };\n}\n\nfunction toApproFlowUserSummary(user: AlphaApproFlowUser): Record<string, unknown> {\n return {\n \"用户ID\": user.userId ?? \"\",\n \"姓名\": user.name ?? \"\",\n \"处理状态\": formatFlowUserStatus(user.status),\n \"人员状态\": formatUserStatus(user.userStatus),\n \"处理时间\": formatDateTime(user.modifyDate ?? user.createDate),\n };\n}\n\nfunction toApproFileSummary(file: AlphaApproFile): Record<string, unknown> {\n return {\n \"文件名\": file.fileName ?? \"\",\n \"大小\": formatFileSize(file.fileSize),\n };\n}\n\nfunction toApproAttachmentSummary(\n ref: ApproAttachmentRef,\n detail?: AlphaCommonFileInfo,\n): Record<string, unknown> {\n const legacyFile = ref.legacyFile;\n return {\n \"文件名\": detail?.fileName ?? legacyFile?.fileName ?? \"\",\n \"大小\": formatFileSize(detail?.fileSize ?? legacyFile?.fileSize),\n };\n}\n\nfunction toApproCommentSummary(feed: AlphaApproFeed): Record<string, unknown> {\n return {\n \"评论ID\": feed.id ?? \"\",\n \"类型\": formatFeedType(feed.feedType),\n \"评论人\": feed.createUserName ?? \"\",\n \"评论人ID\": feed.createUserId ?? \"\",\n \"内容\": stripHtml(feed.content ?? \"\"),\n \"评论时间\": formatDateTime(feed.gmtCreate),\n };\n}\n\nfunction toApproDynamicSummary(feed: AlphaApproFeed): Record<string, unknown> {\n return {\n \"动态ID\": feed.id ?? \"\",\n \"类型\": formatFeedType(feed.feedType),\n \"操作\": feed.action ?? \"\",\n \"操作人\": feed.createUserName ?? \"\",\n \"操作人ID\": feed.createUserId ?? \"\",\n \"内容\": stripHtml(feed.content ?? \"\"),\n \"动态时间\": formatDateTime(feed.gmtCreate),\n };\n}\n\nfunction formatFeedType(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 1:\n return \"用户评论\";\n case 2:\n return \"审批动态\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知类型(${code})`;\n }\n}\n\nfunction parseApproScope(value: string | undefined): ApproScope {\n const scope = (value ?? \"my\").trim().toLowerCase();\n if (scope === \"my\" || scope === \"mine\" || scope === \"approval\" || scope === \"我审批的\") {\n return \"my\";\n }\n if (scope === \"started\" || scope === \"start\" || scope === \"我发起的\") {\n return \"started\";\n }\n if (scope === \"cc\" || scope === \"copyto\" || scope === \"copy\" || scope === \"抄送我的\") {\n return \"cc\";\n }\n if (scope === \"all\" || scope === \"allapproval\" || scope === \"全部\" || scope === \"全部审批\") {\n return \"all\";\n }\n throw new Error(\n \"Invalid appro scope. Supported: my, started, cc, all, 我审批的, 我发起的, 抄送我的, 全部审批.\",\n );\n}\n\nfunction formatApproScope(scope: ApproScope): string {\n switch (scope) {\n case \"my\":\n return \"我审批的\";\n case \"started\":\n return \"我发起的\";\n case \"cc\":\n return \"抄送我的\";\n case \"all\":\n return \"全部审批\";\n }\n}\n\nfunction parseApproStatus(value: string | undefined): ApproStatusFilter {\n const raw = value?.trim();\n if (!raw || raw === \"\" || raw.toLowerCase() === \"all\" || raw === \"所有状态\" || raw === \"全部状态\") {\n return { label: \"所有状态\" };\n }\n const normalized = raw.toLowerCase();\n // Alpha Web represents \"重新发起\" variants with both status and preStatus.\n // Keeping this mapping here lets agents pass natural Chinese statuses without\n // learning frontend implementation details.\n const aliases: Record<string, ApproStatusFilter> = {\n pending: { status: 1, label: \"待我审批\" },\n todo: { status: 1, label: \"待我审批\" },\n \"待我审批\": { status: 1, label: \"待我审批\" },\n \"我已通过\": { status: 2, label: \"我已通过\" },\n \"我已驳回\": { status: 3, label: \"我已驳回\" },\n \"他人已处理\": { status: 4, label: \"他人已处理\" },\n \"我转签的\": { status: 5, label: \"我转签的\" },\n \"审批中\": { status: 0, label: \"审批中\" },\n \"已通过\": { status: 1, label: \"已通过\" },\n \"已驳回\": { status: 2, label: \"已驳回\" },\n \"重新发起\": { status: 3, label: \"重新发起\" },\n \"驳回后重新发起\": { status: 3, preStatus: 2, label: \"驳回后重新发起\" },\n \"已撤回\": { status: 4, label: \"已撤回\" },\n \"撤回后重新发起\": { status: 3, preStatus: 4, label: \"撤回后重新发起\" },\n \"已删除\": { status: -1, label: \"已删除\" },\n passed: { status: 1, label: \"已通过\" },\n rejected: { status: 2, label: \"已驳回\" },\n processing: { status: 0, label: \"审批中\" },\n withdrawn: { status: 4, label: \"已撤回\" },\n deleted: { status: -1, label: \"已删除\" },\n };\n if (normalized in aliases) {\n return aliases[normalized];\n }\n if (normalized.includes(\",\")) {\n const [statusPart, preStatusPart] = normalized.split(\",\");\n const status = Number.parseInt(statusPart.trim(), 10);\n const preStatus = Number.parseInt((preStatusPart ?? \"\").trim(), 10);\n if (Number.isNaN(status) || Number.isNaN(preStatus)) {\n throw new Error(\"Invalid appro status pair. Use status,preStatus such as 3,2.\");\n }\n return { status, preStatus, label: formatApproStatus(status, preStatus, \"all\") };\n }\n const parsed = Number.parseInt(normalized, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(\"Invalid appro status. Use a numeric status or all.\");\n }\n return { status: parsed, label: `状态(${parsed})` };\n}\n\nfunction parseNumberList(value: string | undefined): number[] {\n if (!value || value.trim() === \"\" || value.trim().toLowerCase() === \"all\") {\n return [];\n }\n return value.split(\",\").map((part) => {\n const parsed = Number.parseInt(part.trim(), 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid appro type: ${part}`);\n }\n return parsed;\n });\n}\n\nfunction formatApproStatus(\n status: number | string | undefined,\n preStatus: number | string | undefined,\n scope: ApproScope,\n): string {\n const code = typeof status === \"string\" ? Number.parseInt(status, 10) : status;\n const preCode = typeof preStatus === \"string\" ? Number.parseInt(preStatus, 10) : preStatus;\n if (code === 3 && preCode === 2) {\n return \"驳回后重新发起\";\n }\n if (code === 3 && preCode === 4) {\n return \"撤回后重新发起\";\n }\n if (scope === \"my\") {\n switch (code) {\n case 1:\n return \"待我审批\";\n case 2:\n return \"我已通过\";\n case 3:\n return \"我已驳回\";\n case 4:\n return \"他人已处理\";\n case 5:\n return \"我转签的\";\n }\n }\n switch (code) {\n case 0:\n return \"审批中\";\n case 1:\n return \"已通过\";\n case 2:\n return \"已驳回\";\n case 3:\n return \"重新发起\";\n case 4:\n return \"已撤回\";\n case 5:\n return \"已驳回\";\n case 6:\n return \"重新发起\";\n case -1:\n return \"已删除\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatApproType(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"盖章审批\";\n case 1:\n return \"发票审批\";\n case 2:\n return \"报销审批\";\n case 3:\n return \"结项审批\";\n case 4:\n return \"合同审批\";\n case 5:\n return \"立项审批\";\n case 6:\n return \"重启项目审批\";\n case 7:\n return \"编辑项目审批\";\n case 8:\n return \"预立项审批\";\n case 9:\n return \"编辑预立项审批\";\n case 10:\n return \"预立项转进行中审批\";\n case 13:\n return \"完成任务审批\";\n case 14:\n return \"归档审批\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `审批类型(${code})`;\n }\n}\n\nfunction formatMatterLevel(value: unknown): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 1:\n return \"无\";\n case 2:\n return \"低\";\n case 3:\n return \"中\";\n case 4:\n return \"高\";\n default:\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n }\n}\n\nfunction formatSignType(value: unknown): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"线下签署\";\n case 1:\n return \"线上签署\";\n default:\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n }\n}\n\nfunction formatInvoiceType(value: unknown): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 1:\n return \"增值税专用发票\";\n case 2:\n return \"增值税普通发票\";\n case 3:\n return \"电子专用发票\";\n case 4:\n return \"电子普通发票\";\n default:\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n }\n}\n\nfunction formatFlowStatus(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"未处理\";\n case 1:\n return \"待处理\";\n case 2:\n return \"已通过\";\n case 3:\n return \"已驳回\";\n case 4:\n return \"已撤回\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatFlowUserStatus(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"未处理\";\n case 1:\n return \"待处理\";\n case 2:\n return \"已通过\";\n case 3:\n return \"已驳回\";\n case 4:\n return \"已转签\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatUserStatus(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"离职\";\n case 1:\n return \"在职\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatRawStatus(value: number | string | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n return String(value);\n}\n\nfunction normalizeFieldValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n return stripHtml(value);\n }\n return value ?? \"\";\n}\n\nfunction normalizeStringList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).filter(Boolean);\n }\n if (typeof value === \"string\") {\n return value.split(\",\").map((item) => item.trim()).filter(Boolean);\n }\n return [];\n}\n\nfunction formatAttachmentFieldValue(value: unknown): string {\n const count = normalizeStringList(value).length;\n return count ? `${count}个附件,详见顶层附件` : \"\";\n}\n\nfunction formatDateTime(value: string | number | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n\n const date = parseDateTime(value);\n if (!date) {\n return String(value);\n }\n\n // Alpha returns some approval dates as timestamps. Present a stable local\n // datetime for agents and terminal users instead of leaking raw milliseconds.\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hour = String(date.getHours()).padStart(2, \"0\");\n const minute = String(date.getMinutes()).padStart(2, \"0\");\n const second = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hour}:${minute}:${second}`;\n}\n\nfunction parseDateTime(value: string | number): Date | null {\n if (typeof value === \"number\") {\n return dateFromTimestamp(value);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return dateFromTimestamp(Number.parseInt(trimmed, 10));\n }\n\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction dateFromTimestamp(timestamp: number): Date | null {\n if (!Number.isFinite(timestamp)) {\n return null;\n }\n // Ten-digit timestamps are seconds; thirteen-digit timestamps are millis.\n const milliseconds = Math.abs(timestamp) < 10_000_000_000 ? timestamp * 1000 : timestamp;\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction formatFileSize(size: number | undefined): string {\n if (!size || size <= 0) {\n return \"0B\";\n }\n if (size < 1024) {\n return `${size}B`;\n }\n if (size < 1024 * 1024) {\n return `${Number((size / 1024).toFixed(2))}KB`;\n }\n return `${Number((size / 1024 / 1024).toFixed(2))}MB`;\n}\n\nfunction stringField(source: Record<string, unknown>, key: string): string {\n const value = source[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction stripHtml(value: string): string {\n return value.replace(/<[^>]*>/g, \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction clampPage(page: number): number {\n if (!Number.isFinite(page) || page < 1) {\n return 1;\n }\n return Math.floor(page);\n}\n\nfunction clampLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 1) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n\nfunction clampCommentLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 0) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\n\nexport function runCapabilities(version: string): void {\n const environment = getDefaultEnvironmentPreset();\n // This command is the generic agent contract. Keep it stable and conservative:\n // agents should discover supported commands here instead of guessing REST APIs.\n printSuccess({\n \"工具\": {\n \"名称\": \"alpha-classic-cli\",\n \"版本\": version,\n \"所属系统\": \"Alpha 律所管理系统\",\n \"说明\": \"Alpha Classic CLI,用于查询 Alpha 律所管理系统业务数据的 AI-friendly CLI\",\n },\n \"环境\": {\n \"当前环境\": environment.name,\n \"baseUrl\": environment.baseUrl,\n \"apiBaseUrl\": environment.apiBaseUrl,\n \"是否构建时锁定\": true,\n \"切换方式\": \"重新构建对应环境版本,例如 npm run build:dev\",\n },\n \"认证\": {\n \"检查登录\": \"alpha-classic-cli doctor\",\n \"默认登录\": \"alpha-classic-cli login\",\n \"Agent 两阶段登录\": [\n \"alpha-classic-cli login --no-wait --json\",\n \"alpha-classic-cli login --device-code <device_code>\",\n ],\n \"调试 fallback\": \"alpha-classic-cli login --token <token>\",\n \"登出\": \"alpha-classic-cli logout\",\n \"请求头\": [\"token: <token>\", \"deviceType: ai\"],\n \"注意\": \"不要输出 token/refreshToken,不要把 token 写入回答或 URL。\",\n },\n \"版本\": {\n \"机器可读\": \"alpha-classic-cli version\",\n \"纯文本\": \"alpha-classic-cli --version\",\n },\n \"智能体安装\": {\n \"Codex\": \"alpha-classic-cli install --agent codex\",\n \"Claude Code\": \"alpha-classic-cli install --agent claude\",\n \"Alpha-claw\": \"alpha-classic-cli install --agent alphaclaw\",\n \"全部支持的智能体\": \"alpha-classic-cli install --agent all\",\n \"卸载 Codex\": \"alpha-classic-cli uninstall --agent codex\",\n \"卸载 Claude Code\": \"alpha-classic-cli uninstall --agent claude\",\n \"卸载 Alpha-claw\": \"alpha-classic-cli uninstall --agent alphaclaw\",\n \"卸载全部\": \"alpha-classic-cli uninstall --agent all\",\n \"说明\": \"用户自行选择安装目标;Alpha-claw 会按 CLI 构建环境安装到对应 .openclaw-<env>alphaclaw 工作区。\",\n },\n \"输出协议\": {\n \"成功\": { \"ok\": true, \"data\": \"业务数据\" },\n \"失败\": {\n \"ok\": false,\n \"error\": {\n \"type\": \"runtime\",\n \"message\": \"错误信息\",\n \"hint\": \"可选提示\",\n },\n },\n \"说明\": \"外层 ok/data/error 为机器协议,data 内业务字段优先使用中文。\",\n },\n \"命令\": [\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询项目列表\",\n \"命令\": \"alpha-classic-cli matter search\",\n \"别名\": [\"alpha-classic-cli project search\"],\n \"参数\": {\n \"--keyword\": \"可选。项目名称、编号、客户名等自然语言关键词。\",\n \"--status\": \"可选。项目状态:预立项、进行中、进行中+预立项、已完结、已搁置、已归档、全部;默认 进行中+预立项。对应请求体 matterStatusSet:预立项=[0],进行中=[2],进行中+预立项=[2,0],已完结=[4],已搁置=[7],已归档=[6],全部=[0,2,4,6,7]。\",\n \"--scope\": \"可选。项目范围:所有项目、我关注的、已加入的;默认 所有项目。所有项目按前端默认筛选传完整请求体;我关注的按前端只传 isView=true、matchedName、queryOrderPage,不传 matterStatusSet;已加入的按当前用户和全部项目角色生成 memberOfRoles。\",\n \"--limit\": \"可选。默认 10,最大 50。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n },\n \"输出字段\": {\n \"项目状态\": \"本次查询使用的项目状态筛选\",\n \"项目范围\": \"本次查询使用的项目范围筛选\",\n \"总数\": \"匹配项目总数\",\n \"页码\": \"当前页码\",\n \"每页数量\": \"本次查询 pageSize\",\n \"展示字段\": \"项目列表实际展示字段:固定字段加 /matterserver/api/v1/customFields/dashboard/MATTER_LIST 返回的 selectedFields 顺序。\",\n \"项目状态统计\": \"按状态聚合的项目数量\",\n \"项目列表\": [\n \"项目ID\",\n \"项目名称\",\n \"项目状态\",\n \"项目客户\",\n \"项目类型\",\n \"dashboard selectedFields 对应字段\",\n ],\n },\n \"示例\": \"alpha-classic-cli matter search --keyword 合同 --limit 10\",\n },\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询项目详情/概览\",\n \"命令\": \"alpha-classic-cli matter detail\",\n \"参数\": {\n \"--id\": \"必填。项目ID,通常先通过 matter search 获取。\",\n \"--logs\": \"可选。最近动态数量,默认 5,最大 20;传 0 可跳过动态。\",\n },\n \"输出字段\": {\n \"项目概览\": [\n \"项目ID\",\n \"项目名称\",\n \"项目编号\",\n \"项目状态\",\n \"项目类型\",\n \"项目等级\",\n \"客户\",\n \"其他当事人\",\n \"所属\",\n \"案源律师\",\n \"承办律师\",\n \"主办律师\",\n \"协办律师\",\n \"项目成员\",\n \"案由\",\n \"代理审级\",\n \"服务内容\",\n \"开始日期\",\n \"结束日期\",\n \"立项时间\",\n \"结项时间\",\n \"归档日期\",\n \"归档编号\",\n \"项目详情\",\n ],\n \"最近动态\": [\"动态ID\", \"类型\", \"时间\", \"内容\"],\n },\n \"示例\": \"alpha-classic-cli matter detail --id <matterId> --logs 5\",\n },\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询项目下任务列表\",\n \"命令\": \"alpha-classic-cli matter task\",\n \"参数\": {\n \"--id\": \"必填。项目ID,通常先通过 matter search 获取。\",\n \"--state\": \"可选。任务状态:all、未完成、已完成,默认未完成。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 20,最大 50。\",\n \"--type\": \"可选。task 或 group,默认 task。\",\n \"--attention\": \"可选。all 或 我关注的,默认 all。\",\n },\n \"输出字段\": {\n \"项目ID\": \"当前项目ID\",\n \"项目名称\": \"当前项目名称\",\n \"项目类型\": \"当前项目类型\",\n \"状态\": \"查询状态\",\n \"关注\": \"查询关注范围\",\n \"类型\": \"查询任务类型\",\n \"总数\": \"匹配任务总数\",\n \"页码\": \"当前页码\",\n \"每页数量\": \"本次查询 pageSize\",\n \"任务列表\": [\n \"任务ID\",\n \"任务名称\",\n \"任务组\",\n \"状态\",\n \"负责人\",\n \"参与人\",\n \"到期时间\",\n \"开始时间\",\n \"结束时间\",\n \"计时总时长\",\n \"检查项\",\n \"评论数\",\n \"附件数\",\n \"是否关注\",\n \"时间类型\",\n \"全天类型\",\n \"工作类型\",\n \"重复规则\",\n ],\n },\n \"示例\": \"alpha-classic-cli matter task --id <matterId> --state 未完成 --limit 20\",\n },\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询任务详情\",\n \"命令\": \"alpha-classic-cli matter task-detail\",\n \"参数\": {\n \"--id\": \"必填。任务ID,通常先通过 matter task 获取。\",\n \"--comments\": \"可选。最近任务动态和评论数量,默认 10,最大 50;传 0 可跳过。\",\n },\n \"输出字段\": {\n \"任务概览\": [\n \"任务ID\",\n \"任务名称\",\n \"项目ID\",\n \"项目名称\",\n \"任务组\",\n \"状态\",\n \"创建人\",\n \"负责人\",\n \"参与人\",\n \"开始时间\",\n \"到期时间\",\n \"结束时间\",\n \"任务详情\",\n \"检查项\",\n \"子任务\",\n \"评论数\",\n \"动态数\",\n \"附件数\",\n \"计时总时长\",\n \"工作类型\",\n \"重复规则\",\n ],\n \"检查项\": [\"检查项ID\", \"内容\", \"状态\", \"创建时间\", \"更新时间\"],\n \"附件\": [\"文件名\", \"大小\"],\n \"计时\": [\"计时总时长\", \"总数\", \"计时列表\"],\n \"任务动态\": [\"总数\", \"页码\", \"每页数量\", \"动态列表\"],\n },\n \"示例\": \"alpha-classic-cli matter task-detail --id <taskId> --comments 10\",\n },\n {\n \"模块\": \"appro\",\n \"中文名\": \"审批\",\n \"能力\": \"查询审批列表\",\n \"命令\": \"alpha-classic-cli appro list\",\n \"参数\": {\n \"--scope\": \"可选。支持 my/我审批的、started/我发起的、cc/抄送我的、all/全部审批;默认 my。\",\n \"--keyword\": \"可选。审批重要信息、项目名称等关键词。\",\n \"--status\": \"可选。审批状态码、中文状态名或 all,例如 待我审批。\",\n \"--status for scope=my\": [\"all\", \"待我审批\", \"我已通过\", \"我已驳回\", \"他人已处理\", \"我转签的\"],\n \"--status for scope=started|cc|all\": [\n \"all\",\n \"审批中\",\n \"已通过\",\n \"已驳回\",\n \"驳回后重新发起\",\n \"已撤回\",\n \"撤回后重新发起\",\n \"已删除\",\n ],\n \"--appro-type\": \"可选。审批类型ID,多个用英文逗号分隔。\",\n \"--starter-id\": \"可选。发起人用户ID;最终会放入接口 startUserIds。\",\n \"--starter-name\": \"可选。发起人姓名;CLI 会先查发起人列表并解析为 starter-id。\",\n \"--limit\": \"可选。默认 10,最大 50。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--count-only\": \"可选。只返回匹配数量,适合回答“有多少”类问题。\",\n },\n \"输出字段\": {\n \"总数\": \"匹配审批总数\",\n \"页码\": \"当前页码\",\n \"每页数量\": \"本次查询 pageSize\",\n \"审批列表\": [\n \"审批ID\",\n \"审批类型\",\n \"重要信息\",\n \"项目ID\",\n \"项目名称\",\n \"项目编号\",\n \"客户\",\n \"发起人\",\n \"状态\",\n \"当前节点\",\n \"发起时间\",\n \"到达当前节点时间\",\n \"流程任务ID\",\n ],\n },\n \"示例\": [\n \"alpha-classic-cli appro list --scope my --status 待我审批 --count-only\",\n \"alpha-classic-cli appro list --scope started --status 审批中 --limit 10\",\n \"alpha-classic-cli appro list --scope cc --status 驳回后重新发起 --limit 10\",\n \"alpha-classic-cli appro list --scope all --status 已撤回 --limit 10\",\n ],\n },\n {\n \"模块\": \"appro\",\n \"中文名\": \"审批\",\n \"能力\": \"查询审批发起人列表\",\n \"命令\": \"alpha-classic-cli appro initiators\",\n \"参数\": {\n \"--keyword\": \"可选。按发起人姓名过滤。\",\n \"--include-left\": \"可选。包含非在职用户;默认只查在职未删除用户。\",\n \"--limit\": \"可选。默认 50,最大 50。\",\n },\n \"输出字段\": {\n \"总数\": \"匹配发起人数\",\n \"发起人列表\": [\"发起人ID\", \"姓名\", \"手机号\", \"邮箱\", \"状态\"],\n },\n \"示例\": \"alpha-classic-cli appro initiators --keyword 张三\",\n },\n {\n \"模块\": \"appro\",\n \"中文名\": \"审批\",\n \"能力\": \"查询审批详情\",\n \"命令\": \"alpha-classic-cli appro detail\",\n \"参数\": {\n \"--id\": \"必填。审批ID,通常先通过 appro list 获取。\",\n \"--comments\": \"可选。最近用户评论和审批动态数量,默认 10,最大 50;传 0 可跳过。\",\n },\n \"输出字段\": {\n \"审批概览\": [\n \"审批ID\",\n \"审批类型\",\n \"重要信息\",\n \"状态\",\n \"当前节点\",\n \"发起人\",\n \"发起时间\",\n \"更新时间\",\n \"审批编号\",\n \"评论和动态数量\",\n \"流程任务ID\",\n ],\n \"项目信息\": [\"项目ID\", \"项目名称\", \"项目编号\", \"项目类型\", \"项目状态\", \"项目所属\", \"客户\"],\n \"审批表单\": {\n \"表单类型\": \"审批类型名称,例如 立项审批、合同审批、自定义审批。\",\n \"业务分组\": \"按前端审批详情模板展示的分组名输出,例如 合同信息、盖章信息、项目基本信息、项目补充信息、当前程序信息、项目详情、项目成员、关联合同信息、关联收款信息、专票信息、补充信息、备注。自定义 fieldsDtos/formFields 统一并入 补充信息。\",\n },\n \"审批流程\": [\"节点ID\", \"节点名称\", \"节点类型\", \"节点状态\", \"是否当前节点\", \"审批方式\", \"操作时间\", \"审批人\"],\n \"附件\": [\"文件名\", \"大小\"],\n \"用户评论\": [\"总数\", \"页码\", \"每页数量\", \"评论列表\", \"评论ID\", \"类型\", \"评论人\", \"内容\", \"评论时间\"],\n \"审批动态\": [\"总数\", \"页码\", \"每页数量\", \"动态列表\", \"动态ID\", \"类型\", \"操作\", \"操作人\", \"内容\", \"动态时间\"],\n },\n \"示例\": \"alpha-classic-cli appro detail --id <approId> --comments 10\",\n },\n ],\n \"安全规则\": [\n \"当前只支持查询,不执行写操作。\",\n \"不要输出 token。\",\n \"不要自行拼接后端接口,除非用户明确要求使用 api 调试命令。\",\n \"优先使用 capabilities 中声明的稳定业务命令。\",\n \"环境运行时不可切换,避免误连 dev/prod。\",\n ],\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport {\n CLAUDE_GUIDE_TEMPLATE,\n copyDirectory,\n SKILL_NAME,\n SKILL_TEMPLATE_ROOT,\n} from \"./templates.js\";\n\nexport interface InstallState {\n codexSkillPath: string;\n codexSkillInstalled: boolean;\n claudeGuidePath?: string;\n claudeGuideInstalled?: boolean;\n claudeMemoryPath?: string;\n claudeMemoryUpdated?: boolean;\n alphaClawSkillPath?: string;\n alphaClawSkillInstalled?: boolean;\n}\n\nexport type AgentInstallTarget = \"codex\" | \"claude\" | \"alphaclaw\" | \"all\";\n\nexport function resolveCodexSkillPath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".codex\", \"skills\", SKILL_NAME);\n}\n\nexport function resolveClaudeGuidePath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".claude\", \"alpha-classic-cli.md\");\n}\n\nexport function resolveClaudeMemoryPath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".claude\", \"CLAUDE.md\");\n}\n\nexport function resolveAlphaClawSkillPath(homeDir = os.homedir()): string {\n const environment = getDefaultEnvironmentPreset();\n return path.join(\n homeDir,\n `.openclaw-${environment.name}alphaclaw`,\n \"workspace\",\n \"skills\",\n SKILL_NAME,\n );\n}\n\nexport async function installAgentGuides(options?: {\n agent?: AgentInstallTarget;\n homeDir?: string;\n}): Promise<InstallState> {\n const agent = options?.agent ?? \"codex\";\n const result: InstallState = {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n };\n\n if (agent === \"codex\" || agent === \"all\") {\n const codexResult = await installCodexSkill(options);\n result.codexSkillPath = codexResult.codexSkillPath;\n result.codexSkillInstalled = codexResult.codexSkillInstalled;\n }\n if (agent === \"claude\" || agent === \"all\") {\n const claudeResult = await installClaudeGuide(options);\n result.claudeGuidePath = claudeResult.claudeGuidePath;\n result.claudeGuideInstalled = claudeResult.claudeGuideInstalled;\n result.claudeMemoryPath = claudeResult.claudeMemoryPath;\n result.claudeMemoryUpdated = claudeResult.claudeMemoryUpdated;\n }\n if (agent === \"alphaclaw\" || agent === \"all\") {\n const alphaClawResult = await installAlphaClawSkill(options);\n result.alphaClawSkillPath = alphaClawResult.alphaClawSkillPath;\n result.alphaClawSkillInstalled = alphaClawResult.alphaClawSkillInstalled;\n }\n\n return result;\n}\n\nexport async function uninstallAgentGuides(options?: {\n agent?: AgentInstallTarget;\n homeDir?: string;\n}): Promise<InstallState> {\n const agent = options?.agent ?? \"codex\";\n const result: InstallState = {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n };\n\n if (agent === \"codex\" || agent === \"all\") {\n await fs.rm(resolveCodexSkillPath(options?.homeDir), { recursive: true, force: true });\n result.codexSkillInstalled = false;\n }\n if (agent === \"claude\" || agent === \"all\") {\n const claudeResult = await uninstallClaudeGuide(options);\n result.claudeGuidePath = claudeResult.claudeGuidePath;\n result.claudeGuideInstalled = false;\n result.claudeMemoryPath = claudeResult.claudeMemoryPath;\n result.claudeMemoryUpdated = claudeResult.claudeMemoryUpdated;\n }\n if (agent === \"alphaclaw\" || agent === \"all\") {\n await fs.rm(resolveAlphaClawSkillPath(options?.homeDir), { recursive: true, force: true });\n result.alphaClawSkillPath = resolveAlphaClawSkillPath(options?.homeDir);\n result.alphaClawSkillInstalled = false;\n }\n\n return result;\n}\n\nexport async function installCodexSkill(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const skillPath = resolveCodexSkillPath(options?.homeDir);\n await fs.rm(skillPath, { recursive: true, force: true });\n await copyDirectory(SKILL_TEMPLATE_ROOT, skillPath);\n return {\n codexSkillPath: skillPath,\n codexSkillInstalled: true,\n };\n}\n\nexport async function installAlphaClawSkill(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const skillPath = resolveAlphaClawSkillPath(options?.homeDir);\n // Alpha-claw stores skills under an environment-specific workspace. Replacing\n // only this managed skill keeps user-created Alpha-claw skills untouched.\n await fs.rm(skillPath, { recursive: true, force: true });\n await copyDirectory(SKILL_TEMPLATE_ROOT, skillPath);\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n alphaClawSkillPath: skillPath,\n alphaClawSkillInstalled: true,\n };\n}\n\nexport async function installClaudeGuide(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const guidePath = resolveClaudeGuidePath(options?.homeDir);\n const memoryPath = resolveClaudeMemoryPath(options?.homeDir);\n const importLine = \"@~/.claude/alpha-classic-cli.md\";\n\n await fs.mkdir(path.dirname(guidePath), { recursive: true });\n await fs.copyFile(CLAUDE_GUIDE_TEMPLATE, guidePath);\n const memoryUpdated = await ensureClaudeImport(memoryPath, importLine);\n\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n claudeGuidePath: guidePath,\n claudeGuideInstalled: true,\n claudeMemoryPath: memoryPath,\n claudeMemoryUpdated: memoryUpdated,\n };\n}\n\nexport async function uninstallClaudeGuide(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const guidePath = resolveClaudeGuidePath(options?.homeDir);\n const memoryPath = resolveClaudeMemoryPath(options?.homeDir);\n await fs.rm(guidePath, { force: true });\n const memoryUpdated = await removeClaudeImport(memoryPath);\n\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n claudeGuidePath: guidePath,\n claudeGuideInstalled: false,\n claudeMemoryPath: memoryPath,\n claudeMemoryUpdated: memoryUpdated,\n };\n}\n\nexport async function inspectInstallState(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const skillPath = resolveCodexSkillPath(options?.homeDir);\n let installed = false;\n try {\n await fs.access(path.join(skillPath, \"SKILL.md\"));\n installed = true;\n } catch {\n installed = false;\n }\n const claudeGuidePath = resolveClaudeGuidePath(options?.homeDir);\n let claudeGuideInstalled = false;\n try {\n await fs.access(claudeGuidePath);\n claudeGuideInstalled = true;\n } catch {\n claudeGuideInstalled = false;\n }\n const alphaClawSkillPath = resolveAlphaClawSkillPath(options?.homeDir);\n let alphaClawSkillInstalled = false;\n try {\n await fs.access(path.join(alphaClawSkillPath, \"SKILL.md\"));\n alphaClawSkillInstalled = true;\n } catch {\n alphaClawSkillInstalled = false;\n }\n\n return {\n codexSkillPath: skillPath,\n codexSkillInstalled: installed,\n claudeGuidePath,\n claudeGuideInstalled,\n claudeMemoryPath: resolveClaudeMemoryPath(options?.homeDir),\n alphaClawSkillPath,\n alphaClawSkillInstalled,\n };\n}\n\nasync function ensureClaudeImport(memoryPath: string, importLine: string): Promise<boolean> {\n let current = \"\";\n try {\n current = await fs.readFile(memoryPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n throw error;\n }\n }\n\n if (current.includes(importLine) || current.includes(\"alpha-classic-cli.md\")) {\n return false;\n }\n\n // Claude Code supports importing memory files with @path. Append a tiny managed\n // import instead of overwriting the user's existing global CLAUDE.md.\n const prefix = current.trimEnd();\n const next = `${prefix}${prefix ? \"\\n\\n\" : \"\"}# Alpha Classic CLI\\n\\n${importLine}\\n`;\n await fs.mkdir(path.dirname(memoryPath), { recursive: true });\n await fs.writeFile(memoryPath, next, \"utf8\");\n return true;\n}\n\nasync function removeClaudeImport(memoryPath: string): Promise<boolean> {\n let current = \"\";\n try {\n current = await fs.readFile(memoryPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n\n const next = current\n .replace(\n /\\n{0,2}# Alpha Classic CLI\\n\\n@~\\/\\.claude\\/alpha-classic-cli\\.md\\n?/g,\n \"\\n\",\n )\n .replace(/\\n?@~\\/\\.claude\\/alpha-classic-cli\\.md\\n?/g, \"\\n\")\n .trimEnd();\n\n if (next === current.trimEnd()) {\n return false;\n }\n\n await fs.writeFile(memoryPath, next ? `${next}\\n` : \"\", \"utf8\");\n return true;\n}\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport const SKILL_NAME = \"alpha-classic-cli\";\nexport const SKILL_TEMPLATE_ROOT = resolveAssetPath(\"alpha-classic-skill\");\nexport const CLAUDE_GUIDE_TEMPLATE = path.join(\n resolveAssetPath(\"claude\"),\n \"alpha-classic-cli.md\",\n);\n\nfunction resolveAssetPath(assetDirName: string): string {\n // When bundled by tsup, this module runs from dist/index.js, so assets live at\n // ../assets. When run from source with tsx, this module lives under src/install,\n // so assets live at ../../assets. Keep both paths explicit for packaged users.\n const candidates = [\n path.resolve(__dirname, \"..\", \"assets\", assetDirName),\n path.resolve(__dirname, \"..\", \"..\", \"assets\", assetDirName),\n ];\n const match = candidates.find((candidate) => existsSync(candidate));\n return match ?? candidates[0];\n}\n\nexport async function copyDirectory(source: string, target: string): Promise<void> {\n await fs.mkdir(target, { recursive: true });\n const entries = await fs.readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n const sourcePath = path.join(source, entry.name);\n const targetPath = path.join(target, entry.name);\n if (entry.isDirectory()) {\n await copyDirectory(sourcePath, targetPath);\n continue;\n }\n if (entry.isFile()) {\n await fs.copyFile(sourcePath, targetPath);\n }\n }\n}\n","import { ApiClient } from \"../http/api-client.js\";\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { inspectInstallState } from \"../install/install.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport { decodeAlphaJwtClaims } from \"../util/jwt.js\";\n\ninterface CurrentUserResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: CurrentUserData;\n}\n\ninterface CurrentUserData {\n accid?: string;\n id?: string;\n user_id?: string;\n office_id?: string;\n officeId?: string;\n name?: string;\n userName?: string;\n officeName?: string;\n}\n\nexport async function runDoctor(sessionStore: SessionStore): Promise<void> {\n const config = await sessionStore.getConfig();\n let session = await sessionStore.getSession();\n const environment = getDefaultEnvironmentPreset();\n const installState = await inspectInstallState();\n\n let apiCheck: { ok: boolean; message: string } = {\n ok: false,\n message: \"未登录。请执行:alpha-classic-cli login\",\n };\n\n if (session) {\n try {\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n const currentUserResponse = (await client.check()) as CurrentUserResponse;\n const currentUserData = getCurrentUserData(currentUserResponse);\n const userName =\n currentUserData?.name ??\n currentUserData?.userName ??\n session.userName ??\n session.name ??\n \"用户\";\n // Doctor doubles as a lightweight session repair step. Older builds\n // stored userName/tenantId, so a successful me check rewrites the session\n // using the current userId/officeId/name shape.\n if (currentUserResponse.isSuccess !== false && currentUserData) {\n session = await refreshSessionFromCurrentUser(session, currentUserData);\n }\n apiCheck = {\n ok: currentUserResponse.isSuccess !== false,\n message:\n currentUserResponse.isSuccess === false\n ? (currentUserResponse.resultMsg ?? \"登录验证失败\")\n : `${userName},登录成功!`,\n };\n } catch (error) {\n apiCheck = {\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n printSuccess({\n config: {\n environment: environment.name,\n baseUrl: environment.baseUrl,\n apiBaseUrl: environment.apiBaseUrl,\n locked: true,\n source: \"build\",\n configPath: sessionStore.configPath,\n },\n session: session\n ? {\n present: true,\n userId: session.userId ?? \"(unknown)\",\n userName: session.userName ?? session.name ?? \"(unknown)\",\n officeId: session.officeId ?? \"(unknown)\",\n officeName: session.officeName ?? \"(unknown)\",\n environment: environment.name,\n tokenExpireTime: session.tokenExpireTime ?? \"(unknown)\",\n refreshTokenExpireTime: session.refreshTokenExpireTime ?? \"(unknown)\",\n deviceType: session.deviceType ?? \"ai\",\n updatedAt: session.updatedAt,\n }\n : { present: false, hint: \"alpha-classic-cli login\" },\n install: installState,\n apiCheck,\n });\n\n async function refreshSessionFromCurrentUser(\n currentSession: SessionRecord,\n currentUserData: CurrentUserData,\n ): Promise<SessionRecord> {\n const jwtClaims = decodeAlphaJwtClaims(currentSession.token);\n const legacySession = currentSession as SessionRecord & { siteId?: string; siteName?: string };\n const officeId = currentUserData.office_id ?? currentUserData.officeId ?? jwtClaims?.office_id;\n const officeName = currentUserData.officeName ?? jwtClaims?.office_name ?? legacySession.siteName;\n const userName = currentUserData.name ?? currentUserData.userName ?? jwtClaims?.user_name;\n const userId = currentUserData.accid ?? currentUserData.id ?? currentUserData.user_id ?? jwtClaims?.user_id;\n const { siteId: _siteId, siteName: _siteName, ...currentSessionWithoutLegacySite } = legacySession;\n // Keep token and existing timestamps-related context, but overwrite identity\n // fields with the authoritative values returned by Alpha.\n const refreshed: SessionRecord = {\n ...currentSessionWithoutLegacySite,\n ...(userId ? { userId } : {}),\n ...(officeId ?? legacySession.siteId ? { officeId: officeId ?? legacySession.siteId } : {}),\n ...(userName\n ? {\n name: userName,\n userName,\n }\n : {}),\n ...(officeName ? { officeName } : {}),\n ...(currentSession.tokenExpireTime ?? jwtClaims?.exp ? { tokenExpireTime: currentSession.tokenExpireTime ?? jwtClaims?.exp } : {}),\n deviceType: currentSession.deviceType ?? \"ai\",\n updatedAt: new Date().toISOString(),\n };\n await sessionStore.saveSession(refreshed);\n return refreshed;\n }\n}\n\nfunction getCurrentUserData(response: CurrentUserResponse | CurrentUserData): CurrentUserData | undefined {\n return \"data\" in response && response.data ? response.data : response as CurrentUserData;\n}\n","import {\n getDefaultEnvironmentPreset,\n listEnvironmentPresets,\n} from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\nexport async function runEnvCommand(\n action: string | undefined,\n _name: string | undefined,\n _sessionStore: SessionStore,\n): Promise<void> {\n const normalizedAction = action?.trim().toLowerCase() ?? \"current\";\n if (normalizedAction === \"list\") {\n printSuccess(listEnvironmentPresets(), {\n count: listEnvironmentPresets().length,\n });\n return;\n }\n\n if (normalizedAction === \"current\") {\n const fallback = getDefaultEnvironmentPreset();\n printSuccess({\n environment: fallback.name,\n label: fallback.label,\n baseUrl: fallback.baseUrl,\n apiBaseUrl: fallback.apiBaseUrl,\n locked: true,\n source: \"build\",\n });\n return;\n }\n\n if (normalizedAction === \"use\") {\n throw new Error(\n \"env use has been removed. This CLI only exposes env list and env current.\",\n );\n }\n throw new Error(`Unknown env action: ${normalizedAction}`);\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { ApiClient } from \"../http/api-client.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\ninterface MatterSearchOptions {\n keyword?: string;\n limit?: number;\n page?: number;\n status?: string;\n scope?: string;\n}\n\ninterface MatterDetailOptions {\n id: string;\n logs?: number;\n}\n\ninterface MatterTaskListOptions {\n matterId: string;\n state?: string;\n page?: number;\n limit?: number;\n type?: string;\n attention?: string;\n}\n\ninterface MatterTaskDetailOptions {\n id: string;\n comments?: number;\n}\n\ntype MatterSearchScope = \"all\" | \"followed\" | \"joined\";\n\ninterface MatterSearchStatus {\n label: string;\n values: number[];\n}\n\ninterface MatterSearchJoinMember {\n userId: string;\n roleIds: string[];\n}\n\ninterface AlphaMatterDetailResponse {\n resultCode?: string;\n resultMess?: string;\n data?: AlphaMatterDetailItem[];\n}\n\ninterface AlphaMatterDetailItem {\n pkId?: string;\n name?: string;\n status?: string;\n statusName?: string;\n matterNo?: string;\n matterType?: string;\n matterTypeName?: string;\n childMatterTypeName?: string;\n matterCaseName?: string;\n caseProcessName?: string;\n lawFieldName?: string;\n beginDate?: string;\n endDate?: string;\n openDate?: string;\n closeDate?: string;\n filingDate?: string;\n filingNo?: string;\n startMatterTime?: string;\n endMatterTime?: string;\n level?: string;\n remark?: string;\n matterOwner?: string;\n matterOwnerName?: string;\n groups?: Array<{ groupPkid?: string; name?: string }>;\n clients?: AlphaMatterContact[];\n litigants?: AlphaMatterContact[];\n relevants?: Array<{\n contactPkid?: string;\n contactName?: string;\n type?: string;\n isDeleted?: boolean;\n }>;\n attorneys?: AlphaMatterAttorney[];\n undertakeAttorneys?: AlphaMatterAttorney[];\n responsibleAttorneys?: AlphaMatterAttorney[];\n assistAttorneys?: AlphaMatterAttorney[];\n originatingAttorneys?: AlphaMatterAttorney[];\n otherAttorneys?: AlphaMatterAttorney[];\n members?: Array<{\n userId?: string;\n userName?: string;\n roleName?: string;\n approver?: boolean;\n }>;\n}\n\ninterface AlphaMatterAttorney {\n attorneyPkid?: string;\n attorneyName?: string;\n attorneyType?: string;\n}\n\ninterface AlphaMatterContact {\n contactPkid?: string;\n contactName?: string;\n customerPositionName?: string;\n contactType?: string;\n type?: string;\n isDeleted?: boolean;\n}\n\ninterface AlphaMatterLogResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterLogItem[];\n}\n\ninterface AlphaMatterLogItem {\n id?: string;\n type?: string;\n create_time?: string;\n createTime?: string;\n content?: string;\n}\n\ninterface AlphaMatterTaskListResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n result?: AlphaMatterTaskPage;\n data?: AlphaMatterTaskPage;\n}\n\ninterface AlphaMatterTaskDetailResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaMatterTaskItem;\n}\n\ninterface AlphaMatterTaskCheckItemResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTaskCheckItem[];\n}\n\ninterface AlphaMatterTaskAttachmentResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTaskAttachmentPage;\n}\n\ninterface AlphaMatterTaskTimingResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTaskTimingPage;\n}\n\ninterface AlphaMatterTaskCommentResponse {\n succeed?: boolean;\n message?: string;\n detail?: string;\n result?: AlphaMatterTaskCommentPage;\n}\n\ninterface AlphaDocumentDirListResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaDocumentFileInfo[];\n}\n\ninterface AlphaMatterRoleResponse {\n data?: Array<{\n id?: string | number;\n name?: string;\n }>;\n}\n\ninterface AlphaMatterTaskPage {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n count?: number;\n items?: AlphaMatterTaskItem[];\n data?: AlphaMatterTaskGroup[];\n}\n\ninterface AlphaMatterTaskGroup {\n id?: string;\n matterId?: string;\n matterName?: string;\n name?: string;\n state?: number;\n valid?: number;\n finishedTaskCount?: number;\n unfinishedTaskCount?: number;\n deletedTaskCount?: number;\n tasks?: AlphaMatterTaskItem[];\n}\n\ninterface AlphaMatterTaskItem {\n id?: string;\n matterId?: string;\n matterName?: string;\n name?: string;\n parentId?: string;\n parentName?: string;\n taskGroupId?: string;\n taskGroupName?: string;\n type?: number;\n state?: boolean | number;\n valid?: boolean | number;\n dueTime?: string | number;\n startTime?: string | number;\n endTime?: string | number;\n finishTime?: string | number;\n timingSum?: number;\n itemCount?: number;\n doneItemCount?: number;\n completedItemCount?: number;\n subtaskCount?: number;\n completedSubtaskCount?: number;\n deletedSubtaskCount?: number;\n commentCount?: number;\n dynamicCount?: number;\n attachmentCount?: number;\n safeBoxFileCount?: number;\n detail?: string;\n repeatId?: string;\n repeatSetting?: {\n id?: string;\n repeatRule?: string;\n customRepeatRule?: string;\n dayIndexList?: number[];\n endType?: string;\n endByDate?: string | number;\n endByTimes?: number;\n };\n timeType?: number;\n dayType?: number;\n workTypeId?: string;\n workType?: {\n id?: string;\n name?: string;\n };\n attentioned?: number;\n favorite?: boolean | number;\n attendeeUsers?: Array<{\n userId?: string;\n userName?: string;\n pic?: string;\n }>;\n assignUser?: {\n userId?: string;\n userName?: string;\n pic?: string;\n };\n attendees?: Array<{\n userId?: string;\n userName?: string;\n name?: string;\n pic?: string;\n }>;\n createUser?: {\n userId?: string;\n userName?: string;\n pic?: string;\n };\n matter?: {\n id?: string;\n name?: string;\n matterType?: string;\n };\n}\n\ninterface AlphaMatterTaskCheckItem {\n id?: string;\n name?: string;\n content?: string;\n state?: boolean | number;\n completed?: boolean;\n taskId?: string;\n orderNum?: number;\n gmtCreate?: string | number;\n gmtModified?: string | number;\n}\n\ninterface AlphaMatterTaskAttachmentPage {\n pageIndex?: number;\n pageSize?: number;\n count?: number;\n totalCount?: number;\n data?: AlphaMatterTaskAttachment[];\n items?: AlphaMatterTaskAttachment[];\n}\n\ninterface AlphaMatterTaskAttachment {\n id?: string;\n fileId?: string;\n fileName?: string;\n name?: string;\n path?: string;\n filePath?: string;\n pathInfoVo?: {\n fileId?: string;\n filePath?: string;\n repoId?: string;\n type?: string;\n };\n size?: number;\n fileSize?: number;\n createTime?: string | number;\n gmtCreate?: string | number;\n}\n\ninterface AlphaDocumentFileInfo {\n id?: string;\n name?: string;\n type?: string;\n size?: number;\n permission?: string;\n mtime?: number;\n isLocked?: boolean;\n lockedByMe?: boolean | null;\n lockTime?: string | number | null;\n lock_owner?: string | null;\n modifier_name?: string;\n modifierEmail?: string;\n}\n\ninterface AlphaMatterTaskTimingPage {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n timingSum?: number | null;\n allTimingSum?: number | null;\n items?: AlphaMatterTaskTimingItem[];\n datas?: AlphaMatterTaskTimingItem[] | null;\n}\n\ninterface AlphaMatterTaskTimingItem {\n id?: string;\n userName?: string;\n user?: { userName?: string; name?: string };\n startTime?: string | number;\n endTime?: string | number;\n timingSum?: number;\n workType?: { name?: string };\n}\n\ninterface AlphaMatterTaskCommentPage {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n items?: AlphaMatterTaskCommentItem[];\n}\n\ninterface AlphaMatterTaskCommentItem {\n id?: string;\n content?: string;\n comment?: string;\n createUserId?: string;\n createUser?: {\n userId?: string;\n userName?: string;\n name?: string;\n pic?: string;\n };\n createTime?: string | number;\n createTimeFormat?: string;\n updateTime?: string | number;\n hostId?: string;\n concreteType?: number;\n}\n\ninterface AlphaMatterSearchResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: {\n totalCount?: number;\n matterStatusItems?: AlphaMatterStatusItem[];\n matterSearchElementVOs?: AlphaMatterItem[];\n };\n}\n\ninterface AlphaMatterCustomFieldsResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: {\n selectedFields?: AlphaMatterCustomField[];\n };\n}\n\ninterface AlphaMatterCustomField {\n customFieldId?: string;\n customFieldName?: string;\n customFieldValue?: string;\n customFieldType?: string;\n customFieldKey?: string;\n showType?: string | number;\n}\n\ninterface AlphaMatterStatusItem {\n matterStatus?: number;\n count?: number;\n}\n\ninterface AlphaMatterItem {\n [key: string]: unknown;\n pkId?: string;\n name?: string;\n status?: unknown;\n statusName?: string;\n matterNo?: string;\n matterTypeName?: string;\n childrenMatterTypeName?: string;\n legalTypeName?: string;\n caseProcessName?: string;\n openDate?: string;\n endMatterTime?: string;\n filingDate?: string;\n startMatterTime?: string;\n serviceStartRangeTime?: string;\n serviceEndRangeTime?: string;\n filingNo?: string;\n matterRemark?: string;\n sealCount?: number;\n sumTime?: number;\n matterLevel?: number;\n matterDynamicContent?: {\n content?: string;\n taskName?: string;\n actionTime?: string;\n description?: string;\n title?: string;\n createTime?: string;\n time?: string;\n };\n clients?: Array<{\n clientId?: string;\n clientName?: string;\n clientType?: string;\n }>;\n matterOwners?: Array<{\n ownerId?: string;\n ownerName?: string;\n ownerType?: string;\n }>;\n matterSourceLawyer?: Array<{ userName?: string; name?: string }>;\n matterReasonMessage?: string[];\n startUserName?: string;\n processEsEntities?: Array<{\n courtTime?: string;\n processName?: string;\n court?: string;\n }>;\n members?: Array<{ userName?: string; name?: string }>;\n undertakeLaywer?: Array<{ userName?: string; name?: string }>;\n otherParty?: Array<{ userName?: string; name?: string }>;\n financeDTO?: Record<string, unknown>;\n expandMatters?: Record<string, unknown>;\n unfinishTask?: number;\n allTask?: number;\n myStar?: string;\n}\n\nexport async function runMatterSearch(\n options: MatterSearchOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const limit = clampLimit(options.limit ?? 10);\n const page = Math.max(1, options.page ?? 1);\n const status = parseMatterSearchStatus(options.status);\n const scope = parseMatterSearchScope(options.scope);\n const joinMember = scope === \"joined\"\n ? await buildJoinedMatterMemberFilter(client, sessionStore)\n : undefined;\n const [selectedFields, response] = await Promise.all([\n fetchMatterListSelectedFields(client),\n client.request<AlphaMatterSearchResponse>(\n \"POST\",\n \"/matterserver/api/v2/matter/search\",\n {\n data: buildMatterSearchBody({\n keyword: options.keyword ?? \"\",\n limit,\n page,\n status,\n scope,\n joinMember,\n }),\n },\n ),\n ]);\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter search failed.\");\n }\n\n const responseData = unwrapEnvelopeData<NonNullable<AlphaMatterSearchResponse[\"data\"]>>(response);\n const projects = responseData?.matterSearchElementVOs ?? [];\n const displayedFields = getMatterListDisplayedFields(selectedFields);\n printSuccess({\n \"项目状态\": scope === \"followed\" ? \"未传状态筛选(我关注的)\" : status.label,\n \"项目范围\": formatMatterSearchScopeLabel(scope),\n \"总数\": responseData?.totalCount ?? projects.length,\n \"页码\": page,\n \"每页数量\": limit,\n \"展示字段\": displayedFields,\n \"项目状态统计\": (responseData?.matterStatusItems ?? []).map(toMatterStatusSummary),\n \"项目列表\": projects.map((project) => toMatterSummary(project, selectedFields)),\n });\n}\n\nexport async function runMatterDetail(\n options: MatterDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const matterId = options.id.trim();\n if (!matterId) {\n throw new Error(\"Missing matter id. Use: alpha-classic-cli matter detail --id <matterId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n // The overview page loads the main project detail from this endpoint. Keep the\n // CLI detail command centered on the same read API, then optionally add logs.\n const detailResponse = await client.request<AlphaMatterDetailResponse>(\n \"GET\",\n `/matterserver/api/v2/matters/${encodeURIComponent(matterId)}`,\n );\n if (detailResponse.resultCode && detailResponse.resultCode !== \"1\") {\n throw new Error(detailResponse.resultMess ?? \"Matter detail request failed.\");\n }\n\n const detailData = unwrapEnvelopeData<AlphaMatterDetailResponse[\"data\"]>(detailResponse);\n const matter = detailData?.[0];\n if (!matter) {\n throw new Error(\"项目不存在或当前用户无权查看。\");\n }\n\n const logLimit = clampLogLimit(options.logs ?? 5);\n const logs = logLimit\n ? await fetchMatterLogs(client, matterId, logLimit)\n : [];\n\n printSuccess({\n \"项目概览\": toMatterDetailSummary(matter),\n \"最近动态\": logs.map(toMatterLogSummary),\n });\n}\n\nexport async function runMatterTaskList(\n options: MatterTaskListOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const matterId = options.matterId.trim();\n if (!matterId) {\n throw new Error(\"Missing matter id. Use: alpha-classic-cli matter task --id <matterId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 20);\n const stateType = parseMatterTaskState(options.state);\n const type = parseMatterTaskType(options.type);\n const attentionType = parseMatterAttentionType(options.attention);\n const statusType = toMatterTaskStatusType(stateType);\n\n const response = await client.request<AlphaMatterTaskListResponse>(\n \"GET\",\n \"/taskserver/api/v1/tasks/listTaskByMatter\",\n {\n params: {\n matterId,\n statusType,\n pageIndex: page,\n pageSize: limit,\n searchSub: true,\n },\n },\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Matter task list request failed.\");\n }\n\n const responseData = unwrapEnvelopeData<AlphaMatterTaskListResponse[\"data\"]>(response);\n const pageData = response.result ?? responseData ?? {};\n const groups = pageData.data ?? [];\n const tasks = pageData.items ?? flattenMatterTaskGroups(groups);\n const firstMatter = tasks[0]?.matter;\n printSuccess({\n \"项目ID\": matterId,\n \"项目名称\": firstMatter?.name ?? tasks[0]?.matterName ?? \"\",\n \"项目类型\": firstMatter?.matterType ?? \"\",\n \"状态\": formatMatterTaskStateLabel(stateType),\n \"关注\": formatMatterAttentionLabel(attentionType),\n \"类型\": formatMatterTaskTypeLabel(type),\n \"总数\": pageData.totalCount ?? pageData.count ?? tasks.length,\n \"页码\": pageData.pageIndex ?? page,\n \"每页数量\": pageData.pageSize ?? limit,\n \"任务列表\": type === 1 ? groups.map(toMatterTaskGroupSummary) : tasks.map(toMatterTaskSummary),\n });\n}\n\nexport async function runMatterTaskDetail(\n options: MatterTaskDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const taskId = options.id.trim();\n if (!taskId) {\n throw new Error(\"Missing task id. Use: alpha-classic-cli matter task-detail --id <taskId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const commentsLimit = clampCommentLimit(options.comments);\n const [detailResponse, checkItemResponse, attachmentResponse, timingResponse, commentResponse] =\n await Promise.all([\n client.request<AlphaMatterTaskDetailResponse>(\n \"GET\",\n `/taskserver/api/v1/tasks/${encodeURIComponent(taskId)}`,\n ),\n client.request<AlphaMatterTaskCheckItemResponse>(\n \"GET\",\n `/taskserver/api/v1/checkitem/${encodeURIComponent(taskId)}`,\n ),\n client.request<AlphaMatterTaskAttachmentResponse>(\n \"GET\",\n `/taskserver/api/v1/tasks/attachment/${encodeURIComponent(taskId)}`,\n {\n params: {\n pageIndex: 1,\n pageSize: 50,\n },\n },\n ),\n client.request<AlphaMatterTaskTimingResponse>(\n \"GET\",\n `/taskserver/api/v2/timing/timing/task/${encodeURIComponent(taskId)}`,\n {\n params: {\n pageIndex: 1,\n pageSize: commentsLimit,\n },\n },\n ),\n commentsLimit\n ? client.request<AlphaMatterTaskCommentResponse>(\n \"GET\",\n \"/ilaw/api/v2/comment/queryCommentsAndDynamic\",\n {\n params: {\n hostId: taskId,\n pageIndex: 1,\n pageSize: commentsLimit,\n },\n },\n )\n : Promise.resolve<AlphaMatterTaskCommentResponse>({\n succeed: true,\n result: { pageIndex: 1, pageSize: 0, totalCount: 0, items: [] },\n }),\n ]);\n\n if (detailResponse.isSuccess === false) {\n throw new Error(detailResponse.resultMsg ?? detailResponse.message ?? \"Matter task detail request failed.\");\n }\n if (checkItemResponse.isSuccess === false) {\n throw new Error(checkItemResponse.resultMsg ?? \"Matter task check items request failed.\");\n }\n if (attachmentResponse.isSuccess === false) {\n throw new Error(attachmentResponse.resultMsg ?? \"Matter task attachments request failed.\");\n }\n if (timingResponse.isSuccess === false) {\n throw new Error(timingResponse.resultMsg ?? \"Matter task timing request failed.\");\n }\n if (commentResponse.succeed === false) {\n throw new Error(commentResponse.message ?? commentResponse.detail ?? \"Matter task comments request failed.\");\n }\n\n const task = detailResponse.data;\n if (!task) {\n throw new Error(\"任务不存在或当前用户无权查看。\");\n }\n const attachmentPage = attachmentResponse.data ?? {};\n const attachments = attachmentPage.data ?? attachmentPage.items ?? [];\n const attachmentDetails = await fetchDocumentDetailsForAttachments(client, attachments);\n const timingPage = timingResponse.data ?? {};\n const commentPage = commentResponse.result ?? {};\n printSuccess({\n \"任务概览\": toMatterTaskDetailSummary(task),\n \"检查项\": (checkItemResponse.data ?? []).map(toMatterTaskCheckItemSummary),\n \"附件\": attachments.map((attachment) =>\n toMatterTaskAttachmentSummary(attachment, attachmentDetails.get(getAttachmentDocumentKey(attachment))),\n ),\n \"计时\": {\n \"计时总时长\": formatTotalTiming(timingPage.timingSum ?? timingPage.allTimingSum ?? 0),\n \"总数\": timingPage.totalCount ?? (timingPage.items ?? timingPage.datas ?? []).length,\n \"计时列表\": (timingPage.items ?? timingPage.datas ?? []).map(toMatterTaskTimingSummary),\n },\n \"任务动态\": {\n \"总数\": commentPage.totalCount ?? (commentPage.items ?? []).length,\n \"页码\": commentPage.pageIndex ?? 1,\n \"每页数量\": commentPage.pageSize ?? commentsLimit,\n \"动态列表\": (commentPage.items ?? []).map(toMatterTaskCommentSummary),\n },\n });\n}\n\nfunction buildMatterSearchBody(options: {\n keyword: string;\n limit: number;\n page: number;\n status: MatterSearchStatus;\n scope: MatterSearchScope;\n joinMember?: MatterSearchJoinMember;\n}): Record<string, unknown> {\n const today = formatLocalDate(new Date());\n const emptyRange = createEmptyTimeRange(today);\n const queryOrderPage = {\n order: {\n orderItems: [\n { isAsc: false, property: \"is_view\" },\n { isAsc: false, property: \"matter_name\" },\n ],\n },\n page: {\n pageSize: options.limit,\n startIndex: options.page,\n },\n };\n\n if (options.scope === \"followed\") {\n // Keep this branch byte-for-byte close to Alpha Web's \"我关注的\" tab request:\n // it intentionally drops status and advanced filters, then only sends isView.\n return {\n isView: true,\n matchedName: options.keyword.trim(),\n queryOrderPage,\n };\n }\n\n // This body mirrors the Alpha Web project list's default filter payload. The\n // CLI only exposes a small AI-friendly surface for now, but keeps the backend\n // defaults explicit so future filter additions do not accidentally change the\n // query semantics.\n const body: Record<string, unknown> = {\n createUserIds: [],\n customerIds: [],\n customerOrAnd: false,\n departmentIds: [],\n belongIngOrAnd: false,\n matchedName: options.keyword.trim(),\n matterCases: [],\n matterCasesOrAnd: false,\n matterLevels: [],\n matterOwnerIds: [],\n matterStatusSet: options.status.values,\n memberOfRoles: [],\n memberRolesOrAnd: false,\n nowProcessIds: [],\n nowProcessOrAnd: false,\n subMatterTypes: [],\n serviceStartRangeTime: emptyRange,\n serviceEndRangeTime: emptyRange,\n filingDate: emptyRange,\n startMatterTime: emptyRange,\n endMatterTime: emptyRange,\n createTime: emptyRange,\n rangeOfTargetAmount: { min: null, max: null },\n dynamicStatus: false,\n oppositePeopleName: \"\",\n attorneyIds: [],\n attorneyOrAnd: false,\n undertakeIds: [],\n startUserIds: [],\n totalContractAmount: { min: null, max: null },\n totalContractTargetAmount: { min: null, max: null },\n undertakeOrAnd: false,\n itemOrAnd: false,\n queryOrderPage,\n matterStageIds: [],\n expandMatterSearchParamVO: {\n inputSelect: {},\n selectBox: {},\n associateCustomer: {},\n associateMember: {},\n associateDepartment: {},\n associateMatter: {},\n timeSelect: {},\n },\n };\n if (options.scope === \"joined\" && options.joinMember) {\n body.memberOfRoles = [\n {\n userId: options.joinMember.userId,\n roleIds: options.joinMember.roleIds,\n },\n ];\n }\n return body;\n}\n\nasync function fetchMatterListSelectedFields(client: ApiClient): Promise<AlphaMatterCustomField[]> {\n const response = await client.request<AlphaMatterCustomFieldsResponse>(\n \"GET\",\n \"/matterserver/api/v1/customFields/dashboard/MATTER_LIST\",\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter list custom fields request failed.\");\n }\n const data = unwrapEnvelopeData<NonNullable<AlphaMatterCustomFieldsResponse[\"data\"]>>(response);\n return data?.selectedFields ?? [];\n}\n\nfunction getMatterListDisplayedFields(selectedFields: AlphaMatterCustomField[]): string[] {\n return [\n \"项目名称\",\n \"项目状态\",\n \"项目客户\",\n \"项目类型\",\n ...selectedFields.map((field) => formatCustomFieldLabel(field)).filter(Boolean),\n ];\n}\n\nfunction toMatterSummary(\n item: AlphaMatterItem,\n selectedFields: AlphaMatterCustomField[],\n): Record<string, unknown> {\n const summary: Record<string, unknown> = {\n \"项目ID\": item.pkId ?? \"\",\n \"项目名称\": item.name ?? \"\",\n \"项目状态\": item.statusName || formatMatterStatus(toNumber(item.status)),\n \"项目客户\": (item.clients ?? []).map((client) => client.clientName ?? \"\").filter(Boolean),\n \"项目类型\": formatMatterType(item),\n };\n for (const field of selectedFields) {\n const label = formatCustomFieldLabel(field);\n if (!label || label in summary) {\n continue;\n }\n summary[label] = formatMatterListFieldValue(item, field);\n }\n return summary;\n}\n\nfunction toMatterStatusSummary(item: AlphaMatterStatusItem): Record<string, unknown> {\n return {\n \"状态\": formatMatterStatus(item.matterStatus),\n \"状态码\": item.matterStatus ?? null,\n \"数量\": item.count ?? 0,\n };\n}\n\nfunction toMatterDetailSummary(item: AlphaMatterDetailItem): Record<string, unknown> {\n const status = typeof item.status === \"number\" ? item.status : undefined;\n const level = typeof item.level === \"number\" ? item.level : undefined;\n\n return {\n \"项目ID\": item.pkId ?? \"\",\n \"项目名称\": item.name ?? \"\",\n \"项目编号\": item.matterNo ?? \"\",\n \"项目状态\": item.statusName || formatMatterStatus(status),\n \"项目类型\": [item.matterTypeName, item.childMatterTypeName].filter(Boolean).join(\" / \"),\n \"项目等级\": formatMatterLevel(level),\n \"客户\": formatContacts(item.clients),\n \"其他当事人\": formatContacts([...(item.litigants ?? []), ...(item.relevants ?? [])]),\n \"所属\": formatMatterBelong(item),\n \"案源律师\": formatAttorneys(item.attorneys ?? item.originatingAttorneys),\n \"承办律师\": formatAttorneys(item.undertakeAttorneys),\n \"主办律师\": formatAttorneys(item.responsibleAttorneys),\n \"协办律师\": formatAttorneys(item.assistAttorneys),\n \"项目成员\": formatMembers(item.members),\n \"案由\": item.matterCaseName ?? \"\",\n \"代理审级\": item.caseProcessName ?? \"\",\n \"服务内容\": item.lawFieldName ?? \"\",\n \"开始日期\": item.beginDate ?? \"\",\n \"结束日期\": item.endDate ?? \"\",\n \"立项时间\": item.startMatterTime ?? item.openDate ?? \"\",\n \"结项时间\": item.endMatterTime ?? item.closeDate ?? \"\",\n \"归档日期\": item.filingDate ?? \"\",\n \"归档编号\": item.filingNo ?? \"\",\n \"项目详情\": item.remark ?? \"\",\n };\n}\n\nasync function fetchMatterLogs(\n client: ApiClient,\n matterId: string,\n limit: number,\n): Promise<AlphaMatterLogItem[]> {\n const response = await client.request<AlphaMatterLogResponse>(\n \"GET\",\n `/notice/v1/dynamics/matters/${encodeURIComponent(matterId)}`,\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter logs request failed.\");\n }\n const data = unwrapEnvelopeData<AlphaMatterLogResponse[\"data\"]>(response);\n return (data ?? []).slice(0, limit);\n}\n\nasync function fetchDocumentDetailsForAttachments(\n client: ApiClient,\n attachments: AlphaMatterTaskAttachment[],\n): Promise<Map<string, AlphaDocumentFileInfo>> {\n const directories = new Map<string, { repoId: string; path: string }>();\n for (const attachment of attachments) {\n const repoId = getAttachmentRepoId(attachment);\n const filePath = getAttachmentPath(attachment);\n if (!repoId || !filePath) {\n continue;\n }\n const directoryPath = getDirectoryPath(filePath);\n directories.set(`${repoId}|${directoryPath}`, { repoId, path: directoryPath });\n }\n\n const filesByDirectory = await Promise.all(\n [...directories.values()].map(async (directory) => {\n const response = await client.request<AlphaDocumentDirListResponse>(\n \"GET\",\n \"/document-engine/api/v1/dir/list\",\n {\n params: {\n repoId: directory.repoId,\n p: directory.path,\n },\n },\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Document file detail request failed.\");\n }\n const data = unwrapEnvelopeData<AlphaDocumentDirListResponse[\"data\"]>(response);\n return { directory, files: data ?? [] };\n }),\n );\n\n const details = new Map<string, AlphaDocumentFileInfo>();\n for (const attachment of attachments) {\n const repoId = getAttachmentRepoId(attachment);\n const filePath = getAttachmentPath(attachment);\n if (!repoId || !filePath) {\n continue;\n }\n const directoryPath = getDirectoryPath(filePath);\n const directoryFiles = filesByDirectory.find(\n (item) => item.directory.repoId === repoId && item.directory.path === directoryPath,\n )?.files ?? [];\n const fileId = getAttachmentFileId(attachment);\n const fileName = getFileNameFromPath(filePath);\n const match = directoryFiles.find((file) => fileId ? file.id === fileId : file.name === fileName);\n if (match) {\n details.set(getAttachmentDocumentKey(attachment), match);\n }\n }\n return details;\n}\n\nfunction toMatterLogSummary(item: AlphaMatterLogItem): Record<string, unknown> {\n const content = parseLogContent(item.content);\n return {\n \"动态ID\": item.id ?? \"\",\n \"类型\": item.type ?? \"\",\n \"时间\": item.create_time ?? item.createTime ?? \"\",\n \"内容\": content,\n };\n}\n\nfunction flattenMatterTaskGroups(groups: AlphaMatterTaskGroup[]): AlphaMatterTaskItem[] {\n return groups.flatMap((group) =>\n (group.tasks ?? []).map((task) => ({\n ...task,\n parentName: task.parentName ?? group.name,\n taskGroupName: task.taskGroupName ?? group.name,\n })),\n );\n}\n\nfunction toMatterTaskGroupSummary(group: AlphaMatterTaskGroup): Record<string, unknown> {\n return {\n \"任务ID\": group.id ?? \"\",\n \"任务名称\": group.name ?? \"\",\n \"任务组\": \"\",\n \"状态\": group.state === 1 ? \"已完成\" : \"未完成\",\n \"负责人\": [],\n \"参与人\": [],\n \"到期时间\": \"\",\n \"开始时间\": \"\",\n \"结束时间\": \"\",\n \"计时总时长\": \"\",\n \"检查项\": {\n \"总数\": 0,\n \"已完成\": 0,\n },\n \"评论数\": 0,\n \"附件数\": 0,\n \"是否关注\": false,\n \"时间类型\": \"\",\n \"全天类型\": \"\",\n \"工作类型\": \"\",\n \"重复规则\": \"\",\n \"任务统计\": {\n \"未完成\": group.unfinishedTaskCount ?? 0,\n \"已完成\": group.finishedTaskCount ?? 0,\n \"已删除\": group.deletedTaskCount ?? 0,\n },\n };\n}\n\nfunction toMatterTaskSummary(item: AlphaMatterTaskItem): Record<string, unknown> {\n return {\n \"任务ID\": item.id ?? \"\",\n \"任务名称\": item.name ?? \"\",\n \"任务组\": item.parentName ?? item.taskGroupName ?? \"\",\n \"状态\": item.state === true || item.state === 1 ? \"已完成\" : \"未完成\",\n \"负责人\": formatTaskUsers(item.assignUser ? [item.assignUser] : []),\n \"参与人\": formatTaskUsers(item.attendeeUsers ?? item.attendees),\n \"到期时间\": formatDateTime(item.dueTime),\n \"开始时间\": formatDateTime(item.startTime),\n \"结束时间\": formatDateTime(item.endTime),\n \"计时总时长\": formatTotalTiming(item.timingSum),\n \"检查项\": {\n \"总数\": item.itemCount ?? 0,\n \"已完成\": item.doneItemCount ?? item.completedItemCount ?? 0,\n },\n \"评论数\": item.commentCount ?? 0,\n \"附件数\": item.attachmentCount ?? 0,\n \"是否关注\": item.attentioned === 1 || item.favorite === true || item.favorite === 1,\n \"时间类型\": formatMatterTaskTimeType(item.timeType),\n \"全天类型\": formatMatterTaskDayType(item.dayType),\n \"工作类型\": formatTaskWorkType(item.workType),\n \"重复规则\": formatTaskRepeatSetting(item.repeatSetting),\n };\n}\n\nfunction toMatterTaskDetailSummary(item: AlphaMatterTaskItem): Record<string, unknown> {\n return {\n \"任务ID\": item.id ?? \"\",\n \"任务名称\": item.name ?? \"\",\n \"项目ID\": item.matterId ?? \"\",\n \"项目名称\": item.matterName ?? item.matter?.name ?? \"\",\n \"任务组\": item.taskGroupName ?? item.parentName ?? \"\",\n \"状态\": item.state === true || item.state === 1 ? \"已完成\" : \"未完成\",\n \"是否有效\": item.valid === true || item.valid === 1,\n \"创建人\": formatTaskUser(item.createUser),\n \"负责人\": formatTaskUsers(item.assignUser ? [item.assignUser] : []),\n \"参与人\": formatTaskUsers(item.attendeeUsers ?? item.attendees),\n \"开始时间\": formatDateTime(item.startTime),\n \"到期时间\": formatDateTime(item.dueTime),\n \"结束时间\": formatDateTime(item.endTime),\n \"完成时间\": formatDateTime(item.finishTime),\n \"任务详情\": item.detail ?? \"\",\n \"检查项\": {\n \"总数\": item.itemCount ?? 0,\n \"已完成\": item.doneItemCount ?? item.completedItemCount ?? 0,\n },\n \"子任务\": {\n \"总数\": item.subtaskCount ?? 0,\n \"已完成\": item.completedSubtaskCount ?? 0,\n \"已删除\": item.deletedSubtaskCount ?? 0,\n },\n \"评论数\": item.commentCount ?? 0,\n \"动态数\": item.dynamicCount ?? 0,\n \"附件数\": item.attachmentCount ?? 0,\n \"保险箱文件数\": item.safeBoxFileCount ?? 0,\n \"计时总时长\": formatTotalTiming(item.timingSum),\n \"是否关注\": item.attentioned === 1 || item.favorite === true || item.favorite === 1,\n \"时间类型\": formatMatterTaskTimeType(item.timeType),\n \"全天类型\": formatMatterTaskDayType(item.dayType),\n \"工作类型\": formatTaskWorkType(item.workType),\n \"重复规则\": formatTaskRepeatSetting(item.repeatSetting),\n };\n}\n\nfunction toMatterTaskCheckItemSummary(item: AlphaMatterTaskCheckItem): Record<string, unknown> {\n return {\n \"检查项ID\": item.id ?? \"\",\n \"内容\": item.name ?? item.content ?? \"\",\n \"状态\": item.state === true || item.state === 1 || item.completed ? \"已完成\" : \"未完成\",\n \"创建时间\": formatDateTime(item.gmtCreate),\n \"更新时间\": formatDateTime(item.gmtModified),\n };\n}\n\nfunction toMatterTaskAttachmentSummary(\n item: AlphaMatterTaskAttachment,\n detail?: AlphaDocumentFileInfo,\n): Record<string, unknown> {\n const path = getAttachmentPath(item);\n return {\n \"文件名\": detail?.name ?? item.fileName ?? item.name ?? getFileNameFromPath(path),\n \"大小\": detail?.size ?? item.fileSize ?? item.size ?? \"\",\n };\n}\n\nfunction toMatterTaskTimingSummary(item: AlphaMatterTaskTimingItem): Record<string, unknown> {\n return {\n \"计时ID\": item.id ?? \"\",\n \"计时人\": item.userName ?? item.user?.userName ?? item.user?.name ?? \"\",\n \"开始时间\": formatDateTime(item.startTime),\n \"结束时间\": formatDateTime(item.endTime),\n \"计时时长\": formatTotalTiming(item.timingSum),\n \"工作类型\": item.workType?.name ?? \"\",\n };\n}\n\nfunction toMatterTaskCommentSummary(item: AlphaMatterTaskCommentItem): Record<string, unknown> {\n return {\n \"动态ID\": item.id ?? \"\",\n \"类型\": formatTaskCommentType(item.concreteType),\n \"操作人\": item.createUser?.userName ?? item.createUser?.name ?? \"\",\n \"内容\": item.content ?? item.comment ?? \"\",\n \"时间\": formatDateTime(item.createTime),\n \"相对时间\": item.createTimeFormat ?? \"\",\n };\n}\n\nfunction parseLogContent(content: string | undefined): unknown {\n if (!content) {\n return \"\";\n }\n try {\n const parsed = JSON.parse(content) as unknown;\n if (parsed && typeof parsed === \"object\" && \"content\" in parsed) {\n const inner = (parsed as { content?: unknown }).content;\n if (typeof inner === \"string\") {\n try {\n return JSON.parse(inner) as unknown;\n } catch {\n return inner;\n }\n }\n }\n return parsed;\n } catch {\n return content;\n }\n}\n\nfunction formatContacts(\n contacts:\n | Array<AlphaMatterContact | { contactPkid?: string; contactName?: string; type?: string; isDeleted?: boolean }>\n | undefined,\n): string[] {\n return (contacts ?? [])\n .map((contact) => {\n const name = contact.contactName ?? \"\";\n const deleted = contact.isDeleted ? \"(已删除)\" : \"\";\n const position = \"customerPositionName\" in contact && contact.customerPositionName\n ? `(${contact.customerPositionName})`\n : \"\";\n return `${name}${position}${deleted}`;\n })\n .filter(Boolean);\n}\n\nfunction formatAttorneys(attorneys: AlphaMatterAttorney[] | undefined): string[] {\n return (attorneys ?? []).map((attorney) => attorney.attorneyName ?? \"\").filter(Boolean);\n}\n\nfunction formatMembers(members: AlphaMatterDetailItem[\"members\"]): string[] {\n return (members ?? [])\n .map((member) => {\n const role = member.roleName ? `(${member.roleName})` : \"\";\n return `${member.userName ?? \"\"}${role}`;\n })\n .filter(Boolean);\n}\n\nfunction formatMatterBelong(item: AlphaMatterDetailItem): string {\n if (item.matterOwnerName) {\n return `${item.matterOwnerName}(个人项目)`;\n }\n return (item.groups ?? []).map((group) => group.name ?? \"\").filter(Boolean).join(\",\");\n}\n\nfunction formatMatterStatus(status: number | undefined): string {\n switch (status) {\n case 0:\n return \"预立项\";\n case 2:\n return \"进行中\";\n case 4:\n return \"已完结\";\n case 6:\n return \"已归档\";\n case 7:\n return \"已搁置\";\n default:\n return status === undefined ? \"\" : `未知状态(${status})`;\n }\n}\n\nfunction formatMatterType(item: AlphaMatterItem): string {\n return [item.matterTypeName, item.childrenMatterTypeName].filter(Boolean).join(\" / \");\n}\n\nfunction formatCustomFieldLabel(field: AlphaMatterCustomField): string {\n return field.customFieldValue || field.customFieldName || field.customFieldKey || \"\";\n}\n\nfunction formatMatterListFieldValue(\n item: AlphaMatterItem,\n field: AlphaMatterCustomField,\n): unknown {\n if (String(field.showType) === \"4\") {\n return formatFallbackValue(item.expandMatters?.[formatCustomFieldLabel(field)]);\n }\n\n switch (field.customFieldKey) {\n case \"matterDynamicContent\":\n return formatLatestDynamic(item);\n case \"matterNo\":\n return item.matterNo ?? \"\";\n case \"sealCount\":\n return item.sealCount ?? \"\";\n case \"startMatterTime\":\n return formatDateOnly(item.startMatterTime);\n case \"totalTiming\":\n return formatTotalTiming(item.sumTime);\n case \"task\":\n return `${(item.allTask ?? 0) - (item.unfinishTask ?? 0)} / ${item.allTask ?? 0}`;\n case \"matterLevel\":\n return formatMatterLevel(item.matterLevel);\n case \"endMatterTime\":\n return formatDateOnly(item.endMatterTime);\n case \"filingDate\":\n return formatDateOnly(item.filingDate);\n case \"serviceStartRangeTime\":\n return formatDateOnly(item.serviceStartRangeTime);\n case \"serviceEndRangeTime\":\n return formatDateOnly(item.serviceEndRangeTime);\n case \"matterOwner\":\n return formatNamedItems(item.matterOwners, \"ownerName\");\n case \"matterSourceLawyer\":\n return formatNamedItems(item.matterSourceLawyer, \"userName\");\n case \"matterReasonMessage\":\n return item.matterReasonMessage?.length ? item.matterReasonMessage.join(\",\") : \"\";\n case \"startUserName\":\n return item.startUserName ?? \"\";\n case \"courtTime\":\n return formatNamedItems(item.processEsEntities, \"courtTime\");\n case \"nowProcessName\":\n return [item.legalTypeName, item.caseProcessName].filter(Boolean).join(\" \");\n case \"matterMembers\":\n return formatNamedItems(item.members, \"userName\");\n case \"undertakeLaywer\":\n return formatNamedItems(item.undertakeLaywer, \"userName\");\n case \"otherParty\":\n return formatNamedItems(item.otherParty, \"userName\");\n case \"contractTargetAmount\":\n return formatFallbackValue(item.financeDTO?.contractTargetAmount);\n case \"contractTotal\":\n return formatFallbackValue(item.financeDTO?.contractTotal);\n case \"matterRemark\":\n return item.matterRemark ?? \"\";\n case \"billTotal\":\n return formatFallbackValue(item.financeDTO?.billTotal);\n case \"residueIncomeTotal\":\n return formatFallbackValue(item.financeDTO?.residueIncomeTotal);\n case \"spendTotal\":\n return formatFallbackValue(item.financeDTO?.spendTotal);\n case \"invoiceTotal\":\n return formatFallbackValue(item.financeDTO?.invoiceTotal);\n case \"incomeTotal\":\n return formatFallbackValue(item.financeDTO?.incomeTotal);\n case \"invoiceNo\":\n return formatFallbackValue(item.financeDTO?.invoiceNo);\n case \"hasRiskCharge\":\n return formatFallbackValue(item.financeDTO?.hasRiskCharge);\n case \"filingNo\":\n return item.filingNo ?? \"\";\n case \"process\":\n return formatNamedItems(item.processEsEntities, \"processName\");\n case \"processCourse\":\n return formatNamedItems(item.processEsEntities, \"court\");\n default:\n return formatFallbackValue(field.customFieldKey ? item[field.customFieldKey] : undefined);\n }\n}\n\nfunction formatLatestDynamic(item: AlphaMatterItem): string {\n const dynamic = item.matterDynamicContent;\n const dynamicText = [dynamic?.content, dynamic?.taskName, dynamic?.actionTime]\n .filter(Boolean)\n .join(\" \");\n return dynamicText || dynamic?.description || dynamic?.title || \"一个月内无动态\";\n}\n\nfunction formatNamedItems<T extends Record<string, unknown>>(\n items: T[] | undefined,\n key: keyof T,\n): string {\n return (items ?? [])\n .map((item) => item[key])\n .filter((value) => value !== undefined && value !== null && value !== \"\")\n .map(String)\n .join(\",\");\n}\n\nfunction formatFallbackValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === \"object\") {\n const record = item as Record<string, unknown>;\n return record.name ?? record.userName ?? record.ownerName ?? record.clientName ?? record.contactName ?? \"\";\n }\n return item;\n })\n .filter((item) => item !== \"\")\n .join(\",\");\n }\n return value;\n}\n\nfunction formatDateOnly(value: string | number | undefined): string {\n const formatted = formatDateTime(value);\n return formatted ? formatted.slice(0, 10) : \"\";\n}\n\nfunction formatTotalTiming(milliseconds: number | undefined): string {\n if (!milliseconds || milliseconds <= 0) {\n return \"0小时\";\n }\n const hours = milliseconds / 3_600_000;\n return `${Number(hours.toFixed(2))}小时`;\n}\n\nfunction formatDateTime(value: string | number | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n\n const date = parseDateTime(value);\n if (!date) {\n return String(value);\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hour = String(date.getHours()).padStart(2, \"0\");\n const minute = String(date.getMinutes()).padStart(2, \"0\");\n const second = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hour}:${minute}:${second}`;\n}\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\nfunction formatMatterLevel(level: number | undefined): string {\n switch (level) {\n case 1:\n return \"无等级\";\n case 2:\n return \"低\";\n case 3:\n return \"中\";\n case 4:\n return \"高\";\n default:\n return \"\";\n }\n}\n\nfunction parseMatterTaskState(value: string | undefined): number {\n const raw = (value ?? \"未完成\").trim().toLowerCase();\n if (!raw || raw === \"all\" || raw === \"全部\" || raw === \"全部任务\") {\n return -1;\n }\n const aliases: Record<string, number> = {\n unfinished: 0,\n \"未完成\": 0,\n done: 1,\n finished: 1,\n \"已完成\": 1,\n all: -1,\n \"全部\": -1,\n \"全部任务\": -1,\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n // The backend task-table endpoint only supports all/unfinished/finished.\n // Reject other numeric values so agents do not accidentally query misleading data.\n if (Number.isNaN(parsed) || ![-1, 0, 1].includes(parsed)) {\n throw new Error(\"Invalid task state. Use all, 未完成, or 已完成.\");\n }\n return parsed;\n}\n\nfunction parseMatterSearchStatus(value: string | undefined): MatterSearchStatus {\n const raw = (value ?? \"进行中+预立项\").trim().toLowerCase();\n const aliases: Record<string, MatterSearchStatus> = {\n \"预立项\": { label: \"预立项\", values: [0] },\n pending: { label: \"预立项\", values: [0] },\n \"进行中\": { label: \"进行中\", values: [2] },\n open: { label: \"进行中\", values: [2] },\n active: { label: \"进行中\", values: [2] },\n \"进行中+预立项\": { label: \"进行中+预立项\", values: [2, 0] },\n \"预立项+进行中\": { label: \"进行中+预立项\", values: [2, 0] },\n current: { label: \"进行中+预立项\", values: [2, 0] },\n default: { label: \"进行中+预立项\", values: [2, 0] },\n \"已完结\": { label: \"已完结\", values: [4] },\n closed: { label: \"已完结\", values: [4] },\n \"已搁置\": { label: \"已搁置\", values: [7] },\n suspended: { label: \"已搁置\", values: [7] },\n paused: { label: \"已搁置\", values: [7] },\n \"已归档\": { label: \"已归档\", values: [6] },\n filed: { label: \"已归档\", values: [6] },\n archived: { label: \"已归档\", values: [6] },\n \"全部\": { label: \"全部\", values: [0, 2, 4, 6, 7] },\n all: { label: \"全部\", values: [0, 2, 4, 6, 7] },\n };\n const match = aliases[raw];\n if (match) {\n return match;\n }\n throw new Error(\n \"Invalid matter status. Use 预立项, 进行中, 进行中+预立项, 已完结, 已搁置, 已归档, or 全部.\",\n );\n}\n\nfunction parseMatterSearchScope(value: string | undefined): MatterSearchScope {\n const raw = (value ?? \"所有项目\").trim().toLowerCase();\n const aliases: Record<string, MatterSearchScope> = {\n \"所有项目\": \"all\",\n \"全部项目\": \"all\",\n all: \"all\",\n \"我关注的\": \"followed\",\n followed: \"followed\",\n favorite: \"followed\",\n starred: \"followed\",\n \"已加入的\": \"joined\",\n joined: \"joined\",\n \"我加入的\": \"joined\",\n };\n const match = aliases[raw];\n if (match) {\n return match;\n }\n throw new Error(\"Invalid matter scope. Use 所有项目, 我关注的, or 已加入的.\");\n}\n\nfunction formatMatterSearchScopeLabel(scope: MatterSearchScope): string {\n switch (scope) {\n case \"followed\":\n return \"我关注的\";\n case \"joined\":\n return \"已加入的\";\n case \"all\":\n default:\n return \"所有项目\";\n }\n}\n\nasync function buildJoinedMatterMemberFilter(\n client: ApiClient,\n sessionStore: SessionStore,\n): Promise<MatterSearchJoinMember> {\n const session = await sessionStore.getSession();\n if (!session?.userId) {\n throw new Error(\"Missing current user id. Run alpha-classic-cli doctor or login again.\");\n }\n const response = await client.request<AlphaMatterRoleResponse>(\n \"GET\",\n \"/matterserver/api/v2/matter/roles\",\n {\n params: {\n subjectid: 0,\n subjecttype: \"MAT\",\n },\n },\n );\n const data = unwrapEnvelopeData<AlphaMatterRoleResponse[\"data\"]>(response);\n const roleIds = (data ?? [])\n .map((role) => role.id)\n .filter((id): id is string | number => id !== undefined && id !== null)\n .map(String);\n if (!roleIds.length) {\n throw new Error(\"Cannot resolve matter role ids for joined matter search.\");\n }\n return {\n userId: session.userId,\n roleIds,\n };\n}\n\nfunction unwrapEnvelopeData<T>(response: T | { data?: T; isSuccess?: boolean; resultMsg?: string }): T | undefined {\n if (response && typeof response === \"object\" && \"data\" in response && (\"isSuccess\" in response || \"resultMsg\" in response)) {\n return (response as { data?: T }).data;\n }\n return response as T;\n}\n\nfunction parseMatterTaskType(value: string | undefined): number {\n const raw = (value ?? \"task\").trim().toLowerCase();\n const aliases: Record<string, number> = {\n task: 0,\n tasks: 0,\n 任务: 0,\n group: 1,\n groups: 1,\n 任务组: 1,\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n // Keep the CLI option stable even though the current frontend endpoint returns\n // task groups with nested tasks in one response.\n if (Number.isNaN(parsed) || ![0, 1].includes(parsed)) {\n throw new Error(\"Invalid task type. Use task or group.\");\n }\n return parsed;\n}\n\nfunction parseMatterAttentionType(value: string | undefined): number {\n const raw = (value ?? \"all\").trim().toLowerCase();\n const aliases: Record<string, number> = {\n all: 0,\n 全部: 0,\n \"我关注的\": 1,\n attention: 1,\n followed: 1,\n follow: 1,\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(\"Invalid attention type. Use all, 我关注的, or a numeric value.\");\n }\n return parsed;\n}\n\nfunction formatMatterTaskStateLabel(stateType: number): string {\n switch (stateType) {\n case -1:\n return \"全部任务\";\n case 0:\n return \"未完成\";\n case 1:\n return \"已完成\";\n default:\n return `状态(${stateType})`;\n }\n}\n\nfunction toMatterTaskStatusType(stateType: number): number {\n switch (stateType) {\n case -1:\n return 4;\n case 1:\n return 2;\n case 0:\n default:\n return 1;\n }\n}\n\nfunction formatMatterTaskTypeLabel(type: number): string {\n switch (type) {\n case 0:\n return \"任务\";\n case 1:\n return \"任务组\";\n default:\n return `类型(${type})`;\n }\n}\n\nfunction formatMatterAttentionLabel(attentionType: number): string {\n switch (attentionType) {\n case 0:\n return \"全部\";\n case 1:\n return \"我关注的\";\n default:\n return `关注类型(${attentionType})`;\n }\n}\n\nfunction formatTaskUsers(\n users:\n | Array<{\n userName?: string;\n name?: string;\n id?: string;\n userId?: string;\n }>\n | undefined,\n): string[] {\n return (users ?? [])\n .map((user) => user.userName ?? user.name ?? \"\")\n .filter(Boolean);\n}\n\nfunction formatTaskUser(\n user:\n | {\n userName?: string;\n name?: string;\n id?: string;\n userId?: string;\n }\n | undefined,\n): string {\n return user?.userName ?? user?.name ?? \"\";\n}\n\nfunction formatTaskCommentType(type: number | undefined): string {\n switch (type) {\n case 100:\n return \"评论\";\n case 400:\n return \"动态\";\n default:\n return type === undefined ? \"\" : `类型(${type})`;\n }\n}\n\nfunction getFileNameFromPath(path: string): string {\n if (!path) {\n return \"\";\n }\n return path.split(\"/\").filter(Boolean).pop() ?? path;\n}\n\nfunction getAttachmentDocumentKey(item: AlphaMatterTaskAttachment): string {\n const repoId = getAttachmentRepoId(item);\n const fileId = getAttachmentFileId(item);\n const path = getAttachmentPath(item);\n return `${repoId}|${fileId || path}`;\n}\n\nfunction getAttachmentRepoId(item: AlphaMatterTaskAttachment): string {\n return item.pathInfoVo?.repoId ?? \"\";\n}\n\nfunction getAttachmentFileId(item: AlphaMatterTaskAttachment): string {\n return item.fileId ?? item.pathInfoVo?.fileId ?? item.id ?? \"\";\n}\n\nfunction getAttachmentPath(item: AlphaMatterTaskAttachment): string {\n return item.filePath ?? item.path ?? item.pathInfoVo?.filePath ?? \"\";\n}\n\nfunction getDirectoryPath(path: string): string {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n const lastSlashIndex = normalized.lastIndexOf(\"/\");\n if (lastSlashIndex <= 0) {\n return \"/\";\n }\n return normalized.slice(0, lastSlashIndex);\n}\n\nfunction formatTaskWorkType(\n workType: {\n id?: string;\n name?: string;\n } | undefined,\n): Record<string, unknown> | string {\n if (!workType) {\n return \"\";\n }\n return {\n \"工作类型ID\": workType.id ?? \"\",\n \"工作类型名称\": workType.name ?? \"\",\n };\n}\n\nfunction formatTaskRepeatSetting(\n repeatSetting:\n | {\n id?: string;\n repeatRule?: string;\n customRepeatRule?: string;\n dayIndexList?: number[];\n endType?: string;\n endByDate?: string | number;\n endByTimes?: number;\n }\n | undefined,\n): Record<string, unknown> | string {\n if (!repeatSetting) {\n return \"\";\n }\n return {\n \"规则ID\": repeatSetting.id ?? \"\",\n \"重复规则\": repeatSetting.repeatRule ?? \"\",\n \"自定义规则\": repeatSetting.customRepeatRule ?? \"\",\n \"日期索引\": repeatSetting.dayIndexList ?? [],\n \"结束类型\": repeatSetting.endType ?? \"\",\n \"结束日期\": formatDateTime(repeatSetting.endByDate),\n \"结束次数\": repeatSetting.endByTimes ?? \"\",\n };\n}\n\nfunction formatMatterTaskTimeType(value: number | undefined): string {\n switch (value) {\n case 1:\n return \"到期时间\";\n case 2:\n return \"开始结束时间\";\n default:\n return value === undefined || value === null ? \"\" : String(value);\n }\n}\n\nfunction formatMatterTaskDayType(value: number | undefined): string {\n switch (value) {\n case 1:\n return \"全天任务\";\n case 2:\n return \"非全天任务\";\n default:\n return value === undefined || value === null ? \"\" : String(value);\n }\n}\n\nfunction createEmptyTimeRange(siftMaxTime: string): {\n startTime: string;\n endTime: string;\n siftMaxTime: string;\n} {\n return {\n startTime: \"\",\n endTime: \"\",\n siftMaxTime,\n };\n}\n\nfunction clampLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 1) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n\nfunction clampPage(page: number): number {\n if (!Number.isFinite(page) || page < 1) {\n return 1;\n }\n return Math.floor(page);\n}\n\nfunction clampLogLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 0) {\n return 5;\n }\n return Math.min(Math.floor(limit), 20);\n}\n\nfunction clampCommentLimit(limit: number | undefined): number {\n if (limit === undefined) {\n return 10;\n }\n if (!Number.isFinite(limit) || limit < 0) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n\nfunction formatLocalDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nfunction parseDateTime(value: string | number): Date | null {\n if (typeof value === \"number\") {\n return dateFromTimestamp(value);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return dateFromTimestamp(Number.parseInt(trimmed, 10));\n }\n\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction dateFromTimestamp(timestamp: number): Date | null {\n if (!Number.isFinite(timestamp)) {\n return null;\n }\n const milliseconds = Math.abs(timestamp) < 10_000_000_000 ? timestamp * 1000 : timestamp;\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\n\ninterface VersionInfo {\n name: string;\n version: string;\n}\n\nexport function runVersion(info: VersionInfo): void {\n const environment = getDefaultEnvironmentPreset();\n // Keep this command JSON-shaped for agents. Commander still provides the\n // plain-text `--version` flag for humans and shell scripts that expect it.\n printSuccess({\n \"名称\": info.name,\n \"版本\": info.version,\n \"所属系统\": \"Alpha 律所管理系统\",\n \"环境\": environment.name,\n \"baseUrl\": environment.baseUrl,\n \"apiBaseUrl\": environment.apiBaseUrl,\n \"环境是否构建时锁定\": true,\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface LocalConfig {\n environment?: string;\n baseUrl?: string;\n apiBaseUrl?: string;\n defaultOfficeId?: string;\n timeoutMs?: number;\n}\n\nexport interface SessionRecord {\n token: string;\n refreshToken?: string;\n tokenExpireTime?: number;\n refreshTokenExpireTime?: number;\n userId?: string;\n userName?: string;\n officeId?: string;\n officeName?: string;\n name?: string;\n baseUrl?: string;\n apiBaseUrl: string;\n deviceType?: \"ai\" | string;\n updatedAt: string;\n}\n\nfunction defaultConfigDir(): string {\n return process.env.ALPHA_CLI_CONFIG_DIR ?? path.join(os.homedir(), \".config\", \"alpha-classic-cli\");\n}\n\nexport class SessionStore {\n readonly configDir: string;\n readonly configPath: string;\n readonly sessionPath: string;\n\n constructor(options?: { configDir?: string }) {\n this.configDir = options?.configDir ?? defaultConfigDir();\n this.configPath = path.join(this.configDir, \"config.json\");\n this.sessionPath = path.join(this.configDir, \"session.json\");\n }\n\n async getConfig(): Promise<LocalConfig> {\n return readJsonFile<LocalConfig>(this.configPath, {});\n }\n\n async saveConfig(patch: LocalConfig): Promise<LocalConfig> {\n const current = await this.getConfig();\n const next = { ...current, ...patch };\n await writePrivateJsonFile(this.configPath, next);\n return next;\n }\n\n async getSession(): Promise<SessionRecord | null> {\n return readJsonFile<SessionRecord | null>(this.sessionPath, null);\n }\n\n async saveSession(session: SessionRecord): Promise<void> {\n await writePrivateJsonFile(this.sessionPath, session);\n }\n\n async clearSession(): Promise<void> {\n await fs.rm(this.sessionPath, { force: true });\n }\n\n async clearAuthState(): Promise<LocalConfig> {\n await this.clearSession();\n const current = await this.getConfig();\n const {\n defaultOfficeId: _defaultOfficeId,\n ...next\n } = current;\n // Logout removes user-specific cache only. Build-time environment fields stay\n // untouched because the binary, not the runtime config, owns environment choice.\n await writePrivateJsonFile(this.configPath, next);\n return next;\n }\n}\n\nasync function readJsonFile<T>(filePath: string, fallback: T): Promise<T> {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(content) as T;\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return fallback;\n }\n throw error;\n }\n}\n\nasync function writePrivateJsonFile(filePath: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(value, null, 2), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n"],"mappings":"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","names":["createRequire","path","DEVICE_TYPE_AI","require","parseJson","fs","os","path","os","path","fs","getCurrentUserData","clampLimit","unwrapEnvelopeData","clampPage","clampCommentLimit","formatMatterLevel","formatDateTime","path","parseDateTime","dateFromTimestamp","fs","os","path","require","createRequire"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/auth/login.ts","../src/util/base-url.ts","../src/config/environments.ts","../src/util/errors.ts","../src/http/api-client.ts","../src/util/jwt.ts","../src/output/envelope.ts","../src/commands/api.ts","../src/commands/appro.ts","../src/commands/capabilities.ts","../src/install/install.ts","../src/install/templates.ts","../src/commands/doctor.ts","../src/commands/env.ts","../src/commands/matter.ts","../src/commands/version.ts","../src/session/store.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\n\nimport { Command } from \"commander\";\n\nimport {\n createLoginDeviceAuthorization,\n pollLoginDeviceAuthorization,\n runLogin,\n} from \"./auth/login.js\";\nimport { runApiCommand } from \"./commands/api.js\";\nimport { runApproDetail, runApproInitiators, runApproList } from \"./commands/appro.js\";\nimport { runCapabilities } from \"./commands/capabilities.js\";\nimport { runDoctor } from \"./commands/doctor.js\";\nimport { runEnvCommand } from \"./commands/env.js\";\nimport {\n runMatterDetail,\n runMatterSearch,\n runMatterTaskDetail,\n runMatterTaskList,\n} from \"./commands/matter.js\";\nimport { runVersion } from \"./commands/version.js\";\nimport {\n installAgentGuides,\n type AgentInstallTarget,\n uninstallAgentGuides,\n} from \"./install/install.js\";\nimport { printError, printSuccess } from \"./output/envelope.js\";\nimport { SessionStore } from \"./session/store.js\";\n\nconst require = createRequire(import.meta.url);\nconst packageJson = require(\"../package.json\") as {\n name?: string;\n version?: string;\n};\n\nfunction parseInteger(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid number: ${value}`);\n }\n return parsed;\n}\n\nasync function main(): Promise<void> {\n const sessionStore = new SessionStore();\n const program = new Command();\n\n program\n .name(\"alpha-classic-cli\")\n .description(\"Alpha Classic AI-friendly CLI for Alpha web app\")\n .version(packageJson.version ?? \"0.0.0\");\n\n program\n .command(\"install\")\n .description(\"Install agent guides for Codex, Claude Code, Alpha-claw, or all supported agents\")\n .option(\"--agent <agent>\", \"Agent target: codex, claude, alphaclaw, all\", \"codex\")\n .action(async (options: { agent?: string }) => {\n const agent = parseAgentInstallTarget(options.agent);\n const result = await installAgentGuides({ agent });\n printSuccess(result);\n });\n\n program\n .command(\"uninstall\")\n .description(\"Uninstall agent guides for Codex, Claude Code, Alpha-claw, or all supported agents\")\n .option(\"--agent <agent>\", \"Agent target: codex, claude, alphaclaw, all\", \"codex\")\n .action(async (options: { agent?: string }) => {\n const agent = parseAgentInstallTarget(options.agent);\n const result = await uninstallAgentGuides({ agent });\n printSuccess(result);\n });\n\n program\n .command(\"capabilities\")\n .description(\"Print machine-readable CLI capabilities for agents\")\n .action(() => {\n runCapabilities(packageJson.version ?? \"0.0.0\");\n });\n\n program\n .command(\"version\")\n .description(\"Print machine-readable CLI version\")\n .action(() => {\n runVersion({\n name: packageJson.name ?? \"alpha-classic-cli\",\n version: packageJson.version ?? \"0.0.0\",\n });\n });\n\n program\n .command(\"login\")\n .description(\"Start Alpha CLI device authorization login\")\n .option(\"--token <token>\", \"Debug fallback token\")\n .option(\"--user-id <id>\", \"Current user id\")\n .option(\"--office-id <id>\", \"Current office id\")\n .option(\"--name <name>\", \"Current user name\")\n .option(\"--no-wait\", \"Create device authorization and print JSON only\")\n .option(\"--json\", \"Print final result as JSON envelope\")\n .option(\"--device-code <deviceCode>\", \"Poll an existing device code\")\n .option(\"--timeout-ms <ms>\", \"Device authorization wait timeout\", parseInteger)\n .option(\"--no-open-browser\", \"Do not open browser when token is missing\")\n .action(\n async (options: {\n token?: string;\n userId?: string;\n officeId?: string;\n name?: string;\n noWait?: boolean;\n wait?: boolean;\n json?: boolean;\n deviceCode?: string;\n timeoutMs?: number;\n openBrowser?: boolean;\n }) => {\n const progress = (message: string) => {\n console.error(message);\n };\n if (options.noWait || options.wait === false) {\n const result = await createLoginDeviceAuthorization(\n {\n timeoutMs: options.timeoutMs,\n onProgress: progress,\n },\n sessionStore,\n );\n printSuccess({\n verification_url: result.auth.verificationUriComplete,\n verification_uri: result.auth.verificationUri,\n user_code: result.auth.userCode,\n device_code: result.auth.deviceCode,\n expires_in: result.auth.expiresIn,\n interval: result.auth.interval,\n hint: `请将 verification_url 原样交给用户打开确认;确认后执行:alpha-classic-cli login --device-code ${result.auth.deviceCode}`,\n });\n return;\n }\n\n const session = options.deviceCode\n ? await pollLoginDeviceAuthorization(\n {\n timeoutMs: options.timeoutMs,\n onProgress: progress,\n },\n sessionStore,\n options.deviceCode,\n )\n : await runLogin(\n {\n token: options.token,\n userId: options.userId,\n officeId: options.officeId,\n name: options.name,\n timeoutMs: options.timeoutMs,\n openBrowser: options.openBrowser,\n onProgress: progress,\n },\n sessionStore,\n );\n printSuccess({\n event: \"login_success\",\n userId: session.userId,\n userName: session.userName ?? session.name,\n officeId: session.officeId,\n officeName: session.officeName,\n deviceType: session.deviceType ?? \"ai\",\n updatedAt: session.updatedAt,\n });\n },\n );\n\n program\n .command(\"logout\")\n .description(\"Clear local session and identity cache\")\n .action(async () => {\n await sessionStore.clearAuthState();\n printSuccess({ session: \"cleared\", identityCache: \"cleared\" });\n });\n\n program\n .command(\"doctor\")\n .description(\"Inspect config, session, skill install, and API health\")\n .action(async () => {\n await runDoctor(sessionStore);\n });\n\n program\n .command(\"env\")\n .description(\"Inspect the build-time environment\")\n .argument(\"[action]\", \"Action: list, current\")\n .argument(\"[name]\", \"Environment name for list/current only\")\n .action(async (action: string | undefined, name: string | undefined) => {\n await runEnvCommand(action, name, sessionStore);\n });\n\n program\n .command(\"api\")\n .description(\"Call a raw API endpoint\")\n .argument(\"<method>\", \"HTTP method\")\n .argument(\"<path>\", \"API path\")\n .option(\"--params <json>\", \"Query params JSON object\")\n .option(\"--data <json>\", \"Request body JSON\")\n .action(\n async (\n method: string,\n apiPath: string,\n options: { params?: string; data?: string },\n ) => {\n await runApiCommand(method, apiPath, options, sessionStore);\n },\n );\n\n const matter = program\n .command(\"matter\")\n .alias(\"project\")\n .description(\"Matter/project commands\");\n matter\n .command(\"search\")\n .description(\"Search matters by keyword\")\n .option(\"--keyword <keyword>\", \"Matter keyword\")\n .option(\"--status <status>\", \"Matter status: 预立项, 进行中, 进行中+预立项, 已完结, 已搁置, 已归档, 全部\")\n .option(\"--scope <scope>\", \"Matter scope: 所有项目, 我关注的, 已加入的\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .action(async (options: { keyword?: string; status?: string; scope?: string; limit?: number; page?: number }) => {\n await runMatterSearch(options, sessionStore);\n });\n matter\n .command(\"detail\")\n .description(\"Show matter overview details\")\n .requiredOption(\"--id <matterId>\", \"Matter id\")\n .option(\"--logs <number>\", \"Recent dynamic count, 0 to skip\", parseInteger)\n .action(async (options: { id: string; logs?: number }) => {\n await runMatterDetail(options, sessionStore);\n });\n matter\n .command(\"task\")\n .description(\"List tasks for a matter/project\")\n .requiredOption(\"--id <matterId>\", \"Matter id\")\n .option(\"--state <state>\", \"Task state: all, 未完成, 已完成\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--type <type>\", \"Task type: task or group\")\n .option(\"--attention <type>\", \"Attention filter: all, 我关注的\")\n .action(\n async (options: {\n id: string;\n state?: string;\n page?: number;\n limit?: number;\n type?: string;\n attention?: string;\n }) => {\n await runMatterTaskList(\n {\n matterId: options.id,\n state: options.state,\n page: options.page,\n limit: options.limit,\n type: options.type,\n attention: options.attention,\n },\n sessionStore,\n );\n },\n );\n matter\n .command(\"task-detail\")\n .description(\"Show task details for a matter/project task\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .option(\"--comments <number>\", \"Recent task dynamic/comment count, 0 to skip\", parseInteger)\n .action(async (options: { id: string; comments?: number }) => {\n await runMatterTaskDetail(\n {\n id: options.id,\n comments: options.comments,\n },\n sessionStore,\n );\n });\n\n const appro = program.command(\"appro\").description(\"Approval commands\");\n appro\n .command(\"list\")\n .description(\"List approvals\")\n .option(\n \"--scope <scope>\",\n \"Approval scope: my, started, cc, all, 我审批的, 我发起的, 抄送我的, 全部审批\",\n \"my\",\n )\n .option(\"--keyword <keyword>\", \"Approval keyword\")\n .option(\"--status <status>\", \"Approval status code, Chinese status name, or all\")\n .option(\"--appro-type <ids>\", \"Approval type ids, comma-separated\")\n .option(\"--starter-id <id>\", \"Approval starter user id\")\n .option(\"--starter-name <name>\", \"Approval starter name; resolved through appro initiators\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--count-only\", \"Only print the matched approval count\")\n .action(\n async (options: {\n scope?: string;\n keyword?: string;\n status?: string;\n approType?: string;\n starterId?: string;\n starterName?: string;\n limit?: number;\n page?: number;\n countOnly?: boolean;\n }) => {\n await runApproList(options, sessionStore);\n },\n );\n appro\n .command(\"initiators\")\n .description(\"List approval initiators\")\n .option(\"--keyword <keyword>\", \"Initiator name keyword\")\n .option(\"--include-left\", \"Include inactive/left users\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: { keyword?: string; includeLeft?: boolean; limit?: number }) => {\n await runApproInitiators(options, sessionStore);\n },\n );\n appro\n .command(\"detail\")\n .description(\"Show approval details\")\n .requiredOption(\"--id <approId>\", \"Approval id\")\n .option(\"--comments <number>\", \"Recent comment count, 0 to skip\", parseInteger)\n .action(async (options: { id: string; comments?: number }) => {\n await runApproDetail(options, sessionStore);\n });\n\n await program.parseAsync(process.argv);\n}\n\nfunction parseAgentInstallTarget(value: string | undefined): AgentInstallTarget {\n const target = (value ?? \"codex\").trim().toLowerCase();\n if (target === \"codex\" || target === \"claude\" || target === \"alphaclaw\" || target === \"all\") {\n return target;\n }\n throw new Error(`Invalid agent target: ${value}. Supported: codex, claude, alphaclaw, all`);\n}\n\nmain().catch((error) => {\n printError(\"runtime\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n","import { createRequire } from \"node:module\";\nimport os from \"node:os\";\n\nimport open from \"open\";\n\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { ApiClient } from \"../http/api-client.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport type { CliDeviceAuthCreateVO, UserLoginVO } from \"../types.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\nimport { ApiError } from \"../util/errors.js\";\nimport { decodeAlphaJwtClaims } from \"../util/jwt.js\";\n\ninterface CurrentUserResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: CurrentUserData;\n}\n\ninterface CurrentUserData {\n accid?: string;\n id?: string;\n user_id?: string;\n name?: string;\n userName?: string;\n office_id?: string;\n officeId?: string;\n officeName?: string;\n}\n\ninterface QrCodeTerminal {\n generate: (\n value: string,\n options: { small?: boolean },\n callback: (qrcode: string) => void,\n ) => void;\n}\n\nexport interface LoginOptions {\n token?: string;\n userId?: string;\n officeId?: string;\n name?: string;\n timeoutMs?: number;\n apiClient?: ApiClient;\n openBrowser?: boolean | ((url: string) => Promise<void> | void);\n onProgress?: (message: string) => void;\n}\n\nexport interface LoginDeviceAuthorizationResult {\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n auth: CliDeviceAuthCreateVO;\n}\n\nconst CLIENT_NAME = \"alpha-classic-cli\";\nconst DEVICE_TYPE_AI = \"ai\";\nconst DEFAULT_LOGIN_TIMEOUT_MS = 300_000;\nconst DEFAULT_POLL_INTERVAL_MS = 2_000;\nconst PENDING_AUTHORIZATION_MESSAGE_PREFIX = \"授权尚未确认\";\nconst require = createRequire(import.meta.url);\nconst qrCodeTerminal = require(\"qrcode-terminal\") as QrCodeTerminal;\n\nexport async function createLoginDeviceAuthorization(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<LoginDeviceAuthorizationResult> {\n const context = await resolveLoginContext(options, sessionStore);\n emitProgress(options.onProgress, \"login: creating CLI device authorization\");\n const auth = await context.apiClient.createCliDeviceAuth(context.baseUrl, {\n client: CLIENT_NAME,\n deviceName: buildDeviceName(),\n });\n await sessionStore.saveConfig({\n environment: context.environment.name,\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n timeoutMs: context.timeoutMs,\n });\n return {\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n timeoutMs: context.timeoutMs,\n auth,\n };\n}\n\nexport async function pollLoginDeviceAuthorization(\n options: LoginOptions,\n sessionStore: SessionStore,\n deviceCode: string,\n): Promise<SessionRecord> {\n const context = await resolveLoginContext(options, sessionStore);\n const auth: CliDeviceAuthCreateVO = {\n deviceCode,\n verificationUriComplete: \"\",\n };\n emitProgress(options.onProgress, \"login: waiting for browser authorization\");\n const loginVO = await waitForDeviceAuthorization(\n context.apiClient,\n context.baseUrl,\n auth,\n context.timeoutMs,\n options.onProgress,\n );\n return saveLoginSession(context, loginVO, sessionStore, options);\n}\n\nexport async function runLogin(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<SessionRecord> {\n if (options.token) {\n return runTokenLogin(options, sessionStore);\n }\n\n const context = await resolveLoginContext(options, sessionStore);\n const authResult = await createLoginDeviceAuthorization(\n {\n ...options,\n apiClient: context.apiClient,\n timeoutMs: context.timeoutMs,\n },\n sessionStore,\n );\n emitDeviceAuthorizationPrompt(authResult.auth, options.onProgress);\n\n if (options.openBrowser !== false) {\n const openBrowser =\n typeof options.openBrowser === \"function\"\n ? options.openBrowser\n : async (url: string) => {\n await open(url, { wait: false });\n };\n try {\n await openBrowser(authResult.auth.verificationUriComplete);\n } catch {\n emitProgress(\n options.onProgress,\n `login: failed to open browser automatically, please open ${authResult.auth.verificationUriComplete}`,\n );\n }\n }\n\n emitProgress(options.onProgress, \"login: waiting for browser authorization\");\n const loginVO = await waitForDeviceAuthorization(\n context.apiClient,\n context.baseUrl,\n authResult.auth,\n context.timeoutMs,\n options.onProgress,\n );\n emitProgress(options.onProgress, \"login: browser authorization completed\");\n return saveLoginSession(context, loginVO, sessionStore, options);\n}\n\nasync function runTokenLogin(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<SessionRecord> {\n if (!options.token) {\n throw new Error(\"Missing token.\");\n }\n const environment = getDefaultEnvironmentPreset();\n const currentUser = await verifyToken(environment.apiBaseUrl, options.token);\n const currentUserData = getCurrentUserData(currentUser);\n const userId = options.userId ?? currentUserData?.accid ?? currentUserData?.id ?? currentUserData?.user_id;\n const userName =\n options.name ?? currentUserData?.name ?? currentUserData?.userName;\n const officeId = options.officeId ?? currentUserData?.office_id ?? currentUserData?.officeId;\n const officeName = currentUserData?.officeName;\n const session: SessionRecord = {\n token: options.token,\n baseUrl: environment.baseUrl,\n apiBaseUrl: environment.apiBaseUrl,\n deviceType: DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n ...(userId ? { userId } : {}),\n ...(userName ? { name: userName, userName } : {}),\n ...(officeId ? { officeId } : {}),\n ...(officeName ? { officeName } : {}),\n };\n\n await sessionStore.saveConfig({\n environment: environment.name,\n baseUrl: environment.baseUrl,\n apiBaseUrl: environment.apiBaseUrl,\n ...(officeId ? { defaultOfficeId: officeId } : {}),\n });\n await sessionStore.saveSession(session);\n return session;\n}\n\nasync function resolveLoginContext(\n options: LoginOptions,\n sessionStore: SessionStore,\n): Promise<{\n environment: ReturnType<typeof getDefaultEnvironmentPreset>;\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n apiClient: ApiClient;\n}> {\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const baseUrl = normalizeBaseUrl(config.baseUrl ?? environment.baseUrl);\n const apiBaseUrl = normalizeBaseUrl(config.apiBaseUrl ?? environment.apiBaseUrl);\n const timeoutMs = options.timeoutMs ?? config.timeoutMs ?? DEFAULT_LOGIN_TIMEOUT_MS;\n const apiClient =\n options.apiClient ??\n new ApiClient({\n sessionStore,\n apiBaseUrl,\n timeoutMs,\n });\n return {\n environment,\n baseUrl,\n apiBaseUrl,\n timeoutMs,\n apiClient,\n };\n}\n\nasync function waitForDeviceAuthorization(\n apiClient: ApiClient,\n baseUrl: string,\n auth: CliDeviceAuthCreateVO,\n timeoutMs: number,\n reporter: ((message: string) => void) | undefined,\n): Promise<UserLoginVO> {\n const deadline = resolveDeadline(auth, timeoutMs);\n const intervalMs = resolvePollIntervalMs(auth);\n while (Date.now() <= deadline) {\n try {\n return await apiClient.pollCliDeviceAuth(baseUrl, auth.deviceCode);\n } catch (error) {\n if (!isPendingAuthorization(error)) {\n throw error;\n }\n emitProgress(reporter, \"login: authorization is still pending\");\n }\n await sleep(Math.min(intervalMs, Math.max(0, deadline - Date.now())));\n }\n throw new Error(\"Timed out waiting for Alpha device authorization.\");\n}\n\nasync function saveLoginSession(\n context: {\n environment: ReturnType<typeof getDefaultEnvironmentPreset>;\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n },\n loginVO: UserLoginVO,\n sessionStore: SessionStore,\n options: LoginOptions,\n): Promise<SessionRecord> {\n const tokenDto = loginVO.jwtTokenDTO;\n if (!tokenDto?.token) {\n throw new Error(\"Device authorization succeeded but token payload is incomplete.\");\n }\n const jwtClaims = decodeAlphaJwtClaims(tokenDto.token);\n const userInfo = loginVO.userDTO ?? loginVO.userVO ?? loginVO;\n const userName = userInfo.name ?? userInfo.userName ?? jwtClaims?.user_name;\n const userId = userInfo.id ?? jwtClaims?.user_id;\n const officeId = userInfo.officeId ?? userInfo.office_id ?? loginVO.officeId ?? jwtClaims?.office_id;\n const officeName = userInfo.officeName ?? loginVO.officeName ?? jwtClaims?.office_name;\n const session: SessionRecord = {\n token: tokenDto.token,\n ...(tokenDto.refreshToken ? { refreshToken: tokenDto.refreshToken } : {}),\n ...(tokenDto.tokenExpireTime !== undefined || jwtClaims?.exp !== undefined\n ? { tokenExpireTime: tokenDto.tokenExpireTime ?? jwtClaims?.exp }\n : {}),\n ...(tokenDto.refreshTokenExpireTime !== undefined\n ? { refreshTokenExpireTime: tokenDto.refreshTokenExpireTime }\n : {}),\n ...(userId ? { userId } : {}),\n ...(userName ? { userName, name: userName } : {}),\n ...(officeId ? { officeId } : {}),\n ...(officeName ? { officeName } : {}),\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n deviceType: DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n };\n\n emitProgress(options.onProgress, \"login: saving local config and session\");\n await sessionStore.saveConfig({\n environment: context.environment.name,\n baseUrl: context.baseUrl,\n apiBaseUrl: context.apiBaseUrl,\n timeoutMs: context.timeoutMs,\n ...(officeId ? { defaultOfficeId: officeId } : {}),\n });\n await sessionStore.saveSession(session);\n emitProgress(options.onProgress, \"login: local session saved\");\n return session;\n}\n\nfunction getCurrentUserData(response: CurrentUserResponse | CurrentUserData): CurrentUserData | undefined {\n return \"data\" in response && response.data ? response.data : response as CurrentUserData;\n}\n\nasync function verifyToken(apiBaseUrl: string, token: string): Promise<CurrentUserResponse> {\n const url = new URL(\"/im/v1/users/me\", apiBaseUrl);\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n token,\n deviceType: DEVICE_TYPE_AI,\n },\n });\n\n const text = await response.text();\n const body = text ? parseJson(text) : {};\n if (!response.ok) {\n throw new Error(`Login verification failed: ${response.status} ${response.statusText}`);\n }\n\n const currentUser = body as CurrentUserResponse;\n if (currentUser.isSuccess === false) {\n throw new Error(currentUser.resultMsg ?? \"Login verification failed.\");\n }\n return currentUser;\n}\n\nfunction emitDeviceAuthorizationPrompt(\n auth: CliDeviceAuthCreateVO,\n reporter: ((message: string) => void) | undefined,\n): void {\n emitProgress(reporter, `login: user code ${auth.userCode ?? \"(not provided)\"}`);\n const qrcode = buildTerminalQrCode(auth.verificationUriComplete);\n if (qrcode) {\n emitProgress(reporter, \"login: scan this QR code to authorize\");\n emitRawProgress(reporter, `\\n${qrcode}\\n`);\n }\n emitProgress(reporter, `login: open ${auth.verificationUriComplete}`);\n}\n\nfunction emitProgress(\n reporter: ((message: string) => void) | undefined,\n message: string,\n): void {\n reporter?.(`[${new Date().toLocaleTimeString(\"zh-CN\", { hour12: false })}] ${message}`);\n}\n\nfunction emitRawProgress(\n reporter: ((message: string) => void) | undefined,\n message: string,\n): void {\n reporter?.(message);\n}\n\nfunction buildTerminalQrCode(value: string): string {\n let rendered = \"\";\n qrCodeTerminal.generate(value, { small: true }, (qrcode) => {\n rendered = qrcode;\n });\n return rendered;\n}\n\nfunction buildDeviceName(): string {\n return `${os.hostname()} (${process.platform} ${process.arch})`;\n}\n\nfunction isPendingAuthorization(error: unknown): boolean {\n return (\n error instanceof ApiError &&\n error.message.startsWith(PENDING_AUTHORIZATION_MESSAGE_PREFIX)\n );\n}\n\nfunction resolveDeadline(auth: CliDeviceAuthCreateVO, timeoutMs: number): number {\n const serverExpireMs =\n typeof auth.expiresIn === \"number\" && auth.expiresIn > 0\n ? auth.expiresIn * 1000\n : timeoutMs;\n return Date.now() + Math.min(timeoutMs, serverExpireMs);\n}\n\nfunction resolvePollIntervalMs(auth: CliDeviceAuthCreateVO): number {\n if (typeof auth.interval !== \"number\" || auth.interval <= 0) {\n return DEFAULT_POLL_INTERVAL_MS;\n }\n return Math.max(1_000, auth.interval * 1000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","export function normalizeBaseUrl(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(\"Base URL is required.\");\n }\n return trimmed.replace(/\\/+$/, \"\");\n}\n","import { normalizeBaseUrl } from \"../util/base-url.js\";\n\nexport type EnvironmentName = \"local\" | \"dev\" | \"test\" | \"prod\";\n\ndeclare const __ALPHA_CLASSIC_CLI_ENV__: string | undefined;\n\nexport interface EnvironmentPreset {\n name: EnvironmentName;\n label: string;\n baseUrl: string;\n apiBaseUrl: string;\n}\n\nexport const DEFAULT_ENVIRONMENT_NAME: EnvironmentName = \"dev\";\n\n// Environment presets are intentionally compiled into the CLI. Runtime switching is\n// disabled so a built binary cannot accidentally point at another Alpha environment.\nconst PRESETS: Record<EnvironmentName, Omit<EnvironmentPreset, \"name\">> = {\n local: {\n label: \"Local development\",\n baseUrl: \"http://localhost:3000\",\n apiBaseUrl: \"http://localhost:8080\",\n },\n dev: {\n label: \"Development\",\n baseUrl: \"https://dev.alphalawyer.cn\",\n apiBaseUrl: \"https://dev.alphalawyer.cn\",\n },\n test: {\n label: \"Testing\",\n baseUrl: \"https://test.alphalawyer.cn\",\n apiBaseUrl: \"https://test.alphalawyer.cn\",\n },\n prod: {\n label: \"Production\",\n baseUrl: \"https://alphalawyer.cn\",\n apiBaseUrl: \"https://alphalawyer.cn\",\n },\n};\n\nexport const BUILD_ENVIRONMENT_NAME = resolveBuildEnvironmentName();\n\nexport function listEnvironmentPresets(): EnvironmentPreset[] {\n return (Object.keys(PRESETS) as EnvironmentName[]).map((name) =>\n normalizePreset(name, PRESETS[name]),\n );\n}\n\nexport function getEnvironmentPreset(name: string | undefined): EnvironmentPreset | undefined {\n if (!name) {\n return undefined;\n }\n const normalized = name.trim().toLowerCase() as EnvironmentName;\n const preset = PRESETS[normalized];\n return preset ? normalizePreset(normalized, preset) : undefined;\n}\n\nexport function getEnvironmentPresetOrThrow(name: string): EnvironmentPreset {\n const preset = getEnvironmentPreset(name);\n if (!preset) {\n throw new Error(\n `Unknown environment: ${name}. Supported: ${listEnvironmentPresets()\n .map((item) => item.name)\n .join(\", \")}`,\n );\n }\n return preset;\n}\n\nexport function getDefaultEnvironmentPreset(): EnvironmentPreset {\n return getEnvironmentPresetOrThrow(BUILD_ENVIRONMENT_NAME);\n}\n\nfunction normalizePreset(\n name: EnvironmentName,\n preset: Omit<EnvironmentPreset, \"name\">,\n): EnvironmentPreset {\n return {\n name,\n label: preset.label,\n baseUrl: normalizeBaseUrl(preset.baseUrl),\n apiBaseUrl: normalizeBaseUrl(preset.apiBaseUrl),\n };\n}\n\nfunction resolveBuildEnvironmentName(): EnvironmentName {\n // tsup replaces __ALPHA_CLASSIC_CLI_ENV__ during build. Falling back to dev keeps local\n // source runs predictable while production-like binaries stay build-time locked.\n const rawName =\n typeof __ALPHA_CLASSIC_CLI_ENV__ === \"string\" && __ALPHA_CLASSIC_CLI_ENV__.trim()\n ? __ALPHA_CLASSIC_CLI_ENV__\n : DEFAULT_ENVIRONMENT_NAME;\n const normalized = rawName.trim().toLowerCase() as EnvironmentName;\n if (normalized in PRESETS) {\n return normalized;\n }\n return DEFAULT_ENVIRONMENT_NAME;\n}\n","export class ApiError extends Error {\n constructor(\n message: string,\n readonly code?: number | string,\n readonly status?: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class AuthError extends ApiError {\n constructor(message: string, code?: number | string, status?: number) {\n super(message, code, status);\n this.name = \"AuthError\";\n }\n}\n\nexport class PermissionError extends ApiError {\n constructor(message: string, code?: number | string, status?: number) {\n super(message, code, status);\n this.name = \"PermissionError\";\n }\n}\n","import type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport type {\n CliDeviceAuthCreateRequest,\n CliDeviceAuthCreateVO,\n JwtTokenDTO,\n ResultEnvelope,\n UserLoginVO,\n} from \"../types.js\";\nimport { normalizeBaseUrl } from \"../util/base-url.js\";\nimport { ApiError, AuthError, PermissionError } from \"../util/errors.js\";\n\nexport interface ApiClientOptions {\n sessionStore: SessionStore;\n apiBaseUrl?: string;\n timeoutMs?: number;\n}\n\nconst RESULT_CODE_SUCCESS = 200;\nconst RESULT_CODE_AUTH = 401;\nconst RESULT_CODE_PERMISSION = 403;\nconst DEVICE_TYPE_AI = \"ai\";\n\nexport class ApiClient {\n private readonly sessionStore: SessionStore;\n private readonly apiBaseUrl?: string;\n private readonly timeoutMs: number;\n\n constructor(options: ApiClientOptions) {\n this.sessionStore = options.sessionStore;\n this.apiBaseUrl = options.apiBaseUrl ? normalizeBaseUrl(options.apiBaseUrl) : undefined;\n this.timeoutMs = options.timeoutMs ?? 15_000;\n }\n\n async createCliDeviceAuth(\n baseUrl: string,\n payload: CliDeviceAuthCreateRequest,\n ): Promise<CliDeviceAuthCreateVO> {\n return this.postEnvelope<CliDeviceAuthCreateVO>(\n baseUrl,\n \"/user/api/v1/cli-device-auth/create\",\n payload,\n { session: null },\n );\n }\n\n async pollCliDeviceAuth(\n baseUrl: string,\n deviceCode: string,\n ): Promise<UserLoginVO> {\n return this.postEnvelope<UserLoginVO>(\n baseUrl,\n `/user/api/v1/cli-device-auth/poll/${encodeURIComponent(deviceCode)}`,\n {},\n { session: null },\n );\n }\n\n async refreshSession(session?: SessionRecord): Promise<SessionRecord> {\n const current = session ?? (await this.sessionStore.getSession());\n if (!current?.refreshToken) {\n throw new AuthError(\"Token invalid or expired. Run: alpha-classic-cli login\");\n }\n const baseUrl = current.baseUrl ?? current.apiBaseUrl;\n const nextTokens = await this.postEnvelope<JwtTokenDTO>(\n baseUrl,\n \"/user/api/v1/token/refresh\",\n current.refreshToken,\n {\n contentType: \"text/plain;charset=UTF-8\",\n session: current,\n allowRefresh: false,\n },\n );\n const nextSession: SessionRecord = {\n ...current,\n token: nextTokens.token,\n refreshToken: nextTokens.refreshToken ?? current.refreshToken,\n tokenExpireTime: nextTokens.tokenExpireTime ?? current.tokenExpireTime,\n refreshTokenExpireTime:\n nextTokens.refreshTokenExpireTime ?? current.refreshTokenExpireTime,\n deviceType: current.deviceType ?? DEVICE_TYPE_AI,\n updatedAt: new Date().toISOString(),\n };\n await this.sessionStore.saveSession(nextSession);\n return nextSession;\n }\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n params?: Record<string, unknown>;\n data?: unknown;\n headers?: Record<string, string>;\n requireAuth?: boolean;\n },\n ): Promise<T> {\n const session = await this.sessionStore.getSession();\n if (options?.requireAuth !== false && !session?.token) {\n throw new Error(\"Not logged in. Run: alpha-classic-cli login\");\n }\n\n const baseUrl = this.apiBaseUrl ?? session?.apiBaseUrl ?? session?.baseUrl;\n if (!baseUrl) {\n throw new Error(\"API base URL is not configured. Rebuild this CLI with npm run build:<env>.\");\n }\n\n return this.requestWithSession<T>(method, baseUrl, path, {\n ...options,\n session,\n allowRefresh: true,\n });\n }\n\n async check(): Promise<unknown> {\n return this.request(\"GET\", \"/im/v1/users/me\", { requireAuth: true });\n }\n\n private async postEnvelope<T>(\n baseUrl: string,\n path: string,\n data: unknown,\n options?: {\n contentType?: string;\n session?: SessionRecord | null;\n allowRefresh?: boolean;\n },\n ): Promise<T> {\n const response = await this.fetchJson(\n \"POST\",\n baseUrl,\n path,\n {\n data,\n headers: {\n \"Content-Type\": options?.contentType ?? \"application/json\",\n },\n session: options?.session ?? null,\n },\n );\n return this.unwrapResponse<T>(\"POST\", baseUrl, path, response, {\n data,\n contentType: options?.contentType,\n session: options?.session ?? null,\n allowRefresh: options?.allowRefresh ?? false,\n });\n }\n\n private async requestWithSession<T>(\n method: string,\n baseUrl: string,\n path: string,\n options: {\n params?: Record<string, unknown>;\n data?: unknown;\n headers?: Record<string, string>;\n session: SessionRecord | null;\n allowRefresh: boolean;\n },\n ): Promise<T> {\n const response = await this.fetchJson(method, baseUrl, path, options);\n return this.unwrapResponse<T>(method, baseUrl, path, response, {\n data: options.data,\n headers: options.headers,\n session: options.session,\n allowRefresh: options.allowRefresh,\n params: options.params,\n });\n }\n\n private async unwrapResponse<T>(\n method: string,\n baseUrl: string,\n path: string,\n response: { status: number; statusText: string; body: unknown },\n retry: {\n data?: unknown;\n headers?: Record<string, string>;\n contentType?: string;\n params?: Record<string, unknown>;\n session: SessionRecord | null;\n allowRefresh: boolean;\n },\n ): Promise<T> {\n const envelope = asResultEnvelope<T>(response.body);\n if (envelope) {\n const code = envelope.code ?? envelope.resultCode;\n const success = envelope.success ?? envelope.isSuccess;\n if (success !== false && (code === undefined || isSuccessCode(code))) {\n return envelope.data;\n }\n if (Number(code) === RESULT_CODE_AUTH && retry.allowRefresh) {\n return this.retryAfterRefresh<T>(method, baseUrl, path, retry);\n }\n throwApiEnvelopeError(envelope, response.status);\n }\n\n if (response.status === RESULT_CODE_AUTH && retry.allowRefresh) {\n return this.retryAfterRefresh<T>(method, baseUrl, path, retry);\n }\n if (response.status === RESULT_CODE_AUTH) {\n throw new AuthError(\"Token invalid or expired.\", undefined, response.status);\n }\n if (response.status === RESULT_CODE_PERMISSION) {\n throw new PermissionError(\"Permission denied.\", undefined, response.status);\n }\n if (response.status >= 200 && response.status < 300) {\n return response.body as T;\n }\n throw new ApiError(\n `API request failed: ${response.status} ${response.statusText}`,\n undefined,\n response.status,\n );\n }\n\n private async retryAfterRefresh<T>(\n method: string,\n baseUrl: string,\n path: string,\n retry: {\n data?: unknown;\n headers?: Record<string, string>;\n contentType?: string;\n params?: Record<string, unknown>;\n session: SessionRecord | null;\n allowRefresh: boolean;\n },\n ): Promise<T> {\n if (!retry.session) {\n throw new AuthError(\"Token invalid or expired. Run: alpha-classic-cli login\");\n }\n const nextSession = await this.refreshSession(retry.session);\n return this.requestWithSession<T>(method, baseUrl, path, {\n data: retry.data,\n params: retry.params,\n headers: {\n ...(retry.headers ?? {}),\n ...(retry.contentType ? { \"Content-Type\": retry.contentType } : {}),\n },\n session: nextSession,\n allowRefresh: false,\n });\n }\n\n private async fetchJson(\n method: string,\n baseUrl: string,\n path: string,\n options: {\n params?: Record<string, unknown>;\n data?: unknown;\n headers?: Record<string, string>;\n session: SessionRecord | null;\n },\n ): Promise<{ status: number; statusText: string; body: unknown }> {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, normalizeBaseUrl(baseUrl));\n for (const [key, value] of Object.entries(options.params ?? {})) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await fetch(url, {\n method: method.toUpperCase(),\n headers: {\n Accept: \"application/json\",\n ...(options.data !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n ...(options.headers ?? {}),\n ...(options.session?.token ? { token: options.session.token } : {}),\n deviceType: options.session?.deviceType ?? DEVICE_TYPE_AI,\n },\n body: options.data !== undefined\n ? typeof options.data === \"string\"\n ? options.data\n : JSON.stringify(options.data)\n : undefined,\n signal: controller.signal,\n });\n const text = await response.text();\n return {\n status: response.status,\n statusText: response.statusText,\n body: text ? parseJson(text) : null,\n };\n } catch (error) {\n if (error instanceof Error) {\n throw new ApiError(\n `${error.message} - ${method.toUpperCase()} ${normalizeBaseUrl(baseUrl)}${path}`,\n );\n }\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction asResultEnvelope<T>(value: unknown): ResultEnvelope<T> | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const record = value as Record<string, unknown>;\n const hasModernEnvelope =\n (typeof record.success === \"boolean\" ||\n typeof record.code === \"number\" ||\n typeof record.code === \"string\") &&\n (record.code === undefined ||\n typeof record.code === \"number\" ||\n typeof record.code === \"string\") &&\n (record.msg === undefined || typeof record.msg === \"string\");\n const hasLegacyEnvelope =\n (typeof record.isSuccess === \"boolean\" ||\n typeof record.resultCode === \"number\" ||\n typeof record.resultCode === \"string\") &&\n (record.resultCode === undefined ||\n typeof record.resultCode === \"number\" ||\n typeof record.resultCode === \"string\") &&\n (record.resultMsg === undefined || typeof record.resultMsg === \"string\") &&\n (record.resultMess === undefined || typeof record.resultMess === \"string\");\n if (\"data\" in record && (hasModernEnvelope || hasLegacyEnvelope)) {\n return value as ResultEnvelope<T>;\n }\n return null;\n}\n\nfunction isSuccessCode(code: unknown): boolean {\n const numericCode = Number(code);\n return numericCode === 0 || numericCode === 1 || numericCode === RESULT_CODE_SUCCESS;\n}\n\nfunction throwApiEnvelopeError(envelope: ResultEnvelope<unknown>, status: number): never {\n const code = envelope.code ?? envelope.resultCode;\n const message =\n envelope.msg ??\n envelope.resultMsg ??\n envelope.resultMess ??\n envelope.message ??\n \"API request failed.\";\n if (Number(code) === RESULT_CODE_AUTH) {\n throw new AuthError(message, code, status);\n }\n if (Number(code) === RESULT_CODE_PERMISSION) {\n throw new PermissionError(message, code, status);\n }\n throw new ApiError(message, code, status);\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","export interface AlphaJwtClaims {\n exp?: number;\n office_id?: string;\n office_name?: string;\n user_id?: string;\n user_name?: string;\n}\n\nexport function decodeAlphaJwtClaims(token: string | undefined): AlphaJwtClaims | null {\n if (!token) {\n return null;\n }\n const [, payload] = token.split(\".\");\n if (!payload) {\n return null;\n }\n try {\n return JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as AlphaJwtClaims;\n } catch {\n return null;\n }\n}\n","export interface SuccessEnvelope<T> {\n ok: true;\n data: T;\n meta?: Record<string, unknown>;\n}\n\nexport interface ErrorEnvelope {\n ok: false;\n error: {\n type: string;\n message: string;\n hint?: string;\n detail?: unknown;\n };\n}\n\nexport function printJson(value: unknown): void {\n console.log(JSON.stringify(value, null, 2));\n}\n\nexport function printSuccess<T>(\n data: T,\n meta?: Record<string, unknown>,\n): void {\n const envelope: SuccessEnvelope<T> = {\n ok: true,\n data,\n ...(meta ? { meta } : {}),\n };\n printJson(envelope);\n}\n\nexport function printError(\n type: string,\n message: string,\n options?: {\n hint?: string;\n detail?: unknown;\n },\n): void {\n const envelope: ErrorEnvelope = {\n ok: false,\n error: {\n type,\n message,\n ...(options?.hint ? { hint: options.hint } : {}),\n ...(options?.detail !== undefined ? { detail: options.detail } : {}),\n },\n };\n console.error(JSON.stringify(envelope, null, 2));\n}\n","import { ApiClient } from \"../http/api-client.js\";\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\nexport async function runApiCommand(\n method: string,\n apiPath: string,\n options: {\n params?: string;\n data?: string;\n },\n sessionStore: SessionStore,\n): Promise<void> {\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const data = await client.request(method, apiPath, {\n params: options.params ? parseJsonObject(options.params, \"--params\") : undefined,\n data: options.data ? JSON.parse(options.data) : undefined,\n });\n printSuccess(redactSensitiveData(data));\n}\n\nfunction parseJsonObject(value: string, flagName: string): Record<string, unknown> {\n const parsed = JSON.parse(value) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(`${flagName} must be a JSON object.`);\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction redactSensitiveData(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(redactSensitiveData);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n isSensitiveKey(key) ? \"[REDACTED]\" : redactSensitiveData(item),\n ]),\n );\n}\n\nfunction isSensitiveKey(key: string): boolean {\n return key.toLowerCase().includes(\"token\");\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { ApiClient } from \"../http/api-client.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\ntype ApproScope = \"my\" | \"started\" | \"cc\" | \"all\";\n\ninterface ApproListOptions {\n scope?: string;\n keyword?: string;\n status?: string;\n approType?: string;\n starterId?: string;\n starterName?: string;\n page?: number;\n limit?: number;\n countOnly?: boolean;\n}\n\ninterface ApproInitiatorsOptions {\n keyword?: string;\n includeLeft?: boolean;\n limit?: number;\n}\n\ninterface ApproDetailOptions {\n id: string;\n comments?: number;\n}\n\ninterface ApproStatusFilter {\n status?: number;\n preStatus?: number;\n label: string;\n}\n\ninterface AlphaApproSearchResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n items?: AlphaApproItem[];\n };\n}\n\ninterface AlphaApproDetailResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaApproDetail;\n}\n\ninterface AlphaApproFeedsResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: {\n No?: number;\n pageIndex?: number;\n pageSize?: number;\n entityCount?: number;\n totalCount?: number;\n entities?: AlphaApproFeed[];\n items?: AlphaApproFeed[];\n };\n}\n\ninterface AlphaApproInitiatorsResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaApproInitiator[];\n}\n\ninterface AlphaCommonFileBatchResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaCommonFileInfo[];\n}\n\ninterface AlphaApproInitiator {\n id?: string;\n user_id?: string;\n userId?: string;\n name?: string;\n userName?: string;\n phone?: string;\n email?: string;\n status?: number | string;\n deleted?: number | string | boolean;\n}\n\ninterface AlphaApproDetail {\n approDO?: AlphaApproItem & Record<string, unknown>;\n matterId?: string;\n matterName?: string;\n matterType?: string;\n pMatterTypeName?: string;\n matterTypeName?: string;\n matterNo?: string;\n matterStatus?: string;\n matterOwner?: string;\n depOrOwnerName?: string;\n flowTaskId?: string;\n flowNodeType?: string;\n countFeeds?: number;\n code?: string;\n fieldsDtos?: AlphaApproFormField[];\n formFields?: Record<string, unknown>;\n flowsDto?: AlphaApproFlow[];\n flows?: AlphaApproFlow[];\n files?: AlphaApproFile[];\n feedList?: unknown[];\n feedStr?: string;\n}\n\ninterface AlphaApproItem {\n id?: number | string;\n approType?: number | string;\n approTypeName?: string;\n outlook?: string;\n matterId?: string;\n matterName?: string;\n matterNo?: string;\n customerStr?: string;\n startUserId?: string;\n startUserName?: string;\n status?: number | string;\n statusStr?: string;\n preStatus?: number | string;\n nodeName?: string;\n createDate?: string | number;\n arriveCurrentNodeDate?: string | number;\n modifyDate?: string | number;\n flowTaskId?: string;\n flowNodeType?: string;\n extra?: Record<string, unknown>;\n expandApproVO?: Record<string, unknown>;\n}\n\ninterface AlphaApproFormField {\n fieldId?: string;\n widgetName?: string;\n label?: string;\n value?: unknown;\n extraValue?: unknown;\n props?: Record<string, unknown>;\n}\n\ninterface ApproBusinessField {\n \"字段名称\": string;\n \"值\": unknown;\n}\n\ninterface ApproBusinessGroup {\n \"分组名称\": string;\n \"字段\": ApproBusinessField[];\n}\n\ninterface ApproBusinessGroupPattern {\n \"分组名称\": string;\n labels: string[];\n}\n\ninterface AlphaApproFlow {\n id?: number | string;\n name?: string;\n nodeType?: string;\n status?: number | string;\n hasOperation?: boolean;\n isCurrentNode?: boolean;\n currentNode?: boolean;\n approvalOperateType?: string;\n modifyDate?: string | number;\n createDate?: string | number;\n arriveDate?: string | number;\n flowUsers?: AlphaApproFlowUser[];\n}\n\ninterface AlphaApproFlowUser {\n id?: number | string;\n userId?: string;\n name?: string;\n status?: number | string;\n userStatus?: number | string;\n modifyDate?: string | number;\n createDate?: string | number;\n}\n\ninterface AlphaApproFile {\n id?: number | string;\n fileName?: string;\n path?: string;\n fileSize?: number;\n createDate?: string | number;\n modifiedDate?: string | number;\n}\n\ninterface AlphaCommonFileInfo {\n id?: string;\n fileName?: string;\n filePath?: string;\n fileSize?: number;\n boxRepoId?: string;\n handleType?: string;\n applicationId?: number;\n isValid?: number;\n gmtCreate?: string | number;\n gmtUpdate?: string | number;\n}\n\ninterface ApproAttachmentRef {\n fileId: string;\n ticket?: string;\n fieldLabel?: string;\n legacyFile?: AlphaApproFile;\n}\n\ninterface AlphaApproFeed {\n id?: number | string;\n content?: string;\n feedType?: number | string;\n action?: string;\n createUserId?: string;\n createUserName?: string;\n createUserPic?: string;\n gmtCreate?: string | number;\n gmtModified?: string | number;\n createTimeFormat?: string;\n}\n\nconst APPRO_SCOPE_TO_ENUM: Record<ApproScope, string> = {\n my: \"SELF_APPROVAL\",\n started: \"SELF_STARTED\",\n cc: \"CC_SELF\",\n all: \"ALL_APPROVAL\",\n};\n\nexport async function runApproList(\n options: ApproListOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const scope = parseApproScope(options.scope);\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 10);\n const approTypes = parseNumberList(options.approType);\n const status = parseApproStatus(options.status);\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n const starter = await resolveStarterFilter(client, options);\n\n // This mirrors Alpha Web's approval center search request. The backend fills\n // userId/officeId from the token, so the CLI does not duplicate identity state.\n const response = await client.request<AlphaApproSearchResponse>(\n \"POST\",\n \"/appro/api/v2/approval/search\",\n {\n data: {\n approvalAboutSelfEnum: APPRO_SCOPE_TO_ENUM[scope],\n limit,\n offset: (page - 1) * limit,\n orderType: \"DESC\",\n outlook: options.keyword?.trim() ?? \"\",\n pageIndex: page,\n pageSize: limit,\n selectApproFlow: 0,\n approTypes,\n startUserIds: starter.ids,\n ...(status.status !== undefined ? { status: status.status } : {}),\n ...(status.preStatus !== undefined ? { preStatus: status.preStatus } : {}),\n },\n },\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro list request failed.\");\n }\n\n const responseData = unwrapEnvelopeData<NonNullable<AlphaApproSearchResponse[\"data\"]>>(response);\n const items = responseData?.items ?? [];\n if (options.countOnly) {\n printSuccess({\n \"范围\": formatApproScope(scope),\n \"状态\": status.label,\n \"发起人\": starter.names,\n \"总数\": responseData?.totalCount ?? items.length,\n });\n return;\n }\n\n printSuccess({\n \"范围\": formatApproScope(scope),\n \"总数\": responseData?.totalCount ?? items.length,\n \"页码\": responseData?.pageIndex ?? page,\n \"每页数量\": responseData?.pageSize ?? limit,\n \"发起人筛选\": starter.names,\n \"审批列表\": items.map((item) => toApproSummary(item, scope)),\n });\n}\n\nexport async function runApproInitiators(\n options: ApproInitiatorsOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const limit = clampLimit(options.limit ?? 50);\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n const initiators = await fetchApproInitiators(client, {\n includeLeft: options.includeLeft ?? false,\n });\n const keyword = options.keyword?.trim();\n const filtered = keyword\n ? initiators.filter((user) => user.name.includes(keyword))\n : initiators;\n\n printSuccess({\n \"总数\": filtered.length,\n \"发起人列表\": filtered.slice(0, limit).map((user) => ({\n \"发起人ID\": user.id,\n \"姓名\": user.name,\n \"手机号\": user.phone,\n \"邮箱\": user.email,\n \"状态\": user.status,\n })),\n });\n}\n\nexport async function runApproDetail(\n options: ApproDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const approId = options.id.trim();\n if (!approId) {\n throw new Error(\"Missing appro id. Use: alpha-classic-cli appro detail --id <approId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n // Alpha Web's approval center opens detail dialogs from this read endpoint.\n // Keep the CLI read-only and return a cleaned, Chinese-keyed structure.\n const response = await client.request<AlphaApproDetailResponse>(\n \"GET\",\n `/appro/api/v2/appros/${encodeURIComponent(approId)}`,\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro detail request failed.\");\n }\n const detail = unwrapEnvelopeData<AlphaApproDetail>(response);\n if (!detail?.approDO) {\n throw new Error(\"审批不存在或当前用户无权查看。\");\n }\n\n const commentsLimit = clampCommentLimit(options.comments ?? 10);\n const feeds =\n commentsLimit > 0\n ? await fetchApproFeeds(client, detail, {\n approId,\n limit: commentsLimit,\n })\n : {\n \"用户评论\": { \"总数\": 0, \"评论列表\": [] },\n \"审批动态\": { \"总数\": 0, \"动态列表\": [] },\n };\n\n const attachmentDetails = await fetchApproAttachmentDetails(client, detail);\n printSuccess(toApproDetailOutput(detail, feeds, attachmentDetails));\n}\n\nfunction toApproSummary(item: AlphaApproItem, _scope: ApproScope): Record<string, unknown> {\n const merged = {\n ...(item.extra ?? {}),\n ...(item.expandApproVO ?? {}),\n };\n\n return {\n \"审批ID\": item.id ?? \"\",\n \"审批类型\": item.approTypeName ?? formatApproType(item.approType),\n \"重要信息\": stripHtml(item.outlook ?? stringField(merged, \"outlook\")),\n \"项目ID\": item.matterId ?? \"\",\n \"项目名称\": item.matterName ?? stringField(merged, \"matterName\"),\n \"项目编号\": item.matterNo ?? \"\",\n \"客户\": item.customerStr ?? \"\",\n \"发起人\": item.startUserName ?? \"\",\n // Approval list rows use the approval lifecycle status from Alpha Web's\n // statusMap. This is different from filter statuses under \"我审批的\".\n \"状态\": item.statusStr ?? formatApproStatus(item.status, item.preStatus, \"all\"),\n \"当前节点\": item.nodeName ?? \"\",\n \"发起时间\": formatDateTime(item.createDate),\n \"到达当前节点时间\": formatDateTime(item.arriveCurrentNodeDate),\n \"流程任务ID\": item.flowTaskId ?? \"\",\n };\n}\n\nasync function resolveStarterFilter(\n client: ApiClient,\n options: ApproListOptions,\n): Promise<{ ids: string[]; names: string[] }> {\n const starterId = options.starterId?.trim();\n if (starterId) {\n return { ids: [starterId], names: [starterId] };\n }\n\n const starterName = options.starterName?.trim();\n if (!starterName) {\n return { ids: [], names: [] };\n }\n\n const initiators = await fetchApproInitiators(client, { includeLeft: false });\n const exactMatches = initiators.filter((user) => user.name === starterName);\n const fuzzyMatches = exactMatches.length\n ? exactMatches\n : initiators.filter((user) => user.name.includes(starterName));\n\n if (fuzzyMatches.length === 0) {\n throw new Error(`未找到发起人:${starterName}。可先运行 alpha-classic-cli appro initiators --keyword ${starterName}`);\n }\n if (fuzzyMatches.length > 1) {\n const candidates = fuzzyMatches\n .slice(0, 10)\n .map((user) => `${user.name}(${user.id})`)\n .join(\",\");\n throw new Error(`发起人名称不唯一:${starterName}。候选:${candidates}。请改用 --starter-id。`);\n }\n\n const [match] = fuzzyMatches;\n return { ids: [match.id], names: [match.name] };\n}\n\nasync function fetchApproInitiators(\n client: ApiClient,\n options: { includeLeft: boolean },\n): Promise<Array<{ id: string; name: string; phone: string; email: string; status: string }>> {\n // Alpha Web uses this user service to build the approval initiator filter.\n // Default excludes deleted and inactive users; includeLeft mirrors the broader\n // \"all approval user\" list used by the page for old approval detail context.\n const response = await client.request<AlphaApproInitiatorsResponse>(\n \"GET\",\n \"/user/api/v1/users/listOfficeUser\",\n {\n params: {\n deleted: 0,\n ...(options.includeLeft ? {} : { status: 1 }),\n },\n },\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro initiators request failed.\");\n }\n\n const data = unwrapEnvelopeData<AlphaApproInitiatorsResponse[\"data\"]>(response);\n return (data ?? [])\n .map((user) => ({\n id: user.id ?? user.user_id ?? user.userId ?? \"\",\n name: user.name ?? user.userName ?? \"\",\n phone: user.phone ?? \"\",\n email: user.email ?? \"\",\n status: formatRawStatus(user.status),\n }))\n .filter((user) => user.id && user.name);\n}\n\nfunction toApproDetailOutput(\n detail: AlphaApproDetail,\n feeds: Record<string, unknown>,\n attachmentDetails: Map<string, AlphaCommonFileInfo>,\n): Record<string, unknown> {\n const appro = detail.approDO ?? {};\n const files = detail.files ?? [];\n const flows = detail.flowsDto?.length ? detail.flowsDto : (detail.flows ?? []);\n const attachments = getApproAttachmentRefs(detail);\n\n return {\n \"审批概览\": {\n \"审批ID\": appro.id ?? \"\",\n \"审批类型\": appro.approTypeName ?? formatApproType(appro.approType),\n \"重要信息\": stripHtml(appro.outlook ?? \"\"),\n \"状态\": appro.statusStr ?? formatApproStatus(appro.status, appro.preStatus, \"started\"),\n \"当前节点\": appro.nodeName ?? \"\",\n \"发起人\": appro.startUserName ?? \"\",\n \"发起时间\": formatDateTime(appro.createDate),\n \"更新时间\": formatDateTime(appro.modifyDate),\n \"审批编号\": detail.code ?? appro.code ?? \"\",\n \"评论和动态数量\": detail.countFeeds ?? 0,\n \"流程任务ID\": detail.flowTaskId ?? \"\",\n },\n \"项目信息\": {\n \"项目ID\": detail.matterId ?? appro.matterId ?? \"\",\n \"项目名称\": detail.matterName ?? appro.matterName ?? \"\",\n \"项目编号\": detail.matterNo ?? appro.matterNo ?? \"\",\n \"项目类型\": [detail.pMatterTypeName, detail.matterTypeName, detail.matterType ?? appro.matterType]\n .filter(Boolean)\n .join(\" / \"),\n \"项目状态\": detail.matterStatus ?? appro.matterStatus ?? \"\",\n \"项目所属\": detail.depOrOwnerName ?? detail.matterOwner ?? appro.matterOwner ?? \"\",\n \"客户\": appro.customerStr ?? \"\",\n },\n \"审批表单\": formatApproForm(detail),\n \"审批流程\": flows.map(toApproFlowSummary),\n \"附件\": attachments.length\n ? attachments.map((attachment) => toApproAttachmentSummary(attachment, attachmentDetails.get(attachment.fileId)))\n : files.map((file) => toApproFileSummary(file)),\n ...feeds,\n };\n}\n\nasync function fetchApproAttachmentDetails(\n client: ApiClient,\n detail: AlphaApproDetail,\n): Promise<Map<string, AlphaCommonFileInfo>> {\n const refsWithTicket = getApproAttachmentRefs(detail).filter((ref) => ref.fileId && ref.ticket);\n const groups = new Map<string, string[]>();\n for (const ref of refsWithTicket) {\n const ticket = ref.ticket ?? \"\";\n groups.set(ticket, [...(groups.get(ticket) ?? []), ref.fileId]);\n }\n\n const details = new Map<string, AlphaCommonFileInfo>();\n await Promise.all(\n [...groups.entries()].map(async ([ticket, fileIds]) => {\n const response = await client.request<AlphaCommonFileBatchResponse>(\n \"GET\",\n \"/common/api/v1/file/batch\",\n {\n params: {\n fileIds: [...new Set(fileIds)].join(\",\"),\n },\n headers: {\n \"deviceType\": \"web\",\n \"file-ticket\": ticket,\n },\n },\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Appro attachment detail request failed.\");\n }\n const data = unwrapEnvelopeData<AlphaCommonFileBatchResponse[\"data\"]>(response);\n for (const file of data ?? []) {\n if (file.id) {\n details.set(file.id, file);\n }\n }\n }),\n );\n return details;\n}\n\nfunction getApproAttachmentRefs(detail: AlphaApproDetail): ApproAttachmentRef[] {\n const refs: ApproAttachmentRef[] = [];\n for (const file of detail.files ?? []) {\n const fileId = file.id === undefined || file.id === null ? \"\" : String(file.id);\n if (fileId) {\n refs.push({ fileId, legacyFile: file });\n }\n }\n for (const field of detail.fieldsDtos ?? []) {\n if (field.widgetName !== \"Attachment\") {\n continue;\n }\n const fileIds = normalizeStringList(field.value);\n const ticket = typeof field.extraValue === \"string\" ? field.extraValue : undefined;\n for (const fileId of fileIds) {\n refs.push({\n fileId,\n ticket,\n fieldLabel: field.label,\n });\n }\n }\n return dedupeApproAttachmentRefs(refs);\n}\n\nfunction dedupeApproAttachmentRefs(refs: ApproAttachmentRef[]): ApproAttachmentRef[] {\n const seen = new Set<string>();\n return refs.filter((ref) => {\n if (!ref.fileId || seen.has(ref.fileId)) {\n return false;\n }\n seen.add(ref.fileId);\n return true;\n });\n}\n\nasync function fetchApproFeeds(\n client: ApiClient,\n detail: AlphaApproDetail,\n options: { approId: string; limit: number },\n): Promise<Record<string, unknown>> {\n const approType = detail.approDO?.approType;\n if (approType === undefined || approType === null || approType === \"\") {\n return {\n \"用户评论\": { \"总数\": 0, \"评论列表\": [] },\n \"审批动态\": { \"总数\": 0, \"动态列表\": [] },\n \"提示\": \"审批类型缺失,无法查询评论和动态。\",\n };\n }\n\n const [comments, dynamics] = await Promise.all([\n fetchApproFeedPage(client, {\n approId: options.approId,\n approType,\n feedType: 1,\n limit: options.limit,\n }),\n fetchApproFeedPage(client, {\n approId: options.approId,\n approType,\n feedType: 2,\n limit: options.limit,\n }),\n ]);\n\n const { items: commentItems, ...commentPage } = comments;\n const { items: dynamicItems, ...dynamicPage } = dynamics;\n return {\n \"用户评论\": {\n ...commentPage,\n \"评论列表\": commentItems.map(toApproCommentSummary),\n },\n \"审批动态\": {\n ...dynamicPage,\n \"动态列表\": dynamicItems.map(toApproDynamicSummary),\n },\n };\n}\n\nasync function fetchApproFeedPage(\n client: ApiClient,\n options: {\n approId: string;\n approType: number | string;\n feedType: 1 | 2;\n limit: number;\n },\n): Promise<{\n \"总数\": number;\n \"页码\": number;\n \"每页数量\": number;\n items: AlphaApproFeed[];\n \"提示\"?: string;\n}> {\n try {\n const response = await client.request<AlphaApproFeedsResponse>(\"GET\", \"/appro/api/v1/feeds\", {\n params: {\n approveId: options.approId,\n approveType: options.approType,\n // Alpha Web uses feedType, not seedType:\n // 1 = user comments, 2 = approval dynamics.\n feedType: options.feedType,\n pageIndex: 1,\n pageSize: options.limit,\n orderBy: \"gmt_create\",\n orderType: \"desc\",\n },\n });\n\n if (response.isSuccess === false) {\n return {\n \"总数\": 0,\n \"页码\": 1,\n \"每页数量\": options.limit,\n items: [],\n \"提示\": response.resultMsg ?? response.message ?? \"查询失败。\",\n };\n }\n\n const data = unwrapEnvelopeData<NonNullable<AlphaApproFeedsResponse[\"data\"]>>(response) ?? {};\n const items = data.items ?? data.entities ?? [];\n return {\n \"总数\": data.totalCount ?? data.entityCount ?? items.length,\n \"页码\": data.pageIndex ?? data.No ?? 1,\n \"每页数量\": data.pageSize ?? options.limit,\n items,\n };\n } catch (error) {\n return {\n \"总数\": 0,\n \"页码\": 1,\n \"每页数量\": options.limit,\n items: [],\n \"提示\": error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nfunction unwrapEnvelopeData<T>(response: T | { data?: T; isSuccess?: boolean; resultMsg?: string; message?: string }): T | undefined {\n if (response && typeof response === \"object\" && \"data\" in response && (\"isSuccess\" in response || \"resultMsg\" in response || \"message\" in response)) {\n return (response as { data?: T }).data;\n }\n return response as T;\n}\n\nfunction formatApproForm(detail: AlphaApproDetail): Record<string, unknown> {\n const approType = detail.approDO?.approType;\n const approTypeName = detail.approDO?.approTypeName ?? formatApproType(approType);\n return {\n \"表单类型\": approTypeName,\n \"业务分组\": formatApproBusinessGroups(detail),\n };\n}\n\nfunction formatApproBusinessGroups(detail: AlphaApproDetail): ApproBusinessGroup[] {\n const approType = numericCode(detail.approDO?.approType);\n if (approType === 1) {\n return formatInvoiceBusinessGroups(detail);\n }\n\n const fields = formatApproBusinessFields(detail);\n const patterns = getApproBusinessGroupPatterns(approType);\n return withSupplementFields(detail, splitBusinessFieldsIntoGroups(fields, patterns));\n}\n\nfunction formatInvoiceBusinessGroups(detail: AlphaApproDetail): ApproBusinessGroup[] {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n const invoiceDto = objectField(appro as Record<string, unknown>, \"invoiceDTO\");\n const invoiceInfo = objectField(invoiceDto, \"invoiceInfoVO\");\n const relationIncomes = valueFrom(invoiceDto, record, \"relationInvoceDTOS\");\n const relationContracts = record.relationInvoiceContractDTOS ?? record.contracts;\n\n return withSupplementFields(detail, [\n buildBusinessGroup(\"基本信息\", (add) => {\n add(\"申请人\", invoiceInfo.applicantName ?? appro.startUserName);\n add(\"所属项目\", invoiceInfo.matterName ?? appro.matterName ?? detail.matterName);\n add(\"项目编号\", invoiceInfo.matterNo ?? appro.matterNo ?? detail.matterNo);\n add(\"所属\", invoiceInfo.departmentName ?? record.depOrOwnerName ?? appro.matterOwner);\n add(\"客户\", invoiceInfo.customers ?? record.clientNameForSearch ?? appro.customerStr);\n }),\n buildBusinessGroup(\"关联收款信息\", (add) => {\n add(\"收款列表\", relationIncomes);\n }),\n buildBusinessGroup(\"关联合同信息\", (add) => {\n add(\"合同列表\", relationContracts);\n }),\n buildBusinessGroup(\"专票信息\", (add) => {\n add(\"发票抬头\", invoiceInfo.invoiceTitle ?? appro.company);\n add(\"纳税人识别号\", invoiceInfo.taxPayerId ?? appro.taxNumber);\n add(\"发票类型\", formatInvoiceType(invoiceInfo.invoiceType ?? appro.invoiceType));\n add(\"税金类型\", invoiceInfo.vatTypeName ?? appro.vatTypeName ?? invoiceInfo.vatType);\n add(\"发票金额\", invoiceInfo.invoiceTotal ?? appro.money);\n add(\"律师费金额\", invoiceInfo.lawyerValue ?? record.lawyerValue);\n add(\"税金\", invoiceInfo.vatValue ?? record.vatValue);\n add(\"开户行\", invoiceInfo.openBank ?? appro.bank);\n add(\"账号\", invoiceInfo.account ?? appro.account);\n add(\"电话\", invoiceInfo.phoneNumber ?? appro.phone);\n add(\"单位地址\", invoiceInfo.workAddress ?? appro.address);\n add(\"邮编\", invoiceInfo.zipCode ?? appro.postCode);\n add(\"发票日期\", invoiceInfo.invoiceDate);\n add(\"发票号码\", invoiceInfo.invoiceNumber);\n }),\n buildBusinessGroup(\"备注\", (add) => {\n add(\"备注\", invoiceInfo.remark ?? appro.remark ?? record.remark);\n }),\n ]);\n}\n\nfunction getApproBusinessGroupPatterns(approType: number | undefined): ApproBusinessGroupPattern[] {\n switch (approType) {\n case 0:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"重要信息\", \"关联项目\", \"项目编号\", \"项目所属\"] },\n { \"分组名称\": \"盖章信息\", labels: [\"盖章文书\"] },\n { \"分组名称\": \"备注\", labels: [\"备注\", \"原因\", \"结果说明\"] },\n ];\n case 2:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"关联项目\", \"项目编号\", \"申请日期\"] },\n { \"分组名称\": \"报销明细\", labels: [\"报销总额\", \"报销明细\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 3:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"项目名称\", \"项目编号\"] },\n {\n \"分组名称\": \"金额汇总\",\n labels: [\"合同总额\", \"发票总额\", \"收款总额\", \"账单总额\", \"费用总额\", \"应收总额\"],\n },\n { \"分组名称\": \"结项说明\", labels: [\"结项说明\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 4:\n return [\n { \"分组名称\": \"合同信息\", labels: [\"合同名称\", \"关联项目\", \"项目编号\", \"合同编号\", \"委托方\", \"合同金额\", \"标的额\", \"权益金额\", \"计费方式\", \"生效日期\", \"结束日期\"] },\n { \"分组名称\": \"盖章信息\", labels: [\"盖章申请人\", \"印章类型\", \"签署方式\", \"盖章份数\", \"签署方\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 5:\n case 7:\n case 8:\n case 9:\n case 10:\n case 11:\n case 12:\n case 16:\n return [\n { \"分组名称\": \"项目基本信息\", labels: [\"项目名称\", \"项目编号\", \"项目类型\", \"项目状态\", \"项目等级\", \"法律领域\", \"项目所属\", \"案源律师\", \"承办律师\", \"客户\", \"对方当事人\", \"其他当事人\", \"开始日期\", \"结束日期\"] },\n { \"分组名称\": \"项目补充信息\", labels: [\"项目补充信息\"] },\n { \"分组名称\": \"当前程序信息\", labels: [\"当前程序信息\"] },\n { \"分组名称\": \"项目详情\", labels: [\"项目详情\", \"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n { \"分组名称\": \"项目成员\", labels: [\"项目成员\"] },\n ];\n case 13:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"关联项目\"] },\n { \"分组名称\": \"任务名称\", labels: [\"任务列表\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 14:\n return [\n { \"分组名称\": \"项目基本信息\", labels: [\"项目名称\", \"项目编号\"] },\n { \"分组名称\": \"归档信息\", labels: [\"归档编号\"] },\n { \"分组名称\": \"项目变动信息\", labels: [\"项目变动信息\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n case 15:\n return [\n { \"分组名称\": \"项目基本信息\", labels: [\"项目名称\", \"项目编号\"] },\n { \"分组名称\": \"借阅信息\", labels: [\"借阅信息\"] },\n { \"分组名称\": \"备注\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n default:\n return [\n { \"分组名称\": \"基本信息\", labels: [\"重要信息\", \"备注\", \"原因\", \"结果说明\"] },\n ];\n }\n}\n\nfunction splitBusinessFieldsIntoGroups(\n fields: ApproBusinessField[],\n patterns: ApproBusinessGroupPattern[],\n): ApproBusinessGroup[] {\n const matched = new Set<string>();\n const groups: ApproBusinessGroup[] = [];\n\n // 先按审批类型的业务语义分组,再把无法识别的字段放到兜底组里。\n for (const pattern of patterns) {\n const fieldLabels = new Set(pattern.labels);\n const groupFields = fields.filter((field) => fieldLabels.has(field[\"字段名称\"]));\n for (const field of groupFields) {\n matched.add(field[\"字段名称\"]);\n }\n if (groupFields.length) {\n groups.push({\n \"分组名称\": pattern[\"分组名称\"],\n \"字段\": groupFields,\n });\n }\n }\n\n const leftovers = fields.filter((field) => !matched.has(field[\"字段名称\"]));\n if (leftovers.length) {\n groups.push({\n \"分组名称\": \"其他信息\",\n \"字段\": leftovers,\n });\n }\n\n return groups.length ? groups : [{ \"分组名称\": \"业务信息\", \"字段\": fields }];\n}\n\nfunction withSupplementFields(\n detail: AlphaApproDetail,\n groups: ApproBusinessGroup[],\n): ApproBusinessGroup[] {\n const supplementFields = formatApproCustomFields(detail).map((field) => ({\n \"字段名称\": String(field[\"字段名称\"] ?? \"\"),\n \"值\": field[\"值\"],\n })).filter((field) => field[\"字段名称\"]);\n if (!supplementFields.length) {\n return groups;\n }\n return [\n ...groups,\n {\n \"分组名称\": \"补充信息\",\n \"字段\": supplementFields,\n },\n ];\n}\n\nfunction buildBusinessGroup(\n name: string,\n build: (add: (label: string, value: unknown) => void) => void,\n): ApproBusinessGroup {\n const fields: ApproBusinessField[] = [];\n build((label, value) => addBusinessField(fields, label, value));\n return {\n \"分组名称\": name,\n \"字段\": fields,\n };\n}\n\nfunction formatApproBusinessFields(detail: AlphaApproDetail): ApproBusinessField[] {\n const approType = numericCode(detail.approDO?.approType);\n const fields: ApproBusinessField[] = [];\n const add = (label: string, value: unknown): void => addBusinessField(fields, label, value);\n\n if ([5, 7, 8, 9, 10, 11, 12, 16].includes(approType ?? -999)) {\n addProjectBusinessFields(detail, add);\n } else {\n switch (approType) {\n case 0:\n addSealBusinessFields(detail, add);\n break;\n case 1:\n addInvoiceBusinessFields(detail, add);\n break;\n case 2:\n addReimburseBusinessFields(detail, add);\n break;\n case 3:\n addCloseMatterBusinessFields(detail, add);\n break;\n case 4:\n addContractBusinessFields(detail, add);\n break;\n case 13:\n addTaskBusinessFields(detail, add);\n break;\n case 14:\n addFilingBusinessFields(detail, add);\n break;\n case 15:\n addBorrowBusinessFields(detail, add);\n break;\n default:\n addGenericBusinessFields(detail, add);\n break;\n }\n }\n\n addGenericBusinessFields(detail, add);\n return dedupeBusinessFields(fields);\n}\n\nfunction formatApproCustomFields(detail: AlphaApproDetail): Record<string, unknown>[] {\n if (detail.fieldsDtos?.length) {\n return detail.fieldsDtos\n .map((field) => ({\n \"字段名称\": field.label ?? \"\",\n \"值\": formatApproCustomFieldValue(field),\n }))\n .filter((field) => field[\"字段名称\"]);\n }\n\n return Object.entries(detail.formFields ?? {}).map(([key, value]) => ({\n \"字段名称\": key,\n \"值\": normalizeFieldValue(value),\n }));\n}\n\nfunction formatApproCustomFieldValue(field: AlphaApproFormField): unknown {\n switch (field.widgetName) {\n case \"Attachment\":\n return formatAttachmentFieldValue(field.value);\n case \"RelateClientField\":\n case \"RelateMemberField\":\n case \"RelateDepartmentField\":\n case \"RelateMatterField\":\n return namesFromExtraValue(field.extraValue);\n case \"DateRangeField\": {\n const values = normalizeStringList(field.value);\n return values.length ? values.join(\" ~ \") : \"\";\n }\n default:\n return normalizeFieldValue(field.value);\n }\n}\n\nfunction namesFromExtraValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === \"object\") {\n const record = item as Record<string, unknown>;\n return record.name ?? record.userName ?? record.departmentName ?? record.matterName;\n }\n return item;\n })\n .map((item) => String(item ?? \"\").trim())\n .filter(Boolean)\n .join(\",\");\n }\n return typeof value === \"string\" ? stripHtml(value) : \"\";\n}\n\nfunction formatReimburseDetails(value: unknown): unknown {\n const parsed = normalizeBusinessValue(value);\n if (!Array.isArray(parsed)) {\n return parsed ?? \"\";\n }\n return parsed.map((item) => {\n if (!item || typeof item !== \"object\") {\n return normalizeBusinessValue(item);\n }\n const record = item as Record<string, unknown>;\n return {\n \"费用金额\": formatFeeAmount(record.amount ?? record.feeSpendAmount),\n \"费用类型\": record.feeTypeName ?? record.expenseType ?? record.feeCurrency,\n \"费用日期\": normalizeBusinessValue(record.feeDate ?? record.createDate, \"费用日期\"),\n \"经手人\": record.handlerName,\n \"备注\": record.remark,\n \"附件个数\": countFileIds(record.fileIds),\n };\n });\n}\n\nfunction formatFeeAmount(value: unknown): unknown {\n if (typeof value === \"number\") {\n return value > 1000 && Number.isInteger(value) ? value / 100 : value;\n }\n return value ?? \"\";\n}\n\nfunction countFileIds(value: unknown): number {\n return normalizeStringList(value).length;\n}\n\nfunction addProjectBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"项目名称\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"项目类型\", [record.pMatterTypeName, record.matterTypeName, detail.matterType ?? appro.matterType]);\n add(\"项目状态\", detail.matterStatus ?? appro.matterStatus);\n add(\"项目等级\", formatMatterLevel(record.level));\n add(\"法律领域\", record.lawField);\n add(\"项目所属\", record.belong ?? detail.depOrOwnerName ?? detail.matterOwner ?? appro.matterOwner);\n add(\"客户\", record.clientNameForSearch ?? record.clients ?? appro.customerStr);\n add(\"对方当事人\", record.litigants);\n add(\"其他当事人\", record.relevants);\n add(\"案源律师\", record.attorneys);\n add(\"承办律师\", record.undertakeAttorneys);\n add(\"项目成员\", record.members);\n add(\"开始日期\", record.beginDate);\n add(\"结束日期\", record.endDate);\n add(\"项目详情\", record.remark);\n add(\"当前程序信息\", record.process);\n add(\"项目补充信息\", record.expandInfo ?? record.expandInfoList);\n}\n\nfunction addContractBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"合同名称\", record.contractName ?? record.contractNameForSearch);\n add(\"关联项目\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"委托方\", record.contractEntrustClientsList ?? record.contractEntrustClients);\n add(\"合同金额\", record.estimatedContractAmount);\n add(\"标的额\", record.targetAmount);\n add(\"权益金额\", record.equityAmount);\n add(\"计费方式\", record.paymentTypes);\n add(\"生效日期\", record.effectiveDate);\n add(\"结束日期\", record.endDate);\n add(\"合同编号\", record.code);\n add(\"盖章申请人\", record.stampApplicantName);\n add(\"印章类型\", record.stampTypeNames);\n add(\"签署方式\", formatSignType(record.signType));\n add(\"盖章份数\", record.stampAmount);\n add(\"签署方\", record.signatoryList);\n}\n\nfunction addInvoiceBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n const invoice = objectField(appro as Record<string, unknown>, \"invoiceDTO\");\n add(\"关联项目\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"发票类型\", formatInvoiceType(valueFrom(invoice, appro, \"invoiceType\")));\n add(\"开票单位\", valueFrom(invoice, appro, \"company\"));\n add(\"发票金额\", valueFrom(invoice, appro, \"money\"));\n add(\"税号\", valueFrom(invoice, appro, \"taxNumber\"));\n add(\"开户行及账号\", valueFrom(invoice, appro, \"account\"));\n add(\"单位地址\", valueFrom(invoice, appro, \"address\"));\n add(\"电话\", valueFrom(invoice, appro, \"phone\"));\n add(\"邮编\", valueFrom(invoice, appro, \"postCode\"));\n add(\"关联合同\", record.contracts);\n}\n\nfunction addReimburseBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"报销总额\", record.totalMoney);\n add(\"申请日期\", record.applyDate ?? appro.createDate);\n add(\"关联项目\", detail.matterName ?? appro.matterName);\n add(\"项目编号\", detail.matterNo ?? appro.matterNo);\n add(\"报销明细\", formatReimburseDetails(record.feeSpendDetails));\n}\n\nfunction addSealBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"关联项目\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"项目所属\", detail.depOrOwnerName ?? record.depOrOwnerName);\n add(\"盖章文书\", record.sealApproDOs ?? record.files);\n}\n\nfunction addCloseMatterBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const additional = objectField(record, \"matterAdditional\");\n add(\"项目名称\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"合同总额\", additional.contractValue);\n add(\"发票总额\", additional.invoiceValue);\n add(\"收款总额\", additional.incomeValue);\n add(\"账单总额\", additional.billValue);\n add(\"费用总额\", additional.expenseValue);\n add(\"应收总额\", additional.shouldValue);\n add(\"结项说明\", record.resultDesc);\n}\n\nfunction addTaskBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"关联项目\", detail.matterName ?? record.matterName);\n add(\"任务列表\", record.taskSimpleDTOList);\n}\n\nfunction addFilingBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"项目名称\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"归档编号\", record.filingNo);\n add(\"项目变动信息\", objectField(record, \"differencesDTO\").differences);\n}\n\nfunction addBorrowBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n add(\"项目名称\", detail.matterName ?? record.matterName);\n add(\"项目编号\", detail.matterNo ?? record.matterNo);\n add(\"借阅信息\", record.borrowInfo ?? record.borrowRecord ?? record.archiveBorrow);\n}\n\nfunction addGenericBusinessFields(\n detail: AlphaApproDetail,\n add: (label: string, value: unknown) => void,\n): void {\n const record = detailRecord(detail);\n const appro = detail.approDO ?? {};\n add(\"重要信息\", appro.outlook);\n add(\"备注\", record.remark ?? appro.remark);\n add(\"原因\", record.reason ?? appro.reason);\n add(\"结果说明\", record.resultDesc ?? record.result);\n}\n\nfunction addBusinessField(fields: ApproBusinessField[], label: string, value: unknown): void {\n const normalized = normalizeBusinessValue(value, label);\n if (isEmptyBusinessValue(normalized)) {\n return;\n }\n fields.push({\n \"字段名称\": label,\n \"值\": normalized,\n });\n}\n\nfunction dedupeBusinessFields(fields: ApproBusinessField[]): ApproBusinessField[] {\n const seen = new Set<string>();\n return fields.filter((field) => {\n if (seen.has(field[\"字段名称\"])) {\n return false;\n }\n seen.add(field[\"字段名称\"]);\n return true;\n });\n}\n\nfunction detailRecord(detail: AlphaApproDetail): Record<string, unknown> {\n return detail as Record<string, unknown>;\n}\n\nfunction objectField(source: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = source[key];\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return {};\n}\n\nfunction valueFrom(\n preferred: Record<string, unknown>,\n fallback: Record<string, unknown>,\n key: string,\n): unknown {\n return preferred[key] ?? fallback[key];\n}\n\nfunction numericCode(value: number | string | undefined): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\nfunction normalizeBusinessValue(value: unknown, label?: string): unknown {\n if (\n (typeof value === \"number\" || typeof value === \"string\") &&\n label &&\n (label.includes(\"日期\") || label.includes(\"时间\"))\n ) {\n return formatDateTime(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => normalizeBusinessValue(item))\n .filter((item) => !isEmptyBusinessValue(item));\n }\n if (typeof value === \"string\") {\n const trimmed = stripHtml(value);\n if (!trimmed) {\n return \"\";\n }\n const parsed = parseMaybeJson(trimmed);\n if (parsed !== undefined) {\n return normalizeBusinessValue(parsed);\n }\n return trimmed;\n }\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const compact: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(record)) {\n const normalized = normalizeBusinessValue(item);\n if (!isEmptyBusinessValue(normalized)) {\n compact[key] = normalized;\n }\n }\n return compact;\n }\n return value ?? \"\";\n}\n\nfunction parseMaybeJson(value: string): unknown {\n if (!/^[\\[{]/.test(value)) {\n return undefined;\n }\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nfunction isEmptyBusinessValue(value: unknown): boolean {\n if (value === undefined || value === null || value === \"\") {\n return true;\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n if (typeof value === \"object\") {\n return Object.keys(value as Record<string, unknown>).length === 0;\n }\n return false;\n}\n\nfunction toApproFlowSummary(flow: AlphaApproFlow): Record<string, unknown> {\n return {\n \"节点ID\": flow.id ?? \"\",\n \"节点名称\": flow.name ?? \"\",\n \"节点类型\": flow.nodeType ?? \"\",\n \"节点状态\": formatFlowStatus(flow.status),\n \"是否当前节点\": flow.isCurrentNode ?? flow.currentNode ?? false,\n \"审批方式\": flow.approvalOperateType ?? \"\",\n \"操作时间\": formatDateTime(flow.modifyDate ?? flow.arriveDate ?? flow.createDate),\n \"审批人\": (flow.flowUsers ?? []).map(toApproFlowUserSummary),\n };\n}\n\nfunction toApproFlowUserSummary(user: AlphaApproFlowUser): Record<string, unknown> {\n return {\n \"用户ID\": user.userId ?? \"\",\n \"姓名\": user.name ?? \"\",\n \"处理状态\": formatFlowUserStatus(user.status),\n \"人员状态\": formatUserStatus(user.userStatus),\n \"处理时间\": formatDateTime(user.modifyDate ?? user.createDate),\n };\n}\n\nfunction toApproFileSummary(file: AlphaApproFile): Record<string, unknown> {\n return {\n \"文件名\": file.fileName ?? \"\",\n \"大小\": formatFileSize(file.fileSize),\n };\n}\n\nfunction toApproAttachmentSummary(\n ref: ApproAttachmentRef,\n detail?: AlphaCommonFileInfo,\n): Record<string, unknown> {\n const legacyFile = ref.legacyFile;\n return {\n \"文件名\": detail?.fileName ?? legacyFile?.fileName ?? \"\",\n \"大小\": formatFileSize(detail?.fileSize ?? legacyFile?.fileSize),\n };\n}\n\nfunction toApproCommentSummary(feed: AlphaApproFeed): Record<string, unknown> {\n return {\n \"评论ID\": feed.id ?? \"\",\n \"类型\": formatFeedType(feed.feedType),\n \"评论人\": feed.createUserName ?? \"\",\n \"评论人ID\": feed.createUserId ?? \"\",\n \"内容\": stripHtml(feed.content ?? \"\"),\n \"评论时间\": formatDateTime(feed.gmtCreate),\n };\n}\n\nfunction toApproDynamicSummary(feed: AlphaApproFeed): Record<string, unknown> {\n return {\n \"动态ID\": feed.id ?? \"\",\n \"类型\": formatFeedType(feed.feedType),\n \"操作\": feed.action ?? \"\",\n \"操作人\": feed.createUserName ?? \"\",\n \"操作人ID\": feed.createUserId ?? \"\",\n \"内容\": stripHtml(feed.content ?? \"\"),\n \"动态时间\": formatDateTime(feed.gmtCreate),\n };\n}\n\nfunction formatFeedType(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 1:\n return \"用户评论\";\n case 2:\n return \"审批动态\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知类型(${code})`;\n }\n}\n\nfunction parseApproScope(value: string | undefined): ApproScope {\n const scope = (value ?? \"my\").trim().toLowerCase();\n if (scope === \"my\" || scope === \"mine\" || scope === \"approval\" || scope === \"我审批的\") {\n return \"my\";\n }\n if (scope === \"started\" || scope === \"start\" || scope === \"我发起的\") {\n return \"started\";\n }\n if (scope === \"cc\" || scope === \"copyto\" || scope === \"copy\" || scope === \"抄送我的\") {\n return \"cc\";\n }\n if (scope === \"all\" || scope === \"allapproval\" || scope === \"全部\" || scope === \"全部审批\") {\n return \"all\";\n }\n throw new Error(\n \"Invalid appro scope. Supported: my, started, cc, all, 我审批的, 我发起的, 抄送我的, 全部审批.\",\n );\n}\n\nfunction formatApproScope(scope: ApproScope): string {\n switch (scope) {\n case \"my\":\n return \"我审批的\";\n case \"started\":\n return \"我发起的\";\n case \"cc\":\n return \"抄送我的\";\n case \"all\":\n return \"全部审批\";\n }\n}\n\nfunction parseApproStatus(value: string | undefined): ApproStatusFilter {\n const raw = value?.trim();\n if (!raw || raw === \"\" || raw.toLowerCase() === \"all\" || raw === \"所有状态\" || raw === \"全部状态\") {\n return { label: \"所有状态\" };\n }\n const normalized = raw.toLowerCase();\n // Alpha Web represents \"重新发起\" variants with both status and preStatus.\n // Keeping this mapping here lets agents pass natural Chinese statuses without\n // learning frontend implementation details.\n const aliases: Record<string, ApproStatusFilter> = {\n pending: { status: 1, label: \"待我审批\" },\n todo: { status: 1, label: \"待我审批\" },\n \"待我审批\": { status: 1, label: \"待我审批\" },\n \"我已通过\": { status: 2, label: \"我已通过\" },\n \"我已驳回\": { status: 3, label: \"我已驳回\" },\n \"他人已处理\": { status: 4, label: \"他人已处理\" },\n \"我转签的\": { status: 5, label: \"我转签的\" },\n \"审批中\": { status: 0, label: \"审批中\" },\n \"已通过\": { status: 1, label: \"已通过\" },\n \"已驳回\": { status: 2, label: \"已驳回\" },\n \"重新发起\": { status: 3, label: \"重新发起\" },\n \"驳回后重新发起\": { status: 3, preStatus: 2, label: \"驳回后重新发起\" },\n \"已撤回\": { status: 4, label: \"已撤回\" },\n \"撤回后重新发起\": { status: 3, preStatus: 4, label: \"撤回后重新发起\" },\n \"已删除\": { status: -1, label: \"已删除\" },\n passed: { status: 1, label: \"已通过\" },\n rejected: { status: 2, label: \"已驳回\" },\n processing: { status: 0, label: \"审批中\" },\n withdrawn: { status: 4, label: \"已撤回\" },\n deleted: { status: -1, label: \"已删除\" },\n };\n if (normalized in aliases) {\n return aliases[normalized];\n }\n if (normalized.includes(\",\")) {\n const [statusPart, preStatusPart] = normalized.split(\",\");\n const status = Number.parseInt(statusPart.trim(), 10);\n const preStatus = Number.parseInt((preStatusPart ?? \"\").trim(), 10);\n if (Number.isNaN(status) || Number.isNaN(preStatus)) {\n throw new Error(\"Invalid appro status pair. Use status,preStatus such as 3,2.\");\n }\n return { status, preStatus, label: formatApproStatus(status, preStatus, \"all\") };\n }\n const parsed = Number.parseInt(normalized, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(\"Invalid appro status. Use a numeric status or all.\");\n }\n return { status: parsed, label: `状态(${parsed})` };\n}\n\nfunction parseNumberList(value: string | undefined): number[] {\n if (!value || value.trim() === \"\" || value.trim().toLowerCase() === \"all\") {\n return [];\n }\n return value.split(\",\").map((part) => {\n const parsed = Number.parseInt(part.trim(), 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid appro type: ${part}`);\n }\n return parsed;\n });\n}\n\nfunction formatApproStatus(\n status: number | string | undefined,\n preStatus: number | string | undefined,\n scope: ApproScope,\n): string {\n const code = typeof status === \"string\" ? Number.parseInt(status, 10) : status;\n const preCode = typeof preStatus === \"string\" ? Number.parseInt(preStatus, 10) : preStatus;\n if (code === 3 && preCode === 2) {\n return \"驳回后重新发起\";\n }\n if (code === 3 && preCode === 4) {\n return \"撤回后重新发起\";\n }\n if (scope === \"my\") {\n switch (code) {\n case 1:\n return \"待我审批\";\n case 2:\n return \"我已通过\";\n case 3:\n return \"我已驳回\";\n case 4:\n return \"他人已处理\";\n case 5:\n return \"我转签的\";\n }\n }\n switch (code) {\n case 0:\n return \"审批中\";\n case 1:\n return \"已通过\";\n case 2:\n return \"已驳回\";\n case 3:\n return \"重新发起\";\n case 4:\n return \"已撤回\";\n case 5:\n return \"已驳回\";\n case 6:\n return \"重新发起\";\n case -1:\n return \"已删除\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatApproType(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"盖章审批\";\n case 1:\n return \"发票审批\";\n case 2:\n return \"报销审批\";\n case 3:\n return \"结项审批\";\n case 4:\n return \"合同审批\";\n case 5:\n return \"立项审批\";\n case 6:\n return \"重启项目审批\";\n case 7:\n return \"编辑项目审批\";\n case 8:\n return \"预立项审批\";\n case 9:\n return \"编辑预立项审批\";\n case 10:\n return \"预立项转进行中审批\";\n case 13:\n return \"完成任务审批\";\n case 14:\n return \"归档审批\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `审批类型(${code})`;\n }\n}\n\nfunction formatMatterLevel(value: unknown): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 1:\n return \"无\";\n case 2:\n return \"低\";\n case 3:\n return \"中\";\n case 4:\n return \"高\";\n default:\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n }\n}\n\nfunction formatSignType(value: unknown): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"线下签署\";\n case 1:\n return \"线上签署\";\n default:\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n }\n}\n\nfunction formatInvoiceType(value: unknown): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 1:\n return \"增值税专用发票\";\n case 2:\n return \"增值税普通发票\";\n case 3:\n return \"电子专用发票\";\n case 4:\n return \"电子普通发票\";\n default:\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n }\n}\n\nfunction formatFlowStatus(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"未处理\";\n case 1:\n return \"待处理\";\n case 2:\n return \"已通过\";\n case 3:\n return \"已驳回\";\n case 4:\n return \"已撤回\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatFlowUserStatus(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"未处理\";\n case 1:\n return \"待处理\";\n case 2:\n return \"已通过\";\n case 3:\n return \"已驳回\";\n case 4:\n return \"已转签\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatUserStatus(value: number | string | undefined): string {\n const code = typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n switch (code) {\n case 0:\n return \"离职\";\n case 1:\n return \"在职\";\n default:\n return code === undefined || Number.isNaN(code) ? \"\" : `未知状态(${code})`;\n }\n}\n\nfunction formatRawStatus(value: number | string | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n return String(value);\n}\n\nfunction normalizeFieldValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n return stripHtml(value);\n }\n return value ?? \"\";\n}\n\nfunction normalizeStringList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).filter(Boolean);\n }\n if (typeof value === \"string\") {\n return value.split(\",\").map((item) => item.trim()).filter(Boolean);\n }\n return [];\n}\n\nfunction formatAttachmentFieldValue(value: unknown): string {\n const count = normalizeStringList(value).length;\n return count ? `${count}个附件,详见顶层附件` : \"\";\n}\n\nfunction formatDateTime(value: string | number | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n\n const date = parseDateTime(value);\n if (!date) {\n return String(value);\n }\n\n // Alpha returns some approval dates as timestamps. Present a stable local\n // datetime for agents and terminal users instead of leaking raw milliseconds.\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hour = String(date.getHours()).padStart(2, \"0\");\n const minute = String(date.getMinutes()).padStart(2, \"0\");\n const second = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hour}:${minute}:${second}`;\n}\n\nfunction parseDateTime(value: string | number): Date | null {\n if (typeof value === \"number\") {\n return dateFromTimestamp(value);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return dateFromTimestamp(Number.parseInt(trimmed, 10));\n }\n\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction dateFromTimestamp(timestamp: number): Date | null {\n if (!Number.isFinite(timestamp)) {\n return null;\n }\n // Ten-digit timestamps are seconds; thirteen-digit timestamps are millis.\n const milliseconds = Math.abs(timestamp) < 10_000_000_000 ? timestamp * 1000 : timestamp;\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction formatFileSize(size: number | undefined): string {\n if (!size || size <= 0) {\n return \"0B\";\n }\n if (size < 1024) {\n return `${size}B`;\n }\n if (size < 1024 * 1024) {\n return `${Number((size / 1024).toFixed(2))}KB`;\n }\n return `${Number((size / 1024 / 1024).toFixed(2))}MB`;\n}\n\nfunction stringField(source: Record<string, unknown>, key: string): string {\n const value = source[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction stripHtml(value: string): string {\n return value.replace(/<[^>]*>/g, \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction clampPage(page: number): number {\n if (!Number.isFinite(page) || page < 1) {\n return 1;\n }\n return Math.floor(page);\n}\n\nfunction clampLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 1) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n\nfunction clampCommentLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 0) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\n\nexport function runCapabilities(version: string): void {\n const environment = getDefaultEnvironmentPreset();\n // This command is the generic agent contract. Keep it stable and conservative:\n // agents should discover supported commands here instead of guessing REST APIs.\n printSuccess({\n \"工具\": {\n \"名称\": \"alpha-classic-cli\",\n \"版本\": version,\n \"所属系统\": \"Alpha 律所管理系统\",\n \"说明\": \"Alpha Classic CLI,用于查询 Alpha 律所管理系统业务数据的 AI-friendly CLI\",\n },\n \"环境\": {\n \"当前环境\": environment.name,\n \"baseUrl\": environment.baseUrl,\n \"apiBaseUrl\": environment.apiBaseUrl,\n \"是否构建时锁定\": true,\n \"切换方式\": \"重新构建对应环境版本,例如 npm run build:dev\",\n },\n \"认证\": {\n \"检查登录\": \"alpha-classic-cli doctor\",\n \"默认登录\": \"alpha-classic-cli login\",\n \"Agent 两阶段登录\": [\n \"alpha-classic-cli login --no-wait --json\",\n \"alpha-classic-cli login --device-code <device_code>\",\n ],\n \"调试 fallback\": \"alpha-classic-cli login --token <token>\",\n \"登出\": \"alpha-classic-cli logout\",\n \"请求头\": [\"token: <token>\", \"deviceType: ai\"],\n \"注意\": \"不要输出 token/refreshToken,不要把 token 写入回答或 URL。\",\n },\n \"版本\": {\n \"机器可读\": \"alpha-classic-cli version\",\n \"纯文本\": \"alpha-classic-cli --version\",\n },\n \"智能体安装\": {\n \"Codex\": \"alpha-classic-cli install --agent codex\",\n \"Claude Code\": \"alpha-classic-cli install --agent claude\",\n \"Alpha-claw\": \"alpha-classic-cli install --agent alphaclaw\",\n \"全部支持的智能体\": \"alpha-classic-cli install --agent all\",\n \"卸载 Codex\": \"alpha-classic-cli uninstall --agent codex\",\n \"卸载 Claude Code\": \"alpha-classic-cli uninstall --agent claude\",\n \"卸载 Alpha-claw\": \"alpha-classic-cli uninstall --agent alphaclaw\",\n \"卸载全部\": \"alpha-classic-cli uninstall --agent all\",\n \"说明\": \"用户自行选择安装目标;Alpha-claw 会按 CLI 构建环境安装到对应 .openclaw-<env>alphaclaw 工作区。\",\n },\n \"输出协议\": {\n \"成功\": { \"ok\": true, \"data\": \"业务数据\" },\n \"失败\": {\n \"ok\": false,\n \"error\": {\n \"type\": \"runtime\",\n \"message\": \"错误信息\",\n \"hint\": \"可选提示\",\n },\n },\n \"说明\": \"外层 ok/data/error 为机器协议,data 内业务字段优先使用中文。\",\n },\n \"命令\": [\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询项目列表\",\n \"命令\": \"alpha-classic-cli matter search\",\n \"别名\": [\"alpha-classic-cli project search\"],\n \"参数\": {\n \"--keyword\": \"可选。项目名称、编号、客户名等自然语言关键词。\",\n \"--status\": \"可选。项目状态:预立项、进行中、进行中+预立项、已完结、已搁置、已归档、全部;默认 进行中+预立项。对应请求体 matterStatusSet:预立项=[0],进行中=[2],进行中+预立项=[2,0],已完结=[4],已搁置=[7],已归档=[6],全部=[0,2,4,6,7]。\",\n \"--scope\": \"可选。项目范围:所有项目、我关注的、已加入的;默认 所有项目。所有项目按前端默认筛选传完整请求体;我关注的按前端只传 isView=true、matchedName、queryOrderPage,不传 matterStatusSet;已加入的按当前用户和全部项目角色生成 memberOfRoles。\",\n \"--limit\": \"可选。默认 10,最大 50。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n },\n \"输出字段\": {\n \"项目状态\": \"本次查询使用的项目状态筛选\",\n \"项目范围\": \"本次查询使用的项目范围筛选\",\n \"总数\": \"匹配项目总数\",\n \"页码\": \"当前页码\",\n \"每页数量\": \"本次查询 pageSize\",\n \"展示字段\": \"项目列表实际展示字段:固定字段加 /matterserver/api/v1/customFields/dashboard/MATTER_LIST 返回的 selectedFields 顺序。\",\n \"项目状态统计\": \"按状态聚合的项目数量\",\n \"项目列表\": [\n \"项目ID\",\n \"项目名称\",\n \"项目状态\",\n \"项目客户\",\n \"项目类型\",\n \"dashboard selectedFields 对应字段\",\n ],\n },\n \"示例\": \"alpha-classic-cli matter search --keyword 合同 --limit 10\",\n },\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询项目详情/概览\",\n \"命令\": \"alpha-classic-cli matter detail\",\n \"参数\": {\n \"--id\": \"必填。项目ID,通常先通过 matter search 获取。\",\n \"--logs\": \"可选。最近动态数量,默认 5,最大 20;传 0 可跳过动态。\",\n },\n \"输出字段\": {\n \"项目概览\": [\n \"项目ID\",\n \"项目名称\",\n \"项目编号\",\n \"项目状态\",\n \"项目类型\",\n \"项目等级\",\n \"客户\",\n \"其他当事人\",\n \"所属\",\n \"案源律师\",\n \"承办律师\",\n \"主办律师\",\n \"协办律师\",\n \"项目成员\",\n \"案由\",\n \"代理审级\",\n \"服务内容\",\n \"开始日期\",\n \"结束日期\",\n \"立项时间\",\n \"结项时间\",\n \"归档日期\",\n \"归档编号\",\n \"项目详情\",\n ],\n \"最近动态\": [\"动态ID\", \"类型\", \"时间\", \"内容\"],\n },\n \"示例\": \"alpha-classic-cli matter detail --id <matterId> --logs 5\",\n },\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询项目下任务列表\",\n \"命令\": \"alpha-classic-cli matter task\",\n \"参数\": {\n \"--id\": \"必填。项目ID,通常先通过 matter search 获取。\",\n \"--state\": \"可选。任务状态:all、未完成、已完成,默认未完成。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 20,最大 50。\",\n \"--type\": \"可选。task 或 group,默认 task。\",\n \"--attention\": \"可选。all 或 我关注的,默认 all。\",\n },\n \"输出字段\": {\n \"项目ID\": \"当前项目ID\",\n \"项目名称\": \"当前项目名称\",\n \"项目类型\": \"当前项目类型\",\n \"状态\": \"查询状态\",\n \"关注\": \"查询关注范围\",\n \"类型\": \"查询任务类型\",\n \"总数\": \"匹配任务总数\",\n \"页码\": \"当前页码\",\n \"每页数量\": \"本次查询 pageSize\",\n \"任务列表\": [\n \"任务ID\",\n \"任务名称\",\n \"任务组\",\n \"状态\",\n \"负责人\",\n \"参与人\",\n \"到期时间\",\n \"开始时间\",\n \"结束时间\",\n \"计时总时长\",\n \"检查项\",\n \"评论数\",\n \"附件数\",\n \"是否关注\",\n \"时间类型\",\n \"全天类型\",\n \"工作类型\",\n \"重复规则\",\n ],\n },\n \"示例\": \"alpha-classic-cli matter task --id <matterId> --state 未完成 --limit 20\",\n },\n {\n \"模块\": \"matter\",\n \"中文名\": \"项目\",\n \"能力\": \"查询任务详情\",\n \"命令\": \"alpha-classic-cli matter task-detail\",\n \"参数\": {\n \"--id\": \"必填。任务ID,通常先通过 matter task 获取。\",\n \"--comments\": \"可选。最近任务动态和评论数量,默认 10,最大 50;传 0 可跳过。\",\n },\n \"输出字段\": {\n \"任务概览\": [\n \"任务ID\",\n \"任务名称\",\n \"项目ID\",\n \"项目名称\",\n \"任务组\",\n \"状态\",\n \"创建人\",\n \"负责人\",\n \"参与人\",\n \"开始时间\",\n \"到期时间\",\n \"结束时间\",\n \"任务详情\",\n \"检查项\",\n \"子任务\",\n \"评论数\",\n \"动态数\",\n \"附件数\",\n \"计时总时长\",\n \"工作类型\",\n \"重复规则\",\n ],\n \"检查项\": [\"检查项ID\", \"内容\", \"状态\", \"创建时间\", \"更新时间\"],\n \"附件\": [\"文件名\", \"大小\"],\n \"计时\": [\"计时总时长\", \"总数\", \"计时列表\"],\n \"任务动态\": [\"总数\", \"页码\", \"每页数量\", \"动态列表\"],\n },\n \"示例\": \"alpha-classic-cli matter task-detail --id <taskId> --comments 10\",\n },\n {\n \"模块\": \"appro\",\n \"中文名\": \"审批\",\n \"能力\": \"查询审批列表\",\n \"命令\": \"alpha-classic-cli appro list\",\n \"参数\": {\n \"--scope\": \"可选。支持 my/我审批的、started/我发起的、cc/抄送我的、all/全部审批;默认 my。\",\n \"--keyword\": \"可选。审批重要信息、项目名称等关键词。\",\n \"--status\": \"可选。审批状态码、中文状态名或 all,例如 待我审批。\",\n \"--status for scope=my\": [\"all\", \"待我审批\", \"我已通过\", \"我已驳回\", \"他人已处理\", \"我转签的\"],\n \"--status for scope=started|cc|all\": [\n \"all\",\n \"审批中\",\n \"已通过\",\n \"已驳回\",\n \"驳回后重新发起\",\n \"已撤回\",\n \"撤回后重新发起\",\n \"已删除\",\n ],\n \"--appro-type\": \"可选。审批类型ID,多个用英文逗号分隔。\",\n \"--starter-id\": \"可选。发起人用户ID;最终会放入接口 startUserIds。\",\n \"--starter-name\": \"可选。发起人姓名;CLI 会先查发起人列表并解析为 starter-id。\",\n \"--limit\": \"可选。默认 10,最大 50。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--count-only\": \"可选。只返回匹配数量,适合回答“有多少”类问题。\",\n },\n \"输出字段\": {\n \"总数\": \"匹配审批总数\",\n \"页码\": \"当前页码\",\n \"每页数量\": \"本次查询 pageSize\",\n \"审批列表\": [\n \"审批ID\",\n \"审批类型\",\n \"重要信息\",\n \"项目ID\",\n \"项目名称\",\n \"项目编号\",\n \"客户\",\n \"发起人\",\n \"状态\",\n \"当前节点\",\n \"发起时间\",\n \"到达当前节点时间\",\n \"流程任务ID\",\n ],\n },\n \"示例\": [\n \"alpha-classic-cli appro list --scope my --status 待我审批 --count-only\",\n \"alpha-classic-cli appro list --scope started --status 审批中 --limit 10\",\n \"alpha-classic-cli appro list --scope cc --status 驳回后重新发起 --limit 10\",\n \"alpha-classic-cli appro list --scope all --status 已撤回 --limit 10\",\n ],\n },\n {\n \"模块\": \"appro\",\n \"中文名\": \"审批\",\n \"能力\": \"查询审批发起人列表\",\n \"命令\": \"alpha-classic-cli appro initiators\",\n \"参数\": {\n \"--keyword\": \"可选。按发起人姓名过滤。\",\n \"--include-left\": \"可选。包含非在职用户;默认只查在职未删除用户。\",\n \"--limit\": \"可选。默认 50,最大 50。\",\n },\n \"输出字段\": {\n \"总数\": \"匹配发起人数\",\n \"发起人列表\": [\"发起人ID\", \"姓名\", \"手机号\", \"邮箱\", \"状态\"],\n },\n \"示例\": \"alpha-classic-cli appro initiators --keyword 张三\",\n },\n {\n \"模块\": \"appro\",\n \"中文名\": \"审批\",\n \"能力\": \"查询审批详情\",\n \"命令\": \"alpha-classic-cli appro detail\",\n \"参数\": {\n \"--id\": \"必填。审批ID,通常先通过 appro list 获取。\",\n \"--comments\": \"可选。最近用户评论和审批动态数量,默认 10,最大 50;传 0 可跳过。\",\n },\n \"输出字段\": {\n \"审批概览\": [\n \"审批ID\",\n \"审批类型\",\n \"重要信息\",\n \"状态\",\n \"当前节点\",\n \"发起人\",\n \"发起时间\",\n \"更新时间\",\n \"审批编号\",\n \"评论和动态数量\",\n \"流程任务ID\",\n ],\n \"项目信息\": [\"项目ID\", \"项目名称\", \"项目编号\", \"项目类型\", \"项目状态\", \"项目所属\", \"客户\"],\n \"审批表单\": {\n \"表单类型\": \"审批类型名称,例如 立项审批、合同审批、自定义审批。\",\n \"业务分组\": \"按前端审批详情模板展示的分组名输出,例如 合同信息、盖章信息、项目基本信息、项目补充信息、当前程序信息、项目详情、项目成员、关联合同信息、关联收款信息、专票信息、补充信息、备注。自定义 fieldsDtos/formFields 统一并入 补充信息。\",\n },\n \"审批流程\": [\"节点ID\", \"节点名称\", \"节点类型\", \"节点状态\", \"是否当前节点\", \"审批方式\", \"操作时间\", \"审批人\"],\n \"附件\": [\"文件名\", \"大小\"],\n \"用户评论\": [\"总数\", \"页码\", \"每页数量\", \"评论列表\", \"评论ID\", \"类型\", \"评论人\", \"内容\", \"评论时间\"],\n \"审批动态\": [\"总数\", \"页码\", \"每页数量\", \"动态列表\", \"动态ID\", \"类型\", \"操作\", \"操作人\", \"内容\", \"动态时间\"],\n },\n \"示例\": \"alpha-classic-cli appro detail --id <approId> --comments 10\",\n },\n ],\n \"安全规则\": [\n \"当前只支持查询,不执行写操作。\",\n \"不要输出 token。\",\n \"不要自行拼接后端接口,除非用户明确要求使用 api 调试命令。\",\n \"优先使用 capabilities 中声明的稳定业务命令。\",\n \"环境运行时不可切换,避免误连 dev/prod。\",\n ],\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport {\n CLAUDE_GUIDE_TEMPLATE,\n copyDirectory,\n SKILL_NAME,\n SKILL_TEMPLATE_ROOT,\n} from \"./templates.js\";\n\nexport interface InstallState {\n codexSkillPath: string;\n codexSkillInstalled: boolean;\n claudeGuidePath?: string;\n claudeGuideInstalled?: boolean;\n claudeMemoryPath?: string;\n claudeMemoryUpdated?: boolean;\n alphaClawSkillPath?: string;\n alphaClawSkillInstalled?: boolean;\n}\n\nexport type AgentInstallTarget = \"codex\" | \"claude\" | \"alphaclaw\" | \"all\";\n\nexport function resolveCodexSkillPath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".codex\", \"skills\", SKILL_NAME);\n}\n\nexport function resolveClaudeGuidePath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".claude\", \"alpha-classic-cli.md\");\n}\n\nexport function resolveClaudeMemoryPath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".claude\", \"CLAUDE.md\");\n}\n\nexport function resolveAlphaClawSkillPath(homeDir = os.homedir()): string {\n const environment = getDefaultEnvironmentPreset();\n return path.join(\n homeDir,\n `.openclaw-${environment.name}alphaclaw`,\n \"workspace\",\n \"skills\",\n SKILL_NAME,\n );\n}\n\nexport async function installAgentGuides(options?: {\n agent?: AgentInstallTarget;\n homeDir?: string;\n}): Promise<InstallState> {\n const agent = options?.agent ?? \"codex\";\n const result: InstallState = {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n };\n\n if (agent === \"codex\" || agent === \"all\") {\n const codexResult = await installCodexSkill(options);\n result.codexSkillPath = codexResult.codexSkillPath;\n result.codexSkillInstalled = codexResult.codexSkillInstalled;\n }\n if (agent === \"claude\" || agent === \"all\") {\n const claudeResult = await installClaudeGuide(options);\n result.claudeGuidePath = claudeResult.claudeGuidePath;\n result.claudeGuideInstalled = claudeResult.claudeGuideInstalled;\n result.claudeMemoryPath = claudeResult.claudeMemoryPath;\n result.claudeMemoryUpdated = claudeResult.claudeMemoryUpdated;\n }\n if (agent === \"alphaclaw\" || agent === \"all\") {\n const alphaClawResult = await installAlphaClawSkill(options);\n result.alphaClawSkillPath = alphaClawResult.alphaClawSkillPath;\n result.alphaClawSkillInstalled = alphaClawResult.alphaClawSkillInstalled;\n }\n\n return result;\n}\n\nexport async function uninstallAgentGuides(options?: {\n agent?: AgentInstallTarget;\n homeDir?: string;\n}): Promise<InstallState> {\n const agent = options?.agent ?? \"codex\";\n const result: InstallState = {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n };\n\n if (agent === \"codex\" || agent === \"all\") {\n await fs.rm(resolveCodexSkillPath(options?.homeDir), { recursive: true, force: true });\n result.codexSkillInstalled = false;\n }\n if (agent === \"claude\" || agent === \"all\") {\n const claudeResult = await uninstallClaudeGuide(options);\n result.claudeGuidePath = claudeResult.claudeGuidePath;\n result.claudeGuideInstalled = false;\n result.claudeMemoryPath = claudeResult.claudeMemoryPath;\n result.claudeMemoryUpdated = claudeResult.claudeMemoryUpdated;\n }\n if (agent === \"alphaclaw\" || agent === \"all\") {\n await fs.rm(resolveAlphaClawSkillPath(options?.homeDir), { recursive: true, force: true });\n result.alphaClawSkillPath = resolveAlphaClawSkillPath(options?.homeDir);\n result.alphaClawSkillInstalled = false;\n }\n\n return result;\n}\n\nexport async function installCodexSkill(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const skillPath = resolveCodexSkillPath(options?.homeDir);\n await fs.rm(skillPath, { recursive: true, force: true });\n await copyDirectory(SKILL_TEMPLATE_ROOT, skillPath);\n return {\n codexSkillPath: skillPath,\n codexSkillInstalled: true,\n };\n}\n\nexport async function installAlphaClawSkill(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const skillPath = resolveAlphaClawSkillPath(options?.homeDir);\n // Alpha-claw stores skills under an environment-specific workspace. Replacing\n // only this managed skill keeps user-created Alpha-claw skills untouched.\n await fs.rm(skillPath, { recursive: true, force: true });\n await copyDirectory(SKILL_TEMPLATE_ROOT, skillPath);\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n alphaClawSkillPath: skillPath,\n alphaClawSkillInstalled: true,\n };\n}\n\nexport async function installClaudeGuide(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const guidePath = resolveClaudeGuidePath(options?.homeDir);\n const memoryPath = resolveClaudeMemoryPath(options?.homeDir);\n const importLine = \"@~/.claude/alpha-classic-cli.md\";\n\n await fs.mkdir(path.dirname(guidePath), { recursive: true });\n await fs.copyFile(CLAUDE_GUIDE_TEMPLATE, guidePath);\n const memoryUpdated = await ensureClaudeImport(memoryPath, importLine);\n\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n claudeGuidePath: guidePath,\n claudeGuideInstalled: true,\n claudeMemoryPath: memoryPath,\n claudeMemoryUpdated: memoryUpdated,\n };\n}\n\nexport async function uninstallClaudeGuide(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const guidePath = resolveClaudeGuidePath(options?.homeDir);\n const memoryPath = resolveClaudeMemoryPath(options?.homeDir);\n await fs.rm(guidePath, { force: true });\n const memoryUpdated = await removeClaudeImport(memoryPath);\n\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n claudeGuidePath: guidePath,\n claudeGuideInstalled: false,\n claudeMemoryPath: memoryPath,\n claudeMemoryUpdated: memoryUpdated,\n };\n}\n\nexport async function inspectInstallState(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const skillPath = resolveCodexSkillPath(options?.homeDir);\n let installed = false;\n try {\n await fs.access(path.join(skillPath, \"SKILL.md\"));\n installed = true;\n } catch {\n installed = false;\n }\n const claudeGuidePath = resolveClaudeGuidePath(options?.homeDir);\n let claudeGuideInstalled = false;\n try {\n await fs.access(claudeGuidePath);\n claudeGuideInstalled = true;\n } catch {\n claudeGuideInstalled = false;\n }\n const alphaClawSkillPath = resolveAlphaClawSkillPath(options?.homeDir);\n let alphaClawSkillInstalled = false;\n try {\n await fs.access(path.join(alphaClawSkillPath, \"SKILL.md\"));\n alphaClawSkillInstalled = true;\n } catch {\n alphaClawSkillInstalled = false;\n }\n\n return {\n codexSkillPath: skillPath,\n codexSkillInstalled: installed,\n claudeGuidePath,\n claudeGuideInstalled,\n claudeMemoryPath: resolveClaudeMemoryPath(options?.homeDir),\n alphaClawSkillPath,\n alphaClawSkillInstalled,\n };\n}\n\nasync function ensureClaudeImport(memoryPath: string, importLine: string): Promise<boolean> {\n let current = \"\";\n try {\n current = await fs.readFile(memoryPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n throw error;\n }\n }\n\n if (current.includes(importLine) || current.includes(\"alpha-classic-cli.md\")) {\n return false;\n }\n\n // Claude Code supports importing memory files with @path. Append a tiny managed\n // import instead of overwriting the user's existing global CLAUDE.md.\n const prefix = current.trimEnd();\n const next = `${prefix}${prefix ? \"\\n\\n\" : \"\"}# Alpha Classic CLI\\n\\n${importLine}\\n`;\n await fs.mkdir(path.dirname(memoryPath), { recursive: true });\n await fs.writeFile(memoryPath, next, \"utf8\");\n return true;\n}\n\nasync function removeClaudeImport(memoryPath: string): Promise<boolean> {\n let current = \"\";\n try {\n current = await fs.readFile(memoryPath, \"utf8\");\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n\n const next = current\n .replace(\n /\\n{0,2}# Alpha Classic CLI\\n\\n@~\\/\\.claude\\/alpha-classic-cli\\.md\\n?/g,\n \"\\n\",\n )\n .replace(/\\n?@~\\/\\.claude\\/alpha-classic-cli\\.md\\n?/g, \"\\n\")\n .trimEnd();\n\n if (next === current.trimEnd()) {\n return false;\n }\n\n await fs.writeFile(memoryPath, next ? `${next}\\n` : \"\", \"utf8\");\n return true;\n}\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport const SKILL_NAME = \"alpha-classic-cli\";\nexport const SKILL_TEMPLATE_ROOT = resolveAssetPath(\"alpha-classic-skill\");\nexport const CLAUDE_GUIDE_TEMPLATE = path.join(\n resolveAssetPath(\"claude\"),\n \"alpha-classic-cli.md\",\n);\n\nfunction resolveAssetPath(assetDirName: string): string {\n // When bundled by tsup, this module runs from dist/index.js, so assets live at\n // ../assets. When run from source with tsx, this module lives under src/install,\n // so assets live at ../../assets. Keep both paths explicit for packaged users.\n const candidates = [\n path.resolve(__dirname, \"..\", \"assets\", assetDirName),\n path.resolve(__dirname, \"..\", \"..\", \"assets\", assetDirName),\n ];\n const match = candidates.find((candidate) => existsSync(candidate));\n return match ?? candidates[0];\n}\n\nexport async function copyDirectory(source: string, target: string): Promise<void> {\n await fs.mkdir(target, { recursive: true });\n const entries = await fs.readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n const sourcePath = path.join(source, entry.name);\n const targetPath = path.join(target, entry.name);\n if (entry.isDirectory()) {\n await copyDirectory(sourcePath, targetPath);\n continue;\n }\n if (entry.isFile()) {\n await fs.copyFile(sourcePath, targetPath);\n }\n }\n}\n","import { ApiClient } from \"../http/api-client.js\";\nimport { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { inspectInstallState } from \"../install/install.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionRecord, SessionStore } from \"../session/store.js\";\nimport { decodeAlphaJwtClaims } from \"../util/jwt.js\";\n\ninterface CurrentUserResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: CurrentUserData;\n}\n\ninterface CurrentUserData {\n accid?: string;\n id?: string;\n user_id?: string;\n office_id?: string;\n officeId?: string;\n name?: string;\n userName?: string;\n officeName?: string;\n}\n\nexport async function runDoctor(sessionStore: SessionStore): Promise<void> {\n const config = await sessionStore.getConfig();\n let session = await sessionStore.getSession();\n const environment = getDefaultEnvironmentPreset();\n const installState = await inspectInstallState();\n\n let apiCheck: { ok: boolean; message: string } = {\n ok: false,\n message: \"未登录。请执行:alpha-classic-cli login\",\n };\n\n if (session) {\n try {\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n const currentUserResponse = (await client.check()) as CurrentUserResponse;\n const currentUserData = getCurrentUserData(currentUserResponse);\n const userName =\n currentUserData?.name ??\n currentUserData?.userName ??\n session.userName ??\n session.name ??\n \"用户\";\n // Doctor doubles as a lightweight session repair step. Older builds\n // stored userName/tenantId, so a successful me check rewrites the session\n // using the current userId/officeId/name shape.\n if (currentUserResponse.isSuccess !== false && currentUserData) {\n session = await refreshSessionFromCurrentUser(session, currentUserData);\n }\n apiCheck = {\n ok: currentUserResponse.isSuccess !== false,\n message:\n currentUserResponse.isSuccess === false\n ? (currentUserResponse.resultMsg ?? \"登录验证失败\")\n : `${userName},登录成功!`,\n };\n } catch (error) {\n apiCheck = {\n ok: false,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n printSuccess({\n config: {\n environment: environment.name,\n baseUrl: environment.baseUrl,\n apiBaseUrl: environment.apiBaseUrl,\n locked: true,\n source: \"build\",\n configPath: sessionStore.configPath,\n },\n session: session\n ? {\n present: true,\n userId: session.userId ?? \"(unknown)\",\n userName: session.userName ?? session.name ?? \"(unknown)\",\n officeId: session.officeId ?? \"(unknown)\",\n officeName: session.officeName ?? \"(unknown)\",\n environment: environment.name,\n tokenExpireTime: session.tokenExpireTime ?? \"(unknown)\",\n refreshTokenExpireTime: session.refreshTokenExpireTime ?? \"(unknown)\",\n deviceType: session.deviceType ?? \"ai\",\n updatedAt: session.updatedAt,\n }\n : { present: false, hint: \"alpha-classic-cli login\" },\n install: installState,\n apiCheck,\n });\n\n async function refreshSessionFromCurrentUser(\n currentSession: SessionRecord,\n currentUserData: CurrentUserData,\n ): Promise<SessionRecord> {\n const jwtClaims = decodeAlphaJwtClaims(currentSession.token);\n const legacySession = currentSession as SessionRecord & { siteId?: string; siteName?: string };\n const officeId = currentUserData.office_id ?? currentUserData.officeId ?? jwtClaims?.office_id;\n const officeName = currentUserData.officeName ?? jwtClaims?.office_name ?? legacySession.siteName;\n const userName = currentUserData.name ?? currentUserData.userName ?? jwtClaims?.user_name;\n const userId = currentUserData.accid ?? currentUserData.id ?? currentUserData.user_id ?? jwtClaims?.user_id;\n const { siteId: _siteId, siteName: _siteName, ...currentSessionWithoutLegacySite } = legacySession;\n // Keep token and existing timestamps-related context, but overwrite identity\n // fields with the authoritative values returned by Alpha.\n const refreshed: SessionRecord = {\n ...currentSessionWithoutLegacySite,\n ...(userId ? { userId } : {}),\n ...(officeId ?? legacySession.siteId ? { officeId: officeId ?? legacySession.siteId } : {}),\n ...(userName\n ? {\n name: userName,\n userName,\n }\n : {}),\n ...(officeName ? { officeName } : {}),\n ...(currentSession.tokenExpireTime ?? jwtClaims?.exp ? { tokenExpireTime: currentSession.tokenExpireTime ?? jwtClaims?.exp } : {}),\n deviceType: currentSession.deviceType ?? \"ai\",\n updatedAt: new Date().toISOString(),\n };\n await sessionStore.saveSession(refreshed);\n return refreshed;\n }\n}\n\nfunction getCurrentUserData(response: CurrentUserResponse | CurrentUserData): CurrentUserData | undefined {\n return \"data\" in response && response.data ? response.data : response as CurrentUserData;\n}\n","import {\n getDefaultEnvironmentPreset,\n listEnvironmentPresets,\n} from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\nexport async function runEnvCommand(\n action: string | undefined,\n _name: string | undefined,\n _sessionStore: SessionStore,\n): Promise<void> {\n const normalizedAction = action?.trim().toLowerCase() ?? \"current\";\n if (normalizedAction === \"list\") {\n printSuccess(listEnvironmentPresets(), {\n count: listEnvironmentPresets().length,\n });\n return;\n }\n\n if (normalizedAction === \"current\") {\n const fallback = getDefaultEnvironmentPreset();\n printSuccess({\n environment: fallback.name,\n label: fallback.label,\n baseUrl: fallback.baseUrl,\n apiBaseUrl: fallback.apiBaseUrl,\n locked: true,\n source: \"build\",\n });\n return;\n }\n\n if (normalizedAction === \"use\") {\n throw new Error(\n \"env use has been removed. This CLI only exposes env list and env current.\",\n );\n }\n throw new Error(`Unknown env action: ${normalizedAction}`);\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { ApiClient } from \"../http/api-client.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\ninterface MatterSearchOptions {\n keyword?: string;\n limit?: number;\n page?: number;\n status?: string;\n scope?: string;\n}\n\ninterface MatterDetailOptions {\n id: string;\n logs?: number;\n}\n\ninterface MatterTaskListOptions {\n matterId: string;\n state?: string;\n page?: number;\n limit?: number;\n type?: string;\n attention?: string;\n}\n\ninterface MatterTaskDetailOptions {\n id: string;\n comments?: number;\n}\n\ntype MatterSearchScope = \"all\" | \"followed\" | \"joined\";\n\ninterface MatterSearchStatus {\n label: string;\n values: number[];\n}\n\ninterface MatterSearchJoinMember {\n userId: string;\n roleIds: string[];\n}\n\ninterface AlphaMatterDetailResponse {\n resultCode?: string;\n resultMess?: string;\n data?: AlphaMatterDetailItem[];\n}\n\ninterface AlphaMatterDetailItem {\n pkId?: string;\n name?: string;\n status?: string;\n statusName?: string;\n matterNo?: string;\n matterType?: string;\n matterTypeName?: string;\n childMatterTypeName?: string;\n matterCaseName?: string;\n caseProcessName?: string;\n lawFieldName?: string;\n beginDate?: string;\n endDate?: string;\n openDate?: string;\n closeDate?: string;\n filingDate?: string;\n filingNo?: string;\n startMatterTime?: string;\n endMatterTime?: string;\n level?: string;\n remark?: string;\n matterOwner?: string;\n matterOwnerName?: string;\n groups?: Array<{ groupPkid?: string; name?: string }>;\n clients?: AlphaMatterContact[];\n litigants?: AlphaMatterContact[];\n relevants?: Array<{\n contactPkid?: string;\n contactName?: string;\n type?: string;\n isDeleted?: boolean;\n }>;\n attorneys?: AlphaMatterAttorney[];\n undertakeAttorneys?: AlphaMatterAttorney[];\n responsibleAttorneys?: AlphaMatterAttorney[];\n assistAttorneys?: AlphaMatterAttorney[];\n originatingAttorneys?: AlphaMatterAttorney[];\n otherAttorneys?: AlphaMatterAttorney[];\n members?: Array<{\n userId?: string;\n userName?: string;\n roleName?: string;\n approver?: boolean;\n }>;\n}\n\ninterface AlphaMatterAttorney {\n attorneyPkid?: string;\n attorneyName?: string;\n attorneyType?: string;\n}\n\ninterface AlphaMatterContact {\n contactPkid?: string;\n contactName?: string;\n customerPositionName?: string;\n contactType?: string;\n type?: string;\n isDeleted?: boolean;\n}\n\ninterface AlphaMatterLogResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterLogItem[];\n}\n\ninterface AlphaMatterLogItem {\n id?: string;\n type?: string;\n create_time?: string;\n createTime?: string;\n content?: string;\n}\n\ninterface AlphaMatterTaskListResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n result?: AlphaMatterTaskPage;\n data?: AlphaMatterTaskPage;\n}\n\ninterface AlphaMatterTaskDetailResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n message?: string;\n data?: AlphaMatterTaskItem;\n}\n\ninterface AlphaMatterTaskCheckItemResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTaskCheckItem[];\n}\n\ninterface AlphaMatterTaskAttachmentResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTaskAttachmentPage;\n}\n\ninterface AlphaMatterTaskTimingResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTaskTimingPage;\n}\n\ninterface AlphaMatterTaskCommentResponse {\n succeed?: boolean;\n message?: string;\n detail?: string;\n result?: AlphaMatterTaskCommentPage;\n}\n\ninterface AlphaDocumentDirListResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaDocumentFileInfo[];\n}\n\ninterface AlphaMatterRoleResponse {\n data?: Array<{\n id?: string | number;\n name?: string;\n }>;\n}\n\ninterface AlphaMatterTaskPage {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n count?: number;\n items?: AlphaMatterTaskItem[];\n data?: AlphaMatterTaskGroup[];\n}\n\ninterface AlphaMatterTaskGroup {\n id?: string;\n matterId?: string;\n matterName?: string;\n name?: string;\n state?: number;\n valid?: number;\n finishedTaskCount?: number;\n unfinishedTaskCount?: number;\n deletedTaskCount?: number;\n tasks?: AlphaMatterTaskItem[];\n}\n\ninterface AlphaMatterTaskItem {\n id?: string;\n matterId?: string;\n matterName?: string;\n name?: string;\n parentId?: string;\n parentName?: string;\n taskGroupId?: string;\n taskGroupName?: string;\n type?: number;\n state?: boolean | number;\n valid?: boolean | number;\n dueTime?: string | number;\n startTime?: string | number;\n endTime?: string | number;\n finishTime?: string | number;\n timingSum?: number;\n itemCount?: number;\n doneItemCount?: number;\n completedItemCount?: number;\n subtaskCount?: number;\n completedSubtaskCount?: number;\n deletedSubtaskCount?: number;\n commentCount?: number;\n dynamicCount?: number;\n attachmentCount?: number;\n safeBoxFileCount?: number;\n detail?: string;\n repeatId?: string;\n repeatSetting?: {\n id?: string;\n repeatRule?: string;\n customRepeatRule?: string;\n dayIndexList?: number[];\n endType?: string;\n endByDate?: string | number;\n endByTimes?: number;\n };\n timeType?: number;\n dayType?: number;\n workTypeId?: string;\n workType?: {\n id?: string;\n name?: string;\n };\n attentioned?: number;\n favorite?: boolean | number;\n attendeeUsers?: Array<{\n userId?: string;\n userName?: string;\n pic?: string;\n }>;\n assignUser?: {\n userId?: string;\n userName?: string;\n pic?: string;\n };\n attendees?: Array<{\n userId?: string;\n userName?: string;\n name?: string;\n pic?: string;\n }>;\n createUser?: {\n userId?: string;\n userName?: string;\n pic?: string;\n };\n matter?: {\n id?: string;\n name?: string;\n matterType?: string;\n };\n}\n\ninterface AlphaMatterTaskCheckItem {\n id?: string;\n name?: string;\n content?: string;\n state?: boolean | number;\n completed?: boolean;\n taskId?: string;\n orderNum?: number;\n gmtCreate?: string | number;\n gmtModified?: string | number;\n}\n\ninterface AlphaMatterTaskAttachmentPage {\n pageIndex?: number;\n pageSize?: number;\n count?: number;\n totalCount?: number;\n data?: AlphaMatterTaskAttachment[];\n items?: AlphaMatterTaskAttachment[];\n}\n\ninterface AlphaMatterTaskAttachment {\n id?: string;\n fileId?: string;\n fileName?: string;\n name?: string;\n path?: string;\n filePath?: string;\n pathInfoVo?: {\n fileId?: string;\n filePath?: string;\n repoId?: string;\n type?: string;\n };\n size?: number;\n fileSize?: number;\n createTime?: string | number;\n gmtCreate?: string | number;\n}\n\ninterface AlphaDocumentFileInfo {\n id?: string;\n name?: string;\n type?: string;\n size?: number;\n permission?: string;\n mtime?: number;\n isLocked?: boolean;\n lockedByMe?: boolean | null;\n lockTime?: string | number | null;\n lock_owner?: string | null;\n modifier_name?: string;\n modifierEmail?: string;\n}\n\ninterface AlphaMatterTaskTimingPage {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n timingSum?: number | null;\n allTimingSum?: number | null;\n items?: AlphaMatterTaskTimingItem[];\n datas?: AlphaMatterTaskTimingItem[] | null;\n}\n\ninterface AlphaMatterTaskTimingItem {\n id?: string;\n userName?: string;\n user?: { userName?: string; name?: string };\n startTime?: string | number;\n endTime?: string | number;\n timingSum?: number;\n workType?: { name?: string };\n}\n\ninterface AlphaMatterTaskCommentPage {\n pageIndex?: number;\n pageSize?: number;\n totalCount?: number;\n items?: AlphaMatterTaskCommentItem[];\n}\n\ninterface AlphaMatterTaskCommentItem {\n id?: string;\n content?: string;\n comment?: string;\n createUserId?: string;\n createUser?: {\n userId?: string;\n userName?: string;\n name?: string;\n pic?: string;\n };\n createTime?: string | number;\n createTimeFormat?: string;\n updateTime?: string | number;\n hostId?: string;\n concreteType?: number;\n}\n\ninterface AlphaMatterSearchResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: {\n totalCount?: number;\n matterStatusItems?: AlphaMatterStatusItem[];\n matterSearchElementVOs?: AlphaMatterItem[];\n };\n}\n\ninterface AlphaMatterCustomFieldsResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: {\n selectedFields?: AlphaMatterCustomField[];\n };\n}\n\ninterface AlphaMatterCustomField {\n customFieldId?: string;\n customFieldName?: string;\n customFieldValue?: string;\n customFieldType?: string;\n customFieldKey?: string;\n showType?: string | number;\n}\n\ninterface AlphaMatterStatusItem {\n matterStatus?: number;\n count?: number;\n}\n\ninterface AlphaMatterItem {\n [key: string]: unknown;\n pkId?: string;\n name?: string;\n status?: unknown;\n statusName?: string;\n matterNo?: string;\n matterTypeName?: string;\n childrenMatterTypeName?: string;\n legalTypeName?: string;\n caseProcessName?: string;\n openDate?: string;\n endMatterTime?: string;\n filingDate?: string;\n startMatterTime?: string;\n serviceStartRangeTime?: string;\n serviceEndRangeTime?: string;\n filingNo?: string;\n matterRemark?: string;\n sealCount?: number;\n sumTime?: number;\n matterLevel?: number;\n matterDynamicContent?: {\n content?: string;\n taskName?: string;\n actionTime?: string;\n description?: string;\n title?: string;\n createTime?: string;\n time?: string;\n };\n clients?: Array<{\n clientId?: string;\n clientName?: string;\n clientType?: string;\n }>;\n matterOwners?: Array<{\n ownerId?: string;\n ownerName?: string;\n ownerType?: string;\n }>;\n matterSourceLawyer?: Array<{ userName?: string; name?: string }>;\n matterReasonMessage?: string[];\n startUserName?: string;\n processEsEntities?: Array<{\n courtTime?: string;\n processName?: string;\n court?: string;\n }>;\n members?: Array<{ userName?: string; name?: string }>;\n undertakeLaywer?: Array<{ userName?: string; name?: string }>;\n otherParty?: Array<{ userName?: string; name?: string }>;\n financeDTO?: Record<string, unknown>;\n expandMatters?: Record<string, unknown>;\n unfinishTask?: number;\n allTask?: number;\n myStar?: string;\n}\n\nexport async function runMatterSearch(\n options: MatterSearchOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const limit = clampLimit(options.limit ?? 10);\n const page = Math.max(1, options.page ?? 1);\n const status = parseMatterSearchStatus(options.status);\n const scope = parseMatterSearchScope(options.scope);\n const joinMember = scope === \"joined\"\n ? await buildJoinedMatterMemberFilter(client, sessionStore)\n : undefined;\n const [selectedFields, response] = await Promise.all([\n fetchMatterListSelectedFields(client),\n client.request<AlphaMatterSearchResponse>(\n \"POST\",\n \"/matterserver/api/v2/matter/search\",\n {\n data: buildMatterSearchBody({\n keyword: options.keyword ?? \"\",\n limit,\n page,\n status,\n scope,\n joinMember,\n }),\n },\n ),\n ]);\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter search failed.\");\n }\n\n const responseData = unwrapEnvelopeData<NonNullable<AlphaMatterSearchResponse[\"data\"]>>(response);\n const projects = responseData?.matterSearchElementVOs ?? [];\n const displayedFields = getMatterListDisplayedFields(selectedFields);\n printSuccess({\n \"项目状态\": scope === \"followed\" ? \"未传状态筛选(我关注的)\" : status.label,\n \"项目范围\": formatMatterSearchScopeLabel(scope),\n \"总数\": responseData?.totalCount ?? projects.length,\n \"页码\": page,\n \"每页数量\": limit,\n \"展示字段\": displayedFields,\n \"项目状态统计\": (responseData?.matterStatusItems ?? []).map(toMatterStatusSummary),\n \"项目列表\": projects.map((project) => toMatterSummary(project, selectedFields)),\n });\n}\n\nexport async function runMatterDetail(\n options: MatterDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const matterId = options.id.trim();\n if (!matterId) {\n throw new Error(\"Missing matter id. Use: alpha-classic-cli matter detail --id <matterId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n // The overview page loads the main project detail from this endpoint. Keep the\n // CLI detail command centered on the same read API, then optionally add logs.\n const detailResponse = await client.request<AlphaMatterDetailResponse>(\n \"GET\",\n `/matterserver/api/v2/matters/${encodeURIComponent(matterId)}`,\n );\n if (detailResponse.resultCode && detailResponse.resultCode !== \"1\") {\n throw new Error(detailResponse.resultMess ?? \"Matter detail request failed.\");\n }\n\n const detailData = unwrapEnvelopeData<AlphaMatterDetailResponse[\"data\"]>(detailResponse);\n const matter = detailData?.[0];\n if (!matter) {\n throw new Error(\"项目不存在或当前用户无权查看。\");\n }\n\n const logLimit = clampLogLimit(options.logs ?? 5);\n const logs = logLimit\n ? await fetchMatterLogs(client, matterId, logLimit)\n : [];\n\n printSuccess({\n \"项目概览\": toMatterDetailSummary(matter),\n \"最近动态\": logs.map(toMatterLogSummary),\n });\n}\n\nexport async function runMatterTaskList(\n options: MatterTaskListOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const matterId = options.matterId.trim();\n if (!matterId) {\n throw new Error(\"Missing matter id. Use: alpha-classic-cli matter task --id <matterId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 20);\n const stateType = parseMatterTaskState(options.state);\n const type = parseMatterTaskType(options.type);\n const attentionType = parseMatterAttentionType(options.attention);\n const statusType = toMatterTaskStatusType(stateType);\n\n const response = await client.request<AlphaMatterTaskListResponse>(\n \"GET\",\n \"/taskserver/api/v1/tasks/listTaskByMatter\",\n {\n params: {\n matterId,\n statusType,\n pageIndex: page,\n pageSize: limit,\n searchSub: true,\n },\n },\n );\n\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Matter task list request failed.\");\n }\n\n const responseData = unwrapEnvelopeData<AlphaMatterTaskListResponse[\"data\"]>(response);\n const pageData = response.result ?? responseData ?? {};\n const groups = pageData.data ?? [];\n const tasks = pageData.items ?? flattenMatterTaskGroups(groups);\n const firstMatter = tasks[0]?.matter;\n printSuccess({\n \"项目ID\": matterId,\n \"项目名称\": firstMatter?.name ?? tasks[0]?.matterName ?? \"\",\n \"项目类型\": firstMatter?.matterType ?? \"\",\n \"状态\": formatMatterTaskStateLabel(stateType),\n \"关注\": formatMatterAttentionLabel(attentionType),\n \"类型\": formatMatterTaskTypeLabel(type),\n \"总数\": pageData.totalCount ?? pageData.count ?? tasks.length,\n \"页码\": pageData.pageIndex ?? page,\n \"每页数量\": pageData.pageSize ?? limit,\n \"任务列表\": type === 1 ? groups.map(toMatterTaskGroupSummary) : tasks.map(toMatterTaskSummary),\n });\n}\n\nexport async function runMatterTaskDetail(\n options: MatterTaskDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const taskId = options.id.trim();\n if (!taskId) {\n throw new Error(\"Missing task id. Use: alpha-classic-cli matter task-detail --id <taskId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = getDefaultEnvironmentPreset();\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const commentsLimit = clampCommentLimit(options.comments);\n const [detailResponse, checkItemResponse, attachmentResponse, timingResponse, commentResponse] =\n await Promise.all([\n client.request<AlphaMatterTaskDetailResponse>(\n \"GET\",\n `/taskserver/api/v1/tasks/${encodeURIComponent(taskId)}`,\n ),\n client.request<AlphaMatterTaskCheckItemResponse>(\n \"GET\",\n `/taskserver/api/v1/checkitem/${encodeURIComponent(taskId)}`,\n ),\n client.request<AlphaMatterTaskAttachmentResponse>(\n \"GET\",\n `/taskserver/api/v1/tasks/attachment/${encodeURIComponent(taskId)}`,\n {\n params: {\n pageIndex: 1,\n pageSize: 50,\n },\n },\n ),\n client.request<AlphaMatterTaskTimingResponse>(\n \"GET\",\n `/taskserver/api/v2/timing/timing/task/${encodeURIComponent(taskId)}`,\n {\n params: {\n pageIndex: 1,\n pageSize: commentsLimit,\n },\n },\n ),\n commentsLimit\n ? client.request<AlphaMatterTaskCommentResponse>(\n \"GET\",\n \"/ilaw/api/v2/comment/queryCommentsAndDynamic\",\n {\n params: {\n hostId: taskId,\n pageIndex: 1,\n pageSize: commentsLimit,\n },\n },\n )\n : Promise.resolve<AlphaMatterTaskCommentResponse>({\n succeed: true,\n result: { pageIndex: 1, pageSize: 0, totalCount: 0, items: [] },\n }),\n ]);\n\n if (detailResponse.isSuccess === false) {\n throw new Error(detailResponse.resultMsg ?? detailResponse.message ?? \"Matter task detail request failed.\");\n }\n if (checkItemResponse.isSuccess === false) {\n throw new Error(checkItemResponse.resultMsg ?? \"Matter task check items request failed.\");\n }\n if (attachmentResponse.isSuccess === false) {\n throw new Error(attachmentResponse.resultMsg ?? \"Matter task attachments request failed.\");\n }\n if (timingResponse.isSuccess === false) {\n throw new Error(timingResponse.resultMsg ?? \"Matter task timing request failed.\");\n }\n if (commentResponse.succeed === false) {\n throw new Error(commentResponse.message ?? commentResponse.detail ?? \"Matter task comments request failed.\");\n }\n\n const task = unwrapEnvelopeData<AlphaMatterTaskItem>(detailResponse);\n if (!task) {\n throw new Error(\"任务不存在或当前用户无权查看。\");\n }\n const checkItems = unwrapEnvelopeData<AlphaMatterTaskCheckItem[]>(checkItemResponse) ?? [];\n const attachmentPage = unwrapEnvelopeData<AlphaMatterTaskAttachmentPage>(attachmentResponse) ?? {};\n const attachments = attachmentPage.data ?? attachmentPage.items ?? [];\n const attachmentDetails = await fetchDocumentDetailsForAttachments(client, attachments);\n const timingPage = unwrapEnvelopeData<AlphaMatterTaskTimingPage>(timingResponse) ?? {};\n const commentPage = commentResponse.result ??\n unwrapEnvelopeData<AlphaMatterTaskCommentPage>(\n commentResponse as AlphaMatterTaskCommentPage | { data?: AlphaMatterTaskCommentPage },\n ) ??\n {};\n printSuccess({\n \"任务概览\": toMatterTaskDetailSummary(task),\n \"检查项\": checkItems.map(toMatterTaskCheckItemSummary),\n \"附件\": attachments.map((attachment) =>\n toMatterTaskAttachmentSummary(attachment, attachmentDetails.get(getAttachmentDocumentKey(attachment))),\n ),\n \"计时\": {\n \"计时总时长\": formatTotalTiming(timingPage.timingSum ?? timingPage.allTimingSum ?? 0),\n \"总数\": timingPage.totalCount ?? (timingPage.items ?? timingPage.datas ?? []).length,\n \"计时列表\": (timingPage.items ?? timingPage.datas ?? []).map(toMatterTaskTimingSummary),\n },\n \"任务动态\": {\n \"总数\": commentPage.totalCount ?? (commentPage.items ?? []).length,\n \"页码\": commentPage.pageIndex ?? 1,\n \"每页数量\": commentPage.pageSize ?? commentsLimit,\n \"动态列表\": (commentPage.items ?? []).map(toMatterTaskCommentSummary),\n },\n });\n}\n\nfunction buildMatterSearchBody(options: {\n keyword: string;\n limit: number;\n page: number;\n status: MatterSearchStatus;\n scope: MatterSearchScope;\n joinMember?: MatterSearchJoinMember;\n}): Record<string, unknown> {\n const today = formatLocalDate(new Date());\n const emptyRange = createEmptyTimeRange(today);\n const queryOrderPage = {\n order: {\n orderItems: [\n { isAsc: false, property: \"is_view\" },\n { isAsc: false, property: \"matter_name\" },\n ],\n },\n page: {\n pageSize: options.limit,\n startIndex: options.page,\n },\n };\n\n if (options.scope === \"followed\") {\n // Keep this branch byte-for-byte close to Alpha Web's \"我关注的\" tab request:\n // it intentionally drops status and advanced filters, then only sends isView.\n return {\n isView: true,\n matchedName: options.keyword.trim(),\n queryOrderPage,\n };\n }\n\n // This body mirrors the Alpha Web project list's default filter payload. The\n // CLI only exposes a small AI-friendly surface for now, but keeps the backend\n // defaults explicit so future filter additions do not accidentally change the\n // query semantics.\n const body: Record<string, unknown> = {\n createUserIds: [],\n customerIds: [],\n customerOrAnd: false,\n departmentIds: [],\n belongIngOrAnd: false,\n matchedName: options.keyword.trim(),\n matterCases: [],\n matterCasesOrAnd: false,\n matterLevels: [],\n matterOwnerIds: [],\n matterStatusSet: options.status.values,\n memberOfRoles: [],\n memberRolesOrAnd: false,\n nowProcessIds: [],\n nowProcessOrAnd: false,\n subMatterTypes: [],\n serviceStartRangeTime: emptyRange,\n serviceEndRangeTime: emptyRange,\n filingDate: emptyRange,\n startMatterTime: emptyRange,\n endMatterTime: emptyRange,\n createTime: emptyRange,\n rangeOfTargetAmount: { min: null, max: null },\n dynamicStatus: false,\n oppositePeopleName: \"\",\n attorneyIds: [],\n attorneyOrAnd: false,\n undertakeIds: [],\n startUserIds: [],\n totalContractAmount: { min: null, max: null },\n totalContractTargetAmount: { min: null, max: null },\n undertakeOrAnd: false,\n itemOrAnd: false,\n queryOrderPage,\n matterStageIds: [],\n expandMatterSearchParamVO: {\n inputSelect: {},\n selectBox: {},\n associateCustomer: {},\n associateMember: {},\n associateDepartment: {},\n associateMatter: {},\n timeSelect: {},\n },\n };\n if (options.scope === \"joined\" && options.joinMember) {\n body.memberOfRoles = [\n {\n userId: options.joinMember.userId,\n roleIds: options.joinMember.roleIds,\n },\n ];\n }\n return body;\n}\n\nasync function fetchMatterListSelectedFields(client: ApiClient): Promise<AlphaMatterCustomField[]> {\n const response = await client.request<AlphaMatterCustomFieldsResponse>(\n \"GET\",\n \"/matterserver/api/v1/customFields/dashboard/MATTER_LIST\",\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter list custom fields request failed.\");\n }\n const data = unwrapEnvelopeData<NonNullable<AlphaMatterCustomFieldsResponse[\"data\"]>>(response);\n return data?.selectedFields ?? [];\n}\n\nfunction getMatterListDisplayedFields(selectedFields: AlphaMatterCustomField[]): string[] {\n return [\n \"项目名称\",\n \"项目状态\",\n \"项目客户\",\n \"项目类型\",\n ...selectedFields.map((field) => formatCustomFieldLabel(field)).filter(Boolean),\n ];\n}\n\nfunction toMatterSummary(\n item: AlphaMatterItem,\n selectedFields: AlphaMatterCustomField[],\n): Record<string, unknown> {\n const summary: Record<string, unknown> = {\n \"项目ID\": item.pkId ?? \"\",\n \"项目名称\": item.name ?? \"\",\n \"项目状态\": item.statusName || formatMatterStatus(toNumber(item.status)),\n \"项目客户\": (item.clients ?? []).map((client) => client.clientName ?? \"\").filter(Boolean),\n \"项目类型\": formatMatterType(item),\n };\n for (const field of selectedFields) {\n const label = formatCustomFieldLabel(field);\n if (!label || label in summary) {\n continue;\n }\n summary[label] = formatMatterListFieldValue(item, field);\n }\n return summary;\n}\n\nfunction toMatterStatusSummary(item: AlphaMatterStatusItem): Record<string, unknown> {\n return {\n \"状态\": formatMatterStatus(item.matterStatus),\n \"状态码\": item.matterStatus ?? null,\n \"数量\": item.count ?? 0,\n };\n}\n\nfunction toMatterDetailSummary(item: AlphaMatterDetailItem): Record<string, unknown> {\n const status = typeof item.status === \"number\" ? item.status : undefined;\n const level = typeof item.level === \"number\" ? item.level : undefined;\n\n return {\n \"项目ID\": item.pkId ?? \"\",\n \"项目名称\": item.name ?? \"\",\n \"项目编号\": item.matterNo ?? \"\",\n \"项目状态\": item.statusName || formatMatterStatus(status),\n \"项目类型\": [item.matterTypeName, item.childMatterTypeName].filter(Boolean).join(\" / \"),\n \"项目等级\": formatMatterLevel(level),\n \"客户\": formatContacts(item.clients),\n \"其他当事人\": formatContacts([...(item.litigants ?? []), ...(item.relevants ?? [])]),\n \"所属\": formatMatterBelong(item),\n \"案源律师\": formatAttorneys(item.attorneys ?? item.originatingAttorneys),\n \"承办律师\": formatAttorneys(item.undertakeAttorneys),\n \"主办律师\": formatAttorneys(item.responsibleAttorneys),\n \"协办律师\": formatAttorneys(item.assistAttorneys),\n \"项目成员\": formatMembers(item.members),\n \"案由\": item.matterCaseName ?? \"\",\n \"代理审级\": item.caseProcessName ?? \"\",\n \"服务内容\": item.lawFieldName ?? \"\",\n \"开始日期\": item.beginDate ?? \"\",\n \"结束日期\": item.endDate ?? \"\",\n \"立项时间\": item.startMatterTime ?? item.openDate ?? \"\",\n \"结项时间\": item.endMatterTime ?? item.closeDate ?? \"\",\n \"归档日期\": item.filingDate ?? \"\",\n \"归档编号\": item.filingNo ?? \"\",\n \"项目详情\": item.remark ?? \"\",\n };\n}\n\nasync function fetchMatterLogs(\n client: ApiClient,\n matterId: string,\n limit: number,\n): Promise<AlphaMatterLogItem[]> {\n const response = await client.request<AlphaMatterLogResponse>(\n \"GET\",\n `/notice/v1/dynamics/matters/${encodeURIComponent(matterId)}`,\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter logs request failed.\");\n }\n const data = unwrapEnvelopeData<AlphaMatterLogResponse[\"data\"]>(response);\n return (data ?? []).slice(0, limit);\n}\n\nasync function fetchDocumentDetailsForAttachments(\n client: ApiClient,\n attachments: AlphaMatterTaskAttachment[],\n): Promise<Map<string, AlphaDocumentFileInfo>> {\n const directories = new Map<string, { repoId: string; path: string }>();\n for (const attachment of attachments) {\n const repoId = getAttachmentRepoId(attachment);\n const filePath = getAttachmentPath(attachment);\n if (!repoId || !filePath) {\n continue;\n }\n const directoryPath = getDirectoryPath(filePath);\n directories.set(`${repoId}|${directoryPath}`, { repoId, path: directoryPath });\n }\n\n const filesByDirectory = await Promise.all(\n [...directories.values()].map(async (directory) => {\n const response = await client.request<AlphaDocumentDirListResponse>(\n \"GET\",\n \"/document-engine/api/v1/dir/list\",\n {\n params: {\n repoId: directory.repoId,\n p: directory.path,\n },\n },\n );\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Document file detail request failed.\");\n }\n const data = unwrapEnvelopeData<AlphaDocumentDirListResponse[\"data\"]>(response);\n return { directory, files: data ?? [] };\n }),\n );\n\n const details = new Map<string, AlphaDocumentFileInfo>();\n for (const attachment of attachments) {\n const repoId = getAttachmentRepoId(attachment);\n const filePath = getAttachmentPath(attachment);\n if (!repoId || !filePath) {\n continue;\n }\n const directoryPath = getDirectoryPath(filePath);\n const directoryFiles = filesByDirectory.find(\n (item) => item.directory.repoId === repoId && item.directory.path === directoryPath,\n )?.files ?? [];\n const fileId = getAttachmentFileId(attachment);\n const fileName = getFileNameFromPath(filePath);\n const match = directoryFiles.find((file) => fileId ? file.id === fileId : file.name === fileName);\n if (match) {\n details.set(getAttachmentDocumentKey(attachment), match);\n }\n }\n return details;\n}\n\nfunction toMatterLogSummary(item: AlphaMatterLogItem): Record<string, unknown> {\n const content = parseLogContent(item.content);\n return {\n \"动态ID\": item.id ?? \"\",\n \"类型\": item.type ?? \"\",\n \"时间\": item.create_time ?? item.createTime ?? \"\",\n \"内容\": content,\n };\n}\n\nfunction flattenMatterTaskGroups(groups: AlphaMatterTaskGroup[]): AlphaMatterTaskItem[] {\n return groups.flatMap((group) =>\n (group.tasks ?? []).map((task) => ({\n ...task,\n parentName: task.parentName ?? group.name,\n taskGroupName: task.taskGroupName ?? group.name,\n })),\n );\n}\n\nfunction toMatterTaskGroupSummary(group: AlphaMatterTaskGroup): Record<string, unknown> {\n return {\n \"任务ID\": group.id ?? \"\",\n \"任务名称\": group.name ?? \"\",\n \"任务组\": \"\",\n \"状态\": group.state === 1 ? \"已完成\" : \"未完成\",\n \"负责人\": [],\n \"参与人\": [],\n \"到期时间\": \"\",\n \"开始时间\": \"\",\n \"结束时间\": \"\",\n \"计时总时长\": \"\",\n \"检查项\": {\n \"总数\": 0,\n \"已完成\": 0,\n },\n \"评论数\": 0,\n \"附件数\": 0,\n \"是否关注\": false,\n \"时间类型\": \"\",\n \"全天类型\": \"\",\n \"工作类型\": \"\",\n \"重复规则\": \"\",\n \"任务统计\": {\n \"未完成\": group.unfinishedTaskCount ?? 0,\n \"已完成\": group.finishedTaskCount ?? 0,\n \"已删除\": group.deletedTaskCount ?? 0,\n },\n };\n}\n\nfunction toMatterTaskSummary(item: AlphaMatterTaskItem): Record<string, unknown> {\n return {\n \"任务ID\": item.id ?? \"\",\n \"任务名称\": item.name ?? \"\",\n \"任务组\": item.parentName ?? item.taskGroupName ?? \"\",\n \"状态\": item.state === true || item.state === 1 ? \"已完成\" : \"未完成\",\n \"负责人\": formatTaskUsers(item.assignUser ? [item.assignUser] : []),\n \"参与人\": formatTaskUsers(item.attendeeUsers ?? item.attendees),\n \"到期时间\": formatDateTime(item.dueTime),\n \"开始时间\": formatDateTime(item.startTime),\n \"结束时间\": formatDateTime(item.endTime),\n \"计时总时长\": formatTotalTiming(item.timingSum),\n \"检查项\": {\n \"总数\": item.itemCount ?? 0,\n \"已完成\": item.doneItemCount ?? item.completedItemCount ?? 0,\n },\n \"评论数\": item.commentCount ?? 0,\n \"附件数\": item.attachmentCount ?? 0,\n \"是否关注\": item.attentioned === 1 || item.favorite === true || item.favorite === 1,\n \"时间类型\": formatMatterTaskTimeType(item.timeType),\n \"全天类型\": formatMatterTaskDayType(item.dayType),\n \"工作类型\": formatTaskWorkType(item.workType),\n \"重复规则\": formatTaskRepeatSetting(item.repeatSetting),\n };\n}\n\nfunction toMatterTaskDetailSummary(item: AlphaMatterTaskItem): Record<string, unknown> {\n return {\n \"任务ID\": item.id ?? \"\",\n \"任务名称\": item.name ?? \"\",\n \"项目ID\": item.matterId ?? \"\",\n \"项目名称\": item.matterName ?? item.matter?.name ?? \"\",\n \"任务组\": item.taskGroupName ?? item.parentName ?? \"\",\n \"状态\": item.state === true || item.state === 1 ? \"已完成\" : \"未完成\",\n \"是否有效\": item.valid === true || item.valid === 1,\n \"创建人\": formatTaskUser(item.createUser),\n \"负责人\": formatTaskUsers(item.assignUser ? [item.assignUser] : []),\n \"参与人\": formatTaskUsers(item.attendeeUsers ?? item.attendees),\n \"开始时间\": formatDateTime(item.startTime),\n \"到期时间\": formatDateTime(item.dueTime),\n \"结束时间\": formatDateTime(item.endTime),\n \"完成时间\": formatDateTime(item.finishTime),\n \"任务详情\": item.detail ?? \"\",\n \"检查项\": {\n \"总数\": item.itemCount ?? 0,\n \"已完成\": item.doneItemCount ?? item.completedItemCount ?? 0,\n },\n \"子任务\": {\n \"总数\": item.subtaskCount ?? 0,\n \"已完成\": item.completedSubtaskCount ?? 0,\n \"已删除\": item.deletedSubtaskCount ?? 0,\n },\n \"评论数\": item.commentCount ?? 0,\n \"动态数\": item.dynamicCount ?? 0,\n \"附件数\": item.attachmentCount ?? 0,\n \"保险箱文件数\": item.safeBoxFileCount ?? 0,\n \"计时总时长\": formatTotalTiming(item.timingSum),\n \"是否关注\": item.attentioned === 1 || item.favorite === true || item.favorite === 1,\n \"时间类型\": formatMatterTaskTimeType(item.timeType),\n \"全天类型\": formatMatterTaskDayType(item.dayType),\n \"工作类型\": formatTaskWorkType(item.workType),\n \"重复规则\": formatTaskRepeatSetting(item.repeatSetting),\n };\n}\n\nfunction toMatterTaskCheckItemSummary(item: AlphaMatterTaskCheckItem): Record<string, unknown> {\n return {\n \"检查项ID\": item.id ?? \"\",\n \"内容\": item.name ?? item.content ?? \"\",\n \"状态\": item.state === true || item.state === 1 || item.completed ? \"已完成\" : \"未完成\",\n \"创建时间\": formatDateTime(item.gmtCreate),\n \"更新时间\": formatDateTime(item.gmtModified),\n };\n}\n\nfunction toMatterTaskAttachmentSummary(\n item: AlphaMatterTaskAttachment,\n detail?: AlphaDocumentFileInfo,\n): Record<string, unknown> {\n const path = getAttachmentPath(item);\n return {\n \"文件名\": detail?.name ?? item.fileName ?? item.name ?? getFileNameFromPath(path),\n \"大小\": detail?.size ?? item.fileSize ?? item.size ?? \"\",\n };\n}\n\nfunction toMatterTaskTimingSummary(item: AlphaMatterTaskTimingItem): Record<string, unknown> {\n return {\n \"计时ID\": item.id ?? \"\",\n \"计时人\": item.userName ?? item.user?.userName ?? item.user?.name ?? \"\",\n \"开始时间\": formatDateTime(item.startTime),\n \"结束时间\": formatDateTime(item.endTime),\n \"计时时长\": formatTotalTiming(item.timingSum),\n \"工作类型\": item.workType?.name ?? \"\",\n };\n}\n\nfunction toMatterTaskCommentSummary(item: AlphaMatterTaskCommentItem): Record<string, unknown> {\n return {\n \"动态ID\": item.id ?? \"\",\n \"类型\": formatTaskCommentType(item.concreteType),\n \"操作人\": item.createUser?.userName ?? item.createUser?.name ?? \"\",\n \"内容\": item.content ?? item.comment ?? \"\",\n \"时间\": formatDateTime(item.createTime),\n \"相对时间\": item.createTimeFormat ?? \"\",\n };\n}\n\nfunction parseLogContent(content: string | undefined): unknown {\n if (!content) {\n return \"\";\n }\n try {\n const parsed = JSON.parse(content) as unknown;\n if (parsed && typeof parsed === \"object\" && \"content\" in parsed) {\n const inner = (parsed as { content?: unknown }).content;\n if (typeof inner === \"string\") {\n try {\n return JSON.parse(inner) as unknown;\n } catch {\n return inner;\n }\n }\n }\n return parsed;\n } catch {\n return content;\n }\n}\n\nfunction formatContacts(\n contacts:\n | Array<AlphaMatterContact | { contactPkid?: string; contactName?: string; type?: string; isDeleted?: boolean }>\n | undefined,\n): string[] {\n return (contacts ?? [])\n .map((contact) => {\n const name = contact.contactName ?? \"\";\n const deleted = contact.isDeleted ? \"(已删除)\" : \"\";\n const position = \"customerPositionName\" in contact && contact.customerPositionName\n ? `(${contact.customerPositionName})`\n : \"\";\n return `${name}${position}${deleted}`;\n })\n .filter(Boolean);\n}\n\nfunction formatAttorneys(attorneys: AlphaMatterAttorney[] | undefined): string[] {\n return (attorneys ?? []).map((attorney) => attorney.attorneyName ?? \"\").filter(Boolean);\n}\n\nfunction formatMembers(members: AlphaMatterDetailItem[\"members\"]): string[] {\n return (members ?? [])\n .map((member) => {\n const role = member.roleName ? `(${member.roleName})` : \"\";\n return `${member.userName ?? \"\"}${role}`;\n })\n .filter(Boolean);\n}\n\nfunction formatMatterBelong(item: AlphaMatterDetailItem): string {\n if (item.matterOwnerName) {\n return `${item.matterOwnerName}(个人项目)`;\n }\n return (item.groups ?? []).map((group) => group.name ?? \"\").filter(Boolean).join(\",\");\n}\n\nfunction formatMatterStatus(status: number | undefined): string {\n switch (status) {\n case 0:\n return \"预立项\";\n case 2:\n return \"进行中\";\n case 4:\n return \"已完结\";\n case 6:\n return \"已归档\";\n case 7:\n return \"已搁置\";\n default:\n return status === undefined ? \"\" : `未知状态(${status})`;\n }\n}\n\nfunction formatMatterType(item: AlphaMatterItem): string {\n return [item.matterTypeName, item.childrenMatterTypeName].filter(Boolean).join(\" / \");\n}\n\nfunction formatCustomFieldLabel(field: AlphaMatterCustomField): string {\n return field.customFieldValue || field.customFieldName || field.customFieldKey || \"\";\n}\n\nfunction formatMatterListFieldValue(\n item: AlphaMatterItem,\n field: AlphaMatterCustomField,\n): unknown {\n if (String(field.showType) === \"4\") {\n return formatFallbackValue(item.expandMatters?.[formatCustomFieldLabel(field)]);\n }\n\n switch (field.customFieldKey) {\n case \"matterDynamicContent\":\n return formatLatestDynamic(item);\n case \"matterNo\":\n return item.matterNo ?? \"\";\n case \"sealCount\":\n return item.sealCount ?? \"\";\n case \"startMatterTime\":\n return formatDateOnly(item.startMatterTime);\n case \"totalTiming\":\n return formatTotalTiming(item.sumTime);\n case \"task\":\n return `${(item.allTask ?? 0) - (item.unfinishTask ?? 0)} / ${item.allTask ?? 0}`;\n case \"matterLevel\":\n return formatMatterLevel(item.matterLevel);\n case \"endMatterTime\":\n return formatDateOnly(item.endMatterTime);\n case \"filingDate\":\n return formatDateOnly(item.filingDate);\n case \"serviceStartRangeTime\":\n return formatDateOnly(item.serviceStartRangeTime);\n case \"serviceEndRangeTime\":\n return formatDateOnly(item.serviceEndRangeTime);\n case \"matterOwner\":\n return formatNamedItems(item.matterOwners, \"ownerName\");\n case \"matterSourceLawyer\":\n return formatNamedItems(item.matterSourceLawyer, \"userName\");\n case \"matterReasonMessage\":\n return item.matterReasonMessage?.length ? item.matterReasonMessage.join(\",\") : \"\";\n case \"startUserName\":\n return item.startUserName ?? \"\";\n case \"courtTime\":\n return formatNamedItems(item.processEsEntities, \"courtTime\");\n case \"nowProcessName\":\n return [item.legalTypeName, item.caseProcessName].filter(Boolean).join(\" \");\n case \"matterMembers\":\n return formatNamedItems(item.members, \"userName\");\n case \"undertakeLaywer\":\n return formatNamedItems(item.undertakeLaywer, \"userName\");\n case \"otherParty\":\n return formatNamedItems(item.otherParty, \"userName\");\n case \"contractTargetAmount\":\n return formatFallbackValue(item.financeDTO?.contractTargetAmount);\n case \"contractTotal\":\n return formatFallbackValue(item.financeDTO?.contractTotal);\n case \"matterRemark\":\n return item.matterRemark ?? \"\";\n case \"billTotal\":\n return formatFallbackValue(item.financeDTO?.billTotal);\n case \"residueIncomeTotal\":\n return formatFallbackValue(item.financeDTO?.residueIncomeTotal);\n case \"spendTotal\":\n return formatFallbackValue(item.financeDTO?.spendTotal);\n case \"invoiceTotal\":\n return formatFallbackValue(item.financeDTO?.invoiceTotal);\n case \"incomeTotal\":\n return formatFallbackValue(item.financeDTO?.incomeTotal);\n case \"invoiceNo\":\n return formatFallbackValue(item.financeDTO?.invoiceNo);\n case \"hasRiskCharge\":\n return formatFallbackValue(item.financeDTO?.hasRiskCharge);\n case \"filingNo\":\n return item.filingNo ?? \"\";\n case \"process\":\n return formatNamedItems(item.processEsEntities, \"processName\");\n case \"processCourse\":\n return formatNamedItems(item.processEsEntities, \"court\");\n default:\n return formatFallbackValue(field.customFieldKey ? item[field.customFieldKey] : undefined);\n }\n}\n\nfunction formatLatestDynamic(item: AlphaMatterItem): string {\n const dynamic = item.matterDynamicContent;\n const dynamicText = [dynamic?.content, dynamic?.taskName, dynamic?.actionTime]\n .filter(Boolean)\n .join(\" \");\n return dynamicText || dynamic?.description || dynamic?.title || \"一个月内无动态\";\n}\n\nfunction formatNamedItems<T extends Record<string, unknown>>(\n items: T[] | undefined,\n key: keyof T,\n): string {\n return (items ?? [])\n .map((item) => item[key])\n .filter((value) => value !== undefined && value !== null && value !== \"\")\n .map(String)\n .join(\",\");\n}\n\nfunction formatFallbackValue(value: unknown): unknown {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (item && typeof item === \"object\") {\n const record = item as Record<string, unknown>;\n return record.name ?? record.userName ?? record.ownerName ?? record.clientName ?? record.contactName ?? \"\";\n }\n return item;\n })\n .filter((item) => item !== \"\")\n .join(\",\");\n }\n return value;\n}\n\nfunction formatDateOnly(value: string | number | undefined): string {\n const formatted = formatDateTime(value);\n return formatted ? formatted.slice(0, 10) : \"\";\n}\n\nfunction formatTotalTiming(milliseconds: number | undefined): string {\n if (!milliseconds || milliseconds <= 0) {\n return \"0小时\";\n }\n const hours = milliseconds / 3_600_000;\n return `${Number(hours.toFixed(2))}小时`;\n}\n\nfunction formatDateTime(value: string | number | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n\n const date = parseDateTime(value);\n if (!date) {\n return String(value);\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hour = String(date.getHours()).padStart(2, \"0\");\n const minute = String(date.getMinutes()).padStart(2, \"0\");\n const second = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hour}:${minute}:${second}`;\n}\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\nfunction formatMatterLevel(level: number | undefined): string {\n switch (level) {\n case 1:\n return \"无等级\";\n case 2:\n return \"低\";\n case 3:\n return \"中\";\n case 4:\n return \"高\";\n default:\n return \"\";\n }\n}\n\nfunction parseMatterTaskState(value: string | undefined): number {\n const raw = (value ?? \"未完成\").trim().toLowerCase();\n if (!raw || raw === \"all\" || raw === \"全部\" || raw === \"全部任务\") {\n return -1;\n }\n const aliases: Record<string, number> = {\n unfinished: 0,\n \"未完成\": 0,\n done: 1,\n finished: 1,\n \"已完成\": 1,\n all: -1,\n \"全部\": -1,\n \"全部任务\": -1,\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n // The backend task-table endpoint only supports all/unfinished/finished.\n // Reject other numeric values so agents do not accidentally query misleading data.\n if (Number.isNaN(parsed) || ![-1, 0, 1].includes(parsed)) {\n throw new Error(\"Invalid task state. Use all, 未完成, or 已完成.\");\n }\n return parsed;\n}\n\nfunction parseMatterSearchStatus(value: string | undefined): MatterSearchStatus {\n const raw = (value ?? \"进行中+预立项\").trim().toLowerCase();\n const aliases: Record<string, MatterSearchStatus> = {\n \"预立项\": { label: \"预立项\", values: [0] },\n pending: { label: \"预立项\", values: [0] },\n \"进行中\": { label: \"进行中\", values: [2] },\n open: { label: \"进行中\", values: [2] },\n active: { label: \"进行中\", values: [2] },\n \"进行中+预立项\": { label: \"进行中+预立项\", values: [2, 0] },\n \"预立项+进行中\": { label: \"进行中+预立项\", values: [2, 0] },\n current: { label: \"进行中+预立项\", values: [2, 0] },\n default: { label: \"进行中+预立项\", values: [2, 0] },\n \"已完结\": { label: \"已完结\", values: [4] },\n closed: { label: \"已完结\", values: [4] },\n \"已搁置\": { label: \"已搁置\", values: [7] },\n suspended: { label: \"已搁置\", values: [7] },\n paused: { label: \"已搁置\", values: [7] },\n \"已归档\": { label: \"已归档\", values: [6] },\n filed: { label: \"已归档\", values: [6] },\n archived: { label: \"已归档\", values: [6] },\n \"全部\": { label: \"全部\", values: [0, 2, 4, 6, 7] },\n all: { label: \"全部\", values: [0, 2, 4, 6, 7] },\n };\n const match = aliases[raw];\n if (match) {\n return match;\n }\n throw new Error(\n \"Invalid matter status. Use 预立项, 进行中, 进行中+预立项, 已完结, 已搁置, 已归档, or 全部.\",\n );\n}\n\nfunction parseMatterSearchScope(value: string | undefined): MatterSearchScope {\n const raw = (value ?? \"所有项目\").trim().toLowerCase();\n const aliases: Record<string, MatterSearchScope> = {\n \"所有项目\": \"all\",\n \"全部项目\": \"all\",\n all: \"all\",\n \"我关注的\": \"followed\",\n followed: \"followed\",\n favorite: \"followed\",\n starred: \"followed\",\n \"已加入的\": \"joined\",\n joined: \"joined\",\n \"我加入的\": \"joined\",\n };\n const match = aliases[raw];\n if (match) {\n return match;\n }\n throw new Error(\"Invalid matter scope. Use 所有项目, 我关注的, or 已加入的.\");\n}\n\nfunction formatMatterSearchScopeLabel(scope: MatterSearchScope): string {\n switch (scope) {\n case \"followed\":\n return \"我关注的\";\n case \"joined\":\n return \"已加入的\";\n case \"all\":\n default:\n return \"所有项目\";\n }\n}\n\nasync function buildJoinedMatterMemberFilter(\n client: ApiClient,\n sessionStore: SessionStore,\n): Promise<MatterSearchJoinMember> {\n const session = await sessionStore.getSession();\n if (!session?.userId) {\n throw new Error(\"Missing current user id. Run alpha-classic-cli doctor or login again.\");\n }\n const response = await client.request<AlphaMatterRoleResponse>(\n \"GET\",\n \"/matterserver/api/v2/matter/roles\",\n {\n params: {\n subjectid: 0,\n subjecttype: \"MAT\",\n },\n },\n );\n const data = unwrapEnvelopeData<AlphaMatterRoleResponse[\"data\"]>(response);\n const roleIds = (data ?? [])\n .map((role) => role.id)\n .filter((id): id is string | number => id !== undefined && id !== null)\n .map(String);\n if (!roleIds.length) {\n throw new Error(\"Cannot resolve matter role ids for joined matter search.\");\n }\n return {\n userId: session.userId,\n roleIds,\n };\n}\n\nfunction unwrapEnvelopeData<T>(\n response:\n | T\n | {\n data?: T;\n isSuccess?: boolean;\n resultCode?: string | number;\n resultMsg?: string;\n resultMess?: string;\n code?: string | number;\n msg?: string;\n },\n): T | undefined {\n if (\n response &&\n typeof response === \"object\" &&\n \"data\" in response &&\n (\n \"isSuccess\" in response ||\n \"resultCode\" in response ||\n \"resultMsg\" in response ||\n \"resultMess\" in response ||\n \"code\" in response ||\n \"msg\" in response\n )\n ) {\n return (response as { data?: T }).data;\n }\n return response as T;\n}\n\nfunction parseMatterTaskType(value: string | undefined): number {\n const raw = (value ?? \"task\").trim().toLowerCase();\n const aliases: Record<string, number> = {\n task: 0,\n tasks: 0,\n 任务: 0,\n group: 1,\n groups: 1,\n 任务组: 1,\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n // Keep the CLI option stable even though the current frontend endpoint returns\n // task groups with nested tasks in one response.\n if (Number.isNaN(parsed) || ![0, 1].includes(parsed)) {\n throw new Error(\"Invalid task type. Use task or group.\");\n }\n return parsed;\n}\n\nfunction parseMatterAttentionType(value: string | undefined): number {\n const raw = (value ?? \"all\").trim().toLowerCase();\n const aliases: Record<string, number> = {\n all: 0,\n 全部: 0,\n \"我关注的\": 1,\n attention: 1,\n followed: 1,\n follow: 1,\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(\"Invalid attention type. Use all, 我关注的, or a numeric value.\");\n }\n return parsed;\n}\n\nfunction formatMatterTaskStateLabel(stateType: number): string {\n switch (stateType) {\n case -1:\n return \"全部任务\";\n case 0:\n return \"未完成\";\n case 1:\n return \"已完成\";\n default:\n return `状态(${stateType})`;\n }\n}\n\nfunction toMatterTaskStatusType(stateType: number): number {\n switch (stateType) {\n case -1:\n return 4;\n case 1:\n return 2;\n case 0:\n default:\n return 1;\n }\n}\n\nfunction formatMatterTaskTypeLabel(type: number): string {\n switch (type) {\n case 0:\n return \"任务\";\n case 1:\n return \"任务组\";\n default:\n return `类型(${type})`;\n }\n}\n\nfunction formatMatterAttentionLabel(attentionType: number): string {\n switch (attentionType) {\n case 0:\n return \"全部\";\n case 1:\n return \"我关注的\";\n default:\n return `关注类型(${attentionType})`;\n }\n}\n\nfunction formatTaskUsers(\n users:\n | Array<{\n userName?: string;\n name?: string;\n id?: string;\n userId?: string;\n }>\n | undefined,\n): string[] {\n return (users ?? [])\n .map((user) => user.userName ?? user.name ?? \"\")\n .filter(Boolean);\n}\n\nfunction formatTaskUser(\n user:\n | {\n userName?: string;\n name?: string;\n id?: string;\n userId?: string;\n }\n | undefined,\n): string {\n return user?.userName ?? user?.name ?? \"\";\n}\n\nfunction formatTaskCommentType(type: number | undefined): string {\n switch (type) {\n case 100:\n return \"评论\";\n case 400:\n return \"动态\";\n default:\n return type === undefined ? \"\" : `类型(${type})`;\n }\n}\n\nfunction getFileNameFromPath(path: string): string {\n if (!path) {\n return \"\";\n }\n return path.split(\"/\").filter(Boolean).pop() ?? path;\n}\n\nfunction getAttachmentDocumentKey(item: AlphaMatterTaskAttachment): string {\n const repoId = getAttachmentRepoId(item);\n const fileId = getAttachmentFileId(item);\n const path = getAttachmentPath(item);\n return `${repoId}|${fileId || path}`;\n}\n\nfunction getAttachmentRepoId(item: AlphaMatterTaskAttachment): string {\n return item.pathInfoVo?.repoId ?? \"\";\n}\n\nfunction getAttachmentFileId(item: AlphaMatterTaskAttachment): string {\n return item.fileId ?? item.pathInfoVo?.fileId ?? item.id ?? \"\";\n}\n\nfunction getAttachmentPath(item: AlphaMatterTaskAttachment): string {\n return item.filePath ?? item.path ?? item.pathInfoVo?.filePath ?? \"\";\n}\n\nfunction getDirectoryPath(path: string): string {\n const normalized = path.startsWith(\"/\") ? path : `/${path}`;\n const lastSlashIndex = normalized.lastIndexOf(\"/\");\n if (lastSlashIndex <= 0) {\n return \"/\";\n }\n return normalized.slice(0, lastSlashIndex);\n}\n\nfunction formatTaskWorkType(\n workType: {\n id?: string;\n name?: string;\n } | undefined,\n): Record<string, unknown> | string {\n if (!workType) {\n return \"\";\n }\n return {\n \"工作类型ID\": workType.id ?? \"\",\n \"工作类型名称\": workType.name ?? \"\",\n };\n}\n\nfunction formatTaskRepeatSetting(\n repeatSetting:\n | {\n id?: string;\n repeatRule?: string;\n customRepeatRule?: string;\n dayIndexList?: number[];\n endType?: string;\n endByDate?: string | number;\n endByTimes?: number;\n }\n | undefined,\n): Record<string, unknown> | string {\n if (!repeatSetting) {\n return \"\";\n }\n return {\n \"规则ID\": repeatSetting.id ?? \"\",\n \"重复规则\": repeatSetting.repeatRule ?? \"\",\n \"自定义规则\": repeatSetting.customRepeatRule ?? \"\",\n \"日期索引\": repeatSetting.dayIndexList ?? [],\n \"结束类型\": repeatSetting.endType ?? \"\",\n \"结束日期\": formatDateTime(repeatSetting.endByDate),\n \"结束次数\": repeatSetting.endByTimes ?? \"\",\n };\n}\n\nfunction formatMatterTaskTimeType(value: number | undefined): string {\n switch (value) {\n case 1:\n return \"到期时间\";\n case 2:\n return \"开始结束时间\";\n default:\n return value === undefined || value === null ? \"\" : String(value);\n }\n}\n\nfunction formatMatterTaskDayType(value: number | undefined): string {\n switch (value) {\n case 1:\n return \"全天任务\";\n case 2:\n return \"非全天任务\";\n default:\n return value === undefined || value === null ? \"\" : String(value);\n }\n}\n\nfunction createEmptyTimeRange(siftMaxTime: string): {\n startTime: string;\n endTime: string;\n siftMaxTime: string;\n} {\n return {\n startTime: \"\",\n endTime: \"\",\n siftMaxTime,\n };\n}\n\nfunction clampLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 1) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n\nfunction clampPage(page: number): number {\n if (!Number.isFinite(page) || page < 1) {\n return 1;\n }\n return Math.floor(page);\n}\n\nfunction clampLogLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 0) {\n return 5;\n }\n return Math.min(Math.floor(limit), 20);\n}\n\nfunction clampCommentLimit(limit: number | undefined): number {\n if (limit === undefined) {\n return 10;\n }\n if (!Number.isFinite(limit) || limit < 0) {\n return 10;\n }\n return Math.min(Math.floor(limit), 50);\n}\n\nfunction formatLocalDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\nfunction parseDateTime(value: string | number): Date | null {\n if (typeof value === \"number\") {\n return dateFromTimestamp(value);\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n if (/^\\d+$/.test(trimmed)) {\n return dateFromTimestamp(Number.parseInt(trimmed, 10));\n }\n\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? null : parsed;\n}\n\nfunction dateFromTimestamp(timestamp: number): Date | null {\n if (!Number.isFinite(timestamp)) {\n return null;\n }\n const milliseconds = Math.abs(timestamp) < 10_000_000_000 ? timestamp * 1000 : timestamp;\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n","import { getDefaultEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\n\ninterface VersionInfo {\n name: string;\n version: string;\n}\n\nexport function runVersion(info: VersionInfo): void {\n const environment = getDefaultEnvironmentPreset();\n // Keep this command JSON-shaped for agents. Commander still provides the\n // plain-text `--version` flag for humans and shell scripts that expect it.\n printSuccess({\n \"名称\": info.name,\n \"版本\": info.version,\n \"所属系统\": \"Alpha 律所管理系统\",\n \"环境\": environment.name,\n \"baseUrl\": environment.baseUrl,\n \"apiBaseUrl\": environment.apiBaseUrl,\n \"环境是否构建时锁定\": true,\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface LocalConfig {\n environment?: string;\n baseUrl?: string;\n apiBaseUrl?: string;\n defaultOfficeId?: string;\n timeoutMs?: number;\n}\n\nexport interface SessionRecord {\n token: string;\n refreshToken?: string;\n tokenExpireTime?: number;\n refreshTokenExpireTime?: number;\n userId?: string;\n userName?: string;\n officeId?: string;\n officeName?: string;\n name?: string;\n baseUrl?: string;\n apiBaseUrl: string;\n deviceType?: \"ai\" | string;\n updatedAt: string;\n}\n\nfunction defaultConfigDir(): string {\n return process.env.ALPHA_CLI_CONFIG_DIR ?? path.join(os.homedir(), \".config\", \"alpha-classic-cli\");\n}\n\nexport class SessionStore {\n readonly configDir: string;\n readonly configPath: string;\n readonly sessionPath: string;\n\n constructor(options?: { configDir?: string }) {\n this.configDir = options?.configDir ?? defaultConfigDir();\n this.configPath = path.join(this.configDir, \"config.json\");\n this.sessionPath = path.join(this.configDir, \"session.json\");\n }\n\n async getConfig(): Promise<LocalConfig> {\n return readJsonFile<LocalConfig>(this.configPath, {});\n }\n\n async saveConfig(patch: LocalConfig): Promise<LocalConfig> {\n const current = await this.getConfig();\n const next = { ...current, ...patch };\n await writePrivateJsonFile(this.configPath, next);\n return next;\n }\n\n async getSession(): Promise<SessionRecord | null> {\n return readJsonFile<SessionRecord | null>(this.sessionPath, null);\n }\n\n async saveSession(session: SessionRecord): Promise<void> {\n await writePrivateJsonFile(this.sessionPath, session);\n }\n\n async clearSession(): Promise<void> {\n await fs.rm(this.sessionPath, { force: true });\n }\n\n async clearAuthState(): Promise<LocalConfig> {\n await this.clearSession();\n const current = await this.getConfig();\n const {\n defaultOfficeId: _defaultOfficeId,\n ...next\n } = current;\n // Logout removes user-specific cache only. Build-time environment fields stay\n // untouched because the binary, not the runtime config, owns environment choice.\n await writePrivateJsonFile(this.configPath, next);\n return next;\n }\n}\n\nasync function readJsonFile<T>(filePath: string, fallback: T): Promise<T> {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(content) as T;\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code === \"ENOENT\") {\n return fallback;\n }\n throw error;\n }\n}\n\nasync function writePrivateJsonFile(filePath: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(value, null, 2), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n"],"mappings":"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","names":["createRequire","path","numericCode","DEVICE_TYPE_AI","require","parseJson","fs","os","path","os","path","fs","getCurrentUserData","clampLimit","unwrapEnvelopeData","clampPage","clampCommentLimit","formatMatterLevel","formatDateTime","path","parseDateTime","dateFromTimestamp","fs","os","path","require","createRequire"]}
|