@alphalawyer/alpha-classic-cli 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/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 { getCurrentEnvironmentPreset } from \"./config/environments.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 environment = await getCurrentEnvironmentPreset(sessionStore);\n const result = await installAgentGuides({\n agent,\n environmentName: environment.name,\n });\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 environment = await getCurrentEnvironmentPreset(sessionStore);\n const result = await uninstallAgentGuides({\n agent,\n environmentName: environment.name,\n });\n printSuccess(result);\n });\n\n program\n .command(\"capabilities\")\n .description(\"Print machine-readable CLI capabilities for agents\")\n .action(async () => {\n await runCapabilities(packageJson.version ?? \"0.0.0\", sessionStore);\n });\n\n program\n .command(\"version\")\n .description(\"Print machine-readable CLI version\")\n .action(async () => {\n await runVersion(\n {\n name: packageJson.name ?? \"alpha-classic-cli\",\n version: packageJson.version ?? \"0.0.0\",\n },\n sessionStore,\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 or switch the current environment\")\n .argument(\"[action]\", \"Action: list, current, use\")\n .argument(\"[name]\", \"Environment name for env use: local, dev, test, prod\")\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 {\n getCurrentEnvironmentPreset,\n type RuntimeEnvironmentPreset,\n} 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 const normalizedAuth = normalizeDeviceAuthorizationUrls(auth, context.baseUrl);\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: normalizedAuth,\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 = await getCurrentEnvironmentPreset(sessionStore);\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: RuntimeEnvironmentPreset;\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n apiClient: ApiClient;\n}> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const baseUrl = normalizeBaseUrl(environment.baseUrl);\n const apiBaseUrl = normalizeBaseUrl(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: RuntimeEnvironmentPreset;\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 normalizeDeviceAuthorizationUrls(\n auth: CliDeviceAuthCreateVO,\n baseUrl: string,\n): CliDeviceAuthCreateVO {\n return {\n ...auth,\n ...(auth.verificationUri\n ? { verificationUri: replaceUrlOrigin(auth.verificationUri, baseUrl) }\n : {}),\n verificationUriComplete: replaceUrlOrigin(auth.verificationUriComplete, baseUrl),\n };\n}\n\nfunction replaceUrlOrigin(value: string, baseUrl: string): string {\n if (!value.trim()) {\n return value;\n }\n try {\n const currentUrl = new URL(value);\n const targetUrl = new URL(baseUrl);\n // 授权服务有时返回旧环境域名,这里只替换 origin,保留服务端生成的路径和查询参数。\n currentUrl.protocol = targetUrl.protocol;\n currentUrl.host = targetUrl.host;\n return currentUrl.toString();\n } catch {\n return new URL(value.startsWith(\"/\") ? value : `/${value}`, baseUrl).toString();\n }\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 interface EnvironmentConfigReader {\n getConfig(): Promise<{\n environment?: string;\n baseUrl?: string;\n apiBaseUrl?: string;\n }>;\n}\n\nexport type EnvironmentSource = \"config\" | \"default\";\n\nexport interface RuntimeEnvironmentPreset extends EnvironmentPreset {\n source: EnvironmentSource;\n}\n\nexport const DEFAULT_ENVIRONMENT_NAME: EnvironmentName = \"prod\";\n\n// 环境预设内置在 CLI 中,运行时只允许在这些白名单环境中切换,避免用户输入任意域名。\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\nexport async function getCurrentEnvironmentPreset(\n configReader: EnvironmentConfigReader,\n): Promise<RuntimeEnvironmentPreset> {\n const config = await configReader.getConfig();\n const configuredEnvironment = getEnvironmentPreset(config.environment);\n const fallbackEnvironment = getDefaultEnvironmentPreset();\n const environment = configuredEnvironment ?? fallbackEnvironment;\n return {\n ...environment,\n source: configuredEnvironment ? \"config\" : \"default\",\n };\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 会在构建时替换该常量;没有显式构建环境时默认使用生产环境。\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 { getCurrentEnvironmentPreset } 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 = await getCurrentEnvironmentPreset(sessionStore);\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 { getCurrentEnvironmentPreset } 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 = await getCurrentEnvironmentPreset(sessionStore);\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 = await getCurrentEnvironmentPreset(sessionStore);\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 = await getCurrentEnvironmentPreset(sessionStore);\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 { getCurrentEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\nexport async function runCapabilities(version: string, sessionStore: SessionStore): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n // 该命令是 agent 的通用契约,保持稳定保守;agent 应优先读取这里声明的命令。\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 \"环境来源\": environment.source,\n \"切换方式\": \"alpha-classic-cli env use <local|dev|test|prod>\",\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 \"需要切换环境时使用 alpha-classic-cli env use,并在切换后重新登录。\",\n ],\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport {\n DEFAULT_ENVIRONMENT_NAME,\n type EnvironmentName,\n} 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\ninterface AgentGuideOptions {\n agent?: AgentInstallTarget;\n homeDir?: string;\n environmentName?: EnvironmentName;\n}\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(\n homeDir = os.homedir(),\n environmentName: EnvironmentName = DEFAULT_ENVIRONMENT_NAME,\n): string {\n return path.join(\n homeDir,\n `.openclaw-${environmentName}alphaclaw`,\n \"workspace\",\n \"skills\",\n SKILL_NAME,\n );\n}\n\nexport async function installAgentGuides(options?: AgentGuideOptions): 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?: AgentGuideOptions): 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, options?.environmentName), { recursive: true, force: true });\n result.alphaClawSkillPath = resolveAlphaClawSkillPath(options?.homeDir, options?.environmentName);\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 environmentName?: EnvironmentName;\n}): Promise<InstallState> {\n const skillPath = resolveAlphaClawSkillPath(options?.homeDir, options?.environmentName);\n // Alpha-claw 按环境隔离 workspace,只替换 CLI 托管的 skill,避免影响用户自建 skill。\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 environmentName?: EnvironmentName;\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, options?.environmentName);\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 { getCurrentEnvironmentPreset } 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 = await getCurrentEnvironmentPreset(sessionStore);\n const installState = await inspectInstallState({\n environmentName: environment.name,\n });\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 同时承担轻量级会话修复:旧版本保存过 userName/tenantId,\n // 当前用户接口成功后用 Alpha 返回的权威身份字段刷新本地 session。\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: false,\n source: environment.source,\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 // 保留 token 和有效期上下文,只用 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 getCurrentEnvironmentPreset,\n getEnvironmentPresetOrThrow,\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 const currentEnvironment = await getCurrentEnvironmentPreset(sessionStore);\n printSuccess(listEnvironmentPresets(), {\n count: listEnvironmentPresets().length,\n current: currentEnvironment.name,\n });\n return;\n }\n\n if (normalizedAction === \"current\") {\n const currentEnvironment = await getCurrentEnvironmentPreset(sessionStore);\n printSuccess({\n environment: currentEnvironment.name,\n label: currentEnvironment.label,\n baseUrl: currentEnvironment.baseUrl,\n apiBaseUrl: currentEnvironment.apiBaseUrl,\n locked: false,\n source: currentEnvironment.source,\n configPath: sessionStore.configPath,\n });\n return;\n }\n\n if (normalizedAction === \"use\") {\n if (!name?.trim()) {\n throw new Error(\"Missing environment name. Use: alpha-classic-cli env use <local|dev|test|prod>\");\n }\n const nextEnvironment = getEnvironmentPresetOrThrow(name);\n await sessionStore.saveConfig({\n environment: nextEnvironment.name,\n baseUrl: nextEnvironment.baseUrl,\n apiBaseUrl: nextEnvironment.apiBaseUrl,\n });\n await sessionStore.clearAuthState();\n printSuccess({\n environment: nextEnvironment.name,\n label: nextEnvironment.label,\n baseUrl: nextEnvironment.baseUrl,\n apiBaseUrl: nextEnvironment.apiBaseUrl,\n locked: false,\n source: \"config\",\n session: \"cleared\",\n hint: \"环境已切换,请重新执行 alpha-classic-cli login。\",\n configPath: sessionStore.configPath,\n });\n return;\n }\n throw new Error(`Unknown env action: ${normalizedAction}`);\n}\n","import { getCurrentEnvironmentPreset } 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 = await getCurrentEnvironmentPreset(sessionStore);\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 = await getCurrentEnvironmentPreset(sessionStore);\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 = await getCurrentEnvironmentPreset(sessionStore);\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 = await getCurrentEnvironmentPreset(sessionStore);\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 { getCurrentEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\ninterface VersionInfo {\n name: string;\n version: string;\n}\n\nexport async function runVersion(info: VersionInfo, sessionStore: SessionStore): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n // 该命令保持 JSON 结构,便于 agent 读取;Commander 仍保留纯文本 --version。\n printSuccess({\n \"名称\": info.name,\n \"版本\": info.version,\n \"所属系统\": \"Alpha 律所管理系统\",\n \"环境\": environment.name,\n \"baseUrl\": environment.baseUrl,\n \"apiBaseUrl\": environment.apiBaseUrl,\n \"环境是否可运行时切换\": true,\n \"环境来源\": environment.source,\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 // 退出登录只清理用户身份缓存,环境配置保留给后续命令继续使用。\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"]}
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/index.ts","../src/commands/capabilities.ts","../src/install/install.ts","../src/install/templates.ts","../src/commands/doctor.ts","../src/commands/env.ts","../src/util/alpha-links.ts","../src/commands/finance/index.ts","../src/commands/matter/index.ts","../src/commands/task/index.ts","../src/commands/timing/index.ts","../src/commands/user/index.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/index.js\";\nimport { runCapabilities } from \"./commands/capabilities.js\";\nimport { runDoctor } from \"./commands/doctor.js\";\nimport { runEnvCommand } from \"./commands/env.js\";\nimport {\n runFinanceDepartments,\n runFinanceDetail,\n runFinanceList,\n runFinanceOverview,\n runFinanceSummary,\n} from \"./commands/finance/index.js\";\nimport type { FinanceResourceType } from \"./commands/finance/types.js\";\nimport { runMatterDetail, runMatterSearch, runMatterTypes } from \"./commands/matter/index.js\";\nimport {\n runMatterTaskAttendeeSet,\n runMatterTaskAssignees,\n runMatterTaskCheckItemAdd,\n runMatterTaskCheckItemDelete,\n runMatterTaskCommentAdd,\n runMatterTaskCommentDelete,\n runMatterTaskCheckItemState,\n runMatterTaskComplete,\n runMatterTaskCreate,\n runMatterTaskDetail,\n runMatterTaskList,\n runMatterTaskMine,\n runMatterTaskPending,\n runMatterTaskSubtasks,\n runMatterTaskUpdateDetail,\n runMatterTaskUncomplete,\n runMatterTaskWorktypes,\n} from \"./commands/task/index.js\";\nimport {\n runTimingCreate,\n runTimingList,\n runTimingMatters,\n runTimingTasks,\n runTimingWorktypes,\n} from \"./commands/timing/index.js\";\nimport {\n runUserAccountTypes,\n runUserDepartments,\n runUserList,\n runUserManagers,\n runUserRanks,\n runUserStatuses,\n} from \"./commands/user/index.js\";\nimport { runVersion } from \"./commands/version.js\";\nimport { getCurrentEnvironmentPreset } from \"./config/environments.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\nfunction collectString(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n\nfunction registerFinanceResourceCommands(\n finance: Command,\n resource: FinanceResourceType,\n description: string,\n sessionStore: SessionStore,\n): void {\n const command = finance.command(resource).description(description);\n command\n .command(\"list\")\n .description(`List finance ${resource} records`)\n .option(\"--matter-id <matterId>\", \"Matter/project id; when set, uses project finance page API\")\n .option(\"--keyword <keyword>\", \"Keyword for global finance module list\")\n .option(\"--status <status>\", \"Status filter for global finance module list\")\n .option(\"--type <type>\", \"Type filter; reimburse defaults to all\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: {\n matterId?: string;\n keyword?: string;\n status?: string;\n type?: string;\n page?: number;\n limit?: number;\n }) => {\n await runFinanceList(resource, options, sessionStore);\n });\n command\n .command(\"detail\")\n .description(`Show finance ${resource} detail`)\n .requiredOption(\"--id <id>\", \"Record id\")\n .option(\"--matter-id <matterId>\", \"Matter/project id for context\")\n .action(async (options: { id: string; matterId?: string }) => {\n await runFinanceDetail(resource, options, sessionStore);\n });\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 environment = await getCurrentEnvironmentPreset(sessionStore);\n const result = await installAgentGuides({\n agent,\n environmentName: environment.name,\n });\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 environment = await getCurrentEnvironmentPreset(sessionStore);\n const result = await uninstallAgentGuides({\n agent,\n environmentName: environment.name,\n });\n printSuccess(result);\n });\n\n program\n .command(\"capabilities\")\n .description(\"Print machine-readable CLI capabilities for agents\")\n .action(async () => {\n await runCapabilities(packageJson.version ?? \"0.0.0\", sessionStore);\n });\n\n program\n .command(\"version\")\n .description(\"Print machine-readable CLI version\")\n .action(async () => {\n await runVersion(\n {\n name: packageJson.name ?? \"alpha-classic-cli\",\n version: packageJson.version ?? \"0.0.0\",\n },\n sessionStore,\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 or switch the current environment\")\n .argument(\"[action]\", \"Action: list, current, use\")\n .argument(\"[name]\", \"Environment name for env use: local, dev, test, prod\")\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(\"--matter-type-ids <ids>\", \"Comma-separated matter type ids from matter types\")\n .option(\"--service-start-from <date>\", \"Service start date range start, YYYY-MM-DD\")\n .option(\"--service-start-to <date>\", \"Service start date range end, YYYY-MM-DD\")\n .option(\"--service-end-from <date>\", \"Service end date range start, YYYY-MM-DD\")\n .option(\"--service-end-to <date>\", \"Service end date range end, YYYY-MM-DD\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .action(async (options: {\n keyword?: string;\n status?: string;\n scope?: string;\n matterTypeIds?: string;\n serviceStartFrom?: string;\n serviceStartTo?: string;\n serviceEndFrom?: string;\n serviceEndTo?: string;\n limit?: number;\n page?: number;\n }) => {\n await runMatterSearch(options, sessionStore);\n });\n matter\n .command(\"types\")\n .description(\"List matter types for matter search filters\")\n .option(\"--keyword <keyword>\", \"Matter type keyword\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: { keyword?: string; limit?: number }) => {\n await runMatterTypes(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\n const finance = program.command(\"finance\").description(\"Finance commands\");\n finance\n .command(\"overview\")\n .description(\"Show law firm finance overview\")\n .option(\"--department-id <departmentId>\", \"Department/team id; defaults to all\")\n .option(\"--date <month>\", \"Trend month, YYYY-MM or YYYY-MM-DD; defaults to current month\")\n .action(async (options: { departmentId?: string; date?: string }) => {\n await runFinanceOverview(options, sessionStore);\n });\n finance\n .command(\"departments\")\n .description(\"List departments for finance overview filters\")\n .option(\"--keyword <keyword>\", \"Department keyword\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: { keyword?: string; limit?: number }) => {\n await runFinanceDepartments(options, sessionStore);\n });\n finance\n .command(\"summary\")\n .description(\"Show matter finance summary\")\n .requiredOption(\"--matter-id <matterId>\", \"Matter/project id\")\n .action(async (options: { matterId: string }) => {\n await runFinanceSummary(options, sessionStore);\n });\n registerFinanceResourceCommands(finance, \"contract\", \"Finance contract commands\", sessionStore);\n registerFinanceResourceCommands(finance, \"invoice\", \"Finance invoice commands\", sessionStore);\n registerFinanceResourceCommands(finance, \"income\", \"Finance income commands\", sessionStore);\n registerFinanceResourceCommands(finance, \"expense\", \"Finance expense commands\", sessionStore);\n registerFinanceResourceCommands(finance, \"bill\", \"Finance bill commands\", sessionStore);\n registerFinanceResourceCommands(finance, \"reimburse\", \"Finance reimburse commands\", sessionStore);\n\n const task = program.command(\"task\").description(\"Task commands\");\n task\n .command(\"list\")\n .description(\"List tasks by business source, currently supports matter/project\")\n .requiredOption(\"--matter-id <matterId>\", \"Matter/project 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 matterId: string;\n state?: string;\n page?: number;\n limit?: number;\n type?: string;\n attention?: string;\n }) => {\n await runMatterTaskList(options, sessionStore);\n },\n );\n task\n .command(\"mine\")\n .description(\"Search my task table\")\n .option(\"--keyword <keyword>\", \"Task search keyword\")\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(\"--matter-ids <matterIds>\", \"Comma-separated matter/project ids\")\n .option(\"--user-ids <userIds>\", \"Comma-separated assignee user ids; defaults to current user\")\n .option(\"--range-from <date>\", \"Time range start, YYYY-MM-DD or date-time\")\n .option(\"--range-to <date>\", \"Time range end, YYYY-MM-DD or date-time\")\n .option(\"--start-time <date>\", \"Alias for --range-from\")\n .option(\"--end-time <date>\", \"Alias for --range-to\")\n .option(\"--no-include-special-groups\", \"Skip favorite/new task group requests\")\n .action(\n async (options: {\n keyword?: string;\n state?: string;\n page?: number;\n limit?: number;\n matterIds?: string;\n userIds?: string;\n rangeFrom?: string;\n rangeTo?: string;\n startTime?: string;\n endTime?: string;\n includeSpecialGroups?: boolean;\n }) => {\n await runMatterTaskMine(options, sessionStore);\n },\n );\n task\n .command(\"pending\")\n .description(\"Search my pending tasks with backend time-range sorting for CLI\")\n .option(\"--range <range>\", \"Time preset: this-week, today, this-month; default this-week\")\n .option(\"--start-time <date>\", \"Time range start, YYYY-MM-DD or date-time\")\n .option(\"--end-time <date>\", \"Time range end, YYYY-MM-DD or date-time\")\n .option(\"--range-from <date>\", \"Alias for --start-time\")\n .option(\"--range-to <date>\", \"Alias for --end-time\")\n .option(\"--state <state>\", \"Task state: all, 未完成, 已完成, 已删除; default 未完成\")\n .option(\"--time-field <field>\", \"Time filter field: dueTime, startTime, endTime; default dueTime\")\n .option(\"--order-by <field>\", \"Sort field: dueTime, startTime, endTime; defaults to --time-field\")\n .option(\"--order-direction <direction>\", \"Sort direction: asc or desc; asc means 从近到远\", \"asc\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: {\n range?: string;\n startTime?: string;\n endTime?: string;\n rangeFrom?: string;\n rangeTo?: string;\n state?: string;\n timeField?: string;\n orderBy?: string;\n orderDirection?: string;\n page?: number;\n limit?: number;\n }) => {\n await runMatterTaskPending(options, sessionStore);\n },\n );\n task\n .command(\"create\")\n .description(\"Create a task\")\n .requiredOption(\"--name <name>\", \"Task name\")\n .option(\"--matter-id <matterId>\", \"Matter/project id; omit for a personal task\")\n .option(\"--task-group-id <taskGroupId>\", \"Task group id\")\n .option(\"--task-group-name <taskGroupName>\", \"Task group name\")\n .option(\"--user-ids <userIds>\", \"Comma-separated assignee user ids; defaults to current user\")\n .option(\"--due-time <date>\", \"Due time, YYYY-MM-DD or date-time\")\n .option(\"--start-time <date>\", \"Start time, use with --end-time\")\n .option(\"--end-time <date>\", \"End time, use with --start-time\")\n .option(\"--all-day\", \"Create an all-day task\")\n .option(\"--favorite\", \"Favorite the task after creation\")\n .option(\"--detail <detail>\", \"Task detail text\")\n .option(\"--work-type-id <workTypeId>\", \"Work type id\")\n .option(\"--parent-id <taskId>\", \"Parent task id for creating a subtask\")\n .option(\"--item <content>\", \"Check item content, can be repeated\", collectString, [])\n .option(\"--items <content>\", \"Newline-separated check item content\")\n .action(\n async (options: {\n name: string;\n matterId?: string;\n taskGroupId?: string;\n taskGroupName?: string;\n userIds?: string;\n dueTime?: string;\n startTime?: string;\n endTime?: string;\n allDay?: boolean;\n favorite?: boolean;\n detail?: string;\n workTypeId?: string;\n parentId?: string;\n item?: string[];\n items?: string;\n }) => {\n await runMatterTaskCreate(options, sessionStore);\n },\n );\n task\n .command(\"worktypes\")\n .description(\"List task work types for task creation\")\n .option(\"--matter-id <matterId>\", \"Matter/project id; when omitted returns the global task work type tree\")\n .option(\"--keyword <keyword>\", \"Filter by work type name\")\n .option(\"--state <number>\", \"Work type state, default 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: { matterId?: string; keyword?: string; state?: number; limit?: number }) => {\n await runMatterTaskWorktypes(options, sessionStore);\n });\n task\n .command(\"assignees\")\n .description(\"List task assignees for task creation\")\n .option(\"--matter-id <matterId>\", \"Matter/project id; returns project members\")\n .option(\"--work-type-id <workTypeId>\", \"Work type id; use with --matter-id to return default assignees\")\n .option(\"--keyword <keyword>\", \"Filter by name, phone, or email\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .option(\"--include-left\", \"Include inactive/left office users when querying all office users\")\n .action(\n async (options: {\n matterId?: string;\n workTypeId?: string;\n keyword?: string;\n limit?: number;\n includeLeft?: boolean;\n }) => {\n await runMatterTaskAssignees(options, sessionStore);\n },\n );\n task\n .command(\"detail\")\n .description(\"Show task details\")\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(options, sessionStore);\n });\n task\n .command(\"update-detail\")\n .description(\"Update task detail/description\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .requiredOption(\"--detail <detail>\", \"Task detail text\")\n .option(\"--effect-repeats\", \"Apply to repeated tasks\")\n .action(async (options: { id: string; detail: string; effectRepeats?: boolean }) => {\n await runMatterTaskUpdateDetail(options, sessionStore);\n });\n task\n .command(\"complete\")\n .description(\"Mark a task as completed\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .action(async (options: { id: string }) => {\n await runMatterTaskComplete(options, sessionStore);\n });\n task\n .command(\"uncomplete\")\n .alias(\"restart\")\n .description(\"Cancel task completion and mark it as unfinished\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .action(async (options: { id: string }) => {\n await runMatterTaskUncomplete(options, sessionStore);\n });\n task\n .command(\"subtasks\")\n .description(\"List subtasks under a task\")\n .requiredOption(\"--id <taskId>\", \"Parent task id\")\n .option(\"--state <state>\", \"Subtask state: all, 未完成, 已完成, 已删除\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: { id: string; state?: string; page?: number; limit?: number }) => {\n await runMatterTaskSubtasks(options, sessionStore);\n },\n );\n const taskAttendee = task.command(\"attendee\").description(\"Task assignee commands\");\n taskAttendee\n .command(\"set\")\n .description(\"Replace task assignees\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .requiredOption(\"--user-ids <userIds>\", \"Comma-separated user ids\")\n .option(\"--effect-repeats\", \"Apply to repeated tasks\")\n .action(async (options: { id: string; userIds: string; effectRepeats?: boolean }) => {\n await runMatterTaskAttendeeSet(options, sessionStore);\n });\n const taskAssignee = task.command(\"assignee\").description(\"Task assignee commands\");\n taskAssignee\n .command(\"set\")\n .description(\"Replace task assignees\")\n .requiredOption(\"--id <taskId>\", \"Task id\")\n .requiredOption(\"--user-ids <userIds>\", \"Comma-separated user ids\")\n .option(\"--effect-repeats\", \"Apply to repeated tasks\")\n .action(async (options: { id: string; userIds: string; effectRepeats?: boolean }) => {\n await runMatterTaskAttendeeSet(options, sessionStore);\n });\n const taskComment = task.command(\"comment\").description(\"Task comment commands\");\n taskComment\n .command(\"add\")\n .description(\"Add a task comment\")\n .requiredOption(\"--task-id <taskId>\", \"Task id\")\n .requiredOption(\"--content <content>\", \"Comment content\")\n .option(\"--at-user-ids <userIds>\", \"Comma-separated mentioned user ids\")\n .action(async (options: { taskId: string; content: string; atUserIds?: string }) => {\n await runMatterTaskCommentAdd(options, sessionStore);\n });\n taskComment\n .command(\"delete\")\n .description(\"Delete a task comment\")\n .requiredOption(\"--id <commentId>\", \"Comment id\")\n .action(async (options: { id: string }) => {\n await runMatterTaskCommentDelete(options, sessionStore);\n });\n const taskCheckItem = task.command(\"checkitem\").description(\"Task check item commands\");\n taskCheckItem\n .command(\"add\")\n .description(\"Add task check items\")\n .requiredOption(\"--task-id <taskId>\", \"Task id\")\n .option(\"--item <content>\", \"Check item content, can be repeated\", collectString, [])\n .option(\"--items <content>\", \"Newline-separated check item content\")\n .option(\"--effect-repeats\", \"Apply to repeated tasks\")\n .action(\n async (options: { taskId: string; item?: string[]; items?: string; effectRepeats?: boolean }) => {\n await runMatterTaskCheckItemAdd(options, sessionStore);\n },\n );\n taskCheckItem\n .command(\"delete\")\n .description(\"Delete a task check item\")\n .requiredOption(\"--id <checkItemId>\", \"Check item id\")\n .requiredOption(\"--task-id <taskId>\", \"Task id\")\n .option(\"--effect-repeats\", \"Apply to repeated tasks\")\n .action(async (options: { id: string; taskId: string; effectRepeats?: boolean }) => {\n await runMatterTaskCheckItemDelete(options, sessionStore);\n });\n taskCheckItem\n .command(\"complete\")\n .description(\"Mark a task check item as completed\")\n .requiredOption(\"--id <checkItemId>\", \"Check item id\")\n .requiredOption(\"--task-id <taskId>\", \"Task id\")\n .action(async (options: { id: string; taskId: string }) => {\n await runMatterTaskCheckItemState({ ...options, state: true }, sessionStore);\n });\n taskCheckItem\n .command(\"uncomplete\")\n .alias(\"cancel\")\n .description(\"Cancel completion for a task check item\")\n .requiredOption(\"--id <checkItemId>\", \"Check item id\")\n .requiredOption(\"--task-id <taskId>\", \"Task id\")\n .action(async (options: { id: string; taskId: string }) => {\n await runMatterTaskCheckItemState({ ...options, state: false }, sessionStore);\n });\n\n const timing = program.command(\"timing\").description(\"Timing commands\");\n timing\n .command(\"list\")\n .description(\"Search my timing table\")\n .option(\"--keyword <keyword>\", \"Timing search keyword\")\n .option(\"--matter-id <matterId>\", \"Matter/project id; use -1 for personal timing\")\n .option(\"--work-type-id <workTypeId>\", \"Work type id\")\n .option(\"--user-id <userId>\", \"Timing creator user id; omitted by default\")\n .option(\"--approve-state <state>\", \"Approve state: all, 已审核, 未审核, 1, 0\")\n .option(\"--range <range>\", \"Time preset: this-month, this-week, today; default this-month\")\n .option(\"--start-time <date>\", \"Time range start, YYYY-MM-DD or date-time\")\n .option(\"--end-time <date>\", \"Time range end, YYYY-MM-DD or date-time\")\n .option(\"--range-from <date>\", \"Alias for --start-time\")\n .option(\"--range-to <date>\", \"Alias for --end-time\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: {\n keyword?: string;\n matterId?: string;\n workTypeId?: string;\n userId?: string;\n approveState?: string;\n range?: string;\n startTime?: string;\n endTime?: string;\n rangeFrom?: string;\n rangeTo?: string;\n page?: number;\n limit?: number;\n }) => {\n await runTimingList(options, sessionStore);\n },\n );\n timing\n .command(\"matters\")\n .description(\"List matters that can be linked when creating timing\")\n .option(\"--keyword <keyword>\", \"Matter search keyword\")\n .option(\"--favorite\", \"Only list my starred/favorite matters\")\n .option(\"--status <status>\", \"Matter statuses, comma-separated; default 0,2,7\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: { keyword?: string; favorite?: boolean; status?: string; limit?: number }) => {\n await runTimingMatters(options, sessionStore);\n },\n );\n timing\n .command(\"worktypes\")\n .description(\"List work types for timing\")\n .option(\"--matter-id <matterId>\", \"Matter/project id\")\n .option(\"--keyword <keyword>\", \"Filter by work type name\")\n .option(\"--state <number>\", \"Work type state; default -1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: { matterId?: string; keyword?: string; state?: number; limit?: number }) => {\n await runTimingWorktypes(options, sessionStore);\n },\n );\n timing\n .command(\"tasks\")\n .description(\"List tasks that can be linked when creating timing\")\n .option(\"--keyword <keyword>\", \"Task search keyword\")\n .option(\"--matter-id <matterId>\", \"Matter/project id; when omitted searches personal/responsible tasks\")\n .option(\"--matter-name <matterName>\", \"Matter/project name for display only\")\n .option(\"--state <state>\", \"Task state: 未完成 or 已完成; default 未完成\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: {\n keyword?: string;\n matterId?: string;\n matterName?: string;\n state?: string;\n page?: number;\n limit?: number;\n }) => {\n await runTimingTasks(options, sessionStore);\n },\n );\n timing\n .command(\"create\")\n .description(\"Create a completed timing record\")\n .requiredOption(\"--name <description>\", \"Timing work description\")\n .option(\"--work-date <date>\", \"Work date, YYYY-MM-DD; default today\")\n .option(\"--start-time <time>\", \"Start time, HH:mm or YYYY-MM-DD HH:mm\")\n .option(\"--end-time <time>\", \"End time, HH:mm or YYYY-MM-DD HH:mm\")\n .option(\"--duration <duration>\", \"Duration: minutes, 90m, 1.5h, or HH:mm\")\n .option(\"--matter-id <matterId>\", \"Linked matter/project id\")\n .option(\"--task-id <taskId>\", \"Linked task id\")\n .option(\"--work-type-id <workTypeId>\", \"Linked work type id\")\n .action(\n async (options: {\n name: string;\n workDate?: string;\n startTime?: string;\n endTime?: string;\n duration?: string;\n matterId?: string;\n taskId?: string;\n workTypeId?: string;\n }) => {\n await runTimingCreate(options, sessionStore);\n },\n );\n\n const user = program.command(\"user\").description(\"User and HR member commands\");\n user\n .command(\"list\")\n .description(\"Search HR member list\")\n .option(\"--keyword <keyword>\", \"Search keyword for member name or username\")\n .option(\"--name <name>\", \"Alias for --keyword\")\n .option(\"--username <username>\", \"Alias for --keyword\")\n .option(\"--phone <phone>\", \"Phone number\")\n .option(\"--email <email>\", \"Email\")\n .option(\"--status <status>\", \"Employment status: 在职, 离职, all; default 在职\")\n .option(\"--account-type <type>\", \"Account type: A, B, Z; comma-separated\")\n .option(\"--user-type <type>\", \"Alias for --account-type\")\n .option(\"--rank-ids <ids>\", \"Rank ids from user ranks, comma-separated\")\n .option(\"--office-member-level-ids <ids>\", \"Alias for --rank-ids\")\n .option(\"--position <position>\", \"Position/job title keyword\")\n .option(\"--zhi-wu <position>\", \"Alias for --position\")\n .option(\"--join-from <date>\", \"Join date range start, YYYY-MM-DD\")\n .option(\"--join-to <date>\", \"Join date range end, YYYY-MM-DD\")\n .option(\"--manager-ids <ids>\", \"Manager user ids from user managers, comma-separated\")\n .option(\"--department-ids <ids>\", \"Department ids from user departments, comma-separated\")\n .option(\"--dpt-ids <ids>\", \"Alias for --department-ids\")\n .option(\"--page <number>\", \"Page index, starts from 1\", parseInteger)\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(\n async (options: {\n keyword?: string;\n name?: string;\n username?: string;\n phone?: string;\n email?: string;\n status?: string;\n accountType?: string;\n userType?: string;\n rankIds?: string;\n officeMemberLevelIds?: string;\n position?: string;\n zhiWu?: string;\n joinFrom?: string;\n joinTo?: string;\n managerIds?: string;\n departmentIds?: string;\n dptIds?: string;\n page?: number;\n limit?: number;\n }) => {\n await runUserList(options, sessionStore);\n },\n );\n user\n .command(\"statuses\")\n .description(\"List HR employment status filter options\")\n .action(async () => {\n await runUserStatuses();\n });\n user\n .command(\"account-types\")\n .description(\"List HR account type filter options\")\n .action(async () => {\n await runUserAccountTypes(sessionStore);\n });\n user\n .command(\"ranks\")\n .description(\"List HR rank filter options\")\n .option(\"--keyword <keyword>\", \"Rank keyword\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: { keyword?: string; limit?: number }) => {\n await runUserRanks(options, sessionStore);\n });\n user\n .command(\"managers\")\n .description(\"List direct manager filter options\")\n .option(\"--keyword <keyword>\", \"Manager keyword\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: { keyword?: string; limit?: number }) => {\n await runUserManagers(options, sessionStore);\n });\n user\n .command(\"departments\")\n .description(\"List department filter options\")\n .option(\"--keyword <keyword>\", \"Department keyword\")\n .option(\"--limit <number>\", \"Max results\", parseInteger)\n .action(async (options: { keyword?: string; limit?: number }) => {\n await runUserDepartments(options, sessionStore);\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 === \"alpha-claw\") {\n return \"alphaclaw\";\n }\n if (\n target === \"codex\" ||\n target === \"claude\" ||\n target === \"alphaclaw\" ||\n target === \"all\"\n ) {\n return target;\n }\n throw new Error(`Invalid agent target: ${value}. Supported: codex, claude, alphaclaw, alpha-claw, 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 {\n getCurrentEnvironmentPreset,\n type RuntimeEnvironmentPreset,\n} 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 userId?: string;\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 const normalizedAuth = normalizeDeviceAuthorizationUrls(auth, context.baseUrl);\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: normalizedAuth,\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 = await getCurrentEnvironmentPreset(sessionStore);\n const currentUser = await verifyToken(environment.apiBaseUrl, options.token);\n const currentUserData = getCurrentUserData(currentUser);\n const userId =\n options.userId ?? currentUserData?.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: RuntimeEnvironmentPreset;\n baseUrl: string;\n apiBaseUrl: string;\n timeoutMs: number;\n apiClient: ApiClient;\n}> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const baseUrl = normalizeBaseUrl(environment.baseUrl);\n const apiBaseUrl = normalizeBaseUrl(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: RuntimeEnvironmentPreset;\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.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 normalizeDeviceAuthorizationUrls(\n auth: CliDeviceAuthCreateVO,\n baseUrl: string,\n): CliDeviceAuthCreateVO {\n return {\n ...auth,\n ...(auth.verificationUri\n ? { verificationUri: replaceUrlOrigin(auth.verificationUri, baseUrl) }\n : {}),\n verificationUriComplete: replaceUrlOrigin(auth.verificationUriComplete, baseUrl),\n };\n}\n\nfunction replaceUrlOrigin(value: string, baseUrl: string): string {\n if (!value.trim()) {\n return value;\n }\n try {\n const currentUrl = new URL(value);\n const targetUrl = new URL(baseUrl);\n // 授权服务有时返回旧环境域名,这里只替换 origin,保留服务端生成的路径和查询参数。\n currentUrl.protocol = targetUrl.protocol;\n currentUrl.host = targetUrl.host;\n return currentUrl.toString();\n } catch {\n return new URL(value.startsWith(\"/\") ? value : `/${value}`, baseUrl).toString();\n }\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 interface EnvironmentConfigReader {\n getConfig(): Promise<{\n environment?: string;\n baseUrl?: string;\n apiBaseUrl?: string;\n }>;\n}\n\nexport type EnvironmentSource = \"config\" | \"default\";\n\nexport interface RuntimeEnvironmentPreset extends EnvironmentPreset {\n source: EnvironmentSource;\n}\n\nexport const DEFAULT_ENVIRONMENT_NAME: EnvironmentName = \"prod\";\n\n// 环境预设内置在 CLI 中,运行时只允许在这些白名单环境中切换,避免用户输入任意域名。\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\nexport async function getCurrentEnvironmentPreset(\n configReader: EnvironmentConfigReader,\n): Promise<RuntimeEnvironmentPreset> {\n const config = await configReader.getConfig();\n const configuredEnvironment = getEnvironmentPreset(config.environment);\n const fallbackEnvironment = getDefaultEnvironmentPreset();\n const environment = configuredEnvironment ?? fallbackEnvironment;\n return {\n ...environment,\n source: configuredEnvironment ? \"config\" : \"default\",\n };\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 会在构建时替换该常量;没有显式构建环境时默认使用生产环境。\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 requestRaw<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 const response = await this.fetchJson(method, baseUrl, path, {\n ...options,\n session,\n });\n if (response.status === RESULT_CODE_AUTH) {\n const nextSession = await this.refreshSession(session ?? undefined);\n const retryResponse = await this.fetchJson(method, baseUrl, path, {\n ...options,\n session: nextSession,\n });\n return this.unwrapRawResponse<T>(retryResponse);\n }\n return this.unwrapRawResponse<T>(response);\n }\n\n async check(): Promise<unknown> {\n return this.request(\"GET\", \"/im/v1/users/me\", { requireAuth: true });\n }\n\n private unwrapRawResponse<T>(response: { status: number; statusText: string; body: unknown }): T {\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 buildHttpErrorMessage(response.status, response.statusText, response.body),\n undefined,\n response.status,\n );\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 buildHttpErrorMessage(response.status, response.statusText, response.body),\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 buildHttpErrorMessage(status: number, statusText: string, body: unknown): string {\n const bodyMessage = extractHttpErrorBodyMessage(body);\n return bodyMessage\n ? `API request failed: ${status} ${statusText} - ${bodyMessage}`\n : `API request failed: ${status} ${statusText}`;\n}\n\nfunction extractHttpErrorBodyMessage(body: unknown): string | undefined {\n if (body === null || body === undefined || body === \"\") return undefined;\n if (typeof body === \"string\") return truncateMessage(body);\n if (typeof body !== \"object\" || Array.isArray(body)) return truncateMessage(String(body));\n\n const record = body as Record<string, unknown>;\n const directMessage = firstMessageField(record, [\n \"msg\",\n \"resultMsg\",\n \"resultMess\",\n \"message\",\n \"error\",\n \"detail\",\n \"reason\",\n \"error_description\",\n ]);\n if (directMessage) return directMessage;\n\n const nestedData = record.data;\n if (nestedData && typeof nestedData === \"object\" && !Array.isArray(nestedData)) {\n const nestedMessage = firstMessageField(nestedData as Record<string, unknown>, [\n \"msg\",\n \"resultMsg\",\n \"resultMess\",\n \"message\",\n \"error\",\n \"detail\",\n \"reason\",\n ]);\n if (nestedMessage) return nestedMessage;\n }\n\n return truncateMessage(JSON.stringify(body));\n}\n\nfunction firstMessageField(source: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim()) return truncateMessage(value.trim());\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n }\n return undefined;\n}\n\nfunction truncateMessage(message: string): string {\n const singleLine = message.replace(/\\s+/g, \" \").trim();\n return singleLine.length > 800 ? `${singleLine.slice(0, 797)}...` : singleLine;\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 { getCurrentEnvironmentPreset } 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 = await getCurrentEnvironmentPreset(sessionStore);\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 { getCurrentEnvironmentPreset } from \"../../config/environments.js\";\nimport { ApiClient } from \"../../http/api-client.js\";\nimport { printSuccess } from \"../../output/envelope.js\";\nimport type { SessionStore } from \"../../session/store.js\";\nimport type {\n ApproScope,\n ApproListOptions,\n ApproInitiatorsOptions,\n ApproDetailOptions,\n ApproStatusFilter,\n AlphaApproSearchResponse,\n AlphaApproDetailResponse,\n AlphaApproFeedsResponse,\n AlphaApproInitiatorsResponse,\n AlphaCommonFileBatchResponse,\n AlphaApproInitiator,\n AlphaApproDetail,\n AlphaApproItem,\n AlphaApproFormField,\n ApproBusinessField,\n ApproBusinessGroup,\n ApproBusinessGroupPattern,\n AlphaApproFlow,\n AlphaApproFlowUser,\n AlphaApproFile,\n AlphaCommonFileInfo,\n ApproAttachmentRef,\n AlphaApproFeed,\n} from \"./types.js\";\n\n// 审批模块作为顶级业务模块维护。列表、发起人解析和详情都放在这里,\n// 类型定义放在同目录 types.ts,后续如果审批写操作增多可以继续拆分 actions。\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\n// 查询审批列表。scope/status 的组合对齐前端审批中心,不同 scope 下允许的状态集合不同,\n// 解析逻辑集中在 parseApproStatus,避免调用方自己理解前端枚举。\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 = await getCurrentEnvironmentPreset(sessionStore);\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 // 请求体对齐前端审批中心搜索接口。userId/officeId 由后端根据 token 补齐,\n // CLI 不额外保存或拼装身份字段,避免本地状态和服务端登录态不一致。\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\n// 查询审批发起人候选。这个命令主要给 appro list --starter-id 前置使用,\n// 让自然语言里的发起人姓名先解析成稳定的用户 ID。\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 = await getCurrentEnvironmentPreset(sessionStore);\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\n// 查询审批详情。该命令只读审批详情、流程、附件、评论和动态,\n// 输出时会把后端字段整理成中文分组,供 Agent 直接展示。\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 = await getCurrentEnvironmentPreset(sessionStore);\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n // 前端审批中心打开详情弹窗时使用这个只读接口。CLI 也保持只读,\n // 只做字段清洗和中文分组,不在详情命令里触发任何审批操作。\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 // 列表行展示的是审批单生命周期状态,来自前端状态映射;\n // 它和“我审批的”筛选状态不是同一个枚举,不能直接混用。\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 // 前端用同一个用户服务构建审批发起人筛选项。默认只查未删除且在职用户;\n // includeLeft 用于兼容历史审批详情里可能出现的离职/停用人员。\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 // 前端使用 feedType 区分内容:1 是用户评论,2 是审批动态。\n // 这里不要按内容文本再二次猜测,否则会把系统动态混入用户评论。\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 // 前端用 status + preStatus 表达“驳回后重新发起/撤回后重新发起”这类状态。\n // CLI 接收自然中文状态,再在这里统一转换成后端需要的组合参数。\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 // 审批接口有些时间是时间戳,有些是字符串。CLI 统一输出本地时间字符串,\n // 避免把毫秒时间戳直接暴露给终端用户和 Agent。\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 // 10 位时间戳按秒处理,13 位时间戳按毫秒处理。\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 { getCurrentEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\nexport async function runCapabilities(version: string, sessionStore: SessionStore): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n // 该命令是 agent 的通用契约,保持稳定保守;agent 应优先读取这里声明的命令。\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 \"环境来源\": environment.source,\n \"切换方式\": \"alpha-classic-cli env use <local|dev|test|prod>\",\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 会安装到所有已存在的 dev、test、prod AlphaClaw workspace。\",\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 \"--matter-type-ids\": \"可选。项目类型ID,多个用英文逗号分隔;先用 matter types 查询。项目类型有大类和子类型层级;用户说“常法”时按“常年顾问”项目类型理解。对应请求体 subMatterTypes。\",\n \"--service-start-from\": \"可选。服务开始时间范围起点,YYYY-MM-DD。对应 serviceStartRangeTime.startTime。\",\n \"--service-start-to\": \"可选。服务开始时间范围终点,YYYY-MM-DD。对应 serviceStartRangeTime.endTime。\",\n \"--service-end-from\": \"可选。服务结束时间范围起点,YYYY-MM-DD。对应 serviceEndRangeTime.startTime。\",\n \"--service-end-to\": \"可选。服务结束时间范围终点,YYYY-MM-DD。对应 serviceEndRangeTime.endTime。\",\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 \"项目链接(项目概览/项目财务/项目任务)\",\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 types\",\n \"参数\": {\n \"--keyword\": \"可选。按项目类型名称过滤。用户说“常法”时应使用“常年顾问”查询。\",\n \"--limit\": \"可选。默认 50,最大 50。\",\n },\n \"接口\": {\n \"方法\": \"GET\",\n \"路径\": \"/matterserver/api/v2/matters/matterType/listTree\",\n \"说明\": \"对齐前端项目列表更多筛选的 MatterService.getMatterTypeList({})。\",\n },\n \"输出字段\": [\"项目类型ID\", \"项目类型\", \"父级项目类型\", \"父级ID\"],\n \"示例\": \"alpha-classic-cli matter types --keyword 诉讼 --limit 20\",\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 ],\n \"最近动态\": [\"动态ID\", \"类型\", \"时间\", \"内容\"],\n },\n \"示例\": \"alpha-classic-cli matter detail --id <matterId> --logs 5\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询任务列表;当前支持按项目ID读取项目下任务\",\n \"命令\": \"alpha-classic-cli task list\",\n \"参数\": {\n \"--matter-id\": \"必填。项目ID,通常先通过 matter search 获取。\",\n \"--state\": \"可选。任务状态:all、未完成、已完成、已删除,默认未完成;all 对应后端 statusType=4,只包含未完成+已完成。\",\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 },\n \"示例\": \"alpha-classic-cli task list --matter-id <matterId> --state 未完成 --limit 20\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询任务详情\",\n \"命令\": \"alpha-classic-cli task detail\",\n \"参数\": {\n \"--id\": \"必填。任务ID,通常先通过 task list 获取。\",\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 ],\n \"检查项\": [\"检查项ID\", \"内容\", \"状态\", \"创建时间\", \"更新时间\"],\n \"附件\": [\"文件名\", \"大小\"],\n \"计时\": [\"计时总时长\", \"总数\", \"计时列表\"],\n \"子任务列表\": [\"状态\", \"总数\", \"页码\", \"每页数量\", \"列表\"],\n \"任务动态\": [\"总数\", \"页码\", \"每页数量\", \"动态列表\"],\n },\n \"示例\": \"alpha-classic-cli task detail --id <taskId> --comments 10\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询我的任务列表;对齐前端“我的任务”table 搜索\",\n \"命令\": \"alpha-classic-cli task mine\",\n \"参数\": {\n \"--keyword\": \"可选。任务搜索词,对应前端 searchValue。\",\n \"--state\": \"可选。任务状态:all、未完成、已完成、已删除,默认未完成;all 对应后端 status=4,只包含未完成+已完成。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 20,最大 50。\",\n \"--matter-ids\": \"可选。项目ID,多个用英文逗号分隔;个人任务可使用 personal_task。\",\n \"--user-ids\": \"可选。负责人用户ID,多个用英文逗号分隔;默认当前登录用户。传多人或他人时使用 responsibleTasks 接口。\",\n \"--range-from\": \"可选。时间范围起点,YYYY-MM-DD 或日期时间;传入后使用日历时间范围接口。\",\n \"--range-to\": \"可选。时间范围终点,YYYY-MM-DD 或日期时间;传入后使用日历时间范围接口。\",\n \"--start-time\": \"可选。--range-from 的别名。\",\n \"--end-time\": \"可选。--range-to 的别名。\",\n \"--no-include-special-groups\": \"可选。跳过“我关注的”和“新任务”两个额外分组接口。\",\n },\n \"接口\": [\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/myTasks\",\n \"说明\": \"当前用户的主体任务列表。\",\n },\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/responsibleTasks\",\n \"说明\": \"筛选多人或非当前用户时的主体任务列表。\",\n },\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/favoriteTasks\",\n \"说明\": \"未完成 + 当前用户 + 第一页时查询“我关注的”分组。\",\n },\n {\n \"方法\": \"GET\",\n \"路径\": \"/taskserver/api/v1/tasks/newtasks\",\n \"说明\": \"未完成 + 当前用户 + 第一页时查询“新任务”分组。\",\n },\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/calendar/myTasks\",\n \"说明\": \"传入 rangeFrom/rangeTo 时,当前用户的时间范围任务列表。\",\n },\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/calendar/responsibleTasks\",\n \"说明\": \"传入 rangeFrom/rangeTo 且筛选多人或非当前用户时的时间范围任务列表。\",\n },\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/calendar/favoriteTasks\",\n \"说明\": \"传入 rangeFrom/rangeTo 且当前用户时查询时间范围内“我关注的”分组。\",\n },\n ],\n \"输出字段\": {\n \"我关注的\": [\"总数\", \"页码\", \"每页数量\", \"任务列表\"],\n \"新任务\": [\"总数\", \"页码\", \"每页数量\", \"任务列表\"],\n \"分组任务列表\": [\"分组\", \"分组值\", \"数量\", \"任务列表\"],\n \"任务列表\": [\n \"任务ID\",\n \"任务名称\",\n \"任务组\",\n \"展示分组\",\n \"状态\",\n \"负责人\",\n \"到期时间\",\n \"开始时间\",\n \"结束时间\",\n \"检查项\",\n \"评论数\",\n \"附件数\",\n \"是否关注\",\n ],\n },\n \"示例\": \"alpha-classic-cli task mine --keyword <keyword> --state 未完成 --range-from 2026-06-01 --range-to 2026-06-30 --limit 20\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询我的待办任务;CLI 专用后端接口,支持数据库层时间范围过滤、排序和分页\",\n \"命令\": \"alpha-classic-cli task pending\",\n \"优先场景\": \"用户问“我本周还有哪些任务没完成”“按从近到远列出待办任务”等需要全量后端排序的问题时,优先使用该命令。\",\n \"参数\": {\n \"--range\": \"可选。时间预设:today、this-week、this-month,默认 this-week。\",\n \"--start-time\": \"可选。自定义时间范围起点,YYYY-MM-DD 或日期时间;需与 --end-time 一起使用。\",\n \"--end-time\": \"可选。自定义时间范围终点,YYYY-MM-DD 或日期时间;需与 --start-time 一起使用。\",\n \"--range-from\": \"可选。--start-time 的别名。\",\n \"--range-to\": \"可选。--end-time 的别名。\",\n \"--state\": \"可选。任务状态:all、未完成、已完成、已删除,默认未完成;新接口 statusType 口径是 0=未完成、1=已完成、2=已删除、4=全部。\",\n \"--time-field\": \"可选。时间筛选字段:dueTime、startTime、endTime,默认 dueTime。\",\n \"--order-by\": \"可选。排序字段:dueTime、startTime、endTime,默认等于 --time-field。\",\n \"--order-direction\": \"可选。asc 或 desc,默认 asc;asc 表示从近到远。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 50,最大 100。\",\n },\n \"接口\": {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/cli/tasks/my/pending\",\n \"说明\": \"后端专门提供给 alpha-classic-cli 的待办任务查询接口;不修改旧前端接口。\",\n \"请求体\": {\n \"startTime\": \"YYYY-MM-DD HH:mm:ss\",\n \"endTime\": \"YYYY-MM-DD HH:mm:ss\",\n \"statusType\": \"0=未完成, 1=已完成, 2=已删除, 4=全部\",\n \"timeField\": \"dueTime|startTime|endTime\",\n \"orderBy\": \"dueTime|startTime|endTime\",\n \"orderDirection\": \"asc|desc\",\n \"page\": 1,\n \"limit\": 50,\n },\n },\n \"输出字段\": {\n \"时间范围\": [\"预设\", \"开始\", \"结束\", \"筛选字段\"],\n \"排序\": [\"字段\", \"方向\", \"空值\"],\n \"任务列表\": [\n \"任务ID\",\n \"任务名称\",\n \"项目ID\",\n \"项目名称\",\n \"任务组\",\n \"状态\",\n \"负责人\",\n \"到期时间\",\n \"开始时间\",\n \"结束时间\",\n \"检查项\",\n \"评论数\",\n \"附件数\",\n \"工作类型\",\n ],\n },\n \"示例\": \"alpha-classic-cli task pending --range this-week --state 未完成 --order-direction asc --limit 50\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"新建任务;支持个人任务、项目任务和子任务\",\n \"命令\": \"alpha-classic-cli task create\",\n \"写操作\": true,\n \"参数\": {\n \"--name\": \"必填。任务名称,最大 200 字符。\",\n \"--matter-id\": \"可选。项目ID;不传则创建个人任务。\",\n \"--task-group-id\": \"可选。任务组ID。\",\n \"--task-group-name\": \"可选。任务组名称,仅作为请求兼容字段。\",\n \"--user-ids\": \"可选。负责人用户ID,多个用英文逗号分隔;不传时默认当前登录用户。\",\n \"--due-time\": \"可选。到期时间,YYYY-MM-DD 或日期时间。\",\n \"--start-time\": \"可选。开始时间,必须与 --end-time 一起使用。\",\n \"--end-time\": \"可选。结束时间,必须与 --start-time 一起使用。\",\n \"--all-day\": \"可选。创建全天任务,dayType=1;默认非全天 dayType=2。\",\n \"--favorite\": \"可选。创建后关注该任务。\",\n \"--detail\": \"可选。任务详情,最大 3000 字符。\",\n \"--work-type-id\": \"可选。工作类型ID。\",\n \"--parent-id\": \"可选。父任务ID;传入则创建子任务。\",\n \"--item\": \"可选。检查项内容,可重复传。\",\n \"--items\": \"可选。多行检查项内容。\",\n },\n \"接口\": {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks\",\n \"请求体\": {\n \"matterId\": \"<matterId 或空字符串>\",\n \"taskGroupId\": \"<taskGroupId 或空字符串>\",\n \"name\": \"<name>\",\n \"favorite\": false,\n \"workTypeId\": \"<workTypeId>\",\n \"timeSetting\": {\n \"timeType\": \"1=到期时间, 2=开始结束时间\",\n \"dueTime\": \"<dueTime>\",\n \"startTime\": \"<startTime>\",\n \"endTime\": \"<endTime>\",\n \"dayType\": \"1=全天, 2=非全天\",\n },\n \"attendeeIds\": [\"<userId>\"],\n \"repeatSetting\": null,\n \"remindSetting\": { \"ruleTime\": [], \"customTime\": [], \"remindType\": 0 },\n \"detail\": \"<detail>\",\n \"checkItems\": [\"<content>\"],\n \"parentId\": \"<parentTaskId>\",\n },\n },\n \"输出字段\": [\"任务ID\", \"任务名称\", \"项目ID\", \"项目名称\", \"父任务ID\", \"任务组\", \"状态\", \"负责人\", \"开始时间\", \"到期时间\", \"结束时间\", \"全天类型\", \"是否关注\", \"详情\", \"检查项\", \"结果\"],\n \"示例\": \"alpha-classic-cli task create --name <name> --matter-id <matterId> --due-time 2026-06-30\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询任务工作类型;用于新建任务时选择 --work-type-id\",\n \"命令\": \"alpha-classic-cli task worktypes\",\n \"参数\": {\n \"--matter-id\": \"可选。项目ID;传入后返回该项目可用的工作类型。\",\n \"--keyword\": \"可选。按工作类型名称过滤。\",\n \"--state\": \"可选。工作类型状态,默认 1。\",\n \"--limit\": \"可选。默认 50,最大 50。\",\n },\n \"接口\": [\n {\n \"方法\": \"GET\",\n \"路径\": \"/matterserver/api/v2/workType/workTypes/list/v2\",\n \"说明\": \"传 --matter-id 时,对齐前端新建任务工作类型下拉。\",\n },\n {\n \"方法\": \"GET\",\n \"路径\": \"/taskserver/api/v2/timing/matter/workTypes/v2\",\n \"说明\": \"不传 --matter-id 时查询全局任务工作类型树。\",\n },\n ],\n \"输出字段\": [\"项目ID\", \"状态\", \"搜索词\", \"总数\", \"工作类型列表\"],\n \"示例\": \"alpha-classic-cli task worktypes --matter-id <matterId> --keyword <keyword>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询任务负责人候选;用于新建任务时选择 --user-ids\",\n \"命令\": \"alpha-classic-cli task assignees\",\n \"参数\": {\n \"--matter-id\": \"可选。项目ID;单独传入时返回项目成员。\",\n \"--work-type-id\": \"可选。工作类型ID;必须配合 --matter-id,返回该项目该工作类型匹配的默认负责人。\",\n \"--keyword\": \"可选。按姓名、手机号、邮箱过滤。\",\n \"--limit\": \"可选。默认 50,最大 50。\",\n \"--include-left\": \"可选。不传 --matter-id 时查询全所人员,带此参数会包含停用/离职人员。\",\n },\n \"接口\": [\n {\n \"方法\": \"GET\",\n \"路径\": \"/matterserver/api/v2/workType/queryMatterMemberByWorkTypeAndMatterId\",\n \"说明\": \"传 --matter-id 和 --work-type-id 时查询工作类型默认负责人。\",\n },\n {\n \"方法\": \"GET\",\n \"路径\": \"/matterserver/api/v2/matters/{matterId}\",\n \"说明\": \"只传 --matter-id 时读取项目成员。\",\n },\n {\n \"方法\": \"GET\",\n \"路径\": \"/user/api/v1/users/listOfficeUser\",\n \"说明\": \"不传 --matter-id 时查询全所可用人员。\",\n },\n ],\n \"输出字段\": [\"来源\", \"项目ID\", \"工作类型ID\", \"搜索词\", \"总数\", \"负责人列表\"],\n \"示例\": \"alpha-classic-cli task assignees --matter-id <matterId> --work-type-id <workTypeId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"编辑任务详情\",\n \"命令\": \"alpha-classic-cli task update-detail\",\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。任务ID。\",\n \"--detail\": \"必填。任务详情文本,最大 3000 字符。\",\n \"--effect-repeats\": \"可选。是否影响重复任务,默认 false。\",\n },\n \"接口\": {\n \"方法\": \"PUT\",\n \"路径\": \"/taskserver/api/v1/tasks/{taskId}/basicInfo\",\n \"请求体\": { \"detail\": \"<detail>\", \"effectRepeats\": false },\n },\n \"输出字段\": [\"任务ID\", \"任务详情\", \"影响重复任务\", \"结果\"],\n \"示例\": \"alpha-classic-cli task update-detail --id <taskId> --detail <detail>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"完成任务\",\n \"命令\": \"alpha-classic-cli task complete\",\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。任务ID。\",\n },\n \"接口\": {\n \"方法\": \"PUT\",\n \"路径\": \"/taskserver/api/v1/tasks/{taskId}/finish\",\n },\n \"输出字段\": [\"任务ID\", \"状态\", \"结果\"],\n \"示例\": \"alpha-classic-cli task complete --id <taskId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"取消完成任务;把已完成任务恢复为未完成\",\n \"命令\": \"alpha-classic-cli task uncomplete\",\n \"别名\": [\"alpha-classic-cli task restart\"],\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。任务ID。\",\n },\n \"接口\": {\n \"方法\": \"PUT\",\n \"路径\": \"/taskserver/api/v1/tasks/{taskId}/restart\",\n \"请求参数\": { \"restartParent\": true },\n \"说明\": \"对齐前端 taskService.restartTask;用于取消完成/重启任务。\",\n },\n \"输出字段\": [\"任务ID\", \"状态\", \"结果\"],\n \"示例\": \"alpha-classic-cli task uncomplete --id <taskId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"修改任务负责人\",\n \"命令\": \"alpha-classic-cli task assignee set\",\n \"别名\": [\"alpha-classic-cli task attendee set\"],\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。任务ID。\",\n \"--user-ids\": \"必填。负责人用户ID,多个用英文逗号分隔;会替换当前负责人列表。\",\n \"--effect-repeats\": \"可选。是否影响重复任务,默认 false。\",\n },\n \"接口\": {\n \"方法\": \"PUT\",\n \"路径\": \"/taskserver/api/v1/tasks/{taskId}/attendee\",\n \"请求体\": { \"attendeeIds\": [\"<userId>\"], \"effectRepeats\": false },\n },\n \"输出字段\": [\"任务ID\", \"负责人ID列表\", \"影响重复任务\", \"结果\"],\n \"示例\": \"alpha-classic-cli task assignee set --id <taskId> --user-ids <userId1,userId2>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"添加任务评论\",\n \"命令\": \"alpha-classic-cli task comment add\",\n \"写操作\": true,\n \"参数\": {\n \"--task-id\": \"必填。任务ID。\",\n \"--content\": \"必填。评论内容,最大 1500 字符。\",\n \"--at-user-ids\": \"可选。被 @ 用户ID,多个用英文逗号分隔。\",\n },\n \"接口\": {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/comment\",\n \"请求体\": { \"hostId\": \"<taskId>\", \"content\": \"<content>\", \"atUserIds\": [\"<userId>\"] },\n },\n \"输出字段\": [\"任务ID\", \"评论ID\", \"内容\", \"艾特用户ID列表\", \"结果\"],\n \"示例\": \"alpha-classic-cli task comment add --task-id <taskId> --content <content>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"删除任务评论\",\n \"命令\": \"alpha-classic-cli task comment delete\",\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。评论ID,通常先通过 task detail 的任务动态获取;只能删除自己的评论。\",\n },\n \"接口\": {\n \"方法\": \"DELETE\",\n \"路径\": \"/ilaw/api/v2/comment/{commentId}\",\n },\n \"输出字段\": [\"评论ID\", \"结果\"],\n \"示例\": \"alpha-classic-cli task comment delete --id <commentId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"添加任务检查项\",\n \"命令\": \"alpha-classic-cli task checkitem add\",\n \"写操作\": true,\n \"参数\": {\n \"--task-id\": \"必填。任务ID。\",\n \"--item\": \"可选。检查项内容,可重复传;单条最大 500 字符。\",\n \"--items\": \"可选。多行检查项内容,会按换行拆分;单条最大 500 字符。\",\n \"--effect-repeats\": \"可选。是否影响重复任务,默认 false。\",\n },\n \"接口\": {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/checkitem\",\n \"请求体\": { \"taskId\": \"<taskId>\", \"checkItems\": [\"<content>\"], \"effectRepeats\": false },\n },\n \"输出字段\": [\"任务ID\", \"检查项\", \"影响重复任务\", \"结果\"],\n \"示例\": \"alpha-classic-cli task checkitem add --task-id <taskId> --item <content>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"完成任务检查项\",\n \"命令\": \"alpha-classic-cli task checkitem complete\",\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。检查项ID,通常先通过 task detail 获取。\",\n \"--task-id\": \"必填。检查项所属任务ID,后端接口校验任务状态和权限需要。\",\n },\n \"接口\": {\n \"方法\": \"PUT\",\n \"路径\": \"/taskserver/api/v1/checkitem/{checkItemId}/state\",\n \"请求体\": { \"taskId\": \"<taskId>\", \"state\": 1 },\n },\n \"输出字段\": [\"检查项ID\", \"任务ID\", \"状态\", \"结果\"],\n \"示例\": \"alpha-classic-cli task checkitem complete --id <checkItemId> --task-id <taskId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"取消完成任务检查项\",\n \"命令\": \"alpha-classic-cli task checkitem uncomplete\",\n \"别名\": [\"alpha-classic-cli task checkitem cancel\"],\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。检查项ID,通常先通过 task detail 获取。\",\n \"--task-id\": \"必填。检查项所属任务ID,后端接口校验任务状态和权限需要。\",\n },\n \"接口\": {\n \"方法\": \"PUT\",\n \"路径\": \"/taskserver/api/v1/checkitem/{checkItemId}/state\",\n \"请求体\": { \"taskId\": \"<taskId>\", \"state\": 0 },\n },\n \"输出字段\": [\"检查项ID\", \"任务ID\", \"状态\", \"结果\"],\n \"示例\": \"alpha-classic-cli task checkitem uncomplete --id <checkItemId> --task-id <taskId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"删除任务检查项\",\n \"命令\": \"alpha-classic-cli task checkitem delete\",\n \"写操作\": true,\n \"参数\": {\n \"--id\": \"必填。检查项ID,通常先通过 task detail 获取。\",\n \"--task-id\": \"必填。检查项所属任务ID。\",\n \"--effect-repeats\": \"可选。是否影响重复任务,默认 false。\",\n },\n \"接口\": {\n \"方法\": \"DELETE\",\n \"路径\": \"/taskserver/api/v1/checkitem/{checkItemId}\",\n \"查询参数\": { \"taskId\": \"<taskId>\", \"effectRepeats\": false },\n },\n \"输出字段\": [\"检查项ID\", \"任务ID\", \"影响重复任务\", \"结果\"],\n \"示例\": \"alpha-classic-cli task checkitem delete --id <checkItemId> --task-id <taskId>\",\n },\n {\n \"模块\": \"task\",\n \"中文名\": \"任务\",\n \"能力\": \"查询任务下子任务列表\",\n \"命令\": \"alpha-classic-cli task subtasks\",\n \"参数\": {\n \"--id\": \"必填。父任务ID,通常先通过 task list 或 task detail 获取。\",\n \"--state\": \"可选。子任务状态:all、未完成、已完成、已删除,默认 all;all 对应后端 statusType=4,只包含未完成+已完成。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 20,最大 50。\",\n },\n \"输出字段\": {\n \"父任务ID\": \"当前父任务ID\",\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 \"示例\": \"alpha-classic-cli task subtasks --id <taskId> --state all --limit 20\",\n },\n {\n \"模块\": \"timing\",\n \"中文名\": \"计时\",\n \"能力\": \"查询我的菜单下计时 table;支持关键词、项目、工作类型、记录人、审核状态和时间范围筛选\",\n \"命令\": \"alpha-classic-cli timing list\",\n \"参数\": {\n \"--keyword\": \"可选。计时搜索词,对应前端搜索框。\",\n \"--matter-id\": \"可选。项目ID;个人计时可传 -1。\",\n \"--work-type-id\": \"可选。工作类型ID。\",\n \"--user-id\": \"可选。记录人用户ID;默认不显式传 createUserId,由后端按当前登录身份和权限返回。\",\n \"--approve-state\": \"可选。审核状态:all、已审核、未审核、1、0,默认 all。\",\n \"--range\": \"可选。时间预设:today、this-week、this-month,默认 this-month。\",\n \"--start-time\": \"可选。自定义时间范围起点,YYYY-MM-DD;需与 --end-time 一起使用。\",\n \"--end-time\": \"可选。自定义时间范围终点,YYYY-MM-DD;需与 --start-time 一起使用。\",\n \"--range-from\": \"可选。--start-time 的别名。\",\n \"--range-to\": \"可选。--end-time 的别名。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 50,最大 100。\",\n },\n \"接口\": {\n \"方法\": \"GET\",\n \"路径\": \"/taskserver/api/v2/timing/timing/search\",\n \"说明\": \"对齐前端“我的菜单 - 计时 table”的查询接口;请求会附带 xDate 本地时区偏移。\",\n },\n \"输出字段\": {\n \"累计计时\": \"查询条件下的累计计时时长。\",\n \"按日期分组\": [\"日期\", \"星期\", \"当日计时\", \"数量\"],\n \"计时列表\": [\n \"计时ID\",\n \"记录人ID\",\n \"记录人\",\n \"项目ID\",\n \"项目名称\",\n \"任务ID\",\n \"任务名称\",\n \"工作类型ID\",\n \"工作类型\",\n \"工作描述\",\n \"工作日期\",\n \"开始时间\",\n \"结束时间\",\n \"计时时长\",\n \"标准工时\",\n \"状态\",\n \"审核状态\",\n \"对外审核状态\",\n \"异常状态\",\n \"异常原因\",\n ],\n },\n \"示例\": \"alpha-classic-cli timing list --range this-month --approve-state all --limit 50\",\n },\n {\n \"模块\": \"timing\",\n \"中文名\": \"计时\",\n \"能力\": \"查询新增计时时可关联的项目\",\n \"命令\": \"alpha-classic-cli timing matters\",\n \"参数\": {\n \"--keyword\": \"可选。项目搜索词,对应前端新增计时项目搜索。\",\n \"--favorite\": \"可选。只查我关注的项目;前端初始化新增计时弹窗时使用 myStar=1。\",\n \"--status\": \"可选。项目状态逗号分隔,默认 0,2,7。\",\n \"--limit\": \"可选。默认 50,最大 100。\",\n },\n \"接口\": {\n \"方法\": \"GET\",\n \"路径\": \"/taskserver/api/v2/timing/timing/getMatterList\",\n \"说明\": \"对齐前端 clockService.queryProjectsForAddClock。\",\n },\n \"输出字段\": [\"项目ID\", \"项目名称\", \"项目编号\", \"客户\", \"项目状态\"],\n \"示例\": \"alpha-classic-cli timing matters --keyword 合同 --limit 20\",\n },\n {\n \"模块\": \"timing\",\n \"中文名\": \"计时\",\n \"能力\": \"查询新增计时时可选的工作类型\",\n \"命令\": \"alpha-classic-cli timing worktypes\",\n \"参数\": {\n \"--matter-id\": \"可选。项目ID;不传则查通用计时工作类型。\",\n \"--keyword\": \"可选。按工作类型名称过滤。\",\n \"--state\": \"可选。工作类型状态,默认 -1。\",\n \"--limit\": \"可选。默认 50,最大 100。\",\n },\n \"接口\": {\n \"方法\": \"GET\",\n \"路径\": \"/taskserver/api/v2/timing/workTypes/v2\",\n \"说明\": \"对齐前端 workTypeService.getWorkTypesFormTimngList。\",\n },\n \"输出字段\": [\"工作类型ID\", \"工作类型\", \"父级工作类型\", \"父级ID\"],\n \"示例\": \"alpha-classic-cli timing worktypes --matter-id <matterId> --limit 50\",\n },\n {\n \"模块\": \"timing\",\n \"中文名\": \"计时\",\n \"能力\": \"查询新增计时时可关联的任务\",\n \"命令\": \"alpha-classic-cli timing tasks\",\n \"参数\": {\n \"--keyword\": \"可选。任务搜索词。\",\n \"--matter-id\": \"可选。项目ID;传入后查项目任务,不传则查个人/负责人任务。\",\n \"--matter-name\": \"可选。项目名称,仅用于输出展示。\",\n \"--state\": \"可选。未完成 或 已完成,默认 未完成。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n \"--limit\": \"可选。默认 20,最大 100。\",\n },\n \"接口\": [\n {\n \"方法\": \"GET\",\n \"路径\": \"/taskserver/api/v1/tasks/matterTasks/simpleInfo\",\n \"说明\": \"已选项目且没有关键词时查询项目任务。\",\n },\n {\n \"方法\": \"GET\",\n \"路径\": \"/api/v2/taskflow/queryMobileTask\",\n \"说明\": \"已选项目且有关键词时搜索项目任务。\",\n },\n {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v1/tasks/responsibleTasksByTiming\",\n \"说明\": \"未选项目时查询个人/负责人任务。\",\n },\n ],\n \"输出字段\": [\"任务ID\", \"任务名称\", \"项目ID\", \"项目名称\", \"工作类型ID\", \"工作类型\", \"状态\"],\n \"示例\": \"alpha-classic-cli timing tasks --matter-id <matterId> --keyword 合同 --limit 20\",\n },\n {\n \"模块\": \"timing\",\n \"中文名\": \"计时\",\n \"能力\": \"新增一条已完成计时记录\",\n \"命令\": \"alpha-classic-cli timing create\",\n \"写操作\": true,\n \"参数\": {\n \"--name\": \"必填。工作描述。\",\n \"--work-date\": \"可选。工作日期 YYYY-MM-DD,默认今天。\",\n \"--start-time\": \"可选。开始时间,支持 HH:mm 或 YYYY-MM-DD HH:mm。\",\n \"--end-time\": \"可选。结束时间,支持 HH:mm 或 YYYY-MM-DD HH:mm。\",\n \"--duration\": \"可选。时长,支持分钟、90m、1.5h、HH:mm。必须与 --start-time 或 --end-time 搭配,或直接传 --start-time + --end-time。\",\n \"--matter-id\": \"可选。关联项目ID,先用 timing matters 获取。\",\n \"--task-id\": \"可选。关联任务ID,先用 timing tasks 获取。\",\n \"--work-type-id\": \"可选。工作类型ID,先用 timing worktypes 获取。\",\n },\n \"接口\": {\n \"方法\": \"POST\",\n \"路径\": \"/taskserver/api/v2/timing/timing/add\",\n \"请求体\": {\n \"name\": \"<工作描述>\",\n \"workDate\": \"YYYY-MM-DD\",\n \"startTime\": \"毫秒时间戳\",\n \"endTime\": \"毫秒时间戳\",\n \"useTime\": \"毫秒,向上取整到分钟\",\n \"matterPkId\": \"<matterId>\",\n \"taskPkId\": \"<taskId>\",\n \"workTypeId\": \"<workTypeId>\",\n },\n },\n \"输出字段\": [\"计时ID\", \"工作描述\", \"工作日期\", \"开始时间\", \"结束时间\", \"计时时长\", \"项目ID\", \"任务ID\", \"工作类型ID\", \"结果\"],\n \"示例\": \"alpha-classic-cli timing create --name <description> --work-date 2026-06-12 --start-time 09:00 --end-time 10:30 --matter-id <matterId> --work-type-id <workTypeId>\",\n },\n {\n \"模块\": \"finance\",\n \"中文名\": \"财务\",\n \"能力\": \"查询律所财务总览和项目下财务汇总;查询合同、发票、收款、费用、账单、报销的列表和详情\",\n \"命令\": [\n \"alpha-classic-cli finance overview\",\n \"alpha-classic-cli finance overview --department-id <departmentId> --date 2026-06\",\n \"alpha-classic-cli finance departments --keyword <departmentName> --limit 20\",\n \"alpha-classic-cli finance summary --matter-id <matterId>\",\n \"alpha-classic-cli finance contract list --matter-id <matterId>\",\n \"alpha-classic-cli finance contract detail --id <contractId>\",\n \"alpha-classic-cli finance invoice list --matter-id <matterId>\",\n \"alpha-classic-cli finance invoice detail --id <invoiceId>\",\n \"alpha-classic-cli finance income list --matter-id <matterId>\",\n \"alpha-classic-cli finance income detail --id <incomeId>\",\n \"alpha-classic-cli finance expense list --matter-id <matterId>\",\n \"alpha-classic-cli finance expense detail --id <expenseId>\",\n \"alpha-classic-cli finance bill list --matter-id <matterId>\",\n \"alpha-classic-cli finance bill detail --id <billId>\",\n \"alpha-classic-cli finance reimburse list --matter-id <matterId>\",\n \"alpha-classic-cli finance reimburse detail --id <reimburseId>\",\n ],\n \"说明\": {\n \"律所总览\": \"overview 对齐顶级财务模块的“总览”页,底层使用 GET /finance/api/integration/v1/summary/total;默认所属团队为全部,可传 --department-id 对应页面“所属团队”筛选;收入走势图使用 GET /finance/api/integration/v1/summary/trend,--date 支持 YYYY-MM 或 YYYY-MM-DD,默认当前月份。\",\n \"所属团队\": \"departments 对齐前端 istrationAssetsService.getDepartmentList,底层使用 GET /ilaw/api/v2/permission/department/allDepartment,用于获取 overview --department-id。\",\n \"浏览器链接\": \"overview 和顶级财务模块 list/detail 会输出财务模块链接,包含总览、合同、发票、收款、账单、费用、报销路由。\",\n \"项目财务\": \"list 命令传 --matter-id 时,使用前端项目-财务页 matterFinance 系列接口;接口本身无分页,CLI 本地按 page/limit 截取。\",\n \"财务模块\": \"list 命令不传 --matter-id 时,使用前端财务模块 financialV2Service 的列表接口;支持 --keyword、--status、--page、--limit。发票 --type 支持 my/open/manage,默认 my;报销 --type 支持 all/myReimburse/settlement,all 等价于 myReimburse。\",\n \"口语映射\": \"用户说“营收/收入/已收款/已收款金额”时按收款总额理解;用户说“应收款/应收金额/合同金额”时按合同总额理解。summary 里的“应收总额”是项目财务页系统字段,不等同于用户口语里的应收款。\",\n \"应收总额\": \"summary 底层使用 GET /finance/api/integration/v1/statistics/matterOverview/{matterId};应收计算方式由项目财务设置决定,前端支持:已开票金额 - 已收金额、合同金额 - 已收金额、账单总和 - 已收金额。\",\n },\n \"接口\": {\n \"律所总览\": \"GET /finance/api/integration/v1/summary/total\",\n \"总览走势图\": \"GET /finance/api/integration/v1/summary/trend\",\n \"总览提醒\": \"GET /finance/api/integration/v1/finance/overview/reminds\",\n \"所属团队\": \"GET /ilaw/api/v2/permission/department/allDepartment\",\n \"项目汇总\": \"GET /finance/api/integration/v1/statistics/matterOverview/{matterId}\",\n \"项目合同\": \"GET /finance/api/integration/v1/matterFinance/contracts/{matterId}\",\n \"项目发票\": \"GET /finance/api/integration/v1/matterFinance/invoices/Children/{matterId}\",\n \"项目收款\": \"GET /finance/api/integration/v1/matterFinance/incomes/{matterId}\",\n \"项目费用\": \"GET /finance/api/integration/v1/matterFinance/spends/{matterId}\",\n \"项目账单\": \"GET /finance/api/integration/v1/matterFinance/bills/{matterId}\",\n \"项目报销\": \"GET /finance/api/integration/v1/matterFinance/reimburse/{matterId}\",\n },\n \"输出字段\": {\n \"律所总览\": [\"金额指标\", \"关键节点\", \"收入走势图\", \"提醒信息\", \"财务模块链接\", \"指标说明\"],\n \"财务汇总\": [\"合同总额\", \"发票总额\", \"收款总额\", \"标的总额\", \"账单总额\", \"费用总额\", \"应收总额\", \"应收总额计算方式\"],\n \"列表\": [\"ID\", \"项目ID\", \"项目名称\", \"项目财务页\", \"名称\", \"编号\", \"金额\", \"状态\", \"日期\"],\n \"详情\": \"按财务类型输出常用字段,并保留最多 30 个后端 primitive 字段用于排查。\",\n },\n \"示例\": [\n \"alpha-classic-cli finance overview\",\n \"alpha-classic-cli finance summary --matter-id <matterId>\",\n \"alpha-classic-cli finance contract list --matter-id <matterId> --limit 20\",\n \"alpha-classic-cli finance invoice list --keyword 发票抬头 --type my --limit 20\",\n ],\n },\n {\n \"模块\": \"user\",\n \"中文名\": \"用户/人力资源\",\n \"能力\": \"查询人力资源成员列表;对齐前端“人力资源 - 成员”页面\",\n \"命令\": \"alpha-classic-cli user list\",\n \"参数\": {\n \"--keyword\": \"可选。成员姓名或登录用户名关键词;对应前端顶部搜索框 name。\",\n \"--name\": \"可选。--keyword 的别名。\",\n \"--username\": \"可选。--keyword 的别名;后端仍使用 name 字段查询。\",\n \"--phone\": \"可选。手机号;对应筛选项 phone。\",\n \"--email\": \"可选。邮箱;对应筛选项 email。\",\n \"--status\": \"可选。账号状态/在职状态:在职、离职、all、1、0、-1;默认在职。对应请求体 status。\",\n \"--account-type\": \"可选。账号类型:A、B、Z、A类账号、B类账号、非Alpha账号;多个用英文逗号分隔。对应请求体 userType 数组。\",\n \"--user-type\": \"可选。--account-type 的别名。\",\n \"--rank-ids\": \"可选。职级ID,多个用英文逗号分隔;先用 user ranks 查询。对应请求体 officeMemberLevelIds。\",\n \"--office-member-level-ids\": \"可选。--rank-ids 的别名。\",\n \"--position\": \"可选。职务关键词;对应请求体 zhiWu。\",\n \"--zhi-wu\": \"可选。--position 的别名。\",\n \"--join-from\": \"可选。入职时间范围起点,YYYY-MM-DD;对应 joinTime.startTime。\",\n \"--join-to\": \"可选。入职时间范围终点,YYYY-MM-DD;对应 joinTime.endTime。\",\n \"--manager-ids\": \"可选。直属上级用户ID,多个用英文逗号分隔;先用 user managers 查询。对应请求体 manager。\",\n \"--department-ids\": \"可选。所属部门ID,多个用英文逗号分隔;先用 user departments 查询。对应请求体 dptIds。\",\n \"--dpt-ids\": \"可选。--department-ids 的别名。\",\n \"--limit\": \"可选。默认 20,最大 100。\",\n \"--page\": \"可选。从 1 开始,默认 1。\",\n },\n \"接口\": {\n \"方法\": \"POST\",\n \"路径\": \"/user/api/v1/auth/search/lawyer\",\n \"说明\": \"对齐前端 HrMemberService.getHrDatas;默认 status=1、type=-1、itemOrAnd=false。\",\n },\n \"输出字段\": {\n \"筛选\": [\"关键词\", \"手机号\", \"账号状态\", \"账号类型\"],\n \"成员列表\": [\n \"用户ID\",\n \"姓名\",\n \"用户名\",\n \"手机号\",\n \"邮箱\",\n \"账号状态\",\n \"账号类型\",\n \"成员类型\",\n \"职级\",\n \"职务\",\n \"直属上级\",\n \"所属部门\",\n \"入职时间\",\n \"离职时间\",\n ],\n },\n \"示例\": \"alpha-classic-cli user list --status 在职 --account-type A,B --phone 138 --keyword 张三 --limit 20\",\n },\n {\n \"模块\": \"user\",\n \"中文名\": \"用户/人力资源\",\n \"能力\": \"查询人力资源筛选选项\",\n \"命令\": [\n \"alpha-classic-cli user statuses\",\n \"alpha-classic-cli user account-types\",\n \"alpha-classic-cli user ranks\",\n \"alpha-classic-cli user managers\",\n \"alpha-classic-cli user departments\",\n ],\n \"说明\": {\n \"user statuses\": \"账号状态选项为前端写死:在职=1、离职=0、全部=-1。\",\n \"user account-types\": \"账号类型选项为前端写死:A、B、Z;同时调用 /ilaw/api/v1/auth/up/getTypeNumber 判断 A/B 当前可用数量。\",\n \"user ranks\": \"职级选项来自 GET /user/api/v1/officeMemberLevels?levelType=3。\",\n \"user managers\": \"直属上级选项来自 GET /ilaw/api/v1/auth/q/allByOfficeId/{officeId}。\",\n \"user departments\": \"所属部门选项来自 GET /permission/api/v1/permission/department/allDepartment。\",\n },\n \"输出字段\": {\n \"账号状态\": [\"状态\", \"值\"],\n \"账号类型\": [\"账号类型\", \"值\", \"是否可用\", \"已开通数量\", \"限制数量\"],\n \"职级\": [\"职级ID\", \"职级\", \"成员类型\", \"状态\"],\n \"直属上级\": [\"用户ID\", \"姓名\", \"用户名\", \"手机号\", \"账号状态\"],\n \"所属部门\": [\"部门ID\", \"部门名称\", \"上级部门ID\", \"部门路径\"],\n },\n \"示例\": [\n \"alpha-classic-cli user ranks --keyword 合伙人 --limit 20\",\n \"alpha-classic-cli user managers --keyword 张三 --limit 20\",\n \"alpha-classic-cli user departments --keyword 北京 --limit 20\",\n ],\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 \"除 capabilities 明确声明的 task create、task update-detail、task complete、task uncomplete/task restart、task assignee set/task attendee set、task comment add/delete、task checkitem add/delete/complete/uncomplete、timing create 外,默认只支持查询,不执行写操作。\",\n \"不要输出 token。\",\n \"不要自行拼接后端接口,除非用户明确要求使用 api 调试命令。\",\n \"优先使用 capabilities 中声明的稳定业务命令。\",\n \"需要切换环境时使用 alpha-classic-cli env use,并在切换后重新登录。\",\n ],\n });\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport {\n DEFAULT_ENVIRONMENT_NAME,\n type EnvironmentName,\n} 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 alphaClawSkillPaths?: string[];\n alphaClawSkillPath?: string;\n alphaClawSkillInstalled?: boolean;\n}\n\nexport type AgentInstallTarget = \"codex\" | \"claude\" | \"alphaclaw\" | \"all\";\n\ninterface AgentGuideOptions {\n agent?: AgentInstallTarget;\n homeDir?: string;\n /**\n * 保留旧调用方传入的环境字段。AlphaClaw 现在不再按当前 CLI 环境安装,\n * 而是写入所有已经存在的 AlphaClaw workspace。\n */\n environmentName?: EnvironmentName;\n}\n\n/**\n * AlphaClaw 三套隔离 workspace 的 skills 根目录。\n *\n * 只安装到已经存在的 workspace,避免用户没有安装某个 AlphaClaw 环境时\n * 被 CLI 被动创建空目录。\n */\nconst ALPHA_CLAW_SKILL_ROOTS = [\n \".openclaw-devalphaclaw/workspace/skills\",\n \".openclaw-testalphaclaw/workspace/skills\",\n \".openclaw-alphaclaw/workspace/skills\",\n];\n\n/**\n * 旧版本写入过的顶层 skill 名称。\n */\nconst LEGACY_SKILL_NAMES = [\"alpha-classic-cli\"];\n\nexport function resolveCodexSkillPath(homeDir = os.homedir()): string {\n return path.join(homeDir, \".codex\", \"skills\", SKILL_NAME);\n}\n\n/**\n * 解析旧版本 Codex skill 目录,用于安装新目录前清理历史残留。\n *\n * @param homeDir 用户 home 目录\n * @returns 旧版本 skill 目录集合\n */\nfunction resolveLegacyCodexSkillPaths(homeDir = os.homedir()): string[] {\n return LEGACY_SKILL_NAMES.map((skillName) =>\n path.join(homeDir, \".codex\", \"skills\", skillName),\n );\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(\n homeDir = os.homedir(),\n environmentName: EnvironmentName = DEFAULT_ENVIRONMENT_NAME,\n): string {\n const environmentRoots: Record<Exclude<EnvironmentName, \"local\">, string> = {\n dev: \".openclaw-devalphaclaw/workspace/skills\",\n test: \".openclaw-testalphaclaw/workspace/skills\",\n prod: \".openclaw-alphaclaw/workspace/skills\",\n };\n const skillRoot =\n environmentName === \"local\" ? environmentRoots.prod : environmentRoots[environmentName];\n return path.join(\n homeDir,\n skillRoot,\n SKILL_NAME,\n );\n}\n\n/**\n * 解析 AlphaClaw 所有候选 skill 目录。\n *\n * @param homeDir 用户 home 目录\n * @returns 三套 AlphaClaw workspace 下的目标 skill 目录\n */\nexport function resolveAlphaClawSkillPaths(homeDir = os.homedir()): string[] {\n return ALPHA_CLAW_SKILL_ROOTS.map((skillRoot) =>\n path.join(homeDir, skillRoot, SKILL_NAME),\n );\n}\n\n/**\n * 解析 AlphaClaw 已经存在的 workspace skills 根目录。\n *\n * @param homeDir 用户 home 目录\n * @returns 已存在的 AlphaClaw skills 根目录集合\n */\nasync function resolveExistingAlphaClawSkillRoots(homeDir = os.homedir()): Promise<string[]> {\n const skillRoots = ALPHA_CLAW_SKILL_ROOTS.map((skillRoot) =>\n path.join(homeDir, skillRoot),\n );\n const existingRoots: string[] = [];\n for (const skillRoot of skillRoots) {\n try {\n const stat = await fs.stat(skillRoot);\n if (stat.isDirectory()) {\n existingRoots.push(skillRoot);\n }\n } catch (error) {\n const nodeError = error as NodeJS.ErrnoException;\n if (nodeError.code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n return existingRoots;\n}\n\n/**\n * 清理指定 skills 根目录下旧版本写入过的 skill。\n *\n * @param skillRoot skills 根目录\n */\nasync function removeLegacySkillDirs(skillRoot: string): Promise<void> {\n await Promise.all(\n LEGACY_SKILL_NAMES.map((skillName) =>\n fs.rm(path.join(skillRoot, skillName), { recursive: true, force: true }),\n ),\n );\n}\n\nexport async function installAgentGuides(options?: AgentGuideOptions): 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 installAlphaClawSkills(options);\n result.alphaClawSkillPaths = alphaClawResult.alphaClawSkillPaths;\n result.alphaClawSkillPath = alphaClawResult.alphaClawSkillPath;\n result.alphaClawSkillInstalled = alphaClawResult.alphaClawSkillInstalled;\n }\n\n return result;\n}\n\nexport async function uninstallAgentGuides(options?: AgentGuideOptions): 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 await Promise.all(\n resolveLegacyCodexSkillPaths(options?.homeDir).map((skillPath) =>\n fs.rm(skillPath, { recursive: true, force: true }),\n ),\n );\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 const alphaClawSkillPaths = resolveAlphaClawSkillPaths(options?.homeDir);\n await Promise.all(\n alphaClawSkillPaths\n .concat(\n ALPHA_CLAW_SKILL_ROOTS.flatMap((skillRoot) =>\n LEGACY_SKILL_NAMES.map((skillName) =>\n path.join(options?.homeDir ?? os.homedir(), skillRoot, skillName),\n ),\n ),\n )\n .map((skillPath) => fs.rm(skillPath, { recursive: true, force: true })),\n );\n result.alphaClawSkillPaths = alphaClawSkillPaths;\n result.alphaClawSkillPath = alphaClawSkillPaths[0];\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 Promise.all(\n resolveLegacyCodexSkillPaths(options?.homeDir).map((legacySkillPath) =>\n fs.rm(legacySkillPath, { recursive: true, force: true }),\n ),\n );\n await copyDirectory(SKILL_TEMPLATE_ROOT, skillPath);\n return {\n codexSkillPath: skillPath,\n codexSkillInstalled: true,\n };\n}\n\nexport async function installAlphaClawSkills(options?: {\n homeDir?: string;\n}): Promise<InstallState> {\n const homeDir = options?.homeDir ?? os.homedir();\n const skillRoots = await resolveExistingAlphaClawSkillRoots(homeDir);\n const skillPaths: string[] = [];\n for (const skillRoot of skillRoots) {\n const skillPath = path.join(skillRoot, SKILL_NAME);\n // AlphaClaw 按环境隔离 workspace,只替换 CLI 托管的 skill,避免影响用户自建 skill。\n await fs.rm(skillPath, { recursive: true, force: true });\n await removeLegacySkillDirs(skillRoot);\n await copyDirectory(SKILL_TEMPLATE_ROOT, skillPath);\n skillPaths.push(skillPath);\n }\n return {\n codexSkillPath: resolveCodexSkillPath(options?.homeDir),\n codexSkillInstalled: false,\n alphaClawSkillPaths: skillPaths,\n alphaClawSkillPath: skillPaths[0],\n alphaClawSkillInstalled: skillPaths.length > 0,\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 environmentName?: EnvironmentName;\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(\n options?.homeDir,\n options?.environmentName,\n );\n const alphaClawSkillPaths = resolveAlphaClawSkillPaths(options?.homeDir);\n const installedAlphaClawSkillPaths: string[] = [];\n let alphaClawSkillInstalled = false;\n for (const skillPath of alphaClawSkillPaths) {\n try {\n await fs.access(path.join(skillPath, \"SKILL.md\"));\n installedAlphaClawSkillPaths.push(skillPath);\n } catch {\n // 某个 AlphaClaw 环境未安装当前 skill 时继续检查其它环境。\n }\n }\n alphaClawSkillInstalled = installedAlphaClawSkillPaths.length > 0;\n\n return {\n codexSkillPath: skillPath,\n codexSkillInstalled: installed,\n claudeGuidePath,\n claudeGuideInstalled,\n claudeMemoryPath: resolveClaudeMemoryPath(options?.homeDir),\n alphaClawSkillPaths: installedAlphaClawSkillPaths,\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\";\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 { getCurrentEnvironmentPreset } 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 userId?: string;\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 = await getCurrentEnvironmentPreset(sessionStore);\n const installState = await inspectInstallState({\n environmentName: environment.name,\n });\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 同时承担轻量级会话修复:旧版本保存过 userName/tenantId,\n // 当前用户接口成功后用 Alpha 返回的权威身份字段刷新本地 session。\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: false,\n source: environment.source,\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 =\n currentUserData.userId ?? currentUserData.accid ?? currentUserData.id ?? currentUserData.user_id ?? jwtClaims?.user_id;\n const { siteId: _siteId, siteName: _siteName, ...currentSessionWithoutLegacySite } = legacySession;\n // 保留 token 和有效期上下文,只用 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 getCurrentEnvironmentPreset,\n getEnvironmentPresetOrThrow,\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 const currentEnvironment = await getCurrentEnvironmentPreset(sessionStore);\n printSuccess(listEnvironmentPresets(), {\n count: listEnvironmentPresets().length,\n current: currentEnvironment.name,\n });\n return;\n }\n\n if (normalizedAction === \"current\") {\n const currentEnvironment = await getCurrentEnvironmentPreset(sessionStore);\n printSuccess({\n environment: currentEnvironment.name,\n label: currentEnvironment.label,\n baseUrl: currentEnvironment.baseUrl,\n apiBaseUrl: currentEnvironment.apiBaseUrl,\n locked: false,\n source: currentEnvironment.source,\n configPath: sessionStore.configPath,\n });\n return;\n }\n\n if (normalizedAction === \"use\") {\n if (!name?.trim()) {\n throw new Error(\"Missing environment name. Use: alpha-classic-cli env use <local|dev|test|prod>\");\n }\n const nextEnvironment = getEnvironmentPresetOrThrow(name);\n await sessionStore.saveConfig({\n environment: nextEnvironment.name,\n baseUrl: nextEnvironment.baseUrl,\n apiBaseUrl: nextEnvironment.apiBaseUrl,\n });\n await sessionStore.clearAuthState();\n printSuccess({\n environment: nextEnvironment.name,\n label: nextEnvironment.label,\n baseUrl: nextEnvironment.baseUrl,\n apiBaseUrl: nextEnvironment.apiBaseUrl,\n locked: false,\n source: \"config\",\n session: \"cleared\",\n hint: \"环境已切换,请重新执行 alpha-classic-cli login。\",\n configPath: sessionStore.configPath,\n });\n return;\n }\n throw new Error(`Unknown env action: ${normalizedAction}`);\n}\n","import { normalizeBaseUrl } from \"./base-url.js\";\n\n// 前端仍是 hash 路由。这里集中生成 Alpha Web 可点击链接,避免各业务模块散落拼接。\n// permission 来自项目列表/详情路由,前端缺省时会按 U 进入普通项目权限入口。\n\nconst DEFAULT_MATTER_PERMISSION = \"U\";\n\nexport function buildMatterOverviewUrl(baseUrl: string, matterId: string, permission?: string): string {\n return buildMatterTabUrl(baseUrl, matterId, \"statusV2\", permission);\n}\n\nexport function buildMatterFinanceUrl(baseUrl: string, matterId: string, permission?: string): string {\n return buildMatterTabUrl(baseUrl, matterId, \"financeV2\", permission);\n}\n\nexport function buildMatterTaskUrl(baseUrl: string, matterId: string, permission?: string): string {\n return buildMatterTabUrl(baseUrl, matterId, \"task\", permission);\n}\n\nexport function buildMatterLinks(baseUrl: string, matterId: string, permission?: string): Record<string, string> {\n return {\n \"项目概览\": buildMatterOverviewUrl(baseUrl, matterId, permission),\n \"项目财务\": buildMatterFinanceUrl(baseUrl, matterId, permission),\n \"项目任务\": buildMatterTaskUrl(baseUrl, matterId, permission),\n };\n}\n\nexport function buildTaskShareUrl(baseUrl: string, taskId: string): string {\n return `${normalizeBaseUrl(baseUrl)}/third/task-share-link/index.html?id=${encodeURIComponent(taskId)}`;\n}\n\nexport type FinanceRouteType =\n | \"overview\"\n | \"contract\"\n | \"invoice\"\n | \"income\"\n | \"bill\"\n | \"expense\"\n | \"reimburse\";\n\nexport function buildFinanceRouteUrl(baseUrl: string, route: FinanceRouteType): string {\n const pathByRoute: Record<FinanceRouteType, string> = {\n overview: \"/#/app/financialV2/financialbrowseV3\",\n contract: \"/#/app/financialV2/contract\",\n invoice: \"/#/app/financialV2/invoice?type=my\",\n income: \"/#/app/financialV2/income\",\n bill: \"/#/app/financialV2/bill\",\n expense: \"/#/app/financialV2/expense/management\",\n reimburse: \"/#/app/financialV2/reimbursement\",\n };\n return `${normalizeBaseUrl(baseUrl)}${pathByRoute[route]}`;\n}\n\nexport function buildFinanceModuleLinks(baseUrl: string): Record<string, string> {\n return {\n \"总览\": buildFinanceRouteUrl(baseUrl, \"overview\"),\n \"合同\": buildFinanceRouteUrl(baseUrl, \"contract\"),\n \"发票\": buildFinanceRouteUrl(baseUrl, \"invoice\"),\n \"收款\": buildFinanceRouteUrl(baseUrl, \"income\"),\n \"账单\": buildFinanceRouteUrl(baseUrl, \"bill\"),\n \"费用\": buildFinanceRouteUrl(baseUrl, \"expense\"),\n \"报销\": buildFinanceRouteUrl(baseUrl, \"reimburse\"),\n };\n}\n\nfunction buildMatterTabUrl(baseUrl: string, matterId: string, tab: string, permission?: string): string {\n const normalizedPermission = permission?.trim() || DEFAULT_MATTER_PERMISSION;\n return `${normalizeBaseUrl(baseUrl)}/#/app/matter/find/${encodeURIComponent(matterId)}/${encodeURIComponent(normalizedPermission)}/${tab}`;\n}\n","import { getCurrentEnvironmentPreset } from \"../../config/environments.js\";\nimport { ApiClient } from \"../../http/api-client.js\";\nimport { printSuccess } from \"../../output/envelope.js\";\nimport type { SessionStore } from \"../../session/store.js\";\nimport {\n buildFinanceModuleLinks,\n buildFinanceRouteUrl,\n buildMatterFinanceUrl,\n buildMatterLinks,\n type FinanceRouteType,\n} from \"../../util/alpha-links.js\";\nimport type {\n AlphaFinancePage,\n AlphaFinanceRecord,\n AlphaFinanceResponse,\n FinanceDepartmentsOptions,\n FinanceDetailOptions,\n FinanceListOptions,\n FinanceOverviewOptions,\n FinanceResourceType,\n FinanceSummaryOptions,\n NormalizedFinancePage,\n} from \"./types.js\";\n\n// finance 是财务顶级模块。当前只开放查询:\n// 1. 项目-财务页:传 --matter-id 时,优先使用 matterFinance 系列接口,和项目详情页一致。\n// 2. 顶级财务模块:不传 --matter-id 时,使用 financialV2Service 里的财务总模块列表接口。\n\nconst RECEIVABLE_MODE_TEXT: Record<string, string> = {\n INVOICE_VALUE_SUBTRACT_INCOMES: \"已开票金额 - 已收金额\",\n CONTRACT_SUBTRACT_INCOMES: \"合同金额 - 已收金额\",\n BILL_AMOUNT_SUBTRACT_INCOMES: \"账单总和 - 已收金额\",\n};\n\nconst OVERVIEW_MONEY_METRICS: Array<{\n field: string;\n label: string;\n description: string;\n}> = [\n {\n field: \"receivables\",\n label: \"应收款金额\",\n description: \"【合同管理】内所有合同应收额总和。\",\n },\n {\n field: \"unallocatedMoney\",\n label: \"未分配金额\",\n description: \"分配/【项目分配】内所有状态为非“分配完成”数据的“未分配金额”总和。\",\n },\n {\n field: \"spend\",\n label: \"费用总额\",\n description: \"【费用管理】内所有“费用金额”总和。\",\n },\n {\n field: \"todayIncome\",\n label: \"今日收款\",\n description: \"【收款管理】内所有“收款日期”等于当前服务器日期的收款金额总和。\",\n },\n {\n field: \"unclaimed\",\n label: \"未认领金额\",\n description: \"【收款管理】内所有认领状态为“未认领”或为空的“收款金额”总和。\",\n },\n {\n field: \"todayInvoice\",\n label: \"今日开票金额\",\n description: \"【发票管理】内所有“开票日期”等于当前服务器日期的发票金额总和。\",\n },\n {\n field: \"entry\",\n label: \"已入账总额\",\n description: \"【分配管理】内状态为“已入账”的金额总和。\",\n },\n {\n field: \"unEntry\",\n label: \"未入账总额\",\n description: \"【分配管理】内状态为“未入账”的金额总和。\",\n },\n];\n\nconst OVERVIEW_NODE_METRICS: Array<{ field: string; label: string }> = [\n { field: \"unclaimedCount\", label: \"未认领款项\" },\n { field: \"allocatingMatterCount\", label: \"未分配完成项目数\" },\n { field: \"reimbursePendingCount\", label: \"报销待结算项\" },\n { field: \"receivablesMatterCount\", label: \"应收款合同数\" },\n { field: \"contractUnstampCount\", label: \"未盖章合同数\" },\n { field: \"contractUnarchiveCount\", label: \"未归档合同数\" },\n { field: \"invoiceToOpenCount\", label: \"待开发票数量\" },\n { field: \"invoiceToReceiveCount\", label: \"待领取发票数\" },\n];\n\nexport async function runFinanceDepartments(\n options: FinanceDepartmentsOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createFinanceClient(sessionStore);\n const limit = clampLimit(options.limit ?? 50);\n const keyword = normalizeText(options.keyword);\n const response = await client.requestRaw<AlphaFinanceResponse<Record<string, unknown>> | Record<string, unknown>>(\n \"GET\",\n \"/ilaw/api/v2/permission/department/allDepartment\",\n );\n ensureFinanceSuccess(response, \"Finance department list request failed.\");\n const root = unwrapFinanceData<Record<string, unknown>>(response) ?? (response as Record<string, unknown>);\n const departments = flattenDepartments(root)\n .filter((item) => !keyword || String(item[\"部门名称\"] ?? \"\").includes(keyword))\n .slice(0, limit);\n\n printSuccess({\n \"范围\": \"财务总览所属团队\",\n \"接口\": \"GET /ilaw/api/v2/permission/department/allDepartment\",\n \"总数\": departments.length,\n \"部门列表\": departments,\n });\n}\n\nexport async function runFinanceOverview(\n options: FinanceOverviewOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = await createFinanceClient(sessionStore);\n const departmentId = normalizeText(options.departmentId);\n const trendDate = normalizeFinanceTrendDate(options.date);\n const requestOptions = {\n params: removeUndefinedProperties({\n departmentId,\n }),\n };\n\n // 对齐前端 financialbrowseV3 总览页:金额卡和关键节点卡来自 summary/total。\n const totalResponse = await client.requestRaw<AlphaFinanceResponse<Record<string, unknown>> | Record<string, unknown>>(\n \"GET\",\n \"/finance/api/integration/v1/summary/total\",\n requestOptions,\n );\n ensureFinanceSuccess(totalResponse, \"Finance overview request failed.\");\n const totalData = unwrapFinanceData<Record<string, unknown>>(totalResponse) ?? {};\n\n // 顶部“提醒信息”来自旧财务总览服务;不影响总览主数据,所以失败时只记录不可用。\n const remindData = await requestFinanceOverviewReminds(client);\n const trendData = await requestFinanceOverviewTrend(client, {\n departmentId,\n date: trendDate,\n });\n\n printSuccess({\n \"范围\": \"律所财务总览\",\n \"所属团队ID\": departmentId ?? \"全部\",\n \"页面链接\": buildFinanceRouteUrl(environment.baseUrl, \"overview\"),\n \"财务模块链接\": buildFinanceModuleLinks(environment.baseUrl),\n \"提醒信息\": extractReminderCount(remindData),\n \"金额指标\": Object.fromEntries(\n OVERVIEW_MONEY_METRICS.map((metric) => [metric.label, pickAmount(totalData, [metric.field])]),\n ),\n \"关键节点\": Object.fromEntries(\n OVERVIEW_NODE_METRICS.map((metric) => [metric.label, firstNumber(totalData, [metric.field]) ?? 0]),\n ),\n \"收入走势图\": {\n \"月份参数\": trendDate,\n \"说明\": \"近6个月的收款总额,单位:万元;对齐前端财务总览页收入走势图。\",\n \"数据\": normalizeTrendData(trendData),\n },\n \"指标说明\": Object.fromEntries(OVERVIEW_MONEY_METRICS.map((metric) => [metric.label, metric.description])),\n });\n}\n\nexport async function runFinanceSummary(\n options: FinanceSummaryOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = await createFinanceClient(sessionStore);\n const matterId = requireText(options.matterId, \"--matter-id\");\n\n // 对齐项目-财务顶部概览:financeV2Service.getMatterChargeCards。\n const response = await client.requestRaw<AlphaFinanceResponse<Record<string, unknown>> | Record<string, unknown>>(\n \"GET\",\n `/finance/api/integration/v1/statistics/matterOverview/${encodeURIComponent(matterId)}`,\n );\n ensureFinanceSuccess(response, \"Finance summary request failed.\");\n const data = unwrapFinanceData<Record<string, unknown>>(response) ?? {};\n const mode = firstString(data, [\n \"receivableComputeModeEnum\",\n \"receivableMode\",\n \"receiveComputeMode\",\n \"computeMode\",\n ]);\n\n printSuccess({\n \"范围\": \"项目财务汇总\",\n \"项目ID\": matterId,\n \"页面链接\": buildMatterFinanceUrl(environment.baseUrl, matterId),\n \"项目链接\": buildMatterLinks(environment.baseUrl, matterId),\n \"合同总额\": pickAmount(data, [\"collectionAmount\", \"contractAmount\", \"estimatedContractAmount\"]),\n \"发票总额\": pickAmount(data, [\"invoiceAmount\", \"invoiceValue\"]),\n \"收款总额\": pickAmount(data, [\"incomeAmount\", \"receiveAmount\", \"receivedAmount\"]),\n \"标的总额\": pickAmount(data, [\"targetAmount\", \"subjectAmount\", \"matterTargetAmount\"]),\n \"账单总额\": pickAmount(data, [\"billAmount\"]),\n \"费用总额\": pickAmount(data, [\"expenseAmount\", \"spendAmount\", \"amountOfMoney\"]),\n \"应收总额\": pickAmount(data, [\"receiveAmount\", \"receivableAmount\", \"unReceivable\"]),\n \"应收总额计算方式\": mode\n ? (RECEIVABLE_MODE_TEXT[mode] ?? mode)\n : \"由项目财务设置决定,前端支持:已开票金额 - 已收金额、合同金额 - 已收金额、账单总和 - 已收金额。\",\n });\n}\n\nexport async function runFinanceList(\n resource: FinanceResourceType,\n options: FinanceListOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = await createFinanceClient(sessionStore);\n const matterId = normalizeText(options.matterId);\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 20);\n const keyword = normalizeText(options.keyword);\n\n const response = matterId\n ? await requestMatterFinanceList(client, resource, matterId)\n : await requestGlobalFinanceList(client, resource, {\n page,\n limit,\n keyword,\n status: normalizeText(options.status),\n type: normalizeText(options.type),\n });\n\n ensureFinanceSuccess(response, `Finance ${resource} list request failed.`);\n const normalized = normalizeFinancePage(response, page, limit);\n const items = matterId ? normalized.items.slice((page - 1) * limit, page * limit) : normalized.items;\n\n printSuccess({\n \"范围\": matterId ? `项目财务-${resourceLabel(resource)}` : `财务模块-${resourceLabel(resource)}`,\n \"项目ID\": matterId ?? \"\",\n \"页面链接\": matterId ? buildMatterFinanceUrl(environment.baseUrl, matterId) : buildFinanceRouteUrl(environment.baseUrl, financeRouteForResource(resource)),\n \"财务模块链接\": matterId ? {} : buildFinanceModuleLinks(environment.baseUrl),\n \"筛选\": {\n \"关键词\": keyword ?? \"\",\n \"状态\": normalizeText(options.status) ?? \"\",\n \"类型\": normalizeText(options.type) ?? \"\",\n },\n \"总数\": normalized.total,\n \"页码\": page,\n \"每页数量\": limit,\n \"小计\": extractFinanceTotal(normalized.raw, resource),\n [`${resourceLabel(resource)}列表`]: items.map((item) => toFinanceSummary(resource, item, environment.baseUrl)),\n });\n}\n\nexport async function runFinanceDetail(\n resource: FinanceResourceType,\n options: FinanceDetailOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = await createFinanceClient(sessionStore);\n const id = requireText(options.id, \"--id\");\n const response = await client.requestRaw<AlphaFinanceResponse<AlphaFinanceRecord> | AlphaFinanceRecord>(\n \"GET\",\n detailPath(resource, id),\n );\n ensureFinanceSuccess(response, `Finance ${resource} detail request failed.`);\n const data = unwrapFinanceData<AlphaFinanceRecord>(response) ?? (response as AlphaFinanceRecord);\n\n const matterId = normalizeText(options.matterId) ?? normalizeRecordId(data.matterId ?? data.matterPkId);\n printSuccess({\n \"范围\": `${resourceLabel(resource)}详情`,\n \"类型\": resourceLabel(resource),\n \"ID\": id,\n \"项目ID\": matterId ?? \"\",\n \"页面链接\": matterId ? buildMatterFinanceUrl(environment.baseUrl, matterId) : buildFinanceRouteUrl(environment.baseUrl, financeRouteForResource(resource)),\n \"详情\": toFinanceDetail(resource, data),\n });\n}\n\nasync function createFinanceClient(sessionStore: SessionStore): Promise<ApiClient> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n return new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n}\n\nasync function requestFinanceOverviewReminds(client: ApiClient): Promise<Record<string, unknown> | undefined> {\n try {\n const response = await client.requestRaw<AlphaFinanceResponse<Record<string, unknown>> | Record<string, unknown>>(\n \"GET\",\n \"/finance/api/integration/v1/finance/overview/reminds\",\n );\n ensureFinanceSuccess(response, \"Finance overview remind request failed.\");\n return unwrapFinanceData<Record<string, unknown>>(response) ?? (response as Record<string, unknown>);\n } catch {\n return undefined;\n }\n}\n\nasync function requestFinanceOverviewTrend(\n client: ApiClient,\n options: { departmentId?: string; date: string },\n): Promise<unknown> {\n const response = await client.requestRaw<AlphaFinanceResponse<unknown> | unknown>(\n \"GET\",\n \"/finance/api/integration/v1/summary/trend\",\n {\n params: removeUndefinedProperties({\n departmentId: options.departmentId,\n date: options.date,\n }),\n },\n );\n ensureFinanceSuccess(response, \"Finance overview trend request failed.\");\n return unwrapFinanceData<unknown>(response) ?? response;\n}\n\nasync function requestMatterFinanceList(\n client: ApiClient,\n resource: FinanceResourceType,\n matterId: string,\n): Promise<AlphaFinanceResponse<AlphaFinancePage> | AlphaFinancePage> {\n // 项目-财务页各卡片接口无分页参数,前端取全量后渲染;CLI 在本地做 page/limit 截取。\n switch (resource) {\n case \"contract\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/matterFinance/contracts/${encodeURIComponent(matterId)}`, {\n params: { excludeApprove: false },\n });\n case \"invoice\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/matterFinance/invoices/Children/${encodeURIComponent(matterId)}`);\n case \"income\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/matterFinance/incomes/${encodeURIComponent(matterId)}`);\n case \"expense\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/matterFinance/spends/${encodeURIComponent(matterId)}`);\n case \"bill\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/matterFinance/bills/${encodeURIComponent(matterId)}`);\n case \"reimburse\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/matterFinance/reimburse/${encodeURIComponent(matterId)}`);\n }\n}\n\nasync function requestGlobalFinanceList(\n client: ApiClient,\n resource: FinanceResourceType,\n options: {\n page: number;\n limit: number;\n keyword?: string;\n status?: string;\n type?: string;\n },\n): Promise<AlphaFinanceResponse<AlphaFinancePage> | AlphaFinancePage> {\n const commonParams = removeUndefinedProperties({\n pageIndex: options.page,\n pageSize: options.limit,\n keyword: options.keyword,\n queryString: options.keyword,\n searchValue: options.keyword,\n status: options.status,\n });\n switch (resource) {\n case \"contract\":\n return client.requestRaw(\"POST\", \"/finance/api/integration/v2/contracts\", {\n data: commonParams,\n });\n case \"invoice\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v2/${parseGlobalInvoiceType(options.type)}/invoices`, {\n params: buildGlobalInvoiceParams(options),\n });\n case \"income\":\n return client.requestRaw(\"GET\", \"/finance/api/integration/v2/incomes\", {\n params: commonParams,\n });\n case \"expense\":\n return client.requestRaw(\"GET\", \"/finance/api/integration/v1/spend/list\", {\n params: commonParams,\n });\n case \"bill\":\n return client.requestRaw(\"GET\", \"/finance/api/integration/v2/bills\", {\n params: commonParams,\n });\n case \"reimburse\":\n return client.requestRaw(\"GET\", `/finance/api/integration/v1/reimburse/${parseGlobalReimburseType(options.type)}/search`, {\n params: buildGlobalReimburseParams(options),\n });\n }\n}\n\nfunction parseGlobalInvoiceType(value: string | undefined): \"my\" | \"open\" | \"manage\" {\n const normalized = value?.trim().toLowerCase();\n if (!normalized || normalized === \"申请\" || normalized === \"发票申请\" || normalized === \"my\") {\n return \"my\";\n }\n if (normalized === \"open\" || normalized === \"开票\" || normalized === \"财务开票\") {\n return \"open\";\n }\n if (normalized === \"manage\" || normalized === \"管理\" || normalized === \"发票管理\") {\n return \"manage\";\n }\n throw new Error(\"finance invoice list --type only supports my, open, manage.\");\n}\n\nfunction buildGlobalInvoiceParams(options: {\n page: number;\n limit: number;\n keyword?: string;\n status?: string;\n type?: string;\n}): Record<string, unknown> {\n const type = parseGlobalInvoiceType(options.type);\n return removeUndefinedProperties({\n pageIndex: options.page,\n pageSize: options.limit,\n queryString: options.keyword,\n status: parseInvoiceStatus(options.status, type),\n });\n}\n\nfunction parseInvoiceStatus(status: string | undefined, type: \"my\" | \"open\" | \"manage\"): string | undefined {\n const normalized = status?.trim();\n if (normalized && normalized !== \"all\" && normalized !== \"全部\") {\n return normalized;\n }\n if (type === \"open\") {\n return \"4,5,-5,-6\";\n }\n if (type === \"manage\") {\n return \"5,6\";\n }\n return undefined;\n}\n\nfunction parseGlobalReimburseType(value: string | undefined): \"myReimburse\" | \"settlement\" {\n const normalized = value?.trim();\n if (\n !normalized ||\n normalized === \"all\" ||\n normalized === \"全部\" ||\n normalized === \"myReimburse\" ||\n normalized === \"my\" ||\n normalized === \"申请\" ||\n normalized === \"报销申请\"\n ) {\n return \"myReimburse\";\n }\n if (normalized === \"settlement\" || normalized === \"结算\" || normalized === \"报销结算\") {\n return \"settlement\";\n }\n throw new Error(\"finance reimburse list --type only supports myReimburse, settlement, all.\");\n}\n\nfunction buildGlobalReimburseParams(options: {\n page: number;\n limit: number;\n keyword?: string;\n status?: string;\n type?: string;\n}): Record<string, unknown> {\n const type = parseGlobalReimburseType(options.type);\n return removeUndefinedProperties({\n pageIndex: options.page,\n pageSize: options.limit,\n searchContent: options.keyword,\n status: parseReimburseStatus(options.status, type),\n handler: [],\n createUsers: [],\n departments: [],\n mustMatterIds: [],\n reimburseType: null,\n });\n}\n\nfunction parseReimburseStatus(status: string | undefined, type: \"myReimburse\" | \"settlement\"): string | undefined {\n const normalized = status?.trim();\n if (normalized && normalized !== \"all\" && normalized !== \"全部\") {\n return normalized;\n }\n if (type === \"settlement\") {\n return \"2,3,-5,-6\";\n }\n return undefined;\n}\n\nfunction detailPath(resource: FinanceResourceType, id: string): string {\n const encodedId = encodeURIComponent(id);\n switch (resource) {\n case \"contract\":\n return `/finance/api/integration/v1/contracts/${encodedId}`;\n case \"invoice\":\n return `/finance/api/integration/v2/invoices/${encodedId}`;\n case \"income\":\n return `/finance/api/integration/v1/incomes/${encodedId}`;\n case \"expense\":\n return `/finance/api/integration/v1/spend/${encodedId}`;\n case \"bill\":\n return `/finance/api/integration/v1/bills/${encodedId}`;\n case \"reimburse\":\n return `/finance/api/integration/v1/reimburse/${encodedId}`;\n }\n}\n\nfunction normalizeFinancePage(\n response: AlphaFinanceResponse<AlphaFinancePage> | AlphaFinancePage | AlphaFinanceRecord[],\n page: number,\n pageSize: number,\n): NormalizedFinancePage {\n const raw = (\n unwrapFinanceData<AlphaFinancePage>(response) ??\n (Array.isArray(response) ? { data: response } : (response as AlphaFinancePage))\n );\n const items = firstArray(raw, [\"data\", \"items\", \"list\", \"entities\", \"content\", \"records\"]);\n return {\n items,\n total: firstNumber(raw, [\"total\", \"totalCount\", \"entityCount\", \"count\"]) ?? items.length,\n page: firstNumber(raw, [\"pageIndex\", \"pageNo\", \"No\"]) ?? page,\n pageSize: firstNumber(raw, [\"pageSize\", \"size\"]) ?? pageSize,\n raw,\n };\n}\n\nfunction extractFinanceTotal(raw: AlphaFinancePage, resource: FinanceResourceType): Record<string, unknown> {\n const totalFieldsByType: Record<FinanceResourceType, string[]> = {\n contract: [\"contractAmount\", \"receiveAmount\", \"balanceAmount\"],\n invoice: [\"invoiceAmount\", \"receivedAmount\", \"receivableAmount\"],\n income: [\"incomeAmount\", \"relateInvoiceAmount\", \"sumNoDispenseMoney\", \"sumDispensedMoney\"],\n expense: [\"amountOfMoney\", \"expenseAmount\"],\n bill: [\"amountOfMoney\", \"billAmount\"],\n reimburse: [\"amountOfMoney\", \"reimburseAmount\"],\n };\n return Object.fromEntries(\n totalFieldsByType[resource]\n .filter((field) => raw[field] !== undefined)\n .map((field) => [financeFieldLabel(field), raw[field]]),\n );\n}\n\nfunction toFinanceSummary(resource: FinanceResourceType, item: AlphaFinanceRecord, baseUrl: string): Record<string, unknown> {\n const matterId = normalizeRecordId(item.matterId ?? item.matterPkId);\n return removeUndefinedProperties({\n \"ID\": item.pkid ?? item.id ?? item.billId ?? item.reimburseId,\n \"项目ID\": matterId,\n \"项目名称\": item.matterName,\n \"项目财务页\": matterId ? buildMatterFinanceUrl(baseUrl, matterId) : \"\",\n \"名称\": financeName(resource, item),\n \"编号\": financeNumber(resource, item),\n \"金额\": financeAmount(resource, item),\n \"状态\": formatFinanceStatus(resource, item),\n \"日期\": financeDate(resource, item),\n });\n}\n\nfunction toFinanceDetail(resource: FinanceResourceType, item: AlphaFinanceRecord): Record<string, unknown> {\n const preferred = [\n \"matterName\",\n \"contractName\",\n \"contractNumber\",\n \"estimatedContractAmount\",\n \"invoiceTitle\",\n \"invoiceNumber\",\n \"invoiceNumbers\",\n \"invoiceValue\",\n \"incomeValue\",\n \"payerName\",\n \"billNumber\",\n \"billTotalMoney\",\n \"billTotalMoneyAfterDiscount\",\n \"amountOfMoney\",\n \"reimburseType\",\n \"reimburseAmount\",\n \"status\",\n \"statusName\",\n \"remark\",\n \"incomeDate\",\n \"invoiceDate\",\n \"billDate\",\n \"feeDate\",\n \"applyDate\",\n ];\n const entries = preferred\n .filter((field) => item[field] !== undefined && item[field] !== null && item[field] !== \"\")\n .map((field) => [financeFieldLabel(field), item[field]]);\n const primitiveEntries = Object.entries(item)\n .filter(([field, value]) => !preferred.includes(field) && isPrimitive(value))\n .slice(0, 30)\n .map(([field, value]) => [financeFieldLabel(field), value]);\n return Object.fromEntries([...entries, ...primitiveEntries]);\n}\n\nfunction financeName(resource: FinanceResourceType, item: AlphaFinanceRecord): unknown {\n switch (resource) {\n case \"contract\":\n return item.contractName ?? item.name;\n case \"invoice\":\n return item.invoiceTitle ?? item.invoiceNumber ?? item.invoiceNumbers;\n case \"income\":\n return item.payerName ?? item.name;\n case \"expense\":\n return item.expenseName ?? item.spendName ?? item.name;\n case \"bill\":\n return item.billNumber ?? item.name;\n case \"reimburse\":\n return item.reimburseName ?? item.name;\n }\n}\n\nfunction financeNumber(resource: FinanceResourceType, item: AlphaFinanceRecord): unknown {\n switch (resource) {\n case \"contract\":\n return item.contractNumber;\n case \"invoice\":\n return Array.isArray(item.invoiceNumbers) ? item.invoiceNumbers.join(\",\") : item.invoiceNumbers ?? item.invoiceNumber;\n case \"bill\":\n return item.billNumber;\n default:\n return undefined;\n }\n}\n\nfunction financeAmount(resource: FinanceResourceType, item: AlphaFinanceRecord): unknown {\n switch (resource) {\n case \"contract\":\n return item.estimatedContractAmount ?? item.contractAmount;\n case \"invoice\":\n return item.invoiceValue;\n case \"income\":\n return item.incomeValue;\n case \"expense\":\n return item.amountOfMoney;\n case \"bill\":\n return item.billTotalMoneyAfterDiscount ?? item.billTotalMoney ?? item.amountOfMoney;\n case \"reimburse\":\n return item.reimbursementAmount ?? item.reimburseAmount ?? item.amountOfMoney;\n }\n}\n\nfunction financeDate(resource: FinanceResourceType, item: AlphaFinanceRecord): unknown {\n switch (resource) {\n case \"invoice\":\n return Array.isArray(item.invoiceDates) ? item.invoiceDates.join(\",\") : item.invoiceDate;\n case \"income\":\n return item.incomeDate;\n case \"expense\":\n return item.feeDate;\n case \"bill\":\n return item.billDate;\n case \"reimburse\":\n return item.applyDate;\n case \"contract\":\n return item.gmtCreate ?? item.createTime;\n }\n}\n\nfunction formatFinanceStatus(resource: FinanceResourceType, item: AlphaFinanceRecord): unknown {\n if (item.statusName) return item.statusName;\n if (resource === \"contract\" && item.valid === false) return \"已删除\";\n const status = item.status;\n if (status === undefined || status === null || status === \"\") return undefined;\n const key = String(status);\n const statusMaps: Record<FinanceResourceType, Record<string, string>> = {\n contract: {\n \"0\": \"已失效\",\n \"1\": \"待审批\",\n \"2\": \"已驳回\",\n \"3\": \"已撤回\",\n \"4\": \"待盖章\",\n \"5\": \"待归档\",\n \"6\": \"已归档\",\n \"7\": \"已关闭\",\n \"8\": \"已作废\",\n \"9\": \"签署中\",\n },\n invoice: {\n \"-6\": \"财务拒绝-已重新发起\",\n \"-5\": \"财务拒绝-未重新发起\",\n \"1\": \"审批中\",\n \"2\": \"已驳回-未重新发起\",\n \"3\": \"已撤回-未重新发起\",\n \"4\": \"待开票\",\n \"5\": \"已开票\",\n \"6\": \"已作废\",\n \"7\": \"已撤回-已重新发起\",\n \"8\": \"已驳回-已重新发起\",\n },\n income: {},\n expense: {},\n bill: {\n \"0\": \"未到账\",\n \"1\": \"已到账\",\n },\n reimburse: {\n \"-6\": \"财务拒绝-已重新发起\",\n \"-5\": \"财务拒绝-未重新发起\",\n \"-4\": \"已驳回-已重新发起\",\n \"-3\": \"已撤回-已重新发起\",\n \"-2\": \"已驳回-未重新发起\",\n \"-1\": \"已撤回-未重新发起\",\n \"1\": \"审批中\",\n \"2\": \"已通过待结算\",\n \"3\": \"已结算\",\n \"4\": \"已结算\",\n },\n };\n return statusMaps[resource][key] ?? status;\n}\n\nfunction resourceLabel(resource: FinanceResourceType): string {\n return {\n contract: \"合同\",\n invoice: \"发票\",\n income: \"收款\",\n expense: \"费用\",\n bill: \"账单\",\n reimburse: \"报销\",\n }[resource];\n}\n\nfunction financeRouteForResource(resource: FinanceResourceType): Exclude<FinanceRouteType, \"overview\"> {\n switch (resource) {\n case \"contract\":\n return \"contract\";\n case \"invoice\":\n return \"invoice\";\n case \"income\":\n return \"income\";\n case \"expense\":\n return \"expense\";\n case \"bill\":\n return \"bill\";\n case \"reimburse\":\n return \"reimburse\";\n }\n}\n\nfunction financeFieldLabel(field: string): string {\n return {\n matterName: \"项目名称\",\n contractName: \"合同名称\",\n contractNumber: \"合同编号\",\n estimatedContractAmount: \"合同金额\",\n invoiceTitle: \"发票抬头\",\n invoiceNumber: \"发票编号\",\n invoiceNumbers: \"发票号码\",\n invoiceValue: \"发票金额\",\n incomeValue: \"收款金额\",\n payerName: \"付款方\",\n billNumber: \"账单编号\",\n billTotalMoney: \"账单金额\",\n billTotalMoneyAfterDiscount: \"折后账单金额\",\n amountOfMoney: \"金额\",\n reimburseType: \"报销类型\",\n reimburseAmount: \"报销金额\",\n status: \"状态\",\n statusName: \"状态\",\n remark: \"备注\",\n incomeDate: \"收款日期\",\n invoiceDate: \"开票日期\",\n billDate: \"账单日期\",\n feeDate: \"费用日期\",\n applyDate: \"申请日期\",\n contractAmount: \"合同金额\",\n receiveAmount: \"已收金额\",\n balanceAmount: \"余额\",\n invoiceAmount: \"发票金额\",\n receivedAmount: \"已收金额\",\n receivableAmount: \"应收金额\",\n relateInvoiceAmount: \"关联发票金额\",\n sumNoDispenseMoney: \"未分配金额\",\n sumDispensedMoney: \"已分配金额\",\n expenseAmount: \"费用金额\",\n billAmount: \"账单金额\",\n }[field] ?? field;\n}\n\nfunction ensureFinanceSuccess(response: unknown, fallbackMessage: string): void {\n if (!response || typeof response !== \"object\" || Array.isArray(response)) return;\n const record = response as AlphaFinanceResponse;\n const code = record.resultCode;\n const failed =\n record.isSuccess === false ||\n record.succeed === false ||\n (code !== undefined && code !== 200 && code !== \"200\" && code !== \"SUCCESS\");\n if (failed) {\n throw new Error(record.resultMsg ?? record.resultMess ?? record.message ?? fallbackMessage);\n }\n}\n\nfunction unwrapFinanceData<T>(response: unknown): T | undefined {\n if (!response || typeof response !== \"object\" || Array.isArray(response)) return undefined;\n const record = response as AlphaFinanceResponse<T>;\n return (record.data ?? record.result) as T | undefined;\n}\n\nfunction firstArray(source: AlphaFinancePage, keys: string[]): AlphaFinanceRecord[] {\n for (const key of keys) {\n const value = source[key];\n if (Array.isArray(value)) return value as AlphaFinanceRecord[];\n }\n return [];\n}\n\nfunction firstNumber(source: Record<string, unknown>, keys: string[]): number | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.trim() && !Number.isNaN(Number(value))) return Number(value);\n }\n return undefined;\n}\n\nfunction firstString(source: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction pickAmount(source: Record<string, unknown>, keys: string[]): unknown {\n for (const key of keys) {\n if (source[key] !== undefined && source[key] !== null && source[key] !== \"\") return source[key];\n }\n return \"0.00\";\n}\n\nfunction extractReminderCount(source: Record<string, unknown> | undefined): unknown {\n if (!source) return \"不可用\";\n const direct = firstNumber(source, [\"totalRemindCount\", \"total\", \"totalCount\", \"count\", \"remindCount\", \"todoCount\"]);\n if (direct !== undefined) return direct;\n const numericTotal = Object.values(source)\n .filter((value): value is number => typeof value === \"number\" && Number.isFinite(value))\n .reduce((sum, value) => sum + value, 0);\n return numericTotal || source;\n}\n\nfunction normalizeFinanceTrendDate(value: string | undefined): string {\n const trimmed = normalizeText(value);\n const date = trimmed ? parseFinanceMonth(trimmed) : new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n return `${year}-${month}-01 00:00:00`;\n}\n\nfunction parseFinanceMonth(value: string): Date {\n const match = value.match(/^(\\d{4})-(\\d{1,2})(?:-\\d{1,2})?/);\n if (!match) {\n throw new Error(\"--date must be YYYY-MM or YYYY-MM-DD.\");\n }\n const year = Number(match[1]);\n const month = Number(match[2]);\n if (!Number.isInteger(year) || !Number.isInteger(month) || month < 1 || month > 12) {\n throw new Error(\"--date must be YYYY-MM or YYYY-MM-DD.\");\n }\n return new Date(year, month - 1, 1);\n}\n\nfunction normalizeTrendData(value: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(value)) return [];\n const labels = Array.isArray(value[0]) ? value[0] : [];\n const amounts = Array.isArray(value[1]) ? value[1] : [];\n const length = Math.max(labels.length, amounts.length);\n return Array.from({ length }, (_, index) =>\n removeUndefinedProperties({\n \"月份\": labels[index],\n \"收款总额\": amounts[index],\n \"单位\": \"万元\",\n }),\n );\n}\n\nfunction flattenDepartments(root: Record<string, unknown>): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n const visit = (node: unknown, depth: number, parentId?: string): void => {\n if (!node || typeof node !== \"object\" || Array.isArray(node)) return;\n const record = node as Record<string, unknown>;\n const id = normalizeRecordId(record.id ?? record.pkid ?? record.departmentId);\n const name = firstString(record, [\"name\", \"departmentName\", \"dptName\"]);\n if (id && name) {\n result.push(\n removeUndefinedProperties({\n \"部门ID\": id,\n \"部门名称\": name,\n \"上级部门ID\": parentId,\n \"层级\": depth,\n }),\n );\n }\n const children = firstUnknownArray(record, [\"subDepartmentDTO\", \"children\", \"subDepartments\", \"departmentList\"]);\n for (const child of children) {\n visit(child, depth + 1, id ?? parentId);\n }\n };\n visit(root, 0);\n return result;\n}\n\nfunction firstUnknownArray(source: Record<string, unknown>, keys: string[]): unknown[] {\n for (const key of keys) {\n const value = source[key];\n if (Array.isArray(value)) return value;\n }\n return [];\n}\n\nfunction removeUndefinedProperties<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, item]) => item !== undefined && item !== null && item !== \"\"),\n ) as T;\n}\n\nfunction normalizeText(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction normalizeRecordId(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) return value.trim();\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return undefined;\n}\n\nfunction requireText(value: string | undefined, flag: string): string {\n const trimmed = normalizeText(value);\n if (!trimmed) throw new Error(`${flag} is required.`);\n return trimmed;\n}\n\nfunction clampPage(value: number): number {\n return Math.max(1, Math.floor(value));\n}\n\nfunction clampLimit(value: number): number {\n return Math.min(100, Math.max(1, Math.floor(value)));\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value);\n}\n","import { getCurrentEnvironmentPreset } from \"../../config/environments.js\";\nimport { ApiClient } from \"../../http/api-client.js\";\nimport { printSuccess } from \"../../output/envelope.js\";\nimport type { SessionStore } from \"../../session/store.js\";\nimport { buildMatterLinks } from \"../../util/alpha-links.js\";\n\n// 项目模块只负责项目搜索和项目详情。任务虽然经常带项目 ID 查询,\n// 但在 CLI 对外能力里属于顶级 task 模块,因此放到 commands/task 目录。\ninterface MatterSearchOptions {\n keyword?: string;\n limit?: number;\n page?: number;\n status?: string;\n scope?: string;\n matterTypeIds?: string;\n serviceStartFrom?: string;\n serviceStartTo?: string;\n serviceEndFrom?: string;\n serviceEndTo?: string;\n}\n\ninterface MatterDetailOptions {\n id: string;\n logs?: number;\n}\n\ninterface MatterTypesOptions {\n keyword?: string;\n limit?: number;\n}\n\ntype MatterSearchScope = \"all\" | \"followed\" | \"joined\";\n\ninterface MatterSearchTimeRange {\n startTime: string;\n endTime: string;\n siftMaxTime: string;\n}\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 AlphaMatterRoleResponse {\n data?: Array<{\n id?: string | number;\n name?: string;\n }>;\n}\n\ninterface AlphaMatterTypeResponse {\n isSuccess?: boolean;\n resultMsg?: string;\n data?: AlphaMatterTypeGroup[];\n}\n\ninterface AlphaMatterTypeGroup {\n parentMatterType?: {\n id?: string | number;\n name?: string;\n typeOfParentMatterType?: string | number;\n };\n subMatterTypes?: AlphaMatterTypeItem[];\n}\n\ninterface AlphaMatterTypeItem {\n id?: string | number;\n name?: string;\n parentId?: string | number;\n parentName?: string;\n typeOfParentMatterType?: string | number;\n}\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\n// 项目搜索命令。请求体尽量对齐前端项目列表,CLI 只把常用的关键字、\n// 状态、范围和分页暴露成参数,其他筛选保持前端默认值。\nexport async function runMatterSearch(\n options: MatterSearchOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\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 matterTypeIds = parseCommaSeparatedValues(options.matterTypeIds);\n const serviceStartRangeTime = buildMatterSearchTimeRange(options.serviceStartFrom, options.serviceStartTo);\n const serviceEndRangeTime = buildMatterSearchTimeRange(options.serviceEndFrom, options.serviceEndTo);\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 matterTypeIds,\n serviceStartRangeTime,\n serviceEndRangeTime,\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 \"项目类型ID列表\": scope === \"followed\" ? [] : matterTypeIds,\n \"服务开始时间\": scope === \"followed\" ? createEmptyTimeRange(formatLocalDate(new Date())) : serviceStartRangeTime,\n \"服务结束时间\": scope === \"followed\" ? createEmptyTimeRange(formatLocalDate(new Date())) : serviceEndRangeTime,\n \"总数\": responseData?.totalCount ?? projects.length,\n \"页码\": page,\n \"每页数量\": limit,\n \"展示字段\": displayedFields,\n \"项目状态统计\": (responseData?.matterStatusItems ?? []).map(toMatterStatusSummary),\n \"项目列表\": projects.map((project) => toMatterSummary(project, selectedFields, environment.baseUrl)),\n });\n}\n\n// 查询项目列表“更多筛选”里的项目类型树。返回的是子类型 ID,\n// 项目列表筛选时需要把这些 ID 传给 matter search --matter-type-ids。\nexport async function runMatterTypes(\n options: MatterTypesOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n const response = await client.request<AlphaMatterTypeResponse | AlphaMatterTypeGroup[]>(\n \"GET\",\n \"/matterserver/api/v2/matters/matterType/listTree\",\n );\n if (!Array.isArray(response) && response.isSuccess === false) {\n throw new Error(response.resultMsg ?? \"Matter type list request failed.\");\n }\n const groups = unwrapEnvelopeData<AlphaMatterTypeGroup[]>(response) ?? (Array.isArray(response) ? response : []);\n const flattened = flattenMatterTypes(groups);\n const keyword = options.keyword?.trim();\n const filtered = keyword\n ? flattened.filter((item) => `${item.name ?? \"\"}${item.parentName ?? \"\"}`.includes(keyword))\n : flattened;\n const limit = clampLimit(options.limit ?? 50);\n printSuccess({\n \"范围\": \"项目类型\",\n \"搜索词\": keyword ?? \"\",\n \"总数\": filtered.length,\n \"项目类型列表\": filtered.slice(0, limit).map(toMatterTypeSummary),\n });\n}\n\n// 项目详情命令。主体信息来自项目详情接口,最近动态来自 notice 动态接口;\n// 两者分开查询,方便用户通过 --logs 控制是否读取动态。\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 = await getCurrentEnvironmentPreset(sessionStore);\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n // 前端项目概览页的主体信息来自这个接口。CLI 详情命令也以它为准,\n // 最近动态只是附加信息,避免详情口径偏离前端页面。\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, environment.baseUrl),\n \"最近动态\": logs.map(toMatterLogSummary),\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 matterTypeIds: string[];\n serviceStartRangeTime: MatterSearchTimeRange;\n serviceEndRangeTime: MatterSearchTimeRange;\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 // “我关注的”页签和普通项目列表不是同一个筛选口径:\n // 前端只传 isView 和关键字,不传项目状态与高级筛选。这里保持一致。\n return {\n isView: true,\n matchedName: options.keyword.trim(),\n queryOrderPage,\n };\n }\n\n // 普通项目列表的请求体对齐前端默认筛选参数。CLI 目前只暴露少量易用参数,\n // 但仍显式写出后端默认值,避免以后加筛选条件时不小心改变原有查询语义。\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: options.matterTypeIds,\n serviceStartRangeTime: options.serviceStartRangeTime,\n serviceEndRangeTime: options.serviceEndRangeTime,\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 baseUrl: string,\n): Record<string, unknown> {\n const matterId = item.pkId ?? \"\";\n const summary: Record<string, unknown> = {\n \"项目ID\": matterId,\n \"项目名称\": item.name ?? \"\",\n \"项目状态\": item.statusName || formatMatterStatus(toNumber(item.status)),\n \"项目客户\": (item.clients ?? []).map((client) => client.clientName ?? \"\").filter(Boolean),\n \"项目类型\": formatMatterType(item),\n \"项目链接\": matterId ? buildMatterLinks(baseUrl, String(matterId), getMatterPermission(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 flattenMatterTypes(groups: AlphaMatterTypeGroup[]): Array<AlphaMatterTypeItem & { parentName?: string }> {\n return groups.flatMap((group) => {\n const parent = group.parentMatterType;\n return (group.subMatterTypes ?? []).map((item) => ({\n ...item,\n parentName: item.parentName ?? parent?.name ?? \"\",\n parentId: item.parentId ?? parent?.id ?? parent?.typeOfParentMatterType,\n }));\n });\n}\n\nfunction toMatterTypeSummary(item: AlphaMatterTypeItem & { parentName?: string }): Record<string, unknown> {\n return {\n \"项目类型ID\": item.id ?? \"\",\n \"项目类型\": item.name ?? \"\",\n \"父级项目类型\": item.parentName ?? \"\",\n \"父级ID\": item.parentId ?? item.typeOfParentMatterType ?? \"\",\n };\n}\n\nfunction toMatterDetailSummary(item: AlphaMatterDetailItem, baseUrl: string): Record<string, unknown> {\n const status = typeof item.status === \"number\" ? item.status : undefined;\n const level = typeof item.level === \"number\" ? item.level : undefined;\n const matterId = item.pkId ?? \"\";\n\n return {\n \"项目ID\": matterId,\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 \"项目链接\": matterId ? buildMatterLinks(baseUrl, String(matterId), getMatterPermission(item)) : {},\n };\n}\n\nfunction getMatterPermission(item: unknown): string {\n if (!item || typeof item !== \"object\" || !(\"permission\" in item)) {\n return \"U\";\n }\n const permission = (item as { permission?: unknown }).permission;\n return typeof permission === \"string\" && permission.trim() ? permission.trim() : \"U\";\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\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 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 // 项目列表字段由前端 selectedFields 决定。这里把字段映射显式写出来,\n // 既能跟随页面配置,也能给 Agent 保留稳定、可读的中文字段名。\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 formatRawStatus(value: number | string | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n if (String(value) === \"1\") {\n return \"在职\";\n }\n if (String(value) === \"0\") {\n return \"停用/离职\";\n }\n return String(value);\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 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 | null;\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 // 一些 Alpha 接口经过 ApiClient 后已经是 data 本身,另一些仍保留 { data, isSuccess/resultCode }。\n // 项目命令统一通过这个 helper 取数据,避免每个接口都重复写兼容逻辑。\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 | null }).data ?? undefined;\n }\n return response as T;\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 buildMatterSearchTimeRange(from: string | undefined, to: string | undefined): MatterSearchTimeRange {\n const today = formatLocalDate(new Date());\n const startTime = normalizeMatterSearchDate(from);\n const endTime = normalizeMatterSearchDate(to);\n if (!startTime && !endTime) {\n return createEmptyTimeRange(today);\n }\n return {\n startTime: startTime ?? \"\",\n endTime: endTime ?? \"\",\n siftMaxTime: today,\n };\n}\n\nfunction normalizeMatterSearchDate(value: string | undefined): string | undefined {\n const raw = value?.trim();\n if (!raw) {\n return undefined;\n }\n const parsed = parseDateTime(raw);\n if (!parsed) {\n throw new Error(\"Invalid matter search date. Use YYYY-MM-DD.\");\n }\n return formatLocalDate(parsed);\n}\n\nfunction parseCommaSeparatedValues(value: string | undefined): string[] {\n return (value ?? \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\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 { getCurrentEnvironmentPreset } from \"../../config/environments.js\";\nimport { ApiClient } from \"../../http/api-client.js\";\nimport { printSuccess } from \"../../output/envelope.js\";\nimport type { SessionStore } from \"../../session/store.js\";\nimport { buildMatterTaskUrl, buildTaskShareUrl } from \"../../util/alpha-links.js\";\nimport type {\n MatterTaskListOptions,\n MatterTaskMineOptions,\n MatterTaskPendingOptions,\n MatterTaskCreateOptions,\n MatterTaskWorktypesOptions,\n MatterTaskAssigneesOptions,\n MatterTaskDetailOptions,\n MatterTaskSubtasksOptions,\n MatterTaskCheckItemStateOptions,\n MatterTaskUpdateDetailOptions,\n MatterTaskCheckItemAddOptions,\n MatterTaskCheckItemDeleteOptions,\n MatterTaskCompleteOptions,\n MatterTaskUncompleteOptions,\n MatterTaskAttendeeSetOptions,\n MatterTaskCommentAddOptions,\n MatterTaskCommentDeleteOptions,\n AlphaMatterDetailResponse,\n AlphaMatterDetailItem,\n AlphaMatterTaskListResponse,\n AlphaMatterTaskPersonalListResponse,\n AlphaCliTaskPendingResponse,\n AlphaCliTaskPendingPage,\n AlphaMatterTaskDetailResponse,\n AlphaMatterTaskCreateResponse,\n AlphaTaskWorkTypeResponse,\n AlphaTaskWorkType,\n AlphaTaskAssigneeResponse,\n AlphaTaskAssignee,\n AlphaMatterTaskCheckItemResponse,\n AlphaMatterTaskAttachmentResponse,\n AlphaMatterTaskTimingResponse,\n AlphaMatterTaskCommentResponse,\n AlphaMatterTaskSubtaskResponse,\n AlphaMatterTaskAddCheckItemResponse,\n AlphaMatterTaskDeleteCommentResponse,\n AlphaDocumentDirListResponse,\n AlphaMatterRoleResponse,\n AlphaMatterTaskPage,\n AlphaMatterTaskPersonalPage,\n AlphaMatterTaskSubtaskPage,\n AlphaMatterTaskGroup,\n AlphaMatterTaskItem,\n AlphaMatterTaskCheckItem,\n AlphaMatterTaskAttachmentPage,\n AlphaMatterTaskAttachment,\n AlphaDocumentFileInfo,\n AlphaMatterTaskTimingPage,\n AlphaMatterTaskTimingItem,\n AlphaMatterTaskCommentPage,\n AlphaMatterTaskCommentItem,\n} from \"./types.js\";\n\n// 任务命令作为顶级业务模块维护。虽然历史后端接口里仍然带有 matter\n// 语义,但 CLI 对外已经是 `task` 模块,所以任务相关入口集中放在这里。\n\n// 查询某个项目下的任务列表。这个命令服务于“项目详情里的任务表”,\n// 默认按前端项目任务表的 statusType/pageIndex/pageSize 口径请求。\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 task list --matter-id <matterId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\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 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 \"页面链接\": buildMatterTaskUrl(environment.baseUrl, matterId),\n \"任务列表\": type === 1 ? groups.map(toMatterTaskGroupSummary) : tasks.map((task) => toMatterTaskSummary(task, environment.baseUrl)),\n });\n}\n\n// 查询“我的任务/负责人任务”。该能力目前仍然复用前端已有接口,\n// 所以只能保证分页内结果与前端一致,不能承担全量后端排序能力。\nexport async function runMatterTaskMine(\n options: MatterTaskMineOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const session = await sessionStore.getSession();\n const currentUserId = session?.userId;\n if (!currentUserId) {\n throw new Error(\"Cannot resolve current user id. Run: alpha-classic-cli doctor, or login again.\");\n }\n\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = await createMatterClient(sessionStore);\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 20);\n const stateType = parseMatterTaskState(options.state);\n const status = toMatterTaskStatusType(stateType);\n const matterIds = parseCommaSeparatedValues(options.matterIds ?? \"\");\n const userIds = parseCommaSeparatedValues(options.userIds ?? currentUserId);\n if (!userIds.length) {\n throw new Error(\"Missing user ids. Use --user-ids <userId1,userId2>, or login again to use current user.\");\n }\n const keyword = options.keyword?.trim() ?? \"\";\n const rangeFrom = normalizeTaskRangeDate(options.rangeFrom ?? options.startTime);\n const rangeTo = normalizeTaskRangeDate(options.rangeTo ?? options.endTime, true);\n const isRangeQuery = Boolean(rangeFrom || rangeTo);\n if (isRangeQuery && stateType === 2) {\n throw new Error(\"Time range view does not support 已删除. Use all, 未完成, or 已完成.\");\n }\n // 前端“我的任务”默认列表不是一个接口:主列表、我关注的、新任务分别请求。\n // CLI 按同样口径查询,避免以后维护时误以为一个 myTasks 接口就能覆盖页面表现。\n const shouldQuerySpecialGroups =\n options.includeSpecialGroups !== false &&\n stateType === 0 &&\n userIds.length === 1 &&\n userIds[0] === currentUserId &&\n page === 1 &&\n !isRangeQuery;\n const shouldQueryCalendarFavorite =\n options.includeSpecialGroups !== false &&\n isRangeQuery &&\n userIds.length === 1 &&\n userIds[0] === currentUserId;\n\n const params = {\n matterIds,\n userIds,\n status,\n pageIndex: page,\n pageSize: limit,\n searchValue: keyword,\n };\n const calendarParams = {\n matterIds,\n userIds,\n rangeFrom,\n rangeTo,\n searchValue: keyword,\n ...(stateType === 0 ? { state: 0 } : stateType === 1 ? { state: 1 } : {}),\n };\n // 带时间范围时走 calendar 接口,不带时间范围时走普通列表接口。\n // 如果 userIds 不是当前用户本人,前端语义就是“负责人任务”,因此切到 responsibleTasks。\n const mainListPromise = client.request<AlphaMatterTaskPersonalListResponse>(\n \"POST\",\n isRangeQuery\n ? userIds.length === 1 && userIds[0] === currentUserId\n ? \"/taskserver/api/v1/tasks/calendar/myTasks\"\n : \"/taskserver/api/v1/tasks/calendar/responsibleTasks\"\n : userIds.length === 1 && userIds[0] === currentUserId\n ? \"/taskserver/api/v1/tasks/myTasks\"\n : \"/taskserver/api/v1/tasks/responsibleTasks\",\n { data: isRangeQuery ? calendarParams : params },\n );\n const favoritePromise = shouldQuerySpecialGroups\n ? client.request<AlphaMatterTaskPersonalListResponse>(\n \"POST\",\n \"/taskserver/api/v1/tasks/favoriteTasks\",\n {\n data: {\n matterIds: [],\n userIds: [currentUserId],\n status: toMatterTaskStatusType(0),\n pageIndex: 1,\n pageSize: limit,\n searchValue: keyword,\n },\n },\n )\n : shouldQueryCalendarFavorite\n ? client.request<AlphaMatterTaskPersonalListResponse>(\n \"POST\",\n \"/taskserver/api/v1/tasks/calendar/favoriteTasks\",\n {\n data: {\n matterIds,\n userIds: [currentUserId],\n rangeFrom,\n rangeTo,\n searchValue: keyword,\n },\n },\n )\n : Promise.resolve<AlphaMatterTaskPersonalListResponse | undefined>(undefined);\n const newTaskPromise = shouldQuerySpecialGroups\n ? client.request<AlphaMatterTaskPersonalListResponse>(\n \"GET\",\n \"/taskserver/api/v1/tasks/newtasks\",\n )\n : Promise.resolve<AlphaMatterTaskPersonalListResponse | undefined>(undefined);\n\n const [mainListResponse, favoriteResponse, newTaskResponse] = await Promise.all([\n mainListPromise,\n favoritePromise,\n newTaskPromise,\n ]);\n assertTaskPersonalListSuccess(mainListResponse, \"My task list request failed.\");\n if (favoriteResponse) {\n assertTaskPersonalListSuccess(favoriteResponse, \"Favorite task list request failed.\");\n }\n if (newTaskResponse) {\n assertTaskPersonalListSuccess(newTaskResponse, \"New task list request failed.\");\n }\n\n const mainPage = unwrapTaskPersonalPage(mainListResponse);\n const favoritePage = favoriteResponse ? unwrapTaskPersonalPage(favoriteResponse) : undefined;\n const newTaskPage = newTaskResponse ? unwrapTaskPersonalPage(newTaskResponse) : undefined;\n const mainTasks = mainPage.data ?? mainPage.items ?? [];\n const favoriteTasks = favoritePage ? (favoritePage.data ?? favoritePage.items ?? []) : [];\n const newTasks = newTaskPage ? (newTaskPage.data ?? newTaskPage.items ?? []) : [];\n\n printSuccess({\n \"范围\": userIds.length === 1 && userIds[0] === currentUserId ? \"我的任务\" : \"负责人任务\",\n \"视图\": isRangeQuery ? \"时间范围视图\" : \"列表视图\",\n \"搜索词\": keyword,\n \"状态\": formatMatterTaskStateLabel(stateType),\n \"时间范围\": {\n \"开始\": rangeFrom ? formatDateTime(rangeFrom) : \"\",\n \"结束\": rangeTo ? formatDateTime(rangeTo) : \"\",\n },\n \"筛选用户ID列表\": userIds,\n \"筛选项目ID列表\": matterIds,\n \"页码\": mainPage.pageIndex ?? page,\n \"每页数量\": mainPage.pageSize ?? limit,\n \"总数\": mainPage.totalCount ?? mainPage.count ?? mainListResponse.count ?? mainTasks.length,\n \"特殊分组已查询\": shouldQuerySpecialGroups || shouldQueryCalendarFavorite,\n \"我关注的\": shouldQuerySpecialGroups || shouldQueryCalendarFavorite\n ? toMatterTaskPersonalGroupSummary(favoriteTasks, favoritePage, limit, environment.baseUrl)\n : undefined,\n \"新任务\": shouldQuerySpecialGroups\n ? toMatterTaskPersonalGroupSummary(newTasks, newTaskPage, limit, environment.baseUrl)\n : undefined,\n \"分组任务列表\": groupMatterPersonalTasks(mainTasks, environment.baseUrl),\n \"任务列表\": mainTasks.map((task) => toMatterTaskSummary(task, environment.baseUrl)),\n });\n}\n\n// 查询当前登录用户的待办任务。该命令使用后端专门给 CLI 提供的新接口,\n// 时间范围过滤、状态过滤、空值排最后和分页都在数据库层完成,适合回答“本周还有哪些任务没完成”。\nexport async function runMatterTaskPending(\n options: MatterTaskPendingOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = await createMatterClient(sessionStore);\n const page = clampPage(options.page ?? 1);\n const limit = clampCliPendingLimit(options.limit ?? 50);\n const status = parseCliPendingTaskStatus(options.state);\n const timeField = parseCliTaskTimeField(options.timeField, \"dueTime\");\n const orderBy = parseCliTaskTimeField(options.orderBy, timeField);\n const orderDirection = parseCliOrderDirection(options.orderDirection);\n const timeRange = buildCliPendingTimeRange(options);\n\n const response = await client.request<AlphaCliTaskPendingResponse | AlphaCliTaskPendingPage | AlphaMatterTaskItem[]>(\n \"POST\",\n \"/taskserver/api/v1/cli/tasks/my/pending\",\n {\n data: {\n startTime: timeRange.startTime,\n endTime: timeRange.endTime,\n statusType: status.value,\n timeField,\n orderBy,\n orderDirection,\n page,\n limit,\n },\n },\n );\n if (isCliPendingEnvelope(response) && response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"CLI pending task request failed.\");\n }\n\n const pageData = unwrapCliPendingTaskPage(response);\n const tasks = getCliPendingTaskItems(pageData);\n printSuccess({\n \"范围\": \"我的待办任务\",\n \"时间范围\": {\n \"预设\": timeRange.label,\n \"开始\": timeRange.startTime,\n \"结束\": timeRange.endTime,\n \"筛选字段\": formatCliTaskTimeField(timeField),\n },\n \"状态\": status.label,\n \"排序\": {\n \"字段\": formatCliTaskTimeField(orderBy),\n \"方向\": orderDirection === \"asc\" ? \"从近到远\" : \"从远到近\",\n \"空值\": \"排最后\",\n },\n \"总数\": pageData.total ?? pageData.totalCount ?? pageData.count ?? tasks.length,\n \"页码\": pageData.page ?? pageData.pageIndex ?? page,\n \"每页数量\": pageData.limit ?? pageData.pageSize ?? limit,\n \"任务列表\": tasks.map((task) => toCliPendingTaskSummary(task, environment.baseUrl)),\n });\n}\n\n// 新建任务。请求体按前端创建任务表单组织,支持项目任务、个人任务和子任务。\nexport async function runMatterTaskCreate(\n options: MatterTaskCreateOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const name = options.name.trim();\n validateTaskName(name);\n if (options.detail !== undefined) {\n validateTaskDetailContent(options.detail);\n }\n // 创建任务接口只接收 checkItems 数组。CLI 额外支持多次 --item 和换行 --items,\n // 这里先统一清洗,后续构造请求体时就不用关心用户采用哪种输入方式。\n const checkItems = buildCliCheckItems({ taskId: \"\", item: options.item, items: options.items });\n const session = await sessionStore.getSession();\n const currentUserId = session?.userId;\n if (!options.userIds && !currentUserId) {\n throw new Error(\"Missing current user id. Login again or pass --user-ids <userId1,userId2>.\");\n }\n const body = buildMatterTaskCreateBody(options, name, checkItems, currentUserId);\n const client = await createMatterClient(sessionStore);\n const response = await client.request<AlphaMatterTaskCreateResponse>(\n \"POST\",\n \"/taskserver/api/v1/tasks\",\n { data: body },\n );\n const task = unwrapEnvelopeData<AlphaMatterTaskItem>(response) ?? (response as AlphaMatterTaskItem);\n printSuccess({\n \"任务ID\": task.id ?? \"\",\n \"任务名称\": task.name ?? name,\n \"项目ID\": task.matterId ?? body.matterId ?? \"\",\n \"项目名称\": task.matterName ?? task.matter?.name ?? \"\",\n \"父任务ID\": task.parentId && task.parentId !== \"0\" ? task.parentId : (body.parentId ?? \"\"),\n \"任务组\": task.taskGroupName ?? body.taskGroupName ?? \"\",\n \"状态\": task.state === true || task.state === 1 ? \"已完成\" : \"未完成\",\n \"负责人\": formatTaskUsers(task.attendeeUsers ?? task.attendees),\n \"开始时间\": formatDateTime(task.startTime),\n \"到期时间\": formatDateTime(task.dueTime),\n \"结束时间\": formatDateTime(task.endTime),\n \"全天类型\": formatMatterTaskDayType(task.dayType),\n \"是否关注\": task.attentioned === 1 || task.favorite === true || task.favorite === 1 || body.favorite === true,\n \"详情\": task.detail ?? body.detail ?? \"\",\n \"检查项\": {\n \"总数\": task.itemCount ?? checkItems.length,\n \"已完成\": task.doneItemCount ?? task.completedItemCount ?? 0,\n },\n \"结果\": \"已创建\",\n });\n}\n\n// 查询创建任务时可选的工作类型。传 matterId 时查项目工作类型,\n// 不传 matterId 时查全局工作类型树,供个人任务或兜底场景使用。\nexport async function runMatterTaskWorktypes(\n options: MatterTaskWorktypesOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createMatterClient(sessionStore);\n const state = Number.isFinite(options.state) ? options.state : 1;\n const response = await client.request<AlphaTaskWorkTypeResponse | AlphaTaskWorkType[]>(\n \"GET\",\n options.matterId\n ? \"/matterserver/api/v2/workType/workTypes/list/v2\"\n : \"/taskserver/api/v2/timing/matter/workTypes/v2\",\n {\n params: {\n matterId: options.matterId?.trim() ?? \"\",\n state,\n },\n },\n );\n const workTypes = unwrapEnvelopeData<AlphaTaskWorkType[]>(response) ?? (Array.isArray(response) ? response : []);\n const flattened = flattenTaskWorkTypes(workTypes);\n const keyword = options.keyword?.trim();\n const filtered = keyword\n ? flattened.filter((item) => `${item.name ?? \"\"}${item.parentName ?? \"\"}`.includes(keyword))\n : flattened;\n const limit = clampLimit(options.limit ?? 50);\n printSuccess({\n \"项目ID\": options.matterId ?? \"\",\n \"状态\": state,\n \"搜索词\": keyword ?? \"\",\n \"总数\": filtered.length,\n \"工作类型列表\": filtered.slice(0, limit).map(toTaskWorkTypeSummary),\n });\n}\n\n// 查询创建/修改任务负责人时可选的人员。根据参数不同切换“默认负责人、\n// 项目成员、全所人员”三个来源,避免创建任务时让用户盲填 userId。\nexport async function runMatterTaskAssignees(\n options: MatterTaskAssigneesOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createMatterClient(sessionStore);\n const matterId = options.matterId?.trim();\n const workTypeId = options.workTypeId?.trim();\n const keyword = options.keyword?.trim();\n const limit = clampLimit(options.limit ?? 50);\n if (workTypeId && !matterId) {\n throw new Error(\"Use --matter-id with --work-type-id to query default assignees.\");\n }\n\n let source = \"全所人员\";\n let assignees: AlphaTaskAssignee[] = [];\n // 负责人候选人有三种来源,分别对应前端创建任务时的不同场景:\n // 1. 项目 + 工作类型:查询该工作类型配置的默认负责人;\n // 2. 只有项目:查询项目成员,供用户手动指定负责人;\n // 3. 没有项目:查询全所在职人员,用于个人任务创建。\n if (matterId && workTypeId) {\n source = \"工作类型默认负责人\";\n const response = await client.request<AlphaTaskAssigneeResponse | AlphaTaskAssignee[]>(\n \"GET\",\n \"/matterserver/api/v2/workType/queryMatterMemberByWorkTypeAndMatterId\",\n {\n params: {\n matterId,\n workTypeId,\n },\n },\n );\n assignees = unwrapEnvelopeData<AlphaTaskAssignee[]>(response) ?? (Array.isArray(response) ? response : []);\n } else if (matterId) {\n source = \"项目成员\";\n const detailResponse = await client.request<AlphaMatterDetailResponse | AlphaMatterDetailItem[]>(\n \"GET\",\n `/matterserver/api/v2/matters/${encodeURIComponent(matterId)}`,\n );\n if (!Array.isArray(detailResponse) && detailResponse.resultCode && detailResponse.resultCode !== \"1\") {\n throw new Error(detailResponse.resultMess ?? \"Matter detail request failed.\");\n }\n const detailData =\n unwrapEnvelopeData<AlphaMatterDetailItem[]>(detailResponse) ??\n (Array.isArray(detailResponse) ? detailResponse : []);\n const [matter] = detailData;\n assignees = (matter?.members ?? []).map((member) => ({\n userId: member.userId,\n userName: member.userName,\n roleName: member.roleName,\n }));\n } else {\n const response = await client.request<AlphaTaskAssigneeResponse | AlphaTaskAssignee[]>(\n \"GET\",\n \"/user/api/v1/users/listOfficeUser\",\n {\n params: {\n deleted: 0,\n ...(options.includeLeft ? {} : { status: 1 }),\n },\n },\n );\n if (!Array.isArray(response) && response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Task assignees request failed.\");\n }\n assignees = unwrapEnvelopeData<AlphaTaskAssignee[]>(response) ?? (Array.isArray(response) ? response : []);\n }\n\n const normalized = normalizeTaskAssignees(assignees);\n const filtered = keyword\n ? normalized.filter((item) => `${item.userName ?? \"\"}${item.phone ?? \"\"}${item.email ?? \"\"}`.includes(keyword))\n : normalized;\n printSuccess({\n \"来源\": source,\n \"项目ID\": matterId ?? \"\",\n \"工作类型ID\": workTypeId ?? \"\",\n \"搜索词\": keyword ?? \"\",\n \"总数\": filtered.length,\n \"负责人列表\": filtered.slice(0, limit).map(toTaskAssigneeSummary),\n });\n}\n\n// 查询父任务下的子任务列表。状态枚举沿用 task list 的四种状态口径。\nexport async function runMatterTaskSubtasks(\n options: MatterTaskSubtasksOptions,\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 task subtasks --id <taskId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\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 ?? \"all\");\n const subtaskPage = await fetchMatterTaskSubtasks(client, taskId, {\n stateType,\n page,\n limit,\n });\n\n printSuccess({\n \"父任务ID\": taskId,\n \"状态\": formatMatterTaskStateLabel(stateType),\n ...toMatterTaskSubtaskPageSummary(subtaskPage, page, limit, \"子任务列表\", environment.baseUrl),\n });\n}\n\n// 完成或取消完成检查项。前端底层是同一个 state 接口,\n// CLI 用 complete/uncomplete 两个子命令表达不同动作。\nexport async function runMatterTaskCheckItemState(\n options: MatterTaskCheckItemStateOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const checkItemId = options.id.trim();\n const taskId = options.taskId.trim();\n if (!checkItemId) {\n throw new Error(\"Missing check item id. Use: alpha-classic-cli task checkitem complete --id <checkItemId> --task-id <taskId>\");\n }\n if (!taskId) {\n throw new Error(\"Missing task id. Use: alpha-classic-cli task checkitem complete --id <checkItemId> --task-id <taskId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n const client = new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n\n await client.request<unknown>(\n \"PUT\",\n `/taskserver/api/v1/checkitem/${encodeURIComponent(checkItemId)}/state`,\n {\n data: {\n taskId,\n state: options.state ? 1 : 0,\n },\n },\n );\n\n printSuccess({\n \"检查项ID\": checkItemId,\n \"任务ID\": taskId,\n \"状态\": options.state ? \"已完成\" : \"未完成\",\n \"结果\": \"修改成功\",\n });\n}\n\n// 修改任务详情文本。当前只更新 detail 字段,不在这里扩展成全量任务编辑,\n// 是为了避免误覆盖前端表单里的其他字段。\nexport async function runMatterTaskUpdateDetail(\n options: MatterTaskUpdateDetailOptions,\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 task update-detail --id <taskId> --detail <detail>\");\n }\n validateTaskDetailContent(options.detail);\n\n const client = await createMatterClient(sessionStore);\n await client.request<unknown>(\n \"PUT\",\n `/taskserver/api/v1/tasks/${encodeURIComponent(taskId)}/basicInfo`,\n {\n data: {\n detail: options.detail,\n effectRepeats: options.effectRepeats === true,\n },\n },\n );\n\n printSuccess({\n \"任务ID\": taskId,\n \"任务详情\": options.detail,\n \"影响重复任务\": options.effectRepeats === true,\n \"结果\": \"修改成功\",\n });\n}\n\n// 给任务添加检查项。支持多次 --item 或换行 --items,最后统一发送 checkItems 数组。\nexport async function runMatterTaskCheckItemAdd(\n options: MatterTaskCheckItemAddOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const taskId = options.taskId.trim();\n if (!taskId) {\n throw new Error(\"Missing task id. Use: alpha-classic-cli task checkitem add --task-id <taskId> --item <content>\");\n }\n const checkItems = buildCliCheckItems(options);\n if (!checkItems.length) {\n throw new Error(\"Missing check item content. Use --item <content> or --items <newline-separated-content>.\");\n }\n\n const client = await createMatterClient(sessionStore);\n const response = await client.request<AlphaMatterTaskAddCheckItemResponse | AlphaMatterTaskCheckItem[]>(\n \"POST\",\n \"/taskserver/api/v1/checkitem\",\n {\n data: {\n taskId,\n checkItems,\n effectRepeats: options.effectRepeats === true,\n },\n },\n );\n const addedItems = Array.isArray(response) ? response : (response?.data ?? []);\n\n printSuccess({\n \"任务ID\": taskId,\n \"检查项\": addedItems.length ? addedItems.map(toMatterTaskCheckItemSummary) : checkItems,\n \"影响重复任务\": options.effectRepeats === true,\n \"结果\": \"添加成功\",\n });\n}\n\n// 删除任务检查项。后端要求同时带 taskId,CLI 也显式要求传入,避免只凭检查项 ID 误删。\nexport async function runMatterTaskCheckItemDelete(\n options: MatterTaskCheckItemDeleteOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const checkItemId = options.id.trim();\n const taskId = options.taskId.trim();\n if (!checkItemId) {\n throw new Error(\"Missing check item id. Use: alpha-classic-cli task checkitem delete --id <checkItemId> --task-id <taskId>\");\n }\n if (!taskId) {\n throw new Error(\"Missing task id. Use: alpha-classic-cli task checkitem delete --id <checkItemId> --task-id <taskId>\");\n }\n\n const client = await createMatterClient(sessionStore);\n await client.request<unknown>(\n \"DELETE\",\n `/taskserver/api/v1/checkitem/${encodeURIComponent(checkItemId)}`,\n {\n params: {\n taskId,\n effectRepeats: options.effectRepeats === true,\n },\n },\n );\n\n printSuccess({\n \"检查项ID\": checkItemId,\n \"任务ID\": taskId,\n \"影响重复任务\": options.effectRepeats === true,\n \"结果\": \"删除成功\",\n });\n}\n\n// 完成任务。这里调用的是任务 finish 接口,不会顺带修改检查项或子任务状态。\nexport async function runMatterTaskComplete(\n options: MatterTaskCompleteOptions,\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 task complete --id <taskId>\");\n }\n\n const client = await createMatterClient(sessionStore);\n await client.request<unknown>(\n \"PUT\",\n `/taskserver/api/v1/tasks/${encodeURIComponent(taskId)}/finish`,\n { data: {} },\n );\n\n printSuccess({\n \"任务ID\": taskId,\n \"状态\": \"已完成\",\n \"结果\": \"修改成功\",\n });\n}\n\n// 取消任务完成状态。前端命名为 restartTask,接口会把任务恢复为未完成;\n// restartParent=true 与前端保持一致,用于处理父子任务状态联动。\nexport async function runMatterTaskUncomplete(\n options: MatterTaskUncompleteOptions,\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 task uncomplete --id <taskId>\");\n }\n\n const client = await createMatterClient(sessionStore);\n await client.request<unknown>(\n \"PUT\",\n `/taskserver/api/v1/tasks/${encodeURIComponent(taskId)}/restart`,\n {\n params: {\n restartParent: true,\n },\n data: {},\n },\n );\n\n printSuccess({\n \"任务ID\": taskId,\n \"状态\": \"未完成\",\n \"结果\": \"修改成功\",\n });\n}\n\n// 替换任务负责人列表。注意这是 set 语义,不是 append;\n// 传入的 userIds 会成为新的负责人集合。\nexport async function runMatterTaskAttendeeSet(\n options: MatterTaskAttendeeSetOptions,\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 task assignee set --id <taskId> --user-ids <userId1,userId2>\");\n }\n const attendeeIds = parseCommaSeparatedValues(options.userIds);\n if (!attendeeIds.length) {\n throw new Error(\"Missing user ids. Use --user-ids <userId1,userId2>.\");\n }\n\n const client = await createMatterClient(sessionStore);\n await client.request<unknown>(\n \"PUT\",\n `/taskserver/api/v1/tasks/${encodeURIComponent(taskId)}/attendee`,\n {\n data: {\n attendeeIds,\n effectRepeats: options.effectRepeats === true,\n },\n },\n );\n\n printSuccess({\n \"任务ID\": taskId,\n \"负责人ID列表\": attendeeIds,\n \"影响重复任务\": options.effectRepeats === true,\n \"结果\": \"修改成功\",\n });\n}\n\n// 添加任务评论。评论接口归 taskserver,删除评论则沿用 ilaw 评论服务。\nexport async function runMatterTaskCommentAdd(\n options: MatterTaskCommentAddOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const taskId = options.taskId.trim();\n if (!taskId) {\n throw new Error(\"Missing task id. Use: alpha-classic-cli task comment add --task-id <taskId> --content <content>\");\n }\n const content = options.content.trim();\n validateTaskCommentContent(content);\n const atUserIds = options.atUserIds ? parseCommaSeparatedValues(options.atUserIds) : [];\n\n const client = await createMatterClient(sessionStore);\n const commentId = await client.request<string | null>(\n \"POST\",\n \"/taskserver/api/v1/tasks/comment\",\n {\n data: {\n hostId: taskId,\n content,\n ...(atUserIds.length ? { atUserIds } : {}),\n },\n },\n );\n\n printSuccess({\n \"任务ID\": taskId,\n \"评论ID\": commentId ?? \"\",\n \"内容\": content,\n \"艾特用户ID列表\": atUserIds,\n \"结果\": \"评论成功\",\n });\n}\n\n// 删除任务评论。后端只允许删除自己有权限删除的评论,CLI 不在本地伪造权限判断。\nexport async function runMatterTaskCommentDelete(\n options: MatterTaskCommentDeleteOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const commentId = options.id.trim();\n if (!commentId) {\n throw new Error(\"Missing comment id. Use: alpha-classic-cli task comment delete --id <commentId>\");\n }\n\n const client = await createMatterClient(sessionStore);\n const response = await client.request<AlphaMatterTaskDeleteCommentResponse>(\n \"DELETE\",\n `/ilaw/api/v2/comment/${encodeURIComponent(commentId)}`,\n );\n if (response?.succeed === false) {\n throw new Error(response.message ?? response.detail ?? \"Task comment delete request failed.\");\n }\n\n printSuccess({\n \"评论ID\": commentId,\n \"结果\": \"删除成功\",\n });\n}\n\n// 查询任务详情。这个命令会拼装多个前端详情页接口,输出给 Agent 可直接阅读的结构。\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 task detail --id <taskId>\");\n }\n\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\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 subtaskLimit = 50;\n // 任务详情对齐前端抽屉:基础信息、检查项、附件、计时、评论/动态、全部状态子任务一起查。\n // 附件接口失败时不直接中断详情展示,因为前端也是先展示任务主体,再处理附件异常。\n const [detailResponse, checkItemResponse, attachmentResponse, timingResponse, commentResponse, subtaskResponse] =\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 requestMatterTaskSubtasks(client, taskId, {\n stateType: -1,\n page: 1,\n limit: subtaskLimit,\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 const attachmentWarning = getTaskAttachmentWarning(attachmentResponse);\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 if (subtaskResponse.isSuccess === false) {\n throw new Error(subtaskResponse.resultMsg ?? subtaskResponse.message ?? \"Matter task subtasks 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 // 任务附件接口只给任务侧引用,真正的文件名和大小需要到 document-engine 目录列表补齐。\n // CLI 最终只展示“文件名/大小”,不把 repoId、路径、file-ticket 等内部字段暴露给用户。\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, environment.baseUrl),\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 \"附件读取\": attachmentWarning,\n \"子任务列表\": {\n \"状态\": formatMatterTaskStateLabel(-1),\n ...toMatterTaskSubtaskPageSummary(unwrapMatterTaskSubtaskPage(subtaskResponse), 1, subtaskLimit, \"列表\", environment.baseUrl),\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 getTaskAttachmentWarning(response: AlphaMatterTaskAttachmentResponse): Record<string, string> | undefined {\n if (response.isSuccess !== false) {\n return undefined;\n }\n return {\n \"状态\": \"失败\",\n \"说明\": response.resultMsg ?? \"任务附件接口返回失败,已按前端行为保留任务详情并跳过附件列表。\",\n };\n}\n\nasync function fetchMatterTaskSubtasks(\n client: ApiClient,\n taskId: string,\n options: { stateType: number; page: number; limit: number },\n): Promise<AlphaMatterTaskSubtaskPage> {\n const response = await requestMatterTaskSubtasks(client, taskId, options);\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Matter task subtasks request failed.\");\n }\n return unwrapMatterTaskSubtaskPage(response);\n}\n\nfunction requestMatterTaskSubtasks(\n client: ApiClient,\n taskId: string,\n options: { stateType: number; page: number; limit: number },\n): Promise<AlphaMatterTaskSubtaskResponse> {\n return client.request<AlphaMatterTaskSubtaskResponse>(\n \"GET\",\n \"/taskserver/api/v1/tasks/listTaskByParentId\",\n {\n params: {\n parentId: taskId,\n statusType: toMatterTaskStatusType(options.stateType),\n pageIndex: options.page,\n pageSize: options.limit,\n },\n },\n );\n}\n\nfunction unwrapMatterTaskSubtaskPage(response: AlphaMatterTaskSubtaskResponse): AlphaMatterTaskSubtaskPage {\n return unwrapEnvelopeData<AlphaMatterTaskSubtaskPage>(response) ?? {};\n}\n\nasync function createMatterClient(sessionStore: SessionStore): Promise<ApiClient> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n return new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n}\n\nfunction buildMatterTaskCreateBody(\n options: MatterTaskCreateOptions,\n name: string,\n checkItems: string[],\n currentUserId?: string,\n): Record<string, unknown> {\n // 负责人默认当前登录用户;显式传 --user-ids 时以用户输入为准。\n const attendeeIds = parseCommaSeparatedValues(options.userIds ?? currentUserId ?? \"\");\n const timeSetting = buildMatterTaskCreateTimeSetting(options);\n return removeUndefinedProperties({\n matterId: options.matterId?.trim() ?? \"\",\n taskGroupId: options.taskGroupId?.trim() ?? \"\",\n taskGroupName: options.taskGroupName?.trim() ?? \"\",\n name,\n favorite: options.favorite === true,\n workTypeId: normalizeOptionalString(options.workTypeId),\n timeSetting,\n attendeeIds,\n repeatSetting: null,\n remindSetting: {\n ruleTime: [],\n customTime: [],\n remindType: 0,\n },\n detail: normalizeOptionalString(options.detail),\n checkItems,\n parentId: normalizeOptionalString(options.parentId),\n });\n}\n\nfunction buildMatterTaskCreateTimeSetting(options: MatterTaskCreateOptions): Record<string, unknown> {\n const dueTime = normalizeTaskCreateDate(options.dueTime);\n const startTime = normalizeTaskCreateDate(options.startTime);\n const endTime = normalizeTaskCreateDate(options.endTime);\n // Alpha 创建任务有两个互斥时间模式:\n // timeType=1 使用 dueTime;timeType=2 使用 startTime + endTime。\n // 混传会让后端/前端表单语义不清,所以 CLI 在发请求前直接拦截。\n if ((startTime && !endTime) || (!startTime && endTime)) {\n throw new Error(\"Use --start-time and --end-time together, or use --due-time.\");\n }\n if (dueTime && (startTime || endTime)) {\n throw new Error(\"Use either --due-time or --start-time/--end-time, not both.\");\n }\n return removeUndefinedProperties({\n timeType: startTime && endTime ? 2 : 1,\n dueTime,\n startTime,\n endTime,\n dayType: options.allDay ? 1 : 2,\n });\n}\n\nfunction flattenTaskWorkTypes(workTypes: AlphaTaskWorkType[], parentName = \"\"): AlphaTaskWorkType[] {\n return workTypes.flatMap((workType) => {\n const children = workType.subWorkTypes ?? workType.children ?? [];\n const current = {\n ...workType,\n parentName: workType.parentName ?? parentName,\n };\n if (!children.length) {\n return [current];\n }\n return [\n current,\n ...flattenTaskWorkTypes(children, workType.name ?? parentName),\n ];\n });\n}\n\nfunction normalizeTaskAssignees(assignees: AlphaTaskAssignee[]): AlphaTaskAssignee[] {\n const seen = new Set<string>();\n return assignees\n .map((assignee) => ({\n ...assignee,\n userId: assignee.userId ?? assignee.id ?? assignee.user_id,\n userName: assignee.userName ?? assignee.name,\n pic: assignee.pic ?? assignee.avatar,\n }))\n .filter((assignee) => {\n if (!assignee.userId || !assignee.userName || seen.has(assignee.userId)) {\n return false;\n }\n seen.add(assignee.userId);\n return true;\n });\n}\n\nfunction buildCliCheckItems(options: MatterTaskCheckItemAddOptions): string[] {\n const rawItems = [\n ...(options.item ?? []),\n ...(options.items ? [options.items] : []),\n ];\n return rawItems\n .flatMap((item) => item.split(\"\\n\"))\n .map((item) => item.trim())\n .filter(Boolean)\n .map((item) => {\n validateCheckItemContent(item);\n return item;\n });\n}\n\nfunction validateTaskName(value: string): void {\n if (!value) {\n throw new Error(\"任务名称不能为空。\");\n }\n if (value.length > 200) {\n throw new Error(\"任务名称限制在200字符以内。\");\n }\n}\n\nfunction validateTaskDetailContent(value: string): void {\n if (value.length > 3000) {\n throw new Error(\"任务详情限制在3000字符以内。\");\n }\n}\n\nfunction validateCheckItemContent(value: string): void {\n if (value.length > 500) {\n throw new Error(\"检查项限制在500字符以内。\");\n }\n}\n\nfunction validateTaskCommentContent(value: string): void {\n if (!value) {\n throw new Error(\"评论内容不能为空。\");\n }\n if (value.length > 1500) {\n throw new Error(\"评论内容限制在1500字符以内。\");\n }\n}\n\nfunction buildCliPendingTimeRange(options: MatterTaskPendingOptions): {\n label: string;\n startTime: string;\n endTime: string;\n} {\n const explicitStart = options.startTime ?? options.rangeFrom;\n const explicitEnd = options.endTime ?? options.rangeTo;\n if (explicitStart || explicitEnd) {\n if (!explicitStart || !explicitEnd) {\n throw new Error(\"Use --start-time and --end-time together, or use --range this-week.\");\n }\n return {\n label: \"自定义\",\n startTime: normalizeCliPendingDate(explicitStart, false),\n endTime: normalizeCliPendingDate(explicitEnd, true),\n };\n }\n\n const range = (options.range ?? \"this-week\").trim().toLowerCase();\n const now = new Date();\n if (range === \"today\" || range === \"今天\") {\n return {\n label: \"今天\",\n startTime: formatLocalDateTime(startOfLocalDay(now)),\n endTime: formatLocalDateTime(endOfLocalDay(now)),\n };\n }\n if (range === \"this-week\" || range === \"week\" || range === \"本周\") {\n const day = now.getDay();\n const mondayOffset = day === 0 ? -6 : 1 - day;\n const start = startOfLocalDay(addLocalDays(now, mondayOffset));\n const end = endOfLocalDay(addLocalDays(start, 6));\n return {\n label: \"本周\",\n startTime: formatLocalDateTime(start),\n endTime: formatLocalDateTime(end),\n };\n }\n if (range === \"this-month\" || range === \"month\" || range === \"本月\") {\n const start = new Date(now.getFullYear(), now.getMonth(), 1, 0, 0, 0, 0);\n const end = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59, 59, 999);\n return {\n label: \"本月\",\n startTime: formatLocalDateTime(start),\n endTime: formatLocalDateTime(end),\n };\n }\n throw new Error(\"Invalid range. Use this-week, today, this-month, or explicit --start-time/--end-time.\");\n}\n\nfunction normalizeCliPendingDate(value: string, endOfDay: boolean): string {\n const raw = value.trim();\n const dateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n if (dateOnly) {\n const [, year, month, day] = dateOnly;\n return formatLocalDateTime(new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n endOfDay ? 23 : 0,\n endOfDay ? 59 : 0,\n endOfDay ? 59 : 0,\n endOfDay ? 999 : 0,\n ));\n }\n const parsed = parseDateTime(raw);\n if (!parsed) {\n throw new Error(\"Invalid task time. Use YYYY-MM-DD or a valid date-time string.\");\n }\n return formatLocalDateTime(parsed);\n}\n\nfunction normalizeTaskRangeDate(value: string | undefined, endOfDay = false): string | undefined {\n const raw = value?.trim();\n if (!raw) {\n return undefined;\n }\n const dateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n if (dateOnly) {\n const [, year, month, day] = dateOnly;\n const date = new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n endOfDay ? 23 : 0,\n endOfDay ? 59 : 0,\n endOfDay ? 59 : 0,\n endOfDay ? 999 : 0,\n );\n return date.toISOString();\n }\n\n const parsed = parseDateTime(raw);\n if (!parsed) {\n throw new Error(\"Invalid time range. Use YYYY-MM-DD or a valid date-time string.\");\n }\n return parsed.toISOString();\n}\n\nfunction normalizeTaskCreateDate(value: string | undefined): string | undefined {\n const raw = value?.trim();\n if (!raw) {\n return undefined;\n }\n const dateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n if (dateOnly) {\n const [, year, month, day] = dateOnly;\n const date = new Date(Number(year), Number(month) - 1, Number(day), 23, 59, 59, 0);\n return date.toISOString();\n }\n const parsed = parseDateTime(raw);\n if (!parsed) {\n throw new Error(\"Invalid task time. Use YYYY-MM-DD or a valid date-time string.\");\n }\n return parsed.toISOString();\n}\n\nfunction parseCommaSeparatedValues(value: string): string[] {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction removeUndefinedProperties<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined),\n ) as T;\n}\n\nasync function fetchDocumentDetailsForAttachments(\n client: ApiClient,\n attachments: AlphaMatterTaskAttachment[],\n): Promise<Map<string, AlphaDocumentFileInfo>> {\n // document-engine 只能按 repo + 目录列文件,不能直接按任务附件 ID 批量查。\n // 这里先按目录去重,多个附件在同一目录时只请求一次,避免任务附件多时请求膨胀。\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 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 assertTaskPersonalListSuccess(response: AlphaMatterTaskPersonalListResponse, fallback: string): void {\n if (response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? fallback);\n }\n}\n\nfunction unwrapTaskPersonalPage(response: AlphaMatterTaskPersonalListResponse): AlphaMatterTaskPersonalPage {\n const data = unwrapEnvelopeData<AlphaMatterTaskPersonalListResponse[\"data\"]>(response);\n if (Array.isArray(data)) {\n return {\n data,\n totalCount: response.count ?? data.length,\n };\n }\n return data ?? {\n data: [],\n totalCount: response.count ?? 0,\n };\n}\n\nfunction unwrapCliPendingTaskPage(\n response: AlphaCliTaskPendingResponse | AlphaCliTaskPendingPage | AlphaMatterTaskItem[],\n): AlphaCliTaskPendingPage {\n if (Array.isArray(response)) {\n return {\n items: response,\n total: response.length,\n };\n }\n const data = \"result\" in response && response.result !== undefined\n ? response.result\n : unwrapEnvelopeData<AlphaCliTaskPendingResponse[\"data\"]>(response);\n if (Array.isArray(data)) {\n return {\n items: data,\n total: data.length,\n };\n }\n return data ?? {};\n}\n\nfunction isCliPendingEnvelope(\n response: AlphaCliTaskPendingResponse | AlphaCliTaskPendingPage | AlphaMatterTaskItem[],\n): response is AlphaCliTaskPendingResponse {\n return !Array.isArray(response) && (\n \"isSuccess\" in response ||\n \"resultMsg\" in response ||\n \"message\" in response ||\n \"result\" in response\n );\n}\n\nfunction getCliPendingTaskItems(page: AlphaCliTaskPendingPage): AlphaMatterTaskItem[] {\n return page.items ?? page.data ?? page.records ?? page.list ?? [];\n}\n\nfunction toMatterTaskPersonalGroupSummary(\n tasks: AlphaMatterTaskItem[],\n page: AlphaMatterTaskPersonalPage | undefined,\n fallbackLimit: number,\n baseUrl: string,\n): Record<string, unknown> {\n return {\n \"总数\": page?.totalCount ?? page?.count ?? tasks.length,\n \"页码\": page?.pageIndex ?? 1,\n \"每页数量\": page?.pageSize ?? fallbackLimit,\n \"任务列表\": tasks.map((task) => toMatterTaskSummary(task, baseUrl)),\n };\n}\n\nfunction groupMatterPersonalTasks(tasks: AlphaMatterTaskItem[], baseUrl: string): Array<Record<string, unknown>> {\n const groups = new Map<string, AlphaMatterTaskItem[]>();\n for (const task of tasks) {\n const key = task.displayGroup || \"未分组\";\n groups.set(key, [...(groups.get(key) ?? []), task]);\n }\n return [...groups.entries()].map(([group, groupTasks]) => ({\n \"分组\": formatTaskDisplayGroup(group),\n \"分组值\": group,\n \"数量\": groupTasks.length,\n \"任务列表\": groupTasks.map((task) => toMatterTaskSummary(task, baseUrl)),\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, baseUrl?: string): Record<string, unknown> {\n const taskId = item.id ? String(item.id) : \"\";\n const matterId = item.matterId ?? item.matter?.id;\n return {\n \"任务ID\": taskId,\n \"任务名称\": item.name ?? \"\",\n \"任务链接\": baseUrl && taskId ? buildTaskShareUrl(baseUrl, taskId) : \"\",\n \"项目任务页\": baseUrl && matterId ? buildMatterTaskUrl(baseUrl, String(matterId)) : \"\",\n \"任务组\": item.parentName ?? item.taskGroupName ?? \"\",\n \"展示分组\": formatTaskDisplayGroup(item.displayGroup),\n \"状态\": item.state === true || item.state === 1 ? \"已完成\" : \"未完成\",\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 toCliPendingTaskSummary(item: AlphaMatterTaskItem, baseUrl?: string): Record<string, unknown> {\n const taskId = item.id ? String(item.id) : \"\";\n const matterId = item.matterId ?? item.matter?.id;\n return {\n \"任务ID\": taskId,\n \"任务名称\": item.name ?? \"\",\n \"任务链接\": baseUrl && taskId ? buildTaskShareUrl(baseUrl, taskId) : \"\",\n \"项目ID\": matterId ?? \"\",\n \"项目名称\": item.matterName ?? item.matter?.name ?? \"\",\n \"项目任务页\": baseUrl && matterId ? buildMatterTaskUrl(baseUrl, String(matterId)) : \"\",\n \"任务组\": item.parentName ?? item.taskGroupName ?? \"\",\n \"状态\": item.state === true || item.state === 1 ? \"已完成\" : \"未完成\",\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 \"工作类型\": formatTaskWorkType(item.workType),\n };\n}\n\nfunction toTaskWorkTypeSummary(item: AlphaTaskWorkType): Record<string, unknown> {\n return {\n \"工作类型ID\": item.id ?? \"\",\n \"工作类型名称\": item.name ?? \"\",\n \"父级工作类型\": item.parentName ?? \"\",\n \"状态\": item.state ?? \"\",\n \"排序\": item.displayOrder ?? \"\",\n };\n}\n\nfunction toTaskAssigneeSummary(item: AlphaTaskAssignee): Record<string, unknown> {\n return {\n \"用户ID\": item.userId ?? \"\",\n \"姓名\": item.userName ?? \"\",\n \"角色\": item.roleName ?? \"\",\n \"手机号\": item.phone ?? \"\",\n \"邮箱\": item.email ?? \"\",\n \"状态\": formatRawStatus(item.status),\n };\n}\n\nfunction toMatterTaskSubtaskPageSummary(\n page: AlphaMatterTaskSubtaskPage,\n fallbackPage: number,\n fallbackLimit: number,\n itemField: \"子任务列表\" | \"列表\",\n baseUrl: string,\n): Record<string, unknown> {\n const subtasks = page.data ?? page.items ?? [];\n return {\n \"总数\": page.totalCount ?? page.count ?? subtasks.length,\n \"页码\": page.pageIndex ?? fallbackPage,\n \"每页数量\": page.pageSize ?? fallbackLimit,\n [itemField]: subtasks.map((task) => toMatterTaskSummary(task, baseUrl)),\n };\n}\n\nfunction toMatterTaskDetailSummary(item: AlphaMatterTaskItem, baseUrl: string): Record<string, unknown> {\n const taskId = item.id ? String(item.id) : \"\";\n const matterId = item.matterId ?? item.matter?.id;\n return {\n \"任务ID\": taskId,\n \"任务名称\": item.name ?? \"\",\n \"任务链接\": taskId ? buildTaskShareUrl(baseUrl, taskId) : \"\",\n \"项目ID\": matterId ?? \"\",\n \"项目名称\": item.matterName ?? item.matter?.name ?? \"\",\n \"项目任务页\": matterId ? buildMatterTaskUrl(baseUrl, String(matterId)) : \"\",\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.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\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 formatLocalDateTime(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 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 startOfLocalDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);\n}\n\nfunction endOfLocalDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n}\n\nfunction addLocalDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n}\n\nfunction formatRawStatus(value: number | string | undefined): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n if (String(value) === \"1\") {\n return \"在职\";\n }\n if (String(value) === \"0\") {\n return \"停用/离职\";\n }\n return String(value);\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 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 deleted: 2,\n removed: 2,\n \"已删除\": 2,\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 // 任务表接口只支持未完成、已完成、已删除,以及前端“全部任务”。\n // 这里的“全部”会映射为未完成 + 已完成,不包含已删除;其他数字直接拒绝,防止误查。\n if (Number.isNaN(parsed) || ![-1, 0, 1, 2].includes(parsed)) {\n throw new Error(\"Invalid task state. Use all, 未完成, 已完成, or 已删除.\");\n }\n return parsed;\n}\n\nfunction parseCliPendingTaskStatus(value: string | undefined): { value: number; label: string } {\n const raw = (value ?? \"未完成\").trim().toLowerCase();\n const aliases: Record<string, { value: number; label: string }> = {\n unfinished: { value: 0, label: \"未完成\" },\n pending: { value: 0, label: \"未完成\" },\n \"未完成\": { value: 0, label: \"未完成\" },\n done: { value: 1, label: \"已完成\" },\n finished: { value: 1, label: \"已完成\" },\n \"已完成\": { value: 1, label: \"已完成\" },\n deleted: { value: 2, label: \"已删除\" },\n removed: { value: 2, label: \"已删除\" },\n \"已删除\": { value: 2, label: \"已删除\" },\n all: { value: 4, label: \"全部任务\" },\n \"全部\": { value: 4, label: \"全部任务\" },\n \"全部任务\": { value: 4, label: \"全部任务\" },\n };\n if (raw in aliases) {\n return aliases[raw];\n }\n const parsed = Number.parseInt(raw, 10);\n const numericLabels: Record<number, string> = {\n 0: \"未完成\",\n 1: \"已完成\",\n 2: \"已删除\",\n 4: \"全部任务\",\n };\n if (parsed in numericLabels) {\n return { value: parsed, label: numericLabels[parsed] };\n }\n throw new Error(\"Invalid task state. Use all, 未完成, 已完成, or 已删除.\");\n}\n\nfunction parseCliTaskTimeField(\n value: string | undefined,\n fallback: \"dueTime\" | \"startTime\" | \"endTime\",\n): \"dueTime\" | \"startTime\" | \"endTime\" {\n const raw = (value ?? fallback).trim();\n const aliases: Record<string, \"dueTime\" | \"startTime\" | \"endTime\"> = {\n dueTime: \"dueTime\",\n due: \"dueTime\",\n \"到期时间\": \"dueTime\",\n startTime: \"startTime\",\n start: \"startTime\",\n \"开始时间\": \"startTime\",\n endTime: \"endTime\",\n end: \"endTime\",\n \"结束时间\": \"endTime\",\n };\n const match = aliases[raw] ?? aliases[raw.toLowerCase()];\n if (!match) {\n throw new Error(\"Invalid time field. Use dueTime, startTime, or endTime.\");\n }\n return match;\n}\n\nfunction parseCliOrderDirection(value: string | undefined): \"asc\" | \"desc\" {\n const raw = (value ?? \"asc\").trim().toLowerCase();\n if (raw === \"asc\" || raw === \"从近到远\" || raw === \"near\") {\n return \"asc\";\n }\n if (raw === \"desc\" || raw === \"从远到近\" || raw === \"far\") {\n return \"desc\";\n }\n throw new Error(\"Invalid order direction. Use asc or desc.\");\n}\n\nfunction formatCliTaskTimeField(value: \"dueTime\" | \"startTime\" | \"endTime\"): string {\n switch (value) {\n case \"startTime\":\n return \"开始时间\";\n case \"endTime\":\n return \"结束时间\";\n case \"dueTime\":\n default:\n return \"到期时间\";\n }\n}\n\nfunction unwrapEnvelopeData<T>(\n response:\n | T\n | {\n data?: T | null;\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 // ApiClient 会解包一部分 Alpha 响应,但旧接口仍可能返回 { data, isSuccess/resultCode }。\n // 这个 helper 只负责取 data,不吞掉上层对 isSuccess/resultCode 的错误判断。\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 | null }).data ?? undefined;\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 // 当前前端接口会一次返回任务组及其子任务。CLI 仍保留 --type,\n // 是为了让输出层可以稳定选择展示“任务”还是“任务组”。\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 case 2:\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 2:\n return 3;\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 formatTaskDisplayGroup(value: string | undefined): string {\n switch (value) {\n case \"favorite\":\n return \"我关注的\";\n case \"new\":\n return \"新任务\";\n case \"today\":\n return \"今天\";\n case \"coming_soon\":\n return \"即将进行\";\n case \"future\":\n return \"未来\";\n case \"not_specify_time\":\n return \"未指定时间\";\n case undefined:\n case \"\":\n return \"\";\n default:\n return value;\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 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 clampCliPendingLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 1) {\n return 50;\n }\n return Math.min(Math.floor(limit), 100);\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 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 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 { getCurrentEnvironmentPreset } from \"../../config/environments.js\";\nimport { ApiClient } from \"../../http/api-client.js\";\nimport { printSuccess } from \"../../output/envelope.js\";\nimport type { SessionStore } from \"../../session/store.js\";\nimport type {\n AlphaTimingDayGroup,\n AlphaTimingGenericResponse,\n AlphaTimingItem,\n AlphaTimingMatterItem,\n AlphaTimingPage,\n AlphaTimingSearchResponse,\n AlphaTimingTaskItem,\n AlphaTimingTaskPage,\n AlphaTimingWorkTypeItem,\n TimingCreateOptions,\n TimingListOptions,\n TimingMattersOptions,\n TimingTasksOptions,\n TimingWorktypesOptions,\n} from \"./types.js\";\n\n// 计时模块作为顶级业务模块维护。当前支持前端“我的菜单 - 计时 table”的列表查询、\n// 新增计时,以及新增计时时需要的项目/工作类型/任务参数发现命令。\n\n// 查询计时列表。请求参数对齐前端 analytic/list/list.controller.js 的 requestList:\n// GET /taskserver/api/v2/timing/timing/search,并带 xDate 时区偏移。\nexport async function runTimingList(\n options: TimingListOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createTimingClient(sessionStore);\n const page = clampPage(options.page ?? 1);\n const limit = clampTimingLimit(options.limit ?? 50);\n const range = buildTimingRange(options);\n const approveState = parseApproveState(options.approveState);\n const selectedUserId = normalizeOptionalString(options.userId);\n const response = await client.request<AlphaTimingSearchResponse>(\n \"GET\",\n \"/taskserver/api/v2/timing/timing/search\",\n {\n params: removeUndefinedProperties({\n pageIndex: page,\n pageSize: limit,\n startTime: range.startTime,\n endTime: range.endTime,\n createUserId: selectedUserId,\n keyword: normalizeOptionalString(options.keyword),\n matterPkId: normalizeOptionalString(options.matterId),\n workTypeId: normalizeOptionalString(options.workTypeId),\n approveState: approveState.value,\n xDate: getLocalTimezoneHourOffset(),\n }),\n },\n );\n\n if (response.succeed === false || response.isSuccess === false) {\n throw new Error(response.resultMsg ?? response.message ?? \"Timing list request failed.\");\n }\n\n const pageData = response.result ?? response.data ?? {};\n const groups = pageData.datas ?? pageData.data ?? [];\n const flatItems = flattenTimingGroups(groups);\n const fallbackItems = pageData.items ?? [];\n const timings = flatItems.length ? flatItems : fallbackItems;\n\n printSuccess({\n \"范围\": \"计时列表\",\n \"时间范围\": {\n \"预设\": range.label,\n \"开始\": range.startTime,\n \"结束\": range.endTime,\n },\n \"筛选\": {\n \"关键词\": options.keyword?.trim() ?? \"\",\n \"项目ID\": options.matterId?.trim() ?? \"\",\n \"工作类型ID\": options.workTypeId?.trim() ?? \"\",\n \"记录人ID\": selectedUserId ?? \"当前登录用户\",\n \"审核状态\": approveState.label,\n },\n \"累计计时\": formatTimingDuration(pageData.allTimingSum ?? pageData.timingSum ?? 0),\n \"总数\": pageData.totalCount ?? pageData.count ?? timings.length,\n \"页码\": pageData.pageIndex ?? page,\n \"每页数量\": pageData.pageSize ?? limit,\n \"按日期分组\": groups.map(toTimingDayGroupSummary),\n \"计时列表\": timings.map(toTimingSummary),\n });\n}\n\n// 查询新增计时时可关联的项目,对齐前端 clockService.queryProjectsForAddClock。\nexport async function runTimingMatters(\n options: TimingMattersOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createTimingClient(sessionStore);\n const keyword = normalizeOptionalString(options.keyword);\n const status = normalizeOptionalString(options.status) ?? \"0,2,7\";\n const response = await client.request<AlphaTimingGenericResponse<AlphaTimingMatterItem[]> | AlphaTimingMatterItem[]>(\n \"GET\",\n \"/taskserver/api/v2/timing/timing/getMatterList\",\n {\n params: removeUndefinedProperties({\n status,\n word: keyword,\n myStar: options.favorite ? 1 : undefined,\n }),\n },\n );\n ensureTimingSuccess(response, \"Timing matters request failed.\");\n\n const matters = unwrapTimingData<AlphaTimingMatterItem[]>(response) ?? (Array.isArray(response) ? response : []);\n const limit = clampTimingLimit(options.limit ?? 50);\n printSuccess({\n \"范围\": \"计时可关联项目\",\n \"搜索词\": keyword ?? \"\",\n \"项目状态\": status,\n \"我关注的\": options.favorite === true,\n \"总数\": matters.length,\n \"项目列表\": matters.slice(0, limit).map(toTimingMatterSummary),\n });\n}\n\n// 查询新增计时时可选的工作类型,对齐前端 workTypeService.getWorkTypesFormTimngList。\nexport async function runTimingWorktypes(\n options: TimingWorktypesOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createTimingClient(sessionStore);\n const matterId = normalizeOptionalString(options.matterId);\n const keyword = normalizeOptionalString(options.keyword);\n const state = Number.isFinite(options.state) ? options.state : -1;\n const response = await client.request<AlphaTimingGenericResponse<AlphaTimingWorkTypeItem[]> | AlphaTimingWorkTypeItem[]>(\n \"GET\",\n \"/taskserver/api/v2/timing/workTypes/v2\",\n {\n params: {\n matterId: matterId ?? \"\",\n state,\n },\n },\n );\n ensureTimingSuccess(response, \"Timing work types request failed.\");\n\n const workTypes = unwrapTimingData<AlphaTimingWorkTypeItem[]>(response) ?? (Array.isArray(response) ? response : []);\n const flattened = flattenTimingWorkTypes(workTypes);\n const filtered = keyword\n ? flattened.filter((item) => `${item.name ?? \"\"}${item.parentName ?? \"\"}`.includes(keyword))\n : flattened;\n const limit = clampTimingLimit(options.limit ?? 50);\n printSuccess({\n \"范围\": \"计时工作类型\",\n \"项目ID\": matterId ?? \"\",\n \"状态\": state,\n \"搜索词\": keyword ?? \"\",\n \"总数\": filtered.length,\n \"工作类型列表\": filtered.slice(0, limit).map(toTimingWorkTypeSummary),\n });\n}\n\n// 查询新增计时时可关联的任务。前端在已选项目时优先查询项目任务,\n// 未选项目时查询“我的负责人任务 by timing”。\nexport async function runTimingTasks(\n options: TimingTasksOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createTimingClient(sessionStore);\n const keyword = normalizeOptionalString(options.keyword);\n const matterId = normalizeOptionalString(options.matterId);\n const page = clampPage(options.page ?? 1);\n const limit = clampTimingLimit(options.limit ?? 20);\n const state = parseTimingTaskState(options.state);\n\n let response: AlphaTimingGenericResponse<AlphaTimingTaskPage> | AlphaTimingTaskPage;\n let source: string;\n if (matterId && keyword) {\n source = \"项目任务搜索\";\n response = await client.request<AlphaTimingGenericResponse<AlphaTimingTaskPage> | AlphaTimingTaskPage>(\n \"GET\",\n \"/api/v2/taskflow/queryMobileTask\",\n {\n params: {\n name: keyword,\n stateType: state.matterStateType,\n queryType: 0,\n pageSize: limit,\n pageIndex: page,\n matterId,\n },\n },\n );\n } else if (matterId) {\n source = \"项目任务\";\n response = await client.request<AlphaTimingGenericResponse<AlphaTimingTaskPage> | AlphaTimingTaskPage>(\n \"GET\",\n \"/taskserver/api/v1/tasks/matterTasks/simpleInfo\",\n {\n params: {\n matterId,\n stateType: state.matterStateType,\n pageSize: limit,\n pageIndex: page,\n },\n },\n );\n } else {\n source = \"个人/负责人任务\";\n response = await client.request<AlphaTimingGenericResponse<AlphaTimingTaskPage> | AlphaTimingTaskPage>(\n \"POST\",\n \"/taskserver/api/v1/tasks/responsibleTasksByTiming\",\n {\n data: {\n searchValue: keyword ?? \"\",\n status: state.personalStatus,\n pageSize: limit,\n pageIndex: page,\n },\n },\n );\n }\n\n ensureTimingSuccess(response, \"Timing tasks request failed.\");\n const pageData = unwrapTimingData<AlphaTimingTaskPage>(response) ?? response as AlphaTimingTaskPage;\n const tasks = pageData.items ?? pageData.data ?? [];\n printSuccess({\n \"范围\": \"计时可关联任务\",\n \"来源\": source,\n \"搜索词\": keyword ?? \"\",\n \"项目ID\": matterId ?? \"\",\n \"项目名称\": options.matterName ?? \"\",\n \"状态\": state.label,\n \"总数\": pageData.totalCount ?? pageData.count ?? tasks.length,\n \"页码\": pageData.pageIndex ?? page,\n \"每页数量\": pageData.pageSize ?? limit,\n \"任务列表\": tasks.map((task) => toTimingTaskSummary(task, matterId, options.matterName)),\n });\n}\n\n// 新增一条已完成计时,对齐前端列表页快捷新增:POST /timing/add。\nexport async function runTimingCreate(\n options: TimingCreateOptions,\n sessionStore: SessionStore,\n): Promise<void> {\n const client = await createTimingClient(sessionStore);\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Missing timing description. Use --name <description>.\");\n }\n\n const workDate = normalizeTimingWorkDate(options.workDate);\n const startTime = parseTimingDateTime(options.startTime, workDate);\n const endTime = parseTimingDateTime(options.endTime, workDate);\n const duration = parseTimingDurationInput(options.duration);\n const times = buildTimingCreateTimes(startTime, endTime, duration);\n const matterId = normalizeOptionalString(options.matterId);\n const taskId = normalizeOptionalString(options.taskId);\n const workTypeId = normalizeOptionalString(options.workTypeId);\n\n const body = removeUndefinedProperties({\n name,\n startTime: times.startTime,\n endTime: times.endTime,\n useTime: times.useTime,\n workDate,\n matterPkId: matterId && matterId !== \"-1\" ? matterId : undefined,\n taskPkId: taskId,\n workTypeId,\n });\n const response = await client.request<AlphaTimingGenericResponse<AlphaTimingItem>>(\n \"POST\",\n \"/taskserver/api/v2/timing/timing/add\",\n {\n data: body,\n },\n );\n ensureTimingSuccess(response, response.resultMsg ?? response.message ?? \"Timing create request failed.\");\n\n const timing = unwrapTimingData<AlphaTimingItem>(response) ?? {};\n printSuccess({\n \"计时ID\": timing.pkId ?? timing.id ?? \"\",\n \"工作描述\": timing.name ?? name,\n \"工作日期\": formatDateOnly(timing.workDate ?? workDate),\n \"开始时间\": formatTimeOnly(timing.startTime ?? times.startTime),\n \"结束时间\": formatTimeOnly(timing.endTime ?? times.endTime),\n \"计时时长\": formatTimingDuration(timing.useTime ?? times.useTime),\n \"项目ID\": timing.matterPkId ?? body.matterPkId ?? \"\",\n \"任务ID\": timing.taskPkId ?? taskId ?? \"\",\n \"工作类型ID\": timing.workTypeId ?? workTypeId ?? \"\",\n \"结果\": \"已创建\",\n });\n}\n\nasync function createTimingClient(sessionStore: SessionStore): Promise<ApiClient> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n return new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n}\n\nfunction ensureTimingSuccess(response: unknown, fallbackMessage: string): void {\n if (!response || typeof response !== \"object\" || Array.isArray(response)) {\n return;\n }\n const item = response as AlphaTimingGenericResponse;\n if (item.succeed === false || item.success === false || item.isSuccess === false) {\n throw new Error(item.resultMsg ?? item.message ?? item.msg ?? fallbackMessage);\n }\n if (item.resultCode !== undefined && item.resultCode !== 1 && item.resultCode !== \"1\" && item.resultCode !== 200 && item.resultCode !== \"200\") {\n throw new Error(item.resultMsg ?? item.message ?? item.msg ?? fallbackMessage);\n }\n}\n\nfunction unwrapTimingData<T>(response: unknown): T | undefined {\n if (!response || typeof response !== \"object\" || Array.isArray(response)) {\n return undefined;\n }\n const item = response as AlphaTimingGenericResponse<T>;\n return item.data ?? item.result;\n}\n\nfunction toTimingMatterSummary(item: AlphaTimingMatterItem): Record<string, unknown> {\n return {\n \"项目ID\": item.id ?? item.pkId ?? item.matterPkId ?? \"\",\n \"项目名称\": item.name ?? item.matterName ?? \"\",\n \"项目编号\": item.serialNo ?? item.code ?? \"\",\n \"客户\": item.clientName ?? item.customerName ?? \"\",\n \"项目状态\": item.matterStatus ?? item.status ?? \"\",\n };\n}\n\nfunction flattenTimingWorkTypes(\n items: AlphaTimingWorkTypeItem[],\n parentName = \"\",\n): Array<AlphaTimingWorkTypeItem & { parentName?: string }> {\n return items.flatMap((item) => {\n if (item.parentWorkType) {\n return flattenTimingWorkTypes(item.subWorkTypes ?? [], item.parentWorkType.name ?? parentName);\n }\n const current = {\n ...item,\n parentName: item.parentName ?? parentName,\n };\n const children = item.children ?? item.childList ?? item.subWorkTypes ?? [];\n return [\n current,\n ...flattenTimingWorkTypes(children, item.name ?? parentName),\n ];\n });\n}\n\nfunction toTimingWorkTypeSummary(item: AlphaTimingWorkTypeItem & { parentName?: string }): Record<string, unknown> {\n return {\n \"工作类型ID\": item.id ?? item.pkId ?? \"\",\n \"工作类型\": item.name ?? \"\",\n \"父级工作类型\": item.parentName ?? \"\",\n \"父级ID\": item.parentId ?? \"\",\n };\n}\n\nfunction parseTimingTaskState(value: string | undefined): {\n label: string;\n matterStateType: number;\n personalStatus: number;\n} {\n const raw = value?.trim();\n if (!raw || raw === \"未完成\" || raw === \"unfinished\" || raw === \"todo\") {\n return { label: \"未完成\", matterStateType: 0, personalStatus: 1 };\n }\n if (raw === \"已完成\" || raw === \"finished\" || raw === \"done\") {\n return { label: \"已完成\", matterStateType: 1, personalStatus: 2 };\n }\n throw new Error(\"Invalid timing task state. Use 未完成 or 已完成.\");\n}\n\nfunction toTimingTaskSummary(\n item: AlphaTimingTaskItem,\n fallbackMatterId: string | undefined,\n fallbackMatterName: string | undefined,\n): Record<string, unknown> {\n const workType = item.workType;\n const matter = item.matter;\n return {\n \"任务ID\": item.id ?? item.pkId ?? \"\",\n \"任务名称\": item.name ?? item.taskName ?? \"\",\n \"项目ID\": item.matterId ?? item.matterPkId ?? matter?.id ?? matter?.pkId ?? fallbackMatterId ?? \"\",\n \"项目名称\": item.matterName ?? matter?.name ?? fallbackMatterName ?? \"\",\n \"工作类型ID\": item.workTypeId ?? workType?.id ?? workType?.pkId ?? \"\",\n \"工作类型\": item.workTypeName ?? workType?.name ?? \"\",\n \"状态\": formatTimingTaskState(item.state ?? item.status),\n };\n}\n\nfunction formatTimingTaskState(value: string | number | boolean | undefined): string {\n if (value === true || String(value) === \"1\") {\n return \"已完成\";\n }\n if (value === false || String(value) === \"0\" || value === undefined || value === \"\") {\n return \"未完成\";\n }\n return String(value);\n}\n\nfunction normalizeTimingWorkDate(value: string | undefined): string {\n if (!value) {\n return formatLocalDate(new Date());\n }\n const parsed = parseDateTime(value);\n if (!parsed) {\n throw new Error(\"Invalid work date. Use YYYY-MM-DD.\");\n }\n return formatLocalDate(parsed);\n}\n\nfunction parseTimingDateTime(value: string | undefined, fallbackDate: string): number | undefined {\n const raw = normalizeOptionalString(value);\n if (!raw) {\n return undefined;\n }\n const normalized = /^\\d{1,2}:\\d{2}$/.test(raw) ? `${fallbackDate} ${raw}` : raw;\n const parsed = parseDateTime(normalized);\n if (!parsed) {\n throw new Error(\"Invalid timing time. Use HH:mm or YYYY-MM-DD HH:mm.\");\n }\n return parsed.getTime();\n}\n\nfunction parseTimingDurationInput(value: string | undefined): number | undefined {\n const raw = normalizeOptionalString(value);\n if (!raw) {\n return undefined;\n }\n const colon = /^(\\d{1,3}):(\\d{1,2})$/.exec(raw);\n if (colon) {\n const hours = Number.parseInt(colon[1] ?? \"0\", 10);\n const minutes = Number.parseInt(colon[2] ?? \"0\", 10);\n if (minutes >= 60) {\n throw new Error(\"Invalid duration minutes. Use HH:mm, e.g. 01:30.\");\n }\n return normalizeTimingDurationMilliseconds((hours * 60 + minutes) * 60_000);\n }\n const decimalHours = /^(\\d+(?:\\.\\d+)?)h$/i.exec(raw);\n if (decimalHours) {\n return normalizeTimingDurationMilliseconds(Number.parseFloat(decimalHours[1] ?? \"0\") * 3_600_000);\n }\n const minutes = /^(\\d+(?:\\.\\d+)?)(m|min|分钟)?$/i.exec(raw);\n if (minutes) {\n return normalizeTimingDurationMilliseconds(Number.parseFloat(minutes[1] ?? \"0\") * 60_000);\n }\n throw new Error(\"Invalid duration. Use minutes, 90m, 1.5h, or HH:mm.\");\n}\n\nfunction normalizeTimingDurationMilliseconds(milliseconds: number): number {\n if (!Number.isFinite(milliseconds) || milliseconds <= 0) {\n throw new Error(\"Duration must be greater than 0.\");\n }\n // 前端新增已完成计时时,不足 1 分钟会按 1 分钟保存。\n return Math.ceil(milliseconds / 60_000) * 60_000;\n}\n\nfunction buildTimingCreateTimes(\n startTime: number | undefined,\n endTime: number | undefined,\n duration: number | undefined,\n): {\n startTime: number;\n endTime: number;\n useTime: number;\n} {\n if (startTime !== undefined && endTime !== undefined) {\n if (endTime <= startTime) {\n throw new Error(\"End time must be later than start time.\");\n }\n return {\n startTime,\n endTime,\n useTime: normalizeTimingDurationMilliseconds(endTime - startTime),\n };\n }\n if (startTime !== undefined && duration !== undefined) {\n return {\n startTime,\n endTime: startTime + duration,\n useTime: duration,\n };\n }\n if (endTime !== undefined && duration !== undefined) {\n return {\n startTime: endTime - duration,\n endTime,\n useTime: duration,\n };\n }\n throw new Error(\"Use --start-time and --end-time, or combine one time with --duration.\");\n}\n\nfunction buildTimingRange(options: TimingListOptions): {\n label: string;\n startTime: string;\n endTime: string;\n} {\n const explicitStart = options.startTime ?? options.rangeFrom;\n const explicitEnd = options.endTime ?? options.rangeTo;\n if (explicitStart || explicitEnd) {\n if (!explicitStart || !explicitEnd) {\n throw new Error(\"Use --start-time and --end-time together, or use --range this-month.\");\n }\n return {\n label: \"自定义\",\n startTime: normalizeDateOnlyOrDateTime(explicitStart, false),\n endTime: normalizeDateOnlyOrDateTime(explicitEnd, true),\n };\n }\n\n const range = (options.range ?? \"this-month\").trim().toLowerCase();\n const now = new Date();\n if (range === \"today\" || range === \"今天\") {\n return {\n label: \"今天\",\n startTime: formatLocalDate(startOfLocalDay(now)),\n endTime: formatLocalDate(endOfLocalDay(now)),\n };\n }\n if (range === \"this-week\" || range === \"week\" || range === \"本周\") {\n const day = now.getDay();\n const mondayOffset = day === 0 ? -6 : 1 - day;\n const start = startOfLocalDay(addLocalDays(now, mondayOffset));\n const end = endOfLocalDay(addLocalDays(start, 6));\n return {\n label: \"本周\",\n startTime: formatLocalDate(start),\n endTime: formatLocalDate(end),\n };\n }\n if (range === \"this-month\" || range === \"month\" || range === \"本月\") {\n return {\n label: \"本月\",\n startTime: formatLocalDate(new Date(now.getFullYear(), now.getMonth(), 1)),\n endTime: formatLocalDate(new Date(now.getFullYear(), now.getMonth() + 1, 0)),\n };\n }\n throw new Error(\"Invalid range. Use today, this-week, this-month, or explicit --start-time/--end-time.\");\n}\n\nfunction parseApproveState(value: string | undefined): { value?: string; label: string } {\n const raw = value?.trim();\n if (!raw || raw === \"all\" || raw === \"全部\" || raw === \"所有状态\") {\n return { label: \"所有状态\" };\n }\n if (raw === \"1\" || raw === \"approved\" || raw === \"已审核\") {\n return { value: \"1\", label: \"已审核\" };\n }\n if (raw === \"0\" || raw === \"unapproved\" || raw === \"未审核\") {\n return { value: \"0\", label: \"未审核\" };\n }\n throw new Error(\"Invalid approve state. Use all, 已审核, 未审核, 1, or 0.\");\n}\n\nfunction flattenTimingGroups(groups: AlphaTimingDayGroup[]): AlphaTimingItem[] {\n return groups.flatMap((group) =>\n (group.timingEntityList ?? []).flatMap((timing) => [\n timing,\n ...(timing.timingUpdateRecords ?? []).map((record) => ({\n ...record,\n pkId: record.pkId ?? record.id,\n })),\n ]),\n );\n}\n\nfunction toTimingDayGroupSummary(group: AlphaTimingDayGroup): Record<string, unknown> {\n const timings = group.timingEntityList ?? [];\n return {\n \"日期\": formatDateOnly(group.dayTimeStamp),\n \"星期\": formatWeekday(group.dayTimeStamp),\n \"当日计时\": formatTimingDuration(group.todayTimings),\n \"数量\": timings.length,\n };\n}\n\nfunction toTimingSummary(item: AlphaTimingItem): Record<string, unknown> {\n return {\n \"计时ID\": item.pkId ?? item.id ?? \"\",\n \"记录人ID\": item.createUserId ?? \"\",\n \"记录人\": item.username ?? \"\",\n \"项目ID\": item.matterPkId ?? \"\",\n \"项目名称\": item.matterName ?? \"个人计时\",\n \"任务ID\": item.taskPkId ?? \"\",\n \"任务名称\": item.taskName ?? \"\",\n \"工作类型ID\": item.workTypeId ?? \"\",\n \"工作类型\": item.workTypeName ?? \"\",\n \"工作描述\": stripHtml(item.highLightName ?? item.name ?? \"\"),\n \"工作日期\": formatDateOnly(item.workDate),\n \"开始时间\": formatTimeOnly(item.startTime),\n \"结束时间\": formatTimeOnly(item.endTime),\n \"计时时长\": formatTimingDuration(item.useTime),\n \"标准工时\": formatTimingDuration(item.standardTime),\n \"状态\": formatTimingState(item.state),\n \"审核状态\": formatApproveState(item.approveState),\n \"对外审核状态\": formatRequestState(item.requestState),\n \"异常状态\": formatAnomalyState(item.anomalyStatus),\n \"异常原因\": item.anomalyReason ?? \"\",\n };\n}\n\nfunction normalizeDateOnlyOrDateTime(value: string, endOfDay: boolean): string {\n const raw = value.trim();\n const dateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(raw);\n if (dateOnly) {\n return raw;\n }\n const parsed = parseDateTime(raw);\n if (!parsed) {\n throw new Error(\"Invalid timing date. Use YYYY-MM-DD or a valid date-time string.\");\n }\n if (endOfDay) {\n return formatLocalDate(endOfLocalDay(parsed));\n }\n return formatLocalDate(startOfLocalDay(parsed));\n}\n\nfunction formatTimingDuration(milliseconds: number | undefined): string {\n if (!milliseconds || milliseconds <= 0) {\n return \"00:00'\";\n }\n const hours = Math.floor(milliseconds / 3_600_000);\n const minutes = Math.floor((milliseconds % 3_600_000) / 60_000);\n return `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}'`;\n}\n\nfunction formatTimingState(value: string | number | undefined): string {\n if (String(value) === \"1\" || value === undefined) {\n return \"有效\";\n }\n if (String(value) === \"0\") {\n return \"已删除/无效\";\n }\n return String(value);\n}\n\nfunction formatApproveState(value: string | number | undefined): string {\n if (String(value) === \"1\") {\n return \"已审核\";\n }\n if (String(value) === \"0\" || value === undefined || value === \"\") {\n return \"未审核\";\n }\n return String(value);\n}\n\nfunction formatRequestState(value: string | number | undefined): string {\n if (String(value) === \"1\") {\n return \"已对外审核\";\n }\n if (String(value) === \"0\" || value === undefined || value === \"\") {\n return \"未对外审核\";\n }\n return String(value);\n}\n\nfunction formatAnomalyState(value: string | number | boolean | undefined): string {\n if (value === true || String(value) === \"1\") {\n return \"正常\";\n }\n if (value === false || String(value) === \"0\") {\n return \"异常\";\n }\n return value === undefined || value === \"\" ? \"\" : String(value);\n}\n\nfunction formatDateOnly(value: string | number | undefined): string {\n const date = parseDateTime(value);\n if (!date) {\n return value === undefined || value === null ? \"\" : String(value).slice(0, 10);\n }\n return formatLocalDate(date);\n}\n\nfunction formatTimeOnly(value: string | number | undefined): string {\n const date = parseDateTime(value);\n if (!date) {\n return value === undefined || value === null ? \"\" : String(value);\n }\n const hour = String(date.getHours()).padStart(2, \"0\");\n const minute = String(date.getMinutes()).padStart(2, \"0\");\n return `${hour}:${minute}`;\n}\n\nfunction formatWeekday(value: string | number | undefined): string {\n const date = parseDateTime(value);\n if (!date) {\n return \"\";\n }\n return `星期${[\"日\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\"][date.getDay()]}`;\n}\n\nfunction parseDateTime(value: string | number | undefined): Date | null {\n if (value === undefined || value === null || value === \"\") {\n return null;\n }\n if (typeof value === \"number\") {\n return dateFromTimestamp(value);\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n if (/^\\d+$/.test(trimmed)) {\n return dateFromTimestamp(Number.parseInt(trimmed, 10));\n }\n const parsed = new Date(trimmed.replace(/-/g, \"/\"));\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\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 startOfLocalDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);\n}\n\nfunction endOfLocalDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n}\n\nfunction addLocalDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days, 0, 0, 0, 0);\n}\n\nfunction getLocalTimezoneHourOffset(): number {\n return -(new Date().getTimezoneOffset() / 60);\n}\n\nfunction normalizeOptionalString(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction removeUndefinedProperties<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined),\n ) as T;\n}\n\nfunction stripHtml(value: string): string {\n return value.replace(/<[^>]+>/g, \"\");\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 clampTimingLimit(limit: number): number {\n if (!Number.isFinite(limit) || limit < 1) {\n return 50;\n }\n return Math.min(Math.floor(limit), 100);\n}\n","import { getCurrentEnvironmentPreset } from \"../../config/environments.js\";\nimport { ApiClient } from \"../../http/api-client.js\";\nimport { printSuccess } from \"../../output/envelope.js\";\nimport type { SessionStore } from \"../../session/store.js\";\nimport type {\n AlphaHrUserItem,\n AlphaUserAccountTypeInfo,\n AlphaUserDepartmentItem,\n AlphaUserGenericResponse,\n AlphaUserRankItem,\n AlphaUserSearchResponse,\n UserListOptions,\n UserOptionListOptions,\n} from \"./types.js\";\n\n// user 是面向“人力资源 - 成员列表”的顶级模块。\n// 当前只开放查询能力,写操作仍然不暴露给 CLI,避免误改 HR 基础资料。\n\nexport async function runUserList(options: UserListOptions, sessionStore: SessionStore): Promise<void> {\n const client = await createUserClient(sessionStore);\n const page = clampPage(options.page ?? 1);\n const limit = clampLimit(options.limit ?? 20);\n const status = parseUserStatus(options.status);\n const accountTypes = parseAccountTypes(options.accountType ?? options.userType);\n const keyword = normalizeOptionalString(options.keyword ?? options.name ?? options.username);\n const phone = normalizeOptionalString(options.phone);\n const email = normalizeOptionalString(options.email);\n const rankIds = parseCommaSeparatedValues(options.rankIds ?? options.officeMemberLevelIds);\n const position = normalizeOptionalString(options.position ?? options.zhiWu);\n const joinTime = buildDateRange(options.joinFrom, options.joinTo);\n const managerIds = parseCommaSeparatedValues(options.managerIds);\n const departmentIds = parseCommaSeparatedValues(options.departmentIds ?? options.dptIds);\n\n // 对齐前端 HrMemberController.initStatus 和 HrManageController.filterParams。\n // 顶部搜索框统一传 name;后端会按成员姓名/登录用户名等文本字段查询。\n const requestBody = removeUndefinedProperties({\n status: status.value,\n userType: accountTypes,\n officeMemberLevelIds: rankIds,\n zhiWu: position ?? \"\",\n joinTime,\n phone,\n email,\n manager: managerIds,\n dptIds: departmentIds,\n type: -1,\n name: keyword ?? \"\",\n order: null,\n isAsc: \"N\",\n queryExpandUserInfoParamVO: {},\n startPage: page,\n pageSize: limit,\n itemOrAnd: false,\n });\n\n const response = await client.requestRaw<AlphaUserSearchResponse | AlphaHrUserItem[]>(\n \"POST\",\n \"/user/api/v1/auth/search/lawyer\",\n {\n data: requestBody,\n },\n );\n\n const pageData = normalizeUserSearchResponse(response);\n const users = pageData.items.map((item) => ({\n ...item,\n ...(item.expandUser ?? {}),\n }));\n\n printSuccess({\n \"范围\": \"人力资源成员\",\n \"筛选\": {\n \"关键词\": keyword ?? \"\",\n \"手机号\": phone ?? \"\",\n \"邮箱\": email ?? \"\",\n \"账号状态\": status.label,\n \"账号类型\": accountTypes.length ? accountTypes.map(formatAccountType) : [\"全部\"],\n \"职级ID\": rankIds,\n \"职务\": position ?? \"\",\n \"入职时间\": joinTime,\n \"直属上级ID\": managerIds,\n \"所属部门ID\": departmentIds,\n },\n \"总数\": pageData.total,\n \"页码\": page,\n \"每页数量\": limit,\n \"成员列表\": users.map(toUserSummary),\n });\n}\n\nexport async function runUserStatuses(): Promise<void> {\n printSuccess({\n \"范围\": \"账号状态选项\",\n \"来源\": \"前端写死\",\n \"选项列表\": [\n { \"状态\": \"在职\", \"值\": 1 },\n { \"状态\": \"离职\", \"值\": 0 },\n { \"状态\": \"全部\", \"值\": -1 },\n ],\n });\n}\n\nexport async function runUserAccountTypes(sessionStore: SessionStore): Promise<void> {\n const client = await createUserClient(sessionStore);\n const session = await sessionStore.getSession();\n const officeId = await getCurrentOfficeId(sessionStore);\n const response = await client.requestRaw<AlphaUserGenericResponse<{ typeNumList?: AlphaUserAccountTypeInfo[] }>>(\n \"GET\",\n \"/ilaw/api/v1/auth/up/getTypeNumber\",\n {\n params: {\n officeId,\n },\n },\n );\n ensureUserSuccess(response, \"User account type request failed.\");\n const typeNumList = response.data?.typeNumList ?? [];\n const enabledTypes = new Set(typeNumList.filter((item) => (item.limitNum ?? 0) > 0).map((item) => item.userType));\n printSuccess({\n \"范围\": \"账号类型选项\",\n \"来源\": \"/ilaw/api/v1/auth/up/getTypeNumber\",\n \"律所ID\": officeId,\n \"当前用户ID\": session?.userId ?? \"\",\n \"选项列表\": [\"A\", \"B\", \"Z\"].map((type) => {\n const info = typeNumList.find((item) => item.userType === type);\n return {\n \"账号类型\": formatAccountType(type),\n \"值\": type,\n \"是否可用\": type === \"Z\" ? true : enabledTypes.has(type),\n \"已开通数量\": info?.userNum ?? 0,\n \"限制数量\": info?.limitNum ?? \"\",\n };\n }),\n });\n}\n\nexport async function runUserRanks(options: UserOptionListOptions, sessionStore: SessionStore): Promise<void> {\n const client = await createUserClient(sessionStore);\n const keyword = normalizeOptionalString(options.keyword);\n const limit = clampLimit(options.limit ?? 50);\n const response = await client.requestRaw<AlphaUserGenericResponse<AlphaUserRankItem[]>>(\n \"GET\",\n \"/user/api/v1/officeMemberLevels\",\n {\n params: {\n levelType: 3,\n },\n },\n );\n ensureUserSuccess(response, \"User rank request failed.\");\n const ranks = filterByKeyword(response.data ?? [], keyword, (item) => item.levelName);\n printSuccess({\n \"范围\": \"职级选项\",\n \"搜索词\": keyword ?? \"\",\n \"总数\": ranks.length,\n \"职级列表\": ranks.slice(0, limit).map(toRankSummary),\n });\n}\n\nexport async function runUserManagers(options: UserOptionListOptions, sessionStore: SessionStore): Promise<void> {\n const client = await createUserClient(sessionStore);\n const officeId = await getCurrentOfficeId(sessionStore);\n const keyword = normalizeOptionalString(options.keyword);\n const limit = clampLimit(options.limit ?? 50);\n const response = await client.requestRaw<AlphaUserGenericResponse<AlphaHrUserItem[]> | AlphaHrUserItem[]>(\n \"GET\",\n `/ilaw/api/v1/auth/q/allByOfficeId/${encodeURIComponent(officeId)}`,\n );\n const users = Array.isArray(response) ? response : response.data ?? [];\n if (!Array.isArray(response)) {\n ensureUserSuccess(response, \"User manager request failed.\");\n }\n const managers = filterByKeyword(users, keyword, (item) => [item.name, item.userName, item.username, item.phone].join(\" \"));\n printSuccess({\n \"范围\": \"直属上级选项\",\n \"来源\": `/ilaw/api/v1/auth/q/allByOfficeId/${officeId}`,\n \"搜索词\": keyword ?? \"\",\n \"总数\": managers.length,\n \"成员列表\": managers.slice(0, limit).map(toManagerSummary),\n });\n}\n\nexport async function runUserDepartments(options: UserOptionListOptions, sessionStore: SessionStore): Promise<void> {\n const client = await createUserClient(sessionStore);\n const keyword = normalizeOptionalString(options.keyword);\n const limit = clampLimit(options.limit ?? 50);\n const response = await client.requestRaw<AlphaUserGenericResponse<AlphaUserDepartmentItem>>(\n \"GET\",\n \"/permission/api/v1/permission/department/allDepartment\",\n );\n ensureUserSuccess(response, \"User department request failed.\");\n const departments = filterByKeyword(flattenDepartments(response.data ? [response.data] : []), keyword, (item) => item.name);\n printSuccess({\n \"范围\": \"所属部门选项\",\n \"搜索词\": keyword ?? \"\",\n \"总数\": departments.length,\n \"部门列表\": departments.slice(0, limit).map(toDepartmentSummary),\n });\n}\n\nasync function createUserClient(sessionStore: SessionStore): Promise<ApiClient> {\n const config = await sessionStore.getConfig();\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n return new ApiClient({\n sessionStore,\n apiBaseUrl: environment.apiBaseUrl,\n timeoutMs: config.timeoutMs,\n });\n}\n\nfunction normalizeUserSearchResponse(response: AlphaUserSearchResponse | AlphaHrUserItem[]): {\n total: number;\n items: AlphaHrUserItem[];\n} {\n if (Array.isArray(response)) {\n return {\n total: response.length,\n items: response,\n };\n }\n if (response.resultCode !== undefined && Number(response.resultCode) !== 1) {\n throw new Error(response.resultMsg ?? response.resultMess ?? response.message ?? \"User list request failed.\");\n }\n const items = Array.isArray(response.data) ? response.data : [];\n return {\n total: response.total ?? items.length,\n items,\n };\n}\n\nfunction ensureUserSuccess(response: AlphaUserGenericResponse, fallback: string): void {\n const resultCode = response.resultCode;\n if (\n response.isSuccess === false ||\n response.succeed === false ||\n (resultCode !== undefined && Number(resultCode) !== 1)\n ) {\n throw new Error(response.resultMsg ?? response.resultMess ?? response.message ?? fallback);\n }\n}\n\nfunction toUserSummary(item: AlphaHrUserItem & Record<string, unknown>): Record<string, unknown> {\n return {\n \"用户ID\": stringifyId(item.userId ?? item.id),\n \"姓名\": item.name ?? \"\",\n \"用户名\": item.userName ?? item.username ?? \"\",\n \"手机号\": formatPhone(item),\n \"邮箱\": item.email ?? \"\",\n \"账号状态\": formatUserStatus(item.status, item.statusFormat),\n \"账号类型\": formatAccountType(item.userType),\n \"成员类型\": formatMemberType(item.type),\n \"职级\": item.levelName ?? \"\",\n \"职务\": item.zhiWu ?? \"\",\n \"直属上级\": item.managerName ?? \"\",\n \"所属部门\": item.gnames ?? \"\",\n \"入职时间\": formatDateOnly(item.joinTimeFormat ?? item.joinTime),\n \"离职时间\": formatDateOnly(item.leaveTimeFormat ?? item.leaveTime),\n };\n}\n\nfunction toRankSummary(item: AlphaUserRankItem): Record<string, unknown> {\n return {\n \"职级ID\": stringifyId(item.id),\n \"职级\": item.levelName ?? \"\",\n \"成员类型\": formatMemberType(item.levelType),\n \"状态\": String(item.status) === \"1\" ? \"停用\" : \"启用\",\n \"小时成本\": item.hourCost ?? \"\",\n \"标准费率\": item.hourCharge ?? \"\",\n \"标准工作时长\": item.standWorkTime ?? \"\",\n };\n}\n\nfunction toManagerSummary(item: AlphaHrUserItem): Record<string, unknown> {\n return {\n \"用户ID\": stringifyId(item.userId ?? item.id),\n \"姓名\": item.name ?? \"\",\n \"用户名\": item.userName ?? item.username ?? \"\",\n \"手机号\": formatPhone(item),\n \"账号状态\": formatUserStatus(item.status, item.statusFormat),\n \"账号类型\": formatAccountType(item.userType),\n };\n}\n\nfunction toDepartmentSummary(item: AlphaUserDepartmentItem & { parentNamePath?: string }): Record<string, unknown> {\n return {\n \"部门ID\": stringifyId(item.id),\n \"部门名称\": item.name ?? \"\",\n \"上级部门ID\": stringifyId(item.parentId),\n \"上级部门\": item.parentName ?? \"\",\n \"部门路径\": item.parentNamePath ? `${item.parentNamePath} / ${item.name ?? \"\"}` : item.name ?? \"\",\n };\n}\n\nfunction parseUserStatus(value?: string): { value: number; label: string } {\n const normalized = normalizeOptionalString(value);\n if (!normalized || normalized === \"在职\" || normalized === \"on\" || normalized === \"active\" || normalized === \"1\") {\n return { value: 1, label: \"在职\" };\n }\n if (normalized === \"离职\" || normalized === \"left\" || normalized === \"inactive\" || normalized === \"0\") {\n return { value: 0, label: \"离职\" };\n }\n if (normalized === \"all\" || normalized === \"全部\" || normalized === \"-1\" || normalized === \"不限\") {\n return { value: -1, label: \"全部\" };\n }\n throw new Error(\"Invalid user status. Use: 在职, 离职, all, 1, 0, or -1.\");\n}\n\nfunction parseAccountTypes(value?: string): string[] {\n const normalized = normalizeOptionalString(value);\n if (!normalized || normalized === \"all\" || normalized === \"全部\" || normalized === \"不限\") {\n return [];\n }\n return normalized\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n .map(normalizeAccountType);\n}\n\nfunction parseCommaSeparatedValues(value?: string): string[] {\n const normalized = normalizeOptionalString(value);\n if (!normalized || normalized === \"all\" || normalized === \"全部\" || normalized === \"不限\") {\n return [];\n }\n return normalized\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction buildDateRange(start?: string, end?: string): { startTime: string; endTime: string } {\n return {\n startTime: normalizeDate(start) ?? \"\",\n endTime: normalizeDate(end) ?? \"\",\n };\n}\n\nfunction normalizeDate(value?: string): string | undefined {\n const normalized = normalizeOptionalString(value);\n if (!normalized) {\n return undefined;\n }\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(normalized)) {\n throw new Error(\"Invalid date. Use YYYY-MM-DD.\");\n }\n return normalized;\n}\n\nasync function getCurrentOfficeId(sessionStore: SessionStore): Promise<string> {\n const session = await sessionStore.getSession();\n const config = await sessionStore.getConfig();\n const officeId = session?.officeId ?? config.defaultOfficeId;\n if (!officeId) {\n throw new Error(\"Cannot resolve office id. Run: alpha-classic-cli doctor, or login again.\");\n }\n return officeId;\n}\n\nfunction filterByKeyword<T>(items: T[], keyword: string | undefined, selector: (item: T) => string | undefined): T[] {\n if (!keyword) {\n return items;\n }\n const lowered = keyword.toLowerCase();\n return items.filter((item) => (selector(item) ?? \"\").toLowerCase().includes(lowered));\n}\n\nfunction flattenDepartments(\n departments: AlphaUserDepartmentItem[],\n parent?: AlphaUserDepartmentItem & { parentNamePath?: string },\n): Array<AlphaUserDepartmentItem & { parentNamePath?: string }> {\n return departments.flatMap((department) => {\n const current = {\n ...department,\n parentId: department.parentId ?? parent?.id,\n parentName: department.parentName ?? parent?.name,\n parentNamePath: parent?.parentNamePath ? `${parent.parentNamePath} / ${parent.name ?? \"\"}` : parent?.name,\n };\n return [\n current,\n ...flattenDepartments(department.subDepartmentDTO ?? [], current),\n ];\n });\n}\n\nfunction normalizeAccountType(value: string): string {\n const upper = value.toUpperCase();\n if (upper === \"A\" || value === \"A类账号\" || value === \"A类\") {\n return \"A\";\n }\n if (upper === \"B\" || value === \"B类账号\" || value === \"B类\") {\n return \"B\";\n }\n if (upper === \"Z\" || value === \"非ALPHA账号\" || value === \"非Alpha账号\" || value === \"非alpha账号\") {\n return \"Z\";\n }\n throw new Error(\"Invalid account type. Use: A, B, Z, A类账号, B类账号, or 非Alpha账号.\");\n}\n\nfunction formatAccountType(value: unknown): string {\n if (value === \"A\") {\n return \"A类账号\";\n }\n if (value === \"B\") {\n return \"B类账号\";\n }\n if (value === \"Z\") {\n return \"非Alpha账号\";\n }\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n}\n\nfunction formatUserStatus(value: unknown, fallback?: string): string {\n if (fallback) {\n return fallback;\n }\n if (String(value) === \"1\") {\n return \"在职\";\n }\n if (String(value) === \"0\") {\n return \"离职\";\n }\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n}\n\nfunction formatMemberType(value: unknown): string {\n if (String(value) === \"0\") {\n return \"合伙人\";\n }\n if (String(value) === \"1\") {\n return \"律师\";\n }\n if (String(value) === \"2\") {\n return \"行政\";\n }\n if (String(value) === \"-1\") {\n return \"全部\";\n }\n return value === undefined || value === null || value === \"\" ? \"\" : String(value);\n}\n\nfunction formatPhone(item: AlphaHrUserItem): string {\n const phone = item.phone ?? \"\";\n if (!phone) {\n return \"\";\n }\n const zone = item.zone ? String(item.zone).replace(/^00/, \"+\") : \"\";\n return zone && zone !== \"+86\" ? `${zone} ${phone}` : phone;\n}\n\nfunction formatDateOnly(value: unknown): string {\n if (value === undefined || value === null || value === \"\") {\n return \"\";\n }\n if (typeof value === \"number\") {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n return date.toISOString().slice(0, 10);\n }\n }\n const text = String(value).slice(0, 10);\n if (/^\\d{8}$/.test(text)) {\n return `${text.slice(0, 4)}-${text.slice(4, 6)}-${text.slice(6, 8)}`;\n }\n return text;\n}\n\nfunction stringifyId(value: unknown): string {\n return value === undefined || value === null ? \"\" : String(value);\n}\n\nfunction clampPage(value: number): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(\"Page must be a positive integer.\");\n }\n return value;\n}\n\nfunction clampLimit(value: number): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(\"Limit must be a positive integer.\");\n }\n return Math.min(value, 100);\n}\n\nfunction normalizeOptionalString(value?: string): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction removeUndefinedProperties<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n","import { getCurrentEnvironmentPreset } from \"../config/environments.js\";\nimport { printSuccess } from \"../output/envelope.js\";\nimport type { SessionStore } from \"../session/store.js\";\n\ninterface VersionInfo {\n name: string;\n version: string;\n}\n\nexport async function runVersion(info: VersionInfo, sessionStore: SessionStore): Promise<void> {\n const environment = await getCurrentEnvironmentPreset(sessionStore);\n // 该命令保持 JSON 结构,便于 agent 读取;Commander 仍保留纯文本 --version。\n printSuccess({\n \"名称\": info.name,\n \"版本\": info.version,\n \"所属系统\": \"Alpha 律所管理系统\",\n \"环境\": environment.name,\n \"baseUrl\": environment.baseUrl,\n \"apiBaseUrl\": environment.apiBaseUrl,\n \"环境是否可运行时切换\": true,\n \"环境来源\": environment.source,\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 // 退出登录只清理用户身份缓存,环境配置保留给后续命令继续使用。\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","skillPath","getCurrentUserData","clampLimit","clampPage","clampLimit","unwrapEnvelopeData","formatMatterLevel","formatDateTime","parseDateTime","formatMatterLevel","unwrapEnvelopeData","parseDateTime","clampLimit","parseDateTime","dateFromTimestamp","clampPage","clampLimit","unwrapEnvelopeData","parseCommaSeparatedValues","formatDateTime","clampCommentLimit","formatTotalTiming","removeUndefinedProperties","parseDateTime","formatRawStatus","path","unwrapEnvelopeData","path","formatDateTime","clampLimit","clampPage","clampCommentLimit","parseDateTime","dateFromTimestamp","clampPage","normalizeOptionalString","removeUndefinedProperties","formatDateOnly","formatLocalDate","parseDateTime","minutes","startOfLocalDay","endOfLocalDay","addLocalDays","stripHtml","dateFromTimestamp","clampPage","clampLimit","normalizeOptionalString","parseCommaSeparatedValues","removeUndefinedProperties","flattenDepartments","formatUserStatus","formatDateOnly","fs","os","path","require","createRequire"]}