@hcmai/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/exit.ts","../src/middleware/auth-guard.ts","../src/utils/attachment-args.ts","../src/utils/slash.ts","../src/streaming/TerminalRenderer.ts","../src/streaming/StreamPresenter.ts","../src/repl/InkRendererBridge.ts","../src/repl/BlockView.tsx","../src/repl/MultilineInput.tsx","../src/repl/types.ts","../src/repl/App.tsx","../src/repl/run.ts","../src/streaming/control-prompt.ts","../src/io/readline.ts","../src/index.ts","../src/package-version.ts","../src/commands/login.ts","../src/utils/prompt.ts","../src/commands/config.ts","../src/commands/env.ts","../src/utils/table.ts","../src/commands/query.ts","../src/commands/action.ts","../src/commands/create.ts","../src/commands/update.ts","../src/commands/setting.ts","../src/commands/version.ts","../src/commands/delete.ts","../src/commands/import.ts","../src/commands/describe.ts","../src/commands/chat.ts","../src/commands/download.ts","../src/commands/trace.ts","../src/commands/cache.ts","../src/commands/upload.ts","../src/commands/skills.ts","../src/commands/tenant.ts","../src/commands/meta.ts","../src/commands/workspace.ts","../src/commands/workspace-format.ts","../src/commands/identity.ts"],"sourcesContent":["import { CliError } from '@hcmai/sdk';\n\nexport function exitWithError(err: unknown): never {\n if (err instanceof CliError) {\n process.stderr.write(`Error: ${err.toFormattedString()}\\n`);\n process.exit(err.exitCode);\n }\n if (err instanceof Error) {\n process.stderr.write(`Error: ${err.message}\\n`);\n process.exit(1);\n }\n process.stderr.write(`Error: ${String(err)}\\n`);\n process.exit(1);\n}\n\nexport function exitOk(stdout?: string): never {\n if (stdout) process.stdout.write(stdout + '\\n');\n process.exit(0);\n}\n","import axios from 'axios';\nimport {\n ensureSessionFresh,\n loadGlobalConfig,\n loadEnv,\n loadIdentity,\n resolveActiveEnv,\n resolveActiveIdentity,\n listEnvs,\n CliError,\n CliErrorCode,\n type ClientAuthContext,\n} from '@hcmai/sdk';\n\nexport interface AuthContext {\n env: string;\n endpoint: string;\n tenantId: string;\n identity: string;\n}\n\n/**\n * Resolve the active auth context for a business command.\n *\n * Priority for env: `args.envFlag > HCM_ENV > HCM_PROFILE > global.activeEnv`.\n * Priority for identity: `args.asFlag > HCM_IDENTITY > env.defaultIdentity > first identity in env`.\n *\n * Throws CliError:\n * - NO_ACTIVE_ENV when no env is configured on disk\n * - IDENTITY_NOT_FOUND when env has no identity (via resolveActiveIdentity)\n * - TOKEN_EXPIRED when identity.expiresAt < now\n *\n * 🔴 判过期**之前**先尝试续期。原因是本地的 `expiresAt` 只是服务端状态的一份缓存:\n * 后端 `TokenAuthenticationFilter` 在每个带 token 的请求上都会滑动续期,而这份缓存\n * 是登录那一刻算死的、之后再没更新过 —— 直接拿它判,就是**用一个早就过时的本地值\n * 去拒绝服务端明明还认的 token**。`ensureSessionFresh` 打一次无条件续期端点并把结果\n * 写回本地,让这个判断重新变成真的。它 best-effort,不抛。\n */\nexport async function ensureActiveAuth(args: {\n envFlag?: string;\n asFlag?: string;\n}): Promise<AuthContext> {\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.envFlag }, process.env, g);\n\n // verify env exists on disk (handles fresh install where activeEnv='default' has no file)\n const envs = await listEnvs();\n if (!envs.includes(envName)) {\n throw new CliError({\n code: CliErrorCode.NO_ACTIVE_ENV,\n message: `no env configured. Run: hcm env add <name> --endpoint <url> && hcm login --env <name>`,\n });\n }\n\n const envCfg = await loadEnv(envName);\n const identityName = await resolveActiveIdentity(\n { asFlag: args.asFlag },\n process.env,\n envName,\n );\n let idMeta = await loadIdentity(identityName);\n\n // 续上会话再判过期。续期成功会改写同一份 meta,所以要重读。\n const slid = await ensureSessionFresh({\n endpoint: envCfg.endpoint,\n identity: identityName,\n httpClient: axios.create({ baseURL: envCfg.endpoint, timeout: 30_000 }),\n });\n if (slid) idMeta = await loadIdentity(identityName);\n\n if (idMeta.expiresAt && new Date(idMeta.expiresAt) < new Date()) {\n throw new CliError({\n code: CliErrorCode.TOKEN_EXPIRED,\n message: `identity '${identityName}' token expired. Run: hcm login --env ${envName}`,\n });\n }\n\n return {\n env: envName,\n endpoint: envCfg.endpoint,\n // 服务端认定的租户优先。`envCfg.tenantId` 是登录前的入参,它的缺省 `'1'` 是个\n // 猜测——ADR-177 之后新租户是 UUID,那个猜测几乎必然错。\n tenantId: idMeta.tenantId ?? envCfg.tenantId ?? '1',\n identity: identityName,\n };\n}\n\n/**\n * CLI sugar around `ensureActiveAuth` for business commands (T15).\n *\n * - Transpiles deprecated `--profile <name>` to `--env <name>` (one-time stderr warn)\n * - Forwards `--env` and `--as` flags to `ensureActiveAuth`\n * - Returns a `ClientAuthContext` ready for `HcmClient.fromAuthContext(ctx)`\n *\n * Use this in every business command (`query` / `action` / `describe` / `chat`\n * / `trace` / `workspace*`) so the env/identity resolution + deprecated flag\n * handling lives in one place.\n */\nexport async function getActiveAuthContextFromCli(\n args: {\n env?: string;\n /** @deprecated 用 --env 替代 — transpiled here with a stderr warning */\n profile?: string;\n as?: string;\n },\n /**\n * Optional fallback when neither flag nor env-var resolves an env. Used by\n * workspace commands that fall back to the bound env stored in the local\n * hcm.workspace.json. Kept as a separate arg (not args.env) so the\n * `--profile` transpile warning still fires independently.\n */\n opts?: { fallbackEnv?: string },\n): Promise<ClientAuthContext> {\n let envFlag = args.env;\n if (args.profile && !envFlag) {\n process.stderr.write(\n '[hcm] event=deprecated_flag flag=--profile replacement=--env\\n',\n );\n envFlag = args.profile;\n }\n if (!envFlag && opts?.fallbackEnv) envFlag = opts.fallbackEnv;\n const ctx = await ensureActiveAuth({ envFlag, asFlag: args.as });\n return ctx;\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * `@路径` 内联附件解析(issue #64 · 对标 Claude Code 的 @ mention 交互手势)。\n *\n * 从消息文本提取 `@` 前缀且指向存在本地文件的 token,返回清理后的文本与路径列表。\n * 支持 `~` 展开与引号包裹的含空格路径(`@\"my file.pdf\"`)。`@` 后不是存在文件的\n * token(如 @某人 称呼)原样保留——存在性检查即歧义消解。\n */\nexport function extractAtFileTokens(text: string): { cleaned: string; paths: string[] } {\n const paths: string[] = [];\n // @\"quoted path\" | @'quoted path' | @bare-token(到空白为止)\n const re = /@(?:\"([^\"]+)\"|'([^']+)'|(\\S+))/g;\n const cleaned = text\n .replace(re, (match, dq: string | undefined, sq: string | undefined, bare: string | undefined) => {\n const candidate = dq ?? sq ?? bare ?? '';\n const abs = expandHome(candidate);\n if (isExistingFile(abs)) {\n paths.push(abs);\n return '';\n }\n return match;\n })\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n return { cleaned, paths };\n}\n\n/**\n * 行内「裸绝对路径」内联附件解析(无 `@` 前缀、与正文同行)。\n *\n * 补 {@link extractAtFileTokens}(要 `@` 前缀)与 {@link isBareFilePath}(要整行就一个路径)\n * 之间的缺口:终端粘贴图片/剪贴板自动插入的绝对路径常是「`/var/folders/.../clipboard-x.png`\n * 给某人换头像」这种「路径 + 同行文字、无 `@`」形态——旧两检测器都接不住,裸路径漏进消息\n * 文本 → 传给 LLM 当散文 → 幻觉成别的路径(实测 bug)。这里识别 `/` 或 `~/` 开头的 token\n * (含引号包裹的含空格绝对路径),**存在性检查消歧**:只有真指向本地文件的才当附件剥离,\n * 普通含「/」的文字(`他/她`、日期 `2026/06/13`、URL path)因不存在对应文件而原样保留。\n */\nexport function extractInlineFilePaths(text: string): { cleaned: string; paths: string[] } {\n const paths: string[] = [];\n // \"abs path\" | 'abs path' | 裸 abs token(到空白为止);三支都要求以 / 或 ~/ 开头。\n const re = /\"((?:\\/|~\\/)[^\"]+)\"|'((?:\\/|~\\/)[^']+)'|((?:\\/|~\\/)\\S+)/g;\n const cleaned = text\n .replace(re, (match, dq: string | undefined, sq: string | undefined, bare: string | undefined) => {\n const candidate = dq ?? sq ?? bare ?? '';\n const abs = expandHome(candidate);\n if (isExistingFile(abs)) {\n paths.push(abs);\n return '';\n }\n return match;\n })\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n return { cleaned, paths };\n}\n\n/** 整条消息恰为一个存在的文件路径(粘贴路径场景,D4 一期)。 */\nexport function isBareFilePath(text: string): string | null {\n const t = text.trim().replace(/^[\"']|[\"']$/g, '');\n if (!t || t.includes('\\n')) return null;\n const abs = expandHome(t);\n return isExistingFile(abs) ? abs : null;\n}\n\nfunction expandHome(p: string): string {\n return p.startsWith('~') ? path.join(os.homedir(), p.slice(1)) : path.resolve(p);\n}\n\nfunction isExistingFile(p: string): boolean {\n try {\n return fs.statSync(p).isFile();\n } catch {\n return false;\n }\n}\n","export interface SlashCommand {\n name: string;\n args: string[];\n}\n\nexport function parseSlash(line: string): SlashCommand | null {\n if (!line.startsWith('/')) return null;\n const parts = line.slice(1).trim().split(/\\s+/);\n return { name: parts[0]!, args: parts.slice(1) };\n}\n\n/** REPL 输入区的 slash 命令补全候选。 */\nexport interface SlashCommandSpec {\n cmd: string;\n desc: string;\n /** 命令带参数(如 /attach <路径>):回车/Tab 只补全命令名并留空格,不立即提交。 */\n takesArgs?: boolean;\n}\n\n/** 输入框可补全的 slash 命令目录(顺序即菜单展示顺序)。 */\nexport const SLASH_COMMANDS: SlashCommandSpec[] = [\n { cmd: '/new', desc: '开新会话' },\n { cmd: '/attach', desc: '添加附件', takesArgs: true },\n { cmd: '/send', desc: '发送当前草稿' },\n { cmd: '/help', desc: '帮助' },\n { cmd: '/exit', desc: '退出' },\n];\n\n/** 输入是否处于「正在敲 slash 命令名」状态(/ 开头、尚未出现空格进入参数区)。 */\nexport function isSlashTyping(input: string): boolean {\n return input.startsWith('/') && !input.includes(' ') && !input.includes('\\n');\n}\n\n/** 按前缀过滤候选命令;非「敲命令名」状态返回空数组(菜单关闭)。 */\nexport function filterSlashCommands(\n input: string,\n commands: SlashCommandSpec[] = SLASH_COMMANDS,\n): SlashCommandSpec[] {\n if (!isSlashTyping(input)) return [];\n return commands.filter((c) => c.cmd.startsWith(input));\n}\n\n/** 菜单候选索引归一(支持负数 / 越界回绕)。 */\nexport function wrapIndex(index: number, length: number): number {\n if (length <= 0) return 0;\n return ((index % length) + length) % length;\n}\n\n/** slash 菜单打开时一次按键的归宿(纯函数,便于测试)。 */\nexport type SlashKeyAction =\n | { type: 'move'; delta: number }\n | { type: 'complete'; text: string } // 补全到输入框,不提交(带参命令 / Tab)\n | { type: 'execute'; text: string } // 补全并立即提交(无参命令回车)\n | { type: 'none' };\n\n/** 把按键 + 当前选中项映射为菜单动作;不识别的键返回 none(交还输入框默认行为)。 */\nexport function resolveSlashKey(\n key: { upArrow?: boolean; downArrow?: boolean; tab?: boolean; return?: boolean },\n selected: SlashCommandSpec | undefined,\n): SlashKeyAction {\n if (key.upArrow) return { type: 'move', delta: -1 };\n if (key.downArrow) return { type: 'move', delta: 1 };\n if (!selected) return { type: 'none' };\n if (key.tab) return { type: 'complete', text: selected.cmd + (selected.takesArgs ? ' ' : '') };\n if (key.return) {\n return selected.takesArgs\n ? { type: 'complete', text: selected.cmd + ' ' }\n : { type: 'execute', text: selected.cmd };\n }\n return { type: 'none' };\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\nimport { marked } from 'marked';\n// marked-terminal v7: 用 named export markedTerminal() 返回 marked extension\nimport { markedTerminal } from 'marked-terminal';\nimport { absoluteDownloadUrl, type InteractionRequest, type ResumeSummary } from '@hcmai/sdk';\n\n/**\n * OSC 8 终端超链接:把 text 标记为指向 url 的可点链接。链接是字符单元的属性,\n * **跨行不失效**——绕开终端对「软/硬换行的长 URL」不自动识别(点不动)的坑。\n * Ghostty / iTerm2 / WezTerm / kitty / VS Code 终端均支持;不支持的终端降级为纯 text。\n */\nexport function terminalHyperlink(url: string, text: string): string {\n return `\u001b]8;;${url}\u0007${text}\u001b]8;;\u0007`;\n}\n\n/** 终端可读行宽:管道/CI 无 columns 时 80;超宽终端钳到 120 保持行长可读。 */\nfunction termWidth(): number {\n const c = process.stdout.columns;\n return c && c > 40 ? Math.min(c, 120) : 80;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal({ width: termWidth() }) as any);\n\nexport interface TerminalRendererOptions {\n markdown: boolean;\n showThinking: boolean;\n /** verbose 时展开 thinking content; 默认 false → 仅单行总结 (类似 web \"✓ 推理完成 Xs\") */\n verboseThinking?: boolean;\n showToolCalls: boolean;\n /** verbose 时显示 tool args; 默认 false → 仅显示 tool name + 状态 */\n verboseTools?: boolean;\n spinner: boolean;\n color: boolean;\n /** 可注入 writer(测试捕获输出用);缺省走 process.stdout.write */\n sink?: (s: string) => void;\n /** 后端地址(HcmClient.endpoint),用于把相对下载链接拼成可点的绝对签名 URL(ADR-140)。 */\n apiBase?: string;\n}\n\n/** 已知 agent 中文显示名映射, 跟 web 端 AGENT_PALETTES 对齐. agentKey 未知时 fallback 用 raw key. */\nconst AGENT_NAMES: Record<string, string> = {\n moirai: 'Moirai',\n analyst: '数据分析专家',\n hr: 'HR 专家',\n reporter: '报表专家',\n trans_mgr: '调动管理员',\n recruiter: '招聘专家',\n talent_dev: '人才发展专家',\n meta_config: '元数据配置专家',\n alert_mgr: '监控专家',\n flow_mgr: '流程专家',\n knowledge: '知识库专家',\n exporter: '导出专家',\n comp: '薪酬专家',\n 'comp-analyst': '薪酬分析专家',\n notifier: '通知专家',\n troubleshooter: '排障专家',\n};\n\n/** agent 显示名(presenter 拼 spinner 委派摘要时也用)。 */\nexport function agentDisplayName(agentKey: string): string {\n return AGENT_NAMES[agentKey] ?? agentKey;\n}\n\n/** ask 卡 choice 文案:string 直用;对象取 label/value/text 字段兜底 JSON 化。 */\nfunction choiceLabel(c: unknown): string {\n if (typeof c === 'string') return c;\n if (c && typeof c === 'object') {\n const o = c as Record<string, unknown>;\n const v = o.label ?? o.value ?? o.text;\n if (typeof v === 'string') return v;\n try { return JSON.stringify(c); } catch { /* fallthrough */ }\n }\n return String(c);\n}\n\n/** G6 · 终态行额外统计(in/out token 分解 + 工具/委派计数)。全为可选,0 值省略。 */\nexport interface CompletionLineStats {\n inputTokens?: number;\n outputTokens?: number;\n toolCount?: number;\n delegationCount?: number;\n}\n\nexport class TerminalRenderer {\n private spinner: Ora | null = null;\n private chatBuffer: string = '';\n private thinkingActive = false;\n private thinkingBuffer = '';\n private thinkingStartMs = 0;\n private depth = 0;\n /**\n * 行首状态机:所有输出统一经 write() 跟踪末字符。块级输出(工具行/委派/卡片/终态)\n * 前必过 blockBoundary()——2026-06-11 实测的「正文与工具行黏连/缩进忽 2 忽 4/孤儿 ✓ 行」\n * 三类乱象共同根因就是各方法独立 write、互不知道光标在不在行首。\n */\n private atLineStart = true;\n\n constructor(private readonly opts: TerminalRendererOptions) {\n if (!opts.color) {\n // chalk v5 不可关 level via assign; 用 ChalkInstance level=0 处理\n // 全局降级\n chalk.level = 0;\n }\n }\n\n private write(text: string): void {\n if (!text) return;\n (this.opts.sink ?? ((s: string) => { process.stdout.write(s); }))(text);\n this.atLineStart = text.endsWith('\\n');\n }\n\n private indent(): string {\n return ' '.repeat(this.depth);\n }\n\n /** 光标不在行首时补换行。 */\n private ensureLineStart(): void {\n if (!this.atLineStart) this.write('\\n');\n }\n\n /** 块级输出统一前置:停 spinner → 渲染收口累积正文 → 确保行首。 */\n private blockBoundary(): void {\n this.stopSpinner();\n this.flushChatBuffer();\n this.ensureLineStart();\n }\n\n /**\n * 流式正文 chunk。\n *\n * markdown 开(TTY 默认):段落级流式渲染——chunk 累积进 chatBuffer,每攒满一个完整\n * 段落(`\\n\\n` 边界、且 code fence 已闭合)立即过 marked 渲染输出,未完段留 buffer。\n * 修复 2026-06-11 实测灾难:旧实现全程只累积、终态才一次性渲染,62s 任务正文零流式。\n *\n * markdown 关(管道/--no-markdown):逐 chunk 直写。行首缩进由「当前在行首 + depth>0」\n * 单点决定,chunk 尾换行不再预挂缩进(旧实现残留 2 空格是缩进忽 2 忽 4 的根因)。\n */\n writeChatChunk(text: string): void {\n this.stopSpinner();\n this.chatBuffer += text;\n if (this.opts.markdown) {\n this.flushCompleteParagraphs();\n return;\n }\n let out = text.replace(/\\n(?!$)/g, '\\n' + this.indent());\n if (this.atLineStart && this.depth > 0) out = this.indent() + out;\n this.write(out);\n }\n\n /**\n * 把 chatBuffer 中已完整的段落渲染输出;半截 code fence(``` 计数为奇)推迟到闭合。\n * fence 判定按 CommonMark:行首 0-3 空格 + ```(不用 \\s*——它会吃换行,把行内三反引号\n * 误计入奇偶,致段落被误判未闭合而退化回「憋到终态」;2026-06-11 review I3)。\n */\n private flushCompleteParagraphs(): void {\n const idx = this.chatBuffer.lastIndexOf('\\n\\n');\n if (idx < 0) return;\n const head = this.chatBuffer.slice(0, idx + 2);\n const fences = (head.match(/(?:^|\\n) {0,3}```/g) ?? []).length;\n if (fences % 2 === 1) return;\n this.chatBuffer = this.chatBuffer.slice(idx + 2);\n this.renderMarkdown(head);\n }\n\n /** 渲染一段 markdown 并按 depth 缩进输出,段尾统一单空行(对齐 Claude Code 段间距)。 */\n private renderMarkdown(text: string): void {\n const src = text.replace(/\\n+$/, '');\n if (!src.trim()) return;\n const rendered = (marked.parse(src) as string).replace(/\\n+$/, '');\n if (!rendered) return;\n this.ensureLineStart();\n const indented = this.depth > 0\n ? this.indent() + rendered.replace(/\\n/g, '\\n' + this.indent())\n : rendered;\n this.write(indented + '\\n\\n');\n }\n\n /** 渲染收口累积正文(终态/块级边界时调)。markdown 关时正文已直写,仅校正行首。 */\n flushChatBuffer(): void {\n if (this.opts.markdown) {\n const rest = this.chatBuffer;\n this.chatBuffer = '';\n this.renderMarkdown(rest);\n } else {\n this.chatBuffer = '';\n this.ensureLineStart();\n }\n }\n\n startSpinner(text: string): void {\n if (!this.opts.spinner) return;\n if (this.spinner) {\n // 已在转:仅换文案,避免 stop/start 闪烁。\n this.spinner.text = chalk.gray(text);\n return;\n }\n // spinner 永远独占一行:半行正文上直接 start 会被 ora 的 clearLine 抹掉。\n this.ensureLineStart();\n // discardStdin 必须关(2026-06-12 REPL 第二轮挂死 RCA):ora 默认接管并丢弃 stdin,\n // 与 REPL 的 readline 同 stdin 共存时,多次 start/stop 会破坏 readline 的行事件\n // 监听——第二轮输入回显正常但 line 事件永不触发(无 spinner 无 Error 纯空白挂死)。\n this.spinner = ora({ text: chalk.gray(text), discardStdin: false }).start();\n }\n\n updateSpinner(text: string): void {\n if (this.spinner) this.spinner.text = chalk.gray(text);\n }\n\n stopSpinner(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n // ora.stop() 清掉 spinner 行并把光标归位行首。\n this.atLineStart = true;\n }\n }\n\n /**\n * thinking 流。默认折叠:累积字符数,endThinking 时单行总结「✓ 推理完成 (Xs · N chars)」。\n * 首 chunk 自动起算(旧实现靠零调用的 showThinkingHeader 置位 thinkingActive,\n * 导致总结行从未显示过——2026-06-11 审计钉出的死配置)。\n */\n writeThinkingChunk(text: string): void {\n if (!this.opts.showThinking) return;\n if (!this.thinkingActive) {\n this.thinkingActive = true;\n this.thinkingBuffer = '';\n this.thinkingStartMs = Date.now();\n if (this.opts.verboseThinking) {\n this.blockBoundary();\n this.write(chalk.gray.italic('💭 thinking…\\n'));\n }\n }\n this.thinkingBuffer += text;\n if (this.opts.verboseThinking) {\n this.write(chalk.gray.italic(text));\n }\n }\n\n endThinking(): void {\n if (!this.opts.showThinking || !this.thinkingActive) return;\n const elapsedSec = Math.max(0, (Date.now() - this.thinkingStartMs) / 1000);\n const chars = this.thinkingBuffer.length;\n this.ensureLineStart();\n if (this.opts.verboseThinking) {\n this.write(chalk.gray('─'.repeat(40)) + '\\n');\n } else if (chars > 0) {\n this.write(chalk.gray(`✓ 推理完成 (${elapsedSec.toFixed(1)}s · ${chars} chars)\\n`));\n }\n this.thinkingActive = false;\n this.thinkingBuffer = '';\n }\n\n showInterrupted(reason: string): void {\n this.blockBoundary();\n this.write(chalk.yellow(`^C 已中断 (${reason})\\n`));\n }\n\n /**\n * 用户纠偏被注入的确认行(W1a-2,对齐 Web SteeringRow「↪ 纠偏」风格):\n * steer 命令发出后此前终端零确认,用户不知道纠偏有没有被采纳。\n * 仅后端真正注入(steering.applied 事件)时显示——不在发送时乐观显示。\n */\n steeringLine(contents: string[]): void {\n this.blockBoundary();\n for (const text of contents) {\n this.write(this.indent() + chalk.blue('↪ 纠偏 ') + chalk.gray(text) + '\\n');\n }\n }\n\n /**\n * 续会话上下文回顾(刀⑤,对标 Claude Code resume):续接已有 conversation 时\n * 在新输出前回显「续接提示行 + 最近 N 轮摘要」,让用户知道聊到哪了。\n * 整块 dim 弱化——它是背景回顾,不能比正文抢眼。\n */\n showResumeContext(summary: ResumeSummary): void {\n this.ensureLineStart();\n const shortId = summary.conversationId.length > 12\n ? '…' + summary.conversationId.slice(-12)\n : summary.conversationId;\n const shownRounds = summary.recent.filter((t) => t.role === 'user').length;\n const earlier = summary.totalRounds - shownRounds;\n const earlierNote = earlier > 0 ? `,更早 ${earlier} 轮略` : '';\n this.write(chalk.dim(`↻ 续接会话 ${shortId}(共 ${summary.totalRounds} 轮${earlierNote};不带 --resume 将开新会话)`) + '\\n');\n for (const turn of summary.recent) {\n if (turn.role === 'user') {\n this.write(chalk.dim(` > ${turn.text}`) + '\\n');\n } else {\n this.write(chalk.dim(` ${turn.text}`) + '\\n');\n }\n }\n this.write('\\n');\n }\n\n /**\n * 流结束完成行。G6 · 对标 Claude Code 终态行——单行紧凑 dim,信息密度拉满:\n * 耗时 · token(总量带 in/out 分解)· 工具调用数 · 委派数 · traceId · conversationId。\n * 0 值的可选段(in/out、工具、委派)省略,保持紧凑不堆砌。\n */\n showCompleted(\n durMs: number,\n traceId: string | null,\n conversationId: string,\n totalTokens?: number,\n stats?: CompletionLineStats,\n ): void {\n this.blockBoundary();\n const segs: string[] = [`${durMs}ms`];\n\n // token:总量 + in/out 分解(in/out 任一 > 0 才展开括号)。\n if (totalTokens) {\n const inTok = stats?.inputTokens ?? 0;\n const outTok = stats?.outputTokens ?? 0;\n const split = inTok > 0 || outTok > 0 ? ` (↑${inTok}/↓${outTok})` : '';\n segs.push(`${totalTokens} tok${split}`);\n }\n // 工具调用数 / 委派数(> 0 才出)。\n if (stats?.toolCount) segs.push(`${stats.toolCount} 工具`);\n if (stats?.delegationCount) segs.push(`${stats.delegationCount} 委派`);\n\n segs.push(`traceId ${traceId ?? '?'}`);\n segs.push(`conversation ${conversationId}`);\n this.write(chalk.dim(`\\n✓ done (${segs.join(' · ')})\\n`));\n }\n\n /**\n * v4 委派开始(折叠模式):单行「⏺ 委派 → 名」即收,子流过程不平铺——活动状态由\n * presenter 驱动 spinner 动态摘要(「⎿ 名 · …」),结束由 delegationEnd 统计收口。\n * 修复 2026-06-11 实测:子代理全程独白 + 最终表格平铺重复输出(Claude Code 对标:\n * 子 Task 折叠为单行摘要 + 工具计数)。\n */\n delegationStart(agentKey: string, _callId: string): void {\n this.blockBoundary();\n this.write(this.indent() + chalk.blue(`⏺ 委派 → ${agentDisplayName(agentKey)}`) + '\\n');\n this.depth += 1;\n }\n\n /**\n * v4 委派收口:「⎿ 完成 (N 工具 · X.Xs)」;有失败工具时一并标出。\n * success=false(委派整体失败)→ 红色「⎿ 委派失败」+ ADR-058 next_step 路标——\n * 失败委派绝不打绿勾(2026-06-11 review C1:旧版收口无 success 态,失败静默显成功)。\n */\n delegationEnd(\n _callId: string,\n durMs?: number,\n toolCount?: number,\n failCount?: number,\n success: boolean = true,\n nextSteps?: string[],\n ): void {\n this.blockBoundary();\n const segs: string[] = [];\n if (toolCount) segs.push(`${toolCount} 工具${failCount ? `,${failCount} 失败` : ''}`);\n if (durMs) segs.push(`${(durMs / 1000).toFixed(1)}s`);\n const detail = segs.length > 0 ? ` (${segs.join(' · ')})` : '';\n if (success) {\n this.write(this.indent() + chalk.gray(`⎿ 完成${detail}`) + '\\n');\n } else {\n this.write(this.indent() + chalk.red(`⎿ ✗ 委派失败${detail}`) + '\\n');\n if (nextSteps && nextSteps.length > 0) this.writeNextSteps(nextSteps);\n }\n this.depth = Math.max(0, this.depth - 1);\n }\n\n /**\n * v4 工具行(整行原子输出):tool.result 到达时一次打印「⚙ name preview ✓ 12ms」。\n * 旧「tool() 打半行 + toolResult() 追加状态」模型已删——并行工具/正文 chunk 交错会把\n * 追加的 ✓/✗ 挤成孤儿行(2026-06-11 实测「✓ 0ms」孤儿)。执行中可见性由 spinner 文案承担。\n *\n * G5 · 失败时透出 ADR-058 `next_step` 路标(逐行 dim),用户看到下一步指引而非只一个 ✗。\n */\n toolLine(name: string, argsPreview: string, success: boolean, durMs: number, nextSteps?: string[]): void {\n this.blockBoundary();\n const status = success ? chalk.green('✓') : chalk.red('✗');\n const preview = argsPreview ? chalk.gray(` ${argsPreview}`) : '';\n this.write(this.indent() + chalk.cyan(`⚙ ${name}`) + preview + ' ' + status + chalk.gray(` ${durMs}ms`) + '\\n');\n if (!success && nextSteps && nextSteps.length > 0) {\n this.writeNextSteps(nextSteps);\n }\n }\n\n /** G5 · next_step 路标块:dim「↳ 下一步」标题 + 逐条缩进列表(对齐工具行缩进)。 */\n private writeNextSteps(steps: string[]): void {\n const pad = this.indent() + ' ';\n this.write(pad + chalk.dim('↳ 下一步:') + '\\n');\n for (const s of steps) {\n this.write(pad + chalk.dim(` • ${s}`) + '\\n');\n }\n }\n\n /** 来源行(仅子代理触发,agentPath ≥2 段时显示 `↑ 来自 a › b`,对齐 Web)。 */\n private originLine(path: string): string {\n const segs = path.split('.').filter(Boolean);\n if (segs.length < 2) return '';\n const names = segs.map((k) => agentDisplayName(k));\n return chalk.gray(` ↑ 来自 ${names.join(' › ')}`) + '\\n';\n }\n\n /** v4 控制通道 confirm 卡(醒目 box + 编号选项),对齐 Web ConfirmationCard。 */\n confirmCard(req: InteractionRequest): void {\n this.blockBoundary();\n const hi = req.riskLevel === 'HIGH' || req.riskLevel === 'CRITICAL';\n this.write('\\n' + chalk.yellow('┌─ CONFIRM' + (hi ? ' · 高风险' : '') + ' ' + '─'.repeat(20)) + '\\n');\n this.write(this.originLine(req.originAgentPath));\n if (req.toolName) this.write(chalk.gray(' 操作 ') + `${req.toolName}(${req.summary})` + '\\n');\n else this.write(chalk.gray(' 说明 ') + req.summary + '\\n');\n if (req.argsPreview) {\n const chips = Object.entries(req.argsPreview).map(([k, v]) => `${k}=${String(v)}`).join(' · ');\n this.write(chalk.gray(' 参数 ') + chips + '\\n');\n }\n this.write(chalk.yellow('─'.repeat(38)) + '\\n');\n this.write(hi ? ' 1) 批准 2) 驳回并说明\\n' : ' 1) 确认执行 2) 取消\\n');\n }\n\n /** v4 控制通道 ask 卡(轻量 ? 引导 + 编号 choices / 自由文本),对齐 Web AskCard。 */\n askCard(req: InteractionRequest): void {\n this.blockBoundary();\n const lastSeg = req.originAgentPath.split('.').pop() ?? '';\n const name = lastSeg ? agentDisplayName(lastSeg) : 'Moirai';\n this.write('\\n' + chalk.cyan(`? ${name} · 提问`) + '\\n');\n this.write(' ' + (req.question ?? req.summary) + '\\n');\n if (req.choices?.length) {\n // choices 元素可能是对象({label}/{value}/{text},控制通道 wire 形态)——\n // 直接模板插值会渲染成 [object Object](2026-06-12 实测)。\n req.choices.forEach((c, i) => this.write(` ${i + 1}) ${choiceLabel(c)} `));\n this.write('\\n');\n } else {\n this.write(chalk.dim(' (直接输入回答)') + '\\n');\n }\n }\n\n /** --auto-approve 下自动批准 confirm 时的审计行(不静默)。 */\n autoApproved(toolName: string | undefined, summary: string): void {\n this.ensureLineStart();\n this.write(chalk.gray(` ✓ 已自动批准: ${toolName ?? ''}(${summary})`) + '\\n');\n }\n\n /**\n * G4 · control.interaction.resolved(phase=RESUMED):决策已受理、继续执行(ADR-125)。\n * 不再让用户决策后视觉空白。\n */\n interactionResumed(): void {\n this.blockBoundary();\n this.write(chalk.green(' ✓ 已受理,继续执行…') + '\\n');\n }\n\n /**\n * G4 · control.interaction.resolved(phase=TERMINAL):交互终局(ADR-125),\n * status ∈ {COMPLETED, FAILED, SUPERSEDED}。按 status 渲染终局行。\n */\n interactionTerminal(status?: string): void {\n this.blockBoundary();\n if (status === 'FAILED') {\n this.write(chalk.red(' ✗ 交互失败') + '\\n');\n } else if (status === 'SUPERSEDED') {\n this.write(chalk.gray(' ↪ 交互已被新请求接管') + '\\n');\n } else {\n // COMPLETED(含 status 缺省)\n this.write(chalk.gray(' ✓ 交互完成') + '\\n');\n }\n }\n\n /**\n * v4 content_part 终端降级:终端画不了富内容,降级为「▸ 类型 · 标题」头行 +\n * insight 缩进副行的强调块(委派块内随 depth 缩进)——区别于正文灰色一行,\n * 富内容产物是结果本身,视觉层级须高于过程文本。\n */\n contentPartSummary(part: Record<string, unknown>): void {\n this.blockBoundary();\n const type = part.type as string;\n const pad = this.indent();\n if (type === 'chart') {\n this.write(pad + chalk.cyan(`▸ 图表 · ${(part.title as string) ?? ''}`) + '\\n');\n if (part.insight) this.write(pad + chalk.gray(` ${String(part.insight)}`) + '\\n');\n } else if (type === 'table') {\n this.write(pad + chalk.cyan(`▸ 表格 · ${(part.title as string) ?? ''}`) + '\\n');\n } else if (type === 'file' || type === 'fileDownload') {\n // fileDownload:文件名做成 OSC 8 超链接,点击由浏览器打开签名链接(ADR-140,免 Bearer)。\n // 不打印裸 URL——长签名 URL 换行后终端不自动识别(点不动);OSC 8 链接跨行仍可点。\n const fileName = (part.fileName as string) ?? '文件';\n const abs = part.downloadUrl ? absoluteDownloadUrl(this.opts.apiBase, String(part.downloadUrl)) : undefined;\n const head = abs ? terminalHyperlink(abs, `📎 ${fileName}`) : `📎 ${fileName}`;\n this.write(pad + chalk.cyan(`▸ ${head}`) + (abs ? chalk.gray(' ← 点击打开') : '') + '\\n');\n } else {\n this.write(pad + chalk.cyan(`▸ ${type}`) + '\\n');\n }\n }\n}\n","import { agentDisplayName, type TerminalRenderer } from './TerminalRenderer';\nimport { createV4Reducer, truncateDisplay, type V4RenderSink } from '@hcmai/sdk';\n\nexport interface StreamPresenterOptions {\n showToolCalls: boolean;\n output: 'text' | 'json';\n}\n\nexport interface StreamResult {\n status: 'completed' | 'interrupted' | 'incomplete';\n traceId: string | null;\n streamId?: string;\n conversationId?: string;\n}\n\n/** G6 · 终态行统计素材(流中累计)。 */\nexport interface CompletionStats {\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n toolCount: number;\n delegationCount: number;\n}\n\n/** 委派子流折叠态:子流文本/工具不平铺,凝成 spinner 活动摘要 + 收口统计。 */\ninterface DelegationMeta {\n name: string;\n toolCount: number;\n failCount: number;\n /** 子流文本滚动窗(取最后非空行做 spinner 摘要),上限防长会话累积。 */\n textTail: string;\n /** 跨暂停累计耗时:每段(暂停前 + RESUME 后)的 durMs 相加,收口时一次性透出。 */\n accumDurMs: number;\n /** 当前是否处于「暂停待应答」态(specialist 子流内 ASK/CONFIRM HALT,等用户应答续跑)。 */\n paused: boolean;\n}\n\n// 极简 logger,避免引入 winston\nconst debug = (...args: unknown[]): void => {\n if (process.env.HCM_DEBUG) console.error('[StreamPresenter]', ...args);\n};\n\n/**\n * StreamPresenter(v4):把 v4 block 流经 createV4Reducer 折成语义事件 → TerminalRenderer。\n * delete-on-supersede(ADR-120):v3 case 已全删,仅保留终态三事件(response.completed/failed/\n * interrupted)作 iterator 终态边界;展示流 6 事件(message.start / block 三件 / tool.result / message.stop)\n * 全部交给 reducer。output='json' 时旁路渲染、直打原始 envelope。\n *\n * 子流折叠(2026-06-11 对标 Claude Code):reducer 每个回调都带 parentToolUseId,\n * parent 非空(委派子流)的 text/thinking/tool 不进正文区——折叠为委派块 spinner 的\n * 动态活动摘要(「⎿ 数据分析专家 · …」),委派结束由 delegationEnd 收口统计行。\n * 修复实测灾难:子代理 80 行表格平铺一遍 + 主代理复述一遍的双重输出。\n */\nexport class StreamPresenter {\n private traceId: string | null = null;\n private streamId: string | undefined;\n private totalTokens = 0;\n // G6:终态行密度——in/out token 分解 + 工具调用数 + 委派数(流中统计)。\n private inputTokens = 0;\n private outputTokens = 0;\n private toolCount = 0;\n private delegationCount = 0;\n /** 已见 ROOT message.stop(end_turn)——iterator 收口后据此判 completed/incomplete。 */\n private sawRootStop = false;\n private readonly reducer: {\n handle: (type: string, payload: Record<string, unknown>) => boolean;\n };\n /** 委派折叠态(callId → 名字/工具计数/文本尾窗)。耗时不再自计——onDelegationEnd 带后端 durMs。 */\n private readonly delgMeta = new Map<string, DelegationMeta>();\n /** 工具行整行输出模型:result 到达才打整行,start 时暂存 name/argsPreview。 */\n private readonly pendingTools = new Map<string, { toolName: string; argsPreview: string }>();\n\n constructor(\n private readonly renderer: TerminalRenderer,\n private readonly opts: StreamPresenterOptions,\n ) {\n // G1:spinner 由 presenter 驱动(renderer 仅 TTY+spinner 开时真转,CI/raw 自动 no-op)。\n // 关键空白期:① 等 LLM 首 token ② 工具执行中 ③ 委派子流执行中。有真实输出即停转。\n const sink: V4RenderSink = {\n onText: (t, parent) => {\n if (parent) {\n this.bumpDelegationActivity(parent, t);\n return;\n }\n this.renderer.writeChatChunk(t); // 内部已 stopSpinner\n },\n onThinkingDelta: (t, parent) => {\n if (parent) {\n this.bumpDelegationActivity(parent, null, '思考中…');\n return;\n }\n this.renderer.writeThinkingChunk(t); // 折叠态保留「思考中…」spinner\n },\n onThinkingDone: (parent) => {\n if (!parent) this.renderer.endThinking();\n },\n onToolStarted: (callId, toolName, argsPreview, parent) => {\n this.pendingTools.set(callId, { toolName, argsPreview });\n if (parent) {\n // 子流工具:折叠——只更新委派活动摘要 + 计数,不打行。\n const d = this.delgMeta.get(parent);\n if (d) {\n d.toolCount += 1;\n this.renderer.updateSpinner(`⎿ ${d.name} · ⚙ ${toolName}…`);\n }\n return;\n }\n // 主流程:工具行等 result 到齐才整行输出(见 onToolResult),执行中由 spinner 透出。\n this.renderer.startSpinner(`执行工具 ${toolName}…`);\n },\n onToolResult: (callId, success, durMs, _childConvId, parent, nextSteps, toolName) => {\n const meta = this.pendingTools.get(callId);\n this.pendingTools.delete(callId);\n this.toolCount += 1; // G6:全局计数含子流工具\n if (parent) {\n const d = this.delgMeta.get(parent);\n if (d && !success) d.failCount += 1;\n return;\n }\n // G5:失败时透出 next_step 路标(成功 nextSteps 为 undefined)。\n // #1930:名字优先取 onToolStarted 暂存的(block.start 注册);无 start 的事件(缓存短路\n // no-op 等)用 reducer 兜底解析的 toolName;都没有才退回 `?`。\n if (this.opts.showToolCalls) {\n this.renderer.toolLine(meta?.toolName ?? toolName ?? '?', meta?.argsPreview ?? '', success, durMs, nextSteps);\n }\n // 工具结束 → 回到等下一轮 LLM 输出\n this.renderer.startSpinner('思考中…');\n },\n // content_part 是面向用户的产物(图表/表格/文件),子流产生的也透出(委派块内缩进显示)。\n onContentPart: (part) => this.renderer.contentPartSummary(part),\n // W1a-2:纠偏注入确认行——steer 后终端不再零反馈。\n onSteeringApplied: (contents) => this.renderer.steeringLine(contents),\n onDelegationStart: (agentKey, parentToolUseId) => {\n const existing = this.delgMeta.get(parentToolUseId);\n if (existing) {\n // RESUME:暂停应答后续跑同一委派块(同 parentToolUseId 再来 message.start)——\n // 不重复计数、不重画块头(CLI append-only 不能回填),仅复位活动 spinner。\n existing.paused = false;\n this.renderer.startSpinner(`⎿ ${existing.name} · 执行中…`);\n return;\n }\n this.delegationCount += 1; // G6:委派计数(暂停→续跑不重复计入)\n const name = agentDisplayName(agentKey);\n this.delgMeta.set(parentToolUseId, { name, toolCount: 0, failCount: 0, textTail: '', accumDurMs: 0, paused: false });\n this.renderer.delegationStart(agentKey, parentToolUseId); // 内部 blockBoundary\n this.renderer.startSpinner(`⎿ ${name} · 执行中…`);\n },\n onDelegationPaused: (parentToolUseId, durMs) => {\n const d = this.delgMeta.get(parentToolUseId);\n if (!d) return; // 无块可挂(理论不达:暂停必先有 delegationStart)\n // 暂停待应答:保留委派块不收口、累计本段耗时,等 RESUME 续跑收口成一条「完成」。\n // 可见反馈由 control 通道「✓ 已受理,继续执行…」+ 交互提示 UI 承载,此处不打收口行\n // (旧版把 transport success=false 渲染成红色「✗ 委派失败」= 假警报,本修复消除)。\n d.accumDurMs += durMs;\n d.paused = true;\n this.renderer.updateSpinner(`⎿ ${d.name} · ⏸ 等待应答…`);\n },\n onDelegationEnd: (parentToolUseId, success, durMs, nextSteps) => {\n const d = this.delgMeta.get(parentToolUseId);\n this.delgMeta.delete(parentToolUseId);\n if (!d) {\n // 子流从未启动(委派在路由/校验层直接失败,无 message.start)——没有委派块头行,\n // 失败渲染为普通失败工具行(委派本来就是 tool),成功则静默(无可收口的块)。\n if (!success) this.renderer.toolLine('hcm_delegate', '', false, durMs, nextSteps);\n this.renderer.startSpinner('思考中…');\n return;\n }\n // 累计跨暂停的各段耗时(暂停段已 onDelegationPaused 累入 accumDurMs)。\n const totalDurMs = d.accumDurMs + durMs;\n this.renderer.delegationEnd(parentToolUseId, totalDurMs, d.toolCount, d.failCount, success, nextSteps);\n this.renderer.startSpinner('思考中…');\n },\n onTerminal: (_stopReason, tokens) => {\n this.totalTokens = tokens || this.totalTokens;\n this.pendingTools.clear();\n // 暂停待应答的委派块要跨 HALT 的「中间 ROOT message.stop」存活(resume 段续跑后才\n // 由 onDelegationEnd 收口删除)——只清非暂停态,否则中间 stop 会把块清空、resume\n // 被误判为新委派(退回到「2 委派 + 假失败」老 bug)。终局 stop 时块已收口、此处为空。\n for (const [k, d] of this.delgMeta) {\n if (!d.paused) this.delgMeta.delete(k);\n }\n // G3:markdown 段落已流式渲染,终态仅 flush 未完尾段(非 markdown 校正行首)。\n this.renderer.flushChatBuffer();\n this.renderer.stopSpinner();\n },\n };\n this.reducer = createV4Reducer(sink);\n }\n\n /**\n * 子流活动摘要:取子流文本最后一个非空行(截显示宽度)刷进 spinner 文案,\n * TTY 上呈现「⎿ 数据分析专家 · 正在并行执行两个查询…」的单行滚动效果。\n */\n private bumpDelegationActivity(parent: string, text: string | null, fallback?: string): void {\n const d = this.delgMeta.get(parent);\n if (!d) return;\n if (text) {\n d.textTail = (d.textTail + text).slice(-300);\n const lastLine = d.textTail\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0)\n .pop();\n if (lastLine) {\n this.renderer.updateSpinner(`⎿ ${d.name} · ${truncateDisplay(lastLine, 48)}`);\n return;\n }\n }\n this.renderer.updateSpinner(`⎿ ${d.name} · ${fallback ?? '执行中…'}`);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async consume(events: AsyncIterable<any>): Promise<StreamResult> {\n // G1:起手即转「思考中…」覆盖「已发 message.create,等 LLM 首 token」这段最大空白期。\n // json 旁路不渲染,故仅 text 模式驱动 spinner。\n if (this.opts.output !== 'json') this.renderer.startSpinner('思考中…');\n for await (const ev of events) {\n if (!this.traceId && ev.traceId) this.traceId = ev.traceId;\n if (!this.streamId && ev.streamId) this.streamId = ev.streamId;\n // G6:token in/out 分解从终态 payload 取(ROOT message.stop 带 inputTokens/outputTokens;\n // response.completed 走 usage.{inputTokens,outputTokens})。子流 message.stop 不计入。\n this.captureTokenBreakdown(ev);\n\n if (this.opts.output === 'json') {\n process.stdout.write(JSON.stringify(ev) + '\\n');\n if (ev.type === 'response.completed') return this.result('completed');\n if (ev.type === 'response.interrupted') return this.result('interrupted');\n if (ev.type === 'response.failed') throw this.toError(ev);\n // ROOT message.stop 不再立即终态(2026-06-12 ASK 挂死 RCA):hold 模式下它可能是\n // HALT 的中间 stop,resume 段事件还在路上——终态判定单点在 iterator(它持有未决\n // 交互集),presenter 以 iterator 收口为唯一终态。非 hold 时 iterator 在 stop 后\n // 立即 finish,行为与旧版完全一致。\n if (ev.type === 'message.stop' && !ev.payload?.parentToolUseId) {\n this.sawRootStop = true;\n }\n continue;\n }\n\n // 终态三事件(v4 兼容边界)= iterator 终态\n if (ev.type === 'response.completed') {\n if (ev.payload?.totalTokens) this.totalTokens = ev.payload.totalTokens;\n // G3:兜底 flush(reducer onTerminal 未触达时,仍把 markdown 累积段渲染出来)。\n this.renderer.flushChatBuffer();\n this.renderer.stopSpinner();\n return this.result('completed');\n }\n if (ev.type === 'response.failed') {\n this.renderer.stopSpinner();\n throw this.toError(ev);\n }\n if (ev.type === 'response.interrupted') {\n this.renderer.showInterrupted(ev.payload?.reason ?? 'UNKNOWN');\n return this.result('interrupted');\n }\n\n // v4 原生终态信号:ROOT message.stop(parentToolUseId 空)。\n // 🔴 end_turn 不在此 return(2026-06-12 ASK 挂死 RCA):hold 模式下 HALT 的 ROOT stop\n // 是中间态——iterator(唯一持有未决交互集的层)会继续吐 resume 段事件;旧版在此\n // 无条件 return 导致 ASK/confirm 决策回发后的 resume 正文整段被丢(用户答完「1」\n // 后纯黑洞,体感挂死)。终态判定单点化:presenter 只记录 stop、消费到 iterator\n // 收口为止。error/interrupted 仍即时终态(无 resume 语义)。\n if (ev.type === 'message.stop' && !ev.payload?.parentToolUseId) {\n this.reducer.handle(ev.type, ev.payload ?? {}); // onTerminal 记 tokens + flush\n const reason = ev.payload?.stopReason;\n if (reason === 'error') throw this.toError(ev);\n if (reason === 'interrupted') {\n this.renderer.showInterrupted('INTERRUPTED');\n return this.result('interrupted');\n }\n this.sawRootStop = true;\n continue;\n }\n\n // v4 block 流 → reducer;未命中则 debug 静默(v3 已删)\n if (!this.reducer.handle(ev.type, ev.payload ?? {})) debug('unknown event', ev.type);\n }\n // iterator 收口(非 hold:ROOT stop 即 finish;hold:TERMINAL 兜底/无未决 stop 后 finish)。\n this.renderer.stopSpinner();\n return this.result(this.sawRootStop ? 'completed' : 'incomplete');\n }\n\n get tokenCount(): number {\n return this.totalTokens;\n }\n\n /** G6 · 终态行素材:总/进/出 token + 工具数 + 委派数。0 值由 renderer 决定是否省略。 */\n get completionStats(): CompletionStats {\n return {\n totalTokens: this.totalTokens,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n toolCount: this.toolCount,\n delegationCount: this.delegationCount,\n };\n }\n\n /**\n * G6 · 从终态 payload 抽 in/out token 分解。仅 ROOT(parentToolUseId 空)的 message.stop /\n * response.completed 计入,避免子流 message.stop 的 turn 增量被误当全程值覆盖。\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private captureTokenBreakdown(ev: any): void {\n const p = ev?.payload;\n if (!p) return;\n if (ev.type === 'message.stop' && !p.parentToolUseId) {\n if (typeof p.inputTokens === 'number') this.inputTokens = p.inputTokens;\n if (typeof p.outputTokens === 'number') this.outputTokens = p.outputTokens;\n } else if (ev.type === 'response.completed') {\n const usage = p.usage;\n if (usage && typeof usage === 'object') {\n if (typeof usage.inputTokens === 'number') this.inputTokens = usage.inputTokens;\n if (typeof usage.outputTokens === 'number') this.outputTokens = usage.outputTokens;\n }\n }\n }\n\n private result(status: StreamResult['status']): StreamResult {\n return { status, traceId: this.traceId, streamId: this.streamId };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private toError(ev: any): Error {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err: any = new Error(ev.payload?.message ?? 'stream failed');\n err.code = ev.payload?.errorCode ?? ev.payload?.code;\n err.traceId = ev.traceId;\n return err;\n }\n}\n","import { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport { agentDisplayName, terminalHyperlink } from '../streaming/TerminalRenderer';\nimport { absoluteDownloadUrl, type ResumeSummary } from '@hcmai/sdk';\nimport type { Block, StreamingState } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nmarked.use(markedTerminal() as any);\n\nexport interface BridgeSinks {\n appendBlock(b: Block): void;\n updateStreaming(patch: Partial<StreamingState>): void;\n}\n\n/**\n * ADR-129 · duck-type TerminalRenderer 的方法面 → React state 事件。\n *\n * StreamPresenter 以 TS 结构类型依赖 TerminalRenderer——本 bridge 实现同一方法面\n * (与单测 rendererSpy 同一招),把每个渲染语义翻译为「append 历史块」或「更新动态区」。\n * 语义层(reducer/presenter/iterator)零改动全复用,这是 ADR-129 D2 的落点。\n *\n * 正文策略:流式期间原文进动态区(打字机);段落落块时整段过 marked-terminal 渲染\n * 为 ANSI 进 `<Static>` 历史——与单发模式渲染完全一致。\n */\nexport function createInkRendererBridge(sinks: BridgeSinks, apiBase?: string) {\n let chatBuffer = '';\n let thinkingChars = 0;\n let thinkingSince: number | null = null;\n\n const renderAnsi = (src: string): string =>\n (marked.parse(src.replace(/\\n+$/, '')) as string).replace(/\\n+$/, '');\n\n const flushParagraphs = (force: boolean): void => {\n if (!chatBuffer) return;\n let head = '';\n if (force) {\n head = chatBuffer;\n chatBuffer = '';\n } else {\n const idx = chatBuffer.lastIndexOf('\\n\\n');\n if (idx < 0) return;\n const candidate = chatBuffer.slice(0, idx + 2);\n const fences = (candidate.match(/(?:^|\\n) {0,3}```/g) ?? []).length;\n if (fences % 2 === 1) return;\n head = candidate;\n chatBuffer = chatBuffer.slice(idx + 2);\n }\n if (head.trim()) {\n sinks.appendBlock({ kind: 'assistant', ansi: renderAnsi(head) });\n }\n sinks.updateStreaming({ text: chatBuffer });\n };\n\n return {\n // ── 正文流 ──\n writeChatChunk(text: string): void {\n chatBuffer += text;\n sinks.updateStreaming({ text: chatBuffer, spinner: null });\n flushParagraphs(false);\n },\n flushChatBuffer(): void {\n flushParagraphs(true);\n sinks.updateStreaming({ text: '' });\n },\n\n // ── spinner(动态区状态行)──\n startSpinner(text: string): void {\n sinks.updateStreaming({ spinner: text });\n },\n updateSpinner(text: string): void {\n sinks.updateStreaming({ spinner: text });\n },\n stopSpinner(): void {\n sinks.updateStreaming({ spinner: null });\n },\n\n // ── thinking(折叠:进行中计时,结束落总结块)──\n writeThinkingChunk(text: string): void {\n if (thinkingSince == null) {\n thinkingSince = Date.now();\n sinks.updateStreaming({ thinkingSince });\n }\n thinkingChars += text.length;\n },\n endThinking(): void {\n if (thinkingSince != null && thinkingChars > 0) {\n sinks.appendBlock({\n kind: 'thinking',\n seconds: Math.max(0, (Date.now() - thinkingSince) / 1000),\n chars: thinkingChars,\n });\n }\n thinkingSince = null;\n thinkingChars = 0;\n sinks.updateStreaming({ thinkingSince: null });\n },\n\n // ── 工具/委派/富内容 ──\n toolLine(name: string, preview: string, success: boolean, durMs: number, nextSteps?: string[]): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'tool', name, preview, success, durMs, nextSteps });\n },\n delegationStart(agentKey: string): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'delegationStart', agentName: agentDisplayName(agentKey) });\n },\n delegationEnd(_id: string, durMs?: number, toolCount?: number, failCount?: number,\n success: boolean = true, nextSteps?: string[]): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'delegationEnd', durMs, toolCount, failCount, success, nextSteps });\n },\n contentPartSummary(part: Record<string, unknown>): void {\n flushParagraphs(true);\n const type = part.type as string;\n let label: string;\n let detail: string | undefined;\n if (type === 'file' || type === 'fileDownload') {\n // 文件名做 OSC 8 超链接,点击由浏览器打开签名链接(ADR-140,免 Bearer);不打裸 URL——\n // 长签名 URL 换行后终端不自动识别(点不动),OSC 8 链接是字符单元属性、跨行仍可点。\n const fileName = (part.fileName as string) ?? '文件';\n const abs = part.downloadUrl ? absoluteDownloadUrl(apiBase, String(part.downloadUrl)) : undefined;\n label = abs ? `▸ ${terminalHyperlink(abs, `📎 ${fileName}`)} ← 点击打开` : `▸ 📎 ${fileName}`;\n } else if (type === 'chart') {\n label = `▸ 图表 · ${(part.title as string) ?? ''}`;\n detail = part.insight ? String(part.insight) : undefined;\n } else if (type === 'table') {\n label = `▸ 表格 · ${(part.title as string) ?? ''}`;\n } else {\n label = `▸ ${type}`;\n detail = part.insight ? String(part.insight) : undefined;\n }\n sinks.appendBlock({ kind: 'contentPart', label, detail });\n },\n steeringLine(contents: string[]): void {\n flushParagraphs(true);\n for (const text of contents) sinks.appendBlock({ kind: 'steering', text });\n },\n\n // ── 交互反馈 / 终态 ──\n interactionResumed(): void {\n sinks.appendBlock({ kind: 'interactionNote', tone: 'ok', text: '已受理,继续执行…' });\n },\n interactionTerminal(status?: string): void {\n const tone = status === 'FAILED' ? 'fail' as const : 'info' as const;\n const text = status === 'FAILED' ? '交互失败'\n : status === 'SUPERSEDED' ? '交互已被新请求接管' : '交互完成';\n sinks.appendBlock({ kind: 'interactionNote', tone, text });\n },\n autoApproved(toolName: string | undefined, summary: string): void {\n sinks.appendBlock({ kind: 'interactionNote', tone: 'ok', text: `已自动批准: ${toolName ?? ''}(${summary})` });\n },\n showInterrupted(reason: string): void {\n flushParagraphs(true);\n sinks.appendBlock({ kind: 'interrupted', reason });\n sinks.updateStreaming({ spinner: null, text: '' });\n },\n showCompleted(durMs: number, traceId: string | null, conversationId: string,\n totalTokens?: number, stats?: { inputTokens?: number; outputTokens?: number; toolCount?: number; delegationCount?: number }): void {\n flushParagraphs(true);\n sinks.appendBlock({\n kind: 'done', durMs, traceId, conversationId, totalTokens,\n inputTokens: stats?.inputTokens, outputTokens: stats?.outputTokens,\n toolCount: stats?.toolCount, delegationCount: stats?.delegationCount,\n });\n sinks.updateStreaming({ spinner: null, text: '' });\n },\n showResumeContext(summary: ResumeSummary): void {\n sinks.appendBlock({\n kind: 'resume', conversationId: summary.conversationId,\n totalRounds: summary.totalRounds, turns: summary.recent,\n });\n },\n };\n}\n\nexport type InkRendererBridge = ReturnType<typeof createInkRendererBridge>;\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { Block } from './types';\n\n/** 历史块渲染(进 `<Static>`,append-only 永不重绘)。视觉语义对齐手搓版 TerminalRenderer。 */\nexport function BlockView({ block: b }: { block: Block }): React.JSX.Element {\n switch (b.kind) {\n case 'banner':\n return <Text color=\"gray\">{b.text}</Text>;\n case 'user':\n return (\n <Box flexDirection=\"column\">\n <Text><Text color=\"cyan\">{'❯ '}</Text>{b.text}</Text>\n {b.attachments?.length ? (\n <Text dimColor>{' 📎 ' + b.attachments.map((a) => a.fileName).join(' · ')}</Text>\n ) : null}\n </Box>\n );\n case 'assistant':\n return <Box flexDirection=\"column\" marginBottom={1}><Text>{b.ansi}</Text></Box>;\n case 'thinking':\n return <Text color=\"gray\">✓ 推理完成 ({b.seconds.toFixed(1)}s · {b.chars} chars)</Text>;\n case 'tool':\n return (\n <Box flexDirection=\"column\">\n <Text>\n <Text color=\"cyan\">⚙ {b.name}</Text>\n {b.preview ? <Text color=\"gray\"> {b.preview}</Text> : null}\n {' '}{b.success ? <Text color=\"green\">✓</Text> : <Text color=\"red\">✗</Text>}\n <Text color=\"gray\"> {b.durMs}ms</Text>\n </Text>\n {!b.success && b.nextSteps?.length ? (\n <Box flexDirection=\"column\" marginLeft={4}>\n <Text dimColor>↳ 下一步:</Text>\n {b.nextSteps.map((s, i) => <Text key={i} dimColor> • {s}</Text>)}\n </Box>\n ) : null}\n </Box>\n );\n case 'delegationStart':\n return <Text color=\"blue\">⏺ 委派 → {b.agentName}</Text>;\n case 'delegationEnd': {\n const segs: string[] = [];\n if (b.toolCount) segs.push(`${b.toolCount} 工具${b.failCount ? `,${b.failCount} 失败` : ''}`);\n if (b.durMs) segs.push(`${(b.durMs / 1000).toFixed(1)}s`);\n const detail = segs.length ? ` (${segs.join(' · ')})` : '';\n return (\n <Box flexDirection=\"column\" marginLeft={2}>\n {b.success\n ? <Text color=\"gray\">⎿ 完成{detail}</Text>\n : <Text color=\"red\">⎿ ✗ 委派失败{detail}</Text>}\n {!b.success && b.nextSteps?.length ? (\n <Box flexDirection=\"column\" marginLeft={2}>\n {b.nextSteps.map((s, i) => <Text key={i} dimColor> • {s}</Text>)}\n </Box>\n ) : null}\n </Box>\n );\n }\n case 'steering':\n return <Text><Text color=\"blue\">↪ 纠偏 </Text><Text color=\"gray\">{b.text}</Text></Text>;\n case 'contentPart':\n return (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\">{b.label}</Text>\n {b.detail ? <Text color=\"gray\"> {b.detail}</Text> : null}\n </Box>\n );\n case 'interactionNote':\n return b.tone === 'fail'\n ? <Text color=\"red\"> ✗ {b.text}</Text>\n : b.tone === 'ok'\n ? <Text color=\"green\"> ✓ {b.text}</Text>\n : <Text color=\"gray\"> {b.text}</Text>;\n case 'resume': {\n const shownUsers = b.turns.filter((t) => t.role === 'user').length;\n const earlier = b.totalRounds - shownUsers;\n const shortId = b.conversationId.length > 12 ? '…' + b.conversationId.slice(-12) : b.conversationId;\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>↻ 续接会话 {shortId}(共 {b.totalRounds} 轮{earlier > 0 ? `,更早 ${earlier} 轮略` : ''})</Text>\n {b.turns.map((t, i) => (\n <Text key={i} dimColor>{t.role === 'user' ? ` > ${t.text}` : ` ${t.text}`}</Text>\n ))}\n </Box>\n );\n }\n case 'done': {\n const segs: string[] = [`${b.durMs}ms`];\n if (b.totalTokens) {\n const split = (b.inputTokens || b.outputTokens) ? ` (↑${b.inputTokens ?? 0}/↓${b.outputTokens ?? 0})` : '';\n segs.push(`${b.totalTokens} tok${split}`);\n }\n if (b.toolCount) segs.push(`${b.toolCount} 工具`);\n if (b.delegationCount) segs.push(`${b.delegationCount} 委派`);\n segs.push(`traceId ${b.traceId ?? '?'}`);\n segs.push(`conversation ${b.conversationId}`);\n return <Box marginBottom={1}><Text dimColor>✓ done ({segs.join(' · ')})</Text></Box>;\n }\n case 'interrupted':\n return <Text color=\"yellow\">^ 已中断 ({b.reason})</Text>;\n case 'error':\n return <Text color=\"red\">✗ Error: {b.text}</Text>;\n default:\n return <Text />;\n }\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\n\nexport interface MultilineInputProps {\n value: string;\n onChange: (v: string) => void;\n onSubmit: (v: string) => void;\n placeholder?: string;\n /** 首行提示符(续行自动等宽缩进)。 */\n prompt?: string;\n /** 光标已在首行仍按 ↑ —— 交还历史导航。 */\n onHistoryUp?: () => void;\n /** 光标已在末行仍按 ↓ —— 交还历史导航。 */\n onHistoryDown?: () => void;\n /** Esc 清空输入时同步回调(清待发附件等外部暂存态,issue #64)。 */\n onEscapeClear?: () => void;\n /**\n * 外部按键捕获钩子:在输入框处理任何键之前调用,返回 true 表示该键已被上层\n * (如 slash 命令菜单)消费,输入框跳过自身处理。保持输入框对 slash 语义无知。\n */\n captureKey?: (input: string, key: KeyLike) => boolean;\n}\n\n/**\n * 多行输入框(对标主流聊天输入区:Enter 发送,修饰 Enter 换行):\n * - 裸 Enter 发送;Shift+Enter / Ctrl+Enter / Option+Enter / Ctrl+J 换行续输\n * (修饰 Enter 需终端键盘增强,run.ts 开 modifyOtherKeys;Ctrl+J 传统 \\n 作无增强兜底)\n * - 草稿末行输入 /send 再 Enter 仍可发送(剥掉 /send 行)\n * - 粘贴多行文本(单 chunk 含换行)原样插入,不误触提交\n * - ↑↓ 在多行间移动光标,首/末行边界让位给历史导航(Claude Code 同行为)\n * - Esc 清空当前输入(busy 态的 Esc 打断在 App 层,互不冲突)\n *\n * value 受控于父级;光标是组件内部状态——外部改值(历史回填/提交清空)时\n * 光标自动置末尾,selfEdit 标记区分两种来源。\n */\nexport function MultilineInput(props: MultilineInputProps): React.JSX.Element {\n const { value, onChange, onSubmit, placeholder = '', prompt = '› ', onHistoryUp, onHistoryDown, onEscapeClear, captureKey } = props;\n const [cursor, setCursor] = useState(value.length);\n const selfEdit = useRef(false);\n\n useEffect(() => {\n if (selfEdit.current) { selfEdit.current = false; return; }\n setCursor(value.length);\n }, [value]);\n\n const edit = (next: string, nextCursor: number): void => {\n selfEdit.current = true;\n setCursor(nextCursor);\n onChange(next);\n };\n\n useInput((input, key) => {\n // 上层(slash 菜单)优先消费导航/补全键;返回 true 则输入框不再处理本次按键。\n if (captureKey?.(input, key)) return;\n if (key.escape) { if (value) edit('', 0); onEscapeClear?.(); return; }\n // 固定 composer 语义(对标主流聊天输入区):\n // - 裸 Enter 发送\n // - Shift/Ctrl/Option+Enter 换行;Ctrl+J(传统 \\n)换行作无终端增强兜底\n // - 草稿末行 `/send` + Enter 仍兜底发送(剥掉 /send 行)。\n // 终端差异:\n // - Shift/Ctrl/Option+Enter(kitty CSI-u 形态)Ink 7 原生解析出 key.return + 修饰位\n // - xterm modifyOtherKeys 形态(ESC[27;<mod>;13~)Ink 不识别,匹配剥掉 ESC 的原文\n const modifiedEnter = classifyModifiedEnter(input, key);\n if (modifiedEnter === 'newline' || input === '\\n') {\n edit(value.slice(0, cursor) + '\\n' + value.slice(cursor), cursor + 1);\n return;\n }\n if (key.return) {\n // 裸 Enter 发送(修饰 Enter 已在上面归为换行)。空白输入不触发提交。\n const sendDraft = draftFromSendCommandLine(value, cursor);\n const toSend = sendDraft !== null ? sendDraft : value;\n if (toSend.trim()) onSubmit(toSend);\n return;\n }\n // 其他未映射的修饰键序列(CSI ~/u 收尾)不入正文。\n if (/^(?:\\x1b)?\\[\\d+(?:;\\d+)*[~u]$/.test(input)) return;\n if (key.backspace || key.delete) {\n if (cursor > 0) edit(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);\n return;\n }\n if (key.leftArrow) { setCursor((c) => Math.max(0, c - 1)); return; }\n if (key.rightArrow) { setCursor((c) => Math.min(value.length, c + 1)); return; }\n if (key.upArrow || key.downArrow) {\n const lines = value.split('\\n');\n const { row, col } = locate(lines, cursor);\n if (key.upArrow) {\n if (row === 0) { onHistoryUp?.(); return; }\n setCursor(offsetOf(lines, row - 1, Math.min(col, lines[row - 1]!.length)));\n } else {\n if (row === lines.length - 1) { onHistoryDown?.(); return; }\n setCursor(offsetOf(lines, row + 1, Math.min(col, lines[row + 1]!.length)));\n }\n return;\n }\n if (key.ctrl || key.meta || key.tab) return;\n if (input) {\n // 可打印输入与粘贴整段同路:\\r / \\r\\n 统一归一为 \\n。\n const text = input.replace(/\\r\\n?/g, '\\n');\n edit(value.slice(0, cursor) + text + value.slice(cursor), cursor + text.length);\n }\n });\n\n const indent = ' '.repeat(prompt.length);\n\n if (!value) {\n return (\n <Box>\n <Text color=\"cyan\">{prompt}</Text>\n <Text inverse>{placeholder.charAt(0) || ' '}</Text>\n <Text dimColor>{placeholder.slice(1)}</Text>\n </Box>\n );\n }\n\n const lines = value.split('\\n');\n const { row, col } = locate(lines, cursor);\n return (\n <Box flexDirection=\"column\">\n {lines.map((line, r) => (\n <Box key={r}>\n <Text color=\"cyan\">{r === 0 ? prompt : indent}</Text>\n {r === row ? (\n <Text>\n {line.slice(0, col)}\n <Text inverse>{col < line.length ? line[col] : ' '}</Text>\n {col < line.length ? line.slice(col + 1) : ''}\n </Text>\n ) : (\n <Text>{line.length ? line : ' '}</Text>\n )}\n </Box>\n ))}\n </Box>\n );\n}\n\ninterface KeyLike {\n return?: boolean;\n shift?: boolean;\n ctrl?: boolean;\n meta?: boolean;\n upArrow?: boolean;\n downArrow?: boolean;\n tab?: boolean;\n}\n\nexport function classifyModifiedEnter(input: string, key: KeyLike): 'submit' | 'newline' | null {\n // Enter 发送、修饰 Enter 换行:Shift/Ctrl/Option+Enter 一律换行(裸 Enter 走 key.return 提交分支)。\n if (key.return && (key.ctrl || key.meta || key.shift)) return 'newline';\n\n // xterm modifyOtherKeys 形态 ESC[27;<mod>;13~:任何修饰位(shift=2 / alt=3,4 / ctrl=5…)都换行。\n const match = /^(?:\\x1b)?\\[27;(\\d+);13~$/.exec(input);\n if (!match) return null;\n return 'newline';\n}\n\nexport function isSingleLineSlashCommand(value: string): boolean {\n const text = value.trim();\n return text.startsWith('/') && !text.includes('\\n');\n}\n\nexport function draftFromSendCommandLine(value: string, cursor: number): string | null {\n const lines = value.split('\\n');\n const { row } = locate(lines, cursor);\n if ((lines[row] ?? '').trim() !== '/send') return null;\n const next = lines.filter((_, i) => i !== row).join('\\n').trim();\n return next.length > 0 ? next : '';\n}\n\n/** 光标线性偏移 → (行, 列)。 */\nfunction locate(lines: string[], cursor: number): { row: number; col: number } {\n let rest = cursor;\n for (let r = 0; r < lines.length; r++) {\n if (rest <= lines[r]!.length) return { row: r, col: rest };\n rest -= lines[r]!.length + 1;\n }\n return { row: lines.length - 1, col: lines[lines.length - 1]!.length };\n}\n\n/** (行, 列) → 光标线性偏移。 */\nfunction offsetOf(lines: string[], row: number, col: number): number {\n let off = 0;\n for (let r = 0; r < row; r++) off += lines[r]!.length + 1;\n return off + col;\n}\n","/**\n * ADR-129 · Ink REPL 的历史块模型。\n *\n * 聊天历史 = append-only 的 Block 列表(渲染进 Ink `<Static>`,一旦落块永不重绘——\n * 这是 Ink 对滚动长输出的标准解法,也天然杜绝手搓时代的渲染竞态)。\n * 动态区(流式正文/spinner/交互卡/输入框)不在此列,由 App 的 state 直接驱动。\n */\n\nexport type Block =\n | { kind: 'banner'; text: string }\n | { kind: 'user'; text: string; attachments?: Array<{ fileName: string; documentId: string }> }\n /** 已完成的 assistant 正文段(marked-terminal 渲染后的 ANSI 字符串,与单发模式渲染一致)。 */\n | { kind: 'assistant'; ansi: string }\n | { kind: 'thinking'; seconds: number; chars: number }\n | { kind: 'tool'; name: string; preview: string; success: boolean; durMs: number; nextSteps?: string[] }\n | { kind: 'delegationStart'; agentName: string }\n | { kind: 'delegationEnd'; durMs?: number; toolCount?: number; failCount?: number; success: boolean; nextSteps?: string[] }\n | { kind: 'steering'; text: string }\n | { kind: 'contentPart'; label: string; detail?: string }\n | { kind: 'interactionNote'; tone: 'ok' | 'fail' | 'info'; text: string }\n | { kind: 'resume'; conversationId: string; totalRounds: number; turns: Array<{ role: 'user' | 'assistant'; text: string }> }\n | { kind: 'done'; durMs: number; traceId: string | null; conversationId: string; totalTokens?: number; inputTokens?: number; outputTokens?: number; toolCount?: number; delegationCount?: number }\n | { kind: 'interrupted'; reason: string }\n | { kind: 'error'; text: string };\n\n/** 动态区状态:一轮对话进行中的实时投影。 */\nexport interface StreamingState {\n /** 当前累积的流式正文(原文,落块时再过 marked 渲染)。 */\n text: string;\n /** spinner 文案;null = 不转。 */\n spinner: string | null;\n /** thinking 进行中起始时刻(ms);null = 无。 */\n thinkingSince: number | null;\n active: boolean;\n}\n\nexport const IDLE_STREAMING: StreamingState = {\n text: '',\n spinner: null,\n thinkingSince: null,\n active: false,\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport * as fs from 'node:fs/promises';\nimport { Box, Static, Text, useApp, useInput } from 'ink';\nimport TextInput from 'ink-text-input';\nimport SelectInput from 'ink-select-input';\nimport Spinner from 'ink-spinner';\nimport { marked } from 'marked';\nimport {\n sendMessageAndStream,\n createConversation,\n saveConversationState,\n parseInteractionRequest,\n parseInteractionResolved,\n buildConfirm,\n buildReject,\n buildAnswer,\n fetchConversationTimeline,\n buildResumeSummary,\n replHistoryFile,\n DEFAULT_AGENT_ID,\n uploadDocument,\n type AttachmentMeta,\n type WsClient,\n type HcmClient,\n type InteractionRequest,\n} from '@hcmai/sdk';\nimport { extractAtFileTokens, extractInlineFilePaths, isBareFilePath } from '../utils/attachment-args';\nimport { filterSlashCommands, resolveSlashKey, wrapIndex } from '../utils/slash';\nimport { agentDisplayName } from '../streaming/TerminalRenderer';\nimport { StreamPresenter } from '../streaming/StreamPresenter';\nimport type { TerminalRenderer } from '../streaming/TerminalRenderer';\nimport { createInkRendererBridge } from './InkRendererBridge';\nimport { BlockView } from './BlockView';\nimport { MultilineInput } from './MultilineInput';\nimport { IDLE_STREAMING, type Block, type StreamingState } from './types';\n\nexport interface ReplAppProps {\n ws: WsClient;\n client: HcmClient;\n agentId: string;\n env: string;\n identity: string;\n tenantId: string;\n initialConversationId?: string;\n autoApprove?: boolean;\n}\n\ntype Interaction = { req: InteractionRequest; respond: (d: Decision) => void };\ntype Decision =\n | { kind: 'confirm'; remember?: boolean }\n | { kind: 'reject'; feedback?: string }\n | { kind: 'answer'; text?: string; choiceIndex?: number };\n\n/**\n * ADR-129 · hcm chat REPL 的 Ink 主组件。\n *\n * 终端唯一 owner:历史块进 `<Static>`(append-only 永不重绘),动态区(流式正文/\n * spinner/交互卡/输入框)由 state 驱动——手搓时代的 stdin 共存/渲染竞态范畴病在此\n * 模型下不存在。语义层(reducer/presenter/iterator)经 InkRendererBridge 全复用。\n */\nexport function ReplApp(props: ReplAppProps): React.JSX.Element {\n const { exit } = useApp();\n const [blocks, setBlocks] = useState<Block[]>([{\n kind: 'banner',\n text: `HCM Chat · Enter 发送 · Shift+Enter 换行 · /help 帮助`,\n }]);\n const [streaming, setStreaming] = useState<StreamingState>(IDLE_STREAMING);\n const [interaction, setInteraction] = useState<Interaction | null>(null);\n const [input, setInput] = useState('');\n // slash 命令菜单当前高亮项(对标 Claude Code:默认选中第一个匹配项,回车直接执行)。\n const [slashIndex, setSlashIndex] = useState(0);\n const [busy, setBusy] = useState(false);\n const [conversationId, setConversationId] = useState<string | undefined>(props.initialConversationId);\n const [conversationMode, setConversationMode] = useState<'new' | 'resume' | 'chat'>(\n props.initialConversationId ? 'resume' : 'new',\n );\n // 会话累计 token(输入区底部状态栏显示,对标 Claude Code 的 context 概览)。\n const [sessionTokens, setSessionTokens] = useState(0);\n // issue #64:待发附件(/attach 或裸路径暂存;@路径 在提交时直接上传合并)。\n const [pendingAttachments, setPendingAttachments] = useState<AttachmentMeta[]>([]);\n\n const convRef = useRef<string | undefined>(props.initialConversationId);\n const cancelRef = useRef<((reason: string) => void) | null>(null);\n const replayedRef = useRef(false);\n // 会话级免询问:CONFIRM 卡选「是,本会话不再询问」后置 true,后续 CONFIRM 自动批准\n //(对标 Claude Code「Yes, and don't ask again this session」,纯客户端,不动后端)。\n const sessionAutoApproveRef = useRef(false);\n\n // 输入历史 ↑↓ 回填(readline 时代的 history file 平移,跨进程持久)。\n const historyRef = useRef<string[]>([]);\n const histIdxRef = useRef(-1);\n const draftRef = useRef('');\n useEffect(() => {\n void fs.readFile(replHistoryFile(props.env), 'utf-8')\n .then((c) => { historyRef.current = c.split('\\n').filter(Boolean); })\n .catch(() => { /* 首次无历史 */ });\n }, [props.env]);\n\n // busy 实时计时(动态 hint「esc 打断 · X.Xs」)。\n const [elapsedMs, setElapsedMs] = useState(0);\n useEffect(() => {\n if (!busy) return;\n const t0 = Date.now();\n setElapsedMs(0);\n const timer = setInterval(() => setElapsedMs(Date.now() - t0), 500);\n return () => clearInterval(timer);\n }, [busy]);\n\n const appendBlock = useCallback((b: Block) => setBlocks((prev) => [...prev, b]), []);\n const updateStreaming = useCallback(\n (patch: Partial<StreamingState>) => setStreaming((prev) => ({ ...prev, ...patch })),\n []);\n\n useInput((_input, key) => {\n // interaction 激活时 Esc 交给 InteractionView 处理(=拒绝该交互),不在此硬中断整轮。\n if (key.escape && cancelRef.current && !interaction) { cancelRef.current('user-esc'); return; }\n });\n\n // 历史回填(↑↓ 的按键归 MultilineInput,仅光标到达首/末行边界时回调到这里)。\n const historyUp = useCallback(() => {\n const hist = historyRef.current;\n if (hist.length === 0) return;\n if (histIdxRef.current === -1) { draftRef.current = input; histIdxRef.current = hist.length; }\n histIdxRef.current = Math.max(0, histIdxRef.current - 1);\n setInput(hist[histIdxRef.current] ?? '');\n }, [input]);\n const historyDown = useCallback(() => {\n if (histIdxRef.current === -1) return;\n const hist = historyRef.current;\n histIdxRef.current += 1;\n if (histIdxRef.current >= hist.length) {\n histIdxRef.current = -1;\n setInput(draftRef.current);\n } else {\n setInput(hist[histIdxRef.current] ?? '');\n }\n }, []);\n\n const runTurn = useCallback(async (prompt: string, attachments?: AttachmentMeta[]) => {\n setBusy(true);\n updateStreaming({ active: true, spinner: '思考中…' });\n const bridge = createInkRendererBridge({ appendBlock, updateStreaming }, props.client.endpoint);\n // 续聊回放(刀⑤平移):首轮且续接既有会话时回显最近轮摘要。\n if (!replayedRef.current && convRef.current) {\n replayedRef.current = true;\n const items = await fetchConversationTimeline(props.client.raw(), convRef.current);\n const summary = items ? buildResumeSummary(convRef.current, items) : null;\n if (summary) bridge.showResumeContext(summary);\n }\n try {\n // 长开 REPL 的连接自愈:后端重启/网络闪断后旧 WS 已死,发消息前重建(no-op 若健康)。\n await props.ws.ensureConnected();\n if (!convRef.current) {\n const conv = await createConversation(props.client.raw(), props.agentId);\n convRef.current = conv.id;\n setConversationId(conv.id);\n setConversationMode('chat');\n }\n const presenter = new StreamPresenter(bridge as unknown as TerminalRenderer, {\n showToolCalls: true,\n output: 'text',\n });\n const handle = await sendMessageAndStream(props.ws, prompt, {\n conversationId: convRef.current,\n agentId: props.agentId,\n holdUntilInteractionTerminal: true,\n attachments,\n });\n convRef.current = handle.conversationId;\n setConversationId(handle.conversationId);\n cancelRef.current = (reason) => handle.cancel(reason);\n\n const off = handle.onControl((ev) => {\n if (ev.type === 'control.interaction.resolved') {\n const r = parseInteractionResolved(ev.payload);\n if (r.phase === 'RESUMED') bridge.interactionResumed();\n else if (r.phase === 'TERMINAL') bridge.interactionTerminal((ev.payload.status as string) || undefined);\n return;\n }\n if (ev.type !== 'control.interaction.request') return;\n const req = parseInteractionRequest(ev.payload);\n if ((props.autoApprove || sessionAutoApproveRef.current) && req.kind === 'CONFIRM') {\n bridge.autoApproved(req.toolName, req.summary);\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n return;\n }\n setInteraction({\n req,\n respond: (d) => {\n setInteraction(null);\n if (d.kind === 'confirm') {\n if (d.remember) sessionAutoApproveRef.current = true;\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (d.kind === 'reject') {\n const reason = d.feedback?.trim();\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, reason || undefined));\n } else {\n handle.sendCommand(buildAnswer(req.interactionId, handle.conversationId, d.text ?? '', d.choiceIndex));\n }\n },\n });\n });\n\n const t0 = Date.now();\n try {\n const result = await presenter.consume(handle.events);\n const stats = presenter.completionStats;\n if (result.status === 'completed') {\n bridge.showCompleted(Date.now() - t0, result.traceId, convRef.current ?? '', presenter.tokenCount || undefined, stats);\n }\n if (presenter.tokenCount) setSessionTokens((prev) => prev + presenter.tokenCount);\n if (convRef.current) {\n await saveConversationState(props.env, {\n lastConversationId: convRef.current,\n updatedAt: new Date().toISOString(),\n });\n }\n } finally {\n off();\n }\n } catch (e) {\n appendBlock({ kind: 'error', text: (e as Error).message ?? String(e) });\n } finally {\n cancelRef.current = null;\n setBusy(false);\n setStreaming(IDLE_STREAMING);\n setInteraction(null);\n }\n }, [appendBlock, updateStreaming, props]);\n\n /** issue #64:上传单个本地文件为附件,失败转 banner 提示。 */\n const uploadOne = useCallback(async (filePath: string): Promise<AttachmentMeta | null> => {\n try {\n const meta = await uploadDocument(props.client.raw(), filePath);\n return meta;\n } catch (e) {\n appendBlock({ kind: 'banner', text: `📎 上传失败 ${filePath}: ${(e as Error).message}` });\n return null;\n }\n }, [appendBlock, props.client]);\n\n const onSubmit = useCallback((raw: string) => {\n const line = raw.trim();\n setInput('');\n if (!line) return;\n if (line === '/exit' || line === '/quit') { exit(); return; }\n if (line === '/send') return;\n if (line === '/help') {\n appendBlock({ kind: 'banner', text: 'Enter 发送 · Shift/Ctrl+Enter 换行 · /send 兜底发送 · /new 新会话 · /attach <路径> 附件 · /exit 退出' });\n return;\n }\n if (line === '/new') {\n convRef.current = undefined;\n setConversationId(undefined);\n setConversationMode('new');\n replayedRef.current = false;\n appendBlock({ kind: 'banner', text: '· 已切换:下一条消息将开启新会话' });\n return;\n }\n // issue #64 · /attach <path>:上传并暂存,随下一条消息发送。\n if (line.startsWith('/attach')) {\n const arg = line.slice('/attach'.length).trim().replace(/^[\"']|[\"']$/g, '');\n if (!arg) { appendBlock({ kind: 'banner', text: '用法: /attach <本地文件路径>' }); return; }\n void (async () => {\n const meta = await uploadOne(arg);\n if (meta) setPendingAttachments((prev) => [...prev, meta]);\n })();\n return;\n }\n // issue #64 · 粘贴/输入裸文件路径:暂存为待发附件(D4 一期)。\n const bare = isBareFilePath(line);\n if (bare) {\n void (async () => {\n const meta = await uploadOne(bare);\n if (meta) {\n setPendingAttachments((prev) => [...prev, meta]);\n appendBlock({ kind: 'banner', text: `📎 已暂存附件 ${meta.fileName},输入消息后一起发送` });\n }\n })();\n return;\n }\n // 历史入档(内存 + 持久文件,与 readline 时代同一文件跨版本互通;\n // 文件按行存——多行消息落盘时换行折叠为空格,保持单行格式兼容)。\n historyRef.current.push(line);\n histIdxRef.current = -1;\n void fs.appendFile(replHistoryFile(props.env), line.replace(/\\n/g, ' ') + '\\n').catch(() => { /* 忽略 */ });\n // issue #64 · @路径 内联引用:提交时解析、上传、从文本移除(Claude Code @ mention 映射)。\n // 叠加:无 @ 前缀的行内裸绝对路径(粘贴/剪贴板路径 + 同行文字)也识别上传——否则裸路径\n // 漏进消息文本传给 LLM 当散文 → 幻觉成别的路径(实测 bug)。\n void (async () => {\n const at = extractAtFileTokens(line);\n const inline = extractInlineFilePaths(at.cleaned);\n const cleaned = inline.cleaned;\n const paths = [...at.paths, ...inline.paths];\n const uploaded: AttachmentMeta[] = [];\n for (const fp of paths) {\n const meta = await uploadOne(fp);\n if (meta) uploaded.push(meta);\n }\n const attachments = [...pendingAttachments, ...uploaded];\n setPendingAttachments([]);\n const text = cleaned || (attachments.length ? '请处理这些附件' : line);\n appendBlock({ kind: 'user', text, attachments: attachments.length ? attachments : undefined });\n await runTurn(text, attachments.length ? attachments : undefined);\n })();\n }, [appendBlock, exit, runTurn, uploadOne, pendingAttachments, props.env]);\n\n // 流式正文渐进 markdown(Ink 重渲染免费——手搓 append-only 终端做不到的能力):\n // 动态区每帧对未完段做 marked 渲染;半截标记渲染异常时回退原文。\n const streamingAnsi = useMemo(() => {\n if (!streaming.text) return '';\n try {\n return (marked.parse(streaming.text) as string).replace(/\\n+$/, '');\n } catch {\n return streaming.text;\n }\n }, [streaming.text]);\n\n // slash 命令菜单(输入 / 开头、未进参数区时浮现,按前缀过滤)。\n const slashItems = filterSlashCommands(input);\n const slashOpen = slashItems.length > 0;\n const slashSelected = slashOpen ? wrapIndex(slashIndex, slashItems.length) : 0;\n // 命令列右补齐到等宽,描述列对齐(对标 Claude Code 的命令面板)。\n const slashColWidth = slashOpen ? Math.max(...slashItems.map((s) => s.cmd.length)) + 2 : 0;\n\n // 菜单打开时拦截方向键/Tab/回车:↑↓ 切换高亮、Tab 补全、回车补全或直接执行\n //(无参命令直接提交,带参命令仅补全命令名留空格)。返回 true 则输入框不再处理本次按键。\n const handleSlashKey = (_input: string, key: { upArrow?: boolean; downArrow?: boolean; tab?: boolean; return?: boolean }): boolean => {\n if (!slashOpen) return false;\n const action = resolveSlashKey(key, slashItems[slashSelected]);\n switch (action.type) {\n case 'move':\n setSlashIndex(wrapIndex(slashSelected + action.delta, slashItems.length));\n return true;\n case 'complete':\n setSlashIndex(0);\n setInput(action.text);\n return true;\n case 'execute':\n onSubmit(action.text);\n return true;\n default:\n return false;\n }\n };\n\n return (\n <Box flexDirection=\"column\">\n <Static items={blocks}>\n {(b, i) => <BlockView key={i} block={b} />}\n </Static>\n\n {streamingAnsi ? (\n <Box marginTop={0}><Text>{streamingAnsi}</Text></Box>\n ) : null}\n\n {streaming.spinner ? (\n <Box>\n <Text color=\"gray\"><Spinner type=\"dots\" /> {streaming.spinner}</Text>\n <Text dimColor> esc 打断 · {(elapsedMs / 1000).toFixed(1)}s</Text>\n </Box>\n ) : busy ? (\n <Box><Text dimColor>esc 打断 · {(elapsedMs / 1000).toFixed(1)}s</Text></Box>\n ) : null}\n\n {interaction ? (\n <InteractionView interaction={interaction} />\n ) : !busy ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <ComposerRule />\n <AttachmentChips attachments={pendingAttachments} />\n <MultilineInput\n value={input}\n onChange={(v) => {\n setInput(v);\n // 改写命令文本即把高亮回到第一个匹配项(方向键导航不走 onChange,故选择不丢)。\n if (v.startsWith('/')) setSlashIndex(0); else histIdxRef.current = -1;\n }}\n onSubmit={onSubmit}\n placeholder=\"问 Moirai…\"\n onEscapeClear={() => setPendingAttachments([])}\n onHistoryUp={historyUp}\n onHistoryDown={historyDown}\n captureKey={handleSlashKey}\n />\n {/* 底线:与顶线对称把输入框上下框住,与下方状态栏/slash 菜单分隔(对标 Claude Code) */}\n <ComposerRule />\n {slashOpen ? (\n <Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n {slashItems.map(({ cmd, desc }, i) => {\n const on = i === slashSelected;\n return (\n <Box key={cmd}>\n <Text color={on ? 'cyan' : undefined} bold={on} dimColor={!on}>\n {cmd.padEnd(slashColWidth)}\n </Text>\n <Text dimColor={!on}>{desc}</Text>\n </Box>\n );\n })}\n </Box>\n ) : (\n <StatusBar\n env={props.env} identity={props.identity} tenantId={props.tenantId}\n agentId={props.agentId}\n conversationId={conversationId}\n conversationMode={conversationMode}\n sessionTokens={sessionTokens}\n />\n )}\n </Box>\n ) : null}\n </Box>\n );\n}\n\n/** 输入框上下分隔线(同一组件,顶/底各用一次,把输入框框住,对标 Claude Code 输入区)。 */\nfunction ComposerRule(): React.JSX.Element {\n return (\n <Box\n width=\"100%\"\n borderStyle=\"single\" borderColor=\"white\"\n borderTop borderBottom={false} borderLeft={false} borderRight={false}\n />\n );\n}\n\nfunction AttachmentChips({ attachments }: { attachments: AttachmentMeta[] }): React.JSX.Element | null {\n if (attachments.length === 0) return null;\n return (\n <Box paddingX={1}>\n <Text dimColor>\n attachments {attachments.map((a) => shortLabel(a.fileName, 24)).join(' · ')}\n </Text>\n </Box>\n );\n}\n\n/**\n * 输入框下方常驻环境信息栏(对标 Claude Code 底部状态行):\n * 左侧身份上下文(env · identity · tenant · agent),右侧会话动态(短 id · 累计 token)。\n * slash 菜单浮现时让位(与 Claude Code 同行为),避免底部跳动。\n */\nfunction StatusBar(props: {\n env: string; identity: string; tenantId: string;\n agentId: string; conversationId?: string; conversationMode: 'new' | 'resume' | 'chat'; sessionTokens: number;\n}): React.JSX.Element {\n // identity 命名约定常带「@env」后缀(如 suitj@bay4),与 env 段重复时去掉。\n const identity = props.identity.endsWith(`@${props.env}`)\n ? props.identity.slice(0, -props.env.length - 1)\n : props.identity;\n const left = [\n props.env,\n identity,\n `t${props.tenantId}`,\n agentLabel(props.agentId),\n ].join(' · ');\n const right = [\n conversationStatus(props.conversationMode, props.conversationId),\n `${fmtTokens(props.sessionTokens)} tok`,\n 'Enter 发送',\n ];\n return (\n <Box paddingX={1} width=\"100%\" justifyContent=\"space-between\">\n <Text dimColor>{left}</Text>\n <Text dimColor>{right.join(' · ')}</Text>\n </Box>\n );\n}\n\n/** 状态栏 token 数:1234 → 1.2k(千位以上压缩,避免状态栏溢出换行)。 */\nfunction fmtTokens(n: number): string {\n return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction conversationStatus(mode: 'new' | 'resume' | 'chat', conversationId?: string): string {\n if (!conversationId || mode === 'new') return 'new chat';\n const shortId = shortConversationId(conversationId);\n if (mode === 'resume') return `resume ${shortId}`;\n return `chat ${shortId}`;\n}\n\nfunction shortConversationId(id: string): string {\n return id.length > 14 ? `…${id.slice(-12)}` : id;\n}\n\nfunction shortLabel(value: string, max: number): string {\n return value.length > max ? value.slice(0, Math.max(0, max - 1)) + '…' : value;\n}\n\n/**\n * 状态栏 agent 标签:key 形态走 agentDisplayName;UUID 形态没有本地名册——\n * 默认主 agent 显示 Moirai(与 DEFAULT_AGENT_ID 同一常量层级),其余缩短为尾 4 位。\n */\nfunction agentLabel(agentId: string): string {\n if (agentId === DEFAULT_AGENT_ID) return 'Moirai';\n if (/^[0-9a-f]{8}-[0-9a-f-]{27}$/i.test(agentId)) return `agent …${agentId.slice(-4)}`;\n return agentDisplayName(agentId);\n}\n\n/** 来源行:agentPath ≥2 段时显示「来自 Moirai › HR 专家」(与 Web originLine 同语义)。 */\nfunction originLine(path: string | undefined): string | null {\n const segs = (path ?? '').split('.').filter(Boolean);\n if (segs.length < 2) return null;\n return `来自 ${segs.map((k) => agentDisplayName(k)).join(' › ')}`;\n}\n\nexport function InteractionView({ interaction }: { interaction: Interaction }): React.JSX.Element {\n const { req, respond } = interaction;\n const [freeText, setFreeText] = useState('');\n const [freeMode, setFreeMode] = useState(false); // ASK「自己输入」\n const [rejectMode, setRejectMode] = useState(false); // CONFIRM「否,并告诉它怎么改」\n const origin = originLine(req.originAgentPath);\n\n const choices = (req.choices ?? []).map((c, i) => ({\n label: typeof c === 'string' ? c : String((c as Record<string, unknown>).label ?? (c as Record<string, unknown>).value ?? JSON.stringify(c)),\n value: String(i),\n }));\n\n // 正在显示自由文本输入框时,数字键/Esc 让位给 TextInput(避免吃掉输入)。\n const askFreeText = req.kind === 'ASK' && (choices.length === 0 || freeMode);\n const textInputActive = rejectMode || askFreeText;\n\n // 数字键直选 + Esc 取消(对标 Claude Code 的 1/2/3 + esc)。\n useInput((input, key) => {\n if (textInputActive) return;\n if (key.escape) { respond({ kind: 'reject' }); return; }\n if (req.kind === 'CONFIRM') {\n if (input === '1') respond({ kind: 'confirm' });\n else if (input === '2') respond({ kind: 'confirm', remember: true });\n else if (input === '3') setRejectMode(true);\n } else {\n const n = Number(input);\n if (Number.isInteger(n) && n >= 1 && n <= choices.length) respond({ kind: 'answer', text: choices[n - 1]!.label, choiceIndex: n - 1 });\n else if (input === String(choices.length + 1)) setFreeMode(true);\n }\n });\n\n if (req.kind === 'CONFIRM') {\n const hi = req.riskLevel === 'HIGH' || req.riskLevel === 'CRITICAL';\n const args = req.argsPreview\n ? Object.entries(req.argsPreview).map(([k, v]) => `${k}=${String(v)}`).join(' · ')\n : '';\n if (rejectMode) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" borderDimColor paddingX={1}>\n <Text>告诉它怎么改(直接回车=仅取消):</Text>\n <Box>\n <Text color=\"cyan\">{'› '}</Text>\n <TextInput value={freeText} onChange={setFreeText} onSubmit={(v) => respond({ kind: 'reject', feedback: v })} />\n </Box>\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={hi ? 'yellow' : 'gray'} borderDimColor={!hi} paddingX={1}>\n <Text bold color={hi ? 'yellow' : undefined}>{hi ? '⚠ ' : '⏺ '}{req.toolName ? `${req.toolName} · ` : ''}{req.summary}</Text>\n {origin ? <Text dimColor>{origin}</Text> : null}\n {args ? <Text color=\"gray\">{args}</Text> : null}\n <Box flexDirection=\"column\" marginTop={1}>\n <Text dimColor>是否执行?{hi ? '(高风险)' : ''}</Text>\n <SelectInput\n items={[\n { label: '1. 是,执行', value: 'yes' },\n { label: '2. 是,本会话内同类不再询问', value: 'yes-all' },\n { label: '3. 否,并告诉它怎么改', value: 'no' },\n ]}\n onSelect={(item) => {\n if (item.value === 'yes') respond({ kind: 'confirm' });\n else if (item.value === 'yes-all') respond({ kind: 'confirm', remember: true });\n else setRejectMode(true);\n }}\n />\n <Text dimColor>1/2/3 直选 · esc 取消</Text>\n </Box>\n </Box>\n );\n }\n\n // ASK\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" borderDimColor paddingX={1}>\n <Text color=\"cyan\">? {req.question ?? req.summary}</Text>\n {origin ? <Text dimColor>{origin}</Text> : null}\n {!askFreeText ? (\n <Box flexDirection=\"column\" marginTop={1}>\n <SelectInput\n items={[\n ...choices.map((c, i) => ({ label: `${i + 1}. ${c.label}`, value: c.value })),\n { label: `${choices.length + 1}. 自己输入…`, value: '__free__' },\n ]}\n onSelect={(item) => {\n if (item.value === '__free__') { setFreeMode(true); return; }\n const idx = Number(item.value);\n respond({ kind: 'answer', text: choices[idx]?.label, choiceIndex: idx });\n }}\n />\n <Text dimColor>1-{choices.length + 1} 直选</Text>\n </Box>\n ) : (\n <Box>\n <Text color=\"cyan\">{'› '}</Text>\n <TextInput value={freeText} onChange={setFreeText} onSubmit={(v) => respond({ kind: 'answer', text: v.trim() })} />\n </Box>\n )}\n </Box>\n );\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { HcmClient, WsClient, DEFAULT_AGENT_ID } from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\nimport type { ChatArgs } from '../commands/chat';\nimport { ReplApp } from './App';\n\n/**\n * ADR-129 · Ink REPL 入口:会话装配(auth/WS/conversation 续接)后渲染 ReplApp。\n * 取代手搓 readline 版 chat-repl.ts(delete-on-supersede)。\n */\nexport async function runInkRepl(args: ChatArgs): Promise<void> {\n // Composer 快捷键(对标主流聊天输入区):开 xterm modifyOtherKeys=1,\n // 支持的终端(Ghostty/iTerm2/WezTerm/xterm.js)会把 Shift/Ctrl/Option+Enter 编码为\n // 独立序列;MultilineInput 据此实现 Enter 发送、Shift/Ctrl/Option+Enter 换行。mode 1 只影响\n // 本无编码的修饰组合,Esc / Ctrl+C / 裸 Enter 编码不变(裸 Enter 即发送)。任何退出路径都还原。\n if (process.stdout.isTTY) {\n process.stdout.write('\\x1b[>4;1m');\n process.on('exit', () => process.stdout.write('\\x1b[>4;0m'));\n }\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const ws = new WsClient({\n endpoint: ctx.endpoint.replace(/^http/, 'ws') + '/ws/conversation',\n getAccessToken: () => client.getAccessToken(),\n onTokenExpiring: () => client.handleRefresh(),\n });\n await ws.connect();\n\n // 会话续接:显式 --resume / legacy --conversation > 首条消息时新建。\n let initialConversationId: string | undefined;\n if (args.resume && args.conversation) {\n throw new Error('--resume 和 --conversation 不能同时使用;新命令请用 --resume <conversationId>');\n }\n if (args.resume === 'NEW') {\n throw new Error('--resume 需要既存 conversationId;新会话请直接省略 --resume');\n }\n if (args.resume) {\n initialConversationId = args.resume;\n } else if (args.conversation && args.conversation !== 'NEW') {\n initialConversationId = args.conversation;\n }\n\n const { waitUntilExit } = render(\n React.createElement(ReplApp, {\n ws,\n client,\n agentId: args.agent ?? DEFAULT_AGENT_ID,\n env: ctx.env,\n identity: ctx.identity,\n tenantId: String(ctx.tenantId),\n initialConversationId,\n autoApprove: !!args.autoApprove,\n }),\n );\n await waitUntilExit();\n await ws.close();\n process.exit(0);\n } catch (e) {\n exitWithError(e);\n }\n}\n","/**\n * control-prompt — 把 InteractionRequest 解析成一个决策(confirm/reject/answer/error)。\n * 纯决策逻辑:readLine 注入便于测;TTY 检测 + auto-approve fallback。\n * 实际从 process.stdin 读取的 readline 工具在 commands 层(Task 9)注入,本模块不碰 stdin。\n */\nimport type { InteractionRequest } from '@hcmai/sdk';\n\nexport type InteractionDecision =\n | { decision: 'confirm' }\n | { decision: 'reject'; reason?: string }\n | { decision: 'answer'; answer: string; choiceIndex?: number }\n | { decision: 'error'; reason: string };\n\nexport interface ResolveOpts {\n isTty: boolean;\n autoApprove: boolean;\n /** --on-confirm 解析结果;优先级最高(> autoApprove > TTY readLine > 非 TTY 默认 reject)。 */\n onConfirm?: { decision: 'approve' } | { decision: 'reject'; reason?: string };\n /** --on-ask 应答文本;命中 choices 精确文本时回填 choiceIndex。 */\n onAsk?: string;\n readLine: (prompt?: string) => Promise<string>;\n}\n\nexport async function resolveInteraction(\n req: InteractionRequest,\n opts: ResolveOpts,\n): Promise<InteractionDecision> {\n if (req.kind === 'CONFIRM') {\n if (opts.onConfirm) {\n return opts.onConfirm.decision === 'approve'\n ? { decision: 'confirm' }\n : { decision: 'reject', reason: opts.onConfirm.reason };\n }\n if (opts.autoApprove) return { decision: 'confirm' };\n if (!opts.isTty) return { decision: 'reject', reason: 'non-interactive' };\n const ans = (await opts.readLine(' › ')).trim();\n if (ans === '1') return { decision: 'confirm' };\n return { decision: 'reject', reason: ans === '2' ? undefined : `unrecognized:${ans}` };\n }\n // ASK\n if (opts.onAsk !== undefined) {\n const idx = req.choices?.indexOf(opts.onAsk) ?? -1;\n return idx >= 0\n ? { decision: 'answer', answer: opts.onAsk, choiceIndex: idx }\n : { decision: 'answer', answer: opts.onAsk };\n }\n if (!opts.isTty) return { decision: 'error', reason: 'ASK requires interactive TTY (use --on-ask)' };\n const ans = (await opts.readLine(' › ')).trim();\n if (req.choices?.length) {\n const idx = Number(ans) - 1;\n const choice = Number.isInteger(idx) ? req.choices[idx] : undefined;\n if (choice !== undefined) {\n return { decision: 'answer', answer: choice, choiceIndex: idx };\n }\n return { decision: 'answer', answer: ans }; // 非合法编号 → 当自由文本\n }\n return { decision: 'answer', answer: ans };\n}\n","import * as readline from 'node:readline';\n\n/**\n * 从 stdin 读一行——控制通道 confirm/ask 内联交互用(resolveInteraction 的 readLine 注入实现)。\n * 仅在 TTY 交互场景调用;非 TTY 的 fallback 由 resolveInteraction 决策(不会走到这里)。\n */\nexport function readLineFromStdin(prompt = ''): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n","import { Command } from 'commander';\nimport { migrateLegacyProfiles } from '@hcmai/sdk';\nimport { CLI_VERSION } from './package-version';\nimport { loginCommand, logoutCommand } from './commands/login';\nimport {\n configListDeprecated,\n configShowDeprecated,\n configSetProfileDeprecated,\n configDeleteDeprecated,\n configSet,\n configGet,\n} from './commands/config';\nimport { queryCommand } from './commands/query';\nimport { actionCommand } from './commands/action';\nimport { createCommand } from './commands/create';\nimport { updateCommand } from './commands/update';\nimport {\n settingGetCommand,\n settingSetCommand,\n settingResetCommand,\n} from './commands/setting';\nimport { versionCommand } from './commands/version';\nimport { deleteCommand } from './commands/delete';\nimport { importCommand } from './commands/import';\nimport { describeCommand } from './commands/describe';\nimport { chatCommand } from './commands/chat';\nimport { downloadCommand } from './commands/download';\nimport { traceCommand } from './commands/trace';\nimport { cacheStatsCommand, cacheClearCommand, cacheClearMetaCommand } from './commands/cache';\nimport { uploadCommand } from './commands/upload';\nimport {\n skillsListCommand,\n skillsShowCommand,\n skillsInstallCommand,\n} from './commands/skills';\nimport { tenantBootstrapCommand } from './commands/tenant';\nimport {\n metaListCommand,\n metaGetCommand,\n metaSetCommand,\n metaDeleteCommand,\n} from './commands/meta';\nimport {\n removedMiniCommand,\n workspaceAddMiniCommand,\n workspaceActiveCommand,\n workspaceBindCommand,\n workspaceCreateCommand,\n workspaceListCommand,\n workspacePreviewCommand,\n workspacePullCommand,\n workspacePushCommand,\n workspaceStatusCommand,\n workspaceValidateCommand,\n workspaceVerifyCommand,\n} from './commands/workspace';\nimport {\n envList,\n envCurrent,\n envAdd,\n envUse,\n envRemove,\n envShow,\n envEdit,\n} from './commands/env';\nimport { identityList, identityUse, identityRemove } from './commands/identity';\n\nconst program = new Command();\nconst exitOnBrokenPipe = (err: NodeJS.ErrnoException): void => {\n if (err.code === 'EPIPE') process.exit(0);\n throw err;\n};\n\nprocess.stdout.on('error', exitOnBrokenPipe);\nprocess.stderr.on('error', exitOnBrokenPipe);\n\nprogram\n .name('hcm')\n .description('HCM 命令行工具 — 操作 HCM API、与 Moirai 数字员工对话、开发租户开发空间')\n .version(CLI_VERSION);\n\nprogram\n .command('login')\n .description('登录 HCM(配对码 / 用户名密码 / client_credentials / PAT 四种方式)')\n .argument('[endpoint]', '从系统页面「命令行工具」复制来的地址(配对码方式)')\n .option('--code <code>', '配对码,在系统页面用户菜单 →「命令行工具」生成')\n .option('--env <name>', '环境名(默认 activeEnv)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--name <id-name>', '自定义 identity 名(默认按 scheme 推断)')\n .option('--no-activate', 'login 完不切到该环境也不设为 default identity')\n .option('--endpoint <url>', 'HCM 后端地址,例如 http://localhost:8080')\n .option('--username <user>', '用户名(密码登录模式)')\n .option('--password <pwd>', '密码(密码登录模式)')\n .option('--client-id <id>', 'OAuth client_id(client_credentials 模式)')\n .option('--client-secret <secret>', 'OAuth client_secret(client_credentials 模式)')\n .option('--pat <token>', 'PAT 个人访问令牌(注意:会泄漏到 ps/history,建议改用 --pat-stdin)')\n .option('--pat-stdin', '从标准输入读取 PAT(推荐)')\n .option('--new-password <pwd>', '首登强制改密时的新口令(会泄漏到 history/ps,建议 --new-password-stdin)')\n .option('--new-password-stdin', '首登强制改密时从标准输入读新口令(非交互场景)')\n .option('--tenant <tenantId>', '租户 ID(默认 1)')\n .action((endpoint, opts) => loginCommand({ ...opts, endpointArg: endpoint }));\n\nprogram\n .command('logout')\n .description('登出 HCM(清除 identity 的 keychain token)')\n .option('--identity <name>', '指定 identity;默认清当前 env 的 default identity')\n .option('--env <name>', '指定 env(影响 default identity 解析)')\n .action((opts) => logoutCommand(opts));\n\nconst config = program\n .command('config')\n .description('管理全局 defaults(env/identity 用 `hcm env` / `hcm identity`)');\nconfig\n .command('list')\n .description('[deprecated] 用 `hcm env list`')\n .action(() => configListDeprecated());\nconfig\n .command('show')\n .description('[deprecated] 用 `hcm env current`')\n .action(() => configShowDeprecated());\nconfig\n .command('set-profile <name>')\n .description('[deprecated] 用 `hcm env use`')\n .action((n) => configSetProfileDeprecated(n));\nconfig\n .command('delete <name>')\n .description('[deprecated] 用 `hcm env remove --force`')\n .action((n) => configDeleteDeprecated(n));\nconfig\n .command('set <key> <value>')\n .description('设置全局 defaults,例如 `defaults.output json`')\n .action((k, v) => configSet(k, v));\nconfig\n .command('get <key>')\n .description('读取全局 defaults')\n .action((k) => configGet(k));\n\nconst env = program.command('env').description('管理 HCM 环境(多后端连接配置)');\nenv\n .command('list')\n .description('列出全部 env')\n .action(() => envList());\nenv\n .command('current')\n .description('显示当前激活的 env')\n .action(() => envCurrent());\nenv\n .command('add <name>')\n .description('新增 env')\n .option('--endpoint <url>', 'HCM 后端 URL(必填)')\n .option('--tenant <id>', '默认 tenant id', '1')\n .option('--force', '覆盖已存在的同名 env')\n .action((name, opts) => envAdd(name, opts));\nenv\n .command('use <name>')\n .description('切到指定 env')\n .option('--no-ping', '跳过 endpoint 健康检查')\n .action((name, opts) => envUse(name, opts));\nenv\n .command('remove <name>')\n .description('删除 env(级联清除该 env 的全部 identity 和 token)')\n .option('--force', '跳过确认提示')\n .action((name, opts) => envRemove(name, opts));\nenv\n .command('show [name]')\n .description('显示 env 详情(含该 env 下的 identity 列表)')\n .action((name) => envShow({ name }));\nenv\n .command('edit <field> <value>')\n .description('编辑 env 字段(endpoint / tenantId / defaultIdentity / defaultAgent)')\n .option('--env <name>', '目标 env 名(默认当前 activeEnv)')\n .action((field, value, opts) => envEdit(field, value, opts));\n\nconst identity = program.command('identity').description('管理 HCM 身份凭据(env 下的 identity)');\nidentity\n .command('list')\n .description('列出 identity(默认列当前 env,--env all 列全部)')\n .option('--env <name>', '过滤 env;传 \"all\" 列全部', undefined)\n .action((opts) => identityList(opts));\nidentity\n .command('use <name>')\n .description('把 identity 设为其 env 的 default identity')\n .action((name) => identityUse(name));\nidentity\n .command('remove <name>')\n .description('删除 identity(清 token + 若是 env default 则清空)')\n .action((name) => identityRemove(name));\n\nprogram\n .command('query <Model>')\n .description('查询 Model 列表数据(通过 ModelQueryDsl JSON 表达过滤/排序/分页)')\n .option(\n '--filter <JSON>',\n '过滤 AST(ModelQueryDsl):叶子 \\'{\"field\":\"status\",\"op\":\"eq\",\"value\":\"ACTIVE\"}\\','\n + '多条件用 \\'{\"and\":[叶子,…]}\\'。⚠️ 不接受 {\"字段\":\"值\"} 简写,schema 层会拒',\n )\n .option('--sort <JSON>', '排序条件 JSON,例如 \\'[{\"field\":\"hireDate\",\"direction\":\"desc\"}]\\'')\n .option('--fields <list>', '返回字段列表(逗号分隔),例如 name,code,email')\n .option('--keyword <text>', '全文检索关键字')\n .option('--limit <n>', '每页大小', '20')\n .option('--offset <n>', '偏移量(按 limit 自动换算 page)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((m, opts) => queryCommand(m, opts));\n\nprogram\n .command('action <Model.Action>')\n .description('调用 Model 上的 Action(业务方法),例如 Employee.regularize')\n .option('--id <id>', '目标实体 ID(object Action 必填)')\n .option('--ids <csv>', '批量 ID(逗号分隔,bulk Action 用)')\n .option('--method <method>', 'HTTP 方法:GET | POST | PUT | DELETE', 'POST')\n .option('--scope <scope>', '强制 Action scope:class | object(默认:有 --id 为 object,否则 class)')\n .option('--params <JSON>', 'Action 入参 JSON,例如 \\'{\"effectDate\":\"2026-06-01\"}\\'')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((spec, opts) => actionCommand(spec, opts));\n\nprogram\n .command('create <Model>')\n .description('创建一条 Model 记录(走后端完整校验)')\n .option('--data <JSON>', '记录字段 JSON,例如 \\'{\"code\":\"ORG_SALES\",\"name\":\"销售部\"}\\'')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((m, opts) => createCommand(m, opts));\n\nprogram\n .command('delete <Model>')\n .description('删除一条 Model 记录(走后端完整校验;部分 Model 会执行业务撤销)')\n .option('--id <id>', '目标实体 ID(必填)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((m, opts) => deleteCommand(m, opts));\n\nprogram\n .command('import <path>')\n .description('注入 DataPackage YAML 数据集(目录或单文件,走后端完整校验)')\n .option('--dry-run', '只跑客户端静态校验,不落库(见 spec §8 限制)')\n .option('--update-only', '已存在(按 key_field)则 PUT 更新,否则 create')\n .option('--on-error <mode>', 'stop | continue(默认 continue)', 'continue')\n .option('--report <path>', '写 JSON 注入报告(逐行结果 + key→id 映射)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => importCommand(p, opts));\n\nprogram\n .command('describe <Model>')\n .description('查看 Model 元数据(字段、关系、Action 列表)')\n .option('-v, --verbose', '显示字段描述与 enum 取值')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((m, opts) => describeCommand(m, opts));\n\nprogram\n .command('chat [prompt]')\n .description('与数字员工 Moirai 对话;有 prompt 单发后退出,不带 prompt 进入 REPL')\n .option('--agent <key>', '指定 agent UUID(默认使用 analyst 内置 agent)')\n .option('--resume <id>', '续接指定 conversation;不传则默认开新会话')\n .option('--conversation <id>', '[deprecated] 用 --resume 替代;传 NEW 等价默认新会话')\n .option('--list', '列出最近会话,不进入聊天')\n .option('--events [conversationId]', '只读查看指定 conversation 的 timeline/event 流;也可配 --resume <id>')\n .option('--limit <N>', '配合 --list:显示最近 N 条会话', '10')\n .option('--stream', '流式输出(默认开启,逐 token 打印 + thinking/tools 实时显示)', true)\n .option('--no-stream', '关闭流式,等 LLM 全文返回后一次性显示(CI / 脚本管道场景)')\n .option('--show-tool-calls', '展示工具调用详细参数(默认显示工具名 + 状态,verbose 时显示完整参数)', true)\n .option('--no-show-tool-calls', '完全隐藏工具调用')\n .option('--prompt-file <path>', '从文件读取 prompt 内容')\n .option('--timeout <sec>', '请求超时秒数', '60')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:text | json', 'text')\n .option('--no-markdown', '关闭流式末态 markdown 渲染(CI / pipe 友好)')\n .option('--no-thinking', '关闭 thinking 段显示')\n .option('--verbose-thinking', '展开 thinking 完整内容(默认仅单行总结)')\n .option('--verbose-tools', '展示工具调用完整参数(默认仅工具名 + 状态)')\n .option('--no-spinner', '关闭 spinner(CI 友好)')\n .option('--no-color', '关闭颜色(CI / accessibility)')\n .option('--raw', '逐行打印原始 v4/control envelope(协议示波器,不渲染)')\n .option('--auto-approve', '自动批准高风险 confirm(仍打印审计行;批量 / 非交互场景)')\n .option('--on-confirm <decision>', '非交互 confirm 决策:approve | reject | reject:<reason>(优先于 --auto-approve)')\n .option('--on-ask <answer>', '非交互 ASK 应答文本(命中 choices 时自动回填 choiceIndex)')\n .option(\n '--inject-on <spec>',\n '流中途注入命令(仅 --raw):<eventType>:<action>[:<content>],action ∈ {interrupt, steer}(P0 S-interrupt / S-steer)',\n )\n .option(\n '--regenerate-from <seq>',\n '重新生成(ADR-089):发 response.regenerate 重跑指定 assistant 段;取正整数 seq 或 last-assistant,必须配 --resume <id>',\n )\n .option(\n '--attach <path>',\n '附件:上传本地文件随消息发送(可重复;REPL 内也可用 @路径 内联或 /attach)',\n (v: string, acc: string[]) => [...acc, v],\n [] as string[],\n )\n .action((prompt, opts) => chatCommand(prompt, opts));\n\nprogram\n .command('download <documentId>')\n .description('下载 HCM 文档到本地(会话附件 / 报表产物;默认 ~/Downloads/hcm)')\n .option('-o, --output <path>', '输出文件或目录')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .action((documentId, opts) => downloadCommand(documentId, opts));\n\nconst workspace = program\n .command('workspace')\n .description('开发租户开发空间文件包(mini_apps / menus / metas / scripts)');\nworkspace\n .command('list')\n .description('列出当前用户可访问的租户开发空间')\n .option('--keyword <text>', '按空间 Key / 说明 / Owner 搜索')\n .option('--limit <n>', '返回条数', '50')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceListCommand(opts));\nworkspace\n .command('active')\n .description('查看当前 HCM 开发模式激活空间,并对比本地目录绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceActiveCommand(opts));\nworkspace\n .command('bind <workspaceKey>')\n .description('把当前目录绑定到一个租户开发空间')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--tenant <tenantId>', '租户 ID(默认使用 env 配置)')\n .option('--endpoint <url>', 'HCM 后端地址(默认使用 env 配置)')\n .option('--force', '强制覆盖已有绑定')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((workspaceKey, opts) => workspaceBindCommand(workspaceKey, opts));\nworkspace\n .command('create <workspaceKey>')\n .description('新建租户开发空间,并在本地目录写入 workspace 绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--description <text>', '开发空间说明')\n .option('--activate', '创建后绑定为当前开发空间')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '本地目录已有不同 workspace 绑定时强制覆盖')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((workspaceKey, opts) => workspaceCreateCommand(workspaceKey, opts));\nworkspace\n .command('pull')\n .description('从开发空间拉取文件包到本地;mini_apps 会生成可验证的 artifact 上下文')\n .option('--workspace <key>', '租户开发空间 key;未提供时读取本地绑定')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '强制覆盖已有的本地文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePullCommand(opts));\n\nconst workspaceAdd = workspace.command('add').description('向已绑定开发空间添加 artifact');\nworkspaceAdd\n .command('mini <appCode>')\n .description('新增轻应用 artifact(写入 mini_apps/<appCode>/)')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--name <name>', '轻应用展示名')\n .option('--template <kind>', '模板:dashboard | multi-page | writable-workbench', 'dashboard')\n .option('--model <Model>', '可写工作台绑定的 Model,例如 OrgUnit')\n .option('--fields <csv|auto>', '可写工作台表单字段列表;传 auto 时根据 Model 元数据推断')\n .option('--defaults <JSON|auto>', '可写工作台创建默认值;传 auto 时根据 Model 元数据推断')\n .option(\n '--surface <surface>',\n '运行形态:embedded(嵌入业务页)| standalone(独立页)',\n 'embedded',\n )\n .option('--scopes <csv>', 'manifest.requiredScopes 列表(逗号分隔;默认随模板选择)')\n .option('--tenant <tenantId>', 'manifest.bundleObjectRef 中绑定的租户 ID')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--force', '强制覆盖已有的本地文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((appCode, opts) => workspaceAddMiniCommand(appCode, opts));\nworkspace\n .command('status')\n .description('查看开发空间本地 artifact 与上次 pull/push 的差异')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceStatusCommand(opts));\nworkspace\n .command('validate')\n .description('校验开发空间本地 artifact(push 前必跑)')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceValidateCommand(opts));\nworkspace\n .command('push')\n .description('把本地开发空间 artifact 推送回租户开发空间')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--dry-run', '只计算待执行的操作,不真正写远端文件')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePushCommand(opts));\nworkspace\n .command('preview')\n .description('打印开发空间中轻应用 artifact 的预览 URL')\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--frontend <url>', '前端地址', 'http://127.0.0.1:5179')\n .option('--surface <surface>', '展示哪种形态:all | bare | standalone | embedded', 'all')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspacePreviewCommand(opts));\nworkspace\n .command('verify')\n .description(\n '一键验收:串联 validate + status + push --dry-run + preview,全程只读不写远端,push 前必跑',\n )\n .option('--dir <path>', '工作空间本地目录', '.')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,dry-run 阶段需要)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--frontend <url>', '前端地址', 'http://127.0.0.1:5179')\n .option('--surface <surface>', '预览形态:all | bare | standalone | embedded', 'all')\n .option('--smoke', '对预览入口与基础资源执行只读 HTTP GET 可达检查')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((opts) => workspaceVerifyCommand(opts));\n\nprogram\n .command('trace [traceId]')\n .description('查看 trace:不传 traceId 列最近记录,传 traceId 显示人类可读详情')\n .option('--conv <convId>', '查会话的 LLM 逐调用 trace(PG llm_call_trace,ADR-134 D2)')\n .option('--llm-calls', '把位置参当 convId 查 LLM 逐调用(等价 --conv <convId>)')\n .option('--span <N>', '查看第 N 个 span 的详情')\n .option('-n, --limit <N>', '列表模式显示条数', '10')\n .option('--events', '按事件时间线展示 spans/logs/LLM 内容摘要')\n .option('--raw', '输出原始 trace 聚合 JSON(协议/P0 调试用)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--profile <name>', '[deprecated] 用 --env 替代')\n .option('--output <fmt>', '兼容输出格式:table | json | yaml;调试原文优先用 --raw', 'table')\n .action((traceId, opts) => traceCommand(traceId ?? null, opts));\n\nprogram\n .command('mini')\n .description('已移除:请改用 hcm workspace')\n .allowUnknownOption(true)\n .allowExcessArguments(true)\n .argument('[args...]')\n .action(() => removedMiniCommand());\n\n// ─── cache:两级缓存运维(改 meta / 改数据后必用) ───────────────────────\nconst cache = program.command('cache').description('模型缓存运维(Caffeine 本地 + Redis 远程,须走 API)');\ncache\n .command('stats <Model>')\n .description('查看模型缓存统计')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheStatsCommand(model, opts));\ncache\n .command('clear <Model>')\n .description('清模型实体缓存(幂等,不破坏数据)')\n .option('--id <id>', '只清单条(默认清全部)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheClearCommand(model, opts));\ncache\n .command('clear-meta <Model>')\n .description('清元数据缓存(Code 级 YAML + Action 定义)——改 meta YAML 后必跑')\n .option('--type <type>', '元数据类型:list | info | view | filter | page…(默认全清)')\n .option('--state <state>', '状态变体(如 self),配合 --type')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => cacheClearMetaCommand(model, opts));\n\n// ─── upload:与 download 成对,报表/套打/导入模板的入口 ──────────────────\nprogram\n .command('upload <file>')\n .description('上传本地文件到 HCM 文档服务,返回 documentId')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((file, opts) => uploadCommand(file, opts));\n\n// ─── tenant:交付旅程第一步,唯一「无租户无用户」时可用的写入口 ──────────\nconst tenant = program.command('tenant').description('租户开通与生命周期');\ntenant\n .command('bootstrap')\n .description('开通新租户(建租户 + admin 用户 + 结构 reconcile)——不可逆,默认过确认闸')\n .requiredOption('--tenant-id <id>', '租户 ID')\n .requiredOption('--admin-username <user>', '管理员用户名')\n .option('--admin-password <pwd>', '管理员密码(会泄漏到 history/ps,建议 --admin-password-stdin)')\n .option('--admin-password-stdin', '从标准输入读管理员密码(推荐)')\n .option('--tenant-name <name>', '租户名称(默认取 tenantId)')\n .option('--bootstrap-key <key>', 'bootstrap 密钥(建议用 HCM_BOOTSTRAP_KEY 环境变量)')\n .option('--bootstrap-key-stdin', '从标准输入读 bootstrap 密钥')\n .option('--endpoint <url>', '后端地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('-y, --yes', '跳过确认(CI 用)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => tenantBootstrapCommand(opts));\n\n// ─── meta:租户元数据读写(配置面的主战场) ─────────────────────────────\nconst meta = program.command('meta').description('租户元数据读写(页面/字段/列表配置)');\nmeta\n .command('list')\n .description('列出租户元数据文件')\n .option('--keyword <kw>', '搜索关键词')\n .option('--type <type>', '类型:yml | properties | all', 'all')\n .option('--page <n>', '页码(从 0 开始)')\n .option('--page-size <n>', '每页条数')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => metaListCommand(opts));\nmeta\n .command('get <path>')\n .description('打印 meta 原文(如 metas/Employee.list.yml)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .action((p, opts) => metaGetCommand(p, opts));\nmeta\n .command('set <path>')\n .description('写入 meta 原文;写完须 hcm cache clear-meta <Model> 才生效')\n .requiredOption('--file <file>', '从文件读取原文(- 表示 stdin)')\n .option('--dry-run', '只显示将写入的内容,不实际写入')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => metaSetCommand(p, opts));\nmeta\n .command('delete <path>')\n .description('删除 meta(不可逆,默认过确认闸)')\n .option('-y, --yes', '跳过确认')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((p, opts) => metaDeleteCommand(p, opts));\n\n// ─── skills:睿戎 Chiron 交付技能库(免认证,空环境即可用) ───────────────\nconst skills = program\n .command('skills')\n .description('睿戎 Chiron 交付技能库:列出 / 查看 / 安装交付技能(免认证,无需先 login)');\nskills\n .command('list [keyword]')\n .description('列出目标环境这一版的交付技能')\n .option('--category <key>', '只看某个分类')\n .option('--stage <key>', '只看某个交付阶段:handover | baseline | configure | migrate | integrate | golive | operate')\n .option('--by-stage', '按交付生命周期分组展示(默认按功能分类)')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((kw, opts) => skillsListCommand(kw, opts));\nskills\n .command('show <id>')\n .description('打印技能原文(管道友好)')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .action((id, opts) => skillsShowCommand(id, opts));\nskills\n .command('install <id>')\n .description('装到 agent 技能目录(默认 ./.claude/skills/)')\n .option('--global', '装到 ~/.claude/skills/ 而非当前项目')\n .option('--dir <path>', '装到指定目录')\n .option('--from <dir>', '从本地目录装(现场改过的版本),不走网络')\n .option('--force', '覆盖已存在的同名技能')\n .option('--endpoint <url>', '技能库地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((id, opts) => skillsInstallCommand(id, opts));\n\nprogram\n .command('update <Model>')\n .description('更新一条 Model 记录(走后端完整校验)')\n .requiredOption('--id <id>', '记录 ID')\n .requiredOption('--data <JSON>', '要更新的字段 JSON,例如 \\'{\"name\":\"新名称\"}\\'')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份(覆盖 env defaultIdentity,本次命令)')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((model, opts) => updateCommand(model, opts));\n\nprogram\n .command('version')\n .description('查后端版本(commit / tag / 构建时间)——免认证,无需先 login')\n .option('--endpoint <url>', '后端地址(默认取 activeEnv 的 endpoint)')\n .option('--env <name>', '从该 env 解析 endpoint')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((opts) => versionCommand(opts));\n\n// ─── setting:租户系统参数(受控 PATCH 路径,不是标准 Model 的 PUT)───────\nconst setting = program\n .command('setting')\n .description('租户系统参数(登录策略 / 密码策略 / 功能开关 / 集成参数)');\nsetting\n .command('get <domain>')\n .description('读某域参数(定义 + 租户覆盖值合并,缺失回落默认值)')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'table')\n .action((d, opts) => settingGetCommand(d, opts));\nsetting\n .command('set <domain>')\n .description('改参数,可重复 --set;走受控校验路径而非标准 CRUD')\n .option('--set <assignment...>', 'namespace.key=value,例如 security.password.passwordPolicy=complex')\n .option('--dry-run', '只显示将写入什么,不实际写入')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((d, opts) => settingSetCommand(d, opts));\nsetting\n .command('reset <domain> <namespace> <key>')\n .description('清除租户覆盖,回落到默认值')\n .option('--revision <n>', '乐观锁版本号')\n .option('-y, --yes', '跳过确认')\n .option('--env <name>', '临时切环境(覆盖 activeEnv,本次命令)')\n .option('--as <identity>', '临时换身份')\n .option('--output <fmt>', '输出格式:table | json | yaml', 'json')\n .action((d, ns, k, opts) => settingResetCommand(d, ns, k, opts));\n\nasync function main(): Promise<void> {\n try {\n await migrateLegacyProfiles();\n } catch (e) {\n // Migration should never fully throw (it catches per-profile failures),\n // but guard the top-level just in case to avoid breaking unrelated commands.\n process.stderr.write(\n `[hcm] event=migration_error reason=${JSON.stringify(String((e as Error).message))}\\n`,\n );\n }\n await program.parseAsync(process.argv);\n}\n\nmain().catch((e: unknown) => {\n process.stderr.write(`[hcm] fatal: ${String((e as Error).message)}\\n`);\n process.exit(1);\n});\n","import { readFileSync } from 'node:fs';\n\ninterface PackageManifest {\n version: string;\n}\n\nconst manifest = JSON.parse(\n readFileSync(new URL('../package.json', import.meta.url), 'utf8'),\n) as PackageManifest;\n\nexport const CLI_VERSION = manifest.version;\n","import axios from 'axios';\nimport {\n loginClientCredentials,\n loginPairing,\n loginPat,\n loginPassword,\n inferEnvName,\n toOrigin,\n changePassword,\n detectPasswordChangeChallenge,\n loadEnv,\n saveEnv,\n saveIdentity,\n loadIdentity,\n loadGlobalConfig,\n saveGlobalConfig,\n TokenStore,\n isServerSlidingSession,\n CliError,\n CliErrorCode,\n describePrincipal,\n type IdentityMeta,\n type Principal,\n} from '@hcmai/sdk';\nimport { promptText, promptSecret, readStdin } from '../utils/prompt';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nexport interface LoginArgs {\n env?: string;\n profile?: string; // [deprecated] transpile to --env with stderr warning\n name?: string; // custom identity name (overrides auto inference)\n /**\n * Commander quirk: `--no-activate` sets `opts.activate = false` (not\n * `opts.noActivate = true`). Default (no flag) → undefined → treat as true.\n * Use `args.activate !== false` to mean \"should activate\".\n */\n activate?: boolean;\n endpoint?: string;\n username?: string;\n password?: string;\n clientId?: string;\n clientSecret?: string;\n pat?: string;\n patStdin?: boolean;\n /** 首登强制改密时的新口令(非交互场景)。见 loginPasswordWithFirstLoginChange。 */\n newPassword?: string;\n newPasswordStdin?: boolean;\n tenant?: string;\n /** 配对码(ADR-308 第四轨)。与位置参数 <endpoint> 搭配使用。 */\n code?: string;\n /** 位置参数:从页面复制来的地址,可带路径与查询串。 */\n endpointArg?: string;\n}\n\n/**\n * 密码登录,并接管 fresh tenant 的**首登强制改密**。\n *\n * `hcm tenant bootstrap` 建出来的租户,admin 用初始口令登录会被后端拒(403\n * `AUTH_PASSWORD_CHANGE_REQUIRED`)并返回一个 300 秒有效的 changePasswordToken——\n * 不改密就拿不到正式 token,新租户等于登不进去。这是交付第一步上的硬阻塞,\n * 所以由 login 自己走完,而不是让顾问去拼两条 curl。\n *\n * 非该挑战的失败(口令错、账号锁定 423、网络错)原样抛出,不做任何吞咽。\n */\nasync function loginPasswordWithFirstLoginChange(\n input: Parameters<typeof loginPassword>[0],\n args: LoginArgs,\n): Promise<Awaited<ReturnType<typeof loginPassword>>> {\n try {\n return await loginPassword(input);\n } catch (e) {\n const challenge = detectPasswordChangeChallenge(e);\n if (!challenge) throw e;\n\n process.stderr.write(\n `[hcm] 该账号首次登录必须改密(临时凭据 ${challenge.expiresInSeconds ?? 300}s 内有效)\\n`,\n );\n let next: string;\n if (args.newPasswordStdin) next = (await readStdin()).trim();\n else if (args.newPassword) {\n process.stderr.write(\n '[hcm] WARNING: --new-password <p> 会泄漏到 shell history / ps aux。推荐 --new-password-stdin。\\n',\n );\n next = args.newPassword;\n } else {\n next = await promptSecret('设置新密码: ');\n const again = await promptSecret('再输一次: ');\n if (next !== again) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '两次输入的新密码不一致',\n });\n }\n }\n if (!next) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '新密码不能为空' });\n }\n\n await changePassword({\n endpoint: input.endpoint,\n changePasswordToken: challenge.changePasswordToken,\n oldPassword: input.password,\n newPassword: next,\n httpClient: input.httpClient,\n });\n process.stderr.write('[hcm] 密码已更新,正在用新密码登录\\n');\n return loginPassword({ ...input, password: next });\n }\n}\n\nfunction inferIdentityName(\n scheme: 'password' | 'client_credentials' | 'pat' | 'pairing',\n env: string,\n extra: { username?: string; clientId?: string },\n): string {\n if (scheme === 'password' && extra.username) return `${extra.username}@${env}`;\n if (scheme === 'client_credentials' && extra.clientId) {\n return `${extra.clientId.slice(0, 6)}@${env}`;\n }\n if (scheme === 'pairing' && extra.username) return `${extra.username}@${env}`;\n if (scheme === 'pat') {\n const name = `pat-${Math.random().toString(36).slice(2, 6)}@${env}`;\n process.stderr.write(\n `[hcm] event=pat_identity_auto_named name=${name} hint=\"pass --name <id> for a stable identity name across re-logins\"\\n`,\n );\n return name;\n }\n return `default@${env}`;\n}\n\n/**\n * Migrate token + meta from a profile-scoped TokenStore (legacy path used by\n * @hcmai/sdk loginPassword/Pat/ClientCredentials helpers) into an\n * identity-scoped TokenStore. Once @hcmai/sdk helpers accept a TokenStore arg\n * (Phase 2 follow-up), this shim can be removed.\n */\nasync function migrateProfileTokenToIdentity(\n envName: string,\n identityName: string,\n): Promise<void> {\n const oldStore = new TokenStore(envName);\n const oldMeta = await oldStore.readMeta();\n if (!oldMeta) throw new Error('login helper did not write token meta');\n\n const rawAccess = await oldStore.getAccessToken();\n const rawRefresh = await oldStore.getRefreshToken();\n\n const newStore = TokenStore.forIdentity(identityName);\n // Seed meta first so subsequent setAccessToken/setRefreshToken can update\n // the accessTokenRef/refreshTokenRef in place via writeMeta.\n await newStore.writeMeta(oldMeta);\n try {\n if (rawAccess) {\n const ref = await newStore.setAccessToken(rawAccess);\n const cur = (await newStore.readMeta()) ?? oldMeta;\n cur.accessTokenRef = ref;\n await newStore.writeMeta(cur);\n }\n if (rawRefresh) {\n const ref = await newStore.setRefreshToken(rawRefresh);\n const cur = (await newStore.readMeta()) ?? oldMeta;\n cur.refreshTokenRef = ref;\n await newStore.writeMeta(cur);\n }\n // Wipe legacy keychain + credentials.json so the profile-scoped path is\n // no longer authoritative for this token.\n await oldStore.clear();\n } catch (err) {\n // Partial migration: identity meta exists but token may not have made it\n // to identity-scoped keychain (or legacy path may still linger). Surface a\n // recovery hint so user knows to re-run login.\n process.stderr.write(\n `[hcm] event=migration_partial_failure direction=profile-to-identity identity=${identityName} reason=${JSON.stringify(String((err as Error).message))} hint=\"re-run hcm login --env ${envName}\"\\n`,\n );\n throw err;\n }\n}\n\nexport async function loginCommand(args: LoginArgs): Promise<void> {\n // deprecated --profile transpile\n if (args.profile && args.env) {\n process.stderr.write(\n '[hcm] event=deprecated_flag_ignored flag=--profile reason=\"--env also passed; --env wins\"\\n',\n );\n } else if (args.profile && !args.env) {\n process.stderr.write(\n '[hcm] event=deprecated_flag flag=--profile replacement=--env\\n',\n );\n args.env = args.profile;\n }\n\n const g = await loadGlobalConfig();\n // 🔴 配对轨的 env 名从**粘贴进来的地址**推,而不是 activeEnv:这条轨存在的全部理由\n // 就是「使用者不知道自己该用哪个 env / endpoint / 租户」,落到 activeEnv 等于又把那个\n // 前提搬了回来——而且会把新环境的凭据默默写进旧环境。\n const pairingOrigin = args.code ? toOrigin(args.endpointArg ?? args.endpoint ?? '') : null;\n const envName = args.env ?? (pairingOrigin ? inferEnvName(pairingOrigin) : g.activeEnv);\n\n try {\n // Load existing env or prompt for endpoint\n let envCfg = await loadEnv(envName).catch(() => null);\n if (pairingOrigin && !envCfg) {\n // 配对轨:地址来自那一行命令,租户随兑换响应回来,两样都不必问人。\n envCfg = { endpoint: pairingOrigin };\n await saveEnv(envName, envCfg);\n }\n if (pairingOrigin && envCfg && envCfg.endpoint !== pairingOrigin) {\n // 🔴 同名不同址不许静默覆盖:那会把另一个环境的配置改掉,而使用者只是粘贴了\n // 一行命令、根本不知道自己动了什么。\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n `env '${envName}' 已存在且指向 ${envCfg.endpoint},与本次的 ${pairingOrigin} 不同。` +\n `用 --env <name> 显式指定一个新名字。`,\n });\n }\n if (!envCfg) {\n const endpoint = args.endpoint ?? (await promptText('endpoint: '));\n if (!endpoint) {\n throw new CliError({\n code: CliErrorCode.ENV_ENDPOINT_REQUIRED,\n message:\n 'env not configured; pass --endpoint or run `hcm env add` first',\n });\n }\n envCfg = { endpoint, tenantId: args.tenant ?? '1' };\n await saveEnv(envName, envCfg);\n }\n const endpoint = envCfg.endpoint;\n const tenantId = args.tenant ?? envCfg.tenantId ?? '1';\n const http = axios.create({ baseURL: endpoint, timeout: 30_000 });\n\n // Resolve PAT input (if any)\n let pat: string | undefined;\n if (args.patStdin) pat = await readStdin();\n else if (args.pat) {\n pat = args.pat;\n process.stderr.write(\n '[hcm] WARNING: --pat <token> may leak via shell history / ps aux. Prefer --pat-stdin.\\n',\n );\n }\n\n let scheme: 'password' | 'client_credentials' | 'pat' | 'pairing';\n let scopes: string[];\n let username: string | undefined;\n let clientId: string | undefined;\n // 服务端认定的归属。三条 track 里只有 PAT 与口令能拿到(client_credentials 是机器身份)。\n let principal: Principal | undefined;\n\n if (args.code) {\n // ─── Track 4: 配对码(ADR-308)───\n // 放在最前:它自带地址与租户,不与下面三条的任何参数组合冲突。\n const { record, principal: p } = await loginPairing({\n endpoint,\n code: args.code,\n profile: envName,\n httpClient: http,\n });\n scheme = 'pairing';\n scopes = record.scopes;\n principal = p;\n username = p?.username;\n } else if (pat) {\n // ─── Track 1: PAT ───\n const { record, principal: p } = await loginPat({\n endpoint,\n tenantId,\n pat,\n profile: envName,\n httpClient: http,\n });\n scheme = 'pat';\n scopes = record.scopes;\n principal = p;\n } else if (args.clientId || args.clientSecret) {\n // ─── Track 2: client_credentials ───\n clientId = args.clientId ?? (await promptText('client_id: '));\n const clientSecret =\n args.clientSecret ?? (await promptSecret('client_secret: '));\n if (!clientId || !clientSecret) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: 'client_id and client_secret required',\n });\n }\n const { record } = await loginClientCredentials({\n endpoint,\n tenantId,\n clientId,\n clientSecret,\n profile: envName,\n httpClient: http,\n });\n scheme = 'client_credentials';\n scopes = record.scopes;\n } else {\n // ─── Track 3 (default): password ───\n username = args.username ?? (await promptText('username: '));\n const password = args.password ?? (await promptSecret('password: '));\n if (!username || !password) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: 'username and password required',\n });\n }\n const { record, principal: p } = await loginPasswordWithFirstLoginChange(\n { endpoint, tenantId, username, password, profile: envName, httpClient: http },\n args,\n );\n scheme = 'password';\n scopes = record.scopes;\n principal = p;\n }\n\n // Pick identity name (auto-inferred or --name override)\n const idName =\n args.name ?? inferIdentityName(scheme, envName, { username, clientId });\n\n // Move token from profile-scoped to identity-scoped store\n await migrateProfileTokenToIdentity(envName, idName);\n\n // Write IdentityMeta JSON (env FK validated inside saveIdentity)\n const newStore = TokenStore.forIdentity(idName);\n const newMeta = await newStore.readMeta();\n const identityMeta: IdentityMeta = {\n env: envName,\n scheme,\n scopes,\n expiresAt: newMeta?.expiresAt,\n // 服务端回了用户名就用服务端的:`--user` 传的只是登录入参,大小写/别名都可能与\n // 账号真名不同。\n username: principal?.username ?? username,\n accessTokenRef: newMeta?.accessTokenRef,\n refreshTokenRef: newMeta?.refreshTokenRef,\n tenantId: principal?.tenantId,\n // saveIdentity 写的是 IdentityMeta 形状,且和 TokenStore 共用同一个文件、\n // 最后写 —— 不在这里显式带上,上一步 writeMeta 存的 ttlSeconds 会被抹掉。\n ttlSeconds: newMeta?.ttlSeconds,\n };\n await saveIdentity(idName, identityMeta);\n\n // 🔴 「我要的租户」vs「token 实际归属的租户」不一致时必须让人看见:不一致意味着\n // 后面每一条命令都打在另一个租户上,而返回的数据看起来完全正常。\n if (principal?.tenantId && String(principal.tenantId) !== String(tenantId)) {\n process.stderr.write(\n `[hcm] WARNING: 请求的租户是 ${tenantId},但 token 实际归属租户 ${principal.tenantId}。` +\n `后续命令按 ${principal.tenantId} 执行。\\n`,\n );\n }\n\n // Commander quirk: `--no-activate` sets opts.activate=false, NOT\n // opts.noActivate=true. Default (no flag) → undefined → treat as true.\n const shouldActivate = args.activate !== false;\n // Point defaultIdentity at the identity we just logged in as (unless --no-activate).\n // This used to fire only when the env had NO defaultIdentity, so logging in as a second\n // user on the same env left defaultIdentity pinned to the first one — every later command\n // then ran silently as the wrong identity. Skip the write when it already matches.\n if (shouldActivate && envCfg.defaultIdentity !== idName) {\n envCfg.defaultIdentity = idName;\n await saveEnv(envName, envCfg);\n }\n // Auto-switch activeEnv unless --no-activate\n if (shouldActivate) {\n const gl = await loadGlobalConfig();\n gl.activeEnv = envName;\n await saveGlobalConfig(gl);\n }\n\n // 回显里必须有**服务端说的**身份,而不只是我们自己传进去的参数 —— 后者登错租户时\n // 长得和登对了一模一样。\n exitOk(\n `✅ logged in (env=${envName}, identity=${idName}, scheme=${scheme}, ` +\n `${describePrincipal(principal)}, scopes=${scopes.join(' ')})`,\n );\n } catch (e) {\n const err = e as { isAxiosError?: boolean };\n if (err.isAxiosError) {\n const { fromAxiosError } = await import('@hcmai/sdk');\n exitWithError(\n fromAxiosError(\n e as Parameters<typeof fromAxiosError>[0],\n envName,\n ),\n );\n }\n exitWithError(e);\n }\n}\n\n/**\n * 登出。\n *\n * 🔴 **先让服务端吊销,再清本地**——此前这里只做了后半截(`TokenStore.clear()`),\n * 于是 `hcm logout` 删掉的只是**本机的一份副本**,服务端那个 token 在 Redis 里继续\n * 有效最多 24 小时。名字叫 logout 而实际不 logout,在两个场景下会直接骗人:\n *\n * 1. **在别人的机器上跑过 CLI**(顾问 SSH 进客户服务器是常态):你以为退出了,\n * 实际上那台机器的 root / 备份快照里可能早已复制走一份仍然有效的 token。\n * 2. **凭据可能已泄漏时**:logout 是人第一反应会执行的补救动作,而它什么都没补救。\n *\n * 服务端 `POST /api/auth/logout` 走 `tokenManager.revokeToken(token)` 真吊销,且该路径\n * 在 `SecurityPathConfig.PUBLIC_PATHS` 里、带自己的 Bearer 就能调——能力一直都在,\n * 只是没接线。\n *\n * **失败不阻断清本地**:服务端不可达时仍然清掉本地凭据,但**如实说明**服务端那份可能\n * 还活着。反过来(服务端失败就不清本地)会让人在断网时连登出都做不了。\n */\nexport async function logoutCommand(args: {\n identity?: string;\n env?: string;\n}): Promise<void> {\n try {\n let target = args.identity;\n let envName = args.env;\n if (!target) {\n const g = await loadGlobalConfig();\n envName = args.env ?? g.activeEnv;\n const envCfg = await loadEnv(envName).catch(() => null);\n const dflt = envCfg?.defaultIdentity;\n if (!dflt) {\n exitOk('(no active identity to log out)');\n return;\n }\n target = dflt;\n }\n // Throw IDENTITY_NOT_FOUND for nonexistent identity instead of silently\n // succeeding (which would falsely report \"logged out\" of something that\n // never existed).\n const idMeta = await loadIdentity(target);\n const store = TokenStore.forIdentity(target);\n\n const revoked = await revokeOnServer(store, envName ?? idMeta.env);\n await store.clear();\n\n if (revoked) {\n exitOk(`✅ logged out (identity: ${target})`);\n } else {\n // 🔴 不许把这一支也报成 ✅:本地清了,服务端那份可能还有效。\n exitOk(\n `⚠️ 已清除本地凭据 (identity: ${target}),但服务端吊销未确认——` +\n `该 token 可能仍然有效直至自然过期。若凭据可能已泄漏,请改密以吊销全部会话。`,\n );\n }\n } catch (e) {\n exitWithError(e);\n }\n}\n\n/**\n * 请服务端吊销这条 token。返回是否确认吊销。\n *\n * 🔴 **只对服务端会话 token 生效**,走 `isServerSlidingSession` 谓词而不是逐个列举:\n * - `pat` —— 别处颁发的长期凭据,由后端管失效,`logout` 只该断开本机引用,\n * 不该把别人的 PAT 吊销掉\n * - `client_credentials` —— `hcmt_` 不是 Redis 会话 token,`/api/auth/logout` 对它无效\n * - `password` / `pairing` —— 这两条才是 `TokenManager.createToken` 铸的会话 token\n *\n * 此前这里写的是 `meta.scheme === 'pat'` 取反,等于把 client_credentials 也发出去\n * 打一次注定无效的请求;更要命的是新增第四轨时,只要 scheme 记错就会**静默跳过吊销**。\n */\nasync function revokeOnServer(store: TokenStore, envName: string): Promise<boolean> {\n try {\n const meta = await store.readMeta();\n if (!meta || !isServerSlidingSession(meta.scheme)) return false;\n const token = await store.getAccessToken();\n if (!token) return false;\n const envCfg = await loadEnv(envName).catch(() => null);\n if (!envCfg?.endpoint) return false;\n\n await axios.create({ baseURL: envCfg.endpoint, timeout: 15_000 }).post(\n `${envCfg.endpoint}/api/auth/logout`,\n undefined,\n { headers: { Authorization: `Bearer ${token}` } },\n );\n return true;\n } catch {\n // 服务端不可达 / token 已失效 —— 两种都不该阻断本地清理。\n return false;\n }\n}\n","import * as readline from 'node:readline';\n\nexport async function promptText(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n}\n\nexport async function promptSecret(question: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(question);\n const stdin = process.stdin;\n stdin.setRawMode?.(true);\n stdin.resume();\n let buf = '';\n const onData = (data: Buffer) => {\n const s = data.toString('utf-8');\n for (const ch of s) {\n if (ch === '\\r' || ch === '\\n') {\n stdin.setRawMode?.(false);\n stdin.pause();\n stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n resolve(buf);\n return;\n }\n if (ch === '\\x03') process.exit(130); // Ctrl+C\n if (ch === '\\x7f') {\n buf = buf.slice(0, -1);\n continue;\n }\n buf += ch;\n process.stdout.write('*');\n }\n };\n stdin.on('data', onData);\n });\n}\n\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString('utf-8').trim();\n}\n\nexport async function promptConfirm(question: string): Promise<boolean> {\n const ans = await promptText(question);\n return /^y(es)?$/i.test(ans.trim());\n}\n","import {\n loadGlobalConfig,\n saveGlobalConfig,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { envList, envCurrent, envUse, envRemove } from './env';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nfunction warnDeprecated(oldCmd: string, newCmd: string): void {\n process.stderr.write(\n `[hcm] event=deprecated_cmd old=${JSON.stringify(oldCmd)} replacement=${JSON.stringify(newCmd)}\\n`,\n );\n}\n\nexport async function configListDeprecated(): Promise<void> {\n warnDeprecated('hcm config list', 'hcm env list');\n await envList();\n}\n\nexport async function configShowDeprecated(): Promise<void> {\n warnDeprecated('hcm config show', 'hcm env current');\n await envCurrent();\n}\n\nexport async function configSetProfileDeprecated(name: string): Promise<void> {\n warnDeprecated('hcm config set-profile', 'hcm env use');\n // Legacy 行为不 ping endpoint\n await envUse(name, { ping: false });\n}\n\nexport async function configDeleteDeprecated(name: string): Promise<void> {\n warnDeprecated('hcm config delete', 'hcm env remove --force');\n // legacy `hcm config delete` 没有确认提示, 转译时透传 --force 保持行为一致\n await envRemove(name, { force: true });\n}\n\nexport async function configSet(key: string, value: string): Promise<void> {\n try {\n if (!key.startsWith('defaults.')) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n \"hcm config set only accepts defaults.*. For env fields use 'hcm env edit <field> <value>'.\",\n });\n }\n const sub = key.slice('defaults.'.length);\n const g = await loadGlobalConfig();\n g.defaults = g.defaults ?? {};\n (g.defaults as unknown as Record<string, string>)[sub] = value;\n await saveGlobalConfig(g);\n exitOk(`✅ defaults.${sub} = ${value}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function configGet(key: string): Promise<void> {\n try {\n if (!key.startsWith('defaults.')) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message:\n \"hcm config get only accepts defaults.*. For env fields use 'hcm env show'.\",\n });\n }\n const sub = key.slice('defaults.'.length);\n const g = await loadGlobalConfig();\n exitOk(String((g.defaults as unknown as Record<string, string>)?.[sub] ?? ''));\n } catch (e) {\n exitWithError(e);\n }\n}\n","import axios from 'axios';\nimport {\n loadEnv,\n saveEnv,\n listEnvs,\n deleteEnv,\n loadGlobalConfig,\n saveGlobalConfig,\n loadIdentity,\n listIdentities,\n deleteIdentity,\n TokenStore,\n CliError,\n CliErrorCode,\n toYaml,\n} from '@hcmai/sdk';\nimport { exitOk, exitWithError } from '../utils/exit';\nimport { promptConfirm } from '../utils/prompt';\nimport { formatTable } from '../utils/table';\n\nexport async function envList(): Promise<void> {\n try {\n const envs = await listEnvs();\n const g = await loadGlobalConfig();\n if (envs.length === 0) {\n exitOk('(no envs; run `hcm env add <name> --endpoint <url>`)');\n return;\n }\n const rows = await Promise.all(\n envs.map(async (name) => {\n const cfg = await loadEnv(name);\n return {\n active: name === g.activeEnv ? '*' : ' ',\n name,\n endpoint: cfg.endpoint,\n tenant: cfg.tenantId ?? '1',\n identity: cfg.defaultIdentity ?? '(none)',\n };\n }),\n );\n exitOk(formatTable(rows));\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envCurrent(): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const cfg = await loadEnv(g.activeEnv).catch(() => null);\n if (!cfg) {\n exitOk('(no active env; run `hcm env add <name> --endpoint <url>`)');\n return;\n }\n const idName = cfg.defaultIdentity ?? '(none)';\n exitOk(`→ ${g.activeEnv} ${cfg.endpoint} tenant=${cfg.tenantId ?? '1'} identity=${idName}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envAdd(\n name: string,\n args: { endpoint?: string; tenant?: string; force?: boolean },\n): Promise<void> {\n try {\n if (!args.endpoint) {\n throw new CliError({\n code: CliErrorCode.ENV_ENDPOINT_REQUIRED,\n message: 'env add requires --endpoint <url>',\n });\n }\n const existing = await loadEnv(name).catch(() => null);\n if (existing && !args.force) {\n throw new CliError({\n code: CliErrorCode.ENV_ALREADY_EXISTS,\n message: `env '${name}' already exists. Use --force to overwrite.`,\n });\n }\n await saveEnv(name, { endpoint: args.endpoint, tenantId: args.tenant ?? '1' });\n // If this is the first env (or active env points to a non-existent env), make this the active env\n const allEnvs = await listEnvs();\n const g = await loadGlobalConfig();\n const activeExists = allEnvs.includes(g.activeEnv);\n if (!activeExists) {\n g.activeEnv = name;\n await saveGlobalConfig(g);\n }\n exitOk(`✅ env '${name}' added. Run: hcm login --env ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envUse(name: string, args: { ping?: boolean }): Promise<void> {\n try {\n const cfg = await loadEnv(name);\n const g = await loadGlobalConfig();\n g.activeEnv = name;\n await saveGlobalConfig(g);\n // commander --no-ping sets args.ping = false. Default is undefined → treat as true.\n const shouldPing = args.ping !== false;\n if (shouldPing && !process.env.CI) {\n try {\n await axios.get(`${cfg.endpoint}/api/version/backend`, { timeout: 2000 });\n } catch (e) {\n const reason = String((e as Error).message).slice(0, 60).replace(/\\s+/g, '-');\n process.stderr.write(\n `[hcm] event=env_ping_failed env=${name} reason=${reason} hint=token-may-need-re-login\\n`,\n );\n }\n }\n if (cfg.defaultIdentity) {\n const id = await loadIdentity(cfg.defaultIdentity).catch(() => null);\n if (id?.expiresAt && new Date(id.expiresAt) < new Date()) {\n process.stderr.write(\n `[hcm] event=token_expired identity=${cfg.defaultIdentity} hint=\"hcm login --env ${name}\"\\n`,\n );\n }\n }\n exitOk(`✅ active env: ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envRemove(name: string, args: { force?: boolean }): Promise<void> {\n try {\n if (!args.force) {\n const ok = await promptConfirm(`remove env '${name}' and all its identities? [y/N] `);\n if (!ok) {\n exitOk('aborted');\n return;\n }\n }\n const ids = await listIdentities(name);\n const failed: string[] = [];\n for (const id of ids) {\n try {\n await TokenStore.forIdentity(id).clear();\n await deleteIdentity(id);\n } catch (err) {\n failed.push(id);\n process.stderr.write(\n `[hcm] event=identity_cleanup_failed identity=${id} reason=${JSON.stringify(String((err as Error).message))}\\n`,\n );\n }\n }\n await deleteEnv(name);\n const g = await loadGlobalConfig();\n if (g.activeEnv === name) {\n g.activeEnv = 'default';\n await saveGlobalConfig(g);\n }\n const removedCount = ids.length - failed.length;\n const noun = (n: number): string => (n === 1 ? 'identity' : 'identities');\n const failPart =\n failed.length > 0\n ? `, ${failed.length} ${noun(failed.length)} failed: ${failed.join(', ')}`\n : '';\n exitOk(`✅ env '${name}' removed (${removedCount} ${noun(removedCount)} removed${failPart})`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envShow(args: { name?: string }): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const target = args.name ?? g.activeEnv;\n const cfg = await loadEnv(target);\n const ids = await listIdentities(target);\n exitOk(\n toYaml({\n name: target,\n active: target === g.activeEnv,\n ...cfg,\n identities: ids,\n }),\n );\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function envEdit(\n field: string,\n value: string,\n args: { env?: string },\n): Promise<void> {\n try {\n const ALLOWED = new Set(['endpoint', 'tenantId', 'defaultIdentity', 'defaultAgent']);\n if (!ALLOWED.has(field)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `unknown field '${field}'. Allowed: ${[...ALLOWED].join(', ')}`,\n });\n }\n const g = await loadGlobalConfig();\n const name = args.env ?? g.activeEnv;\n const cfg = await loadEnv(name);\n // FK validation: defaultIdentity must point to an existing identity\n if (field === 'defaultIdentity') {\n await loadIdentity(value); // throws IDENTITY_NOT_FOUND if missing\n }\n (cfg as unknown as Record<string, string>)[field] = value;\n await saveEnv(name, cfg);\n exitOk(`✅ ${name}.${field} = ${value}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\n","/**\n * Render an array of homogeneous string-record rows as a fixed-width text table.\n * Uses code-unit length (no CJK width adjustment) — acceptable for current ASCII-only fields.\n */\nexport function formatTable(rows: Array<Record<string, string>>): string {\n if (rows.length === 0) return '';\n const keys = Object.keys(rows[0]!);\n const widths = keys.map((k) =>\n Math.max(k.length, ...rows.map((r) => String(r[k] ?? '').length)),\n );\n const header = keys.map((k, i) => k.padEnd(widths[i]!)).join(' ');\n const body = rows.map((r) =>\n keys.map((k, i) => String(r[k] ?? '').padEnd(widths[i]!)).join(' '),\n );\n return [header, '-'.repeat(header.length), ...body].join('\\n');\n}\n","import {\n HcmClient,\n formatRows,\n fromAxiosError,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface QueryArgs {\n filter?: string;\n sort?: string;\n fields?: string;\n keyword?: string;\n limit?: number;\n offset?: number;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function queryCommand(model: string, args: QueryArgs): Promise<void> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dsl: any = {};\n if (args.filter) dsl.filter = parseJsonOrThrow(args.filter, '--filter');\n if (args.sort) dsl.sort = parseJsonOrThrow(args.sort, '--sort');\n if (args.fields) dsl.fields = args.fields.split(',').map((s) => s.trim());\n if (args.keyword) dsl.keyword = args.keyword;\n if (args.limit) dsl.limit = Number(args.limit);\n if (args.offset) dsl.offset = Number(args.offset);\n if (!dsl.limit) dsl.limit = 20;\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.query(model, dsl);\n const fmt: OutputFormat = args.output ?? 'table';\n const out = formatRows(result.rows as Record<string, unknown>[], { format: fmt });\n process.stdout.write(out + '\\n');\n if (fmt === 'table' && result.total !== undefined) {\n process.stdout.write(`Showing ${result.rows.length} of ${result.total} results.\\n`);\n }\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nfunction parseJsonOrThrow(text: string, flag: string): unknown {\n try {\n return JSON.parse(text);\n } catch (e) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `${flag} is not valid JSON: ${(e as Error).message}`,\n });\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type ActionHttpMethod,\n type ActionScope,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface ActionArgs {\n id?: string;\n ids?: string;\n params?: string;\n method?: string;\n scope?: string;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function actionCommand(spec: string, args: ActionArgs): Promise<void> {\n try {\n const [model, action] = spec.split('.');\n if (!model || !action) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: 'expected <Model>.<Action> (e.g. Employee.regularize)',\n });\n }\n if (args.id && args.ids) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--id and --ids are mutually exclusive',\n });\n }\n const method = normalizeMethod(args.method);\n const scope = normalizeScope(args.scope);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const input: any = { method };\n if (scope) input.scope = scope;\n if (args.id) input.id = args.id;\n if (args.ids) input.ids = args.ids.split(',').map((s) => s.trim());\n if (args.params) {\n try {\n input.params = JSON.parse(args.params);\n } catch (e) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `--params: ${(e as Error).message}`,\n });\n }\n }\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.action(model, action, input);\n const fmt: OutputFormat = args.output ?? 'json';\n\n if (fmt !== 'json' && result.taskId) {\n process.stdout.write(\n `⏳ task created: ${result.taskId} (use \\`hcm task ${result.taskId}\\` to follow up — coming Phase 1)\\n`,\n );\n } else if (fmt !== 'json') {\n process.stdout.write('✅ action succeeded\\n');\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n\nfunction normalizeMethod(value?: string): ActionHttpMethod {\n const raw = (value ?? 'POST').toUpperCase();\n if (raw === 'GET' || raw === 'POST' || raw === 'PUT' || raw === 'DELETE') return raw;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--method 取值 GET | POST | PUT | DELETE,收到 \"${value}\"`,\n });\n}\n\nfunction normalizeScope(value?: string): ActionScope | undefined {\n if (value === undefined) return undefined;\n if (value === 'class' || value === 'object') return value;\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--scope 取值 class | object,收到 \"${value}\"`,\n });\n}\n","import {\n HcmClient, formatObject, fromAxiosError,\n type OutputFormat, CliError, CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface CreateArgs {\n data?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\nexport async function createCommand(model: string, args: CreateArgs): Promise<void> {\n try {\n if (!args.data) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--data <JSON> 必填' });\n }\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(args.data);\n } catch (e) {\n throw new CliError({ code: CliErrorCode.INVALID_JSON, message: `--data: ${(e as Error).message}` });\n }\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const res = await client.create(model, data);\n const fmt: OutputFormat = args.output ?? 'json';\n process.stdout.write('✅ created\\n');\n process.stdout.write(formatObject(res, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface UpdateArgs {\n id?: string;\n data?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm update <Model> --id <id> --data '{...}'` —— 更新一条记录(走后端完整校验)。\n *\n * 与 create/delete 成对:配置类交付动作里「改一条已有记录」是基本盘,\n * 之前只能退回 curl -X PUT。\n */\nexport async function updateCommand(model: string, args: UpdateArgs): Promise<void> {\n try {\n if (!args.id) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--id <id> 必填' });\n }\n if (!args.data) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--data <JSON> 必填' });\n }\n let data: Record<string, unknown>;\n try {\n data = JSON.parse(args.data);\n } catch (e) {\n throw new CliError({\n code: CliErrorCode.INVALID_JSON,\n message: `--data: ${(e as Error).message}`,\n });\n }\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await client.update(model, args.id, data);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${model}#${args.id} 已更新\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n formatRows,\n fromAxiosError,\n getSettingDomain,\n patchSettingDomain,\n resetSettingItem,\n parseSettingAssignment,\n CliError,\n CliErrorCode,\n type OutputFormat,\n type SettingWrite,\n} from '@hcmai/sdk';\nimport { promptConfirm } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface SettingArgs {\n set?: string[];\n revision?: string;\n dryRun?: boolean;\n yes?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function client(args: SettingArgs): Promise<HcmClient> {\n return HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n}\n\nfunction fail(e: unknown, args: SettingArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 404) {\n exitWithError(new Error('没有这个参数域 —— 用 `hcm setting get <域>` 看现有域,常见有 security / feature / integration'));\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm setting get <domain>` —— 读某域的全部参数(定义 + 租户覆盖值合并)。 */\nexport async function settingGetCommand(domain: string, args: SettingArgs): Promise<void> {\n try {\n const c = await client(args);\n const { items } = await getSettingDomain(c.raw(), domain);\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'table') {\n const rows = items.map((i) => ({\n namespace: i.namespace,\n key: i.settingKey,\n value: i.value ?? i.defaultValue,\n overridden: i.value !== undefined && i.value !== null ? 'yes' : '',\n revision: i.revision ?? '',\n }));\n process.stdout.write(formatRows(rows as Record<string, unknown>[], { format: 'table' }) + '\\n');\n } else {\n process.stdout.write(formatObject(items, { format: fmt }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm setting set <domain> --set ns.key=value [--set ...]` —— 改参数。\n *\n * 走受控的 PATCH 路径(按定义校验 + 乐观锁 + 写历史),不是标准 Model 的 PUT。\n * 默认对着**客户环境**写,故支持 --dry-run 先看要改什么。\n */\nexport async function settingSetCommand(domain: string, args: SettingArgs): Promise<void> {\n try {\n const raw = args.set ?? [];\n if (raw.length === 0) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '至少要一个 --set namespace.key=value,例如 --set security.password.passwordPolicy=complex',\n });\n }\n let items: SettingWrite[];\n try {\n items = raw.map(parseSettingAssignment);\n } catch (e) {\n throw new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message: (e as Error).message });\n }\n\n if (args.dryRun) {\n process.stdout.write(`[dry-run] 将在域 ${domain} 写入 ${items.length} 项,未实际写入:\\n`);\n for (const i of items) process.stdout.write(` ${i.namespace}.${i.settingKey} = ${String(i.value)}\\n`);\n process.exit(0);\n }\n\n const c = await client(args);\n const result = await patchSettingDomain(c.raw(), domain, items);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${domain} 已更新 ${items.length} 项\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm setting reset <domain> <namespace> <key>` —— 清除租户覆盖,回落到默认值。\n *\n * 是「恢复默认」而非「删除」——下次 set 就能写回,故不是不可逆操作;\n * 但它会改变客户环境的现行行为,所以仍过确认闸。\n */\nexport async function settingResetCommand(\n domain: string,\n namespace: string,\n key: string,\n args: SettingArgs,\n): Promise<void> {\n try {\n if (!args.yes) {\n const ok = await promptConfirm(`将清除 ${domain} / ${namespace}.${key} 的租户覆盖,回落到默认值。继续?`);\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n const c = await client(args);\n const revision = args.revision === undefined ? undefined : Number(args.revision);\n const result = await resetSettingItem(c.raw(), domain, namespace, key, revision);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`✅ ${namespace}.${key} 已回落到默认值\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","import {\n createHttpClient,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface VersionArgs {\n endpoint?: string;\n env?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm version` —— 查后端版本(commit / tag / 构建时间)。\n *\n * 与 `hcm skills` 一样走**免认证**端点(`/api/version/**` 在公开白名单里):\n * 「客户环境到底是哪一版」经常是在还没拿到账号的时候就要回答的第一问。\n */\nexport async function versionCommand(args: VersionArgs): Promise<void> {\n try {\n let endpoint = args.endpoint;\n if (!endpoint) {\n const g = await loadGlobalConfig();\n const env = await loadEnv(resolveActiveEnv({ envFlag: args.env }, process.env, g)).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`',\n });\n }\n endpoint = env.endpoint;\n }\n const http = createHttpClient({\n endpoint: endpoint.replace(/\\/+$/, ''),\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n const resp = await http.get('/api/version/backend');\n const info = resp.data?.data ?? resp.data;\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`${endpoint}\\n`);\n process.stdout.write(formatObject(info, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n type OutputFormat,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DeleteArgs {\n id?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\nexport async function deleteCommand(model: string, args: DeleteArgs): Promise<void> {\n try {\n if (!args.id) {\n throw new CliError({ code: CliErrorCode.MISSING_FLAG, message: '--id <id> 必填' });\n }\n\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const res = await client.remove(model, args.id);\n const fmt: OutputFormat = args.output ?? 'json';\n process.stdout.write('✅ deleted\\n');\n process.stdout.write(formatObject(res, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import { readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport {\n HcmClient, parseFixture, runImport, formatObject, fromAxiosError,\n type Fixture, type ImportClient, type ImportOptions, type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface ImportArgs {\n dryRun?: boolean;\n updateOnly?: boolean;\n onError?: string;\n report?: string;\n env?: string;\n as?: string;\n profile?: string;\n output?: OutputFormat;\n}\n\n/** 递归收集 *.yml/*.yaml,按相对路径字典序(对齐 spec §4 拓扑约定)。 */\nfunction collectYmlFiles(path: string): string[] {\n if (statSync(path).isFile()) return [path];\n const out: string[] = [];\n const walk = (dir: string): void => {\n for (const name of readdirSync(dir).sort()) {\n const full = join(dir, name);\n if (statSync(full).isDirectory()) walk(full);\n else if (full.endsWith('.yml') || full.endsWith('.yaml')) out.push(full);\n }\n };\n walk(path);\n return out.sort();\n}\n\n// dry-run 不触达后端,用一个永不被调用的 stub(runner 的 dryRun 分支不调 client),免去 auth 依赖\nconst DRY_RUN_CLIENT: ImportClient = {\n findIdByKey: async () => null,\n create: async () => ({ id: '' }),\n update: async () => ({}),\n};\n\nexport async function importCommand(path: string, args: ImportArgs): Promise<void> {\n try {\n const files = collectYmlFiles(path);\n const fixtures: Fixture[] = files.map((f) =>\n parseFixture(readFileSync(f, 'utf8'), relative(process.cwd(), f)),\n );\n\n const opts: ImportOptions = {\n dryRun: !!args.dryRun,\n updateOnly: !!args.updateOnly,\n onError: args.onError === 'stop' ? 'stop' : 'continue',\n };\n\n const client: ImportClient = opts.dryRun\n ? DRY_RUN_CLIENT\n : HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const result = await runImport(client, fixtures, opts);\n\n if (args.report) writeFileSync(args.report, JSON.stringify(result, null, 2));\n\n const fmt: OutputFormat = args.output ?? 'json';\n const tag = opts.dryRun ? '🔍 dry-run' : '📦 import';\n process.stdout.write(\n `${tag}: created=${result.created} updated=${result.updated} skipped=${result.skipped} failed=${result.failed}\\n`,\n );\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(result.failed > 0 ? 3 : 0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.profile));\n exitWithError(e);\n }\n}\n","import { HcmClient, formatObject, fromAxiosError, type OutputFormat } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface DescribeArgs {\n verbose?: boolean;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nexport async function describeCommand(model: string, args: DescribeArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const desc = await client.describe(model, { verbose: !!args.verbose });\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt !== 'table') {\n process.stdout.write(formatObject(desc, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n // table 默认 summary\n const lines: string[] = [`=== ${desc.model} ===`];\n if (desc.labels.zh_CN) lines.push(`zh_CN: ${desc.labels.zh_CN}`);\n if (desc.labels.en) lines.push(`en: ${desc.labels.en}`);\n lines.push(`fields (${desc.fields.length}):`);\n for (const f of desc.fields) {\n const req = f.required ? ' required' : ' ';\n const lbl = args.verbose ? ` ${f.label ?? ''} ${f.description ?? ''}` : ` ${f.label ?? ''}`;\n lines.push(` ${f.name.padEnd(20)} ${f.type.padEnd(10)} ${req}${lbl}`);\n }\n lines.push(`actions (${desc.actions.length}):`);\n for (const a of desc.actions) {\n lines.push(` ${a.name.padEnd(20)} ${a.label ?? ''}`);\n }\n if (desc.relations.length) {\n lines.push(\n `relations: ${desc.relations.map((r) => `${r.key}(via ${r.via})`).join(', ')}`,\n );\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n","import type { AttachmentMeta } from '@hcmai/sdk';\nimport {\n HcmClient,\n WsClient,\n oneShot,\n sendMessageAndStream,\n createConversation,\n DEFAULT_AGENT_ID,\n saveConversationState,\n formatObject,\n formatRows,\n fetchConversationTimeline,\n fetchConversationTimelineStrict,\n fetchRecentConversations,\n findLastAssistantSeq,\n CliError,\n CliErrorCode,\n parseInteractionRequest,\n parseInteractionResolved,\n buildConfirm,\n buildReject,\n buildAnswer,\n buildInterrupt,\n buildSteer,\n} from '@hcmai/sdk';\nimport chalk from 'chalk';\nimport * as fs from 'node:fs/promises';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport type ChatOutputFormat = 'text' | 'json';\n\nexport interface ChatArgs {\n agent?: string;\n resume?: string;\n conversation?: string;\n list?: boolean;\n events?: boolean | string;\n limit?: string;\n stream?: boolean;\n noStream?: boolean;\n showToolCalls?: boolean;\n promptFile?: string;\n timeout?: number;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n output?: ChatOutputFormat;\n // ADR-085: streaming display flags. commander `--no-xxx` 在解析时把 args.xxx 设 false.\n markdown?: boolean;\n thinking?: boolean;\n verboseThinking?: boolean;\n verboseTools?: boolean;\n spinner?: boolean;\n color?: boolean;\n raw?: boolean;\n autoApprove?: boolean;\n onConfirm?: string;\n onAsk?: string;\n /** P0 测试接口:流中途注入命令,格式 <eventType>:<action>[:<arg>](仅 --raw 分支生效)。 */\n injectOn?: string;\n /** 重新生成(ADR-089):发 response.regenerate 重跑指定 assistant 段,不发新 prompt;必须配 --resume/--conversation。 */\n regenerateFrom?: string;\n /** issue #64:附件路径(可重复),上传后随消息发送。 */\n attach?: string[];\n}\n\n/** parseInjectOn 结果:收到首个 eventType 事件后触发一次注入。 */\nexport interface InjectSpec {\n eventType: string;\n action: 'interrupt' | 'steer';\n /** steer 的 content(必填);interrupt 无此字段。 */\n arg?: string;\n}\n\n/**\n * 解析 --inject-on 取值;格式 `<eventType>:<action>[:<arg>]`。\n * - action ∈ {interrupt, steer}\n * - steer 必须带 arg(content);arg 内可含冒号(只 split 前两段,剩余整体为 arg)\n * - 非法值抛 CliError INVALID_ARGUMENT(fail-fast 在发请求前)\n */\nexport function parseInjectOn(s: string): InjectSpec {\n const fail = (detail: string): never => {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--inject-on 格式 <eventType>:<action>[:<arg>],action ∈ {interrupt, steer}(steer 必须带 content);${detail},收到 \"${s}\"`,\n });\n };\n // 只 split 前两段,剩余整体(含冒号)作为 arg,支持 steer content 内含冒号。\n const firstColon = s.indexOf(':');\n if (firstColon < 0) return fail('缺少 action 段');\n const eventType = s.slice(0, firstColon);\n const rest = s.slice(firstColon + 1);\n const secondColon = rest.indexOf(':');\n const action = secondColon < 0 ? rest : rest.slice(0, secondColon);\n const arg = secondColon < 0 ? undefined : rest.slice(secondColon + 1);\n\n if (!eventType) return fail('eventType 段为空');\n if (action === 'interrupt') {\n if (arg !== undefined) return fail('interrupt 不接受 arg');\n return { eventType, action: 'interrupt' };\n }\n if (action === 'steer') {\n if (arg === undefined || arg === '') return fail('steer 必须带 content(arg)');\n return { eventType, action: 'steer', arg };\n }\n return fail(`未知 action \"${action}\"`);\n}\n\n/** 解析 --on-confirm 取值;非法值在发请求前 fail-fast。 */\nexport function parseOnConfirm(s: string): { decision: 'approve' } | { decision: 'reject'; reason?: string } {\n if (s === 'approve') return { decision: 'approve' };\n if (s === 'reject') return { decision: 'reject' };\n if (s.startsWith('reject:')) return { decision: 'reject', reason: s.slice('reject:'.length) };\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--on-confirm 取值 approve | reject | reject:<reason>,收到 \"${s}\"`,\n });\n}\n\nexport function resolveResumeConversation(args: Pick<ChatArgs, 'resume' | 'conversation'>): string | undefined {\n if (args.resume && args.conversation) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--resume 和 --conversation 不能同时使用;新命令请用 --resume <conversationId>',\n });\n }\n if (args.resume === 'NEW') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--resume 需要既存 conversationId;新会话请直接省略 --resume',\n });\n }\n const id = args.resume ?? args.conversation;\n if (!id || id === 'NEW') return undefined;\n return id;\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, flag: string): number {\n const n = Number(value ?? fallback);\n if (!Number.isInteger(n) || n <= 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `${flag} 需要正整数,收到 \"${value}\"`,\n });\n }\n return n;\n}\n\nfunction formatShortDate(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '') return '-';\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return value.replace('T', ' ').slice(0, 16);\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nfunction oneLine(value: unknown, max = 36): string {\n const text = String(value ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return '-';\n return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;\n}\n\nexport function resolveEventsConversation(\n args: Pick<ChatArgs, 'events' | 'resume' | 'conversation'>,\n): string | undefined {\n if (!args.events) return undefined;\n const resumeConversationId = resolveResumeConversation(args);\n const eventConversationId = typeof args.events === 'string' ? args.events.trim() : undefined;\n if (eventConversationId === 'NEW') {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events 需要既存 conversationId;新会话没有可查询的事件流',\n });\n }\n if (eventConversationId && resumeConversationId && eventConversationId !== resumeConversationId) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events <conversationId> 与 --resume/--conversation 指向不同会话;请只保留一个 id',\n });\n }\n const id = eventConversationId || resumeConversationId;\n if (!id) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '查询事件流请传 `hcm chat --events <conversationId>`,或 `hcm chat --resume <conversationId> --events`',\n });\n }\n return id;\n}\n\nfunction eventAgent(value: Record<string, unknown>): string {\n return oneLine(value.agentPath ?? value.agent ?? value.delegationAgent, 24);\n}\n\nfunction eventScope(value: Record<string, unknown>): string {\n if (value.subLoop === true) return 'sub';\n if (value.subLoop === false) return 'root';\n return '-';\n}\n\nfunction eventStatus(value: Record<string, unknown>): string {\n if (typeof value.status === 'string' && value.status.trim()) return oneLine(value.status, 18);\n if (value.live === true) return 'live';\n const tools = value.tools;\n if (Array.isArray(tools) && tools.length) {\n if (tools.some((tool) => String((tool as Record<string, unknown>).state ?? '').toLowerCase() === 'failed')) {\n return 'failed';\n }\n if (tools.some((tool) => String((tool as Record<string, unknown>).state ?? '').toLowerCase() === 'running')) {\n return 'running';\n }\n return 'done';\n }\n return '-';\n}\n\nfunction stableJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value ?? '');\n }\n}\n\nfunction eventPreview(value: Record<string, unknown>): string {\n for (const key of ['text', 'content', 'summary', 'question', 'detail', 'message']) {\n if (typeof value[key] === 'string' && value[key].trim()) return oneLine(value[key], 86);\n }\n const tools = value.tools;\n if (Array.isArray(tools) && tools.length) {\n return oneLine(\n tools.map((tool) => {\n const t = tool as Record<string, unknown>;\n return `${String(t.toolName ?? t.name ?? '-')}:${String(t.state ?? t.status ?? '-')}`;\n }).join(' · '),\n 86,\n );\n }\n const activityLog = value.activityLog;\n if (Array.isArray(activityLog) && activityLog.length) {\n return oneLine(\n activityLog.map((item) => {\n const a = item as Record<string, unknown>;\n return String(a.detail ?? a.label ?? a.kind ?? '');\n }).filter(Boolean).join(' · '),\n 86,\n );\n }\n const part = value.part;\n if (part && typeof part === 'object') return oneLine(stableJson(part), 86);\n return oneLine(stableJson(value), 86);\n}\n\nasync function printConversationEvents(conversationId: string, args: ChatArgs): Promise<void> {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const items = await fetchConversationTimelineStrict(client.raw(), conversationId);\n const fmt: ChatOutputFormat = args.output ?? 'text';\n\n if (args.raw) {\n for (const item of items) {\n process.stdout.write(JSON.stringify({ conversationId, ...item }) + '\\n');\n }\n return;\n }\n\n if (fmt === 'json') {\n process.stdout.write(formatObject({ conversationId, count: items.length, events: items }, { format: 'json' }) + '\\n');\n return;\n }\n\n process.stdout.write(`conversation events: ${conversationId}\\n`);\n if (!items.length) {\n process.stdout.write('No timeline events.\\n');\n return;\n }\n\n const rows = items.map((item) => {\n const value = item as unknown as Record<string, unknown>;\n return {\n SEQ: value.seq ?? '-',\n KIND: oneLine(value.kind, 18),\n AGENT: eventAgent(value),\n SCOPE: eventScope(value),\n STATUS: eventStatus(value),\n EVENT: eventPreview(value),\n };\n });\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${items.length} event${items.length === 1 ? '' : 's'}.\\n`);\n process.stdout.write(`raw: hcm chat --events ${conversationId} --raw\\n`);\n}\n\nasync function printConversationList(args: ChatArgs): Promise<void> {\n if (args.events || args.resume || args.conversation || args.regenerateFrom || args.promptFile) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--list 只用于列会话;不要同时传 --events/--resume/--conversation/--regenerate-from/--prompt-file',\n });\n }\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const limit = parsePositiveInt(args.limit, 10, '--limit');\n const result = await fetchRecentConversations(client.raw(), limit);\n const fmt: ChatOutputFormat = args.output ?? 'text';\n if (fmt === 'json') {\n process.stdout.write(formatObject(result, { format: 'json' }) + '\\n');\n return;\n }\n const rows = result.rows.map((row) => ({\n UPDATED: formatShortDate(row.lastActiveAt ?? row.updateTime ?? row.createTime),\n MSGS: row.messageCount ?? 0,\n TOKENS: row.totalTokens ?? 0,\n TITLE: oneLine(row.title ?? row.lastMessagePreview ?? row.summary, 34),\n CONVERSATION: row.id ?? '-',\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (result.total !== undefined) {\n process.stdout.write(`Showing ${result.rows.length} of ${result.total} conversations.\\n`);\n }\n}\n\nexport async function chatCommand(prompt: string | undefined, args: ChatArgs): Promise<void> {\n try {\n if (args.list) {\n if (prompt) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--list 不接受 prompt;用 `hcm chat --list` 查看最近会话',\n });\n }\n await printConversationList(args);\n process.exit(0);\n }\n\n const eventsConversationId = resolveEventsConversation(args);\n if (eventsConversationId) {\n if (prompt || args.promptFile || args.regenerateFrom || args.attach?.length) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--events 是只读查询;不要同时传 prompt/--prompt-file/--regenerate-from/--attach',\n });\n }\n await printConversationEvents(eventsConversationId, args);\n process.exit(0);\n }\n\n // --regenerate-from:不发新 prompt(重跑用原 user message),不进 REPL;\n // fail-fast:seq 必须正整数,且必须指定既存 conversation(缺省会开新会话,无段可重跑)。\n let regenerateFromSeq: number | undefined;\n let regenerateFromLastAssistant = false;\n const regenerateMode = args.regenerateFrom !== undefined;\n const requestedConversationId = resolveResumeConversation(args);\n if (args.regenerateFrom !== undefined) {\n if (args.regenerateFrom === 'last-assistant') {\n regenerateFromLastAssistant = true;\n } else {\n regenerateFromSeq = Number(args.regenerateFrom);\n if (!Number.isInteger(regenerateFromSeq) || regenerateFromSeq <= 0) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `--regenerate-from 需要正整数 journal seq 或 last-assistant,收到 \"${args.regenerateFrom}\"`,\n });\n }\n }\n if (!requestedConversationId) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--regenerate-from 必须配合 --resume <既存会话 id>(重跑既存段,无新 prompt)',\n });\n }\n prompt = prompt ?? '';\n }\n if (!prompt && !args.promptFile && !regenerateMode) {\n // ADR-129:REPL = Ink App(手搓 readline 版已退役,delete-on-supersede)。\n const { runInkRepl } = await import('../repl/run');\n return runInkRepl(args);\n }\n if (args.promptFile) {\n prompt = await fs.readFile(args.promptFile, 'utf-8');\n }\n if (prompt === undefined || (!prompt && !regenerateMode)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: 'prompt is required (positional or --prompt-file)',\n });\n }\n\n // --on-confirm 在发任何请求前校验(非法值 fail-fast),渲染 / raw 两分支复用解析结果。\n const onConfirm = args.onConfirm ? parseOnConfirm(args.onConfirm) : undefined;\n // --inject-on 同样在发请求前 fail-fast(仅 --raw 分支会消费;渲染分支忽略不崩)。\n const injectOn = args.injectOn ? parseInjectOn(args.injectOn) : undefined;\n\n const ctx = await getActiveAuthContextFromCli(args);\n const wsUrl = ctx.endpoint.replace(/^http/, 'ws') + '/ws/conversation';\n const client = HcmClient.fromAuthContext(ctx);\n // Conversation state key — keyed on env name (T15: was `profile`).\n const stateKey = ctx.env;\n\n // Resolve agentId: --agent <UUID> wins, else default analyst.\n const agentId = args.agent ?? DEFAULT_AGENT_ID;\n\n // Resolve conversationId: explicit --resume / legacy --conversation > create new.\n let resumeConversationId = requestedConversationId;\n // 刀⑤ 续聊回放:仅显式续接已有会话时回显上下文摘要;默认 chat 一律开新会话。\n const resumedExisting = !!resumeConversationId;\n if (!resumeConversationId) {\n const conv = await createConversation(client.raw(), agentId);\n resumeConversationId = conv.id;\n }\n if (regenerateFromLastAssistant) {\n const items = await fetchConversationTimeline(client.raw(), resumeConversationId);\n const lastSeq = findLastAssistantSeq(items);\n if (lastSeq == null) {\n throw new CliError({\n code: CliErrorCode.BUSINESS_RULE_VIOLATION,\n message: `--regenerate-from last-assistant 找不到可重跑的 chat-text seq: conversation=${resumeConversationId}`,\n });\n }\n regenerateFromSeq = lastSeq;\n }\n\n const ws = new WsClient({\n endpoint: wsUrl,\n getAccessToken: () => client.getAccessToken(),\n onTokenExpiring: () => client.handleRefresh(),\n });\n await ws.connect();\n\n const fmt: ChatOutputFormat = args.output ?? 'text';\n\n // `--output json` is the script-friendly final result object. Raw protocol\n // JSONL remains available through `--raw`.\n const streamOutput = !!args.stream && (fmt !== 'json' || !!args.raw);\n if (streamOutput) {\n const { StreamPresenter } = await import('../streaming/StreamPresenter');\n const { TerminalRenderer } = await import('../streaming/TerminalRenderer');\n\n const isTty = !!process.stdout.isTTY;\n // commander `--no-xxx` 把 args.xxx 设 false, 未传时 undefined.\n // 默认: tty 自动开 (markdown/spinner/color); thinking 默认开; showToolCalls 由独立 flag 控.\n // commander `--no-xxx` 设 args.xxx=false, --xxx 设 true, 未传 undefined.\n // 默认: tty 自动开 markdown/spinner/color; thinking 默认开 (折叠); tool calls 默认显示 name.\n // verbose 由 args.verboseThinking / args.verboseTools 控制 (传了 → 展开内容).\n const renderer = new TerminalRenderer({\n markdown: args.markdown === false ? false : isTty,\n showThinking: args.thinking === false ? false : true,\n verboseThinking: !!args.verboseThinking,\n showToolCalls: args.showToolCalls !== false,\n verboseTools: !!args.verboseTools,\n spinner: args.spinner === false ? false : isTty,\n color: args.color === false ? false : isTty,\n apiBase: client.endpoint,\n });\n const presenter = new StreamPresenter(renderer, {\n showToolCalls: args.showToolCalls !== false,\n output: fmt,\n });\n\n // 刀⑤ 续聊回放(对标 Claude Code resume):续接已有会话时回显「↻ 续接 + 最近\n // 轮摘要」。仅 TTY + text 渲染分支——管道/CI/--raw 输出保持纯净;拉取失败静默跳过。\n if (resumedExisting && isTty && fmt === 'text' && !args.raw) {\n const { fetchConversationTimeline, buildResumeSummary } = await import('@hcmai/sdk');\n const items = await fetchConversationTimeline(client.raw(), resumeConversationId);\n const summary = items ? buildResumeSummary(resumeConversationId, items) : null;\n if (summary) renderer.showResumeContext(summary);\n }\n\n // issue #64:--attach 上传本地文件,元数据随 message.create 发送。\n let chatAttachments: AttachmentMeta[] | undefined;\n if (args.attach?.length) {\n const { uploadDocument } = await import('@hcmai/sdk');\n chatAttachments = [];\n for (const fp of args.attach) {\n const meta = await uploadDocument(client.raw(), fp);\n chatAttachments.push(meta);\n if (fmt === 'text' && !args.raw) process.stderr.write(`📎 已上传 ${meta.fileName} (${meta.documentId})\\n`);\n }\n }\n // 行内裸绝对路径(无 @ 前缀)也自动上传,与 REPL 同手势——防裸路径漏进 prompt 文本被\n // 当散文传给 LLM → 幻觉成别的路径。剥离路径、文本为空时给占位。\n if (prompt) {\n const { extractInlineFilePaths } = await import('../utils/attachment-args');\n const inline = extractInlineFilePaths(prompt);\n if (inline.paths.length) {\n const { uploadDocument } = await import('@hcmai/sdk');\n chatAttachments = chatAttachments ?? [];\n for (const fp of inline.paths) {\n const meta = await uploadDocument(client.raw(), fp);\n chatAttachments.push(meta);\n if (fmt === 'text' && !args.raw) process.stderr.write(`📎 已上传 ${meta.fileName} (${meta.documentId})\\n`);\n }\n prompt = inline.cleaned || '请处理这些附件';\n }\n }\n const handle = await sendMessageAndStream(ws, prompt, {\n agentId,\n conversationId: resumeConversationId,\n attachments: chatAttachments,\n // 决策回发后继续消费 resume 流到真终态(B3):--raw 与渲染分支同享。\n // 凡可能回发决策的路径都要 hold(否则 HALT 的 ROOT message.stop 被当终态,\n // resume 段内容 + control.interaction.resolved 反馈丢失)。\n // - --raw:仅 --on-confirm/--on-ask 会回发决策(--inject-on 走 interrupt/steer 不 HALT);\n // - 渲染分支:交互式 TTY / --auto-approve / 覆盖项均可能回发 → 一律 hold(G4 终局反馈依赖 resume 段可达)。\n holdUntilInteractionTerminal: args.raw\n ? !!onConfirm || args.onAsk !== undefined\n : true,\n regenerateFromSeq,\n });\n\n // --raw 示波器:逐行打印原始 v4/control envelope(L1 ground truth),不渲染。\n if (args.raw) {\n handle.onControl((ev) => process.stdout.write(JSON.stringify(ev) + '\\n'));\n // --on-confirm / --on-ask:raw 模式也程序化回发决策(P0 runner 依赖),打印与注入互不干扰。\n if (onConfirm || args.onAsk !== undefined) {\n const { resolveInteraction } = await import('../streaming/control-prompt');\n handle.onControl((ev) => {\n if (ev.type !== 'control.interaction.request') return;\n void (async () => {\n const req = parseInteractionRequest(ev.payload);\n const d = await resolveInteraction(req, {\n isTty: false,\n autoApprove: false,\n onConfirm,\n onAsk: args.onAsk,\n readLine: async () => {\n throw new Error('unreachable: override decisions never read stdin');\n },\n });\n if (d.decision === 'confirm') {\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (d.decision === 'reject') {\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, d.reason));\n } else if (d.decision === 'answer') {\n handle.sendCommand(buildAnswer(req.interactionId, handle.conversationId, d.answer, d.choiceIndex));\n }\n })();\n });\n }\n // --inject-on:流中途注入命令(P0 S-interrupt / S-steer 前置)。收到首个匹配\n // eventType 且非 control 通道的展示流事件后,发对应命令并打印 _cli marker(只触发一次)。\n let injected = false;\n for await (const ev of handle.events) {\n process.stdout.write(JSON.stringify(ev) + '\\n');\n if (\n injectOn &&\n !injected &&\n ev.type === injectOn.eventType &&\n (ev as { channel?: string }).channel !== 'control'\n ) {\n injected = true;\n if (injectOn.action === 'interrupt') {\n handle.sendCommand(buildInterrupt(handle.conversationId));\n } else {\n // parseInjectOn 已保证 steer 必有 arg(content)。\n handle.sendCommand(buildSteer(injectOn.arg as string, handle.conversationId));\n }\n // marker:channel=\"_cli\" 让 P0 断言层可过滤;payload 采用统一 envelope 形态。\n // 顶层 action/at 暂留兼容旧 P0 断言。\n const at = Date.now();\n process.stdout.write(\n JSON.stringify({\n channel: '_cli',\n type: '_cli.inject.sent',\n action: injectOn.action,\n at,\n conversationId: handle.conversationId,\n payload: {\n eventType: injectOn.eventType,\n action: injectOn.action,\n content: injectOn.action === 'steer' ? injectOn.arg : undefined,\n at,\n },\n }) + '\\n',\n );\n }\n }\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: handle.conversationId,\n updatedAt: new Date().toISOString(),\n });\n // 显式 drain stdout 防 process.exit 截断末行(pipe/CI 模式,与渲染分支同款)。\n await new Promise<void>((resolve) => {\n if (process.stdout.writableNeedDrain) {\n process.stdout.once('drain', resolve);\n } else {\n resolve();\n }\n });\n process.exit(0);\n }\n\n // 控制通道:confirm/ask 内联 stdin 交互;决策回发 approval.* / interaction.answer。\n const { resolveInteraction } = await import('../streaming/control-prompt');\n const { readLineFromStdin } = await import('../io/readline');\n handle.onControl((ev) => {\n // G4:决策受理 / 终局反馈(ADR-125)——用户 approve/reject/answer 后不再视觉空白。\n if (ev.type === 'control.interaction.resolved') {\n const r = parseInteractionResolved(ev.payload);\n if (r.phase === 'RESUMED') renderer.interactionResumed();\n else if (r.phase === 'TERMINAL') renderer.interactionTerminal((ev.payload.status as string) || undefined);\n return;\n }\n if (ev.type !== 'control.interaction.request') return;\n void (async () => {\n const req = parseInteractionRequest(ev.payload);\n if (req.kind === 'CONFIRM') renderer.confirmCard(req);\n else renderer.askCard(req);\n const decision = await resolveInteraction(req, {\n isTty: !!process.stdin.isTTY,\n autoApprove: !!args.autoApprove,\n onConfirm,\n onAsk: args.onAsk,\n readLine: readLineFromStdin,\n });\n if (decision.decision === 'confirm') {\n if (args.autoApprove) renderer.autoApproved(req.toolName, req.summary);\n handle.sendCommand(buildConfirm(req.interactionId, handle.conversationId));\n } else if (decision.decision === 'reject') {\n handle.sendCommand(buildReject(req.interactionId, handle.conversationId, decision.reason));\n } else if (decision.decision === 'answer') {\n handle.sendCommand(\n buildAnswer(req.interactionId, handle.conversationId, decision.answer, decision.choiceIndex),\n );\n } else {\n // 关键发现#1 RCA + 真流实测证实:ASK 在非交互(非 TTY)且无 --on-ask 兜底时\n // decision='error'。旧逻辑只 showInterrupted 打印、不回发命令 → 引擎挂起等应答、\n // consume 因 holdUntilInteractionTerminal 永等 interaction terminal → 双向死等挂死。\n // 实测发现仅发 response.interrupt(handle.cancel)不足以救场——后端在 ASK HALT\n // 状态对 interrupt 不回终态事件;且 ws.close() 主动关不广播 disconnect、不解\n // iterator hold。唯一可靠兜底:best-effort 通知后端中止 + CLI 主动退出进程\n // (130=中断语义),杜绝挂死,让自动化/CI 调用能以非零码感知「ASK 未应答」。\n renderer.showInterrupted(decision.reason);\n handle.cancel('ASK_UNANSWERABLE');\n await ws.close().catch(() => undefined);\n process.exit(130);\n }\n })();\n });\n\n // Ctrl+C abort handler — handle.cancel 发 response.interrupt(buildInterrupt);后端回 message.stop(interrupted) 后 iterator 终态.\n const sigintHandler = (): void => {\n process.stderr.write(chalk.yellow('\\n^C 中断中...\\n'));\n handle.cancel('USER_CANCEL');\n };\n process.once('SIGINT', sigintHandler);\n\n const t0 = Date.now();\n try {\n const result = await presenter.consume(handle.events);\n // G6:终态行带 in/out token 分解 + 工具/委派计数(流中统计)。\n const stats = presenter.completionStats;\n renderer.showCompleted(Date.now() - t0, result.traceId, handle.conversationId, presenter.tokenCount || undefined, {\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n toolCount: stats.toolCount,\n delegationCount: stats.delegationCount,\n });\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: handle.conversationId,\n lastStreamId: result.streamId,\n lastTraceId: result.traceId ?? undefined,\n lastAgentKey: args.agent,\n updatedAt: new Date().toISOString(),\n });\n process.removeListener('SIGINT', sigintHandler);\n // 显式 drain stdout 防 process.exit 提前关掉 pipe (CI / pipe 模式下 0-byte bug)\n await new Promise<void>((resolve) => {\n if (process.stdout.writableNeedDrain) {\n process.stdout.once('drain', resolve);\n } else {\n resolve();\n }\n });\n process.exit(result.status === 'interrupted' ? 130 : 0);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n process.removeListener('SIGINT', sigintHandler);\n await ws.close();\n throw new CliError({\n code: e.code ?? CliErrorCode.BUSINESS_RULE_VIOLATION,\n message: e.message,\n traceId: e.traceId ?? undefined,\n });\n }\n }\n\n // 非流式\n const r = await oneShot(ws, prompt, {\n agentId,\n conversationId: resumeConversationId,\n collectEvents: fmt === 'json',\n });\n await ws.close();\n await saveConversationState(stateKey, {\n lastConversationId: r.conversationId,\n lastStreamId: r.streamId,\n lastTraceId: r.traceId ?? undefined,\n lastAgentKey: args.agent,\n updatedAt: new Date().toISOString(),\n });\n\n if (fmt === 'json') {\n process.stdout.write(\n formatObject(\n {\n conversationId: r.conversationId,\n streamId: r.streamId,\n traceId: r.traceId,\n messages: [{ role: 'assistant', content: r.content, toolCalls: r.toolCalls }],\n elapsedMs: r.elapsedMs,\n stopReason: r.stopReason,\n tokens: r.tokens,\n events: r.events,\n },\n { format: 'json' },\n ) + '\\n',\n );\n } else {\n if (args.showToolCalls) {\n for (const tc of r.toolCalls) {\n const mark = tc.success ? '✓' : '✗';\n const label = tc.argsPreview ? ` ${tc.argsPreview}` : '';\n process.stdout.write(\n chalk.gray(`[tool] ${tc.name}${label} ${mark} ${tc.elapsedMs}ms\\n`),\n );\n }\n }\n process.stdout.write(r.content + '\\n');\n process.stdout.write(\n chalk.dim(\n `\\n✓ done (${r.elapsedMs}ms · traceId ${r.traceId} · conversation ${r.conversationId})\\n`,\n ),\n );\n }\n process.exit(0);\n } catch (e) {\n exitWithError(e);\n }\n}\n","import { downloadDocument } from '@hcmai/sdk';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport { HcmClient } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface DownloadArgs {\n output?: string;\n env?: string;\n as?: string;\n}\n\n/**\n * `hcm download <documentId>`(issue #64):认证下载 HCM 文档到本地。\n * 会话附件 / 报表产物的 documentId 均可(timeline 回放与 ⬇ 行打印的 id 直接复用)。\n */\nexport async function downloadCommand(documentId: string, args: DownloadArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const saved = await downloadDocument(client.raw(), { documentId }, args.output);\n process.stdout.write(saved + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const status = (e as any)?.response?.status;\n if (status === 401 || status === 403) {\n exitWithError(new Error(`下载未授权(${status})——请 hcm login 后重试`));\n } else if (status === 404) {\n exitWithError(new Error('文档不存在或已清理(404)——核对 documentId'));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { HcmClient, formatObject, formatRows, fromAxiosError, type OutputFormat } from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface TraceArgs {\n span?: string;\n limit?: string;\n events?: boolean;\n raw?: boolean;\n output?: OutputFormat;\n /** 会话 UUID:查 PG llm_call_trace 逐调用详情(ADR-134 D2) */\n conv?: string;\n /** 与 `hcm trace <convId> --llm-calls` 等价:把位置参当 convId 查 LLM 逐调用 */\n llmCalls?: boolean;\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n}\n\n/** ADR-134 D2 · /api/moirai/conversations/{convId}/llm-trace 单行(后端干净投影)。 */\ninterface LlmTraceRow {\n roundNumber?: number | null;\n agentPath?: string | null;\n modelName?: string | null;\n finishReason?: string | null;\n promptTokens?: number | null;\n completionTokens?: number | null;\n totalTokens?: number | null;\n latencyMs?: number | null;\n responseToolCalls?: unknown;\n calledAt?: number | null;\n code?: string | null;\n}\n\ninterface TempoSpan {\n service?: string;\n operation?: string;\n durationMs?: number;\n status?: string;\n errorMessage?: string | null;\n [k: string]: unknown;\n}\n\ninterface LokiLog {\n time?: string;\n level?: string;\n service?: string;\n msg?: string;\n exception?: string;\n [k: string]: unknown;\n}\n\ninterface LlmContent {\n agentKey?: string;\n callType?: string;\n model?: string;\n roundNumber?: number;\n systemPromptHash?: string;\n systemPromptLen?: number;\n [k: string]: unknown;\n}\n\ninterface SourceResult {\n found?: boolean;\n reason?: string;\n spans?: TempoSpan[];\n logs?: LokiLog[];\n llmContent?: LlmContent[];\n [k: string]: unknown;\n}\n\ninterface TraceAggregate {\n traceId?: string;\n sources?: { ssoAudit?: SourceResult; loki?: SourceResult; tempo?: SourceResult };\n}\n\ninterface TraceSummary {\n traceId?: string;\n rootService?: string;\n rootOperation?: string;\n startTimeMs?: number;\n durationMs?: number;\n}\n\ninterface RecentResult {\n found?: boolean;\n reason?: string;\n traces?: TraceSummary[];\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number, flag: string): number {\n const n = Number(value ?? fallback);\n if (!Number.isInteger(n) || n <= 0) {\n throw new Error(`${flag} 需要正整数,收到 \"${value}\"`);\n }\n return n;\n}\n\nfunction fmtDuration(ms: number | undefined): string {\n const n = Number(ms ?? 0);\n if (!Number.isFinite(n) || n <= 0) return '-';\n if (n < 1000) return `${Math.round(n)}ms`;\n return `${(n / 1000).toFixed(1)}s`;\n}\n\nfunction toLocalTime(ms: number | undefined): string {\n if (!ms) return '-';\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '-';\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\nfunction short(value: unknown, max: number = 72): string {\n const text = String(value ?? '').replace(/\\s+/g, ' ').trim();\n if (!text) return '-';\n return text.length > max ? text.slice(0, Math.max(0, max - 1)) + '…' : text;\n}\n\nfunction sourceMark(src: SourceResult | undefined): string {\n if (src?.found) return 'yes';\n return src?.reason ? `no: ${short(src.reason, 40)}` : 'no';\n}\n\nfunction deriveStatus(spans: TempoSpan[]): string {\n if (spans.some((sp) => String(sp.status ?? '').toUpperCase() === 'ERROR')) return 'ERROR';\n if (spans.length > 0) return 'OK';\n return 'UNKNOWN';\n}\n\nfunction traceDuration(spans: TempoSpan[]): string {\n const root = spans.find((sp) => Number(sp.durationMs ?? 0) > 0) ?? spans[0];\n return fmtDuration(root?.durationMs);\n}\n\nfunction printRecent(data: RecentResult, limit: number): void {\n const traces = data.traces ?? [];\n if (!traces.length) {\n process.stdout.write(`No recent traces${data.reason ? `: ${data.reason}` : ''}.\\n`);\n return;\n }\n\n const rows = traces.slice(0, limit).map((t) => ({\n TIME: toLocalTime(t.startTimeMs),\n DURATION: fmtDuration(t.durationMs),\n SERVICE: short(t.rootService, 18),\n OPERATION: short(t.rootOperation, 36),\n TRACE: t.traceId ?? '-',\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${rows.length} trace${rows.length === 1 ? '' : 's'}.\\n`);\n process.stdout.write('next: hcm trace <traceId> | hcm trace <traceId> --events | hcm trace <traceId> --raw\\n');\n}\n\nfunction printTraceDetail(traceId: string, agg: TraceAggregate): void {\n const tempo = agg.sources?.tempo;\n const loki = agg.sources?.loki;\n const sso = agg.sources?.ssoAudit;\n const spans = tempo?.spans ?? [];\n const logs = loki?.logs ?? [];\n const llm = loki?.llmContent ?? [];\n\n process.stdout.write(`trace: ${traceId}\\n`);\n process.stdout.write(`status: ${deriveStatus(spans)}\\n`);\n process.stdout.write(`duration: ${traceDuration(spans)}\\n`);\n process.stdout.write(`sources: tempo=${sourceMark(tempo)} · loki=${sourceMark(loki)} · ssoAudit=${sourceMark(sso)}\\n`);\n process.stdout.write(`spans: ${spans.length} · logs: ${logs.length} · llmContent: ${llm.length}\\n`);\n\n if (spans.length) {\n const rows = spans.slice(0, 12).map((sp, i) => ({\n '#': i + 1,\n STATUS: sp.status ?? '-',\n DURATION: fmtDuration(sp.durationMs),\n SERVICE: short(sp.service, 20),\n OPERATION: short(sp.operation, 48),\n }));\n process.stdout.write('\\nTempo spans:\\n');\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (spans.length > rows.length) process.stdout.write(`... ${spans.length - rows.length} more spans\\n`);\n } else if (tempo?.reason) {\n process.stdout.write(`\\nTempo: ${tempo.reason}\\n`);\n }\n\n if (logs.length) {\n const rows = logs.slice(0, 8).map((log) => ({\n TIME: short(log.time, 19),\n LEVEL: short(log.level, 8),\n MESSAGE: short(log.msg ?? log.exception, 90),\n }));\n process.stdout.write('\\nLoki logs:\\n');\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n if (logs.length > rows.length) process.stdout.write(`... ${logs.length - rows.length} more logs\\n`);\n } else if (loki?.reason) {\n process.stdout.write(`\\nLoki: ${loki.reason}\\n`);\n }\n\n process.stdout.write('\\nnext: hcm trace <traceId> --events | hcm trace <traceId> --raw\\n');\n}\n\nfunction printTraceEvents(traceId: string, agg: TraceAggregate): void {\n const spans = agg.sources?.tempo?.spans ?? [];\n const logs = agg.sources?.loki?.logs ?? [];\n const llm = agg.sources?.loki?.llmContent ?? [];\n const rows: Record<string, unknown>[] = [];\n\n spans.forEach((sp, i) => rows.push({\n '#': i + 1,\n TYPE: 'span',\n STATUS: sp.status ?? '-',\n DURATION: fmtDuration(sp.durationMs),\n EVENT: short(`${sp.service ?? '-'} · ${sp.operation ?? '-'}`, 84),\n }));\n logs.forEach((log, i) => rows.push({\n '#': `L${i + 1}`,\n TYPE: 'log',\n STATUS: short(log.level, 8),\n DURATION: short(log.time, 19),\n EVENT: short(log.msg ?? log.exception, 84),\n }));\n llm.forEach((item, i) => rows.push({\n '#': `M${i + 1}`,\n TYPE: 'llm',\n STATUS: short(item.callType, 12),\n DURATION: item.roundNumber == null ? '-' : `round ${item.roundNumber}`,\n EVENT: short(`${item.agentKey ?? '-'} · ${item.model ?? '-'} · prompt ${item.systemPromptHash ?? '?'} (${item.systemPromptLen ?? 0})`, 84),\n }));\n\n process.stdout.write(`trace events: ${traceId}\\n`);\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n}\n\n/** ConversationModel 列表行(PG 兜底视图,字段来自 dev-machine 实测)。 */\ninterface ConversationRow {\n id?: string;\n title?: string | null;\n createTime?: string | null;\n lastActiveAt?: string | null;\n messageCount?: number | null;\n totalTokens?: number | null;\n}\n\n/**\n * list 模式:优先 Tempo `/api/trace/recent`;Tempo 不可用(未起观测栈 / 空结果)时回退\n * PG 会话视图(查 ConversationModel,离线可用)。回退给出的是「最近会话」而非 Tempo trace,\n * 用户可据此 `hcm trace --conv <CONV>` 看逐调用。\n */\nasync function listRecentTraces(\n client: InstanceType<typeof HcmClient>,\n limit: number,\n): Promise<void> {\n const http = client.raw();\n try {\n const resp = await http.get('/api/trace/recent', { params: { limit } });\n const data = (resp.data ?? {}) as RecentResult;\n if (data.traces && data.traces.length) {\n printRecent(data, limit);\n return;\n }\n process.stdout.write(\n `Tempo 无最近 trace${data.reason ? `(${short(data.reason, 60)})` : ''},回退 PG 会话视图:\\n\\n`,\n );\n } catch (e) {\n const reason = (e as { message?: string })?.message ?? 'Tempo 不可用';\n process.stdout.write(`Tempo 不可用(${short(reason, 60)}),回退 PG 会话视图:\\n\\n`);\n }\n await listRecentConversationsPg(client, limit);\n}\n\n/** PG 兜底:列最近会话(ConversationModel),供 `hcm trace --conv <id>` 深入。 */\nasync function listRecentConversationsPg(\n client: InstanceType<typeof HcmClient>,\n limit: number,\n): Promise<void> {\n let rows: ConversationRow[];\n try {\n const res = await client.query<ConversationRow>('ConversationModel', {\n sort: [{ field: 'lastActiveAt', direction: 'desc' }],\n limit,\n });\n rows = res.rows;\n } catch (e) {\n process.stdout.write(`PG 会话视图也失败:${short((e as { message?: string })?.message, 80)}\\n`);\n return;\n }\n if (!rows.length) {\n process.stdout.write('无最近会话。\\n');\n return;\n }\n const table = rows.map((c) => ({\n TIME: short(c.lastActiveAt ?? c.createTime, 19),\n TITLE: short(c.title, 28),\n MSGS: c.messageCount ?? '-',\n TOKENS: c.totalTokens ?? '-',\n CONV: c.id ?? '-',\n }));\n process.stdout.write(formatRows(table, { format: 'table' }) + '\\n');\n process.stdout.write(`Showing ${rows.length} conversation${rows.length === 1 ? '' : 's'}(PG 视图)。\\n`);\n process.stdout.write('next: hcm trace --conv <CONV>(看该会话 LLM 逐调用,含委派子会话)\\n');\n}\n\n/**\n * 从 response_tool_calls(后端已解析成对象/数组,或解析失败的原始字符串)抽 tool name 列表。\n * 兼容多种 provider 形状:`{name}` / `{function:{name}}` / 顶层包 `{toolCalls:[...]}`。\n */\nfunction extractToolNames(raw: unknown): string {\n if (raw == null) return '-';\n let value: unknown = raw;\n if (typeof value === 'string') {\n const text = value.trim();\n if (!text) return '-';\n try {\n value = JSON.parse(text);\n } catch {\n return short(text, 24);\n }\n }\n let list: unknown[];\n if (Array.isArray(value)) {\n list = value;\n } else if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const nested = obj.toolCalls ?? obj.tool_calls ?? obj.calls;\n list = Array.isArray(nested) ? nested : [value];\n } else {\n return '-';\n }\n const names = list\n .map((item) => {\n if (!item || typeof item !== 'object') return null;\n const o = item as Record<string, unknown>;\n const fn = o.function as Record<string, unknown> | undefined;\n const name = o.name ?? fn?.name ?? o.toolName;\n return typeof name === 'string' && name ? name : null;\n })\n .filter((n): n is string => n != null);\n return names.length ? names.join(', ') : '-';\n}\n\nfunction buildLlmTable(rows: LlmTraceRow[]): {\n table: Record<string, unknown>[];\n inSum: number;\n outSum: number;\n} {\n let inSum = 0;\n let outSum = 0;\n const table = rows.map((r) => {\n const pIn = Number(r.promptTokens ?? 0);\n const pOut = Number(r.completionTokens ?? 0);\n inSum += pIn;\n outSum += pOut;\n return {\n ROUND: r.roundNumber ?? '-',\n AGENT: short(r.agentPath, 22),\n MODEL: short(r.modelName, 22),\n TOOLS: short(extractToolNames(r.responseToolCalls), 30),\n 'TOKENS(in/out)': `${pIn}/${pOut}`,\n LATENCY: fmtDuration(r.latencyMs ?? undefined),\n FINISH: short(r.finishReason, 12),\n };\n });\n return { table, inSum, outSum };\n}\n\n/**\n * 打印会话 LLM 逐调用树:根会话 + 递归展开的委派子会话(BUG#2:委派 specialist 的轮次/\n * 工具在离线 PG trace 里可见,不必依赖 Tempo)。子会话 id 由根会话 timeline 的 delegate\n * tool.result(childConversationId)发现。\n */\nfunction printLlmTraceTree(nodes: TraceNode[]): void {\n const root = nodes[0]!;\n const childCount = nodes.length - 1;\n if (!root.rows.length && childCount === 0) {\n process.stdout.write(`No LLM calls for conversation ${root.convId}.\\n`);\n process.stdout.write('next: 确认 convId 正确,或该会话尚无 LLM 调用落库(dev always-on,ADR-134 D2)。\\n');\n return;\n }\n for (const node of nodes) {\n if (node.depth === 0) {\n process.stdout.write(\n `conversation: ${node.convId}${childCount ? `(+${childCount} 委派子会话)` : ''}\\n`,\n );\n } else {\n process.stdout.write(\n `\\n${' '.repeat(node.depth)}└─ 委派 → ${node.label} · ${node.convId}(depth ${node.depth})\\n`,\n );\n }\n const { table, inSum, outSum } = buildLlmTable(node.rows);\n process.stdout.write(`llm calls: ${node.rows.length} · tokens(in/out): ${inSum}/${outSum}\\n\\n`);\n if (table.length) {\n process.stdout.write(formatRows(table, { format: 'table' }) + '\\n');\n } else {\n process.stdout.write('(无 LLM 调用)\\n');\n }\n }\n process.stdout.write('\\nnext: hcm trace --conv <convId> --raw(看完整逐调用 JSON)\\n');\n}\n\nasync function fetchLlmTrace(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n convId: string,\n): Promise<LlmTraceRow[]> {\n const resp = await http.get(`/api/moirai/conversations/${encodeURIComponent(convId)}/llm-trace`);\n return (resp.data ?? []) as LlmTraceRow[];\n}\n\ninterface TraceNode {\n convId: string;\n depth: number;\n /** 委派该子会话的 agentKey / 工具名(根为 'root')。 */\n label: string;\n rows: LlmTraceRow[];\n}\n\n/**\n * 从会话 timeline 抽出被委派的子会话(kind='tools' 项内 tools[].childConversationId)。\n * timeline 走 ConversationModel action(PG,离线可用);任何失败返回空(递归 best-effort)。\n */\n/**\n * 从 timeline items 抽出被委派子会话(纯函数,供单测守 timeline schema 契约):\n * kind='tools' 项内 tools[].childConversationId,按出现序去重,label 取 agentKey/name/toolName。\n */\nexport function extractChildConvs(\n items: Array<Record<string, unknown>>,\n): Array<{ childConvId: string; label: string }> {\n const out: Array<{ childConvId: string; label: string }> = [];\n const seen = new Set<string>();\n for (const it of items) {\n if (it.kind !== 'tools' || !Array.isArray(it.tools)) continue;\n for (const t of it.tools as Array<Record<string, unknown>>) {\n const child = t.childConversationId;\n if (typeof child === 'string' && child && !seen.has(child)) {\n seen.add(child);\n const label =\n (typeof t.agentKey === 'string' && t.agentKey) ||\n (typeof t.name === 'string' && t.name) ||\n (typeof t.toolName === 'string' && t.toolName) ||\n 'delegate';\n out.push({ childConvId: child, label });\n }\n }\n }\n return out;\n}\n\nasync function fetchChildConvs(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n convId: string,\n): Promise<Array<{ childConvId: string; label: string }>> {\n let items: Array<Record<string, unknown>> = [];\n try {\n const resp = await http.get(\n `/api/models/ConversationModel/${encodeURIComponent(convId)}/action/timeline`,\n );\n const body = resp.data as unknown;\n if (Array.isArray(body)) items = body as Array<Record<string, unknown>>;\n else if (body && typeof body === 'object' && Array.isArray((body as { data?: unknown }).data)) {\n items = (body as { data: Array<Record<string, unknown>> }).data;\n }\n } catch {\n return [];\n }\n return extractChildConvs(items);\n}\n\n/** DFS 收集根会话 + 委派子会话的 LLM trace(深度上限防环 / 无限递归)。 */\nasync function gatherLlmTraceTree(\n http: ReturnType<InstanceType<typeof HcmClient>['raw']>,\n rootConvId: string,\n maxDepth = 3,\n): Promise<TraceNode[]> {\n const nodes: TraceNode[] = [];\n const visited = new Set<string>();\n async function walk(convId: string, depth: number, label: string): Promise<void> {\n if (visited.has(convId) || depth > maxDepth) return;\n visited.add(convId);\n nodes.push({ convId, depth, label, rows: await fetchLlmTrace(http, convId) });\n if (depth === maxDepth) return;\n for (const c of await fetchChildConvs(http, convId)) {\n await walk(c.childConvId, depth + 1, c.label);\n }\n }\n await walk(rootConvId, 0, 'root');\n return nodes;\n}\n\nexport async function traceCommand(traceId: string | null, args: TraceArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const http = client.raw();\n\n // ADR-134 D2:LLM 逐调用模式 — `hcm trace --conv <convId>` 或 `hcm trace <convId> --llm-calls`\n const convId = args.conv ?? (args.llmCalls ? traceId ?? undefined : undefined);\n if (convId) {\n // raw/json/yaml:保持单会话扁平数组(机器契约不变)。\n if (args.raw || args.output === 'json' || args.output === 'yaml') {\n const rows = await fetchLlmTrace(http, convId);\n const fmt = args.raw ? 'json' : (args.output as OutputFormat);\n process.stdout.write(formatObject(rows, { format: fmt }) + '\\n');\n process.exit(0);\n }\n // 人读表格:递归展开委派子会话(BUG#2)。\n printLlmTraceTree(await gatherLlmTraceTree(http, convId));\n process.exit(0);\n }\n\n if (!traceId) {\n if (args.events || args.raw || args.span) {\n exitWithError('traceId is required for --events, --raw, and --span');\n return;\n }\n await listRecentTraces(client, parsePositiveInt(args.limit, 10, '--limit'));\n process.exit(0);\n }\n\n const resp = await http.get(`/api/trace/${traceId}`);\n const agg: TraceAggregate = resp.data ?? {};\n\n if (args.raw) {\n process.stdout.write(formatObject(agg, { format: 'json' }) + '\\n');\n process.exit(0);\n }\n\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(formatObject(agg, { format: args.output }) + '\\n');\n process.exit(0);\n }\n\n const spans = agg.sources?.tempo?.spans ?? [];\n if (args.span) {\n const idx = parsePositiveInt(args.span, 1, '--span') - 1;\n if (idx < 0 || idx >= spans.length) {\n exitWithError(`Span #${args.span} 越界(共 ${spans.length} 条 Tempo span)`);\n return;\n }\n process.stdout.write(formatObject(spans[idx], { format: 'yaml' }) + '\\n');\n process.exit(0);\n }\n\n if (args.events) {\n printTraceEvents(traceId, agg);\n } else {\n printTraceDetail(traceId, agg);\n }\n process.exit(0);\n } catch (e) {\n const err = e as Record<string, unknown>;\n if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.profile));\n }\n exitWithError(e);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n getCacheStats,\n clearModelCache,\n clearMetaCache,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface CacheArgs {\n id?: string;\n type?: string;\n state?: string;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function withClient<T>(args: CacheArgs, fn: (c: HcmClient) => Promise<T>): Promise<T> {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n return fn(client);\n}\n\nfunction emit(result: unknown, args: CacheArgs, human: string): void {\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(human + '\\n');\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n}\n\nfunction fail(e: unknown, args: CacheArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm cache stats <Model>` —— 查看两级缓存命中统计。 */\nexport async function cacheStatsCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const stats = await withClient(args, (c) => getCacheStats(c.raw(), model));\n emit(stats, args, `📊 ${model} 缓存统计`);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm cache clear <Model> [--id <id>]` —— 清实体缓存。\n * 幂等且不破坏数据,故不设确认闸。\n */\nexport async function cacheClearCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const result = await withClient(args, (c) => clearModelCache(c.raw(), model, args.id));\n emit(result, args, args.id ? `🧹 已清 ${model}#${args.id} 缓存` : `🧹 已清 ${model} 全部实体缓存`);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm cache clear-meta <Model> [--type <t>] [--state <s>]` —— 清元数据缓存\n * (Code 级 YAML 配置 + Action 定义)。改 meta YAML 后必跑,否则读到旧配置。\n */\nexport async function cacheClearMetaCommand(model: string, args: CacheArgs): Promise<void> {\n try {\n const result = await withClient(args, (c) =>\n clearMetaCache(c.raw(), model, { type: args.type, state: args.state }),\n );\n const scope = args.type ? `${args.type}${args.state ? `.${args.state}` : ''}` : '全部';\n emit(result, args, `🧹 已清 ${model} 元数据缓存(${scope})`);\n } catch (e) {\n fail(e, args);\n }\n}\n","import {\n HcmClient,\n formatObject,\n fromAxiosError,\n uploadDocument,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface UploadArgs {\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\n/**\n * `hcm upload <file>` —— 上传本地文件到 HCM 文档服务,返回 documentId。\n *\n * 交付路径上的必用动作:报表 xlsx 模板、套打 docx 模板、导入 Excel 都要先拿到\n * documentId 才能挂到业务对象上。与 `hcm download <documentId>` 成对。\n */\nexport async function uploadCommand(filePath: string, args: UploadArgs): Promise<void> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n const client = HcmClient.fromAuthContext(ctx);\n const meta = await uploadDocument(client.raw(), filePath);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(\n `⬆️ ${meta.fileName} (${meta.fileSize} B) → documentId ${meta.documentId}\\n`,\n );\n }\n process.stdout.write(formatObject(meta, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n const status = err?.response?.status;\n if (err?.code === 'ENOENT') {\n exitWithError(new Error(`文件不存在:${filePath}`));\n } else if (status === 413) {\n exitWithError(new Error('文件超出服务端大小上限(413)'));\n } else if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.env));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { promises as fsp } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport {\n createHttpClient,\n fetchSkillCatalog,\n fetchSkillMarkdown,\n matchSkills,\n filterByStage,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\n\nexport interface SkillsArgs {\n endpoint?: string;\n env?: string;\n dir?: string;\n global?: boolean;\n from?: string;\n force?: boolean;\n category?: string;\n stage?: string;\n byStage?: boolean;\n output?: OutputFormat;\n}\n\n/**\n * 解析 endpoint。技能库端点**免认证**,故只需要连接信息,不解析 identity——\n * 这正是冷启动能成立的原因:空环境、无租户、无账号也能装技能。\n */\nasync function resolveEndpoint(args: SkillsArgs): Promise<string> {\n if (args.endpoint) return args.endpoint.replace(/\\/+$/, '');\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.env }, process.env, g);\n const env = await loadEnv(envName).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message:\n '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`。'\n + '(技能库免认证,不需要先 login)',\n });\n }\n return env.endpoint.replace(/\\/+$/, '');\n}\n\nfunction anonHttp(endpoint: string) {\n return createHttpClient({\n endpoint,\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n}\n\nfunction fail(e: unknown, args: SkillsArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 404) {\n exitWithError(new Error('该环境没有这个技能 —— 跑 `hcm skills list` 看目录(技能随产品版本走)'));\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm skills list [keyword]` —— 列出目标环境这一版的交付技能。 */\nexport async function skillsListCommand(keyword: string | undefined, args: SkillsArgs): Promise<void> {\n try {\n const endpoint = await resolveEndpoint(args);\n const manifest = await fetchSkillCatalog(anonHttp(endpoint));\n const fmt: OutputFormat = args.output ?? 'table';\n\n let cats = manifest.categories ?? [];\n if (args.category) cats = cats.filter((c) => c.key === args.category);\n if (keyword) {\n cats = cats\n .map((c) => ({ ...c, skills: matchSkills(c.skills ?? [], keyword) }))\n .filter((c) => c.skills.length > 0);\n }\n if (args.stage) {\n cats = cats\n .map((c) => ({ ...c, skills: filterByStage(c.skills ?? [], args.stage) }))\n .filter((c) => c.skills.length > 0);\n }\n\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(formatObject({ ...manifest, categories: cats }, { format: fmt }) + '\\n');\n process.exit(0);\n }\n\n const shown = cats.flatMap((c) => c.skills);\n if (shown.length === 0) {\n process.stdout.write(`没有匹配的技能(${endpoint} 共 ${manifest.skillCount} 个)\\n`);\n process.exit(0);\n }\n process.stdout.write(`${manifest.title ?? 'Chiron'} — ${endpoint}\\n\\n`);\n\n // 按交付生命周期看:顾问的心智是「现在第几周,该干什么」\n if (args.byStage) {\n const all = cats.flatMap((c) => c.skills);\n for (const st of manifest.stages ?? []) {\n const inStage = filterByStage(all, st.key);\n if (inStage.length === 0 && !args.stage) {\n process.stdout.write(` ${st.name} (无技能覆盖)\\n\\n`);\n continue;\n }\n if (inStage.length === 0) continue;\n process.stdout.write(` ${st.name}\\n`);\n for (const s of inStage) {\n const flag = s.actionSurface === 'cli' ? '●' : '○';\n process.stdout.write(` ${flag} ${s.id.padEnd(30)} ${s.title}\\n`);\n }\n process.stdout.write('\\n');\n }\n process.stdout.write(` ● CLI 就绪 ○ 待改写动作面 共 ${shown.length} 个\\n`);\n process.stdout.write(` 装一个:hcm skills install <id>\\n`);\n process.exit(0);\n }\n\n for (const c of cats) {\n process.stdout.write(` ${c.name}\\n`);\n for (const s of c.skills) {\n const flag = s.actionSurface === 'cli' ? '●' : '○';\n process.stdout.write(` ${flag} ${s.id.padEnd(30)} ${s.title}\\n`);\n }\n process.stdout.write('\\n');\n }\n process.stdout.write(` ● CLI 就绪 ○ 待改写动作面 共 ${shown.length} 个\\n`);\n process.stdout.write(` 装一个:hcm skills install <id>\\n`);\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** `hcm skills show <id>` —— 打印技能原文(管道友好)。 */\nexport async function skillsShowCommand(id: string, args: SkillsArgs): Promise<void> {\n try {\n const endpoint = await resolveEndpoint(args);\n const md = await fetchSkillMarkdown(anonHttp(endpoint), id);\n process.stdout.write(md.endsWith('\\n') ? md : md + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm skills install <id>` —— 装到 agent 的技能目录。\n *\n * 默认落当前项目 `.claude/skills/<id>/SKILL.md`;`--global` 落 `~/.claude/skills/`。\n * `--from <dir>` 从本地目录装(现场发现技能有问题时先本地改,再回流主库提 PR)。\n */\nexport async function skillsInstallCommand(id: string, args: SkillsArgs): Promise<void> {\n try {\n if (!/^[a-z0-9][a-z0-9-]{0,63}$/.test(id)) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: `技能 id 只能是小写字母/数字/连字符,收到 \"${id}\"`,\n });\n }\n\n let md: string;\n let source: string;\n if (args.from) {\n const local = path.resolve(args.from, id, 'SKILL.md');\n md = await fsp.readFile(local, 'utf8');\n source = local;\n } else {\n const endpoint = await resolveEndpoint(args);\n md = await fetchSkillMarkdown(anonHttp(endpoint), id);\n source = `${endpoint}/skills/${id}.md`;\n }\n if (!md.trim()) {\n throw new CliError({ code: CliErrorCode.INVALID_ARGUMENT, message: `技能 ${id} 内容为空` });\n }\n\n const baseDir = args.dir\n ? path.resolve(args.dir)\n : args.global\n ? path.join(os.homedir(), '.claude', 'skills')\n : path.resolve('.claude', 'skills');\n const target = path.join(baseDir, id, 'SKILL.md');\n\n const exists = await fsp\n .access(target)\n .then(() => true)\n .catch(() => false);\n if (exists && !args.force) {\n process.stderr.write(`已存在:${target}\\n用 --force 覆盖,或 --dir <path> 装到别处\\n`);\n process.exit(1);\n }\n\n await fsp.mkdir(path.dirname(target), { recursive: true });\n await fsp.writeFile(target, md, 'utf8');\n\n const fmt: OutputFormat = args.output ?? 'table';\n if (fmt === 'json' || fmt === 'yaml') {\n process.stdout.write(\n formatObject({ id, target, source, bytes: Buffer.byteLength(md) }, { format: fmt }) + '\\n',\n );\n } else {\n process.stdout.write(`✅ ${id} → ${target}\\n 来源 ${source}\\n`);\n }\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((e as any)?.code === 'ENOENT' && args.from) {\n exitWithError(new Error(`本地目录里没有 ${id}/SKILL.md:${path.resolve(args.from, id)}`));\n }\n fail(e, args);\n }\n}\n","import {\n bootstrapTenant,\n createHttpClient,\n formatObject,\n fromAxiosError,\n loadEnv,\n loadGlobalConfig,\n resolveActiveEnv,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { promptSecret, promptConfirm, readStdin } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\n\nexport interface TenantBootstrapArgs {\n tenantId?: string;\n adminUsername?: string;\n adminPassword?: string;\n adminPasswordStdin?: boolean;\n tenantName?: string;\n bootstrapKey?: string;\n bootstrapKeyStdin?: boolean;\n endpoint?: string;\n env?: string;\n yes?: boolean;\n output?: OutputFormat;\n}\n\n/**\n * 解析 bootstrap key。优先级:env var → --bootstrap-key-stdin → --bootstrap-key(警告)→ 交互。\n *\n * 🔴 key 是「无租户无用户」时刻的唯一凭据,等价于建租户的权限。绝不接受写进\n * skill 正文或提交进仓库的用法——命令行明文传参会警告。\n */\nasync function resolveBootstrapKey(args: TenantBootstrapArgs, stdinTaken: boolean): Promise<string> {\n const fromEnv = process.env.HCM_BOOTSTRAP_KEY;\n if (fromEnv) return fromEnv;\n if (args.bootstrapKeyStdin) {\n if (stdinTaken) {\n throw new CliError({\n code: CliErrorCode.INVALID_ARGUMENT,\n message: '--bootstrap-key-stdin 与 --admin-password-stdin 不能同时用(stdin 只有一路);'\n + '把其中一个改走 HCM_BOOTSTRAP_KEY 环境变量或交互输入',\n });\n }\n return (await readStdin()).trim();\n }\n if (args.bootstrapKey) {\n process.stderr.write(\n '[hcm] WARNING: --bootstrap-key <k> 会泄漏到 shell history / ps aux。'\n + '推荐 HCM_BOOTSTRAP_KEY 环境变量或 --bootstrap-key-stdin。\\n',\n );\n return args.bootstrapKey;\n }\n return promptSecret('Bootstrap key: ');\n}\n\nasync function resolveAdminPassword(args: TenantBootstrapArgs): Promise<{ pwd: string; stdinTaken: boolean }> {\n if (args.adminPasswordStdin) return { pwd: (await readStdin()).trim(), stdinTaken: true };\n if (args.adminPassword) {\n process.stderr.write(\n '[hcm] WARNING: --admin-password <p> 会泄漏到 shell history / ps aux。推荐 --admin-password-stdin。\\n',\n );\n return { pwd: args.adminPassword, stdinTaken: false };\n }\n return { pwd: await promptSecret('Admin password: '), stdinTaken: false };\n}\n\nasync function resolveEndpoint(args: TenantBootstrapArgs): Promise<string> {\n if (args.endpoint) return args.endpoint;\n const g = await loadGlobalConfig();\n const envName = resolveActiveEnv({ envFlag: args.env }, process.env, g);\n const env = await loadEnv(envName).catch(() => null);\n if (!env?.endpoint) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '未解析到 endpoint —— 传 --endpoint <url>,或先 `hcm env add <name> --endpoint <url>`',\n });\n }\n return env.endpoint;\n}\n\n/**\n * `hcm tenant bootstrap` —— 开通新租户(建租户 + admin 用户 + 租户结构 reconcile)。\n *\n * 交付旅程的第一步,且是**唯一在没有任何租户/用户时可用**的写入口。不可逆,\n * 故默认过确认闸(`--yes` 跳过,供 CI 用)。\n */\nexport async function tenantBootstrapCommand(args: TenantBootstrapArgs): Promise<void> {\n try {\n if (!args.tenantId || !args.adminUsername) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '--tenant-id 与 --admin-username 必填',\n });\n }\n const endpoint = await resolveEndpoint(args);\n const { pwd, stdinTaken } = await resolveAdminPassword(args);\n const key = await resolveBootstrapKey(args, stdinTaken);\n\n if (!args.yes) {\n const ok = await promptConfirm(\n `将在 ${endpoint} 创建租户 \"${args.tenantId}\"(admin: ${args.adminUsername})。此操作不可逆,继续?`,\n );\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n\n // bootstrap 端点不走 Bearer —— 用无认证 client,凭 X-Bootstrap-Key 通过\n const http = createHttpClient({\n endpoint,\n getAccessToken: async () => null,\n onRefresh: async () => {},\n });\n const result = await bootstrapTenant(http, key, {\n tenantId: args.tenantId,\n adminUsername: args.adminUsername,\n adminPassword: pwd,\n tenantName: args.tenantName,\n });\n\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(\n `✅ 租户 ${result.tenantId} 已开通(adminUserId ${result.adminUserId ?? '-'})\\n`\n + ` 下一步:hcm env add <name> --endpoint ${endpoint} && hcm login --env <name>\\n`,\n );\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 403) {\n exitWithError(new Error('bootstrap key 无效(403)—— 核对部署方提供的 key,勿复用其他环境的'));\n } else if (err?.isAxiosError) {\n exitWithError(fromAxiosError(err, args.env));\n } else {\n exitWithError(e);\n }\n }\n}\n","import { promises as fsp } from 'node:fs';\nimport {\n HcmClient,\n formatObject,\n fromAxiosError,\n listTenantMeta,\n getTenantMeta,\n saveTenantMeta,\n deleteTenantMeta,\n CliError,\n CliErrorCode,\n type OutputFormat,\n} from '@hcmai/sdk';\nimport { promptConfirm } from '../utils/prompt';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\n\nexport interface MetaArgs {\n keyword?: string;\n type?: string;\n page?: string;\n pageSize?: string;\n file?: string;\n dryRun?: boolean;\n yes?: boolean;\n env?: string;\n as?: string;\n output?: OutputFormat;\n}\n\nasync function client(args: MetaArgs): Promise<HcmClient> {\n return HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n}\n\nfunction fail(e: unknown, args: MetaArgs): never {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const err = e as any;\n if (err?.response?.status === 403) {\n exitWithError(\n new Error('元数据写入被拒(403)—— 需 config-admin 身份且当前 source 可写;'\n + '若在租户开发空间外,先 `hcm workspace bind <key>`'),\n );\n }\n if (err?.isAxiosError) exitWithError(fromAxiosError(err, args.env));\n exitWithError(e);\n process.exit(1);\n}\n\n/** `hcm meta list` —— 列出租户元数据文件。 */\nexport async function metaListCommand(args: MetaArgs): Promise<void> {\n try {\n const c = await client(args);\n const { items, total } = await listTenantMeta(c.raw(), {\n keyword: args.keyword,\n type: args.type,\n page: args.page ? Number(args.page) : undefined,\n pageSize: args.pageSize ? Number(args.pageSize) : undefined,\n });\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`📄 ${items.length} 份${total ? ` / 共 ${total}` : ''}\\n`);\n process.stdout.write(formatObject(items, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/** `hcm meta get <path>` —— 打印 meta 原文(YAML/properties 原样,便于管道消费)。 */\nexport async function metaGetCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n const c = await client(args);\n const content = await getTenantMeta(c.raw(), path);\n process.stdout.write(content.endsWith('\\n') ? content : content + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n\n/**\n * `hcm meta set <path> --file <f> [--dry-run]` —— 写入 meta 原文。\n *\n * 默认对着**客户环境**写配置,故支持 `--dry-run` 先看要写什么。\n * 写完须清元数据缓存才生效:`hcm cache clear-meta <Model>`。\n */\nexport async function metaSetCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n if (!args.file) {\n throw new CliError({\n code: CliErrorCode.MISSING_FLAG,\n message: '--file <path> 必填(从文件读取 meta 原文;用 - 表示 stdin)',\n });\n }\n const content =\n args.file === '-'\n ? await new Promise<string>((resolve, reject) => {\n let buf = '';\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', (d) => (buf += d));\n process.stdin.on('end', () => resolve(buf));\n process.stdin.on('error', reject);\n })\n : await fsp.readFile(args.file, 'utf8');\n\n if (args.dryRun) {\n process.stdout.write(\n `[dry-run] 将写入 ${path}(${Buffer.byteLength(content)} B)——未实际写入\\n---\\n${content}\\n`,\n );\n process.exit(0);\n }\n\n const c = await client(args);\n const result = await saveTenantMeta(c.raw(), path, content);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') {\n process.stdout.write(`✅ 已写入 ${path}\\n 记得清缓存:hcm cache clear-meta <Model>\\n`);\n }\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((e as any)?.code === 'ENOENT') exitWithError(new Error(`文件不存在:${args.file}`));\n fail(e, args);\n }\n}\n\n/** `hcm meta delete <path> [--yes]` —— 删除 meta(不可逆,默认过确认闸)。 */\nexport async function metaDeleteCommand(path: string, args: MetaArgs): Promise<void> {\n try {\n if (!args.yes) {\n const ok = await promptConfirm(`将删除元数据 ${path},此操作不可逆。继续?`);\n if (!ok) {\n process.stderr.write('已取消\\n');\n process.exit(1);\n }\n }\n const c = await client(args);\n const result = await deleteTenantMeta(c.raw(), path);\n const fmt: OutputFormat = args.output ?? 'json';\n if (fmt !== 'json') process.stdout.write(`🗑️ 已删除 ${path}\\n`);\n process.stdout.write(formatObject(result, { format: fmt }) + '\\n');\n process.exit(0);\n } catch (e) {\n fail(e, args);\n }\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n buildMiniPreviewTargets,\n buildMiniVerifyAgentReport,\n createWorkspaceFile,\n deleteWorkspaceFile,\n formatMiniVerifyReport,\n formatObject,\n formatRows,\n getMiniStatus,\n HcmClient,\n initMiniAppProject,\n inferMiniWritableTemplateOptionsFromModel,\n listWorkspaceFiles,\n loadWorkspaceFileContent,\n pullMiniAppProject,\n pushMiniAppProject,\n runMiniSmokeChecks,\n saveWorkspaceFileContent,\n validateMiniProject,\n fromAxiosError,\n type MiniPreviewTarget,\n type MiniPushConflict,\n type MiniPushPlanItem,\n type MiniPushResult,\n type MiniStatusEntry,\n type MiniSurface,\n type MiniTemplateKind,\n type MiniValidationResult,\n type MiniVerifyReport,\n type OutputFormat,\n type WorkspaceFileItem,\n} from '@hcmai/sdk';\nimport { exitWithError } from '../utils/exit';\nimport { getActiveAuthContextFromCli } from '../middleware/auth-guard';\nimport {\n toWorkspaceListRows,\n type TenantExtensionWorkspaceRow,\n} from './workspace-format';\n\nconst DEFAULT_FRONTEND_URL = 'http://127.0.0.1:5179';\nconst WORKSPACE_CONTEXT_FILE = 'hcm.workspace.json';\nconst WORKSPACE_CONTEXT_KIND = 'hcm-workspace';\nconst WORKSPACE_CONTEXT_VERSION = 1;\nconst WORKSPACE_STATE_DIR = '.hcm';\nconst WORKSPACE_PULL_MANIFEST_FILE = 'workspace-manifest.json';\nconst MINI_APPS_DIR = 'mini_apps';\nconst RAW_WORKSPACE_EXCLUDED_DIRS = new Set([\n '.git',\n WORKSPACE_STATE_DIR,\n MINI_APPS_DIR,\n 'node_modules',\n 'dist',\n]);\nconst RAW_WORKSPACE_EXCLUDED_FILES = new Set([WORKSPACE_CONTEXT_FILE, '.DS_Store']);\n\ninterface WorkspaceContext {\n kind: typeof WORKSPACE_CONTEXT_KIND;\n version: typeof WORKSPACE_CONTEXT_VERSION;\n workspaceKey: string;\n tenantId?: string;\n endpoint?: string;\n profile?: string;\n updatedAt: string;\n}\n\ninterface WorkspaceDirArgs {\n dir?: string;\n output?: OutputFormat;\n}\n\n/**\n * Common env/identity flags accepted by every business sub-command (T15).\n * `profile` is kept as a deprecated alias of `env`; transpiled in\n * `getActiveAuthContextFromCli`.\n */\ninterface CommonAuthArgs {\n /** @deprecated 用 --env 替代 */\n profile?: string;\n env?: string;\n as?: string;\n}\n\ninterface WorkspaceListArgs extends CommonAuthArgs {\n keyword?: string;\n limit?: string | number;\n output?: OutputFormat;\n}\n\ninterface WorkspaceActiveArgs extends WorkspaceDirArgs, CommonAuthArgs {}\n\ninterface WorkspaceBindArgs extends WorkspaceDirArgs, CommonAuthArgs {\n tenant?: string;\n endpoint?: string;\n force?: boolean;\n}\n\ninterface WorkspaceCreateArgs extends WorkspaceDirArgs, CommonAuthArgs {\n description?: string;\n activate?: boolean;\n force?: boolean;\n}\n\ninterface WorkspacePullArgs extends WorkspaceDirArgs, CommonAuthArgs {\n workspace?: string;\n force?: boolean;\n}\n\ninterface WorkspaceAddMiniArgs extends WorkspaceDirArgs, CommonAuthArgs {\n name?: string;\n template?: string;\n model?: string;\n fields?: string;\n defaults?: string;\n surface?: string;\n scopes?: string;\n tenant?: string;\n force?: boolean;\n}\n\ninterface WorkspacePushArgs extends WorkspaceDirArgs, CommonAuthArgs {\n dryRun?: boolean;\n}\n\ninterface WorkspacePreviewArgs extends WorkspaceDirArgs {\n frontend?: string;\n surface?: string;\n}\n\ninterface WorkspaceVerifyArgs extends WorkspaceDirArgs, CommonAuthArgs {\n frontend?: string;\n surface?: string;\n smoke?: boolean;\n}\n\ninterface MiniAppDir {\n appCode: string;\n dir: string;\n}\n\ninterface WorkspaceMiniVerifyItem {\n appCode: string;\n dir: string;\n report: MiniVerifyReport;\n agentReport: ReturnType<typeof buildMiniVerifyAgentReport>;\n}\n\ninterface WorkspaceRawLocalFile {\n localPath: string;\n absolutePath: string;\n content: string;\n sha256: string;\n size: number;\n}\n\ninterface WorkspaceRawFileSnapshot {\n localPath: string;\n remotePath: string;\n fileId?: string;\n sha256: string;\n size: number;\n lastModified?: number | string | null;\n}\n\ninterface WorkspaceRawPullManifest {\n version: typeof WORKSPACE_CONTEXT_VERSION;\n workspaceKey: string;\n profile?: string;\n pulledAt: string;\n files: WorkspaceRawFileSnapshot[];\n}\n\ninterface WorkspaceRawPushResult {\n workspaceKey: string;\n dryRun: boolean;\n operations: MiniPushPlanItem[];\n conflicts: MiniPushConflict[];\n}\n\ninterface WorkspaceActiveView {\n activeWorkspaceKey: string | null;\n localWorkspaceKey: string | null;\n matchesLocal: boolean | null;\n profile: string;\n tenantId: string;\n endpoint: string;\n rootDir: string;\n}\n\nexport async function workspaceListCommand(args: WorkspaceListArgs): Promise<void> {\n try {\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const limit = parsePositiveInt(args.limit, 50, '--limit');\n const result = await client.query<TenantExtensionWorkspaceRow>('TenantExtensionWorkspace', {\n keyword: args.keyword,\n fields: [\n 'workspaceKey',\n 'description',\n 'ownerUserName',\n 'sharedUsers',\n 'filesCount',\n 'myLockCount',\n 'devModeEnabled',\n 'updateTime',\n ],\n sort: [{ field: 'devModeEnabled', desc: true }, { field: 'updateTime', desc: true }],\n limit,\n });\n writeWorkspaceListResult(result.rows, args.output ?? 'table', result.total);\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceActiveCommand(args: WorkspaceActiveArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const localContext = await readWorkspaceContext(rootDir);\n // Fallback: if user did not pass --env / --profile but local hcm.workspace.json\n // remembers the env this dir was bound to, honor that.\n const ctx = await getActiveAuthContextFromCli(args, {\n fallbackEnv: localContext?.profile,\n });\n const client = HcmClient.fromAuthContext(ctx);\n const result = await client.query<TenantExtensionWorkspaceRow>('TenantExtensionWorkspace', {\n filter: { devModeEnabled: true },\n fields: ['workspaceKey', 'devModeEnabled'],\n limit: 1,\n });\n const activeWorkspaceKey = optionalText(result.rows[0]?.workspaceKey) ?? null;\n const view: WorkspaceActiveView = {\n activeWorkspaceKey,\n localWorkspaceKey: localContext?.workspaceKey ?? null,\n matchesLocal:\n activeWorkspaceKey && localContext?.workspaceKey\n ? activeWorkspaceKey === localContext.workspaceKey\n : null,\n profile: client.profile,\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n rootDir,\n };\n writeWorkspaceActiveResult(view, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceBindCommand(\n workspaceKey: string,\n args: WorkspaceBindArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n if (existing && !args.force && existing.workspaceKey !== workspaceKey) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} already binds workspace '${existing.workspaceKey}'; use --force to rebind`,\n );\n }\n const client = await loadProfileClient(args);\n const context = buildWorkspaceContext({\n workspaceKey,\n profile: args.env ?? args.profile ?? client?.profile,\n tenantId: args.tenant ?? client?.tenantId,\n endpoint: args.endpoint ?? client?.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n writeWorkspaceBindResult(context, rootDir, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceCreateCommand(\n workspaceKey: string,\n args: WorkspaceCreateArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n if (existing && !args.force && existing.workspaceKey !== workspaceKey) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} already binds workspace '${existing.workspaceKey}'; use --force to rebind`,\n );\n }\n const client = HcmClient.fromAuthContext(await getActiveAuthContextFromCli(args));\n const normalizedWorkspaceKey = normalizeWorkspaceKey(workspaceKey);\n const resp = await client.raw().post('/api/models/TenantExtensionWorkspace', {\n workspaceKey: normalizedWorkspaceKey,\n description: args.description ?? '',\n });\n const created = asRecord(unwrapData(resp.data));\n const id = stringOptional(created.id);\n if (args.activate) {\n if (!id) throw new Error('created workspace response does not include id');\n await client.action('TenantExtensionWorkspace', 'activate', { id });\n }\n const context = buildWorkspaceContext({\n workspaceKey: normalizedWorkspaceKey,\n profile: args.profile ?? client.profile,\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n writeWorkspaceCreateResult(\n {\n workspaceKey: normalizedWorkspaceKey,\n id: id ?? '-',\n rootDir,\n activated: !!args.activate,\n profile: client.profile,\n tenantId: client.tenantId,\n },\n args.output ?? 'table',\n );\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspacePullCommand(args: WorkspacePullArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const existing = await readWorkspaceContext(rootDir);\n const workspaceKey = args.workspace ?? existing?.workspaceKey;\n if (!workspaceKey) {\n throw new Error(\n `workspace key is required; pass --workspace <key> or run hcm workspace bind <key> first`,\n );\n }\n const client = HcmClient.fromAuthContext(\n await getActiveAuthContextFromCli(args, { fallbackEnv: existing?.profile }),\n );\n const context = buildWorkspaceContext({\n workspaceKey,\n profile: args.profile ?? existing?.profile ?? client.profile,\n tenantId: client.tenantId ?? existing?.tenantId,\n endpoint: client.endpoint ?? existing?.endpoint,\n });\n await fs.mkdir(rootDir, { recursive: true });\n await writeWorkspaceContext(rootDir, context);\n\n const files = await listWorkspaceFiles(client.raw(), workspaceKey, { pageSize: 5000 });\n const miniApps = detectRemoteMiniApps(files.data);\n const pulledMiniApps = [];\n for (const appCode of miniApps) {\n const result = await pullMiniAppProject({\n http: client.raw(),\n appCode,\n workspaceKey,\n targetDir: path.join(rootDir, MINI_APPS_DIR, appCode),\n tenantId: client.tenantId,\n endpoint: client.endpoint,\n profile: args.profile ?? client.profile,\n force: !!args.force,\n });\n pulledMiniApps.push(result);\n }\n\n const rawFiles = files.data.filter(\n (file) => !isDirectoryMarker(file.relativePath) && !isMiniAppPath(file.relativePath),\n );\n const pulledRawFiles = [];\n const rawRemoteByLocalPath = new Map<string, WorkspaceFileItem>();\n for (const file of rawFiles) {\n const content = await loadWorkspaceFileContent(client.raw(), file.id);\n const target = path.join(rootDir, content.relativePath);\n await writeTextFile(target, content.content, !!args.force);\n pulledRawFiles.push(content.relativePath);\n rawRemoteByLocalPath.set(content.relativePath, file);\n }\n await writeWorkspaceRawState(\n rootDir,\n context,\n await readWorkspaceRawLocalFiles(rootDir),\n rawRemoteByLocalPath,\n );\n\n writeWorkspacePullResult(\n {\n workspaceKey,\n rootDir,\n totalRemoteFiles: files.data.length,\n miniApps: pulledMiniApps.map((item) => ({\n appCode: item.appCode,\n files: item.files.length,\n })),\n rawFiles: pulledRawFiles,\n },\n args.output ?? 'table',\n );\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceAddMiniCommand(\n appCode: string,\n args: WorkspaceAddMiniArgs,\n): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const templateKind = parseTemplateKind(args.template);\n validateWritableOptions(templateKind, args);\n const model = parseModelKey(args.model);\n const client = await loadProfileClient({\n ...args,\n env: args.env ?? args.profile ?? context.profile,\n });\n const autoOptions = await resolveWritableAutoOptions({\n client,\n templateKind,\n model,\n fields: args.fields,\n defaults: args.defaults,\n });\n const result = await initMiniAppProject({\n appCode,\n workspaceKey: context.workspaceKey,\n targetDir: path.join(rootDir, MINI_APPS_DIR, appCode),\n name: args.name,\n defaultSurface: parseSurface(args.surface),\n templateKind,\n writableModel: model,\n writableFields: autoOptions.fields ?? parseCsv(args.fields),\n writableDefaults: autoOptions.defaults ?? parseJsonObject(args.defaults, '--defaults'),\n writableTodayDefaultFields: autoOptions.todayDefaultFields,\n requiredScopes: parseScopes(args.scopes),\n tenantId: args.tenant ?? client?.tenantId ?? context.tenantId,\n endpoint: client?.endpoint ?? context.endpoint,\n profile: args.env ?? args.profile ?? client?.profile ?? context.profile,\n force: !!args.force,\n });\n writeWorkspaceAddMiniResult(result, rootDir, args.output ?? 'table');\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspaceStatusCommand(args: WorkspaceDirArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const rawStatus = await getWorkspaceRawStatus(rootDir, context);\n const rows: Array<Record<string, unknown>> = rawStatus.map((item) => ({\n artifact: 'workspace',\n status: item.status,\n file: item.localPath,\n remote: item.remotePath,\n }));\n for (const app of miniApps) {\n try {\n const status = await getMiniStatus(app.dir);\n rows.push(\n ...status.map((item) => ({\n artifact: `mini:${app.appCode}`,\n status: item.status,\n file: item.localPath,\n remote: item.remotePath,\n })),\n );\n } catch (e) {\n rows.push({\n artifact: `mini:${app.appCode}`,\n status: 'invalid',\n file: '-',\n remote: (e as Error).message,\n });\n }\n }\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(\n formatObject({ rootDir, miniApps: rows }, { format: args.output }) + '\\n',\n );\n } else {\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspaceValidateCommand(args: WorkspaceDirArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const results = await Promise.all(\n miniApps.map(async (app) => ({ app, result: await validateMiniProject(app.dir) })),\n );\n writeWorkspaceValidateResult(results, args.output ?? 'table');\n process.exit(results.every((item) => item.result.valid) ? 0 : 1);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspacePushCommand(args: WorkspacePushArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const client = HcmClient.fromAuthContext(\n await getActiveAuthContextFromCli(args, { fallbackEnv: context.profile }),\n );\n const rawResult = await pushWorkspaceRawFiles({\n http: client.raw(),\n rootDir,\n context,\n dryRun: !!args.dryRun,\n });\n const results = [];\n for (const app of miniApps) {\n const result = await pushMiniAppProject({\n http: client.raw(),\n rootDir: app.dir,\n dryRun: !!args.dryRun,\n });\n results.push({ app, result });\n }\n writeWorkspacePushResult(rawResult, results, args.output ?? 'table');\n process.exit(\n rawResult.conflicts.length || results.some((item) => item.result.conflicts.length) ? 3 : 0,\n );\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport async function workspacePreviewCommand(args: WorkspacePreviewArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const frontend = args.frontend ?? process.env.HCM_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n const rows = [];\n for (const app of miniApps) {\n const targets = filterPreviewTargets(\n await buildMiniPreviewTargets(app.dir, frontend),\n args.surface ?? 'all',\n );\n rows.push(\n ...targets.map((item) => ({\n artifact: `mini:${app.appCode}`,\n surface: item.key,\n url: item.url,\n })),\n );\n }\n if (args.output === 'json' || args.output === 'yaml') {\n process.stdout.write(formatObject(rows, { format: args.output }) + '\\n');\n } else {\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n }\n process.exit(0);\n } catch (e) {\n exitWorkspaceError(e);\n }\n}\n\nexport async function workspaceVerifyCommand(args: WorkspaceVerifyArgs): Promise<void> {\n try {\n const rootDir = resolveRootDir(args.dir);\n const context = await requireWorkspaceContext(rootDir);\n const miniApps = await discoverMiniApps(rootDir);\n const frontend = args.frontend ?? process.env.HCM_FRONTEND_URL ?? DEFAULT_FRONTEND_URL;\n const authArgs: CommonAuthArgs = {\n ...args,\n env: args.env ?? args.profile ?? context.profile,\n };\n const client = await loadProfileClient(authArgs);\n const smokeAccessToken = args.smoke\n ? await loadSmokeAccessToken(client, authArgs)\n : null;\n const rawStatus = await getWorkspaceRawStatus(rootDir, context);\n let rawPlan: WorkspaceRawPushResult | null = null;\n let rawPlanSkipped: string | undefined;\n if (!client) {\n rawPlanSkipped = 'profile not configured';\n } else {\n try {\n rawPlan = await pushWorkspaceRawFiles({\n http: client.raw(),\n rootDir,\n context,\n dryRun: true,\n });\n } catch (planErr) {\n rawPlanSkipped = (planErr as Error).message ?? 'workspace raw dry-run failed';\n }\n }\n const reports: WorkspaceMiniVerifyItem[] = [];\n\n for (const app of miniApps) {\n const validation = await validateMiniProject(app.dir);\n const status = await readMiniStatusSafely(app);\n let plan: MiniVerifyReport['plan'] = null;\n let planSkipped: string | undefined;\n\n if (!validation.valid) {\n planSkipped = 'validation failed';\n } else if (!client) {\n planSkipped = 'profile not configured';\n } else {\n try {\n const pushResult = await pushMiniAppProject({\n http: client.raw(),\n rootDir: app.dir,\n dryRun: true,\n });\n plan = { operations: pushResult.operations, conflicts: pushResult.conflicts };\n } catch (planErr) {\n planSkipped = (planErr as Error).message ?? 'push dry-run failed';\n }\n }\n\n const previewTargets = await buildMiniPreviewTargets(app.dir, frontend).catch(\n () => [] as MiniPreviewTarget[],\n );\n const preview = filterPreviewTargets(previewTargets, args.surface ?? 'all');\n const smoke = args.smoke\n ? await runMiniSmokeChecks({\n rootDir: app.dir,\n frontendBaseUrl: frontend,\n previewTargets: preview,\n accessToken: smokeAccessToken,\n })\n : null;\n const ok = validation.valid && !!plan && plan.conflicts.length === 0 && (!smoke || smoke.ok);\n const report: MiniVerifyReport = {\n ok,\n validate: validation,\n status,\n plan,\n planSkipped,\n preview,\n smoke,\n };\n reports.push({\n appCode: app.appCode,\n dir: app.dir,\n report,\n agentReport: buildMiniVerifyAgentReport(report),\n });\n }\n\n writeWorkspaceVerifyResult(\n context,\n rootDir,\n { status: rawStatus, plan: rawPlan, planSkipped: rawPlanSkipped },\n reports,\n args.output ?? 'table',\n );\n const rawOk = !!rawPlan && rawPlan.conflicts.length === 0;\n process.exit(rawOk && reports.every((item) => item.report.ok) ? 0 : 1);\n } catch (e) {\n exitWorkspaceError(e, args.env ?? args.profile);\n }\n}\n\nexport function removedMiniCommand(): never {\n exitWithError(\n new Error(\n [\n 'hcm mini has been removed.',\n 'Use hcm workspace bind <workspaceKey>, hcm workspace add mini <appCode>, hcm workspace verify, and hcm workspace push.',\n ].join(' '),\n ),\n );\n}\n\nfunction resolveRootDir(dir?: string): string {\n return path.resolve(dir ?? '.');\n}\n\nfunction buildWorkspaceContext(args: {\n workspaceKey: string;\n tenantId?: string;\n endpoint?: string;\n profile?: string;\n}): WorkspaceContext {\n return {\n kind: WORKSPACE_CONTEXT_KIND,\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: normalizeWorkspaceKey(args.workspaceKey),\n tenantId: args.tenantId,\n endpoint: args.endpoint,\n profile: args.profile,\n updatedAt: new Date().toISOString(),\n };\n}\n\nasync function readWorkspaceContext(rootDir: string): Promise<WorkspaceContext | null> {\n try {\n const parsed = JSON.parse(\n await fs.readFile(path.join(rootDir, WORKSPACE_CONTEXT_FILE), 'utf-8'),\n ) as Record<string, unknown>;\n if (parsed.kind !== WORKSPACE_CONTEXT_KIND || parsed.version !== WORKSPACE_CONTEXT_VERSION) {\n throw new Error(`${WORKSPACE_CONTEXT_FILE} is not an HCM workspace context`);\n }\n return {\n kind: WORKSPACE_CONTEXT_KIND,\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: normalizeWorkspaceKey(stringRequired(parsed.workspaceKey, 'workspaceKey')),\n tenantId: stringOptional(parsed.tenantId),\n endpoint: stringOptional(parsed.endpoint),\n profile: stringOptional(parsed.profile),\n updatedAt: stringOptional(parsed.updatedAt) ?? new Date(0).toISOString(),\n };\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw e;\n }\n}\n\nasync function requireWorkspaceContext(rootDir: string): Promise<WorkspaceContext> {\n const context = await readWorkspaceContext(rootDir);\n if (!context) {\n throw new Error(\n `${WORKSPACE_CONTEXT_FILE} not found; run hcm workspace bind <workspaceKey> first`,\n );\n }\n return context;\n}\n\nasync function writeWorkspaceContext(rootDir: string, context: WorkspaceContext): Promise<void> {\n await fs.writeFile(\n path.join(rootDir, WORKSPACE_CONTEXT_FILE),\n JSON.stringify(context, null, 2) + '\\n',\n );\n}\n\nasync function writeTextFile(file: string, content: string, force: boolean): Promise<void> {\n try {\n await fs.access(file);\n if (!force) throw new Error(`${file} already exists; use --force to overwrite`);\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n }\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, content);\n}\n\nasync function readWorkspaceRawManifest(rootDir: string, context: WorkspaceContext): Promise<WorkspaceRawPullManifest> {\n try {\n const parsed = JSON.parse(\n await fs.readFile(path.join(rootDir, WORKSPACE_STATE_DIR, WORKSPACE_PULL_MANIFEST_FILE), 'utf-8'),\n ) as WorkspaceRawPullManifest;\n if (parsed.version !== WORKSPACE_CONTEXT_VERSION || parsed.workspaceKey !== context.workspaceKey) {\n throw new Error(`${WORKSPACE_PULL_MANIFEST_FILE} does not match workspace ${context.workspaceKey}`);\n }\n return parsed;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== 'ENOENT') throw e;\n return {\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: context.workspaceKey,\n profile: context.profile,\n pulledAt: new Date(0).toISOString(),\n files: [],\n };\n }\n}\n\nasync function writeWorkspaceRawState(\n rootDir: string,\n context: WorkspaceContext,\n files: WorkspaceRawLocalFile[],\n remoteByLocalPath: Map<string, WorkspaceFileItem>,\n): Promise<void> {\n const stateDir = path.join(rootDir, WORKSPACE_STATE_DIR);\n await fs.mkdir(stateDir, { recursive: true });\n const snapshots = files.map((file): WorkspaceRawFileSnapshot => ({\n localPath: file.localPath,\n remotePath: file.localPath,\n fileId: remoteByLocalPath.get(file.localPath)?.id,\n sha256: file.sha256,\n size: file.size,\n lastModified: remoteByLocalPath.get(file.localPath)?.lastModified,\n }));\n await fs.writeFile(\n path.join(stateDir, WORKSPACE_PULL_MANIFEST_FILE),\n JSON.stringify(\n {\n version: WORKSPACE_CONTEXT_VERSION,\n workspaceKey: context.workspaceKey,\n profile: context.profile,\n pulledAt: new Date().toISOString(),\n files: snapshots,\n } satisfies WorkspaceRawPullManifest,\n null,\n 2,\n ) + '\\n',\n 'utf-8',\n );\n}\n\nasync function readWorkspaceRawLocalFiles(rootDir: string): Promise<WorkspaceRawLocalFile[]> {\n const files: WorkspaceRawLocalFile[] = [];\n await walkWorkspaceRawFiles(rootDir, '', files);\n files.sort((a, b) => a.localPath.localeCompare(b.localPath));\n return files;\n}\n\nasync function walkWorkspaceRawFiles(\n rootDir: string,\n relativeDir: string,\n files: WorkspaceRawLocalFile[],\n): Promise<void> {\n const absoluteDir = path.join(rootDir, relativeDir);\n let entries;\n try {\n entries = await fs.readdir(absoluteDir, { withFileTypes: true });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw e;\n }\n for (const entry of entries) {\n if (entry.isDirectory() && RAW_WORKSPACE_EXCLUDED_DIRS.has(entry.name)) continue;\n if (entry.isFile() && RAW_WORKSPACE_EXCLUDED_FILES.has(entry.name)) continue;\n const localPath = normalizeRelativePath(path.posix.join(toPosix(relativeDir), entry.name));\n const absolutePath = path.join(rootDir, localPath);\n if (entry.isDirectory()) {\n await walkWorkspaceRawFiles(rootDir, localPath, files);\n continue;\n }\n if (!entry.isFile()) continue;\n const content = await fs.readFile(absolutePath, 'utf-8');\n files.push({\n localPath,\n absolutePath,\n content,\n sha256: sha256(content),\n size: Buffer.byteLength(content, 'utf-8'),\n });\n }\n}\n\nasync function getWorkspaceRawStatus(\n rootDir: string,\n context: WorkspaceContext,\n): Promise<MiniStatusEntry[]> {\n const manifest = await readWorkspaceRawManifest(rootDir, context);\n return computeWorkspaceRawStatus(manifest, await readWorkspaceRawLocalFiles(rootDir));\n}\n\nasync function pushWorkspaceRawFiles(args: {\n http: ReturnType<HcmClient['raw']>;\n rootDir: string;\n context: WorkspaceContext;\n dryRun: boolean;\n}): Promise<WorkspaceRawPushResult> {\n const manifest = await readWorkspaceRawManifest(args.rootDir, args.context);\n const localFiles = await readWorkspaceRawLocalFiles(args.rootDir);\n const remoteFiles = await loadWorkspaceRawRemoteFiles(args.http, args.context.workspaceKey);\n const plan = buildWorkspaceRawPushPlan(manifest, localFiles, remoteFiles);\n const result: WorkspaceRawPushResult = {\n workspaceKey: args.context.workspaceKey,\n dryRun: args.dryRun,\n operations: plan.operations,\n conflicts: plan.conflicts,\n };\n if (args.dryRun || plan.conflicts.length) return result;\n\n const localByPath = new Map(localFiles.map((file) => [file.localPath, file] as const));\n for (const operation of plan.operations) {\n if (operation.operation === 'skip') continue;\n if (operation.operation === 'delete') {\n if (operation.fileId) await deleteWorkspaceFile(args.http, operation.fileId);\n continue;\n }\n const localFile = localByPath.get(operation.localPath);\n if (!localFile) continue;\n if (operation.operation === 'create') {\n await createWorkspaceFile(\n args.http,\n args.context.workspaceKey,\n operation.remotePath,\n localFile.content,\n );\n continue;\n }\n if (operation.operation === 'update' && operation.fileId) {\n await saveWorkspaceFileContent(args.http, operation.fileId, localFile.content);\n }\n }\n\n const latestRemoteFiles = await loadWorkspaceRawRemoteFiles(args.http, args.context.workspaceKey);\n const latestRemoteByLocalPath = new Map(latestRemoteFiles.map((file) => [file.item.relativePath, file.item] as const));\n await writeWorkspaceRawState(args.rootDir, args.context, localFiles, latestRemoteByLocalPath);\n return result;\n}\n\nasync function loadWorkspaceRawRemoteFiles(\n http: ReturnType<HcmClient['raw']>,\n workspaceKey: string,\n): Promise<Array<{ item: WorkspaceFileItem; content: string }>> {\n const list = await listWorkspaceFiles(http, workspaceKey, { pageSize: 5000 });\n const result: Array<{ item: WorkspaceFileItem; content: string }> = [];\n for (const item of list.data) {\n if (isDirectoryMarker(item.relativePath) || isMiniAppPath(item.relativePath)) continue;\n const content = await loadWorkspaceFileContent(http, item.id);\n result.push({ item, content: content.content });\n }\n return result;\n}\n\nfunction buildWorkspaceRawPushPlan(\n manifest: WorkspaceRawPullManifest,\n localFiles: WorkspaceRawLocalFile[],\n remoteFiles: Array<{ item: WorkspaceFileItem; content: string }>,\n): { operations: MiniPushPlanItem[]; conflicts: MiniPushConflict[] } {\n const status = computeWorkspaceRawStatus(manifest, localFiles);\n const baseByLocal = new Map(manifest.files.map((file) => [file.localPath, file] as const));\n const remoteByLocal = new Map(remoteFiles.map((file) => [file.item.relativePath, file] as const));\n const operations: MiniPushPlanItem[] = [];\n const conflicts: MiniPushConflict[] = [];\n for (const entry of status) {\n const remote = remoteByLocal.get(entry.localPath);\n const base = baseByLocal.get(entry.localPath);\n const remoteSha = remote ? sha256(remote.content) : undefined;\n if (entry.status === 'added') {\n if (remote) {\n conflicts.push(workspaceRawConflict(entry, 'remote file already exists but was not in local snapshot'));\n } else {\n operations.push({ operation: 'create', localPath: entry.localPath, remotePath: entry.remotePath });\n }\n continue;\n }\n if (entry.status === 'modified') {\n if (!remote) {\n conflicts.push(workspaceRawConflict(entry, 'remote file was deleted after last pull'));\n } else if (base && remoteSha !== base.sha256) {\n conflicts.push(workspaceRawConflict(entry, 'remote file changed after last pull'));\n } else {\n operations.push({\n operation: 'update',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote.item.id,\n });\n }\n continue;\n }\n if (entry.status === 'deleted') {\n if (!remote) {\n operations.push({\n operation: 'skip',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n reason: 'already deleted remotely',\n });\n } else if (base && remoteSha !== base.sha256) {\n conflicts.push(workspaceRawConflict(entry, 'remote file changed after last pull'));\n } else {\n operations.push({\n operation: 'delete',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote.item.id,\n });\n }\n continue;\n }\n operations.push({\n operation: 'skip',\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n fileId: remote?.item.id,\n reason: 'unchanged',\n });\n }\n return { operations, conflicts };\n}\n\nfunction computeWorkspaceRawStatus(\n manifest: WorkspaceRawPullManifest,\n localFiles: WorkspaceRawLocalFile[],\n): MiniStatusEntry[] {\n const baseByLocal = new Map(manifest.files.map((file) => [file.localPath, file] as const));\n const localByPath = new Map(localFiles.map((file) => [file.localPath, file] as const));\n const paths = [...new Set([...baseByLocal.keys(), ...localByPath.keys()])].sort();\n return paths.map((localPath) => {\n const base = baseByLocal.get(localPath);\n const local = localByPath.get(localPath);\n const remotePath = base?.remotePath ?? localPath;\n if (!base && local) {\n return { localPath, remotePath, status: 'added', sha256: local.sha256 };\n }\n if (base && !local) {\n return {\n localPath,\n remotePath,\n status: 'deleted',\n fileId: base.fileId,\n baseSha256: base.sha256,\n };\n }\n if (base && local && base.sha256 !== local.sha256) {\n return {\n localPath,\n remotePath,\n status: 'modified',\n fileId: base.fileId,\n sha256: local.sha256,\n baseSha256: base.sha256,\n };\n }\n return {\n localPath,\n remotePath,\n status: 'unchanged',\n fileId: base?.fileId,\n sha256: local?.sha256,\n baseSha256: base?.sha256,\n };\n });\n}\n\nfunction workspaceRawConflict(entry: MiniStatusEntry, reason: string): MiniPushConflict {\n return {\n localPath: entry.localPath,\n remotePath: entry.remotePath,\n reason,\n };\n}\n\nasync function discoverMiniApps(rootDir: string): Promise<MiniAppDir[]> {\n const appsRoot = path.join(rootDir, MINI_APPS_DIR);\n let entries;\n try {\n entries = await fs.readdir(appsRoot, { withFileTypes: true });\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw e;\n }\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({ appCode: entry.name, dir: path.join(appsRoot, entry.name) }))\n .sort((a, b) => a.appCode.localeCompare(b.appCode));\n}\n\nfunction detectRemoteMiniApps(files: WorkspaceFileItem[]): string[] {\n const appCodes = new Set<string>();\n for (const file of files) {\n const match = /^mini_apps\\/([^/]+)\\//.exec(file.relativePath);\n if (match?.[1]) appCodes.add(match[1]);\n }\n return Array.from(appCodes).sort();\n}\n\nfunction isMiniAppPath(relativePath: string): boolean {\n return relativePath === MINI_APPS_DIR || relativePath.startsWith(`${MINI_APPS_DIR}/`);\n}\n\nfunction isDirectoryMarker(relativePath: string): boolean {\n return relativePath.endsWith('/');\n}\n\nasync function readMiniStatusSafely(app: MiniAppDir) {\n try {\n return await getMiniStatus(app.dir);\n } catch {\n return [];\n }\n}\n\n/**\n * Tolerant variant of `getActiveAuthContextFromCli` + `HcmClient.fromAuthContext`:\n * returns `null` (instead of throwing) when no env/identity is configured,\n * so workspace bind / add mini / verify can still run partially without auth.\n *\n * If the caller explicitly passed an env (`--env` or legacy `--profile`) and\n * resolution fails, we still throw — the user asked for that env, so silent\n * fallback would be wrong.\n */\nasync function loadProfileClient(\n args: CommonAuthArgs,\n): Promise<HcmClient | null> {\n try {\n const ctx = await getActiveAuthContextFromCli(args);\n return HcmClient.fromAuthContext(ctx);\n } catch (e) {\n if (args.env || args.profile) throw e;\n return null;\n }\n}\n\nasync function loadSmokeAccessToken(\n client: HcmClient | null,\n args: CommonAuthArgs,\n): Promise<string | null> {\n try {\n const smokeClient = client ?? (await loadProfileClient(args));\n return smokeClient ? smokeClient.getAccessToken() : null;\n } catch {\n return null;\n }\n}\n\nasync function resolveWritableAutoOptions(args: {\n client: HcmClient | null;\n templateKind: MiniTemplateKind;\n model?: string;\n fields?: string;\n defaults?: string;\n}): Promise<{\n fields?: string[];\n defaults?: Record<string, unknown>;\n todayDefaultFields?: string[];\n}> {\n if (args.templateKind !== 'writable-workbench') return {};\n const explicitAutoFields = isAuto(args.fields);\n const explicitAutoDefaults = isAuto(args.defaults);\n const shouldInferFields = explicitAutoFields || (!!args.model && args.fields === undefined);\n const shouldInferDefaults = explicitAutoDefaults || (!!args.model && args.defaults === undefined);\n if (!shouldInferFields && !shouldInferDefaults) return {};\n if (!args.client) {\n if (explicitAutoFields || explicitAutoDefaults) {\n throw new Error('--fields auto and --defaults auto require a configured HCM profile');\n }\n return {};\n }\n const model = args.model ?? 'OrgUnit';\n const inferred = inferMiniWritableTemplateOptionsFromModel(await args.client.describe(model));\n return {\n fields: shouldInferFields ? inferred.fields : undefined,\n defaults: shouldInferDefaults ? inferred.defaults : undefined,\n todayDefaultFields: shouldInferDefaults ? inferred.todayDefaultFields : undefined,\n };\n}\n\nfunction parseTemplateKind(value?: string): MiniTemplateKind {\n const templateKind = (value || 'dashboard').trim();\n if (templateKind !== 'dashboard' && templateKind !== 'multi-page' && templateKind !== 'writable-workbench') {\n throw new Error(`unsupported mini template: ${value}`);\n }\n return templateKind;\n}\n\nfunction parseSurface(value: string | undefined): MiniSurface {\n if (!value) return 'embedded';\n if (value === 'embedded' || value === 'standalone') return value;\n throw new Error('--surface must be embedded or standalone');\n}\n\nfunction parseScopes(value: string | undefined): string[] | undefined {\n return parseCsv(value);\n}\n\nfunction parseCsv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n if (isAuto(value)) return undefined;\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction parseModelKey(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const model = value.trim();\n if (!/^[A-Z][A-Za-z0-9]*$/.test(model)) {\n throw new Error('--model must be a Model key, for example OrgUnit');\n }\n return model;\n}\n\nfunction parseJsonObject(\n value: string | undefined,\n flagName: string,\n): Record<string, unknown> | undefined {\n if (!value) return undefined;\n if (isAuto(value)) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(value);\n } catch {\n throw new Error(`${flagName} must be valid JSON object`);\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`${flagName} must be valid JSON object`);\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction validateWritableOptions(templateKind: MiniTemplateKind, args: WorkspaceAddMiniArgs): void {\n if (templateKind === 'writable-workbench') return;\n if (templateKind === 'multi-page') {\n if (args.fields || args.defaults) {\n throw new Error('--fields and --defaults are only supported with --template writable-workbench');\n }\n return;\n }\n if (args.model || args.fields || args.defaults) {\n throw new Error(\n '--model is only supported with --template multi-page or writable-workbench; --fields and --defaults are only supported with --template writable-workbench',\n );\n }\n}\n\nfunction isAuto(value: string | undefined): boolean {\n return value?.trim().toLowerCase() === 'auto';\n}\n\nfunction parsePositiveInt(value: string | number | undefined, fallback: number, flag: string): number {\n if (value === undefined || value === null || value === '') return fallback;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${flag} must be a positive integer`);\n }\n return parsed;\n}\n\nfunction filterPreviewTargets(targets: MiniPreviewTarget[], surface: string): MiniPreviewTarget[] {\n if (surface === 'all') return targets;\n if (surface === 'bare' || surface === 'standalone' || surface === 'embedded') {\n return targets.filter((item) => item.key === surface);\n }\n throw new Error('--surface must be all, bare, standalone or embedded');\n}\n\nfunction normalizeWorkspaceKey(value: string): string {\n const key = value.trim();\n if (!key) throw new Error('workspaceKey is required');\n return key;\n}\n\nfunction normalizeRelativePath(value: string): string {\n const normalized = toPosix(value).replace(/^\\/+/, '').replace(/\\/+/g, '/');\n if (!normalized || normalized === '.' || normalized.includes('\\0')) {\n throw new Error('path is empty');\n }\n for (const segment of normalized.split('/')) {\n if (!segment || segment === '.' || segment === '..') {\n throw new Error(`unsafe path segment: ${segment}`);\n }\n }\n return normalized;\n}\n\nfunction toPosix(value: string): string {\n return value.split(path.sep).join('/');\n}\n\nfunction sha256(content: string): string {\n return crypto.createHash('sha256').update(content, 'utf-8').digest('hex');\n}\n\nfunction stringRequired(value: unknown, field: string): string {\n if (typeof value === 'string' && value.trim()) return value;\n throw new Error(`${field} is required`);\n}\n\nfunction stringOptional(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value : undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\nfunction unwrapData(value: unknown): unknown {\n if (value && typeof value === 'object' && 'data' in value) {\n return (value as { data?: unknown }).data;\n }\n return value;\n}\n\nfunction optionalText(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const text = String(value).trim();\n return text || undefined;\n}\n\nfunction writeWorkspaceListResult(\n rows: TenantExtensionWorkspaceRow[],\n format: OutputFormat,\n total?: number,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ rows, total }, { format }) + '\\n');\n return;\n }\n process.stdout.write(formatRows(toWorkspaceListRows(rows), { format: 'table' }) + '\\n');\n if (total !== undefined) {\n process.stdout.write(`Showing ${rows.length} of ${total} workspaces.\\n`);\n }\n}\n\nfunction writeWorkspaceActiveResult(view: WorkspaceActiveView, format: OutputFormat): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(view, { format }) + '\\n');\n return;\n }\n const rows = [\n {\n activeWorkspaceKey: view.activeWorkspaceKey ?? '-',\n localWorkspaceKey: view.localWorkspaceKey ?? '-',\n matchesLocal:\n view.matchesLocal === null ? '-' : view.matchesLocal ? 'yes' : 'no',\n profile: view.profile,\n tenant: view.tenantId,\n endpoint: view.endpoint,\n dir: view.rootDir,\n },\n ];\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n}\n\nfunction writeWorkspaceBindResult(\n context: WorkspaceContext,\n rootDir: string,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ ...context, rootDir }, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace bound: ${context.workspaceKey}`,\n `directory: ${rootDir}`,\n `profile: ${context.profile ?? '-'}`,\n `tenant: ${context.tenantId ?? '-'}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspaceCreateResult(\n result: {\n workspaceKey: string;\n id: string;\n rootDir: string;\n activated: boolean;\n profile: string;\n tenantId: string;\n },\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(result, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace created: ${result.workspaceKey}`,\n `id: ${result.id}`,\n `directory: ${result.rootDir}`,\n `profile: ${result.profile}`,\n `tenant: ${result.tenantId}`,\n `activated: ${result.activated ? 'yes' : 'no'}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspacePullResult(\n result: {\n workspaceKey: string;\n rootDir: string;\n totalRemoteFiles: number;\n miniApps: Array<{ appCode: string; files: number }>;\n rawFiles: string[];\n },\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject(result, { format }) + '\\n');\n return;\n }\n const lines = [\n `workspace pulled: ${result.workspaceKey}`,\n `directory: ${result.rootDir}`,\n `remote files: ${result.totalRemoteFiles}`,\n `mini apps: ${result.miniApps.length}`,\n `raw files: ${result.rawFiles.length}`,\n ];\n if (result.miniApps.length) {\n lines.push('mini artifacts:');\n for (const app of result.miniApps) lines.push(` - ${app.appCode}: ${app.files} files`);\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nfunction writeWorkspaceAddMiniResult(\n result: { appCode: string; workspaceKey: string; targetDir: string; files: unknown[] },\n rootDir: string,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(formatObject({ ...result, workspaceRoot: rootDir }, { format }) + '\\n');\n return;\n }\n process.stdout.write(\n [\n `workspace artifact added: mini:${result.appCode}`,\n `workspace: ${result.workspaceKey}`,\n `workspace root: ${rootDir}`,\n `directory: ${result.targetDir}`,\n `files: ${result.files.length}`,\n ].join('\\n') + '\\n',\n );\n}\n\nfunction writeWorkspaceValidateResult(\n results: Array<{ app: MiniAppDir; result: MiniValidationResult }>,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n results.map((item) => ({ artifact: `mini:${item.app.appCode}`, ...item.result })),\n { format },\n ) + '\\n',\n );\n return;\n }\n const rows = results.map((item) => ({\n artifact: `mini:${item.app.appCode}`,\n valid: item.result.valid ? 'yes' : 'no',\n errors: item.result.errors.length,\n warnings: item.result.warnings.length,\n }));\n process.stdout.write(formatRows(rows, { format: 'table' }) + '\\n');\n for (const item of results) {\n if (!item.result.errors.length && !item.result.warnings.length) continue;\n process.stdout.write(`\\nmini:${item.app.appCode}\\n`);\n for (const error of item.result.errors) process.stdout.write(` error: ${error}\\n`);\n for (const warning of item.result.warnings) process.stdout.write(` warning: ${warning}\\n`);\n }\n}\n\nfunction writeWorkspacePushResult(\n rawResult: WorkspaceRawPushResult,\n results: Array<{ app: MiniAppDir; result: MiniPushResult }>,\n format: OutputFormat,\n): void {\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n {\n workspaceFiles: { artifact: 'workspace', ...rawResult },\n miniApps: results.map((item) => ({ artifact: `mini:${item.app.appCode}`, ...item.result })),\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n const rawConflicts = rawResult.conflicts.map((conflict) => ({\n artifact: 'workspace',\n file: conflict.localPath,\n remote: conflict.remotePath,\n reason: conflict.reason,\n }));\n const miniConflicts = results.flatMap((item) =>\n item.result.conflicts.map((conflict) => ({\n artifact: `mini:${item.app.appCode}`,\n file: conflict.localPath,\n remote: conflict.remotePath,\n reason: conflict.reason,\n })),\n );\n const conflicts = [...rawConflicts, ...miniConflicts];\n if (conflicts.length) {\n process.stdout.write('conflicts:\\n' + formatRows(conflicts, { format: 'table' }) + '\\n');\n return;\n }\n const rawOperations = rawResult.operations.map((operation) => ({\n artifact: 'workspace',\n op: operation.operation,\n file: operation.localPath,\n remote: operation.remotePath,\n reason: operation.reason ?? '',\n }));\n const miniOperations = results.flatMap((item) =>\n item.result.operations.map((operation) => ({\n artifact: `mini:${item.app.appCode}`,\n op: operation.operation,\n file: operation.localPath,\n remote: operation.remotePath,\n reason: operation.reason ?? '',\n })),\n );\n const operations = [...rawOperations, ...miniOperations];\n process.stdout.write(formatRows(operations, { format: 'table' }) + '\\n');\n if (rawResult.dryRun || results.some((item) => item.result.dryRun)) {\n process.stdout.write('dry-run: no remote changes were written\\n');\n }\n}\n\nfunction writeWorkspaceVerifyResult(\n context: WorkspaceContext,\n rootDir: string,\n raw: {\n status: MiniStatusEntry[];\n plan: WorkspaceRawPushResult | null;\n planSkipped?: string;\n },\n reports: WorkspaceMiniVerifyItem[],\n format: OutputFormat,\n): void {\n const rawOk = !!raw.plan && raw.plan.conflicts.length === 0;\n const ok = rawOk && reports.every((item) => item.report.ok);\n if (format === 'json') {\n process.stdout.write(\n formatObject(\n {\n ok,\n workspaceKey: context.workspaceKey,\n rootDir,\n workspaceFiles: {\n ok: rawOk,\n status: summarizeStatus(raw.status),\n plan: raw.plan\n ? {\n operations: raw.plan.operations,\n conflicts: raw.plan.conflicts,\n }\n : null,\n planSkipped: raw.planSkipped,\n },\n miniApps: reports.map((item) => ({\n appCode: item.appCode,\n dir: item.dir,\n ...item.agentReport,\n })),\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n if (format !== 'table') {\n process.stdout.write(\n formatObject(\n {\n ok,\n workspaceKey: context.workspaceKey,\n rootDir,\n workspaceFiles: raw,\n miniApps: reports,\n },\n { format },\n ) + '\\n',\n );\n return;\n }\n const lines = [\n `workspace verify: ${ok ? 'OK' : 'FAIL'}`,\n `workspace: ${context.workspaceKey}`,\n `directory: ${rootDir}`,\n `workspace files: ${raw.status.length}`,\n `mini apps: ${reports.length}`,\n ];\n lines.push('', 'workspace files');\n if (raw.planSkipped) {\n lines.push(` dry-run skipped: ${raw.planSkipped}`);\n } else if (raw.plan) {\n lines.push(\n ` status: ${formatStatusSummary(summarizeStatus(raw.status))}`,\n ` dry-run: ${raw.plan.conflicts.length ? 'CONFLICT' : 'OK'} (${raw.plan.operations.length} operations)`,\n );\n for (const conflict of raw.plan.conflicts) {\n lines.push(` conflict: ${conflict.localPath} -> ${conflict.reason}`);\n }\n }\n for (const item of reports) {\n lines.push('', `mini:${item.appCode}`, formatMiniVerifyReport(item.report));\n }\n process.stdout.write(lines.join('\\n') + '\\n');\n}\n\nfunction summarizeStatus(status: MiniStatusEntry[]): Record<MiniStatusEntry['status'], number> {\n return status.reduce(\n (acc, item) => {\n acc[item.status] += 1;\n return acc;\n },\n { added: 0, modified: 0, deleted: 0, unchanged: 0 },\n );\n}\n\nfunction formatStatusSummary(summary: Record<MiniStatusEntry['status'], number>): string {\n return `added=${summary.added}, modified=${summary.modified}, deleted=${summary.deleted}, unchanged=${summary.unchanged}`;\n}\n\nfunction exitWorkspaceError(err: unknown, profile?: string): never {\n const maybeAxios = err as { isAxiosError?: boolean };\n if (maybeAxios?.isAxiosError) {\n exitWithError(fromAxiosError(err, profile));\n }\n exitWithError(err);\n}\n","export interface TenantExtensionWorkspaceRow {\n workspaceKey?: unknown;\n description?: unknown;\n ownerUserName?: unknown;\n sharedUsers?: unknown;\n filesCount?: unknown;\n myLockCount?: unknown;\n devModeEnabled?: unknown;\n updateTime?: unknown;\n}\n\nexport interface WorkspaceListRow {\n [key: string]: unknown;\n current: string;\n workspaceKey: string;\n description: string;\n owner: string;\n files: string;\n locks: string;\n updatedAt: string;\n}\n\nexport function toWorkspaceListRows(rows: TenantExtensionWorkspaceRow[]): WorkspaceListRow[] {\n return rows.map((row) => ({\n current: boolValue(row.devModeEnabled) ? '*' : '',\n workspaceKey: stringValue(row.workspaceKey) ?? '-',\n description: stringValue(row.description) ?? '',\n owner: stringValue(row.ownerUserName) ?? '-',\n files: numberValue(row.filesCount),\n locks: numberValue(row.myLockCount),\n updatedAt: stringValue(row.updateTime) ?? '-',\n }));\n}\n\nfunction stringValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n const text = String(value).trim();\n return text || undefined;\n}\n\nfunction numberValue(value: unknown): string {\n if (typeof value === 'number') return String(value);\n if (typeof value === 'string' && value.trim()) return value.trim();\n return '0';\n}\n\nfunction boolValue(value: unknown): boolean {\n return value === true || value === 'true';\n}\n","import {\n loadEnv,\n saveEnv,\n loadIdentity,\n listIdentities,\n deleteIdentity,\n loadGlobalConfig,\n TokenStore,\n CliError,\n CliErrorCode,\n} from '@hcmai/sdk';\nimport { exitOk, exitWithError } from '../utils/exit';\n\nexport async function identityList(args: { env?: string }): Promise<void> {\n try {\n const g = await loadGlobalConfig();\n const filter = args.env === 'all' ? undefined : (args.env ?? g.activeEnv);\n const names = await listIdentities(filter);\n if (names.length === 0) {\n exitOk('(no identities)');\n return;\n }\n const lines: string[] = [];\n for (const n of names) {\n const meta = await loadIdentity(n);\n const env = await loadEnv(meta.env).catch(() => null);\n const isDefault = env?.defaultIdentity === n ? '*' : ' ';\n const expired = meta.expiresAt && new Date(meta.expiresAt) < new Date() ? ' (expired)' : '';\n lines.push(`${isDefault} ${n} scheme=${meta.scheme} env=${meta.env}${expired}`);\n }\n exitOk(lines.join('\\n'));\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function identityUse(name: string): Promise<void> {\n try {\n const meta = await loadIdentity(name); // throws IDENTITY_NOT_FOUND on missing\n // Orphan identity: env was deleted but identity meta lingered. Remap\n // ENV_NOT_FOUND → IDENTITY_NOT_IN_ENV so the error code matches the user's\n // mental model (\"I'm using `identity use`, not `env use`\").\n const env = await loadEnv(meta.env).catch(() => {\n throw new CliError({\n code: CliErrorCode.IDENTITY_NOT_IN_ENV,\n message: `identity '${name}' references env '${meta.env}' which no longer exists. Re-create the env, or remove this orphan: hcm identity remove ${name}`,\n });\n });\n env.defaultIdentity = name;\n await saveEnv(meta.env, env);\n exitOk(`✅ default identity for env '${meta.env}': ${name}`);\n } catch (e) {\n exitWithError(e);\n }\n}\n\nexport async function identityRemove(name: string): Promise<void> {\n try {\n const meta = await loadIdentity(name);\n try {\n await TokenStore.forIdentity(name).clear();\n } catch (err) {\n process.stderr.write(\n `[hcm] event=identity_cleanup_failed identity=${name} reason=${JSON.stringify(String((err as Error).message))}\\n`,\n );\n }\n await deleteIdentity(name);\n // if this was the env's default, clear it\n const env = await loadEnv(meta.env).catch(() => null);\n if (env?.defaultIdentity === name) {\n env.defaultIdentity = undefined;\n await saveEnv(meta.env, env);\n }\n exitOk(`✅ identity '${name}' removed`);\n } catch (e) {\n exitWithError(e);\n }\n}\n"],"mappings":"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","names":["axios","loadGlobalConfig","loadEnv","loadIdentity","listEnvs","CliError","CliErrorCode","path","meta","marked","markedTerminal","absoluteDownloadUrl","Box","Text","jsx","jsxs","lines","row","col","useEffect","useRef","useState","fs","Box","Text","useInput","marked","jsx","jsxs","meta","identity","path","React","HcmClient","DEFAULT_AGENT_ID","client","ans","readline","resolve","CliError","resolve","CliError","env","endpoint","fromAxiosError","meta","loadGlobalConfig","saveGlobalConfig","CliError","CliErrorCode","axios","loadEnv","saveEnv","loadGlobalConfig","saveGlobalConfig","loadIdentity","TokenStore","CliError","CliErrorCode","loadGlobalConfig","loadEnv","CliError","CliErrorCode","saveEnv","saveGlobalConfig","axios","loadIdentity","TokenStore","CliError","CliErrorCode","loadGlobalConfig","saveGlobalConfig","CliError","CliErrorCode","client","HcmClient","fromAxiosError","CliError","CliErrorCode","client","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","HcmClient","formatObject","formatRows","fromAxiosError","CliError","CliErrorCode","HcmClient","fromAxiosError","formatRows","formatObject","CliError","CliErrorCode","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","env","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","readFileSync","HcmClient","formatObject","fromAxiosError","path","client","HcmClient","formatObject","fromAxiosError","client","HcmClient","WsClient","sendMessageAndStream","createConversation","DEFAULT_AGENT_ID","saveConversationState","formatObject","formatRows","fetchConversationTimeline","CliError","CliErrorCode","parseInteractionRequest","parseInteractionResolved","buildConfirm","buildReject","buildAnswer","chalk","fs","fail","client","runInkRepl","StreamPresenter","TerminalRenderer","buildResumeSummary","uploadDocument","meta","extractInlineFilePaths","resolveInteraction","resolve","readLineFromStdin","r","HcmClient","client","HcmClient","formatObject","formatRows","fromAxiosError","parsePositiveInt","client","HcmClient","formatObject","fromAxiosError","client","fail","HcmClient","formatObject","fromAxiosError","uploadDocument","client","meta","os","path","createHttpClient","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","env","fail","manifest","createHttpClient","formatObject","fromAxiosError","loadEnv","loadGlobalConfig","resolveActiveEnv","CliError","CliErrorCode","CliError","CliErrorCode","resolveEndpoint","loadGlobalConfig","resolveActiveEnv","env","loadEnv","createHttpClient","formatObject","fromAxiosError","fsp","HcmClient","formatObject","fromAxiosError","CliError","CliErrorCode","client","HcmClient","fail","fromAxiosError","formatObject","path","CliError","CliErrorCode","resolve","fsp","fs","path","formatObject","formatRows","HcmClient","fromAxiosError","client","HcmClient","parsePositiveInt","formatObject","formatRows","manifest","fromAxiosError","loadEnv","saveEnv","loadIdentity","listIdentities","deleteIdentity","loadGlobalConfig","TokenStore","CliError","CliErrorCode","meta","env"]}