@acosmi/sdk-ts 2.19.1 → 2.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/models/types.ts","../../src/shared/errors.ts","../../src/models/betas.ts","../../src/models/adapters/anthropic.ts","../../src/models/adapters/openai.ts","../../src/models/adapters/index.ts","../../src/core/credentials.ts","../../src/core/client.ts","../../src/auth/types.ts","../../src/shared/api-response.ts","../../src/auth/auth.ts","../../src/core/store.ts","../../src/core/retry.ts","../../src/models/stream-meta.ts","../../src/models/enduser.ts","../../src/core/http.ts","../../src/sanitize/index.ts","../../src/sanitize/types.ts","../../src/sanitize/config.ts","../../src/sanitize/history.ts","../../src/sanitize/defensive.ts","../../src/core/sanitize-bridge.ts","../../src/shared/index.ts","../../src/shared/operation.ts","../../src/shared/retry-advice.ts","../../src/auth/scopes.ts","../../src/models/index.ts","../../src/models/wire-anthropic.ts","../../src/models/model-helpers.ts","../../src/billing/entitlements.ts","../../src/billing/packages.ts","../../src/billing/wallet.ts","../../src/skills/skills.ts","../../src/skills/tools.ts","../../src/notifications/types.ts","../../src/notifications/notifications.ts","../../src/notifications/ws.ts","../../src/agent-runs/types.ts","../../src/agent-runs/remote-control.ts","../../src/agent-runs/client.ts","../../src/agent-runs/byok.ts","../../src/compliance/scopes.ts","../../src/compliance/status.ts","../../src/compliance/errors.ts","../../src/compliance/client.ts","../../src/support/bug-report.ts","../../src/subscription/client.ts","../../src/pricing/client.ts","../../src/products/types.ts","../../src/products/client.ts","../../src/casehall/client.ts","../../src/enterprise/client.ts","../../src/finance/client.ts","../../src/chatbridge/types.ts","../../src/chatbridge/client.ts"],"names":["BucketClassCommercial","ThinkingOff","ServerToolTypeWebSearch","BucketClassGeneric","ThinkingHigh","ThinkingMax","ThinkingHighMinMaxTokens","ThinkingMaxFallbackMaxTokens","HTTPError","RateLimitError","BusinessError","OrderTerminalError","ModelNotFoundError","NetworkError","StreamError","AnthropicAdapter","OpenAIAdapter","events","ProviderFormat","body","parseOpenAIResponseToAnthropic","isPlainObject","abort","sleepWithSignal","frame","event","sleep"],"mappings":"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","file":"index.cjs","sourcesContent":["// models/types.ts — 模型网关域类型。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0, 1275 行)\n//\n// 命名约定:\n// - 字段名 = Go json tag 字面量 (wire format), 不做 camelCase 重映射\n// - mix 风格 (modelId / max_tokens / supports_thinking) 是历史 wire 设计的真实样貌\n// - 这样 JSON.parse / JSON.stringify 可直接来回, 与 Go 侧 0 偏差\n//\n// int64 字段用 number — JS number 安全上限 2^53, Acosmi 业务量级远低于此。\n// time.Time 字段用 ISO 8601 string 形态, 与 Go json wire 一致。\n// json.RawMessage 用 unknown (caller 自行 typed)。\n// json.Number 用 string (避免精度丢失)。\n\n// =============================================================================\n// Managed Models\n// =============================================================================\n\n/** 模型能力矩阵 — 下游通过此结构决定 UI 功能开关和 Beta Header 注入 */\nexport interface ModelCapabilities {\n // 思考能力\n supports_thinking: boolean;\n supports_adaptive_thinking: boolean;\n /** 交错思考 (Interleaved Thinking) */\n supports_isp: boolean;\n\n // 工具与搜索\n supports_web_search: boolean;\n supports_tool_search: boolean;\n supports_structured_output: boolean;\n\n // 推理控制\n supports_effort: boolean;\n /** 模型是否支持 thinking_level=\"max\" 强度档 (深度思考) */\n supports_max_effort: boolean;\n /** Opus 4.6 独有 (Speed=\"fast\") */\n supports_fast_mode: boolean;\n /** Auto 模式 (模型自主选择工具/搜索策略) */\n supports_auto_mode: boolean;\n\n // 上下文与缓存\n supports_1m_context: boolean;\n supports_prompt_cache: boolean;\n /** 通过 context-management beta 控制 */\n supports_cache_editing: boolean;\n\n // 输出控制\n /** Claude 4 内置 */\n supports_token_efficient: boolean;\n supports_redact_thinking: boolean;\n\n // Token 上限 (冗余但便于查询)\n max_input_tokens: number;\n max_output_tokens: number;\n\n /**\n * 桌面视觉理解 sidecar 能力 (v1.2+):\n * 为 true 表示该模型适合作为桌面截图解析 sidecar — 输入 screenshot,\n * 输出结构化 UI/视觉描述, 供非多模态主模型消费 (CrabCode desktop automation /\n * computer-use 选模型时使用).\n *\n * 与 ManagedModel.inputModalities=['image'] 是正交两件事:\n * - inputModalities 描述\"模型能不能吃图片输入\"\n * - supports_desktop_visual_understanding 描述\"模型是不是被运营标记为\n * 适合做桌面 UI 解析的 sidecar\" (有些通用视觉模型并不擅长 UI 解析)\n *\n * 调用方不应通过模型名 substring 推断此能力; 必须读上游下发字段.\n */\n supports_desktop_visual_understanding?: boolean;\n\n /**\n * 图片生成能力 (v1.3+): 为 true 表示该托管模型是图片生成模型 (DALL·E / SD / 即梦 等),\n * 应通过 client.generateImage() 调用, 而非 chat(). 计量维度由上游派生为 IMAGE (按图计费)。\n */\n supports_image_generation?: boolean;\n\n /**\n * 视频生成能力 (v1.3+): 为 true 表示该托管模型是视频生成模型 (Sora / 可灵 / Runway 等),\n * 应通过 client.generateVideo() + pollVideoTask() 调用。计量维度派生为 VIDEO (按时长计费)。\n */\n supports_video_generation?: boolean;\n\n /**\n * 向量能力 (v2.9+): 为 true 表示该托管模型是向量模型 (DashScope text-embedding-v4 等),\n * 应通过 client.embeddings() 调用。\n */\n supports_embedding?: boolean;\n\n /**\n * 重排序能力 (v2.9+): 为 true 表示该托管模型是重排序模型 (DashScope gte-rerank-v2 / qwen3-rerank 等),\n * 应通过 client.rerank() 调用。\n */\n supports_rerank?: boolean;\n}\n\n/** 图片生成请求 (client.generateImage) */\nexport interface ImageGenerationRequest {\n prompt: string;\n /** 缺省 1024 */\n width?: number;\n /** 缺省 1024 */\n height?: number;\n style?: string;\n}\n\n/** 图片生成响应 */\nexport interface ImageGenerationResponse {\n url?: string;\n b64_json?: string;\n revised_prompt?: string;\n requestId?: string;\n}\n\n/** 视频生成请求 (client.generateVideo) */\nexport interface VideoGenerationRequest {\n prompt: string;\n resolution?: string;\n /** 时长 (秒) */\n duration?: number;\n}\n\n/** 视频任务响应 (创建返回 taskId; 轮询返回 status/videoUrl) */\nexport interface VideoTaskResponse {\n taskId: string;\n /** pending | running | completed | failed */\n status?: string;\n videoUrl?: string;\n error?: string;\n requestId?: string;\n}\n\n// ── 向量 (Embedding) / 重排序 (Rerank) (v2.9.0) ──────────────────────────────\n// SDK 订阅会员经 POST /managed-models/:id/{embeddings,rerank} 调用; 仅\n// capabilities.supports_embedding / supports_rerank 的托管模型可用。上游接 DashScope。\n\n/**\n * 多模态内容片段 (v2.10+; 向量/重排序 qwen3-vl-embedding / qwen3-vl-rerank 线路)。\n * text / image / video 至少填一项; image/video 取 URL 或 base64 data URI。\n */\nexport interface MultimodalContent {\n /** 文本片段 */\n text?: string;\n /** 图片 (URL 或 base64 data URI) */\n image?: string;\n /** 视频 (URL); 仅多模态线路支持 */\n video?: string;\n}\n\n/** 向量请求 (client.embeddings)。文本线路 = OpenAI /v1/embeddings 标准; 多模态线路用 contents。 */\nexport interface EmbeddingRequest {\n /** 文本输入 (文本向量线路): 单条文本或文本数组 (批量)。多模态线路改用 contents。 */\n input?: string | string[];\n /**\n * 多模态内容 (v2.10+; qwen3-vl-embedding 线路): text/image/video 片段数组。\n * 与 input 二选一; 多模态托管模型须用 contents。\n */\n contents?: MultimodalContent[];\n /** 向量维度 (可选; DashScope text-embedding-v4 支持 2048/1536/1024/768/512/256/128/64) */\n dimensions?: number;\n /** 编码格式 (可选, 如 \"float\") */\n encoding_format?: string;\n /** 输出向量类型 (可选; 多模态线路, 如 \"dense\") */\n output_type?: string;\n /** 视频抽帧率 fps (可选; 多模态视频输入) */\n fps?: number;\n /** 是否启用多模态特征融合 (可选; 多模态线路) */\n enable_fusion?: boolean;\n}\n\n/** 单条向量结果 (OpenAI 标准)。 */\nexport interface EmbeddingData {\n object: string;\n index: number;\n embedding: number[];\n}\n\n/** 向量响应 (OpenAI /v1/embeddings 标准)。 */\nexport interface EmbeddingResponse {\n object: string;\n model: string;\n data: EmbeddingData[];\n usage: { prompt_tokens?: number; total_tokens: number };\n id?: string;\n}\n\n/** 重排序查询 (v2.10+): 文本字符串, 或多模态 {text|image}。 */\nexport type RerankQuery = string | { text?: string; image?: string };\n/** 重排序候选文档 (v2.10+): 文本字符串, 或多模态 {text|image|video}。 */\nexport type RerankDocument = string | MultimodalContent;\n\n/** 重排序请求 (client.rerank)。统一扁平契约, 网关内部按模型线路转换。 */\nexport interface RerankRequest {\n /** 查询: 文本字符串 (文本线路), 或多模态 {text|image} (qwen3-vl-rerank 线路) */\n query: RerankQuery;\n /** 候选文档: 文本字符串数组, 或多模态 {text|image|video} 对象数组 */\n documents: RerankDocument[];\n /** 返回前 N 条 (可选; 缺省返回全部) */\n top_n?: number;\n /** 是否在结果中回传文档原文 (可选, 缺省 false) */\n return_documents?: boolean;\n /** 排序指令 (可选; 仅 OpenAI 兼容线路支持, 原生线路忽略) */\n instruct?: string;\n /** 视频抽帧率 fps (可选; 多模态视频文档) */\n fps?: number;\n}\n\n/** 单条重排序结果。 */\nexport interface RerankResult {\n /** 文档在原 documents 数组中的下标 */\n index: number;\n /** 相关性得分 (越高越相关) */\n relevance_score: number;\n /** 文档原文 (仅 return_documents=true 时存在) */\n document?: string;\n}\n\n/** 重排序响应。 */\nexport interface RerankResponse {\n results: RerankResult[];\n usage: { total_tokens: number };\n model?: string;\n}\n\n/**\n * 模型可接收的用户输入模态 —— **本 SDK 已知的那些** (v1.2+).\n *\n * - 'text': 文本输入\n * - 'image': 截图 / 图片输入 (多模态)\n * - 'video': 视频输入 (多模态向量 / 重排序类模型, 网关 2026-06-20 起下发)\n *\n * ManagedModel.inputModalities 包含 'image' 才允许向该模型直接发图;\n * 缺失字段时调用方应保守按 text-only / unknown 处理.\n *\n * 这个联合体是**查询用**的 (helper 的 modality 参数), 不是数据域的全集 —— 见\n * {@link InputModalityTag}.\n */\nexport type InputModality = 'text' | 'image' | 'video';\n\n/**\n * 目录里实际可能出现的模态标签 —— **开放值域**, 已知取值见 {@link InputModality}.\n *\n * 值域由网关托管模型目录持有, 靠运营动作扩张 (不是靠发 SDK 新版)。把数据字段\n * 声明成封闭联合体, 等于让类型对在网真实数据撒谎; 2026-08-02 CrabCode 客户端\n * 因同一形态的封闭枚举 (Rust 侧) 把整个网关模型列表打空过数周。\n *\n * 因此: **查询**用 {@link InputModality} (已知标签, 有自动补全),\n * **数据**用本类型 (照收未知标签, 不丢信息、不谎报)。\n *\n * 刻意就是朴素 `string`, 不用 `InputModality | (string & {})` 那个\"保留补全\"的\n * 技巧: 补全只在**书写**字面量时有价值, 而本类型描述的是**读到**的目录数据;\n * 那个技巧还要靠 `{}` —— 本仓 eslint `ban-types` 明令禁止。\n */\nexport type InputModalityTag = string;\n\n/** BucketClass 字面量常量 — V30 二轮审计 D-P1-3 修复 */\nexport const BucketClassCommercial = 'COMMERCIAL';\nexport const BucketClassGeneric = 'GENERIC';\n\n/**\n * 用户在某 modelId 上的桶余额聚合视图 (V30 entitlement-listing).\n *\n * 多桶聚合规则 (上游 nexus-v4 计算后下发, 全部单位为 ETU):\n * - quotaEtu / usedEtu / remainingEtu: 该 modelId 下用户全部 active 桶求和\n * - sharedPoolEtu: 求和量中\"来自通配桶\"的部分 (跨模型可消耗)\n * - bucketClass / expiresAt: 取最高优先级桶\n * - expired: 全部桶都过期才置 true\n */\nexport interface BucketInfo {\n quotaEtu: number;\n usedEtu: number;\n remainingEtu: number;\n sharedPoolEtu?: number;\n expiresAt?: string;\n bucketClass: string;\n expired?: boolean;\n /** v0.19+ — GENERIC alive 桶 tokenRemaining 求和 (\"免费余额\", 真实可消费) */\n freeRemainingEtu: number;\n /** v0.19+ — COMMERCIAL alive 桶 tokenRemaining 求和 (\"付费余额\") */\n paidRemainingEtu: number;\n}\n\n/** 大小写不敏感判定 — 与 buildBucketView (managed_model.go) EqualFold 语义对齐 */\nexport function bucketInfoIsCommercial(b: BucketInfo | null | undefined): boolean {\n if (!b) return false;\n return b.bucketClass.toLowerCase() === BucketClassCommercial.toLowerCase();\n}\n\n/** 托管模型 */\nexport interface ManagedModel {\n id: string;\n name: string;\n provider: string;\n modelId: string;\n maxTokens: number;\n isEnabled: boolean;\n /** @deprecated 公开 /managed-models 端点不返回此字段 (最小暴露原则); 仅 admin 响应或历史端口残留, listModels() 结果中恒为 undefined。 */\n pricePerMTok?: number;\n /** @deprecated 公开 /managed-models 端点不返回此字段 (最小暴露原则); 仅 admin 响应或历史端口残留, listModels() 结果中恒为 undefined。 */\n isDefault?: boolean;\n contextWindow?: number;\n capabilities: ModelCapabilities;\n\n /** P1 商品化档位门控: 0=FREE..4=ULTRA。前端模型选择器按用户档位过滤。 */\n minPlanTier?: number;\n /** 该模型能否在 C 端对话 (ADK 托管运行时) 使用; false 时选择器应过滤。 */\n chatRuntimeSupported?: boolean;\n /** 模型默认绑定的工具 ID 列表。 */\n defaultToolIds?: string[];\n /** 该模型对当前用户档位是否被限制策略锁定 (limit_policy allowedModels 不含)。true=展示但置灰+升级引导。enforced 关/解析失败=false。 */\n locked?: boolean;\n /** 是否属于\"免费会员可用\"分区 (FREE 档 allowedModels 内)。与当前用户档位无关 (仅分类)。 */\n freeTier?: boolean;\n\n /**\n * 上游 gateway 为此模型启用的请求格式列表\n * 取值: \"anthropic\" | \"openai\"\n * 空值表示上游未声明, SDK 回落 provider 硬编码分支 (向后兼容)\n */\n supported_formats?: string[];\n\n /**\n * 上游建议客户端优先使用的格式\n * 取值: \"anthropic\" | \"openai\"; 空值等价于 supported_formats[0]\n */\n preferred_format?: string;\n\n /**\n * 该模型可选的思考深度档位 id(升序,v2.18+)。取值是 {@link ThinkingOff} / {@link ThinkingHigh} /\n * {@link ThinkingMax} 的子集;网关按「admin 声明 ∩ wire 层真投递」读时派生。\n * `[]` = 该模型没有思考档(不要渲染档位选择);`undefined` = 上游未播报(旧网关),\n * 调用方必须按\"未知\"处理,严禁回落到自己推档或按模型名猜。\n */\n thinking_levels?: string[];\n\n /**\n * 当前用户在此模型上的桶余额聚合 (V0.18 V30 entitlement-listing).\n *\n * 仅当调用方为非 admin 用户 (web user / desktop OAuth) 时上游才会返回此字段:\n * - admin / X-Internal-Bypass 调用 → 缺失\n * - 普通用户 → 非空, 含 quota/used/remaining 求和\n */\n bucketInfo?: BucketInfo;\n\n /**\n * 模型可接收的用户输入模态 (v1.2+, CrabCode desktop automation / computer-use 选模型用).\n *\n * 已知取值见 {@link InputModality} ('text' | 'image' | 'video'); 'image' 表示模型可\n * 直接接收 screenshot/image 输入。类型是**开放**的 ({@link InputModalityTag}) ——\n * 目录新增模态时旧版 SDK 照样原样透出, 不静默丢值。\n *\n * 兼容上游字段名 input_modalities (snake_case) — listModels 在写缓存前会做归一化.\n *\n * **缺失语义**: 上游未下发时该字段为 undefined, 调用方必须保守按 text-only / unknown\n * 处理, 严禁默认假设支持 image. 同样严禁用模型名 substring 反推 modality.\n */\n inputModalities?: InputModalityTag[];\n}\n\n// =============================================================================\n// QuotaSummary — v0.19+ 账户级权益总览 (免费/付费切分)\n// =============================================================================\n\n/** 单桶视图 — QuotaSummary.freeBuckets/paidBuckets 元素 */\nexport interface BucketRow {\n bucketId: string;\n /** 精确桶为具体 modelId, 通配桶为 \"*\" */\n modelId: string;\n /** COMMERCIAL | GENERIC */\n bucketClass: string;\n tokenQuota: number;\n tokenUsed: number;\n tokenRemaining: number;\n /** 永久桶为 undefined */\n expiresAt?: string;\n expired?: boolean;\n}\n\nexport function bucketRowIsCommercial(r: BucketRow | null | undefined): boolean {\n if (!r) return false;\n return r.bucketClass.toLowerCase() === BucketClassCommercial.toLowerCase();\n}\n\n/** 滚动窗口限额状态 — QuotaSummary.windowLimits 元素 */\nexport interface WindowLimitStatus {\n /** 窗口档位: FIVE_HOUR = 5 小时滚动窗口, WEEKLY = 7 天滚动窗口 */\n kind: 'FIVE_HOUR' | 'WEEKLY';\n /** 窗口内 credit 用量上限 */\n limitCredits: number;\n /** 窗口内已用 credit */\n usedCredits: number;\n /** 预计恢复时间 (ISO-8601 UTC); 窗口内无用量时为 null / 缺失 */\n resetAt?: string | null;\n /**\n * [W1 2026-07-11 软限额] 该窗此刻可否被用户「继续」开关豁免 — 5h 软限额时 true (展示端可给\n * 严格模式切换入口), 周窗恒 false。老网关不返回时缺失。\n */\n overridable?: boolean;\n}\n\n/**\n * GET /api/v4/entitlements/quota-summary 返回体, 调用 client.getQuotaSummary 获取.\n *\n * 设计目的: 个人中心钱包栏一次性展示\"我还有多少免费 + 多少付费\"+ 各自最近到期时间.\n */\nexport interface QuotaSummary {\n /** GENERIC (免费/赠送) alive 桶 tokenRemaining 求和 */\n freeTotalEtu: number;\n /** COMMERCIAL (付费购买) alive 桶 tokenRemaining 求和 */\n paidTotalEtu: number;\n /** GENERIC 桶详情 (含过期, UI 列流水); 空时为空数组 */\n freeBuckets: BucketRow[];\n /** COMMERCIAL 桶详情 (含过期); 空时为空数组 */\n paidBuckets: BucketRow[];\n /** GENERIC alive 桶中最早到期; 永久桶/无 alive 时缺失 */\n nextFreeExpiresAt?: string;\n /** COMMERCIAL alive 桶中最早到期; 同上 */\n nextPaidExpiresAt?: string;\n /** 滚动窗口限额状态 (5 小时 / 7 天); 后端未启用窗口限额时字段整个缺失 */\n windowLimits?: WindowLimitStatus[];\n /**\n * [W1 2026-07-11 软限额] 用户 5h「继续」开关现值 (true=软限额/默认: 到达 5h 仅提醒并继续消耗\n * 周配额; false=严格模式: 到达即等待恢复)。仅后端启用窗口限额时下发, 否则缺失。\n */\n windowFiveHourContinueEnabled?: boolean;\n}\n\n// =============================================================================\n// WindowResetSummary — v2.13+ 邀请奖励窗口重置券\n// =============================================================================\n\n/**\n * GET /api/v4/entitlements/window-reset/summary 返回体, 调用 client.getWindowResetSummary 获取.\n *\n * 设计目的: 个人中心邀请栏与 429 窗口限额弹窗一次性展示\"我还有几张重置券 + 最近一张何时过期\",\n * 并给出邀请进度 (已达标 / 待达标) 作为继续邀请的引导。\n *\n * 券由邀请奖励发放 (被邀请人激活并达到用量门槛后计一次), 每张可清空一次滚动窗口已用量\n * (见 client.redeemWindowReset)。\n */\nexport interface WindowResetSummary {\n /** 当前可用 (未使用且未过期) 的重置券张数 */\n availableCount: number;\n /** 可用券中最早到期时间 (ISO-8601 UTC); 无可用券时为 null */\n nextExpireAt: string | null;\n /** 历史累计发放张数 (含已用 / 已过期) */\n totalGranted: number;\n /** 历史累计已使用张数 */\n totalUsed: number;\n /** 已达标并已发放重置券的邀请数 */\n qualifiedInvites: number;\n /** 已激活但尚未达到发放门槛的邀请数 (仍可能转为已达标) */\n pendingInvites: number;\n}\n\n// =============================================================================\n// Chat\n// =============================================================================\n\n/** 聊天消息 (简单文本格式, CrabClaw 使用) */\nexport interface ChatMessage {\n role: string;\n content: string;\n}\n\n/** Anthropic 响应内容块 */\nexport interface ChatContentBlock {\n type: string;\n text?: string;\n citations?: unknown;\n thinking?: string;\n signature?: string;\n data?: string;\n id?: string;\n name?: string;\n /** json.RawMessage in Go */\n input?: unknown;\n server_name?: string;\n caller?: unknown;\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n}\n\n/** Anthropic 格式 token 用量 */\nexport interface ChatUsage {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\n// ---------- Thinking ----------\n\n/** 三档思考级别 (v0.9.0) */\nexport const ThinkingOff = 'off';\nexport const ThinkingHigh = 'high';\nexport const ThinkingMax = 'max';\n\n/** 标准思考最低 maxTokens — CrabCode 默认 MAX_OUTPUT_TOKENS_DEFAULT = 32_000 */\nexport const ThinkingHighMinMaxTokens = 32_000;\n/** 深度思考回退 maxTokens — Opus 4.6 上限 128K */\nexport const ThinkingMaxFallbackMaxTokens = 128_000;\n\n/** 控制模型思考行为 */\nexport interface ThinkingConfig {\n /** \"enabled\" | \"disabled\" | \"adaptive\" */\n type: string;\n /** 仅 type=\"enabled\" 时 (旧模型回退) */\n budget_tokens?: number;\n /** 思考级别 (v0.9.0): \"off\" | \"high\" | \"max\" */\n level?: string;\n /** \"none\" | \"summary\" | \"\" (默认空=完整) */\n display?: string;\n}\n\n/** 根据三档 level 创建配置 */\nexport function newThinkingConfig(level: string): ThinkingConfig {\n if (level === '' || level === ThinkingOff) {\n return { type: 'disabled' };\n }\n return { type: 'adaptive', level };\n}\n\n/** 服务端工具定义 — SDK 将工具 schema 合入 API 请求的 tools 数组 */\nexport interface ServerTool {\n type: string;\n name: string;\n config?: Record<string, unknown>;\n}\n\n/** Server Tool 类型常量 */\nexport const ServerToolTypeWebSearch = 'web_search_20250305';\n\n/** 地理位置 */\nexport interface GeoLoc {\n /** ISO 3166-1 alpha-2 */\n country: string;\n city?: string;\n}\n\n/** ServerTool.config 结构 (type=web_search_20250305) */\nexport interface WebSearchConfig {\n /** 每请求最大搜索次数, 默认 8 */\n max_uses?: number;\n /** 域名白名单 (与 blocked_domains 互斥) */\n allowed_domains?: string[];\n /** 域名黑名单 (与 allowed_domains 互斥) */\n blocked_domains?: string[];\n user_location?: GeoLoc;\n}\n\n/** 控制推理努力级别 */\nexport interface EffortConfig {\n /** \"low\" | \"medium\" | \"high\" | \"max\" */\n level: string;\n}\n\n/** 控制输出格式 (结构化输出) */\nexport interface OutputConfig {\n /** \"json_schema\" | \"\" */\n format?: string;\n schema?: unknown;\n}\n\n/**\n * 创建搜索 Server Tool 的便捷方法\n * allowed_domains 与 blocked_domains 互斥, 同时传入抛 Error\n */\nexport function newWebSearchTool(cfg?: WebSearchConfig | null): ServerTool {\n const st: ServerTool = {\n type: ServerToolTypeWebSearch,\n name: 'web_search',\n };\n if (cfg) {\n if ((cfg.allowed_domains?.length ?? 0) > 0 && (cfg.blocked_domains?.length ?? 0) > 0) {\n throw new Error('web search: allowed_domains and blocked_domains are mutually exclusive');\n }\n const m: Record<string, unknown> = {};\n if (cfg.max_uses && cfg.max_uses > 0) m['max_uses'] = cfg.max_uses;\n if (cfg.allowed_domains?.length) m['allowed_domains'] = cfg.allowed_domains;\n if (cfg.blocked_domains?.length) m['blocked_domains'] = cfg.blocked_domains;\n if (cfg.user_location) m['user_location'] = cfg.user_location;\n if (Object.keys(m).length > 0) st.config = m;\n }\n return st;\n}\n\n/**\n * 聊天请求\n *\n * 基础字段供 CrabClaw 使用, 扩展字段供 CrabCode 使用。\n * 所有新增字段零值不改变行为 (向后兼容)。\n *\n * 注意:扩展字段(rawMessages/system/tools/...)不会被原样 JSON.stringify,\n * 而由 buildRequestBody (adapter) 选择性序列化到请求体。\n */\nexport interface ChatRequest {\n // ── 基础字段 (CrabClaw 兼容) ──\n messages?: ChatMessage[];\n stream?: boolean;\n max_tokens?: number;\n\n // ── 完整请求控制 (CrabCode 扩展) ── 不直接 JSON 序列化, 由 buildRequestBody 处理\n /** 复杂消息体 (含 content blocks / 多模态), 非 nil 时优先于 messages */\n rawMessages?: unknown;\n /** string 或 ContentBlock[] */\n system?: unknown;\n /** 标准工具定义 (Tool[]) */\n tools?: unknown;\n temperature?: number;\n thinking?: ThinkingConfig;\n metadata?: Record<string, string>;\n /** 显式 beta (SDK 自动合并) */\n betas?: string[];\n /** 服务端工具 (buildRequestBody 合入 tools 数组) */\n serverTools?: ServerTool[];\n /** \"\" | \"fast\" (Fast Mode) */\n speed?: string;\n effort?: EffortConfig;\n outputConfig?: OutputConfig;\n /** 任意扩展字段 (buildRequestBody 合入请求体) */\n extraBody?: Record<string, unknown>;\n\n /**\n * v0.13.0: OpenAI wire format 原生字段。AnthropicAdapter 忽略,\n * OpenAIAdapter 按 OpenAI 规范序列化。\n *\n * 对应 OpenAI `parallel_tool_calls` 顶层字段, undefined = 不设置 (沿用上游默认 true)。\n */\n parallelToolCalls?: boolean;\n\n /**\n * v1.6.0: 业务侧终端用户 id, 跨 provider 通用语义 (不绑死 DeepSeek)。\n * 仅当 caller 拥有 scope=endusr.set 时网关采信; 否则被网关 sanitizer 校验/覆盖。\n * 约束: 长度 ≤ 512, 字符集 [a-zA-Z0-9_-]+, 禁止包含用户隐私信息。\n * 二选一:\n * OpenAI wire → 序列化为顶层 body[\"user_id\"]\n * Anthropic wire → 合并到 body[\"metadata\"][\"user_id\"]; caller metadata 显式键优先, 不被覆盖\n */\n endUserId?: string;\n}\n\n// ---------- Web Search Sources ----------\n\n/** 联网搜索结果来源 (与后端 adk/stream_helpers.go SourceItem 对齐) */\nexport interface WebSearchSource {\n title: string;\n url: string;\n snippet?: string;\n}\n\n/** 搜索来源事件 (从 SSE \"sources\" 事件解析) */\nexport interface SourcesEvent {\n sources: WebSearchSource[];\n session_id?: string;\n}\n\n/** sources 事件结构错误的稳定机器码。 */\nexport type SourcesEventIssueCode =\n | 'invalid_json'\n | 'missing_sources'\n | 'sources_not_array'\n | 'source_not_object'\n | 'source_title_invalid'\n | 'source_url_invalid'\n | 'source_snippet_invalid'\n | 'session_id_invalid';\n\n/**\n * sources SSE 的无歧义分类结果。\n *\n * `empty_sources` 是合法零结果;`malformed_sources` 才表示结构损坏。\n */\nexport type SourcesEventParseResult =\n | { kind: 'not_sources' }\n | { kind: 'empty_sources'; session_id?: string }\n | { kind: 'sources'; value: SourcesEvent }\n | { kind: 'malformed_sources'; code: SourcesEventIssueCode };\n\n/**\n * 同时识别 SSE event name 与 JSON payload discriminator,并把合法空结果\n * 与非 sources、结构损坏明确分开。未知额外字段不影响分类。\n */\nexport function classifySourcesEvent(ev: StreamEvent): SourcesEventParseResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(ev.data);\n } catch {\n return ev.event === 'sources'\n ? { kind: 'malformed_sources', code: 'invalid_json' }\n : { kind: 'not_sources' };\n }\n\n const wrapper =\n typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n if (wrapper?.type !== 'sources' && ev.event !== 'sources') {\n return { kind: 'not_sources' };\n }\n if (!wrapper || !Object.prototype.hasOwnProperty.call(wrapper, 'sources')) {\n return { kind: 'malformed_sources', code: 'missing_sources' };\n }\n if (\n Object.prototype.hasOwnProperty.call(wrapper, 'session_id') &&\n wrapper.session_id !== undefined &&\n typeof wrapper.session_id !== 'string'\n ) {\n return { kind: 'malformed_sources', code: 'session_id_invalid' };\n }\n if (!Array.isArray(wrapper.sources)) {\n return { kind: 'malformed_sources', code: 'sources_not_array' };\n }\n\n const sessionID = typeof wrapper.session_id === 'string' ? wrapper.session_id : undefined;\n if (wrapper.sources.length === 0) {\n return {\n kind: 'empty_sources',\n ...(sessionID === undefined ? {} : { session_id: sessionID }),\n };\n }\n\n for (const source of wrapper.sources) {\n if (typeof source !== 'object' || source === null || Array.isArray(source)) {\n return { kind: 'malformed_sources', code: 'source_not_object' };\n }\n const item = source as Record<string, unknown>;\n if (typeof item.title !== 'string') {\n return { kind: 'malformed_sources', code: 'source_title_invalid' };\n }\n if (typeof item.url !== 'string') {\n return { kind: 'malformed_sources', code: 'source_url_invalid' };\n }\n if (\n Object.prototype.hasOwnProperty.call(item, 'snippet') &&\n item.snippet !== undefined &&\n typeof item.snippet !== 'string'\n ) {\n return { kind: 'malformed_sources', code: 'source_snippet_invalid' };\n }\n }\n\n return {\n kind: 'sources',\n value: {\n ...wrapper,\n sources: wrapper.sources as WebSearchSource[],\n ...(sessionID === undefined ? {} : { session_id: sessionID }),\n } as SourcesEvent,\n };\n}\n\n/**\n * 从 StreamEvent 中解析搜索来源\n *\n * @deprecated 需要区分合法空结果与结构损坏时使用 classifySourcesEvent。\n * 此 legacy API 保留原有宽松解析和返回对象形状;新代码不得据此区分\n * 合法空结果与结构损坏。\n */\nexport function parseSourcesEvent(ev: StreamEvent): SourcesEvent | null {\n let wrapper: {\n type?: string;\n sources?: WebSearchSource[];\n session_id?: string;\n };\n try {\n wrapper = JSON.parse(ev.data);\n } catch {\n return null;\n }\n if (wrapper.type !== 'sources' && ev.event !== 'sources') {\n return null;\n }\n if (!wrapper.sources || wrapper.sources.length === 0) {\n return null;\n }\n return { sources: wrapper.sources, session_id: wrapper.session_id };\n}\n\n// =============================================================================\n// ChatResponse\n// =============================================================================\n\n/**\n * 同步聊天响应 (Anthropic format, v0.4.1)\n *\n * tokenRemaining / callRemaining / modelTokenRemaining* 不在 wire JSON 中, 由 client 从 Header 填充。\n * 哨兵 -1 表示服务端未返回。\n */\nexport interface ChatResponse {\n id: string;\n type: string;\n model: string;\n role: string;\n content: ChatContentBlock[];\n stop_reason: string;\n usage: ChatUsage;\n /** -1 表示服务端未返回 */\n tokenRemaining: number;\n callRemaining: number;\n modelTokenRemaining: number;\n modelTokenRemainingETU: number;\n}\n\n// =============================================================================\n// SSE Stream\n// =============================================================================\n\n/**\n * SSE 流式事件\n *\n * v0.11.0 新增 blockIndex/blockType/ephemeral 三字段 (in-band content block 元数据)。\n * 零值等价 v0.10.0 行为, 未识别的事件三字段全部零值。\n */\nexport interface StreamEvent {\n event: string;\n data: string;\n /** 对齐 Anthropic content_block_start/delta/stop 的 index 字段 */\n blockIndex?: number;\n /** 由 content_block_start 解析得到, delta/stop 从 index→type 映射查出 */\n blockType?: string;\n /** 网关标记此 block 下一轮不应回传 */\n ephemeral?: boolean;\n}\n\n/**\n * 流式结算事件 (从 settled SSE 事件解析)\n * 包含本次请求的 token 消耗及结算后的剩余余额\n */\nexport interface StreamSettlement {\n requestId: string;\n consumeStatus: string;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n /** 结算后剩余 token (-1 表示服务端未返回) */\n tokenRemaining: number;\n /** 结算后剩余调用次数 (-1 表示服务端未返回) */\n callRemaining: number;\n}\n\n/** 从 settled 类型的 StreamEvent 中解析结算信息. 不是 settled 类型则返回 null. */\nexport function parseSettlement(ev: StreamEvent): StreamSettlement | null {\n if (ev.event !== 'settled' && ev.event !== 'pending_settle') {\n return null;\n }\n let s: Partial<StreamSettlement>;\n try {\n s = JSON.parse(ev.data);\n } catch {\n return null;\n }\n return {\n requestId: s.requestId ?? '',\n consumeStatus: s.consumeStatus ?? '',\n inputTokens: s.inputTokens ?? 0,\n outputTokens: s.outputTokens ?? 0,\n totalTokens: s.totalTokens ?? 0,\n tokenRemaining: s.tokenRemaining ?? -1,\n callRemaining: s.callRemaining ?? -1,\n };\n}\n","// shared/errors.ts — 跨域类型化错误。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 Errors 段。\n\n// =============================================================================\n// Errors (类型化)\n// =============================================================================\n\n/** 下载限流错误 (429) */\nexport class RateLimitError extends Error {\n retryAfter: string;\n raw: string;\n\n constructor(message: string, retryAfter: string, raw: string) {\n super(message);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n this.raw = raw;\n }\n}\n\n/**\n * API 业务层错误 (HTTP 200 但 code != 0)\n * tk-dist 代理透传 yudao 响应, HTTP 状态码为 200, 业务错误在 JSON code 字段\n */\nexport class BusinessError extends Error {\n code: number;\n\n constructor(code: number, message: string) {\n super(`API error (code=${code}): ${message}`);\n this.name = 'BusinessError';\n this.code = code;\n }\n}\n\n/**\n * 订单到达非成功终态 (FAILED/CANCELLED/CLOSED/EXPIRED/REFUNDED)\n * waitForPayment 在订单终态为非成功时抛此错误\n */\nexport class OrderTerminalError extends Error {\n orderId: string;\n status: string;\n\n constructor(orderId: string, status: string) {\n super(`order ${orderId} terminated: ${status}`);\n this.name = 'OrderTerminalError';\n this.orderId = orderId;\n this.status = status;\n }\n}\n\n/**\n * 模型缓存未命中且 listModels 刷新后仍未找到。\n *\n * 历史上 getCachedModel miss 时硬返 ManagedModel{provider:\"anthropic\"} 占位,\n * 导致未预热场景下的 chat 请求按 AnthropicAdapter 编码, 被发到错误端点。\n * v0.13.x 改为 miss → listModels 自动刷新一次; 仍 miss → 抛此错误。\n */\nexport class ModelNotFoundError extends Error {\n modelId: string;\n\n constructor(modelId: string) {\n super(`managed model \"${modelId}\" not found (list models to refresh cache, or verify model id)`);\n this.name = 'ModelNotFoundError';\n this.modelId = modelId;\n }\n}\n\n/**\n * 结构化 HTTP 非 2xx 错误.\n *\n * 用 instanceof 提取:\n * try { ... } catch (e) {\n * if (e instanceof HTTPError && e.statusCode === 429) { ... }\n * }\n */\nexport class HTTPError extends Error {\n statusCode: number;\n /** anthropic.error.type / openai.error.type, 缺失为空 */\n type: string;\n /** Retry-After 头解析的秒数, 0 表示未提供或解析失败 */\n retryAfter: number;\n /** 原始响应体 (截断到 maxErrorBodySize) */\n body: string;\n /** 后端业务机器码 (响应体顶层 errorCode, e.g. \"WINDOW_LIMIT_EXCEEDED\"); 缺失为 undefined */\n errorCode?: string;\n /** 窗口限额场景: 触发的滚动窗口档位 (FIVE_HOUR = 5 小时 / WEEKLY = 7 天); 缺失为 undefined */\n windowKind?: 'FIVE_HOUR' | 'WEEKLY';\n /** 窗口限额场景: 预计恢复时间 (ISO-8601 UTC); 缺失为 undefined */\n windowResetAt?: string;\n /**\n * [W1 2026-07-11 软限额] 窗口限额场景: 该 429 可否被用户「继续」开关豁免 —\n * true = 5 小时软限额严格模式 (客户端可提示「继续任务」以消耗周配额继续);\n * false/缺失 = 周窗/显式禁止/灰度关 (硬等待, 无豁免路径, 老网关不返回时为 undefined)。\n */\n windowOverridable?: boolean;\n errorContractVersion?: number;\n faultDomain?: FaultDomain;\n requestDisposition?: RequestDisposition;\n transportRequestId?: string | null;\n consumeRequestId?: string | null;\n providerRequestId?: string | null;\n retryable: boolean;\n\n constructor(\n statusCode: number,\n opts: {\n type?: string;\n message?: string;\n retryAfter?: number;\n body?: string;\n errorCode?: string;\n windowKind?: 'FIVE_HOUR' | 'WEEKLY';\n windowResetAt?: string;\n windowOverridable?: boolean;\n errorContractVersion?: number;\n faultDomain?: FaultDomain;\n requestDisposition?: RequestDisposition;\n transportRequestId?: string | null;\n consumeRequestId?: string | null;\n providerRequestId?: string | null;\n retryable?: boolean;\n } = {},\n ) {\n let msg: string;\n if (opts.type) {\n msg = `HTTP ${statusCode}: [${opts.type}] ${opts.message ?? ''}`;\n } else if (opts.message) {\n msg = `HTTP ${statusCode}: ${opts.message}`;\n } else if (opts.body) {\n msg = `HTTP ${statusCode}: ${opts.body}`;\n } else {\n msg = `HTTP ${statusCode}`;\n }\n super(msg);\n this.name = 'HTTPError';\n this.statusCode = statusCode;\n this.type = opts.type ?? '';\n this.retryAfter = opts.retryAfter ?? 0;\n this.body = opts.body ?? '';\n this.errorCode = opts.errorCode;\n this.windowKind = opts.windowKind;\n this.windowResetAt = opts.windowResetAt;\n this.windowOverridable = opts.windowOverridable;\n this.errorContractVersion = opts.errorContractVersion;\n this.faultDomain = opts.faultDomain;\n this.requestDisposition = opts.requestDisposition;\n this.transportRequestId = opts.transportRequestId;\n this.consumeRequestId = opts.consumeRequestId;\n this.providerRequestId = opts.providerRequestId;\n this.retryable = opts.retryable === true && opts.requestDisposition === 'not_accepted';\n }\n}\n\n/**\n * 结构化网络层错误 (传输失败, 区别于上游业务错误).\n *\n * 包装 fetch 抛出的错误 — 含 timeout / EOF / connection refused / DNS 失败等.\n * retry policy: isTimeout / isEOF 任一为 true → 默认可重试.\n */\nexport class NetworkError extends Error {\n /** 操作描述, e.g. \"POST /v1/messages\" */\n op: string;\n /** 请求 URL (脱敏后) */\n url: string;\n override cause?: unknown;\n timeout: boolean;\n eof: boolean;\n requestDisposition: RequestDisposition = 'unknown';\n\n constructor(op: string, url: string, cause: unknown, opts: { timeout?: boolean; eof?: boolean } = {}) {\n const causeMsg = cause instanceof Error ? cause.message : cause != null ? String(cause) : 'network error';\n super(`${op} ${url}: ${causeMsg}`);\n this.name = 'NetworkError';\n this.op = op;\n this.url = url;\n this.cause = cause;\n this.timeout = opts.timeout ?? false;\n this.eof = opts.eof ?? false;\n }\n\n isTimeout(): boolean {\n return this.timeout;\n }\n\n isEOF(): boolean {\n return this.eof;\n }\n}\n\n/**\n * 流式失败事件的结构化表示。\n *\n * 由 gateway 的 `managed_model_stream_failed` 事件解析得到。客户端可通过\n * instanceof 提取并按 code/retryable 决策。\n */\nexport class StreamError extends Error {\n /** 例: \"empty_response\" / \"rate_limit\" / \"overloaded\" / \"\" */\n code: string;\n /** D23 gateway machine code; mirrors the legacy `code` field. */\n errorCode: string;\n /** 例: \"provider\" / \"settlement\" */\n stage: string;\n /** 用户友好提示 (中文); 历史字段, 与 rawError 区分 */\n userMessage: string;\n /** gateway 原始 error 字符串 */\n rawError: string;\n /** 客户端是否值得重试 */\n retryable: boolean;\n errorContractVersion?: number;\n faultDomain?: FaultDomain;\n requestDisposition?: RequestDisposition;\n transportRequestId?: string | null;\n consumeRequestId?: string | null;\n providerRequestId?: string | null;\n\n constructor(opts: { code?: string; stage?: string; message?: string; rawError?: string; retryable?: boolean; errorContractVersion?: number; faultDomain?: FaultDomain; requestDisposition?: RequestDisposition; transportRequestId?: string | null; consumeRequestId?: string | null; providerRequestId?: string | null } = {}) {\n const code = opts.code ?? '';\n const stage = opts.stage ?? '';\n const userMessage = opts.message ?? '';\n const rawError = opts.rawError ?? '';\n const retryable = opts.retryable === true && opts.requestDisposition === 'not_accepted';\n\n const body = rawError !== '' ? rawError : userMessage;\n const msg = stage !== '' ? `stream failed: ${stage}: ${body}` : `stream failed: ${body}`;\n super(msg);\n this.name = 'StreamError';\n this.code = code;\n this.errorCode = code;\n this.stage = stage;\n this.userMessage = userMessage;\n this.rawError = rawError;\n this.retryable = retryable;\n this.errorContractVersion = opts.errorContractVersion;\n this.faultDomain = opts.faultDomain;\n this.requestDisposition = opts.requestDisposition;\n this.transportRequestId = opts.transportRequestId;\n this.consumeRequestId = opts.consumeRequestId;\n this.providerRequestId = opts.providerRequestId;\n }\n}\n\nexport type RequestDisposition = 'not_accepted' | 'accepted' | 'unknown';\nexport type FaultDomain = 'user_auth' | 'caller_credentials' | 'account_quota' |\n 'account_permission' | 'provider' | 'gateway' | 'transport' | 'stream_ticket' | 'protocol';\n\nexport interface GatewayErrorContract {\n errorContractVersion: 1;\n faultDomain: FaultDomain;\n errorCode: string;\n transportRequestId: string | null;\n consumeRequestId: string | null;\n providerRequestId: string | null;\n requestDisposition: RequestDisposition;\n retryable: boolean;\n}\n\nconst gatewayFaultDomains: readonly FaultDomain[] = [\n 'user_auth', 'caller_credentials', 'account_quota', 'account_permission',\n 'provider', 'gateway', 'transport', 'stream_ticket', 'protocol',\n];\n\nfunction nullableID(value: unknown): value is string | null {\n return value === null || typeof value === 'string';\n}\n\nfunction decodeGatewayErrorContract(value: unknown): GatewayErrorContract | null {\n if (value == null || typeof value !== 'object') return null;\n const v = value as Record<string, unknown>;\n const version = v.errorContractVersion;\n const domain = v.faultDomain;\n const disposition = v.requestDisposition;\n const errorCode = v.errorCode;\n if (version !== 1 || typeof domain !== 'string' || !gatewayFaultDomains.includes(domain as FaultDomain)) return null;\n if (typeof errorCode !== 'string' || errorCode.length === 0) return null;\n if (disposition !== 'not_accepted' && disposition !== 'accepted' && disposition !== 'unknown') return null;\n if (!nullableID(v.transportRequestId) || !nullableID(v.consumeRequestId) || !nullableID(v.providerRequestId)) return null;\n if (typeof v.retryable !== 'boolean') return null;\n return { errorContractVersion: 1, faultDomain: domain as FaultDomain, errorCode,\n transportRequestId: v.transportRequestId, consumeRequestId: v.consumeRequestId,\n providerRequestId: v.providerRequestId, requestDisposition: disposition, retryable: v.retryable };\n}\n\n/** Read the closed v1 gateway error contract without exposing the raw response body. */\nexport function readGatewayErrorContract(error: unknown): GatewayErrorContract | null {\n const direct = decodeGatewayErrorContract(error);\n if (direct) return direct;\n if (error == null || typeof error !== 'object') return null;\n const e = error as { response?: { data?: unknown }; body?: unknown };\n const axios = decodeGatewayErrorContract(e.response?.data);\n if (axios) return axios;\n if (typeof e.body === 'string') {\n try { return decodeGatewayErrorContract(JSON.parse(e.body)); } catch { return null; }\n }\n return null;\n}\n\n/** True only for an HTTP 401 carrying the exact v1 rejected user-token contract. */\nexport function isUserAccessTokenRejected(error: unknown): boolean {\n if (error == null || typeof error !== 'object') return false;\n const e = error as { statusCode?: unknown; response?: { status?: unknown } };\n const status = e.statusCode ?? e.response?.status;\n const contract = readGatewayErrorContract(error);\n return status === 401 && contract?.faultDomain === 'user_auth' &&\n contract.errorCode === 'USER_ACCESS_TOKEN_INVALID' && contract.requestDisposition === 'not_accepted';\n}\n\n// =============================================================================\n// 窗口限额 (WINDOW_LIMIT_EXCEEDED) 识别\n// =============================================================================\n\n/** HTTP 路径窗口限额机器码 — 响应体顶层 errorCode / message 文案子串 (后端契约冻结值)。 */\nconst windowLimitErrorCode = 'WINDOW_LIMIT_EXCEEDED';\n/** 流式路径窗口限额 code — agent-run SSE error 事件用小写蛇形 (与 HTTP errorCode 大小写不同)。 */\nconst windowLimitStreamCode = 'window_limit_exceeded';\n\n/**\n * 判断错误是否为窗口限额拒绝 (5 小时 / 7 天滚动窗口 credit 用量达上限)。\n * 结构化 errorCode 优先, message/body 子串防御兜底 (后端部署版本错位期:\n * 旧网关只在 message 文案里带 \"(WINDOW_LIMIT_EXCEEDED)\" 而无顶层 errorCode)。\n *\n * 仅识别 HTTP 非 2xx 路径抛出的 HTTPError (/chat OpenAI 网关形态与 /anthropic\n * Anthropic 形态皆可)。流式场景 (agent-run SSE error 事件 / managed-model\n * failed 事件) 的 code 是小写 \"window_limit_exceeded\" 且产物不是 HTTPError,\n * 用伴生函数 isWindowLimitStreamError 判断。\n */\nexport function isWindowLimitError(err: unknown): err is HTTPError {\n if (!(err instanceof HTTPError)) return false;\n if (err.errorCode === windowLimitErrorCode) return true;\n // 防御兜底: 旧版后端无顶层 errorCode, 机器码只存活在 message 文案 / body 原串。\n return err.message.includes(windowLimitErrorCode) || err.body.includes(windowLimitErrorCode);\n}\n\n/**\n * isWindowLimitError 的流式伴生判断 — 面向 SSE error 事件产物\n * (StreamError / AgentRunStreamError / 裸 AgentRunErrorPayload) 的结构化鸭子判断。\n *\n * 入参形态跨三种且互无公共基类, 故返回 boolean 而非 type guard:\n * `code === \"window_limit_exceeded\"` 优先; message / userMessage / rawError\n * 含 \"WINDOW_LIMIT_EXCEEDED\" 子串防御兜底 (Anthropic 形态流错误事件只有\n * rate_limit_error type + 文案内机器码的部署错位期)。\n */\nexport function isWindowLimitStreamError(err: unknown): boolean {\n if (err == null || typeof err !== 'object') return false;\n const e = err as { code?: unknown; message?: unknown; userMessage?: unknown; rawError?: unknown };\n if (e.code === windowLimitStreamCode) return true;\n // 防御兜底 (后端部署版本错位期): 机器码只出现在文案 / 原始错误串。\n for (const field of [e.message, e.userMessage, e.rawError]) {\n if (typeof field === 'string' && field.includes(windowLimitErrorCode)) return true;\n }\n return false;\n}\n\n/**\n * [W1 2026-07-11 软限额] 判断错误是否为【可豁免】的窗口限额拒绝 (HTTP 路径) —\n * 即 5 小时软限额严格模式: 用户此前把「继续」开关关成严格模式, 到达 5h 被 429,\n * 但可通过重新开启继续 (setWindowContinuePreference(true)) 后重发放行。\n *\n * = isWindowLimitError(err) && err.windowOverridable === true。\n * 周窗 / 显式禁止 / 软限灰度关 / 老网关 (windowOverridable 缺失) 均返回 false (硬等待)。\n * 客户端据此决定是否展示「继续任务 / 重新开启」入口 (vs 纯「等待刷新」)。\n */\nexport function isContinuableWindowLimitError(err: unknown): err is HTTPError {\n return isWindowLimitError(err) && err.windowOverridable === true;\n}\n\n/**\n * [W1 2026-07-11 软限额] 从流式窗口限额 error 事件产物 (StreamError / AgentRunStreamError /\n * 裸 payload) 结构化读取窗口细节 — 供 crabcode 等消费端区分 5h 软限 (可继续) vs 周窗硬限。\n *\n * 非窗口限额错误返回 null; 是则返回 { windowKind, windowResetAt, windowOverridable } (缺字段为 undefined)。\n * overridable=true ⇒ 5h 严格模式可续跑; 缺失/false ⇒ 硬等待。\n */\nexport function getWindowLimitStreamDetails(\n err: unknown,\n): { windowKind?: 'FIVE_HOUR' | 'WEEKLY'; windowResetAt?: string; windowOverridable?: boolean } | null {\n if (!isWindowLimitStreamError(err)) return null;\n const e = (err ?? {}) as { windowKind?: unknown; windowResetAt?: unknown; windowOverridable?: unknown };\n const kind = e.windowKind === 'FIVE_HOUR' || e.windowKind === 'WEEKLY' ? e.windowKind : undefined;\n return {\n windowKind: kind,\n windowResetAt: typeof e.windowResetAt === 'string' ? e.windowResetAt : undefined,\n windowOverridable: typeof e.windowOverridable === 'boolean' ? e.windowOverridable : undefined,\n };\n}\n","// betas.ts — 端口自 acosmi-sdk-go/betas.go\n//\n// Beta Header 常量 — 经联网验证的真实 Anthropic API beta 值。\n// 虚构/错误日期的 header 已剔除。\n\nimport type { ChatRequest, ModelCapabilities } from './types';\nimport { ThinkingOff } from './types';\n\n/** ISP: 交错思考 */\nconst betaInterleavedThinking = 'interleaved-thinking-2025-05-14';\n/** 1M 上下文 (retiring 2026-04-30) */\nconst betaContext1M = 'context-1m-2025-08-07';\n/** 上下文编辑 */\nconst betaContextManagement = 'context-management-2025-06-27';\n/** 结构化输出 */\nconst betaStructuredOutputs = 'structured-outputs-2025-11-13';\n/** Tool Search */\nconst betaAdvancedToolUse = 'advanced-tool-use-2025-11-20';\n/** Effort 控制 (Opus 4.5 需要, 4.6 stable) */\nconst betaEffort = 'effort-2025-11-24';\n/** 缓存作用域隔离 */\nconst betaPromptCachingScope = 'prompt-caching-scope-2026-01-05';\n/** 快速推理 (Opus 4.6) */\nconst betaFastMode = 'fast-mode-2026-02-01';\n/** 思考脱敏 */\nconst betaRedactThinking = 'redact-thinking-2026-02-12';\n/** 高效工具 (Claude 3.7, Claude 4 内置) */\nconst betaTokenEfficientTools = 'token-efficient-tools-2025-02-19';\n\n/** 根据模型能力和请求参数自动组装 beta header 列表 */\nexport function buildBetas(caps: ModelCapabilities, req: ChatRequest): string[] {\n const betas: string[] = [];\n\n // ── 思考相关 ──\n if (caps.supports_isp) {\n betas.push(betaInterleavedThinking);\n betas.push(betaContextManagement);\n }\n if (caps.supports_redact_thinking && req.thinking && req.thinking.display === 'summary') {\n betas.push(betaRedactThinking);\n }\n\n // ── 上下文 ──\n if (caps.supports_1m_context) {\n betas.push(betaContext1M);\n }\n\n // ── 输出控制 (互斥: structured-outputs ⊕ token-efficient-tools) ──\n const hasStructuredOutput = caps.supports_structured_output && req.outputConfig != null;\n if (hasStructuredOutput) {\n betas.push(betaStructuredOutputs);\n } else if (caps.supports_token_efficient) {\n betas.push(betaTokenEfficientTools);\n }\n\n // ── Tool Search ──\n if (caps.supports_tool_search) {\n betas.push(betaAdvancedToolUse);\n }\n\n // ── 推理控制 ──\n // Level 模式下 resolveThinkingLevel 直接写 body[\"effort\"],req.effort 仍为 undefined,\n // 所以需额外判断 Level 是否激活了 effort\n const needsEffort =\n req.effort != null ||\n (req.thinking != null && req.thinking.level && req.thinking.level !== ThinkingOff);\n if (caps.supports_effort && needsEffort) {\n betas.push(betaEffort);\n }\n if (caps.supports_fast_mode && req.speed === 'fast') {\n betas.push(betaFastMode);\n }\n\n // ── 缓存 ──\n if (caps.supports_prompt_cache) {\n betas.push(betaPromptCachingScope);\n }\n\n // ── 合并客户端显式传入 (去重) ──\n return uniqueMerge(betas, req.betas ?? []);\n}\n\n/** 合并两个字符串数组并去重, 保留顺序 */\nexport function uniqueMerge(base: string[], extra: string[]): string[] {\n if (extra.length === 0) return base;\n const seen = new Set<string>(base);\n for (const s of extra) {\n if (!seen.has(s)) {\n base.push(s);\n seen.add(s);\n }\n }\n return base;\n}\n","// adapters/anthropic.ts — 端口自 acosmi-sdk-go/adapter_anthropic.go (228 行)\n//\n// Anthropic 原生格式 adapter\n// 重构自 buildChatRequest 现有逻辑,功能完全等同。\n// 包含 buildBetas() 调用、serverTools 合入、extraBody 透传。\n\nimport {\n type ChatRequest,\n type ChatResponse,\n type ModelCapabilities,\n type StreamEvent,\n ThinkingHighMinMaxTokens,\n ThinkingMax,\n ThinkingMaxFallbackMaxTokens,\n ThinkingOff,\n} from '../types';\nimport { BusinessError } from '../../shared/errors';\nimport { buildBetas } from '../betas';\nimport { ProviderFormat, type ProviderAdapter } from './index';\n\n/**\n * SDK 在 buildRequestBody 中写入并管理的请求体字段 (精确 body key)。\n * extraBody 中若出现同名 key 会覆盖 SDK 计算结果 (如 Level 模式下的 thinking/effort/max_tokens、\n * 自动组装的 betas、被刻意删除的 temperature), 故透传时强制跳过这些 key。\n */\nconst ANTHROPIC_SDK_MANAGED_BODY_KEYS: ReadonlySet<string> = new Set([\n 'thinking',\n 'effort',\n 'max_tokens',\n 'temperature',\n 'betas',\n]);\n\n/** 实现 ProviderAdapter, 用于 Anthropic 原生模型 */\nexport class AnthropicAdapter implements ProviderAdapter {\n format(): ProviderFormat {\n return ProviderFormat.Anthropic;\n }\n\n endpointSuffix(): string {\n return '/anthropic';\n }\n\n /**\n * 构建 Anthropic 格式请求体\n * 逻辑等同于原 buildChatRequest, 包含完整的 betas/tools/serverTools/extraBody 处理\n */\n buildRequestBody(caps: ModelCapabilities, req: ChatRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // 消息: rawMessages 优先于 messages\n if (req.rawMessages != null) {\n body['messages'] = req.rawMessages;\n } else if ((req.messages?.length ?? 0) > 0) {\n body['messages'] = req.messages;\n }\n\n body['stream'] = req.stream === true;\n\n if (req.max_tokens && req.max_tokens > 0) {\n body['max_tokens'] = req.max_tokens;\n }\n if (req.system != null) {\n body['system'] = req.system;\n }\n if (req.temperature != null) {\n body['temperature'] = req.temperature;\n }\n\n // ── Thinking + Effort 组装 ──\n if (req.thinking && req.thinking.level && req.thinking.level !== '') {\n // Level 模式: SDK 接管 thinking + effort + maxTokens\n resolveThinkingLevel(body, req, caps);\n } else {\n // 兼容模式: 调用方自己拼 (保持 v0.8.0 行为)\n if (req.thinking) {\n body['thinking'] = req.thinking;\n }\n if (req.effort) {\n body['effort'] = req.effort;\n }\n }\n\n // ── Metadata + v1.6.0 endUserId 合并 ──\n // caller 显式 metadata 键 (含 user_id) 永远优先, endUserId 仅在 metadata 无 user_id 键时填入。\n // 不污染 caller 原始对象: 通过浅拷贝构造新 Record, 保留 caller 所有原有键。\n if (req.metadata || (req.endUserId && req.endUserId !== '')) {\n const meta: Record<string, unknown> = {};\n if (req.metadata) {\n for (const [k, v] of Object.entries(req.metadata)) {\n meta[k] = v;\n }\n }\n if (req.endUserId && req.endUserId !== '' && meta['user_id'] === undefined) {\n meta['user_id'] = req.endUserId;\n }\n body['metadata'] = meta;\n }\n\n // ── 合入 tools + serverTools ──\n const allTools: unknown[] = [];\n if (req.tools != null) {\n // tools 透传 — 在 Go 侧通过 json.Marshal+Unmarshal 实现深拷贝, TS 中我们直接拼接\n try {\n const parsed = JSON.parse(JSON.stringify(req.tools));\n if (Array.isArray(parsed)) {\n for (const t of parsed) allTools.push(t);\n }\n } catch {\n // ignore — 与 Go 侧 silent ignore 行为一致\n }\n }\n for (const st of req.serverTools ?? []) {\n const schema: Record<string, unknown> = {\n type: st.type,\n name: st.name,\n };\n if (st.config) {\n for (const [k, v] of Object.entries(st.config)) {\n schema[k] = v;\n }\n }\n allTools.push(schema);\n }\n if (allTools.length > 0) {\n body['tools'] = allTools;\n }\n\n // ── 推理控制 (非 Level 模式时的透传) ──\n if (req.speed && req.speed !== '') {\n body['speed'] = req.speed;\n }\n if (req.outputConfig) {\n body['output_config'] = req.outputConfig;\n }\n\n // ── Beta 自动组装 ──\n const betas = buildBetas(caps, req);\n if (betas.length > 0) {\n body['betas'] = betas;\n }\n\n // ── 透传 extraBody ──\n // 注意: extraBody 在 resolveThinkingLevel 之后执行,\n // Level 模式下 thinking / effort / max_tokens / temperature / betas 已由 SDK 管理,\n // extraBody 中若含这些 key 会覆盖 SDK 计算结果 — 强制跳过并告警,\n // 但保留 extraBody 透传其它 (非管理) 字段的正当能力。\n if (req.extraBody) {\n for (const [k, v] of Object.entries(req.extraBody)) {\n if (ANTHROPIC_SDK_MANAGED_BODY_KEYS.has(k)) {\n console.warn(\n `acosmi-sdk: extraBody key \"${k}\" is SDK-managed and was ignored (use the dedicated request field instead).`,\n );\n continue;\n }\n body[k] = v;\n }\n }\n\n return body;\n }\n\n /**\n * 解析 Anthropic 格式同步响应\n * 兼容 APIResponse 包装 {\"code\":0,\"data\":{...}} 和裸 Anthropic JSON 两种格式\n */\n parseResponse(bodyInput: Uint8Array | string): ChatResponse {\n const bodyStr = typeof bodyInput === 'string' ? bodyInput : new TextDecoder().decode(bodyInput);\n\n // 尝试 APIResponse 包装\n let raw = bodyStr;\n try {\n const wrapper = JSON.parse(bodyStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n if ((wrapper.code ?? 0) !== 0) {\n throw new BusinessError(wrapper.code ?? 0, wrapper.message ?? '');\n }\n raw = JSON.stringify(wrapper.data);\n }\n } catch (e) {\n if (e instanceof BusinessError) throw e;\n // 非 JSON 或无 wrapper 格式 — 用原始 bodyStr\n }\n\n let resp: ChatResponse;\n try {\n resp = JSON.parse(raw) as ChatResponse;\n } catch (e) {\n throw new Error(\n `decode anthropic response: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n resp.tokenRemaining = -1;\n resp.callRemaining = -1;\n resp.modelTokenRemaining = -1;\n resp.modelTokenRemainingETU = -1;\n return resp;\n }\n\n /**\n * 解析 Anthropic SSE 行\n *\n * Anthropic 原生协议无 [DONE] (message_stop 后上游关闭连接),\n * 但 Nexus Gateway 的 ChatStream 路径会追加 [DONE] 哨兵, 此处一并处理。\n */\n parseStreamLine(eventType: string, data: string): { event: StreamEvent; done: boolean } {\n if (data === '[DONE]') {\n return { event: { event: '', data: '' }, done: true };\n }\n return { event: { event: eventType, data }, done: false };\n }\n}\n\n/**\n * 根据 ThinkingConfig.level 自动组装请求参数\n *\n * off → thinking=disabled, 不设 effort, 不动 maxTokens\n * high → thinking=adaptive, effort=high, maxTokens 至少 32K\n * max → thinking=adaptive, effort=max, maxTokens 拉到模型上限\n *\n * 旧模型不支持 adaptive 时, 回退到 enabled + budget_tokens = maxTokens - 1\n */\nexport function resolveThinkingLevel(\n body: Record<string, unknown>,\n req: ChatRequest,\n caps: ModelCapabilities,\n): void {\n const level = req.thinking?.level ?? '';\n\n // ── off ──\n if (level === ThinkingOff) {\n body['thinking'] = { type: 'disabled' };\n return;\n }\n\n // ── 模型不支持任何形式的 thinking → 不动 maxTokens, 直接返回 ──\n if (!caps.supports_adaptive_thinking && !caps.supports_thinking) {\n return;\n }\n\n // ── 确定 maxTokens ──\n let maxTokens = req.max_tokens ?? 0;\n if (maxTokens <= 0) {\n maxTokens = ThinkingHighMinMaxTokens;\n }\n\n if (level === ThinkingMax) {\n let modelMax = caps.max_output_tokens;\n if (modelMax <= 0) modelMax = ThinkingMaxFallbackMaxTokens;\n if (maxTokens < modelMax) maxTokens = modelMax;\n } else {\n if (maxTokens < ThinkingHighMinMaxTokens) maxTokens = ThinkingHighMinMaxTokens;\n }\n body['max_tokens'] = maxTokens;\n\n // ── thinking ──\n // adaptive 优先 (Claude 4.x); 旧模型回退 enabled + full budget\n if (caps.supports_adaptive_thinking) {\n const thinking: Record<string, unknown> = { type: 'adaptive' };\n if (req.thinking?.display) thinking['display'] = req.thinking.display;\n body['thinking'] = thinking;\n } else if (caps.supports_thinking) {\n let budget = maxTokens - 1;\n if (budget < 1024) budget = 1024;\n const thinking: Record<string, unknown> = {\n type: 'enabled',\n budget_tokens: budget,\n };\n if (req.thinking?.display) thinking['display'] = req.thinking.display;\n body['thinking'] = thinking;\n }\n\n // ── effort ──\n // 仅支持 effort 的模型发送此参数\n if (caps.supports_effort) {\n let effortLevel = 'high';\n if (level === ThinkingMax && caps.supports_max_effort) {\n effortLevel = 'max';\n }\n body['effort'] = { level: effortLevel };\n }\n\n // ── API 约束: thinking 与 temperature 互斥 ──\n delete body['temperature'];\n}\n","// adapters/openai.ts — 端口自 acosmi-sdk-go/adapter_openai.go (535 行)\n//\n// 用于所有非 Anthropic 厂商 (DeepSeek, DashScope, Zhipu, Moonshot, VolcEngine 等)\n// SDK 只做格式转换, 厂商特定参数由 Nexus Gateway per-provider adapter 处理\n//\n// 关键区别:\n// - 不注入 Anthropic betas\n// - 端点后缀为 /chat (非 /anthropic)\n// - 流式使用 [DONE] 标记结束 (非 message_stop)\n// - 响应为 OpenAI choices 格式\n\nimport { type AnthropicContentBlock, type AnthropicResponse } from '../wire-anthropic';\nimport { type OpenAIChatResponse, type OpenAIStreamChunk } from '../wire-openai';\nimport {\n type ChatContentBlock,\n type ChatRequest,\n type ChatResponse,\n type ModelCapabilities,\n type StreamEvent,\n ThinkingHigh,\n ThinkingMax,\n ThinkingOff,\n} from '../types';\nimport { BusinessError } from '../../shared/errors';\nimport { ProviderFormat, type ProviderAdapter } from './index';\n\n/** 实现 ProviderAdapter, 用于所有非 Anthropic 厂商 */\nexport class OpenAIAdapter implements ProviderAdapter {\n format(): ProviderFormat {\n return ProviderFormat.OpenAI;\n }\n\n endpointSuffix(): string {\n return '/chat';\n }\n\n /**\n * 构建 OpenAI 兼容格式请求体\n * 不注入 Anthropic betas, 扩展字段 (thinking/effort/speed) 以通用 JSON 传递\n */\n buildRequestBody(_caps: ModelCapabilities, req: ChatRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // ── 消息: 直接透传 (Gateway 负责最终转换) ──\n if (req.rawMessages != null) {\n body['messages'] = req.rawMessages;\n } else if ((req.messages?.length ?? 0) > 0) {\n body['messages'] = req.messages;\n }\n\n body['stream'] = req.stream === true;\n if (req.max_tokens && req.max_tokens > 0) {\n body['max_tokens'] = req.max_tokens;\n }\n\n // ── System prompt: 透传给 Gateway ──\n if (req.system != null) {\n body['system'] = req.system;\n }\n\n // ── Temperature ──\n if (req.temperature != null) {\n body['temperature'] = req.temperature;\n }\n\n // ── Tools: 透传原始格式, Gateway adapter 负责格式转换 ──\n if (req.tools != null) {\n body['tools'] = req.tools;\n }\n\n // ── 扩展字段 (v0.13.0: 按 OpenAI wire format 直接翻译) ──\n\n // Thinking / Effort → reasoning_effort\n // OpenAI 系只有顶层 `reasoning_effort: \"low\"|\"medium\"|\"high\"`, 无 thinking block;\n // 能接收到 reasoning_content (GLM/DeepSeek) 作为响应, 但请求侧只能控制级别。\n const eff = resolveOpenAIReasoningEffort(req);\n if (eff !== '') {\n body['reasoning_effort'] = eff;\n }\n\n if (req.speed && req.speed !== '') {\n body['speed'] = req.speed;\n }\n\n // outputConfig → response_format\n // Anthropic 心智模型通过 system prompt + prefill 实现 JSON 模式;\n // OpenAI 有顶层 response_format, SDK 直接翻译。\n const rf = resolveOpenAIResponseFormat(req);\n if (rf) {\n body['response_format'] = rf;\n }\n\n if (req.metadata) {\n body['metadata'] = req.metadata;\n }\n\n // parallel_tool_calls 是 OpenAI 原生字段, 无歧义直接写\n if (req.parallelToolCalls != null) {\n body['parallel_tool_calls'] = req.parallelToolCalls;\n }\n\n // ── 不注入 Anthropic Betas ──\n // OpenAI 格式不使用 anthropic-beta header\n\n // ── 透传 extraBody ──\n if (req.extraBody) {\n for (const [k, v] of Object.entries(req.extraBody)) {\n body[k] = v;\n }\n }\n\n // ── v1.6.0: endUserId → 顶层 body[\"user_id\"] (OpenAI wire 形态) ──\n // 优先级最高: 在 extraBody 之后写入, 即便 caller 通过 extraBody[\"user_id\"] 自填,\n // 显式 endUserId 仍胜出 (单一真相, 避免双写歧义)。\n // 网关 sanitizer 仍会做最终校验与权限决断, 此处仅负责字段位置正确。\n if (req.endUserId && req.endUserId !== '') {\n body['user_id'] = req.endUserId;\n }\n\n // ── 流式选项 ──\n if (req.stream === true) {\n body['stream_options'] = { include_usage: true };\n }\n\n return body;\n }\n\n /**\n * 解析 OpenAI 格式同步响应为 ChatResponse\n * 兼容 APIResponse 包装 {\"code\":0,\"data\":{...}} 和裸 OpenAI JSON 两种格式\n */\n parseResponse(bodyInput: Uint8Array | string): ChatResponse {\n const bodyStr = typeof bodyInput === 'string' ? bodyInput : new TextDecoder().decode(bodyInput);\n\n let raw = bodyStr;\n try {\n const wrapper = JSON.parse(bodyStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n if ((wrapper.code ?? 0) !== 0) {\n throw new BusinessError(wrapper.code ?? 0, wrapper.message ?? '');\n }\n raw = JSON.stringify(wrapper.data);\n }\n } catch (e) {\n if (e instanceof BusinessError) throw e;\n }\n\n let oaiResp: OpenAIChatResponse;\n try {\n oaiResp = JSON.parse(raw) as OpenAIChatResponse;\n } catch (e) {\n throw new Error(`decode openai response: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n return convertOpenAIToChatResponse(oaiResp);\n }\n\n /**\n * 解析 OpenAI SSE 行\n * [DONE] 标记流结束\n */\n parseStreamLine(eventType: string, data: string): { event: StreamEvent; done: boolean } {\n if (data === '[DONE]') {\n return { event: { event: '', data: '' }, done: true };\n }\n\n // 校验 chunk 是合法 JSON (与 Go 侧行为对齐)\n try {\n JSON.parse(data);\n } catch (e) {\n throw new Error(`parse openai stream chunk: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n return { event: { event: eventType, data }, done: false };\n }\n}\n\n/**\n * 把 Anthropic 心智模型的 thinking/effort 翻译成 OpenAI `reasoning_effort` 字段值\n * 返回空串表示不设置\n */\nexport function resolveOpenAIReasoningEffort(req: ChatRequest): string {\n // effort 优先级最高, 因为它本身就是通用级别语义\n if (req.effort && req.effort.level !== '') {\n switch (req.effort.level) {\n case 'low':\n case 'medium':\n case 'high':\n return req.effort.level;\n case 'max':\n // OpenAI 无 max 级别, 等价最深 = high\n return 'high';\n }\n }\n // thinking.level 次之\n if (req.thinking) {\n switch (req.thinking.level) {\n case ThinkingHigh:\n return 'high';\n case ThinkingMax:\n return 'high';\n case ThinkingOff:\n return '';\n }\n }\n return '';\n}\n\n/**\n * 把 outputConfig 翻译成 OpenAI response_format\n * 返回 null 表示不设置\n */\nexport function resolveOpenAIResponseFormat(req: ChatRequest): Record<string, unknown> | null {\n if (!req.outputConfig) return null;\n switch (req.outputConfig.format) {\n case 'json_schema': {\n // OpenAI schema 形态: {type:\"json_schema\", json_schema:{schema:{...},strict:true}}\n const js: Record<string, unknown> = {};\n if (req.outputConfig.schema != null) {\n js['schema'] = req.outputConfig.schema;\n }\n js['strict'] = true;\n return {\n type: 'json_schema',\n json_schema: js,\n };\n }\n case 'json_object':\n return { type: 'json_object' };\n case '':\n case undefined:\n return null;\n default:\n // 未知 format, 原样透传, 交 Gateway 处理\n return { type: req.outputConfig.format };\n }\n}\n\n/** 将 OpenAI 同步响应转换为 ChatResponse */\nfunction convertOpenAIToChatResponse(oai: OpenAIChatResponse): ChatResponse {\n const resp: ChatResponse = {\n id: oai.id,\n type: 'message',\n model: oai.model,\n role: 'assistant',\n content: [],\n stop_reason: '',\n usage: {\n input_tokens: oai.usage.prompt_tokens,\n output_tokens: oai.usage.completion_tokens,\n },\n tokenRemaining: -1,\n callRemaining: -1,\n modelTokenRemaining: -1,\n modelTokenRemainingETU: -1,\n };\n\n if (oai.choices.length > 0) {\n const choice = oai.choices[0]!;\n\n // finish_reason 映射\n switch (choice.finish_reason) {\n case 'stop':\n resp.stop_reason = 'end_turn';\n break;\n case 'tool_calls':\n resp.stop_reason = 'tool_use';\n break;\n case 'length':\n resp.stop_reason = 'max_tokens';\n break;\n default:\n resp.stop_reason = choice.finish_reason;\n }\n\n // thinking content → thinking block\n if (choice.message.reasoning_content && choice.message.reasoning_content !== '') {\n resp.content.push({\n type: 'thinking',\n thinking: choice.message.reasoning_content,\n } as ChatContentBlock);\n }\n\n // text content → text block\n if (choice.message.content && choice.message.content !== '') {\n resp.content.push({\n type: 'text',\n text: choice.message.content,\n } as ChatContentBlock);\n }\n\n // tool_calls → tool_use blocks\n for (const tc of choice.message.tool_calls ?? []) {\n resp.content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n // Anthropic 协议 input 是 raw JSON value; OpenAI 给的 arguments 是 string,\n // Go 侧用 json.RawMessage(arguments) 直透(原始字节). TS 我们尝试解析:\n input: tryParseJSON(tc.function.arguments),\n } as ChatContentBlock);\n }\n }\n\n return resp;\n}\n\nfunction tryParseJSON(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return s;\n }\n}\n\n// ============================================================================\n// OpenAI → Anthropic 响应转换 (供 ChatMessages 使用)\n// ============================================================================\n\n/**\n * 解析 OpenAI 格式响应并转换为 AnthropicResponse\n * 用于 chatMessagesOpenAI 方法, 使 Hub 层无需感知 provider 差异\n */\nexport function parseOpenAIResponseToAnthropic(raw: string | Uint8Array): AnthropicResponse {\n const rawStr = typeof raw === 'string' ? raw : new TextDecoder().decode(raw);\n\n let data = rawStr;\n try {\n const wrapper = JSON.parse(rawStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n if ((wrapper.code ?? 0) !== 0) {\n throw new BusinessError(wrapper.code ?? 0, wrapper.message ?? '');\n }\n data = JSON.stringify(wrapper.data);\n }\n } catch (e) {\n if (e instanceof BusinessError) throw e;\n }\n\n let oaiResp: OpenAIChatResponse;\n try {\n oaiResp = JSON.parse(data) as OpenAIChatResponse;\n } catch (e) {\n throw new Error(`decode openai response: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n const resp: AnthropicResponse = {\n id: oaiResp.id,\n type: 'message',\n role: 'assistant',\n content: [],\n model: oaiResp.model,\n stop_reason: '',\n usage: {\n input_tokens: oaiResp.usage.prompt_tokens,\n output_tokens: oaiResp.usage.completion_tokens,\n },\n };\n\n if (oaiResp.choices.length > 0) {\n const choice = oaiResp.choices[0]!;\n\n switch (choice.finish_reason) {\n case 'stop':\n resp.stop_reason = 'end_turn';\n break;\n case 'tool_calls':\n resp.stop_reason = 'tool_use';\n break;\n case 'length':\n resp.stop_reason = 'max_tokens';\n break;\n default:\n resp.stop_reason = choice.finish_reason;\n }\n\n if (choice.message.reasoning_content && choice.message.reasoning_content !== '') {\n resp.content.push({\n type: 'thinking',\n thinking: choice.message.reasoning_content,\n } as AnthropicContentBlock);\n }\n\n if (choice.message.content && choice.message.content !== '') {\n resp.content.push({\n type: 'text',\n text: choice.message.content,\n } as AnthropicContentBlock);\n }\n\n for (const tc of choice.message.tool_calls ?? []) {\n resp.content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input: tryParseJSON(tc.function.arguments),\n } as AnthropicContentBlock);\n }\n }\n\n return resp;\n}\n\n// ============================================================================\n// OpenAI SSE → Anthropic 事件转换器 (供 chatMessagesStreamInternal 使用)\n// ============================================================================\n\n/**\n * 将 OpenAI SSE chunks 转换为 Anthropic 兼容的 StreamEvent\n * 有状态: 跨 chunk 追踪 block 索引\n */\nexport class OpenAIStreamConverter {\n private messageStarted = false;\n private thinkingStarted = false;\n private thinkingStopped = false;\n /** thinking block 打开时占用的 Anthropic block index — 关闭时必须用它, 不能用\n * 可能已被 text/tool 推进的 this.blockIndex (否则 content_block_stop 索引错配)。 */\n private thinkingBlockIndex = 0;\n private textStarted = false;\n /** OpenAI tool_call 键 → Anthropic block index。键正常是 `tc.index`;上游省略\n * index 时退化为 `id:<tool_call_id>`,两者都没有时沿用上一个键(见\n * {@link resolveToolKey})。 */\n private toolBlockIndex = new Map<string | number, number>();\n private blockIndex = 0;\n /** 每个 tool block 已发出的 `partial_json` 累积,用于识别「每片重发全量参数」\n * 的上游(见 tool_calls 分支的累计判别)。 */\n private toolArgsAccum = new Map<string | number, string>();\n /** 上一次解析出的 tool 键,供缺 index 且缺 id 的后续增量沿用。 */\n private lastToolKey: string | number | null = null;\n /** 已发出 message_delta/message_stop,避免 finish_reason 与 `[DONE]` 各收一次。 */\n private messageClosed = false;\n\n /**\n * 解析一条 tool_call delta 归属的块键。\n *\n * OpenAI 流式规范里 `index` 是必填,但兼容实现常有省略。此前这里直接用\n * `tc.index` 做 Map 键:两个都省略 index 的 tool_call 会共用键 `undefined`,\n * 于是只开一个块、两段参数拼进同一条 `partial_json` 流,产出 `{…}{…}` 这种\n * 必然非法的 JSON。这里按「index → id → 沿用上一个」三级降级,让至少一种\n * 稳定标识生效。\n */\n private resolveToolKey(tc: { index?: number; id?: string }): string | number {\n if (typeof tc.index === 'number' && Number.isFinite(tc.index)) {\n this.lastToolKey = tc.index;\n return tc.index;\n }\n if (typeof tc.id === 'string' && tc.id !== '') {\n const key = `id:${tc.id}`;\n this.lastToolKey = key;\n return key;\n }\n if (this.lastToolKey !== null) return this.lastToolKey;\n this.lastToolKey = 0;\n return 0;\n }\n\n /**\n * 关闭仍打开的 text / thinking / tool 块,并收口 message。\n *\n * 由 `finish_reason` 分支与 `[DONE]` 分支共用:上游断流或只发 `[DONE]` 而不发\n * `finish_reason` 时,此前一个 `content_block_stop` 都不会发,下游拿到的是一个\n * 永不闭合的 tool_use 块。\n */\n private closeOpenBlocks(events: StreamEvent[], stopReason: string): void {\n if (this.messageClosed) return;\n this.messageClosed = true;\n\n if (this.textStarted) {\n events.push({\n event: 'content_block_stop',\n data: JSON.stringify({ type: 'content_block_stop', index: this.blockIndex }),\n });\n this.textStarted = false;\n } else if (this.thinkingStarted && !this.thinkingStopped) {\n // 用 thinkingBlockIndex 关 — thinking-only 流末尾若有 tool block 推进过\n // blockIndex, 这里仍要用 thinking 自己打开时记下的 index, 否则错配。\n this.thinkingStopped = true;\n events.push({\n event: 'content_block_stop',\n data: JSON.stringify({ type: 'content_block_stop', index: this.thinkingBlockIndex }),\n });\n }\n for (const idx of this.toolBlockIndex.values()) {\n events.push({\n event: 'content_block_stop',\n data: JSON.stringify({ type: 'content_block_stop', index: idx }),\n });\n }\n events.push({\n event: 'message_delta',\n data: JSON.stringify({ type: 'message_delta', delta: { stop_reason: stopReason } }),\n });\n events.push({\n event: 'message_stop',\n data: JSON.stringify({ type: 'message_stop' }),\n });\n }\n\n /**\n * 将一行 OpenAI SSE data 转换为零或多个 Anthropic 格式 StreamEvent\n * 返回 { events, done }\n */\n convert(data: string): { events: StreamEvent[]; done: boolean } {\n if (data === '[DONE]') {\n // 上游可能在 `[DONE]` 之前不发 finish_reason(部分兼容实现、以及被中断的\n // 流)。此前这里直接返回空事件,已打开的块永不闭合,下游只能靠超时收场。\n const events: StreamEvent[] = [];\n if (this.messageStarted) {\n this.closeOpenBlocks(events, 'end_turn');\n }\n return { events, done: true };\n }\n\n let chunk: OpenAIStreamChunk;\n try {\n chunk = JSON.parse(data);\n } catch (e) {\n throw new Error(`parse openai stream chunk: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n const events: StreamEvent[] = [];\n if (chunk.choices.length === 0) {\n return { events, done: false };\n }\n const choice = chunk.choices[0]!;\n\n // 首个 chunk: 发送 message_start\n if (!this.messageStarted) {\n this.messageStarted = true;\n const msgJSON = JSON.stringify({\n type: 'message_start',\n message: {\n id: chunk.id,\n type: 'message',\n role: 'assistant',\n content: [],\n model: '',\n },\n });\n events.push({ event: 'message_start', data: msgJSON });\n }\n\n // thinking delta (reasoning_content)\n if (choice.delta.reasoning_content && choice.delta.reasoning_content !== '') {\n if (!this.thinkingStarted) {\n this.thinkingStarted = true;\n this.thinkingBlockIndex = this.blockIndex; // 记下 thinking 占用的 index\n const blockJSON = JSON.stringify({\n type: 'content_block_start',\n index: this.blockIndex,\n content_block: { type: 'thinking', thinking: '' },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n }\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: this.thinkingBlockIndex,\n delta: { type: 'thinking_delta', thinking: choice.delta.reasoning_content },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n\n // text delta (content)\n if (choice.delta.content && choice.delta.content !== '') {\n // 关闭 thinking block (如果有) — 用 thinkingBlockIndex 关, 不用可能已推进的 blockIndex\n if (this.thinkingStarted && !this.thinkingStopped) {\n this.thinkingStopped = true;\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.thinkingBlockIndex,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n this.blockIndex++;\n }\n if (!this.textStarted) {\n this.textStarted = true;\n const blockJSON = JSON.stringify({\n type: 'content_block_start',\n index: this.blockIndex,\n content_block: { type: 'text', text: '' },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n }\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: this.blockIndex,\n delta: { type: 'text_delta', text: choice.delta.content },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n\n // tool_calls delta\n for (const tc of choice.delta.tool_calls ?? []) {\n // 上游给的 tool_call 未必带 `function`:OpenAI 流式规范允许后续增量只带\n // `{index}`。此前这里直接读 `tc.function.name` / `tc.function.arguments`,\n // 那种上游会抛 TypeError 撕开整条 for-await 链,整个回合失败。\n const fn = tc.function as { name?: string; arguments?: unknown } | undefined;\n const toolKey = this.resolveToolKey(tc);\n if (!this.toolBlockIndex.has(toolKey)) {\n // 关闭仍打开的 thinking block (镜像 text 分支): chunk 顺序 reasoning_content →\n // tool_calls (中间无 content text delta) 时, thinking 仍开着且 blockIndex 未推进,\n // 若不在此关闭并递增, tool block 会与 thinking 撞 index 0。用 thinkingBlockIndex 关。\n if (this.thinkingStarted && !this.thinkingStopped) {\n this.thinkingStopped = true;\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.thinkingBlockIndex,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n this.blockIndex++;\n }\n // 关闭 text block (如果有)\n if (this.textStarted) {\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.blockIndex,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n this.blockIndex++;\n this.textStarted = false;\n }\n this.toolBlockIndex.set(toolKey, this.blockIndex);\n const blockJSON = JSON.stringify({\n type: 'content_block_start',\n index: this.blockIndex,\n content_block: {\n type: 'tool_use',\n id: tc.id,\n name: fn?.name,\n input: {},\n },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n this.blockIndex++; // 递增, 为下一个 tool_call block 预留索引\n }\n if (fn?.arguments !== undefined && fn.arguments !== null && fn.arguments !== '') {\n // `arguments` 按 OpenAI 规范是 string,但部分兼容实现直接给对象。此前原样\n // 塞进 `partial_json`,下游 `input += delta.partial_json` 会拼出\n // \"[object Object]\"。这里统一成字符串,语义不变。\n const rawArgs =\n typeof fn.arguments === 'string' ? fn.arguments : JSON.stringify(fn.arguments);\n\n // 累计 vs 增量判别:部分上游每个 chunk 重发**全量**参数而非增量。此前无条件\n // 累加,会拼出 `{\"a\":1}{\"a\":1}{\"a\":1}` 这种必然非法的 JSON。判据取最保守的\n // 一种:新片严格以已累积内容为前缀**且**更长时,才认为上游在重发全量,只发\n // 差值。真增量流里某一片恰好等于「此前全部内容的延长」概率可忽略。\n const accum = this.toolArgsAccum.get(toolKey) ?? '';\n let emit = rawArgs;\n if (accum !== '' && rawArgs.length > accum.length && rawArgs.startsWith(accum)) {\n emit = rawArgs.slice(accum.length);\n this.toolArgsAccum.set(toolKey, rawArgs);\n } else {\n this.toolArgsAccum.set(toolKey, accum + rawArgs);\n }\n\n if (emit !== '') {\n const idx = this.toolBlockIndex.get(toolKey)!;\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: idx,\n delta: {\n type: 'input_json_delta',\n partial_json: emit,\n },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n }\n }\n\n // finish_reason: 关闭所有 block + message_delta + message_stop\n if (choice.finish_reason != null && choice.finish_reason !== '') {\n // stop_reason 映射。`content_filter` 等未列出的值刻意保持原样透传而不是压成\n // `end_turn` —— 把内容审查拦截伪装成正常结束会让下游无从分辨。同文件的\n // `convertOpenAIToChatResponse` 一直是原样透传,这里跟它对齐。\n let stopReason: string;\n switch (choice.finish_reason) {\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'stop':\n stopReason = 'end_turn';\n break;\n default:\n stopReason = choice.finish_reason;\n }\n this.closeOpenBlocks(events, stopReason);\n }\n\n return { events, done: false };\n }\n}\n\nexport function newOpenAIStreamConverter(): OpenAIStreamConverter {\n return new OpenAIStreamConverter();\n}\n","// adapters/index.ts — 端口自 acosmi-sdk-go/adapter.go (v0.19.0)\n//\n// SDK 层按上游托管模型元数据选路:\n// preferred_format == \"anthropic\" → AnthropicAdapter → POST /managed-models/:id/anthropic\n// preferred_format == \"openai\" → OpenAIAdapter → POST /managed-models/:id/chat\n//\n// 旧上游若未返回 preferred_format / supported_formats, SDK 才回落到 provider 名称:\n// provider == \"anthropic\" / \"acosmi\" → AnthropicAdapter\n// 其他 provider → OpenAIAdapter\n//\n// SDK 只负责: 格式路由 + 请求结构转换 + 响应结构转换\n// 厂商特定协议差异 (endpoint/auth/region/字段裁剪) 由 Nexus Gateway Profile 处理\n//\n// ============================================================================\n// 红线 (双产品消费): AnthropicAdapter + OpenAIAdapter 等地位, 不可合并/降级\n// ============================================================================\n\nimport type { ManagedModel, ChatRequest, ChatResponse, StreamEvent, ModelCapabilities } from '../types';\n\n/** 标识请求格式 */\nexport enum ProviderFormat {\n /** Anthropic 原生格式 */\n Anthropic = 0,\n /** OpenAI 兼容格式 */\n OpenAI = 1,\n}\n\n/** 将 ChatRequest 转换为特定格式的 adapter 接口 */\nexport interface ProviderAdapter {\n /** 此 adapter 使用的请求格式 */\n format(): ProviderFormat;\n\n /**\n * API 路径后缀\n * Anthropic: \"/anthropic\", OpenAI: \"/chat\"\n */\n endpointSuffix(): string;\n\n /**\n * 将 ChatRequest 转换为 HTTP body (object → JSON.stringify)\n * caps 用于条件化字段注入 (如 betas)\n */\n buildRequestBody(caps: ModelCapabilities, req: ChatRequest): Record<string, unknown>;\n\n /** 解析同步响应 body 为 ChatResponse */\n parseResponse(body: Uint8Array | string): ChatResponse;\n\n /**\n * 解析一行 SSE data 为 StreamEvent\n * 返回 { event, done }; done=true 表示流结束 ([DONE] 或 message_stop)\n */\n parseStreamLine(eventType: string, data: string): { event: StreamEvent; done: boolean };\n}\n\n// 实现 import 在文件末尾, 避免循环依赖(adapter impl 也需引用 ProviderFormat)\nimport { AnthropicAdapter } from './anthropic';\nimport { OpenAIAdapter } from './openai';\n\n/** 按 provider 名称映射 adapter */\nconst adapterRegistry: Record<string, ProviderAdapter> = {\n anthropic: new AnthropicAdapter(),\n /** Acosmi 自有模型走 Anthropic 格式 */\n acosmi: new AnthropicAdapter(),\n};\n\n/** 非 Anthropic 厂商的默认 adapter */\nconst defaultOpenAIAdapter: ProviderAdapter = new OpenAIAdapter();\n\n/**\n * 根据 provider 返回对应的 adapter (v0.5.0 遗留 API, 向后兼容)\n * 新代码应使用 getAdapterForModel\n */\nexport function getAdapter(provider: string): ProviderAdapter {\n const a = adapterRegistry[provider.toLowerCase()];\n if (a) return a;\n return defaultOpenAIAdapter;\n}\n\n/**\n * 按 ManagedModel 的 preferred_format / supported_formats 选择 adapter\n *\n * 决策顺序:\n * 1. preferred_format 非空 **且** 该格式在 supported_formats 内 (或 supported_formats 未声明)\n * → 按其值返回 (anthropic | openai)\n * 2. supported_formats 含 \"anthropic\" → AnthropicAdapter\n * 3. supported_formats 含 \"openai\" → OpenAIAdapter\n * 4. 两字段均空 (旧上游) → 回落 provider 名硬编码 (原 getAdapter 行为)\n *\n * 这使得 dashscope / zhipu / deepseek 等 provider 的模型如果上游启用了\n * Anthropic 兼容端点, 也能走 /anthropic 路径, 不再被 provider 字符串硬编码到 /chat\n * 导致 tool_reference 400.\n *\n * [格式一致性护栏 2026-05-29] preferred_format 仅在确被 supported_formats 收录时才采信:\n * 防止上游元数据漂移 (preferred_format=anthropic 但 supported_formats=[openai]) 把 SDK\n * 路由到模型并不支持的格式端点 (撞 /anthropic \"未绑定 Anthropic\" 4xx)。这是网关侧\n * \"同 model_id 双 profile 选行\" 根因修复在 SDK 侧的同构护栏。\n */\nexport function getAdapterForModel(m: ManagedModel): ProviderAdapter {\n let hasAnthropic = false;\n let hasOpenAI = false;\n for (const f of m.supported_formats ?? []) {\n switch (f.trim().toLowerCase()) {\n case 'anthropic':\n hasAnthropic = true;\n break;\n case 'openai':\n hasOpenAI = true;\n break;\n }\n }\n const declared = hasAnthropic || hasOpenAI;\n\n const pref = (m.preferred_format ?? '').trim().toLowerCase();\n switch (pref) {\n case 'anthropic':\n if (!declared || hasAnthropic) return new AnthropicAdapter();\n break;\n case 'openai':\n if (!declared || hasOpenAI) return new OpenAIAdapter();\n break;\n }\n\n if (hasAnthropic) return new AnthropicAdapter();\n if (hasOpenAI) return new OpenAIAdapter();\n\n // 旧上游未填字段: 回落到 provider 名硬编码 (向后兼容)\n return getAdapter((m.provider ?? '').toLowerCase());\n}\n\nexport { AnthropicAdapter, OpenAIAdapter };\nexport { OpenAIStreamConverter, newOpenAIStreamConverter } from './openai';\n","import type {\n CredentialSnapshot,\n CredentialCASResult,\n VersionedCredentialStore,\n CredentialReason,\n CredentialRequestOwner,\n} from './store';\nimport type { ServerMetadata, TokenSet, TokenResponse } from '../auth/types';\n\nconst uuid = () => globalThis.crypto.randomUUID();\nconst pause = () => new Promise<void>((resolve) => setTimeout(resolve, 25));\nconst abort = (signal?: AbortSignal) => {\n if (signal?.aborted) throw new Error('aborted');\n};\nconst sameRequestOwner = (snapshot: CredentialSnapshot, expected: CredentialRequestOwner) =>\n snapshot.storeInstanceId === expected.storeInstanceId &&\n snapshot.authSessionId === expected.authSessionId &&\n snapshot.principal?.issuer === expected.principal?.issuer &&\n snapshot.principal?.subject === expected.principal?.subject &&\n snapshot.principal?.organizationId === expected.principal?.organizationId;\nexport type CredentialStateNotification = Omit<CredentialSnapshot, 'tokenSet'>;\nexport interface CredentialProtocol {\n metadata(signal?: AbortSignal): Promise<ServerMetadata>;\n profile(\n tokens: TokenSet,\n signal?: AbortSignal,\n ): Promise<{\n subject: string;\n organizationId: string | null;\n displayName?: string;\n avatarUrl?: string;\n email?: string;\n imageUrl?: string;\n accountCreatedAt?: string;\n requiresPhoneBinding?: boolean;\n hasExtraUsageEnabled?: boolean;\n billingType?: string;\n subscriptionCreatedAt?: string;\n rateLimitTier?: string;\n organizationName?: string;\n }>;\n fetch: typeof fetch;\n serverURL: string;\n}\nexport class CredentialLifecycle {\n private listeners = new Set<(value: CredentialStateNotification) => void>();\n private notificationKey = '';\n private observations = new Map<string, CredentialSnapshot>();\n constructor(\n private store: VersionedCredentialStore,\n private protocol: CredentialProtocol,\n ) {}\n read(signal?: AbortSignal) {\n return this.store.readSnapshot(signal);\n }\n subscribe(listener: (value: CredentialStateNotification) => void) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n private async notify(snapshot: CredentialSnapshot) {\n let current: CredentialSnapshot;\n try {\n current = await this.read();\n } catch {\n return;\n }\n if (\n current.storeInstanceId !== snapshot.storeInstanceId ||\n current.revision !== snapshot.revision\n )\n return;\n const projection: CredentialStateNotification = {\n storeInstanceId: snapshot.storeInstanceId,\n authorityConfig: snapshot.authorityConfig && {\n serverURL: snapshot.authorityConfig.serverURL,\n issuer: snapshot.authorityConfig.issuer,\n oauthProfile: 'desktop',\n authContractVersion: 2,\n errorContractVersion: 1,\n },\n revision: snapshot.revision,\n authSessionId: snapshot.authSessionId,\n credentialState: snapshot.credentialState,\n reason: snapshot.reason,\n principal: snapshot.principal && {\n issuer: snapshot.principal.issuer,\n subject: snapshot.principal.subject,\n organizationId: snapshot.principal.organizationId,\n },\n refreshOperation: snapshot.refreshOperation && {\n operationId: snapshot.refreshOperation.operationId,\n sessionId: snapshot.refreshOperation.sessionId,\n baseRevision: snapshot.refreshOperation.baseRevision,\n phase: snapshot.refreshOperation.phase,\n returnState: snapshot.refreshOperation.returnState,\n startedAt: snapshot.refreshOperation.startedAt,\n dispatchedAt: snapshot.refreshOperation.dispatchedAt,\n deadlineAt: snapshot.refreshOperation.deadlineAt,\n },\n loginAttempt: snapshot.loginAttempt && {\n attemptId: snapshot.loginAttempt.attemptId,\n baseSessionId: snapshot.loginAttempt.baseSessionId,\n startedAt: snapshot.loginAttempt.startedAt,\n },\n lastMutation: snapshot.lastMutation && {\n mutationId: snapshot.lastMutation.mutationId,\n operationId: snapshot.lastMutation.operationId,\n resultRevision: snapshot.lastMutation.resultRevision,\n },\n lastLoginAttemptId: snapshot.lastLoginAttemptId,\n verifiedIdentity: snapshot.verifiedIdentity && {\n authSessionId: snapshot.verifiedIdentity.authSessionId,\n principal: {\n issuer: snapshot.verifiedIdentity.principal.issuer,\n subject: snapshot.verifiedIdentity.principal.subject,\n organizationId: snapshot.verifiedIdentity.principal.organizationId,\n },\n displayName: snapshot.verifiedIdentity.displayName,\n avatarUrl: snapshot.verifiedIdentity.avatarUrl,\n email: snapshot.verifiedIdentity.email,\n imageUrl: snapshot.verifiedIdentity.imageUrl,\n accountCreatedAt: snapshot.verifiedIdentity.accountCreatedAt,\n requiresPhoneBinding: snapshot.verifiedIdentity.requiresPhoneBinding,\n hasExtraUsageEnabled: snapshot.verifiedIdentity.hasExtraUsageEnabled,\n billingType: snapshot.verifiedIdentity.billingType,\n subscriptionCreatedAt: snapshot.verifiedIdentity.subscriptionCreatedAt,\n rateLimitTier: snapshot.verifiedIdentity.rateLimitTier,\n organizationName: snapshot.verifiedIdentity.organizationName,\n verifiedAt: snapshot.verifiedIdentity.verifiedAt,\n },\n };\n const key = JSON.stringify({ ...projection, revision: undefined, lastMutation: undefined });\n if (key === this.notificationKey) return;\n this.notificationKey = key;\n for (const listener of this.listeners) {\n try {\n listener(structuredClone(projection));\n } catch {\n /* observer isolation */\n }\n }\n }\n async reconcile(signal?: AbortSignal) {\n const s = await this.read(signal);\n await this.notify(s);\n return s;\n }\n private cas(\n s: CredentialSnapshot,\n changes: Partial<CredentialSnapshot>,\n mutationId = uuid(),\n signal?: AbortSignal,\n ): Promise<CredentialCASResult> {\n return this.store.compareAndSwap(\n {\n storeInstanceId: s.storeInstanceId,\n revision: s.revision,\n authSessionId: s.authSessionId,\n state: s.credentialState,\n operationId: s.refreshOperation?.operationId ?? s.loginAttempt?.attemptId ?? null,\n },\n { ...s, ...changes },\n mutationId,\n signal,\n );\n }\n private async commit(\n s: CredentialSnapshot,\n changes: Partial<CredentialSnapshot>,\n signal?: AbortSignal,\n ) {\n const r = await this.cas(s, changes, uuid(), signal);\n if (r.status === 'storage_error') throw new Error('storage_unavailable');\n if (r.status === 'committed') await this.notify(r.snapshot);\n return r;\n }\n async metadata(s: CredentialSnapshot, signal?: AbortSignal) {\n const m = await this.protocol.metadata(signal);\n if (\n m.crabcode_auth_contract_version !== 2 ||\n m.gateway_error_contract_version !== 1 ||\n !m.issuer\n )\n throw new Error('auth_contract_unsupported');\n if (\n s.authorityConfig &&\n (s.authorityConfig.serverURL !== this.protocol.serverURL ||\n s.authorityConfig.issuer !== m.issuer ||\n s.authorityConfig.oauthProfile !== 'desktop' ||\n s.authorityConfig.authContractVersion !== 2 ||\n s.authorityConfig.errorContractVersion !== 1)\n )\n throw new Error('auth_contract_unsupported');\n return m;\n }\n async reserveLogin(signal?: AbortSignal) {\n const attemptId = uuid();\n let reserved: CredentialSnapshot;\n for (;;) {\n abort(signal);\n const s = await this.read(signal);\n if (s.credentialState !== 'signed_out') throw new Error('local_logout_required');\n const r = await this.commit(s, { loginAttempt: { attemptId, baseSessionId: s.authSessionId, startedAt: new Date().toISOString() } }, signal);\n if (r.status === 'committed') { reserved = r.snapshot; break; }\n }\n try {\n const m = await this.metadata(reserved, signal);\n for (;;) {\n abort(signal);\n const current = await this.read(signal);\n if (current.storeInstanceId !== reserved.storeInstanceId || current.loginAttempt?.attemptId !== attemptId) throw new Error('superseded');\n if (current.authorityConfig) return { attemptId, metadata: m };\n const r = await this.commit(current, { authorityConfig: { serverURL: this.protocol.serverURL, issuer: m.issuer, oauthProfile: 'desktop', authContractVersion: 2, errorContractVersion: 1 } }, signal);\n if (r.status === 'committed') return { attemptId, metadata: m };\n }\n } catch (error) { await this.cancelLogin(attemptId); throw error; }\n }\n async installLogin(attemptId: string, tokens: TokenSet, signal?: AbortSignal) {\n this.validateTokens(tokens);\n for (;;) {\n abort(signal);\n const s = await this.read(signal);\n if (\n s.loginAttempt?.attemptId !== attemptId ||\n s.loginAttempt.baseSessionId !== s.authSessionId\n )\n throw new Error('superseded');\n const r = await this.commit(\n s,\n {\n authSessionId: uuid(),\n tokenSet: tokens,\n credentialState: 'pending_identity',\n principal: null,\n verifiedIdentity: null,\n loginAttempt: null,\n lastLoginAttemptId: attemptId,\n reason: 'identity_unavailable',\n },\n signal,\n );\n if (r.status === 'committed') return this.bindIdentity(r.snapshot.authSessionId!, signal);\n }\n }\n async assertLogin(attemptId: string, signal?: AbortSignal) {\n abort(signal);\n const s = await this.read(signal);\n if (s.loginAttempt?.attemptId !== attemptId) throw new Error('superseded');\n }\n async cancelLogin(attemptId: string) {\n const s = await this.read();\n if (s.loginAttempt?.attemptId === attemptId) await this.commit(s, { loginAttempt: null });\n }\n private validateTokens(t: TokenSet) {\n if (\n !t.access_token?.trim() ||\n !t.refresh_token?.trim() ||\n !t.client_id?.trim() ||\n t.server_url !== this.protocol.serverURL ||\n !Number.isFinite(Date.parse(t.expires_at)) ||\n Date.parse(t.expires_at) <= Date.now()\n )\n throw new Error('invalid_response');\n }\n private usable(s: CredentialSnapshot) {\n return !!s.tokenSet && Date.parse(s.tokenSet.expires_at) > Date.now() + 300_000;\n }\n async bindIdentity(sessionId: string, signal?: AbortSignal): Promise<CredentialSnapshot> {\n const s = await this.ensureSnapshot(signal, undefined, true);\n if (s.authSessionId !== sessionId) throw new Error('superseded');\n if (s.credentialState === 'ready') return s;\n await this.metadata(s, signal);\n const beforeProfile = await this.read(signal);\n if (\n beforeProfile.storeInstanceId !== s.storeInstanceId ||\n beforeProfile.authSessionId !== sessionId ||\n beforeProfile.revision !== s.revision ||\n beforeProfile.credentialState !== 'pending_identity'\n )\n throw new Error('superseded');\n let identity;\n try {\n identity = await this.protocol.profile(s.tokenSet!, signal);\n } catch (error) {\n const message = error instanceof Error ? error.message : '';\n if (message === 'invalid_scope' || message === 'auth_contract_unsupported')\n await this.commit(s, { credentialState: 'configuration_error', reason: message });\n throw error;\n }\n abort(signal);\n const current = await this.read(signal);\n if (\n current.storeInstanceId !== s.storeInstanceId ||\n current.authSessionId !== sessionId ||\n current.revision !== s.revision\n )\n throw new Error('superseded');\n if (!identity.subject) throw new Error('invalid_response');\n const principal = {\n issuer: s.authorityConfig!.issuer,\n subject: identity.subject,\n organizationId: identity.organizationId,\n };\n const r = await this.commit(\n s,\n {\n principal,\n verifiedIdentity: {\n authSessionId: sessionId,\n principal,\n displayName: identity.displayName,\n avatarUrl: identity.avatarUrl,\n email: identity.email,\n imageUrl: identity.imageUrl,\n accountCreatedAt: identity.accountCreatedAt,\n requiresPhoneBinding: identity.requiresPhoneBinding,\n hasExtraUsageEnabled: identity.hasExtraUsageEnabled,\n billingType: identity.billingType,\n subscriptionCreatedAt: identity.subscriptionCreatedAt,\n rateLimitTier: identity.rateLimitTier,\n organizationName: identity.organizationName,\n verifiedAt: new Date().toISOString(),\n },\n credentialState: 'ready',\n reason: null,\n },\n signal,\n );\n if (r.status !== 'committed') throw new Error('superseded');\n return r.snapshot;\n }\n async ensure(signal?: AbortSignal, rejected?: CredentialSnapshot, expected?: CredentialRequestOwner) {\n const snapshot = await this.ensureSnapshot(signal, rejected, false, expected);\n this.observations.set(snapshot.tokenSet!.access_token, snapshot);\n if (this.observations.size > 128)\n this.observations.delete(this.observations.keys().next().value!);\n return snapshot.tokenSet!.access_token;\n }\n async forceRefresh(signal?: AbortSignal, rejectedToken?: string, expected?: CredentialRequestOwner) {\n const rejected = rejectedToken ? this.observations.get(rejectedToken) : await this.read(signal);\n if (rejectedToken && !rejected) throw new Error('credential_observation_unavailable');\n return this.ensure(signal, rejected, expected);\n }\n private async ensureSnapshot(\n signal?: AbortSignal,\n rejected?: CredentialSnapshot,\n pending = false,\n expected?: CredentialRequestOwner,\n ): Promise<CredentialSnapshot> {\n let session: string | null | undefined;\n let instance: string | undefined;\n let initialRevision: string | undefined;\n let refreshed = false;\n let initialAccess: string | undefined;\n for (;;) {\n abort(signal);\n const s = await this.read(signal);\n if (expected && !sameRequestOwner(s, expected)) throw new Error('superseded');\n if (s.authorityConfig && s.authorityConfig.serverURL !== this.protocol.serverURL)\n throw new Error('auth_contract_unsupported');\n if (session === undefined) {\n session = s.authSessionId;\n instance = s.storeInstanceId;\n initialRevision = s.revision;\n initialAccess = s.tokenSet?.access_token;\n }\n if (\n s.storeInstanceId !== instance ||\n s.authSessionId !== session ||\n (rejected &&\n (s.authSessionId !== rejected.authSessionId ||\n s.storeInstanceId !== rejected.storeInstanceId))\n )\n throw new Error('superseded');\n if (s.credentialState === 'refresh_dispatched') {\n if (Date.now() >= Date.parse(s.refreshOperation!.deadlineAt!))\n await this.commit(s, {\n credentialState: 'reauth_required',\n tokenSet: null,\n refreshOperation: null,\n reason: 'refresh_outcome_unknown',\n });\n else await pause();\n continue;\n }\n if (s.credentialState === 'refresh_reserved') {\n if (Date.now() >= Date.parse(s.refreshOperation!.startedAt) + 30_000)\n await this.commit(s, {\n credentialState: s.refreshOperation!.returnState,\n refreshOperation: null,\n });\n else await pause();\n continue;\n }\n if (s.credentialState !== 'ready' && !(pending && s.credentialState === 'pending_identity'))\n throw new Error(`credential_unavailable:${s.credentialState}:${s.reason ?? ''}`);\n const live = !!s.tokenSet && Date.parse(s.tokenSet.expires_at) > Date.now();\n if (\n live &&\n (refreshed ||\n (s.revision !== (rejected?.revision ?? initialRevision) &&\n (rejected !== undefined || s.tokenSet!.access_token !== initialAccess)))\n )\n return s;\n if (this.usable(s) && !rejected) return s;\n const metadata = await this.metadata(s, signal);\n abort(signal);\n const operationId = uuid();\n const r = await this.commit(\n s,\n {\n credentialState: 'refresh_reserved',\n refreshOperation: {\n operationId,\n sessionId: s.authSessionId!,\n baseRevision: s.revision,\n phase: 'reserved',\n returnState: s.credentialState,\n startedAt: new Date().toISOString(),\n dispatchedAt: null,\n deadlineAt: null,\n },\n },\n signal,\n );\n if (r.status !== 'committed') continue;\n // The operation owns its lifecycle independently of all callers' waiting signals.\n const owner = this.refresh(r.snapshot, metadata);\n await this.wait(owner, signal);\n refreshed = true;\n rejected = undefined;\n }\n }\n private wait<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return promise;\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener('abort', onAbort);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener('abort', onAbort);\n reject(error);\n },\n );\n if (signal.aborted) onAbort();\n });\n }\n private async refresh(reserved: CredentialSnapshot, metadata: ServerMetadata) {\n const dispatchedAt = Date.now();\n const r = await this.commit(reserved, {\n credentialState: 'refresh_dispatched',\n refreshOperation: {\n ...reserved.refreshOperation!,\n phase: 'dispatched',\n dispatchedAt: new Date(dispatchedAt).toISOString(),\n deadlineAt: new Date(dispatchedAt + 30_000).toISOString(),\n },\n });\n if (r.status !== 'committed') return;\n const s = r.snapshot;\n const ctl = new AbortController();\n const timeout = setTimeout(() => ctl.abort(), 30_000);\n let tokens: TokenSet;\n try {\n const result = await this.wait(\n (async () => {\n const response = await this.protocol.fetch(metadata.token_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: s.tokenSet!.client_id,\n refresh_token: s.tokenSet!.refresh_token,\n }),\n signal: ctl.signal,\n });\n const body = await response.json();\n return { response, body };\n })(),\n ctl.signal,\n );\n if (!result.response.ok) {\n const code = result.body.error;\n let reason: CredentialReason = 'refresh_outcome_unknown';\n let state: CredentialSnapshot['credentialState'] = 'reauth_required';\n if (code === 'invalid_grant') reason = code;\n else if (['invalid_client', 'invalid_scope', 'unsupported_grant_type'].includes(code)) {\n reason = code;\n state = 'configuration_error';\n } else if (\n result.body.rotationOutcome === 'not_committed' &&\n ['temporarily_unavailable', 'server_error'].includes(code)\n ) {\n await this.commit(s, {\n credentialState: s.refreshOperation!.returnState,\n refreshOperation: null,\n });\n throw new Error('refresh_temporarily_unavailable');\n }\n await this.commit(s, {\n credentialState: state,\n tokenSet: null,\n refreshOperation: null,\n reason,\n });\n throw new Error(reason);\n }\n const body = result.body as TokenResponse;\n if (!Number.isFinite(body.expires_in) || body.expires_in <= 0)\n throw new Error('invalid_response');\n tokens = {\n ...s.tokenSet!,\n access_token: body.access_token,\n refresh_token: body.refresh_token!,\n expires_at: new Date(Date.now() + body.expires_in * 1000).toISOString(),\n scope: body.scope ?? s.tokenSet!.scope,\n };\n this.validateTokens(tokens);\n } catch (error) {\n await this.commit(s, {\n credentialState: 'reauth_required',\n tokenSet: null,\n refreshOperation: null,\n reason: 'refresh_outcome_unknown',\n });\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n const started = performance.now(),\n mutationId = uuid();\n for (;;) {\n if (Date.now() >= Date.parse(s.refreshOperation!.deadlineAt!)) {\n await this.commit(s, {\n credentialState: 'reauth_required',\n tokenSet: null,\n refreshOperation: null,\n reason: 'refresh_outcome_unknown',\n });\n void this.revoke(tokens, metadata);\n throw new Error('refresh_outcome_unknown');\n }\n const result = await this.cas(\n s,\n {\n tokenSet: tokens,\n credentialState: s.refreshOperation!.returnState,\n refreshOperation: null,\n },\n mutationId,\n );\n if (result.status === 'committed') {\n await this.notify(result.snapshot);\n return;\n }\n if (result.status === 'superseded') {\n void this.revoke(tokens, metadata);\n return;\n }\n if (performance.now() - started >= 2000) throw new Error('credential_persist_failed');\n await pause();\n }\n }\n private async revoke(tokens: TokenSet, metadata?: ServerMetadata, authority?: CredentialSnapshot): Promise<'confirmed' | 'failed' | 'unsupported'> {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 30_000);\n try {\n const m = metadata ?? await this.wait(authority ? this.metadata(authority, ctl.signal) : this.protocol.metadata(ctl.signal), ctl.signal);\n if (!m.revocation_endpoint) return 'unsupported';\n const response = await this.wait(this.protocol.fetch(m.revocation_endpoint, {\n method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ token: tokens.refresh_token, token_type_hint: 'refresh_token' }), signal: ctl.signal,\n }), ctl.signal);\n return response.ok ? 'confirmed' : 'failed';\n } catch { return 'failed'; }\n finally { clearTimeout(timer); }\n }\n async logout(\n signal?: AbortSignal,\n expected?: { storeInstanceId: string; authSessionId: string | null },\n ) {\n let s = await this.read(signal);\n if (expected && (s.storeInstanceId !== expected.storeInstanceId || s.authSessionId !== expected.authSessionId)) {\n return {\n logoutOperationId: uuid(), expectedAuthSessionId: expected.authSessionId,\n storeInstanceId: expected.storeInstanceId, revision: s.revision,\n status: 'superseded' as const,\n };\n }\n const session = s.authSessionId,\n instance = s.storeInstanceId,\n started = performance.now(),\n logoutOperationId = uuid();\n const receipt = () => ({\n logoutOperationId,\n expectedAuthSessionId: session,\n storeInstanceId: instance,\n revision: s.revision,\n });\n for (;;) {\n abort(signal);\n if (s.storeInstanceId !== instance || s.authSessionId !== session)\n return { ...receipt(), status: 'superseded' as const };\n if (s.credentialState === 'signed_out' && !s.loginAttempt)\n return { ...receipt(), status: 'already_signed_out' as const };\n const r = await this.cas(\n s,\n {\n credentialState: 'signed_out',\n authSessionId: null,\n principal: null,\n tokenSet: null,\n refreshOperation: null,\n loginAttempt: null,\n lastLoginAttemptId: null,\n verifiedIdentity: null,\n reason: null,\n },\n logoutOperationId,\n signal,\n );\n if (r.status === 'committed') {\n await this.notify(r.snapshot);\n return {\n ...receipt(),\n revision: r.snapshot.revision,\n status: 'committed' as const,\n revocation: s.tokenSet\n ? this.revoke(s.tokenSet, undefined, s)\n : Promise.resolve('unsupported' as const),\n };\n }\n if (performance.now() - started >= 2000) throw new Error('storage_busy');\n await pause();\n s = await this.read(signal);\n }\n }\n}\n","import { CredentialLifecycle, type CredentialStateNotification } from './credentials';\n// client.ts — 端口自 acosmi-sdk-go/client.go (2168 行)\n//\n// 主 Client class (核心: token 管理 / login / chat / SSE / HTTP)。\n// 业务方法 (entitlements / packages / wallet / skills / tools / notifications)\n// 通过 declaration merging 拆到 ./client-mixins/*。\n//\n// 核心红线:\n// - chat 路由用 getAdapterForModel (双格式等地位)\n// - 流式重试 = 双扣 → 流式路径不走 doRequestWithRetry, 仅 doRequest\n// - SafeToRetry POST 默认 false (计费安全)\n// - 401 单次重试, retried 参数防递归\n\nimport { type AnthropicResponse } from '../models/wire-anthropic';\nimport {\n type ChatRequest,\n type ChatResponse,\n type ManagedModel,\n type ModelCapabilities,\n type QuotaSummary,\n type WindowResetSummary,\n type SourcesEvent,\n type StreamEvent,\n type StreamSettlement,\n type ImageGenerationRequest,\n type ImageGenerationResponse,\n type VideoGenerationRequest,\n type VideoTaskResponse,\n type EmbeddingRequest,\n type EmbeddingResponse,\n type RerankRequest,\n type RerankResponse,\n parseSettlement,\n parseSourcesEvent,\n} from '../models/types';\nimport { type ModelCoefficient } from '../billing/types';\nimport { type ServerMetadata, type TokenSet, tokenSetIsExpired } from '../auth/types';\nimport { ModelNotFoundError, isUserAccessTokenRejected, readGatewayErrorContract } from '../shared/errors';\nimport { type APIResponse, apiResponseBusinessError } from '../shared/api-response';\nimport {\n discover,\n discoverWithProfile,\n exchangeCode,\n exchangeCodeWithExpiry,\n refreshToken,\n register,\n revokeToken,\n authorize,\n newTokenSet,\n isSSLError,\n isInvalidGrantError,\n EventComplete,\n EventError,\n ErrDiscovery,\n ErrRegistration,\n ErrSSLProxy,\n ErrTokenExchange,\n type LoginEvent,\n type LoginErrCode,\n type LoginOptions,\n type OAuthMetadataProfile,\n} from '../auth/auth';\nimport {\n type CredentialSnapshot,\n type CredentialRequestOwner,\n type VersionedCredentialStore,\n type TokenStore,\n FileTokenStore,\n InMemoryTokenStore,\n LocalStorageTokenStore,\n} from './store';\nimport { type RetryPolicy, effectivePolicy, computeBackoff } from './retry';\nimport {\n getAdapterForModel,\n ProviderFormat,\n type ProviderAdapter,\n} from '../models/adapters/index';\nimport { extractAnthropicBlockMeta, type BlockMeta } from '../models/stream-meta';\nimport { newOpenAIStreamConverter } from '../models/adapters/openai';\nimport { isSSECommentLine } from '../models/enduser';\nimport {\n classifyTransport,\n iterSSELines,\n maxErrorBodySize,\n modelCacheTTLMs,\n parseHTTPErrorWithHeader,\n parseStreamError,\n readLimited,\n} from './http';\nimport type { MinimalSanitizeConfig } from '../sanitize';\n\n// =============================================================================\n// FilterStatus — V30 二轮审计 D-P1-2: X-Entitlement-Filter-Status 头取值集\n// =============================================================================\n\nexport type FilterStatus =\n | 'ok'\n | 'admin-bypass'\n | 'internal-bypass'\n | 'disabled-by-flag'\n | 'fallback-tkdist-error'\n | 'fallback-tkdist-deployment-skew'\n | 'fallback-no-buckets'\n | 'fallback-missing-userid'\n | '';\n\nexport const FilterStatusOK: FilterStatus = 'ok';\nexport const FilterStatusAdminBypass: FilterStatus = 'admin-bypass';\nexport const FilterStatusInternalBypass: FilterStatus = 'internal-bypass';\nexport const FilterStatusDisabledByFlag: FilterStatus = 'disabled-by-flag';\nexport const FilterStatusFallbackTkdistError: FilterStatus = 'fallback-tkdist-error';\nexport const FilterStatusFallbackTkdistSkew: FilterStatus = 'fallback-tkdist-deployment-skew';\nexport const FilterStatusFallbackNoBuckets: FilterStatus = 'fallback-no-buckets';\nexport const FilterStatusFallbackMissingUser: FilterStatus = 'fallback-missing-userid';\nexport const FilterStatusUnknown: FilterStatus = '';\n\n// =============================================================================\n// Gateway URL 契约 (Phase 0 §2)\n// =============================================================================\n\n/** Acosmi Gateway URL 默认值 — 与历史行为一致。 */\nexport const DEFAULT_GATEWAY_BASE_URL = 'https://acosmi.com';\n\n/**\n * normalizeGatewayBaseURL — Acosmi nexus-v4 API Gateway URL 的归一化与校验。\n *\n * 红线 (Phase 0 契约 §1-§2):\n * 1. 仅允许 `http:` / `https:`;`ws:` / `wss:` 是 CrabCode `--sdk-url`\n * RemoteIO 会话通道,不是 SDK API gateway URL,传入立刻抛错。\n * 2. URL 必须可被 `new URL()` 解析;非法输入立刻抛错。\n * 3. host 必须非空;query/hash 不允许 (gateway URL 不带 query)。\n * 4. pathname 去尾 `/`;末段允许是 `/api/v4` (`apiURL()` 不会重复追加)。\n * 5. 返回值是 `origin + pathname`,不带 query/hash/trailing slash。\n *\n * 该函数是公共 helper:CrabCode AppServer worker、CrabClaw 内部、外部第三方 SDK\n * 都应在写入 Acosmi base 之前调用它一次,避免 ws/wss 误入 SDK API client。\n */\nexport function normalizeGatewayBaseURL(input: unknown): string {\n if (typeof input !== 'string') {\n throw new TypeError(\n 'Acosmi Gateway URL must be a string (see docs/audit/sdk-remote-control-contract-2026-05-27.md §2)',\n );\n }\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new Error('Acosmi Gateway URL is empty');\n }\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new Error(`Acosmi Gateway URL is not a valid URL: ${trimmed}`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(\n `Acosmi Gateway URL only allows http/https, got ${parsed.protocol} (${trimmed}). ` +\n `CrabCode --sdk-url (ws/wss) is the RemoteIO session channel, not a SDK gateway URL ` +\n `— see docs/audit/sdk-remote-control-contract-2026-05-27.md §1.`,\n );\n }\n if (!parsed.host) {\n throw new Error(`Acosmi Gateway URL has empty host: ${trimmed}`);\n }\n if (parsed.search.length > 0 || parsed.hash.length > 0) {\n throw new Error(`Acosmi Gateway URL must not contain query or hash: ${trimmed}`);\n }\n // 去尾 / (空 path => 仅 origin)\n const path = parsed.pathname.replace(/\\/+$/, '');\n return path ? `${parsed.origin}${path}` : parsed.origin;\n}\n\n/**\n * normalizeOverrideBaseURL — 校验并归一化 override base URL (complianceBaseURL / apiBaseURL)。\n *\n * 与 `normalizeGatewayBaseURL` 同级的健壮性校验, 但用于 compliance / 开放 API 的同源直连 base:\n * 1. 必须是 string 且非空。\n * 2. 必须可被 `new URL()` 解析, 且协议为 `http:` / `https:` (ws/wss 不允许)。\n * 3. host 必须非空; 不允许 query / hash (override base 不带 query)。\n * 4. 返回值去尾随 `/` (origin + pathname)。\n *\n * 注意: helper 只校验 base URL 合法性, 不强加路径后缀 — compliance 走 `/admin-api`、\n * apiBaseURL 走 `/api/v4` 都由各自 `complianceURL()` / `apiURL()` 在 base 之上追加,\n * base 本身不含这些子路径。\n *\n * @param raw 原始配置值\n * @param label 出错信息里的字段名 (如 'complianceBaseURL')\n */\nexport function normalizeOverrideBaseURL(raw: string, label: string): string {\n if (typeof raw !== 'string') {\n throw new TypeError(`${label} must be a string`);\n }\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(`${label} is empty`);\n }\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new Error(`${label} is not a valid URL: ${trimmed}`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`${label} only allows http/https, got ${parsed.protocol} (${trimmed})`);\n }\n if (!parsed.host) {\n throw new Error(`${label} has empty host: ${trimmed}`);\n }\n if (parsed.search.length > 0 || parsed.hash.length > 0) {\n throw new Error(`${label} must not contain query or hash: ${trimmed}`);\n }\n const path = parsed.pathname.replace(/\\/+$/, '');\n return path ? `${parsed.origin}${path}` : parsed.origin;\n}\n\n/**\n * pickAndNormalizeGatewayURL — Config 中三个 alias (serverURL/baseURL/baseUrl)\n * 取唯一规范值。多字段同时传入且 normalize 后不等时抛错。\n * 未传任一字段返回 `null`,由调用方决定是否填默认值。\n */\nfunction pickAndNormalizeGatewayURL(cfg: Config): string | null {\n const inputs: Array<readonly [name: 'serverURL' | 'baseURL' | 'baseUrl', value: string]> = [];\n if (cfg.serverURL !== undefined) inputs.push(['serverURL', cfg.serverURL] as const);\n if (cfg.baseURL !== undefined) inputs.push(['baseURL', cfg.baseURL] as const);\n if (cfg.baseUrl !== undefined) inputs.push(['baseUrl', cfg.baseUrl] as const);\n if (inputs.length === 0) return null;\n const normalized = inputs.map(([n, v]) => [n, normalizeGatewayBaseURL(v)] as const);\n for (let i = 1; i < normalized.length; i++) {\n if (normalized[i][1] !== normalized[0][1]) {\n throw new Error(\n `Acosmi Gateway URL conflict: Config.${normalized[0][0]}=${normalized[0][1]} ` +\n `vs Config.${normalized[i][0]}=${normalized[i][1]} — pass only one field.`,\n );\n }\n }\n return normalized[0][1];\n}\n\n// =============================================================================\n// Config\n// =============================================================================\n\n/** 客户端配置 */\nexport interface Config {\n /**\n * Acosmi nexus-v4 API Gateway 根地址 (默认 https://acosmi.com)。\n *\n * 该 URL 是 `@acosmi/sdk-ts` 调 Acosmi 云端 API 的根 — agent-runs /\n * managed-models / notifications WS / compliance 都从它派生。SDK 内部\n * `apiURL()` 会自动追加 `/api/v4`,调用方无需手动拼。\n *\n * 见 Phase 0 契约 `docs/audit/sdk-remote-control-contract-2026-05-27.md` §1-§2:\n * - 协议: 仅允许 `http:` / `https:`;`ws:` / `wss:` 是 CrabCode `--sdk-url`\n * RemoteIO 会话通道,不是 SDK gateway URL,传入将抛 `Error`。\n * - `serverURL` / `baseURL` / `baseUrl` 三字段同语义,多写时 normalize 后必须相等。\n */\n serverURL?: string;\n\n /**\n * `serverURL` 的标准 alias (推荐拼写)。语义、normalize、校验完全等同 serverURL。\n * 见 Phase 0 契约 §2。同时传入 serverURL/baseURL/baseUrl 时三者 normalize 后必须相等。\n */\n baseURL?: string;\n\n /**\n * `serverURL` 的 camelCase-小写 alias。语义、normalize、校验完全等同 serverURL。\n * 见 Phase 0 契约 §2。\n */\n baseUrl?: string;\n\n /** token 持久化实现, 缺省时按平台选 (Node File / Browser LocalStorage / Memory) */\n store?: TokenStore;\n\n /** Opt-in durable CAS credential lifecycle. Legacy callers omit this field. */\n credentialMode?: 'legacy' | 'versioned' | 'external';\n\n /** Required exactly when credentialMode is versioned. */\n versionedCredentialStore?: VersionedCredentialStore;\n\n /** Optional owner fence for requests issued by this versioned Client. */\n credentialRequestOwner?: CredentialRequestOwner;\n\n /** Supplies a source-owned access token for each request in external mode. */\n accessTokenProvider?: (signal?: AbortSignal) => Promise<string> | string;\n\n /** Runs after a new authorization-code exchange and before durable install. */\n beforeCredentialInstall?: (\n input: { accessToken: string; attemptId: string; serverURL: string; clientId: string },\n signal?: AbortSignal,\n ) => Promise<void> | void;\n\n /** 自定义 fetch 实现 (默认 globalThis.fetch) */\n fetchImpl?: typeof fetch;\n\n /**\n * 重试策略 (L6, v0.15)\n *\n * undefined = 禁用重试 (v0.14.1 行为, 老调用方 0 影响)\n * 非 undefined = 启用 — 默认 SafeToRetry POST=false 兜底, chat/messages POST 仍 0 retry\n * GET 类查询 (skill-store/models/balance) 自动得 2x 稳定性\n *\n * 计费安全: 自定义 SafeToRetry 时, 严禁让 POST chat/messages 通过, 否则双扣\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Compliance (时间章 / 电子证据 / 合同签署) API 根地址。\n *\n * Java compliance 模块的 controller 注册在 `/compliance/...` 下,部署到\n * `/admin-api/*` 前缀。未配置时默认 `${serverURL}/admin-api`,也可显式覆盖到\n * 独立 ingress(如 `https://compliance.example.com`)。\n *\n * 该地址不被 `/api/v4` 拼接路径复用,compliance 调用走自己的子 client\n * `client.compliance.*`,不与既有模型网关 API 冲突。\n */\n complianceBaseURL?: string;\n\n /**\n * `/api/v4` 网关调用 (managed-model / agent-run / casehall 等) 的 base 覆盖。\n *\n * 未配置时默认 = `serverURL`(既有行为,所有既有消费方不受影响)。\n *\n * 用途:浏览器部署在**非网关同源**域名(如 sign.zhonglvbao.com)时,网关\n * acosmi.com 对带 `Origin` 头的跨域浏览器请求返 403(CORS 收紧)。把本字段设为\n * 同源代理 base(如 `window.location.origin`)、并在该域名 nginx 加\n * `location /api/v4/ { proxy_pass https://acosmi.com/api/v4/; proxy_set_header Origin \"\"; }`\n * 服务端转发,即可让浏览器侧 casehall / 网关调用走同源 → nginx 服务端转发 →\n * 规避跨域 403。仅设在**浏览器端** client;服务端 (Route Handler) client 不设本字段,\n * 直连 `serverURL` 即可(服务端到 acosmi.com 无跨域)。\n *\n * 与 `complianceBaseURL` 同构(compliance 走 `/admin-api`,本字段走 `/api/v4`)。\n * apiURL() 仍按需追加 `/api/v4`,调用方无需手动拼。\n */\n apiBaseURL?: string;\n\n /**\n * OAuth metadata profile — 决定 `ensureToken` 刷新 token 时\n * 发现 metadata 走哪个 well-known 端点。\n *\n * - `'desktop'` (默认): `/.well-known/oauth-authorization-server/desktop`\n * — 桌面 loopback OAuth (`login()`) 流程。\n * - `'web'`: `/.well-known/oauth-authorization-server/web`\n * — 浏览器 Web OAuth (csign 等第一方 Web 应用) 签发的 token,\n * 其 refresh 必须走 Web token 端点。\n *\n * 未设置时默认 `'desktop'`,对既有调用方行为完全无影响。\n * `login()` 桌面 loopback 路径不受此配置影响。\n */\n oauthMetadataProfile?: OAuthMetadataProfile;\n\n /**\n * Browser refresh strategy for Web OAuth tokens.\n *\n * - `'direct'` (default): refresh directly against the OAuth token endpoint.\n * - `'server-proxy'`: POST the current TokenSet to a same-origin refresh proxy,\n * useful when the OAuth issuer intentionally blocks browser CORS.\n * - `'none'`: do not refresh automatically; expired tokens throw `token_expired`.\n */\n browserRefreshMode?: BrowserRefreshMode;\n\n /** Same-origin refresh proxy URL used when `browserRefreshMode='server-proxy'`. */\n refreshProxyURL?: string;\n}\n\nexport type BrowserRefreshMode = 'direct' | 'server-proxy' | 'none';\n\nexport const ErrOAuthCORSBlocked = 'oauth_cors_blocked' as const;\nexport const ErrRefreshProxyFailed = 'refresh_proxy_failed' as const;\nexport const ErrTokenExpired = 'token_expired' as const;\n\n/**\n * v1.6.0: chat / chatMessages / chatStream / chatMessagesStream 的 per-request 超时上限。\n *\n * 上游 (如 DeepSeek) 在开始推理前可能持续保活长达 10 分钟; SDK 必须容纳\n * \"首字节前等待 + 推理 + 流式传输\" 全程, 否则会在等待阶段误超时切断。\n * 单值覆盖, 不区分首字节 vs 总耗时 (AbortController 是总耗时上限)。\n *\n * 2026-08-06 导出: 供回归闸门按**符号**断言, 避免测试抄字面量后与本常量各自漂移\n * (抄件断言恒绿 = 零覆盖)。消费方若要自定义更短预算, 传 signal 即可 —\n * withRequestTimeout 取二者先到者, 无需读本值。\n */\nexport const CHAT_REQUEST_TIMEOUT_MS = 11 * 60 * 1000;\n\n/**\n * 流式链路的\"对端还活着\"回调 (2026-08-06)。\n *\n * **为什么需要它**: 消费方 (如 CrabCode) 自带流空闲看门狗, 判据是\"多久没收到事件\"。\n * 但 SSE 上有两类**有字节、无事件**的情形, 看门狗对它们完全失明:\n * 1. 上游/网关在推理前发的保活注释行 (\": keep-alive\") — 被 isSSECommentLine 吞掉\n * 2. OpenAI 格式下 converter.convert() 对某些 data 行返回零事件\n * 两种情形下连接都健康、字节在流动, 看门狗却会掐流。心跳只有在**抵达做判决的那一层**\n * 时才叫心跳 —— 网关补心跳而 SDK 吞掉, 等于没补。\n *\n * 本回调对**每一条** SSE 行触发一次 (含注释行), 早于任何过滤与解析。语义是\n * \"链路刚刚有动静\", 不是\"来了一个事件\" —— 消费方拿它重置自己的空闲计时器即可。\n * 回调抛错会被吞掉且不中断流 (它是旁路信号, 不该有能力杀死主链路)。\n */\nexport type UpstreamActivityCallback = () => void;\n\n/** 触发活性回调; 消费方回调抛错不得污染流 (见 UpstreamActivityCallback)。 */\nfunction notifyUpstreamActivity(cb: UpstreamActivityCallback | undefined): void {\n if (!cb) return;\n try {\n cb();\n } catch {\n /* 旁路信号: 消费方的错误不传播回流式主链路 */\n }\n}\n\n/**\n * 网关下发消费请求 ID 的响应头名。\n *\n * 值 = cloud-agent 的 `consumeRequestID`, 也就是 `managed_model_usage_logs.request_id`\n * 的值 —— 消费方拿它可以把一次用户可见的失败直接 join 到上游那次网关调用与它产生的\n * 计费行。\n *\n * **不要**与 `X-Request-ID` 混用: 那是网关的传输层追踪 ID, 独立生成、从不写进任何\n * 计费表, 两者永不相等。用错的后果是恒空 join —— 不报错, 只是下次事故照样查不动。\n */\nexport const GATEWAY_REQUEST_ID_HEADER = 'X-Acosmi-Request-Id';\n\n/**\n * 网关消费请求 ID 回调 (2026-09-01)。\n *\n * **为什么需要它**: 消费方 (如 CrabCode) 会在流成功、但流内证据不合格时对用户报失败\n * (2026-08-31 事故形态: 6 次上游搜索全部成功并已计费, 客户端却全部判失败)。这类失败\n * 此前无法关联到上游那一次调用 —— 客户端与网关之间没有任何共同标识符, 定位只能靠\n * 时间戳与模型名人工对齐。\n *\n * 头在**首字节之前**发出, 因此覆盖流中段中断、零事件、HTTP 错误等全部形态; 而流内\n * 事件在「事件根本没来」的场景里恰恰不存在 —— 那正是最需要诊断的那一种。\n *\n * 回调在响应头到达后触发**至多一次**; 网关没下发 (旧版本 / 非托管路径) 时**一次都不\n * 触发** —— 绝不合成占位值。回调抛错会被吞掉且不中断流 (旁路信号不该有能力杀死主链路)。\n */\nexport type GatewayRequestIDCallback = (requestID: string) => void;\n\n/** 从响应头读出消费请求 ID; 缺失 / 空白一律 undefined —— 宁可不给, 不可编造。 */\nfunction readGatewayRequestID(headers: Headers): string | undefined {\n const raw = headers.get(GATEWAY_REQUEST_ID_HEADER);\n if (!raw) return undefined;\n const trimmed = raw.trim();\n return trimmed === '' ? undefined : trimmed;\n}\n\n/** 触发消费请求 ID 回调; 消费方回调抛错不得污染主链路 (与 notifyUpstreamActivity 同构)。 */\nfunction notifyGatewayRequestID(\n cb: GatewayRequestIDCallback | undefined,\n headers: Headers,\n): void {\n if (!cb) return;\n const id = readGatewayRequestID(headers);\n if (id === undefined) return;\n try {\n cb(id);\n } catch {\n /* 旁路信号: 消费方的错误不传播回主链路 */\n }\n}\n\n/**\n * 非流式 JSON API 请求的默认超时 (毫秒)。\n *\n * 子 client (agent-runs / compliance) 的同步 JSON 调用未传 signal 时套用此上限,\n * 避免上游 hang 导致 Promise 永不 settle。流式 (SSE) / 下载等长连接路径**不**套此超时,\n * 以保留长连接语义。与 core doJSONFullInternal 的 30s 量级一致。\n */\nexport const DEFAULT_API_TIMEOUT_MS = 60_000;\n\n// =============================================================================\n// 内部 Deferred / WS state\n// =============================================================================\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (v: T) => void;\n reject: (e: unknown) => void;\n}\n\nfunction newDeferred<T>(): Deferred<T> {\n let resolve!: (v: T) => void;\n let reject!: (e: unknown) => void;\n const promise = new Promise<T>((r, j) => {\n resolve = r;\n reject = j;\n });\n return { promise, resolve, reject };\n}\n\n/**\n * WebSocket 状态 — 内部使用, 实际方法由 ws.ts mixin 提供\n * 留作 forward declaration, 避免循环依赖\n */\nexport interface WSState {\n connected: boolean;\n // 实现细节由 ws.ts 内部维护 — Client 主体只持有引用以便 logout/disconnect 联动\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\n// =============================================================================\n// Client class\n// =============================================================================\n\n/**\n * Acosmi nexus-v4 统一 API 客户端\n *\n * 覆盖全域 API: 模型/权益/商城/钱包/技能/工具/WebSocket\n * 自动处理 token 刷新, 所有 API 调用线程安全 (基于 Promise chain)\n */\nexport class Client {\n /** SDK 内部使用 — 业务方法 (mixin) 通过 this.* 访问以下字段 */\n\n /** 服务器根地址 (已 trim 尾随 /) */\n serverURL: string;\n /** Compliance API 根地址 (已 trim 尾随 /); null = 走默认 ${serverURL}/admin-api */\n complianceBaseURL: string | null;\n /** `/api/v4` 网关调用 base 覆盖 (已 trim 尾随 /); null = 走默认 serverURL */\n apiBaseURL: string | null;\n /** OAuth metadata profile — 刷新 token 时发现 metadata 用 (默认 'desktop') */\n oauthMetadataProfile: OAuthMetadataProfile;\n /** Browser Web OAuth refresh strategy (default 'direct') */\n browserRefreshMode: BrowserRefreshMode;\n /** Same-origin refresh proxy URL for browserRefreshMode='server-proxy' */\n refreshProxyURL: string | null;\n /** OAuth metadata (lazy loaded) */\n meta: ServerMetadata | null = null;\n /** 当前 token (内存) */\n tokens: TokenSet | null = null;\n /** token 持久化 */\n store: TokenStore;\n readonly credentialMode: 'legacy' | 'versioned' | 'external';\n private readonly versionedCredentialStore: VersionedCredentialStore | null;\n private readonly accessTokenProvider: Config['accessTokenProvider'];\n private readonly beforeCredentialInstall: Config['beforeCredentialInstall'];\n private readonly credentialAuthority: string;\n private readonly credentialRequestOwner: CredentialRequestOwner | null;\n private lifecycle: CredentialLifecycle | null = null;\n\n /** fetch 实现 (默认 globalThis.fetch) */\n fetchImpl: typeof fetch;\n\n /** 互斥锁 (TS 用 Promise chain 替代 sync.Mutex) */\n private mu: Promise<void> = Promise.resolve();\n\n /**\n * WebSocket 状态 (实际方法由 ws.ts mixin 维护)。\n * @internal — 实现细节: 跨模块 (ws.ts mixin) 需可见故为 public, 但非消费者 API,\n * 消费者用 connect/subscribe 等高层方法; 引用的 WSState 不进公开文档。\n */\n ws: WSState | null = null;\n\n /**\n * v0.15.1: token 就绪等待机制 — login 成功后 resolve, 等待方解除阻塞。\n * @internal — 内部同步原语 (Deferred), 非消费者 API。\n */\n tokenReady: Deferred<void> = newDeferred<void>();\n /** Login 进行中 — 等待方需等而非 fail-fast */\n loginInFlight = false;\n /** 防止 tokenReady 被多次 resolve (替代 Go sync.Once) */\n private tokenReadyResolved = false;\n\n /** 模型能力缓存 (CrabCode 扩展) */\n modelCache: ManagedModel[] = [];\n modelCacheTimeMs = 0;\n\n /** sanitize-bridge 配置 (默认禁用) */\n defensiveCfg: MinimalSanitizeConfig | null = null;\n autoStripEphemeral = false;\n\n /** L6 (v0.15): 重试策略. null = 禁用 (v0.14.1 行为) */\n retryPolicy: Required<RetryPolicy> | null;\n\n /** V29 系数缓存 (TTL 8s, listCoefficients 内部用) */\n coefCacheData: ModelCoefficient[] | null = null;\n coefCacheTimeMs = 0;\n private credentialOwnerKey: string | null = null;\n /** 串行化锁 (替代 Go sync.Mutex) */\n private coefMu: Promise<void> = Promise.resolve();\n\n constructor(cfg: Config = {}) {\n // Phase 0 §2: serverURL/baseURL/baseUrl 三字段同语义, 多写时 normalize 后必须相等;\n // 任一字段都会经 normalizeGatewayBaseURL 校验 (拒 ws/wss/拒空/拒 query/hash).\n const picked = pickAndNormalizeGatewayURL(cfg);\n this.serverURL = picked ?? DEFAULT_GATEWAY_BASE_URL;\n this.complianceBaseURL = cfg.complianceBaseURL\n ? normalizeOverrideBaseURL(cfg.complianceBaseURL, 'complianceBaseURL')\n : null;\n this.apiBaseURL = cfg.apiBaseURL\n ? normalizeOverrideBaseURL(cfg.apiBaseURL, 'apiBaseURL')\n : null;\n this.oauthMetadataProfile = cfg.oauthMetadataProfile ?? 'desktop';\n this.browserRefreshMode = cfg.browserRefreshMode ?? 'direct';\n this.refreshProxyURL = cfg.refreshProxyURL ?? null;\n this.credentialMode = cfg.credentialMode ?? 'legacy';\n this.credentialAuthority = new URL(this.serverURL).origin;\n if (this.credentialMode === 'versioned' && !cfg.versionedCredentialStore) {\n throw new Error('versionedCredentialStore is required for credentialMode=versioned');\n }\n if (cfg.credentialRequestOwner && this.credentialMode !== 'versioned') {\n throw new Error('credentialRequestOwner requires credentialMode=versioned');\n }\n if (this.credentialMode === 'legacy' && cfg.versionedCredentialStore) {\n throw new Error('credentialMode=versioned is required when versionedCredentialStore is provided');\n }\n if (this.credentialMode === 'external' && cfg.versionedCredentialStore) {\n throw new Error('versionedCredentialStore is incompatible with credentialMode=external');\n }\n if (this.credentialMode !== 'external' && cfg.accessTokenProvider) {\n throw new Error('accessTokenProvider requires credentialMode=external');\n }\n if (this.credentialMode === 'external' && !cfg.accessTokenProvider) {\n throw new Error('accessTokenProvider is required for credentialMode=external');\n }\n if (this.credentialMode !== 'versioned' && cfg.beforeCredentialInstall) {\n throw new Error('beforeCredentialInstall requires credentialMode=versioned');\n }\n if (this.credentialMode !== 'legacy') {\n const authority = new URL(this.serverURL).origin;\n for (const [name, override] of [['apiBaseURL', this.apiBaseURL], ['complianceBaseURL', this.complianceBaseURL]] as const) {\n if (override && new URL(override).origin !== authority) {\n throw new Error(`${name} must use the credential authority ${authority}`);\n }\n }\n }\n this.accessTokenProvider = cfg.accessTokenProvider;\n this.beforeCredentialInstall = cfg.beforeCredentialInstall;\n this.credentialRequestOwner = cfg.credentialRequestOwner\n ? {\n storeInstanceId: cfg.credentialRequestOwner.storeInstanceId,\n authSessionId: cfg.credentialRequestOwner.authSessionId,\n principal: cfg.credentialRequestOwner.principal\n ? {\n issuer: cfg.credentialRequestOwner.principal.issuer,\n subject: cfg.credentialRequestOwner.principal.subject,\n organizationId: cfg.credentialRequestOwner.principal.organizationId,\n }\n : null,\n }\n : null;\n this.fetchImpl = cfg.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.versionedCredentialStore = cfg.versionedCredentialStore ?? null;\n if (this.versionedCredentialStore) this.lifecycle = new CredentialLifecycle(this.versionedCredentialStore, {\n serverURL: this.serverURL, fetch: this.fetchImpl,\n metadata: signal => discoverWithProfile(this.serverURL, 'desktop', signal, this.fetchImpl),\n profile: async (tokens, signal) => {\n const gatewayRoot = this.serverURL.replace(/\\/api\\/v4$/, '');\n const profileURL = `${gatewayRoot}/api/oauth/profile`;\n this.assertCredentialURL(profileURL);\n const response = await this.fetchImpl(profileURL, { headers: { Authorization: `Bearer ${tokens.access_token}` }, signal });\n if (!response.ok) {\n const bodyBytes = response.body ? await readLimited(response.body, maxErrorBodySize) : new Uint8Array();\n const failure = parseHTTPErrorWithHeader(response.status, bodyBytes, response.headers);\n const contract = readGatewayErrorContract(failure);\n const code = contract?.errorCode ?? null;\n if (code === 'INVALID_SCOPE') throw new Error('invalid_scope');\n if (code === 'AUTH_CONTRACT_UNSUPPORTED') throw new Error('auth_contract_unsupported');\n if (code === 'ACCOUNT_NOT_FOUND') throw new Error('account_permission');\n throw new Error('identity_unavailable');\n }\n const body = await response.json() as {\n account?: {\n uuid?: string; display_name?: string; avatar_url?: string; image_url?: string;\n email?: string; created_at?: string; requires_phone_binding?: boolean;\n picture?: string; image?: string;\n };\n organization?: { uuid?: string; rate_limit_tier?: string; name?: string;\n has_extra_usage_enabled?: boolean; billing_type?: string; subscription_created_at?: string };\n avatar_url?: string; picture?: string; image?: string;\n code?: string;\n };\n const subject = body.account?.uuid;\n if (typeof subject !== 'string' || !subject) throw new Error('invalid_response');\n const account = body.account!;\n const organization = body.organization;\n return {\n subject,\n organizationId: organization?.uuid || null,\n ...(typeof account.display_name === 'string' ? { displayName: account.display_name } : {}),\n ...([account.avatar_url, account.picture, account.image, body.avatar_url, body.picture, body.image]\n .find((value): value is string => typeof value === 'string') !== undefined\n ? { avatarUrl: [account.avatar_url, account.picture, account.image, body.avatar_url, body.picture, body.image]\n .find((value): value is string => typeof value === 'string')! } : {}),\n ...(typeof account.email === 'string' ? { email: account.email } : {}),\n ...(typeof account.image_url === 'string' ? { imageUrl: account.image_url } : {}),\n ...(typeof account.created_at === 'string' ? { accountCreatedAt: account.created_at } : {}),\n ...(typeof account.requires_phone_binding === 'boolean' ? { requiresPhoneBinding: account.requires_phone_binding } : {}),\n ...(typeof organization?.has_extra_usage_enabled === 'boolean' ? { hasExtraUsageEnabled: organization.has_extra_usage_enabled } : {}),\n ...(typeof organization?.billing_type === 'string' ? { billingType: organization.billing_type } : {}),\n ...(typeof organization?.subscription_created_at === 'string' ? { subscriptionCreatedAt: organization.subscription_created_at } : {}),\n ...(typeof organization?.rate_limit_tier === 'string' ? { rateLimitTier: organization.rate_limit_tier } : {}),\n ...(typeof organization?.name === 'string' ? { organizationName: organization.name } : {}),\n };\n },\n });\n this.store = cfg.store ?? defaultTokenStore();\n this.retryPolicy = effectivePolicy(cfg.retryPolicy ?? null);\n }\n\n /**\n * 异步初始化 (从 store 加载已有 token)\n * 替代 Go NewClient (Go 同步 IO, TS 必须 async)\n */\n static async create(cfg: Config = {}): Promise<Client> {\n const c = new Client(cfg);\n if (c.credentialMode === 'external') return c;\n if (c.credentialMode === 'versioned') {\n await c.reconcileCredentials();\n return c;\n }\n try {\n const tokens = await c.store.load();\n if (tokens) {\n c.tokens = tokens;\n if (!c.tokenReadyResolved) {\n c.tokenReadyResolved = true;\n c.tokenReady.resolve();\n }\n }\n } catch {\n // store 损坏 — 静默忽略, 让 caller Login 重建\n }\n return c;\n }\n\n /** Read the durable authority. Available only in explicit versioned mode. */\n async getCredentialSnapshot(signal?: AbortSignal): Promise<CredentialSnapshot> {\n if (!this.versionedCredentialStore) {\n throw new Error('getCredentialSnapshot requires credentialMode=versioned');\n }\n return this.versionedCredentialStore.readSnapshot(signal);\n }\n\n /** Reconcile memory from durable state; storage errors never clear confirmed memory. */\n async reconcileCredentials(signal?: AbortSignal): Promise<CredentialSnapshot> {\n const snapshot = await this.lifecycle!.reconcile(signal);\n this.adoptCredentialOwner(snapshot);\n this.tokens = snapshot.credentialState === 'ready' ? snapshot.tokenSet : null;\n return snapshot;\n }\n\n private ownerKey(snapshot: CredentialSnapshot): string {\n return `${snapshot.storeInstanceId}\\u0000${snapshot.authSessionId ?? ''}\\u0000${snapshot.principal?.issuer ?? ''}\\u0000${snapshot.principal?.subject ?? ''}\\u0000${snapshot.principal?.organizationId ?? ''}`;\n }\n\n private adoptCredentialOwner(snapshot: CredentialSnapshot): void {\n const next = this.ownerKey(snapshot);\n if (this.credentialOwnerKey !== null && this.credentialOwnerKey !== next) {\n this.modelCache = [];\n this.modelCacheTimeMs = 0;\n this.coefCacheData = null;\n this.coefCacheTimeMs = 0;\n }\n this.credentialOwnerKey = next;\n }\n\n async ensureCredential(signal?: AbortSignal): Promise<string> {\n if (!this.lifecycle) return this.ensureToken(signal);\n const token = await this.lifecycle.ensure(signal, undefined, this.credentialRequestOwner ?? undefined);\n const snapshot = await this.lifecycle.read(signal);\n this.adoptCredentialOwner(snapshot);\n this.tokens = snapshot.credentialState === 'ready' ? snapshot.tokenSet : null;\n return token;\n }\n\n subscribeCredentialState(listener: (snapshot: CredentialStateNotification) => void): () => void {\n if (!this.lifecycle) throw new Error('subscribeCredentialState requires credentialMode=versioned');\n return this.lifecycle.subscribe(listener);\n }\n\n async retryCredentialIdentity(signal?: AbortSignal): Promise<CredentialSnapshot> {\n const snapshot = await this.getCredentialSnapshot(signal);\n if (!snapshot.authSessionId) throw new Error('not authorized');\n const ready = await this.lifecycle!.bindIdentity(snapshot.authSessionId, signal);\n this.adoptCredentialOwner(ready);\n this.tokens = ready.credentialState === 'ready' ? ready.tokenSet : null;\n return ready;\n }\n\n async logoutCredential(\n signal?: AbortSignal,\n expected?: { storeInstanceId: string; authSessionId: string | null },\n ) {\n if (!this.lifecycle) throw new Error('logoutCredential requires credentialMode=versioned');\n const result = await this.lifecycle.logout(signal, expected);\n if (result.status === 'committed' || result.status === 'already_signed_out') {\n const current = await this.lifecycle.read(signal);\n this.adoptCredentialOwner(current);\n this.tokens = null;\n }\n return result;\n }\n\n // ===========================================================================\n // 授权生命周期\n // ===========================================================================\n\n /** 是否已授权 (有可用 token) */\n isAuthorized(): boolean {\n return this.tokens != null;\n }\n\n /**\n * 返回归一化后的 Acosmi Gateway URL (= `serverURL` 字段). readonly helper.\n *\n * Phase 0 §2 红线:\n * - 不要 mutate `client.serverURL` 字段实现 base 切换; 用 per-base Client 实例.\n * - 该值仅供日志/排查/上层缓存键使用, 不重新 normalize 它 (构造期已 normalize).\n */\n getServerURL(): string {\n return this.serverURL;\n }\n\n /** `getServerURL()` 的 alias — Phase 0 §2 baseURL 与 serverURL 同义. */\n getBaseURL(): string {\n return this.serverURL;\n }\n\n /** 当前 token 信息 (用于 CLI whoami 显示) */\n getTokenSet(): TokenSet | null {\n return this.tokens;\n }\n\n private getCachedClientID(): string {\n return this.tokens?.client_id ?? '';\n }\n\n /**\n * 完整授权流程: 发现 → 注册 → 授权 → 换 token → 持久化\n * @param appName 桌面智能体名称 (如 \"CrabClaw Desktop\")\n * @param scopes 请求的权限范围 (参考 allScopes / modelScopes / commerceScopes 等预设)\n */\n async login(appName: string, scopes: string[], signal?: AbortSignal): Promise<void> {\n return this.loginInternal(appName, scopes, undefined, signal);\n }\n\n /**\n * 带事件回调的登录流程 — CrabCode 使用\n *\n * handler 在以下时刻被调用:\n * - EventAuthURL: 授权 URL 已就绪, 调用方可展示/打开浏览器\n * - EventComplete: 登录成功, tokens 已持久化\n * - EventError: 某步骤失败, 附 ErrCode 分类码\n *\n * 当 handler 为 null 时, 行为与 login() 完全一致。\n */\n async loginWithHandler(\n appName: string,\n scopes: string[],\n handler: ((e: LoginEvent) => void) | null,\n opts: LoginOptions = {},\n signal?: AbortSignal,\n ): Promise<void> {\n return this.loginInternal(appName, scopes, { handler, ...opts }, signal);\n }\n\n private async loginInternal(\n appName: string,\n scopes: string[],\n opts: (LoginOptions & { handler?: ((e: LoginEvent) => void) | null }) | undefined,\n signal?: AbortSignal,\n ): Promise<void> {\n if (this.lifecycle) {\n const attempt = await this.lifecycle.reserveLogin(signal);\n let installHookRejected = false;\n try {\n const registration = await register(attempt.metadata, appName, signal, this.fetchImpl);\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n const authorization = await authorize(attempt.metadata, registration.client_id, scopes, { ...opts, handler: opts?.handler ?? undefined, signal });\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n const response = await exchangeCode(attempt.metadata, registration.client_id, authorization.result.code, authorization.result.redirectURI, authorization.verifier, signal, this.fetchImpl);\n if (!Number.isFinite(response.expires_in) || response.expires_in <= 0) throw new Error('invalid_response');\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n try {\n await this.beforeCredentialInstall?.({\n accessToken: response.access_token,\n attemptId: attempt.attemptId,\n serverURL: this.serverURL,\n clientId: registration.client_id,\n }, signal);\n } catch (error) {\n installHookRejected = true;\n throw error;\n }\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n const ready = await this.lifecycle.installLogin(attempt.attemptId, newTokenSet(response, registration.client_id, this.serverURL), signal);\n const current = await this.getCredentialSnapshot(signal);\n if (current.revision !== ready.revision || current.authSessionId !== ready.authSessionId) throw new Error('superseded');\n this.tokens = ready.tokenSet;\n opts?.handler?.({ type: EventComplete, attemptId: attempt.attemptId });\n } catch (error) {\n const current = await this.getCredentialSnapshot();\n if (current.loginAttempt?.attemptId === attempt.attemptId || current.lastLoginAttemptId === attempt.attemptId) {\n opts?.handler?.(installHookRejected\n ? { type: EventError, attemptId: attempt.attemptId, err_code: 'credential_install_rejected', error: 'credential_install_rejected' }\n : { type: EventError, attemptId: attempt.attemptId, error: 'credential_login_failed' });\n }\n await this.lifecycle.cancelLogin(attempt.attemptId); throw error;\n }\n return;\n }\n const handler = opts?.handler ?? undefined;\n const emit = (e: LoginEvent) => {\n if (handler) handler(e);\n };\n const emitError = (code: LoginErrCode, err: unknown) => {\n emit({\n type: EventError,\n err_code: code,\n error: err instanceof Error ? err.message : String(err),\n });\n };\n\n this.loginInFlight = true;\n try {\n // 1. 发现\n let meta: ServerMetadata;\n try {\n meta = await discover(this.serverURL, signal, this.fetchImpl);\n } catch (err) {\n emitError(ErrDiscovery, err);\n throw new Error(`discovery failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n this.meta = meta;\n\n // 2. 检查是否已有 client_id; 无则注册\n let clientID = this.getCachedClientID();\n if (clientID === '') {\n try {\n const reg = await register(meta, appName, signal, this.fetchImpl);\n clientID = reg.client_id;\n } catch (err) {\n emitError(ErrRegistration, err);\n throw new Error(\n `registration failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // 3. 授权 (PKCE + browser + callback)\n let result: { code: string; redirectURI: string };\n let verifier: string;\n try {\n const r = await authorize(meta, clientID, scopes, { ...opts, handler, signal });\n result = r.result;\n verifier = r.verifier;\n } catch (err) {\n // 授权失败 (可能是服务器重启后 client_id 失效):\n // 清除缓存的 client_id, 重新注册, 再试一次\n try {\n const reg = await register(meta, appName, signal, this.fetchImpl);\n clientID = reg.client_id;\n } catch (regErr) {\n emitError(ErrRegistration, regErr);\n throw new Error(\n `authorization failed (retry registration also failed): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n try {\n const r = await authorize(meta, clientID, scopes, { ...opts, handler, signal });\n result = r.result;\n verifier = r.verifier;\n } catch (err2) {\n throw new Error(\n `authorization failed: ${err2 instanceof Error ? err2.message : String(err2)}`,\n );\n }\n }\n\n // 4. 换 token (审计 A-2: 支持自定义 expiresIn)\n let tokenResp;\n try {\n if (opts?.expiresIn && opts.expiresIn > 0) {\n tokenResp = await exchangeCodeWithExpiry(\n meta,\n clientID,\n result.code,\n result.redirectURI,\n verifier,\n opts.expiresIn,\n signal,\n this.fetchImpl,\n );\n } else {\n tokenResp = await exchangeCode(\n meta,\n clientID,\n result.code,\n result.redirectURI,\n verifier,\n signal,\n this.fetchImpl,\n );\n }\n } catch (err) {\n const code = isSSLError(err) ? ErrSSLProxy : ErrTokenExchange;\n emitError(code, err);\n throw new Error(\n `token exchange failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // 5. 持久化 + 通知等待方\n const tokens = newTokenSet(tokenResp, clientID, this.serverURL);\n this.tokens = tokens;\n if (!this.tokenReadyResolved) {\n this.tokenReadyResolved = true;\n this.tokenReady.resolve();\n }\n try {\n await this.store.save(tokens);\n } catch (err) {\n throw new Error(`save tokens: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // 6. 完成\n emit({ type: EventComplete });\n } finally {\n this.loginInFlight = false;\n }\n }\n\n /** 吊销 token 并清除本地存储 */\n async logout(signal?: AbortSignal): Promise<void> {\n if (this.lifecycle) { await this.logoutCredential(signal); await this.reconcileCredentials(signal); return; }\n const tokens = this.tokens;\n let meta = this.meta;\n this.tokens = null;\n this.meta = null;\n // v0.15.1: 重置等待信号 — 下次 login 重新触发等待→唤醒流程\n this.tokenReady = newDeferred<void>();\n this.tokenReadyResolved = false;\n\n if (tokens) {\n if (!meta) {\n try {\n // token-lifecycle discovery: revoke 必须打与签发 token 同 profile 的端点\n meta = await discoverWithProfile(this.serverURL, this.oauthMetadataProfile, signal, this.fetchImpl);\n } catch (e) {\n console.warn(`[acosmi-sdk] warning: discover for revocation failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n if (meta) {\n try {\n await revokeToken(meta, tokens.access_token, signal, this.fetchImpl);\n } catch {\n // ignore\n }\n try {\n await revokeToken(meta, tokens.refresh_token, signal, this.fetchImpl);\n } catch {\n // ignore\n }\n }\n }\n\n await this.store.clear();\n }\n\n // ===========================================================================\n // Token 管理\n // ===========================================================================\n\n /**\n * 确保有有效的 access_token, 过期则自动刷新\n *\n * v0.15.1: 当 tokens==null 且 login 正在并发进行中时, 阻塞等待 token 就绪,\n * 避免应用启动期 \"login + 多个 API 调用\" 并发场景下 4+ 条 \"not authorized\" 误报.\n */\n async ensureToken(signal?: AbortSignal): Promise<string> {\n if (this.credentialMode === 'external') {\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError');\n const token = await this.accessTokenProvider!(signal);\n if (typeof token !== 'string' || token.length === 0) throw new Error('external access token unavailable');\n return token;\n }\n if (this.lifecycle) return this.lifecycle.ensure(signal, undefined, this.credentialRequestOwner ?? undefined);\n let tokens = this.tokens;\n const ready = this.tokenReady.promise;\n const inFlight = this.loginInFlight;\n\n if (tokens == null) {\n if (!inFlight) {\n throw new Error('not authorized, call login() first');\n }\n // login 进行中, 等待就绪或 abort\n let abortHandler: (() => void) | undefined;\n try {\n await Promise.race([\n ready,\n new Promise<never>((_, reject) => {\n if (signal) {\n if (signal.aborted) reject(new Error(`waiting for token: aborted`));\n else {\n abortHandler = () => reject(new Error(`waiting for token: aborted`));\n signal.addEventListener('abort', abortHandler);\n }\n }\n }),\n ]);\n } finally {\n if (abortHandler && signal) signal.removeEventListener('abort', abortHandler);\n }\n tokens = this.tokens;\n if (tokens == null) {\n // 边界: 等待期间被 logout 重置, 当作未授权\n throw new Error('not authorized, call login() first');\n }\n }\n\n if (!tokenSetIsExpired(tokens)) {\n return tokens.access_token;\n }\n\n // 需要刷新 — 双层串行: withMu 进程内 + storeWithLock 跨进程 (FileTokenStore 实现 sidecar\n // .lock 文件; LocalStorage / InMemory 单进程语义无需此层, 自动 no-op).\n //\n // v1.0.2 修复多进程共享 ~/.acosmi/tokens.json 时撞 \"HTTP 400: refresh token not found\":\n // 1) 进入跨进程临界区后, store.load() 重读磁盘 — 别的进程可能已完成 rotation\n // 2) 若磁盘 refresh_token ≠ 内存 → 采纳磁盘新版 → 重判过期 → 未过期则直接返回\n // (跳过本进程的多余 refresh, 同时避免拿已 invalidated 的 R0 撞网关)\n return this.withMu(() =>\n this.storeWithLock(async () => {\n await this.syncFromDisk();\n // 双检 — 同 v1.0.1 逻辑\n if (this.tokens == null) {\n throw new Error('not authorized, call login() first');\n }\n if (!tokenSetIsExpired(this.tokens)) {\n return this.tokens.access_token;\n }\n\n await this.refreshCurrentToken(signal);\n\n return this.tokens.access_token;\n }),\n );\n }\n\n /** 强制刷新 token (用于 401 重试) */\n async forceRefresh(signal?: AbortSignal, rejectedToken?: string): Promise<void> {\n if (this.credentialMode === 'external') throw new Error('external credentials cannot be refreshed by the SDK');\n if (this.lifecycle) {\n await this.lifecycle.forceRefresh(signal, rejectedToken, this.credentialRequestOwner ?? undefined);\n const snapshot = await this.lifecycle.read(signal);\n this.tokens = snapshot.credentialState === 'ready' ? snapshot.tokenSet : null;\n return;\n }\n return this.withMu(() =>\n this.storeWithLock(async () => {\n // v1.0.2: 同 ensureToken — 进入跨进程临界区后先同步磁盘. 别的进程刚 rotation\n // 过的话, 磁盘上是新 RT, 网关返回 401 触发本进程 forceRefresh 用磁盘新 RT 即可成功;\n // 否则用旧 RT 必撞 \"refresh token not found\" 400.\n await this.syncFromDisk();\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n await this.refreshCurrentToken(signal);\n }),\n );\n }\n\n private async refreshCurrentToken(signal?: AbortSignal): Promise<void> {\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n if (this.browserRefreshMode === 'none') {\n throw new Error(`${ErrTokenExpired}: token refresh disabled`);\n }\n if (this.browserRefreshMode === 'server-proxy') {\n await this.refreshCurrentTokenViaProxy(signal);\n return;\n }\n await this.refreshCurrentTokenDirect(signal);\n }\n\n private async refreshCurrentTokenDirect(signal?: AbortSignal): Promise<void> {\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n if (this.meta == null) {\n try {\n // token-lifecycle discovery: refresh 必须打与签发 token 同 profile 的端点\n this.meta = await discoverWithProfile(this.serverURL, this.oauthMetadataProfile, signal, this.fetchImpl);\n } catch (e) {\n throw new Error(\n `discover for refresh: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n let tokenResp;\n try {\n tokenResp = await refreshToken(\n this.meta,\n this.tokens.client_id,\n this.tokens.refresh_token,\n signal,\n this.fetchImpl,\n );\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n if (isInvalidGrantError(e)) {\n await this.clearInvalidRefreshToken();\n throw new Error(`refresh token invalid; local tokens cleared: ${message}`);\n }\n if (isLikelyBrowserOAuthCORSError(message)) {\n throw new Error(`${ErrOAuthCORSBlocked}: refresh token: ${message}`);\n }\n throw new Error(`refresh token: ${message}`);\n }\n\n this.tokens = newTokenSet(tokenResp, this.tokens.client_id, this.serverURL);\n await this.saveRefreshedToken();\n }\n\n private async refreshCurrentTokenViaProxy(signal?: AbortSignal): Promise<void> {\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n if (!this.refreshProxyURL) {\n throw new Error(`${ErrRefreshProxyFailed}: refreshProxyURL is required`);\n }\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(this.refreshProxyURL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: this.tokens.client_id,\n refresh_token: this.tokens.refresh_token,\n server_url: this.tokens.server_url || this.serverURL,\n }),\n signal,\n });\n } catch (e) {\n throw new Error(\n `${ErrRefreshProxyFailed}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n\n if (!resp.ok) {\n let message = '';\n let oauthError = '';\n try {\n const body = (await resp.json()) as { error?: unknown; error_description?: unknown };\n if (typeof body.error === 'string') message = body.error;\n if (typeof body.error === 'string') oauthError = body.error;\n if (typeof body.error_description === 'string') message = body.error_description;\n } catch {\n // ignore non-JSON proxy errors\n }\n if (oauthError === 'invalid_grant') {\n await this.clearInvalidRefreshToken();\n throw new Error(`${ErrRefreshProxyFailed}: refresh token invalid; local tokens cleared`);\n }\n throw new Error(`${ErrRefreshProxyFailed}: HTTP ${resp.status}: ${message}`);\n }\n\n let body: { tokenSet?: TokenSet };\n try {\n body = (await resp.json()) as { tokenSet?: TokenSet };\n } catch (e) {\n throw new Error(\n `${ErrRefreshProxyFailed}: decode: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n if (!isTokenSetLike(body.tokenSet)) {\n throw new Error(`${ErrRefreshProxyFailed}: response missing tokenSet`);\n }\n\n this.tokens = body.tokenSet;\n await this.saveRefreshedToken();\n }\n\n private async saveRefreshedToken(): Promise<void> {\n if (this.tokens == null) return;\n try {\n await this.store.save(this.tokens);\n } catch (e) {\n console.warn(\n `[acosmi-sdk] warning: save refreshed token failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n private async clearInvalidRefreshToken(): Promise<void> {\n this.tokens = null;\n this.meta = null;\n this.loginInFlight = false;\n this.tokenReady = newDeferred<void>();\n this.tokenReadyResolved = false;\n try {\n await this.store.clear();\n } catch (e) {\n console.warn(\n `[acosmi-sdk] warning: clear invalid token failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n /** 互斥锁 helper (替代 Go sync.Mutex) */\n private withMu<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.mu.then(fn, fn);\n this.mu = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n /** v1.0.2: 跨进程临界区 helper. store.withLock 可选, 缺省则直接调用 fn (LocalStorage /\n * InMemory 单进程无需). */\n private async storeWithLock<T>(fn: () => Promise<T>): Promise<T> {\n const lock = this.store.withLock;\n if (typeof lock === 'function') {\n return lock.call(this.store, fn) as Promise<T>;\n }\n return fn();\n }\n\n /** v1.0.2: 从磁盘同步 token (refresh 前). 别的进程 rotation 后磁盘 refresh_token 已变,\n * 本进程内存仍是旧 R0; 不同步直接 refresh 必撞网关 400. load 失败保留内存继续 (容错). */\n private async syncFromDisk(): Promise<void> {\n let onDisk: TokenSet | null = null;\n try {\n onDisk = await this.store.load();\n } catch {\n // 磁盘读失败 (文件损坏 / 权限) — 不阻塞 refresh, 让后续 refreshToken 暴露真实错误\n return;\n }\n if (!onDisk) return;\n // 磁盘有 token 且 RT 与内存不一致 — 采纳磁盘新版 (典型: 别的进程已 rotation)\n if (this.tokens == null || onDisk.refresh_token !== this.tokens.refresh_token) {\n this.tokens = onDisk;\n }\n }\n\n // ===========================================================================\n // Managed Models\n // ===========================================================================\n\n /**\n * 获取可用的托管模型列表.\n *\n * V30 二轮审计 D-P1-2: 此方法不返回 entitlement-filter-status header.\n * UI 想根据 fallback 状态显示降级提示, 请改调 listModelsWithStatus.\n */\n async listModels(\n signal?: AbortSignal,\n opts?: { includeLocked?: boolean },\n ): Promise<ManagedModel[]> {\n const r = await this.listModelsWithStatus(signal, opts);\n return r.models;\n }\n\n /**\n * 获取可用模型列表, 同时返回 X-Entitlement-Filter-Status header.\n *\n * V30 二轮审计 D-P1-2: 老 listModels 丢弃 header 让 SDK 用户无法识别 fail-OPEN 降级状态,\n * 此方法暴露 status 让 UI 可:\n * - status === 'ok' → 正常显示 BucketInfo 余量\n * - status === 'fallback-tkdist-error' → 灰显余量 + toast \"tk-dist 离线, 模型列表降级\"\n * - status === 'disabled-by-flag' → 不显示余量 (运维灰度中)\n * - status === '' (Unknown) → 老 nexus, 按老 v0.17 行为 (不显示 BucketInfo)\n */\n async listModelsWithStatus(\n signal?: AbortSignal,\n opts?: { includeLocked?: boolean },\n ): Promise<{ models: ManagedModel[]; status: FilterStatus }> {\n // includeLocked=true:请求「全集模式」。网关已实现 ?picker=1\n // (managed_model.go appendLockedUpsellModels):filterModelsByEntitlement 删行后把\n // 越档模型作为 Locked=true 补回,返回全集供 C 端选择器展示「付费订阅区」+ 置灰升级\n // 引导。opts.includeLocked 是面向调用方的语义名,拼成网关认的 picker=1。缺省=现状\n // (只返有桶模型),向后兼容旧客户端 / 内部消费者。\n const includeLocked = opts?.includeLocked === true;\n const requestOwner = this.lifecycle ? this.ownerKey(await this.getCredentialSnapshot(signal)) : null;\n const path = includeLocked\n ? '/managed-models?picker=1'\n : '/managed-models';\n const { result, headers } = await this.doJSONFull<APIResponse<ManagedModel[]>>(\n 'GET',\n path,\n null,\n signal,\n );\n // v1.2: 写缓存前归一化 input_modalities → inputModalities (snake/camel 双名兼容)\n const normalized = normalizeInputModalities(result.data);\n if (requestOwner !== null) {\n const current = await this.getCredentialSnapshot(signal);\n if (this.ownerKey(current) !== requestOwner) throw new Error('superseded');\n this.adoptCredentialOwner(current);\n }\n // 全集模式(含 locked 行)只供 picker 展示,**不写** this.modelCache —— 后者是\n // 「可用模型」缓存(getModelCapabilities / quota 消费),写全集会让 locked 模型混入\n // 可用集(全集/子集互污)。缺省模式照旧缓存,行为完全不变。\n if (!includeLocked) {\n this.modelCache = normalized;\n this.modelCacheTimeMs = Date.now();\n }\n\n let status: FilterStatus = '';\n if (headers) {\n const h = headers.get('X-Entitlement-Filter-Status');\n if (h) status = h as FilterStatus;\n }\n return { models: normalized, status };\n }\n\n /** 查询当前用户账户级权益总览 (v0.19+) */\n async getQuotaSummary(signal?: AbortSignal): Promise<QuotaSummary> {\n const resp = await this.doJSON<APIResponse<QuotaSummary>>(\n 'GET',\n '/entitlements/quota-summary',\n null,\n signal,\n );\n return resp.data;\n }\n\n /**\n * [W1 2026-07-11 软限额] 设置当前用户 5 小时窗口软限额「继续」开关 (v2.12+)。\n *\n * enabled=true = 软限额 (到达 5h 后继续消耗周配额, 默认); false = 严格模式 (到达即等待逐步恢复)。\n * userId 由网关从鉴权态解析 (客户端永不传), 故只需 enabled + 可选 source (审计: web /\n * crabcode-gui / crabcode-tui / dialog)。用于个人中心开关、429 严格模式「重新开启继续」续跑。\n *\n * @returns 网关回显的新状态 { enabled }。\n */\n async setWindowContinuePreference(\n enabled: boolean,\n opts?: { source?: string; signal?: AbortSignal },\n ): Promise<{ enabled: boolean }> {\n const resp = await this.doJSON<APIResponse<{ enabled: boolean }>>(\n 'POST',\n '/entitlements/window-continue-pref',\n { enabled, source: opts?.source },\n opts?.signal,\n );\n return { enabled: resp.data.enabled };\n }\n\n /**\n * [W-MEMBERSHIP 2026-08-01 邀请奖励] 查询当前用户窗口重置券总览 (v2.13+)。\n *\n * 重置券由邀请奖励发放 (被邀请人激活并达到用量门槛后计一次), 每张可清空一次滚动窗口已用量\n * (见 redeemWindowReset)。userId 由网关从鉴权态解析, 客户端永不传。\n * 用于个人中心邀请栏与 429 窗口限额弹窗展示\"还剩几张券 + 最近到期时间 + 邀请进度\"。\n *\n * @returns 券余量 / 最近到期 / 累计发放与使用 / 邀请已达标与待达标数。\n */\n async getWindowResetSummary(signal?: AbortSignal): Promise<WindowResetSummary> {\n const resp = await this.doJSON<APIResponse<WindowResetSummary>>(\n 'GET',\n '/entitlements/window-reset/summary',\n null,\n signal,\n );\n return resp.data;\n }\n\n /**\n * [W-MEMBERSHIP 2026-08-01 邀请奖励] 消费一张窗口重置券, 清空当前滚动窗口已用量 (v2.13+)。\n *\n * **幂等键语义**: 传 `clientRequestId` 时同一 ID 重放**不会二次扣券** — 网关按该键返回首次\n * 结果 (`remaining` 与首次一致)。网络重试 / 用户连点必须**复用同一 ID**; 换 ID = 换一次真实\n * 扣券。不传则不幂等, 每次调用都是一次真实扣券。\n *\n * 业务错 (信封 `code != 0`) 按 SDK 惯例抛 `BusinessError` (message 含机器码), 常见两种:\n * - `NO_AVAILABLE_CREDIT` — 无可用券 (未发放 / 已用尽 / 已过期)\n * - `NO_WINDOW_USAGE` — 当前窗口无已用量, 无可重置 (不扣券)\n *\n * @returns 扣减后剩余可用券张数 { remaining }。\n */\n async redeemWindowReset(opts?: {\n clientRequestId?: string;\n signal?: AbortSignal;\n }): Promise<{ remaining: number }> {\n const resp = await this.doJSON<APIResponse<{ remaining: number }>>(\n 'POST',\n '/entitlements/window-reset/redeem',\n { clientRequestId: opts?.clientRequestId },\n opts?.signal,\n );\n return { remaining: resp.data.remaining };\n }\n\n /**\n * 查询单个模型的能力矩阵\n * 优先从 listModels 缓存读取, miss 时调用 listModels 刷新\n */\n async getModelCapabilities(modelID: string, signal?: AbortSignal): Promise<ModelCapabilities> {\n let caps = this.getCachedCapabilities(modelID);\n if (caps) return caps;\n await this.listModels(signal);\n caps = this.getCachedCapabilities(modelID);\n if (caps) return caps;\n // 模型不在列表中, 返回零值 (与 Go 行为一致)\n return zeroModelCapabilities();\n }\n\n private getCachedCapabilities(modelID: string): ModelCapabilities | null {\n if (this.modelCache.length === 0 || Date.now() - this.modelCacheTimeMs > modelCacheTTLMs) {\n return null;\n }\n for (const m of this.modelCache) {\n if (m.id === modelID || m.modelId === modelID) {\n return m.capabilities;\n }\n }\n return null;\n }\n\n /** 从缓存中查找完整 ManagedModel (未命中返 null) */\n private getCachedModel(modelID: string): ManagedModel | null {\n for (const m of this.modelCache) {\n if (m.id === modelID || m.modelId === modelID) return m;\n }\n return null;\n }\n\n /** 测试辅助: 把占位 ManagedModel 塞入缓存. 仅测试用. */\n primeModelCacheForTest(...ids: string[]): void {\n for (const id of ids) {\n this.modelCache.push({\n id,\n name: '',\n provider: 'anthropic',\n modelId: id,\n maxTokens: 0,\n isEnabled: true,\n capabilities: zeroModelCapabilities(),\n });\n }\n this.modelCacheTimeMs = Date.now();\n }\n\n /**\n * 确保指定 modelID 的 ManagedModel 已在缓存中。\n *\n * 语义:\n * 1. 若缓存命中 → 直接返回\n * 2. 若未命中 → 调 listModels 刷新一次\n * 3. 刷新后仍未命中 → 抛 ModelNotFoundError\n *\n * 根因修复: 消除未预热场景下 provider=\"anthropic\" 硬编码回退,\n * 该回退会让 DashScope/Zhipu/DeepSeek 等 non-anthropic 模型被按 Anthropic\n * 格式编码并打到错误的 /anthropic 端点。\n */\n async ensureModelCached(modelID: string, signal?: AbortSignal): Promise<ManagedModel> {\n let m = this.getCachedModel(modelID);\n if (m) return m;\n await this.listModels(signal);\n m = this.getCachedModel(modelID);\n if (m) return m;\n throw new ModelNotFoundError(modelID);\n }\n\n // ===========================================================================\n // Chat\n // ===========================================================================\n\n /**\n * 构建完整的聊天请求体 (v0.5.0 adapter 模式)\n *\n * 根据 provider 选择 adapter, 委托 buildRequestBody 构建格式化的请求体。\n *\n * v0.13.x: 前置 ensureModelCached, 消除冷缓存硬编码回退。未知 modelID 抛 ModelNotFoundError.\n */\n async buildChatRequest(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): Promise<{ body: string; adapter: ProviderAdapter }> {\n // v0.11.0: 请求前防御 (体积 / deny-list / 深度 / ephemeral 剥离). 未配置时零开销.\n // applyRequestSanitizers 由 sanitize-bridge.ts mixin 提供\n if (typeof (this as Client & { applyRequestSanitizers?: (r: ChatRequest) => void }).applyRequestSanitizers === 'function') {\n (this as Client & { applyRequestSanitizers: (r: ChatRequest) => void }).applyRequestSanitizers(req);\n }\n\n const m = await this.ensureModelCached(modelID, signal);\n const adapter = getAdapterForModel(m);\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n\n const body = adapter.buildRequestBody(caps, req);\n return { body: JSON.stringify(body), adapter };\n }\n\n /**\n * 同步聊天 (适合短回复)\n * 响应的 tokenRemaining / callRemaining 字段来自服务端 Header, 反映结算后余额\n * v0.5.0: 根据 provider 自动路由到 /anthropic 或 /chat 端点\n */\n async chat(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<ChatResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req (buildChatRequest 内部 sanitizer 也会改 rawMessages)。\n const r: ChatRequest = { ...req, stream: false };\n // 外层 ctl 界定本方法的总预算 (buildChatRequest 的 ensureModelCached 可能出网,\n // 之后才是 POST — 两段网络操作共享同一条 deadline)。\n //\n // 2026-08-06: 内层 doJSONFullRaw 必须**再传一次** CHAT_REQUEST_TIMEOUT_MS。它的\n // timeoutMs 形参有 30s 默认值, 只传到 ctl.signal 为止时内层会自建 30s 计时器并\n // 恒先于外层 11min 触发 —— v1.6.0 那次\"调整为 11min\"因此一天都没生效过 (取证:\n // 生产网关当日 29 条 latency≈30000ms 的 499, 横跨 4 厂商 5 模型)。\n const ctl = withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS, signal);\n try {\n const { body, adapter } = await this.buildChatRequest(modelID, r, ctl.signal);\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n const { result, headers } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n body,\n ctl.signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n\n // 计费关联 (2026-09-01): 见 GatewayRequestIDCallback。\n notifyGatewayRequestID(onGatewayRequestID, headers);\n\n const resp = adapter.parseResponse(result);\n\n // 从 Header 提取 token 余额\n const v1 = headers.get('X-Token-Remaining');\n if (v1) {\n const n = parseInt(v1, 10);\n if (!isNaN(n)) resp.tokenRemaining = n;\n }\n const v2 = headers.get('X-Call-Remaining');\n if (v2) {\n const n = parseInt(v2, 10);\n if (!isNaN(n)) resp.callRemaining = n;\n }\n const v3 = headers.get('X-Token-Remaining-Model');\n if (v3) {\n const n = parseInt(v3, 10);\n if (!isNaN(n)) resp.modelTokenRemaining = n;\n }\n const v4 = headers.get('X-Token-Remaining-Model-ETU');\n if (v4) {\n const n = parseInt(v4, 10);\n if (!isNaN(n)) resp.modelTokenRemainingETU = n;\n }\n return resp;\n } finally {\n ctl.dispose();\n }\n }\n\n // ===========================================================================\n // 媒体生成 (v1.3+) — 图片 / 视频生成托管模型 (与 chat 同网关)\n //\n // 仅对 capabilities.supports_image_generation / supports_video_generation 的模型有效。\n // 网关不算钱; 用量由网关上报营销系统结算。\n // ===========================================================================\n\n /** 解析 nexus-v4 {code,message,data} 信封, code!=0 抛 BusinessError, 返回 data。 */\n private unwrapAPIResponse<T>(result: Uint8Array): T {\n const env = JSON.parse(new TextDecoder().decode(result)) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(env as unknown as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n return env.data;\n }\n\n /**\n * 图片生成 (同步)。POST /managed-models/:id/images/generations\n *\n * @param modelID 图片生成托管模型 ID (capabilities.supports_image_generation=true)\n */\n async generateImage(\n modelID: string,\n req: ImageGenerationRequest,\n signal?: AbortSignal,\n ): Promise<ImageGenerationResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/images/generations`;\n // 图片生成耗时常超 30s, 用 chat 同级超时 (11min) 容纳上游。\n const { result } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n req,\n signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n return this.unwrapAPIResponse<ImageGenerationResponse>(result);\n }\n\n /**\n * 创建视频生成任务 (异步)。POST /managed-models/:id/videos/generations\n * 返回 taskId; 用 pollVideoTask() 轮询直到 status=completed。\n * 上报真物理量 (视频秒数) 需在 pollVideoTask 时回传 req.duration。\n *\n * @param modelID 视频生成托管模型 ID (capabilities.supports_video_generation=true)\n */\n async generateVideo(\n modelID: string,\n req: VideoGenerationRequest,\n signal?: AbortSignal,\n ): Promise<VideoTaskResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/videos/generations`;\n // 与 generateImage 同级 (11min): 视频任务提交同样经上游网关排队, 30s 默认值不足。\n const { result } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n req,\n signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n return this.unwrapAPIResponse<VideoTaskResponse>(result);\n }\n\n /**\n * 轮询视频任务状态。GET /managed-models/:id/videos/tasks/:taskId\n *\n * @param durationSeconds 创建时的时长 (秒), 透传给网关在 completed 时上报用量。\n */\n async pollVideoTask(\n modelID: string,\n taskID: string,\n durationSeconds?: number,\n signal?: AbortSignal,\n ): Promise<VideoTaskResponse> {\n let endpoint = `/managed-models/${encodeURIComponent(modelID)}/videos/tasks/${encodeURIComponent(taskID)}`;\n if (durationSeconds != null && durationSeconds > 0) {\n endpoint += `?duration=${encodeURIComponent(String(durationSeconds))}`;\n }\n const { result } = await this.doJSONFullRaw('GET', endpoint, null, signal);\n return this.unwrapAPIResponse<VideoTaskResponse>(result);\n }\n\n /**\n * 向量 (同步)。POST /managed-models/:id/embeddings\n *\n * 仅 capabilities.supports_embedding=true 的托管模型可用 (上游接 DashScope)。\n * 响应为 OpenAI /v1/embeddings 标准格式 (网关直通, 无 response.Success 包装)。\n *\n * @param modelID 向量托管模型 ID\n */\n async embeddings(\n modelID: string,\n req: EmbeddingRequest,\n signal?: AbortSignal,\n ): Promise<EmbeddingResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/embeddings`;\n const { result } = await this.doJSONFullRaw('POST', endpoint, req, signal, CHAT_REQUEST_TIMEOUT_MS);\n return JSON.parse(new TextDecoder().decode(result)) as EmbeddingResponse;\n }\n\n /**\n * 重排序 (同步)。POST /managed-models/:id/rerank\n *\n * 仅 capabilities.supports_rerank=true 的托管模型可用 (上游接 DashScope)。\n * 统一扁平契约: { query, documents[], top_n?, return_documents?, instruct? };\n * 响应 { results: [{ index, relevance_score, document? }], usage, model }\n * (网关已把上游原生/OpenAI 兼容两线路归一化, 无 response.Success 包装)。\n *\n * @param modelID 重排序托管模型 ID\n */\n async rerank(\n modelID: string,\n req: RerankRequest,\n signal?: AbortSignal,\n ): Promise<RerankResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/rerank`;\n const { result } = await this.doJSONFullRaw('POST', endpoint, req, signal, CHAT_REQUEST_TIMEOUT_MS);\n return JSON.parse(new TextDecoder().decode(result)) as RerankResponse;\n }\n\n /**\n * Anthropic 原生格式同步聊天\n * v0.5.0: 根据 provider 自动路由\n * Anthropic → chatMessagesAnthropic (现有路径, POST /anthropic)\n * 其他厂商 → chatMessagesOpenAI (POST /chat, 响应转换为 AnthropicResponse)\n */\n async chatMessages(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<AnthropicResponse> {\n const m = await this.ensureModelCached(modelID, signal);\n const adapter = getAdapterForModel(m);\n\n if (adapter.format() === ProviderFormat.Anthropic) {\n return this.chatMessagesAnthropic(modelID, req, adapter, signal, onGatewayRequestID);\n }\n return this.chatMessagesOpenAI(modelID, req, adapter, signal, onGatewayRequestID);\n }\n\n private async chatMessagesAnthropic(\n modelID: string,\n req: ChatRequest,\n adapter: ProviderAdapter,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<AnthropicResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: false };\n const ctl = withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, r);\n const data = JSON.stringify(body);\n\n // 第 5 实参不可省 — 见 chat() 处说明: 缺它内层恒落回 30s 默认值。\n const { result, headers } = await this.doJSONFullRaw(\n 'POST',\n `/managed-models/${encodeURIComponent(modelID)}/anthropic`,\n data,\n ctl.signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n\n // 计费关联 (2026-09-01): 见 GatewayRequestIDCallback。\n notifyGatewayRequestID(onGatewayRequestID, headers);\n\n // 尝试 APIResponse 包装: {\"code\":0,\"message\":\"...\",\"data\":{...}}\n const rawStr = new TextDecoder().decode(result);\n try {\n const wrapper = JSON.parse(rawStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n const bizErr = apiResponseBusinessError({\n code: wrapper.code ?? 0,\n message: wrapper.message,\n data: wrapper.data,\n } as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n return wrapper.data as AnthropicResponse;\n }\n } catch (e) {\n // 不是 wrapper 格式, fall through\n if (e && typeof e === 'object' && 'name' in e && (e as Error).name === 'BusinessError') throw e;\n }\n\n try {\n return JSON.parse(rawStr) as AnthropicResponse;\n } catch (e) {\n throw new Error(`decode anthropic response: ${e instanceof Error ? e.message : String(e)}`);\n }\n } finally {\n ctl.dispose();\n }\n }\n\n private async chatMessagesOpenAI(\n modelID: string,\n req: ChatRequest,\n adapter: ProviderAdapter,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<AnthropicResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: false };\n const ctl = withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, r);\n const data = JSON.stringify(body);\n\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n // 第 5 实参不可省 — 见 chat() 处说明: 缺它内层恒落回 30s 默认值。\n const { result, headers } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n data,\n ctl.signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n\n // 计费关联 (2026-09-01): 见 GatewayRequestIDCallback。\n notifyGatewayRequestID(onGatewayRequestID, headers);\n\n // 解析 OpenAI 格式响应并转换为 AnthropicResponse\n const { parseOpenAIResponseToAnthropic } = await import('../models/adapters/openai');\n return parseOpenAIResponseToAnthropic(result);\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * 流式聊天 (SSE), 通过 async generator 返回事件\n * v0.5.0: 根据 adapter 路由端点\n *\n * @param onUpstreamActivity 见 {@link UpstreamActivityCallback}\n * @param onGatewayRequestID 见 {@link GatewayRequestIDCallback}\n */\n chatStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () =>\n this.chatStreamGen(modelID, req, signal, false, onUpstreamActivity, onGatewayRequestID),\n };\n }\n\n /**\n * Anthropic 原生格式流式聊天 (SSE)\n * 调用 POST /managed-models/:id/anthropic, SSE 事件为 Anthropic 协议格式\n * 无 started/settled/failed 自定义事件, 无 data: [DONE], message_stop 为自然结束\n *\n * @param onUpstreamActivity 见 {@link UpstreamActivityCallback}\n * @param onGatewayRequestID 见 {@link GatewayRequestIDCallback}\n */\n chatMessagesStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () =>\n this.chatMessagesStreamGen(modelID, req, signal, false, onUpstreamActivity, onGatewayRequestID),\n };\n }\n\n private async *chatStreamGen(\n modelID: string,\n req: ChatRequest,\n signal: AbortSignal | undefined,\n retried: boolean,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncGenerator<StreamEvent, void, void> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: true };\n const { body, adapter } = await this.buildChatRequest(modelID, r, signal);\n const token = await this.ensureToken(signal);\n\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n const url = this.apiURL(endpoint);\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body,\n signal,\n });\n } catch (e) {\n throw classifyTransport('POST ' + endpoint, url, e);\n }\n\n // 401 单次重试\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(signal, token);\n } catch (refreshErr) {\n throw new Error(\n `stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n yield* this.chatStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID);\n return;\n }\n\n // 计费关联 (2026-09-01): 响应头在首字节之前就已到达, 这里是唯一能在\n // 「流还没吐任何事件」之前拿到消费请求 ID 的位置。刻意放在 !resp.ok 之前 ——\n // HTTP 错误同样有关联价值, 且错误体里未必带这个 ID。\n notifyGatewayRequestID(onGatewayRequestID, resp.headers);\n\n if (!resp.ok) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n if (!resp.body) {\n throw new Error('stream: empty response body');\n }\n\n let blockTypeMap: Map<number, BlockMeta> | null = null;\n if (adapter.format() === ProviderFormat.Anthropic) {\n blockTypeMap = new Map();\n }\n\n let currentEvent = '';\n for await (const line of iterSSELines(resp.body)) {\n notifyUpstreamActivity(onUpstreamActivity);\n // v1.6.0: 显式跳过 SSE 注释行 (\": comment\", 如 \": keep-alive\")\n if (isSSECommentLine(line)) continue;\n if (line.startsWith('event:')) {\n currentEvent = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n const parsed = adapter.parseStreamLine(currentEvent, data);\n if (parsed.done) return;\n const ev = parsed.event;\n if (blockTypeMap) {\n const [idx, bt, eph] = extractAnthropicBlockMeta(currentEvent, data, blockTypeMap);\n if (bt !== '') {\n ev.blockIndex = idx;\n ev.blockType = bt;\n ev.ephemeral = eph;\n }\n }\n yield ev;\n }\n }\n }\n\n private async *chatMessagesStreamGen(\n modelID: string,\n req: ChatRequest,\n signal: AbortSignal | undefined,\n retried: boolean,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncGenerator<StreamEvent, void, void> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: true };\n const { body, adapter } = await this.buildChatRequest(modelID, r, signal);\n const token = await this.ensureToken(signal);\n\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n const url = this.apiURL(endpoint);\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body,\n signal,\n });\n } catch (e) {\n throw classifyTransport('POST ' + endpoint, url, e);\n }\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(signal, token);\n } catch (refreshErr) {\n throw new Error(\n `messages stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n yield* this.chatMessagesStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID);\n return;\n }\n\n // 计费关联 (2026-09-01): 响应头在首字节之前就已到达, 这里是唯一能在\n // 「流还没吐任何事件」之前拿到消费请求 ID 的位置。刻意放在 !resp.ok 之前 ——\n // HTTP 错误同样有关联价值, 且错误体里未必带这个 ID。\n notifyGatewayRequestID(onGatewayRequestID, resp.headers);\n\n if (!resp.ok) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n if (!resp.body) {\n throw new Error('messages stream: empty response body');\n }\n\n if (adapter.format() === ProviderFormat.OpenAI) {\n // OpenAI SSE: 转换为 Anthropic 兼容事件\n const converter = newOpenAIStreamConverter();\n let _currentEvent = '';\n for await (const line of iterSSELines(resp.body)) {\n notifyUpstreamActivity(onUpstreamActivity);\n // v1.6.0: 显式跳过 SSE 注释行\n if (isSSECommentLine(line)) continue;\n if (line.startsWith('event:')) {\n _currentEvent = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n const { events, done } = converter.convert(data);\n for (const ev of events) yield ev;\n if (done) return;\n }\n }\n } else {\n // Anthropic SSE: 原生事件直透 + v0.11.0 content block 元数据回填\n const blockTypeMap = new Map<number, BlockMeta>();\n let currentEvent = '';\n for await (const line of iterSSELines(resp.body)) {\n notifyUpstreamActivity(onUpstreamActivity);\n // v1.6.0: 显式跳过 SSE 注释行\n if (isSSECommentLine(line)) continue;\n if (line.startsWith('event:')) {\n currentEvent = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n const ev: StreamEvent = { event: currentEvent, data };\n const [idx, bt, eph] = extractAnthropicBlockMeta(currentEvent, data, blockTypeMap);\n if (bt !== '') {\n ev.blockIndex = idx;\n ev.blockType = bt;\n ev.ephemeral = eph;\n }\n yield ev;\n }\n }\n }\n }\n\n /**\n * 流式聊天, 自动解析结算事件和搜索来源\n *\n * 返回单一 tagged AsyncIterable, kind 区分 4 种事件:\n * - kind='content': 内容增量事件\n * - kind='sources': 搜索来源\n * - kind='settle': 结算 (token 消耗 + 剩余余额)\n *\n * Go 版本 4 channels (eventCh/sourcesCh/settleCh/errCh), 错误抛出取代 errCh。\n */\n async *chatStreamWithUsage(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<\n | { kind: 'content'; event: StreamEvent }\n | { kind: 'sources'; event: SourcesEvent }\n | { kind: 'settle'; event: StreamSettlement },\n void,\n void\n > {\n for await (const ev of this.chatStream(modelID, req, signal)) {\n // 结算事件 (settled / pending_settle)\n const s = parseSettlement(ev);\n if (s) {\n yield { kind: 'settle', event: s };\n continue;\n }\n // 搜索来源事件\n const src = parseSourcesEvent(ev);\n if (src) {\n yield { kind: 'sources', event: src };\n continue;\n }\n // 控制事件: 过滤\n if (ev.event === 'started') continue;\n // 失败/错误事件: 解析错误信息抛出\n if (ev.event === 'failed' || ev.event === 'error') {\n throw parseStreamError(ev.data);\n }\n // 内容事件\n yield { kind: 'content', event: ev };\n }\n }\n\n // ===========================================================================\n // Internal HTTP\n // ===========================================================================\n\n apiURL(path: string): string {\n // apiBaseURL 覆盖 (未配置时 === serverURL, 既有行为零变化)。\n let base = this.apiBaseURL ?? this.serverURL;\n if (!base.endsWith('/api/v4')) {\n base += '/api/v4';\n }\n const url = base + path;\n this.assertCredentialURL(url);\n return url;\n }\n\n /**\n * Compliance API URL 拼接。\n *\n * `complianceBaseURL` 已配置时直接拼接;未配置时默认\n * `${serverURL}/admin-api` + path,匹配 Java compliance controller 的\n * `/compliance/...` 路径。\n *\n * 不复用 `apiURL`:apiURL 强制追加 `/api/v4`,与 compliance 路径不同。\n */\n complianceURL(path: string): string {\n const base = this.complianceBaseURL ?? this.serverURL + '/admin-api';\n const url = base + path;\n this.assertCredentialURL(url);\n return url;\n }\n\n private assertCredentialURL(url: string): void {\n if (this.credentialMode !== 'legacy' && new URL(url).origin !== this.credentialAuthority) {\n throw new Error('credential request authority changed');\n }\n }\n\n /** GET/POST/... 通用 JSON 调用 (返回 result 已 typed) */\n async doJSON<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n ): Promise<T> {\n const r = await this.doJSONFull<T>(method, path, body, signal);\n return r.result;\n }\n\n /** 与 doJSON 相同, 但返回响应 Headers (用于提取 X-Token-Remaining 等) */\n async doJSONFull<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n ): Promise<{ result: T; headers: Headers }> {\n return this.doJSONFullInternal<T>(method, path, body, signal, false);\n }\n\n private async doJSONFullInternal<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n retried: boolean,\n ): Promise<{ result: T; headers: Headers }> {\n const ctl = withRequestTimeout(30_000, signal);\n try {\n const token = await this.ensureToken(ctl.signal);\n\n let bodyStr: string | null = null;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const url = this.apiURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n if (bodyStr != null) headers['Content-Type'] = 'application/json';\n\n const resp = await this.doRequestWithRetry(\n { method, url, headers, body: bodyStr ?? undefined },\n ctl.signal,\n );\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(ctl.signal, token);\n } catch (refreshErr) {\n throw new Error(\n `unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n return this.doJSONFullInternal<T>(method, path, body, signal, true);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n // 空 body 的成功响应 (HTTP 204 / 200 空体) — 不要 JSON.parse('') (抛 SyntaxError)。\n // 按方法返回契约返回 undefined (与 compliance executeJson 一致), 同时跳过业务码检查。\n if (!text) {\n return { result: undefined as unknown as T, headers: resp.headers };\n }\n const result = JSON.parse(text) as T;\n // 业务码检查 (APIResponse.code != 0)\n if (result && typeof result === 'object' && 'code' in result) {\n const bizErr = apiResponseBusinessError(result as unknown as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n }\n return { result, headers: resp.headers };\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError') {\n throw classifyTransport(`${method} ${path}`, this.apiURL(path), e);\n }\n throw e;\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse)\n *\n * ⚠️ 契约 (2026-08-06): `timeoutMs` 的 30s 默认值只适用于**控制面**端点 (列目录 /\n * 查配额 / 取任务状态)。凡走**模型推理或生成**的端点 —— chat / anthropic /\n * embeddings / rerank / images / videos —— 一律必须显式传入 `CHAT_REQUEST_TIMEOUT_MS`,\n * 哪怕调用方已经用 `withRequestTimeout` 建了外层预算: 外层只约束 `signal`, 内层\n * 会**另建**一个 `timeoutMs` 计时器, 30s 恒先于任何更长的外层预算触发。\n *\n * 这不是假设 —— 2026-08-06 事故里 chat 路径正因漏传本参数而被恒定钉死在 30s,\n * 且上方 v1.6.0 的注释还声称它已是 11min。回归闸门见\n * `tests/chat-timeout-budget.test.ts`。\n */\n async doJSONFullRaw(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n timeoutMs = 30_000,\n ): Promise<{ result: Uint8Array; headers: Headers }> {\n return this.doJSONFullRawInternal(method, path, body, signal, false, timeoutMs);\n }\n\n private async doJSONFullRawInternal(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n retried: boolean,\n timeoutMs = 30_000,\n ): Promise<{ result: Uint8Array; headers: Headers }> {\n const ctl = withRequestTimeout(timeoutMs, signal);\n try {\n const token = await this.ensureToken(ctl.signal);\n\n let bodyStr: string | null = null;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const url = this.apiURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n if (bodyStr != null) headers['Content-Type'] = 'application/json';\n\n const resp = await this.doRequestWithRetry(\n { method, url, headers, body: bodyStr ?? undefined },\n ctl.signal,\n );\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(ctl.signal, token);\n } catch (refreshErr) {\n throw new Error(\n `unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n return this.doJSONFullRawInternal(method, path, body, signal, true, timeoutMs);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const buf = new Uint8Array(await resp.arrayBuffer());\n return { result: buf, headers: resp.headers };\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * 公共端点请求\n * 有 token 时自动附带 (享受认证用户待遇), 无 token 时匿名请求\n * 不做 401 重试 (公共端点不应要求认证)\n */\n async doPublicJSON<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n ): Promise<T> {\n const ctl = withRequestTimeout(30_000, signal);\n try {\n let token = '';\n try {\n token = await this.ensureToken(ctl.signal);\n } catch {\n // 公共端点允许未授权\n }\n\n let bodyStr: string | null = null;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const url = this.apiURL(path);\n const headers: Record<string, string> = {};\n if (token) headers['Authorization'] = `Bearer ${token}`;\n if (bodyStr != null) headers['Content-Type'] = 'application/json';\n\n const resp = await this.doRequestWithRetry(\n { method, url, headers, body: bodyStr ?? undefined },\n ctl.signal,\n );\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n const result = JSON.parse(text) as T;\n if (result && typeof result === 'object' && 'code' in result) {\n const bizErr = apiResponseBusinessError(result as unknown as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n }\n return result;\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * 给子 client (agent-runs / compliance) 用的请求超时组合器。\n *\n * 返回一个 controller, 其 `signal` 同时受默认/指定超时与外部 `parent` signal 约束 —\n * 二者任一触发都会 abort (用户传入的 signal 仍然生效)。调用方**必须**在 finally 里\n * `dispose()` 清掉定时器与监听, 否则 timer 泄漏。\n *\n * 仅用于非流式 JSON 请求; 流式 (SSE) / 下载路径不应套短超时 (会切断长连接)。\n */\n withRequestTimeout(ms: number, parent?: AbortSignal): ReqTimeoutCtl {\n return withRequestTimeout(ms, parent);\n }\n\n /**\n * fetch 包装 — 错误经 classifyTransport 转 NetworkError\n * 6 处原始 fetch() 全部走此 helper\n */\n async doRequest(req: { method: string; url: string; headers: Record<string, string>; body?: string }, signal?: AbortSignal): Promise<Response> {\n if (new Headers(req.headers).has('Authorization')) this.assertCredentialURL(req.url);\n try {\n return await this.fetchImpl(req.url, {\n method: req.method,\n headers: req.headers,\n body: req.body,\n signal,\n });\n } catch (e) {\n throw classifyTransport(req.method + ' ' + new URL(req.url).pathname, req.url, e);\n }\n }\n\n /**\n * 带 RetryPolicy 的 doRequest 包装 — 仅用于同步 (非流式) 路径.\n *\n * 重试触发:\n * - transport 层 err (NetworkError isTimeout/isEOF) → 重试\n * - HTTP 5xx / 429 → 主动构造 HTTPError 喂给 onRetryable, 默认重试\n * - 其他 (HTTP 2xx/3xx/4xx 非 429 / DNS / StreamError) → 不重试\n *\n * 流式路径 (chatMessagesStreamGen / chatStreamGen) **不得**调用此函数, 必须直接用 doRequest.\n */\n async doRequestWithRetry(\n req: { method: string; url: string; headers: Record<string, string>; body?: string },\n signal?: AbortSignal,\n ): Promise<Response> {\n const policy = this.retryPolicy;\n if (!policy || !policy.safeToRetry({ method: req.method, url: req.url })) {\n return this.doRequest(req, signal);\n }\n\n let lastErr: unknown = null;\n for (let attempt = 0; attempt < policy.maxAttempts; attempt++) {\n try {\n const resp = await this.doRequest(req, signal);\n // 仅 5xx/429 进入 retry 评估\n if (resp.status < 500 && resp.status !== 429) {\n return resp;\n }\n // 5xx 或 429 → 构造 HTTPError 喂给 onRetryable\n const bodyPeek = await readLimited(resp.body!, maxErrorBodySize);\n lastErr = parseHTTPErrorWithHeader(resp.status, bodyPeek, resp.headers);\n } catch (e) {\n lastErr = e;\n }\n\n if (attempt + 1 === policy.maxAttempts) break;\n if (!policy.onRetryable(lastErr)) break;\n\n const backoff = computeBackoff(policy, attempt, lastErr);\n await sleep(backoff, signal);\n }\n throw lastErr;\n }\n}\n\n// =============================================================================\n// 内部 helpers\n// =============================================================================\n\nfunction defaultTokenStore(): TokenStore {\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n return new FileTokenStore();\n } catch {\n return new InMemoryTokenStore();\n }\n }\n if (typeof globalThis.localStorage !== 'undefined') {\n try {\n return new LocalStorageTokenStore();\n } catch {\n return new InMemoryTokenStore();\n }\n }\n return new InMemoryTokenStore();\n}\n\nfunction isLikelyBrowserOAuthCORSError(message: string): boolean {\n const lower = message.toLowerCase();\n return (\n lower.includes('failed to fetch') ||\n lower.includes('networkerror') ||\n lower.includes('cors') ||\n lower.includes('http 403')\n );\n}\n\nfunction isTokenSetLike(value: unknown): value is TokenSet {\n if (value == null || typeof value !== 'object') return false;\n const candidate = value as Partial<TokenSet>;\n return (\n typeof candidate.access_token === 'string' &&\n typeof candidate.refresh_token === 'string' &&\n typeof candidate.expires_at === 'string' &&\n typeof candidate.scope === 'string' &&\n typeof candidate.client_id === 'string' &&\n typeof candidate.server_url === 'string'\n );\n}\n\nfunction zeroModelCapabilities(): ModelCapabilities {\n return {\n supports_thinking: false,\n supports_adaptive_thinking: false,\n supports_isp: false,\n supports_web_search: false,\n supports_tool_search: false,\n supports_structured_output: false,\n supports_effort: false,\n supports_max_effort: false,\n supports_fast_mode: false,\n supports_auto_mode: false,\n supports_1m_context: false,\n supports_prompt_cache: false,\n supports_cache_editing: false,\n supports_token_efficient: false,\n supports_redact_thinking: false,\n max_input_tokens: 0,\n max_output_tokens: 0,\n supports_desktop_visual_understanding: false,\n };\n}\n\n/**\n * 归一化上游 ManagedModel 列表中的 input_modalities (snake_case) → inputModalities (camelCase).\n *\n * 设计:\n * - 同时存在 camelCase 与 snake_case 时, camelCase 胜 (官方契约).\n * - 仅 snake_case 时, 拷一份到 camelCase 让 SDK 用户只读一个字段.\n * - 都没有时不补 default ['text'], 留 undefined — 让调用方知道这是 \"未声明\" 而非 \"明确 text-only\".\n * - **两个分支等价**: 只做键名归一, 不做值过滤。\n *\n * 2.14.0 前 snake 分支带一个 {text, image} 白名单过滤, camel 分支不带。由于线上\n * wire 恒为 camelCase, 那个过滤器从未执行过 —— 是死代码, 但它写下的语义是错的:\n * 模态值域归网关目录所有 (2026-06-20 起含 'video'), SDK 端硬编码一份已知集去过滤,\n * 等于替调用方悄悄删掉目录真值, 且与\"零硬编码能力集\"的原则冲突。收敛为对称透传后,\n * 容忍未知值的责任明确落在消费端类型上 ({@link InputModalityTag} 是开放的)。\n *\n * 该函数 in-place 修改并返回输入数组 (与现网调用方共享同一引用, 避免额外拷贝).\n */\nfunction normalizeInputModalities(models: ManagedModel[]): ManagedModel[] {\n if (!Array.isArray(models)) return models;\n for (const m of models) {\n if (!m || typeof m !== 'object') continue;\n if (Array.isArray(m.inputModalities)) continue;\n const snake = (m as ManagedModel & { input_modalities?: unknown }).input_modalities;\n if (Array.isArray(snake)) {\n // 只收字符串元素 (非字符串是上游畸形值, 留着会让 includes 判定失去意义),\n // 但绝不按已知模态集裁剪。\n m.inputModalities = snake.filter((v): v is string => typeof v === 'string');\n }\n }\n return models;\n}\n\nexport interface ReqTimeoutCtl {\n signal: AbortSignal;\n dispose(): void;\n}\n\n/** 创建组合 abort signal: 超时 + 外部 signal 任一触发都 abort. 若 parent 已有 deadline 则不覆盖. */\nfunction withRequestTimeout(ms: number, parent?: AbortSignal): ReqTimeoutCtl {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), ms);\n let parentHandler: (() => void) | undefined;\n if (parent) {\n if (parent.aborted) {\n ctl.abort();\n } else {\n parentHandler = () => ctl.abort();\n parent.addEventListener('abort', parentHandler);\n }\n }\n return {\n signal: ctl.signal,\n dispose() {\n clearTimeout(timer);\n if (parentHandler && parent) parent.removeEventListener('abort', parentHandler);\n },\n };\n}\n\nasync function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n if (signal && signal.aborted) throw new Error('aborted');\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n if (signal && abortHandler) signal.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => {\n clearTimeout(t);\n signal.removeEventListener('abort', abortHandler!);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n }\n });\n}\n","// auth/types.ts — 鉴权 / 身份域类型。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 OAuth 段。\n\n// =============================================================================\n// OAuth\n// =============================================================================\n\n/** OAuth Authorization Server 元数据 (RFC 8414) */\nexport interface ServerMetadata {\n crabcode_auth_contract_version?: number;\n gateway_error_contract_version?: number;\n issuer: string;\n authorization_endpoint: string;\n token_endpoint: string;\n revocation_endpoint: string;\n registration_endpoint: string;\n scopes_supported: string[];\n}\n\n/** OAuth token 响应 */\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token?: string;\n scope?: string;\n}\n\n/** 持久化 token 对 */\nexport interface TokenSet {\n access_token: string;\n refresh_token: string;\n /** ISO 8601 格式 */\n expires_at: string;\n scope: string;\n client_id: string;\n server_url: string;\n}\n\n/** token 是否已过期 (提前 30 秒视为过期) */\nexport function tokenSetIsExpired(t: TokenSet): boolean {\n const expiresAt = new Date(t.expires_at).getTime();\n // 非法 expires_at (空串 / 'not-a-date' / undefined) → NaN, 任何 `Date.now() > NaN`\n // 比较恒为 false, 会把坏 token 当作\"未过期\"长期复用。视为已过期, 触发 refresh / 重登。\n if (!Number.isFinite(expiresAt)) return true;\n return Date.now() > expiresAt - 30_000;\n}\n\n/**\n * 运行时校验任意值是否为合法 TokenSet 形状 (所有字段都是 string)。\n *\n * store 反序列化磁盘 / localStorage 的 JSON 后必须经此校验:\n * 损坏文件、旧版本残留、缺字段都会被判为无效, 由 caller 当作\"无 token\"重新登录,\n * 而不是把 `{}` / 缺字段对象直接 cast 成 TokenSet 后在 refresh 阶段炸出难懂的错误。\n */\nexport function isValidTokenSet(x: unknown): x is TokenSet {\n if (typeof x !== 'object' || x === null) return false;\n const t = x as Record<string, unknown>;\n return (\n typeof t.access_token === 'string' &&\n typeof t.refresh_token === 'string' &&\n typeof t.expires_at === 'string' &&\n typeof t.scope === 'string' &&\n typeof t.client_id === 'string' &&\n typeof t.server_url === 'string'\n );\n}\n\n/** 动态注册响应 */\nexport interface ClientRegistration {\n client_id: string;\n client_secret?: string;\n}\n","// shared/api-response.ts — nexus-v4 / yudao 标准 API 响应包装。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 API Response Wrapper 段。\n\nimport { BusinessError } from './errors';\n\n// =============================================================================\n// API Response Wrapper\n// =============================================================================\n\n/** nexus-v4 标准响应。兼容 yudao 格式 (msg) 和 nexus-v4 格式 (message) */\nexport interface APIResponse<T> {\n code: number;\n message?: string;\n msg?: string;\n data: T;\n}\n\n/** 优先返回 message, 降级到 msg (兼容 yudao 透传) */\nexport function apiResponseGetMessage<T>(r: APIResponse<T>): string {\n return r.message ?? r.msg ?? '';\n}\n\n/** 检查业务层错误码 — code != 0 时抛 BusinessError */\nexport function apiResponseBusinessError<T>(r: APIResponse<T>): BusinessError | null {\n if (r.code !== 0) {\n return new BusinessError(r.code, apiResponseGetMessage(r));\n }\n return null;\n}\n\n/** yudao 分页响应格式 (tk-dist 代理透传) */\nexport interface YudaoPageResult<T> {\n list: T[];\n total: number;\n}\n","// auth.ts — 端口自 acosmi-sdk-go/auth.go (474 行)\n//\n// 跨平台 OAuth 2.1 PKCE helpers + Node-only loopback authorize (HTTP callback server)。\n//\n// 浏览器侧 (v1.4.0+): authorize() 会抛错 (无 loopback HTTP server), 改用同文件内的\n// Web OAuth 原语 — discoverWebOAuthMetadata / registerWebOAuthClient /\n// createWebAuthorizationRequest / completeWebAuthorizationRequest。由调用方实现\n// popup / 同窗口 redirect handler, SDK 负责 PKCE / state 校验 / token 兑换。\n\nimport type { ClientRegistration, ServerMetadata, TokenResponse, TokenSet } from './types';\n\n/** auth 专用超时 (毫秒) — 与 Go authHTTPClient 30s 一致 */\nconst authTimeoutMs = 30_000;\n\nexport class OAuthTokenEndpointError extends Error {\n readonly status: number;\n readonly oauthError: string;\n readonly errorDescription: string;\n\n constructor(status: number, oauthError: string, errorDescription: string) {\n super(`token: HTTP ${status}: ${errorDescription || oauthError}`);\n this.name = 'OAuthTokenEndpointError';\n this.status = status;\n this.oauthError = oauthError;\n this.errorDescription = errorDescription;\n }\n}\n\nexport function isInvalidGrantError(err: unknown): boolean {\n return err instanceof OAuthTokenEndpointError && err.oauthError === 'invalid_grant';\n}\n\n// =============================================================================\n// Discovery\n// =============================================================================\n\n/** OAuth metadata profile — 决定 well-known 端点的路径后缀 */\nexport type OAuthMetadataProfile = 'web' | 'desktop';\n\n/**\n * 从 well-known 端点获取指定 profile 的 OAuth 服务元数据。\n *\n * serverURL 可能含路径 (如 \"https://acosmi.ai/api/v4\"),\n * well-known 端点按 RFC 8414 必须在 origin 根路径:\n * https://acosmi.ai/.well-known/oauth-authorization-server/<profile>\n *\n * profile='desktop' 对应桌面 loopback OAuth;profile='web' 对应浏览器 Web OAuth。\n * 内部 helper — `discover` / `discoverWebOAuthMetadata` 是其薄包装。\n */\nexport async function discoverWithProfile(\n serverURL: string,\n profile: OAuthMetadataProfile,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ServerMetadata> {\n let parsed: URL;\n try {\n parsed = new URL(serverURL.replace(/\\/+$/, ''));\n } catch (e) {\n throw new Error(`discover: invalid server URL: ${e instanceof Error ? e.message : String(e)}`);\n }\n const origin = `${parsed.protocol}//${parsed.host}`;\n const endpoint = `${origin}/.well-known/oauth-authorization-server/${profile}`;\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetchImpl(endpoint, { method: 'GET', signal: ctl.signal });\n } catch (e) {\n throw new Error(`discover: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n\n if (!resp.ok) {\n throw new Error(`discover: HTTP ${resp.status}`);\n }\n\n let meta: ServerMetadata;\n try {\n meta = (await resp.json()) as ServerMetadata;\n } catch (e) {\n throw new Error(`discover: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n // 校验关键字段非空\n if (!meta.token_endpoint || !meta.authorization_endpoint) {\n throw new Error(\n `discover: metadata missing required endpoints (token=${meta.token_endpoint ?? ''}, auth=${meta.authorization_endpoint ?? ''})`,\n );\n }\n\n return meta;\n}\n\n/**\n * 从 well-known 端点获取 Desktop OAuth 服务元数据。\n *\n * serverURL 可能含路径 (如 \"https://acosmi.ai/api/v4\"),\n * well-known 端点按 RFC 8414 必须在 origin 根路径:\n * https://acosmi.ai/.well-known/oauth-authorization-server/desktop\n */\nexport async function discover(\n serverURL: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ServerMetadata> {\n return discoverWithProfile(serverURL, 'desktop', signal, fetchImpl);\n}\n\n/**\n * 从 well-known 端点获取 Web OAuth 服务元数据。\n *\n * 与 `discover` 行为一致, 但请求路径为\n * https://acosmi.com/.well-known/oauth-authorization-server/web\n *\n * 浏览器侧 Web OAuth (csign 等第一方 Web 应用) 必须用此 profile,\n * 它返回 Web authorize/token 端点; `discover` 的 desktop profile 返回的是\n * 桌面 loopback 端点, 不可混用。\n */\nexport async function discoverWebOAuthMetadata(\n serverURL: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ServerMetadata> {\n return discoverWithProfile(serverURL, 'web', signal, fetchImpl);\n}\n\n// =============================================================================\n// Dynamic Client Registration (RFC 7591)\n// =============================================================================\n\n/** 动态注册桌面客户端,获取 client_id */\nexport async function register(\n meta: ServerMetadata,\n appName: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ClientRegistration> {\n const regReq = {\n client_name: appName,\n token_endpoint_auth_method: 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n redirect_uris: ['http://127.0.0.1/callback'],\n response_types: ['code'],\n };\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetchImpl(meta.registration_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(regReq),\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`register: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n\n if (resp.status !== 200 && resp.status !== 201) {\n throw new Error(`register: HTTP ${resp.status}`);\n }\n\n try {\n return (await resp.json()) as ClientRegistration;\n } catch (e) {\n throw new Error(`register: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Web OAuth 动态注册参数 */\nexport interface RegisterWebOAuthClientOptions {\n /** 客户端展示名 (RFC 7591 client_name) */\n clientName: string;\n /** 浏览器 Web OAuth 的 redirect_uri 列表 (如 [\"https://sign.zhonglvbao.com/login/callback\"]) */\n redirectURIs: string[];\n /** 可选 scope 列表 — 提供时以空格连接写入 RFC 7591 scope 字段 */\n scopes?: string[];\n}\n\n/**\n * 动态注册 Web OAuth (浏览器) 客户端,获取 client_id。\n *\n * 与 `register` (桌面 loopback, 硬编码 redirect_uri=127.0.0.1) 的区别:\n * 本函数允许传入任意 Web redirect_uri,供 csign 等第一方 Web 应用使用。\n * `token_endpoint_auth_method` 仍为 `none` (PKCE public client)。\n */\nexport async function registerWebOAuthClient(\n meta: ServerMetadata,\n opts: RegisterWebOAuthClientOptions,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ClientRegistration> {\n const regReq = {\n client_name: opts.clientName,\n token_endpoint_auth_method: 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n redirect_uris: opts.redirectURIs,\n response_types: ['code'],\n ...(opts.scopes ? { scope: opts.scopes.join(' ') } : {}),\n };\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetchImpl(meta.registration_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(regReq),\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`register: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n\n if (resp.status !== 200 && resp.status !== 201) {\n throw new Error(`register: HTTP ${resp.status}`);\n }\n\n try {\n return (await resp.json()) as ClientRegistration;\n } catch (e) {\n throw new Error(`register: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n// =============================================================================\n// PKCE\n// =============================================================================\n\n/** 生成 32 字节加密随机数,base64url 无填充编码 — PKCE verifier / state 共用随机源 */\nasync function randomBase64Url32(): Promise<string> {\n const c = await getCrypto();\n const b = new Uint8Array(32);\n c.getRandomValues(b);\n return base64urlNoPad(b);\n}\n\nasync function generateCodeVerifier(): Promise<string> {\n return randomBase64Url32();\n}\n\n/**\n * 生成 OAuth `state` 参数 — 32 字节加密随机数, base64url 无填充。\n *\n * 与 `generateCodeVerifier` 共用随机源 (`randomBase64Url32`)。Web OAuth 流程\n * 用它做 CSRF 防护: 授权请求带上 state, callback 回来必须逐字符比对。\n */\nexport async function generateState(): Promise<string> {\n return randomBase64Url32();\n}\n\nasync function codeChallenge(verifier: string): Promise<string> {\n const c = await getCrypto();\n const buf = await c.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n return base64urlNoPad(new Uint8Array(buf));\n}\n\nasync function getCrypto(): Promise<Crypto> {\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n return globalThis.crypto;\n }\n // Node ≤18 fallback (Node 19+ 自带 globalThis.crypto)\n const nodeCrypto = await import('node:crypto');\n return nodeCrypto.webcrypto as unknown as Crypto;\n}\n\nfunction base64urlNoPad(b: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < b.length; i++) bin += String.fromCharCode(b[i]!);\n let s: string;\n if (typeof btoa === 'function') {\n s = btoa(bin);\n } else {\n // Node fallback\n s = Buffer.from(b).toString('base64');\n }\n return s.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// =============================================================================\n// LoginWithHandler 事件模型\n// =============================================================================\n\nexport type LoginEventType = 'auth_url' | 'complete' | 'error';\n\nexport const EventAuthURL = 'auth_url' as const;\nexport const EventComplete = 'complete' as const;\nexport const EventError = 'error' as const;\n\nexport type LoginErrCode =\n | 'discovery_failed'\n | 'registration_failed'\n | 'browser_open_failed'\n | 'auth_denied'\n | 'auth_timeout'\n | 'token_exchange_failed'\n | 'ssl_proxy_detected'\n | 'state_mismatch'\n | 'credential_install_rejected';\n\nexport const ErrDiscovery = 'discovery_failed' as const;\nexport const ErrRegistration = 'registration_failed' as const;\nexport const ErrBrowserOpen = 'browser_open_failed' as const;\nexport const ErrAuthDenied = 'auth_denied' as const;\nexport const ErrTimeout = 'auth_timeout' as const;\nexport const ErrTokenExchange = 'token_exchange_failed' as const;\nexport const ErrSSLProxy = 'ssl_proxy_detected' as const;\n/** Web OAuth callback 的 state 与发起时不一致 (CSRF 防护) */\nexport const ErrStateMismatch = 'state_mismatch' as const;\n\n/** 登录流程事件 */\nexport interface LoginEvent {\n attemptId?: string;\n type: LoginEventType;\n url?: string;\n error?: string;\n err_code?: LoginErrCode;\n}\n\n/** 登录选项 (函数选项模式 → TS options object) */\nexport interface LoginOptions {\n /** 跳过自动打开浏览器 (由调用方控制浏览器) */\n skipBrowser?: boolean;\n /** SSO 场景下的 email 预填 */\n loginHint?: string;\n /** 如 \"sso\" */\n loginMethod?: string;\n /** 强制组织登录 */\n orgUUID?: string;\n /** 自定义 token 有效期 (秒) */\n expiresIn?: number;\n /**\n * 桌面 loopback 授权成功后, 把浏览器 302 重定向到此品牌成功页 URL,\n * 替代默认在 `127.0.0.1` 本地回环服务器渲染的\"授权成功\"HTML。\n *\n * 授权码仍先回投本地回环 (`codeResolver(code)` 不变), 安全模型不动 —\n * 只是把\"给浏览器看的那一屏\"从本地 HTML 换成 302 到调用方域名页,\n * 让地址栏显示业务域名而非 `127.0.0.1`。\n *\n * 取值约束: 必须是 `http(s)` 绝对 URL; 缺失或非法时回退本地 HTML (零回归)。\n * 多部署/多域名调用方 (acosmi.com / sign.zhonglvbao.com / FedStart 等) 必须\n * 传入随自身部署 origin 变化的 URL, **不可硬编码单一域名** —— 否则会把其他\n * 部署的桌面用户导向错误域名, 且该域名若未服务此页将 404。SDK 默认不重定向,\n * 由调用方显式 opt-in (确保目标页确实可达)。\n */\n successRedirectURL?: string;\n}\n\n/** 检测 SSL/TLS 相关错误 (企业代理 Zscaler 等) */\nexport function isSSLError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return msg.includes('tls:') || msg.includes('x509:') || msg.includes('certificate');\n}\n\n// =============================================================================\n// authorize (Node-only)\n// =============================================================================\n\nexport interface AuthorizeResult {\n code: string;\n redirectURI: string;\n}\n\n/**\n * 执行 OAuth 2.1 PKCE 授权流程 (Node only):\n * 1. 启动本地 HTTP server\n * 2. 打开浏览器让用户登录并授权\n * 3. 接收回调拿到 authorization code\n * 4. 返回 code 供后续 token 交换\n *\n * 浏览器环境会抛错 (无 loopback HTTP server)。\n * 浏览器侧 (v1.4.0+) 请改用本文件下方的 Web OAuth 原语:\n * createWebAuthorizationRequest + completeWebAuthorizationRequest\n * (SDK 负责 PKCE / state 校验; popup / redirect handler 由调用方实现)\n */\nexport async function authorize(\n meta: ServerMetadata,\n clientID: string,\n scopes: string[],\n opts: LoginOptions & { handler?: (e: LoginEvent) => void; signal?: AbortSignal } = {},\n): Promise<{ result: AuthorizeResult; verifier: string }> {\n if (typeof process === 'undefined' || !process.versions || !process.versions.node) {\n throw new Error('authorize requires Node.js environment (HTTP callback server)');\n }\n const handler = opts.handler;\n const signal = opts.signal;\n const emit = (e: LoginEvent) => {\n if (handler) handler(e);\n };\n\n const verifier = await generateCodeVerifier();\n const challenge = await codeChallenge(verifier);\n // [2026-08-14] 桌面 loopback 也发送并校验 state。\n //\n // 此前桌面流一律不带 state, 理由是\"本地回环天然防 CSRF\"。这个理由并不成立: 回环监听在整个\n // 流程期间对**本机任意进程**开放, 一个本地恶意进程只要往\n // http://127.0.0.1:<port>/callback?code=<攻击者的授权码> 打一枪, SDK 就会拿别人的授权码换\n // token, 把用户会话接到攻击者账号上 (login-CSRF)。端口随机但可枚举。state 让这枪必须先猜中\n // 32 字节随机数。Web 流早就有 state 校验, 这里补齐的是同一道闸。\n const state = await generateState();\n\n const http = await import('node:http');\n\n // 启动本地 callback server\n const server = http.createServer();\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => resolve());\n });\n const addr = server.address() as { port: number };\n const port = addr.port;\n const redirectURI = `http://127.0.0.1:${port}/callback`;\n\n let codeResolver!: (code: string) => void;\n let codeRejecter!: (err: Error) => void;\n const codePromise = new Promise<string>((resolve, reject) => {\n codeResolver = resolve;\n codeRejecter = reject;\n });\n // 回调可能在下面的 Promise.race 挂上处理器**之前**就被拒绝 (例如本地回环立刻收到一个\n // state 不匹配的请求)。先挂一个空 catch, 让 Node 不把它记成 unhandled rejection ——\n // 真正的错误仍由 race 里的同一个 promise 抛给调用方, 语义不变。\n codePromise.catch(() => {});\n\n server.on('request', (req, res) => {\n const url = new URL(req.url ?? '/', `http://127.0.0.1:${port}`);\n if (url.pathname !== '/callback') {\n res.statusCode = 404;\n res.end();\n return;\n }\n // state 校验对 /callback 的**每一种**形态先行 —— 成功回调、OAuth error 回调、畸形回调\n // 一视同仁, 且必须在消费 code / 结算 denied **之前**。否则本机任意进程不猜 state 也能\n // 伪造一发 ?error=access_denied 把等待中的登录打成\"用户已拒绝\" (login-DoS / 状态注入)。\n // \"恰好一个\": 重复 state 参数不允许蒙混 (searchParams.get 只取首值), 缺失与错值同罪。\n // 错误信息只描述形态, 不回显任何回调取值 (不记录 code / state / token / 完整 query)。\n const states = url.searchParams.getAll('state');\n const stateFailure =\n states.length === 0\n ? 'callback missing state'\n : states.length > 1\n ? 'callback carried multiple state values'\n : states[0] !== state\n ? 'callback state does not match pending state'\n : null;\n if (stateFailure !== null) {\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>授权失败</title></head>` +\n `<body style=\"font-family:system-ui,sans-serif;text-align:center;padding:60px 20px\">` +\n `<h2>授权失败</h2><p>回调校验未通过, 已中止登录。</p>` +\n `<p style=\"color:#888;font-size:14px\">可以关闭此窗口。</p>` +\n `</body></html>`,\n );\n codeRejecter(new Error(`authorize: ${ErrStateMismatch}: ${stateFailure} (possible CSRF)`));\n return;\n }\n const code = url.searchParams.get('code');\n if (!code) {\n const errMsg =\n url.searchParams.get('error_description') || url.searchParams.get('error') || '';\n const escaped = htmlEscape(errMsg);\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>授权失败</title></head>` +\n `<body style=\"font-family:system-ui,sans-serif;text-align:center;padding:60px 20px\">` +\n `<h2>授权失败</h2><p>${escaped}</p>` +\n `<p style=\"color:#888;font-size:14px\">可以关闭此窗口。</p>` +\n `</body></html>`,\n );\n codeRejecter(new Error(`authorization denied: ${errMsg}`));\n return;\n }\n // 成功页: 若调用方显式提供了品牌成功页 URL → 302 把浏览器导向业务域名\n // (地址栏显示自家域名而非 127.0.0.1); 否则保留本地成功 HTML (零回归)。\n // 无论哪条分支, 授权码都已在本地捕获 — codeResolver(code) 必须照常调用,\n // token 交换逻辑与安全模型完全不变。\n const successRedirect = resolveSuccessRedirect(opts.successRedirectURL);\n if (successRedirect) {\n res.statusCode = 302;\n res.setHeader('Location', successRedirect);\n res.end();\n } else {\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>授权成功</title></head>` +\n `<body style=\"font-family:system-ui,sans-serif;text-align:center;padding:60px 20px\">` +\n `<h2>授权成功</h2>` +\n `<p>已完成身份认证, 请返回应用继续使用。</p>` +\n `<p style=\"color:#888;font-size:14px\">此窗口将在 3 秒后自动关闭…</p>` +\n `<script>setTimeout(function(){window.close()},3000)</script>` +\n `</body></html>`,\n );\n }\n codeResolver(code);\n });\n\n // 构造授权 URL\n const authURL = new URL(meta.authorization_endpoint);\n authURL.searchParams.set('client_id', clientID);\n authURL.searchParams.set('redirect_uri', redirectURI);\n authURL.searchParams.set('response_type', 'code');\n authURL.searchParams.set('code_challenge', challenge);\n authURL.searchParams.set('code_challenge_method', 'S256');\n authURL.searchParams.set('state', state);\n if (scopes.length > 0) {\n authURL.searchParams.set('scope', scopes.join(' '));\n }\n if (opts.loginHint) authURL.searchParams.set('login_hint', opts.loginHint);\n if (opts.loginMethod) authURL.searchParams.set('login_method', opts.loginMethod);\n if (opts.orgUUID) authURL.searchParams.set('orgUUID', opts.orgUUID);\n\n emit({ type: EventAuthURL, url: authURL.toString() });\n\n if (!opts.skipBrowser) {\n try {\n await openBrowser(authURL.toString());\n } catch (e) {\n // 浏览器打不开不阻塞 — 用户可通过 URL 手动打开\n emit({\n type: EventError,\n err_code: ErrBrowserOpen,\n url: authURL.toString(),\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n\n let abortHandler: (() => void) | undefined;\n try {\n const code = await Promise.race<string>([\n codePromise,\n new Promise<string>((_, reject) => {\n if (signal) {\n if (signal.aborted) {\n reject(new Error('authorization timed out'));\n return;\n }\n abortHandler = () => reject(new Error('authorization timed out'));\n signal.addEventListener('abort', abortHandler);\n }\n }),\n ]);\n return { result: { code, redirectURI }, verifier };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (msg.includes(ErrStateMismatch)) {\n emit({ type: EventError, err_code: ErrStateMismatch, error: msg });\n } else if (msg.includes('denied')) {\n emit({ type: EventError, err_code: ErrAuthDenied, error: msg });\n } else if (msg.includes('timed out')) {\n emit({ type: EventError, err_code: ErrTimeout, error: msg });\n } else {\n emit({ type: EventError, err_code: ErrTokenExchange, error: msg });\n }\n throw e;\n } finally {\n if (abortHandler && signal) signal.removeEventListener('abort', abortHandler);\n // close() 只停止接受新连接; Node 18 上浏览器残留的 idle keep-alive 连接会让端口\n // 迟迟不真正释放 (Node 19+ 才随 close 一并关 idle)。登录已结算, 显式关掉 idle 连接,\n // 让每条终止路径都以\"端口完全关闭\"收尾。响应都在结算前已 end(), 不存在截断风险。\n server.close();\n server.closeIdleConnections?.();\n }\n}\n\nfunction htmlEscape(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * 校验调用方提供的桌面授权成功页重定向 URL。\n *\n * 仅接受 `http(s)` 绝对 URL —— 拒绝 `javascript:` / `data:` 等其他协议, 防止\n * 把本地回环成功页变成开放重定向到任意协议的跳板 (纵深防御; 即便取值来自\n * 调用方静态配置)。缺失或非法时返回 `null`, 调用方据此回退本地成功 HTML。\n */\nfunction resolveSuccessRedirect(raw?: string): string | null {\n if (!raw) return null;\n try {\n const u = new URL(raw);\n if (u.protocol !== 'http:' && u.protocol !== 'https:') return null;\n return u.toString();\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Web OAuth (浏览器整页重定向流程)\n// =============================================================================\n\n/**\n * Web OAuth 授权请求 — `createWebAuthorizationRequest` 的返回结构。\n *\n * 发起方 (csign Next Route Handler 等) 应把整个对象作为 pending 状态持久化\n * (HttpOnly cookie 等),callback 回来时取出供 `completeWebAuthorizationRequest` 校验。\n */\nexport interface WebAuthorizationRequest {\n /** 完整授权 URL — 浏览器整页跳转到此地址 */\n authUrl: string;\n /** CSRF state — callback 必须回传同值 */\n state: string;\n /** PKCE code_verifier — 换 token 时使用, 切勿泄露给浏览器 URL */\n verifier: string;\n /** 动态注册得到的 client_id */\n clientID: string;\n /** 本次授权使用的 redirect_uri */\n redirectURI: string;\n /** OAuth issuer / SDK 业务域名 (用于 callback 阶段重新发现 metadata) */\n serverURL: string;\n /** 创建时间戳 (Date.now()),发起方可据此实现 TTL 过期判定 */\n createdAt: number;\n}\n\n/** `createWebAuthorizationRequest` 参数 */\nexport interface CreateWebAuthorizationRequestOptions {\n /** 动态注册得到的 client_id */\n clientID: string;\n /** redirect_uri (须与动态注册登记的一致) */\n redirectURI: string;\n /** 请求的 scope 列表 — 以空格连接写入 authUrl */\n scopes: string[];\n /** OAuth issuer / SDK 业务域名 */\n serverURL: string;\n /** 可选 — SSO 场景下预填邮箱 */\n loginHint?: string;\n}\n\n/**\n * 构造 Web OAuth 授权请求。\n *\n * 生成 PKCE verifier + S256 challenge + CSRF state,按 OAuth 2.1 拼装授权 URL。\n * (自 2026-08-14 起桌面 `authorize` 同样带 state 并在回调时校验; Web 流程本就必须带。)\n *\n * 返回的 `WebAuthorizationRequest` 应整体持久化为 pending 状态,\n * callback 阶段交给 `completeWebAuthorizationRequest`。\n */\nexport async function createWebAuthorizationRequest(\n meta: ServerMetadata,\n opts: CreateWebAuthorizationRequestOptions,\n): Promise<WebAuthorizationRequest> {\n const verifier = await generateCodeVerifier();\n const challenge = await codeChallenge(verifier);\n const state = await generateState();\n\n const authURL = new URL(meta.authorization_endpoint);\n authURL.searchParams.set('response_type', 'code');\n authURL.searchParams.set('client_id', opts.clientID);\n authURL.searchParams.set('redirect_uri', opts.redirectURI);\n authURL.searchParams.set('code_challenge', challenge);\n authURL.searchParams.set('code_challenge_method', 'S256');\n authURL.searchParams.set('state', state);\n authURL.searchParams.set('scope', opts.scopes.join(' '));\n if (opts.loginHint) {\n authURL.searchParams.set('login_hint', opts.loginHint);\n }\n\n return {\n authUrl: authURL.toString(),\n state,\n verifier,\n clientID: opts.clientID,\n redirectURI: opts.redirectURI,\n serverURL: opts.serverURL,\n createdAt: Date.now(),\n };\n}\n\n/** `completeWebAuthorizationRequest` 的 pending 状态 (即 WebAuthorizationRequest 的子集) */\nexport interface WebAuthorizationPending {\n state: string;\n verifier: string;\n clientID: string;\n redirectURI: string;\n serverURL: string;\n}\n\n/** `completeWebAuthorizationRequest` 的 callback 参数 */\nexport interface WebAuthorizationCallbackParams {\n /** 授权服务器回传的 authorization code */\n code: string;\n /** 授权服务器回传的 state — 必须与 pending.state 一致 */\n state: string;\n}\n\n/**\n * 完成 Web OAuth 授权 — 校验 state → 换 token → 返回可持久化的 TokenSet。\n *\n * `pending` 为 `createWebAuthorizationRequest` 返回对象 (或其等价持久化结构);\n * `params` 为 callback URL 解析出的 `code` / `state`。\n *\n * state 不匹配时抛错 (CSRF 防护)。内部依次:\n * discoverWebOAuthMetadata(pending.serverURL) → exchangeCode(...) → newTokenSet(...)。\n */\nexport async function completeWebAuthorizationRequest(\n pending: WebAuthorizationPending,\n params: WebAuthorizationCallbackParams,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenSet> {\n if (!params.code) {\n throw new Error('completeWebAuthorizationRequest: missing authorization code');\n }\n if (params.state !== pending.state) {\n throw new Error(\n `completeWebAuthorizationRequest: ${ErrStateMismatch}: callback state does not match pending state (possible CSRF)`,\n );\n }\n\n const meta = await discoverWebOAuthMetadata(pending.serverURL, signal, fetchImpl);\n const resp = await exchangeCode(\n meta,\n pending.clientID,\n params.code,\n pending.redirectURI,\n pending.verifier,\n signal,\n fetchImpl,\n );\n return newTokenSet(resp, pending.clientID, pending.serverURL);\n}\n\n// =============================================================================\n// Token Exchange\n// =============================================================================\n\nexport async function exchangeCode(\n meta: ServerMetadata,\n clientID: string,\n code: string,\n redirectURI: string,\n codeVerifier: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const data = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: clientID,\n code,\n redirect_uri: redirectURI,\n code_verifier: codeVerifier,\n });\n return postToken(meta.token_endpoint, data, signal, fetchImpl);\n}\n\n/** 与 exchangeCode 相同, 但附带 expires_in 参数 (setup-token 模式) */\nexport async function exchangeCodeWithExpiry(\n meta: ServerMetadata,\n clientID: string,\n code: string,\n redirectURI: string,\n codeVerifier: string,\n expiresIn: number,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const data = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: clientID,\n code,\n redirect_uri: redirectURI,\n code_verifier: codeVerifier,\n expires_in: String(expiresIn),\n });\n return postToken(meta.token_endpoint, data, signal, fetchImpl);\n}\n\n/** 刷新 access_token */\nexport async function refreshToken(\n meta: ServerMetadata,\n clientID: string,\n refreshTokenValue: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const data = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: clientID,\n refresh_token: refreshTokenValue,\n });\n return postToken(meta.token_endpoint, data, signal, fetchImpl);\n}\n\n/** 吊销 token. 服务端不支持吊销时静默跳过. */\nexport async function revokeToken(\n meta: ServerMetadata,\n token: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<void> {\n if (!meta.revocation_endpoint || meta.revocation_endpoint === '') {\n return;\n }\n const data = new URLSearchParams({ token });\n\n const ctl = withTimeout(authTimeoutMs, signal);\n try {\n await fetchImpl(meta.revocation_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: data,\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`revoke: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n}\n\nasync function postToken(\n endpoint: string,\n data: URLSearchParams,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const ctl = withTimeout(authTimeoutMs, signal);\n try {\n let resp: Response;\n try {\n resp = await fetchImpl(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: data,\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`token request: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n if (!resp.ok) {\n let errBody: { error?: unknown; error_description?: unknown } = {};\n try {\n errBody = (await resp.json()) as { error?: unknown; error_description?: unknown };\n } catch {\n // ignore\n }\n const oauthError = typeof errBody.error === 'string' ? errBody.error : '';\n const errorDescription =\n typeof errBody.error_description === 'string' ? errBody.error_description : '';\n throw new OAuthTokenEndpointError(resp.status, oauthError, errorDescription);\n }\n\n try {\n return (await resp.json()) as TokenResponse;\n } catch (e) {\n throw new Error(`token: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n } finally { ctl.dispose(); }\n}\n\n/**\n * 从 TokenResponse 构造可持久化的 TokenSet\n *\n * 根因修复 #14: expires_in=0 会导致 token 立即过期 → 无限刷新循环\n * 最少保证 60 秒有效期\n */\nexport function newTokenSet(resp: TokenResponse, clientID: string, serverURL: string): TokenSet {\n let expiresIn = resp.expires_in;\n if (expiresIn < 60) expiresIn = 60;\n return {\n access_token: resp.access_token,\n refresh_token: resp.refresh_token ?? '',\n expires_at: new Date(Date.now() + expiresIn * 1000).toISOString(),\n scope: resp.scope ?? '',\n client_id: clientID,\n server_url: serverURL,\n };\n}\n\n// =============================================================================\n// Browser launch (Node-only)\n// =============================================================================\n\nasync function openBrowser(url: string): Promise<void> {\n const { spawn } = await import('node:child_process');\n let cmd: string;\n let args: string[];\n switch (process.platform) {\n case 'darwin':\n cmd = 'open';\n args = [url];\n break;\n case 'linux':\n cmd = 'xdg-open';\n args = [url];\n break;\n case 'win32':\n cmd = 'rundll32';\n args = ['url.dll,FileProtocolHandler', url];\n break;\n default:\n throw new Error(`unsupported platform: ${process.platform}`);\n }\n return new Promise<void>((resolve, reject) => {\n try {\n const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });\n child.on('error', reject);\n child.unref();\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\ninterface TimeoutController {\n signal: AbortSignal;\n dispose: () => void;\n}\n\n/** 创建一个组合 abort signal: 超时 + 外部 signal 任一触发都 abort */\nfunction withTimeout(ms: number, parent?: AbortSignal): TimeoutController {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), ms);\n let parentHandler: (() => void) | undefined;\n if (parent) {\n if (parent.aborted) {\n ctl.abort();\n } else {\n parentHandler = () => ctl.abort();\n parent.addEventListener('abort', parentHandler);\n }\n }\n return {\n signal: ctl.signal,\n dispose() {\n clearTimeout(timer);\n if (parentHandler && parent) parent.removeEventListener('abort', parentHandler);\n },\n };\n}\n","// store.ts — 端口自 acosmi-sdk-go/store.go (跨端扩展)\n//\n// Go 侧仅 FileTokenStore (Node 风格 ~/.acosmi/tokens.json)。\n// TS 端口扩展为多端: Node File / Browser localStorage / 内存 (兜底).\n//\n// 接口异步化: Go 同步 IO, TS 必须 async。所有 Save/Load/Clear 返回 Promise。\n\nimport type { TokenSet } from '../auth/types';\nimport { isValidTokenSet } from '../auth/types';\n\nexport type CredentialState =\n | 'signed_out'\n | 'pending_identity'\n | 'ready'\n | 'refresh_reserved'\n | 'refresh_dispatched'\n | 'reauth_required'\n | 'configuration_error';\n\nexport type CredentialReason =\n | 'invalid_grant'\n | 'refresh_outcome_unknown'\n | 'migration_required'\n | 'identity_unavailable'\n | 'invalid_client'\n | 'invalid_scope'\n | 'unsupported_grant_type'\n | 'auth_contract_unsupported';\n\nexport interface CredentialAuthorityConfig {\n serverURL: string;\n issuer: string;\n oauthProfile: 'desktop';\n authContractVersion: 2;\n errorContractVersion: 1;\n}\n\nexport interface CredentialPrincipal {\n issuer: string;\n subject: string;\n organizationId: string | null;\n}\n\nexport interface CredentialRefreshOperation {\n operationId: string;\n sessionId: string;\n baseRevision: string;\n phase: 'reserved' | 'dispatched';\n returnState: 'ready' | 'pending_identity';\n startedAt: string;\n dispatchedAt: string | null;\n deadlineAt: string | null;\n}\n\nexport interface CredentialLoginAttempt {\n attemptId: string;\n baseSessionId: string | null;\n startedAt: string;\n}\n\nexport interface VerifiedCredentialIdentity {\n authSessionId: string;\n principal: CredentialPrincipal;\n displayName?: string;\n avatarUrl?: string;\n email?: string;\n imageUrl?: string;\n accountCreatedAt?: string;\n requiresPhoneBinding?: boolean;\n hasExtraUsageEnabled?: boolean;\n billingType?: string;\n subscriptionCreatedAt?: string;\n rateLimitTier?: string;\n organizationName?: string;\n verifiedAt: string;\n}\n\nexport interface CredentialMutationReceipt {\n mutationId: string;\n operationId: string | null;\n resultRevision: string;\n}\n\n/** Durable authoritative snapshot. Revisions are decimal strings to avoid JS truncation. */\nexport interface CredentialSnapshot {\n storeInstanceId: string;\n authorityConfig: CredentialAuthorityConfig | null;\n revision: string;\n authSessionId: string | null;\n principal: CredentialPrincipal | null;\n credentialState: CredentialState;\n tokenSet: TokenSet | null;\n refreshOperation: CredentialRefreshOperation | null;\n loginAttempt: CredentialLoginAttempt | null;\n reason: CredentialReason | null;\n lastMutation: CredentialMutationReceipt | null;\n lastLoginAttemptId: string | null;\n verifiedIdentity: VerifiedCredentialIdentity | null;\n}\n\nexport type CredentialRequestOwner = Pick<\n CredentialSnapshot,\n 'storeInstanceId' | 'authSessionId' | 'principal'\n>;\n\nexport interface CredentialCASExpected {\n storeInstanceId: string;\n revision: string;\n authSessionId: string | null;\n state: CredentialState;\n operationId: string | null;\n}\n\nexport type CredentialCASResult =\n | { status: 'committed'; snapshot: CredentialSnapshot }\n | { status: 'superseded'; snapshot: CredentialSnapshot }\n | { status: 'storage_error'; error: unknown };\n\n/** Explicit opt-in store; versioned mode never calls TokenStore.save/load/clear. */\nexport interface VersionedCredentialStore {\n readSnapshot(signal?: AbortSignal): Promise<CredentialSnapshot>;\n compareAndSwap(\n expected: CredentialCASExpected,\n nextState: CredentialSnapshot,\n mutationId: string,\n signal?: AbortSignal,\n ): Promise<CredentialCASResult>;\n}\n\n/**\n * Token 持久化接口\n * 桌面智能体可自行实现 (如 macOS Keychain / Windows Credential Manager)\n *\n * 跨端约定:\n * - Save: 写入持久化, 失败抛 Error\n * - Load: 读取, 不存在返回 null (与 Go IsNotExist 行为一致)\n * - Clear: 删除, 不存在不抛错 (Logout 后 Clear 不应报错, [RC-11])\n * - withLock (v1.0.2 新增, 可选): 跨进程临界区. Client 在 refresh token rotation\n * 场景下用此包裹 \"load → check → refresh → save\" 整段, 防多进程共享同一 store\n * (典型: FileTokenStore 默认 ~/.acosmi/tokens.json) 撞 HTTP 400 refresh token\n * not found. 不实现时 Client 自动回退到仅进程内串行 (LocalStorage / InMemory\n * 单进程语义无需此方法).\n */\nexport interface TokenStore {\n save(tokens: TokenSet): Promise<void>;\n load(): Promise<TokenSet | null>;\n clear(): Promise<void>;\n withLock?<T>(fn: () => Promise<T>): Promise<T>;\n}\n\n// ============================================================================\n// FileTokenStore — Node 文件实现\n// ============================================================================\n\n/**\n * 基于文件的 token 存储 (开发/测试用)\n * 生产环境建议替换为系统钥匙串实现\n *\n * 默认路径: ~/.acosmi/tokens.json\n *\n * 浏览器环境调用 new FileTokenStore() 会抛错 — 浏览器请用 LocalStorageTokenStore 或 InMemoryTokenStore.\n */\n/** 跨进程文件锁配置 (v1.0.2). 公开常量是为了让 caller / 测试可观察, 不建议生产代码改. */\nexport const fileLockDefaults = {\n /** 获取锁的超时上限 (毫秒). refresh 流程含网络 < 30s, 30s 已远超正常完成时间. */\n acquireTimeoutMs: 30_000,\n /** 旧锁判定阈值 (毫秒). 锁文件 mtime 早于此值视为 stale 进程崩溃残留, 自动 break. */\n staleMs: 60_000,\n /** 重试间隔基数 (毫秒). 真实间隔 = base + random(0, jitter). */\n retryBaseMs: 30,\n retryJitterMs: 70,\n} as const;\n\nexport class FileTokenStore implements TokenStore {\n private path: string;\n /** 进程内串行化 (Promise chain) — 与跨进程 flock 配合, 避免单进程内并发持锁产生死锁式互等. */\n private chain: Promise<void> = Promise.resolve();\n\n constructor(path?: string) {\n if (typeof process === 'undefined' || !process.versions || !process.versions.node) {\n throw new Error('FileTokenStore requires Node.js environment; use LocalStorageTokenStore or InMemoryTokenStore in browser');\n }\n if (path && path !== '') {\n this.path = path;\n } else {\n // 延迟初始化 — constructor 不能 async, 用 lazy resolve\n this.path = '';\n }\n }\n\n private async resolvePath(): Promise<string> {\n if (this.path && this.path !== '') return this.path;\n const os = await import('node:os');\n const path = await import('node:path');\n this.path = path.join(os.homedir(), '.acosmi', 'tokens.json');\n return this.path;\n }\n\n /** 进程内串行 (维持 v1.0.1 单进程语义). flock 之外另一层防御: 如果用户自己就是单进程\n * 并发场景, 不必每次都进 flock 旁路文件 IO. */\n private withChain<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.chain.then(fn, fn);\n this.chain = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n /**\n * 跨进程临界区. 用 sidecar `<path>.lock` 文件 + O_EXCL 创建语义实现互斥:\n * - 创建成功 = 持有锁; 写入 pid+timestamp 便于诊断\n * - 创建失败 (EEXIST) = 别的进程持锁, backoff 重试\n * - 锁文件 mtime > staleMs = 进程崩溃残留, unlink 后重试\n * - acquireTimeoutMs 超时 = 抛错 (caller 应作为 transient error 处理, 上层 retry)\n *\n * 注意: O_EXCL 在 NFS 上不保证原子; FileTokenStore 适用于本地文件系统 (典型用户家目录).\n * 真要跨机共享 token, 应实现自定义 Keychain / 数据库 store, 不要用 FileTokenStore.\n */\n async withLock<T>(fn: () => Promise<T>): Promise<T> {\n // 注意: 不能用 withChain 包裹 — fn 内部调 save/load 也走 withChain 会死锁 (re-entrant\n // 不支持). 跨进程互斥已由 sidecar .lock 文件保证; 同一 Client 内并发由上层 withMu 串行;\n // 同一进程不同 Client 实例并发是预期场景, 走 flock 重试路径.\n const fs = await import('node:fs/promises');\n const pathMod = await import('node:path');\n const p = await this.resolvePath();\n const lockPath = `${p}.lock`;\n const dir = pathMod.dirname(p);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n\n const startMs = Date.now();\n let release: (() => Promise<void>) | null = null;\n while (true) {\n try {\n // 'wx' = O_CREAT | O_EXCL | O_WRONLY → 已存在抛 EEXIST\n const fh = await fs.open(lockPath, 'wx', 0o600);\n try {\n await fh.writeFile(`${process.pid}\\n${Date.now()}\\n`, 'utf8');\n } finally {\n await fh.close();\n }\n release = async () => {\n try {\n await fs.unlink(lockPath);\n } catch {\n // best-effort — 释放期间被 stale-break 删除是允许的\n }\n };\n break;\n } catch (e) {\n if (!isAlreadyExistsError(e)) throw e;\n // 锁被别的进程持有 — stale 检测\n let stale = false;\n try {\n const st = await fs.stat(lockPath);\n if (Date.now() - st.mtimeMs > fileLockDefaults.staleMs) stale = true;\n } catch {\n // 锁文件刚刚消失 → 立即重试 acquire\n continue;\n }\n if (stale) {\n try {\n await fs.unlink(lockPath);\n } catch {\n // 别人先删了, 没关系\n }\n continue;\n }\n if (Date.now() - startMs > fileLockDefaults.acquireTimeoutMs) {\n throw new Error(\n `acquire token file lock timeout (${fileLockDefaults.acquireTimeoutMs}ms): ${lockPath}`,\n );\n }\n const waitMs =\n fileLockDefaults.retryBaseMs + Math.random() * fileLockDefaults.retryJitterMs;\n await new Promise((r) => setTimeout(r, waitMs));\n }\n }\n try {\n return await fn();\n } finally {\n if (release) await release();\n }\n }\n\n /**\n * 写入 token. 流程:\n * 1. mkdir -p (默认路径目录)\n * 2. 写入 `<path>.tmp.<pid>`\n * 3. fsync 后 rename 到正式路径 (POSIX 上 rename(2) 同分区原子, Windows 上 ReplaceFile)\n *\n * 选择 atomic rename 而非直接 writeFile: 多进程并发或本进程崩溃时, 读端永远看到的是\n * 完整的旧/新 JSON, 不会读到截断半文件 (Client.create.store.load 可能在另一进程\n * 写入中间触发, atomic rename 避免它解析失败).\n */\n save(tokens: TokenSet): Promise<void> {\n return this.withChain(async () => {\n const fs = await import('node:fs/promises');\n const pathMod = await import('node:path');\n const p = await this.resolvePath();\n const dir = pathMod.dirname(p);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n const tmp = `${p}.tmp.${process.pid}.${Date.now()}.${Math.floor(Math.random() * 1e6)}`;\n const data = JSON.stringify(tokens, null, 2);\n\n // 1) 写 tmp + fsync 文件: 内容真正落盘 (writeFile 仅写入 page cache, 进程/机器\n // 崩溃时 rename 后可能得到 0 字节或旧内容). 注释承诺 \"fsync 后 rename\", 这里兑现。\n {\n const fh = await fs.open(tmp, 'w', 0o600);\n try {\n await fh.writeFile(data, { encoding: 'utf8' });\n await fh.sync(); // fsync — 文件内容 durable\n } finally {\n await fh.close();\n }\n }\n\n try {\n await fs.rename(tmp, p);\n } catch (e) {\n // rename 失败 — 清理 tmp 防泄漏\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore\n }\n throw e;\n }\n\n // 2) 对目录 fsync: 让 rename 产生的目录项 (新文件名 → inode 的绑定) durable,\n // 否则崩溃后目录项可能丢失。跨平台: Windows / 部分 FS 上对目录 open/fsync 会抛\n // (EISDIR/EPERM/ENOTSUP), 这是平台不支持目录 fsync, 不应让 save 失败 —— 文件内容\n // 已 fsync, 目录项 durability 退化为依赖 OS, 与原 atomic rename 语义一致。\n try {\n const dirHandle = await fs.open(dir, 'r');\n try {\n await dirHandle.sync();\n } finally {\n await dirHandle.close();\n }\n } catch {\n // 平台不支持对目录 fsync — 吞掉, 不影响 save 成功。\n }\n });\n }\n\n load(): Promise<TokenSet | null> {\n return this.withChain(async () => {\n const fs = await import('node:fs/promises');\n const p = await this.resolvePath();\n try {\n const data = await fs.readFile(p, 'utf8');\n // 损坏 / 截断 JSON / 缺字段 / 旧版本残留 → 视为无有效 token (返回 null),\n // 不抛错: caller (Client.create) 会据此重新走 Login, 而不是整个初始化失败。\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (!isValidTokenSet(parsed)) return null;\n return parsed;\n } catch (e) {\n if (isNotExistError(e)) return null;\n throw new Error(\n `read token file: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n });\n }\n\n clear(): Promise<void> {\n return this.withChain(async () => {\n const fs = await import('node:fs/promises');\n const p = await this.resolvePath();\n try {\n await fs.unlink(p);\n } catch (e) {\n if (isNotExistError(e)) return;\n throw e;\n }\n });\n }\n}\n\nfunction isNotExistError(e: unknown): boolean {\n if (typeof e === 'object' && e !== null && 'code' in e) {\n return (e as { code: unknown }).code === 'ENOENT';\n }\n return false;\n}\n\nfunction isAlreadyExistsError(e: unknown): boolean {\n if (typeof e === 'object' && e !== null && 'code' in e) {\n return (e as { code: unknown }).code === 'EEXIST';\n }\n return false;\n}\n\n/**\n * 创建文件 token 存储 (与 Go NewFileTokenStore 等价)\n * @param path 自定义路径; 空则使用默认 ~/.acosmi/tokens.json\n */\nexport function newFileTokenStore(path?: string): FileTokenStore {\n return new FileTokenStore(path);\n}\n\n// ============================================================================\n// LocalStorageTokenStore — Browser 实现\n// ============================================================================\n\n/**\n * 基于 LocalStorage 的 token 存储 (浏览器)\n *\n * 仅在浏览器环境可用 (检测 globalThis.localStorage)。\n * 不持久化跨设备同步, 适合单机 SPA 使用。\n */\nexport class LocalStorageTokenStore implements TokenStore {\n private key: string;\n\n constructor(key = 'acosmi.tokens') {\n if (typeof globalThis.localStorage === 'undefined') {\n throw new Error('LocalStorageTokenStore requires browser environment');\n }\n this.key = key;\n }\n\n async save(tokens: TokenSet): Promise<void> {\n globalThis.localStorage.setItem(this.key, JSON.stringify(tokens));\n }\n\n async load(): Promise<TokenSet | null> {\n const data = globalThis.localStorage.getItem(this.key);\n if (data == null || data === '') return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n // 与 FileTokenStore 一致: 缺字段 / 类型错 / 旧版本残留 → 当作无 token。\n if (!isValidTokenSet(parsed)) return null;\n return parsed;\n }\n\n async clear(): Promise<void> {\n globalThis.localStorage.removeItem(this.key);\n }\n}\n\n// ============================================================================\n// InMemoryTokenStore — 兜底实现 (不持久化)\n// ============================================================================\n\n/**\n * 内存 token 存储 (不持久化, 进程重启即丢失)\n * 适合: 测试 / Deno script / 短期 SDK 调用 / 不希望落盘的安全场景\n */\nexport class InMemoryTokenStore implements TokenStore {\n private tokens: TokenSet | null = null;\n\n async save(tokens: TokenSet): Promise<void> {\n this.tokens = tokens;\n }\n\n async load(): Promise<TokenSet | null> {\n return this.tokens;\n }\n\n async clear(): Promise<void> {\n this.tokens = null;\n }\n}\n","// retry.ts — 端口自 acosmi-sdk-go/retry.go\n// L6 (2026-04-27, v0.15): SDK 内置 retry policy\n//\n// 设计目标:\n// 1. GET 类查询 (skill-store/models/balance) 默认 2x retry, 稳定性提升\n// 2. POST 类业务 (chat/messages/upload) 默认 0 retry — 计费安全红线 (双扣保护)\n// 3. Stream 路径强制 maxAttempts=1 — 流式 SSE 已部分写出, 重试 = 双 token 重复消息\n// 4. 401 refresh 与 retry 互斥 — refresh 是 inner loop, 不算 attempt\n// 5. AbortSignal aborted 立即返回 — 用户 abort 不重试\n// 6. StreamError 显式排除 — V2 P0 SSE 中段错误不可重试\n//\n// 与类型化错误协作:\n// - HTTPError 5xx/429 → 默认可重试\n// - NetworkError isTimeout()/isEOF() → 默认可重试\n// - 其他 → 不重试\n\nimport { HTTPError, NetworkError, StreamError } from '../shared/errors';\n\n/** 表示一次 retry 评估的请求快照 — 仅供 SafeToRetry 闸门使用 */\nexport interface RetryRequestInfo {\n method: string;\n url: string;\n}\n\n/**\n * 配置 SDK 重试行为.\n *\n * undefined 字段使用 DefaultRetryPolicy 对应字段; null/undefined RetryPolicy 自身禁用重试.\n */\nexport interface RetryPolicy {\n /** 总尝试次数 (含首次). 1 = 不重试; 默认 2. */\n maxAttempts?: number;\n /** 首次重试退避时长 (毫秒). 默认 200. */\n backoffMs?: number;\n /** 退避最大值 (指数增长封顶, 毫秒). 默认 2000. */\n backoffMaxMs?: number;\n /** 指数倍数. 默认 2.0. */\n backoffMul?: number;\n\n /**\n * 错误层闸门: 是否值得重试.\n * 默认 defaultRetryable: HTTPError 5xx/429, NetworkError Timeout/EOF, 排除 StreamError.\n */\n onRetryable?: (err: unknown) => boolean;\n\n /**\n * 请求层闸门 (计费安全核心): 当前请求是否值得重试.\n * 默认 defaultSafeToRetry: GET/HEAD/OPTIONS true, 其他 false.\n * chat/messages/upload POST → 默认 false 兜底, 双扣绝不发生.\n */\n safeToRetry?: (req: RetryRequestInfo) => boolean;\n}\n\n/**\n * 安全默认值.\n *\n * 计费安全红线: safeToRetry 默认 POST=false → chat/messages 用户 0 行为变化.\n * GET 类查询 (skill-store/models/balance) 自动得 2x 稳定性.\n */\nexport const DefaultRetryPolicy: Required<Omit<RetryPolicy, never>> = {\n maxAttempts: 2,\n backoffMs: 200,\n backoffMaxMs: 2000,\n backoffMul: 2.0,\n onRetryable: defaultRetryable,\n safeToRetry: defaultSafeToRetry,\n};\n\n/**\n * 计费安全闸门.\n *\n * 仅以下 method 视为幂等:\n * - GET / HEAD / OPTIONS: 天然幂等\n *\n * POST/PUT/DELETE/PATCH 默认 false (双扣保护). 调用方需要 GET 类 POST 重试可自定义 safeToRetry.\n */\nexport function defaultSafeToRetry(req: RetryRequestInfo): boolean {\n switch (req.method.toUpperCase()) {\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n return true;\n }\n return false;\n}\n\n/**\n * 错误层闸门.\n *\n * 显式排除 (优先级最高):\n * - StreamError: V2 P0 SSE 中段错误, 流已部分写出, 重试 = 双 token + 重复消息\n * - AbortSignal aborted: 用户主动 abort, 重试无意义 (TS 中由调用方在 onRetryable 之前检查)\n *\n * 视为可重试:\n * - HTTPError 5xx 或 429\n * - NetworkError isTimeout() 或 isEOF()\n *\n * 其他 (如 4xx 业务错误 / DNS 失败 / BusinessError): 不重试\n */\nexport function defaultRetryable(err: unknown): boolean {\n if (err == null) return false;\n if (err instanceof StreamError) return false;\n if (err instanceof HTTPError) {\n return err.statusCode >= 500 || err.statusCode === 429;\n }\n if (err instanceof NetworkError) {\n return err.isTimeout() || err.isEOF();\n }\n return false;\n}\n\n/** 实际生效策略 (undefined → DefaultRetryPolicy 兜底; 字段缺失填默认值) */\nexport function effectivePolicy(p: RetryPolicy | null | undefined): Required<RetryPolicy> | null {\n if (p == null) return null; // 显式禁用\n const out: Required<RetryPolicy> = {\n maxAttempts: p.maxAttempts && p.maxAttempts > 0 ? p.maxAttempts : DefaultRetryPolicy.maxAttempts,\n backoffMs: p.backoffMs && p.backoffMs > 0 ? p.backoffMs : DefaultRetryPolicy.backoffMs,\n backoffMaxMs:\n p.backoffMaxMs && p.backoffMaxMs > 0 ? p.backoffMaxMs : DefaultRetryPolicy.backoffMaxMs,\n backoffMul: p.backoffMul && p.backoffMul > 0 ? p.backoffMul : DefaultRetryPolicy.backoffMul,\n onRetryable: p.onRetryable ?? defaultRetryable,\n safeToRetry: p.safeToRetry ?? defaultSafeToRetry,\n };\n return out;\n}\n\n/** Retry-After 头的硬上限 — 防止恶意服务器返回 Retry-After: 999999 卡死 */\nconst retryAfterUpperBoundMs = 60_000;\n\n/**\n * 计算第 attempt 次重试的退避时长 (毫秒, attempt 从 0 起).\n * 优先级: HTTPError.retryAfter (上限 60s) > 指数退避 (backoffMs * backoffMul^attempt, 封顶 backoffMaxMs)\n */\nexport function computeBackoff(p: Required<RetryPolicy>, attempt: number, err: unknown): number {\n if (err instanceof HTTPError && err.retryAfter > 0) {\n const ms = err.retryAfter * 1000;\n return Math.min(ms, retryAfterUpperBoundMs);\n }\n let d = p.backoffMs;\n for (let i = 0; i < attempt; i++) {\n d = d * p.backoffMul;\n if (d > p.backoffMaxMs) return p.backoffMaxMs;\n }\n return d;\n}\n","// stream-meta.ts — 端口自 acosmi-sdk-go/stream_meta.go\n//\n// Anthropic SSE 事件的 content block 元数据解析。\n// 把 content_block_start 中的 index / type / acosmi_ephemeral 记入 blockTypeMap,\n// 供 delta/stop 查表回填 StreamEvent 的 blockIndex / blockType / ephemeral 三字段。\n//\n// 设计要点:\n// - in-band 标记: ephemeral 随 content_block_start 的 JSON payload 到达,\n// 无需独立 SSE 事件, 零额外缓冲, 零顺序依赖, 零延迟。\n// - 惰性解析: 只对 3 种 content_block_* 事件解 JSON, 其他事件跳过。\n// - 单流 map: 由单 async iterator 拥有 (SSE 扫描循环), 无锁。stop 后删表项, 防长流累积。\n\n/** SDK 为单个 content block 缓存的元数据 */\nexport interface BlockMeta {\n type: string;\n ephemeral: boolean;\n}\n\n/**\n * 按 Anthropic SSE 事件类型解析 data, 更新 blockTypeMap, 返回 [index, type, ephemeral]。\n *\n * 仅当事件为 content_block_start / content_block_delta / content_block_stop\n * 时返回非空 type; 其他事件返回空 type, 调用方据此判别是否填充 StreamEvent 元数据字段。\n */\nexport function extractAnthropicBlockMeta(\n eventType: string,\n data: string,\n blockTypeMap: Map<number, BlockMeta>,\n): [number, string, boolean] {\n switch (eventType) {\n case 'content_block_start': {\n let payload: { index?: number; content_block?: { type?: string; acosmi_ephemeral?: boolean } };\n try {\n payload = JSON.parse(data);\n } catch {\n return [0, '', false];\n }\n const index = payload.index ?? 0;\n const meta: BlockMeta = {\n type: payload.content_block?.type ?? '',\n ephemeral: payload.content_block?.acosmi_ephemeral ?? false,\n };\n blockTypeMap.set(index, meta);\n return [index, meta.type, meta.ephemeral];\n }\n case 'content_block_delta': {\n let payload: { index?: number };\n try {\n payload = JSON.parse(data);\n } catch {\n return [0, '', false];\n }\n const index = payload.index ?? 0;\n const meta = blockTypeMap.get(index);\n return [index, meta?.type ?? '', meta?.ephemeral ?? false];\n }\n case 'content_block_stop': {\n let payload: { index?: number };\n try {\n payload = JSON.parse(data);\n } catch {\n return [0, '', false];\n }\n const index = payload.index ?? 0;\n const meta = blockTypeMap.get(index);\n blockTypeMap.delete(index);\n return [index, meta?.type ?? '', meta?.ephemeral ?? false];\n }\n default:\n return [0, '', false];\n }\n}\n","// enduser.ts — v1.6.0 业务侧终端用户 id (endUserId) 公共工具\n//\n// 网关 sanitizer 仍会做权限校验 + 派生兜底; 此处仅负责 SDK 侧的基本约束:\n// - 正则: [a-zA-Z0-9_-]+ (与上游官方文档一致, 不含 \":\" / \".\" 等隐式破坏字符)\n// - 长度: ≤ 512\n// - 禁止隐私信息: SDK 无从机械判定, 仅在 README / guide 提示, 不在代码做拦截\n//\n// 该 helper 暴露 validateEndUserId 公开 API, 方便 caller 在赋值前自校验,\n// 避免请求被网关 sanitizer 静默丢弃。\n\n/** maxEndUserIdLength 与上游 DeepSeek 官方文档对齐。 */\nexport const maxEndUserIdLength = 512;\n\n/**\n * 检查 endUserId 是否符合规范 (字符集 + 长度)。\n * 空串视为合法 (表示未设置), 返回 null。\n *\n * 网关侧 sanitizer 在收到非空但校验失败的值时会 drop 并 metric, 不阻塞请求;\n * 但 caller 在自有业务侧拿到来源 (如 DB 内部 id) 后, 推荐先调用本函数明确语义。\n *\n * @returns 错误信息字符串, 或 null 表示合法\n */\nexport function validateEndUserId(s: string | undefined | null): string | null {\n if (!s) return null;\n if (s.length > maxEndUserIdLength) {\n return `endUserId length ${s.length} > ${maxEndUserIdLength}`;\n }\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n const ok =\n (c >= 0x61 && c <= 0x7a) || // a-z\n (c >= 0x41 && c <= 0x5a) || // A-Z\n (c >= 0x30 && c <= 0x39) || // 0-9\n c === 0x5f || // _\n c === 0x2d; // -\n if (!ok) {\n return `endUserId contains invalid char code 0x${c.toString(16)} at offset ${i} (allowed: [a-zA-Z0-9_-])`;\n }\n }\n return null;\n}\n\n/**\n * 识别 SSE 协议中的注释行 (\":<text>\"), 如 \": keep-alive\"。\n *\n * 上游 (如 DeepSeek) 在开始推理前可能持续发送 SSE 注释作为保活;\n * 注释行不构成事件, SDK 解析器必须显式跳过, 否则未来若 else-branch 把\n * 未匹配行误送 JSON.parse 会回归出 parse error。\n *\n * 严格定义: 行的首字节是 \":\". 不放宽允许行首空白 (SSE 规范不允许)。\n */\nexport function isSSECommentLine(line: string): boolean {\n return line.length > 0 && line.charCodeAt(0) === 0x3a; // ':'\n}\n","// client-helpers.ts — Client 内部辅助函数\n// 端口自 acosmi-sdk-go/client.go 中的: parseHTTPError / classifyTransport /\n// parseStreamError / isOrderSuccess / isOrderTerminal / 安全限制常量 / SSE 行扫描器\n//\n// 这些函数在 Go 侧是 client.go 内部 unexported, 拆出独立文件以让 client.ts 不必再大。\n\nimport { HTTPError, NetworkError, StreamError, type FaultDomain, type RequestDisposition } from '../shared/errors';\n\n// =============================================================================\n// 安全限制常量 (端口自 acosmi-sdk-go/client.go 安全限制常量)\n// =============================================================================\n\n/** 50MB — 技能 ZIP 包最大下载体积 */\nexport const maxDownloadSize = 50 * 1024 * 1024;\n/** 1MB — 错误响应体最大读取量 */\nexport const maxErrorBodySize = 1 * 1024 * 1024;\n/** 1MB — SSE 单行最大长度 (大 JSON chunk) */\nexport const maxSSELineSize = 1 * 1024 * 1024;\n/** 模型列表缓存有效期 (ms) */\nexport const modelCacheTTLMs = 5 * 60 * 1000;\n/** V29 系数缓存 (TTL 8s) */\nexport const coefCacheTTLMs = 8 * 1000;\n\n// =============================================================================\n// HTTP 错误解析\n// =============================================================================\n\n/**\n * 解析 HTTP 错误响应体,兼容 Anthropic 和 OpenAI 错误格式\n * Anthropic: {\"type\":\"error\",\"error\":{\"type\":\"...\",\"message\":\"...\"}}\n * OpenAI: {\"error\":{\"message\":\"...\",\"type\":\"...\",\"code\":\"...\"}}\n * OpenAI 网关: {\"code\":429,\"message\":\"...\"} — /chat 代理路径顶层扁平形态, 无 error 对象\n * 任一形态下, 顶层 errorCode / windowKind / windowResetAt (窗口限额扩展) 透传到\n * HTTPError 对应属性。\n * 通用回退: HTTP {status}: {body}\n */\nexport function parseHTTPError(statusCode: number, body: Uint8Array | string): HTTPError {\n return parseHTTPErrorWithHeader(statusCode, body, null);\n}\n\n/**\n * 同 parseHTTPError 但额外解析 Retry-After 头到 HTTPError.retryAfter.\n * retry policy 用此字段做指数退避降级.\n */\nexport function parseHTTPErrorWithHeader(\n statusCode: number,\n body: Uint8Array | string,\n header: Headers | null,\n): HTTPError {\n const bodyStr = typeof body === 'string' ? body : new TextDecoder().decode(body);\n\n let retryAfter = 0;\n if (header) {\n const ra = header.get('Retry-After');\n if (ra) {\n const sec = parseInt(ra, 10);\n if (!isNaN(sec) && sec > 0) retryAfter = sec;\n }\n }\n\n if (bodyStr.length === 0) {\n return new HTTPError(statusCode, { retryAfter });\n }\n\n let type = '';\n let message = '';\n let errorCode: string | undefined;\n let windowKind: 'FIVE_HOUR' | 'WEEKLY' | undefined;\n let windowResetAt: string | undefined;\n let windowOverridable: boolean | undefined;\n try {\n const obj = JSON.parse(bodyStr);\n if (obj && typeof obj === 'object') {\n const top = obj as {\n error?: unknown;\n message?: unknown;\n errorCode?: unknown;\n windowKind?: unknown;\n windowResetAt?: unknown;\n windowOverridable?: unknown;\n errorContractVersion?: unknown; faultDomain?: unknown; requestDisposition?: unknown;\n transportRequestId?: unknown; consumeRequestId?: unknown; providerRequestId?: unknown; retryable?: unknown;\n };\n const errObj = top.error;\n if (errObj && typeof errObj === 'object') {\n const e = errObj as { message?: unknown; type?: unknown };\n if (typeof e.message === 'string') message = e.message;\n if (typeof e.type === 'string') type = e.type;\n } else if (typeof top.message === 'string') {\n // OpenAI 网关顶层扁平形态 ({code:number, message:string}, 无 error 对象):\n // 取顶层 message; type 语义是 anthropic/openai error.type, 此形态无来源 → 留空。\n message = top.message;\n }\n // 窗口限额扩展 (任一形态): 顶层业务机器码 + 窗口字段。\n // windowKind 只收契约冻结档位, 未知档位不伪造进闭合联合 (原值仍在 body 原串)。\n const contractSource = errObj && typeof errObj === 'object'\n ? errObj as typeof top\n : top;\n if (typeof top.errorCode === 'string') errorCode = top.errorCode;\n else if (typeof contractSource.errorCode === 'string') errorCode = contractSource.errorCode;\n if (top.windowKind === 'FIVE_HOUR' || top.windowKind === 'WEEKLY') windowKind = top.windowKind;\n if (typeof top.windowResetAt === 'string') windowResetAt = top.windowResetAt;\n // [W1 2026-07-11 软限额] 可豁免性 (老网关不返回 → undefined, 客户端按硬等待处理)。\n if (typeof top.windowOverridable === 'boolean') windowOverridable = top.windowOverridable;\n const disposition = contractSource.requestDisposition === 'not_accepted' || contractSource.requestDisposition === 'accepted' || contractSource.requestDisposition === 'unknown' ? contractSource.requestDisposition as RequestDisposition : undefined;\n const domains = ['user_auth','caller_credentials','account_quota','account_permission','provider','gateway','transport','stream_ticket','protocol'];\n return new HTTPError(statusCode, { type, message, retryAfter, body: bodyStr, errorCode, windowKind, windowResetAt, windowOverridable,\n errorContractVersion: contractSource.errorContractVersion === 1 ? 1 : undefined,\n faultDomain: typeof contractSource.faultDomain === 'string' && domains.includes(contractSource.faultDomain) ? contractSource.faultDomain as FaultDomain : undefined,\n requestDisposition: disposition,\n transportRequestId: typeof contractSource.transportRequestId === 'string' ? contractSource.transportRequestId : null,\n consumeRequestId: typeof contractSource.consumeRequestId === 'string' ? contractSource.consumeRequestId : null,\n providerRequestId: typeof contractSource.providerRequestId === 'string' ? contractSource.providerRequestId : null,\n retryable: contractSource.retryable === true });\n }\n } catch {\n // 非 JSON, body 原样保留\n }\n\n return new HTTPError(statusCode, {\n type,\n message,\n retryAfter,\n body: bodyStr,\n errorCode,\n windowKind,\n windowResetAt,\n windowOverridable,\n });\n}\n\n// =============================================================================\n// 网络错误分类\n// =============================================================================\n\n/**\n * 包装 fetch 抛出的 err 为 NetworkError, 便于 retry policy 判定.\n *\n * 分类规则:\n * - AbortError 由 ctx.signal 触发 → Timeout=true\n * - \"fetch failed\" / \"ECONNRESET\" / \"EOF\" / \"broken pipe\" → EOF=true\n * - 其他: Timeout/EOF 都 false (不重试)\n */\nexport function classifyTransport(op: string, urlStr: string, err: unknown): NetworkError {\n const ne = new NetworkError(op, urlStr, err);\n if (err instanceof Error) {\n // AbortError (fetch + AbortController)\n if (err.name === 'AbortError') {\n ne.timeout = true;\n return ne;\n }\n // Node fetch undici cause\n const cause = (err as Error & { cause?: { code?: string; name?: string } }).cause;\n if (cause) {\n if (cause.code === 'UND_ERR_CONNECT_TIMEOUT' || cause.code === 'UND_ERR_HEADERS_TIMEOUT' || cause.code === 'ETIMEDOUT') {\n ne.timeout = true;\n return ne;\n }\n if (cause.code === 'ECONNRESET' || cause.code === 'EPIPE' || cause.code === 'ECONNREFUSED' || cause.code === 'EAI_AGAIN') {\n ne.eof = true;\n return ne;\n }\n }\n const msg = err.message;\n if (msg.includes('EOF') || msg.includes('connection reset') || msg.includes('broken pipe')) {\n ne.eof = true;\n }\n }\n return ne;\n}\n\n// =============================================================================\n// Stream Error 解析\n// =============================================================================\n\n/**\n * 从 failed/error 事件 JSON 中提取结构化错误.\n *\n * 兼容三种 schema (按优先级):\n *\n * 1. acosmi managed-model 协议 (\"event: failed\"):\n * {errorCode, stage, error: <string>, message, retryable}\n *\n * 2. Anthropic 协议扩展 (\"event: error\", v0.14.1 起):\n * {type:\"error\", error:{type, message}, errorCode, retryable, message, stage}\n *\n * 3. Anthropic 标准纯净格式 (老网关 / 官方上游直返):\n * {type:\"error\", error:{type, message}}\n */\nexport function parseStreamError(data: string): StreamError {\n let payload: {\n errorCode?: string;\n stage?: string;\n error?: unknown;\n message?: string;\n retryable?: boolean;\n errorContractVersion?: number; faultDomain?: FaultDomain; requestDisposition?: RequestDisposition;\n transportRequestId?: string | null; consumeRequestId?: string | null; providerRequestId?: string | null;\n };\n try {\n payload = JSON.parse(data);\n } catch {\n return new StreamError({ rawError: data });\n }\n\n let code = payload.errorCode ?? '';\n const stage = payload.stage ?? '';\n let message = payload.message ?? '';\n const retryable = payload.retryable ?? false;\n let rawError = '';\n\n if (payload.error != null) {\n if (typeof payload.error === 'string') {\n rawError = payload.error;\n } else if (typeof payload.error === 'object') {\n const errObj = payload.error as { type?: string; message?: string };\n rawError = JSON.stringify(payload.error);\n // 私有 message 字段空时, 用 Anthropic error.message 兜底\n if (message === '' && errObj.message) message = errObj.message;\n // errorCode 空 + Anthropic error.type 非空时, 兜底用 type 作 code\n if (code === '' && errObj.type) code = errObj.type;\n }\n }\n\n return new StreamError({ code, stage, message, rawError, retryable,\n errorContractVersion: payload.errorContractVersion,\n faultDomain: payload.faultDomain, requestDisposition: payload.requestDisposition,\n transportRequestId: payload.transportRequestId, consumeRequestId: payload.consumeRequestId,\n providerRequestId: payload.providerRequestId });\n}\n\n// =============================================================================\n// Order 状态判定\n// =============================================================================\n\nexport function isOrderSuccess(status: string): boolean {\n switch (status) {\n case 'PAID':\n case 'SUCCESS':\n case 'COMPLETED':\n return true;\n }\n return false;\n}\n\nexport function isOrderTerminal(status: string): boolean {\n switch (status) {\n case 'PAID':\n case 'SUCCESS':\n case 'COMPLETED':\n case 'FAILED':\n case 'CANCELLED':\n case 'CLOSED':\n case 'EXPIRED':\n case 'REFUNDED':\n return true;\n }\n return false;\n}\n\n// =============================================================================\n// SSE 行迭代器\n// =============================================================================\n\n/**\n * 把 fetch Response.body (ReadableStream) 转成异步行迭代器\n * 替代 Go bufio.Scanner.\n *\n * 1MB 单行硬上限 (与 maxSSELineSize 对齐) — 超长行抛错.\n */\nexport async function* iterSSELines(\n body: ReadableStream<Uint8Array>,\n maxLineBytes = maxSSELineSize,\n): AsyncGenerator<string, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buf = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n\n let nlIdx: number;\n while ((nlIdx = buf.indexOf('\\n')) >= 0) {\n let line = buf.slice(0, nlIdx);\n buf = buf.slice(nlIdx + 1);\n // 去除 \\r (CRLF)\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n yield line;\n }\n if (buf.length > maxLineBytes) {\n throw new Error(`SSE line exceeds ${maxLineBytes} bytes`);\n }\n }\n // 处理最后一行 (无结尾 \\n)\n buf += decoder.decode(); // flush\n if (buf.length > 0) {\n if (buf.endsWith('\\r')) buf = buf.slice(0, -1);\n if (buf !== '') yield buf;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n}\n\n// =============================================================================\n// Body limit reader — 替代 Go io.LimitReader\n// =============================================================================\n\n/** 读取 ReadableStream 但限制最大字节数, 超限丢弃尾部 */\nexport async function readLimited(body: ReadableStream<Uint8Array>, maxBytes: number): Promise<Uint8Array> {\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (total + value.byteLength > maxBytes) {\n const remain = maxBytes - total;\n if (remain > 0) chunks.push(value.subarray(0, remain));\n break;\n }\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n // 拼接\n let len = 0;\n for (const c of chunks) len += c.byteLength;\n const out = new Uint8Array(len);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n return out;\n}\n\n/** 读取 ReadableStream + decode utf8, 限制最大字节数 */\nexport async function readLimitedText(\n body: ReadableStream<Uint8Array>,\n maxBytes: number,\n): Promise<string> {\n const buf = await readLimited(body, maxBytes);\n return new TextDecoder('utf-8').decode(buf);\n}\n","// sanitize 子包 re-export\n//\n// Go 侧 acosmi-sdk-go/sanitize/ 子包等价物。\n// 主入口 @acosmi/sdk-ts 通过 sanitize-bridge.ts 把这些工具与 Client/ChatRequest 粘合。\nexport * from './types';\nexport * from './config';\nexport * from './defensive';\nexport * from './history';\n","// sanitize/types.ts — 端口自 acosmi-sdk-go/sanitize/types.go\n//\n// Provider 无关的 content-block 防御性处理。\n// 职责边界:\n// - SDK 层: 只做所有下游 provider 都不可能接受的底线剥除 + 早失败\n// - Gateway 层: 按 provider preset 精细剥除 (不在本包内)\n\n/** Anthropic content block 类型 (请求 + 响应 + ephemeral) */\nexport type BlockType =\n | 'text'\n | 'image'\n | 'video'\n | 'document'\n | 'search_result'\n | 'thinking'\n | 'redacted_thinking'\n | 'tool_use'\n | 'tool_result'\n | 'tool_reference'\n | 'server_tool_use'\n | 'web_search_tool_result'\n | 'code_execution_tool_result'\n | 'mcp_tool_use'\n | 'mcp_tool_result'\n | 'container_upload';\n\nexport const BlockText: BlockType = 'text';\nexport const BlockImage: BlockType = 'image';\nexport const BlockVideo: BlockType = 'video';\nexport const BlockDocument: BlockType = 'document';\nexport const BlockSearchResult: BlockType = 'search_result';\nexport const BlockThinking: BlockType = 'thinking';\nexport const BlockRedactedThinking: BlockType = 'redacted_thinking';\nexport const BlockToolUse: BlockType = 'tool_use';\nexport const BlockToolResult: BlockType = 'tool_result';\nexport const BlockToolReference: BlockType = 'tool_reference';\nexport const BlockServerToolUse: BlockType = 'server_tool_use';\nexport const BlockWebSearchToolResult: BlockType = 'web_search_tool_result';\nexport const BlockCodeExecutionToolResult: BlockType = 'code_execution_tool_result';\nexport const BlockMCPToolUse: BlockType = 'mcp_tool_use';\nexport const BlockMCPToolResult: BlockType = 'mcp_tool_result';\nexport const BlockContainerUpload: BlockType = 'container_upload';\n\n/** 流式响应 delta 类型 (与 BlockType 正交) */\nexport type DeltaType =\n | 'text_delta'\n | 'input_json_delta'\n | 'thinking_delta'\n | 'signature_delta'\n | 'citations_delta';\n\nexport const DeltaText: DeltaType = 'text_delta';\nexport const DeltaInputJSON: DeltaType = 'input_json_delta';\nexport const DeltaThinking: DeltaType = 'thinking_delta';\nexport const DeltaSignature: DeltaType = 'signature_delta';\nexport const DeltaCitations: DeltaType = 'citations_delta';\n\n/**\n * 网关在 block JSON 中注入的 in-band 标记字段名。\n * 存在且值为 true 时代表该 block 不应回传下一轮。\n *\n * 选择 in-band 标记而非独立 SSE 事件的理由:\n * - 零缓冲 / 零顺序依赖 / 零延迟\n * - history 剥离天然可做\n */\nexport const EphemeralMarkerField = 'acosmi_ephemeral';\n","// sanitize/config.ts — 端口自 acosmi-sdk-go/sanitize/config.go\n\nimport type { BlockType } from './types';\n\n/**\n * SDK 层防御性配置。只做所有下游 provider 都不可能接受的底线剥除;\n * 具体 provider 适配由网关承担。\n *\n * 零值 = 不校验 / 不剥除, 等价于未启用。\n */\nexport interface MinimalSanitizeConfig {\n /** 体积上限 (字节, 仅对 base64 内联媒体生效; URL 版交网关把关). 0 = 不校验. */\n maxImageBytes?: number;\n maxVideoBytes?: number;\n maxPDFBytes?: number;\n\n /** history 轮次硬上限 (防止内存爆炸 / 上行带宽). 0 = 不校验. 超限抛 ErrHistoryTooDeep. */\n maxMessagesTurns?: number;\n\n /** 公共黑名单 (所有 provider 均拒绝的 block 类型). 默认空. */\n permanentDenyBlocks?: BlockType[];\n}\n\nexport class HistoryTooDeepError extends Error {\n constructor() {\n super('sanitize: messages history exceeds configured depth');\n this.name = 'HistoryTooDeepError';\n }\n}\n\nexport class BlockDeniedError extends Error {\n constructor() {\n super('sanitize: block type permanently denied');\n this.name = 'BlockDeniedError';\n }\n}\n\n/** 体积超限错误, 携带实际/上限字节数以便上游展示。 */\nexport class SizeError extends Error {\n blockType: BlockType;\n actual: number;\n limit: number;\n\n constructor(blockType: BlockType, actual: number, limit: number) {\n super(`sanitize: ${blockType} base64 size ${actual} exceeds limit ${limit}`);\n this.name = 'SizeError';\n this.blockType = blockType;\n this.actual = actual;\n this.limit = limit;\n }\n}\n\n// 单例实例 — 与 Go 侧 var ErrHistoryTooDeep / ErrBlockDenied 等价的\"哨兵\"用法\n// 但 TS class 实例不能 const 哨兵化, 调用方应用 instanceof 判断。\nexport const ErrHistoryTooDeep = new HistoryTooDeepError();\nexport const ErrBlockDenied = new BlockDeniedError();\n","// sanitize/history.ts — 端口自 acosmi-sdk-go/sanitize/history.go\n\nimport { EphemeralMarkerField } from './types';\n\n/** 判定一个 block 是否应被剥除 */\nexport type BlockPredicate = (block: Record<string, unknown>) => boolean;\n\n/**\n * 按 pred 从 messages 中剥除 block, 并联动剥除对应的 tool_result (user 轮)。\n *\n * 收敛两步: 先扫收集 droppedToolUseIDs, 再整体剥; 这样顺序不影响正确性\n * (即使 tool_result 在 tool_use 之前出现也能捕获)。\n *\n * 不修改入参 messages 中任何 map 的 key, 只重构数组。\n * 未被修改的 message 保持原引用 (零拷贝优化)。\n */\nexport function dropBlocks(messages: unknown[], pred: BlockPredicate): unknown[] {\n const droppedToolUseIDs = collectDroppedToolUseIDs(messages, pred);\n\n const out: unknown[] = [];\n for (const msg of messages) {\n if (!isPlainObject(msg)) {\n out.push(msg);\n continue;\n }\n const content = msg['content'];\n if (!Array.isArray(content)) {\n out.push(msg);\n continue;\n }\n\n const { kept, changed } = filterBlocks(content, pred, droppedToolUseIDs);\n if (!changed) {\n out.push(msg);\n continue;\n }\n\n // content 空了的消息整条丢弃 (assistant 本轮全是 ephemeral 块;\n // 或 user 轮全是联动剥的 tool_result)。避免产生空消息让 provider 报错。\n if (kept.length === 0) {\n continue;\n }\n\n // 浅拷贝 msg, 只改 content, 避免污染调用方数据。\n const newMsg: Record<string, unknown> = { ...msg };\n newMsg['content'] = kept;\n out.push(newMsg);\n }\n return out;\n}\n\n/** 第一遍扫描, 仅收集\"本次被 pred 命中的 tool_use 类 block 的 id\", 以便联动剥 tool_result。 */\nfunction collectDroppedToolUseIDs(messages: unknown[], pred: BlockPredicate): Set<string> {\n const ids = new Set<string>();\n for (const msg of messages) {\n if (!isPlainObject(msg)) continue;\n const content = msg['content'];\n if (!Array.isArray(content)) continue;\n for (const raw of content) {\n if (!isPlainObject(raw)) continue;\n if (!pred(raw)) continue;\n const t = raw['type'];\n if (typeof t !== 'string') continue;\n if (t === 'tool_use' || t === 'server_tool_use' || t === 'mcp_tool_use') {\n const id = raw['id'];\n if (typeof id === 'string' && id !== '') ids.add(id);\n }\n }\n }\n return ids;\n}\n\n/**\n * 对单条消息的 content 数组剥除 pred 命中的 block, 以及\n * tool_use_id 在 droppedToolUseIDs 中的 tool_result。返回 (新数组, 是否变更)。\n */\nfunction filterBlocks(\n content: unknown[],\n pred: BlockPredicate,\n droppedToolUseIDs: Set<string>,\n): { kept: unknown[]; changed: boolean } {\n const kept: unknown[] = [];\n let changed = false;\n for (const raw of content) {\n if (!isPlainObject(raw)) {\n kept.push(raw);\n continue;\n }\n if (pred(raw)) {\n changed = true;\n continue;\n }\n // 联动剥 tool_result / mcp_tool_result (仅当 tool_use_id 命中)\n if (droppedToolUseIDs.size > 0) {\n const t = raw['type'];\n if (t === 'tool_result' || t === 'mcp_tool_result') {\n const id = raw['tool_use_id'];\n if (typeof id === 'string' && id !== '' && droppedToolUseIDs.has(id)) {\n changed = true;\n continue;\n }\n }\n }\n kept.push(raw);\n }\n return { kept, changed };\n}\n\n/**\n * 从 messages 中剥除带 acosmi_ephemeral:true 标记的 block, 以及对应的 tool_result。\n *\n * 硬豁免: thinking / redacted_thinking 块永不剥, 即使携带 ephemeral 标记。\n *\n * 理由: Anthropic extended thinking + tool_use 续轮场景下, 上游强制要求\n * assistant 历史中保留原始 thinking 块, 否则返回:\n * \"The content[].thinking in the thinking mode must be passed back to the API.\"\n *\n * 历史污染防御: 即使旧版网关 / 历史响应里 thinking 块带了 ephemeral=true,\n * 客户端在调用 stripEphemeral 时也不应剥除。网关侧 anthropic preset 已停止注入此标记,\n * 本豁免兜底历史会话与第三方调用方两类已污染场景。\n */\nexport function stripEphemeral(messages: unknown[]): unknown[] {\n return dropBlocks(messages, (b) => {\n const t = b['type'];\n if (t === 'thinking' || t === 'redacted_thinking') {\n return false; // 硬豁免, 不可被 ephemeral 标记覆盖\n }\n const v = b[EphemeralMarkerField];\n return v === true;\n });\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// sanitize/defensive.ts — 端口自 acosmi-sdk-go/sanitize/defensive.go\n\nimport type { BlockType } from './types';\nimport type { MinimalSanitizeConfig } from './config';\nimport { ErrHistoryTooDeep, SizeError } from './config';\nimport { dropBlocks } from './history';\n\n/**\n * 对已经解析为 unknown[] 的 messages 做底线防御: 深度校验 +\n * 体积校验 + deny-list 剥除 + tool_use_id 联动剥除 tool_result。\n *\n * 入参形态: messages 的每个元素预期是 object (含 role / content); content 为 string (plain text)\n * 或 unknown[] (block 数组)。形态异常的元素原样透传, 不抛错。\n *\n * 通过返回新 messages (可能 block 数组被缩减); 早失败抛错 (调用方应放弃本次请求)。\n */\nexport function sanitize(messages: unknown[], cfg: MinimalSanitizeConfig): unknown[] {\n if ((cfg.maxMessagesTurns ?? 0) > 0 && messages.length > (cfg.maxMessagesTurns as number)) {\n throw ErrHistoryTooDeep;\n }\n\n // 体积校验: 先扫一遍, 任何违规直接早失败 (不修改 messages)\n if ((cfg.maxImageBytes ?? 0) > 0 || (cfg.maxVideoBytes ?? 0) > 0 || (cfg.maxPDFBytes ?? 0) > 0) {\n checkMediaSizes(messages, cfg);\n }\n\n // deny-list 剥除 + tool_use_id 联动\n if (cfg.permanentDenyBlocks && cfg.permanentDenyBlocks.length > 0) {\n const denySet = new Set<string>();\n for (const bt of cfg.permanentDenyBlocks) denySet.add(bt as string);\n messages = dropBlocks(messages, (b) => {\n const t = (b as Record<string, unknown>)['type'];\n return typeof t === 'string' && denySet.has(t);\n });\n }\n\n return messages;\n}\n\n/**\n * 遍历所有 block, 对 base64 内联 image/video/document 类型校验解码后字节数。\n * URL 版无法本地量体积, 跳过 (交网关把关)。违规直接抛 SizeError。\n */\nfunction checkMediaSizes(messages: unknown[], cfg: MinimalSanitizeConfig): void {\n for (const msg of messages) {\n if (!isPlainObject(msg)) continue;\n const content = msg['content'];\n if (!Array.isArray(content)) continue;\n for (const raw of content) {\n if (!isPlainObject(raw)) continue;\n const bt = raw['type'];\n if (typeof bt !== 'string') continue;\n\n let limit = 0;\n switch (bt as BlockType) {\n case 'image':\n limit = cfg.maxImageBytes ?? 0;\n break;\n case 'video':\n limit = cfg.maxVideoBytes ?? 0;\n break;\n case 'document':\n limit = cfg.maxPDFBytes ?? 0;\n break;\n default:\n continue;\n }\n if (limit <= 0) continue;\n\n const data = extractBase64Data(raw);\n if (data === '') continue; // URL 版或形态异常, 跳过\n const actual = base64DecodedLen(data);\n if (actual > limit) {\n throw new SizeError(bt as BlockType, actual, limit);\n }\n }\n }\n}\n\n/**\n * 从 Anthropic block 结构中抽 base64 data 字段。\n *\n * 形态:\n * image: {source:{type:\"base64\", data:\"...\"}}\n * video: {source:{type:\"base64\", data:\"...\"}}\n * document: {source:{type:\"base64\", data:\"...\"}}\n *\n * 若是 URL 版 (source.type=\"url\") 或缺字段, 返回 \"\"。\n */\nfunction extractBase64Data(block: Record<string, unknown>): string {\n const src = block['source'];\n if (!isPlainObject(src)) return '';\n if (src['type'] !== 'base64') return '';\n const dataRaw = src['data'];\n if (typeof dataRaw !== 'string') return '';\n let data: string = dataRaw;\n // 防御性: 某些上游把 \"data:image/jpeg;base64,...\" 整串塞进 data,\n // 虽非标准但兜底去掉前缀, 保证字节数估算正确。\n const i = data.indexOf('base64,');\n if (i >= 0) {\n data = data.slice(i + 'base64,'.length);\n }\n return data;\n}\n\n/** Go base64.StdEncoding.DecodedLen 等价: ceil(n*3/4) 减去 padding */\nfunction base64DecodedLen(b64: string): number {\n // Go 的 DecodedLen(n) = (n / 4) * 3 - paddingCount\n const n = b64.length;\n let pad = 0;\n if (n >= 1 && b64[n - 1] === '=') pad++;\n if (n >= 2 && b64[n - 2] === '=') pad++;\n return Math.floor((n * 3) / 4) - pad;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// sanitize-bridge.ts — 端口自 acosmi-sdk-go/sanitize_bridge.go\n//\n// 主包与 sanitize 子包的胶水层。\n// sanitize 子包定义了与 provider 无关的 block 处理工具, 不依赖主包;\n// 本文件把 ChatRequest 这种主包类型归一化为 sanitize 能处理的 unknown[] 形态,\n// 并提供 Client 级别的可配置钩子 (setDefensiveSanitize / setAutoStripEphemeralHistory).\n//\n// 调用时机: buildChatRequest 开头 (每次 chat/chatStream/chatMessages*).\n// 未配置时零开销 (applyRequestSanitizers 首行 early-return).\n\nimport { Client } from './client';\nimport type { ChatRequest } from '../models/types';\nimport { type MinimalSanitizeConfig, ErrHistoryTooDeep, sanitize, stripEphemeral } from '../sanitize';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 配置请求前的底线防御 (体积 / deny-list / 深度)。\n * 传空值 {} 关闭 (所有字段为零 = 禁用)。\n * 并发安全, 可在任意时间调用。\n */\n setDefensiveSanitize(cfg: MinimalSanitizeConfig): void;\n\n /**\n * 开启后, 每次请求前 SDK 会从 rawMessages 中剥除带 acosmi_ephemeral:true 标记的 block,\n * 并联动剥除引用已剥 tool_use 的 tool_result, 避免 provider 报 \"tool_use_id 不存在\".\n *\n * 标记来源: 网关在响应 content_block_start 中 in-band 注入; 消费者把上一轮 assistant\n * 回复原样拼回 history 即可触发剥离。\n */\n setAutoStripEphemeralHistory(on: boolean): void;\n\n /**\n * 在 buildChatRequest 开头调用, 把配置化的防御策略应用到 req。\n * 未配置时立即返回, 零开销。\n *\n * 失败时抛错 — 调用方应放弃本次请求。\n */\n applyRequestSanitizers(req: ChatRequest): void;\n }\n}\n\nClient.prototype.setDefensiveSanitize = function (this: Client, cfg: MinimalSanitizeConfig) {\n this.defensiveCfg = cfg;\n};\n\nClient.prototype.setAutoStripEphemeralHistory = function (this: Client, on: boolean) {\n this.autoStripEphemeral = on;\n};\n\nClient.prototype.applyRequestSanitizers = function (this: Client, req: ChatRequest) {\n const cfg = this.defensiveCfg;\n const strip = this.autoStripEphemeral;\n\n if (cfg == null && !strip) return;\n\n // rawMessages 分支: 归一化 → sanitize → (可选) strip → 写回\n if (req.rawMessages != null) {\n let msgs: unknown[];\n try {\n msgs = normalizeRawMessages(req.rawMessages);\n } catch (e) {\n throw new Error(\n `sanitize: normalize raw messages: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n if (cfg) {\n msgs = sanitize(msgs, cfg);\n }\n if (strip) {\n msgs = stripEphemeral(msgs);\n }\n req.rawMessages = msgs;\n return;\n }\n\n // 纯 messages 分支: block 级操作不适用, 只做深度校验\n if (\n cfg &&\n (cfg.maxMessagesTurns ?? 0) > 0 &&\n (req.messages?.length ?? 0) > (cfg.maxMessagesTurns as number)\n ) {\n throw ErrHistoryTooDeep;\n }\n};\n\n/**\n * 把任意形态的 rawMessages (struct 数组 / map 数组 / unknown[]) 归一为 unknown[]。\n *\n * 已是 unknown[] (Array) 时零拷贝直接返回; 其他走一次 JSON roundtrip。\n */\nfunction normalizeRawMessages(rm: unknown): unknown[] {\n if (Array.isArray(rm)) return rm;\n let s: unknown;\n try {\n s = JSON.parse(JSON.stringify(rm));\n } catch (e) {\n throw new Error(`raw messages: ${e instanceof Error ? e.message : String(e)}`);\n }\n if (!Array.isArray(s)) {\n throw new Error('raw messages must be a JSON array');\n }\n return s;\n}\n","// shared/index.ts — 跨域基础设施 barrel\n//\n// 收口错误类型、APIResponse / Yudao 分页结构,以及跨域共享 DTO\n// (分页 / operation / retryAdvice / principal / gate —— 能力缺口总账\n// §9.4 / §9.5 Phase 0.3)。\n//\n// 红线(§9.4 / §9.5):\n// - `PageResult<T>` 是 `YudaoPageResult<T>` 的别名,不开第二套分页结果结构。\n// - `RetryAdvice` 是叠加层,不替换 `core/retry.ts` `RetryPolicy` /\n// `compliance/errors.ts` `ComplianceErrorInfo`。\n// - 共享 DTO 按关注点分文件,不堆进本 barrel。\n\nexport * from './errors';\nexport * from './api-response';\nexport * from './pagination';\nexport * from './operation';\nexport * from './retry-advice';\nexport * from './principal';\nexport * from './gate';\n","// shared/operation.ts — 跨域统一操作(operation projection)原语。\n//\n// 依据:能力缺口总账 §4.7 / §6.3 / §6.4 / §9.4(Phase 0.3 shared DTO)。\n//\n// `operationId` 是 console / api / scheduler / crabcode / mcp / 合规等多来源\n// 的统一关联键(§2 边界 10)。本文件只沉淀【共享形态原语】;真实 operation\n// projection 命名空间须待后端端点 + 契约就绪后落地(§9.1),在此之前 SDK\n// `operations` 命名空间保持 `export {}` 占位 —— 提前写空转方法属编造契约。\n\nimport type { ComplianceProviderRequestStatus } from '../compliance/provider/types';\n\n/** 统一操作关联键。贯通控制台 / API / MCP / CrabCode / scheduler 各来源。 */\nexport type OperationId = string;\n\n/**\n * 操作来源。开放联合 —— 平台侧 5 种固定值,合规域可追加自定义来源字符串。\n * `(string & {})` 在保留 IDE 字面量补全的同时不拒绝未知来源(后端保留新增空间)。\n */\nexport type OperationSource =\n | 'console'\n | 'api'\n | 'scheduler'\n | 'crabcode'\n | 'mcp'\n // 开放联合:`string & NonNullable<unknown>` ≡ `string & {}`,保留字面量补全\n // 同时不拒绝未知值(`{}` 字面量被 eslint ban-types 禁用,故用等价写法)。\n | (string & NonNullable<unknown>);\n\n/**\n * 操作状态机。开放联合,后端保留新增空间。\n *\n * 与 `compliance/status.ts` 的 `ComplianceEnvelopeStatus` 等领域状态【正交】:\n * 领域状态描述某个履约对象的业务态,`OperationStatus` 描述【一次操作】本身\n * 的执行进度。\n */\nexport type OperationStatus =\n | 'pending'\n | 'running'\n | 'retrying'\n | 'awaiting_callback'\n | 'awaiting_verify'\n | 'succeeded'\n | 'failed'\n | 'canceled'\n | 'unknown'\n | (string & NonNullable<unknown>);\n\n/**\n * 本地 verify 状态(§6.4)。\n *\n * provider success 仅表示 provider request 终态;时间章 / 签署 / 验签 /\n * 证据包 / 报告发布须经后端本地 verify / evidence chain verify。`VerifyStatus`\n * 与 provider 状态是【两个独立维度】,operation projection 必须分别展示\n * (local verify failed → 业务 failed,不 billing settle)。\n */\nexport type VerifyStatus =\n | 'pending'\n | 'verified'\n | 'failed'\n | 'skipped'\n | 'unknown'\n | (string & NonNullable<unknown>);\n\n/**\n * 幂等键。作用域 = tenant + principal/client + action + product;同 key 同\n * canonical request 返回原结果,同 key 异 request 拒绝(§6.3 / §2 边界 9)。\n * SDK 写接口经 `IdempotencyKeyHeader` 透传,调用方必须【持久化】key。\n */\nexport type IdempotencyKey = string;\n\n/** 幂等键 HTTP header 名 —— 全 SDK 写接口的单一真相源。 */\nexport const IdempotencyKeyHeader = 'Idempotency-Key' as const;\n\n/**\n * Provider request 状态。\n *\n * 复核约束(§9.4 勘误):**不另造同名近似类型** —— 直接复用\n * `compliance/provider/types.ts` 既有 `ComplianceProviderRequestStatus`\n * (`PENDING` / `SUCCESS` / `FAILED` / `UNKNOWN` / `RETRYING`)。\n */\nexport type ProviderRequestStatus = ComplianceProviderRequestStatus;\n","// shared/retry-advice.ts — 跨域统一失败补救建议(retryAdvice)。\n//\n// 依据:能力缺口总账 §6.6 / §9.4(Phase 0.3 shared DTO,缺口 R-6)。\n//\n// 复核约束(§9.4 勘误 F-G / §6 边界 11):\n// - `RetryAdvice` 是【叠加层】—— 独立类型、独立字段,**不修改也不替换**\n// `core/retry.ts` 的 `RetryPolicy` 与 `compliance/errors.ts` 的\n// `ComplianceErrorInfo`(`retryable` / `terminal` / `stepUpRequired`)。\n// `RetryPolicy` 决定 SDK 传输层【是否自动重试】;`RetryAdvice` 是面向\n// 调用方 / 终端用户的【补救建议投影】,二者职责不同、不可互相替代。\n// - `reason` 不开第四套错误码登记表 —— 它是既有三套登记表(Java 数值码 /\n// SDK 符号 key / Go OAuth 标准字符串)的【小写归一化映射】。本文件即\n// §6.6 要求的\"既有码 → reason\"映射表。\n\nimport type { ComplianceErrorInfo, ComplianceErrorKey } from '../compliance/errors';\n\n/**\n * 失败补救原因。开放枚举的【封闭】部分 —— 这 11 个值覆盖 §6.6 要求的全集。\n *\n * 其中 `gate_closed` / `step_up_required` / `tenant_mismatch` /\n * `insufficient_scope` 与既有错误码登记表同名概念一一对应(见下方映射表),\n * 不是新造的码。\n */\nexport type RetryAdviceReason =\n | 'unknown'\n | 'retrying'\n | 'failed'\n | 'gate_closed'\n | 'step_up_required'\n | 'tenant_mismatch'\n | 'insufficient_scope'\n | 'quota_exceeded'\n | 'provider_timeout'\n | 'local_verify_failed'\n | 'billing_preflight_failed';\n\n/** `RetryAdviceReason` 全集(11 项)—— 供迭代 / 校验使用。 */\nexport const RETRY_ADVICE_REASONS: readonly RetryAdviceReason[] = [\n 'unknown',\n 'retrying',\n 'failed',\n 'gate_closed',\n 'step_up_required',\n 'tenant_mismatch',\n 'insufficient_scope',\n 'quota_exceeded',\n 'provider_timeout',\n 'local_verify_failed',\n 'billing_preflight_failed',\n] as const;\n\n/**\n * 失败补救建议统一模型(§6.6)。\n *\n * 高风险 / 收费动作失败后,后端 operation projection 产出本结构告诉调用方\n * 「能不能重试、要不要换幂等键、要不要人工介入」。\n */\nexport interface RetryAdvice {\n /** 是否值得【自动】重试。compliance 写接口几乎恒为 false(双扣红线)。 */\n retryable: boolean;\n /** 建议的重试等待时长(秒);与 `HTTPError.retryAfter` 单位一致。 */\n retryAfter?: number;\n /**\n * 重试时是否必须沿用【同一】幂等键。\n * 同 key 同 canonical request → 服务端返回原结果(对账语义);\n * 终态错误须改用【新】幂等键重新发起(§6.3)。\n */\n sameIdempotencyKeyRequired: boolean;\n /** 是否需要人工介入(重新登录 / step-up / 联系支持),不能纯自动恢复。 */\n manualActionRequired: boolean;\n /** 归一化失败原因。 */\n reason: RetryAdviceReason;\n /** 面向终端用户的提示文案(调用方可用自有 copy 表覆盖)。 */\n userMessage?: string;\n /** 面向开发者的诊断信息(如服务端原始 message)。 */\n developerMessage?: string;\n /** 支持工单关联码(如 `compliance:1031004004`)。 */\n supportCode?: string;\n}\n\n// =============================================================================\n// 映射表 1:SDK compliance 符号 key(`ComplianceErrorKey`)→ `RetryAdviceReason`\n//\n// 用 `Record<ComplianceErrorKey, ...>` 强约束【穷举】:compliance/errors.ts 新增\n// 任一 `ComplianceErrorKey` 而此处未补映射,本文件即编译失败 —— 映射表不会漏。\n// =============================================================================\n\nconst COMPLIANCE_KEY_TO_RETRY_REASON: Record<ComplianceErrorKey, RetryAdviceReason> = {\n // 通用 / token / scope\n COMPLIANCE_UNAUTHORIZED: 'failed',\n COMPLIANCE_INSUFFICIENT_SCOPE: 'insufficient_scope',\n COMPLIANCE_STEP_UP_REQUIRED: 'step_up_required',\n COMPLIANCE_TOKEN_INVALID: 'failed',\n // 主体快照\n SUBJECT_SNAPSHOT_REQUIRED: 'failed',\n SUBJECT_SNAPSHOT_NOT_FOUND: 'failed',\n SUBJECT_SNAPSHOT_TENANT_MISMATCH: 'tenant_mismatch',\n // Evidence / Timestamp / Package / Report\n EVIDENCE_ASSET_NOT_FOUND: 'failed',\n EVIDENCE_ASSET_HASH_MISMATCH: 'local_verify_failed',\n EVIDENCE_ASSET_PAYLOAD_REQUIRED: 'failed',\n TIMESTAMP_TOKEN_NOT_FOUND: 'failed',\n TIMESTAMP_PROVIDER_FAILED: 'failed',\n TIMESTAMP_PROVIDER_UNKNOWN: 'unknown',\n TIMESTAMP_LOCAL_VERIFY_FAILED: 'local_verify_failed',\n TIMESTAMP_PROVIDER_NOT_AVAILABLE: 'provider_timeout',\n EVIDENCE_PACKAGE_NOT_FOUND: 'failed',\n EVIDENCE_PACKAGE_TIMESTAMP_REQUIRED: 'failed',\n EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH: 'local_verify_failed',\n REPORT_NOT_FOUND: 'failed',\n REPORT_ALREADY_PUBLISHED: 'failed',\n REPORT_DRAFT_REQUIRED: 'failed',\n EVIDENCE_VERIFY_TARGET_REQUIRED: 'failed',\n EVIDENCE_VERIFY_TARGET_NOT_FOUND: 'failed',\n // Provider request\n PROVIDER_REQUEST_UNKNOWN_NO_RETRY: 'unknown',\n PROVIDER_CALLBACK_SOURCE_INVALID: 'failed',\n PROVIDER_NOT_CONFIGURED: 'gate_closed',\n PROVIDER_REQUEST_NOT_FOUND: 'failed',\n PROVIDER_REQUEST_IDEMPOTENCY_REQUIRED: 'failed',\n PROVIDER_REQUEST_STATUS_NOT_TERMINAL: 'retrying',\n // Envelope\n ENVELOPE_NOT_FOUND: 'failed',\n ENVELOPE_TENANT_MISMATCH: 'tenant_mismatch',\n ENVELOPE_STATE_NOT_ALLOWED: 'failed',\n ENVELOPE_GATE_CLOSED: 'gate_closed',\n CONTRACT_NOT_FOUND: 'failed',\n CONTRACT_HASH_MISMATCH: 'local_verify_failed',\n PROVIDER_AUTHORIZATION_NOT_CONFIRMED: 'failed',\n ENVELOPE_EVIDENCE_NOT_READY: 'retrying',\n // Seal approval / use\n SEAL_ASSET_NOT_FOUND: 'failed',\n SEAL_APPROVAL_NOT_FOUND: 'failed',\n SEAL_APPROVAL_STATE_NOT_APPROVED: 'failed',\n SEAL_APPROVAL_EXPIRED: 'failed',\n SEAL_APPROVAL_ALREADY_USED: 'failed',\n SEAL_APPROVAL_NONCE_USED: 'failed',\n SEAL_APPROVAL_SEAL_MISMATCH: 'failed',\n SEAL_APPROVAL_LOCATION_MISMATCH: 'failed',\n SEAL_APPROVAL_TRANSACTOR_MISMATCH: 'failed',\n SEAL_APPROVAL_CONTRACT_HASH_MISMATCH: 'local_verify_failed',\n SEAL_APPROVAL_INVALID_TRANSITION: 'failed',\n SEAL_USE_ALREADY_CONSUMED: 'failed',\n // Audit chain\n AUDIT_CHAIN_TAMPER_DETECTED: 'local_verify_failed',\n // Billing\n BILLING_COMMIT_REQUIRES_LOCAL_VERIFY: 'local_verify_failed',\n BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS: 'billing_preflight_failed',\n BILLING_CALLBACK_CANNOT_COMMIT: 'billing_preflight_failed',\n BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE: 'billing_preflight_failed',\n BILLING_S2S_FORBIDDEN: 'failed',\n // SDK fallback\n UNKNOWN_COMPLIANCE_ERROR: 'unknown',\n};\n\n/** SDK compliance 符号 key → `RetryAdviceReason`。未知 key 兜底 `unknown`。 */\nexport function retryReasonForComplianceKey(key: ComplianceErrorKey): RetryAdviceReason {\n return COMPLIANCE_KEY_TO_RETRY_REASON[key] ?? 'unknown';\n}\n\n// =============================================================================\n// 映射表 2:Go OAuth 标准错误字符串 → `RetryAdviceReason`\n//\n// 仅登记与 `RetryAdviceReason` 有同名概念的标准 OAuth 错误;其余按 `failed`。\n// =============================================================================\n\nconst OAUTH_ERROR_TO_RETRY_REASON: Record<string, RetryAdviceReason> = {\n insufficient_scope: 'insufficient_scope',\n invalid_token: 'failed',\n invalid_grant: 'failed',\n invalid_request: 'failed',\n access_denied: 'failed',\n unsupported_grant_type: 'failed',\n};\n\n/** Go OAuth 标准错误字符串 → `RetryAdviceReason`。未登记的兜底 `unknown`。 */\nexport function retryReasonForOAuthError(oauthError: string): RetryAdviceReason {\n return OAUTH_ERROR_TO_RETRY_REASON[oauthError] ?? 'unknown';\n}\n\n// =============================================================================\n// 叠加投影:`ComplianceErrorInfo` → `RetryAdvice`\n//\n// 这是 §9.4「叠加不替换」约束的具体实现 —— 纯函数,【只读】`ComplianceErrorInfo`、\n// 不修改它,产出独立的 `RetryAdvice`。`compliance/errors.ts` 与\n// `csign sdk-client.ts:classifyVerifyError` 完全不受影响。\n// =============================================================================\n\n/**\n * 把 `ComplianceErrorInfo`(compliance/errors.ts `classifyComplianceError` 的产出)\n * 投影为统一 `RetryAdvice`。\n *\n * 语义:\n * - `retryable` 直接透传 `info.retryable`(compliance 写接口恒 false)。\n * - 终态错误(`info.terminal`)→ 须改用【新】幂等键 →\n * `sameIdempotencyKeyRequired=false`、`manualActionRequired=true`。\n * - step-up 错误 → 重新做 OAuth introspection 后用【同一】幂等键重试 →\n * `sameIdempotencyKeyRequired=true`、`manualActionRequired=true`。\n * - 其余(非终态、非 step-up)→ 沿用同一幂等键对账重发。\n *\n * 不读、不写 `ComplianceErrorInfo` 以外的状态;入参不被 mutate。\n */\nexport function complianceErrorToRetryAdvice(info: ComplianceErrorInfo): RetryAdvice {\n return {\n retryable: info.retryable,\n sameIdempotencyKeyRequired: !info.terminal,\n manualActionRequired: info.terminal || info.stepUpRequired,\n reason: retryReasonForComplianceKey(info.key),\n developerMessage: info.message,\n supportCode: `compliance:${info.code}`,\n };\n}\n","// auth/scopes.ts — 端口自 acosmi-sdk-go/scopes.go (v0.19.0)\n//\n// 分组 Scope(V2: 10→3 合并),与后端 DesktopOAuthScopes 保持一致。\n//\n// 三处必须字面量一致, 任一变更需同步另外两处:\n// - Go: nexus-v4/backend/internal/handler/desktop_oauth.go DesktopOAuthScopes\n// - Java: tk-dist/yudao-module-compliance-api ComplianceScopes\n// - TS: 本文件 + compliance/scopes.ts 的 Scope* 常量\n// 合规 scope 不做分组合并 — 服务端按细粒度校验, SDK 也只应按需申请最小集合。\n// 合规 scope 已迁出至 compliance/scopes.ts。\n//\n// 高风险分组 scope (remote_control + chat_bridge) 同样字面量镜像自 Go DesktopOAuthScopes,\n// 均不进 allScopes(), 服务端 ScopeExpansion 各自展开为 3 个子 scope; 任一变更需同步 Go 端。\n\nexport const ScopeAI = 'ai'; // 模型服务: 模型调用 + 流量包 + 权益\nexport const ScopeSkills = 'skills'; // 技能与工具: 技能商店 + 工具列表 + 执行\nexport const ScopeAccount = 'account'; // 账户信息: 个人资料 + 钱包余额 + 交易记录\n\n// -----------------------------------------------------------------------------\n// Phase 4 (2026-05-27) 远程控制 CrabCode 多接入面专用 scope\n//\n// 契约: docs/audit/sdk-remote-control-contract-2026-05-27.md §6 #1 红线:\n// - 远控绝不复用 `models:chat` / `ai` scope;\n// - `ai` 展开列表绝不允许加入 remote_control 任意子项 (隐式获权后门);\n// - allScopes() 默认不申请 remote_control — 桌面登录不应该自动获得远控权限,\n// 调用方必须显式构造 `[ScopeRemoteControl]` 或 `[...allScopes(), ScopeRemoteControl]`\n// 才能在授权页面前向用户展示远控授权风险.\n//\n// 三处必须字面量一致:\n// - Go DesktopOAuthScopes (nexus-v4/backend/internal/handler/desktop_oauth.go)\n// - TS 本文件\n// - SDK / Web / Desktop 文档 §6\n// -----------------------------------------------------------------------------\n\n/** 远程控制能力 (分组 scope, 自包含展开到 3 个子 scope). 高风险, 不进 allScopes(). */\nexport const ScopeRemoteControl = 'remote_control';\n/** 创建 / 取消 / stream AgentRun. */\nexport const ScopeRemoteControlAgentRun = 'remote_control:agent-run';\n/** 远程会话 lifecycle 控制 (cancel / interrupt / kill). */\nexport const ScopeRemoteControlSessionControl = 'remote_control:session-control';\n/** 代表用户提交远控权限审批响应 (allow / deny / timeout). */\nexport const ScopeRemoteControlPermissionResponse = 'remote_control:permission-response';\n\n/** 第三方聊天集成桥接 (分组 scope, 服务端 ScopeExpansion 展开为 read/write/rotate)。凭证管理高风险, 不进 allScopes()。 */\nexport const ScopeChatBridge = 'chat_bridge';\n/** 查询 integration / session / 凭证元数据 (仅 ref+fingerprint)。 */\nexport const ScopeChatBridgeRead = 'chat_bridge:read';\n/** 创建 / 更新 integration 与凭证。 */\nexport const ScopeChatBridgeWrite = 'chat_bridge:write';\n/** 轮换 / 吊销凭证 (高风险)。 */\nexport const ScopeChatBridgeRotate = 'chat_bridge:rotate';\n\n/**\n * 会员委托 Key 控制面 scope (2026-08-14 开放 API 方案)。\n *\n * 高风险且**刻意不进 allScopes()**: 持有它即可签发\"长期代表本人会员权益调用模型\"的静态凭证,\n * 桌面登录不应自动获得该能力 —— 调用方必须显式申请, 用户才会在同意页看到这项授权。\n * 服务端三条约束一起才闭合 (见 Go desktop_oauth.go): 不并入任何分组展开、不得签进 sk- Key、\n * 签发接口只接受有同意页的 desktop OAuth 或同源登录态。\n */\nexport const ScopeAgentAccessManage = 'agent_access:manage';\n\n/** @deprecated 旧细粒度 scope, 保留向后兼容, 新代码请用分组 scope */\nexport const ScopeModels = 'models';\n/** @deprecated */\nexport const ScopeModelsChat = 'models:chat';\n/** @deprecated */\nexport const ScopeEntitlements = 'entitlements';\n/** @deprecated */\nexport const ScopeTokenPackages = 'token-packages';\n/** @deprecated */\nexport const ScopeSkillStore = 'skill_store';\n/** @deprecated */\nexport const ScopeTools = 'tools';\n/** @deprecated */\nexport const ScopeToolsExecute = 'tools:execute';\n/** @deprecated */\nexport const ScopeWallet = 'wallet';\n/** @deprecated */\nexport const ScopeWalletReadonly = 'wallet:readonly';\n/** @deprecated */\nexport const ScopeProfile = 'profile';\n\n/** 全部分组 scope (推荐) */\nexport function allScopes(): string[] {\n return [ScopeAI, ScopeSkills, ScopeAccount];\n}\n\n/** 模型服务相关 scope */\nexport function modelScopes(): string[] {\n return [ScopeAI];\n}\n\n/** 商城/钱包 scope */\nexport function commerceScopes(): string[] {\n return [ScopeAI, ScopeAccount];\n}\n\n/** 技能/工具 scope */\nexport function skillScopes(): string[] {\n return [ScopeSkills];\n}\n\n/**\n * 远程控制 scope (推荐). 仅返回分组 ScopeRemoteControl, 服务端 ScopeExpansion 会展开\n * 为 3 个子 scope. 调用方需显式申请, allScopes() 不包含本项 (避免桌面登录自动获权).\n */\nexport function remoteControlScopes(): string[] {\n return [ScopeRemoteControl];\n}\n\n/**\n * 聊天桥接 scope (推荐). 仅返回分组 ScopeChatBridge; 服务端展开为 3 子 scope。调用方需显式申请, allScopes() 不含。\n */\nexport function chatBridgeScopes(): string[] {\n return [ScopeChatBridge];\n}\n\n/**\n * 会员委托 Key 控制面 scope (需显式申请; allScopes() 不含本项)。\n * 典型用法: `authorize({ scopes: [...allScopes(), ...agentAccessScopes()] })`\n */\nexport function agentAccessScopes(): string[] {\n return [ScopeAgentAccessManage];\n}\n","// models/index.ts — 模型网关域 barrel\n//\n// 收口 ManagedModel / Chat / wire-format DTO / 双格式 adapter / 选模型 helper。\n\n// === 类型 ===\nexport * from './types';\nexport * from './wire-anthropic';\nexport * from './wire-openai';\n\n// === Model catalog helpers (v1.2+, CrabCode desktop automation 选模型用) ===\nexport {\n modelSupportsInputModality,\n modelSupportsImageInput,\n findFirstModelByInputModality,\n findDesktopVisualUnderstandingModel,\n} from './model-helpers';\n\n// === Adapters (双格式) ===\nexport {\n ProviderFormat,\n type ProviderAdapter,\n AnthropicAdapter,\n OpenAIAdapter,\n getAdapter,\n getAdapterForModel,\n} from './adapters/index';\n\n// === Stream meta ===\nexport { extractAnthropicBlockMeta, type BlockMeta } from './stream-meta';\n\n// === Betas ===\nexport { buildBetas, uniqueMerge } from './betas';\n\n// === v1.6.0 业务侧终端用户 id helper ===\nexport { validateEndUserId, maxEndUserIdLength, isSSECommentLine } from './enduser';\n","// models/wire-anthropic.ts — Anthropic wire-format 响应 DTO。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 AnthropicResponse 段。\n//\n// 命名约定:字段名 = Go json tag 字面量 (wire format), 不做 camelCase 重映射。\n\n/**\n * Anthropic 内容块\n * 覆盖: text / thinking / redacted_thinking / tool_use / tool_result /\n * server_tool_use / mcp_tool_use / mcp_tool_result\n */\nexport interface AnthropicContentBlock {\n type: string;\n text?: string;\n /** tool_use / server_tool_use / mcp_tool_use block ID */\n id?: string;\n /** tool_use function name */\n name?: string;\n /** tool_use arguments (json.RawMessage) */\n input?: unknown;\n /** thinking block content */\n thinking?: string;\n\n /** text — web_search 搜索引用 */\n citations?: unknown;\n /** thinking — Anthropic 签名 (后续请求必须回传) */\n signature?: string;\n /** redacted_thinking — base64 编码的被审查思考内容 */\n data?: string;\n /** server_tool_use / mcp_tool_use / mcp_tool_result — 服务端工具来源 */\n server_name?: string;\n /** mcp_tool_use — MCP 调用者上下文 */\n caller?: unknown;\n /** tool_result / mcp_tool_result — 工具执行结果 */\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n}\n\n/** Anthropic token 用量 */\nexport interface AnthropicUsage {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\n/**\n * Anthropic 原生格式同步响应\n * POST /managed-models/:id/anthropic 返回此格式 (无 response.Success 包装)\n */\nexport interface AnthropicResponse {\n id: string;\n /** \"message\" */\n type: string;\n /** \"assistant\" */\n role: string;\n content: AnthropicContentBlock[];\n model: string;\n stop_reason: string;\n stop_sequence?: string | null;\n usage: AnthropicUsage;\n}\n\n/** 提取所有 text 类型内容块的文本,拼接返回 */\nexport function anthropicResponseTextContent(r: AnthropicResponse): string {\n const parts: string[] = [];\n for (const b of r.content) {\n if (b.type === 'text' && b.text) parts.push(b.text);\n }\n return parts.join('');\n}\n\n/** 提取所有 thinking 类型内容块的文本,拼接返回 */\nexport function anthropicResponseThinkingContent(r: AnthropicResponse): string {\n const parts: string[] = [];\n for (const b of r.content) {\n if (b.type === 'thinking' && b.thinking) parts.push(b.thinking);\n }\n return parts.join('');\n}\n\n/** 返回所有 tool_use 类型的内容块 */\nexport function anthropicResponseToolUseBlocks(r: AnthropicResponse): AnthropicContentBlock[] {\n return r.content.filter((b) => b.type === 'tool_use');\n}\n","// model-helpers.ts — ManagedModel catalog helpers (v1.2+)\n//\n// 目标 — 让 CrabCode / CrabClaw 等下游产品在做 desktop automation / computer-use 选模型时\n// 完全依赖 SDK listModels 下发的 capabilities + inputModalities 字段, 杜绝任何\n// 基于模型名 substring 的硬编码推断 (例如 \"包含 vision 就当视觉模型\").\n//\n// 红线:\n// 1. 这里没有任何 model name match — 只读 ManagedModel 字段.\n// 2. 缺失字段一律保守判负 — 缺 inputModalities 视为 \"未声明\", 不当 image-capable.\n// 3. supports_desktop_visual_understanding 是 capability 矩阵字段, 与\n// inputModalities=['image'] 是正交两件事; 桌面 sidecar 选择必须两个条件同时满足.\n\nimport type { InputModality, ManagedModel } from './types';\n\n/**\n * 判断 ManagedModel 是否声明支持指定输入模态.\n *\n * 语义:\n * - model 为 null/undefined → false\n * - model.inputModalities 缺失或非数组 → false (保守, 未声明不当支持)\n * - 大小写敏感 (上游契约即小写 'text' | 'image')\n */\nexport function modelSupportsInputModality(\n model: ManagedModel | null | undefined,\n modality: InputModality,\n): boolean {\n if (!model) return false;\n const mods = model.inputModalities;\n if (!Array.isArray(mods)) return false;\n return mods.includes(modality);\n}\n\n/** 等价 modelSupportsInputModality(model, 'image') — 调用方常见快捷判定. */\nexport function modelSupportsImageInput(model: ManagedModel | null | undefined): boolean {\n return modelSupportsInputModality(model, 'image');\n}\n\n/**\n * 在 catalog 中按 catalog 顺序查找首个支持指定模态的模型.\n *\n * 选择规则:\n * 1. isEnabled !== false (默认开, 显式 false 才剔除)\n * 2. inputModalities 包含指定模态\n * 3. 命中后按 catalog 顺序返回第一个; 未命中返 null\n *\n * 注意: 该 helper 不读 isDefault, 调用方需要 \"默认优先\" 请用\n * findDesktopVisualUnderstandingModel 或自行排序.\n */\nexport function findFirstModelByInputModality(\n models: ManagedModel[],\n modality: InputModality,\n): ManagedModel | null {\n if (!Array.isArray(models)) return null;\n for (const m of models) {\n if (!m) continue;\n if (m.isEnabled === false) continue;\n if (!modelSupportsInputModality(m, modality)) continue;\n return m;\n }\n return null;\n}\n\n/**\n * 在 catalog 中选出最适合做 \"桌面视觉理解 sidecar\" 的模型.\n *\n * 设计目的: CrabCode desktop automation 链路里, 主模型不一定多模态;\n * 截图先送 sidecar 解析成结构化 UI 描述, 再喂主模型. 这里选 sidecar 模型\n * 严格走运营标注的 supports_desktop_visual_understanding capability, 不靠\n * 模型名猜.\n *\n * 选择规则 (按用户指定顺序):\n * 1. isEnabled !== false\n * 2. capabilities.supports_desktop_visual_understanding === true\n * 3. inputModalities 包含 'image' (必须真能吃图)\n * 4. 命中集合中优先 isDefault === true; 否则返回 catalog 顺序第一个\n *\n * 全部不满足返 null. 调用方收到 null 应:\n * - 提示用户在管理后台/网关侧开启桌面视觉 sidecar 模型, 或\n * - 降级停掉依赖截图的工作流, 而不是硬选一个非视觉模型送图.\n */\nexport function findDesktopVisualUnderstandingModel(\n models: ManagedModel[],\n): ManagedModel | null {\n if (!Array.isArray(models)) return null;\n const candidates: ManagedModel[] = [];\n for (const m of models) {\n if (!m) continue;\n if (m.isEnabled === false) continue;\n if (m.capabilities?.supports_desktop_visual_understanding !== true) continue;\n if (!modelSupportsInputModality(m, 'image')) continue;\n candidates.push(m);\n }\n if (candidates.length === 0) return null;\n for (const m of candidates) {\n // 注: 公开 listModels() 不返回 isDefault, 此分支仅对 admin 上下文调用方生效; 公开数据下会落到 catalog 顺序首个 (可接受)。\n if (m.isDefault === true) return m;\n }\n return candidates[0];\n}\n","// client/entitlements.ts — 端口自 acosmi-sdk-go/client.go (Entitlements + V29 Per-Model Bucket section)\n//\n// declaration merging 扩展 Client class.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n BalanceDetail,\n ConsumeRecordPage,\n EntitlementBalance,\n EntitlementItem,\n ModelBucket,\n ModelByQuotaResponse,\n ModelCoefficient,\n} from './types';\nimport { Client } from '../core/client';\nimport { coefCacheTTLMs } from '../core/http';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 查询当前用户的权益余额 (聚合) */\n getBalance(signal?: AbortSignal): Promise<EntitlementBalance>;\n /** 查询详细余额 (含每条权益明细) */\n getBalanceDetail(signal?: AbortSignal): Promise<BalanceDetail>;\n /** 查询当前用户权益列表; status: \"ACTIVE\" / \"EXPIRED\" / \"\" (全部) */\n listEntitlements(status: string, signal?: AbortSignal): Promise<EntitlementItem[]>;\n /** 查询核销记录 (分页) */\n listConsumeRecords(page: number, pageSize: number, signal?: AbortSignal): Promise<ConsumeRecordPage>;\n /** 领取当月免费额度 — 幂等: 已领取时返回已有权益 */\n claimMonthlyFree(signal?: AbortSignal): Promise<EntitlementItem>;\n /** 查询当前用户在指定模型下的剩余 token (raw + ETU) */\n getByModel(modelID: string, signal?: AbortSignal): Promise<ModelByQuotaResponse>;\n /** 列出当前用户的全部桶 */\n listBuckets(signal?: AbortSignal): Promise<ModelBucket[]>;\n /** @deprecated 系数已退役, 网关恒返回 []。*/\n /** 拉取模型系数表; SDK 自带 8s TTL 内存缓存以减小调用风暴. */\n listCoefficients(signal?: AbortSignal): Promise<ModelCoefficient[]>;\n /** @deprecated 系数已退役, 网关恒返回 []。*/\n /** 手动失效系数缓存 (admin 调价后建议立即调一次) */\n invalidateCoefficientCache(): void;\n }\n}\n\nClient.prototype.getBalance = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<EntitlementBalance>>(\n 'GET',\n '/entitlements/balance',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getBalanceDetail = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<BalanceDetail>>(\n 'GET',\n '/entitlements/balance-detail',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listEntitlements = async function (this: Client, status: string, signal?: AbortSignal) {\n let path = '/entitlements';\n if (status !== '') {\n path += `?status=${encodeURIComponent(status)}`;\n }\n const resp = await this.doJSON<APIResponse<EntitlementItem[]>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.listConsumeRecords = async function (\n this: Client,\n page: number,\n pageSize: number,\n signal?: AbortSignal,\n) {\n const path = `/entitlements/consume-records?page=${page}&pageSize=${pageSize}`;\n const resp = await this.doJSON<APIResponse<ConsumeRecordPage>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.claimMonthlyFree = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<EntitlementItem>>(\n 'POST',\n '/entitlements/claim-monthly',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getByModel = async function (this: Client, modelID: string, signal?: AbortSignal) {\n if (modelID === '') throw new Error('modelID required');\n const path = `/entitlements/by-model?modelId=${encodeURIComponent(modelID)}`;\n const resp = await this.doJSON<APIResponse<ModelByQuotaResponse>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.listBuckets = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<ModelBucket[]>>(\n 'GET',\n '/entitlements/buckets',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listCoefficients = async function (this: Client, signal?: AbortSignal) {\n // 简单内存缓存 + TTL (8s)\n if (this.coefCacheData && Date.now() - this.coefCacheTimeMs < coefCacheTTLMs) {\n return [...this.coefCacheData]; // shallow copy 防外部篡改\n }\n const resp = await this.doJSON<APIResponse<ModelCoefficient[]>>(\n 'GET',\n '/entitlements/coefficients',\n null,\n signal,\n );\n this.coefCacheData = [...resp.data];\n this.coefCacheTimeMs = Date.now();\n return resp.data;\n};\n\nClient.prototype.invalidateCoefficientCache = function (this: Client) {\n this.coefCacheData = null;\n this.coefCacheTimeMs = 0;\n};\n","// client/packages.ts — 端口自 acosmi-sdk-go/client.go (Token Packages / 商城 section)\n\nimport type { APIResponse, YudaoPageResult } from '../shared/api-response';\nimport type {\n BuyResponse,\n OrderListItem,\n PayPayload,\n TokenPackage,\n} from './types';\nimport { OrderTerminalError } from '../shared/errors';\nimport { Client } from '../core/client';\nimport { isOrderSuccess, isOrderTerminal } from '../core/http';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 获取商城流量包列表 (兼容 yudao 分页和直接数组两种格式) */\n listTokenPackages(signal?: AbortSignal): Promise<TokenPackage[]>;\n /** 获取流量包详情 */\n getTokenPackageDetail(packageID: string, signal?: AbortSignal): Promise<TokenPackage>;\n /** 购买流量包 (创建订单) */\n buyTokenPackage(packageID: string, payload: PayPayload | null, signal?: AbortSignal): Promise<BuyResponse>;\n /** 查询订单支付状态 */\n getOrderStatus(orderID: string, signal?: AbortSignal): Promise<BuyResponse>;\n /** 查询我的订单列表 */\n listMyOrders(signal?: AbortSignal): Promise<OrderListItem[]>;\n /**\n * 轮询订单支付状态直到终态\n * 成功支付返回 BuyResponse; 终态失败抛 OrderTerminalError\n * 终态判定基于 paymentStatus (回退 orderStatus)\n * pollIntervalMs <= 0 时默认 2 秒\n */\n waitForPayment(orderID: string, pollIntervalMs: number, signal?: AbortSignal): Promise<BuyResponse>;\n }\n}\n\nClient.prototype.listTokenPackages = async function (this: Client, signal?: AbortSignal) {\n const raw = await this.doJSON<APIResponse<unknown>>('GET', '/token-packages', null, signal);\n // 尝试 yudao 分页格式\n if (raw.data && typeof raw.data === 'object' && 'list' in raw.data) {\n const page = raw.data as YudaoPageResult<TokenPackage>;\n if (Array.isArray(page.list)) return page.list;\n }\n // 降级: 直接数组\n if (Array.isArray(raw.data)) return raw.data as TokenPackage[];\n throw new Error('decode token packages: unexpected shape');\n};\n\nClient.prototype.getTokenPackageDetail = async function (\n this: Client,\n packageID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<TokenPackage>>(\n 'GET',\n `/token-packages/${encodeURIComponent(packageID)}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.buyTokenPackage = async function (\n this: Client,\n packageID: string,\n payload: PayPayload | null,\n signal?: AbortSignal,\n) {\n const body = payload ?? null;\n const resp = await this.doJSON<APIResponse<BuyResponse>>(\n 'POST',\n `/token-packages/${encodeURIComponent(packageID)}/buy`,\n body,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getOrderStatus = async function (\n this: Client,\n orderID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<BuyResponse>>(\n 'GET',\n `/token-packages/orders/${encodeURIComponent(orderID)}/status`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listMyOrders = async function (this: Client, signal?: AbortSignal) {\n const raw = await this.doJSON<APIResponse<unknown>>('GET', '/token-packages/my', null, signal);\n if (raw.data && typeof raw.data === 'object' && 'list' in raw.data) {\n const page = raw.data as YudaoPageResult<OrderListItem>;\n if (Array.isArray(page.list)) return page.list;\n }\n if (Array.isArray(raw.data)) return raw.data as OrderListItem[];\n throw new Error('decode orders: unexpected shape');\n};\n\nClient.prototype.waitForPayment = async function (\n this: Client,\n orderID: string,\n pollIntervalMs: number,\n signal?: AbortSignal,\n) {\n if (pollIntervalMs <= 0) pollIntervalMs = 2000;\n while (true) {\n const status = await this.getOrderStatus(orderID, signal);\n const st = status.paymentStatus ?? status.orderStatus;\n if (isOrderTerminal(st)) {\n if (isOrderSuccess(st)) return status;\n throw new OrderTerminalError(orderID, st);\n }\n await sleepWithSignal(pollIntervalMs, signal);\n }\n};\n\nasync function sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n if (signal && signal.aborted) throw new Error('aborted');\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n if (signal && abortHandler) signal.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => {\n clearTimeout(t);\n signal.removeEventListener('abort', abortHandler!);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n }\n });\n}\n","// client/wallet.ts — 端口自 acosmi-sdk-go/client.go (Wallet section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { Transaction, WalletStats } from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 获取钱包统计 (余额/月消费/月充值) */\n getWalletStats(signal?: AbortSignal): Promise<WalletStats>;\n /** 获取最近交易记录 */\n getWalletTransactions(signal?: AbortSignal): Promise<Transaction[]>;\n }\n}\n\nClient.prototype.getWalletStats = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<WalletStats>>('GET', '/wallet/stats', null, signal);\n return resp.data;\n};\n\nClient.prototype.getWalletTransactions = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<Transaction[]>>(\n 'GET',\n '/wallet/transactions',\n null,\n signal,\n );\n return resp.data;\n};\n","// client/skills.ts — 端口自 acosmi-sdk-go/client.go (Skill Store + Generator section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n CertificationStatus,\n GenerateSkillRequest,\n GenerateSkillResult,\n OptimizeSkillRequest,\n OptimizeSkillResult,\n SkillBrowseListResponse,\n SkillBrowseResponse,\n SkillStoreItem,\n SkillStoreQuery,\n SkillSummary,\n} from './types';\nimport { RateLimitError, isUserAccessTokenRejected } from '../shared/errors';\nimport { Client } from '../core/client';\nimport {\n classifyTransport,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n readLimitedText,\n} from '../core/http';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 浏览技能商店 (公共端点, 无需认证) */\n browseSkillStore(query: SkillStoreQuery, signal?: AbortSignal): Promise<SkillStoreItem[]>;\n /** 浏览公共技能商店 (V3 分页接口) */\n browseSkills(\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n ): Promise<SkillBrowseResponse>;\n /** 轻量浏览公共技能商店 (fields=minimal, 响应体积缩减 90%+) */\n browseSkillsList(\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n ): Promise<SkillBrowseListResponse>;\n /** 获取技能商店中某个技能的详情 (公共端点) */\n getSkillDetail(skillID: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /** 按 key 精确查找公共技能 (公共端点) */\n resolveSkill(key: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /** 安装技能到当前用户的租户空间 (需 OAuth scope: skill_store) */\n installSkill(skillID: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /**\n * 下载技能 ZIP 包 (公共端点, 双模式)\n * 有 token 时自动附带 (享受无限流), 无 token 时匿名 (受限流)\n * @returns [data, filename]; 限流时抛 RateLimitError\n */\n downloadSkill(skillID: string, signal?: AbortSignal): Promise<{ data: Uint8Array; filename: string }>;\n /**\n * 上传技能 ZIP 包\n * @param scope \"TENANT\"\n * @param intent \"PERSONAL\" (仅自己用) 或 \"PUBLIC_INTENT\" (走认证→公开)\n */\n uploadSkill(zipData: Uint8Array, scope: string, intent: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /** 获取技能统计概览 */\n getSkillSummary(signal?: AbortSignal): Promise<SkillSummary>;\n /** 触发技能认证管线 (异步) */\n certifySkill(skillID: string, signal?: AbortSignal): Promise<void>;\n /** 查询技能认证状态 */\n getCertificationStatus(skillID: string, signal?: AbortSignal): Promise<CertificationStatus>;\n /** 根据自然语言描述生成技能定义 (基于独立 LLM) */\n generateSkill(req: GenerateSkillRequest, signal?: AbortSignal): Promise<GenerateSkillResult>;\n /** 优化已有技能定义 */\n optimizeSkill(req: OptimizeSkillRequest, signal?: AbortSignal): Promise<OptimizeSkillResult>;\n /** 校验技能定义正确性 */\n validateSkill(skillName: string, signal?: AbortSignal): Promise<void>;\n }\n}\n\nClient.prototype.browseSkillStore = async function (\n this: Client,\n query: SkillStoreQuery,\n signal?: AbortSignal,\n) {\n const resp = await this.browseSkills(\n 1,\n 50,\n query.category ?? '',\n query.keyword ?? '',\n query.tag ?? '',\n '',\n signal,\n );\n return resp.items;\n};\n\nClient.prototype.browseSkills = async function (\n this: Client,\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n) {\n const qv = new URLSearchParams();\n qv.set('page', String(page));\n qv.set('pageSize', String(pageSize));\n if (category) qv.set('category', category);\n if (keyword) qv.set('keyword', keyword);\n if (tag) qv.set('tag', tag);\n if (source) qv.set('source', source);\n const resp = await this.doPublicJSON<APIResponse<SkillBrowseResponse>>(\n 'GET',\n `/skill-store?${qv.toString()}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.browseSkillsList = async function (\n this: Client,\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n) {\n const qv = new URLSearchParams();\n qv.set('page', String(page));\n qv.set('pageSize', String(pageSize));\n qv.set('fields', 'minimal');\n if (category) qv.set('category', category);\n if (keyword) qv.set('keyword', keyword);\n if (tag) qv.set('tag', tag);\n if (source) qv.set('source', source);\n const resp = await this.doPublicJSON<APIResponse<SkillBrowseListResponse>>(\n 'GET',\n `/skill-store?${qv.toString()}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getSkillDetail = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doPublicJSON<APIResponse<SkillStoreItem>>(\n 'GET',\n `/skill-store/${encodeURIComponent(skillID)}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.resolveSkill = async function (\n this: Client,\n key: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doPublicJSON<APIResponse<SkillStoreItem>>(\n 'GET',\n `/skill-store/resolve/${encodeURIComponent(key)}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.installSkill = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<SkillStoreItem>>(\n 'POST',\n `/skill-store/${encodeURIComponent(skillID)}/install`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.downloadSkill = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n // 5min 超时 (大文件下载)\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 5 * 60 * 1000);\n let parentHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) ctl.abort();\n else {\n parentHandler = () => ctl.abort();\n signal.addEventListener('abort', parentHandler);\n }\n }\n\n try {\n const url = this.apiURL(`/skill-store/${encodeURIComponent(skillID)}/download`);\n const headers: Record<string, string> = {};\n let token = '';\n try {\n token = await this.ensureToken(ctl.signal);\n } catch {\n // 公共端点允许无 token\n }\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(url, { method: 'GET', headers, signal: ctl.signal });\n } catch (e) {\n throw classifyTransport('GET ' + `/skill-store/${skillID}/download`, url, e);\n }\n\n if (resp.status === 429) {\n const bodyText = await readLimitedText(resp.body!, maxErrorBodySize);\n throw new RateLimitError('匿名下载已达限制', resp.headers.get('Retry-After') ?? '', bodyText);\n }\n\n if (!resp.ok) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw new Error(\n `download skill: ${parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers).message}`,\n );\n }\n\n const data = await readLimited(resp.body!, maxDownloadSize + 1);\n if (data.byteLength > maxDownloadSize) {\n throw new Error(`download skill: response exceeds ${maxDownloadSize >> 20}MB limit`);\n }\n\n let filename = 'skill.zip';\n const cd = resp.headers.get('Content-Disposition');\n if (cd) {\n const idx = cd.indexOf('filename');\n if (idx !== -1) {\n const parts = cd.slice(idx).split('=', 2);\n if (parts.length === 2) {\n filename = parts[1]!.trim().replace(/^[\"' ]+|[\"' ]+$/g, '');\n }\n }\n }\n\n return { data, filename };\n } finally {\n clearTimeout(timer);\n if (parentHandler && signal) signal.removeEventListener('abort', parentHandler);\n }\n};\n\nClient.prototype.uploadSkill = async function (\n this: Client,\n zipData: Uint8Array,\n scope: string,\n intent: string,\n signal?: AbortSignal,\n) {\n return uploadSkillInternal(this, zipData, scope, intent, false, signal);\n};\n\nasync function uploadSkillInternal(\n c: Client,\n zipData: Uint8Array,\n scope: string,\n intent: string,\n retried: boolean,\n signal?: AbortSignal,\n): Promise<SkillStoreItem> {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 5 * 60 * 1000);\n let parentHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) ctl.abort();\n else {\n parentHandler = () => ctl.abort();\n signal.addEventListener('abort', parentHandler);\n }\n }\n\n try {\n const token = await c.ensureToken(ctl.signal);\n\n // 用 FormData (多端通用) 替代 Go mime/multipart\n const form = new FormData();\n form.append('scope', scope);\n form.append('intent', intent);\n // Blob 在浏览器/Node 18+ 都可用\n // 显式 cast: TS 5.7+ Uint8Array<ArrayBufferLike> 与 BlobPart 严格度问题\n const blob = new Blob([zipData as BlobPart], { type: 'application/zip' });\n form.append('file', blob, 'skill.zip');\n\n const url = c.apiURL('/skill-store/upload');\n let resp: Response;\n try {\n resp = await c.fetchImpl(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n body: form,\n signal: ctl.signal,\n });\n } catch (e) {\n throw classifyTransport('POST /skill-store/upload', url, e);\n }\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await c.forceRefresh(ctl.signal, token);\n } catch (refreshErr) {\n throw new Error(\n `upload: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n return uploadSkillInternal(c, zipData, scope, intent, true, signal);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw new Error(\n `upload: ${parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers).message}`,\n );\n }\n\n const text = await resp.text();\n const result = JSON.parse(text) as { data: { skill: SkillStoreItem } };\n return result.data.skill;\n } finally {\n clearTimeout(timer);\n if (parentHandler && signal) signal.removeEventListener('abort', parentHandler);\n }\n}\n\nClient.prototype.getSkillSummary = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<SkillSummary>>('GET', '/skills/summary', null, signal);\n return resp.data;\n};\n\nClient.prototype.certifySkill = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'POST',\n `/skill-store/${encodeURIComponent(skillID)}/certify`,\n null,\n signal,\n );\n};\n\nClient.prototype.getCertificationStatus = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<CertificationStatus>>(\n 'GET',\n `/skill-store/${encodeURIComponent(skillID)}/certification`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.generateSkill = async function (\n this: Client,\n req: GenerateSkillRequest,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<GenerateSkillResult>>(\n 'POST',\n '/skill-generator/generate',\n req,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.optimizeSkill = async function (\n this: Client,\n req: OptimizeSkillRequest,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<OptimizeSkillResult>>(\n 'POST',\n '/skill-generator/optimize',\n req,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.validateSkill = async function (\n this: Client,\n skillName: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'POST',\n '/skill-generator/validate',\n { skillName },\n signal,\n );\n};\n","// client/tools.ts — 端口自 acosmi-sdk-go/client.go (Unified Tools section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { ToolListResponse, ToolView } from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 获取当前用户租户下的所有工具 (Skill 优先 + Plugin 兜底) */\n listTools(signal?: AbortSignal): Promise<ToolView[]>;\n /** 获取单个工具详情 */\n getTool(toolID: string, signal?: AbortSignal): Promise<ToolView>;\n }\n}\n\nClient.prototype.listTools = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<ToolListResponse>>('GET', '/tools', null, signal);\n return resp.data.skills;\n};\n\nClient.prototype.getTool = async function (this: Client, toolID: string, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<ToolView>>(\n 'GET',\n `/tools/${encodeURIComponent(toolID)}`,\n null,\n signal,\n );\n return resp.data;\n};\n","// notifications/types.ts — 通知 / WebSocket 推送域类型。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 Notifications / WebSocket 类型 段。\n//\n// 命名约定:字段名 = Go json tag 字面量 (wire format), 不做 camelCase 重映射。\n\n// =============================================================================\n// Notifications\n// =============================================================================\n\n/** 单条通知 */\nexport interface Notification {\n id: string;\n title: string;\n content: string;\n /** system | billing | security | task | commission | entitlement */\n type: string;\n isRead: boolean;\n createdAt: string;\n}\n\n/** 分页通知列表 */\nexport interface NotificationList {\n list: Notification[];\n unreadCount: number;\n total: number;\n page: number;\n pageSize: number;\n}\n\n/** 未读通知计数 */\nexport interface NotificationUnreadCount {\n unreadCount: number;\n}\n\n/** 通知偏好 (按类型+渠道) */\nexport interface NotificationPreference {\n typeCode: string;\n channelInApp: boolean;\n channelEmail: boolean;\n channelSms: boolean;\n channelPush: boolean;\n}\n\n/** 推送设备注册 */\nexport interface DeviceRegistration {\n /** android | ios | harmony */\n platform: string;\n token: string;\n appVersion: string;\n}\n\n// =============================================================================\n// WebSocket 类型 (forward-declared 这里, 实现在 ws.ts)\n// =============================================================================\n\n/** 服务端推送事件 */\nexport interface WSEvent {\n type: string;\n topic?: string;\n /** json.RawMessage in Go */\n data?: unknown;\n connId?: string;\n timestamp?: string;\n message?: string;\n}\n\n/**\n * 从 WSEvent 中解析通知\n * 返回 null 表示该事件不是系统通知\n */\nexport function parseNotificationEvent(ev: WSEvent): Notification | null {\n if (ev.type !== 'event' || ev.topic !== 'system') {\n return null;\n }\n if (ev.data == null) return null;\n let n: Notification;\n try {\n // ev.data 在 wire 上是 raw JSON, 但 JSON.parse 接收 string;\n // 接收方反序列化时可能已经是对象。两种形态都接住:\n if (typeof ev.data === 'string') {\n n = JSON.parse(ev.data);\n } else {\n n = ev.data as Notification;\n }\n } catch {\n return null;\n }\n if (!n.id) return null;\n return n;\n}\n","// client/notifications.ts — 端口自 acosmi-sdk-go/client.go (Notifications section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n DeviceRegistration,\n NotificationList,\n NotificationPreference,\n NotificationUnreadCount,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 分页查询通知列表 */\n listNotifications(\n page: number,\n pageSize: number,\n typeFilter: string,\n signal?: AbortSignal,\n ): Promise<NotificationList>;\n /** 获取未读通知数量 */\n getUnreadCount(signal?: AbortSignal): Promise<number>;\n /** 标记单条通知已读 */\n markNotificationRead(id: string, signal?: AbortSignal): Promise<void>;\n /** 标记全部通知已读 */\n markAllNotificationsRead(signal?: AbortSignal): Promise<void>;\n /** 删除通知 */\n deleteNotification(id: string, signal?: AbortSignal): Promise<void>;\n /** 注册推送设备 token */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n registerDevice(reg: DeviceRegistration, signal?: AbortSignal): Promise<void>;\n /** 注销推送设备 token */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n unregisterDevice(token: string, signal?: AbortSignal): Promise<void>;\n /** 获取通知偏好设置 */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n listNotificationPreferences(signal?: AbortSignal): Promise<NotificationPreference[]>;\n /** 更新通知偏好 */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n updateNotificationPreference(\n typeCode: string,\n pref: NotificationPreference,\n signal?: AbortSignal,\n ): Promise<void>;\n }\n}\n\nClient.prototype.listNotifications = async function (\n this: Client,\n page: number,\n pageSize: number,\n typeFilter: string,\n signal?: AbortSignal,\n) {\n let path = `/notifications?page=${page}&pageSize=${pageSize}`;\n if (typeFilter) path += `&type=${encodeURIComponent(typeFilter)}`;\n const resp = await this.doJSON<APIResponse<NotificationList>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.getUnreadCount = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<NotificationUnreadCount>>(\n 'GET',\n '/notifications/unread-count',\n null,\n signal,\n );\n return resp.data.unreadCount;\n};\n\nClient.prototype.markNotificationRead = async function (\n this: Client,\n id: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'PUT',\n `/notifications/${encodeURIComponent(id)}/read`,\n null,\n signal,\n );\n};\n\nClient.prototype.markAllNotificationsRead = async function (this: Client, signal?: AbortSignal) {\n await this.doJSON<APIResponse<unknown>>('PUT', '/notifications/read-all', null, signal);\n};\n\nClient.prototype.deleteNotification = async function (\n this: Client,\n id: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'DELETE',\n `/notifications/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n};\n\nClient.prototype.registerDevice = async function (\n this: Client,\n reg: DeviceRegistration,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>('POST', '/devices/register', reg, signal);\n};\n\nClient.prototype.unregisterDevice = async function (\n this: Client,\n token: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'DELETE',\n `/devices/${encodeURIComponent(token)}`,\n null,\n signal,\n );\n};\n\nClient.prototype.listNotificationPreferences = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<NotificationPreference[]>>(\n 'GET',\n '/notification-preferences',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.updateNotificationPreference = async function (\n this: Client,\n typeCode: string,\n pref: NotificationPreference,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'PUT',\n `/notification-preferences/${encodeURIComponent(typeCode)}`,\n pref,\n signal,\n );\n};\n","// ws.ts — 端口自 acosmi-sdk-go/ws.go (308 行)\n//\n// WebSocket 长连接 — Client.prototype 扩展。\n// 跨端: 浏览器原生 / Node 22+ 原生 / Node 18-21 + 'ws' 包 (用户自行 polyfill)\n//\n// Go 用 gorilla/websocket, TS 用全局 WebSocket constructor。\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { WSEvent } from './types';\nimport { Client } from '../core/client';\nimport { maxErrorBodySize, parseHTTPErrorWithHeader, readLimited } from '../core/http';\nimport type { CredentialSnapshot } from '../core/store';\n\n/** WebSocket 长连接配置 */\nexport interface WSConfig {\n /** 收到服务端事件回调 */\n onEvent?: (ev: WSEvent) => void;\n /** 连接建立回调 */\n onConnect?: () => void;\n /** 断线回调 */\n onDisconnect?: (err: unknown) => void;\n /** 自动订阅的主题 */\n topics?: string[];\n /** 最小重连间隔 (ms, 默认 2000) */\n reconnectMinMs?: number;\n /** 最大重连间隔 (ms, 默认 60000) */\n reconnectMaxMs?: number;\n /** 是否自动重连 (默认 true) */\n autoReconnect?: boolean;\n}\n\ninterface WSStateImpl {\n conn: WebSocket | null;\n cfg: Required<WSConfig>;\n abort: AbortController;\n done: Promise<void>;\n doneResolve: () => void;\n connected: boolean;\n owner: WSOwner | null;\n}\n\ntype WSOwner = Pick<CredentialSnapshot, 'storeInstanceId' | 'authSessionId' | 'principal'>;\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 建立 WebSocket 长连接 — 等待首次连接成功或 abort。\n */\n connect(cfg: WSConfig, signal?: AbortSignal): Promise<void>;\n\n /** 优雅断开 WebSocket 连接 */\n disconnect(): Promise<void>;\n\n /** WebSocket 是否已连接 */\n isConnected(): boolean;\n }\n}\n\nClient.prototype.connect = async function (this: Client, cfg: WSConfig, signal?: AbortSignal) {\n // 幂等化重复 connect: 已有连接/重连 loop 时先优雅断开旧的, 否则旧 wsLoop 的后台\n // 自动重连定时器会和新连接并存 → 多个 WebSocket + 多个 setTimeout loop 泄漏 (FD + 内存)。\n // disconnect() 会 abort 旧 ws、关旧 conn、并等待旧读循环退出 (最多 5s)。\n const oldDisconnect = this.ws ? this.disconnect() : Promise.resolve();\n\n const noop = () => {};\n const filledCfg: Required<WSConfig> = {\n onEvent: cfg.onEvent ?? noop,\n onConnect: cfg.onConnect ?? noop,\n onDisconnect: cfg.onDisconnect ?? noop,\n topics: cfg.topics ?? [],\n reconnectMinMs: cfg.reconnectMinMs ?? 2000,\n reconnectMaxMs: cfg.reconnectMaxMs ?? 60_000,\n autoReconnect: cfg.autoReconnect ?? true,\n };\n\n let resolveDone!: () => void;\n const done = new Promise<void>((r) => {\n resolveDone = r;\n });\n\n const abort = new AbortController();\n if (signal) {\n if (signal.aborted) abort.abort();\n else signal.addEventListener('abort', () => abort.abort());\n }\n\n const ws: WSStateImpl = {\n conn: null,\n cfg: filledCfg,\n abort,\n done,\n doneResolve: resolveDone,\n connected: false,\n owner: null,\n };\n\n // Register before the first await so disconnect/replacement can cancel a\n // ticket request or handshake that has not produced a socket yet.\n this.ws = ws as unknown as Client['ws'];\n try {\n await oldDisconnect;\n await assertCurrent(this, ws);\n await wsConnectOnce(this, ws);\n } catch (error) {\n ws.abort.abort();\n if (this.ws === ws as unknown as Client['ws']) this.ws = null;\n ws.doneResolve();\n throw error;\n }\n\n // 后台读循环 + 自动重连\n void wsLoop(this, ws);\n};\n\nClient.prototype.disconnect = async function (this: Client) {\n const ws = this.ws as unknown as WSStateImpl | null;\n this.ws = null;\n if (!ws) return;\n\n ws.abort.abort();\n ws.connected = false;\n\n if (ws.conn) {\n try {\n ws.conn.close(1000, '');\n } catch {\n /* ignore */\n }\n }\n\n // 等待读循环退出 (最多 5s)\n await Promise.race([\n ws.done,\n new Promise<void>((resolve) => setTimeout(resolve, 5000)),\n ]);\n};\n\nClient.prototype.isConnected = function (this: Client) {\n const ws = this.ws as unknown as WSStateImpl | null;\n if (!ws) return false;\n return ws.connected;\n};\n\n// ============================================================================\n// 内部实现\n// ============================================================================\n\nfunction wsURL(c: Client): string {\n const base = c.apiURL('/ws');\n return base.replace(/^http:\\/\\//, 'ws://').replace(/^https:\\/\\//, 'wss://');\n}\n\nfunction getWebSocketCtor(): typeof WebSocket {\n const WSCtor = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n if (!WSCtor) {\n throw new Error(\n 'WebSocket not available — on Node ≤21 set globalThis.WebSocket = require(\"ws\") before connect',\n );\n }\n return WSCtor;\n}\n\nfunction sameOwner(a: WSOwner | null, b: WSOwner | null): boolean {\n return a?.storeInstanceId === b?.storeInstanceId &&\n a?.authSessionId === b?.authSessionId &&\n a?.principal?.issuer === b?.principal?.issuer &&\n a?.principal?.subject === b?.principal?.subject &&\n a?.principal?.organizationId === b?.principal?.organizationId;\n}\n\nasync function readOwner(c: Client, signal: AbortSignal): Promise<WSOwner | null> {\n if (c.credentialMode !== 'versioned') return null;\n const snapshot = await c.getCredentialSnapshot(signal);\n return { storeInstanceId: snapshot.storeInstanceId, authSessionId: snapshot.authSessionId,\n principal: snapshot.principal };\n}\n\nasync function assertCurrent(c: Client, ws: WSStateImpl): Promise<void> {\n if (ws.abort.signal.aborted || c.ws !== ws as unknown as Client['ws']) throw new Error('websocket connection superseded');\n if (ws.owner !== null && !sameOwner(ws.owner, await readOwner(c, ws.abort.signal))) {\n ws.abort.abort();\n throw new Error('websocket credential owner changed');\n }\n}\n\nasync function wsConnectOnce(c: Client, ws: WSStateImpl): Promise<void> {\n const observedOwner = await readOwner(c, ws.abort.signal);\n if (ws.owner === null) ws.owner = observedOwner;\n else if (!sameOwner(ws.owner, observedOwner)) throw new Error('websocket credential owner changed');\n await assertCurrent(c, ws);\n const url = wsURL(c);\n const WSCtor = getWebSocketCtor();\n\n // 鉴权 — 一次性 stream ticket 流程 (D7 根因修复).\n // 网关 /ws 守卫为 StreamTicketOr(...): 优先消费 ?ticket=, 回退读 Authorization\n // **请求头** (extractBearerToken), 而非旧实现假设的 ?token= query。浏览器原生\n // WebSocket 无法传自定义 header, 故旧的 ?token= 既对浏览器失效, 又把长效 JWT\n // 明文暴露在反代/网关/devtools 的 access log 里。\n //\n // 现改为: 每次 (重)连接前用已鉴权客户端 POST /ws/stream-ticket 换一张短时\n // 一次性 ticket (~30-60s TTL, 单次使用), 放入 ?ticket= query。ticket 即便落日志\n // 也已失效, 不泄露长效凭证。重连必须重新铸新 ticket (旧 ticket 已被消费/过期)。\n const token = await c.ensureToken(ws.abort.signal);\n await assertCurrent(c, ws);\n const ticketURL = c.apiURL('/ws/stream-ticket');\n await assertCurrent(c, ws);\n const ticketHTTP = await c.doRequest({ method: 'POST', url: ticketURL,\n headers: { Authorization: `Bearer ${token}` } }, ws.abort.signal);\n if (!ticketHTTP.ok) {\n const body = ticketHTTP.body ? await readLimited(ticketHTTP.body, maxErrorBodySize) : new Uint8Array();\n throw parseHTTPErrorWithHeader(ticketHTTP.status, body, ticketHTTP.headers);\n }\n const ticketResp = await ticketHTTP.json() as APIResponse<{ ticket: string; expiresIn: number }>;\n await assertCurrent(c, ws);\n const ticket = ticketResp.data.ticket;\n\n const u = new URL(url);\n u.searchParams.set('ticket', ticket);\n\n let conn: WebSocket;\n try {\n conn = new WSCtor(u.toString());\n } catch (e) {\n throw new Error(`dial: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n // 等待 open + welcome 消息\n await new Promise<void>((resolve, reject) => {\n let opened = false;\n const handshakeTimer = setTimeout(() => {\n if (!opened) {\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error('dial: handshake timeout'));\n }\n }, 30_000);\n const abortHandshake = () => {\n clearTimeout(handshakeTimer);\n try { conn.close(); } catch { /* ignore */ }\n reject(new Error('websocket connection aborted'));\n };\n ws.abort.signal.addEventListener('abort', abortHandshake, { once: true });\n\n conn.addEventListener('open', () => {\n if (ws.abort.signal.aborted || c.ws !== ws as unknown as Client['ws']) {\n try { conn.close(); } catch { /* ignore */ }\n return;\n }\n opened = true;\n });\n\n conn.addEventListener('error', (e: Event) => {\n clearTimeout(handshakeTimer);\n ws.abort.signal.removeEventListener('abort', abortHandshake);\n reject(new Error(`dial: ${(e as ErrorEvent).message ?? 'connection error'}`));\n });\n\n conn.addEventListener('message', (e: MessageEvent) => {\n // 第一条 message 应为 welcome\n try {\n const msg = e.data as string;\n const welcome = JSON.parse(msg) as WSEvent;\n if (welcome.type !== 'welcome') {\n clearTimeout(handshakeTimer);\n ws.abort.signal.removeEventListener('abort', abortHandshake);\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`unexpected first message: ${welcome.type}`));\n return;\n }\n void assertCurrent(c, ws).then(() => {\n clearTimeout(handshakeTimer);\n ws.abort.signal.removeEventListener('abort', abortHandshake);\n ws.conn = conn;\n ws.connected = true;\n\n // 自动订阅主题\n if (ws.cfg.topics.length > 0) {\n try {\n conn.send(\n JSON.stringify({\n type: 'subscribe',\n topics: ws.cfg.topics,\n }),\n );\n } catch (sendErr) {\n ws.conn = null;\n ws.connected = false;\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`send subscribe: ${sendErr instanceof Error ? sendErr.message : String(sendErr)}`));\n return;\n }\n }\n\n ws.cfg.onConnect();\n // eslint-disable-next-line no-console\n console.log(`[acosmi-sdk] websocket connected, connId=${welcome.connId ?? ''}`);\n resolve();\n }).catch(reject);\n } catch (parseErr) {\n clearTimeout(handshakeTimer);\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`parse welcome: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`));\n }\n }, { once: true });\n });\n}\n\nasync function wsLoop(c: Client, ws: WSStateImpl): Promise<void> {\n try {\n while (true) {\n // 读循环\n await wsReadLoop(c, ws);\n\n // 检查是否该退出\n if (ws.abort.signal.aborted) return;\n\n // 关闭旧连接, 防止 FD 泄漏\n if (ws.conn) {\n try {\n ws.conn.close();\n } catch {\n /* ignore */\n }\n ws.conn = null;\n }\n ws.connected = false;\n\n if (!ws.cfg.autoReconnect) return;\n\n // 自动重连 (指数退避)\n let delay = ws.cfg.reconnectMinMs;\n while (true) {\n if (ws.abort.signal.aborted) return;\n await sleepWithSignal(delay, ws.abort.signal).catch(() => {\n /* aborted */\n });\n if (ws.abort.signal.aborted) return;\n\n // eslint-disable-next-line no-console\n console.log(`[acosmi-sdk] websocket reconnecting (delay=${delay}ms)...`);\n try {\n await wsConnectOnce(c, ws);\n break; // 重连成功\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(`[acosmi-sdk] websocket reconnect failed: ${err instanceof Error ? err.message : String(err)}`);\n delay = Math.min(delay * 2, ws.cfg.reconnectMaxMs);\n }\n }\n }\n } finally {\n ws.doneResolve();\n }\n}\n\nasync function wsReadLoop(c: Client, ws: WSStateImpl): Promise<void> {\n const conn = ws.conn;\n if (!conn) return;\n\n return new Promise<void>((resolve) => {\n const handleMessage = (e: MessageEvent) => {\n try {\n const data = e.data as string;\n const event = JSON.parse(data) as WSEvent;\n void assertCurrent(c, ws).then(() => {\n try { ws.cfg.onEvent(event); } catch { /* observer isolation */ }\n }).catch(() => {\n try { conn.close(); } catch { /* ignore */ }\n });\n } catch {\n // 解析失败忽略\n }\n };\n\n const handleClose = (e: CloseEvent) => {\n conn.removeEventListener('message', handleMessage);\n conn.removeEventListener('close', handleClose);\n conn.removeEventListener('error', handleError);\n try {\n ws.cfg.onDisconnect(new Error(`closed: code=${e.code} reason=${e.reason}`));\n } catch {\n // ignore\n }\n resolve();\n };\n\n const handleError = (e: Event) => {\n conn.removeEventListener('message', handleMessage);\n conn.removeEventListener('close', handleClose);\n conn.removeEventListener('error', handleError);\n try {\n ws.cfg.onDisconnect(e);\n } catch {\n // ignore\n }\n resolve();\n };\n\n conn.addEventListener('message', handleMessage);\n conn.addEventListener('close', handleClose);\n conn.addEventListener('error', handleError);\n\n if (ws.abort.signal.aborted) {\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n } else {\n ws.abort.signal.addEventListener(\n 'abort',\n () => {\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n },\n { once: true },\n );\n }\n });\n}\n\nasync function sleepWithSignal(ms: number, signal: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n if (signal.aborted) throw new Error('aborted');\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n signal.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n const abortHandler = () => {\n clearTimeout(t);\n signal.removeEventListener('abort', abortHandler);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n });\n}\n","// Agent Runs public SDK protocol.\n//\n// Public TypeScript API uses camelCase. The HTTP wire protocol uses snake_case\n// and is converted in client/agent-runs.ts.\n\nimport type {\n AdapterKind,\n PermissionPolicy,\n RunnerKind,\n WorkspacePolicy,\n} from './remote-control';\n\nexport type AgentRunStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Remote-control runtime selector (Phase 3 / contract §3).\n * - 'standard' existing chat/workflow path (default; backward compatible)\n * - 'crabcode_remote' CrabCode remote-control session; requires runner + adapter\n */\nexport type AgentRunRuntime = 'standard' | 'crabcode_remote';\n\nexport interface AgentRunLocalContextPolicy {\n enabled?: boolean;\n readonly?: boolean;\n maxBytes?: number;\n allowedTools?: string[];\n}\n\nexport interface AgentRunArtifactPolicy {\n enabled?: boolean;\n maxFiles?: number;\n}\n\n/**\n * Run metadata 约定键 (契约 §18.3 r4, additive)。\n *\n * 服务端防滥用上限: ≤32 条 / 键 ≤64B / 值 ≤2KB (`validateAgentRunMetadata`)。\n * - `title` 列表显示标题; 缺省由服务端从 input 首行派生 (60 rune 截断)。\n * - `workspace` 用户声明的期望项目目录; desktop runner 经\n * `revealRemoteToken()` 响应的 `workspace` 字段回传, 由桌面 launcher\n * 决定是否 chdir 采纳 (路径不存在/越权时回退本机当前目录并提示)。\n */\nexport const AGENT_RUN_META_TITLE = 'title';\nexport const AGENT_RUN_META_WORKSPACE = 'workspace';\n\nexport interface AgentRunCreateRequest {\n appId: string;\n mode?: string;\n sessionId?: string;\n input: string;\n messages?: unknown[];\n model?: string;\n activeSkillIds?: string[];\n knowledgeBaseIds?: string[];\n /**\n * 自由 KV 元数据。远控 run 的约定键见 {@link AGENT_RUN_META_TITLE} /\n * {@link AGENT_RUN_META_WORKSPACE} (契约 §18.3 r4)。\n */\n metadata?: Record<string, string>;\n localContextPolicy?: AgentRunLocalContextPolicy;\n artifactPolicy?: AgentRunArtifactPolicy;\n\n // Phase 3+ remote-control extension (contract §3 / ADR-2):\n // When `runtime === 'crabcode_remote'`, `runner` + `adapter` are required and\n // the per-session permission/workspace policies are sent to the gateway.\n // Wire-format snake_case; SDK forwards even on older backends that ignore\n // unknown fields (forward compatible by design).\n runtime?: AgentRunRuntime;\n runner?: RunnerKind;\n adapter?: AdapterKind;\n permissionPolicy?: PermissionPolicy;\n workspacePolicy?: WorkspacePolicy;\n /**\n * BYO 模型密钥公开引用 (契约 §18.2; 仅远控 runtime + runner='cloud')。\n * 只传 `crabcodeByok.create()` 返回的 credentialRef; 明文/密文绝不过此请求 —\n * 解密只发生在网关 launchCloudRunner 的子进程 env 注入点。\n */\n byokCredentialRef?: string;\n}\n\n/**\n * Narrow type for `agentRuns.createRemoteRun(req)`:\n * - runtime is fixed to `'crabcode_remote'`;\n * - runner + adapter are required;\n * - inherits everything else from AgentRunCreateRequest.\n */\nexport interface AgentRunRemoteCreateRequest extends AgentRunCreateRequest {\n runtime: 'crabcode_remote';\n runner: RunnerKind;\n adapter: AdapterKind;\n}\n\n// 注: streamRemoteControl 不接受 options。按契约 §4, `error` 事件恒为非终结\n// (终结性错误由 `done.reason` / `done.final_status` 承载), 流仅在 `done` / `settle`\n// 终结事件后自然结束, 从不抛异常; 因此无需 yield/throw 开关 (此前的\n// RemoteControlStreamOptions.yieldNonTerminalErrors 是从不被读取的 no-op, 已删除)。\n\nexport interface AgentRun {\n runId: string;\n sessionId: string;\n appId?: string;\n mode?: string;\n status: AgentRunStatus;\n createdAt?: string;\n startedAt?: string;\n completedAt?: string;\n error?: AgentRunErrorPayload;\n metadata?: Record<string, string>;\n // 远控元数据 (Phase 5C 控制台列表; 标准 run 为 'standard'/缺省)。\n // view 永不携带 session token / policy / messages 任何形态 (契约 §6)。\n runtime?: AgentRunRuntime | string;\n runner?: RunnerKind | string;\n adapter?: AdapterKind | string;\n}\n\n/** `agentRuns.list()` 过滤/分页参数 (GET /agent-runs, Phase 5C 控制台)。 */\nexport interface AgentRunListOptions {\n /** 按 runtime 过滤, 例 'crabcode_remote' (远控控制台列表)。 */\n runtime?: AgentRunRuntime | string;\n /** 按状态过滤, 例 'running'。 */\n status?: AgentRunStatus | string;\n /** 页码, 1 起; 缺省 1。 */\n page?: number;\n /** 每页条数; 缺省 20, 服务端上限 100。 */\n pageSize?: number;\n}\n\n/** `agentRuns.list()` 结果 — 分页形状对齐 listConsumeRecords ({records,total,page,pageSize})。 */\nexport interface AgentRunListResult {\n records: AgentRun[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport interface AgentRunCreateResponse {\n runId: string;\n sessionId: string;\n status: AgentRunStatus;\n}\n\nexport interface AgentRunArtifact {\n id: string;\n filename: string;\n contentType?: string;\n size?: number;\n type?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface AgentRunArtifactList {\n artifacts: AgentRunArtifact[];\n}\n\nexport interface AgentRunDownload {\n data: Uint8Array;\n filename: string;\n contentType?: string;\n}\n\nexport interface AgentRunUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheCreateTokens?: number;\n exact?: boolean;\n source?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentRunSettlement {\n requestId?: string;\n status?: string;\n consumeStatus?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheCreateTokens?: number;\n tokenRemaining?: number;\n callRemaining?: number;\n retryQueued?: boolean;\n exact?: boolean;\n [key: string]: unknown;\n}\n\nexport interface AgentRunErrorPayload {\n code?: string;\n message: string;\n stage?: string;\n retryable?: boolean;\n /** 窗口限额场景 (code=\"window_limit_exceeded\"): 触发的窗口档位 \"FIVE_HOUR\" | \"WEEKLY\" */\n windowKind?: string;\n /** 窗口限额场景: 预计恢复时间 (ISO-8601 UTC) */\n windowResetAt?: string;\n /**\n * [W1 2026-07-11 软限额] 窗口限额场景: 该拒绝可否被用户「继续」开关豁免 (5h 严格模式=true;\n * 周窗/显式禁止/灰度关=false)。老网关不返回 (omitempty) → 缺失, 客户端按硬等待处理。\n */\n windowOverridable?: boolean;\n raw?: unknown;\n}\n\nexport interface AgentRunLocalToolResult {\n requestId: string;\n ok: boolean;\n content?: unknown;\n error?: string;\n}\n\nexport interface AgentRunLocalToolHandlerContext {\n runId: string;\n requestId: string;\n name: string;\n signal: AbortSignal;\n}\n\nexport type AgentRunLocalToolHandler = (\n input: unknown,\n context: AgentRunLocalToolHandlerContext,\n) => Promise<unknown> | unknown;\n\nexport interface AgentRunStreamOptions {\n /**\n * true by default. When enabled, an error event is converted into\n * AgentRunStreamError after the event has been parsed.\n */\n throwOnError?: boolean;\n}\n\nexport interface AgentRunRunOptions extends AgentRunStreamOptions {}\n\nexport interface AgentRunWithLocalToolsOptions extends AgentRunRunOptions {\n timeoutMs?: number;\n onEvent?: (event: AgentRunStreamEvent) => void | Promise<void>;\n}\n\nexport type AgentRunStreamEvent =\n | { type: 'run_started'; runId: string; sessionId: string }\n | { type: 'status'; status: AgentRunStatus | string; message?: string }\n | { type: 'text_delta'; text: string }\n | { type: 'reasoning_delta'; text: string }\n | { type: 'tool_call'; id: string; name: string; input?: unknown }\n | { type: 'tool_result'; id: string; name?: string; result?: unknown; error?: string }\n | { type: 'local_tool_request'; requestId: string; name: string; input: unknown }\n | { type: 'artifact'; artifact: AgentRunArtifact }\n | { type: 'sources'; sources: unknown }\n | { type: 'usage'; usage: AgentRunUsage }\n | { type: 'settle'; settlement: AgentRunSettlement }\n | { type: 'error'; error: AgentRunErrorPayload }\n | { type: 'done'; runId: string; status: AgentRunStatus | string };\n\nexport class AgentRunStreamError extends Error {\n event: Extract<AgentRunStreamEvent, { type: 'error' }>;\n code: string;\n stage: string;\n retryable: boolean;\n\n constructor(event: Extract<AgentRunStreamEvent, { type: 'error' }>) {\n const err = event.error;\n super(err.stage ? `agent run failed: ${err.stage}: ${err.message}` : `agent run failed: ${err.message}`);\n this.name = 'AgentRunStreamError';\n this.event = event;\n this.code = err.code ?? '';\n this.stage = err.stage ?? '';\n this.retryable = err.retryable ?? false;\n }\n}\n","// Acosmi 远程控制 CrabCode 多接入面 — SDK 类型契约 (Phase 3 骨架).\n//\n// 契约源: docs/audit/sdk-remote-control-contract-2026-05-27.md §3-§4 (Phase 0 frozen).\n//\n// 设计纪律:\n// - HTTP wire 协议字段为 snake_case (与 Nexus Go side 一致);\n// - 公开 TypeScript API 一律 camelCase;\n// - `parseRemoteControlEvent` 负责 wire -> TS 翻译, 不识别的 type 返回 null;\n// - 11 个 event type 严格对齐契约 §4, 任何新增需先改契约文档再扩本文件;\n// - 严禁复用旧 chat SSE 名 (intent_confirmation / on_session_reset / sources /\n// reasoning_clear / plan_*); 它们在远控 stream 不再存在 (契约 §4 末)。\n\n// =============================================================================\n// AdapterKind / RunnerKind (契约 §3 placement 矩阵)\n// =============================================================================\n\nexport type AdapterKind =\n | 'remote_io'\n | 'app_server_tcp_ws'\n | 'bridge_ccr'\n | 'app_server_uds'\n | 'stdio_stream_json'\n | 'tauri_managed_app_server';\n\nexport type RunnerKind = 'cloud' | 'desktop' | 'local_embedded';\n\n// =============================================================================\n// Workspace / Permission Policy (与 Go side 字段名一致)\n// =============================================================================\n\nexport interface WorkspacePolicy {\n readOnly?: boolean;\n allowedPaths?: string[];\n deniedPaths?: string[];\n maxBytes?: number;\n}\n\nexport interface PermissionPolicy {\n shellAllowed?: boolean;\n shellDenyList?: string[];\n networkAllowed?: boolean;\n writeAllowed?: boolean;\n approvalTimeoutMs?: number;\n requiredActors?: string[];\n}\n\n// =============================================================================\n// Placement / Ref\n// =============================================================================\n\nexport interface RemoteSessionPlacement {\n tenantId: string;\n userId: string;\n appId: string;\n runId: string;\n runner: RunnerKind;\n adapter: AdapterKind;\n ttlMs?: number;\n workspace?: WorkspacePolicy;\n permission?: PermissionPolicy;\n}\n\nexport interface RemoteSessionRef {\n sessionId: string;\n runId: string;\n tenantId: string;\n userId: string;\n adapter: AdapterKind;\n createdAt?: string;\n expiresAt?: string;\n}\n\n// =============================================================================\n// Event union (契约 §4 — 11 种事件, 严禁扩展)\n// =============================================================================\n\nexport type RemoteControlEventType =\n | 'text_delta'\n | 'reasoning_delta'\n | 'tool_call'\n | 'tool_result'\n | 'permission_request'\n | 'permission_result'\n | 'usage'\n | 'settle'\n | 'status'\n | 'error'\n | 'done';\n\nexport interface RemoteControlTextDelta {\n type: 'text_delta';\n index: number;\n text: string;\n}\n\nexport interface RemoteControlReasoningDelta {\n type: 'reasoning_delta';\n index: number;\n text: string;\n}\n\nexport interface RemoteControlToolCall {\n type: 'tool_call';\n toolCallId: string;\n name: string;\n input?: unknown;\n source?: string;\n}\n\nexport interface RemoteControlToolResult {\n type: 'tool_result';\n toolCallId: string;\n ok: boolean;\n output?: unknown;\n error?: string;\n}\n\nexport interface RemoteControlPermissionRequest {\n type: 'permission_request';\n requestId: string;\n kind: string;\n payload?: unknown;\n deadlineMs?: number;\n}\n\nexport interface RemoteControlPermissionResult {\n type: 'permission_result';\n requestId: string;\n decision: 'allow' | 'deny' | string;\n actor?: string;\n decidedAt?: string;\n}\n\nexport interface RemoteControlUsage {\n type: 'usage';\n inputTokens?: number;\n outputTokens?: number;\n cacheRead?: number;\n cacheCreate?: number;\n exact?: boolean;\n}\n\nexport interface RemoteControlSettle {\n type: 'settle';\n status: string;\n billed?: boolean;\n}\n\nexport interface RemoteControlStatus {\n type: 'status';\n phase:\n | 'created'\n | 'connecting'\n | 'connected'\n | 'running'\n | 'cancelling'\n | 'terminating'\n | string;\n message?: string;\n}\n\nexport interface RemoteControlError {\n type: 'error';\n code: string;\n message: string;\n retryable?: boolean;\n kind?: string;\n}\n\nexport interface RemoteControlDone {\n type: 'done';\n reason: string;\n runId: string;\n finalStatus: string;\n}\n\nexport type RemoteControlEvent =\n | RemoteControlTextDelta\n | RemoteControlReasoningDelta\n | RemoteControlToolCall\n | RemoteControlToolResult\n | RemoteControlPermissionRequest\n | RemoteControlPermissionResult\n | RemoteControlUsage\n | RemoteControlSettle\n | RemoteControlStatus\n | RemoteControlError\n | RemoteControlDone;\n\n// =============================================================================\n// Wire -> TS 解析\n// =============================================================================\n\ntype WireRecord = Record<string, unknown>;\n\nfunction asRecord(v: unknown): WireRecord | null {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) return null;\n return v as WireRecord;\n}\n\nfunction str(rec: WireRecord, key: string): string | undefined {\n const v = rec[key];\n return typeof v === 'string' ? v : undefined;\n}\n\nfunction num(rec: WireRecord, key: string): number | undefined {\n const v = rec[key];\n return typeof v === 'number' && Number.isFinite(v) ? v : undefined;\n}\n\nfunction bool(rec: WireRecord, key: string): boolean | undefined {\n const v = rec[key];\n return typeof v === 'boolean' ? v : undefined;\n}\n\n/**\n * 把后端 SSE/JSON wire payload 翻译成强类型 RemoteControlEvent。\n *\n * - wire 字段 snake_case (text_delta / tool_call_id / permission_request ...);\n * - TS API 字段 camelCase (toolCallId / requestId ...);\n * - 未知 type / 缺失关键字段返回 null, 调用方应当忽略并打 warn;\n * - 不抛异常: 一律返回 null。\n */\nexport function parseRemoteControlEvent(raw: unknown): RemoteControlEvent | null {\n const rec = asRecord(raw);\n if (!rec) return null;\n const type = str(rec, 'type');\n if (!type) return null;\n\n switch (type as RemoteControlEventType) {\n case 'text_delta': {\n const index = num(rec, 'index');\n const text = str(rec, 'text');\n if (typeof index !== 'number' || typeof text !== 'string') return null;\n return { type: 'text_delta', index, text };\n }\n case 'reasoning_delta': {\n const index = num(rec, 'index');\n const text = str(rec, 'text');\n if (typeof index !== 'number' || typeof text !== 'string') return null;\n return { type: 'reasoning_delta', index, text };\n }\n case 'tool_call': {\n const toolCallId = str(rec, 'tool_call_id') ?? str(rec, 'toolCallId');\n const name = str(rec, 'name');\n if (!toolCallId || !name) return null;\n return {\n type: 'tool_call',\n toolCallId,\n name,\n input: rec['input'],\n source: str(rec, 'source'),\n };\n }\n case 'tool_result': {\n const toolCallId = str(rec, 'tool_call_id') ?? str(rec, 'toolCallId');\n const ok = bool(rec, 'ok');\n if (!toolCallId || typeof ok !== 'boolean') return null;\n return {\n type: 'tool_result',\n toolCallId,\n ok,\n output: rec['output'],\n error: str(rec, 'error'),\n };\n }\n case 'permission_request': {\n const requestId = str(rec, 'request_id') ?? str(rec, 'requestId');\n const kind = str(rec, 'kind');\n if (!requestId || !kind) return null;\n return {\n type: 'permission_request',\n requestId,\n kind,\n payload: rec['payload'],\n deadlineMs: num(rec, 'deadline_ms') ?? num(rec, 'deadlineMs'),\n };\n }\n case 'permission_result': {\n const requestId = str(rec, 'request_id') ?? str(rec, 'requestId');\n const decision = str(rec, 'decision');\n if (!requestId || !decision) return null;\n return {\n type: 'permission_result',\n requestId,\n decision,\n actor: str(rec, 'actor'),\n decidedAt: str(rec, 'decided_at') ?? str(rec, 'decidedAt'),\n };\n }\n case 'usage': {\n return {\n type: 'usage',\n inputTokens: num(rec, 'input_tokens') ?? num(rec, 'inputTokens'),\n outputTokens: num(rec, 'output_tokens') ?? num(rec, 'outputTokens'),\n cacheRead: num(rec, 'cache_read') ?? num(rec, 'cacheRead'),\n cacheCreate: num(rec, 'cache_create') ?? num(rec, 'cacheCreate'),\n exact: bool(rec, 'exact'),\n };\n }\n case 'settle': {\n const status = str(rec, 'status');\n if (!status) return null;\n return { type: 'settle', status, billed: bool(rec, 'billed') };\n }\n case 'status': {\n const phase = str(rec, 'phase');\n if (!phase) return null;\n return { type: 'status', phase, message: str(rec, 'message') };\n }\n case 'error': {\n const code = str(rec, 'code');\n const message = str(rec, 'message');\n if (!code || !message) return null;\n return {\n type: 'error',\n code,\n message,\n retryable: bool(rec, 'retryable'),\n kind: str(rec, 'kind'),\n };\n }\n case 'done': {\n const reason = str(rec, 'reason');\n const runId = str(rec, 'run_id') ?? str(rec, 'runId');\n const finalStatus = str(rec, 'final_status') ?? str(rec, 'finalStatus');\n if (!reason || !runId || !finalStatus) return null;\n return { type: 'done', reason, runId, finalStatus };\n }\n default:\n return null;\n }\n}\n\n/**\n * isTerminalRemoteEvent — 仅 `done` 与 `settle` 终结一个 stream。\n *\n * 注意契约 §4 关于 error:\n * - 终结性错误进入 `done`;\n * - 非终结 error 不结束 stream;\n * 因此 `error` 本身不算 terminal, `done` 才是。\n */\nexport function isTerminalRemoteEvent(ev: RemoteControlEvent): boolean {\n return ev.type === 'done' || ev.type === 'settle';\n}\n\n// =============================================================================\n// 远控管理面请求/响应类型 (契约 §18.1 附录 A; Phase 5B/5C)\n// =============================================================================\n\n/**\n * C 端/平台可下达的 permission 决策 (契约 §14)。\n *\n * 仅 `approved` | `rejected` — `timeout` / `cancelled` 由服务端 reaper/cancel\n * 路径产生, 客户端不可下达。\n */\nexport type RemotePermissionDecision = 'approved' | 'rejected';\n\n/** `agentRuns.submitPermissionResult()` 请求 — 回写 permission_request 的决策。 */\nexport interface RemotePermissionResultRequest {\n /** 对应 permission_request 事件的 requestId。 */\n requestId: string;\n decision: RemotePermissionDecision;\n /** 可选决策理由 (透传给 CrabCode control_response)。 */\n reason?: string;\n}\n\n/** `agentRuns.submitUserMessage()` 请求 — 会话中途追加用户消息 (Phase 5C 输入框)。 */\nexport interface RemoteUserMessageRequest {\n /** 消息正文; 服务端上限 64KB。Role 由服务端硬编码 'user' (契约 §6 #5 防注入)。 */\n content: string;\n /** 幂等键; 缺省由服务端生成并在 ack 中返回。 */\n requestId?: string;\n}\n\n/** `agentRuns.submitUserMessage()` 确认。 */\nexport interface RemoteUserMessageAck {\n ok: boolean;\n /** 服务端最终采用的幂等键 (请求未带时为服务端生成值)。 */\n requestId: string;\n}\n\n/**\n * `agentRuns.revealRemoteToken()` 响应 — desktop launcher 一次性 session token\n * (Phase 5B; 仅 runner='desktop')。\n *\n * 安全红线 (契约 §6): token 一次性消费 (重复调用 409), TTL ≤ 1h; 永不落\n * 浏览器存储 (localStorage/cookie), 应由 native 层接收后只注入 CrabCode\n * 子进程 env。\n */\nexport interface RemoteSessionTokenGrant {\n accessToken: string;\n /** CrabCode 回连的 RemoteIO WS 完整地址 (公网 wss 基址 + run 路径 + tenant_id)。 */\n sessionUrl: string;\n tenantId: string;\n /**\n * 用户在 metadata.workspace 声明的期望项目目录 (契约 §18.3 r4); 缺省 undefined。\n * 桌面端决定是否 chdir 采纳 (路径不存在/越权时回退并提示)。\n */\n workspace?: string;\n}\n","// client/agent-runs.ts — SDK-facing Agent Run Gateway client.\n\nimport type { APIResponse } from '../shared/api-response';\nimport { apiResponseBusinessError } from '../shared/api-response';\nimport { isUserAccessTokenRejected } from '../shared/errors';\nimport { Client, DEFAULT_API_TIMEOUT_MS } from '../core/client';\nimport {\n iterSSELines,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../core/http';\nimport {\n AgentRunStreamError,\n type AgentRun,\n type AgentRunArtifact,\n type AgentRunCreateRequest,\n type AgentRunCreateResponse,\n type AgentRunDownload,\n type AgentRunErrorPayload,\n type AgentRunListOptions,\n type AgentRunListResult,\n type AgentRunLocalToolHandler,\n type AgentRunLocalToolResult,\n type AgentRunRemoteCreateRequest,\n type AgentRunRunOptions,\n type AgentRunStatus,\n type AgentRunStreamEvent,\n type AgentRunStreamOptions,\n type AgentRunWithLocalToolsOptions,\n} from './types';\nimport {\n isTerminalRemoteEvent,\n parseRemoteControlEvent,\n type AdapterKind,\n type PermissionPolicy,\n type RemoteControlEvent,\n type RemotePermissionResultRequest,\n type RemoteSessionTokenGrant,\n type RemoteUserMessageAck,\n type RemoteUserMessageRequest,\n type RunnerKind,\n type WorkspacePolicy,\n} from './remote-control';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** SDK-facing cloud agent run gateway. */\n readonly agentRuns: AgentRunsClient;\n }\n}\n\nconst agentRunsByClient = new WeakMap<Client, AgentRunsClient>();\n\nObject.defineProperty(Client.prototype, 'agentRuns', {\n configurable: true,\n enumerable: false,\n get(this: Client): AgentRunsClient {\n let existing = agentRunsByClient.get(this);\n if (!existing) {\n existing = new AgentRunsClient(this);\n agentRunsByClient.set(this, existing);\n }\n return existing;\n },\n});\n\nexport class AgentRunsClient {\n constructor(private readonly client: Client) {}\n\n async create(\n req: AgentRunCreateRequest,\n signal?: AbortSignal,\n ): Promise<AgentRunCreateResponse> {\n const resp = await this.requestAPI<WireAgentRunCreateResponse>(\n 'POST',\n '/agent-runs',\n toWireCreateRequest(req),\n signal,\n { retryOn401: false },\n );\n return fromWireCreateResponse(resp);\n }\n\n /**\n * List the caller's own agent runs, newest first (GET /agent-runs, Phase 5C\n * console). Returns view metadata only — never session tokens, policies or\n * messages (contract §6). Filter remote-control runs with\n * `{ runtime: 'crabcode_remote' }`.\n */\n async list(\n opts: AgentRunListOptions = {},\n signal?: AbortSignal,\n ): Promise<AgentRunListResult> {\n const params = new URLSearchParams();\n if (opts.runtime) params.set('runtime', opts.runtime);\n if (opts.status) params.set('status', opts.status);\n if (opts.page != null) params.set('page', String(opts.page));\n if (opts.pageSize != null) params.set('page_size', String(opts.pageSize));\n const qs = params.toString();\n const resp = await this.requestAPI<WireAgentRunListResult>(\n 'GET',\n `/agent-runs${qs ? `?${qs}` : ''}`,\n null,\n signal,\n { retryOn401: true },\n );\n return {\n records: (resp.records ?? []).map(fromWireRun),\n total: typeof resp.total === 'number' ? resp.total : 0,\n page: typeof resp.page === 'number' ? resp.page : 1,\n pageSize: typeof resp.pageSize === 'number' ? resp.pageSize : 20,\n };\n }\n\n get(runId: string, signal?: AbortSignal): Promise<AgentRun> {\n return this.requestAPI<WireAgentRun>(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}`,\n null,\n signal,\n { retryOn401: true },\n ).then(fromWireRun);\n }\n\n stream(\n runId: string,\n opts: AgentRunStreamOptions = {},\n signal?: AbortSignal,\n ): AsyncIterable<AgentRunStreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.streamGen(runId, opts, signal),\n };\n }\n\n cancel(runId: string, signal?: AbortSignal): Promise<AgentRun> {\n return this.requestAPI<WireAgentRun>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/cancel`,\n {},\n signal,\n { retryOn401: false },\n ).then(fromWireRun);\n }\n\n /**\n * Create a CrabCode remote-control agent run (contract §3, ADR-2 + ADR-5).\n *\n * Equivalent to `create()` with `runtime: 'crabcode_remote'` and the required\n * `runner` + `adapter` fields set. Per-session policies (permission/workspace)\n * are forwarded to the gateway, which is the only side allowed to enforce\n * them (contract §6). The SDK never enforces remote permissions client-side.\n *\n * The corresponding stream uses `streamRemoteControl(runId)`, NOT `stream()`,\n * because the event union is different (contract §4).\n */\n async createRemoteRun(\n req: AgentRunRemoteCreateRequest,\n signal?: AbortSignal,\n ): Promise<AgentRunCreateResponse> {\n if (req.runtime !== 'crabcode_remote') {\n throw new Error('createRemoteRun: runtime must be \"crabcode_remote\"');\n }\n if (!req.runner) throw new Error('createRemoteRun: runner is required');\n if (!req.adapter) throw new Error('createRemoteRun: adapter is required');\n return this.create(req, signal);\n }\n\n /**\n * Stream remote-control events for a CrabCode remote run (contract §4).\n *\n * Yields the canonical 11-event union: text_delta / reasoning_delta /\n * tool_call / tool_result / permission_request / permission_result /\n * usage / settle / status / error / done.\n *\n * Iteration ends naturally when a terminal event (`done` or `settle`) is\n * observed. Per contract §4, `error` alone is non-terminal — terminal errors\n * are carried by `done.reason` / `done.final_status`.\n *\n * Unknown event types and malformed frames are silently skipped (warn-only),\n * matching `parseRemoteControlEvent`'s null-return contract.\n */\n streamRemoteControl(\n runId: string,\n signal?: AbortSignal,\n ): AsyncIterable<RemoteControlEvent> {\n return {\n [Symbol.asyncIterator]: () => this.streamRemoteControlGen(runId, signal),\n };\n }\n\n /**\n * Submit a permission decision for a pending `permission_request` event\n * (POST /agent-runs/:runId/permission-results, contract §4/§9/§14).\n *\n * Only `approved` | `rejected` may be submitted by clients — `timeout` /\n * `cancelled` are produced server-side. Requires an OAuth token with the\n * explicit `remote_control` scope (or a web JWT). 409 means the remote\n * session is gone (e.g. already terminated).\n */\n async submitPermissionResult(\n runId: string,\n result: RemotePermissionResultRequest,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.requestAPI<{ ok?: boolean }>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/permission-results`,\n {\n request_id: result.requestId,\n decision: result.decision,\n reason: result.reason,\n },\n signal,\n { retryOn401: false },\n );\n }\n\n /**\n * Append a mid-session user message to a remote run\n * (POST /agent-runs/:runId/messages, Phase 5C). The message role is\n * hard-coded to 'user' server-side (contract §6 #5 prompt-injection\n * defence); content is limited to 64KB. Requires the explicit\n * `remote_control` scope (or a web JWT).\n */\n async submitUserMessage(\n runId: string,\n message: RemoteUserMessageRequest,\n signal?: AbortSignal,\n ): Promise<RemoteUserMessageAck> {\n const resp = await this.requestAPI<{ ok?: boolean; request_id?: string }>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/messages`,\n { request_id: message.requestId, content: message.content },\n signal,\n { retryOn401: false },\n );\n return {\n ok: resp?.ok === true,\n requestId: resp?.request_id ?? message.requestId ?? '',\n };\n }\n\n /**\n * Reveal the one-shot remote session token for a desktop-runner run\n * (POST /agent-runs/:runId/remote-token, Phase 5B; contract §18.1).\n *\n * Desktop launcher only: the token is single-consumption (a second call\n * returns 409) and must never touch browser storage — receive it in the\n * native layer and inject it into the CrabCode child-process env only\n * (contract §6). Cloud / local_embedded runners never expose tokens over\n * HTTP (403). Requires the explicit `remote_control` scope.\n */\n async revealRemoteToken(\n runId: string,\n signal?: AbortSignal,\n ): Promise<RemoteSessionTokenGrant> {\n const resp = await this.requestAPI<WireRemoteSessionTokenGrant>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/remote-token`,\n {},\n signal,\n { retryOn401: false },\n );\n return {\n accessToken: resp?.access_token ?? '',\n sessionUrl: resp?.session_url ?? '',\n tenantId: resp?.tenant_id ?? '',\n workspace: resp?.workspace || undefined,\n };\n }\n\n private async *streamRemoteControlGen(\n runId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<RemoteControlEvent, void, void> {\n const resp = await this.requestRaw(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/stream`,\n null,\n signal,\n { retryOn401: true, accept: 'text/event-stream' },\n );\n if (!resp.body) {\n throw new Error('remote-control stream: empty response body');\n }\n for await (const rawEvent of readAgentRunSSEFrames(resp.body)) {\n const ev = parseRemoteControlEvent(rawEvent);\n if (!ev) continue;\n yield ev;\n if (isTerminalRemoteEvent(ev)) return;\n }\n }\n\n listArtifacts(runId: string, signal?: AbortSignal): Promise<AgentRunArtifact[]> {\n return this.requestAPI<WireAgentRunArtifactList>(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/artifacts`,\n null,\n signal,\n { retryOn401: true },\n ).then((r) => (r.artifacts ?? []).map(fromWireArtifact));\n }\n\n async downloadArtifact(\n runId: string,\n artifactId: string,\n signal?: AbortSignal,\n ): Promise<AgentRunDownload> {\n const resp = await this.requestRaw(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/artifacts/${encodeURIComponent(artifactId)}`,\n null,\n signal,\n { retryOn401: true },\n );\n const contentType = resp.headers.get('Content-Type') ?? undefined;\n const filename = filenameFromContentDisposition(resp.headers.get('Content-Disposition')) ?? artifactId;\n // 多读 1 字节探测超限 — 与 skills.downloadSkill 一致, 拒绝静默截断 (否则下游拿到\n // 被砍断的不完整产物却毫无感知)。\n const data = await readLimited(resp.body!, maxDownloadSize + 1);\n if (data.byteLength > maxDownloadSize) {\n throw new Error(`download artifact: response exceeds ${maxDownloadSize >> 20}MB limit`);\n }\n return { data, filename, contentType };\n }\n\n submitLocalToolResult(\n runId: string,\n result: AgentRunLocalToolResult,\n signal?: AbortSignal,\n ): Promise<AgentRun> {\n return this.requestAPI<WireAgentRun>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/local-tool-results`,\n toWireLocalToolResult(result),\n signal,\n { retryOn401: false },\n ).then(fromWireRun);\n }\n\n run(\n req: AgentRunCreateRequest,\n opts: AgentRunRunOptions = {},\n signal?: AbortSignal,\n ): AsyncIterable<AgentRunStreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.runGen(req, opts, signal),\n };\n }\n\n runWithLocalTools(\n req: AgentRunCreateRequest,\n handlers: Record<string, AgentRunLocalToolHandler>,\n opts: AgentRunWithLocalToolsOptions = {},\n signal?: AbortSignal,\n ): AsyncIterable<AgentRunStreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.runWithLocalToolsGen(req, handlers, opts, signal),\n };\n }\n\n private async *runGen(\n req: AgentRunCreateRequest,\n opts: AgentRunRunOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentRunStreamEvent, void, void> {\n const created = await this.create(req, signal);\n yield* this.stream(created.runId, opts, signal);\n }\n\n private async *runWithLocalToolsGen(\n req: AgentRunCreateRequest,\n handlers: Record<string, AgentRunLocalToolHandler>,\n opts: AgentRunWithLocalToolsOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentRunStreamEvent, void, void> {\n let currentRunId = '';\n for await (const event of this.run(req, opts, signal)) {\n if (event.type === 'run_started') {\n currentRunId = event.runId;\n }\n\n if (opts.onEvent) await opts.onEvent(event);\n\n let localToolTask: Promise<void> | undefined;\n if (event.type === 'local_tool_request') {\n if (currentRunId === '') {\n throw new Error('local tool request arrived before run_started');\n }\n localToolTask = this.invokeLocalTool(currentRunId, event, handlers, opts.timeoutMs, signal).then(async (result) => {\n await this.submitLocalToolResult(currentRunId, result, signal);\n });\n }\n\n yield event;\n if (localToolTask) await localToolTask;\n }\n }\n\n private async invokeLocalTool(\n runId: string,\n event: Extract<AgentRunStreamEvent, { type: 'local_tool_request' }>,\n handlers: Record<string, AgentRunLocalToolHandler>,\n timeoutMs = 30_000,\n signal?: AbortSignal,\n ): Promise<AgentRunLocalToolResult> {\n const handler = handlers[event.name];\n if (!handler) {\n return {\n requestId: event.requestId,\n ok: false,\n error: `local tool rejected: no handler for ${event.name}`,\n };\n }\n\n const ctl = new AbortController();\n let parentAbort: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) ctl.abort();\n else {\n parentAbort = () => ctl.abort();\n signal.addEventListener('abort', parentAbort);\n }\n }\n\n // 硬超时根因修复: 即使 handler 完全忽略 ctx.signal (不响应协作式取消) 也不会永挂。\n // Promise.race 一边跑 handler, 一边跑一个在 timeoutMs 后 resolve 为稳定失败结果的\n // promise; 超时方胜出即立刻返回, 不再等 handler。ctl.signal 仍传给 handler 以便\n // 配合的实现尽早收手。\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutResult: Promise<AgentRunLocalToolResult> = new Promise((resolve) => {\n timer = setTimeout(() => {\n ctl.abort(); // 协作式取消提示 (handler 若监听 signal 可尽早退出)\n resolve({\n requestId: event.requestId,\n ok: false,\n error: `local tool timed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n });\n\n const handlerTask: Promise<AgentRunLocalToolResult> = (async () => {\n const content = await handler(event.input, {\n runId,\n requestId: event.requestId,\n name: event.name,\n signal: ctl.signal,\n });\n return { requestId: event.requestId, ok: true, content };\n })();\n // 超时方先胜出时, handler 后续 reject 不能逃逸成未捕获异常。\n handlerTask.catch(() => {});\n\n try {\n return await Promise.race([handlerTask, timeoutResult]);\n } catch (e) {\n // 仅 handler 抢先 reject 会落这里 (超时分支永不 reject)。\n if (signal?.aborted) throw e;\n const timedOut = ctl.signal.aborted;\n return {\n requestId: event.requestId,\n ok: false,\n error: timedOut ? `local tool timed out after ${timeoutMs}ms` : errorMessage(e),\n };\n } finally {\n clearTimeout(timer);\n if (parentAbort && signal) signal.removeEventListener('abort', parentAbort);\n }\n }\n\n private async *streamGen(\n runId: string,\n opts: AgentRunStreamOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentRunStreamEvent, void, void> {\n const resp = await this.requestRaw(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/stream`,\n null,\n signal,\n { retryOn401: true, accept: 'text/event-stream' },\n );\n if (!resp.body) {\n throw new Error('agent run stream: empty response body');\n }\n\n for await (const event of readAgentRunEvents(resp.body)) {\n if (event.type === 'error' && opts.throwOnError !== false) {\n throw new AgentRunStreamError(event);\n }\n yield event;\n }\n }\n\n private async requestAPI<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: RequestOptions,\n ): Promise<T> {\n // 非流式 JSON 请求套默认超时 (调用方可经 opts.timeoutMs 覆盖)。\n // stream / download 路径直接调 requestRaw 且不带 timeoutMs, 保留长连接语义。\n const resp = await this.requestRaw(method, path, body, signal, {\n ...opts,\n timeoutMs: opts.timeoutMs ?? DEFAULT_API_TIMEOUT_MS,\n });\n const text = await resp.text();\n // 空 body 的成功响应 (HTTP 204 / 200 空体) — 不要 JSON.parse('') (抛 SyntaxError)。\n // 与 core doJSONFullInternal / compliance executeJson 一致, 空响应返回 undefined。\n if (!text) return undefined as unknown as T;\n const result = JSON.parse(text) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(result);\n if (bizErr) throw bizErr;\n return result.data;\n }\n\n private async requestRaw(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: RequestOptions,\n retried = false,\n ): Promise<Response> {\n // opts.timeoutMs 仅由非流式 JSON 路径 (requestAPI) 设置 — 用组合 signal (超时 + 用户 signal,\n // 任一触发都 abort) 替换裸 signal; 流式/下载路径不带 timeoutMs, signal 原样透传保留长连接。\n if (opts.timeoutMs != null && opts.timeoutMs > 0) {\n const ctl = this.client.withRequestTimeout(opts.timeoutMs, signal);\n try {\n return await this.requestRawInner(method, path, body, ctl.signal, opts, retried);\n } finally {\n ctl.dispose();\n }\n }\n return this.requestRawInner(method, path, body, signal, opts, retried);\n }\n\n private async requestRawInner(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: RequestOptions,\n retried: boolean,\n ): Promise<Response> {\n const token = await this.client.ensureToken(signal);\n const url = this.client.apiURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n Accept: opts.accept ?? 'application/json',\n };\n let bodyStr: string | undefined;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n headers['Content-Type'] = 'application/json';\n }\n\n const resp = await this.client.doRequest({ method, url, headers, body: bodyStr }, signal);\n\n if (resp.status === 401 && opts.retryOn401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n await this.client.forceRefresh(signal, token);\n // 复用同一组合 signal (含剩余超时预算): 直接走 inner, 不再重套超时。\n return this.requestRawInner(method, path, body, signal, opts, true);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n return resp;\n }\n}\n\ninterface RequestOptions {\n retryOn401: boolean;\n accept?: string;\n /** 非流式 JSON 请求的超时上限 (毫秒); 未设置 = 无超时 (流式/下载路径)。 */\n timeoutMs?: number;\n}\n\ninterface WireAgentRunCreateRequest {\n app_id: string;\n mode?: string;\n session_id?: string;\n input: string;\n messages?: unknown[];\n model?: string;\n active_skill_ids?: string[];\n knowledge_base_ids?: string[];\n metadata?: Record<string, string>;\n local_context_policy?: {\n enabled?: boolean;\n readonly?: boolean;\n max_bytes?: number;\n allowed_tools?: string[];\n };\n artifact_policy?: {\n enabled?: boolean;\n max_files?: number;\n };\n // Phase 3+ remote-control wire fields (contract §3 + §6).\n runtime?: string;\n runner?: RunnerKind;\n adapter?: AdapterKind;\n permission_policy?: WirePermissionPolicy;\n workspace_policy?: WireWorkspacePolicy;\n byok_credential_ref?: string;\n}\n\ninterface WirePermissionPolicy {\n shell_allowed?: boolean;\n shell_deny_list?: string[];\n network_allowed?: boolean;\n write_allowed?: boolean;\n approval_timeout_ms?: number;\n required_actors?: string[];\n}\n\ninterface WireWorkspacePolicy {\n read_only?: boolean;\n allowed_paths?: string[];\n denied_paths?: string[];\n max_bytes?: number;\n}\n\ninterface WireAgentRun {\n run_id?: string;\n session_id?: string;\n app_id?: string;\n mode?: string;\n status?: string;\n created_at?: string;\n started_at?: string;\n completed_at?: string;\n error?: unknown;\n metadata?: Record<string, string>;\n // 远控 view 元数据 (Phase 5C; 标准 run 缺省)。\n runtime?: string;\n runner?: string;\n adapter?: string;\n}\n\n// List 分页信封 — 外层键对齐 listConsumeRecords ({records,total,page,pageSize},\n// 注意 pageSize 是 camelCase), records 内元素仍为 snake_case 的 run view。\ninterface WireAgentRunListResult {\n records?: WireAgentRun[];\n total?: number;\n page?: number;\n pageSize?: number;\n}\n\ninterface WireRemoteSessionTokenGrant {\n access_token?: string;\n session_url?: string;\n tenant_id?: string;\n workspace?: string;\n}\n\ninterface WireAgentRunCreateResponse {\n run_id?: string;\n session_id?: string;\n status?: string;\n}\n\ninterface WireAgentRunArtifact {\n id?: string;\n artifact_id?: string;\n filename?: string;\n name?: string;\n content_type?: string;\n mime_type?: string;\n size?: number;\n type?: string;\n metadata?: Record<string, string>;\n}\n\ninterface WireAgentRunArtifactList {\n artifacts?: WireAgentRunArtifact[];\n}\n\nfunction toWirePermissionPolicy(p: PermissionPolicy): WirePermissionPolicy {\n return {\n shell_allowed: p.shellAllowed,\n shell_deny_list: p.shellDenyList,\n network_allowed: p.networkAllowed,\n write_allowed: p.writeAllowed,\n approval_timeout_ms: p.approvalTimeoutMs,\n required_actors: p.requiredActors,\n };\n}\n\nfunction toWireWorkspacePolicy(p: WorkspacePolicy): WireWorkspacePolicy {\n return {\n read_only: p.readOnly,\n allowed_paths: p.allowedPaths,\n denied_paths: p.deniedPaths,\n max_bytes: p.maxBytes,\n };\n}\n\nfunction toWireCreateRequest(req: AgentRunCreateRequest): WireAgentRunCreateRequest {\n return {\n app_id: req.appId,\n mode: req.mode,\n session_id: req.sessionId,\n input: req.input,\n messages: req.messages,\n model: req.model,\n active_skill_ids: req.activeSkillIds,\n knowledge_base_ids: req.knowledgeBaseIds,\n metadata: req.metadata,\n local_context_policy: req.localContextPolicy\n ? {\n enabled: req.localContextPolicy.enabled,\n readonly: req.localContextPolicy.readonly,\n max_bytes: req.localContextPolicy.maxBytes,\n allowed_tools: req.localContextPolicy.allowedTools,\n }\n : undefined,\n runtime: req.runtime,\n runner: req.runner,\n adapter: req.adapter,\n permission_policy: req.permissionPolicy ? toWirePermissionPolicy(req.permissionPolicy) : undefined,\n workspace_policy: req.workspacePolicy ? toWireWorkspacePolicy(req.workspacePolicy) : undefined,\n byok_credential_ref: req.byokCredentialRef,\n artifact_policy: req.artifactPolicy\n ? {\n enabled: req.artifactPolicy.enabled,\n max_files: req.artifactPolicy.maxFiles,\n }\n : undefined,\n };\n}\n\nfunction toWireLocalToolResult(result: AgentRunLocalToolResult): Record<string, unknown> {\n return {\n request_id: result.requestId,\n ok: result.ok,\n content: result.content,\n error: result.error,\n };\n}\n\nfunction fromWireCreateResponse(resp: WireAgentRunCreateResponse): AgentRunCreateResponse {\n return {\n runId: resp.run_id ?? '',\n sessionId: resp.session_id ?? '',\n status: toStatus(resp.status),\n };\n}\n\nfunction fromWireRun(resp: WireAgentRun): AgentRun {\n return {\n runId: resp.run_id ?? '',\n sessionId: resp.session_id ?? '',\n appId: resp.app_id,\n mode: resp.mode,\n status: toStatus(resp.status),\n createdAt: resp.created_at,\n startedAt: resp.started_at,\n completedAt: resp.completed_at,\n error: normalizeError(resp.error),\n metadata: resp.metadata,\n runtime: resp.runtime,\n runner: resp.runner,\n adapter: resp.adapter,\n };\n}\n\nfunction fromWireArtifact(resp: WireAgentRunArtifact): AgentRunArtifact {\n return {\n id: resp.id ?? resp.artifact_id ?? '',\n filename: resp.filename ?? resp.name ?? resp.id ?? resp.artifact_id ?? 'artifact',\n contentType: resp.content_type ?? resp.mime_type,\n size: typeof resp.size === 'number' ? resp.size : undefined,\n type: resp.type,\n metadata: resp.metadata,\n };\n}\n\n/**\n * readAgentRunSSEFrames — emits raw parsed JSON payloads from the SSE body,\n * one per SSE event. Used by `streamRemoteControl` to feed\n * `parseRemoteControlEvent` (contract §4 union).\n *\n * Skips empty frames, `[DONE]` markers, comments, and JSON parse errors.\n * Returns `event_name` injected into the payload as `__event__` when the\n * payload itself does not carry a `type` field, so downstream parsers can\n * recover the SSE event name.\n */\nasync function* readAgentRunSSEFrames(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>, void, void> {\n let eventName = '';\n let dataLines: string[] = [];\n\n const flush = (): Record<string, unknown> | null => {\n if (dataLines.length === 0) return null;\n const data = dataLines.join('\\n');\n dataLines = [];\n if (data === '[DONE]') return null;\n try {\n const parsed = JSON.parse(data);\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as Record<string, unknown>;\n if (!('type' in obj) && eventName) {\n obj.type = eventName;\n }\n return obj;\n }\n } catch {\n // malformed frame: skip\n }\n return null;\n };\n\n for await (const line of iterSSELines(body)) {\n if (line === '') {\n const frame = flush();\n eventName = '';\n if (frame) yield frame;\n continue;\n }\n if (line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n const frame = flush();\n if (frame) yield frame;\n}\n\nasync function* readAgentRunEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<AgentRunStreamEvent, void, void> {\n let eventName = '';\n let dataLines: string[] = [];\n\n const flush = (): AgentRunStreamEvent | null => {\n if (dataLines.length === 0) return null;\n const data = dataLines.join('\\n');\n dataLines = [];\n if (data === '[DONE]') return null;\n return parseAgentRunEvent(eventName, data);\n };\n\n for await (const line of iterSSELines(body)) {\n if (line === '') {\n const event = flush();\n eventName = '';\n if (event) yield event;\n continue;\n }\n if (line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n const event = flush();\n if (event) yield event;\n}\n\nfunction parseAgentRunEvent(eventName: string, data: string): AgentRunStreamEvent {\n const payload = JSON.parse(data) as unknown;\n const obj = isRecord(payload) ? payload : { type: eventName, data: payload };\n const type = stringField(obj, 'type') || eventName;\n\n switch (type) {\n case 'run_started':\n return {\n type: 'run_started',\n runId: stringField(obj, 'run_id', 'runId'),\n sessionId: stringField(obj, 'session_id', 'sessionId'),\n };\n case 'status':\n return {\n type: 'status',\n status: stringField(obj, 'status'),\n message: optionalStringField(obj, 'message'),\n };\n case 'text_delta':\n return { type: 'text_delta', text: stringField(obj, 'text') };\n case 'reasoning_delta':\n return { type: 'reasoning_delta', text: stringField(obj, 'text') };\n case 'tool_call':\n return {\n type: 'tool_call',\n id: stringField(obj, 'id'),\n name: stringField(obj, 'name'),\n input: obj.input,\n };\n case 'tool_result':\n return {\n type: 'tool_result',\n id: stringField(obj, 'id'),\n name: optionalStringField(obj, 'name'),\n result: obj.result,\n error: optionalStringField(obj, 'error'),\n };\n case 'local_tool_request':\n return {\n type: 'local_tool_request',\n requestId: stringField(obj, 'request_id', 'requestId'),\n name: stringField(obj, 'name'),\n input: obj.input,\n };\n case 'artifact':\n return {\n type: 'artifact',\n artifact: fromWireArtifact((isRecord(obj.artifact) ? obj.artifact : obj) as WireAgentRunArtifact),\n };\n case 'sources':\n return { type: 'sources', sources: obj.sources };\n case 'usage':\n return {\n type: 'usage',\n usage: normalizeUsage(isRecord(obj.usage) ? obj.usage : obj),\n };\n case 'settle':\n return {\n type: 'settle',\n settlement: normalizeSettlement(isRecord(obj.settlement) ? obj.settlement : obj),\n };\n case 'error':\n return { type: 'error', error: normalizeError(obj.error) ?? normalizeError(obj)! };\n case 'done':\n return {\n type: 'done',\n runId: stringField(obj, 'run_id', 'runId'),\n status: stringField(obj, 'status'),\n };\n default:\n return {\n type: 'error',\n error: {\n code: 'unknown_event',\n message: `unknown agent run event: ${type}`,\n raw: obj,\n },\n };\n }\n}\n\nfunction normalizeUsage(value: Record<string, unknown>) {\n return {\n ...value,\n inputTokens: numberField(value, 'input_tokens', 'inputTokens'),\n outputTokens: numberField(value, 'output_tokens', 'outputTokens'),\n totalTokens: numberField(value, 'total_tokens', 'totalTokens'),\n cacheReadTokens: numberField(value, 'cache_read_tokens', 'cacheReadTokens'),\n cacheCreateTokens: numberField(value, 'cache_create_tokens', 'cacheCreateTokens'),\n exact: booleanField(value, 'exact'),\n source: optionalStringField(value, 'source'),\n };\n}\n\nfunction normalizeSettlement(value: Record<string, unknown>) {\n return {\n ...value,\n requestId: optionalStringField(value, 'request_id', 'requestId'),\n status: optionalStringField(value, 'status'),\n consumeStatus: optionalStringField(value, 'consume_status', 'consumeStatus'),\n inputTokens: numberField(value, 'input_tokens', 'inputTokens'),\n outputTokens: numberField(value, 'output_tokens', 'outputTokens'),\n totalTokens: numberField(value, 'total_tokens', 'totalTokens'),\n cacheReadTokens: numberField(value, 'cache_read_tokens', 'cacheReadTokens'),\n cacheCreateTokens: numberField(value, 'cache_create_tokens', 'cacheCreateTokens'),\n tokenRemaining: numberField(value, 'token_remaining', 'tokenRemaining'),\n callRemaining: numberField(value, 'call_remaining', 'callRemaining'),\n retryQueued: booleanField(value, 'retry_queued', 'retryQueued'),\n exact: booleanField(value, 'exact'),\n };\n}\n\nfunction normalizeError(value: unknown): AgentRunErrorPayload | undefined {\n if (value == null) return undefined;\n if (typeof value === 'string') return { message: value, raw: value };\n if (!isRecord(value)) return { message: String(value), raw: value };\n return {\n code: optionalStringField(value, 'code', 'error_code', 'errorCode'),\n message: stringField(value, 'message', 'error') || 'agent run failed',\n stage: optionalStringField(value, 'stage'),\n retryable: typeof value.retryable === 'boolean' ? value.retryable : undefined,\n // 窗口限额扩展 (code=\"window_limit_exceeded\"): 契约 wire 为 camelCase, 蛇形兼容兜底。\n windowKind: optionalStringField(value, 'windowKind', 'window_kind'),\n windowResetAt: optionalStringField(value, 'windowResetAt', 'window_reset_at'),\n raw: value,\n };\n}\n\nfunction toStatus(status: string | undefined): AgentRunStatus {\n switch (status) {\n case 'running':\n case 'completed':\n case 'failed':\n case 'cancelled':\n return status;\n default:\n return 'queued';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction stringField(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'string') return value;\n }\n return '';\n}\n\nfunction optionalStringField(obj: Record<string, unknown>, ...keys: string[]): string | undefined {\n const value = stringField(obj, ...keys);\n return value === '' ? undefined : value;\n}\n\nfunction numberField(obj: Record<string, unknown>, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction booleanField(obj: Record<string, unknown>, ...keys: string[]): boolean | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'boolean') return value;\n }\n return undefined;\n}\n\nfunction filenameFromContentDisposition(value: string | null): string | null {\n if (!value) return null;\n const utf8 = /filename\\*=UTF-8''([^;]+)/i.exec(value);\n if (utf8?.[1]) {\n try {\n return decodeURIComponent(utf8[1]);\n } catch {\n return utf8[1];\n }\n }\n const plain = /filename=\"?([^\";]+)\"?/i.exec(value);\n return plain?.[1] ?? null;\n}\n\nfunction errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","// agent-runs/byok.ts — CrabCode 远控 BYO 模型密钥管理面 (契约 §18.2, W4 2026-06-10).\n//\n// 端点: /api/v4/crabcode/byok-credentials (wire snake_case; remote-control 平面)。\n// 守卫: AuthOrDesktopScope(\"remote_control\") — 网页 JWT 用户直接过 (自管自己的\n// 密钥), desktop/SDK OAuth token 须显式 remote_control scope。\n//\n// 安全红线 (契约 §6 附录 A):\n// - 任何端点不回 plaintext / ciphertext; 创建/轮换的明文只在请求体出现一次,\n// 加密落库后即弃; 列表一律 masked 视图 (ref + fingerprint + 元数据);\n// - 调用方拿到的 credentialRef 是唯一可持有的引用 —— 把它传给\n// `agentRuns.createRemoteRun({ byokCredentialRef })` (仅 runner='cloud');\n// 解密只发生在网关 launchCloudRunner 的子进程 env 注入点;\n// - SDK 不缓存、不打印明文; 调用方同样不应将明文落任何持久化存储。\n\nimport type { APIResponse } from '../shared/api-response';\nimport { Client } from '../core/client';\n\n/** 允许的第三方提供商 (与网关 byokAllowedProviders / managed_model Provider 谱系对齐)。 */\nexport type ByokProvider =\n | 'anthropic'\n | 'openai'\n | 'deepseek'\n | 'dashscope'\n | 'zhipu'\n | 'volcengine'\n | 'custom';\n\nexport type ByokCredentialStatus = 'active' | 'revoked';\n\n/** BYOK 密钥 masked 视图 — 永不含明文/密文。 */\nexport interface ByokCredential {\n credentialRef: string;\n provider: ByokProvider | string;\n name?: string;\n /** 仅 provider='custom' 时存在 (https:// 起始)。 */\n baseUrl?: string;\n /** 明文指纹 (轮换后变化; 用于\"是否同一把钥匙\"的人工核对)。 */\n fingerprint?: string;\n status: ByokCredentialStatus | string;\n createdAt?: string;\n lastUsedAt?: string;\n}\n\n/** `crabcodeByok.create()` 请求。明文一次性提交, 服务端加密落库后即弃。 */\nexport interface ByokCreateRequest {\n provider: ByokProvider;\n /** API key 明文; ≤4KB, 不得含换行。 */\n plaintext: string;\n /** 显示名; ≤100 字符。 */\n name?: string;\n /** 仅 provider='custom' 必填 (必须 https://); 其他 provider 不可设。 */\n baseUrl?: string;\n}\n\ninterface WireByokCredential {\n credential_ref?: string;\n provider?: string;\n name?: string;\n base_url?: string;\n fingerprint?: string;\n status?: string;\n created_at?: string;\n last_used_at?: string;\n}\n\nfunction fromWireByok(v: WireByokCredential): ByokCredential {\n return {\n credentialRef: v.credential_ref ?? '',\n provider: v.provider ?? '',\n name: v.name || undefined,\n baseUrl: v.base_url || undefined,\n fingerprint: v.fingerprint || undefined,\n status: v.status ?? '',\n createdAt: v.created_at || undefined,\n lastUsedAt: v.last_used_at || undefined,\n };\n}\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** CrabCode 远控 BYO 模型密钥管理面 (契约 §18.2)。 */\n readonly crabcodeByok: CrabCodeByokClient;\n }\n}\n\nconst byokByClient = new WeakMap<Client, CrabCodeByokClient>();\n\nObject.defineProperty(Client.prototype, 'crabcodeByok', {\n configurable: true,\n enumerable: false,\n get(this: Client): CrabCodeByokClient {\n let existing = byokByClient.get(this);\n if (!existing) {\n existing = new CrabCodeByokClient(this);\n byokByClient.set(this, existing);\n }\n return existing;\n },\n});\n\nexport class CrabCodeByokClient {\n constructor(private readonly client: Client) {}\n\n /** 列出调用者自己的密钥 (masked; 新→旧, 服务端上限 100 条)。 */\n async list(signal?: AbortSignal): Promise<ByokCredential[]> {\n const resp = await this.client.doJSON<APIResponse<{ items?: WireByokCredential[] }>>(\n 'GET',\n '/crabcode/byok-credentials',\n null,\n signal,\n );\n return (resp.data?.items ?? []).map(fromWireByok);\n }\n\n /**\n * 创建密钥 — 明文一次性提交, 返回 masked 视图。\n * 单用户上限 20 把; provider='custom' 必须带 https:// baseUrl。\n */\n async create(req: ByokCreateRequest, signal?: AbortSignal): Promise<ByokCredential> {\n const resp = await this.client.doJSON<APIResponse<WireByokCredential>>(\n 'POST',\n '/crabcode/byok-credentials',\n {\n provider: req.provider,\n name: req.name,\n base_url: req.baseUrl,\n plaintext: req.plaintext,\n },\n signal,\n );\n return fromWireByok(resp.data ?? {});\n }\n\n /** 轮换密钥明文 — credentialRef 不变, fingerprint 更新。已吊销的密钥不可轮换 (400)。 */\n async rotate(\n credentialRef: string,\n newPlaintext: string,\n signal?: AbortSignal,\n ): Promise<ByokCredential> {\n const resp = await this.client.doJSON<APIResponse<WireByokCredential>>(\n 'POST',\n `/crabcode/byok-credentials/${encodeURIComponent(credentialRef)}/rotate`,\n { new_plaintext: newPlaintext },\n signal,\n );\n return fromWireByok(resp.data ?? {});\n }\n\n /** 吊销密钥 (软状态 + 服务端抹密文, 不可恢复; 幂等 — 重复吊销返回当前视图)。 */\n async revoke(credentialRef: string, signal?: AbortSignal): Promise<ByokCredential> {\n const resp = await this.client.doJSON<APIResponse<WireByokCredential>>(\n 'POST',\n `/crabcode/byok-credentials/${encodeURIComponent(credentialRef)}/revoke`,\n {},\n signal,\n );\n return fromWireByok(resp.data ?? {});\n }\n}\n","// compliance/scopes.ts — 端口自 acosmi-sdk-go/scopes.go (v0.19.0)\n//\n// 合规履约 scope。\n//\n// 三处必须字面量一致, 任一变更需同步另外两处:\n// - Go: nexus-v4/backend/internal/handler/desktop_oauth.go DesktopOAuthScopes\n// - Java: tk-dist/yudao-module-compliance-api ComplianceScopes\n// - TS: 本文件 ScopeCompliance* 常量\n//\n// 调用 compliance API 时必须按这些常量声明所需 scope; 不允许通过 ScopeAI /\n// ScopeAccount 隐式获得 compliance 权限。合规 scope 不做分组合并 — 服务端按细粒度\n// 校验, SDK 也只应按需申请最小集合。\n\nexport const ScopeComplianceEvidenceRead = 'compliance:evidence:read';\nexport const ScopeComplianceEvidenceWrite = 'compliance:evidence:write';\n\nexport const ScopeComplianceTimestampIssue = 'compliance:timestamp:issue';\nexport const ScopeComplianceTimestampVerify = 'compliance:timestamp:verify';\n\nexport const ScopeComplianceContractSigningRead = 'compliance:contract_signing:read';\nexport const ScopeComplianceContractSigningWrite = 'compliance:contract_signing:write';\n\nexport const ScopeComplianceSealManage = 'compliance:seal:manage';\nexport const ScopeComplianceSealApprovalRequest = 'compliance:seal_approval:request';\nexport const ScopeComplianceSealApprovalApprove = 'compliance:seal_approval:approve';\nexport const ScopeComplianceSealUseExecute = 'compliance:seal_use:execute';\n\nexport const ScopeComplianceReportsRead = 'compliance:reports:read';\nexport const ScopeComplianceReportsWrite = 'compliance:reports:write';\nexport const ScopeComplianceReportsPublish = 'compliance:reports:publish';\n\nexport const ScopeComplianceContractTemplateRead = 'compliance:contract_template:read';\nexport const ScopeComplianceContractTemplateWrite = 'compliance:contract_template:write';\n\n/** 类型联合:合规域细粒度 scope。Java compliance verifier 只按细粒度匹配, 不做分组展开。 */\nexport type ComplianceScope =\n | typeof ScopeComplianceEvidenceRead\n | typeof ScopeComplianceEvidenceWrite\n | typeof ScopeComplianceTimestampIssue\n | typeof ScopeComplianceTimestampVerify\n | typeof ScopeComplianceContractSigningRead\n | typeof ScopeComplianceContractSigningWrite\n | typeof ScopeComplianceSealManage\n | typeof ScopeComplianceSealApprovalRequest\n | typeof ScopeComplianceSealApprovalApprove\n | typeof ScopeComplianceSealUseExecute\n | typeof ScopeComplianceReportsRead\n | typeof ScopeComplianceReportsWrite\n | typeof ScopeComplianceReportsPublish\n | typeof ScopeComplianceContractTemplateRead\n | typeof ScopeComplianceContractTemplateWrite;\n\n/** 全部合规域 scope。OAuth 申请合规权限时使用; 谨慎一次性申请全部, 推荐按业务最小集合申请。 */\nexport function complianceScopes(): ComplianceScope[] {\n return [\n ScopeComplianceEvidenceRead,\n ScopeComplianceEvidenceWrite,\n ScopeComplianceTimestampIssue,\n ScopeComplianceTimestampVerify,\n ScopeComplianceContractSigningRead,\n ScopeComplianceContractSigningWrite,\n ScopeComplianceSealManage,\n ScopeComplianceSealApprovalRequest,\n ScopeComplianceSealApprovalApprove,\n ScopeComplianceSealUseExecute,\n ScopeComplianceReportsRead,\n ScopeComplianceReportsWrite,\n ScopeComplianceReportsPublish,\n ScopeComplianceContractTemplateRead,\n ScopeComplianceContractTemplateWrite,\n ];\n}\n","// compliance/status.ts — 合规域稳定 API 契约(前端可见的最小集合)。\n//\n// 设计原则:\n// - SDK / 插件 / SaaS 不感知下游履约通道材料或内部流水字段。\n// 本文件只暴露面向用户的状态/错误码语义。\n// - 本文件导出的错误码常量是 **SDK 内部 symbolic key**,不是 Java 服务端的 wire 错误码。\n// Java 后端通过 ErrorCodeConstants 暴露的是 1-031-xxx-xxx 数值码;wire 上读到的是\n// {code: number, message: string}。前端要做分类判断时,使用 `compliance/errors.ts`\n// 的 `classifyComplianceError(BusinessError)` 拿到 ComplianceErrorInfo.key,\n// 再按本文件的 symbolic 常量 switch。本文件常量字面量供 SDK 内部分支判断与文档使用,\n// 不是服务端 wire 字段。\n// - 业务入口在后端层关闭时,前端拿到 ENVELOPE_GATE_CLOSED / PROVIDER_NOT_CONFIGURED\n// 必须展示\"功能未开放\",不得自行重试或绕过。\n\n/**\n * Compliance envelope 稳定业务状态。\n *\n * 字面量与 Java `EnvelopeStatusEnum` 的 `name()` 一致(这是 enum,是 wire 上的实际\n * 字符串);前端按这些字符串分支展示文案。\n */\nexport type ComplianceEnvelopeStatus =\n | 'DRAFT'\n | 'CONTRACT_READY'\n | 'APPROVED'\n | 'SIGN_PENDING'\n | 'PENDING_EVIDENCE' // provider 报告成功 / callback 已到,但本地证据链尚未就绪 — 不可承诺扣费\n | 'PENDING_RECONCILIATION' // provider unknown/retrying / 本地 verify 失败 — 进入人工对账\n | 'SUCCESS'\n | 'FAILED'\n | 'CANCELED';\n\n/** Compliance 用印审批稳定状态。 */\nexport type ComplianceSealApprovalStatus =\n | 'DRAFT'\n | 'SUBMITTED'\n | 'APPROVED'\n | 'REJECTED'\n | 'CANCELED'\n | 'USED'\n | 'EXPIRED';\n\n/** Provider 业务状态(前端可见的脱敏视图,不暴露下游内部字段)。 */\nexport type ComplianceProviderStatus =\n | 'pending'\n | 'success'\n | 'failed'\n | 'unknown' // 不可承诺扣费;客户必须等查询/对账完成\n | 'retrying'; // 不可承诺扣费\n\n/**\n * 计费 / 履约的对外稳定状态视图。distribution compliance-billing 内部 API\n * (quote/reserve/commit/cancel/reconcile) 不暴露给前端 — 前端只能看见这 4 个语义。\n */\nexport type ComplianceBillingDisplayStatus =\n | 'reserved' // 已预占,待 provider 成功 + 本地验证\n | 'committed' // 已确认扣费\n | 'canceled' // 已取消\n | 'pending_reconciliation'; // 等待人工对账,扣费状态未确认\n\n// ===========================================================================\n// 错误码(字面量与 Java ErrorCodeConstants 一致)\n// ===========================================================================\n\n/** 高风险动作 step-up — 重新做 OAuth introspection 或重新登录,提升 token 等级后再尝试。 */\nexport const ErrComplianceStepUpRequired = 'COMPLIANCE_STEP_UP_REQUIRED';\n\n/** envelope 闸门关闭 — 审批 gate 等条件未同时就绪,前端展示\"功能开放中\"。 */\nexport const ErrEnvelopeGateClosed = 'ENVELOPE_GATE_CLOSED';\n\n/** 履约 provider 未配置 — 受控环境材料缺失时业务路径会一致拒绝,不要前端重试。 */\nexport const ErrProviderNotConfigured = 'PROVIDER_NOT_CONFIGURED';\n\n/** Provider 返回 unknown / retrying — 客户必须等待对账,前端展示\"处理中(人工核对)\"。 */\nexport const ErrProviderUnknownNoRetry = 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY';\n\n/** callback 不能直接确认扣费 — 后端守门,前端无需处理,记录到审计日志展示即可。 */\nexport const ErrBillingCallbackCannotCommit = 'BILLING_CALLBACK_CANNOT_COMMIT';\n\n/** provider 成功但本地未验证通过,不允许扣费。 */\nexport const ErrBillingCommitRequiresLocalVerify = 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY';\n\n/** distribution compliance-billing 必须 S2S — 前端误调用时拿到该错误码,禁止 retry。 */\nexport const ErrBillingS2sForbidden = 'BILLING_S2S_FORBIDDEN';\n\n/** 审批 gate 各类失败语义(前端展示\"审批中 / 审批已用 / 审批失效\")。 */\nexport const ErrSealApprovalNotApproved = 'SEAL_APPROVAL_STATE_NOT_APPROVED';\nexport const ErrSealApprovalExpired = 'SEAL_APPROVAL_EXPIRED';\nexport const ErrSealApprovalNonceUsed = 'SEAL_APPROVAL_NONCE_USED';\nexport const ErrSealApprovalContractHashMismatch = 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH';\nexport const ErrSealApprovalSealMismatch = 'SEAL_APPROVAL_SEAL_MISMATCH';\nexport const ErrSealApprovalLocationMismatch = 'SEAL_APPROVAL_LOCATION_MISMATCH';\nexport const ErrSealApprovalTransactorMismatch = 'SEAL_APPROVAL_TRANSACTOR_MISMATCH';\n\n/** 用印重复消费防护 — 前端遇到该错误必须刷新审批单状态,不允许\"换一次 nonce 再试\"。 */\nexport const ErrSealUseAlreadyConsumed = 'SEAL_USE_ALREADY_CONSUMED';\n\n/** 该错误码联合用于前端选择性展示文案;非穷举式 enum,后端保留新增空间。 */\nexport type ComplianceClientErrorCode =\n | typeof ErrComplianceStepUpRequired\n | typeof ErrEnvelopeGateClosed\n | typeof ErrProviderNotConfigured\n | typeof ErrProviderUnknownNoRetry\n | typeof ErrBillingCallbackCannotCommit\n | typeof ErrBillingCommitRequiresLocalVerify\n | typeof ErrBillingS2sForbidden\n | typeof ErrSealApprovalNotApproved\n | typeof ErrSealApprovalExpired\n | typeof ErrSealApprovalNonceUsed\n | typeof ErrSealApprovalContractHashMismatch\n | typeof ErrSealApprovalSealMismatch\n | typeof ErrSealApprovalLocationMismatch\n | typeof ErrSealApprovalTransactorMismatch\n | typeof ErrSealUseAlreadyConsumed;\n\n/**\n * 判定一个错误码是否属于\"需要前端引导用户重新认证/审批\"的高级语义,\n * 而不是简单 retry。这类错误前端不允许在 UI 层做自动重试。\n */\nexport function isComplianceTerminalError(code: string): boolean {\n switch (code) {\n case ErrEnvelopeGateClosed:\n case ErrProviderNotConfigured:\n case ErrProviderUnknownNoRetry:\n case ErrBillingCallbackCannotCommit:\n case ErrBillingCommitRequiresLocalVerify:\n case ErrBillingS2sForbidden:\n case ErrSealApprovalNonceUsed:\n case ErrSealApprovalExpired:\n case ErrSealApprovalContractHashMismatch:\n case ErrSealApprovalSealMismatch:\n case ErrSealApprovalLocationMismatch:\n case ErrSealApprovalTransactorMismatch:\n case ErrSealUseAlreadyConsumed:\n return true;\n default:\n return false;\n }\n}\n\n/**\n * \"是否允许在 UI 上呈现为'扣费已确认'\"的判定。\n * provider 状态为 unknown / retrying / pending 时一律不展示为已确认。\n */\nexport function isBillingConfirmable(\n providerStatus: ComplianceProviderStatus | undefined,\n billingStatus: ComplianceBillingDisplayStatus | undefined,\n): boolean {\n return providerStatus === 'success' && billingStatus === 'committed';\n}\n","// compliance/errors.ts — Java numeric ErrorCode → SDK symbolic key.\n//\n// 设计原则:\n// - Java 后端通过 cn.iocoder.yudao.module.compliance.enums.ErrorCodeConstants 暴露\n// 数值错误码(1-031-xxx-xxx)。本文件按段位 + 具体码值映射为 SDK 内部 symbolic key,\n// 仅作 SDK 分支判断 / 文档说明,不作为 wire response 反序列化字段。\n// - 不要尝试从后端 message 文案做正则识别 — message 是中文可变的,code 才是合同。\n// - retryable / terminal / stepUpRequired 严格按\"是否安全自动重发\"语义:\n// * stepUpRequired: 客户端引导用户重新做 OAuth introspection / step-up,不要静默 retry。\n// * retryable: 仅对幂等的网络/资源短暂错误为 true(当前默认全为 false,因为\n// compliance 写接口严禁自动重发)。\n// * terminal: 不需要 SDK 再次轮询;用户必须用新 idempotency-key 重新发起。\n//\n// =============================================================================\n// v1.9.0+ admin 写端点行为变更 (主仓 K10AdminController IMPL-E + IMPL-F)\n// =============================================================================\n//\n// 主仓 csign / compliance-billing admin 写端点 (POST `/api/admin/csign/seals` /\n// `/api/distribution/compliance-billing/commit|cancel|refund` 等) 在 v1.9.0+ 改用\n// 标准 HTTP 状态码语义, 不再统一返 `200 + CommonResult{ok:false, code:N}`:\n//\n// - 跨租户访问别人的资源 → `HTTPError statusCode=403` (FORBIDDEN)\n// - 资源不存在 / 已删除 → `HTTPError statusCode=404` (NOT_FOUND)\n// - 印章/能力未配置 → `HTTPError statusCode=501` (NOT_IMPLEMENTED, 主仓\n// `GlobalErrorCodeConstants.NOT_IMPLEMENTED`, 旧\n// `NOT_CONFIGURED_CODE` 别名指向同一码)\n// - 业务校验失败 → `HTTPError statusCode=400` + CommonResult.error code/message\n//\n// 这些是通用 HTTP 状态码契约, 不属于 compliance 1-031-xxx-xxx 业务段位, 故本文件\n// 不引入新数值码. 集成方应对:\n//\n// try {\n// await client.compliance.someAdminWriteMethod(...);\n// } catch (e) {\n// if (e instanceof HTTPError) {\n// if (e.statusCode === 403) /* 跨租户 */;\n// if (e.statusCode === 404) /* 资源不存在 */;\n// if (e.statusCode === 501) /* 印章未配置 */;\n// }\n// }\n//\n// 不再读 `CommonResult.ok` 字段判定 admin 写端点成功 — v1.9.0+ HTTP 状态码即真相,\n// 4xx/5xx 必抛 HTTPError, 不再 `200 + {ok:false}` 静默失败.\n\nimport type { BusinessError } from '../shared/errors';\n\n/**\n * SDK 内部 symbolic key;用于代码分支判断与文档。**不是 wire contract**。\n */\nexport type ComplianceErrorKey =\n // 通用 / token / scope\n | 'COMPLIANCE_UNAUTHORIZED'\n | 'COMPLIANCE_INSUFFICIENT_SCOPE'\n | 'COMPLIANCE_STEP_UP_REQUIRED'\n | 'COMPLIANCE_TOKEN_INVALID'\n // 主体快照\n | 'SUBJECT_SNAPSHOT_REQUIRED'\n | 'SUBJECT_SNAPSHOT_NOT_FOUND'\n | 'SUBJECT_SNAPSHOT_TENANT_MISMATCH'\n // Evidence / Timestamp / Package / Report\n | 'EVIDENCE_ASSET_NOT_FOUND'\n | 'EVIDENCE_ASSET_HASH_MISMATCH'\n | 'EVIDENCE_ASSET_PAYLOAD_REQUIRED'\n | 'TIMESTAMP_TOKEN_NOT_FOUND'\n | 'TIMESTAMP_PROVIDER_FAILED'\n | 'TIMESTAMP_PROVIDER_UNKNOWN'\n | 'TIMESTAMP_LOCAL_VERIFY_FAILED'\n | 'TIMESTAMP_PROVIDER_NOT_AVAILABLE'\n | 'EVIDENCE_PACKAGE_NOT_FOUND'\n | 'EVIDENCE_PACKAGE_TIMESTAMP_REQUIRED'\n | 'EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH'\n | 'REPORT_NOT_FOUND'\n | 'REPORT_ALREADY_PUBLISHED'\n | 'REPORT_DRAFT_REQUIRED'\n | 'EVIDENCE_VERIFY_TARGET_REQUIRED'\n | 'EVIDENCE_VERIFY_TARGET_NOT_FOUND'\n // Provider request\n | 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY'\n | 'PROVIDER_CALLBACK_SOURCE_INVALID'\n | 'PROVIDER_NOT_CONFIGURED'\n | 'PROVIDER_REQUEST_NOT_FOUND'\n | 'PROVIDER_REQUEST_IDEMPOTENCY_REQUIRED'\n | 'PROVIDER_REQUEST_STATUS_NOT_TERMINAL'\n // Envelope\n | 'ENVELOPE_NOT_FOUND'\n | 'ENVELOPE_TENANT_MISMATCH'\n | 'ENVELOPE_STATE_NOT_ALLOWED'\n | 'ENVELOPE_GATE_CLOSED'\n | 'CONTRACT_NOT_FOUND'\n | 'CONTRACT_HASH_MISMATCH'\n | 'PROVIDER_AUTHORIZATION_NOT_CONFIRMED'\n | 'ENVELOPE_EVIDENCE_NOT_READY'\n // Seal approval\n | 'SEAL_ASSET_NOT_FOUND'\n | 'SEAL_APPROVAL_NOT_FOUND'\n | 'SEAL_APPROVAL_STATE_NOT_APPROVED'\n | 'SEAL_APPROVAL_EXPIRED'\n | 'SEAL_APPROVAL_ALREADY_USED'\n | 'SEAL_APPROVAL_NONCE_USED'\n | 'SEAL_APPROVAL_SEAL_MISMATCH'\n | 'SEAL_APPROVAL_LOCATION_MISMATCH'\n | 'SEAL_APPROVAL_TRANSACTOR_MISMATCH'\n | 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH'\n | 'SEAL_APPROVAL_INVALID_TRANSITION'\n | 'SEAL_USE_ALREADY_CONSUMED'\n // Audit chain\n | 'AUDIT_CHAIN_TAMPER_DETECTED'\n // Billing\n | 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY'\n | 'BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS'\n | 'BILLING_CALLBACK_CANNOT_COMMIT'\n | 'BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE'\n | 'BILLING_S2S_FORBIDDEN'\n // SDK fallback\n | 'UNKNOWN_COMPLIANCE_ERROR';\n\n/** 单个错误的 SDK 视图。 */\nexport interface ComplianceErrorInfo {\n /** Java numeric error code (wire contract)。 */\n code: number;\n /** 服务端原始 message(中文,可变);仅用于日志/展示。 */\n message: string;\n /** SDK 分支判断用 symbolic key。 */\n key: ComplianceErrorKey;\n /** 是否安全自动重试 — compliance 写接口几乎全为 false。 */\n retryable: boolean;\n /** 是否已经是终态 — 用户必须用新 idempotency-key 重新发起。 */\n terminal: boolean;\n /** 高风险动作需要 step-up / introspection。 */\n stepUpRequired: boolean;\n}\n\n// =============================================================================\n// numeric → symbolic 映射(与 Java ErrorCodeConstants 同步)。\n// =============================================================================\n\nconst CODE_TO_KEY: Record<number, ComplianceErrorKey> = {\n // 通用 / token / scope (1-031-000-xxx)\n 1031000001: 'COMPLIANCE_UNAUTHORIZED',\n 1031000002: 'COMPLIANCE_TOKEN_INVALID',\n 1031000003: 'COMPLIANCE_TOKEN_INVALID',\n 1031000004: 'COMPLIANCE_TOKEN_INVALID',\n 1031000005: 'COMPLIANCE_TOKEN_INVALID',\n 1031000006: 'COMPLIANCE_TOKEN_INVALID',\n 1031000007: 'COMPLIANCE_TOKEN_INVALID',\n 1031000008: 'COMPLIANCE_TOKEN_INVALID',\n 1031000009: 'COMPLIANCE_TOKEN_INVALID',\n 1031000010: 'COMPLIANCE_TOKEN_INVALID',\n 1031000011: 'COMPLIANCE_TOKEN_INVALID',\n 1031000012: 'COMPLIANCE_INSUFFICIENT_SCOPE',\n 1031000013: 'COMPLIANCE_STEP_UP_REQUIRED',\n // Subject snapshot (1-031-001-xxx)\n 1031001001: 'SUBJECT_SNAPSHOT_NOT_FOUND',\n 1031001002: 'SUBJECT_SNAPSHOT_TENANT_MISMATCH',\n 1031001003: 'SUBJECT_SNAPSHOT_REQUIRED',\n // Evidence / Timestamp / Package / Report (1-031-002-xxx)\n 1031002001: 'EVIDENCE_ASSET_NOT_FOUND',\n 1031002002: 'SUBJECT_SNAPSHOT_TENANT_MISMATCH',\n 1031002003: 'EVIDENCE_ASSET_HASH_MISMATCH',\n 1031002004: 'EVIDENCE_ASSET_PAYLOAD_REQUIRED',\n 1031002005: 'EVIDENCE_ASSET_PAYLOAD_REQUIRED',\n 1031002006: 'TIMESTAMP_TOKEN_NOT_FOUND',\n 1031002007: 'TIMESTAMP_PROVIDER_FAILED',\n 1031002008: 'TIMESTAMP_PROVIDER_UNKNOWN',\n 1031002009: 'TIMESTAMP_LOCAL_VERIFY_FAILED',\n 1031002010: 'TIMESTAMP_PROVIDER_NOT_AVAILABLE',\n 1031002011: 'EVIDENCE_PACKAGE_NOT_FOUND',\n 1031002012: 'EVIDENCE_PACKAGE_TIMESTAMP_REQUIRED',\n 1031002013: 'EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH',\n 1031002014: 'REPORT_NOT_FOUND',\n 1031002015: 'REPORT_ALREADY_PUBLISHED',\n 1031002016: 'REPORT_DRAFT_REQUIRED',\n 1031002017: 'EVIDENCE_VERIFY_TARGET_REQUIRED',\n 1031002018: 'EVIDENCE_VERIFY_TARGET_NOT_FOUND',\n // Provider request (1-031-003-xxx)\n 1031003001: 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY',\n 1031003002: 'PROVIDER_CALLBACK_SOURCE_INVALID',\n 1031003003: 'PROVIDER_NOT_CONFIGURED',\n 1031003010: 'PROVIDER_REQUEST_NOT_FOUND',\n 1031003011: 'PROVIDER_REQUEST_IDEMPOTENCY_REQUIRED',\n 1031003012: 'PROVIDER_REQUEST_STATUS_NOT_TERMINAL',\n // Envelope (1-031-004-xxx)\n 1031004001: 'ENVELOPE_NOT_FOUND',\n 1031004002: 'ENVELOPE_TENANT_MISMATCH',\n 1031004003: 'ENVELOPE_STATE_NOT_ALLOWED',\n 1031004004: 'ENVELOPE_GATE_CLOSED',\n 1031004005: 'CONTRACT_NOT_FOUND',\n 1031004006: 'CONTRACT_HASH_MISMATCH',\n 1031004007: 'CONTRACT_NOT_FOUND',\n 1031004008: 'PROVIDER_AUTHORIZATION_NOT_CONFIRMED',\n 1031004009: 'PROVIDER_AUTHORIZATION_NOT_CONFIRMED',\n 1031004010: 'ENVELOPE_EVIDENCE_NOT_READY',\n // Seal approval / use (1-031-005-xxx)\n 1031005001: 'SEAL_ASSET_NOT_FOUND',\n 1031005010: 'SEAL_APPROVAL_NOT_FOUND',\n 1031005011: 'SEAL_APPROVAL_NOT_FOUND',\n 1031005012: 'SEAL_APPROVAL_STATE_NOT_APPROVED',\n 1031005013: 'SEAL_APPROVAL_EXPIRED',\n 1031005014: 'SEAL_APPROVAL_ALREADY_USED',\n 1031005015: 'SEAL_APPROVAL_NONCE_USED',\n 1031005016: 'SEAL_APPROVAL_SEAL_MISMATCH',\n 1031005017: 'SEAL_APPROVAL_LOCATION_MISMATCH',\n 1031005018: 'SEAL_APPROVAL_TRANSACTOR_MISMATCH',\n 1031005019: 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH',\n 1031005020: 'SEAL_APPROVAL_INVALID_TRANSITION',\n 1031005030: 'SEAL_USE_ALREADY_CONSUMED',\n // Billing (1-031-006-xxx)\n 1031006004: 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY',\n 1031006005: 'BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS',\n 1031006007: 'BILLING_CALLBACK_CANNOT_COMMIT',\n 1031006008: 'BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE',\n 1031006009: 'BILLING_S2S_FORBIDDEN',\n // Audit (1-031-007-xxx)\n 1031007011: 'AUDIT_CHAIN_TAMPER_DETECTED',\n};\n\nconst STEP_UP_KEYS = new Set<ComplianceErrorKey>(['COMPLIANCE_STEP_UP_REQUIRED']);\n\nconst TERMINAL_KEYS = new Set<ComplianceErrorKey>([\n 'ENVELOPE_GATE_CLOSED',\n 'PROVIDER_NOT_CONFIGURED',\n 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY',\n 'BILLING_CALLBACK_CANNOT_COMMIT',\n 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY',\n 'BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS',\n 'BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE',\n 'BILLING_S2S_FORBIDDEN',\n 'SEAL_APPROVAL_NONCE_USED',\n 'SEAL_APPROVAL_EXPIRED',\n 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH',\n 'SEAL_APPROVAL_SEAL_MISMATCH',\n 'SEAL_APPROVAL_LOCATION_MISMATCH',\n 'SEAL_APPROVAL_TRANSACTOR_MISMATCH',\n 'SEAL_USE_ALREADY_CONSUMED',\n 'CONTRACT_HASH_MISMATCH',\n 'TIMESTAMP_LOCAL_VERIFY_FAILED',\n 'EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH',\n 'AUDIT_CHAIN_TAMPER_DETECTED',\n 'PROVIDER_REQUEST_NOT_FOUND',\n 'EVIDENCE_ASSET_HASH_MISMATCH',\n 'EVIDENCE_VERIFY_TARGET_NOT_FOUND',\n 'REPORT_ALREADY_PUBLISHED',\n]);\n\n// 真正\"网络层 / 资源短暂不可用\"才允许 retryable=true。compliance 错误几乎全部 false。\nconst RETRYABLE_KEYS = new Set<ComplianceErrorKey>([]);\n\n/**\n * 把一个 BusinessError 分类为 compliance 视图。\n * 非 compliance 段位的错误码会回退到 UNKNOWN_COMPLIANCE_ERROR,调用方应该当作业务错误处理。\n */\nexport function classifyComplianceError(err: BusinessError): ComplianceErrorInfo {\n const key = CODE_TO_KEY[err.code] ?? 'UNKNOWN_COMPLIANCE_ERROR';\n return {\n code: err.code,\n message: err.message,\n key,\n retryable: RETRYABLE_KEYS.has(key),\n terminal: TERMINAL_KEYS.has(key),\n stepUpRequired: STEP_UP_KEYS.has(key),\n };\n}\n\n/**\n * 判断 BusinessError 是否属于 compliance 段位(1-031-xxx-xxx)。\n * 不在段位的错误码可能来自其它 yudao 模块,按通用业务错误处理即可。\n */\nexport function isComplianceBusinessError(err: BusinessError): boolean {\n return err.code >= 1031000000 && err.code <= 1031999999;\n}\n","// compliance/client.ts — Compliance 域 SDK-facing subclient。\n//\n// 设计原则(严格):\n// - 走独立 base URL(client.complianceURL(path)),不复用 /api/v4 路径。\n// - GET 认证读走 retryOn401=true(与 agent-runs 同节奏,幂等安全)。\n// - 公开 verify 走 publicRead:无 token 匿名请求,有 token 附带 Authorization 以保留\n// 审计上下文;public 端点不应要求认证 → 401 不触发 forceRefresh,也不做 refresh replay。\n// - POST 写操作走专属 helper:发送前 ensureToken 一次确保 token fresh;遇到 401\n// 直接抛 HTTPError,不自动重放 — compliance 写接口可能在 provider 侧落幂等写入,\n// SDK 自动重放会导致 provider 重复请求 / 重复扣费风险。\n// - 写操作支持 Idempotency-Key header;调用方应持久化 key,重试 / 恢复时复用。\n// - polling helper 按 verificationStatus / provider request status 分类:UNKNOWN /\n// RETRYING / PENDING 继续轮询;VERIFIED / SUCCESS → 返回;FAILED / LOCAL_VERIFY_FAILED\n// → 抛 typed error;总超时后抛 polling timeout(不自动重发原请求)。\n// - SDK 不传 provider 字段;服务端按配置选择 provider,不再接受调用方指定。\n\nimport { Client, DEFAULT_API_TIMEOUT_MS } from '../core/client';\nimport { isUserAccessTokenRejected, type BusinessError } from '../shared/errors';\nimport type { APIResponse } from '../shared/api-response';\nimport { apiResponseBusinessError } from '../shared/api-response';\nimport {\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../core/http';\nimport type { PageRequest, PageResult } from '../shared/pagination';\nimport type { CompliancePollOptions, ComplianceWriteOptions } from './types';\nimport type {\n CreateEvidenceAssetRequest,\n EvidenceAsset,\n EvidenceAssetPageItem,\n EvidencePackage,\n EvidencePackagePageItem,\n ListEvidenceAssetsRequest,\n ListEvidencePackagesRequest,\n PublicEvidenceVerifyResult,\n} from './evidence/types';\nimport type {\n ComplianceTimestampVerificationStatus,\n IssueTimestampRequest,\n ListTimestampsRequest,\n TimestampPageItem,\n TimestampToken,\n TimestampVerifyResult,\n TsaProvider,\n TsaStats,\n VerifyTimestampRequest,\n} from './timestamp/types';\nimport type {\n ComplianceReport,\n CreateReportRequest,\n ListReportsRequest,\n ReportDownload,\n ReportPageItem,\n} from './report/types';\nimport type {\n CreateH5SigningUrlRequest,\n CreateSigningEnvelopeRequest,\n EnvelopeContractItem,\n ListSigningEnvelopesRequest,\n SignEnvelopeRequest,\n SigningEnvelope,\n SigningEnvelopePageItem,\n VoidEnvelopeRequest,\n} from './signing/types';\nimport type {\n ApproveSealApprovalQuery,\n CancelSealApprovalQuery,\n ListSealApprovalsRequest,\n ListSealUsesRequest,\n RejectSealApprovalQuery,\n SealApproval,\n SealApprovalPageItem,\n SealUsePageItem,\n SubmitSealApprovalRequest,\n} from './seal-approval/types';\nimport type {\n ComplianceProviderRequestStatus,\n ProviderRequestStatusView,\n} from './provider/types';\nimport type {\n ComplianceCapability,\n ListOperationsRequest,\n OperationDetail,\n OperationPageItem,\n} from './operation/types';\nimport type {\n ContractTemplatePageItem,\n ContractTemplateResp,\n ContractTemplateVersion,\n CreateContractTemplateRequest,\n ListContractTemplatesRequest,\n UpdateContractTemplateRequest,\n UploadContractTemplatePdfRequest,\n} from './template/types';\nimport {\n classifyComplianceError,\n isComplianceBusinessError,\n type ComplianceErrorInfo,\n} from './errors';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** SDK-facing 时间章与电子证据 / 合同签署能力。 */\n readonly compliance: ComplianceClient;\n }\n}\n\nconst cache = new WeakMap<Client, ComplianceClient>();\n\nObject.defineProperty(Client.prototype, 'compliance', {\n configurable: true,\n enumerable: false,\n get(this: Client): ComplianceClient {\n let existing = cache.get(this);\n if (!existing) {\n existing = new ComplianceClient(this);\n cache.set(this, existing);\n }\n return existing;\n },\n});\n\n/**\n * compliance 业务方法默认轮询参数。\n */\nconst DEFAULT_POLL: Required<Omit<CompliancePollOptions, 'signal'>> = {\n timeoutMs: 60_000,\n initialIntervalMs: 1_000,\n maxIntervalMs: 5_000,\n multiplier: 1.5,\n};\n\n/**\n * 当 compliance polling 检测到终态失败 / 已过 timeout / step-up 时抛出。\n *\n * 分类逻辑:终态失败优先于 timeout;timeout 不算 retryable,调用方必须用新 idempotency-key\n * 重新发起整条链路。\n */\nexport class CompliancePollError extends Error {\n readonly kind: 'timeout' | 'terminal_failure' | 'step_up_required' | 'unknown';\n readonly lastInfo?: ComplianceErrorInfo;\n\n constructor(\n message: string,\n kind: 'timeout' | 'terminal_failure' | 'step_up_required' | 'unknown',\n lastInfo?: ComplianceErrorInfo,\n ) {\n super(message);\n this.name = 'CompliancePollError';\n this.kind = kind;\n this.lastInfo = lastInfo;\n }\n}\n\ninterface WriteContext {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class ComplianceClient {\n constructor(private readonly client: Client) {}\n\n // =========================================================================\n // Evidence Asset\n // =========================================================================\n\n /** 创建证据资产(写)。 */\n createEvidenceAsset(\n req: CreateEvidenceAssetRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<EvidenceAsset> {\n return this.write<EvidenceAsset>(\n 'POST',\n '/compliance/evidence/assets',\n req,\n writeCtx(opts),\n );\n }\n\n /** 读 — 证据资产详情。 */\n getEvidenceAsset(id: number, signal?: AbortSignal): Promise<EvidenceAsset> {\n return this.read<EvidenceAsset>(\n 'GET',\n `/compliance/evidence/assets/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 证据资产分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 yudao `PageResult<T>`\n * (`{ total, list }`)。所有过滤项可选;`createTimeStart` / `createTimeEnd`\n * 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listEvidenceAssets(\n req: ListEvidenceAssetsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<EvidenceAssetPageItem>> {\n return this.read<PageResult<EvidenceAssetPageItem>>(\n 'GET',\n `/compliance/evidence/assets/page${pageQuery(req, ['assetType', 'status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 公开 verify。隐私边界:返回字段不含 PII / 合同原文 / storage / provider raw。\n *\n * 匿名可调用:未 login 时走匿名请求,不会抛 `not authorized, call login() first`。\n * 已 login / 已持有 token 时附带 `Authorization` 以保留审计上下文。public 端点不\n * 应要求认证 — 收到 401 直接抛 HTTPError,不触发 `forceRefresh`,也不做 refresh\n * replay。\n */\n verifyEvidencePublic(\n params: { evidenceNo?: string; publicVerifyCode?: string },\n signal?: AbortSignal,\n ): Promise<PublicEvidenceVerifyResult> {\n const q = new URLSearchParams();\n if (params.evidenceNo) q.set('evidenceNo', params.evidenceNo);\n if (params.publicVerifyCode) q.set('publicVerifyCode', params.publicVerifyCode);\n const qs = q.toString();\n return this.publicRead<PublicEvidenceVerifyResult>(\n 'GET',\n `/compliance/evidence/verify${qs ? '?' + qs : ''}`,\n signal,\n );\n }\n\n // =========================================================================\n // Timestamp\n // =========================================================================\n\n /** 申请时间章(写)。SDK 永远不传 provider 字段。 */\n issueTimestamp(\n req: IssueTimestampRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<TimestampToken> {\n return this.write<TimestampToken>('POST', '/compliance/timestamps', req, writeCtx(opts));\n }\n\n /** 给已有资产申请时间章。SDK 永远不传 provider 字段。 */\n issueTimestampForAsset(\n assetId: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<TimestampToken> {\n return this.write<TimestampToken>(\n 'POST',\n `/compliance/evidence/assets/${encodeURIComponent(assetId)}/timestamp`,\n null,\n writeCtx(opts),\n );\n }\n\n /** 读 — 时间章 token 详情。 */\n getTimestamp(id: number, signal?: AbortSignal): Promise<TimestampToken> {\n return this.read<TimestampToken>(\n 'GET',\n `/compliance/timestamps/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 时间章分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listTimestamps(\n req: ListTimestampsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<TimestampPageItem>> {\n return this.read<PageResult<TimestampPageItem>>(\n 'GET',\n `/compliance/timestamps/page${pageQuery(req, ['provider', 'verificationStatus', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /** verify — 本地离线校验已申请的时间章。 */\n verifyTimestamp(\n req: VerifyTimestampRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<TimestampVerifyResult> {\n return this.write<TimestampVerifyResult>(\n 'POST',\n '/compliance/timestamps/verify',\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 轮询到 VERIFIED 终态。\n * - VERIFIED → 返回 token;\n * - FAILED / LOCAL_VERIFY_FAILED → 抛 {@link CompliancePollError} kind='terminal_failure';\n * - UNKNOWN / RETRYING / PENDING → 继续轮询直到 timeout;\n * - timeout → 抛 {@link CompliancePollError} kind='timeout'。\n */\n async waitForTimestampVerified(\n id: number,\n opts: CompliancePollOptions = {},\n ): Promise<TimestampToken> {\n return this.poll<TimestampToken>(\n () => this.getTimestamp(id, opts.signal),\n (t) => classifyTimestamp(t.verificationStatus as ComplianceTimestampVerificationStatus),\n opts,\n );\n }\n\n // =========================================================================\n // TSA readonly views (read-only — compliance gateway S3 / gap-register U-7)\n // =========================================================================\n\n /**\n * 读 — 时间章授权机构(TSA)provider 列表(compliance gateway S3)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G3 为每个 TSA provider 返回\n * 一条 {@link TsaProvider}:名称、所处环境、当前是否可用。只读视图,不含\n * provider 端点 / 凭证 / 证书等内部接入材料。\n */\n listTsaProviders(signal?: AbortSignal): Promise<TsaProvider[]> {\n return this.read<TsaProvider[]>(\n 'GET',\n '/compliance/timestamps/providers',\n null,\n signal,\n );\n }\n\n /**\n * 读 — 时间章统计视图(compliance gateway S3)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 {@link TsaStats}:时间章总数\n * + 按校验状态分桶的计数。只读聚合视图。\n */\n getTsaStats(signal?: AbortSignal): Promise<TsaStats> {\n return this.read<TsaStats>(\n 'GET',\n '/compliance/timestamps/stats',\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Evidence Package\n // =========================================================================\n\n /** 构建证据包(写)。 */\n buildEvidencePackage(\n assetId: number,\n timestampTokenId?: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<EvidencePackage> {\n const tsParam = timestampTokenId == null\n ? ''\n : '?timestampTokenId=' + encodeURIComponent(timestampTokenId);\n return this.write<EvidencePackage>(\n 'POST',\n `/compliance/evidence/assets/${encodeURIComponent(assetId)}/packages${tsParam}`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 读 — 证据包分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listEvidencePackages(\n req: ListEvidencePackagesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<EvidencePackagePageItem>> {\n return this.read<PageResult<EvidencePackagePageItem>>(\n 'GET',\n `/compliance/evidence/packages/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Report\n // =========================================================================\n\n /** 创建证据报告(写)。 */\n createReport(\n req: CreateReportRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ComplianceReport> {\n return this.write<ComplianceReport>('POST', '/compliance/reports', req, writeCtx(opts));\n }\n\n /** 读 — 报告详情。 */\n getReport(id: number, signal?: AbortSignal): Promise<ComplianceReport> {\n return this.read<ComplianceReport>(\n 'GET',\n `/compliance/reports/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 证据报告分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listReports(\n req: ListReportsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<ReportPageItem>> {\n return this.read<PageResult<ReportPageItem>>(\n 'GET',\n `/compliance/reports/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 发布报告(写,step-up 必须)。\n *\n * `@status gated` — step-up 闸门未闭合前服务端会一致返回\n * `COMPLIANCE_STEP_UP_REQUIRED`(数值码 1031000013)。SDK 不会自动重试、不伪成功;\n * 调用方需要引导用户重新做 OAuth introspection 或重新登录后再次调用本方法\n *(使用同一 idempotency-key)。方法状态分级见 `docs/compliance.md` Method Status。\n */\n publishReport(id: number, opts: ComplianceWriteOptions = {}): Promise<ComplianceReport> {\n return this.write<ComplianceReport>(\n 'POST',\n `/compliance/reports/${encodeURIComponent(id)}/publish`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 下载报告(读)。返回 {@link ReportDownload}:报告 hash + 资产 hash + 证据包 hash +\n * 时间章 serial/genTime,足以离线复核。\n * 不返回 bodyCanonicalJson / storage key / subject snapshot id。\n */\n downloadReport(id: number, signal?: AbortSignal): Promise<ReportDownload> {\n return this.read<ReportDownload>(\n 'GET',\n `/compliance/reports/${encodeURIComponent(id)}/download`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Signing Envelope\n // =========================================================================\n\n /** 创建 envelope(写)。返回 envelope id。 */\n createSigningEnvelope(\n req: CreateSigningEnvelopeRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<number> {\n return this.write<number>(\n 'POST',\n '/compliance/signing-envelopes',\n req,\n writeCtx(opts),\n );\n }\n\n /** 读 — envelope 详情。租户由服务端从 compliance token principal 推导。 */\n getSigningEnvelope(\n envelopeId: number,\n signal?: AbortSignal,\n ): Promise<SigningEnvelope> {\n return this.read<SigningEnvelope>(\n 'GET',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 签署 envelope 分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listSigningEnvelopes(\n req: ListSigningEnvelopesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<SigningEnvelopePageItem>> {\n return this.read<PageResult<SigningEnvelopePageItem>>(\n 'GET',\n `/compliance/signing-envelopes/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 正式签署(写,step-up 必须)。\n *\n * `@status gated` — 服务端闸门关闭时会一致返回 `ENVELOPE_GATE_CLOSED` (1031004004)。\n * SDK 不重试、不伪成功;调用方应该将该错误展示为\"功能未开放\"。\n */\n signEnvelope(\n envelopeId: number,\n req: SignEnvelopeRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n return this.write<void>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/sign`,\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 创建 H5 签署短链(写,step-up 必须)。\n *\n * `@status gated` — 同 {@link signEnvelope}:服务端闸门关闭时 SDK 不重试、不伪成功。\n */\n createH5SigningUrl(\n envelopeId: number,\n req: CreateH5SigningUrlRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<string> {\n return this.write<string>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/h5-url`,\n req,\n writeCtx(opts),\n );\n }\n\n /** 同步 provider 状态(写但只读对账,不创建新 provider 请求)。 */\n syncSigningEnvelopeStatus(\n envelopeId: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n return this.write<void>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/sync-provider-status`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 读 — envelope 下挂的合同列表(compliance gateway S4)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G4 为每份挂在该 envelope 上的\n * 合同返回一条 {@link EnvelopeContractItem}:编号 / 标题 / MIME / 大小 / 哈希\n * 指纹 / 状态。返回普通数组(非 `PageResult`)。SDK-safe 视图——不含合同原文 /\n * storage key / provider raw payload。\n */\n listEnvelopeContracts(\n envelopeId: number,\n signal?: AbortSignal,\n ): Promise<EnvelopeContractItem[]> {\n return this.read<EnvelopeContractItem[]>(\n 'GET',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/contracts`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — envelope 关联的 provider 请求列表(compliance gateway S4)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G4 复用操作投影\n * {@link OperationPageItem}:描述每次 provider 请求本身的执行进度,与 envelope\n * 领域状态正交。返回普通数组(非 `PageResult`)。\n */\n listEnvelopeProviderRequests(\n envelopeId: number,\n signal?: AbortSignal,\n ): Promise<OperationPageItem[]> {\n return this.read<OperationPageItem[]>(\n 'GET',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/provider-requests`,\n null,\n signal,\n );\n }\n\n /**\n * 作废 envelope(写,compliance gateway S4)。\n *\n * 走 compliance 写路径——发送前 `ensureToken` 一次、不自动重试、`401` 不刷新\n * 重放;支持 `Idempotency-Key` header(强烈建议调用方持久化幂等键,重试 / 恢复\n * 时复用,避免重复作废)。`req.reason` 为必填的作废原因,随 JSON body 提交。\n */\n voidEnvelope(\n envelopeId: number,\n req: VoidEnvelopeRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<boolean> {\n return this.write<boolean>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/void`,\n req,\n writeCtx(opts),\n );\n }\n\n // =========================================================================\n // Seal Approval\n // =========================================================================\n\n /**\n * 提交用印审批申请(写)。\n *\n * `@status production-ready` — 服务端以 `Idempotency-Key` + 业务请求指纹做重放保护:\n * 同 key + 同请求 → 返回原审批 id;同 key + 不同请求 → 拒绝复用幂等键。强烈建议调用方\n * 持久化 `idempotencyKey`,网络重试 / 任务恢复时复用,避免重复创建审批单。\n */\n submitSealApproval(\n req: SubmitSealApprovalRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<number> {\n return this.write<number>(\n 'POST',\n '/compliance/seal-approvals',\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 审批通过用印申请(写,step-up 必须)。\n *\n * `@status gated` — step-up 未闭合前服务端会返回 `COMPLIANCE_STEP_UP_REQUIRED`。\n * SDK 不重试、不伪成功。方法状态分级见 `docs/compliance.md` Method Status。\n */\n approveSealApproval(\n id: number,\n query: ApproveSealApprovalQuery,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n const q = new URLSearchParams();\n if (query.expiresAt) q.set('expiresAt', query.expiresAt);\n if (query.note) q.set('note', query.note);\n const qs = q.toString();\n return this.write<void>(\n 'POST',\n `/compliance/seal-approvals/${encodeURIComponent(id)}/approve${qs ? '?' + qs : ''}`,\n null,\n writeCtx(opts),\n );\n }\n\n rejectSealApproval(\n id: number,\n query: RejectSealApprovalQuery,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n const q = new URLSearchParams();\n if (query.reason) q.set('reason', query.reason);\n const qs = q.toString();\n return this.write<void>(\n 'POST',\n `/compliance/seal-approvals/${encodeURIComponent(id)}/reject${qs ? '?' + qs : ''}`,\n null,\n writeCtx(opts),\n );\n }\n\n cancelSealApproval(\n id: number,\n query: CancelSealApprovalQuery,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n const q = new URLSearchParams();\n if (query.reason) q.set('reason', query.reason);\n const qs = q.toString();\n return this.write<void>(\n 'POST',\n `/compliance/seal-approvals/${encodeURIComponent(id)}/cancel${qs ? '?' + qs : ''}`,\n null,\n writeCtx(opts),\n );\n }\n\n listPendingSealApprovals(\n signal?: AbortSignal,\n ): Promise<SealApproval[]> {\n return this.read<SealApproval[]>(\n 'GET',\n '/compliance/seal-approvals/pending',\n null,\n signal,\n );\n }\n\n getSealApproval(id: number, signal?: AbortSignal): Promise<SealApproval> {\n return this.read<SealApproval>(\n 'GET',\n `/compliance/seal-approvals/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 用印审批分页列表(compliance gateway S1)。\n *\n * 与 {@link listPendingSealApprovals}(仅 pending、不分页)不同,本方法支持分页与\n * 状态 / 时间过滤。走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;\n * `createTimeStart` / `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,\n * SDK 原样透传。\n */\n listSealApprovals(\n req: ListSealApprovalsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<SealApprovalPageItem>> {\n return this.read<PageResult<SealApprovalPageItem>>(\n 'GET',\n `/compliance/seal-approvals/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Seal Use (read-only — compliance gateway S6 / gap-register U-4)\n // =========================================================================\n\n /**\n * 读 — 用印执行记录分页列表(compliance gateway S6)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 yudao `PageResult<T>`\n * (`{ total, list }`)。一次用印执行(seal use)描述 envelope / contract /\n * seal / 审批联动后【真正调用 provider 落章】的那一笔记录,与 envelope\n * 领域状态正交。所有过滤项可选;`createTimeStart` / `createTimeEnd` 由调用方\n * 按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n *\n * 与后端复用同一只读 scope `CONTRACT_SIGNING_READ`\n *({@link ScopeComplianceContractSigningRead})——不引入新 scope。\n */\n listSealUses(\n req: ListSealUsesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<SealUsePageItem>> {\n return this.read<PageResult<SealUsePageItem>>(\n 'GET',\n `/compliance/seal-uses/page${pageQuery(req, ['sealId', 'envelopeId', 'usageStatus', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Provider Request (read-only)\n // =========================================================================\n\n getProviderRequest(id: number, signal?: AbortSignal): Promise<ProviderRequestStatusView> {\n return this.read<ProviderRequestStatusView>(\n 'GET',\n `/compliance/provider-requests/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 轮询 provider request 到 SUCCESS / FAILED 终态。\n * - SUCCESS / FAILED → 返回最后视图;\n * - UNKNOWN / RETRYING / PENDING → 继续轮询;\n * - timeout → 抛 {@link CompliancePollError} kind='timeout',不自动重发原 provider 请求。\n *\n * SUCCESS 不代表 billing 已 commit;调用方仍需通过业务侧 envelope / asset 终态判断。\n */\n async waitForProviderRequestTerminal(\n id: number,\n opts: CompliancePollOptions = {},\n ): Promise<ProviderRequestStatusView> {\n return this.poll<ProviderRequestStatusView>(\n () => this.getProviderRequest(id, opts.signal),\n (v) => classifyProviderStatus(v.status as ComplianceProviderRequestStatus),\n opts,\n );\n }\n\n // =========================================================================\n // Capabilities (read-only — compliance gateway S2 / gap-register U-6)\n // =========================================================================\n\n /**\n * 读 — compliance 能力闸门列表(compliance gateway S2)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G2 为每个高风险 / 收费动作\n * (`signEnvelope` / `createH5SigningUrl` / `publishReport` /\n * `approveSealApproval` / `executeSealUse` / `createSeal`)返回一条\n * {@link ComplianceCapability}:是否可执行、所处状态、所需 scope / step-up。\n *\n * 调用方在高风险动作执行【前】查询本结果做门控;拿不到能力时必须 fail-closed\n *(按 `executable=false` 处理)。\n */\n getCapabilities(signal?: AbortSignal): Promise<ComplianceCapability[]> {\n return this.read<ComplianceCapability[]>(\n 'GET',\n '/compliance/capabilities',\n null,\n signal,\n );\n }\n\n /**\n * 读 — 单个动作的能力闸门视图(便捷方法)。\n *\n * 拉取完整 {@link getCapabilities} 列表并返回 `action` 匹配的那一条,无匹配时\n * 返回 `undefined`。**每次调用产生一次网络请求**——需要门控多个动作时应改用\n * {@link getCapabilities} 一次性取回再本地查表,避免重复请求。\n *\n * 与 {@link getCapabilities} 一致走 GET 读路径(允许 401 单次刷新重放)。\n */\n async getFeatureGate(\n action: string,\n signal?: AbortSignal,\n ): Promise<ComplianceCapability | undefined> {\n const caps = await this.getCapabilities(signal);\n return caps.find((c) => c.action === action);\n }\n\n // =========================================================================\n // Operation projection (read-only — compliance gateway S2 / gap-register U-5)\n // =========================================================================\n\n /**\n * 读 — compliance 操作投影分页列表(compliance gateway S2)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`(`{ total, list }`)。所有过滤项\n * 可选;`createTimeStart` / `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss`\n * 提供,SDK 原样透传,不做格式校验或时区转换。\n *\n * 操作投影描述【一次操作】本身的执行进度,与履约对象的领域状态正交。\n */\n listOperations(\n req: ListOperationsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<OperationPageItem>> {\n return this.read<PageResult<OperationPageItem>>(\n 'GET',\n `/compliance/operations/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — compliance 操作投影详情(compliance gateway S2)。\n *\n * `id` 为数值行主键(非 `operationId` 幂等键)。走 GET 读路径(允许 401 单次\n * 刷新重放)。\n */\n getOperation(id: number, signal?: AbortSignal): Promise<OperationDetail> {\n return this.read<OperationDetail>(\n 'GET',\n `/compliance/operations/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Contract Template (compliance gateway S5 — gap-register U-2)\n // =========================================================================\n\n /**\n * 创建合同模板(写)。\n *\n * 走 compliance 写路径——发送前 `ensureToken` 一次、不自动重试、`401` 不刷新\n * 重放;支持 `Idempotency-Key` header(强烈建议调用方持久化幂等键,重试 / 恢复\n * 时复用,避免重复创建模板)。模板创建后初始状态为 `DRAFT`。\n */\n createContractTemplate(\n req: CreateContractTemplateRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n '/compliance/contract-templates',\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 更新合同模板(写,仅 DRAFT 状态)。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。所有字段\n * 可选,缺省字段视为不修改。服务端在 PUBLISHED / ARCHIVED 状态下会拒绝更新。\n */\n updateContractTemplate(\n id: number,\n req: UpdateContractTemplateRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}`,\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 删除合同模板(写,仅 DRAFT 状态)。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。服务端\n * 在 PUBLISHED / ARCHIVED 状态下会拒绝删除——已发布的模板应改走 `archive`。\n */\n deleteContractTemplate(\n id: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n return this.write<void>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/delete`,\n null,\n writeCtx(opts),\n );\n }\n\n /** 读 — 合同模板详情。 */\n getContractTemplate(\n id: number,\n signal?: AbortSignal,\n ): Promise<ContractTemplateResp> {\n return this.read<ContractTemplateResp>(\n 'GET',\n `/compliance/contract-templates/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 合同模板分页列表(compliance gateway S5)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 yudao `PageResult<T>`\n * (`{ total, list }`)。所有过滤项可选;`createTimeStart` / `createTimeEnd`\n * 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。列表项视图\n * {@link ContractTemplatePageItem} 不含 `fields`——字段叠加只在详情 / 版本\n * 快照里返回。\n */\n listContractTemplates(\n req: ListContractTemplatesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<ContractTemplatePageItem>> {\n return this.read<PageResult<ContractTemplatePageItem>>(\n 'GET',\n `/compliance/contract-templates/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 上传合同模板 PDF(写)。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。请求体\n * 为 `{ pdfBase64 }`;SDK 不在客户端做 PDF 解析 / 几何校验,原样透传给后端。\n * 返回上传后的最新模板视图(含 `pdfHash` / `pdfPageCount`)。\n */\n uploadContractTemplatePdf(\n id: number,\n req: UploadContractTemplatePdfRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/pdf`,\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 发布合同模板(写)。DRAFT → PUBLISHED,落版本快照。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。\n * publish 后 `currentVersion` 递增,`fields` 与 `pdfHash` 同步固化进版本表。\n */\n publishContractTemplate(\n id: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/publish`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 归档合同模板(写)。PUBLISHED → ARCHIVED。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。\n * 已归档模板只读,不再允许 publish / 编辑 / 删除。\n */\n archiveContractTemplate(\n id: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/archive`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 读 — 合同模板版本快照列表。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 {@link ContractTemplateVersion}\n * 普通数组(非 `PageResult`)——每次 publish 落一个不可变快照,记录当时的\n * `name` / `pdfHash` / `fields` / `statusAtSnapshot`,是离线复核 / 版本对账\n * 的依据。\n */\n listContractTemplateVersions(\n id: number,\n signal?: AbortSignal,\n ): Promise<ContractTemplateVersion[]> {\n return this.read<ContractTemplateVersion[]>(\n 'GET',\n `/compliance/contract-templates/${encodeURIComponent(id)}/versions`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Error classification (re-export for convenience)\n // =========================================================================\n\n classifyError(err: unknown): ComplianceErrorInfo | null {\n if (!isBusinessErrorLike(err)) return null;\n if (!isComplianceBusinessError(err)) return null;\n return classifyComplianceError(err);\n }\n\n // =========================================================================\n // Internal helpers\n // =========================================================================\n\n /**\n * 读路径:GET / 公开 verify。允许 401 单次刷新后重放(GET 幂等安全)。\n * 与 client.doJSONFullInternal 行为一致;不复用其代码因为 base URL 不同。\n */\n private async read<T>(\n method: 'GET' | 'HEAD' | 'OPTIONS',\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n extraHeaders: Record<string, string> = {},\n ): Promise<T> {\n return this.executeJson<T>(method, path, body, signal, {\n retryOn401: true,\n extraHeaders,\n });\n }\n\n /**\n * 公开读路径:public verify。\n *\n * 与 {@link read} 的区别 — public 端点不应要求认证:\n * - 无 token 时匿名请求:ensureToken 抛 `not authorized` 会被吞掉,继续匿名发送。\n * - 有 token 时附带 `Authorization`,保留后端审计上下文。\n * - 不做 401 refresh replay:401 直接抛 HTTPError,不触发 `forceRefresh`。\n *\n * URL 仍走 `client.complianceURL(path)`,不复用 `/api/v4`;底层复用\n * `client.doRequest`,不新增 fetch/axios 直连。\n */\n private async publicRead<T>(\n method: 'GET' | 'HEAD' | 'OPTIONS',\n path: string,\n signal: AbortSignal | undefined,\n ): Promise<T> {\n let token = '';\n try {\n token = await this.client.ensureToken(signal);\n } catch {\n // public 端点允许未授权 — 吞掉 `not authorized`,继续匿名请求。\n }\n\n const url = this.client.complianceURL(path);\n const headers: Record<string, string> = { Accept: 'application/json' };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const resp = await this.client.doRequest({ method, url, headers }, signal);\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = resp.body\n ? await readLimited(resp.body, maxErrorBodySize)\n : new Uint8Array();\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n if (!text) return undefined as unknown as T;\n const parsed = JSON.parse(text) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(parsed);\n if (bizErr) throw bizErr;\n return parsed.data;\n }\n\n /**\n * 写路径:POST。\n * - 发送前 ensureToken 一次确保 token fresh。\n * - 不自动 401 重放:401 → 抛 HTTPError;调用方必须自己刷新 token 后用同一\n * idempotency-key 重新发起,避免 provider 侧重复请求。\n * - 不走 doRequestWithRetry:写操作不允许 5xx/timeout 自动重试。\n */\n private async write<T>(\n method: 'POST' | 'PUT' | 'DELETE',\n path: string,\n body: unknown | null,\n ctx: WriteContext & { extraHeaders?: Record<string, string> },\n ): Promise<T> {\n const headers: Record<string, string> = { ...(ctx.extraHeaders ?? {}) };\n if (ctx.idempotencyKey) headers['Idempotency-Key'] = ctx.idempotencyKey;\n return this.executeJson<T>(method, path, body, ctx.signal, {\n retryOn401: false,\n extraHeaders: headers,\n });\n }\n\n private async executeJson<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: { retryOn401: boolean; extraHeaders: Record<string, string> },\n retried = false,\n ): Promise<T> {\n // 非流式 JSON 请求套默认超时 — 组合 signal (超时 + 用户 signal, 任一触发都 abort),\n // 避免上游 hang 导致 Promise 永不 settle。compliance 无流式/下载路径, 全部 JSON。\n const ctl = this.client.withRequestTimeout(DEFAULT_API_TIMEOUT_MS, signal);\n try {\n return await this.executeJsonInner<T>(method, path, body, ctl.signal, opts, retried);\n } finally {\n ctl.dispose();\n }\n }\n\n private async executeJsonInner<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: { retryOn401: boolean; extraHeaders: Record<string, string> },\n retried: boolean,\n ): Promise<T> {\n const token = await this.client.ensureToken(signal);\n const url = this.client.complianceURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n Accept: 'application/json',\n ...opts.extraHeaders,\n };\n let bodyStr: string | undefined;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n headers['Content-Type'] = 'application/json';\n }\n\n const resp = await this.client.doRequest({ method, url, headers, body: bodyStr }, signal);\n\n if (resp.status === 401 && opts.retryOn401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n await this.client.forceRefresh(signal, token);\n // 复用同一组合 signal (含剩余超时预算), 不再重套超时。\n return this.executeJsonInner<T>(method, path, body, signal, opts, true);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = resp.body\n ? await readLimited(resp.body, maxErrorBodySize)\n : new Uint8Array();\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n if (!text) return undefined as unknown as T;\n const parsed = JSON.parse(text) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(parsed);\n if (bizErr) throw bizErr;\n return parsed.data;\n }\n\n private async poll<T>(\n fetcher: () => Promise<T>,\n classify: (value: T) => PollDecision,\n opts: CompliancePollOptions,\n ): Promise<T> {\n const cfg = {\n timeoutMs: opts.timeoutMs ?? DEFAULT_POLL.timeoutMs,\n initialIntervalMs: opts.initialIntervalMs ?? DEFAULT_POLL.initialIntervalMs,\n maxIntervalMs: opts.maxIntervalMs ?? DEFAULT_POLL.maxIntervalMs,\n multiplier: opts.multiplier ?? DEFAULT_POLL.multiplier,\n };\n const deadline = Date.now() + cfg.timeoutMs;\n let interval = cfg.initialIntervalMs;\n let lastValue: T | undefined;\n\n while (Date.now() < deadline) {\n if (opts.signal?.aborted) {\n // 中途 abort: 带上已观测到的最后状态 (若有), 便于排障定位停在哪一步。\n throw new CompliancePollError(\n 'compliance poll aborted',\n 'unknown',\n deriveLastInfo(lastValue, false),\n );\n }\n lastValue = await fetcher();\n const decision = classify(lastValue);\n if (decision === 'done') return lastValue;\n if (decision === 'failed') {\n // 终态失败: 把最后一次轮询到的状态视图作为 lastInfo 带出 (terminal=true)。\n throw new CompliancePollError(\n 'compliance poll observed terminal failure',\n 'terminal_failure',\n deriveLastInfo(lastValue, true),\n );\n }\n // decision === 'continue' → wait then retry\n const sleepMs = Math.min(interval, deadline - Date.now());\n if (sleepMs <= 0) break;\n await sleep(sleepMs, opts.signal);\n interval = Math.min(Math.floor(interval * cfg.multiplier), cfg.maxIntervalMs);\n }\n // 超时: 带上最后一次轮询到的 (非终态) 状态, 让调用方知道卡在哪个 status。\n throw new CompliancePollError(\n 'compliance poll timed out',\n 'timeout',\n deriveLastInfo(lastValue, false),\n );\n }\n}\n\n/**\n * 从最后一次轮询到的状态视图派生 {@link ComplianceErrorInfo}, 供 CompliancePollError 携带最后状态。\n *\n * 轮询返回的是状态视图 (TimestampToken / ProviderRequestStatusView 等) 而非 ComplianceErrorInfo,\n * 故这里做 best-effort 字段探测: 优先取常见状态字段 (status / verificationStatus) 作为可读 message,\n * 并在状态视图内联携带服务端 errorCode / errorMessage 时映射进 code / message。\n * 拿不到任何状态 (lastValue 为 undefined, 即首次 fetch 前就 abort) 时返回 undefined。\n *\n * 不伪造 numeric error code (默认 0) — 这是\"最后状态\"诊断载体, 非真实错误码分类。\n */\nfunction deriveLastInfo(value: unknown, terminal: boolean): ComplianceErrorInfo | undefined {\n if (value == null || typeof value !== 'object') return undefined;\n const v = value as Record<string, unknown>;\n\n const statusStr =\n (typeof v['status'] === 'string' && v['status']) ||\n (typeof v['verificationStatus'] === 'string' && v['verificationStatus']) ||\n '';\n\n const rawCode = v['errorCode'] ?? v['code'];\n const code = typeof rawCode === 'number' ? rawCode : 0;\n\n const rawMsg = v['errorMessage'] ?? v['message'];\n const message =\n (typeof rawMsg === 'string' && rawMsg) ||\n (statusStr ? `last polled status: ${statusStr}` : '') ||\n 'compliance poll: last observed status (no detail)';\n\n return {\n code,\n message,\n key: 'UNKNOWN_COMPLIANCE_ERROR',\n retryable: false,\n terminal,\n stepUpRequired: false,\n };\n}\n\ntype PollDecision = 'continue' | 'done' | 'failed';\n\nfunction classifyTimestamp(\n status: ComplianceTimestampVerificationStatus | string,\n): PollDecision {\n switch (status) {\n case 'VERIFIED':\n return 'done';\n case 'FAILED':\n case 'LOCAL_VERIFY_FAILED':\n return 'failed';\n case 'PENDING':\n case 'UNKNOWN':\n case 'RETRYING':\n default:\n return 'continue';\n }\n}\n\nfunction classifyProviderStatus(\n status: ComplianceProviderRequestStatus | string,\n): PollDecision {\n switch (status) {\n case 'SUCCESS':\n return 'done';\n case 'FAILED':\n return 'failed';\n case 'PENDING':\n case 'UNKNOWN':\n case 'RETRYING':\n default:\n return 'continue';\n }\n}\n\n/**\n * 把分页请求 + 命名空间各自的过滤字段拼成 query string(含前导 `?`,空则返回 `''`)。\n *\n * - 分页 / 排序字段(`pageNo` / `pageSize` / `sortBy` / `sortDirection`)来自共享\n * `PageRequest`,由本函数统一处理。\n * - `filterKeys` 是调用方命名空间各自声明的过滤字段名白名单 —— 仅这些键会被读取,\n * 值经 `String()` 归一后原样透传(`createTimeStart` / `createTimeEnd` 等 datetime\n * 字符串不在 SDK 侧做格式校验或时区转换)。\n * - `null` / `undefined` / 空字符串的字段一律跳过,不发送空参数。\n */\nfunction pageQuery<T extends PageRequest>(req: T, filterKeys: ReadonlyArray<keyof T>): string {\n const q = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value == null) return;\n const s = typeof value === 'string' ? value : String(value);\n if (s === '') return;\n q.set(key, s);\n };\n append('pageNo', req.pageNo);\n append('pageSize', req.pageSize);\n append('sortBy', req.sortBy);\n append('sortDirection', req.sortDirection);\n for (const key of filterKeys) {\n append(String(key), req[key]);\n }\n const qs = q.toString();\n return qs ? '?' + qs : '';\n}\n\nfunction writeCtx(\n opts: ComplianceWriteOptions,\n extraHeaders: Record<string, string> = {},\n): WriteContext & { extraHeaders: Record<string, string> } {\n return {\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n extraHeaders,\n };\n}\n\nfunction isBusinessErrorLike(err: unknown): err is BusinessError {\n if (err == null || typeof err !== 'object') return false;\n return typeof (err as { code?: unknown }).code === 'number';\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new CompliancePollError('compliance poll aborted', 'unknown'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n reject(new CompliancePollError('compliance poll aborted', 'unknown'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","// bug-report.ts — 端口自 acosmi-sdk-go/bug_report.go (v0.17.0)\n//\n// V30 CrabCode CLI bug 报告端点封装:\n// - POST /api/v4/crabcode_cli_feedback — Bearer JWT (account scope), 限流 20/h/user\n// - GET /api/v4/crabcode/bug/:bug_id — 公开 (无 auth), 限流 60/min/IP\n//\n// 设计要点:\n// - reportData 用 unknown (调用方任意 JSON 可编码对象), 后端只解析为 map 用于脱敏 + 字段抽取,\n// 不做严格 schema 校验\n// - 服务端兜底脱敏 6 类正则 (anthropic-key/openai-key/github/aws/google/bearer),\n// 调用方无须自行做密钥过滤\n// - 公开 GET 端点走 doPublicJSON, 无 token 也能调\n\nimport { Client } from '../core/client';\n\n/** POST /api/v4/crabcode_cli_feedback 返回体 */\nexport interface BugReportResult {\n /** 服务端生成的 UUID (写入 GitHub Issue body 用) */\n feedback_id: string;\n /** 公开页链接, 形如 https://<base>/chat/crabcode/bug/<uuid> */\n detail_url: string;\n}\n\n/**\n * GET /api/v4/crabcode/bug/:id 返回体 (公开 ViewModel)\n *\n * errors / transcript / extras 用 unknown[] / Record<string, unknown>:\n * 客户端 reportData schema 会随版本变, SDK 不强 typed.\n */\nexport interface BugView {\n id: string;\n description: string;\n platform?: string;\n terminal?: string;\n version?: string;\n messageCount: number;\n hasErrors: boolean;\n status: string;\n clientDatetime?: string;\n createdAt: string;\n errors?: unknown[];\n transcript?: unknown[];\n extras?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// 响应解包 —— 这两个端点返回**裸字段**, 不是平台通用的 {code, data, msg} 信封.\n//\n// 真源: nexus-v4 `internal/handler/crabcode_bug.go`\n// Submit -> c.JSON(200, gin.H{\"feedback_id\": ..., \"detail_url\": ...})\n// AdminGet -> c.JSON(200, view)\n// Go SDK (bug_report.go, 本文件的移植源) 也是直接 decode 进 BugReportResult,\n// 没有 .data 一层 —— 是本 TS 移植和 Rust 移植自己加了信封.\n//\n// 后果不是「读不到值」这么轻: 加了信封的版本恒返回 undefined, 而网关此时**已经\n// 落库并发出通知邮件**. CrabCode GUI 的「问题反馈」因此两个多月里每次都提示失败,\n// 上游每次都收到一封通知 —— 两边各自看起来都像对方的问题.\n//\n// 这里裸形态优先 + 信封形态兜底: 网关将来若统一成信封, 无需再动 SDK.\n// 两种形态都取不到必填字段时**抛错**, 不静默返回 undefined —— 沉默正是上一版\n// 让调用方无从判断的原因.\n// ---------------------------------------------------------------------------\n\ntype EnvelopeTolerant<T> = (T & { data?: T | null }) | undefined;\ntype BugReportEnvelopeTolerant = EnvelopeTolerant<Partial<BugReportResult>>;\ntype BugViewEnvelopeTolerant = EnvelopeTolerant<Partial<BugView>>;\n\nfunction unwrapBugReport<T extends object>(\n raw: EnvelopeTolerant<Partial<T>>,\n op: string,\n isComplete: (value: Partial<T>) => boolean,\n): T {\n if (raw && isComplete(raw)) return raw as T;\n const inner = raw?.data;\n if (inner && isComplete(inner)) return inner as T;\n const keys = raw && typeof raw === 'object' ? Object.keys(raw) : [];\n throw new Error(\n `acosmi: ${op}: gateway accepted the request but the response is missing required fields ` +\n `(observed keys: ${keys.length > 0 ? keys.join(',') : '<none>'})`,\n );\n}\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 上报一份 CrabCode bug 报告.\n *\n * reportData 是任意 JSON 可编码对象, 后端只解析为 map 做脱敏 + 字段抽取.\n *\n * 错误:\n * - HTTPError 401 — token 过期 (内部已做一次 refresh + retry, 仍 401 抛出)\n * - HTTPError 403 type=\"permission_error\" message 含 \"Custom data retention settings\"\n * — 用户所在组织 ZDR, 拒绝收集 (调用方应提示用户走外部渠道)\n * - HTTPError 400 type=\"invalid_request_error\" — content 不是合法 JSON 或 reportData 编码失败\n * - HTTPError 429 — 限流 20/h/user (retryAfter 字段含建议等待秒数)\n * - NetworkError — 传输层错误 (timeout / EOF / unreachable)\n */\n submitBugReport(reportData: unknown, signal?: AbortSignal): Promise<BugReportResult>;\n\n /**\n * 取公开 ViewModel (无需 auth, 任意人凭 ID 可读).\n *\n * 用途: SSR 公开页后端 fetch / 维护者诊断 CLI / 集成测试.\n *\n * 错误:\n * - HTTPError 404 — bug 不存在或被软删\n * - HTTPError 429 — 限流 60/min/IP\n * - NetworkError — 传输层错误\n */\n getBugReport(bugID: string, signal?: AbortSignal): Promise<BugView>;\n }\n}\n\nClient.prototype.submitBugReport = async function (\n this: Client,\n reportData: unknown,\n signal?: AbortSignal,\n) {\n if (reportData == null) {\n throw new Error('acosmi: reportData required');\n }\n let contentStr: string;\n try {\n contentStr = JSON.stringify(reportData);\n } catch (e) {\n throw new Error(`acosmi: marshal reportData: ${e instanceof Error ? e.message : String(e)}`);\n }\n const result = await this.doJSON<BugReportEnvelopeTolerant>(\n 'POST',\n '/crabcode_cli_feedback',\n { content: contentStr },\n signal,\n );\n return unwrapBugReport(result, 'submitBugReport', (r) =>\n typeof r.feedback_id === 'string' && r.feedback_id.length > 0,\n );\n};\n\nClient.prototype.getBugReport = async function (this: Client, bugID: string, signal?: AbortSignal) {\n const trimmed = bugID.trim();\n if (trimmed === '') {\n throw new Error('acosmi: bugID required');\n }\n // 公开端点 — 不强制 token (账号系统未登录 / token 过期场景下也能查)\n const resp = await this.doPublicJSON<BugViewEnvelopeTolerant>(\n 'GET',\n `/crabcode/bug/${trimmed}`,\n null,\n signal,\n );\n return unwrapBugReport(resp, 'getBugReport', (r) => typeof r.id === 'string');\n};\n","// subscription/client.ts — 商品化总规划 P1 订阅域 API 调用 (declaration merging Client).\n//\n// 端点对应 tk-dist `/api/distribution/public/pricing/plans`,\n// 通过 Go 网关 `/api/v4/distribution/public/pricing/plans` 反向代理 (P3 商品中心接入时落地).\n// P1 阶段 SDK 暴露 namespace, 后端代理路由 P3 子窗口补.\n//\n// 当前订阅的规范入口是网关 GET /entitlements/membership (getMembership) —— C 端会员中心订阅概览。\n// 旧的 /distribution/user/subscriptions 路径网关从未暴露 (恒 404), 已移除; listUserSubscriptions 现委托 getMembership。\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n Membership,\n SubscriptionAudience,\n SubscriptionPlan,\n SubscriptionTier,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 列出当前可售订阅计划; audience='PERSONAL'|'ENTERPRISE' 可选过滤 */\n listPlans(\n audience?: SubscriptionAudience,\n signal?: AbortSignal,\n ): Promise<SubscriptionPlan[]>;\n\n /** 查询当前用户会员/订阅概览 (C 端会员中心)。无活跃订阅时 hasActive=false/isFree=true。 */\n getMembership(signal?: AbortSignal): Promise<Membership>;\n\n /** 由活跃权益推导订阅层级 (free/pro)。 */\n getSubscriptionTier(signal?: AbortSignal): Promise<SubscriptionTier>;\n\n /** 订阅支付前绑定硬闸。返回 {ok:true} 表示已绑定手机/邮箱可放行支付。\n * 未绑定时网关返回 HTTP 403 + 业务码 41001 (doJSON 抛 HTTPError), 调用方应据此引导用户先绑定联系方式再支付。 */\n subscriptionPrecheck(signal?: AbortSignal): Promise<{ ok: boolean }>;\n\n /** @deprecated 网关无订阅列表端点; 旧实现打 /distribution/user/subscriptions 恒 404。改用 getMembership()。\n * 本方法现委托 getMembership(): 有活跃订阅返回单元素数组, 否则空数组。 */\n listUserSubscriptions(signal?: AbortSignal): Promise<Membership[]>;\n\n /**\n * 按 planCode 精确取单个可售订阅计划 (V41 起 planCode 在 active 内唯一)。\n * 复用 listPlans 客户端过滤, 未命中返回 null。减少 C 端按字段手筛 (deep-review §12.3)。\n */\n getPlanByCode(planCode: string, signal?: AbortSignal): Promise<SubscriptionPlan | null>;\n }\n}\n\nClient.prototype.listPlans = async function (\n this: Client,\n audience?: SubscriptionAudience,\n signal?: AbortSignal,\n): Promise<SubscriptionPlan[]> {\n const query = audience ? `?audience=${encodeURIComponent(audience)}` : '';\n const resp = await this.doJSON<APIResponse<SubscriptionPlan[]>>(\n 'GET',\n `/distribution/public/pricing/plans${query}`,\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\nClient.prototype.getMembership = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<Membership> {\n const resp = await this.doJSON<APIResponse<Membership>>(\n 'GET',\n '/entitlements/membership',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getSubscriptionTier = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<SubscriptionTier> {\n const resp = await this.doJSON<APIResponse<SubscriptionTier>>(\n 'GET',\n '/entitlements/subscription',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.subscriptionPrecheck = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<{ ok: boolean }> {\n const resp = await this.doJSON<APIResponse<{ ok: boolean }>>(\n 'GET',\n '/consumer/subscriptions/precheck',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listUserSubscriptions = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<Membership[]> {\n const m = await this.getMembership(signal);\n return m.hasActive ? [m] : [];\n};\n\nClient.prototype.getPlanByCode = async function (\n this: Client,\n planCode: string,\n signal?: AbortSignal,\n): Promise<SubscriptionPlan | null> {\n if (!planCode) return null;\n const plans = await this.listPlans(undefined, signal);\n return plans.find((p) => p.planCode === planCode) ?? null;\n};\n","// pricing/client.ts — 公开业务参数 API (商品化总规划 P1 §13.2).\n//\n// 端点: tk-dist `/api/distribution/public/pricing/config` + `/models` (经 Go 反代).\n// P1 SDK 仅暴露 namespace; P3 商品中心接入时网关路由补.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n PricingConfig,\n PublicModelSummary,\n ComplianceSku,\n ComplianceQuoteResponse,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 查询公开业务参数. 不传 key → 默认返三件 (tk_to_fen_ratio/usd_cny_rate/freezone_reset_timezone);\n * 传 key (白名单内) → 仅返该 key. caller 自解析数值/布尔.\n */\n getPricingConfig(key?: string, signal?: AbortSignal): Promise<PricingConfig>;\n\n /** 公开模型列表 (P3 商品中心会重做; P1 阶段后端 stub 返空数组) */\n listPublicModels(signal?: AbortSignal): Promise<PublicModelSummary[]>;\n\n // =========================================================================\n // 商品化总规划 P4 §-1.2.B — csign 电子认证 SKU (公开匿名可读)\n // =========================================================================\n\n /**\n * 列出 csign 公开 SKU (匿名可调用).\n * @param region 区域 CN / OS / GLOBAL (空 fallback CN, 同时返回 GLOBAL)\n */\n listComplianceSkus(region?: string, signal?: AbortSignal): Promise<ComplianceSku[]>;\n\n /**\n * 匿名估价 (无用户态, 不查覆盖余额, 仅返回 overage 价 × 数量).\n * 真实用户报价含套餐覆盖需走登录后服务端 quote 端点。\n */\n quoteCompliance(\n skuCode: string,\n quantity?: number,\n region?: string,\n signal?: AbortSignal,\n ): Promise<ComplianceQuoteResponse>;\n }\n}\n\nClient.prototype.getPricingConfig = async function (\n this: Client,\n key?: string,\n signal?: AbortSignal,\n): Promise<PricingConfig> {\n const query = key ? `?key=${encodeURIComponent(key)}` : '';\n const resp = await this.doJSON<APIResponse<PricingConfig>>(\n 'GET',\n `/distribution/public/pricing/config${query}`,\n null,\n signal,\n );\n return resp.data ?? {};\n};\n\nClient.prototype.listPublicModels = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<PublicModelSummary[]> {\n const resp = await this.doJSON<APIResponse<PublicModelSummary[]>>(\n 'GET',\n '/distribution/public/pricing/models',\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\n// =============================================================================\n// 商品化总规划 P4 §-1.2.B — csign 电子认证 SKU\n// =============================================================================\n\nClient.prototype.listComplianceSkus = async function (\n this: Client,\n region?: string,\n signal?: AbortSignal,\n): Promise<ComplianceSku[]> {\n const query = region ? `?region=${encodeURIComponent(region)}` : '';\n const resp = await this.doJSON<APIResponse<ComplianceSku[]>>(\n 'GET',\n `/distribution/public/compliance/skus${query}`,\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\nClient.prototype.quoteCompliance = async function (\n this: Client,\n skuCode: string,\n quantity?: number,\n region?: string,\n signal?: AbortSignal,\n): Promise<ComplianceQuoteResponse> {\n if (!skuCode) {\n throw new Error('quoteCompliance: skuCode is required');\n }\n const params: string[] = [`skuCode=${encodeURIComponent(skuCode)}`];\n if (quantity != null) params.push(`quantity=${quantity}`);\n if (region) params.push(`region=${encodeURIComponent(region)}`);\n const resp = await this.doJSON<APIResponse<ComplianceQuoteResponse>>(\n 'GET',\n `/distribution/public/compliance/quote?${params.join('&')}`,\n null,\n signal,\n );\n return resp.data ?? { skuCode, available: false };\n};\n","// products/types.ts — 商品化总规划 P3 商品中心类型 (与 tk-dist DistProductMappingDO + AppPublicProductController 对齐).\n//\n// 端口自 tk-dist `controller/app/product/AppPublicProductController.toPublicResponse`.\n// 公开端点字段白名单严格 — feature_gate_json / retired_at / sales_channel_json / price_snapshot_policy 不暴露.\n\n/** 商品族 (与 V47 dist_product_mapping.product_family 对齐) */\nexport type ProductFamily =\n | 'MODEL_MEMBERSHIP'\n | 'TOKEN_PACK'\n | 'COMPLIANCE'\n | 'LEGAL'\n | 'DESIGN_AGENT'\n | 'ENTERPRISE';\n\n/** 受众 */\nexport type Audience = 'PERSONAL' | 'ENTERPRISE' | 'DEVELOPER';\n\n/** 计费模式 */\nexport type BillingMode = 'ONE_TIME' | 'SUBSCRIPTION' | 'METERED' | 'HYBRID';\n\n/** 地区范围 */\nexport type RegionScope = 'CN' | 'OS' | 'GLOBAL';\n\n/** 商品族枚举常量 (供 UI dropdown / 校验使用, 与后端 enum 严格对齐) */\nexport const ProductFamilyEnum = {\n MODEL_MEMBERSHIP: 'MODEL_MEMBERSHIP',\n TOKEN_PACK: 'TOKEN_PACK',\n COMPLIANCE: 'COMPLIANCE',\n LEGAL: 'LEGAL',\n DESIGN_AGENT: 'DESIGN_AGENT',\n ENTERPRISE: 'ENTERPRISE',\n} as const satisfies Record<ProductFamily, ProductFamily>;\n\nexport const AudienceEnum = {\n PERSONAL: 'PERSONAL',\n ENTERPRISE: 'ENTERPRISE',\n DEVELOPER: 'DEVELOPER',\n} as const satisfies Record<Audience, Audience>;\n\nexport const BillingModeEnum = {\n ONE_TIME: 'ONE_TIME',\n SUBSCRIPTION: 'SUBSCRIPTION',\n METERED: 'METERED',\n HYBRID: 'HYBRID',\n} as const satisfies Record<BillingMode, BillingMode>;\n\nexport const RegionScopeEnum = {\n CN: 'CN',\n OS: 'OS',\n GLOBAL: 'GLOBAL',\n} as const satisfies Record<RegionScope, RegionScope>;\n\n/**\n * 公开商品响应 (字段白名单严格).\n * <p>\n * 后端 toPublicResponse 仅输出以下字段; 不会出现 featureGateJson / retiredAt / salesChannelJson / priceSnapshotPolicy.\n * displayMetadataJson 是后端原文字符串 (caller 自 JSON.parse, 缺省可能为 null).\n */\nexport interface Product {\n id: number;\n /** 公开 slug = biz_product_id (V1 建表 UNIQUE) */\n publicSlug: string;\n displayName: string;\n productFamily: ProductFamily | null;\n audience: Audience | null;\n billingMode: BillingMode | null;\n regionScope: RegionScope | null;\n basePriceFen: number | null;\n tokenQuota: number | null;\n /** 后端原文 JSON 字符串 (含 title/subtitle/badge/highlights/icon 等), 由 caller 自解析 */\n displayMetadataJson: string | null;\n}\n","// products/client.ts — 公开商品 API (商品化总规划 P3 §3.2).\n//\n// 端点: tk-dist `/api/distribution/public/products/{by-family,by-slug}` (经 Go 反代).\n// 字段白名单与 controller/app/product/AppPublicProductController#toPublicResponse 同源.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { Product, ProductFamily, Audience, RegionScope } from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 按商品族查询在售商品. 全参可空 (后端无过滤即返全部在售).\n * @param family 商品族 (MODEL_MEMBERSHIP / TOKEN_PACK / ...)\n * @param audience 受众 (PERSONAL / ENTERPRISE / DEVELOPER)\n * @param region 区域 (CN / OS / GLOBAL); 命中时同时返回 GLOBAL 商品\n */\n listProductsByFamily(\n family?: ProductFamily,\n audience?: Audience,\n region?: RegionScope,\n signal?: AbortSignal,\n ): Promise<Product[]>;\n\n /**\n * 按 slug 查询单个在售商品. slug = biz_product_id (UNIQUE).\n * 找不到或已下架 → 抛 HTTP 404.\n */\n getProductBySlug(\n slug: string,\n region?: RegionScope,\n signal?: AbortSignal,\n ): Promise<Product>;\n }\n}\n\nClient.prototype.listProductsByFamily = async function (\n this: Client,\n family?: ProductFamily,\n audience?: Audience,\n region?: RegionScope,\n signal?: AbortSignal,\n): Promise<Product[]> {\n const params: string[] = [];\n if (family) params.push(`family=${encodeURIComponent(family)}`);\n if (audience) params.push(`audience=${encodeURIComponent(audience)}`);\n if (region) params.push(`region=${encodeURIComponent(region)}`);\n const query = params.length > 0 ? `?${params.join('&')}` : '';\n const resp = await this.doJSON<APIResponse<Product[]>>(\n 'GET',\n `/distribution/public/products/by-family${query}`,\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\nClient.prototype.getProductBySlug = async function (\n this: Client,\n slug: string,\n region?: RegionScope,\n signal?: AbortSignal,\n): Promise<Product> {\n if (!slug) {\n throw new Error('getProductBySlug: slug is required');\n }\n const query = region ? `?region=${encodeURIComponent(region)}` : '';\n const resp = await this.doJSON<APIResponse<Product>>(\n 'GET',\n `/distribution/public/products/by-slug/${encodeURIComponent(slug)}${query}`,\n null,\n signal,\n );\n if (!resp.data) {\n throw new Error(`getProductBySlug: product not found (slug=${slug})`);\n }\n return resp.data;\n};\n","// casehall/client.ts — 法律案件咨询 namespace API (商品化总规划 P5 方案 B 2026-05-25).\n//\n// 端点路径形如 `/casehall/app/...` (C 端公开) 或 `/casehall/me/...` (登录态).\n// P5 阶段 SDK 暴露 namespace; 真正的网关反代与登录态校验由后续窗口在\n// nexus-v4 网关层路由白名单中开放。\n//\n// admin 板块 9 模块 (`/casehall/admin/...`) 不在 SDK 边界, 仅 admin UI 直连。\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n LawyerSummary,\n SubmitCaseLeadRequest,\n CaseLead,\n CaseMatter,\n LegalConsultation,\n BookConsultationRequest,\n LegalServiceOrder,\n LegalServiceSku,\n LawyerCredentialMyView,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n // =========================================================================\n // 律师库 (C 端公开)\n // =========================================================================\n\n /**\n * 列出已认证律师 (公开端点, 仅返回 VERIFIED + ACTIVE 状态; PII L3 字段已脱敏).\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listLawyers(\n params?: { practiceArea?: string; location?: string; pageNo?: number; pageSize?: number },\n signal?: AbortSignal,\n ): Promise<LawyerSummary[]>;\n\n /**\n * 获取律师公开详情 (脱敏)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n getLawyer(id: number, signal?: AbortSignal): Promise<LawyerSummary>;\n\n // =========================================================================\n // 案件线索 (C 端登录态)\n // =========================================================================\n\n /**\n * 提交案件线索 (登录态)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n submitCaseLead(req: SubmitCaseLeadRequest, signal?: AbortSignal): Promise<{ id: number }>;\n\n /**\n * 我的案件线索列表。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listMyCaseLeads(signal?: AbortSignal): Promise<CaseLead[]>;\n\n /**\n * 我的案件列表 (委托后)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n getMyCases(signal?: AbortSignal): Promise<CaseMatter[]>;\n\n // =========================================================================\n // 法律咨询\n // =========================================================================\n\n /**\n * 预约法律咨询 (skuCode 必填; lawyerId 可选, 留空走 AI 推荐池)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n bookConsultation(req: BookConsultationRequest, signal?: AbortSignal): Promise<{ consultationId: number }>;\n\n /**\n * 我的咨询单列表。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listMyConsultations(signal?: AbortSignal): Promise<LegalConsultation[]>;\n\n // =========================================================================\n // 法律服务订单 & SKU\n // =========================================================================\n\n /**\n * 我的法律服务订单列表。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listMyLegalOrders(signal?: AbortSignal): Promise<LegalServiceOrder[]>;\n\n /**\n * 列出公开的 LEGAL_SERVICE SKU (匿名可调用, 复用 dist_compliance_sku benefit_type='LEGAL_SERVICE')。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listLegalSKUs(region?: string, signal?: AbortSignal): Promise<LegalServiceSku[]>;\n\n // =========================================================================\n // 律师自查执业证审核状态 (v2.0.0+, P5 Phase 3 复核)\n // =========================================================================\n\n /**\n * 律师自查执业证审核状态 — 返回登录用户作为律师身份提交的所有 credential 列表.\n * 普通用户 (无 lawyer_profile) 调返 [] 不抛.\n *\n * v2.0.0+ 新增. 端点 `GET /api/casehall/lawyer-credentials/my`.\n * @returns 按 createTime 倒序的 credential 列表\n */\n getMyLawyerCredentialStatus(signal?: AbortSignal): Promise<LawyerCredentialMyView[]>;\n }\n}\n\n// --- Lawyer ---\n\nClient.prototype.listLawyers = async function (\n this: Client,\n params?: { practiceArea?: string; location?: string; pageNo?: number; pageSize?: number },\n signal?: AbortSignal,\n): Promise<LawyerSummary[]> {\n const qs = new URLSearchParams();\n if (params?.practiceArea) qs.set('practiceArea', params.practiceArea);\n if (params?.location) qs.set('location', params.location);\n if (params?.pageNo != null) qs.set('pageNo', String(params.pageNo));\n if (params?.pageSize != null) qs.set('pageSize', String(params.pageSize));\n const q = qs.toString() ? `?${qs.toString()}` : '';\n const resp = await this.doJSON<APIResponse<LawyerSummary[]>>(\n 'GET',\n `/casehall/app/lawyers${q}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.getLawyer = async function (\n this: Client,\n id: number,\n signal?: AbortSignal,\n): Promise<LawyerSummary> {\n const resp = await this.doJSON<APIResponse<LawyerSummary>>(\n 'GET',\n `/casehall/app/lawyers/${id}`,\n null,\n signal,\n );\n if (!resp.data) throw new Error(`lawyer ${id} not found`);\n return resp.data;\n};\n\n// --- Case Lead ---\n\nClient.prototype.submitCaseLead = async function (\n this: Client,\n req: SubmitCaseLeadRequest,\n signal?: AbortSignal,\n): Promise<{ id: number }> {\n const resp = await this.doJSON<APIResponse<{ id: number }>>(\n 'POST',\n `/casehall/me/case-leads`,\n req,\n signal,\n );\n return resp.data ?? { id: 0 };\n};\n\nClient.prototype.listMyCaseLeads = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<CaseLead[]> {\n const resp = await this.doJSON<APIResponse<CaseLead[]>>(\n 'GET',\n `/casehall/me/case-leads`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.getMyCases = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<CaseMatter[]> {\n const resp = await this.doJSON<APIResponse<CaseMatter[]>>(\n 'GET',\n `/casehall/me/cases`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Consultation ---\n\nClient.prototype.bookConsultation = async function (\n this: Client,\n req: BookConsultationRequest,\n signal?: AbortSignal,\n): Promise<{ consultationId: number }> {\n const resp = await this.doJSON<APIResponse<{ consultationId: number }>>(\n 'POST',\n `/casehall/me/consultations`,\n req,\n signal,\n );\n return resp.data ?? { consultationId: 0 };\n};\n\nClient.prototype.listMyConsultations = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<LegalConsultation[]> {\n const resp = await this.doJSON<APIResponse<LegalConsultation[]>>(\n 'GET',\n `/casehall/me/consultations`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Order & SKU ---\n\nClient.prototype.listMyLegalOrders = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<LegalServiceOrder[]> {\n const resp = await this.doJSON<APIResponse<LegalServiceOrder[]>>(\n 'GET',\n `/casehall/me/orders`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.listLegalSKUs = async function (\n this: Client,\n region?: string,\n signal?: AbortSignal,\n): Promise<LegalServiceSku[]> {\n const q = region ? `?region=${encodeURIComponent(region)}&benefitType=LEGAL_SERVICE` : `?benefitType=LEGAL_SERVICE`;\n const resp = await this.doJSON<APIResponse<LegalServiceSku[]>>(\n 'GET',\n `/casehall/app/legal-skus${q}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Lawyer Credential Self-Check (v2.0.0+, P5 Phase 3 复核) ---\n\nClient.prototype.getMyLawyerCredentialStatus = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<LawyerCredentialMyView[]> {\n const resp = await this.doJSON<APIResponse<LawyerCredentialMyView[]>>(\n 'GET',\n `/api/casehall/lawyer-credentials/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n","// enterprise/client.ts — 企业席位 (P6a) namespace API (商品化总规划 2026-05-25).\n//\n// 端点路径形如 `/api/admin/enterprises/...` (后台管理) 或 `/me/enterprises/...` (登录态).\n// P6a 阶段 SDK 暴露 namespace; 真正的网关反代由后续 wave 在 nexus-v4 网关层路由白名单中开放.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n EnterpriseSummary,\n EnterpriseMember,\n OrgSubscription,\n OrgSeat,\n InviteMemberRequest,\n AssignSeatRequest,\n OrgConsumeReport,\n EnterpriseKycMyStatusView,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n // =====================================================================\n // 企业组织 (登录态: 我所在的企业)\n // =====================================================================\n\n /** 列出我所在的企业 (用户作为成员加入的企业列表). */\n listMyEnterprises(signal?: AbortSignal): Promise<EnterpriseSummary[]>;\n\n /** 获取企业详情. */\n getEnterprise(id: number, signal?: AbortSignal): Promise<EnterpriseSummary>;\n\n // =====================================================================\n // 成员管理\n // =====================================================================\n\n /** 邀请成员加入 (P6a 简化: 直接 add, OWNER/ADMIN 可调用). */\n inviteMember(req: InviteMemberRequest, signal?: AbortSignal): Promise<EnterpriseMember>;\n\n /** 列出企业成员. */\n listEnterpriseMembers(enterpriseId: number, signal?: AbortSignal): Promise<EnterpriseMember[]>;\n\n // =====================================================================\n // 订阅 + 席位\n // =====================================================================\n\n /** 列出企业订阅. */\n listOrgSubscriptions(enterpriseId: number, signal?: AbortSignal): Promise<OrgSubscription[]>;\n\n /** 列出订阅下的席位 (1 订阅 N 席, seat_no 1..N). */\n listSeats(orgSubscriptionId: number, signal?: AbortSignal): Promise<OrgSeat[]>;\n\n /** 分配席位 (月度变更次数 +1, 超 3 次返 41xxx 业务码 §-1.2.D 钉死). */\n assignSeat(req: AssignSeatRequest, signal?: AbortSignal): Promise<OrgSeat>;\n\n /** 收回席位 (席位状态 → AVAILABLE, 累计用量保留). */\n revokeSeat(seatId: number, note?: string, signal?: AbortSignal): Promise<void>;\n\n // =====================================================================\n // 用量报表\n // =====================================================================\n\n /** 企业消耗汇总 (订阅维度池子合计; 完整账单留 P6b). */\n getOrgConsumeReport(enterpriseId: number, signal?: AbortSignal): Promise<OrgConsumeReport>;\n\n // =====================================================================\n // KYC 自查 (v2.0.0+, P6a Phase 3 复核)\n // =====================================================================\n\n /**\n * 企业 OWNER 自查 KYC 状态 — 返回登录用户作为 OWNER 的企业的最新 KYC 状态.\n * 用户不是任何企业 OWNER 时返 `{enterpriseId:undefined}` 的空 view, 不抛.\n *\n * v2.0.0+ 新增. 端点 `GET /api/distribution/enterprise/kyc/my`.\n * 单 OWNER 单企业假设; 多企业取第一个 ACTIVE OWNER 企业.\n */\n getMyEnterpriseKycStatus(signal?: AbortSignal): Promise<EnterpriseKycMyStatusView>;\n }\n}\n\n// =====================================================================\n// 实现 (HTTP 路径以 tk-dist admin / me 端点对齐)\n// =====================================================================\n\nClient.prototype.listMyEnterprises = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<EnterpriseSummary[]> {\n const resp = await this.doJSON<APIResponse<EnterpriseSummary[]>>(\n 'GET',\n `/me/enterprises`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.getEnterprise = async function (\n this: Client,\n id: number,\n signal?: AbortSignal,\n): Promise<EnterpriseSummary> {\n const resp = await this.doJSON<APIResponse<EnterpriseSummary>>(\n 'GET',\n `/api/admin/enterprises/${id}`,\n null,\n signal,\n );\n if (!resp.data) throw new Error(`enterprise ${id} not found`);\n return resp.data;\n};\n\nClient.prototype.inviteMember = async function (\n this: Client,\n req: InviteMemberRequest,\n signal?: AbortSignal,\n): Promise<EnterpriseMember> {\n const resp = await this.doJSON<APIResponse<EnterpriseMember>>(\n 'POST',\n `/api/admin/enterprise-members`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('invite member failed');\n return resp.data;\n};\n\nClient.prototype.listEnterpriseMembers = async function (\n this: Client,\n enterpriseId: number,\n signal?: AbortSignal,\n): Promise<EnterpriseMember[]> {\n const resp = await this.doJSON<APIResponse<EnterpriseMember[]>>(\n 'GET',\n `/api/admin/enterprise-members/by-enterprise/${enterpriseId}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.listOrgSubscriptions = async function (\n this: Client,\n enterpriseId: number,\n signal?: AbortSignal,\n): Promise<OrgSubscription[]> {\n const resp = await this.doJSON<APIResponse<OrgSubscription[]>>(\n 'GET',\n `/api/admin/org-subscriptions/by-enterprise/${enterpriseId}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.listSeats = async function (\n this: Client,\n orgSubscriptionId: number,\n signal?: AbortSignal,\n): Promise<OrgSeat[]> {\n const resp = await this.doJSON<APIResponse<OrgSeat[]>>(\n 'GET',\n `/api/admin/org-seats/by-subscription/${orgSubscriptionId}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.assignSeat = async function (\n this: Client,\n req: AssignSeatRequest,\n signal?: AbortSignal,\n): Promise<OrgSeat> {\n const resp = await this.doJSON<APIResponse<OrgSeat>>(\n 'POST',\n `/api/admin/org-seats/assign`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('assign seat failed');\n return resp.data;\n};\n\nClient.prototype.revokeSeat = async function (\n this: Client,\n seatId: number,\n note?: string,\n signal?: AbortSignal,\n): Promise<void> {\n const qs = note ? `?note=${encodeURIComponent(note)}` : '';\n await this.doJSON<APIResponse<boolean>>(\n 'POST',\n `/api/admin/org-seats/${seatId}/revoke${qs}`,\n null,\n signal,\n );\n};\n\nClient.prototype.getOrgConsumeReport = async function (\n this: Client,\n enterpriseId: number,\n signal?: AbortSignal,\n): Promise<OrgConsumeReport> {\n const resp = await this.doJSON<APIResponse<OrgConsumeReport>>(\n 'GET',\n `/api/admin/enterprise-settlements/overview/${enterpriseId}`,\n null,\n signal,\n );\n if (!resp.data) {\n return {\n enterpriseId,\n subscriptionCount: 0,\n totalPoolTk: 0,\n totalUsedTk: 0,\n totalPriceFen: 0,\n };\n }\n return resp.data;\n};\n\n// =====================================================================\n// KYC 自查 (v2.0.0+, P6a Phase 3 复核)\n// =====================================================================\n\nClient.prototype.getMyEnterpriseKycStatus = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<EnterpriseKycMyStatusView> {\n const resp = await this.doJSON<APIResponse<EnterpriseKycMyStatusView>>(\n 'GET',\n `/api/distribution/enterprise/kyc/my`,\n null,\n signal,\n );\n return resp.data ?? {};\n};\n","// finance/client.ts — 财务 (P7) namespace API (商品化总规划 2026-05-25).\n//\n// 决策 14 对公转账: 弹窗 + 企微对接销售/财务, 零银行 API.\n// 决策 15 退款规则: 订阅不退 / token 包 7 天未用全额 / 服务交付后不退.\n//\n// 端点路径形如 /api/distribution/finance/*. admin 板块 (审批/财务工作台) 由 admin UI\n// 直连 /api/admin/finance/**, 不在 SDK 边界.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n Invoice,\n RequestInvoiceInput,\n RefundRecord,\n RequestRefundInput,\n CorporateTransfer,\n InitiateCorporateTransferInput,\n InitiateCorporateTransferResult,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n // ========================================================================\n // 退款 (决策 15)\n // ========================================================================\n\n /** 申请退款 (决策 15: 按 policyCode 自动判定; NO_REFUND 即时拒)。 */\n requestRefund(req: RequestRefundInput, signal?: AbortSignal): Promise<RefundRecord>;\n\n /** 我的退款记录。 */\n listMyRefunds(signal?: AbortSignal): Promise<RefundRecord[]>;\n\n // ========================================================================\n // 发票\n // ========================================================================\n\n /** 申请开票。 */\n requestInvoice(req: RequestInvoiceInput, signal?: AbortSignal): Promise<Invoice>;\n\n /** 我的发票列表。 */\n listMyInvoices(signal?: AbortSignal): Promise<Invoice[]>;\n\n // ========================================================================\n // 对公转账 (决策 14: 弹窗 + 企微对接)\n // ========================================================================\n\n /**\n * 发起对公转账 — 决策 14:\n * 服务端创建 INITIATED 记录, 返回销售名片二维码 + 销售企微 ID + 财务邮箱,\n * 前端据此渲染弹窗引导用户加销售企微, 零银行 API.\n */\n initiateCorporateTransfer(\n req: InitiateCorporateTransferInput,\n signal?: AbortSignal,\n ): Promise<InitiateCorporateTransferResult>;\n\n /** 上传对公转账凭证 URL。 */\n uploadCorporateTransferProof(\n id: number,\n proofUrl: string,\n signal?: AbortSignal,\n ): Promise<boolean>;\n\n /** 我的对公转账记录。 */\n listMyCorporateTransfers(signal?: AbortSignal): Promise<CorporateTransfer[]>;\n }\n}\n\n// --- Refund ---\n\nClient.prototype.requestRefund = async function (\n this: Client,\n req: RequestRefundInput,\n signal?: AbortSignal,\n): Promise<RefundRecord> {\n const resp = await this.doJSON<APIResponse<RefundRecord>>(\n 'POST',\n `/api/distribution/finance/refund/request`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('refund/request: empty response');\n return resp.data;\n};\n\nClient.prototype.listMyRefunds = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<RefundRecord[]> {\n const resp = await this.doJSON<APIResponse<RefundRecord[]>>(\n 'GET',\n `/api/distribution/finance/refund/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Invoice ---\n\nClient.prototype.requestInvoice = async function (\n this: Client,\n req: RequestInvoiceInput,\n signal?: AbortSignal,\n): Promise<Invoice> {\n const resp = await this.doJSON<APIResponse<Invoice>>(\n 'POST',\n `/api/distribution/finance/invoice/request`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('invoice/request: empty response');\n return resp.data;\n};\n\nClient.prototype.listMyInvoices = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<Invoice[]> {\n const resp = await this.doJSON<APIResponse<Invoice[]>>(\n 'GET',\n `/api/distribution/finance/invoice/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Corporate Transfer (决策 14) ---\n\nClient.prototype.initiateCorporateTransfer = async function (\n this: Client,\n req: InitiateCorporateTransferInput,\n signal?: AbortSignal,\n): Promise<InitiateCorporateTransferResult> {\n const resp = await this.doJSON<APIResponse<InitiateCorporateTransferResult>>(\n 'POST',\n `/api/distribution/finance/corporate-transfer/initiate`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('corporate-transfer/initiate: empty response');\n return resp.data;\n};\n\nClient.prototype.uploadCorporateTransferProof = async function (\n this: Client,\n id: number,\n proofUrl: string,\n signal?: AbortSignal,\n): Promise<boolean> {\n // P2-017: 后端契约是 @RequestParam(\"proofUrl\"), 走 query (非 body).\n // URLSearchParams 自动 URI-encode, 但与 path 拼接需注意: path 不可含 '?'.\n // 改为 encodeURIComponent 直拼, 等价但 0 依赖 URLSearchParams 行为, 更鲁棒.\n const path =\n `/api/distribution/finance/corporate-transfer/${encodeURIComponent(String(id))}/upload-proof`\n + `?proofUrl=${encodeURIComponent(proofUrl)}`;\n const resp = await this.doJSON<APIResponse<boolean>>('POST', path, null, signal);\n return resp.data ?? false;\n};\n\nClient.prototype.listMyCorporateTransfers = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<CorporateTransfer[]> {\n const resp = await this.doJSON<APIResponse<CorporateTransfer[]>>(\n 'GET',\n `/api/distribution/finance/corporate-transfer/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n","// Acosmi 第三方聊天 bridge 控制面 — SDK 类型契约 (Phase 7 骨架).\n//\n// 契约源: docs/audit/sdk-remote-control-contract-2026-05-27.md §6 (Secret zero-knowledge)\n// + §7 (旧抽象不可复用) + 主索引 §5 Phase 7 + ADR-8.\n//\n// 设计纪律:\n// - chatbridge 资源 GET 走 nexus-v4 model-direct 序列化, wire 字段为 camelCase\n// (与 model/chat_bridge.go 的 json tag 逐字一致; 契约 §12 chatbridge 平面)。\n// 注意: 这与 remote-control 平面 (agent-runs 事件/policy 用 snake_case) 不同 ——\n// nexus-v4 的 wire 约定按平面分, 不是全局统一;\n// - 公开 TypeScript API 与 wire 同为 camelCase;\n// - 平台 secret (plaintext / token / signing key) 永不出现在 SDK 公共 namespace;\n// SDK 只见 read-only metadata + CredentialRef + fingerprint + ChannelEvents;\n// - 7 个平台严格枚举, 任何新增需先改契约文档 + 主索引 §5 Phase 7 再扩本文件;\n// - 平台原始 thread / sender / workspace ID 一律 hash 后入 SDK; 永不持原值;\n// - 严禁复用 app_channels / chat_completions / managed-models 承载平台 secret。\n\n// =============================================================================\n// Platform / Region / IntegrationStatus (与 Go side `service/chatbridge/types.go` 对齐)\n// =============================================================================\n\nexport type Platform =\n | 'feishu'\n | 'wecom'\n | 'dingtalk'\n | 'slack'\n | 'teams'\n | 'telegram'\n | 'whatsapp';\n\nexport type Region = 'cn' | 'intl';\n\nexport type IntegrationStatus = 'pending' | 'active' | 'suspended' | 'revoked';\n\n// =============================================================================\n// CredentialRef branded type\n// =============================================================================\n\n/**\n * CredentialRef — chat-bridge 凭证公开引用 (`cred_<22 char base32>`).\n *\n * branded type 防止 plaintext secret 字符串被误传到需要 CredentialRef 的位置。\n * SDK 调用方应仅持有 CredentialRef, 永不持 plaintext。\n */\nexport type CredentialRef = string & { readonly __brand: 'CredentialRef' };\n\n// =============================================================================\n// Channel event 公共类型 (read-only events; secret 永不出现)\n// =============================================================================\n\n/**\n * ChannelAttachment — 入站附件 / 出站文件附件.\n *\n * 安全约束 (ADR-8):\n * - `url` 必须由 bridge runtime 解析过 (Acosmi 内部存储 URL); 严禁是平台原始签名 URL。\n * - `contentType` 是标准 MIME; `kind` 是 bridge 内部分类 (image/file/audio/video/link/...)。\n */\nexport interface ChannelAttachment {\n kind: string;\n url: string;\n size?: number;\n contentType?: string;\n}\n\n/**\n * ChannelCardAction — 出站交互卡片按钮 / 自由输入.\n *\n * `kind`: 'approve' | 'reject' | 'cancel' | 'free_text' | 其他 bridge 自定义。\n * `id` 是 bridge 侧稳定 action id, 用于把用户点击映射回原 requestId 幂等键。\n */\nexport interface ChannelCardAction {\n kind: string;\n id: string;\n label: string;\n}\n\n/**\n * ChannelCard — 出站交互卡片 (permission / tool_status / done / error).\n */\nexport interface ChannelCard {\n kind: string;\n title: string;\n body: string;\n actions?: ChannelCardAction[];\n}\n\n/**\n * ChannelInboundEvent — bridge runtime 视角的入站平台消息.\n *\n * 安全约束:\n * - `threadHash` / `senderHash` 是 SHA256(平台原始 ID), 不允许直接是平台 ID;\n * - `metadata` 仅含非敏感字段 (例: locale, message_kind), 严禁含 plaintext secret;\n * - `messageId` 是平台原生 message id, 仅用于平台侧 ack / dedup, 不进 AgentRun transcript。\n */\nexport interface ChannelInboundEvent {\n platform: Platform;\n threadHash: string;\n senderHash?: string;\n content: string;\n attachments?: ChannelAttachment[];\n messageId?: string;\n receivedAt?: string; // ISO-8601\n metadata?: Record<string, string>;\n}\n\n/**\n * ChannelOutboundEvent — bridge runtime 出站平台消息 / 卡片.\n *\n * Metadata 仅含非敏感投递参数 (例: card_locale), 严禁含 plaintext secret。\n */\nexport interface ChannelOutboundEvent {\n threadHash: string;\n content?: string;\n cards?: ChannelCard[];\n metadata?: Record<string, string>;\n}\n\n/**\n * BridgeThreadRef — bridge runtime 内部 thread 引用 (Acosmi 三元组).\n *\n * 永不携带 platform secret / 原始平台 ID。\n */\nexport interface BridgeThreadRef {\n threadId: string;\n runId?: string;\n remoteSessionId?: string;\n tenantId: string;\n userId: string;\n appId: string;\n}\n\n// =============================================================================\n// Public 只读视图 (admin/管理后台 GET 用; 严禁含 Ciphertext / Plaintext)\n// =============================================================================\n\n/**\n * ChatIntegration — 平台安装记录的 SDK 只读视图.\n *\n * Phase 7B 起由 `client.chatBridge` 按此型号 GET (响应 camelCase, 契约 §12)。\n */\nexport interface ChatIntegration {\n id: string;\n tenantId: string;\n appId: string;\n platform: Platform;\n region: Region;\n workspaceIdHash?: string;\n botIdHash?: string;\n status: IntegrationStatus;\n /**\n * @deprecated 服务端从不返回此字段 (model ConfigJSON json:\"-\", 防 secret 误入\n * 后整体不外发) — 读取恒为 undefined。写入走 createIntegration({ configJson })。\n */\n configJson?: string;\n installedByUserId?: string;\n lastUsedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * ChatCredentialPublic — 凭证的 SDK 只读视图 (绝不含 ciphertext / plaintext).\n *\n * 仅暴露公开字段: `credentialRef` / `fingerprint` / `keyId` / `version` / `status`。\n */\nexport interface ChatCredentialPublic {\n credentialRef: CredentialRef;\n integrationId: string;\n platform: Platform;\n region: Region;\n secretKind: string;\n fingerprint: string;\n keyId: string;\n version: number;\n status: 'active' | 'rotating' | 'revoked' | string;\n lastUsedAt?: string;\n rotatedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * ChatThread — 平台 thread 到 Acosmi session 的映射 (SDK 只读视图).\n *\n * 永不携带原始 platform thread / sender ID; 仅含 SHA256 hash。\n */\nexport interface ChatThread {\n id: string;\n tenantId: string;\n integrationId: string;\n platformThreadHash: string;\n platform: Platform;\n userId: string;\n appId: string;\n sessionId?: string;\n lastRunId?: string;\n senderHash?: string;\n lastInboundAt?: string;\n lastOutboundAt?: string;\n}\n\n/**\n * ChatBridgeSession — 一次 bridge runtime 会话 (SDK 只读视图).\n */\nexport interface ChatBridgeSession {\n id: string;\n tenantId: string;\n threadId: string;\n integrationId: string;\n runId?: string;\n remoteSessionId?: string;\n status: 'created' | 'routing' | 'active' | 'paused' | 'closed' | 'errored' | string;\n adapter?: string;\n lastFrameAt?: string;\n closedAt?: string;\n disconnectReason?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// =============================================================================\n// 平台 / 区域 / 状态 常量集合 (运行时 valid 校验用; SDK runtime 检查匿名外部输入)\n// =============================================================================\n\nexport const ALL_PLATFORMS: readonly Platform[] = [\n 'feishu',\n 'wecom',\n 'dingtalk',\n 'slack',\n 'teams',\n 'telegram',\n 'whatsapp',\n] as const;\n\nexport const ALL_REGIONS: readonly Region[] = ['cn', 'intl'] as const;\n\nexport const ALL_INTEGRATION_STATUS: readonly IntegrationStatus[] = [\n 'pending',\n 'active',\n 'suspended',\n 'revoked',\n] as const;\n\n/**\n * isPlatform — runtime type guard for {@link Platform}.\n *\n * 用途: SDK 解析 wire payload 时校验未知字段; 不直接抛异常, 调用方决策。\n */\nexport function isPlatform(v: unknown): v is Platform {\n return typeof v === 'string' && (ALL_PLATFORMS as readonly string[]).includes(v);\n}\n\n/**\n * isRegion — runtime type guard for {@link Region}.\n */\nexport function isRegion(v: unknown): v is Region {\n return typeof v === 'string' && (ALL_REGIONS as readonly string[]).includes(v);\n}\n\n/**\n * isIntegrationStatus — runtime type guard for {@link IntegrationStatus}.\n */\nexport function isIntegrationStatus(v: unknown): v is IntegrationStatus {\n return typeof v === 'string' && (ALL_INTEGRATION_STATUS as readonly string[]).includes(v);\n}\n\n/**\n * isChannelInboundEvent — 极简 type guard, 用于 wire payload 入口校验.\n *\n * 仅校验必填字段 (platform/threadHash/content); 其他字段交给调用方按需校验。\n * 不抛异常: 失败返回 false。\n */\nexport function isChannelInboundEvent(v: unknown): v is ChannelInboundEvent {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) return false;\n const r = v as Record<string, unknown>;\n return (\n isPlatform(r.platform) &&\n typeof r.threadHash === 'string' &&\n r.threadHash.length > 0 &&\n typeof r.content === 'string'\n );\n}\n\n/**\n * 把任意字符串安全 brand 成 {@link CredentialRef}; 不做合法性校验.\n *\n * Phase 7B SDK 客户端 wire 解析时使用 — 服务端返回的 `credential_ref` 字段一律走它。\n * 调用方自行判断格式 (例: 是否 `cred_` 前缀)。\n */\nexport function asCredentialRef(s: string): CredentialRef {\n return s as CredentialRef;\n}\n","// chatbridge/client.ts — 第三方聊天 bridge 控制面客户端 (Phase 7B 落地).\n//\n// 端点: /api/v4/chat-bridge/* (nexus-v4 routes_business.go registerChatBridgeRoutes)。\n// 契约源: docs/audit/sdk-remote-control-contract-2026-05-27.md §6 + §12 + ADR-8。\n//\n// Wire 平面 (契约 §12, 与 remote-control 平面不同):\n// - 请求体字段 = snake_case (handler ShouldBindJSON 结构体 tag: app_id /\n// workspace_id / config_json / secret_kind / new_plaintext ...);\n// - 响应 data = model 直接序列化的 camelCase (model/chat_bridge.go json tag:\n// appId / credentialRef / secretKind ...), 与本域 types.ts 逐字一致。\n//\n// 守卫 (最小授权三档; OAuth token 须显式申请, chat_bridge 不进 allScopes()):\n// - chat_bridge:read → listIntegrations / getIntegration / listCredentials\n// - chat_bridge:write → createIntegration / updateIntegrationStatus / storeCredential\n// - chat_bridge:rotate → rotateCredential / revokeCredential (高风险)\n//\n// 安全红线 (契约 §6 Secret zero-knowledge):\n// - 任何端点不回 plaintext / ciphertext (model Ciphertext/ConfigJSON json:\"-\");\n// - 创建/轮换的明文只在请求体出现一次, SDK 不缓存不打印;\n// - 跨租户引用服务端一律 404 (不暴露存在性)。\n\nimport type { APIResponse } from '../shared/api-response';\nimport { Client } from '../core/client';\nimport {\n asCredentialRef,\n type ChatCredentialPublic,\n type ChatIntegration,\n type IntegrationStatus,\n type Platform,\n type Region,\n} from './types';\n\n/** `chatBridge.createIntegration()` 请求 (wire snake_case 由 SDK 转换)。 */\nexport interface CreateIntegrationRequest {\n /** 绑定的 Acosmi app。 */\n appId: string;\n platform: Platform;\n region: Region;\n /** 平台 workspace/企业 原始 ID; 服务端只存 SHA256 hash。 */\n workspaceId?: string;\n /** 平台 bot 原始 ID; 服务端只存 SHA256 hash。 */\n botId?: string;\n /** 仅非敏感配置 (rate limit / feature toggles); 严禁含 secret。 */\n configJson?: string;\n}\n\n/** `chatBridge.storeCredential()` 请求 — 明文一次性提交。 */\nexport interface StoreCredentialRequest {\n /** 凭证种类 (平台相关, 例: app_secret / signing_secret / bot_token)。 */\n secretKind: string;\n /** 凭证明文; 加密落库后即弃, 响应只回 masked 视图。 */\n plaintext: string;\n region?: Region;\n platform?: Platform;\n}\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 第三方聊天 bridge 控制面 (Phase 7B; 契约 §6/§12/ADR-8)。 */\n readonly chatBridge: ChatBridgeClient;\n }\n}\n\nconst chatBridgeByClient = new WeakMap<Client, ChatBridgeClient>();\n\nObject.defineProperty(Client.prototype, 'chatBridge', {\n configurable: true,\n enumerable: false,\n get(this: Client): ChatBridgeClient {\n let existing = chatBridgeByClient.get(this);\n if (!existing) {\n existing = new ChatBridgeClient(this);\n chatBridgeByClient.set(this, existing);\n }\n return existing;\n },\n});\n\nexport class ChatBridgeClient {\n constructor(private readonly client: Client) {}\n\n // ---------------------------------------------------------------------------\n // Integration 管理面\n // ---------------------------------------------------------------------------\n\n /** 创建平台集成 (chat_bridge:write)。云端控制台与下游 (CrabCode) 调的是同一端点/同一份数据。 */\n async createIntegration(\n req: CreateIntegrationRequest,\n signal?: AbortSignal,\n ): Promise<ChatIntegration> {\n const resp = await this.client.doJSON<APIResponse<ChatIntegration>>(\n 'POST',\n '/chat-bridge/integrations',\n {\n app_id: req.appId,\n platform: req.platform,\n region: req.region,\n workspace_id: req.workspaceId,\n bot_id: req.botId,\n config_json: req.configJson,\n },\n signal,\n );\n return resp.data;\n }\n\n /** 列出本租户集成 (chat_bridge:read; masked 视图)。可按 appId 过滤。 */\n async listIntegrations(appId?: string, signal?: AbortSignal): Promise<ChatIntegration[]> {\n const qs = appId ? `?app_id=${encodeURIComponent(appId)}` : '';\n const resp = await this.client.doJSON<APIResponse<{ items?: ChatIntegration[] }>>(\n 'GET',\n `/chat-bridge/integrations${qs}`,\n null,\n signal,\n );\n return resp.data?.items ?? [];\n }\n\n /** 取单个集成 (chat_bridge:read)。不存在/跨租户一律 404。 */\n async getIntegration(id: string, signal?: AbortSignal): Promise<ChatIntegration> {\n const resp = await this.client.doJSON<APIResponse<ChatIntegration>>(\n 'GET',\n `/chat-bridge/integrations/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n return resp.data;\n }\n\n /** 更新集成状态 (chat_bridge:write): pending | active | suspended | revoked。 */\n async updateIntegrationStatus(\n id: string,\n status: IntegrationStatus,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.client.doJSON<APIResponse<{ ok?: boolean }>>(\n 'PATCH',\n `/chat-bridge/integrations/${encodeURIComponent(id)}/status`,\n { status },\n signal,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Credential 管理面 (vault)\n // ---------------------------------------------------------------------------\n\n /** 存凭证 (chat_bridge:write) — 明文一次性提交, 返回 masked 记录 (ref+fingerprint)。 */\n async storeCredential(\n integrationId: string,\n req: StoreCredentialRequest,\n signal?: AbortSignal,\n ): Promise<ChatCredentialPublic> {\n const resp = await this.client.doJSON<APIResponse<ChatCredentialPublic>>(\n 'POST',\n `/chat-bridge/integrations/${encodeURIComponent(integrationId)}/credentials`,\n {\n secret_kind: req.secretKind,\n plaintext: req.plaintext,\n region: req.region,\n platform: req.platform,\n },\n signal,\n );\n return brandCredential(resp.data);\n }\n\n /** 列出集成的凭证 (chat_bridge:read; masked, 永不含明文/密文)。 */\n async listCredentials(\n integrationId: string,\n signal?: AbortSignal,\n ): Promise<ChatCredentialPublic[]> {\n const resp = await this.client.doJSON<APIResponse<{ items?: ChatCredentialPublic[] }>>(\n 'GET',\n `/chat-bridge/integrations/${encodeURIComponent(integrationId)}/credentials`,\n null,\n signal,\n );\n return (resp.data?.items ?? []).map(brandCredential);\n }\n\n /** 轮换凭证 (chat_bridge:rotate, 高风险) — ref 不变, fingerprint 更新。 */\n async rotateCredential(\n integrationId: string,\n secretKind: string,\n newPlaintext: string,\n signal?: AbortSignal,\n ): Promise<ChatCredentialPublic> {\n const resp = await this.client.doJSON<APIResponse<ChatCredentialPublic>>(\n 'POST',\n `/chat-bridge/integrations/${encodeURIComponent(integrationId)}/credentials/rotate`,\n { secret_kind: secretKind, new_plaintext: newPlaintext },\n signal,\n );\n return brandCredential(resp.data);\n }\n\n /** 吊销凭证 (chat_bridge:rotate) — 软吊销 + 服务端抹密文。 */\n async revokeCredential(credentialRef: string, signal?: AbortSignal): Promise<void> {\n await this.client.doJSON<APIResponse<{ ok?: boolean }>>(\n 'POST',\n `/chat-bridge/credentials/${encodeURIComponent(credentialRef)}/revoke`,\n {},\n signal,\n );\n }\n}\n\n// 服务端返回的 credentialRef 是裸 string; 出 SDK 边界前统一 brand 成 CredentialRef\n// (运行时恒等, 只改类型), 防止与 plaintext 字符串互窜 (types.ts branded 约定)。\nfunction brandCredential(c: ChatCredentialPublic): ChatCredentialPublic {\n if (c && typeof c.credentialRef === 'string') {\n return { ...c, credentialRef: asCredentialRef(c.credentialRef) };\n }\n return c;\n}\n"]}
1
+ {"version":3,"sources":["../../src/models/types.ts","../../src/shared/errors.ts","../../src/models/betas.ts","../../src/models/adapters/anthropic.ts","../../src/models/adapters/openai.ts","../../src/models/adapters/index.ts","../../src/core/credentials.ts","../../src/core/client.ts","../../src/auth/types.ts","../../src/shared/api-response.ts","../../src/auth/auth.ts","../../src/core/store.ts","../../src/core/retry.ts","../../src/models/stream-meta.ts","../../src/models/enduser.ts","../../src/core/http.ts","../../src/sanitize/index.ts","../../src/sanitize/types.ts","../../src/sanitize/config.ts","../../src/sanitize/history.ts","../../src/sanitize/defensive.ts","../../src/core/sanitize-bridge.ts","../../src/shared/index.ts","../../src/shared/operation.ts","../../src/shared/retry-advice.ts","../../src/auth/scopes.ts","../../src/models/index.ts","../../src/models/wire-anthropic.ts","../../src/models/model-helpers.ts","../../src/billing/entitlements.ts","../../src/billing/packages.ts","../../src/billing/wallet.ts","../../src/skills/skills.ts","../../src/skills/tools.ts","../../src/notifications/types.ts","../../src/notifications/notifications.ts","../../src/notifications/ws.ts","../../src/agent-runs/types.ts","../../src/agent-runs/remote-control.ts","../../src/agent-runs/client.ts","../../src/agent-runs/byok.ts","../../src/compliance/scopes.ts","../../src/compliance/status.ts","../../src/compliance/errors.ts","../../src/compliance/client.ts","../../src/support/bug-report.ts","../../src/subscription/client.ts","../../src/pricing/client.ts","../../src/products/types.ts","../../src/products/client.ts","../../src/casehall/client.ts","../../src/enterprise/client.ts","../../src/finance/client.ts","../../src/chatbridge/types.ts","../../src/chatbridge/client.ts"],"names":["BucketClassCommercial","ThinkingOff","ServerToolTypeWebSearch","BucketClassGeneric","ThinkingLow","ThinkingHigh","ThinkingMax","ThinkingHighMinMaxTokens","ThinkingMaxFallbackMaxTokens","HTTPError","RateLimitError","BusinessError","OrderTerminalError","ModelNotFoundError","NetworkError","StreamError","AnthropicAdapter","OpenAIAdapter","events","ProviderFormat","body","parseOpenAIResponseToAnthropic","isPlainObject","abort","sleepWithSignal","frame","event","sleep"],"mappings":"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","file":"index.cjs","sourcesContent":["// models/types.ts — 模型网关域类型。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0, 1275 行)\n//\n// 命名约定:\n// - 字段名 = Go json tag 字面量 (wire format), 不做 camelCase 重映射\n// - mix 风格 (modelId / max_tokens / supports_thinking) 是历史 wire 设计的真实样貌\n// - 这样 JSON.parse / JSON.stringify 可直接来回, 与 Go 侧 0 偏差\n//\n// int64 字段用 number — JS number 安全上限 2^53, Acosmi 业务量级远低于此。\n// time.Time 字段用 ISO 8601 string 形态, 与 Go json wire 一致。\n// json.RawMessage 用 unknown (caller 自行 typed)。\n// json.Number 用 string (避免精度丢失)。\n\n// =============================================================================\n// Managed Models\n// =============================================================================\n\n/** 模型能力矩阵 — 下游通过此结构决定 UI 功能开关和 Beta Header 注入 */\nexport interface ModelCapabilities {\n // 思考能力\n supports_thinking: boolean;\n supports_adaptive_thinking: boolean;\n /** 交错思考 (Interleaved Thinking) */\n supports_isp: boolean;\n\n // 工具与搜索\n supports_web_search: boolean;\n supports_tool_search: boolean;\n supports_structured_output: boolean;\n\n // 推理控制\n supports_effort: boolean;\n /** 模型是否支持 thinking_level=\"max\" 强度档 (深度思考) */\n supports_max_effort: boolean;\n /** Opus 4.6 独有 (Speed=\"fast\") */\n supports_fast_mode: boolean;\n /** Auto 模式 (模型自主选择工具/搜索策略) */\n supports_auto_mode: boolean;\n\n // 上下文与缓存\n supports_1m_context: boolean;\n supports_prompt_cache: boolean;\n /** 通过 context-management beta 控制 */\n supports_cache_editing: boolean;\n\n // 输出控制\n /** Claude 4 内置 */\n supports_token_efficient: boolean;\n supports_redact_thinking: boolean;\n\n // Token 上限 (冗余但便于查询)\n max_input_tokens: number;\n max_output_tokens: number;\n\n /**\n * 桌面视觉理解 sidecar 能力 (v1.2+):\n * 为 true 表示该模型适合作为桌面截图解析 sidecar — 输入 screenshot,\n * 输出结构化 UI/视觉描述, 供非多模态主模型消费 (CrabCode desktop automation /\n * computer-use 选模型时使用).\n *\n * 与 ManagedModel.inputModalities=['image'] 是正交两件事:\n * - inputModalities 描述\"模型能不能吃图片输入\"\n * - supports_desktop_visual_understanding 描述\"模型是不是被运营标记为\n * 适合做桌面 UI 解析的 sidecar\" (有些通用视觉模型并不擅长 UI 解析)\n *\n * 调用方不应通过模型名 substring 推断此能力; 必须读上游下发字段.\n */\n supports_desktop_visual_understanding?: boolean;\n\n /**\n * 图片生成能力 (v1.3+): 为 true 表示该托管模型是图片生成模型 (DALL·E / SD / 即梦 等),\n * 应通过 client.generateImage() 调用, 而非 chat(). 计量维度由上游派生为 IMAGE (按图计费)。\n */\n supports_image_generation?: boolean;\n\n /**\n * 视频生成能力 (v1.3+): 为 true 表示该托管模型是视频生成模型 (Sora / 可灵 / Runway 等),\n * 应通过 client.generateVideo() + pollVideoTask() 调用。计量维度派生为 VIDEO (按时长计费)。\n */\n supports_video_generation?: boolean;\n\n /**\n * 向量能力 (v2.9+): 为 true 表示该托管模型是向量模型 (DashScope text-embedding-v4 等),\n * 应通过 client.embeddings() 调用。\n */\n supports_embedding?: boolean;\n\n /**\n * 重排序能力 (v2.9+): 为 true 表示该托管模型是重排序模型 (DashScope gte-rerank-v2 / qwen3-rerank 等),\n * 应通过 client.rerank() 调用。\n */\n supports_rerank?: boolean;\n}\n\n/** 图片生成请求 (client.generateImage) */\nexport interface ImageGenerationRequest {\n prompt: string;\n /** 缺省 1024 */\n width?: number;\n /** 缺省 1024 */\n height?: number;\n style?: string;\n}\n\n/** 图片生成响应 */\nexport interface ImageGenerationResponse {\n url?: string;\n b64_json?: string;\n revised_prompt?: string;\n requestId?: string;\n}\n\n/** 视频生成请求 (client.generateVideo) */\nexport interface VideoGenerationRequest {\n prompt: string;\n resolution?: string;\n /** 时长 (秒) */\n duration?: number;\n}\n\n/** 视频任务响应 (创建返回 taskId; 轮询返回 status/videoUrl) */\nexport interface VideoTaskResponse {\n taskId: string;\n /** pending | running | completed | failed */\n status?: string;\n videoUrl?: string;\n error?: string;\n requestId?: string;\n}\n\n// ── 向量 (Embedding) / 重排序 (Rerank) (v2.9.0) ──────────────────────────────\n// SDK 订阅会员经 POST /managed-models/:id/{embeddings,rerank} 调用; 仅\n// capabilities.supports_embedding / supports_rerank 的托管模型可用。上游接 DashScope。\n\n/**\n * 多模态内容片段 (v2.10+; 向量/重排序 qwen3-vl-embedding / qwen3-vl-rerank 线路)。\n * text / image / video 至少填一项; image/video 取 URL 或 base64 data URI。\n */\nexport interface MultimodalContent {\n /** 文本片段 */\n text?: string;\n /** 图片 (URL 或 base64 data URI) */\n image?: string;\n /** 视频 (URL); 仅多模态线路支持 */\n video?: string;\n}\n\n/** 向量请求 (client.embeddings)。文本线路 = OpenAI /v1/embeddings 标准; 多模态线路用 contents。 */\nexport interface EmbeddingRequest {\n /** 文本输入 (文本向量线路): 单条文本或文本数组 (批量)。多模态线路改用 contents。 */\n input?: string | string[];\n /**\n * 多模态内容 (v2.10+; qwen3-vl-embedding 线路): text/image/video 片段数组。\n * 与 input 二选一; 多模态托管模型须用 contents。\n */\n contents?: MultimodalContent[];\n /** 向量维度 (可选; DashScope text-embedding-v4 支持 2048/1536/1024/768/512/256/128/64) */\n dimensions?: number;\n /** 编码格式 (可选, 如 \"float\") */\n encoding_format?: string;\n /** 输出向量类型 (可选; 多模态线路, 如 \"dense\") */\n output_type?: string;\n /** 视频抽帧率 fps (可选; 多模态视频输入) */\n fps?: number;\n /** 是否启用多模态特征融合 (可选; 多模态线路) */\n enable_fusion?: boolean;\n}\n\n/** 单条向量结果 (OpenAI 标准)。 */\nexport interface EmbeddingData {\n object: string;\n index: number;\n embedding: number[];\n}\n\n/** 向量响应 (OpenAI /v1/embeddings 标准)。 */\nexport interface EmbeddingResponse {\n object: string;\n model: string;\n data: EmbeddingData[];\n usage: { prompt_tokens?: number; total_tokens: number };\n id?: string;\n}\n\n/** 重排序查询 (v2.10+): 文本字符串, 或多模态 {text|image}。 */\nexport type RerankQuery = string | { text?: string; image?: string };\n/** 重排序候选文档 (v2.10+): 文本字符串, 或多模态 {text|image|video}。 */\nexport type RerankDocument = string | MultimodalContent;\n\n/** 重排序请求 (client.rerank)。统一扁平契约, 网关内部按模型线路转换。 */\nexport interface RerankRequest {\n /** 查询: 文本字符串 (文本线路), 或多模态 {text|image} (qwen3-vl-rerank 线路) */\n query: RerankQuery;\n /** 候选文档: 文本字符串数组, 或多模态 {text|image|video} 对象数组 */\n documents: RerankDocument[];\n /** 返回前 N 条 (可选; 缺省返回全部) */\n top_n?: number;\n /** 是否在结果中回传文档原文 (可选, 缺省 false) */\n return_documents?: boolean;\n /** 排序指令 (可选; 仅 OpenAI 兼容线路支持, 原生线路忽略) */\n instruct?: string;\n /** 视频抽帧率 fps (可选; 多模态视频文档) */\n fps?: number;\n}\n\n/** 单条重排序结果。 */\nexport interface RerankResult {\n /** 文档在原 documents 数组中的下标 */\n index: number;\n /** 相关性得分 (越高越相关) */\n relevance_score: number;\n /** 文档原文 (仅 return_documents=true 时存在) */\n document?: string;\n}\n\n/** 重排序响应。 */\nexport interface RerankResponse {\n results: RerankResult[];\n usage: { total_tokens: number };\n model?: string;\n}\n\n/**\n * 模型可接收的用户输入模态 —— **本 SDK 已知的那些** (v1.2+).\n *\n * - 'text': 文本输入\n * - 'image': 截图 / 图片输入 (多模态)\n * - 'video': 视频输入 (多模态向量 / 重排序类模型, 网关 2026-06-20 起下发)\n *\n * ManagedModel.inputModalities 包含 'image' 才允许向该模型直接发图;\n * 缺失字段时调用方应保守按 text-only / unknown 处理.\n *\n * 这个联合体是**查询用**的 (helper 的 modality 参数), 不是数据域的全集 —— 见\n * {@link InputModalityTag}.\n */\nexport type InputModality = 'text' | 'image' | 'video';\n\n/**\n * 目录里实际可能出现的模态标签 —— **开放值域**, 已知取值见 {@link InputModality}.\n *\n * 值域由网关托管模型目录持有, 靠运营动作扩张 (不是靠发 SDK 新版)。把数据字段\n * 声明成封闭联合体, 等于让类型对在网真实数据撒谎; 2026-08-02 CrabCode 客户端\n * 因同一形态的封闭枚举 (Rust 侧) 把整个网关模型列表打空过数周。\n *\n * 因此: **查询**用 {@link InputModality} (已知标签, 有自动补全),\n * **数据**用本类型 (照收未知标签, 不丢信息、不谎报)。\n *\n * 刻意就是朴素 `string`, 不用 `InputModality | (string & {})` 那个\"保留补全\"的\n * 技巧: 补全只在**书写**字面量时有价值, 而本类型描述的是**读到**的目录数据;\n * 那个技巧还要靠 `{}` —— 本仓 eslint `ban-types` 明令禁止。\n */\nexport type InputModalityTag = string;\n\n/** BucketClass 字面量常量 — V30 二轮审计 D-P1-3 修复 */\nexport const BucketClassCommercial = 'COMMERCIAL';\nexport const BucketClassGeneric = 'GENERIC';\n\n/**\n * 用户在某 modelId 上的桶余额聚合视图 (V30 entitlement-listing).\n *\n * 多桶聚合规则 (上游 nexus-v4 计算后下发, 全部单位为 ETU):\n * - quotaEtu / usedEtu / remainingEtu: 该 modelId 下用户全部 active 桶求和\n * - sharedPoolEtu: 求和量中\"来自通配桶\"的部分 (跨模型可消耗)\n * - bucketClass / expiresAt: 取最高优先级桶\n * - expired: 全部桶都过期才置 true\n */\nexport interface BucketInfo {\n quotaEtu: number;\n usedEtu: number;\n remainingEtu: number;\n sharedPoolEtu?: number;\n expiresAt?: string;\n bucketClass: string;\n expired?: boolean;\n /** v0.19+ — GENERIC alive 桶 tokenRemaining 求和 (\"免费余额\", 真实可消费) */\n freeRemainingEtu: number;\n /** v0.19+ — COMMERCIAL alive 桶 tokenRemaining 求和 (\"付费余额\") */\n paidRemainingEtu: number;\n}\n\n/** 大小写不敏感判定 — 与 buildBucketView (managed_model.go) EqualFold 语义对齐 */\nexport function bucketInfoIsCommercial(b: BucketInfo | null | undefined): boolean {\n if (!b) return false;\n return b.bucketClass.toLowerCase() === BucketClassCommercial.toLowerCase();\n}\n\n/** 托管模型 */\nexport interface ManagedModel {\n id: string;\n name: string;\n provider: string;\n modelId: string;\n maxTokens: number;\n isEnabled: boolean;\n /** @deprecated 公开 /managed-models 端点不返回此字段 (最小暴露原则); 仅 admin 响应或历史端口残留, listModels() 结果中恒为 undefined。 */\n pricePerMTok?: number;\n /** @deprecated 公开 /managed-models 端点不返回此字段 (最小暴露原则); 仅 admin 响应或历史端口残留, listModels() 结果中恒为 undefined。 */\n isDefault?: boolean;\n contextWindow?: number;\n capabilities: ModelCapabilities;\n\n /** P1 商品化档位门控: 0=FREE..4=ULTRA。前端模型选择器按用户档位过滤。 */\n minPlanTier?: number;\n /** 该模型能否在 C 端对话 (ADK 托管运行时) 使用; false 时选择器应过滤。 */\n chatRuntimeSupported?: boolean;\n /** 模型默认绑定的工具 ID 列表。 */\n defaultToolIds?: string[];\n /** 该模型对当前用户档位是否被限制策略锁定 (limit_policy allowedModels 不含)。true=展示但置灰+升级引导。enforced 关/解析失败=false。 */\n locked?: boolean;\n /** 是否属于\"免费会员可用\"分区 (FREE 档 allowedModels 内)。与当前用户档位无关 (仅分类)。 */\n freeTier?: boolean;\n\n /**\n * 上游 gateway 为此模型启用的请求格式列表\n * 取值: \"anthropic\" | \"openai\"\n * 空值表示上游未声明, SDK 回落 provider 硬编码分支 (向后兼容)\n */\n supported_formats?: string[];\n\n /**\n * 上游建议客户端优先使用的格式\n * 取值: \"anthropic\" | \"openai\"; 空值等价于 supported_formats[0]\n */\n preferred_format?: string;\n\n /**\n * 该模型可选的思考深度档位 id(升序,v2.18+)。取值是 {@link ThinkingOff} / {@link ThinkingHigh} /\n * {@link ThinkingMax} 的子集;网关按「admin 声明 ∩ wire 层真投递」读时派生。\n * `[]` = 该模型没有思考档(不要渲染档位选择);`undefined` = 上游未播报(旧网关),\n * 调用方必须按\"未知\"处理,严禁回落到自己推档或按模型名猜。\n */\n thinking_levels?: string[];\n\n /**\n * 当前用户在此模型上的桶余额聚合 (V0.18 V30 entitlement-listing).\n *\n * 仅当调用方为非 admin 用户 (web user / desktop OAuth) 时上游才会返回此字段:\n * - admin / X-Internal-Bypass 调用 → 缺失\n * - 普通用户 → 非空, 含 quota/used/remaining 求和\n */\n bucketInfo?: BucketInfo;\n\n /**\n * 模型可接收的用户输入模态 (v1.2+, CrabCode desktop automation / computer-use 选模型用).\n *\n * 已知取值见 {@link InputModality} ('text' | 'image' | 'video'); 'image' 表示模型可\n * 直接接收 screenshot/image 输入。类型是**开放**的 ({@link InputModalityTag}) ——\n * 目录新增模态时旧版 SDK 照样原样透出, 不静默丢值。\n *\n * 兼容上游字段名 input_modalities (snake_case) — listModels 在写缓存前会做归一化.\n *\n * **缺失语义**: 上游未下发时该字段为 undefined, 调用方必须保守按 text-only / unknown\n * 处理, 严禁默认假设支持 image. 同样严禁用模型名 substring 反推 modality.\n */\n inputModalities?: InputModalityTag[];\n}\n\n// =============================================================================\n// QuotaSummary — v0.19+ 账户级权益总览 (免费/付费切分)\n// =============================================================================\n\n/** 单桶视图 — QuotaSummary.freeBuckets/paidBuckets 元素 */\nexport interface BucketRow {\n bucketId: string;\n /** 精确桶为具体 modelId, 通配桶为 \"*\" */\n modelId: string;\n /** COMMERCIAL | GENERIC */\n bucketClass: string;\n tokenQuota: number;\n tokenUsed: number;\n tokenRemaining: number;\n /** 永久桶为 undefined */\n expiresAt?: string;\n expired?: boolean;\n}\n\nexport function bucketRowIsCommercial(r: BucketRow | null | undefined): boolean {\n if (!r) return false;\n return r.bucketClass.toLowerCase() === BucketClassCommercial.toLowerCase();\n}\n\n/** 滚动窗口限额状态 — QuotaSummary.windowLimits 元素 */\nexport interface WindowLimitStatus {\n /** 窗口档位: FIVE_HOUR = 5 小时滚动窗口, WEEKLY = 7 天滚动窗口 */\n kind: 'FIVE_HOUR' | 'WEEKLY';\n /** 窗口内 credit 用量上限 */\n limitCredits: number;\n /** 窗口内已用 credit */\n usedCredits: number;\n /** 预计恢复时间 (ISO-8601 UTC); 窗口内无用量时为 null / 缺失 */\n resetAt?: string | null;\n /**\n * [W1 2026-07-11 软限额] 该窗此刻可否被用户「继续」开关豁免 — 5h 软限额时 true (展示端可给\n * 严格模式切换入口), 周窗恒 false。老网关不返回时缺失。\n */\n overridable?: boolean;\n}\n\n/**\n * GET /api/v4/entitlements/quota-summary 返回体, 调用 client.getQuotaSummary 获取.\n *\n * 设计目的: 个人中心钱包栏一次性展示\"我还有多少免费 + 多少付费\"+ 各自最近到期时间.\n */\nexport interface QuotaSummary {\n /** GENERIC (免费/赠送) alive 桶 tokenRemaining 求和 */\n freeTotalEtu: number;\n /** COMMERCIAL (付费购买) alive 桶 tokenRemaining 求和 */\n paidTotalEtu: number;\n /** GENERIC 桶详情 (含过期, UI 列流水); 空时为空数组 */\n freeBuckets: BucketRow[];\n /** COMMERCIAL 桶详情 (含过期); 空时为空数组 */\n paidBuckets: BucketRow[];\n /** GENERIC alive 桶中最早到期; 永久桶/无 alive 时缺失 */\n nextFreeExpiresAt?: string;\n /** COMMERCIAL alive 桶中最早到期; 同上 */\n nextPaidExpiresAt?: string;\n /** 滚动窗口限额状态 (5 小时 / 7 天); 后端未启用窗口限额时字段整个缺失 */\n windowLimits?: WindowLimitStatus[];\n /**\n * [W1 2026-07-11 软限额] 用户 5h「继续」开关现值 (true=软限额/默认: 到达 5h 仅提醒并继续消耗\n * 周配额; false=严格模式: 到达即等待恢复)。仅后端启用窗口限额时下发, 否则缺失。\n */\n windowFiveHourContinueEnabled?: boolean;\n}\n\n// =============================================================================\n// WindowResetSummary — v2.13+ 邀请奖励窗口重置券\n// =============================================================================\n\n/**\n * GET /api/v4/entitlements/window-reset/summary 返回体, 调用 client.getWindowResetSummary 获取.\n *\n * 设计目的: 个人中心邀请栏与 429 窗口限额弹窗一次性展示\"我还有几张重置券 + 最近一张何时过期\",\n * 并给出邀请进度 (已达标 / 待达标) 作为继续邀请的引导。\n *\n * 券由邀请奖励发放 (被邀请人激活并达到用量门槛后计一次), 每张可清空一次滚动窗口已用量\n * (见 client.redeemWindowReset)。\n */\nexport interface WindowResetSummary {\n /** 当前可用 (未使用且未过期) 的重置券张数 */\n availableCount: number;\n /** 可用券中最早到期时间 (ISO-8601 UTC); 无可用券时为 null */\n nextExpireAt: string | null;\n /** 历史累计发放张数 (含已用 / 已过期) */\n totalGranted: number;\n /** 历史累计已使用张数 */\n totalUsed: number;\n /** 已达标并已发放重置券的邀请数 */\n qualifiedInvites: number;\n /** 已激活但尚未达到发放门槛的邀请数 (仍可能转为已达标) */\n pendingInvites: number;\n}\n\n// =============================================================================\n// Chat\n// =============================================================================\n\n/** 聊天消息 (简单文本格式, CrabClaw 使用) */\nexport interface ChatMessage {\n role: string;\n content: string;\n}\n\n/** Anthropic 响应内容块 */\nexport interface ChatContentBlock {\n type: string;\n text?: string;\n citations?: unknown;\n thinking?: string;\n signature?: string;\n data?: string;\n id?: string;\n name?: string;\n /** json.RawMessage in Go */\n input?: unknown;\n server_name?: string;\n caller?: unknown;\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n}\n\n/** Anthropic 格式 token 用量 */\nexport interface ChatUsage {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\n// ---------- Thinking ----------\n\n/** 三档思考级别 (v0.9.0) */\nexport const ThinkingOff = 'off';\nexport const ThinkingLow = 'low';\nexport const ThinkingHigh = 'high';\nexport const ThinkingMax = 'max';\n\n/** 标准思考最低 maxTokens — CrabCode 默认 MAX_OUTPUT_TOKENS_DEFAULT = 32_000 */\nexport const ThinkingHighMinMaxTokens = 32_000;\n/** 深度思考回退 maxTokens — Opus 4.6 上限 128K */\nexport const ThinkingMaxFallbackMaxTokens = 128_000;\n\n/** 控制模型思考行为 */\nexport interface ThinkingConfig {\n /** \"enabled\" | \"disabled\" | \"adaptive\" */\n type: string;\n /** 仅 type=\"enabled\" 时 (旧模型回退) */\n budget_tokens?: number;\n /** 思考级别 (v0.9.0): \"off\" | \"high\" | \"max\" */\n level?: string;\n /** \"none\" | \"summary\" | \"\" (默认空=完整) */\n display?: string;\n}\n\n/** 根据三档 level 创建配置 */\nexport function newThinkingConfig(level: string): ThinkingConfig {\n if (level === '' || level === ThinkingOff) {\n return { type: 'disabled' };\n }\n return { type: 'adaptive', level };\n}\n\n/** 服务端工具定义 — SDK 将工具 schema 合入 API 请求的 tools 数组 */\nexport interface ServerTool {\n type: string;\n name: string;\n config?: Record<string, unknown>;\n}\n\n/** Server Tool 类型常量 */\nexport const ServerToolTypeWebSearch = 'web_search_20250305';\n\n/** 地理位置 */\nexport interface GeoLoc {\n /** ISO 3166-1 alpha-2 */\n country: string;\n city?: string;\n}\n\n/** ServerTool.config 结构 (type=web_search_20250305) */\nexport interface WebSearchConfig {\n /** 每请求最大搜索次数, 默认 8 */\n max_uses?: number;\n /** 域名白名单 (与 blocked_domains 互斥) */\n allowed_domains?: string[];\n /** 域名黑名单 (与 allowed_domains 互斥) */\n blocked_domains?: string[];\n user_location?: GeoLoc;\n}\n\n/** 控制推理努力级别 */\nexport interface EffortConfig {\n /** \"low\" | \"medium\" | \"high\" | \"max\" */\n level: string;\n}\n\n/** 控制输出格式 (结构化输出) */\nexport interface OutputConfig {\n /** \"json_schema\" | \"\" */\n format?: string;\n schema?: unknown;\n}\n\n/**\n * 创建搜索 Server Tool 的便捷方法\n * allowed_domains 与 blocked_domains 互斥, 同时传入抛 Error\n */\nexport function newWebSearchTool(cfg?: WebSearchConfig | null): ServerTool {\n const st: ServerTool = {\n type: ServerToolTypeWebSearch,\n name: 'web_search',\n };\n if (cfg) {\n if ((cfg.allowed_domains?.length ?? 0) > 0 && (cfg.blocked_domains?.length ?? 0) > 0) {\n throw new Error('web search: allowed_domains and blocked_domains are mutually exclusive');\n }\n const m: Record<string, unknown> = {};\n if (cfg.max_uses && cfg.max_uses > 0) m['max_uses'] = cfg.max_uses;\n if (cfg.allowed_domains?.length) m['allowed_domains'] = cfg.allowed_domains;\n if (cfg.blocked_domains?.length) m['blocked_domains'] = cfg.blocked_domains;\n if (cfg.user_location) m['user_location'] = cfg.user_location;\n if (Object.keys(m).length > 0) st.config = m;\n }\n return st;\n}\n\n/**\n * 聊天请求\n *\n * 基础字段供 CrabClaw 使用, 扩展字段供 CrabCode 使用。\n * 所有新增字段零值不改变行为 (向后兼容)。\n *\n * 注意:扩展字段(rawMessages/system/tools/...)不会被原样 JSON.stringify,\n * 而由 buildRequestBody (adapter) 选择性序列化到请求体。\n */\nexport interface ChatRequest {\n // ── 基础字段 (CrabClaw 兼容) ──\n messages?: ChatMessage[];\n stream?: boolean;\n max_tokens?: number;\n\n // ── 完整请求控制 (CrabCode 扩展) ── 不直接 JSON 序列化, 由 buildRequestBody 处理\n /** 复杂消息体 (含 content blocks / 多模态), 非 nil 时优先于 messages */\n rawMessages?: unknown;\n /** string 或 ContentBlock[] */\n system?: unknown;\n /** 标准工具定义 (Tool[]) */\n tools?: unknown;\n temperature?: number;\n thinking?: ThinkingConfig;\n metadata?: Record<string, string>;\n /** 显式 beta (SDK 自动合并) */\n betas?: string[];\n /** 服务端工具 (buildRequestBody 合入 tools 数组) */\n serverTools?: ServerTool[];\n /** \"\" | \"fast\" (Fast Mode) */\n speed?: string;\n effort?: EffortConfig;\n outputConfig?: OutputConfig;\n /** 任意扩展字段 (buildRequestBody 合入请求体) */\n extraBody?: Record<string, unknown>;\n\n /**\n * v0.13.0: OpenAI wire format 原生字段。AnthropicAdapter 忽略,\n * OpenAIAdapter 按 OpenAI 规范序列化。\n *\n * 对应 OpenAI `parallel_tool_calls` 顶层字段, undefined = 不设置 (沿用上游默认 true)。\n */\n parallelToolCalls?: boolean;\n\n /**\n * v1.6.0: 业务侧终端用户 id, 跨 provider 通用语义 (不绑死 DeepSeek)。\n * 仅当 caller 拥有 scope=endusr.set 时网关采信; 否则被网关 sanitizer 校验/覆盖。\n * 约束: 长度 ≤ 512, 字符集 [a-zA-Z0-9_-]+, 禁止包含用户隐私信息。\n * 二选一:\n * OpenAI wire → 序列化为顶层 body[\"user_id\"]\n * Anthropic wire → 合并到 body[\"metadata\"][\"user_id\"]; caller metadata 显式键优先, 不被覆盖\n */\n endUserId?: string;\n}\n\n// ---------- Web Search Sources ----------\n\n/** 联网搜索结果来源 (与后端 adk/stream_helpers.go SourceItem 对齐) */\nexport interface WebSearchSource {\n title: string;\n url: string;\n snippet?: string;\n}\n\n/** 搜索来源事件 (从 SSE \"sources\" 事件解析) */\nexport interface SourcesEvent {\n sources: WebSearchSource[];\n session_id?: string;\n}\n\n/** sources 事件结构错误的稳定机器码。 */\nexport type SourcesEventIssueCode =\n | 'invalid_json'\n | 'missing_sources'\n | 'sources_not_array'\n | 'source_not_object'\n | 'source_title_invalid'\n | 'source_url_invalid'\n | 'source_snippet_invalid'\n | 'session_id_invalid';\n\n/**\n * sources SSE 的无歧义分类结果。\n *\n * `empty_sources` 是合法零结果;`malformed_sources` 才表示结构损坏。\n */\nexport type SourcesEventParseResult =\n | { kind: 'not_sources' }\n | { kind: 'empty_sources'; session_id?: string }\n | { kind: 'sources'; value: SourcesEvent }\n | { kind: 'malformed_sources'; code: SourcesEventIssueCode };\n\n/**\n * 同时识别 SSE event name 与 JSON payload discriminator,并把合法空结果\n * 与非 sources、结构损坏明确分开。未知额外字段不影响分类。\n */\nexport function classifySourcesEvent(ev: StreamEvent): SourcesEventParseResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(ev.data);\n } catch {\n return ev.event === 'sources'\n ? { kind: 'malformed_sources', code: 'invalid_json' }\n : { kind: 'not_sources' };\n }\n\n const wrapper =\n typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n if (wrapper?.type !== 'sources' && ev.event !== 'sources') {\n return { kind: 'not_sources' };\n }\n if (!wrapper || !Object.prototype.hasOwnProperty.call(wrapper, 'sources')) {\n return { kind: 'malformed_sources', code: 'missing_sources' };\n }\n if (\n Object.prototype.hasOwnProperty.call(wrapper, 'session_id') &&\n wrapper.session_id !== undefined &&\n typeof wrapper.session_id !== 'string'\n ) {\n return { kind: 'malformed_sources', code: 'session_id_invalid' };\n }\n if (!Array.isArray(wrapper.sources)) {\n return { kind: 'malformed_sources', code: 'sources_not_array' };\n }\n\n const sessionID = typeof wrapper.session_id === 'string' ? wrapper.session_id : undefined;\n if (wrapper.sources.length === 0) {\n return {\n kind: 'empty_sources',\n ...(sessionID === undefined ? {} : { session_id: sessionID }),\n };\n }\n\n for (const source of wrapper.sources) {\n if (typeof source !== 'object' || source === null || Array.isArray(source)) {\n return { kind: 'malformed_sources', code: 'source_not_object' };\n }\n const item = source as Record<string, unknown>;\n if (typeof item.title !== 'string') {\n return { kind: 'malformed_sources', code: 'source_title_invalid' };\n }\n if (typeof item.url !== 'string') {\n return { kind: 'malformed_sources', code: 'source_url_invalid' };\n }\n if (\n Object.prototype.hasOwnProperty.call(item, 'snippet') &&\n item.snippet !== undefined &&\n typeof item.snippet !== 'string'\n ) {\n return { kind: 'malformed_sources', code: 'source_snippet_invalid' };\n }\n }\n\n return {\n kind: 'sources',\n value: {\n ...wrapper,\n sources: wrapper.sources as WebSearchSource[],\n ...(sessionID === undefined ? {} : { session_id: sessionID }),\n } as SourcesEvent,\n };\n}\n\n/**\n * 从 StreamEvent 中解析搜索来源\n *\n * @deprecated 需要区分合法空结果与结构损坏时使用 classifySourcesEvent。\n * 此 legacy API 保留原有宽松解析和返回对象形状;新代码不得据此区分\n * 合法空结果与结构损坏。\n */\nexport function parseSourcesEvent(ev: StreamEvent): SourcesEvent | null {\n let wrapper: {\n type?: string;\n sources?: WebSearchSource[];\n session_id?: string;\n };\n try {\n wrapper = JSON.parse(ev.data);\n } catch {\n return null;\n }\n if (wrapper.type !== 'sources' && ev.event !== 'sources') {\n return null;\n }\n if (!wrapper.sources || wrapper.sources.length === 0) {\n return null;\n }\n return { sources: wrapper.sources, session_id: wrapper.session_id };\n}\n\n// =============================================================================\n// ChatResponse\n// =============================================================================\n\n/**\n * 同步聊天响应 (Anthropic format, v0.4.1)\n *\n * tokenRemaining / callRemaining / modelTokenRemaining* 不在 wire JSON 中, 由 client 从 Header 填充。\n * 哨兵 -1 表示服务端未返回。\n */\nexport interface ChatResponse {\n id: string;\n type: string;\n model: string;\n role: string;\n content: ChatContentBlock[];\n stop_reason: string;\n usage: ChatUsage;\n /** -1 表示服务端未返回 */\n tokenRemaining: number;\n callRemaining: number;\n modelTokenRemaining: number;\n modelTokenRemainingETU: number;\n}\n\n// =============================================================================\n// SSE Stream\n// =============================================================================\n\n/**\n * SSE 流式事件\n *\n * v0.11.0 新增 blockIndex/blockType/ephemeral 三字段 (in-band content block 元数据)。\n * 零值等价 v0.10.0 行为, 未识别的事件三字段全部零值。\n */\nexport interface StreamEvent {\n event: string;\n data: string;\n /** 对齐 Anthropic content_block_start/delta/stop 的 index 字段 */\n blockIndex?: number;\n /** 由 content_block_start 解析得到, delta/stop 从 index→type 映射查出 */\n blockType?: string;\n /** 网关标记此 block 下一轮不应回传 */\n ephemeral?: boolean;\n}\n\n/**\n * 流式结算事件 (从 settled SSE 事件解析)\n * 包含本次请求的 token 消耗及结算后的剩余余额\n */\nexport interface StreamSettlement {\n requestId: string;\n consumeStatus: string;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n /** 结算后剩余 token (-1 表示服务端未返回) */\n tokenRemaining: number;\n /** 结算后剩余调用次数 (-1 表示服务端未返回) */\n callRemaining: number;\n}\n\n/** 从 settled 类型的 StreamEvent 中解析结算信息. 不是 settled 类型则返回 null. */\nexport function parseSettlement(ev: StreamEvent): StreamSettlement | null {\n if (ev.event !== 'settled' && ev.event !== 'pending_settle') {\n return null;\n }\n let s: Partial<StreamSettlement>;\n try {\n s = JSON.parse(ev.data);\n } catch {\n return null;\n }\n return {\n requestId: s.requestId ?? '',\n consumeStatus: s.consumeStatus ?? '',\n inputTokens: s.inputTokens ?? 0,\n outputTokens: s.outputTokens ?? 0,\n totalTokens: s.totalTokens ?? 0,\n tokenRemaining: s.tokenRemaining ?? -1,\n callRemaining: s.callRemaining ?? -1,\n };\n}\n","// shared/errors.ts — 跨域类型化错误。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 Errors 段。\n\n// =============================================================================\n// Errors (类型化)\n// =============================================================================\n\n/** 下载限流错误 (429) */\nexport class RateLimitError extends Error {\n retryAfter: string;\n raw: string;\n\n constructor(message: string, retryAfter: string, raw: string) {\n super(message);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n this.raw = raw;\n }\n}\n\n/**\n * API 业务层错误 (HTTP 200 但 code != 0)\n * tk-dist 代理透传 yudao 响应, HTTP 状态码为 200, 业务错误在 JSON code 字段\n */\nexport class BusinessError extends Error {\n code: number;\n\n constructor(code: number, message: string) {\n super(`API error (code=${code}): ${message}`);\n this.name = 'BusinessError';\n this.code = code;\n }\n}\n\n/**\n * 订单到达非成功终态 (FAILED/CANCELLED/CLOSED/EXPIRED/REFUNDED)\n * waitForPayment 在订单终态为非成功时抛此错误\n */\nexport class OrderTerminalError extends Error {\n orderId: string;\n status: string;\n\n constructor(orderId: string, status: string) {\n super(`order ${orderId} terminated: ${status}`);\n this.name = 'OrderTerminalError';\n this.orderId = orderId;\n this.status = status;\n }\n}\n\n/**\n * 模型缓存未命中且 listModels 刷新后仍未找到。\n *\n * 历史上 getCachedModel miss 时硬返 ManagedModel{provider:\"anthropic\"} 占位,\n * 导致未预热场景下的 chat 请求按 AnthropicAdapter 编码, 被发到错误端点。\n * v0.13.x 改为 miss → listModels 自动刷新一次; 仍 miss → 抛此错误。\n */\nexport class ModelNotFoundError extends Error {\n modelId: string;\n\n constructor(modelId: string) {\n super(`managed model \"${modelId}\" not found (list models to refresh cache, or verify model id)`);\n this.name = 'ModelNotFoundError';\n this.modelId = modelId;\n }\n}\n\n/**\n * 结构化 HTTP 非 2xx 错误.\n *\n * 用 instanceof 提取:\n * try { ... } catch (e) {\n * if (e instanceof HTTPError && e.statusCode === 429) { ... }\n * }\n */\nexport class HTTPError extends Error {\n statusCode: number;\n /** anthropic.error.type / openai.error.type, 缺失为空 */\n type: string;\n /** Retry-After 头解析的秒数, 0 表示未提供或解析失败 */\n retryAfter: number;\n /** 原始响应体 (截断到 maxErrorBodySize) */\n body: string;\n /** 后端业务机器码 (响应体顶层 errorCode, e.g. \"WINDOW_LIMIT_EXCEEDED\"); 缺失为 undefined */\n errorCode?: string;\n /** 窗口限额场景: 触发的滚动窗口档位 (FIVE_HOUR = 5 小时 / WEEKLY = 7 天); 缺失为 undefined */\n windowKind?: 'FIVE_HOUR' | 'WEEKLY';\n /** 窗口限额场景: 预计恢复时间 (ISO-8601 UTC); 缺失为 undefined */\n windowResetAt?: string;\n /**\n * [W1 2026-07-11 软限额] 窗口限额场景: 该 429 可否被用户「继续」开关豁免 —\n * true = 5 小时软限额严格模式 (客户端可提示「继续任务」以消耗周配额继续);\n * false/缺失 = 周窗/显式禁止/灰度关 (硬等待, 无豁免路径, 老网关不返回时为 undefined)。\n */\n windowOverridable?: boolean;\n errorContractVersion?: number;\n faultDomain?: FaultDomain;\n requestDisposition?: RequestDisposition;\n transportRequestId?: string | null;\n consumeRequestId?: string | null;\n providerRequestId?: string | null;\n retryable: boolean;\n\n constructor(\n statusCode: number,\n opts: {\n type?: string;\n message?: string;\n retryAfter?: number;\n body?: string;\n errorCode?: string;\n windowKind?: 'FIVE_HOUR' | 'WEEKLY';\n windowResetAt?: string;\n windowOverridable?: boolean;\n errorContractVersion?: number;\n faultDomain?: FaultDomain;\n requestDisposition?: RequestDisposition;\n transportRequestId?: string | null;\n consumeRequestId?: string | null;\n providerRequestId?: string | null;\n retryable?: boolean;\n } = {},\n ) {\n let msg: string;\n if (opts.type) {\n msg = `HTTP ${statusCode}: [${opts.type}] ${opts.message ?? ''}`;\n } else if (opts.message) {\n msg = `HTTP ${statusCode}: ${opts.message}`;\n } else if (opts.body) {\n msg = `HTTP ${statusCode}: ${opts.body}`;\n } else {\n msg = `HTTP ${statusCode}`;\n }\n super(msg);\n this.name = 'HTTPError';\n this.statusCode = statusCode;\n this.type = opts.type ?? '';\n this.retryAfter = opts.retryAfter ?? 0;\n this.body = opts.body ?? '';\n this.errorCode = opts.errorCode;\n this.windowKind = opts.windowKind;\n this.windowResetAt = opts.windowResetAt;\n this.windowOverridable = opts.windowOverridable;\n this.errorContractVersion = opts.errorContractVersion;\n this.faultDomain = opts.faultDomain;\n this.requestDisposition = opts.requestDisposition;\n this.transportRequestId = opts.transportRequestId;\n this.consumeRequestId = opts.consumeRequestId;\n this.providerRequestId = opts.providerRequestId;\n this.retryable = opts.retryable === true && opts.requestDisposition === 'not_accepted';\n }\n}\n\n/**\n * 结构化网络层错误 (传输失败, 区别于上游业务错误).\n *\n * 包装 fetch 抛出的错误 — 含 timeout / EOF / connection refused / DNS 失败等.\n * retry policy: isTimeout / isEOF 任一为 true → 默认可重试.\n */\nexport class NetworkError extends Error {\n /** 操作描述, e.g. \"POST /v1/messages\" */\n op: string;\n /** 请求 URL (脱敏后) */\n url: string;\n override cause?: unknown;\n timeout: boolean;\n eof: boolean;\n requestDisposition: RequestDisposition = 'unknown';\n\n constructor(op: string, url: string, cause: unknown, opts: { timeout?: boolean; eof?: boolean } = {}) {\n const causeMsg = cause instanceof Error ? cause.message : cause != null ? String(cause) : 'network error';\n super(`${op} ${url}: ${causeMsg}`);\n this.name = 'NetworkError';\n this.op = op;\n this.url = url;\n this.cause = cause;\n this.timeout = opts.timeout ?? false;\n this.eof = opts.eof ?? false;\n }\n\n isTimeout(): boolean {\n return this.timeout;\n }\n\n isEOF(): boolean {\n return this.eof;\n }\n}\n\n/**\n * 流式失败事件的结构化表示。\n *\n * 由 gateway 的 `managed_model_stream_failed` 事件解析得到。客户端可通过\n * instanceof 提取并按 code/retryable 决策。\n */\nexport class StreamError extends Error {\n /** 例: \"empty_response\" / \"rate_limit\" / \"overloaded\" / \"\" */\n code: string;\n /** D23 gateway machine code; mirrors the legacy `code` field. */\n errorCode: string;\n /** 例: \"provider\" / \"settlement\" */\n stage: string;\n /** 用户友好提示 (中文); 历史字段, 与 rawError 区分 */\n userMessage: string;\n /** gateway 原始 error 字符串 */\n rawError: string;\n /** 客户端是否值得重试 */\n retryable: boolean;\n errorContractVersion?: number;\n faultDomain?: FaultDomain;\n requestDisposition?: RequestDisposition;\n transportRequestId?: string | null;\n consumeRequestId?: string | null;\n providerRequestId?: string | null;\n\n constructor(opts: { code?: string; stage?: string; message?: string; rawError?: string; retryable?: boolean; errorContractVersion?: number; faultDomain?: FaultDomain; requestDisposition?: RequestDisposition; transportRequestId?: string | null; consumeRequestId?: string | null; providerRequestId?: string | null } = {}) {\n const code = opts.code ?? '';\n const stage = opts.stage ?? '';\n const userMessage = opts.message ?? '';\n const rawError = opts.rawError ?? '';\n const retryable = opts.retryable === true && opts.requestDisposition === 'not_accepted';\n\n const body = rawError !== '' ? rawError : userMessage;\n const msg = stage !== '' ? `stream failed: ${stage}: ${body}` : `stream failed: ${body}`;\n super(msg);\n this.name = 'StreamError';\n this.code = code;\n this.errorCode = code;\n this.stage = stage;\n this.userMessage = userMessage;\n this.rawError = rawError;\n this.retryable = retryable;\n this.errorContractVersion = opts.errorContractVersion;\n this.faultDomain = opts.faultDomain;\n this.requestDisposition = opts.requestDisposition;\n this.transportRequestId = opts.transportRequestId;\n this.consumeRequestId = opts.consumeRequestId;\n this.providerRequestId = opts.providerRequestId;\n }\n}\n\nexport type RequestDisposition = 'not_accepted' | 'accepted' | 'unknown';\nexport type FaultDomain = 'user_auth' | 'caller_credentials' | 'account_quota' |\n 'account_permission' | 'provider' | 'gateway' | 'transport' | 'stream_ticket' | 'protocol';\n\nexport interface GatewayErrorContract {\n errorContractVersion: 1;\n faultDomain: FaultDomain;\n errorCode: string;\n transportRequestId: string | null;\n consumeRequestId: string | null;\n providerRequestId: string | null;\n requestDisposition: RequestDisposition;\n retryable: boolean;\n}\n\nconst gatewayFaultDomains: readonly FaultDomain[] = [\n 'user_auth', 'caller_credentials', 'account_quota', 'account_permission',\n 'provider', 'gateway', 'transport', 'stream_ticket', 'protocol',\n];\n\nfunction nullableID(value: unknown): value is string | null {\n return value === null || typeof value === 'string';\n}\n\nfunction decodeGatewayErrorContract(value: unknown): GatewayErrorContract | null {\n if (value == null || typeof value !== 'object') return null;\n const v = value as Record<string, unknown>;\n const version = v.errorContractVersion;\n const domain = v.faultDomain;\n const disposition = v.requestDisposition;\n const errorCode = v.errorCode;\n if (version !== 1 || typeof domain !== 'string' || !gatewayFaultDomains.includes(domain as FaultDomain)) return null;\n if (typeof errorCode !== 'string' || errorCode.length === 0) return null;\n if (disposition !== 'not_accepted' && disposition !== 'accepted' && disposition !== 'unknown') return null;\n if (!nullableID(v.transportRequestId) || !nullableID(v.consumeRequestId) || !nullableID(v.providerRequestId)) return null;\n if (typeof v.retryable !== 'boolean') return null;\n return { errorContractVersion: 1, faultDomain: domain as FaultDomain, errorCode,\n transportRequestId: v.transportRequestId, consumeRequestId: v.consumeRequestId,\n providerRequestId: v.providerRequestId, requestDisposition: disposition, retryable: v.retryable };\n}\n\n/** Read the closed v1 gateway error contract without exposing the raw response body. */\nexport function readGatewayErrorContract(error: unknown): GatewayErrorContract | null {\n const direct = decodeGatewayErrorContract(error);\n if (direct) return direct;\n if (error == null || typeof error !== 'object') return null;\n const e = error as { response?: { data?: unknown }; body?: unknown };\n const axios = decodeGatewayErrorContract(e.response?.data);\n if (axios) return axios;\n if (typeof e.body === 'string') {\n try { return decodeGatewayErrorContract(JSON.parse(e.body)); } catch { return null; }\n }\n return null;\n}\n\n/** True only for an HTTP 401 carrying the exact v1 rejected user-token contract. */\nexport function isUserAccessTokenRejected(error: unknown): boolean {\n if (error == null || typeof error !== 'object') return false;\n const e = error as { statusCode?: unknown; response?: { status?: unknown } };\n const status = e.statusCode ?? e.response?.status;\n const contract = readGatewayErrorContract(error);\n return status === 401 && contract?.faultDomain === 'user_auth' &&\n contract.errorCode === 'USER_ACCESS_TOKEN_INVALID' && contract.requestDisposition === 'not_accepted';\n}\n\n// =============================================================================\n// 窗口限额 (WINDOW_LIMIT_EXCEEDED) 识别\n// =============================================================================\n\n/** HTTP 路径窗口限额机器码 — 响应体顶层 errorCode / message 文案子串 (后端契约冻结值)。 */\nconst windowLimitErrorCode = 'WINDOW_LIMIT_EXCEEDED';\n/** 流式路径窗口限额 code — agent-run SSE error 事件用小写蛇形 (与 HTTP errorCode 大小写不同)。 */\nconst windowLimitStreamCode = 'window_limit_exceeded';\n\n/**\n * 判断错误是否为窗口限额拒绝 (5 小时 / 7 天滚动窗口 credit 用量达上限)。\n * 结构化 errorCode 优先, message/body 子串防御兜底 (后端部署版本错位期:\n * 旧网关只在 message 文案里带 \"(WINDOW_LIMIT_EXCEEDED)\" 而无顶层 errorCode)。\n *\n * 仅识别 HTTP 非 2xx 路径抛出的 HTTPError (/chat OpenAI 网关形态与 /anthropic\n * Anthropic 形态皆可)。流式场景 (agent-run SSE error 事件 / managed-model\n * failed 事件) 的 code 是小写 \"window_limit_exceeded\" 且产物不是 HTTPError,\n * 用伴生函数 isWindowLimitStreamError 判断。\n */\nexport function isWindowLimitError(err: unknown): err is HTTPError {\n if (!(err instanceof HTTPError)) return false;\n if (err.errorCode === windowLimitErrorCode) return true;\n // 防御兜底: 旧版后端无顶层 errorCode, 机器码只存活在 message 文案 / body 原串。\n return err.message.includes(windowLimitErrorCode) || err.body.includes(windowLimitErrorCode);\n}\n\n/**\n * isWindowLimitError 的流式伴生判断 — 面向 SSE error 事件产物\n * (StreamError / AgentRunStreamError / 裸 AgentRunErrorPayload) 的结构化鸭子判断。\n *\n * 入参形态跨三种且互无公共基类, 故返回 boolean 而非 type guard:\n * `code === \"window_limit_exceeded\"` 优先; message / userMessage / rawError\n * 含 \"WINDOW_LIMIT_EXCEEDED\" 子串防御兜底 (Anthropic 形态流错误事件只有\n * rate_limit_error type + 文案内机器码的部署错位期)。\n */\nexport function isWindowLimitStreamError(err: unknown): boolean {\n if (err == null || typeof err !== 'object') return false;\n const e = err as { code?: unknown; message?: unknown; userMessage?: unknown; rawError?: unknown };\n if (e.code === windowLimitStreamCode) return true;\n // 防御兜底 (后端部署版本错位期): 机器码只出现在文案 / 原始错误串。\n for (const field of [e.message, e.userMessage, e.rawError]) {\n if (typeof field === 'string' && field.includes(windowLimitErrorCode)) return true;\n }\n return false;\n}\n\n/**\n * [W1 2026-07-11 软限额] 判断错误是否为【可豁免】的窗口限额拒绝 (HTTP 路径) —\n * 即 5 小时软限额严格模式: 用户此前把「继续」开关关成严格模式, 到达 5h 被 429,\n * 但可通过重新开启继续 (setWindowContinuePreference(true)) 后重发放行。\n *\n * = isWindowLimitError(err) && err.windowOverridable === true。\n * 周窗 / 显式禁止 / 软限灰度关 / 老网关 (windowOverridable 缺失) 均返回 false (硬等待)。\n * 客户端据此决定是否展示「继续任务 / 重新开启」入口 (vs 纯「等待刷新」)。\n */\nexport function isContinuableWindowLimitError(err: unknown): err is HTTPError {\n return isWindowLimitError(err) && err.windowOverridable === true;\n}\n\n/**\n * [W1 2026-07-11 软限额] 从流式窗口限额 error 事件产物 (StreamError / AgentRunStreamError /\n * 裸 payload) 结构化读取窗口细节 — 供 crabcode 等消费端区分 5h 软限 (可继续) vs 周窗硬限。\n *\n * 非窗口限额错误返回 null; 是则返回 { windowKind, windowResetAt, windowOverridable } (缺字段为 undefined)。\n * overridable=true ⇒ 5h 严格模式可续跑; 缺失/false ⇒ 硬等待。\n */\nexport function getWindowLimitStreamDetails(\n err: unknown,\n): { windowKind?: 'FIVE_HOUR' | 'WEEKLY'; windowResetAt?: string; windowOverridable?: boolean } | null {\n if (!isWindowLimitStreamError(err)) return null;\n const e = (err ?? {}) as { windowKind?: unknown; windowResetAt?: unknown; windowOverridable?: unknown };\n const kind = e.windowKind === 'FIVE_HOUR' || e.windowKind === 'WEEKLY' ? e.windowKind : undefined;\n return {\n windowKind: kind,\n windowResetAt: typeof e.windowResetAt === 'string' ? e.windowResetAt : undefined,\n windowOverridable: typeof e.windowOverridable === 'boolean' ? e.windowOverridable : undefined,\n };\n}\n","// betas.ts — 端口自 acosmi-sdk-go/betas.go\n//\n// Beta Header 常量 — 经联网验证的真实 Anthropic API beta 值。\n// 虚构/错误日期的 header 已剔除。\n\nimport type { ChatRequest, ModelCapabilities } from './types';\nimport { ThinkingOff } from './types';\n\n/** ISP: 交错思考 */\nconst betaInterleavedThinking = 'interleaved-thinking-2025-05-14';\n/** 1M 上下文 (retiring 2026-04-30) */\nconst betaContext1M = 'context-1m-2025-08-07';\n/** 上下文编辑 */\nconst betaContextManagement = 'context-management-2025-06-27';\n/** 结构化输出 */\nconst betaStructuredOutputs = 'structured-outputs-2025-11-13';\n/** Tool Search */\nconst betaAdvancedToolUse = 'advanced-tool-use-2025-11-20';\n/** Effort 控制 (Opus 4.5 需要, 4.6 stable) */\nconst betaEffort = 'effort-2025-11-24';\n/** 缓存作用域隔离 */\nconst betaPromptCachingScope = 'prompt-caching-scope-2026-01-05';\n/** 快速推理 (Opus 4.6) */\nconst betaFastMode = 'fast-mode-2026-02-01';\n/** 思考脱敏 */\nconst betaRedactThinking = 'redact-thinking-2026-02-12';\n/** 高效工具 (Claude 3.7, Claude 4 内置) */\nconst betaTokenEfficientTools = 'token-efficient-tools-2025-02-19';\n\n/** 根据模型能力和请求参数自动组装 beta header 列表 */\nexport function buildBetas(caps: ModelCapabilities, req: ChatRequest): string[] {\n const betas: string[] = [];\n\n // ── 思考相关 ──\n if (caps.supports_isp) {\n betas.push(betaInterleavedThinking);\n betas.push(betaContextManagement);\n }\n if (caps.supports_redact_thinking && req.thinking && req.thinking.display === 'summary') {\n betas.push(betaRedactThinking);\n }\n\n // ── 上下文 ──\n if (caps.supports_1m_context) {\n betas.push(betaContext1M);\n }\n\n // ── 输出控制 (互斥: structured-outputs ⊕ token-efficient-tools) ──\n const hasStructuredOutput = caps.supports_structured_output && req.outputConfig != null;\n if (hasStructuredOutput) {\n betas.push(betaStructuredOutputs);\n } else if (caps.supports_token_efficient) {\n betas.push(betaTokenEfficientTools);\n }\n\n // ── Tool Search ──\n if (caps.supports_tool_search) {\n betas.push(betaAdvancedToolUse);\n }\n\n // ── 推理控制 ──\n // Level 模式下 resolveThinkingLevel 直接写 body[\"effort\"],req.effort 仍为 undefined,\n // 所以需额外判断 Level 是否激活了 effort\n const needsEffort =\n req.effort != null ||\n (req.thinking != null && req.thinking.level && req.thinking.level !== ThinkingOff);\n if (caps.supports_effort && needsEffort) {\n betas.push(betaEffort);\n }\n if (caps.supports_fast_mode && req.speed === 'fast') {\n betas.push(betaFastMode);\n }\n\n // ── 缓存 ──\n if (caps.supports_prompt_cache) {\n betas.push(betaPromptCachingScope);\n }\n\n // ── 合并客户端显式传入 (去重) ──\n return uniqueMerge(betas, req.betas ?? []);\n}\n\n/** 合并两个字符串数组并去重, 保留顺序 */\nexport function uniqueMerge(base: string[], extra: string[]): string[] {\n if (extra.length === 0) return base;\n const seen = new Set<string>(base);\n for (const s of extra) {\n if (!seen.has(s)) {\n base.push(s);\n seen.add(s);\n }\n }\n return base;\n}\n","// adapters/anthropic.ts — 端口自 acosmi-sdk-go/adapter_anthropic.go (228 行)\n//\n// Anthropic 原生格式 adapter\n// 重构自 buildChatRequest 现有逻辑,功能完全等同。\n// 包含 buildBetas() 调用、serverTools 合入、extraBody 透传。\n\nimport {\n type ChatRequest,\n type ChatResponse,\n type ModelCapabilities,\n type StreamEvent,\n ThinkingHighMinMaxTokens,\n ThinkingMax,\n ThinkingMaxFallbackMaxTokens,\n ThinkingOff,\n} from '../types';\nimport { BusinessError } from '../../shared/errors';\nimport { buildBetas } from '../betas';\nimport { ProviderFormat, type ProviderAdapter } from './index';\n\n/**\n * SDK 在 buildRequestBody 中写入并管理的请求体字段 (精确 body key)。\n * extraBody 中若出现同名 key 会覆盖 SDK 计算结果 (如 Level 模式下的 thinking/effort/max_tokens、\n * 自动组装的 betas、被刻意删除的 temperature), 故透传时强制跳过这些 key。\n */\nconst ANTHROPIC_SDK_MANAGED_BODY_KEYS: ReadonlySet<string> = new Set([\n 'thinking',\n 'effort',\n 'max_tokens',\n 'temperature',\n 'betas',\n]);\n\n/** 实现 ProviderAdapter, 用于 Anthropic 原生模型 */\nexport class AnthropicAdapter implements ProviderAdapter {\n format(): ProviderFormat {\n return ProviderFormat.Anthropic;\n }\n\n endpointSuffix(): string {\n return '/anthropic';\n }\n\n /**\n * 构建 Anthropic 格式请求体\n * 逻辑等同于原 buildChatRequest, 包含完整的 betas/tools/serverTools/extraBody 处理\n */\n buildRequestBody(caps: ModelCapabilities, req: ChatRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // 消息: rawMessages 优先于 messages\n if (req.rawMessages != null) {\n body['messages'] = req.rawMessages;\n } else if ((req.messages?.length ?? 0) > 0) {\n body['messages'] = req.messages;\n }\n\n body['stream'] = req.stream === true;\n\n if (req.max_tokens && req.max_tokens > 0) {\n body['max_tokens'] = req.max_tokens;\n }\n if (req.system != null) {\n body['system'] = req.system;\n }\n if (req.temperature != null) {\n body['temperature'] = req.temperature;\n }\n\n // ── Thinking + Effort 组装 ──\n if (req.thinking && req.thinking.level && req.thinking.level !== '') {\n // Level 模式: SDK 接管 thinking + effort + maxTokens\n resolveThinkingLevel(body, req, caps);\n } else {\n // 兼容模式: 调用方自己拼 (保持 v0.8.0 行为)\n if (req.thinking) {\n body['thinking'] = req.thinking;\n }\n if (req.effort) {\n body['effort'] = req.effort;\n }\n }\n\n // ── Metadata + v1.6.0 endUserId 合并 ──\n // caller 显式 metadata 键 (含 user_id) 永远优先, endUserId 仅在 metadata 无 user_id 键时填入。\n // 不污染 caller 原始对象: 通过浅拷贝构造新 Record, 保留 caller 所有原有键。\n if (req.metadata || (req.endUserId && req.endUserId !== '')) {\n const meta: Record<string, unknown> = {};\n if (req.metadata) {\n for (const [k, v] of Object.entries(req.metadata)) {\n meta[k] = v;\n }\n }\n if (req.endUserId && req.endUserId !== '' && meta['user_id'] === undefined) {\n meta['user_id'] = req.endUserId;\n }\n body['metadata'] = meta;\n }\n\n // ── 合入 tools + serverTools ──\n const allTools: unknown[] = [];\n if (req.tools != null) {\n // tools 透传 — 在 Go 侧通过 json.Marshal+Unmarshal 实现深拷贝, TS 中我们直接拼接\n try {\n const parsed = JSON.parse(JSON.stringify(req.tools));\n if (Array.isArray(parsed)) {\n for (const t of parsed) allTools.push(t);\n }\n } catch {\n // ignore — 与 Go 侧 silent ignore 行为一致\n }\n }\n for (const st of req.serverTools ?? []) {\n const schema: Record<string, unknown> = {\n type: st.type,\n name: st.name,\n };\n if (st.config) {\n for (const [k, v] of Object.entries(st.config)) {\n schema[k] = v;\n }\n }\n allTools.push(schema);\n }\n if (allTools.length > 0) {\n body['tools'] = allTools;\n }\n\n // ── 推理控制 (非 Level 模式时的透传) ──\n if (req.speed && req.speed !== '') {\n body['speed'] = req.speed;\n }\n if (req.outputConfig) {\n body['output_config'] = req.outputConfig;\n }\n\n // ── Beta 自动组装 ──\n const betas = buildBetas(caps, req);\n if (betas.length > 0) {\n body['betas'] = betas;\n }\n\n // ── 透传 extraBody ──\n // 注意: extraBody 在 resolveThinkingLevel 之后执行,\n // Level 模式下 thinking / effort / max_tokens / temperature / betas 已由 SDK 管理,\n // extraBody 中若含这些 key 会覆盖 SDK 计算结果 — 强制跳过并告警,\n // 但保留 extraBody 透传其它 (非管理) 字段的正当能力。\n if (req.extraBody) {\n for (const [k, v] of Object.entries(req.extraBody)) {\n if (ANTHROPIC_SDK_MANAGED_BODY_KEYS.has(k)) {\n console.warn(\n `acosmi-sdk: extraBody key \"${k}\" is SDK-managed and was ignored (use the dedicated request field instead).`,\n );\n continue;\n }\n body[k] = v;\n }\n }\n\n return body;\n }\n\n /**\n * 解析 Anthropic 格式同步响应\n * 兼容 APIResponse 包装 {\"code\":0,\"data\":{...}} 和裸 Anthropic JSON 两种格式\n */\n parseResponse(bodyInput: Uint8Array | string): ChatResponse {\n const bodyStr = typeof bodyInput === 'string' ? bodyInput : new TextDecoder().decode(bodyInput);\n\n // 尝试 APIResponse 包装\n let raw = bodyStr;\n try {\n const wrapper = JSON.parse(bodyStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n if ((wrapper.code ?? 0) !== 0) {\n throw new BusinessError(wrapper.code ?? 0, wrapper.message ?? '');\n }\n raw = JSON.stringify(wrapper.data);\n }\n } catch (e) {\n if (e instanceof BusinessError) throw e;\n // 非 JSON 或无 wrapper 格式 — 用原始 bodyStr\n }\n\n let resp: ChatResponse;\n try {\n resp = JSON.parse(raw) as ChatResponse;\n } catch (e) {\n throw new Error(\n `decode anthropic response: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n resp.tokenRemaining = -1;\n resp.callRemaining = -1;\n resp.modelTokenRemaining = -1;\n resp.modelTokenRemainingETU = -1;\n return resp;\n }\n\n /**\n * 解析 Anthropic SSE 行\n *\n * Anthropic 原生协议无 [DONE] (message_stop 后上游关闭连接),\n * 但 Nexus Gateway 的 ChatStream 路径会追加 [DONE] 哨兵, 此处一并处理。\n */\n parseStreamLine(eventType: string, data: string): { event: StreamEvent; done: boolean } {\n if (data === '[DONE]') {\n return { event: { event: '', data: '' }, done: true };\n }\n return { event: { event: eventType, data }, done: false };\n }\n}\n\n/**\n * 根据 ThinkingConfig.level 自动组装请求参数\n *\n * off → thinking=disabled, 不设 effort, 不动 maxTokens\n * high → thinking=adaptive, effort=high, maxTokens 至少 32K\n * max → thinking=adaptive, effort=max, maxTokens 拉到模型上限\n *\n * 旧模型不支持 adaptive 时, 回退到 enabled + budget_tokens = maxTokens - 1\n */\nexport function resolveThinkingLevel(\n body: Record<string, unknown>,\n req: ChatRequest,\n caps: ModelCapabilities,\n): void {\n const level = req.thinking?.level ?? '';\n\n // ── off ──\n if (level === ThinkingOff) {\n body['thinking'] = { type: 'disabled' };\n return;\n }\n\n // ── 模型不支持任何形式的 thinking → 不动 maxTokens, 直接返回 ──\n if (!caps.supports_adaptive_thinking && !caps.supports_thinking) {\n return;\n }\n\n // ── 确定 maxTokens ──\n let maxTokens = req.max_tokens ?? 0;\n if (maxTokens <= 0) {\n maxTokens = ThinkingHighMinMaxTokens;\n }\n\n if (level === ThinkingMax) {\n let modelMax = caps.max_output_tokens;\n if (modelMax <= 0) modelMax = ThinkingMaxFallbackMaxTokens;\n if (maxTokens < modelMax) maxTokens = modelMax;\n } else {\n if (maxTokens < ThinkingHighMinMaxTokens) maxTokens = ThinkingHighMinMaxTokens;\n }\n body['max_tokens'] = maxTokens;\n\n // ── thinking ──\n // adaptive 优先 (Claude 4.x); 旧模型回退 enabled + full budget\n if (caps.supports_adaptive_thinking) {\n const thinking: Record<string, unknown> = { type: 'adaptive' };\n if (req.thinking?.display) thinking['display'] = req.thinking.display;\n body['thinking'] = thinking;\n } else if (caps.supports_thinking) {\n let budget = maxTokens - 1;\n if (budget < 1024) budget = 1024;\n const thinking: Record<string, unknown> = {\n type: 'enabled',\n budget_tokens: budget,\n };\n if (req.thinking?.display) thinking['display'] = req.thinking.display;\n body['thinking'] = thinking;\n }\n\n // ── effort ──\n // 仅支持 effort 的模型发送此参数\n if (caps.supports_effort) {\n let effortLevel = 'high';\n if (level === 'low') effortLevel = 'low';\n if (level === 'medium' || level === 'xhigh') effortLevel = level;\n if (level === ThinkingMax && caps.supports_max_effort) {\n effortLevel = 'max';\n }\n body['effort'] = { level: effortLevel };\n }\n\n // ── API 约束: thinking 与 temperature 互斥 ──\n delete body['temperature'];\n}\n","// adapters/openai.ts — 端口自 acosmi-sdk-go/adapter_openai.go (535 行)\n//\n// 用于所有非 Anthropic 厂商 (DeepSeek, DashScope, Zhipu, Moonshot, VolcEngine 等)\n// SDK 只做格式转换, 厂商特定参数由 Nexus Gateway per-provider adapter 处理\n//\n// 关键区别:\n// - 不注入 Anthropic betas\n// - 端点后缀为 /chat (非 /anthropic)\n// - 流式使用 [DONE] 标记结束 (非 message_stop)\n// - 响应为 OpenAI choices 格式\n\nimport { type AnthropicContentBlock, type AnthropicResponse } from '../wire-anthropic';\nimport { type OpenAIChatResponse, type OpenAIStreamChunk } from '../wire-openai';\nimport {\n type ChatContentBlock,\n type ChatRequest,\n type ChatResponse,\n type ModelCapabilities,\n type StreamEvent,\n ThinkingHigh,\n ThinkingMax,\n ThinkingOff,\n} from '../types';\nimport { BusinessError } from '../../shared/errors';\nimport { ProviderFormat, type ProviderAdapter } from './index';\n\n/** 实现 ProviderAdapter, 用于所有非 Anthropic 厂商 */\nexport class OpenAIAdapter implements ProviderAdapter {\n format(): ProviderFormat {\n return ProviderFormat.OpenAI;\n }\n\n endpointSuffix(): string {\n return '/chat';\n }\n\n /**\n * 构建 OpenAI 兼容格式请求体\n * 不注入 Anthropic betas, 扩展字段 (thinking/effort/speed) 以通用 JSON 传递\n */\n buildRequestBody(_caps: ModelCapabilities, req: ChatRequest): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n\n // ── 消息: 直接透传 (Gateway 负责最终转换) ──\n if (req.rawMessages != null) {\n body['messages'] = req.rawMessages;\n } else if ((req.messages?.length ?? 0) > 0) {\n body['messages'] = req.messages;\n }\n\n body['stream'] = req.stream === true;\n if (req.max_tokens && req.max_tokens > 0) {\n body['max_tokens'] = req.max_tokens;\n }\n\n // ── System prompt: 透传给 Gateway ──\n if (req.system != null) {\n body['system'] = req.system;\n }\n\n // ── Temperature ──\n if (req.temperature != null) {\n body['temperature'] = req.temperature;\n }\n\n // ── Tools: 透传原始格式, Gateway adapter 负责格式转换 ──\n if (req.tools != null) {\n body['tools'] = req.tools;\n }\n\n // ── 扩展字段 (v0.13.0: 按 OpenAI wire format 直接翻译) ──\n\n // Thinking / Effort → reasoning_effort\n // OpenAI 系只有顶层 `reasoning_effort: \"low\"|\"medium\"|\"high\"`, 无 thinking block;\n // 能接收到 reasoning_content (GLM/DeepSeek) 作为响应, 但请求侧只能控制级别。\n const eff = resolveOpenAIReasoningEffort(req, _caps.supports_max_effort);\n if (eff !== '') {\n body['reasoning_effort'] = eff;\n }\n if (_caps.supports_thinking && req.thinking?.level === ThinkingOff) {\n body['thinking'] = { type: 'disabled' };\n }\n\n if (req.speed && req.speed !== '') {\n body['speed'] = req.speed;\n }\n\n // outputConfig → response_format\n // Anthropic 心智模型通过 system prompt + prefill 实现 JSON 模式;\n // OpenAI 有顶层 response_format, SDK 直接翻译。\n const rf = resolveOpenAIResponseFormat(req);\n if (rf) {\n body['response_format'] = rf;\n }\n\n if (req.metadata) {\n body['metadata'] = req.metadata;\n }\n\n // parallel_tool_calls 是 OpenAI 原生字段, 无歧义直接写\n if (req.parallelToolCalls != null) {\n body['parallel_tool_calls'] = req.parallelToolCalls;\n }\n\n // ── 不注入 Anthropic Betas ──\n // OpenAI 格式不使用 anthropic-beta header\n\n // ── 透传 extraBody ──\n if (req.extraBody) {\n for (const [k, v] of Object.entries(req.extraBody)) {\n body[k] = v;\n }\n }\n\n // ── v1.6.0: endUserId → 顶层 body[\"user_id\"] (OpenAI wire 形态) ──\n // 优先级最高: 在 extraBody 之后写入, 即便 caller 通过 extraBody[\"user_id\"] 自填,\n // 显式 endUserId 仍胜出 (单一真相, 避免双写歧义)。\n // 网关 sanitizer 仍会做最终校验与权限决断, 此处仅负责字段位置正确。\n if (req.endUserId && req.endUserId !== '') {\n body['user_id'] = req.endUserId;\n }\n\n // ── 流式选项 ──\n if (req.stream === true) {\n body['stream_options'] = { include_usage: true };\n }\n\n return body;\n }\n\n /**\n * 解析 OpenAI 格式同步响应为 ChatResponse\n * 兼容 APIResponse 包装 {\"code\":0,\"data\":{...}} 和裸 OpenAI JSON 两种格式\n */\n parseResponse(bodyInput: Uint8Array | string): ChatResponse {\n const bodyStr = typeof bodyInput === 'string' ? bodyInput : new TextDecoder().decode(bodyInput);\n\n let raw = bodyStr;\n try {\n const wrapper = JSON.parse(bodyStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n if ((wrapper.code ?? 0) !== 0) {\n throw new BusinessError(wrapper.code ?? 0, wrapper.message ?? '');\n }\n raw = JSON.stringify(wrapper.data);\n }\n } catch (e) {\n if (e instanceof BusinessError) throw e;\n }\n\n let oaiResp: OpenAIChatResponse;\n try {\n oaiResp = JSON.parse(raw) as OpenAIChatResponse;\n } catch (e) {\n throw new Error(`decode openai response: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n return convertOpenAIToChatResponse(oaiResp);\n }\n\n /**\n * 解析 OpenAI SSE 行\n * [DONE] 标记流结束\n */\n parseStreamLine(eventType: string, data: string): { event: StreamEvent; done: boolean } {\n if (data === '[DONE]') {\n return { event: { event: '', data: '' }, done: true };\n }\n\n // 校验 chunk 是合法 JSON (与 Go 侧行为对齐)\n try {\n JSON.parse(data);\n } catch (e) {\n throw new Error(`parse openai stream chunk: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n return { event: { event: eventType, data }, done: false };\n }\n}\n\n/**\n * 把 Anthropic 心智模型的 thinking/effort 翻译成 OpenAI `reasoning_effort` 字段值\n * 返回空串表示不设置\n */\nexport function resolveOpenAIReasoningEffort(req: ChatRequest, supportsMax = false): string {\n // effort 优先级最高, 因为它本身就是通用级别语义\n if (req.effort && req.effort.level !== '') {\n switch (req.effort.level) {\n case 'low':\n case 'medium':\n case 'high':\n case 'xhigh':\n return req.effort.level;\n case 'max':\n // OpenAI 无 max 级别, 等价最深 = high\n return supportsMax ? 'max' : 'high';\n }\n }\n // thinking.level 次之\n if (req.thinking) {\n switch (req.thinking.level) {\n case 'low':\n case 'medium':\n case 'xhigh':\n return req.thinking.level;\n case ThinkingHigh:\n return 'high';\n case ThinkingMax:\n return supportsMax ? 'max' : 'high';\n case ThinkingOff:\n return '';\n }\n }\n return '';\n}\n\n/**\n * 把 outputConfig 翻译成 OpenAI response_format\n * 返回 null 表示不设置\n */\nexport function resolveOpenAIResponseFormat(req: ChatRequest): Record<string, unknown> | null {\n if (!req.outputConfig) return null;\n switch (req.outputConfig.format) {\n case 'json_schema': {\n // OpenAI schema 形态: {type:\"json_schema\", json_schema:{schema:{...},strict:true}}\n const js: Record<string, unknown> = {};\n if (req.outputConfig.schema != null) {\n js['schema'] = req.outputConfig.schema;\n }\n js['strict'] = true;\n return {\n type: 'json_schema',\n json_schema: js,\n };\n }\n case 'json_object':\n return { type: 'json_object' };\n case '':\n case undefined:\n return null;\n default:\n // 未知 format, 原样透传, 交 Gateway 处理\n return { type: req.outputConfig.format };\n }\n}\n\n/** 将 OpenAI 同步响应转换为 ChatResponse */\nfunction convertOpenAIToChatResponse(oai: OpenAIChatResponse): ChatResponse {\n const resp: ChatResponse = {\n id: oai.id,\n type: 'message',\n model: oai.model,\n role: 'assistant',\n content: [],\n stop_reason: '',\n usage: {\n input_tokens: oai.usage.prompt_tokens,\n output_tokens: oai.usage.completion_tokens,\n },\n tokenRemaining: -1,\n callRemaining: -1,\n modelTokenRemaining: -1,\n modelTokenRemainingETU: -1,\n };\n\n if (oai.choices.length > 0) {\n const choice = oai.choices[0]!;\n\n // finish_reason 映射\n switch (choice.finish_reason) {\n case 'stop':\n resp.stop_reason = 'end_turn';\n break;\n case 'tool_calls':\n resp.stop_reason = 'tool_use';\n break;\n case 'length':\n resp.stop_reason = 'max_tokens';\n break;\n default:\n resp.stop_reason = choice.finish_reason;\n }\n\n // thinking content → thinking block\n if (choice.message.reasoning_content && choice.message.reasoning_content !== '') {\n resp.content.push({\n type: 'thinking',\n thinking: choice.message.reasoning_content,\n } as ChatContentBlock);\n }\n\n // text content → text block\n if (choice.message.content && choice.message.content !== '') {\n resp.content.push({\n type: 'text',\n text: choice.message.content,\n } as ChatContentBlock);\n }\n\n // tool_calls → tool_use blocks\n for (const tc of choice.message.tool_calls ?? []) {\n resp.content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n // Anthropic 协议 input 是 raw JSON value; OpenAI 给的 arguments 是 string,\n // Go 侧用 json.RawMessage(arguments) 直透(原始字节). TS 我们尝试解析:\n input: tryParseJSON(tc.function.arguments),\n } as ChatContentBlock);\n }\n }\n\n return resp;\n}\n\nfunction tryParseJSON(s: string): unknown {\n try {\n return JSON.parse(s);\n } catch {\n return s;\n }\n}\n\n// ============================================================================\n// OpenAI → Anthropic 响应转换 (供 ChatMessages 使用)\n// ============================================================================\n\n/**\n * 解析 OpenAI 格式响应并转换为 AnthropicResponse\n * 用于 chatMessagesOpenAI 方法, 使 Hub 层无需感知 provider 差异\n */\nexport function parseOpenAIResponseToAnthropic(raw: string | Uint8Array): AnthropicResponse {\n const rawStr = typeof raw === 'string' ? raw : new TextDecoder().decode(raw);\n\n let data = rawStr;\n try {\n const wrapper = JSON.parse(rawStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n if ((wrapper.code ?? 0) !== 0) {\n throw new BusinessError(wrapper.code ?? 0, wrapper.message ?? '');\n }\n data = JSON.stringify(wrapper.data);\n }\n } catch (e) {\n if (e instanceof BusinessError) throw e;\n }\n\n let oaiResp: OpenAIChatResponse;\n try {\n oaiResp = JSON.parse(data) as OpenAIChatResponse;\n } catch (e) {\n throw new Error(`decode openai response: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n const resp: AnthropicResponse = {\n id: oaiResp.id,\n type: 'message',\n role: 'assistant',\n content: [],\n model: oaiResp.model,\n stop_reason: '',\n usage: {\n input_tokens: oaiResp.usage.prompt_tokens,\n output_tokens: oaiResp.usage.completion_tokens,\n },\n };\n\n if (oaiResp.choices.length > 0) {\n const choice = oaiResp.choices[0]!;\n\n switch (choice.finish_reason) {\n case 'stop':\n resp.stop_reason = 'end_turn';\n break;\n case 'tool_calls':\n resp.stop_reason = 'tool_use';\n break;\n case 'length':\n resp.stop_reason = 'max_tokens';\n break;\n default:\n resp.stop_reason = choice.finish_reason;\n }\n\n if (choice.message.reasoning_content && choice.message.reasoning_content !== '') {\n resp.content.push({\n type: 'thinking',\n thinking: choice.message.reasoning_content,\n } as AnthropicContentBlock);\n }\n\n if (choice.message.content && choice.message.content !== '') {\n resp.content.push({\n type: 'text',\n text: choice.message.content,\n } as AnthropicContentBlock);\n }\n\n for (const tc of choice.message.tool_calls ?? []) {\n resp.content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input: tryParseJSON(tc.function.arguments),\n } as AnthropicContentBlock);\n }\n }\n\n return resp;\n}\n\n// ============================================================================\n// OpenAI SSE → Anthropic 事件转换器 (供 chatMessagesStreamInternal 使用)\n// ============================================================================\n\n/**\n * 将 OpenAI SSE chunks 转换为 Anthropic 兼容的 StreamEvent\n * 有状态: 跨 chunk 追踪 block 索引\n */\nexport class OpenAIStreamConverter {\n private messageStarted = false;\n private thinkingStarted = false;\n private thinkingStopped = false;\n /** thinking block 打开时占用的 Anthropic block index — 关闭时必须用它, 不能用\n * 可能已被 text/tool 推进的 this.blockIndex (否则 content_block_stop 索引错配)。 */\n private thinkingBlockIndex = 0;\n private textStarted = false;\n /** OpenAI tool_call 键 → Anthropic block index。键正常是 `tc.index`;上游省略\n * index 时退化为 `id:<tool_call_id>`,两者都没有时沿用上一个键(见\n * {@link resolveToolKey})。 */\n private toolBlockIndex = new Map<string | number, number>();\n private blockIndex = 0;\n /** 每个 tool block 已发出的 `partial_json` 累积,用于识别「每片重发全量参数」\n * 的上游(见 tool_calls 分支的累计判别)。 */\n private toolArgsAccum = new Map<string | number, string>();\n /** 上一次解析出的 tool 键,供缺 index 且缺 id 的后续增量沿用。 */\n private lastToolKey: string | number | null = null;\n /** 已发出 message_delta/message_stop,避免 finish_reason 与 `[DONE]` 各收一次。 */\n private messageClosed = false;\n\n /**\n * 解析一条 tool_call delta 归属的块键。\n *\n * OpenAI 流式规范里 `index` 是必填,但兼容实现常有省略。此前这里直接用\n * `tc.index` 做 Map 键:两个都省略 index 的 tool_call 会共用键 `undefined`,\n * 于是只开一个块、两段参数拼进同一条 `partial_json` 流,产出 `{…}{…}` 这种\n * 必然非法的 JSON。这里按「index → id → 沿用上一个」三级降级,让至少一种\n * 稳定标识生效。\n */\n private resolveToolKey(tc: { index?: number; id?: string }): string | number {\n if (typeof tc.index === 'number' && Number.isFinite(tc.index)) {\n this.lastToolKey = tc.index;\n return tc.index;\n }\n if (typeof tc.id === 'string' && tc.id !== '') {\n const key = `id:${tc.id}`;\n this.lastToolKey = key;\n return key;\n }\n if (this.lastToolKey !== null) return this.lastToolKey;\n this.lastToolKey = 0;\n return 0;\n }\n\n /**\n * 关闭仍打开的 text / thinking / tool 块,并收口 message。\n *\n * 由 `finish_reason` 分支与 `[DONE]` 分支共用:上游断流或只发 `[DONE]` 而不发\n * `finish_reason` 时,此前一个 `content_block_stop` 都不会发,下游拿到的是一个\n * 永不闭合的 tool_use 块。\n */\n private closeOpenBlocks(events: StreamEvent[], stopReason: string): void {\n if (this.messageClosed) return;\n this.messageClosed = true;\n\n if (this.textStarted) {\n events.push({\n event: 'content_block_stop',\n data: JSON.stringify({ type: 'content_block_stop', index: this.blockIndex }),\n });\n this.textStarted = false;\n } else if (this.thinkingStarted && !this.thinkingStopped) {\n // 用 thinkingBlockIndex 关 — thinking-only 流末尾若有 tool block 推进过\n // blockIndex, 这里仍要用 thinking 自己打开时记下的 index, 否则错配。\n this.thinkingStopped = true;\n events.push({\n event: 'content_block_stop',\n data: JSON.stringify({ type: 'content_block_stop', index: this.thinkingBlockIndex }),\n });\n }\n for (const idx of this.toolBlockIndex.values()) {\n events.push({\n event: 'content_block_stop',\n data: JSON.stringify({ type: 'content_block_stop', index: idx }),\n });\n }\n events.push({\n event: 'message_delta',\n data: JSON.stringify({ type: 'message_delta', delta: { stop_reason: stopReason } }),\n });\n events.push({\n event: 'message_stop',\n data: JSON.stringify({ type: 'message_stop' }),\n });\n }\n\n /**\n * 将一行 OpenAI SSE data 转换为零或多个 Anthropic 格式 StreamEvent\n * 返回 { events, done }\n */\n convert(data: string): { events: StreamEvent[]; done: boolean } {\n if (data === '[DONE]') {\n // 上游可能在 `[DONE]` 之前不发 finish_reason(部分兼容实现、以及被中断的\n // 流)。此前这里直接返回空事件,已打开的块永不闭合,下游只能靠超时收场。\n const events: StreamEvent[] = [];\n if (this.messageStarted) {\n this.closeOpenBlocks(events, 'end_turn');\n }\n return { events, done: true };\n }\n\n let chunk: OpenAIStreamChunk;\n try {\n chunk = JSON.parse(data);\n } catch (e) {\n throw new Error(`parse openai stream chunk: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n const events: StreamEvent[] = [];\n if (chunk.choices.length === 0) {\n return { events, done: false };\n }\n const choice = chunk.choices[0]!;\n\n // 首个 chunk: 发送 message_start\n if (!this.messageStarted) {\n this.messageStarted = true;\n const msgJSON = JSON.stringify({\n type: 'message_start',\n message: {\n id: chunk.id,\n type: 'message',\n role: 'assistant',\n content: [],\n model: '',\n },\n });\n events.push({ event: 'message_start', data: msgJSON });\n }\n\n // thinking delta (reasoning_content)\n if (choice.delta.reasoning_content && choice.delta.reasoning_content !== '') {\n if (!this.thinkingStarted) {\n this.thinkingStarted = true;\n this.thinkingBlockIndex = this.blockIndex; // 记下 thinking 占用的 index\n const blockJSON = JSON.stringify({\n type: 'content_block_start',\n index: this.blockIndex,\n content_block: { type: 'thinking', thinking: '' },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n }\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: this.thinkingBlockIndex,\n delta: { type: 'thinking_delta', thinking: choice.delta.reasoning_content },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n\n // text delta (content)\n if (choice.delta.content && choice.delta.content !== '') {\n // 关闭 thinking block (如果有) — 用 thinkingBlockIndex 关, 不用可能已推进的 blockIndex\n if (this.thinkingStarted && !this.thinkingStopped) {\n this.thinkingStopped = true;\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.thinkingBlockIndex,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n this.blockIndex++;\n }\n if (!this.textStarted) {\n this.textStarted = true;\n const blockJSON = JSON.stringify({\n type: 'content_block_start',\n index: this.blockIndex,\n content_block: { type: 'text', text: '' },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n }\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: this.blockIndex,\n delta: { type: 'text_delta', text: choice.delta.content },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n\n // tool_calls delta\n for (const tc of choice.delta.tool_calls ?? []) {\n // 上游给的 tool_call 未必带 `function`:OpenAI 流式规范允许后续增量只带\n // `{index}`。此前这里直接读 `tc.function.name` / `tc.function.arguments`,\n // 那种上游会抛 TypeError 撕开整条 for-await 链,整个回合失败。\n const fn = tc.function as { name?: string; arguments?: unknown } | undefined;\n const toolKey = this.resolveToolKey(tc);\n if (!this.toolBlockIndex.has(toolKey)) {\n // 关闭仍打开的 thinking block (镜像 text 分支): chunk 顺序 reasoning_content →\n // tool_calls (中间无 content text delta) 时, thinking 仍开着且 blockIndex 未推进,\n // 若不在此关闭并递增, tool block 会与 thinking 撞 index 0。用 thinkingBlockIndex 关。\n if (this.thinkingStarted && !this.thinkingStopped) {\n this.thinkingStopped = true;\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.thinkingBlockIndex,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n this.blockIndex++;\n }\n // 关闭 text block (如果有)\n if (this.textStarted) {\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.blockIndex,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n this.blockIndex++;\n this.textStarted = false;\n }\n this.toolBlockIndex.set(toolKey, this.blockIndex);\n const blockJSON = JSON.stringify({\n type: 'content_block_start',\n index: this.blockIndex,\n content_block: {\n type: 'tool_use',\n id: tc.id,\n name: fn?.name,\n input: {},\n },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n this.blockIndex++; // 递增, 为下一个 tool_call block 预留索引\n }\n if (fn?.arguments !== undefined && fn.arguments !== null && fn.arguments !== '') {\n // `arguments` 按 OpenAI 规范是 string,但部分兼容实现直接给对象。此前原样\n // 塞进 `partial_json`,下游 `input += delta.partial_json` 会拼出\n // \"[object Object]\"。这里统一成字符串,语义不变。\n const rawArgs =\n typeof fn.arguments === 'string' ? fn.arguments : JSON.stringify(fn.arguments);\n\n // 累计 vs 增量判别:部分上游每个 chunk 重发**全量**参数而非增量。此前无条件\n // 累加,会拼出 `{\"a\":1}{\"a\":1}{\"a\":1}` 这种必然非法的 JSON。判据取最保守的\n // 一种:新片严格以已累积内容为前缀**且**更长时,才认为上游在重发全量,只发\n // 差值。真增量流里某一片恰好等于「此前全部内容的延长」概率可忽略。\n const accum = this.toolArgsAccum.get(toolKey) ?? '';\n let emit = rawArgs;\n if (accum !== '' && rawArgs.length > accum.length && rawArgs.startsWith(accum)) {\n emit = rawArgs.slice(accum.length);\n this.toolArgsAccum.set(toolKey, rawArgs);\n } else {\n this.toolArgsAccum.set(toolKey, accum + rawArgs);\n }\n\n if (emit !== '') {\n const idx = this.toolBlockIndex.get(toolKey)!;\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: idx,\n delta: {\n type: 'input_json_delta',\n partial_json: emit,\n },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n }\n }\n\n // finish_reason: 关闭所有 block + message_delta + message_stop\n if (choice.finish_reason != null && choice.finish_reason !== '') {\n // stop_reason 映射。`content_filter` 等未列出的值刻意保持原样透传而不是压成\n // `end_turn` —— 把内容审查拦截伪装成正常结束会让下游无从分辨。同文件的\n // `convertOpenAIToChatResponse` 一直是原样透传,这里跟它对齐。\n let stopReason: string;\n switch (choice.finish_reason) {\n case 'tool_calls':\n stopReason = 'tool_use';\n break;\n case 'length':\n stopReason = 'max_tokens';\n break;\n case 'stop':\n stopReason = 'end_turn';\n break;\n default:\n stopReason = choice.finish_reason;\n }\n this.closeOpenBlocks(events, stopReason);\n }\n\n return { events, done: false };\n }\n}\n\nexport function newOpenAIStreamConverter(): OpenAIStreamConverter {\n return new OpenAIStreamConverter();\n}\n","// adapters/index.ts — 端口自 acosmi-sdk-go/adapter.go (v0.19.0)\n//\n// SDK 层按上游托管模型元数据选路:\n// preferred_format == \"anthropic\" → AnthropicAdapter → POST /managed-models/:id/anthropic\n// preferred_format == \"openai\" → OpenAIAdapter → POST /managed-models/:id/chat\n//\n// 旧上游若未返回 preferred_format / supported_formats, SDK 才回落到 provider 名称:\n// provider == \"anthropic\" / \"acosmi\" → AnthropicAdapter\n// 其他 provider → OpenAIAdapter\n//\n// SDK 只负责: 格式路由 + 请求结构转换 + 响应结构转换\n// 厂商特定协议差异 (endpoint/auth/region/字段裁剪) 由 Nexus Gateway Profile 处理\n//\n// ============================================================================\n// 红线 (双产品消费): AnthropicAdapter + OpenAIAdapter 等地位, 不可合并/降级\n// ============================================================================\n\nimport type { ManagedModel, ChatRequest, ChatResponse, StreamEvent, ModelCapabilities } from '../types';\n\n/** 标识请求格式 */\nexport enum ProviderFormat {\n /** Anthropic 原生格式 */\n Anthropic = 0,\n /** OpenAI 兼容格式 */\n OpenAI = 1,\n}\n\n/** 将 ChatRequest 转换为特定格式的 adapter 接口 */\nexport interface ProviderAdapter {\n /** 此 adapter 使用的请求格式 */\n format(): ProviderFormat;\n\n /**\n * API 路径后缀\n * Anthropic: \"/anthropic\", OpenAI: \"/chat\"\n */\n endpointSuffix(): string;\n\n /**\n * 将 ChatRequest 转换为 HTTP body (object → JSON.stringify)\n * caps 用于条件化字段注入 (如 betas)\n */\n buildRequestBody(caps: ModelCapabilities, req: ChatRequest): Record<string, unknown>;\n\n /** 解析同步响应 body 为 ChatResponse */\n parseResponse(body: Uint8Array | string): ChatResponse;\n\n /**\n * 解析一行 SSE data 为 StreamEvent\n * 返回 { event, done }; done=true 表示流结束 ([DONE] 或 message_stop)\n */\n parseStreamLine(eventType: string, data: string): { event: StreamEvent; done: boolean };\n}\n\n// 实现 import 在文件末尾, 避免循环依赖(adapter impl 也需引用 ProviderFormat)\nimport { AnthropicAdapter } from './anthropic';\nimport { OpenAIAdapter } from './openai';\n\n/** 按 provider 名称映射 adapter */\nconst adapterRegistry: Record<string, ProviderAdapter> = {\n anthropic: new AnthropicAdapter(),\n /** Acosmi 自有模型走 Anthropic 格式 */\n acosmi: new AnthropicAdapter(),\n};\n\n/** 非 Anthropic 厂商的默认 adapter */\nconst defaultOpenAIAdapter: ProviderAdapter = new OpenAIAdapter();\n\n/**\n * 根据 provider 返回对应的 adapter (v0.5.0 遗留 API, 向后兼容)\n * 新代码应使用 getAdapterForModel\n */\nexport function getAdapter(provider: string): ProviderAdapter {\n const a = adapterRegistry[provider.toLowerCase()];\n if (a) return a;\n return defaultOpenAIAdapter;\n}\n\n/**\n * 按 ManagedModel 的 preferred_format / supported_formats 选择 adapter\n *\n * 决策顺序:\n * 1. preferred_format 非空 **且** 该格式在 supported_formats 内 (或 supported_formats 未声明)\n * → 按其值返回 (anthropic | openai)\n * 2. supported_formats 含 \"anthropic\" → AnthropicAdapter\n * 3. supported_formats 含 \"openai\" → OpenAIAdapter\n * 4. 两字段均空 (旧上游) → 回落 provider 名硬编码 (原 getAdapter 行为)\n *\n * 这使得 dashscope / zhipu / deepseek 等 provider 的模型如果上游启用了\n * Anthropic 兼容端点, 也能走 /anthropic 路径, 不再被 provider 字符串硬编码到 /chat\n * 导致 tool_reference 400.\n *\n * [格式一致性护栏 2026-05-29] preferred_format 仅在确被 supported_formats 收录时才采信:\n * 防止上游元数据漂移 (preferred_format=anthropic 但 supported_formats=[openai]) 把 SDK\n * 路由到模型并不支持的格式端点 (撞 /anthropic \"未绑定 Anthropic\" 4xx)。这是网关侧\n * \"同 model_id 双 profile 选行\" 根因修复在 SDK 侧的同构护栏。\n */\nexport function getAdapterForModel(m: ManagedModel): ProviderAdapter {\n let hasAnthropic = false;\n let hasOpenAI = false;\n for (const f of m.supported_formats ?? []) {\n switch (f.trim().toLowerCase()) {\n case 'anthropic':\n hasAnthropic = true;\n break;\n case 'openai':\n hasOpenAI = true;\n break;\n }\n }\n const declared = hasAnthropic || hasOpenAI;\n\n const pref = (m.preferred_format ?? '').trim().toLowerCase();\n switch (pref) {\n case 'anthropic':\n if (!declared || hasAnthropic) return new AnthropicAdapter();\n break;\n case 'openai':\n if (!declared || hasOpenAI) return new OpenAIAdapter();\n break;\n }\n\n if (hasAnthropic) return new AnthropicAdapter();\n if (hasOpenAI) return new OpenAIAdapter();\n\n // 旧上游未填字段: 回落到 provider 名硬编码 (向后兼容)\n return getAdapter((m.provider ?? '').toLowerCase());\n}\n\nexport { AnthropicAdapter, OpenAIAdapter };\nexport { OpenAIStreamConverter, newOpenAIStreamConverter } from './openai';\n","import type {\n CredentialSnapshot,\n CredentialCASResult,\n VersionedCredentialStore,\n CredentialReason,\n CredentialRequestOwner,\n} from './store';\nimport type { ServerMetadata, TokenSet, TokenResponse } from '../auth/types';\n\nconst uuid = () => globalThis.crypto.randomUUID();\nconst pause = () => new Promise<void>((resolve) => setTimeout(resolve, 25));\nconst abort = (signal?: AbortSignal) => {\n if (signal?.aborted) throw new Error('aborted');\n};\nconst sameRequestOwner = (snapshot: CredentialSnapshot, expected: CredentialRequestOwner) =>\n snapshot.storeInstanceId === expected.storeInstanceId &&\n snapshot.authSessionId === expected.authSessionId &&\n snapshot.principal?.issuer === expected.principal?.issuer &&\n snapshot.principal?.subject === expected.principal?.subject &&\n snapshot.principal?.organizationId === expected.principal?.organizationId;\nexport type CredentialStateNotification = Omit<CredentialSnapshot, 'tokenSet'>;\nexport interface CredentialProtocol {\n metadata(signal?: AbortSignal): Promise<ServerMetadata>;\n profile(\n tokens: TokenSet,\n signal?: AbortSignal,\n ): Promise<{\n subject: string;\n organizationId: string | null;\n displayName?: string;\n avatarUrl?: string;\n email?: string;\n imageUrl?: string;\n accountCreatedAt?: string;\n requiresPhoneBinding?: boolean;\n hasExtraUsageEnabled?: boolean;\n billingType?: string;\n subscriptionCreatedAt?: string;\n rateLimitTier?: string;\n organizationName?: string;\n }>;\n fetch: typeof fetch;\n serverURL: string;\n}\nexport class CredentialLifecycle {\n private listeners = new Set<(value: CredentialStateNotification) => void>();\n private notificationKey = '';\n private observations = new Map<string, CredentialSnapshot>();\n constructor(\n private store: VersionedCredentialStore,\n private protocol: CredentialProtocol,\n ) {}\n read(signal?: AbortSignal) {\n return this.store.readSnapshot(signal);\n }\n subscribe(listener: (value: CredentialStateNotification) => void) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n private async notify(snapshot: CredentialSnapshot) {\n let current: CredentialSnapshot;\n try {\n current = await this.read();\n } catch {\n return;\n }\n if (\n current.storeInstanceId !== snapshot.storeInstanceId ||\n current.revision !== snapshot.revision\n )\n return;\n const projection: CredentialStateNotification = {\n storeInstanceId: snapshot.storeInstanceId,\n authorityConfig: snapshot.authorityConfig && {\n serverURL: snapshot.authorityConfig.serverURL,\n issuer: snapshot.authorityConfig.issuer,\n oauthProfile: 'desktop',\n authContractVersion: 2,\n errorContractVersion: 1,\n },\n revision: snapshot.revision,\n authSessionId: snapshot.authSessionId,\n credentialState: snapshot.credentialState,\n reason: snapshot.reason,\n principal: snapshot.principal && {\n issuer: snapshot.principal.issuer,\n subject: snapshot.principal.subject,\n organizationId: snapshot.principal.organizationId,\n },\n refreshOperation: snapshot.refreshOperation && {\n operationId: snapshot.refreshOperation.operationId,\n sessionId: snapshot.refreshOperation.sessionId,\n baseRevision: snapshot.refreshOperation.baseRevision,\n phase: snapshot.refreshOperation.phase,\n returnState: snapshot.refreshOperation.returnState,\n startedAt: snapshot.refreshOperation.startedAt,\n dispatchedAt: snapshot.refreshOperation.dispatchedAt,\n deadlineAt: snapshot.refreshOperation.deadlineAt,\n },\n loginAttempt: snapshot.loginAttempt && {\n attemptId: snapshot.loginAttempt.attemptId,\n baseSessionId: snapshot.loginAttempt.baseSessionId,\n startedAt: snapshot.loginAttempt.startedAt,\n },\n lastMutation: snapshot.lastMutation && {\n mutationId: snapshot.lastMutation.mutationId,\n operationId: snapshot.lastMutation.operationId,\n resultRevision: snapshot.lastMutation.resultRevision,\n },\n lastLoginAttemptId: snapshot.lastLoginAttemptId,\n verifiedIdentity: snapshot.verifiedIdentity && {\n authSessionId: snapshot.verifiedIdentity.authSessionId,\n principal: {\n issuer: snapshot.verifiedIdentity.principal.issuer,\n subject: snapshot.verifiedIdentity.principal.subject,\n organizationId: snapshot.verifiedIdentity.principal.organizationId,\n },\n displayName: snapshot.verifiedIdentity.displayName,\n avatarUrl: snapshot.verifiedIdentity.avatarUrl,\n email: snapshot.verifiedIdentity.email,\n imageUrl: snapshot.verifiedIdentity.imageUrl,\n accountCreatedAt: snapshot.verifiedIdentity.accountCreatedAt,\n requiresPhoneBinding: snapshot.verifiedIdentity.requiresPhoneBinding,\n hasExtraUsageEnabled: snapshot.verifiedIdentity.hasExtraUsageEnabled,\n billingType: snapshot.verifiedIdentity.billingType,\n subscriptionCreatedAt: snapshot.verifiedIdentity.subscriptionCreatedAt,\n rateLimitTier: snapshot.verifiedIdentity.rateLimitTier,\n organizationName: snapshot.verifiedIdentity.organizationName,\n verifiedAt: snapshot.verifiedIdentity.verifiedAt,\n },\n };\n const key = JSON.stringify({ ...projection, revision: undefined, lastMutation: undefined });\n if (key === this.notificationKey) return;\n this.notificationKey = key;\n for (const listener of this.listeners) {\n try {\n listener(structuredClone(projection));\n } catch {\n /* observer isolation */\n }\n }\n }\n async reconcile(signal?: AbortSignal) {\n const s = await this.read(signal);\n await this.notify(s);\n return s;\n }\n private cas(\n s: CredentialSnapshot,\n changes: Partial<CredentialSnapshot>,\n mutationId = uuid(),\n signal?: AbortSignal,\n ): Promise<CredentialCASResult> {\n return this.store.compareAndSwap(\n {\n storeInstanceId: s.storeInstanceId,\n revision: s.revision,\n authSessionId: s.authSessionId,\n state: s.credentialState,\n operationId: s.refreshOperation?.operationId ?? s.loginAttempt?.attemptId ?? null,\n },\n { ...s, ...changes },\n mutationId,\n signal,\n );\n }\n private async commit(\n s: CredentialSnapshot,\n changes: Partial<CredentialSnapshot>,\n signal?: AbortSignal,\n ) {\n const r = await this.cas(s, changes, uuid(), signal);\n if (r.status === 'storage_error') throw new Error('storage_unavailable');\n if (r.status === 'committed') await this.notify(r.snapshot);\n return r;\n }\n async metadata(s: CredentialSnapshot, signal?: AbortSignal) {\n const m = await this.protocol.metadata(signal);\n if (\n m.crabcode_auth_contract_version !== 2 ||\n m.gateway_error_contract_version !== 1 ||\n !m.issuer\n )\n throw new Error('auth_contract_unsupported');\n if (\n s.authorityConfig &&\n (s.authorityConfig.serverURL !== this.protocol.serverURL ||\n s.authorityConfig.issuer !== m.issuer ||\n s.authorityConfig.oauthProfile !== 'desktop' ||\n s.authorityConfig.authContractVersion !== 2 ||\n s.authorityConfig.errorContractVersion !== 1)\n )\n throw new Error('auth_contract_unsupported');\n return m;\n }\n async reserveLogin(signal?: AbortSignal) {\n const attemptId = uuid();\n let reserved: CredentialSnapshot;\n for (;;) {\n abort(signal);\n const s = await this.read(signal);\n if (s.credentialState !== 'signed_out') throw new Error('local_logout_required');\n const r = await this.commit(s, { loginAttempt: { attemptId, baseSessionId: s.authSessionId, startedAt: new Date().toISOString() } }, signal);\n if (r.status === 'committed') { reserved = r.snapshot; break; }\n }\n try {\n const m = await this.metadata(reserved, signal);\n for (;;) {\n abort(signal);\n const current = await this.read(signal);\n if (current.storeInstanceId !== reserved.storeInstanceId || current.loginAttempt?.attemptId !== attemptId) throw new Error('superseded');\n if (current.authorityConfig) return { attemptId, metadata: m };\n const r = await this.commit(current, { authorityConfig: { serverURL: this.protocol.serverURL, issuer: m.issuer, oauthProfile: 'desktop', authContractVersion: 2, errorContractVersion: 1 } }, signal);\n if (r.status === 'committed') return { attemptId, metadata: m };\n }\n } catch (error) { await this.cancelLogin(attemptId); throw error; }\n }\n async installLogin(attemptId: string, tokens: TokenSet, signal?: AbortSignal) {\n this.validateTokens(tokens);\n for (;;) {\n abort(signal);\n const s = await this.read(signal);\n if (\n s.loginAttempt?.attemptId !== attemptId ||\n s.loginAttempt.baseSessionId !== s.authSessionId\n )\n throw new Error('superseded');\n const r = await this.commit(\n s,\n {\n authSessionId: uuid(),\n tokenSet: tokens,\n credentialState: 'pending_identity',\n principal: null,\n verifiedIdentity: null,\n loginAttempt: null,\n lastLoginAttemptId: attemptId,\n reason: 'identity_unavailable',\n },\n signal,\n );\n if (r.status === 'committed') return this.bindIdentity(r.snapshot.authSessionId!, signal);\n }\n }\n async assertLogin(attemptId: string, signal?: AbortSignal) {\n abort(signal);\n const s = await this.read(signal);\n if (s.loginAttempt?.attemptId !== attemptId) throw new Error('superseded');\n }\n async cancelLogin(attemptId: string) {\n const s = await this.read();\n if (s.loginAttempt?.attemptId === attemptId) await this.commit(s, { loginAttempt: null });\n }\n private validateTokens(t: TokenSet) {\n if (\n !t.access_token?.trim() ||\n !t.refresh_token?.trim() ||\n !t.client_id?.trim() ||\n t.server_url !== this.protocol.serverURL ||\n !Number.isFinite(Date.parse(t.expires_at)) ||\n Date.parse(t.expires_at) <= Date.now()\n )\n throw new Error('invalid_response');\n }\n private usable(s: CredentialSnapshot) {\n return !!s.tokenSet && Date.parse(s.tokenSet.expires_at) > Date.now() + 300_000;\n }\n async bindIdentity(sessionId: string, signal?: AbortSignal): Promise<CredentialSnapshot> {\n const s = await this.ensureSnapshot(signal, undefined, true);\n if (s.authSessionId !== sessionId) throw new Error('superseded');\n if (s.credentialState === 'ready') return s;\n await this.metadata(s, signal);\n const beforeProfile = await this.read(signal);\n if (\n beforeProfile.storeInstanceId !== s.storeInstanceId ||\n beforeProfile.authSessionId !== sessionId ||\n beforeProfile.revision !== s.revision ||\n beforeProfile.credentialState !== 'pending_identity'\n )\n throw new Error('superseded');\n let identity;\n try {\n identity = await this.protocol.profile(s.tokenSet!, signal);\n } catch (error) {\n const message = error instanceof Error ? error.message : '';\n if (message === 'invalid_scope' || message === 'auth_contract_unsupported')\n await this.commit(s, { credentialState: 'configuration_error', reason: message });\n throw error;\n }\n abort(signal);\n const current = await this.read(signal);\n if (\n current.storeInstanceId !== s.storeInstanceId ||\n current.authSessionId !== sessionId ||\n current.revision !== s.revision\n )\n throw new Error('superseded');\n if (!identity.subject) throw new Error('invalid_response');\n const principal = {\n issuer: s.authorityConfig!.issuer,\n subject: identity.subject,\n organizationId: identity.organizationId,\n };\n const r = await this.commit(\n s,\n {\n principal,\n verifiedIdentity: {\n authSessionId: sessionId,\n principal,\n displayName: identity.displayName,\n avatarUrl: identity.avatarUrl,\n email: identity.email,\n imageUrl: identity.imageUrl,\n accountCreatedAt: identity.accountCreatedAt,\n requiresPhoneBinding: identity.requiresPhoneBinding,\n hasExtraUsageEnabled: identity.hasExtraUsageEnabled,\n billingType: identity.billingType,\n subscriptionCreatedAt: identity.subscriptionCreatedAt,\n rateLimitTier: identity.rateLimitTier,\n organizationName: identity.organizationName,\n verifiedAt: new Date().toISOString(),\n },\n credentialState: 'ready',\n reason: null,\n },\n signal,\n );\n if (r.status !== 'committed') throw new Error('superseded');\n return r.snapshot;\n }\n async ensure(signal?: AbortSignal, rejected?: CredentialSnapshot, expected?: CredentialRequestOwner) {\n const snapshot = await this.ensureSnapshot(signal, rejected, false, expected);\n this.observations.set(snapshot.tokenSet!.access_token, snapshot);\n if (this.observations.size > 128)\n this.observations.delete(this.observations.keys().next().value!);\n return snapshot.tokenSet!.access_token;\n }\n async forceRefresh(signal?: AbortSignal, rejectedToken?: string, expected?: CredentialRequestOwner) {\n const rejected = rejectedToken ? this.observations.get(rejectedToken) : await this.read(signal);\n if (rejectedToken && !rejected) throw new Error('credential_observation_unavailable');\n return this.ensure(signal, rejected, expected);\n }\n private async ensureSnapshot(\n signal?: AbortSignal,\n rejected?: CredentialSnapshot,\n pending = false,\n expected?: CredentialRequestOwner,\n ): Promise<CredentialSnapshot> {\n let session: string | null | undefined;\n let instance: string | undefined;\n let initialRevision: string | undefined;\n let refreshed = false;\n let initialAccess: string | undefined;\n for (;;) {\n abort(signal);\n const s = await this.read(signal);\n if (expected && !sameRequestOwner(s, expected)) throw new Error('superseded');\n if (s.authorityConfig && s.authorityConfig.serverURL !== this.protocol.serverURL)\n throw new Error('auth_contract_unsupported');\n if (session === undefined) {\n session = s.authSessionId;\n instance = s.storeInstanceId;\n initialRevision = s.revision;\n initialAccess = s.tokenSet?.access_token;\n }\n if (\n s.storeInstanceId !== instance ||\n s.authSessionId !== session ||\n (rejected &&\n (s.authSessionId !== rejected.authSessionId ||\n s.storeInstanceId !== rejected.storeInstanceId))\n )\n throw new Error('superseded');\n if (s.credentialState === 'refresh_dispatched') {\n if (Date.now() >= Date.parse(s.refreshOperation!.deadlineAt!))\n await this.commit(s, {\n credentialState: 'reauth_required',\n tokenSet: null,\n refreshOperation: null,\n reason: 'refresh_outcome_unknown',\n });\n else await pause();\n continue;\n }\n if (s.credentialState === 'refresh_reserved') {\n if (Date.now() >= Date.parse(s.refreshOperation!.startedAt) + 30_000)\n await this.commit(s, {\n credentialState: s.refreshOperation!.returnState,\n refreshOperation: null,\n });\n else await pause();\n continue;\n }\n if (s.credentialState !== 'ready' && !(pending && s.credentialState === 'pending_identity'))\n throw new Error(`credential_unavailable:${s.credentialState}:${s.reason ?? ''}`);\n const live = !!s.tokenSet && Date.parse(s.tokenSet.expires_at) > Date.now();\n if (\n live &&\n (refreshed ||\n (s.revision !== (rejected?.revision ?? initialRevision) &&\n (rejected !== undefined || s.tokenSet!.access_token !== initialAccess)))\n )\n return s;\n if (this.usable(s) && !rejected) return s;\n const metadata = await this.metadata(s, signal);\n abort(signal);\n const operationId = uuid();\n const r = await this.commit(\n s,\n {\n credentialState: 'refresh_reserved',\n refreshOperation: {\n operationId,\n sessionId: s.authSessionId!,\n baseRevision: s.revision,\n phase: 'reserved',\n returnState: s.credentialState,\n startedAt: new Date().toISOString(),\n dispatchedAt: null,\n deadlineAt: null,\n },\n },\n signal,\n );\n if (r.status !== 'committed') continue;\n // The operation owns its lifecycle independently of all callers' waiting signals.\n const owner = this.refresh(r.snapshot, metadata);\n await this.wait(owner, signal);\n refreshed = true;\n rejected = undefined;\n }\n }\n private wait<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return promise;\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener('abort', onAbort);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener('abort', onAbort);\n reject(error);\n },\n );\n if (signal.aborted) onAbort();\n });\n }\n private async refresh(reserved: CredentialSnapshot, metadata: ServerMetadata) {\n const dispatchedAt = Date.now();\n const r = await this.commit(reserved, {\n credentialState: 'refresh_dispatched',\n refreshOperation: {\n ...reserved.refreshOperation!,\n phase: 'dispatched',\n dispatchedAt: new Date(dispatchedAt).toISOString(),\n deadlineAt: new Date(dispatchedAt + 30_000).toISOString(),\n },\n });\n if (r.status !== 'committed') return;\n const s = r.snapshot;\n const ctl = new AbortController();\n const timeout = setTimeout(() => ctl.abort(), 30_000);\n let tokens: TokenSet;\n try {\n const result = await this.wait(\n (async () => {\n const response = await this.protocol.fetch(metadata.token_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: s.tokenSet!.client_id,\n refresh_token: s.tokenSet!.refresh_token,\n }),\n signal: ctl.signal,\n });\n const body = await response.json();\n return { response, body };\n })(),\n ctl.signal,\n );\n if (!result.response.ok) {\n const code = result.body.error;\n let reason: CredentialReason = 'refresh_outcome_unknown';\n let state: CredentialSnapshot['credentialState'] = 'reauth_required';\n if (code === 'invalid_grant') reason = code;\n else if (['invalid_client', 'invalid_scope', 'unsupported_grant_type'].includes(code)) {\n reason = code;\n state = 'configuration_error';\n } else if (\n result.body.rotationOutcome === 'not_committed' &&\n ['temporarily_unavailable', 'server_error'].includes(code)\n ) {\n await this.commit(s, {\n credentialState: s.refreshOperation!.returnState,\n refreshOperation: null,\n });\n throw new Error('refresh_temporarily_unavailable');\n }\n await this.commit(s, {\n credentialState: state,\n tokenSet: null,\n refreshOperation: null,\n reason,\n });\n throw new Error(reason);\n }\n const body = result.body as TokenResponse;\n if (!Number.isFinite(body.expires_in) || body.expires_in <= 0)\n throw new Error('invalid_response');\n tokens = {\n ...s.tokenSet!,\n access_token: body.access_token,\n refresh_token: body.refresh_token!,\n expires_at: new Date(Date.now() + body.expires_in * 1000).toISOString(),\n scope: body.scope ?? s.tokenSet!.scope,\n };\n this.validateTokens(tokens);\n } catch (error) {\n await this.commit(s, {\n credentialState: 'reauth_required',\n tokenSet: null,\n refreshOperation: null,\n reason: 'refresh_outcome_unknown',\n });\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n const started = performance.now(),\n mutationId = uuid();\n for (;;) {\n if (Date.now() >= Date.parse(s.refreshOperation!.deadlineAt!)) {\n await this.commit(s, {\n credentialState: 'reauth_required',\n tokenSet: null,\n refreshOperation: null,\n reason: 'refresh_outcome_unknown',\n });\n void this.revoke(tokens, metadata);\n throw new Error('refresh_outcome_unknown');\n }\n const result = await this.cas(\n s,\n {\n tokenSet: tokens,\n credentialState: s.refreshOperation!.returnState,\n refreshOperation: null,\n },\n mutationId,\n );\n if (result.status === 'committed') {\n await this.notify(result.snapshot);\n return;\n }\n if (result.status === 'superseded') {\n void this.revoke(tokens, metadata);\n return;\n }\n if (performance.now() - started >= 2000) throw new Error('credential_persist_failed');\n await pause();\n }\n }\n private async revoke(tokens: TokenSet, metadata?: ServerMetadata, authority?: CredentialSnapshot): Promise<'confirmed' | 'failed' | 'unsupported'> {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 30_000);\n try {\n const m = metadata ?? await this.wait(authority ? this.metadata(authority, ctl.signal) : this.protocol.metadata(ctl.signal), ctl.signal);\n if (!m.revocation_endpoint) return 'unsupported';\n const response = await this.wait(this.protocol.fetch(m.revocation_endpoint, {\n method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({ token: tokens.refresh_token, token_type_hint: 'refresh_token' }), signal: ctl.signal,\n }), ctl.signal);\n return response.ok ? 'confirmed' : 'failed';\n } catch { return 'failed'; }\n finally { clearTimeout(timer); }\n }\n async logout(\n signal?: AbortSignal,\n expected?: { storeInstanceId: string; authSessionId: string | null },\n ) {\n let s = await this.read(signal);\n if (expected && (s.storeInstanceId !== expected.storeInstanceId || s.authSessionId !== expected.authSessionId)) {\n return {\n logoutOperationId: uuid(), expectedAuthSessionId: expected.authSessionId,\n storeInstanceId: expected.storeInstanceId, revision: s.revision,\n status: 'superseded' as const,\n };\n }\n const session = s.authSessionId,\n instance = s.storeInstanceId,\n started = performance.now(),\n logoutOperationId = uuid();\n const receipt = () => ({\n logoutOperationId,\n expectedAuthSessionId: session,\n storeInstanceId: instance,\n revision: s.revision,\n });\n for (;;) {\n abort(signal);\n if (s.storeInstanceId !== instance || s.authSessionId !== session)\n return { ...receipt(), status: 'superseded' as const };\n if (s.credentialState === 'signed_out' && !s.loginAttempt)\n return { ...receipt(), status: 'already_signed_out' as const };\n const r = await this.cas(\n s,\n {\n credentialState: 'signed_out',\n authSessionId: null,\n principal: null,\n tokenSet: null,\n refreshOperation: null,\n loginAttempt: null,\n lastLoginAttemptId: null,\n verifiedIdentity: null,\n reason: null,\n },\n logoutOperationId,\n signal,\n );\n if (r.status === 'committed') {\n await this.notify(r.snapshot);\n return {\n ...receipt(),\n revision: r.snapshot.revision,\n status: 'committed' as const,\n revocation: s.tokenSet\n ? this.revoke(s.tokenSet, undefined, s)\n : Promise.resolve('unsupported' as const),\n };\n }\n if (performance.now() - started >= 2000) throw new Error('storage_busy');\n await pause();\n s = await this.read(signal);\n }\n }\n}\n","import { CredentialLifecycle, type CredentialStateNotification } from './credentials';\n// client.ts — 端口自 acosmi-sdk-go/client.go (2168 行)\n//\n// 主 Client class (核心: token 管理 / login / chat / SSE / HTTP)。\n// 业务方法 (entitlements / packages / wallet / skills / tools / notifications)\n// 通过 declaration merging 拆到 ./client-mixins/*。\n//\n// 核心红线:\n// - chat 路由用 getAdapterForModel (双格式等地位)\n// - 流式重试 = 双扣 → 流式路径不走 doRequestWithRetry, 仅 doRequest\n// - SafeToRetry POST 默认 false (计费安全)\n// - 401 单次重试, retried 参数防递归\n\nimport { type AnthropicResponse } from '../models/wire-anthropic';\nimport {\n type ChatRequest,\n type ChatResponse,\n type ManagedModel,\n type ModelCapabilities,\n type QuotaSummary,\n type WindowResetSummary,\n type SourcesEvent,\n type StreamEvent,\n type StreamSettlement,\n type ImageGenerationRequest,\n type ImageGenerationResponse,\n type VideoGenerationRequest,\n type VideoTaskResponse,\n type EmbeddingRequest,\n type EmbeddingResponse,\n type RerankRequest,\n type RerankResponse,\n parseSettlement,\n parseSourcesEvent,\n} from '../models/types';\nimport { type ModelCoefficient } from '../billing/types';\nimport { type ServerMetadata, type TokenSet, tokenSetIsExpired } from '../auth/types';\nimport { ModelNotFoundError, isUserAccessTokenRejected, readGatewayErrorContract } from '../shared/errors';\nimport { type APIResponse, apiResponseBusinessError } from '../shared/api-response';\nimport {\n discover,\n discoverWithProfile,\n exchangeCode,\n exchangeCodeWithExpiry,\n refreshToken,\n register,\n revokeToken,\n authorize,\n newTokenSet,\n isSSLError,\n isInvalidGrantError,\n EventComplete,\n EventError,\n ErrDiscovery,\n ErrRegistration,\n ErrSSLProxy,\n ErrTokenExchange,\n type LoginEvent,\n type LoginErrCode,\n type LoginOptions,\n type OAuthMetadataProfile,\n} from '../auth/auth';\nimport {\n type CredentialSnapshot,\n type CredentialRequestOwner,\n type VersionedCredentialStore,\n type TokenStore,\n FileTokenStore,\n InMemoryTokenStore,\n LocalStorageTokenStore,\n} from './store';\nimport { type RetryPolicy, effectivePolicy, computeBackoff } from './retry';\nimport {\n getAdapterForModel,\n ProviderFormat,\n type ProviderAdapter,\n} from '../models/adapters/index';\nimport { extractAnthropicBlockMeta, type BlockMeta } from '../models/stream-meta';\nimport { newOpenAIStreamConverter } from '../models/adapters/openai';\nimport { isSSECommentLine } from '../models/enduser';\nimport {\n classifyTransport,\n iterSSELines,\n maxErrorBodySize,\n modelCacheTTLMs,\n parseHTTPErrorWithHeader,\n parseStreamError,\n readLimited,\n} from './http';\nimport type { MinimalSanitizeConfig } from '../sanitize';\n\n// =============================================================================\n// FilterStatus — V30 二轮审计 D-P1-2: X-Entitlement-Filter-Status 头取值集\n// =============================================================================\n\nexport type FilterStatus =\n | 'ok'\n | 'admin-bypass'\n | 'internal-bypass'\n | 'disabled-by-flag'\n | 'fallback-tkdist-error'\n | 'fallback-tkdist-deployment-skew'\n | 'fallback-no-buckets'\n | 'fallback-missing-userid'\n | '';\n\nexport const FilterStatusOK: FilterStatus = 'ok';\nexport const FilterStatusAdminBypass: FilterStatus = 'admin-bypass';\nexport const FilterStatusInternalBypass: FilterStatus = 'internal-bypass';\nexport const FilterStatusDisabledByFlag: FilterStatus = 'disabled-by-flag';\nexport const FilterStatusFallbackTkdistError: FilterStatus = 'fallback-tkdist-error';\nexport const FilterStatusFallbackTkdistSkew: FilterStatus = 'fallback-tkdist-deployment-skew';\nexport const FilterStatusFallbackNoBuckets: FilterStatus = 'fallback-no-buckets';\nexport const FilterStatusFallbackMissingUser: FilterStatus = 'fallback-missing-userid';\nexport const FilterStatusUnknown: FilterStatus = '';\n\n// =============================================================================\n// Gateway URL 契约 (Phase 0 §2)\n// =============================================================================\n\n/** Acosmi Gateway URL 默认值 — 与历史行为一致。 */\nexport const DEFAULT_GATEWAY_BASE_URL = 'https://acosmi.com';\n\n/**\n * normalizeGatewayBaseURL — Acosmi nexus-v4 API Gateway URL 的归一化与校验。\n *\n * 红线 (Phase 0 契约 §1-§2):\n * 1. 仅允许 `http:` / `https:`;`ws:` / `wss:` 是 CrabCode `--sdk-url`\n * RemoteIO 会话通道,不是 SDK API gateway URL,传入立刻抛错。\n * 2. URL 必须可被 `new URL()` 解析;非法输入立刻抛错。\n * 3. host 必须非空;query/hash 不允许 (gateway URL 不带 query)。\n * 4. pathname 去尾 `/`;末段允许是 `/api/v4` (`apiURL()` 不会重复追加)。\n * 5. 返回值是 `origin + pathname`,不带 query/hash/trailing slash。\n *\n * 该函数是公共 helper:CrabCode AppServer worker、CrabClaw 内部、外部第三方 SDK\n * 都应在写入 Acosmi base 之前调用它一次,避免 ws/wss 误入 SDK API client。\n */\nexport function normalizeGatewayBaseURL(input: unknown): string {\n if (typeof input !== 'string') {\n throw new TypeError(\n 'Acosmi Gateway URL must be a string (see docs/audit/sdk-remote-control-contract-2026-05-27.md §2)',\n );\n }\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new Error('Acosmi Gateway URL is empty');\n }\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new Error(`Acosmi Gateway URL is not a valid URL: ${trimmed}`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(\n `Acosmi Gateway URL only allows http/https, got ${parsed.protocol} (${trimmed}). ` +\n `CrabCode --sdk-url (ws/wss) is the RemoteIO session channel, not a SDK gateway URL ` +\n `— see docs/audit/sdk-remote-control-contract-2026-05-27.md §1.`,\n );\n }\n if (!parsed.host) {\n throw new Error(`Acosmi Gateway URL has empty host: ${trimmed}`);\n }\n if (parsed.search.length > 0 || parsed.hash.length > 0) {\n throw new Error(`Acosmi Gateway URL must not contain query or hash: ${trimmed}`);\n }\n // 去尾 / (空 path => 仅 origin)\n const path = parsed.pathname.replace(/\\/+$/, '');\n return path ? `${parsed.origin}${path}` : parsed.origin;\n}\n\n/**\n * normalizeOverrideBaseURL — 校验并归一化 override base URL (complianceBaseURL / apiBaseURL)。\n *\n * 与 `normalizeGatewayBaseURL` 同级的健壮性校验, 但用于 compliance / 开放 API 的同源直连 base:\n * 1. 必须是 string 且非空。\n * 2. 必须可被 `new URL()` 解析, 且协议为 `http:` / `https:` (ws/wss 不允许)。\n * 3. host 必须非空; 不允许 query / hash (override base 不带 query)。\n * 4. 返回值去尾随 `/` (origin + pathname)。\n *\n * 注意: helper 只校验 base URL 合法性, 不强加路径后缀 — compliance 走 `/admin-api`、\n * apiBaseURL 走 `/api/v4` 都由各自 `complianceURL()` / `apiURL()` 在 base 之上追加,\n * base 本身不含这些子路径。\n *\n * @param raw 原始配置值\n * @param label 出错信息里的字段名 (如 'complianceBaseURL')\n */\nexport function normalizeOverrideBaseURL(raw: string, label: string): string {\n if (typeof raw !== 'string') {\n throw new TypeError(`${label} must be a string`);\n }\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(`${label} is empty`);\n }\n let parsed: URL;\n try {\n parsed = new URL(trimmed);\n } catch {\n throw new Error(`${label} is not a valid URL: ${trimmed}`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`${label} only allows http/https, got ${parsed.protocol} (${trimmed})`);\n }\n if (!parsed.host) {\n throw new Error(`${label} has empty host: ${trimmed}`);\n }\n if (parsed.search.length > 0 || parsed.hash.length > 0) {\n throw new Error(`${label} must not contain query or hash: ${trimmed}`);\n }\n const path = parsed.pathname.replace(/\\/+$/, '');\n return path ? `${parsed.origin}${path}` : parsed.origin;\n}\n\n/**\n * pickAndNormalizeGatewayURL — Config 中三个 alias (serverURL/baseURL/baseUrl)\n * 取唯一规范值。多字段同时传入且 normalize 后不等时抛错。\n * 未传任一字段返回 `null`,由调用方决定是否填默认值。\n */\nfunction pickAndNormalizeGatewayURL(cfg: Config): string | null {\n const inputs: Array<readonly [name: 'serverURL' | 'baseURL' | 'baseUrl', value: string]> = [];\n if (cfg.serverURL !== undefined) inputs.push(['serverURL', cfg.serverURL] as const);\n if (cfg.baseURL !== undefined) inputs.push(['baseURL', cfg.baseURL] as const);\n if (cfg.baseUrl !== undefined) inputs.push(['baseUrl', cfg.baseUrl] as const);\n if (inputs.length === 0) return null;\n const normalized = inputs.map(([n, v]) => [n, normalizeGatewayBaseURL(v)] as const);\n for (let i = 1; i < normalized.length; i++) {\n if (normalized[i][1] !== normalized[0][1]) {\n throw new Error(\n `Acosmi Gateway URL conflict: Config.${normalized[0][0]}=${normalized[0][1]} ` +\n `vs Config.${normalized[i][0]}=${normalized[i][1]} — pass only one field.`,\n );\n }\n }\n return normalized[0][1];\n}\n\n// =============================================================================\n// Config\n// =============================================================================\n\n/** 客户端配置 */\nexport interface Config {\n /**\n * Acosmi nexus-v4 API Gateway 根地址 (默认 https://acosmi.com)。\n *\n * 该 URL 是 `@acosmi/sdk-ts` 调 Acosmi 云端 API 的根 — agent-runs /\n * managed-models / notifications WS / compliance 都从它派生。SDK 内部\n * `apiURL()` 会自动追加 `/api/v4`,调用方无需手动拼。\n *\n * 见 Phase 0 契约 `docs/audit/sdk-remote-control-contract-2026-05-27.md` §1-§2:\n * - 协议: 仅允许 `http:` / `https:`;`ws:` / `wss:` 是 CrabCode `--sdk-url`\n * RemoteIO 会话通道,不是 SDK gateway URL,传入将抛 `Error`。\n * - `serverURL` / `baseURL` / `baseUrl` 三字段同语义,多写时 normalize 后必须相等。\n */\n serverURL?: string;\n\n /**\n * `serverURL` 的标准 alias (推荐拼写)。语义、normalize、校验完全等同 serverURL。\n * 见 Phase 0 契约 §2。同时传入 serverURL/baseURL/baseUrl 时三者 normalize 后必须相等。\n */\n baseURL?: string;\n\n /**\n * `serverURL` 的 camelCase-小写 alias。语义、normalize、校验完全等同 serverURL。\n * 见 Phase 0 契约 §2。\n */\n baseUrl?: string;\n\n /** token 持久化实现, 缺省时按平台选 (Node File / Browser LocalStorage / Memory) */\n store?: TokenStore;\n\n /** Opt-in durable CAS credential lifecycle. Legacy callers omit this field. */\n credentialMode?: 'legacy' | 'versioned' | 'external';\n\n /** Required exactly when credentialMode is versioned. */\n versionedCredentialStore?: VersionedCredentialStore;\n\n /** Optional owner fence for requests issued by this versioned Client. */\n credentialRequestOwner?: CredentialRequestOwner;\n\n /** Supplies a source-owned access token for each request in external mode. */\n accessTokenProvider?: (signal?: AbortSignal) => Promise<string> | string;\n\n /** Runs after a new authorization-code exchange and before durable install. */\n beforeCredentialInstall?: (\n input: { accessToken: string; attemptId: string; serverURL: string; clientId: string },\n signal?: AbortSignal,\n ) => Promise<void> | void;\n\n /** 自定义 fetch 实现 (默认 globalThis.fetch) */\n fetchImpl?: typeof fetch;\n\n /**\n * 重试策略 (L6, v0.15)\n *\n * undefined = 禁用重试 (v0.14.1 行为, 老调用方 0 影响)\n * 非 undefined = 启用 — 默认 SafeToRetry POST=false 兜底, chat/messages POST 仍 0 retry\n * GET 类查询 (skill-store/models/balance) 自动得 2x 稳定性\n *\n * 计费安全: 自定义 SafeToRetry 时, 严禁让 POST chat/messages 通过, 否则双扣\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * Compliance (时间章 / 电子证据 / 合同签署) API 根地址。\n *\n * Java compliance 模块的 controller 注册在 `/compliance/...` 下,部署到\n * `/admin-api/*` 前缀。未配置时默认 `${serverURL}/admin-api`,也可显式覆盖到\n * 独立 ingress(如 `https://compliance.example.com`)。\n *\n * 该地址不被 `/api/v4` 拼接路径复用,compliance 调用走自己的子 client\n * `client.compliance.*`,不与既有模型网关 API 冲突。\n */\n complianceBaseURL?: string;\n\n /**\n * `/api/v4` 网关调用 (managed-model / agent-run / casehall 等) 的 base 覆盖。\n *\n * 未配置时默认 = `serverURL`(既有行为,所有既有消费方不受影响)。\n *\n * 用途:浏览器部署在**非网关同源**域名(如 sign.zhonglvbao.com)时,网关\n * acosmi.com 对带 `Origin` 头的跨域浏览器请求返 403(CORS 收紧)。把本字段设为\n * 同源代理 base(如 `window.location.origin`)、并在该域名 nginx 加\n * `location /api/v4/ { proxy_pass https://acosmi.com/api/v4/; proxy_set_header Origin \"\"; }`\n * 服务端转发,即可让浏览器侧 casehall / 网关调用走同源 → nginx 服务端转发 →\n * 规避跨域 403。仅设在**浏览器端** client;服务端 (Route Handler) client 不设本字段,\n * 直连 `serverURL` 即可(服务端到 acosmi.com 无跨域)。\n *\n * 与 `complianceBaseURL` 同构(compliance 走 `/admin-api`,本字段走 `/api/v4`)。\n * apiURL() 仍按需追加 `/api/v4`,调用方无需手动拼。\n */\n apiBaseURL?: string;\n\n /**\n * OAuth metadata profile — 决定 `ensureToken` 刷新 token 时\n * 发现 metadata 走哪个 well-known 端点。\n *\n * - `'desktop'` (默认): `/.well-known/oauth-authorization-server/desktop`\n * — 桌面 loopback OAuth (`login()`) 流程。\n * - `'web'`: `/.well-known/oauth-authorization-server/web`\n * — 浏览器 Web OAuth (csign 等第一方 Web 应用) 签发的 token,\n * 其 refresh 必须走 Web token 端点。\n *\n * 未设置时默认 `'desktop'`,对既有调用方行为完全无影响。\n * `login()` 桌面 loopback 路径不受此配置影响。\n */\n oauthMetadataProfile?: OAuthMetadataProfile;\n\n /**\n * Browser refresh strategy for Web OAuth tokens.\n *\n * - `'direct'` (default): refresh directly against the OAuth token endpoint.\n * - `'server-proxy'`: POST the current TokenSet to a same-origin refresh proxy,\n * useful when the OAuth issuer intentionally blocks browser CORS.\n * - `'none'`: do not refresh automatically; expired tokens throw `token_expired`.\n */\n browserRefreshMode?: BrowserRefreshMode;\n\n /** Same-origin refresh proxy URL used when `browserRefreshMode='server-proxy'`. */\n refreshProxyURL?: string;\n}\n\nexport type BrowserRefreshMode = 'direct' | 'server-proxy' | 'none';\n\nexport const ErrOAuthCORSBlocked = 'oauth_cors_blocked' as const;\nexport const ErrRefreshProxyFailed = 'refresh_proxy_failed' as const;\nexport const ErrTokenExpired = 'token_expired' as const;\n\n/**\n * v1.6.0: chat / chatMessages / chatStream / chatMessagesStream 的 per-request 超时上限。\n *\n * 上游 (如 DeepSeek) 在开始推理前可能持续保活长达 10 分钟; SDK 必须容纳\n * \"首字节前等待 + 推理 + 流式传输\" 全程, 否则会在等待阶段误超时切断。\n * 单值覆盖, 不区分首字节 vs 总耗时 (AbortController 是总耗时上限)。\n *\n * 2026-08-06 导出: 供回归闸门按**符号**断言, 避免测试抄字面量后与本常量各自漂移\n * (抄件断言恒绿 = 零覆盖)。消费方若要自定义更短预算, 传 signal 即可 —\n * withRequestTimeout 取二者先到者, 无需读本值。\n */\nexport const CHAT_REQUEST_TIMEOUT_MS = 11 * 60 * 1000;\n\n/**\n * 流式链路的\"对端还活着\"回调 (2026-08-06)。\n *\n * **为什么需要它**: 消费方 (如 CrabCode) 自带流空闲看门狗, 判据是\"多久没收到事件\"。\n * 但 SSE 上有两类**有字节、无事件**的情形, 看门狗对它们完全失明:\n * 1. 上游/网关在推理前发的保活注释行 (\": keep-alive\") — 被 isSSECommentLine 吞掉\n * 2. OpenAI 格式下 converter.convert() 对某些 data 行返回零事件\n * 两种情形下连接都健康、字节在流动, 看门狗却会掐流。心跳只有在**抵达做判决的那一层**\n * 时才叫心跳 —— 网关补心跳而 SDK 吞掉, 等于没补。\n *\n * 本回调对**每一条** SSE 行触发一次 (含注释行), 早于任何过滤与解析。语义是\n * \"链路刚刚有动静\", 不是\"来了一个事件\" —— 消费方拿它重置自己的空闲计时器即可。\n * 回调抛错会被吞掉且不中断流 (它是旁路信号, 不该有能力杀死主链路)。\n */\nexport type UpstreamActivityCallback = () => void;\n\n/** 触发活性回调; 消费方回调抛错不得污染流 (见 UpstreamActivityCallback)。 */\nfunction notifyUpstreamActivity(cb: UpstreamActivityCallback | undefined): void {\n if (!cb) return;\n try {\n cb();\n } catch {\n /* 旁路信号: 消费方的错误不传播回流式主链路 */\n }\n}\n\n/**\n * 网关下发消费请求 ID 的响应头名。\n *\n * 值 = cloud-agent 的 `consumeRequestID`, 也就是 `managed_model_usage_logs.request_id`\n * 的值 —— 消费方拿它可以把一次用户可见的失败直接 join 到上游那次网关调用与它产生的\n * 计费行。\n *\n * **不要**与 `X-Request-ID` 混用: 那是网关的传输层追踪 ID, 独立生成、从不写进任何\n * 计费表, 两者永不相等。用错的后果是恒空 join —— 不报错, 只是下次事故照样查不动。\n */\nexport const GATEWAY_REQUEST_ID_HEADER = 'X-Acosmi-Request-Id';\n\n/**\n * 网关消费请求 ID 回调 (2026-09-01)。\n *\n * **为什么需要它**: 消费方 (如 CrabCode) 会在流成功、但流内证据不合格时对用户报失败\n * (2026-08-31 事故形态: 6 次上游搜索全部成功并已计费, 客户端却全部判失败)。这类失败\n * 此前无法关联到上游那一次调用 —— 客户端与网关之间没有任何共同标识符, 定位只能靠\n * 时间戳与模型名人工对齐。\n *\n * 头在**首字节之前**发出, 因此覆盖流中段中断、零事件、HTTP 错误等全部形态; 而流内\n * 事件在「事件根本没来」的场景里恰恰不存在 —— 那正是最需要诊断的那一种。\n *\n * 回调在响应头到达后触发**至多一次**; 网关没下发 (旧版本 / 非托管路径) 时**一次都不\n * 触发** —— 绝不合成占位值。回调抛错会被吞掉且不中断流 (旁路信号不该有能力杀死主链路)。\n */\nexport type GatewayRequestIDCallback = (requestID: string) => void;\n\n/** 从响应头读出消费请求 ID; 缺失 / 空白一律 undefined —— 宁可不给, 不可编造。 */\nfunction readGatewayRequestID(headers: Headers): string | undefined {\n const raw = headers.get(GATEWAY_REQUEST_ID_HEADER);\n if (!raw) return undefined;\n const trimmed = raw.trim();\n return trimmed === '' ? undefined : trimmed;\n}\n\n/** 触发消费请求 ID 回调; 消费方回调抛错不得污染主链路 (与 notifyUpstreamActivity 同构)。 */\nfunction notifyGatewayRequestID(\n cb: GatewayRequestIDCallback | undefined,\n headers: Headers,\n): void {\n if (!cb) return;\n const id = readGatewayRequestID(headers);\n if (id === undefined) return;\n try {\n cb(id);\n } catch {\n /* 旁路信号: 消费方的错误不传播回主链路 */\n }\n}\n\n/**\n * 非流式 JSON API 请求的默认超时 (毫秒)。\n *\n * 子 client (agent-runs / compliance) 的同步 JSON 调用未传 signal 时套用此上限,\n * 避免上游 hang 导致 Promise 永不 settle。流式 (SSE) / 下载等长连接路径**不**套此超时,\n * 以保留长连接语义。与 core doJSONFullInternal 的 30s 量级一致。\n */\nexport const DEFAULT_API_TIMEOUT_MS = 60_000;\n\n// =============================================================================\n// 内部 Deferred / WS state\n// =============================================================================\n\ninterface Deferred<T> {\n promise: Promise<T>;\n resolve: (v: T) => void;\n reject: (e: unknown) => void;\n}\n\nfunction newDeferred<T>(): Deferred<T> {\n let resolve!: (v: T) => void;\n let reject!: (e: unknown) => void;\n const promise = new Promise<T>((r, j) => {\n resolve = r;\n reject = j;\n });\n return { promise, resolve, reject };\n}\n\n/**\n * WebSocket 状态 — 内部使用, 实际方法由 ws.ts mixin 提供\n * 留作 forward declaration, 避免循环依赖\n */\nexport interface WSState {\n connected: boolean;\n // 实现细节由 ws.ts 内部维护 — Client 主体只持有引用以便 logout/disconnect 联动\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\n// =============================================================================\n// Client class\n// =============================================================================\n\n/**\n * Acosmi nexus-v4 统一 API 客户端\n *\n * 覆盖全域 API: 模型/权益/商城/钱包/技能/工具/WebSocket\n * 自动处理 token 刷新, 所有 API 调用线程安全 (基于 Promise chain)\n */\nexport class Client {\n /** SDK 内部使用 — 业务方法 (mixin) 通过 this.* 访问以下字段 */\n\n /** 服务器根地址 (已 trim 尾随 /) */\n serverURL: string;\n /** Compliance API 根地址 (已 trim 尾随 /); null = 走默认 ${serverURL}/admin-api */\n complianceBaseURL: string | null;\n /** `/api/v4` 网关调用 base 覆盖 (已 trim 尾随 /); null = 走默认 serverURL */\n apiBaseURL: string | null;\n /** OAuth metadata profile — 刷新 token 时发现 metadata 用 (默认 'desktop') */\n oauthMetadataProfile: OAuthMetadataProfile;\n /** Browser Web OAuth refresh strategy (default 'direct') */\n browserRefreshMode: BrowserRefreshMode;\n /** Same-origin refresh proxy URL for browserRefreshMode='server-proxy' */\n refreshProxyURL: string | null;\n /** OAuth metadata (lazy loaded) */\n meta: ServerMetadata | null = null;\n /** 当前 token (内存) */\n tokens: TokenSet | null = null;\n /** token 持久化 */\n store: TokenStore;\n readonly credentialMode: 'legacy' | 'versioned' | 'external';\n private readonly versionedCredentialStore: VersionedCredentialStore | null;\n private readonly accessTokenProvider: Config['accessTokenProvider'];\n private readonly beforeCredentialInstall: Config['beforeCredentialInstall'];\n private readonly credentialAuthority: string;\n private readonly credentialRequestOwner: CredentialRequestOwner | null;\n private lifecycle: CredentialLifecycle | null = null;\n\n /** fetch 实现 (默认 globalThis.fetch) */\n fetchImpl: typeof fetch;\n\n /** 互斥锁 (TS 用 Promise chain 替代 sync.Mutex) */\n private mu: Promise<void> = Promise.resolve();\n\n /**\n * WebSocket 状态 (实际方法由 ws.ts mixin 维护)。\n * @internal — 实现细节: 跨模块 (ws.ts mixin) 需可见故为 public, 但非消费者 API,\n * 消费者用 connect/subscribe 等高层方法; 引用的 WSState 不进公开文档。\n */\n ws: WSState | null = null;\n\n /**\n * v0.15.1: token 就绪等待机制 — login 成功后 resolve, 等待方解除阻塞。\n * @internal — 内部同步原语 (Deferred), 非消费者 API。\n */\n tokenReady: Deferred<void> = newDeferred<void>();\n /** Login 进行中 — 等待方需等而非 fail-fast */\n loginInFlight = false;\n /** 防止 tokenReady 被多次 resolve (替代 Go sync.Once) */\n private tokenReadyResolved = false;\n\n /** 模型能力缓存 (CrabCode 扩展) */\n modelCache: ManagedModel[] = [];\n modelCacheTimeMs = 0;\n\n /** sanitize-bridge 配置 (默认禁用) */\n defensiveCfg: MinimalSanitizeConfig | null = null;\n autoStripEphemeral = false;\n\n /** L6 (v0.15): 重试策略. null = 禁用 (v0.14.1 行为) */\n retryPolicy: Required<RetryPolicy> | null;\n\n /** V29 系数缓存 (TTL 8s, listCoefficients 内部用) */\n coefCacheData: ModelCoefficient[] | null = null;\n coefCacheTimeMs = 0;\n private credentialOwnerKey: string | null = null;\n /** 串行化锁 (替代 Go sync.Mutex) */\n private coefMu: Promise<void> = Promise.resolve();\n\n constructor(cfg: Config = {}) {\n // Phase 0 §2: serverURL/baseURL/baseUrl 三字段同语义, 多写时 normalize 后必须相等;\n // 任一字段都会经 normalizeGatewayBaseURL 校验 (拒 ws/wss/拒空/拒 query/hash).\n const picked = pickAndNormalizeGatewayURL(cfg);\n this.serverURL = picked ?? DEFAULT_GATEWAY_BASE_URL;\n this.complianceBaseURL = cfg.complianceBaseURL\n ? normalizeOverrideBaseURL(cfg.complianceBaseURL, 'complianceBaseURL')\n : null;\n this.apiBaseURL = cfg.apiBaseURL\n ? normalizeOverrideBaseURL(cfg.apiBaseURL, 'apiBaseURL')\n : null;\n this.oauthMetadataProfile = cfg.oauthMetadataProfile ?? 'desktop';\n this.browserRefreshMode = cfg.browserRefreshMode ?? 'direct';\n this.refreshProxyURL = cfg.refreshProxyURL ?? null;\n this.credentialMode = cfg.credentialMode ?? 'legacy';\n this.credentialAuthority = new URL(this.serverURL).origin;\n if (this.credentialMode === 'versioned' && !cfg.versionedCredentialStore) {\n throw new Error('versionedCredentialStore is required for credentialMode=versioned');\n }\n if (cfg.credentialRequestOwner && this.credentialMode !== 'versioned') {\n throw new Error('credentialRequestOwner requires credentialMode=versioned');\n }\n if (this.credentialMode === 'legacy' && cfg.versionedCredentialStore) {\n throw new Error('credentialMode=versioned is required when versionedCredentialStore is provided');\n }\n if (this.credentialMode === 'external' && cfg.versionedCredentialStore) {\n throw new Error('versionedCredentialStore is incompatible with credentialMode=external');\n }\n if (this.credentialMode !== 'external' && cfg.accessTokenProvider) {\n throw new Error('accessTokenProvider requires credentialMode=external');\n }\n if (this.credentialMode === 'external' && !cfg.accessTokenProvider) {\n throw new Error('accessTokenProvider is required for credentialMode=external');\n }\n if (this.credentialMode !== 'versioned' && cfg.beforeCredentialInstall) {\n throw new Error('beforeCredentialInstall requires credentialMode=versioned');\n }\n if (this.credentialMode !== 'legacy') {\n const authority = new URL(this.serverURL).origin;\n for (const [name, override] of [['apiBaseURL', this.apiBaseURL], ['complianceBaseURL', this.complianceBaseURL]] as const) {\n if (override && new URL(override).origin !== authority) {\n throw new Error(`${name} must use the credential authority ${authority}`);\n }\n }\n }\n this.accessTokenProvider = cfg.accessTokenProvider;\n this.beforeCredentialInstall = cfg.beforeCredentialInstall;\n this.credentialRequestOwner = cfg.credentialRequestOwner\n ? {\n storeInstanceId: cfg.credentialRequestOwner.storeInstanceId,\n authSessionId: cfg.credentialRequestOwner.authSessionId,\n principal: cfg.credentialRequestOwner.principal\n ? {\n issuer: cfg.credentialRequestOwner.principal.issuer,\n subject: cfg.credentialRequestOwner.principal.subject,\n organizationId: cfg.credentialRequestOwner.principal.organizationId,\n }\n : null,\n }\n : null;\n this.fetchImpl = cfg.fetchImpl ?? globalThis.fetch.bind(globalThis);\n this.versionedCredentialStore = cfg.versionedCredentialStore ?? null;\n if (this.versionedCredentialStore) this.lifecycle = new CredentialLifecycle(this.versionedCredentialStore, {\n serverURL: this.serverURL, fetch: this.fetchImpl,\n metadata: signal => discoverWithProfile(this.serverURL, 'desktop', signal, this.fetchImpl),\n profile: async (tokens, signal) => {\n const gatewayRoot = this.serverURL.replace(/\\/api\\/v4$/, '');\n const profileURL = `${gatewayRoot}/api/oauth/profile`;\n this.assertCredentialURL(profileURL);\n const response = await this.fetchImpl(profileURL, { headers: { Authorization: `Bearer ${tokens.access_token}` }, signal });\n if (!response.ok) {\n const bodyBytes = response.body ? await readLimited(response.body, maxErrorBodySize) : new Uint8Array();\n const failure = parseHTTPErrorWithHeader(response.status, bodyBytes, response.headers);\n const contract = readGatewayErrorContract(failure);\n const code = contract?.errorCode ?? null;\n if (code === 'INVALID_SCOPE') throw new Error('invalid_scope');\n if (code === 'AUTH_CONTRACT_UNSUPPORTED') throw new Error('auth_contract_unsupported');\n if (code === 'ACCOUNT_NOT_FOUND') throw new Error('account_permission');\n throw new Error('identity_unavailable');\n }\n const body = await response.json() as {\n account?: {\n uuid?: string; display_name?: string; avatar_url?: string; image_url?: string;\n email?: string; created_at?: string; requires_phone_binding?: boolean;\n picture?: string; image?: string;\n };\n organization?: { uuid?: string; rate_limit_tier?: string; name?: string;\n has_extra_usage_enabled?: boolean; billing_type?: string; subscription_created_at?: string };\n avatar_url?: string; picture?: string; image?: string;\n code?: string;\n };\n const subject = body.account?.uuid;\n if (typeof subject !== 'string' || !subject) throw new Error('invalid_response');\n const account = body.account!;\n const organization = body.organization;\n return {\n subject,\n organizationId: organization?.uuid || null,\n ...(typeof account.display_name === 'string' ? { displayName: account.display_name } : {}),\n ...([account.avatar_url, account.picture, account.image, body.avatar_url, body.picture, body.image]\n .find((value): value is string => typeof value === 'string') !== undefined\n ? { avatarUrl: [account.avatar_url, account.picture, account.image, body.avatar_url, body.picture, body.image]\n .find((value): value is string => typeof value === 'string')! } : {}),\n ...(typeof account.email === 'string' ? { email: account.email } : {}),\n ...(typeof account.image_url === 'string' ? { imageUrl: account.image_url } : {}),\n ...(typeof account.created_at === 'string' ? { accountCreatedAt: account.created_at } : {}),\n ...(typeof account.requires_phone_binding === 'boolean' ? { requiresPhoneBinding: account.requires_phone_binding } : {}),\n ...(typeof organization?.has_extra_usage_enabled === 'boolean' ? { hasExtraUsageEnabled: organization.has_extra_usage_enabled } : {}),\n ...(typeof organization?.billing_type === 'string' ? { billingType: organization.billing_type } : {}),\n ...(typeof organization?.subscription_created_at === 'string' ? { subscriptionCreatedAt: organization.subscription_created_at } : {}),\n ...(typeof organization?.rate_limit_tier === 'string' ? { rateLimitTier: organization.rate_limit_tier } : {}),\n ...(typeof organization?.name === 'string' ? { organizationName: organization.name } : {}),\n };\n },\n });\n this.store = cfg.store ?? defaultTokenStore();\n this.retryPolicy = effectivePolicy(cfg.retryPolicy ?? null);\n }\n\n /**\n * 异步初始化 (从 store 加载已有 token)\n * 替代 Go NewClient (Go 同步 IO, TS 必须 async)\n */\n static async create(cfg: Config = {}): Promise<Client> {\n const c = new Client(cfg);\n if (c.credentialMode === 'external') return c;\n if (c.credentialMode === 'versioned') {\n await c.reconcileCredentials();\n return c;\n }\n try {\n const tokens = await c.store.load();\n if (tokens) {\n c.tokens = tokens;\n if (!c.tokenReadyResolved) {\n c.tokenReadyResolved = true;\n c.tokenReady.resolve();\n }\n }\n } catch {\n // store 损坏 — 静默忽略, 让 caller Login 重建\n }\n return c;\n }\n\n /** Read the durable authority. Available only in explicit versioned mode. */\n async getCredentialSnapshot(signal?: AbortSignal): Promise<CredentialSnapshot> {\n if (!this.versionedCredentialStore) {\n throw new Error('getCredentialSnapshot requires credentialMode=versioned');\n }\n return this.versionedCredentialStore.readSnapshot(signal);\n }\n\n /** Reconcile memory from durable state; storage errors never clear confirmed memory. */\n async reconcileCredentials(signal?: AbortSignal): Promise<CredentialSnapshot> {\n const snapshot = await this.lifecycle!.reconcile(signal);\n this.adoptCredentialOwner(snapshot);\n this.tokens = snapshot.credentialState === 'ready' ? snapshot.tokenSet : null;\n return snapshot;\n }\n\n private ownerKey(snapshot: CredentialSnapshot): string {\n return `${snapshot.storeInstanceId}\\u0000${snapshot.authSessionId ?? ''}\\u0000${snapshot.principal?.issuer ?? ''}\\u0000${snapshot.principal?.subject ?? ''}\\u0000${snapshot.principal?.organizationId ?? ''}`;\n }\n\n private adoptCredentialOwner(snapshot: CredentialSnapshot): void {\n const next = this.ownerKey(snapshot);\n if (this.credentialOwnerKey !== null && this.credentialOwnerKey !== next) {\n this.modelCache = [];\n this.modelCacheTimeMs = 0;\n this.coefCacheData = null;\n this.coefCacheTimeMs = 0;\n }\n this.credentialOwnerKey = next;\n }\n\n async ensureCredential(signal?: AbortSignal): Promise<string> {\n if (!this.lifecycle) return this.ensureToken(signal);\n const token = await this.lifecycle.ensure(signal, undefined, this.credentialRequestOwner ?? undefined);\n const snapshot = await this.lifecycle.read(signal);\n this.adoptCredentialOwner(snapshot);\n this.tokens = snapshot.credentialState === 'ready' ? snapshot.tokenSet : null;\n return token;\n }\n\n subscribeCredentialState(listener: (snapshot: CredentialStateNotification) => void): () => void {\n if (!this.lifecycle) throw new Error('subscribeCredentialState requires credentialMode=versioned');\n return this.lifecycle.subscribe(listener);\n }\n\n async retryCredentialIdentity(signal?: AbortSignal): Promise<CredentialSnapshot> {\n const snapshot = await this.getCredentialSnapshot(signal);\n if (!snapshot.authSessionId) throw new Error('not authorized');\n const ready = await this.lifecycle!.bindIdentity(snapshot.authSessionId, signal);\n this.adoptCredentialOwner(ready);\n this.tokens = ready.credentialState === 'ready' ? ready.tokenSet : null;\n return ready;\n }\n\n async logoutCredential(\n signal?: AbortSignal,\n expected?: { storeInstanceId: string; authSessionId: string | null },\n ) {\n if (!this.lifecycle) throw new Error('logoutCredential requires credentialMode=versioned');\n const result = await this.lifecycle.logout(signal, expected);\n if (result.status === 'committed' || result.status === 'already_signed_out') {\n const current = await this.lifecycle.read(signal);\n this.adoptCredentialOwner(current);\n this.tokens = null;\n }\n return result;\n }\n\n // ===========================================================================\n // 授权生命周期\n // ===========================================================================\n\n /** 是否已授权 (有可用 token) */\n isAuthorized(): boolean {\n return this.tokens != null;\n }\n\n /**\n * 返回归一化后的 Acosmi Gateway URL (= `serverURL` 字段). readonly helper.\n *\n * Phase 0 §2 红线:\n * - 不要 mutate `client.serverURL` 字段实现 base 切换; 用 per-base Client 实例.\n * - 该值仅供日志/排查/上层缓存键使用, 不重新 normalize 它 (构造期已 normalize).\n */\n getServerURL(): string {\n return this.serverURL;\n }\n\n /** `getServerURL()` 的 alias — Phase 0 §2 baseURL 与 serverURL 同义. */\n getBaseURL(): string {\n return this.serverURL;\n }\n\n /** 当前 token 信息 (用于 CLI whoami 显示) */\n getTokenSet(): TokenSet | null {\n return this.tokens;\n }\n\n private getCachedClientID(): string {\n return this.tokens?.client_id ?? '';\n }\n\n /**\n * 完整授权流程: 发现 → 注册 → 授权 → 换 token → 持久化\n * @param appName 桌面智能体名称 (如 \"CrabClaw Desktop\")\n * @param scopes 请求的权限范围 (参考 allScopes / modelScopes / commerceScopes 等预设)\n */\n async login(appName: string, scopes: string[], signal?: AbortSignal): Promise<void> {\n return this.loginInternal(appName, scopes, undefined, signal);\n }\n\n /**\n * 带事件回调的登录流程 — CrabCode 使用\n *\n * handler 在以下时刻被调用:\n * - EventAuthURL: 授权 URL 已就绪, 调用方可展示/打开浏览器\n * - EventComplete: 登录成功, tokens 已持久化\n * - EventError: 某步骤失败, 附 ErrCode 分类码\n *\n * 当 handler 为 null 时, 行为与 login() 完全一致。\n */\n async loginWithHandler(\n appName: string,\n scopes: string[],\n handler: ((e: LoginEvent) => void) | null,\n opts: LoginOptions = {},\n signal?: AbortSignal,\n ): Promise<void> {\n return this.loginInternal(appName, scopes, { handler, ...opts }, signal);\n }\n\n private async loginInternal(\n appName: string,\n scopes: string[],\n opts: (LoginOptions & { handler?: ((e: LoginEvent) => void) | null }) | undefined,\n signal?: AbortSignal,\n ): Promise<void> {\n if (this.lifecycle) {\n const attempt = await this.lifecycle.reserveLogin(signal);\n let installHookRejected = false;\n try {\n const registration = await register(attempt.metadata, appName, signal, this.fetchImpl);\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n const authorization = await authorize(attempt.metadata, registration.client_id, scopes, { ...opts, handler: opts?.handler ?? undefined, signal });\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n const response = await exchangeCode(attempt.metadata, registration.client_id, authorization.result.code, authorization.result.redirectURI, authorization.verifier, signal, this.fetchImpl);\n if (!Number.isFinite(response.expires_in) || response.expires_in <= 0) throw new Error('invalid_response');\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n try {\n await this.beforeCredentialInstall?.({\n accessToken: response.access_token,\n attemptId: attempt.attemptId,\n serverURL: this.serverURL,\n clientId: registration.client_id,\n }, signal);\n } catch (error) {\n installHookRejected = true;\n throw error;\n }\n await this.lifecycle.assertLogin(attempt.attemptId, signal);\n const ready = await this.lifecycle.installLogin(attempt.attemptId, newTokenSet(response, registration.client_id, this.serverURL), signal);\n const current = await this.getCredentialSnapshot(signal);\n if (current.revision !== ready.revision || current.authSessionId !== ready.authSessionId) throw new Error('superseded');\n this.tokens = ready.tokenSet;\n opts?.handler?.({ type: EventComplete, attemptId: attempt.attemptId });\n } catch (error) {\n const current = await this.getCredentialSnapshot();\n if (current.loginAttempt?.attemptId === attempt.attemptId || current.lastLoginAttemptId === attempt.attemptId) {\n opts?.handler?.(installHookRejected\n ? { type: EventError, attemptId: attempt.attemptId, err_code: 'credential_install_rejected', error: 'credential_install_rejected' }\n : { type: EventError, attemptId: attempt.attemptId, error: 'credential_login_failed' });\n }\n await this.lifecycle.cancelLogin(attempt.attemptId); throw error;\n }\n return;\n }\n const handler = opts?.handler ?? undefined;\n const emit = (e: LoginEvent) => {\n if (handler) handler(e);\n };\n const emitError = (code: LoginErrCode, err: unknown) => {\n emit({\n type: EventError,\n err_code: code,\n error: err instanceof Error ? err.message : String(err),\n });\n };\n\n this.loginInFlight = true;\n try {\n // 1. 发现\n let meta: ServerMetadata;\n try {\n meta = await discover(this.serverURL, signal, this.fetchImpl);\n } catch (err) {\n emitError(ErrDiscovery, err);\n throw new Error(`discovery failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n this.meta = meta;\n\n // 2. 检查是否已有 client_id; 无则注册\n let clientID = this.getCachedClientID();\n if (clientID === '') {\n try {\n const reg = await register(meta, appName, signal, this.fetchImpl);\n clientID = reg.client_id;\n } catch (err) {\n emitError(ErrRegistration, err);\n throw new Error(\n `registration failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // 3. 授权 (PKCE + browser + callback)\n let result: { code: string; redirectURI: string };\n let verifier: string;\n try {\n const r = await authorize(meta, clientID, scopes, { ...opts, handler, signal });\n result = r.result;\n verifier = r.verifier;\n } catch (err) {\n // 授权失败 (可能是服务器重启后 client_id 失效):\n // 清除缓存的 client_id, 重新注册, 再试一次\n try {\n const reg = await register(meta, appName, signal, this.fetchImpl);\n clientID = reg.client_id;\n } catch (regErr) {\n emitError(ErrRegistration, regErr);\n throw new Error(\n `authorization failed (retry registration also failed): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n try {\n const r = await authorize(meta, clientID, scopes, { ...opts, handler, signal });\n result = r.result;\n verifier = r.verifier;\n } catch (err2) {\n throw new Error(\n `authorization failed: ${err2 instanceof Error ? err2.message : String(err2)}`,\n );\n }\n }\n\n // 4. 换 token (审计 A-2: 支持自定义 expiresIn)\n let tokenResp;\n try {\n if (opts?.expiresIn && opts.expiresIn > 0) {\n tokenResp = await exchangeCodeWithExpiry(\n meta,\n clientID,\n result.code,\n result.redirectURI,\n verifier,\n opts.expiresIn,\n signal,\n this.fetchImpl,\n );\n } else {\n tokenResp = await exchangeCode(\n meta,\n clientID,\n result.code,\n result.redirectURI,\n verifier,\n signal,\n this.fetchImpl,\n );\n }\n } catch (err) {\n const code = isSSLError(err) ? ErrSSLProxy : ErrTokenExchange;\n emitError(code, err);\n throw new Error(\n `token exchange failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // 5. 持久化 + 通知等待方\n const tokens = newTokenSet(tokenResp, clientID, this.serverURL);\n this.tokens = tokens;\n if (!this.tokenReadyResolved) {\n this.tokenReadyResolved = true;\n this.tokenReady.resolve();\n }\n try {\n await this.store.save(tokens);\n } catch (err) {\n throw new Error(`save tokens: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // 6. 完成\n emit({ type: EventComplete });\n } finally {\n this.loginInFlight = false;\n }\n }\n\n /** 吊销 token 并清除本地存储 */\n async logout(signal?: AbortSignal): Promise<void> {\n if (this.lifecycle) { await this.logoutCredential(signal); await this.reconcileCredentials(signal); return; }\n const tokens = this.tokens;\n let meta = this.meta;\n this.tokens = null;\n this.meta = null;\n // v0.15.1: 重置等待信号 — 下次 login 重新触发等待→唤醒流程\n this.tokenReady = newDeferred<void>();\n this.tokenReadyResolved = false;\n\n if (tokens) {\n if (!meta) {\n try {\n // token-lifecycle discovery: revoke 必须打与签发 token 同 profile 的端点\n meta = await discoverWithProfile(this.serverURL, this.oauthMetadataProfile, signal, this.fetchImpl);\n } catch (e) {\n console.warn(`[acosmi-sdk] warning: discover for revocation failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n if (meta) {\n try {\n await revokeToken(meta, tokens.access_token, signal, this.fetchImpl);\n } catch {\n // ignore\n }\n try {\n await revokeToken(meta, tokens.refresh_token, signal, this.fetchImpl);\n } catch {\n // ignore\n }\n }\n }\n\n await this.store.clear();\n }\n\n // ===========================================================================\n // Token 管理\n // ===========================================================================\n\n /**\n * 确保有有效的 access_token, 过期则自动刷新\n *\n * v0.15.1: 当 tokens==null 且 login 正在并发进行中时, 阻塞等待 token 就绪,\n * 避免应用启动期 \"login + 多个 API 调用\" 并发场景下 4+ 条 \"not authorized\" 误报.\n */\n async ensureToken(signal?: AbortSignal): Promise<string> {\n if (this.credentialMode === 'external') {\n if (signal?.aborted) throw new DOMException('Aborted', 'AbortError');\n const token = await this.accessTokenProvider!(signal);\n if (typeof token !== 'string' || token.length === 0) throw new Error('external access token unavailable');\n return token;\n }\n if (this.lifecycle) return this.lifecycle.ensure(signal, undefined, this.credentialRequestOwner ?? undefined);\n let tokens = this.tokens;\n const ready = this.tokenReady.promise;\n const inFlight = this.loginInFlight;\n\n if (tokens == null) {\n if (!inFlight) {\n throw new Error('not authorized, call login() first');\n }\n // login 进行中, 等待就绪或 abort\n let abortHandler: (() => void) | undefined;\n try {\n await Promise.race([\n ready,\n new Promise<never>((_, reject) => {\n if (signal) {\n if (signal.aborted) reject(new Error(`waiting for token: aborted`));\n else {\n abortHandler = () => reject(new Error(`waiting for token: aborted`));\n signal.addEventListener('abort', abortHandler);\n }\n }\n }),\n ]);\n } finally {\n if (abortHandler && signal) signal.removeEventListener('abort', abortHandler);\n }\n tokens = this.tokens;\n if (tokens == null) {\n // 边界: 等待期间被 logout 重置, 当作未授权\n throw new Error('not authorized, call login() first');\n }\n }\n\n if (!tokenSetIsExpired(tokens)) {\n return tokens.access_token;\n }\n\n // 需要刷新 — 双层串行: withMu 进程内 + storeWithLock 跨进程 (FileTokenStore 实现 sidecar\n // .lock 文件; LocalStorage / InMemory 单进程语义无需此层, 自动 no-op).\n //\n // v1.0.2 修复多进程共享 ~/.acosmi/tokens.json 时撞 \"HTTP 400: refresh token not found\":\n // 1) 进入跨进程临界区后, store.load() 重读磁盘 — 别的进程可能已完成 rotation\n // 2) 若磁盘 refresh_token ≠ 内存 → 采纳磁盘新版 → 重判过期 → 未过期则直接返回\n // (跳过本进程的多余 refresh, 同时避免拿已 invalidated 的 R0 撞网关)\n return this.withMu(() =>\n this.storeWithLock(async () => {\n await this.syncFromDisk();\n // 双检 — 同 v1.0.1 逻辑\n if (this.tokens == null) {\n throw new Error('not authorized, call login() first');\n }\n if (!tokenSetIsExpired(this.tokens)) {\n return this.tokens.access_token;\n }\n\n await this.refreshCurrentToken(signal);\n\n return this.tokens.access_token;\n }),\n );\n }\n\n /** 强制刷新 token (用于 401 重试) */\n async forceRefresh(signal?: AbortSignal, rejectedToken?: string): Promise<void> {\n if (this.credentialMode === 'external') throw new Error('external credentials cannot be refreshed by the SDK');\n if (this.lifecycle) {\n await this.lifecycle.forceRefresh(signal, rejectedToken, this.credentialRequestOwner ?? undefined);\n const snapshot = await this.lifecycle.read(signal);\n this.tokens = snapshot.credentialState === 'ready' ? snapshot.tokenSet : null;\n return;\n }\n return this.withMu(() =>\n this.storeWithLock(async () => {\n // v1.0.2: 同 ensureToken — 进入跨进程临界区后先同步磁盘. 别的进程刚 rotation\n // 过的话, 磁盘上是新 RT, 网关返回 401 触发本进程 forceRefresh 用磁盘新 RT 即可成功;\n // 否则用旧 RT 必撞 \"refresh token not found\" 400.\n await this.syncFromDisk();\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n await this.refreshCurrentToken(signal);\n }),\n );\n }\n\n private async refreshCurrentToken(signal?: AbortSignal): Promise<void> {\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n if (this.browserRefreshMode === 'none') {\n throw new Error(`${ErrTokenExpired}: token refresh disabled`);\n }\n if (this.browserRefreshMode === 'server-proxy') {\n await this.refreshCurrentTokenViaProxy(signal);\n return;\n }\n await this.refreshCurrentTokenDirect(signal);\n }\n\n private async refreshCurrentTokenDirect(signal?: AbortSignal): Promise<void> {\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n if (this.meta == null) {\n try {\n // token-lifecycle discovery: refresh 必须打与签发 token 同 profile 的端点\n this.meta = await discoverWithProfile(this.serverURL, this.oauthMetadataProfile, signal, this.fetchImpl);\n } catch (e) {\n throw new Error(\n `discover for refresh: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n let tokenResp;\n try {\n tokenResp = await refreshToken(\n this.meta,\n this.tokens.client_id,\n this.tokens.refresh_token,\n signal,\n this.fetchImpl,\n );\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n if (isInvalidGrantError(e)) {\n await this.clearInvalidRefreshToken();\n throw new Error(`refresh token invalid; local tokens cleared: ${message}`);\n }\n if (isLikelyBrowserOAuthCORSError(message)) {\n throw new Error(`${ErrOAuthCORSBlocked}: refresh token: ${message}`);\n }\n throw new Error(`refresh token: ${message}`);\n }\n\n this.tokens = newTokenSet(tokenResp, this.tokens.client_id, this.serverURL);\n await this.saveRefreshedToken();\n }\n\n private async refreshCurrentTokenViaProxy(signal?: AbortSignal): Promise<void> {\n if (this.tokens == null) {\n throw new Error('no tokens to refresh');\n }\n if (!this.refreshProxyURL) {\n throw new Error(`${ErrRefreshProxyFailed}: refreshProxyURL is required`);\n }\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(this.refreshProxyURL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: this.tokens.client_id,\n refresh_token: this.tokens.refresh_token,\n server_url: this.tokens.server_url || this.serverURL,\n }),\n signal,\n });\n } catch (e) {\n throw new Error(\n `${ErrRefreshProxyFailed}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n\n if (!resp.ok) {\n let message = '';\n let oauthError = '';\n try {\n const body = (await resp.json()) as { error?: unknown; error_description?: unknown };\n if (typeof body.error === 'string') message = body.error;\n if (typeof body.error === 'string') oauthError = body.error;\n if (typeof body.error_description === 'string') message = body.error_description;\n } catch {\n // ignore non-JSON proxy errors\n }\n if (oauthError === 'invalid_grant') {\n await this.clearInvalidRefreshToken();\n throw new Error(`${ErrRefreshProxyFailed}: refresh token invalid; local tokens cleared`);\n }\n throw new Error(`${ErrRefreshProxyFailed}: HTTP ${resp.status}: ${message}`);\n }\n\n let body: { tokenSet?: TokenSet };\n try {\n body = (await resp.json()) as { tokenSet?: TokenSet };\n } catch (e) {\n throw new Error(\n `${ErrRefreshProxyFailed}: decode: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n if (!isTokenSetLike(body.tokenSet)) {\n throw new Error(`${ErrRefreshProxyFailed}: response missing tokenSet`);\n }\n\n this.tokens = body.tokenSet;\n await this.saveRefreshedToken();\n }\n\n private async saveRefreshedToken(): Promise<void> {\n if (this.tokens == null) return;\n try {\n await this.store.save(this.tokens);\n } catch (e) {\n console.warn(\n `[acosmi-sdk] warning: save refreshed token failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n private async clearInvalidRefreshToken(): Promise<void> {\n this.tokens = null;\n this.meta = null;\n this.loginInFlight = false;\n this.tokenReady = newDeferred<void>();\n this.tokenReadyResolved = false;\n try {\n await this.store.clear();\n } catch (e) {\n console.warn(\n `[acosmi-sdk] warning: clear invalid token failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n\n /** 互斥锁 helper (替代 Go sync.Mutex) */\n private withMu<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.mu.then(fn, fn);\n this.mu = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n /** v1.0.2: 跨进程临界区 helper. store.withLock 可选, 缺省则直接调用 fn (LocalStorage /\n * InMemory 单进程无需). */\n private async storeWithLock<T>(fn: () => Promise<T>): Promise<T> {\n const lock = this.store.withLock;\n if (typeof lock === 'function') {\n return lock.call(this.store, fn) as Promise<T>;\n }\n return fn();\n }\n\n /** v1.0.2: 从磁盘同步 token (refresh 前). 别的进程 rotation 后磁盘 refresh_token 已变,\n * 本进程内存仍是旧 R0; 不同步直接 refresh 必撞网关 400. load 失败保留内存继续 (容错). */\n private async syncFromDisk(): Promise<void> {\n let onDisk: TokenSet | null = null;\n try {\n onDisk = await this.store.load();\n } catch {\n // 磁盘读失败 (文件损坏 / 权限) — 不阻塞 refresh, 让后续 refreshToken 暴露真实错误\n return;\n }\n if (!onDisk) return;\n // 磁盘有 token 且 RT 与内存不一致 — 采纳磁盘新版 (典型: 别的进程已 rotation)\n if (this.tokens == null || onDisk.refresh_token !== this.tokens.refresh_token) {\n this.tokens = onDisk;\n }\n }\n\n // ===========================================================================\n // Managed Models\n // ===========================================================================\n\n /**\n * 获取可用的托管模型列表.\n *\n * V30 二轮审计 D-P1-2: 此方法不返回 entitlement-filter-status header.\n * UI 想根据 fallback 状态显示降级提示, 请改调 listModelsWithStatus.\n */\n async listModels(\n signal?: AbortSignal,\n opts?: { includeLocked?: boolean },\n ): Promise<ManagedModel[]> {\n const r = await this.listModelsWithStatus(signal, opts);\n return r.models;\n }\n\n /**\n * 获取可用模型列表, 同时返回 X-Entitlement-Filter-Status header.\n *\n * V30 二轮审计 D-P1-2: 老 listModels 丢弃 header 让 SDK 用户无法识别 fail-OPEN 降级状态,\n * 此方法暴露 status 让 UI 可:\n * - status === 'ok' → 正常显示 BucketInfo 余量\n * - status === 'fallback-tkdist-error' → 灰显余量 + toast \"tk-dist 离线, 模型列表降级\"\n * - status === 'disabled-by-flag' → 不显示余量 (运维灰度中)\n * - status === '' (Unknown) → 老 nexus, 按老 v0.17 行为 (不显示 BucketInfo)\n */\n async listModelsWithStatus(\n signal?: AbortSignal,\n opts?: { includeLocked?: boolean },\n ): Promise<{ models: ManagedModel[]; status: FilterStatus }> {\n // includeLocked=true:请求「全集模式」。网关已实现 ?picker=1\n // (managed_model.go appendLockedUpsellModels):filterModelsByEntitlement 删行后把\n // 越档模型作为 Locked=true 补回,返回全集供 C 端选择器展示「付费订阅区」+ 置灰升级\n // 引导。opts.includeLocked 是面向调用方的语义名,拼成网关认的 picker=1。缺省=现状\n // (只返有桶模型),向后兼容旧客户端 / 内部消费者。\n const includeLocked = opts?.includeLocked === true;\n const requestOwner = this.lifecycle ? this.ownerKey(await this.getCredentialSnapshot(signal)) : null;\n const path = includeLocked\n ? '/managed-models?picker=1'\n : '/managed-models';\n const { result, headers } = await this.doJSONFull<APIResponse<ManagedModel[]>>(\n 'GET',\n path,\n null,\n signal,\n );\n // v1.2: 写缓存前归一化 input_modalities → inputModalities (snake/camel 双名兼容)\n const normalized = normalizeInputModalities(result.data);\n if (requestOwner !== null) {\n const current = await this.getCredentialSnapshot(signal);\n if (this.ownerKey(current) !== requestOwner) throw new Error('superseded');\n this.adoptCredentialOwner(current);\n }\n // 全集模式(含 locked 行)只供 picker 展示,**不写** this.modelCache —— 后者是\n // 「可用模型」缓存(getModelCapabilities / quota 消费),写全集会让 locked 模型混入\n // 可用集(全集/子集互污)。缺省模式照旧缓存,行为完全不变。\n if (!includeLocked) {\n this.modelCache = normalized;\n this.modelCacheTimeMs = Date.now();\n }\n\n let status: FilterStatus = '';\n if (headers) {\n const h = headers.get('X-Entitlement-Filter-Status');\n if (h) status = h as FilterStatus;\n }\n return { models: normalized, status };\n }\n\n /** 查询当前用户账户级权益总览 (v0.19+) */\n async getQuotaSummary(signal?: AbortSignal): Promise<QuotaSummary> {\n const resp = await this.doJSON<APIResponse<QuotaSummary>>(\n 'GET',\n '/entitlements/quota-summary',\n null,\n signal,\n );\n return resp.data;\n }\n\n /**\n * [W1 2026-07-11 软限额] 设置当前用户 5 小时窗口软限额「继续」开关 (v2.12+)。\n *\n * enabled=true = 软限额 (到达 5h 后继续消耗周配额, 默认); false = 严格模式 (到达即等待逐步恢复)。\n * userId 由网关从鉴权态解析 (客户端永不传), 故只需 enabled + 可选 source (审计: web /\n * crabcode-gui / crabcode-tui / dialog)。用于个人中心开关、429 严格模式「重新开启继续」续跑。\n *\n * @returns 网关回显的新状态 { enabled }。\n */\n async setWindowContinuePreference(\n enabled: boolean,\n opts?: { source?: string; signal?: AbortSignal },\n ): Promise<{ enabled: boolean }> {\n const resp = await this.doJSON<APIResponse<{ enabled: boolean }>>(\n 'POST',\n '/entitlements/window-continue-pref',\n { enabled, source: opts?.source },\n opts?.signal,\n );\n return { enabled: resp.data.enabled };\n }\n\n /**\n * [W-MEMBERSHIP 2026-08-01 邀请奖励] 查询当前用户窗口重置券总览 (v2.13+)。\n *\n * 重置券由邀请奖励发放 (被邀请人激活并达到用量门槛后计一次), 每张可清空一次滚动窗口已用量\n * (见 redeemWindowReset)。userId 由网关从鉴权态解析, 客户端永不传。\n * 用于个人中心邀请栏与 429 窗口限额弹窗展示\"还剩几张券 + 最近到期时间 + 邀请进度\"。\n *\n * @returns 券余量 / 最近到期 / 累计发放与使用 / 邀请已达标与待达标数。\n */\n async getWindowResetSummary(signal?: AbortSignal): Promise<WindowResetSummary> {\n const resp = await this.doJSON<APIResponse<WindowResetSummary>>(\n 'GET',\n '/entitlements/window-reset/summary',\n null,\n signal,\n );\n return resp.data;\n }\n\n /**\n * [W-MEMBERSHIP 2026-08-01 邀请奖励] 消费一张窗口重置券, 清空当前滚动窗口已用量 (v2.13+)。\n *\n * **幂等键语义**: 传 `clientRequestId` 时同一 ID 重放**不会二次扣券** — 网关按该键返回首次\n * 结果 (`remaining` 与首次一致)。网络重试 / 用户连点必须**复用同一 ID**; 换 ID = 换一次真实\n * 扣券。不传则不幂等, 每次调用都是一次真实扣券。\n *\n * 业务错 (信封 `code != 0`) 按 SDK 惯例抛 `BusinessError` (message 含机器码), 常见两种:\n * - `NO_AVAILABLE_CREDIT` — 无可用券 (未发放 / 已用尽 / 已过期)\n * - `NO_WINDOW_USAGE` — 当前窗口无已用量, 无可重置 (不扣券)\n *\n * @returns 扣减后剩余可用券张数 { remaining }。\n */\n async redeemWindowReset(opts?: {\n clientRequestId?: string;\n signal?: AbortSignal;\n }): Promise<{ remaining: number }> {\n const resp = await this.doJSON<APIResponse<{ remaining: number }>>(\n 'POST',\n '/entitlements/window-reset/redeem',\n { clientRequestId: opts?.clientRequestId },\n opts?.signal,\n );\n return { remaining: resp.data.remaining };\n }\n\n /**\n * 查询单个模型的能力矩阵\n * 优先从 listModels 缓存读取, miss 时调用 listModels 刷新\n */\n async getModelCapabilities(modelID: string, signal?: AbortSignal): Promise<ModelCapabilities> {\n let caps = this.getCachedCapabilities(modelID);\n if (caps) return caps;\n await this.listModels(signal);\n caps = this.getCachedCapabilities(modelID);\n if (caps) return caps;\n // 模型不在列表中, 返回零值 (与 Go 行为一致)\n return zeroModelCapabilities();\n }\n\n private getCachedCapabilities(modelID: string): ModelCapabilities | null {\n if (this.modelCache.length === 0 || Date.now() - this.modelCacheTimeMs > modelCacheTTLMs) {\n return null;\n }\n for (const m of this.modelCache) {\n if (m.id === modelID || m.modelId === modelID) {\n return m.capabilities;\n }\n }\n return null;\n }\n\n /** 从缓存中查找完整 ManagedModel (未命中返 null) */\n private getCachedModel(modelID: string): ManagedModel | null {\n for (const m of this.modelCache) {\n if (m.id === modelID || m.modelId === modelID) return m;\n }\n return null;\n }\n\n /** 测试辅助: 把占位 ManagedModel 塞入缓存. 仅测试用. */\n primeModelCacheForTest(...ids: string[]): void {\n for (const id of ids) {\n this.modelCache.push({\n id,\n name: '',\n provider: 'anthropic',\n modelId: id,\n maxTokens: 0,\n isEnabled: true,\n capabilities: zeroModelCapabilities(),\n });\n }\n this.modelCacheTimeMs = Date.now();\n }\n\n /**\n * 确保指定 modelID 的 ManagedModel 已在缓存中。\n *\n * 语义:\n * 1. 若缓存命中 → 直接返回\n * 2. 若未命中 → 调 listModels 刷新一次\n * 3. 刷新后仍未命中 → 抛 ModelNotFoundError\n *\n * 根因修复: 消除未预热场景下 provider=\"anthropic\" 硬编码回退,\n * 该回退会让 DashScope/Zhipu/DeepSeek 等 non-anthropic 模型被按 Anthropic\n * 格式编码并打到错误的 /anthropic 端点。\n */\n async ensureModelCached(modelID: string, signal?: AbortSignal): Promise<ManagedModel> {\n let m = this.getCachedModel(modelID);\n if (m) return m;\n await this.listModels(signal);\n m = this.getCachedModel(modelID);\n if (m) return m;\n throw new ModelNotFoundError(modelID);\n }\n\n // ===========================================================================\n // Chat\n // ===========================================================================\n\n /**\n * 构建完整的聊天请求体 (v0.5.0 adapter 模式)\n *\n * 根据 provider 选择 adapter, 委托 buildRequestBody 构建格式化的请求体。\n *\n * v0.13.x: 前置 ensureModelCached, 消除冷缓存硬编码回退。未知 modelID 抛 ModelNotFoundError.\n */\n async buildChatRequest(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): Promise<{ body: string; adapter: ProviderAdapter }> {\n // v0.11.0: 请求前防御 (体积 / deny-list / 深度 / ephemeral 剥离). 未配置时零开销.\n // applyRequestSanitizers 由 sanitize-bridge.ts mixin 提供\n if (typeof (this as Client & { applyRequestSanitizers?: (r: ChatRequest) => void }).applyRequestSanitizers === 'function') {\n (this as Client & { applyRequestSanitizers: (r: ChatRequest) => void }).applyRequestSanitizers(req);\n }\n\n const m = await this.ensureModelCached(modelID, signal);\n const adapter = getAdapterForModel(m);\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n\n const body = adapter.buildRequestBody(caps, req);\n return { body: JSON.stringify(body), adapter };\n }\n\n /**\n * 同步聊天 (适合短回复)\n * 响应的 tokenRemaining / callRemaining 字段来自服务端 Header, 反映结算后余额\n * v0.5.0: 根据 provider 自动路由到 /anthropic 或 /chat 端点\n */\n async chat(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<ChatResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req (buildChatRequest 内部 sanitizer 也会改 rawMessages)。\n const r: ChatRequest = { ...req, stream: false };\n // 外层 ctl 界定本方法的总预算 (buildChatRequest 的 ensureModelCached 可能出网,\n // 之后才是 POST — 两段网络操作共享同一条 deadline)。\n //\n // 2026-08-06: 内层 doJSONFullRaw 必须**再传一次** CHAT_REQUEST_TIMEOUT_MS。它的\n // timeoutMs 形参有 30s 默认值, 只传到 ctl.signal 为止时内层会自建 30s 计时器并\n // 恒先于外层 11min 触发 —— v1.6.0 那次\"调整为 11min\"因此一天都没生效过 (取证:\n // 生产网关当日 29 条 latency≈30000ms 的 499, 横跨 4 厂商 5 模型)。\n const ctl = withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS, signal);\n try {\n const { body, adapter } = await this.buildChatRequest(modelID, r, ctl.signal);\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n const { result, headers } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n body,\n ctl.signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n\n // 计费关联 (2026-09-01): 见 GatewayRequestIDCallback。\n notifyGatewayRequestID(onGatewayRequestID, headers);\n\n const resp = adapter.parseResponse(result);\n\n // 从 Header 提取 token 余额\n const v1 = headers.get('X-Token-Remaining');\n if (v1) {\n const n = parseInt(v1, 10);\n if (!isNaN(n)) resp.tokenRemaining = n;\n }\n const v2 = headers.get('X-Call-Remaining');\n if (v2) {\n const n = parseInt(v2, 10);\n if (!isNaN(n)) resp.callRemaining = n;\n }\n const v3 = headers.get('X-Token-Remaining-Model');\n if (v3) {\n const n = parseInt(v3, 10);\n if (!isNaN(n)) resp.modelTokenRemaining = n;\n }\n const v4 = headers.get('X-Token-Remaining-Model-ETU');\n if (v4) {\n const n = parseInt(v4, 10);\n if (!isNaN(n)) resp.modelTokenRemainingETU = n;\n }\n return resp;\n } finally {\n ctl.dispose();\n }\n }\n\n // ===========================================================================\n // 媒体生成 (v1.3+) — 图片 / 视频生成托管模型 (与 chat 同网关)\n //\n // 仅对 capabilities.supports_image_generation / supports_video_generation 的模型有效。\n // 网关不算钱; 用量由网关上报营销系统结算。\n // ===========================================================================\n\n /** 解析 nexus-v4 {code,message,data} 信封, code!=0 抛 BusinessError, 返回 data。 */\n private unwrapAPIResponse<T>(result: Uint8Array): T {\n const env = JSON.parse(new TextDecoder().decode(result)) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(env as unknown as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n return env.data;\n }\n\n /**\n * 图片生成 (同步)。POST /managed-models/:id/images/generations\n *\n * @param modelID 图片生成托管模型 ID (capabilities.supports_image_generation=true)\n */\n async generateImage(\n modelID: string,\n req: ImageGenerationRequest,\n signal?: AbortSignal,\n ): Promise<ImageGenerationResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/images/generations`;\n // 图片生成耗时常超 30s, 用 chat 同级超时 (11min) 容纳上游。\n const { result } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n req,\n signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n return this.unwrapAPIResponse<ImageGenerationResponse>(result);\n }\n\n /**\n * 创建视频生成任务 (异步)。POST /managed-models/:id/videos/generations\n * 返回 taskId; 用 pollVideoTask() 轮询直到 status=completed。\n * 上报真物理量 (视频秒数) 需在 pollVideoTask 时回传 req.duration。\n *\n * @param modelID 视频生成托管模型 ID (capabilities.supports_video_generation=true)\n */\n async generateVideo(\n modelID: string,\n req: VideoGenerationRequest,\n signal?: AbortSignal,\n ): Promise<VideoTaskResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/videos/generations`;\n // 与 generateImage 同级 (11min): 视频任务提交同样经上游网关排队, 30s 默认值不足。\n const { result } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n req,\n signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n return this.unwrapAPIResponse<VideoTaskResponse>(result);\n }\n\n /**\n * 轮询视频任务状态。GET /managed-models/:id/videos/tasks/:taskId\n *\n * @param durationSeconds 创建时的时长 (秒), 透传给网关在 completed 时上报用量。\n */\n async pollVideoTask(\n modelID: string,\n taskID: string,\n durationSeconds?: number,\n signal?: AbortSignal,\n ): Promise<VideoTaskResponse> {\n let endpoint = `/managed-models/${encodeURIComponent(modelID)}/videos/tasks/${encodeURIComponent(taskID)}`;\n if (durationSeconds != null && durationSeconds > 0) {\n endpoint += `?duration=${encodeURIComponent(String(durationSeconds))}`;\n }\n const { result } = await this.doJSONFullRaw('GET', endpoint, null, signal);\n return this.unwrapAPIResponse<VideoTaskResponse>(result);\n }\n\n /**\n * 向量 (同步)。POST /managed-models/:id/embeddings\n *\n * 仅 capabilities.supports_embedding=true 的托管模型可用 (上游接 DashScope)。\n * 响应为 OpenAI /v1/embeddings 标准格式 (网关直通, 无 response.Success 包装)。\n *\n * @param modelID 向量托管模型 ID\n */\n async embeddings(\n modelID: string,\n req: EmbeddingRequest,\n signal?: AbortSignal,\n ): Promise<EmbeddingResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/embeddings`;\n const { result } = await this.doJSONFullRaw('POST', endpoint, req, signal, CHAT_REQUEST_TIMEOUT_MS);\n return JSON.parse(new TextDecoder().decode(result)) as EmbeddingResponse;\n }\n\n /**\n * 重排序 (同步)。POST /managed-models/:id/rerank\n *\n * 仅 capabilities.supports_rerank=true 的托管模型可用 (上游接 DashScope)。\n * 统一扁平契约: { query, documents[], top_n?, return_documents?, instruct? };\n * 响应 { results: [{ index, relevance_score, document? }], usage, model }\n * (网关已把上游原生/OpenAI 兼容两线路归一化, 无 response.Success 包装)。\n *\n * @param modelID 重排序托管模型 ID\n */\n async rerank(\n modelID: string,\n req: RerankRequest,\n signal?: AbortSignal,\n ): Promise<RerankResponse> {\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}/rerank`;\n const { result } = await this.doJSONFullRaw('POST', endpoint, req, signal, CHAT_REQUEST_TIMEOUT_MS);\n return JSON.parse(new TextDecoder().decode(result)) as RerankResponse;\n }\n\n /**\n * Anthropic 原生格式同步聊天\n * v0.5.0: 根据 provider 自动路由\n * Anthropic → chatMessagesAnthropic (现有路径, POST /anthropic)\n * 其他厂商 → chatMessagesOpenAI (POST /chat, 响应转换为 AnthropicResponse)\n */\n async chatMessages(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<AnthropicResponse> {\n const m = await this.ensureModelCached(modelID, signal);\n const adapter = getAdapterForModel(m);\n\n if (adapter.format() === ProviderFormat.Anthropic) {\n return this.chatMessagesAnthropic(modelID, req, adapter, signal, onGatewayRequestID);\n }\n return this.chatMessagesOpenAI(modelID, req, adapter, signal, onGatewayRequestID);\n }\n\n private async chatMessagesAnthropic(\n modelID: string,\n req: ChatRequest,\n adapter: ProviderAdapter,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<AnthropicResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: false };\n const ctl = withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, r);\n const data = JSON.stringify(body);\n\n // 第 5 实参不可省 — 见 chat() 处说明: 缺它内层恒落回 30s 默认值。\n const { result, headers } = await this.doJSONFullRaw(\n 'POST',\n `/managed-models/${encodeURIComponent(modelID)}/anthropic`,\n data,\n ctl.signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n\n // 计费关联 (2026-09-01): 见 GatewayRequestIDCallback。\n notifyGatewayRequestID(onGatewayRequestID, headers);\n\n // 尝试 APIResponse 包装: {\"code\":0,\"message\":\"...\",\"data\":{...}}\n const rawStr = new TextDecoder().decode(result);\n try {\n const wrapper = JSON.parse(rawStr) as { code?: number; message?: string; data?: unknown };\n if (wrapper.data != null && wrapper.data !== null) {\n const bizErr = apiResponseBusinessError({\n code: wrapper.code ?? 0,\n message: wrapper.message,\n data: wrapper.data,\n } as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n return wrapper.data as AnthropicResponse;\n }\n } catch (e) {\n // 不是 wrapper 格式, fall through\n if (e && typeof e === 'object' && 'name' in e && (e as Error).name === 'BusinessError') throw e;\n }\n\n try {\n return JSON.parse(rawStr) as AnthropicResponse;\n } catch (e) {\n throw new Error(`decode anthropic response: ${e instanceof Error ? e.message : String(e)}`);\n }\n } finally {\n ctl.dispose();\n }\n }\n\n private async chatMessagesOpenAI(\n modelID: string,\n req: ChatRequest,\n adapter: ProviderAdapter,\n signal?: AbortSignal,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): Promise<AnthropicResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: false };\n const ctl = withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, r);\n const data = JSON.stringify(body);\n\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n // 第 5 实参不可省 — 见 chat() 处说明: 缺它内层恒落回 30s 默认值。\n const { result, headers } = await this.doJSONFullRaw(\n 'POST',\n endpoint,\n data,\n ctl.signal,\n CHAT_REQUEST_TIMEOUT_MS,\n );\n\n // 计费关联 (2026-09-01): 见 GatewayRequestIDCallback。\n notifyGatewayRequestID(onGatewayRequestID, headers);\n\n // 解析 OpenAI 格式响应并转换为 AnthropicResponse\n const { parseOpenAIResponseToAnthropic } = await import('../models/adapters/openai');\n return parseOpenAIResponseToAnthropic(result);\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * 流式聊天 (SSE), 通过 async generator 返回事件\n * v0.5.0: 根据 adapter 路由端点\n *\n * @param onUpstreamActivity 见 {@link UpstreamActivityCallback}\n * @param onGatewayRequestID 见 {@link GatewayRequestIDCallback}\n */\n chatStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () =>\n this.chatStreamGen(modelID, req, signal, false, onUpstreamActivity, onGatewayRequestID),\n };\n }\n\n /**\n * Anthropic 原生格式流式聊天 (SSE)\n * 调用 POST /managed-models/:id/anthropic, SSE 事件为 Anthropic 协议格式\n * 无 started/settled/failed 自定义事件, 无 data: [DONE], message_stop 为自然结束\n *\n * @param onUpstreamActivity 见 {@link UpstreamActivityCallback}\n * @param onGatewayRequestID 见 {@link GatewayRequestIDCallback}\n */\n chatMessagesStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () =>\n this.chatMessagesStreamGen(modelID, req, signal, false, onUpstreamActivity, onGatewayRequestID),\n };\n }\n\n private async *chatStreamGen(\n modelID: string,\n req: ChatRequest,\n signal: AbortSignal | undefined,\n retried: boolean,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncGenerator<StreamEvent, void, void> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: true };\n const { body, adapter } = await this.buildChatRequest(modelID, r, signal);\n const token = await this.ensureToken(signal);\n\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n const url = this.apiURL(endpoint);\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body,\n signal,\n });\n } catch (e) {\n throw classifyTransport('POST ' + endpoint, url, e);\n }\n\n // 401 单次重试\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(signal, token);\n } catch (refreshErr) {\n throw new Error(\n `stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n yield* this.chatStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID);\n return;\n }\n\n // 计费关联 (2026-09-01): 响应头在首字节之前就已到达, 这里是唯一能在\n // 「流还没吐任何事件」之前拿到消费请求 ID 的位置。刻意放在 !resp.ok 之前 ——\n // HTTP 错误同样有关联价值, 且错误体里未必带这个 ID。\n notifyGatewayRequestID(onGatewayRequestID, resp.headers);\n\n if (!resp.ok) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n if (!resp.body) {\n throw new Error('stream: empty response body');\n }\n\n let blockTypeMap: Map<number, BlockMeta> | null = null;\n if (adapter.format() === ProviderFormat.Anthropic) {\n blockTypeMap = new Map();\n }\n\n let currentEvent = '';\n for await (const line of iterSSELines(resp.body)) {\n notifyUpstreamActivity(onUpstreamActivity);\n // v1.6.0: 显式跳过 SSE 注释行 (\": comment\", 如 \": keep-alive\")\n if (isSSECommentLine(line)) continue;\n if (line.startsWith('event:')) {\n currentEvent = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n const parsed = adapter.parseStreamLine(currentEvent, data);\n if (parsed.done) return;\n const ev = parsed.event;\n if (blockTypeMap) {\n const [idx, bt, eph] = extractAnthropicBlockMeta(currentEvent, data, blockTypeMap);\n if (bt !== '') {\n ev.blockIndex = idx;\n ev.blockType = bt;\n ev.ephemeral = eph;\n }\n }\n yield ev;\n }\n }\n }\n\n private async *chatMessagesStreamGen(\n modelID: string,\n req: ChatRequest,\n signal: AbortSignal | undefined,\n retried: boolean,\n onUpstreamActivity?: UpstreamActivityCallback,\n onGatewayRequestID?: GatewayRequestIDCallback,\n ): AsyncGenerator<StreamEvent, void, void> {\n // 浅拷贝避免原地 mutate 调用方传入的 req。\n const r: ChatRequest = { ...req, stream: true };\n const { body, adapter } = await this.buildChatRequest(modelID, r, signal);\n const token = await this.ensureToken(signal);\n\n const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;\n const url = this.apiURL(endpoint);\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body,\n signal,\n });\n } catch (e) {\n throw classifyTransport('POST ' + endpoint, url, e);\n }\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(signal, token);\n } catch (refreshErr) {\n throw new Error(\n `messages stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n yield* this.chatMessagesStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID);\n return;\n }\n\n // 计费关联 (2026-09-01): 响应头在首字节之前就已到达, 这里是唯一能在\n // 「流还没吐任何事件」之前拿到消费请求 ID 的位置。刻意放在 !resp.ok 之前 ——\n // HTTP 错误同样有关联价值, 且错误体里未必带这个 ID。\n notifyGatewayRequestID(onGatewayRequestID, resp.headers);\n\n if (!resp.ok) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n if (!resp.body) {\n throw new Error('messages stream: empty response body');\n }\n\n if (adapter.format() === ProviderFormat.OpenAI) {\n // OpenAI SSE: 转换为 Anthropic 兼容事件\n const converter = newOpenAIStreamConverter();\n let _currentEvent = '';\n for await (const line of iterSSELines(resp.body)) {\n notifyUpstreamActivity(onUpstreamActivity);\n // v1.6.0: 显式跳过 SSE 注释行\n if (isSSECommentLine(line)) continue;\n if (line.startsWith('event:')) {\n _currentEvent = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n const { events, done } = converter.convert(data);\n for (const ev of events) yield ev;\n if (done) return;\n }\n }\n } else {\n // Anthropic SSE: 原生事件直透 + v0.11.0 content block 元数据回填\n const blockTypeMap = new Map<number, BlockMeta>();\n let currentEvent = '';\n for await (const line of iterSSELines(resp.body)) {\n notifyUpstreamActivity(onUpstreamActivity);\n // v1.6.0: 显式跳过 SSE 注释行\n if (isSSECommentLine(line)) continue;\n if (line.startsWith('event:')) {\n currentEvent = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n const data = line.slice('data:'.length).trim();\n const ev: StreamEvent = { event: currentEvent, data };\n const [idx, bt, eph] = extractAnthropicBlockMeta(currentEvent, data, blockTypeMap);\n if (bt !== '') {\n ev.blockIndex = idx;\n ev.blockType = bt;\n ev.ephemeral = eph;\n }\n yield ev;\n }\n }\n }\n }\n\n /**\n * 流式聊天, 自动解析结算事件和搜索来源\n *\n * 返回单一 tagged AsyncIterable, kind 区分 4 种事件:\n * - kind='content': 内容增量事件\n * - kind='sources': 搜索来源\n * - kind='settle': 结算 (token 消耗 + 剩余余额)\n *\n * Go 版本 4 channels (eventCh/sourcesCh/settleCh/errCh), 错误抛出取代 errCh。\n */\n async *chatStreamWithUsage(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<\n | { kind: 'content'; event: StreamEvent }\n | { kind: 'sources'; event: SourcesEvent }\n | { kind: 'settle'; event: StreamSettlement },\n void,\n void\n > {\n for await (const ev of this.chatStream(modelID, req, signal)) {\n // 结算事件 (settled / pending_settle)\n const s = parseSettlement(ev);\n if (s) {\n yield { kind: 'settle', event: s };\n continue;\n }\n // 搜索来源事件\n const src = parseSourcesEvent(ev);\n if (src) {\n yield { kind: 'sources', event: src };\n continue;\n }\n // 控制事件: 过滤\n if (ev.event === 'started') continue;\n // 失败/错误事件: 解析错误信息抛出\n if (ev.event === 'failed' || ev.event === 'error') {\n throw parseStreamError(ev.data);\n }\n // 内容事件\n yield { kind: 'content', event: ev };\n }\n }\n\n // ===========================================================================\n // Internal HTTP\n // ===========================================================================\n\n apiURL(path: string): string {\n // apiBaseURL 覆盖 (未配置时 === serverURL, 既有行为零变化)。\n let base = this.apiBaseURL ?? this.serverURL;\n if (!base.endsWith('/api/v4')) {\n base += '/api/v4';\n }\n const url = base + path;\n this.assertCredentialURL(url);\n return url;\n }\n\n /**\n * Compliance API URL 拼接。\n *\n * `complianceBaseURL` 已配置时直接拼接;未配置时默认\n * `${serverURL}/admin-api` + path,匹配 Java compliance controller 的\n * `/compliance/...` 路径。\n *\n * 不复用 `apiURL`:apiURL 强制追加 `/api/v4`,与 compliance 路径不同。\n */\n complianceURL(path: string): string {\n const base = this.complianceBaseURL ?? this.serverURL + '/admin-api';\n const url = base + path;\n this.assertCredentialURL(url);\n return url;\n }\n\n private assertCredentialURL(url: string): void {\n if (this.credentialMode !== 'legacy' && new URL(url).origin !== this.credentialAuthority) {\n throw new Error('credential request authority changed');\n }\n }\n\n /** GET/POST/... 通用 JSON 调用 (返回 result 已 typed) */\n async doJSON<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n ): Promise<T> {\n const r = await this.doJSONFull<T>(method, path, body, signal);\n return r.result;\n }\n\n /** 与 doJSON 相同, 但返回响应 Headers (用于提取 X-Token-Remaining 等) */\n async doJSONFull<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n ): Promise<{ result: T; headers: Headers }> {\n return this.doJSONFullInternal<T>(method, path, body, signal, false);\n }\n\n private async doJSONFullInternal<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n retried: boolean,\n ): Promise<{ result: T; headers: Headers }> {\n const ctl = withRequestTimeout(30_000, signal);\n try {\n const token = await this.ensureToken(ctl.signal);\n\n let bodyStr: string | null = null;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const url = this.apiURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n if (bodyStr != null) headers['Content-Type'] = 'application/json';\n\n const resp = await this.doRequestWithRetry(\n { method, url, headers, body: bodyStr ?? undefined },\n ctl.signal,\n );\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(ctl.signal, token);\n } catch (refreshErr) {\n throw new Error(\n `unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n return this.doJSONFullInternal<T>(method, path, body, signal, true);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n // 空 body 的成功响应 (HTTP 204 / 200 空体) — 不要 JSON.parse('') (抛 SyntaxError)。\n // 按方法返回契约返回 undefined (与 compliance executeJson 一致), 同时跳过业务码检查。\n if (!text) {\n return { result: undefined as unknown as T, headers: resp.headers };\n }\n const result = JSON.parse(text) as T;\n // 业务码检查 (APIResponse.code != 0)\n if (result && typeof result === 'object' && 'code' in result) {\n const bizErr = apiResponseBusinessError(result as unknown as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n }\n return { result, headers: resp.headers };\n } catch (e) {\n if (e instanceof Error && e.name === 'AbortError') {\n throw classifyTransport(`${method} ${path}`, this.apiURL(path), e);\n }\n throw e;\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse)\n *\n * ⚠️ 契约 (2026-08-06): `timeoutMs` 的 30s 默认值只适用于**控制面**端点 (列目录 /\n * 查配额 / 取任务状态)。凡走**模型推理或生成**的端点 —— chat / anthropic /\n * embeddings / rerank / images / videos —— 一律必须显式传入 `CHAT_REQUEST_TIMEOUT_MS`,\n * 哪怕调用方已经用 `withRequestTimeout` 建了外层预算: 外层只约束 `signal`, 内层\n * 会**另建**一个 `timeoutMs` 计时器, 30s 恒先于任何更长的外层预算触发。\n *\n * 这不是假设 —— 2026-08-06 事故里 chat 路径正因漏传本参数而被恒定钉死在 30s,\n * 且上方 v1.6.0 的注释还声称它已是 11min。回归闸门见\n * `tests/chat-timeout-budget.test.ts`。\n */\n async doJSONFullRaw(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n timeoutMs = 30_000,\n ): Promise<{ result: Uint8Array; headers: Headers }> {\n return this.doJSONFullRawInternal(method, path, body, signal, false, timeoutMs);\n }\n\n private async doJSONFullRawInternal(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n retried: boolean,\n timeoutMs = 30_000,\n ): Promise<{ result: Uint8Array; headers: Headers }> {\n const ctl = withRequestTimeout(timeoutMs, signal);\n try {\n const token = await this.ensureToken(ctl.signal);\n\n let bodyStr: string | null = null;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const url = this.apiURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n if (bodyStr != null) headers['Content-Type'] = 'application/json';\n\n const resp = await this.doRequestWithRetry(\n { method, url, headers, body: bodyStr ?? undefined },\n ctl.signal,\n );\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await this.forceRefresh(ctl.signal, token);\n } catch (refreshErr) {\n throw new Error(\n `unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n return this.doJSONFullRawInternal(method, path, body, signal, true, timeoutMs);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const buf = new Uint8Array(await resp.arrayBuffer());\n return { result: buf, headers: resp.headers };\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * 公共端点请求\n * 有 token 时自动附带 (享受认证用户待遇), 无 token 时匿名请求\n * 不做 401 重试 (公共端点不应要求认证)\n */\n async doPublicJSON<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal?: AbortSignal,\n ): Promise<T> {\n const ctl = withRequestTimeout(30_000, signal);\n try {\n let token = '';\n try {\n token = await this.ensureToken(ctl.signal);\n } catch {\n // 公共端点允许未授权\n }\n\n let bodyStr: string | null = null;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const url = this.apiURL(path);\n const headers: Record<string, string> = {};\n if (token) headers['Authorization'] = `Bearer ${token}`;\n if (bodyStr != null) headers['Content-Type'] = 'application/json';\n\n const resp = await this.doRequestWithRetry(\n { method, url, headers, body: bodyStr ?? undefined },\n ctl.signal,\n );\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n const result = JSON.parse(text) as T;\n if (result && typeof result === 'object' && 'code' in result) {\n const bizErr = apiResponseBusinessError(result as unknown as APIResponse<unknown>);\n if (bizErr) throw bizErr;\n }\n return result;\n } finally {\n ctl.dispose();\n }\n }\n\n /**\n * 给子 client (agent-runs / compliance) 用的请求超时组合器。\n *\n * 返回一个 controller, 其 `signal` 同时受默认/指定超时与外部 `parent` signal 约束 —\n * 二者任一触发都会 abort (用户传入的 signal 仍然生效)。调用方**必须**在 finally 里\n * `dispose()` 清掉定时器与监听, 否则 timer 泄漏。\n *\n * 仅用于非流式 JSON 请求; 流式 (SSE) / 下载路径不应套短超时 (会切断长连接)。\n */\n withRequestTimeout(ms: number, parent?: AbortSignal): ReqTimeoutCtl {\n return withRequestTimeout(ms, parent);\n }\n\n /**\n * fetch 包装 — 错误经 classifyTransport 转 NetworkError\n * 6 处原始 fetch() 全部走此 helper\n */\n async doRequest(req: { method: string; url: string; headers: Record<string, string>; body?: string }, signal?: AbortSignal): Promise<Response> {\n if (new Headers(req.headers).has('Authorization')) this.assertCredentialURL(req.url);\n try {\n return await this.fetchImpl(req.url, {\n method: req.method,\n headers: req.headers,\n body: req.body,\n signal,\n });\n } catch (e) {\n throw classifyTransport(req.method + ' ' + new URL(req.url).pathname, req.url, e);\n }\n }\n\n /**\n * 带 RetryPolicy 的 doRequest 包装 — 仅用于同步 (非流式) 路径.\n *\n * 重试触发:\n * - transport 层 err (NetworkError isTimeout/isEOF) → 重试\n * - HTTP 5xx / 429 → 主动构造 HTTPError 喂给 onRetryable, 默认重试\n * - 其他 (HTTP 2xx/3xx/4xx 非 429 / DNS / StreamError) → 不重试\n *\n * 流式路径 (chatMessagesStreamGen / chatStreamGen) **不得**调用此函数, 必须直接用 doRequest.\n */\n async doRequestWithRetry(\n req: { method: string; url: string; headers: Record<string, string>; body?: string },\n signal?: AbortSignal,\n ): Promise<Response> {\n const policy = this.retryPolicy;\n if (!policy || !policy.safeToRetry({ method: req.method, url: req.url })) {\n return this.doRequest(req, signal);\n }\n\n let lastErr: unknown = null;\n for (let attempt = 0; attempt < policy.maxAttempts; attempt++) {\n try {\n const resp = await this.doRequest(req, signal);\n // 仅 5xx/429 进入 retry 评估\n if (resp.status < 500 && resp.status !== 429) {\n return resp;\n }\n // 5xx 或 429 → 构造 HTTPError 喂给 onRetryable\n const bodyPeek = await readLimited(resp.body!, maxErrorBodySize);\n lastErr = parseHTTPErrorWithHeader(resp.status, bodyPeek, resp.headers);\n } catch (e) {\n lastErr = e;\n }\n\n if (attempt + 1 === policy.maxAttempts) break;\n if (!policy.onRetryable(lastErr)) break;\n\n const backoff = computeBackoff(policy, attempt, lastErr);\n await sleep(backoff, signal);\n }\n throw lastErr;\n }\n}\n\n// =============================================================================\n// 内部 helpers\n// =============================================================================\n\nfunction defaultTokenStore(): TokenStore {\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n try {\n return new FileTokenStore();\n } catch {\n return new InMemoryTokenStore();\n }\n }\n if (typeof globalThis.localStorage !== 'undefined') {\n try {\n return new LocalStorageTokenStore();\n } catch {\n return new InMemoryTokenStore();\n }\n }\n return new InMemoryTokenStore();\n}\n\nfunction isLikelyBrowserOAuthCORSError(message: string): boolean {\n const lower = message.toLowerCase();\n return (\n lower.includes('failed to fetch') ||\n lower.includes('networkerror') ||\n lower.includes('cors') ||\n lower.includes('http 403')\n );\n}\n\nfunction isTokenSetLike(value: unknown): value is TokenSet {\n if (value == null || typeof value !== 'object') return false;\n const candidate = value as Partial<TokenSet>;\n return (\n typeof candidate.access_token === 'string' &&\n typeof candidate.refresh_token === 'string' &&\n typeof candidate.expires_at === 'string' &&\n typeof candidate.scope === 'string' &&\n typeof candidate.client_id === 'string' &&\n typeof candidate.server_url === 'string'\n );\n}\n\nfunction zeroModelCapabilities(): ModelCapabilities {\n return {\n supports_thinking: false,\n supports_adaptive_thinking: false,\n supports_isp: false,\n supports_web_search: false,\n supports_tool_search: false,\n supports_structured_output: false,\n supports_effort: false,\n supports_max_effort: false,\n supports_fast_mode: false,\n supports_auto_mode: false,\n supports_1m_context: false,\n supports_prompt_cache: false,\n supports_cache_editing: false,\n supports_token_efficient: false,\n supports_redact_thinking: false,\n max_input_tokens: 0,\n max_output_tokens: 0,\n supports_desktop_visual_understanding: false,\n };\n}\n\n/**\n * 归一化上游 ManagedModel 列表中的 input_modalities (snake_case) → inputModalities (camelCase).\n *\n * 设计:\n * - 同时存在 camelCase 与 snake_case 时, camelCase 胜 (官方契约).\n * - 仅 snake_case 时, 拷一份到 camelCase 让 SDK 用户只读一个字段.\n * - 都没有时不补 default ['text'], 留 undefined — 让调用方知道这是 \"未声明\" 而非 \"明确 text-only\".\n * - **两个分支等价**: 只做键名归一, 不做值过滤。\n *\n * 2.14.0 前 snake 分支带一个 {text, image} 白名单过滤, camel 分支不带。由于线上\n * wire 恒为 camelCase, 那个过滤器从未执行过 —— 是死代码, 但它写下的语义是错的:\n * 模态值域归网关目录所有 (2026-06-20 起含 'video'), SDK 端硬编码一份已知集去过滤,\n * 等于替调用方悄悄删掉目录真值, 且与\"零硬编码能力集\"的原则冲突。收敛为对称透传后,\n * 容忍未知值的责任明确落在消费端类型上 ({@link InputModalityTag} 是开放的)。\n *\n * 该函数 in-place 修改并返回输入数组 (与现网调用方共享同一引用, 避免额外拷贝).\n */\nfunction normalizeInputModalities(models: ManagedModel[]): ManagedModel[] {\n if (!Array.isArray(models)) return models;\n for (const m of models) {\n if (!m || typeof m !== 'object') continue;\n if (Array.isArray(m.inputModalities)) continue;\n const snake = (m as ManagedModel & { input_modalities?: unknown }).input_modalities;\n if (Array.isArray(snake)) {\n // 只收字符串元素 (非字符串是上游畸形值, 留着会让 includes 判定失去意义),\n // 但绝不按已知模态集裁剪。\n m.inputModalities = snake.filter((v): v is string => typeof v === 'string');\n }\n }\n return models;\n}\n\nexport interface ReqTimeoutCtl {\n signal: AbortSignal;\n dispose(): void;\n}\n\n/** 创建组合 abort signal: 超时 + 外部 signal 任一触发都 abort. 若 parent 已有 deadline 则不覆盖. */\nfunction withRequestTimeout(ms: number, parent?: AbortSignal): ReqTimeoutCtl {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), ms);\n let parentHandler: (() => void) | undefined;\n if (parent) {\n if (parent.aborted) {\n ctl.abort();\n } else {\n parentHandler = () => ctl.abort();\n parent.addEventListener('abort', parentHandler);\n }\n }\n return {\n signal: ctl.signal,\n dispose() {\n clearTimeout(timer);\n if (parentHandler && parent) parent.removeEventListener('abort', parentHandler);\n },\n };\n}\n\nasync function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n if (signal && signal.aborted) throw new Error('aborted');\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n if (signal && abortHandler) signal.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => {\n clearTimeout(t);\n signal.removeEventListener('abort', abortHandler!);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n }\n });\n}\n","// auth/types.ts — 鉴权 / 身份域类型。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 OAuth 段。\n\n// =============================================================================\n// OAuth\n// =============================================================================\n\n/** OAuth Authorization Server 元数据 (RFC 8414) */\nexport interface ServerMetadata {\n crabcode_auth_contract_version?: number;\n gateway_error_contract_version?: number;\n issuer: string;\n authorization_endpoint: string;\n token_endpoint: string;\n revocation_endpoint: string;\n registration_endpoint: string;\n scopes_supported: string[];\n}\n\n/** OAuth token 响应 */\nexport interface TokenResponse {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token?: string;\n scope?: string;\n}\n\n/** 持久化 token 对 */\nexport interface TokenSet {\n access_token: string;\n refresh_token: string;\n /** ISO 8601 格式 */\n expires_at: string;\n scope: string;\n client_id: string;\n server_url: string;\n}\n\n/** token 是否已过期 (提前 30 秒视为过期) */\nexport function tokenSetIsExpired(t: TokenSet): boolean {\n const expiresAt = new Date(t.expires_at).getTime();\n // 非法 expires_at (空串 / 'not-a-date' / undefined) → NaN, 任何 `Date.now() > NaN`\n // 比较恒为 false, 会把坏 token 当作\"未过期\"长期复用。视为已过期, 触发 refresh / 重登。\n if (!Number.isFinite(expiresAt)) return true;\n return Date.now() > expiresAt - 30_000;\n}\n\n/**\n * 运行时校验任意值是否为合法 TokenSet 形状 (所有字段都是 string)。\n *\n * store 反序列化磁盘 / localStorage 的 JSON 后必须经此校验:\n * 损坏文件、旧版本残留、缺字段都会被判为无效, 由 caller 当作\"无 token\"重新登录,\n * 而不是把 `{}` / 缺字段对象直接 cast 成 TokenSet 后在 refresh 阶段炸出难懂的错误。\n */\nexport function isValidTokenSet(x: unknown): x is TokenSet {\n if (typeof x !== 'object' || x === null) return false;\n const t = x as Record<string, unknown>;\n return (\n typeof t.access_token === 'string' &&\n typeof t.refresh_token === 'string' &&\n typeof t.expires_at === 'string' &&\n typeof t.scope === 'string' &&\n typeof t.client_id === 'string' &&\n typeof t.server_url === 'string'\n );\n}\n\n/** 动态注册响应 */\nexport interface ClientRegistration {\n client_id: string;\n client_secret?: string;\n}\n","// shared/api-response.ts — nexus-v4 / yudao 标准 API 响应包装。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 API Response Wrapper 段。\n\nimport { BusinessError } from './errors';\n\n// =============================================================================\n// API Response Wrapper\n// =============================================================================\n\n/** nexus-v4 标准响应。兼容 yudao 格式 (msg) 和 nexus-v4 格式 (message) */\nexport interface APIResponse<T> {\n code: number;\n message?: string;\n msg?: string;\n data: T;\n}\n\n/** 优先返回 message, 降级到 msg (兼容 yudao 透传) */\nexport function apiResponseGetMessage<T>(r: APIResponse<T>): string {\n return r.message ?? r.msg ?? '';\n}\n\n/** 检查业务层错误码 — code != 0 时抛 BusinessError */\nexport function apiResponseBusinessError<T>(r: APIResponse<T>): BusinessError | null {\n if (r.code !== 0) {\n return new BusinessError(r.code, apiResponseGetMessage(r));\n }\n return null;\n}\n\n/** yudao 分页响应格式 (tk-dist 代理透传) */\nexport interface YudaoPageResult<T> {\n list: T[];\n total: number;\n}\n","// auth.ts — 端口自 acosmi-sdk-go/auth.go (474 行)\n//\n// 跨平台 OAuth 2.1 PKCE helpers + Node-only loopback authorize (HTTP callback server)。\n//\n// 浏览器侧 (v1.4.0+): authorize() 会抛错 (无 loopback HTTP server), 改用同文件内的\n// Web OAuth 原语 — discoverWebOAuthMetadata / registerWebOAuthClient /\n// createWebAuthorizationRequest / completeWebAuthorizationRequest。由调用方实现\n// popup / 同窗口 redirect handler, SDK 负责 PKCE / state 校验 / token 兑换。\n\nimport type { ClientRegistration, ServerMetadata, TokenResponse, TokenSet } from './types';\n\n/** auth 专用超时 (毫秒) — 与 Go authHTTPClient 30s 一致 */\nconst authTimeoutMs = 30_000;\n\nexport class OAuthTokenEndpointError extends Error {\n readonly status: number;\n readonly oauthError: string;\n readonly errorDescription: string;\n\n constructor(status: number, oauthError: string, errorDescription: string) {\n super(`token: HTTP ${status}: ${errorDescription || oauthError}`);\n this.name = 'OAuthTokenEndpointError';\n this.status = status;\n this.oauthError = oauthError;\n this.errorDescription = errorDescription;\n }\n}\n\nexport function isInvalidGrantError(err: unknown): boolean {\n return err instanceof OAuthTokenEndpointError && err.oauthError === 'invalid_grant';\n}\n\n// =============================================================================\n// Discovery\n// =============================================================================\n\n/** OAuth metadata profile — 决定 well-known 端点的路径后缀 */\nexport type OAuthMetadataProfile = 'web' | 'desktop';\n\n/**\n * 从 well-known 端点获取指定 profile 的 OAuth 服务元数据。\n *\n * serverURL 可能含路径 (如 \"https://acosmi.ai/api/v4\"),\n * well-known 端点按 RFC 8414 必须在 origin 根路径:\n * https://acosmi.ai/.well-known/oauth-authorization-server/<profile>\n *\n * profile='desktop' 对应桌面 loopback OAuth;profile='web' 对应浏览器 Web OAuth。\n * 内部 helper — `discover` / `discoverWebOAuthMetadata` 是其薄包装。\n */\nexport async function discoverWithProfile(\n serverURL: string,\n profile: OAuthMetadataProfile,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ServerMetadata> {\n let parsed: URL;\n try {\n parsed = new URL(serverURL.replace(/\\/+$/, ''));\n } catch (e) {\n throw new Error(`discover: invalid server URL: ${e instanceof Error ? e.message : String(e)}`);\n }\n const origin = `${parsed.protocol}//${parsed.host}`;\n const endpoint = `${origin}/.well-known/oauth-authorization-server/${profile}`;\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetchImpl(endpoint, { method: 'GET', signal: ctl.signal });\n } catch (e) {\n throw new Error(`discover: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n\n if (!resp.ok) {\n throw new Error(`discover: HTTP ${resp.status}`);\n }\n\n let meta: ServerMetadata;\n try {\n meta = (await resp.json()) as ServerMetadata;\n } catch (e) {\n throw new Error(`discover: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n // 校验关键字段非空\n if (!meta.token_endpoint || !meta.authorization_endpoint) {\n throw new Error(\n `discover: metadata missing required endpoints (token=${meta.token_endpoint ?? ''}, auth=${meta.authorization_endpoint ?? ''})`,\n );\n }\n\n return meta;\n}\n\n/**\n * 从 well-known 端点获取 Desktop OAuth 服务元数据。\n *\n * serverURL 可能含路径 (如 \"https://acosmi.ai/api/v4\"),\n * well-known 端点按 RFC 8414 必须在 origin 根路径:\n * https://acosmi.ai/.well-known/oauth-authorization-server/desktop\n */\nexport async function discover(\n serverURL: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ServerMetadata> {\n return discoverWithProfile(serverURL, 'desktop', signal, fetchImpl);\n}\n\n/**\n * 从 well-known 端点获取 Web OAuth 服务元数据。\n *\n * 与 `discover` 行为一致, 但请求路径为\n * https://acosmi.com/.well-known/oauth-authorization-server/web\n *\n * 浏览器侧 Web OAuth (csign 等第一方 Web 应用) 必须用此 profile,\n * 它返回 Web authorize/token 端点; `discover` 的 desktop profile 返回的是\n * 桌面 loopback 端点, 不可混用。\n */\nexport async function discoverWebOAuthMetadata(\n serverURL: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ServerMetadata> {\n return discoverWithProfile(serverURL, 'web', signal, fetchImpl);\n}\n\n// =============================================================================\n// Dynamic Client Registration (RFC 7591)\n// =============================================================================\n\n/** 动态注册桌面客户端,获取 client_id */\nexport async function register(\n meta: ServerMetadata,\n appName: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ClientRegistration> {\n const regReq = {\n client_name: appName,\n token_endpoint_auth_method: 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n redirect_uris: ['http://127.0.0.1/callback'],\n response_types: ['code'],\n };\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetchImpl(meta.registration_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(regReq),\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`register: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n\n if (resp.status !== 200 && resp.status !== 201) {\n throw new Error(`register: HTTP ${resp.status}`);\n }\n\n try {\n return (await resp.json()) as ClientRegistration;\n } catch (e) {\n throw new Error(`register: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Web OAuth 动态注册参数 */\nexport interface RegisterWebOAuthClientOptions {\n /** 客户端展示名 (RFC 7591 client_name) */\n clientName: string;\n /** 浏览器 Web OAuth 的 redirect_uri 列表 (如 [\"https://sign.zhonglvbao.com/login/callback\"]) */\n redirectURIs: string[];\n /** 可选 scope 列表 — 提供时以空格连接写入 RFC 7591 scope 字段 */\n scopes?: string[];\n}\n\n/**\n * 动态注册 Web OAuth (浏览器) 客户端,获取 client_id。\n *\n * 与 `register` (桌面 loopback, 硬编码 redirect_uri=127.0.0.1) 的区别:\n * 本函数允许传入任意 Web redirect_uri,供 csign 等第一方 Web 应用使用。\n * `token_endpoint_auth_method` 仍为 `none` (PKCE public client)。\n */\nexport async function registerWebOAuthClient(\n meta: ServerMetadata,\n opts: RegisterWebOAuthClientOptions,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<ClientRegistration> {\n const regReq = {\n client_name: opts.clientName,\n token_endpoint_auth_method: 'none',\n grant_types: ['authorization_code', 'refresh_token'],\n redirect_uris: opts.redirectURIs,\n response_types: ['code'],\n ...(opts.scopes ? { scope: opts.scopes.join(' ') } : {}),\n };\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetchImpl(meta.registration_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(regReq),\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`register: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n\n if (resp.status !== 200 && resp.status !== 201) {\n throw new Error(`register: HTTP ${resp.status}`);\n }\n\n try {\n return (await resp.json()) as ClientRegistration;\n } catch (e) {\n throw new Error(`register: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n// =============================================================================\n// PKCE\n// =============================================================================\n\n/** 生成 32 字节加密随机数,base64url 无填充编码 — PKCE verifier / state 共用随机源 */\nasync function randomBase64Url32(): Promise<string> {\n const c = await getCrypto();\n const b = new Uint8Array(32);\n c.getRandomValues(b);\n return base64urlNoPad(b);\n}\n\nasync function generateCodeVerifier(): Promise<string> {\n return randomBase64Url32();\n}\n\n/**\n * 生成 OAuth `state` 参数 — 32 字节加密随机数, base64url 无填充。\n *\n * 与 `generateCodeVerifier` 共用随机源 (`randomBase64Url32`)。Web OAuth 流程\n * 用它做 CSRF 防护: 授权请求带上 state, callback 回来必须逐字符比对。\n */\nexport async function generateState(): Promise<string> {\n return randomBase64Url32();\n}\n\nasync function codeChallenge(verifier: string): Promise<string> {\n const c = await getCrypto();\n const buf = await c.subtle.digest('SHA-256', new TextEncoder().encode(verifier));\n return base64urlNoPad(new Uint8Array(buf));\n}\n\nasync function getCrypto(): Promise<Crypto> {\n if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {\n return globalThis.crypto;\n }\n // Node ≤18 fallback (Node 19+ 自带 globalThis.crypto)\n const nodeCrypto = await import('node:crypto');\n return nodeCrypto.webcrypto as unknown as Crypto;\n}\n\nfunction base64urlNoPad(b: Uint8Array): string {\n let bin = '';\n for (let i = 0; i < b.length; i++) bin += String.fromCharCode(b[i]!);\n let s: string;\n if (typeof btoa === 'function') {\n s = btoa(bin);\n } else {\n // Node fallback\n s = Buffer.from(b).toString('base64');\n }\n return s.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n// =============================================================================\n// LoginWithHandler 事件模型\n// =============================================================================\n\nexport type LoginEventType = 'auth_url' | 'complete' | 'error';\n\nexport const EventAuthURL = 'auth_url' as const;\nexport const EventComplete = 'complete' as const;\nexport const EventError = 'error' as const;\n\nexport type LoginErrCode =\n | 'discovery_failed'\n | 'registration_failed'\n | 'browser_open_failed'\n | 'auth_denied'\n | 'auth_timeout'\n | 'token_exchange_failed'\n | 'ssl_proxy_detected'\n | 'state_mismatch'\n | 'credential_install_rejected';\n\nexport const ErrDiscovery = 'discovery_failed' as const;\nexport const ErrRegistration = 'registration_failed' as const;\nexport const ErrBrowserOpen = 'browser_open_failed' as const;\nexport const ErrAuthDenied = 'auth_denied' as const;\nexport const ErrTimeout = 'auth_timeout' as const;\nexport const ErrTokenExchange = 'token_exchange_failed' as const;\nexport const ErrSSLProxy = 'ssl_proxy_detected' as const;\n/** Web OAuth callback 的 state 与发起时不一致 (CSRF 防护) */\nexport const ErrStateMismatch = 'state_mismatch' as const;\n\n/** 登录流程事件 */\nexport interface LoginEvent {\n attemptId?: string;\n type: LoginEventType;\n url?: string;\n error?: string;\n err_code?: LoginErrCode;\n}\n\n/** 登录选项 (函数选项模式 → TS options object) */\nexport interface LoginOptions {\n /** 跳过自动打开浏览器 (由调用方控制浏览器) */\n skipBrowser?: boolean;\n /** SSO 场景下的 email 预填 */\n loginHint?: string;\n /** 如 \"sso\" */\n loginMethod?: string;\n /** 强制组织登录 */\n orgUUID?: string;\n /** 自定义 token 有效期 (秒) */\n expiresIn?: number;\n /**\n * 桌面 loopback 授权成功后, 把浏览器 302 重定向到此品牌成功页 URL,\n * 替代默认在 `127.0.0.1` 本地回环服务器渲染的\"授权成功\"HTML。\n *\n * 授权码仍先回投本地回环 (`codeResolver(code)` 不变), 安全模型不动 —\n * 只是把\"给浏览器看的那一屏\"从本地 HTML 换成 302 到调用方域名页,\n * 让地址栏显示业务域名而非 `127.0.0.1`。\n *\n * 取值约束: 必须是 `http(s)` 绝对 URL; 缺失或非法时回退本地 HTML (零回归)。\n * 多部署/多域名调用方 (acosmi.com / sign.zhonglvbao.com / FedStart 等) 必须\n * 传入随自身部署 origin 变化的 URL, **不可硬编码单一域名** —— 否则会把其他\n * 部署的桌面用户导向错误域名, 且该域名若未服务此页将 404。SDK 默认不重定向,\n * 由调用方显式 opt-in (确保目标页确实可达)。\n */\n successRedirectURL?: string;\n}\n\n/** 检测 SSL/TLS 相关错误 (企业代理 Zscaler 等) */\nexport function isSSLError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return msg.includes('tls:') || msg.includes('x509:') || msg.includes('certificate');\n}\n\n// =============================================================================\n// authorize (Node-only)\n// =============================================================================\n\nexport interface AuthorizeResult {\n code: string;\n redirectURI: string;\n}\n\n/**\n * 执行 OAuth 2.1 PKCE 授权流程 (Node only):\n * 1. 启动本地 HTTP server\n * 2. 打开浏览器让用户登录并授权\n * 3. 接收回调拿到 authorization code\n * 4. 返回 code 供后续 token 交换\n *\n * 浏览器环境会抛错 (无 loopback HTTP server)。\n * 浏览器侧 (v1.4.0+) 请改用本文件下方的 Web OAuth 原语:\n * createWebAuthorizationRequest + completeWebAuthorizationRequest\n * (SDK 负责 PKCE / state 校验; popup / redirect handler 由调用方实现)\n */\nexport async function authorize(\n meta: ServerMetadata,\n clientID: string,\n scopes: string[],\n opts: LoginOptions & { handler?: (e: LoginEvent) => void; signal?: AbortSignal } = {},\n): Promise<{ result: AuthorizeResult; verifier: string }> {\n if (typeof process === 'undefined' || !process.versions || !process.versions.node) {\n throw new Error('authorize requires Node.js environment (HTTP callback server)');\n }\n const handler = opts.handler;\n const signal = opts.signal;\n const emit = (e: LoginEvent) => {\n if (handler) handler(e);\n };\n\n const verifier = await generateCodeVerifier();\n const challenge = await codeChallenge(verifier);\n // [2026-08-14] 桌面 loopback 也发送并校验 state。\n //\n // 此前桌面流一律不带 state, 理由是\"本地回环天然防 CSRF\"。这个理由并不成立: 回环监听在整个\n // 流程期间对**本机任意进程**开放, 一个本地恶意进程只要往\n // http://127.0.0.1:<port>/callback?code=<攻击者的授权码> 打一枪, SDK 就会拿别人的授权码换\n // token, 把用户会话接到攻击者账号上 (login-CSRF)。端口随机但可枚举。state 让这枪必须先猜中\n // 32 字节随机数。Web 流早就有 state 校验, 这里补齐的是同一道闸。\n const state = await generateState();\n\n const http = await import('node:http');\n\n // 启动本地 callback server\n const server = http.createServer();\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', () => resolve());\n });\n const addr = server.address() as { port: number };\n const port = addr.port;\n const redirectURI = `http://127.0.0.1:${port}/callback`;\n\n let codeResolver!: (code: string) => void;\n let codeRejecter!: (err: Error) => void;\n const codePromise = new Promise<string>((resolve, reject) => {\n codeResolver = resolve;\n codeRejecter = reject;\n });\n // 回调可能在下面的 Promise.race 挂上处理器**之前**就被拒绝 (例如本地回环立刻收到一个\n // state 不匹配的请求)。先挂一个空 catch, 让 Node 不把它记成 unhandled rejection ——\n // 真正的错误仍由 race 里的同一个 promise 抛给调用方, 语义不变。\n codePromise.catch(() => {});\n\n server.on('request', (req, res) => {\n const url = new URL(req.url ?? '/', `http://127.0.0.1:${port}`);\n if (url.pathname !== '/callback') {\n res.statusCode = 404;\n res.end();\n return;\n }\n // state 校验对 /callback 的**每一种**形态先行 —— 成功回调、OAuth error 回调、畸形回调\n // 一视同仁, 且必须在消费 code / 结算 denied **之前**。否则本机任意进程不猜 state 也能\n // 伪造一发 ?error=access_denied 把等待中的登录打成\"用户已拒绝\" (login-DoS / 状态注入)。\n // \"恰好一个\": 重复 state 参数不允许蒙混 (searchParams.get 只取首值), 缺失与错值同罪。\n // 错误信息只描述形态, 不回显任何回调取值 (不记录 code / state / token / 完整 query)。\n const states = url.searchParams.getAll('state');\n const stateFailure =\n states.length === 0\n ? 'callback missing state'\n : states.length > 1\n ? 'callback carried multiple state values'\n : states[0] !== state\n ? 'callback state does not match pending state'\n : null;\n if (stateFailure !== null) {\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>授权失败</title></head>` +\n `<body style=\"font-family:system-ui,sans-serif;text-align:center;padding:60px 20px\">` +\n `<h2>授权失败</h2><p>回调校验未通过, 已中止登录。</p>` +\n `<p style=\"color:#888;font-size:14px\">可以关闭此窗口。</p>` +\n `</body></html>`,\n );\n codeRejecter(new Error(`authorize: ${ErrStateMismatch}: ${stateFailure} (possible CSRF)`));\n return;\n }\n const code = url.searchParams.get('code');\n if (!code) {\n const errMsg =\n url.searchParams.get('error_description') || url.searchParams.get('error') || '';\n const escaped = htmlEscape(errMsg);\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>授权失败</title></head>` +\n `<body style=\"font-family:system-ui,sans-serif;text-align:center;padding:60px 20px\">` +\n `<h2>授权失败</h2><p>${escaped}</p>` +\n `<p style=\"color:#888;font-size:14px\">可以关闭此窗口。</p>` +\n `</body></html>`,\n );\n codeRejecter(new Error(`authorization denied: ${errMsg}`));\n return;\n }\n // 成功页: 若调用方显式提供了品牌成功页 URL → 302 把浏览器导向业务域名\n // (地址栏显示自家域名而非 127.0.0.1); 否则保留本地成功 HTML (零回归)。\n // 无论哪条分支, 授权码都已在本地捕获 — codeResolver(code) 必须照常调用,\n // token 交换逻辑与安全模型完全不变。\n const successRedirect = resolveSuccessRedirect(opts.successRedirectURL);\n if (successRedirect) {\n res.statusCode = 302;\n res.setHeader('Location', successRedirect);\n res.end();\n } else {\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(\n `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>授权成功</title></head>` +\n `<body style=\"font-family:system-ui,sans-serif;text-align:center;padding:60px 20px\">` +\n `<h2>授权成功</h2>` +\n `<p>已完成身份认证, 请返回应用继续使用。</p>` +\n `<p style=\"color:#888;font-size:14px\">此窗口将在 3 秒后自动关闭…</p>` +\n `<script>setTimeout(function(){window.close()},3000)</script>` +\n `</body></html>`,\n );\n }\n codeResolver(code);\n });\n\n // 构造授权 URL\n const authURL = new URL(meta.authorization_endpoint);\n authURL.searchParams.set('client_id', clientID);\n authURL.searchParams.set('redirect_uri', redirectURI);\n authURL.searchParams.set('response_type', 'code');\n authURL.searchParams.set('code_challenge', challenge);\n authURL.searchParams.set('code_challenge_method', 'S256');\n authURL.searchParams.set('state', state);\n if (scopes.length > 0) {\n authURL.searchParams.set('scope', scopes.join(' '));\n }\n if (opts.loginHint) authURL.searchParams.set('login_hint', opts.loginHint);\n if (opts.loginMethod) authURL.searchParams.set('login_method', opts.loginMethod);\n if (opts.orgUUID) authURL.searchParams.set('orgUUID', opts.orgUUID);\n\n emit({ type: EventAuthURL, url: authURL.toString() });\n\n if (!opts.skipBrowser) {\n try {\n await openBrowser(authURL.toString());\n } catch (e) {\n // 浏览器打不开不阻塞 — 用户可通过 URL 手动打开\n emit({\n type: EventError,\n err_code: ErrBrowserOpen,\n url: authURL.toString(),\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n\n let abortHandler: (() => void) | undefined;\n try {\n const code = await Promise.race<string>([\n codePromise,\n new Promise<string>((_, reject) => {\n if (signal) {\n if (signal.aborted) {\n reject(new Error('authorization timed out'));\n return;\n }\n abortHandler = () => reject(new Error('authorization timed out'));\n signal.addEventListener('abort', abortHandler);\n }\n }),\n ]);\n return { result: { code, redirectURI }, verifier };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n if (msg.includes(ErrStateMismatch)) {\n emit({ type: EventError, err_code: ErrStateMismatch, error: msg });\n } else if (msg.includes('denied')) {\n emit({ type: EventError, err_code: ErrAuthDenied, error: msg });\n } else if (msg.includes('timed out')) {\n emit({ type: EventError, err_code: ErrTimeout, error: msg });\n } else {\n emit({ type: EventError, err_code: ErrTokenExchange, error: msg });\n }\n throw e;\n } finally {\n if (abortHandler && signal) signal.removeEventListener('abort', abortHandler);\n // close() 只停止接受新连接; Node 18 上浏览器残留的 idle keep-alive 连接会让端口\n // 迟迟不真正释放 (Node 19+ 才随 close 一并关 idle)。登录已结算, 显式关掉 idle 连接,\n // 让每条终止路径都以\"端口完全关闭\"收尾。响应都在结算前已 end(), 不存在截断风险。\n server.close();\n server.closeIdleConnections?.();\n }\n}\n\nfunction htmlEscape(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * 校验调用方提供的桌面授权成功页重定向 URL。\n *\n * 仅接受 `http(s)` 绝对 URL —— 拒绝 `javascript:` / `data:` 等其他协议, 防止\n * 把本地回环成功页变成开放重定向到任意协议的跳板 (纵深防御; 即便取值来自\n * 调用方静态配置)。缺失或非法时返回 `null`, 调用方据此回退本地成功 HTML。\n */\nfunction resolveSuccessRedirect(raw?: string): string | null {\n if (!raw) return null;\n try {\n const u = new URL(raw);\n if (u.protocol !== 'http:' && u.protocol !== 'https:') return null;\n return u.toString();\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Web OAuth (浏览器整页重定向流程)\n// =============================================================================\n\n/**\n * Web OAuth 授权请求 — `createWebAuthorizationRequest` 的返回结构。\n *\n * 发起方 (csign Next Route Handler 等) 应把整个对象作为 pending 状态持久化\n * (HttpOnly cookie 等),callback 回来时取出供 `completeWebAuthorizationRequest` 校验。\n */\nexport interface WebAuthorizationRequest {\n /** 完整授权 URL — 浏览器整页跳转到此地址 */\n authUrl: string;\n /** CSRF state — callback 必须回传同值 */\n state: string;\n /** PKCE code_verifier — 换 token 时使用, 切勿泄露给浏览器 URL */\n verifier: string;\n /** 动态注册得到的 client_id */\n clientID: string;\n /** 本次授权使用的 redirect_uri */\n redirectURI: string;\n /** OAuth issuer / SDK 业务域名 (用于 callback 阶段重新发现 metadata) */\n serverURL: string;\n /** 创建时间戳 (Date.now()),发起方可据此实现 TTL 过期判定 */\n createdAt: number;\n}\n\n/** `createWebAuthorizationRequest` 参数 */\nexport interface CreateWebAuthorizationRequestOptions {\n /** 动态注册得到的 client_id */\n clientID: string;\n /** redirect_uri (须与动态注册登记的一致) */\n redirectURI: string;\n /** 请求的 scope 列表 — 以空格连接写入 authUrl */\n scopes: string[];\n /** OAuth issuer / SDK 业务域名 */\n serverURL: string;\n /** 可选 — SSO 场景下预填邮箱 */\n loginHint?: string;\n}\n\n/**\n * 构造 Web OAuth 授权请求。\n *\n * 生成 PKCE verifier + S256 challenge + CSRF state,按 OAuth 2.1 拼装授权 URL。\n * (自 2026-08-14 起桌面 `authorize` 同样带 state 并在回调时校验; Web 流程本就必须带。)\n *\n * 返回的 `WebAuthorizationRequest` 应整体持久化为 pending 状态,\n * callback 阶段交给 `completeWebAuthorizationRequest`。\n */\nexport async function createWebAuthorizationRequest(\n meta: ServerMetadata,\n opts: CreateWebAuthorizationRequestOptions,\n): Promise<WebAuthorizationRequest> {\n const verifier = await generateCodeVerifier();\n const challenge = await codeChallenge(verifier);\n const state = await generateState();\n\n const authURL = new URL(meta.authorization_endpoint);\n authURL.searchParams.set('response_type', 'code');\n authURL.searchParams.set('client_id', opts.clientID);\n authURL.searchParams.set('redirect_uri', opts.redirectURI);\n authURL.searchParams.set('code_challenge', challenge);\n authURL.searchParams.set('code_challenge_method', 'S256');\n authURL.searchParams.set('state', state);\n authURL.searchParams.set('scope', opts.scopes.join(' '));\n if (opts.loginHint) {\n authURL.searchParams.set('login_hint', opts.loginHint);\n }\n\n return {\n authUrl: authURL.toString(),\n state,\n verifier,\n clientID: opts.clientID,\n redirectURI: opts.redirectURI,\n serverURL: opts.serverURL,\n createdAt: Date.now(),\n };\n}\n\n/** `completeWebAuthorizationRequest` 的 pending 状态 (即 WebAuthorizationRequest 的子集) */\nexport interface WebAuthorizationPending {\n state: string;\n verifier: string;\n clientID: string;\n redirectURI: string;\n serverURL: string;\n}\n\n/** `completeWebAuthorizationRequest` 的 callback 参数 */\nexport interface WebAuthorizationCallbackParams {\n /** 授权服务器回传的 authorization code */\n code: string;\n /** 授权服务器回传的 state — 必须与 pending.state 一致 */\n state: string;\n}\n\n/**\n * 完成 Web OAuth 授权 — 校验 state → 换 token → 返回可持久化的 TokenSet。\n *\n * `pending` 为 `createWebAuthorizationRequest` 返回对象 (或其等价持久化结构);\n * `params` 为 callback URL 解析出的 `code` / `state`。\n *\n * state 不匹配时抛错 (CSRF 防护)。内部依次:\n * discoverWebOAuthMetadata(pending.serverURL) → exchangeCode(...) → newTokenSet(...)。\n */\nexport async function completeWebAuthorizationRequest(\n pending: WebAuthorizationPending,\n params: WebAuthorizationCallbackParams,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenSet> {\n if (!params.code) {\n throw new Error('completeWebAuthorizationRequest: missing authorization code');\n }\n if (params.state !== pending.state) {\n throw new Error(\n `completeWebAuthorizationRequest: ${ErrStateMismatch}: callback state does not match pending state (possible CSRF)`,\n );\n }\n\n const meta = await discoverWebOAuthMetadata(pending.serverURL, signal, fetchImpl);\n const resp = await exchangeCode(\n meta,\n pending.clientID,\n params.code,\n pending.redirectURI,\n pending.verifier,\n signal,\n fetchImpl,\n );\n return newTokenSet(resp, pending.clientID, pending.serverURL);\n}\n\n// =============================================================================\n// Token Exchange\n// =============================================================================\n\nexport async function exchangeCode(\n meta: ServerMetadata,\n clientID: string,\n code: string,\n redirectURI: string,\n codeVerifier: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const data = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: clientID,\n code,\n redirect_uri: redirectURI,\n code_verifier: codeVerifier,\n });\n return postToken(meta.token_endpoint, data, signal, fetchImpl);\n}\n\n/** 与 exchangeCode 相同, 但附带 expires_in 参数 (setup-token 模式) */\nexport async function exchangeCodeWithExpiry(\n meta: ServerMetadata,\n clientID: string,\n code: string,\n redirectURI: string,\n codeVerifier: string,\n expiresIn: number,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const data = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: clientID,\n code,\n redirect_uri: redirectURI,\n code_verifier: codeVerifier,\n expires_in: String(expiresIn),\n });\n return postToken(meta.token_endpoint, data, signal, fetchImpl);\n}\n\n/** 刷新 access_token */\nexport async function refreshToken(\n meta: ServerMetadata,\n clientID: string,\n refreshTokenValue: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const data = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: clientID,\n refresh_token: refreshTokenValue,\n });\n return postToken(meta.token_endpoint, data, signal, fetchImpl);\n}\n\n/** 吊销 token. 服务端不支持吊销时静默跳过. */\nexport async function revokeToken(\n meta: ServerMetadata,\n token: string,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<void> {\n if (!meta.revocation_endpoint || meta.revocation_endpoint === '') {\n return;\n }\n const data = new URLSearchParams({ token });\n\n const ctl = withTimeout(authTimeoutMs, signal);\n try {\n await fetchImpl(meta.revocation_endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: data,\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`revoke: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n ctl.dispose();\n }\n}\n\nasync function postToken(\n endpoint: string,\n data: URLSearchParams,\n signal?: AbortSignal,\n fetchImpl: typeof fetch = globalThis.fetch,\n): Promise<TokenResponse> {\n const ctl = withTimeout(authTimeoutMs, signal);\n try {\n let resp: Response;\n try {\n resp = await fetchImpl(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: data,\n signal: ctl.signal,\n });\n } catch (e) {\n throw new Error(`token request: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n if (!resp.ok) {\n let errBody: { error?: unknown; error_description?: unknown } = {};\n try {\n errBody = (await resp.json()) as { error?: unknown; error_description?: unknown };\n } catch {\n // ignore\n }\n const oauthError = typeof errBody.error === 'string' ? errBody.error : '';\n const errorDescription =\n typeof errBody.error_description === 'string' ? errBody.error_description : '';\n throw new OAuthTokenEndpointError(resp.status, oauthError, errorDescription);\n }\n\n try {\n return (await resp.json()) as TokenResponse;\n } catch (e) {\n throw new Error(`token: decode: ${e instanceof Error ? e.message : String(e)}`);\n }\n } finally { ctl.dispose(); }\n}\n\n/**\n * 从 TokenResponse 构造可持久化的 TokenSet\n *\n * 根因修复 #14: expires_in=0 会导致 token 立即过期 → 无限刷新循环\n * 最少保证 60 秒有效期\n */\nexport function newTokenSet(resp: TokenResponse, clientID: string, serverURL: string): TokenSet {\n let expiresIn = resp.expires_in;\n if (expiresIn < 60) expiresIn = 60;\n return {\n access_token: resp.access_token,\n refresh_token: resp.refresh_token ?? '',\n expires_at: new Date(Date.now() + expiresIn * 1000).toISOString(),\n scope: resp.scope ?? '',\n client_id: clientID,\n server_url: serverURL,\n };\n}\n\n// =============================================================================\n// Browser launch (Node-only)\n// =============================================================================\n\nasync function openBrowser(url: string): Promise<void> {\n const { spawn } = await import('node:child_process');\n let cmd: string;\n let args: string[];\n switch (process.platform) {\n case 'darwin':\n cmd = 'open';\n args = [url];\n break;\n case 'linux':\n cmd = 'xdg-open';\n args = [url];\n break;\n case 'win32':\n cmd = 'rundll32';\n args = ['url.dll,FileProtocolHandler', url];\n break;\n default:\n throw new Error(`unsupported platform: ${process.platform}`);\n }\n return new Promise<void>((resolve, reject) => {\n try {\n const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });\n child.on('error', reject);\n child.unref();\n resolve();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\ninterface TimeoutController {\n signal: AbortSignal;\n dispose: () => void;\n}\n\n/** 创建一个组合 abort signal: 超时 + 外部 signal 任一触发都 abort */\nfunction withTimeout(ms: number, parent?: AbortSignal): TimeoutController {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), ms);\n let parentHandler: (() => void) | undefined;\n if (parent) {\n if (parent.aborted) {\n ctl.abort();\n } else {\n parentHandler = () => ctl.abort();\n parent.addEventListener('abort', parentHandler);\n }\n }\n return {\n signal: ctl.signal,\n dispose() {\n clearTimeout(timer);\n if (parentHandler && parent) parent.removeEventListener('abort', parentHandler);\n },\n };\n}\n","// store.ts — 端口自 acosmi-sdk-go/store.go (跨端扩展)\n//\n// Go 侧仅 FileTokenStore (Node 风格 ~/.acosmi/tokens.json)。\n// TS 端口扩展为多端: Node File / Browser localStorage / 内存 (兜底).\n//\n// 接口异步化: Go 同步 IO, TS 必须 async。所有 Save/Load/Clear 返回 Promise。\n\nimport type { TokenSet } from '../auth/types';\nimport { isValidTokenSet } from '../auth/types';\n\nexport type CredentialState =\n | 'signed_out'\n | 'pending_identity'\n | 'ready'\n | 'refresh_reserved'\n | 'refresh_dispatched'\n | 'reauth_required'\n | 'configuration_error';\n\nexport type CredentialReason =\n | 'invalid_grant'\n | 'refresh_outcome_unknown'\n | 'migration_required'\n | 'identity_unavailable'\n | 'invalid_client'\n | 'invalid_scope'\n | 'unsupported_grant_type'\n | 'auth_contract_unsupported';\n\nexport interface CredentialAuthorityConfig {\n serverURL: string;\n issuer: string;\n oauthProfile: 'desktop';\n authContractVersion: 2;\n errorContractVersion: 1;\n}\n\nexport interface CredentialPrincipal {\n issuer: string;\n subject: string;\n organizationId: string | null;\n}\n\nexport interface CredentialRefreshOperation {\n operationId: string;\n sessionId: string;\n baseRevision: string;\n phase: 'reserved' | 'dispatched';\n returnState: 'ready' | 'pending_identity';\n startedAt: string;\n dispatchedAt: string | null;\n deadlineAt: string | null;\n}\n\nexport interface CredentialLoginAttempt {\n attemptId: string;\n baseSessionId: string | null;\n startedAt: string;\n}\n\nexport interface VerifiedCredentialIdentity {\n authSessionId: string;\n principal: CredentialPrincipal;\n displayName?: string;\n avatarUrl?: string;\n email?: string;\n imageUrl?: string;\n accountCreatedAt?: string;\n requiresPhoneBinding?: boolean;\n hasExtraUsageEnabled?: boolean;\n billingType?: string;\n subscriptionCreatedAt?: string;\n rateLimitTier?: string;\n organizationName?: string;\n verifiedAt: string;\n}\n\nexport interface CredentialMutationReceipt {\n mutationId: string;\n operationId: string | null;\n resultRevision: string;\n}\n\n/** Durable authoritative snapshot. Revisions are decimal strings to avoid JS truncation. */\nexport interface CredentialSnapshot {\n storeInstanceId: string;\n authorityConfig: CredentialAuthorityConfig | null;\n revision: string;\n authSessionId: string | null;\n principal: CredentialPrincipal | null;\n credentialState: CredentialState;\n tokenSet: TokenSet | null;\n refreshOperation: CredentialRefreshOperation | null;\n loginAttempt: CredentialLoginAttempt | null;\n reason: CredentialReason | null;\n lastMutation: CredentialMutationReceipt | null;\n lastLoginAttemptId: string | null;\n verifiedIdentity: VerifiedCredentialIdentity | null;\n}\n\nexport type CredentialRequestOwner = Pick<\n CredentialSnapshot,\n 'storeInstanceId' | 'authSessionId' | 'principal'\n>;\n\nexport interface CredentialCASExpected {\n storeInstanceId: string;\n revision: string;\n authSessionId: string | null;\n state: CredentialState;\n operationId: string | null;\n}\n\nexport type CredentialCASResult =\n | { status: 'committed'; snapshot: CredentialSnapshot }\n | { status: 'superseded'; snapshot: CredentialSnapshot }\n | { status: 'storage_error'; error: unknown };\n\n/** Explicit opt-in store; versioned mode never calls TokenStore.save/load/clear. */\nexport interface VersionedCredentialStore {\n readSnapshot(signal?: AbortSignal): Promise<CredentialSnapshot>;\n compareAndSwap(\n expected: CredentialCASExpected,\n nextState: CredentialSnapshot,\n mutationId: string,\n signal?: AbortSignal,\n ): Promise<CredentialCASResult>;\n}\n\n/**\n * Token 持久化接口\n * 桌面智能体可自行实现 (如 macOS Keychain / Windows Credential Manager)\n *\n * 跨端约定:\n * - Save: 写入持久化, 失败抛 Error\n * - Load: 读取, 不存在返回 null (与 Go IsNotExist 行为一致)\n * - Clear: 删除, 不存在不抛错 (Logout 后 Clear 不应报错, [RC-11])\n * - withLock (v1.0.2 新增, 可选): 跨进程临界区. Client 在 refresh token rotation\n * 场景下用此包裹 \"load → check → refresh → save\" 整段, 防多进程共享同一 store\n * (典型: FileTokenStore 默认 ~/.acosmi/tokens.json) 撞 HTTP 400 refresh token\n * not found. 不实现时 Client 自动回退到仅进程内串行 (LocalStorage / InMemory\n * 单进程语义无需此方法).\n */\nexport interface TokenStore {\n save(tokens: TokenSet): Promise<void>;\n load(): Promise<TokenSet | null>;\n clear(): Promise<void>;\n withLock?<T>(fn: () => Promise<T>): Promise<T>;\n}\n\n// ============================================================================\n// FileTokenStore — Node 文件实现\n// ============================================================================\n\n/**\n * 基于文件的 token 存储 (开发/测试用)\n * 生产环境建议替换为系统钥匙串实现\n *\n * 默认路径: ~/.acosmi/tokens.json\n *\n * 浏览器环境调用 new FileTokenStore() 会抛错 — 浏览器请用 LocalStorageTokenStore 或 InMemoryTokenStore.\n */\n/** 跨进程文件锁配置 (v1.0.2). 公开常量是为了让 caller / 测试可观察, 不建议生产代码改. */\nexport const fileLockDefaults = {\n /** 获取锁的超时上限 (毫秒). refresh 流程含网络 < 30s, 30s 已远超正常完成时间. */\n acquireTimeoutMs: 30_000,\n /** 旧锁判定阈值 (毫秒). 锁文件 mtime 早于此值视为 stale 进程崩溃残留, 自动 break. */\n staleMs: 60_000,\n /** 重试间隔基数 (毫秒). 真实间隔 = base + random(0, jitter). */\n retryBaseMs: 30,\n retryJitterMs: 70,\n} as const;\n\nexport class FileTokenStore implements TokenStore {\n private path: string;\n /** 进程内串行化 (Promise chain) — 与跨进程 flock 配合, 避免单进程内并发持锁产生死锁式互等. */\n private chain: Promise<void> = Promise.resolve();\n\n constructor(path?: string) {\n if (typeof process === 'undefined' || !process.versions || !process.versions.node) {\n throw new Error('FileTokenStore requires Node.js environment; use LocalStorageTokenStore or InMemoryTokenStore in browser');\n }\n if (path && path !== '') {\n this.path = path;\n } else {\n // 延迟初始化 — constructor 不能 async, 用 lazy resolve\n this.path = '';\n }\n }\n\n private async resolvePath(): Promise<string> {\n if (this.path && this.path !== '') return this.path;\n const os = await import('node:os');\n const path = await import('node:path');\n this.path = path.join(os.homedir(), '.acosmi', 'tokens.json');\n return this.path;\n }\n\n /** 进程内串行 (维持 v1.0.1 单进程语义). flock 之外另一层防御: 如果用户自己就是单进程\n * 并发场景, 不必每次都进 flock 旁路文件 IO. */\n private withChain<T>(fn: () => Promise<T>): Promise<T> {\n const next = this.chain.then(fn, fn);\n this.chain = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n /**\n * 跨进程临界区. 用 sidecar `<path>.lock` 文件 + O_EXCL 创建语义实现互斥:\n * - 创建成功 = 持有锁; 写入 pid+timestamp 便于诊断\n * - 创建失败 (EEXIST) = 别的进程持锁, backoff 重试\n * - 锁文件 mtime > staleMs = 进程崩溃残留, unlink 后重试\n * - acquireTimeoutMs 超时 = 抛错 (caller 应作为 transient error 处理, 上层 retry)\n *\n * 注意: O_EXCL 在 NFS 上不保证原子; FileTokenStore 适用于本地文件系统 (典型用户家目录).\n * 真要跨机共享 token, 应实现自定义 Keychain / 数据库 store, 不要用 FileTokenStore.\n */\n async withLock<T>(fn: () => Promise<T>): Promise<T> {\n // 注意: 不能用 withChain 包裹 — fn 内部调 save/load 也走 withChain 会死锁 (re-entrant\n // 不支持). 跨进程互斥已由 sidecar .lock 文件保证; 同一 Client 内并发由上层 withMu 串行;\n // 同一进程不同 Client 实例并发是预期场景, 走 flock 重试路径.\n const fs = await import('node:fs/promises');\n const pathMod = await import('node:path');\n const p = await this.resolvePath();\n const lockPath = `${p}.lock`;\n const dir = pathMod.dirname(p);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n\n const startMs = Date.now();\n let release: (() => Promise<void>) | null = null;\n while (true) {\n try {\n // 'wx' = O_CREAT | O_EXCL | O_WRONLY → 已存在抛 EEXIST\n const fh = await fs.open(lockPath, 'wx', 0o600);\n try {\n await fh.writeFile(`${process.pid}\\n${Date.now()}\\n`, 'utf8');\n } finally {\n await fh.close();\n }\n release = async () => {\n try {\n await fs.unlink(lockPath);\n } catch {\n // best-effort — 释放期间被 stale-break 删除是允许的\n }\n };\n break;\n } catch (e) {\n if (!isAlreadyExistsError(e)) throw e;\n // 锁被别的进程持有 — stale 检测\n let stale = false;\n try {\n const st = await fs.stat(lockPath);\n if (Date.now() - st.mtimeMs > fileLockDefaults.staleMs) stale = true;\n } catch {\n // 锁文件刚刚消失 → 立即重试 acquire\n continue;\n }\n if (stale) {\n try {\n await fs.unlink(lockPath);\n } catch {\n // 别人先删了, 没关系\n }\n continue;\n }\n if (Date.now() - startMs > fileLockDefaults.acquireTimeoutMs) {\n throw new Error(\n `acquire token file lock timeout (${fileLockDefaults.acquireTimeoutMs}ms): ${lockPath}`,\n );\n }\n const waitMs =\n fileLockDefaults.retryBaseMs + Math.random() * fileLockDefaults.retryJitterMs;\n await new Promise((r) => setTimeout(r, waitMs));\n }\n }\n try {\n return await fn();\n } finally {\n if (release) await release();\n }\n }\n\n /**\n * 写入 token. 流程:\n * 1. mkdir -p (默认路径目录)\n * 2. 写入 `<path>.tmp.<pid>`\n * 3. fsync 后 rename 到正式路径 (POSIX 上 rename(2) 同分区原子, Windows 上 ReplaceFile)\n *\n * 选择 atomic rename 而非直接 writeFile: 多进程并发或本进程崩溃时, 读端永远看到的是\n * 完整的旧/新 JSON, 不会读到截断半文件 (Client.create.store.load 可能在另一进程\n * 写入中间触发, atomic rename 避免它解析失败).\n */\n save(tokens: TokenSet): Promise<void> {\n return this.withChain(async () => {\n const fs = await import('node:fs/promises');\n const pathMod = await import('node:path');\n const p = await this.resolvePath();\n const dir = pathMod.dirname(p);\n await fs.mkdir(dir, { recursive: true, mode: 0o700 });\n const tmp = `${p}.tmp.${process.pid}.${Date.now()}.${Math.floor(Math.random() * 1e6)}`;\n const data = JSON.stringify(tokens, null, 2);\n\n // 1) 写 tmp + fsync 文件: 内容真正落盘 (writeFile 仅写入 page cache, 进程/机器\n // 崩溃时 rename 后可能得到 0 字节或旧内容). 注释承诺 \"fsync 后 rename\", 这里兑现。\n {\n const fh = await fs.open(tmp, 'w', 0o600);\n try {\n await fh.writeFile(data, { encoding: 'utf8' });\n await fh.sync(); // fsync — 文件内容 durable\n } finally {\n await fh.close();\n }\n }\n\n try {\n await fs.rename(tmp, p);\n } catch (e) {\n // rename 失败 — 清理 tmp 防泄漏\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore\n }\n throw e;\n }\n\n // 2) 对目录 fsync: 让 rename 产生的目录项 (新文件名 → inode 的绑定) durable,\n // 否则崩溃后目录项可能丢失。跨平台: Windows / 部分 FS 上对目录 open/fsync 会抛\n // (EISDIR/EPERM/ENOTSUP), 这是平台不支持目录 fsync, 不应让 save 失败 —— 文件内容\n // 已 fsync, 目录项 durability 退化为依赖 OS, 与原 atomic rename 语义一致。\n try {\n const dirHandle = await fs.open(dir, 'r');\n try {\n await dirHandle.sync();\n } finally {\n await dirHandle.close();\n }\n } catch {\n // 平台不支持对目录 fsync — 吞掉, 不影响 save 成功。\n }\n });\n }\n\n load(): Promise<TokenSet | null> {\n return this.withChain(async () => {\n const fs = await import('node:fs/promises');\n const p = await this.resolvePath();\n try {\n const data = await fs.readFile(p, 'utf8');\n // 损坏 / 截断 JSON / 缺字段 / 旧版本残留 → 视为无有效 token (返回 null),\n // 不抛错: caller (Client.create) 会据此重新走 Login, 而不是整个初始化失败。\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (!isValidTokenSet(parsed)) return null;\n return parsed;\n } catch (e) {\n if (isNotExistError(e)) return null;\n throw new Error(\n `read token file: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n });\n }\n\n clear(): Promise<void> {\n return this.withChain(async () => {\n const fs = await import('node:fs/promises');\n const p = await this.resolvePath();\n try {\n await fs.unlink(p);\n } catch (e) {\n if (isNotExistError(e)) return;\n throw e;\n }\n });\n }\n}\n\nfunction isNotExistError(e: unknown): boolean {\n if (typeof e === 'object' && e !== null && 'code' in e) {\n return (e as { code: unknown }).code === 'ENOENT';\n }\n return false;\n}\n\nfunction isAlreadyExistsError(e: unknown): boolean {\n if (typeof e === 'object' && e !== null && 'code' in e) {\n return (e as { code: unknown }).code === 'EEXIST';\n }\n return false;\n}\n\n/**\n * 创建文件 token 存储 (与 Go NewFileTokenStore 等价)\n * @param path 自定义路径; 空则使用默认 ~/.acosmi/tokens.json\n */\nexport function newFileTokenStore(path?: string): FileTokenStore {\n return new FileTokenStore(path);\n}\n\n// ============================================================================\n// LocalStorageTokenStore — Browser 实现\n// ============================================================================\n\n/**\n * 基于 LocalStorage 的 token 存储 (浏览器)\n *\n * 仅在浏览器环境可用 (检测 globalThis.localStorage)。\n * 不持久化跨设备同步, 适合单机 SPA 使用。\n */\nexport class LocalStorageTokenStore implements TokenStore {\n private key: string;\n\n constructor(key = 'acosmi.tokens') {\n if (typeof globalThis.localStorage === 'undefined') {\n throw new Error('LocalStorageTokenStore requires browser environment');\n }\n this.key = key;\n }\n\n async save(tokens: TokenSet): Promise<void> {\n globalThis.localStorage.setItem(this.key, JSON.stringify(tokens));\n }\n\n async load(): Promise<TokenSet | null> {\n const data = globalThis.localStorage.getItem(this.key);\n if (data == null || data === '') return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n // 与 FileTokenStore 一致: 缺字段 / 类型错 / 旧版本残留 → 当作无 token。\n if (!isValidTokenSet(parsed)) return null;\n return parsed;\n }\n\n async clear(): Promise<void> {\n globalThis.localStorage.removeItem(this.key);\n }\n}\n\n// ============================================================================\n// InMemoryTokenStore — 兜底实现 (不持久化)\n// ============================================================================\n\n/**\n * 内存 token 存储 (不持久化, 进程重启即丢失)\n * 适合: 测试 / Deno script / 短期 SDK 调用 / 不希望落盘的安全场景\n */\nexport class InMemoryTokenStore implements TokenStore {\n private tokens: TokenSet | null = null;\n\n async save(tokens: TokenSet): Promise<void> {\n this.tokens = tokens;\n }\n\n async load(): Promise<TokenSet | null> {\n return this.tokens;\n }\n\n async clear(): Promise<void> {\n this.tokens = null;\n }\n}\n","// retry.ts — 端口自 acosmi-sdk-go/retry.go\n// L6 (2026-04-27, v0.15): SDK 内置 retry policy\n//\n// 设计目标:\n// 1. GET 类查询 (skill-store/models/balance) 默认 2x retry, 稳定性提升\n// 2. POST 类业务 (chat/messages/upload) 默认 0 retry — 计费安全红线 (双扣保护)\n// 3. Stream 路径强制 maxAttempts=1 — 流式 SSE 已部分写出, 重试 = 双 token 重复消息\n// 4. 401 refresh 与 retry 互斥 — refresh 是 inner loop, 不算 attempt\n// 5. AbortSignal aborted 立即返回 — 用户 abort 不重试\n// 6. StreamError 显式排除 — V2 P0 SSE 中段错误不可重试\n//\n// 与类型化错误协作:\n// - HTTPError 5xx/429 → 默认可重试\n// - NetworkError isTimeout()/isEOF() → 默认可重试\n// - 其他 → 不重试\n\nimport { HTTPError, NetworkError, StreamError } from '../shared/errors';\n\n/** 表示一次 retry 评估的请求快照 — 仅供 SafeToRetry 闸门使用 */\nexport interface RetryRequestInfo {\n method: string;\n url: string;\n}\n\n/**\n * 配置 SDK 重试行为.\n *\n * undefined 字段使用 DefaultRetryPolicy 对应字段; null/undefined RetryPolicy 自身禁用重试.\n */\nexport interface RetryPolicy {\n /** 总尝试次数 (含首次). 1 = 不重试; 默认 2. */\n maxAttempts?: number;\n /** 首次重试退避时长 (毫秒). 默认 200. */\n backoffMs?: number;\n /** 退避最大值 (指数增长封顶, 毫秒). 默认 2000. */\n backoffMaxMs?: number;\n /** 指数倍数. 默认 2.0. */\n backoffMul?: number;\n\n /**\n * 错误层闸门: 是否值得重试.\n * 默认 defaultRetryable: HTTPError 5xx/429, NetworkError Timeout/EOF, 排除 StreamError.\n */\n onRetryable?: (err: unknown) => boolean;\n\n /**\n * 请求层闸门 (计费安全核心): 当前请求是否值得重试.\n * 默认 defaultSafeToRetry: GET/HEAD/OPTIONS true, 其他 false.\n * chat/messages/upload POST → 默认 false 兜底, 双扣绝不发生.\n */\n safeToRetry?: (req: RetryRequestInfo) => boolean;\n}\n\n/**\n * 安全默认值.\n *\n * 计费安全红线: safeToRetry 默认 POST=false → chat/messages 用户 0 行为变化.\n * GET 类查询 (skill-store/models/balance) 自动得 2x 稳定性.\n */\nexport const DefaultRetryPolicy: Required<Omit<RetryPolicy, never>> = {\n maxAttempts: 2,\n backoffMs: 200,\n backoffMaxMs: 2000,\n backoffMul: 2.0,\n onRetryable: defaultRetryable,\n safeToRetry: defaultSafeToRetry,\n};\n\n/**\n * 计费安全闸门.\n *\n * 仅以下 method 视为幂等:\n * - GET / HEAD / OPTIONS: 天然幂等\n *\n * POST/PUT/DELETE/PATCH 默认 false (双扣保护). 调用方需要 GET 类 POST 重试可自定义 safeToRetry.\n */\nexport function defaultSafeToRetry(req: RetryRequestInfo): boolean {\n switch (req.method.toUpperCase()) {\n case 'GET':\n case 'HEAD':\n case 'OPTIONS':\n return true;\n }\n return false;\n}\n\n/**\n * 错误层闸门.\n *\n * 显式排除 (优先级最高):\n * - StreamError: V2 P0 SSE 中段错误, 流已部分写出, 重试 = 双 token + 重复消息\n * - AbortSignal aborted: 用户主动 abort, 重试无意义 (TS 中由调用方在 onRetryable 之前检查)\n *\n * 视为可重试:\n * - HTTPError 5xx 或 429\n * - NetworkError isTimeout() 或 isEOF()\n *\n * 其他 (如 4xx 业务错误 / DNS 失败 / BusinessError): 不重试\n */\nexport function defaultRetryable(err: unknown): boolean {\n if (err == null) return false;\n if (err instanceof StreamError) return false;\n if (err instanceof HTTPError) {\n return err.statusCode >= 500 || err.statusCode === 429;\n }\n if (err instanceof NetworkError) {\n return err.isTimeout() || err.isEOF();\n }\n return false;\n}\n\n/** 实际生效策略 (undefined → DefaultRetryPolicy 兜底; 字段缺失填默认值) */\nexport function effectivePolicy(p: RetryPolicy | null | undefined): Required<RetryPolicy> | null {\n if (p == null) return null; // 显式禁用\n const out: Required<RetryPolicy> = {\n maxAttempts: p.maxAttempts && p.maxAttempts > 0 ? p.maxAttempts : DefaultRetryPolicy.maxAttempts,\n backoffMs: p.backoffMs && p.backoffMs > 0 ? p.backoffMs : DefaultRetryPolicy.backoffMs,\n backoffMaxMs:\n p.backoffMaxMs && p.backoffMaxMs > 0 ? p.backoffMaxMs : DefaultRetryPolicy.backoffMaxMs,\n backoffMul: p.backoffMul && p.backoffMul > 0 ? p.backoffMul : DefaultRetryPolicy.backoffMul,\n onRetryable: p.onRetryable ?? defaultRetryable,\n safeToRetry: p.safeToRetry ?? defaultSafeToRetry,\n };\n return out;\n}\n\n/** Retry-After 头的硬上限 — 防止恶意服务器返回 Retry-After: 999999 卡死 */\nconst retryAfterUpperBoundMs = 60_000;\n\n/**\n * 计算第 attempt 次重试的退避时长 (毫秒, attempt 从 0 起).\n * 优先级: HTTPError.retryAfter (上限 60s) > 指数退避 (backoffMs * backoffMul^attempt, 封顶 backoffMaxMs)\n */\nexport function computeBackoff(p: Required<RetryPolicy>, attempt: number, err: unknown): number {\n if (err instanceof HTTPError && err.retryAfter > 0) {\n const ms = err.retryAfter * 1000;\n return Math.min(ms, retryAfterUpperBoundMs);\n }\n let d = p.backoffMs;\n for (let i = 0; i < attempt; i++) {\n d = d * p.backoffMul;\n if (d > p.backoffMaxMs) return p.backoffMaxMs;\n }\n return d;\n}\n","// stream-meta.ts — 端口自 acosmi-sdk-go/stream_meta.go\n//\n// Anthropic SSE 事件的 content block 元数据解析。\n// 把 content_block_start 中的 index / type / acosmi_ephemeral 记入 blockTypeMap,\n// 供 delta/stop 查表回填 StreamEvent 的 blockIndex / blockType / ephemeral 三字段。\n//\n// 设计要点:\n// - in-band 标记: ephemeral 随 content_block_start 的 JSON payload 到达,\n// 无需独立 SSE 事件, 零额外缓冲, 零顺序依赖, 零延迟。\n// - 惰性解析: 只对 3 种 content_block_* 事件解 JSON, 其他事件跳过。\n// - 单流 map: 由单 async iterator 拥有 (SSE 扫描循环), 无锁。stop 后删表项, 防长流累积。\n\n/** SDK 为单个 content block 缓存的元数据 */\nexport interface BlockMeta {\n type: string;\n ephemeral: boolean;\n}\n\n/**\n * 按 Anthropic SSE 事件类型解析 data, 更新 blockTypeMap, 返回 [index, type, ephemeral]。\n *\n * 仅当事件为 content_block_start / content_block_delta / content_block_stop\n * 时返回非空 type; 其他事件返回空 type, 调用方据此判别是否填充 StreamEvent 元数据字段。\n */\nexport function extractAnthropicBlockMeta(\n eventType: string,\n data: string,\n blockTypeMap: Map<number, BlockMeta>,\n): [number, string, boolean] {\n switch (eventType) {\n case 'content_block_start': {\n let payload: { index?: number; content_block?: { type?: string; acosmi_ephemeral?: boolean } };\n try {\n payload = JSON.parse(data);\n } catch {\n return [0, '', false];\n }\n const index = payload.index ?? 0;\n const meta: BlockMeta = {\n type: payload.content_block?.type ?? '',\n ephemeral: payload.content_block?.acosmi_ephemeral ?? false,\n };\n blockTypeMap.set(index, meta);\n return [index, meta.type, meta.ephemeral];\n }\n case 'content_block_delta': {\n let payload: { index?: number };\n try {\n payload = JSON.parse(data);\n } catch {\n return [0, '', false];\n }\n const index = payload.index ?? 0;\n const meta = blockTypeMap.get(index);\n return [index, meta?.type ?? '', meta?.ephemeral ?? false];\n }\n case 'content_block_stop': {\n let payload: { index?: number };\n try {\n payload = JSON.parse(data);\n } catch {\n return [0, '', false];\n }\n const index = payload.index ?? 0;\n const meta = blockTypeMap.get(index);\n blockTypeMap.delete(index);\n return [index, meta?.type ?? '', meta?.ephemeral ?? false];\n }\n default:\n return [0, '', false];\n }\n}\n","// enduser.ts — v1.6.0 业务侧终端用户 id (endUserId) 公共工具\n//\n// 网关 sanitizer 仍会做权限校验 + 派生兜底; 此处仅负责 SDK 侧的基本约束:\n// - 正则: [a-zA-Z0-9_-]+ (与上游官方文档一致, 不含 \":\" / \".\" 等隐式破坏字符)\n// - 长度: ≤ 512\n// - 禁止隐私信息: SDK 无从机械判定, 仅在 README / guide 提示, 不在代码做拦截\n//\n// 该 helper 暴露 validateEndUserId 公开 API, 方便 caller 在赋值前自校验,\n// 避免请求被网关 sanitizer 静默丢弃。\n\n/** maxEndUserIdLength 与上游 DeepSeek 官方文档对齐。 */\nexport const maxEndUserIdLength = 512;\n\n/**\n * 检查 endUserId 是否符合规范 (字符集 + 长度)。\n * 空串视为合法 (表示未设置), 返回 null。\n *\n * 网关侧 sanitizer 在收到非空但校验失败的值时会 drop 并 metric, 不阻塞请求;\n * 但 caller 在自有业务侧拿到来源 (如 DB 内部 id) 后, 推荐先调用本函数明确语义。\n *\n * @returns 错误信息字符串, 或 null 表示合法\n */\nexport function validateEndUserId(s: string | undefined | null): string | null {\n if (!s) return null;\n if (s.length > maxEndUserIdLength) {\n return `endUserId length ${s.length} > ${maxEndUserIdLength}`;\n }\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n const ok =\n (c >= 0x61 && c <= 0x7a) || // a-z\n (c >= 0x41 && c <= 0x5a) || // A-Z\n (c >= 0x30 && c <= 0x39) || // 0-9\n c === 0x5f || // _\n c === 0x2d; // -\n if (!ok) {\n return `endUserId contains invalid char code 0x${c.toString(16)} at offset ${i} (allowed: [a-zA-Z0-9_-])`;\n }\n }\n return null;\n}\n\n/**\n * 识别 SSE 协议中的注释行 (\":<text>\"), 如 \": keep-alive\"。\n *\n * 上游 (如 DeepSeek) 在开始推理前可能持续发送 SSE 注释作为保活;\n * 注释行不构成事件, SDK 解析器必须显式跳过, 否则未来若 else-branch 把\n * 未匹配行误送 JSON.parse 会回归出 parse error。\n *\n * 严格定义: 行的首字节是 \":\". 不放宽允许行首空白 (SSE 规范不允许)。\n */\nexport function isSSECommentLine(line: string): boolean {\n return line.length > 0 && line.charCodeAt(0) === 0x3a; // ':'\n}\n","// client-helpers.ts — Client 内部辅助函数\n// 端口自 acosmi-sdk-go/client.go 中的: parseHTTPError / classifyTransport /\n// parseStreamError / isOrderSuccess / isOrderTerminal / 安全限制常量 / SSE 行扫描器\n//\n// 这些函数在 Go 侧是 client.go 内部 unexported, 拆出独立文件以让 client.ts 不必再大。\n\nimport { HTTPError, NetworkError, StreamError, type FaultDomain, type RequestDisposition } from '../shared/errors';\n\n// =============================================================================\n// 安全限制常量 (端口自 acosmi-sdk-go/client.go 安全限制常量)\n// =============================================================================\n\n/** 50MB — 技能 ZIP 包最大下载体积 */\nexport const maxDownloadSize = 50 * 1024 * 1024;\n/** 1MB — 错误响应体最大读取量 */\nexport const maxErrorBodySize = 1 * 1024 * 1024;\n/** 1MB — SSE 单行最大长度 (大 JSON chunk) */\nexport const maxSSELineSize = 1 * 1024 * 1024;\n/** 模型列表缓存有效期 (ms) */\nexport const modelCacheTTLMs = 5 * 60 * 1000;\n/** V29 系数缓存 (TTL 8s) */\nexport const coefCacheTTLMs = 8 * 1000;\n\n// =============================================================================\n// HTTP 错误解析\n// =============================================================================\n\n/**\n * 解析 HTTP 错误响应体,兼容 Anthropic 和 OpenAI 错误格式\n * Anthropic: {\"type\":\"error\",\"error\":{\"type\":\"...\",\"message\":\"...\"}}\n * OpenAI: {\"error\":{\"message\":\"...\",\"type\":\"...\",\"code\":\"...\"}}\n * OpenAI 网关: {\"code\":429,\"message\":\"...\"} — /chat 代理路径顶层扁平形态, 无 error 对象\n * 任一形态下, 顶层 errorCode / windowKind / windowResetAt (窗口限额扩展) 透传到\n * HTTPError 对应属性。\n * 通用回退: HTTP {status}: {body}\n */\nexport function parseHTTPError(statusCode: number, body: Uint8Array | string): HTTPError {\n return parseHTTPErrorWithHeader(statusCode, body, null);\n}\n\n/**\n * 同 parseHTTPError 但额外解析 Retry-After 头到 HTTPError.retryAfter.\n * retry policy 用此字段做指数退避降级.\n */\nexport function parseHTTPErrorWithHeader(\n statusCode: number,\n body: Uint8Array | string,\n header: Headers | null,\n): HTTPError {\n const bodyStr = typeof body === 'string' ? body : new TextDecoder().decode(body);\n\n let retryAfter = 0;\n if (header) {\n const ra = header.get('Retry-After');\n if (ra) {\n const sec = parseInt(ra, 10);\n if (!isNaN(sec) && sec > 0) retryAfter = sec;\n }\n }\n\n if (bodyStr.length === 0) {\n return new HTTPError(statusCode, { retryAfter });\n }\n\n let type = '';\n let message = '';\n let errorCode: string | undefined;\n let windowKind: 'FIVE_HOUR' | 'WEEKLY' | undefined;\n let windowResetAt: string | undefined;\n let windowOverridable: boolean | undefined;\n try {\n const obj = JSON.parse(bodyStr);\n if (obj && typeof obj === 'object') {\n const top = obj as {\n error?: unknown;\n message?: unknown;\n errorCode?: unknown;\n windowKind?: unknown;\n windowResetAt?: unknown;\n windowOverridable?: unknown;\n errorContractVersion?: unknown; faultDomain?: unknown; requestDisposition?: unknown;\n transportRequestId?: unknown; consumeRequestId?: unknown; providerRequestId?: unknown; retryable?: unknown;\n };\n const errObj = top.error;\n if (errObj && typeof errObj === 'object') {\n const e = errObj as { message?: unknown; type?: unknown };\n if (typeof e.message === 'string') message = e.message;\n if (typeof e.type === 'string') type = e.type;\n } else if (typeof top.message === 'string') {\n // OpenAI 网关顶层扁平形态 ({code:number, message:string}, 无 error 对象):\n // 取顶层 message; type 语义是 anthropic/openai error.type, 此形态无来源 → 留空。\n message = top.message;\n }\n // 窗口限额扩展 (任一形态): 顶层业务机器码 + 窗口字段。\n // windowKind 只收契约冻结档位, 未知档位不伪造进闭合联合 (原值仍在 body 原串)。\n const contractSource = errObj && typeof errObj === 'object'\n ? errObj as typeof top\n : top;\n if (typeof top.errorCode === 'string') errorCode = top.errorCode;\n else if (typeof contractSource.errorCode === 'string') errorCode = contractSource.errorCode;\n if (top.windowKind === 'FIVE_HOUR' || top.windowKind === 'WEEKLY') windowKind = top.windowKind;\n if (typeof top.windowResetAt === 'string') windowResetAt = top.windowResetAt;\n // [W1 2026-07-11 软限额] 可豁免性 (老网关不返回 → undefined, 客户端按硬等待处理)。\n if (typeof top.windowOverridable === 'boolean') windowOverridable = top.windowOverridable;\n const disposition = contractSource.requestDisposition === 'not_accepted' || contractSource.requestDisposition === 'accepted' || contractSource.requestDisposition === 'unknown' ? contractSource.requestDisposition as RequestDisposition : undefined;\n const domains = ['user_auth','caller_credentials','account_quota','account_permission','provider','gateway','transport','stream_ticket','protocol'];\n return new HTTPError(statusCode, { type, message, retryAfter, body: bodyStr, errorCode, windowKind, windowResetAt, windowOverridable,\n errorContractVersion: contractSource.errorContractVersion === 1 ? 1 : undefined,\n faultDomain: typeof contractSource.faultDomain === 'string' && domains.includes(contractSource.faultDomain) ? contractSource.faultDomain as FaultDomain : undefined,\n requestDisposition: disposition,\n transportRequestId: typeof contractSource.transportRequestId === 'string' ? contractSource.transportRequestId : null,\n consumeRequestId: typeof contractSource.consumeRequestId === 'string' ? contractSource.consumeRequestId : null,\n providerRequestId: typeof contractSource.providerRequestId === 'string' ? contractSource.providerRequestId : null,\n retryable: contractSource.retryable === true });\n }\n } catch {\n // 非 JSON, body 原样保留\n }\n\n return new HTTPError(statusCode, {\n type,\n message,\n retryAfter,\n body: bodyStr,\n errorCode,\n windowKind,\n windowResetAt,\n windowOverridable,\n });\n}\n\n// =============================================================================\n// 网络错误分类\n// =============================================================================\n\n/**\n * 包装 fetch 抛出的 err 为 NetworkError, 便于 retry policy 判定.\n *\n * 分类规则:\n * - AbortError 由 ctx.signal 触发 → Timeout=true\n * - \"fetch failed\" / \"ECONNRESET\" / \"EOF\" / \"broken pipe\" → EOF=true\n * - 其他: Timeout/EOF 都 false (不重试)\n */\nexport function classifyTransport(op: string, urlStr: string, err: unknown): NetworkError {\n const ne = new NetworkError(op, urlStr, err);\n if (err instanceof Error) {\n // AbortError (fetch + AbortController)\n if (err.name === 'AbortError') {\n ne.timeout = true;\n return ne;\n }\n // Node fetch undici cause\n const cause = (err as Error & { cause?: { code?: string; name?: string } }).cause;\n if (cause) {\n if (cause.code === 'UND_ERR_CONNECT_TIMEOUT' || cause.code === 'UND_ERR_HEADERS_TIMEOUT' || cause.code === 'ETIMEDOUT') {\n ne.timeout = true;\n return ne;\n }\n if (cause.code === 'ECONNRESET' || cause.code === 'EPIPE' || cause.code === 'ECONNREFUSED' || cause.code === 'EAI_AGAIN') {\n ne.eof = true;\n return ne;\n }\n }\n const msg = err.message;\n if (msg.includes('EOF') || msg.includes('connection reset') || msg.includes('broken pipe')) {\n ne.eof = true;\n }\n }\n return ne;\n}\n\n// =============================================================================\n// Stream Error 解析\n// =============================================================================\n\n/**\n * 从 failed/error 事件 JSON 中提取结构化错误.\n *\n * 兼容三种 schema (按优先级):\n *\n * 1. acosmi managed-model 协议 (\"event: failed\"):\n * {errorCode, stage, error: <string>, message, retryable}\n *\n * 2. Anthropic 协议扩展 (\"event: error\", v0.14.1 起):\n * {type:\"error\", error:{type, message}, errorCode, retryable, message, stage}\n *\n * 3. Anthropic 标准纯净格式 (老网关 / 官方上游直返):\n * {type:\"error\", error:{type, message}}\n */\nexport function parseStreamError(data: string): StreamError {\n let payload: {\n errorCode?: string;\n stage?: string;\n error?: unknown;\n message?: string;\n retryable?: boolean;\n errorContractVersion?: number; faultDomain?: FaultDomain; requestDisposition?: RequestDisposition;\n transportRequestId?: string | null; consumeRequestId?: string | null; providerRequestId?: string | null;\n };\n try {\n payload = JSON.parse(data);\n } catch {\n return new StreamError({ rawError: data });\n }\n\n let code = payload.errorCode ?? '';\n const stage = payload.stage ?? '';\n let message = payload.message ?? '';\n const retryable = payload.retryable ?? false;\n let rawError = '';\n\n if (payload.error != null) {\n if (typeof payload.error === 'string') {\n rawError = payload.error;\n } else if (typeof payload.error === 'object') {\n const errObj = payload.error as { type?: string; message?: string };\n rawError = JSON.stringify(payload.error);\n // 私有 message 字段空时, 用 Anthropic error.message 兜底\n if (message === '' && errObj.message) message = errObj.message;\n // errorCode 空 + Anthropic error.type 非空时, 兜底用 type 作 code\n if (code === '' && errObj.type) code = errObj.type;\n }\n }\n\n return new StreamError({ code, stage, message, rawError, retryable,\n errorContractVersion: payload.errorContractVersion,\n faultDomain: payload.faultDomain, requestDisposition: payload.requestDisposition,\n transportRequestId: payload.transportRequestId, consumeRequestId: payload.consumeRequestId,\n providerRequestId: payload.providerRequestId });\n}\n\n// =============================================================================\n// Order 状态判定\n// =============================================================================\n\nexport function isOrderSuccess(status: string): boolean {\n switch (status) {\n case 'PAID':\n case 'SUCCESS':\n case 'COMPLETED':\n return true;\n }\n return false;\n}\n\nexport function isOrderTerminal(status: string): boolean {\n switch (status) {\n case 'PAID':\n case 'SUCCESS':\n case 'COMPLETED':\n case 'FAILED':\n case 'CANCELLED':\n case 'CLOSED':\n case 'EXPIRED':\n case 'REFUNDED':\n return true;\n }\n return false;\n}\n\n// =============================================================================\n// SSE 行迭代器\n// =============================================================================\n\n/**\n * 把 fetch Response.body (ReadableStream) 转成异步行迭代器\n * 替代 Go bufio.Scanner.\n *\n * 1MB 单行硬上限 (与 maxSSELineSize 对齐) — 超长行抛错.\n */\nexport async function* iterSSELines(\n body: ReadableStream<Uint8Array>,\n maxLineBytes = maxSSELineSize,\n): AsyncGenerator<string, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buf = '';\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n\n let nlIdx: number;\n while ((nlIdx = buf.indexOf('\\n')) >= 0) {\n let line = buf.slice(0, nlIdx);\n buf = buf.slice(nlIdx + 1);\n // 去除 \\r (CRLF)\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n yield line;\n }\n if (buf.length > maxLineBytes) {\n throw new Error(`SSE line exceeds ${maxLineBytes} bytes`);\n }\n }\n // 处理最后一行 (无结尾 \\n)\n buf += decoder.decode(); // flush\n if (buf.length > 0) {\n if (buf.endsWith('\\r')) buf = buf.slice(0, -1);\n if (buf !== '') yield buf;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n}\n\n// =============================================================================\n// Body limit reader — 替代 Go io.LimitReader\n// =============================================================================\n\n/** 读取 ReadableStream 但限制最大字节数, 超限丢弃尾部 */\nexport async function readLimited(body: ReadableStream<Uint8Array>, maxBytes: number): Promise<Uint8Array> {\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (total + value.byteLength > maxBytes) {\n const remain = maxBytes - total;\n if (remain > 0) chunks.push(value.subarray(0, remain));\n break;\n }\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n // 拼接\n let len = 0;\n for (const c of chunks) len += c.byteLength;\n const out = new Uint8Array(len);\n let off = 0;\n for (const c of chunks) {\n out.set(c, off);\n off += c.byteLength;\n }\n return out;\n}\n\n/** 读取 ReadableStream + decode utf8, 限制最大字节数 */\nexport async function readLimitedText(\n body: ReadableStream<Uint8Array>,\n maxBytes: number,\n): Promise<string> {\n const buf = await readLimited(body, maxBytes);\n return new TextDecoder('utf-8').decode(buf);\n}\n","// sanitize 子包 re-export\n//\n// Go 侧 acosmi-sdk-go/sanitize/ 子包等价物。\n// 主入口 @acosmi/sdk-ts 通过 sanitize-bridge.ts 把这些工具与 Client/ChatRequest 粘合。\nexport * from './types';\nexport * from './config';\nexport * from './defensive';\nexport * from './history';\n","// sanitize/types.ts — 端口自 acosmi-sdk-go/sanitize/types.go\n//\n// Provider 无关的 content-block 防御性处理。\n// 职责边界:\n// - SDK 层: 只做所有下游 provider 都不可能接受的底线剥除 + 早失败\n// - Gateway 层: 按 provider preset 精细剥除 (不在本包内)\n\n/** Anthropic content block 类型 (请求 + 响应 + ephemeral) */\nexport type BlockType =\n | 'text'\n | 'image'\n | 'video'\n | 'document'\n | 'search_result'\n | 'thinking'\n | 'redacted_thinking'\n | 'tool_use'\n | 'tool_result'\n | 'tool_reference'\n | 'server_tool_use'\n | 'web_search_tool_result'\n | 'code_execution_tool_result'\n | 'mcp_tool_use'\n | 'mcp_tool_result'\n | 'container_upload';\n\nexport const BlockText: BlockType = 'text';\nexport const BlockImage: BlockType = 'image';\nexport const BlockVideo: BlockType = 'video';\nexport const BlockDocument: BlockType = 'document';\nexport const BlockSearchResult: BlockType = 'search_result';\nexport const BlockThinking: BlockType = 'thinking';\nexport const BlockRedactedThinking: BlockType = 'redacted_thinking';\nexport const BlockToolUse: BlockType = 'tool_use';\nexport const BlockToolResult: BlockType = 'tool_result';\nexport const BlockToolReference: BlockType = 'tool_reference';\nexport const BlockServerToolUse: BlockType = 'server_tool_use';\nexport const BlockWebSearchToolResult: BlockType = 'web_search_tool_result';\nexport const BlockCodeExecutionToolResult: BlockType = 'code_execution_tool_result';\nexport const BlockMCPToolUse: BlockType = 'mcp_tool_use';\nexport const BlockMCPToolResult: BlockType = 'mcp_tool_result';\nexport const BlockContainerUpload: BlockType = 'container_upload';\n\n/** 流式响应 delta 类型 (与 BlockType 正交) */\nexport type DeltaType =\n | 'text_delta'\n | 'input_json_delta'\n | 'thinking_delta'\n | 'signature_delta'\n | 'citations_delta';\n\nexport const DeltaText: DeltaType = 'text_delta';\nexport const DeltaInputJSON: DeltaType = 'input_json_delta';\nexport const DeltaThinking: DeltaType = 'thinking_delta';\nexport const DeltaSignature: DeltaType = 'signature_delta';\nexport const DeltaCitations: DeltaType = 'citations_delta';\n\n/**\n * 网关在 block JSON 中注入的 in-band 标记字段名。\n * 存在且值为 true 时代表该 block 不应回传下一轮。\n *\n * 选择 in-band 标记而非独立 SSE 事件的理由:\n * - 零缓冲 / 零顺序依赖 / 零延迟\n * - history 剥离天然可做\n */\nexport const EphemeralMarkerField = 'acosmi_ephemeral';\n","// sanitize/config.ts — 端口自 acosmi-sdk-go/sanitize/config.go\n\nimport type { BlockType } from './types';\n\n/**\n * SDK 层防御性配置。只做所有下游 provider 都不可能接受的底线剥除;\n * 具体 provider 适配由网关承担。\n *\n * 零值 = 不校验 / 不剥除, 等价于未启用。\n */\nexport interface MinimalSanitizeConfig {\n /** 体积上限 (字节, 仅对 base64 内联媒体生效; URL 版交网关把关). 0 = 不校验. */\n maxImageBytes?: number;\n maxVideoBytes?: number;\n maxPDFBytes?: number;\n\n /** history 轮次硬上限 (防止内存爆炸 / 上行带宽). 0 = 不校验. 超限抛 ErrHistoryTooDeep. */\n maxMessagesTurns?: number;\n\n /** 公共黑名单 (所有 provider 均拒绝的 block 类型). 默认空. */\n permanentDenyBlocks?: BlockType[];\n}\n\nexport class HistoryTooDeepError extends Error {\n constructor() {\n super('sanitize: messages history exceeds configured depth');\n this.name = 'HistoryTooDeepError';\n }\n}\n\nexport class BlockDeniedError extends Error {\n constructor() {\n super('sanitize: block type permanently denied');\n this.name = 'BlockDeniedError';\n }\n}\n\n/** 体积超限错误, 携带实际/上限字节数以便上游展示。 */\nexport class SizeError extends Error {\n blockType: BlockType;\n actual: number;\n limit: number;\n\n constructor(blockType: BlockType, actual: number, limit: number) {\n super(`sanitize: ${blockType} base64 size ${actual} exceeds limit ${limit}`);\n this.name = 'SizeError';\n this.blockType = blockType;\n this.actual = actual;\n this.limit = limit;\n }\n}\n\n// 单例实例 — 与 Go 侧 var ErrHistoryTooDeep / ErrBlockDenied 等价的\"哨兵\"用法\n// 但 TS class 实例不能 const 哨兵化, 调用方应用 instanceof 判断。\nexport const ErrHistoryTooDeep = new HistoryTooDeepError();\nexport const ErrBlockDenied = new BlockDeniedError();\n","// sanitize/history.ts — 端口自 acosmi-sdk-go/sanitize/history.go\n\nimport { EphemeralMarkerField } from './types';\n\n/** 判定一个 block 是否应被剥除 */\nexport type BlockPredicate = (block: Record<string, unknown>) => boolean;\n\n/**\n * 按 pred 从 messages 中剥除 block, 并联动剥除对应的 tool_result (user 轮)。\n *\n * 收敛两步: 先扫收集 droppedToolUseIDs, 再整体剥; 这样顺序不影响正确性\n * (即使 tool_result 在 tool_use 之前出现也能捕获)。\n *\n * 不修改入参 messages 中任何 map 的 key, 只重构数组。\n * 未被修改的 message 保持原引用 (零拷贝优化)。\n */\nexport function dropBlocks(messages: unknown[], pred: BlockPredicate): unknown[] {\n const droppedToolUseIDs = collectDroppedToolUseIDs(messages, pred);\n\n const out: unknown[] = [];\n for (const msg of messages) {\n if (!isPlainObject(msg)) {\n out.push(msg);\n continue;\n }\n const content = msg['content'];\n if (!Array.isArray(content)) {\n out.push(msg);\n continue;\n }\n\n const { kept, changed } = filterBlocks(content, pred, droppedToolUseIDs);\n if (!changed) {\n out.push(msg);\n continue;\n }\n\n // content 空了的消息整条丢弃 (assistant 本轮全是 ephemeral 块;\n // 或 user 轮全是联动剥的 tool_result)。避免产生空消息让 provider 报错。\n if (kept.length === 0) {\n continue;\n }\n\n // 浅拷贝 msg, 只改 content, 避免污染调用方数据。\n const newMsg: Record<string, unknown> = { ...msg };\n newMsg['content'] = kept;\n out.push(newMsg);\n }\n return out;\n}\n\n/** 第一遍扫描, 仅收集\"本次被 pred 命中的 tool_use 类 block 的 id\", 以便联动剥 tool_result。 */\nfunction collectDroppedToolUseIDs(messages: unknown[], pred: BlockPredicate): Set<string> {\n const ids = new Set<string>();\n for (const msg of messages) {\n if (!isPlainObject(msg)) continue;\n const content = msg['content'];\n if (!Array.isArray(content)) continue;\n for (const raw of content) {\n if (!isPlainObject(raw)) continue;\n if (!pred(raw)) continue;\n const t = raw['type'];\n if (typeof t !== 'string') continue;\n if (t === 'tool_use' || t === 'server_tool_use' || t === 'mcp_tool_use') {\n const id = raw['id'];\n if (typeof id === 'string' && id !== '') ids.add(id);\n }\n }\n }\n return ids;\n}\n\n/**\n * 对单条消息的 content 数组剥除 pred 命中的 block, 以及\n * tool_use_id 在 droppedToolUseIDs 中的 tool_result。返回 (新数组, 是否变更)。\n */\nfunction filterBlocks(\n content: unknown[],\n pred: BlockPredicate,\n droppedToolUseIDs: Set<string>,\n): { kept: unknown[]; changed: boolean } {\n const kept: unknown[] = [];\n let changed = false;\n for (const raw of content) {\n if (!isPlainObject(raw)) {\n kept.push(raw);\n continue;\n }\n if (pred(raw)) {\n changed = true;\n continue;\n }\n // 联动剥 tool_result / mcp_tool_result (仅当 tool_use_id 命中)\n if (droppedToolUseIDs.size > 0) {\n const t = raw['type'];\n if (t === 'tool_result' || t === 'mcp_tool_result') {\n const id = raw['tool_use_id'];\n if (typeof id === 'string' && id !== '' && droppedToolUseIDs.has(id)) {\n changed = true;\n continue;\n }\n }\n }\n kept.push(raw);\n }\n return { kept, changed };\n}\n\n/**\n * 从 messages 中剥除带 acosmi_ephemeral:true 标记的 block, 以及对应的 tool_result。\n *\n * 硬豁免: thinking / redacted_thinking 块永不剥, 即使携带 ephemeral 标记。\n *\n * 理由: Anthropic extended thinking + tool_use 续轮场景下, 上游强制要求\n * assistant 历史中保留原始 thinking 块, 否则返回:\n * \"The content[].thinking in the thinking mode must be passed back to the API.\"\n *\n * 历史污染防御: 即使旧版网关 / 历史响应里 thinking 块带了 ephemeral=true,\n * 客户端在调用 stripEphemeral 时也不应剥除。网关侧 anthropic preset 已停止注入此标记,\n * 本豁免兜底历史会话与第三方调用方两类已污染场景。\n */\nexport function stripEphemeral(messages: unknown[]): unknown[] {\n return dropBlocks(messages, (b) => {\n const t = b['type'];\n if (t === 'thinking' || t === 'redacted_thinking') {\n return false; // 硬豁免, 不可被 ephemeral 标记覆盖\n }\n const v = b[EphemeralMarkerField];\n return v === true;\n });\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// sanitize/defensive.ts — 端口自 acosmi-sdk-go/sanitize/defensive.go\n\nimport type { BlockType } from './types';\nimport type { MinimalSanitizeConfig } from './config';\nimport { ErrHistoryTooDeep, SizeError } from './config';\nimport { dropBlocks } from './history';\n\n/**\n * 对已经解析为 unknown[] 的 messages 做底线防御: 深度校验 +\n * 体积校验 + deny-list 剥除 + tool_use_id 联动剥除 tool_result。\n *\n * 入参形态: messages 的每个元素预期是 object (含 role / content); content 为 string (plain text)\n * 或 unknown[] (block 数组)。形态异常的元素原样透传, 不抛错。\n *\n * 通过返回新 messages (可能 block 数组被缩减); 早失败抛错 (调用方应放弃本次请求)。\n */\nexport function sanitize(messages: unknown[], cfg: MinimalSanitizeConfig): unknown[] {\n if ((cfg.maxMessagesTurns ?? 0) > 0 && messages.length > (cfg.maxMessagesTurns as number)) {\n throw ErrHistoryTooDeep;\n }\n\n // 体积校验: 先扫一遍, 任何违规直接早失败 (不修改 messages)\n if ((cfg.maxImageBytes ?? 0) > 0 || (cfg.maxVideoBytes ?? 0) > 0 || (cfg.maxPDFBytes ?? 0) > 0) {\n checkMediaSizes(messages, cfg);\n }\n\n // deny-list 剥除 + tool_use_id 联动\n if (cfg.permanentDenyBlocks && cfg.permanentDenyBlocks.length > 0) {\n const denySet = new Set<string>();\n for (const bt of cfg.permanentDenyBlocks) denySet.add(bt as string);\n messages = dropBlocks(messages, (b) => {\n const t = (b as Record<string, unknown>)['type'];\n return typeof t === 'string' && denySet.has(t);\n });\n }\n\n return messages;\n}\n\n/**\n * 遍历所有 block, 对 base64 内联 image/video/document 类型校验解码后字节数。\n * URL 版无法本地量体积, 跳过 (交网关把关)。违规直接抛 SizeError。\n */\nfunction checkMediaSizes(messages: unknown[], cfg: MinimalSanitizeConfig): void {\n for (const msg of messages) {\n if (!isPlainObject(msg)) continue;\n const content = msg['content'];\n if (!Array.isArray(content)) continue;\n for (const raw of content) {\n if (!isPlainObject(raw)) continue;\n const bt = raw['type'];\n if (typeof bt !== 'string') continue;\n\n let limit = 0;\n switch (bt as BlockType) {\n case 'image':\n limit = cfg.maxImageBytes ?? 0;\n break;\n case 'video':\n limit = cfg.maxVideoBytes ?? 0;\n break;\n case 'document':\n limit = cfg.maxPDFBytes ?? 0;\n break;\n default:\n continue;\n }\n if (limit <= 0) continue;\n\n const data = extractBase64Data(raw);\n if (data === '') continue; // URL 版或形态异常, 跳过\n const actual = base64DecodedLen(data);\n if (actual > limit) {\n throw new SizeError(bt as BlockType, actual, limit);\n }\n }\n }\n}\n\n/**\n * 从 Anthropic block 结构中抽 base64 data 字段。\n *\n * 形态:\n * image: {source:{type:\"base64\", data:\"...\"}}\n * video: {source:{type:\"base64\", data:\"...\"}}\n * document: {source:{type:\"base64\", data:\"...\"}}\n *\n * 若是 URL 版 (source.type=\"url\") 或缺字段, 返回 \"\"。\n */\nfunction extractBase64Data(block: Record<string, unknown>): string {\n const src = block['source'];\n if (!isPlainObject(src)) return '';\n if (src['type'] !== 'base64') return '';\n const dataRaw = src['data'];\n if (typeof dataRaw !== 'string') return '';\n let data: string = dataRaw;\n // 防御性: 某些上游把 \"data:image/jpeg;base64,...\" 整串塞进 data,\n // 虽非标准但兜底去掉前缀, 保证字节数估算正确。\n const i = data.indexOf('base64,');\n if (i >= 0) {\n data = data.slice(i + 'base64,'.length);\n }\n return data;\n}\n\n/** Go base64.StdEncoding.DecodedLen 等价: ceil(n*3/4) 减去 padding */\nfunction base64DecodedLen(b64: string): number {\n // Go 的 DecodedLen(n) = (n / 4) * 3 - paddingCount\n const n = b64.length;\n let pad = 0;\n if (n >= 1 && b64[n - 1] === '=') pad++;\n if (n >= 2 && b64[n - 2] === '=') pad++;\n return Math.floor((n * 3) / 4) - pad;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n","// sanitize-bridge.ts — 端口自 acosmi-sdk-go/sanitize_bridge.go\n//\n// 主包与 sanitize 子包的胶水层。\n// sanitize 子包定义了与 provider 无关的 block 处理工具, 不依赖主包;\n// 本文件把 ChatRequest 这种主包类型归一化为 sanitize 能处理的 unknown[] 形态,\n// 并提供 Client 级别的可配置钩子 (setDefensiveSanitize / setAutoStripEphemeralHistory).\n//\n// 调用时机: buildChatRequest 开头 (每次 chat/chatStream/chatMessages*).\n// 未配置时零开销 (applyRequestSanitizers 首行 early-return).\n\nimport { Client } from './client';\nimport type { ChatRequest } from '../models/types';\nimport { type MinimalSanitizeConfig, ErrHistoryTooDeep, sanitize, stripEphemeral } from '../sanitize';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 配置请求前的底线防御 (体积 / deny-list / 深度)。\n * 传空值 {} 关闭 (所有字段为零 = 禁用)。\n * 并发安全, 可在任意时间调用。\n */\n setDefensiveSanitize(cfg: MinimalSanitizeConfig): void;\n\n /**\n * 开启后, 每次请求前 SDK 会从 rawMessages 中剥除带 acosmi_ephemeral:true 标记的 block,\n * 并联动剥除引用已剥 tool_use 的 tool_result, 避免 provider 报 \"tool_use_id 不存在\".\n *\n * 标记来源: 网关在响应 content_block_start 中 in-band 注入; 消费者把上一轮 assistant\n * 回复原样拼回 history 即可触发剥离。\n */\n setAutoStripEphemeralHistory(on: boolean): void;\n\n /**\n * 在 buildChatRequest 开头调用, 把配置化的防御策略应用到 req。\n * 未配置时立即返回, 零开销。\n *\n * 失败时抛错 — 调用方应放弃本次请求。\n */\n applyRequestSanitizers(req: ChatRequest): void;\n }\n}\n\nClient.prototype.setDefensiveSanitize = function (this: Client, cfg: MinimalSanitizeConfig) {\n this.defensiveCfg = cfg;\n};\n\nClient.prototype.setAutoStripEphemeralHistory = function (this: Client, on: boolean) {\n this.autoStripEphemeral = on;\n};\n\nClient.prototype.applyRequestSanitizers = function (this: Client, req: ChatRequest) {\n const cfg = this.defensiveCfg;\n const strip = this.autoStripEphemeral;\n\n if (cfg == null && !strip) return;\n\n // rawMessages 分支: 归一化 → sanitize → (可选) strip → 写回\n if (req.rawMessages != null) {\n let msgs: unknown[];\n try {\n msgs = normalizeRawMessages(req.rawMessages);\n } catch (e) {\n throw new Error(\n `sanitize: normalize raw messages: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n if (cfg) {\n msgs = sanitize(msgs, cfg);\n }\n if (strip) {\n msgs = stripEphemeral(msgs);\n }\n req.rawMessages = msgs;\n return;\n }\n\n // 纯 messages 分支: block 级操作不适用, 只做深度校验\n if (\n cfg &&\n (cfg.maxMessagesTurns ?? 0) > 0 &&\n (req.messages?.length ?? 0) > (cfg.maxMessagesTurns as number)\n ) {\n throw ErrHistoryTooDeep;\n }\n};\n\n/**\n * 把任意形态的 rawMessages (struct 数组 / map 数组 / unknown[]) 归一为 unknown[]。\n *\n * 已是 unknown[] (Array) 时零拷贝直接返回; 其他走一次 JSON roundtrip。\n */\nfunction normalizeRawMessages(rm: unknown): unknown[] {\n if (Array.isArray(rm)) return rm;\n let s: unknown;\n try {\n s = JSON.parse(JSON.stringify(rm));\n } catch (e) {\n throw new Error(`raw messages: ${e instanceof Error ? e.message : String(e)}`);\n }\n if (!Array.isArray(s)) {\n throw new Error('raw messages must be a JSON array');\n }\n return s;\n}\n","// shared/index.ts — 跨域基础设施 barrel\n//\n// 收口错误类型、APIResponse / Yudao 分页结构,以及跨域共享 DTO\n// (分页 / operation / retryAdvice / principal / gate —— 能力缺口总账\n// §9.4 / §9.5 Phase 0.3)。\n//\n// 红线(§9.4 / §9.5):\n// - `PageResult<T>` 是 `YudaoPageResult<T>` 的别名,不开第二套分页结果结构。\n// - `RetryAdvice` 是叠加层,不替换 `core/retry.ts` `RetryPolicy` /\n// `compliance/errors.ts` `ComplianceErrorInfo`。\n// - 共享 DTO 按关注点分文件,不堆进本 barrel。\n\nexport * from './errors';\nexport * from './api-response';\nexport * from './pagination';\nexport * from './operation';\nexport * from './retry-advice';\nexport * from './principal';\nexport * from './gate';\n","// shared/operation.ts — 跨域统一操作(operation projection)原语。\n//\n// 依据:能力缺口总账 §4.7 / §6.3 / §6.4 / §9.4(Phase 0.3 shared DTO)。\n//\n// `operationId` 是 console / api / scheduler / crabcode / mcp / 合规等多来源\n// 的统一关联键(§2 边界 10)。本文件只沉淀【共享形态原语】;真实 operation\n// projection 命名空间须待后端端点 + 契约就绪后落地(§9.1),在此之前 SDK\n// `operations` 命名空间保持 `export {}` 占位 —— 提前写空转方法属编造契约。\n\nimport type { ComplianceProviderRequestStatus } from '../compliance/provider/types';\n\n/** 统一操作关联键。贯通控制台 / API / MCP / CrabCode / scheduler 各来源。 */\nexport type OperationId = string;\n\n/**\n * 操作来源。开放联合 —— 平台侧 5 种固定值,合规域可追加自定义来源字符串。\n * `(string & {})` 在保留 IDE 字面量补全的同时不拒绝未知来源(后端保留新增空间)。\n */\nexport type OperationSource =\n | 'console'\n | 'api'\n | 'scheduler'\n | 'crabcode'\n | 'mcp'\n // 开放联合:`string & NonNullable<unknown>` ≡ `string & {}`,保留字面量补全\n // 同时不拒绝未知值(`{}` 字面量被 eslint ban-types 禁用,故用等价写法)。\n | (string & NonNullable<unknown>);\n\n/**\n * 操作状态机。开放联合,后端保留新增空间。\n *\n * 与 `compliance/status.ts` 的 `ComplianceEnvelopeStatus` 等领域状态【正交】:\n * 领域状态描述某个履约对象的业务态,`OperationStatus` 描述【一次操作】本身\n * 的执行进度。\n */\nexport type OperationStatus =\n | 'pending'\n | 'running'\n | 'retrying'\n | 'awaiting_callback'\n | 'awaiting_verify'\n | 'succeeded'\n | 'failed'\n | 'canceled'\n | 'unknown'\n | (string & NonNullable<unknown>);\n\n/**\n * 本地 verify 状态(§6.4)。\n *\n * provider success 仅表示 provider request 终态;时间章 / 签署 / 验签 /\n * 证据包 / 报告发布须经后端本地 verify / evidence chain verify。`VerifyStatus`\n * 与 provider 状态是【两个独立维度】,operation projection 必须分别展示\n * (local verify failed → 业务 failed,不 billing settle)。\n */\nexport type VerifyStatus =\n | 'pending'\n | 'verified'\n | 'failed'\n | 'skipped'\n | 'unknown'\n | (string & NonNullable<unknown>);\n\n/**\n * 幂等键。作用域 = tenant + principal/client + action + product;同 key 同\n * canonical request 返回原结果,同 key 异 request 拒绝(§6.3 / §2 边界 9)。\n * SDK 写接口经 `IdempotencyKeyHeader` 透传,调用方必须【持久化】key。\n */\nexport type IdempotencyKey = string;\n\n/** 幂等键 HTTP header 名 —— 全 SDK 写接口的单一真相源。 */\nexport const IdempotencyKeyHeader = 'Idempotency-Key' as const;\n\n/**\n * Provider request 状态。\n *\n * 复核约束(§9.4 勘误):**不另造同名近似类型** —— 直接复用\n * `compliance/provider/types.ts` 既有 `ComplianceProviderRequestStatus`\n * (`PENDING` / `SUCCESS` / `FAILED` / `UNKNOWN` / `RETRYING`)。\n */\nexport type ProviderRequestStatus = ComplianceProviderRequestStatus;\n","// shared/retry-advice.ts — 跨域统一失败补救建议(retryAdvice)。\n//\n// 依据:能力缺口总账 §6.6 / §9.4(Phase 0.3 shared DTO,缺口 R-6)。\n//\n// 复核约束(§9.4 勘误 F-G / §6 边界 11):\n// - `RetryAdvice` 是【叠加层】—— 独立类型、独立字段,**不修改也不替换**\n// `core/retry.ts` 的 `RetryPolicy` 与 `compliance/errors.ts` 的\n// `ComplianceErrorInfo`(`retryable` / `terminal` / `stepUpRequired`)。\n// `RetryPolicy` 决定 SDK 传输层【是否自动重试】;`RetryAdvice` 是面向\n// 调用方 / 终端用户的【补救建议投影】,二者职责不同、不可互相替代。\n// - `reason` 不开第四套错误码登记表 —— 它是既有三套登记表(Java 数值码 /\n// SDK 符号 key / Go OAuth 标准字符串)的【小写归一化映射】。本文件即\n// §6.6 要求的\"既有码 → reason\"映射表。\n\nimport type { ComplianceErrorInfo, ComplianceErrorKey } from '../compliance/errors';\n\n/**\n * 失败补救原因。开放枚举的【封闭】部分 —— 这 11 个值覆盖 §6.6 要求的全集。\n *\n * 其中 `gate_closed` / `step_up_required` / `tenant_mismatch` /\n * `insufficient_scope` 与既有错误码登记表同名概念一一对应(见下方映射表),\n * 不是新造的码。\n */\nexport type RetryAdviceReason =\n | 'unknown'\n | 'retrying'\n | 'failed'\n | 'gate_closed'\n | 'step_up_required'\n | 'tenant_mismatch'\n | 'insufficient_scope'\n | 'quota_exceeded'\n | 'provider_timeout'\n | 'local_verify_failed'\n | 'billing_preflight_failed';\n\n/** `RetryAdviceReason` 全集(11 项)—— 供迭代 / 校验使用。 */\nexport const RETRY_ADVICE_REASONS: readonly RetryAdviceReason[] = [\n 'unknown',\n 'retrying',\n 'failed',\n 'gate_closed',\n 'step_up_required',\n 'tenant_mismatch',\n 'insufficient_scope',\n 'quota_exceeded',\n 'provider_timeout',\n 'local_verify_failed',\n 'billing_preflight_failed',\n] as const;\n\n/**\n * 失败补救建议统一模型(§6.6)。\n *\n * 高风险 / 收费动作失败后,后端 operation projection 产出本结构告诉调用方\n * 「能不能重试、要不要换幂等键、要不要人工介入」。\n */\nexport interface RetryAdvice {\n /** 是否值得【自动】重试。compliance 写接口几乎恒为 false(双扣红线)。 */\n retryable: boolean;\n /** 建议的重试等待时长(秒);与 `HTTPError.retryAfter` 单位一致。 */\n retryAfter?: number;\n /**\n * 重试时是否必须沿用【同一】幂等键。\n * 同 key 同 canonical request → 服务端返回原结果(对账语义);\n * 终态错误须改用【新】幂等键重新发起(§6.3)。\n */\n sameIdempotencyKeyRequired: boolean;\n /** 是否需要人工介入(重新登录 / step-up / 联系支持),不能纯自动恢复。 */\n manualActionRequired: boolean;\n /** 归一化失败原因。 */\n reason: RetryAdviceReason;\n /** 面向终端用户的提示文案(调用方可用自有 copy 表覆盖)。 */\n userMessage?: string;\n /** 面向开发者的诊断信息(如服务端原始 message)。 */\n developerMessage?: string;\n /** 支持工单关联码(如 `compliance:1031004004`)。 */\n supportCode?: string;\n}\n\n// =============================================================================\n// 映射表 1:SDK compliance 符号 key(`ComplianceErrorKey`)→ `RetryAdviceReason`\n//\n// 用 `Record<ComplianceErrorKey, ...>` 强约束【穷举】:compliance/errors.ts 新增\n// 任一 `ComplianceErrorKey` 而此处未补映射,本文件即编译失败 —— 映射表不会漏。\n// =============================================================================\n\nconst COMPLIANCE_KEY_TO_RETRY_REASON: Record<ComplianceErrorKey, RetryAdviceReason> = {\n // 通用 / token / scope\n COMPLIANCE_UNAUTHORIZED: 'failed',\n COMPLIANCE_INSUFFICIENT_SCOPE: 'insufficient_scope',\n COMPLIANCE_STEP_UP_REQUIRED: 'step_up_required',\n COMPLIANCE_TOKEN_INVALID: 'failed',\n // 主体快照\n SUBJECT_SNAPSHOT_REQUIRED: 'failed',\n SUBJECT_SNAPSHOT_NOT_FOUND: 'failed',\n SUBJECT_SNAPSHOT_TENANT_MISMATCH: 'tenant_mismatch',\n // Evidence / Timestamp / Package / Report\n EVIDENCE_ASSET_NOT_FOUND: 'failed',\n EVIDENCE_ASSET_HASH_MISMATCH: 'local_verify_failed',\n EVIDENCE_ASSET_PAYLOAD_REQUIRED: 'failed',\n TIMESTAMP_TOKEN_NOT_FOUND: 'failed',\n TIMESTAMP_PROVIDER_FAILED: 'failed',\n TIMESTAMP_PROVIDER_UNKNOWN: 'unknown',\n TIMESTAMP_LOCAL_VERIFY_FAILED: 'local_verify_failed',\n TIMESTAMP_PROVIDER_NOT_AVAILABLE: 'provider_timeout',\n EVIDENCE_PACKAGE_NOT_FOUND: 'failed',\n EVIDENCE_PACKAGE_TIMESTAMP_REQUIRED: 'failed',\n EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH: 'local_verify_failed',\n REPORT_NOT_FOUND: 'failed',\n REPORT_ALREADY_PUBLISHED: 'failed',\n REPORT_DRAFT_REQUIRED: 'failed',\n EVIDENCE_VERIFY_TARGET_REQUIRED: 'failed',\n EVIDENCE_VERIFY_TARGET_NOT_FOUND: 'failed',\n // Provider request\n PROVIDER_REQUEST_UNKNOWN_NO_RETRY: 'unknown',\n PROVIDER_CALLBACK_SOURCE_INVALID: 'failed',\n PROVIDER_NOT_CONFIGURED: 'gate_closed',\n PROVIDER_REQUEST_NOT_FOUND: 'failed',\n PROVIDER_REQUEST_IDEMPOTENCY_REQUIRED: 'failed',\n PROVIDER_REQUEST_STATUS_NOT_TERMINAL: 'retrying',\n // Envelope\n ENVELOPE_NOT_FOUND: 'failed',\n ENVELOPE_TENANT_MISMATCH: 'tenant_mismatch',\n ENVELOPE_STATE_NOT_ALLOWED: 'failed',\n ENVELOPE_GATE_CLOSED: 'gate_closed',\n CONTRACT_NOT_FOUND: 'failed',\n CONTRACT_HASH_MISMATCH: 'local_verify_failed',\n PROVIDER_AUTHORIZATION_NOT_CONFIRMED: 'failed',\n ENVELOPE_EVIDENCE_NOT_READY: 'retrying',\n // Seal approval / use\n SEAL_ASSET_NOT_FOUND: 'failed',\n SEAL_APPROVAL_NOT_FOUND: 'failed',\n SEAL_APPROVAL_STATE_NOT_APPROVED: 'failed',\n SEAL_APPROVAL_EXPIRED: 'failed',\n SEAL_APPROVAL_ALREADY_USED: 'failed',\n SEAL_APPROVAL_NONCE_USED: 'failed',\n SEAL_APPROVAL_SEAL_MISMATCH: 'failed',\n SEAL_APPROVAL_LOCATION_MISMATCH: 'failed',\n SEAL_APPROVAL_TRANSACTOR_MISMATCH: 'failed',\n SEAL_APPROVAL_CONTRACT_HASH_MISMATCH: 'local_verify_failed',\n SEAL_APPROVAL_INVALID_TRANSITION: 'failed',\n SEAL_USE_ALREADY_CONSUMED: 'failed',\n // Audit chain\n AUDIT_CHAIN_TAMPER_DETECTED: 'local_verify_failed',\n // Billing\n BILLING_COMMIT_REQUIRES_LOCAL_VERIFY: 'local_verify_failed',\n BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS: 'billing_preflight_failed',\n BILLING_CALLBACK_CANNOT_COMMIT: 'billing_preflight_failed',\n BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE: 'billing_preflight_failed',\n BILLING_S2S_FORBIDDEN: 'failed',\n // SDK fallback\n UNKNOWN_COMPLIANCE_ERROR: 'unknown',\n};\n\n/** SDK compliance 符号 key → `RetryAdviceReason`。未知 key 兜底 `unknown`。 */\nexport function retryReasonForComplianceKey(key: ComplianceErrorKey): RetryAdviceReason {\n return COMPLIANCE_KEY_TO_RETRY_REASON[key] ?? 'unknown';\n}\n\n// =============================================================================\n// 映射表 2:Go OAuth 标准错误字符串 → `RetryAdviceReason`\n//\n// 仅登记与 `RetryAdviceReason` 有同名概念的标准 OAuth 错误;其余按 `failed`。\n// =============================================================================\n\nconst OAUTH_ERROR_TO_RETRY_REASON: Record<string, RetryAdviceReason> = {\n insufficient_scope: 'insufficient_scope',\n invalid_token: 'failed',\n invalid_grant: 'failed',\n invalid_request: 'failed',\n access_denied: 'failed',\n unsupported_grant_type: 'failed',\n};\n\n/** Go OAuth 标准错误字符串 → `RetryAdviceReason`。未登记的兜底 `unknown`。 */\nexport function retryReasonForOAuthError(oauthError: string): RetryAdviceReason {\n return OAUTH_ERROR_TO_RETRY_REASON[oauthError] ?? 'unknown';\n}\n\n// =============================================================================\n// 叠加投影:`ComplianceErrorInfo` → `RetryAdvice`\n//\n// 这是 §9.4「叠加不替换」约束的具体实现 —— 纯函数,【只读】`ComplianceErrorInfo`、\n// 不修改它,产出独立的 `RetryAdvice`。`compliance/errors.ts` 与\n// `csign sdk-client.ts:classifyVerifyError` 完全不受影响。\n// =============================================================================\n\n/**\n * 把 `ComplianceErrorInfo`(compliance/errors.ts `classifyComplianceError` 的产出)\n * 投影为统一 `RetryAdvice`。\n *\n * 语义:\n * - `retryable` 直接透传 `info.retryable`(compliance 写接口恒 false)。\n * - 终态错误(`info.terminal`)→ 须改用【新】幂等键 →\n * `sameIdempotencyKeyRequired=false`、`manualActionRequired=true`。\n * - step-up 错误 → 重新做 OAuth introspection 后用【同一】幂等键重试 →\n * `sameIdempotencyKeyRequired=true`、`manualActionRequired=true`。\n * - 其余(非终态、非 step-up)→ 沿用同一幂等键对账重发。\n *\n * 不读、不写 `ComplianceErrorInfo` 以外的状态;入参不被 mutate。\n */\nexport function complianceErrorToRetryAdvice(info: ComplianceErrorInfo): RetryAdvice {\n return {\n retryable: info.retryable,\n sameIdempotencyKeyRequired: !info.terminal,\n manualActionRequired: info.terminal || info.stepUpRequired,\n reason: retryReasonForComplianceKey(info.key),\n developerMessage: info.message,\n supportCode: `compliance:${info.code}`,\n };\n}\n","// auth/scopes.ts — 端口自 acosmi-sdk-go/scopes.go (v0.19.0)\n//\n// 分组 Scope(V2: 10→3 合并),与后端 DesktopOAuthScopes 保持一致。\n//\n// 三处必须字面量一致, 任一变更需同步另外两处:\n// - Go: nexus-v4/backend/internal/handler/desktop_oauth.go DesktopOAuthScopes\n// - Java: tk-dist/yudao-module-compliance-api ComplianceScopes\n// - TS: 本文件 + compliance/scopes.ts 的 Scope* 常量\n// 合规 scope 不做分组合并 — 服务端按细粒度校验, SDK 也只应按需申请最小集合。\n// 合规 scope 已迁出至 compliance/scopes.ts。\n//\n// 高风险分组 scope (remote_control + chat_bridge) 同样字面量镜像自 Go DesktopOAuthScopes,\n// 均不进 allScopes(), 服务端 ScopeExpansion 各自展开为 3 个子 scope; 任一变更需同步 Go 端。\n\nexport const ScopeAI = 'ai'; // 模型服务: 模型调用 + 流量包 + 权益\nexport const ScopeSkills = 'skills'; // 技能与工具: 技能商店 + 工具列表 + 执行\nexport const ScopeAccount = 'account'; // 账户信息: 个人资料 + 钱包余额 + 交易记录\n\n// -----------------------------------------------------------------------------\n// Phase 4 (2026-05-27) 远程控制 CrabCode 多接入面专用 scope\n//\n// 契约: docs/audit/sdk-remote-control-contract-2026-05-27.md §6 #1 红线:\n// - 远控绝不复用 `models:chat` / `ai` scope;\n// - `ai` 展开列表绝不允许加入 remote_control 任意子项 (隐式获权后门);\n// - allScopes() 默认不申请 remote_control — 桌面登录不应该自动获得远控权限,\n// 调用方必须显式构造 `[ScopeRemoteControl]` 或 `[...allScopes(), ScopeRemoteControl]`\n// 才能在授权页面前向用户展示远控授权风险.\n//\n// 三处必须字面量一致:\n// - Go DesktopOAuthScopes (nexus-v4/backend/internal/handler/desktop_oauth.go)\n// - TS 本文件\n// - SDK / Web / Desktop 文档 §6\n// -----------------------------------------------------------------------------\n\n/** 远程控制能力 (分组 scope, 自包含展开到 3 个子 scope). 高风险, 不进 allScopes(). */\nexport const ScopeRemoteControl = 'remote_control';\n/** 创建 / 取消 / stream AgentRun. */\nexport const ScopeRemoteControlAgentRun = 'remote_control:agent-run';\n/** 远程会话 lifecycle 控制 (cancel / interrupt / kill). */\nexport const ScopeRemoteControlSessionControl = 'remote_control:session-control';\n/** 代表用户提交远控权限审批响应 (allow / deny / timeout). */\nexport const ScopeRemoteControlPermissionResponse = 'remote_control:permission-response';\n\n/** 第三方聊天集成桥接 (分组 scope, 服务端 ScopeExpansion 展开为 read/write/rotate)。凭证管理高风险, 不进 allScopes()。 */\nexport const ScopeChatBridge = 'chat_bridge';\n/** 查询 integration / session / 凭证元数据 (仅 ref+fingerprint)。 */\nexport const ScopeChatBridgeRead = 'chat_bridge:read';\n/** 创建 / 更新 integration 与凭证。 */\nexport const ScopeChatBridgeWrite = 'chat_bridge:write';\n/** 轮换 / 吊销凭证 (高风险)。 */\nexport const ScopeChatBridgeRotate = 'chat_bridge:rotate';\n\n/**\n * 会员委托 Key 控制面 scope (2026-08-14 开放 API 方案)。\n *\n * 高风险且**刻意不进 allScopes()**: 持有它即可签发\"长期代表本人会员权益调用模型\"的静态凭证,\n * 桌面登录不应自动获得该能力 —— 调用方必须显式申请, 用户才会在同意页看到这项授权。\n * 服务端三条约束一起才闭合 (见 Go desktop_oauth.go): 不并入任何分组展开、不得签进 sk- Key、\n * 签发接口只接受有同意页的 desktop OAuth 或同源登录态。\n */\nexport const ScopeAgentAccessManage = 'agent_access:manage';\n\n/** @deprecated 旧细粒度 scope, 保留向后兼容, 新代码请用分组 scope */\nexport const ScopeModels = 'models';\n/** @deprecated */\nexport const ScopeModelsChat = 'models:chat';\n/** @deprecated */\nexport const ScopeEntitlements = 'entitlements';\n/** @deprecated */\nexport const ScopeTokenPackages = 'token-packages';\n/** @deprecated */\nexport const ScopeSkillStore = 'skill_store';\n/** @deprecated */\nexport const ScopeTools = 'tools';\n/** @deprecated */\nexport const ScopeToolsExecute = 'tools:execute';\n/** @deprecated */\nexport const ScopeWallet = 'wallet';\n/** @deprecated */\nexport const ScopeWalletReadonly = 'wallet:readonly';\n/** @deprecated */\nexport const ScopeProfile = 'profile';\n\n/** 全部分组 scope (推荐) */\nexport function allScopes(): string[] {\n return [ScopeAI, ScopeSkills, ScopeAccount];\n}\n\n/** 模型服务相关 scope */\nexport function modelScopes(): string[] {\n return [ScopeAI];\n}\n\n/** 商城/钱包 scope */\nexport function commerceScopes(): string[] {\n return [ScopeAI, ScopeAccount];\n}\n\n/** 技能/工具 scope */\nexport function skillScopes(): string[] {\n return [ScopeSkills];\n}\n\n/**\n * 远程控制 scope (推荐). 仅返回分组 ScopeRemoteControl, 服务端 ScopeExpansion 会展开\n * 为 3 个子 scope. 调用方需显式申请, allScopes() 不包含本项 (避免桌面登录自动获权).\n */\nexport function remoteControlScopes(): string[] {\n return [ScopeRemoteControl];\n}\n\n/**\n * 聊天桥接 scope (推荐). 仅返回分组 ScopeChatBridge; 服务端展开为 3 子 scope。调用方需显式申请, allScopes() 不含。\n */\nexport function chatBridgeScopes(): string[] {\n return [ScopeChatBridge];\n}\n\n/**\n * 会员委托 Key 控制面 scope (需显式申请; allScopes() 不含本项)。\n * 典型用法: `authorize({ scopes: [...allScopes(), ...agentAccessScopes()] })`\n */\nexport function agentAccessScopes(): string[] {\n return [ScopeAgentAccessManage];\n}\n","// models/index.ts — 模型网关域 barrel\n//\n// 收口 ManagedModel / Chat / wire-format DTO / 双格式 adapter / 选模型 helper。\n\n// === 类型 ===\nexport * from './types';\nexport * from './wire-anthropic';\nexport * from './wire-openai';\n\n// === Model catalog helpers (v1.2+, CrabCode desktop automation 选模型用) ===\nexport {\n modelSupportsInputModality,\n modelSupportsImageInput,\n findFirstModelByInputModality,\n findDesktopVisualUnderstandingModel,\n} from './model-helpers';\n\n// === Adapters (双格式) ===\nexport {\n ProviderFormat,\n type ProviderAdapter,\n AnthropicAdapter,\n OpenAIAdapter,\n getAdapter,\n getAdapterForModel,\n} from './adapters/index';\n\n// === Stream meta ===\nexport { extractAnthropicBlockMeta, type BlockMeta } from './stream-meta';\n\n// === Betas ===\nexport { buildBetas, uniqueMerge } from './betas';\n\n// === v1.6.0 业务侧终端用户 id helper ===\nexport { validateEndUserId, maxEndUserIdLength, isSSECommentLine } from './enduser';\n","// models/wire-anthropic.ts — Anthropic wire-format 响应 DTO。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 AnthropicResponse 段。\n//\n// 命名约定:字段名 = Go json tag 字面量 (wire format), 不做 camelCase 重映射。\n\n/**\n * Anthropic 内容块\n * 覆盖: text / thinking / redacted_thinking / tool_use / tool_result /\n * server_tool_use / mcp_tool_use / mcp_tool_result\n */\nexport interface AnthropicContentBlock {\n type: string;\n text?: string;\n /** tool_use / server_tool_use / mcp_tool_use block ID */\n id?: string;\n /** tool_use function name */\n name?: string;\n /** tool_use arguments (json.RawMessage) */\n input?: unknown;\n /** thinking block content */\n thinking?: string;\n\n /** text — web_search 搜索引用 */\n citations?: unknown;\n /** thinking — Anthropic 签名 (后续请求必须回传) */\n signature?: string;\n /** redacted_thinking — base64 编码的被审查思考内容 */\n data?: string;\n /** server_tool_use / mcp_tool_use / mcp_tool_result — 服务端工具来源 */\n server_name?: string;\n /** mcp_tool_use — MCP 调用者上下文 */\n caller?: unknown;\n /** tool_result / mcp_tool_result — 工具执行结果 */\n tool_use_id?: string;\n content?: unknown;\n is_error?: boolean;\n}\n\n/** Anthropic token 用量 */\nexport interface AnthropicUsage {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\n/**\n * Anthropic 原生格式同步响应\n * POST /managed-models/:id/anthropic 返回此格式 (无 response.Success 包装)\n */\nexport interface AnthropicResponse {\n id: string;\n /** \"message\" */\n type: string;\n /** \"assistant\" */\n role: string;\n content: AnthropicContentBlock[];\n model: string;\n stop_reason: string;\n stop_sequence?: string | null;\n usage: AnthropicUsage;\n}\n\n/** 提取所有 text 类型内容块的文本,拼接返回 */\nexport function anthropicResponseTextContent(r: AnthropicResponse): string {\n const parts: string[] = [];\n for (const b of r.content) {\n if (b.type === 'text' && b.text) parts.push(b.text);\n }\n return parts.join('');\n}\n\n/** 提取所有 thinking 类型内容块的文本,拼接返回 */\nexport function anthropicResponseThinkingContent(r: AnthropicResponse): string {\n const parts: string[] = [];\n for (const b of r.content) {\n if (b.type === 'thinking' && b.thinking) parts.push(b.thinking);\n }\n return parts.join('');\n}\n\n/** 返回所有 tool_use 类型的内容块 */\nexport function anthropicResponseToolUseBlocks(r: AnthropicResponse): AnthropicContentBlock[] {\n return r.content.filter((b) => b.type === 'tool_use');\n}\n","// model-helpers.ts — ManagedModel catalog helpers (v1.2+)\n//\n// 目标 — 让 CrabCode / CrabClaw 等下游产品在做 desktop automation / computer-use 选模型时\n// 完全依赖 SDK listModels 下发的 capabilities + inputModalities 字段, 杜绝任何\n// 基于模型名 substring 的硬编码推断 (例如 \"包含 vision 就当视觉模型\").\n//\n// 红线:\n// 1. 这里没有任何 model name match — 只读 ManagedModel 字段.\n// 2. 缺失字段一律保守判负 — 缺 inputModalities 视为 \"未声明\", 不当 image-capable.\n// 3. supports_desktop_visual_understanding 是 capability 矩阵字段, 与\n// inputModalities=['image'] 是正交两件事; 桌面 sidecar 选择必须两个条件同时满足.\n\nimport type { InputModality, ManagedModel } from './types';\n\n/**\n * 判断 ManagedModel 是否声明支持指定输入模态.\n *\n * 语义:\n * - model 为 null/undefined → false\n * - model.inputModalities 缺失或非数组 → false (保守, 未声明不当支持)\n * - 大小写敏感 (上游契约即小写 'text' | 'image')\n */\nexport function modelSupportsInputModality(\n model: ManagedModel | null | undefined,\n modality: InputModality,\n): boolean {\n if (!model) return false;\n const mods = model.inputModalities;\n if (!Array.isArray(mods)) return false;\n return mods.includes(modality);\n}\n\n/** 等价 modelSupportsInputModality(model, 'image') — 调用方常见快捷判定. */\nexport function modelSupportsImageInput(model: ManagedModel | null | undefined): boolean {\n return modelSupportsInputModality(model, 'image');\n}\n\n/**\n * 在 catalog 中按 catalog 顺序查找首个支持指定模态的模型.\n *\n * 选择规则:\n * 1. isEnabled !== false (默认开, 显式 false 才剔除)\n * 2. inputModalities 包含指定模态\n * 3. 命中后按 catalog 顺序返回第一个; 未命中返 null\n *\n * 注意: 该 helper 不读 isDefault, 调用方需要 \"默认优先\" 请用\n * findDesktopVisualUnderstandingModel 或自行排序.\n */\nexport function findFirstModelByInputModality(\n models: ManagedModel[],\n modality: InputModality,\n): ManagedModel | null {\n if (!Array.isArray(models)) return null;\n for (const m of models) {\n if (!m) continue;\n if (m.isEnabled === false) continue;\n if (!modelSupportsInputModality(m, modality)) continue;\n return m;\n }\n return null;\n}\n\n/**\n * 在 catalog 中选出最适合做 \"桌面视觉理解 sidecar\" 的模型.\n *\n * 设计目的: CrabCode desktop automation 链路里, 主模型不一定多模态;\n * 截图先送 sidecar 解析成结构化 UI 描述, 再喂主模型. 这里选 sidecar 模型\n * 严格走运营标注的 supports_desktop_visual_understanding capability, 不靠\n * 模型名猜.\n *\n * 选择规则 (按用户指定顺序):\n * 1. isEnabled !== false\n * 2. capabilities.supports_desktop_visual_understanding === true\n * 3. inputModalities 包含 'image' (必须真能吃图)\n * 4. 命中集合中优先 isDefault === true; 否则返回 catalog 顺序第一个\n *\n * 全部不满足返 null. 调用方收到 null 应:\n * - 提示用户在管理后台/网关侧开启桌面视觉 sidecar 模型, 或\n * - 降级停掉依赖截图的工作流, 而不是硬选一个非视觉模型送图.\n */\nexport function findDesktopVisualUnderstandingModel(\n models: ManagedModel[],\n): ManagedModel | null {\n if (!Array.isArray(models)) return null;\n const candidates: ManagedModel[] = [];\n for (const m of models) {\n if (!m) continue;\n if (m.isEnabled === false) continue;\n if (m.capabilities?.supports_desktop_visual_understanding !== true) continue;\n if (!modelSupportsInputModality(m, 'image')) continue;\n candidates.push(m);\n }\n if (candidates.length === 0) return null;\n for (const m of candidates) {\n // 注: 公开 listModels() 不返回 isDefault, 此分支仅对 admin 上下文调用方生效; 公开数据下会落到 catalog 顺序首个 (可接受)。\n if (m.isDefault === true) return m;\n }\n return candidates[0];\n}\n","// client/entitlements.ts — 端口自 acosmi-sdk-go/client.go (Entitlements + V29 Per-Model Bucket section)\n//\n// declaration merging 扩展 Client class.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n BalanceDetail,\n ConsumeRecordPage,\n EntitlementBalance,\n EntitlementItem,\n ModelBucket,\n ModelByQuotaResponse,\n ModelCoefficient,\n} from './types';\nimport { Client } from '../core/client';\nimport { coefCacheTTLMs } from '../core/http';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 查询当前用户的权益余额 (聚合) */\n getBalance(signal?: AbortSignal): Promise<EntitlementBalance>;\n /** 查询详细余额 (含每条权益明细) */\n getBalanceDetail(signal?: AbortSignal): Promise<BalanceDetail>;\n /** 查询当前用户权益列表; status: \"ACTIVE\" / \"EXPIRED\" / \"\" (全部) */\n listEntitlements(status: string, signal?: AbortSignal): Promise<EntitlementItem[]>;\n /** 查询核销记录 (分页) */\n listConsumeRecords(page: number, pageSize: number, signal?: AbortSignal): Promise<ConsumeRecordPage>;\n /** 领取当月免费额度 — 幂等: 已领取时返回已有权益 */\n claimMonthlyFree(signal?: AbortSignal): Promise<EntitlementItem>;\n /** 查询当前用户在指定模型下的剩余 token (raw + ETU) */\n getByModel(modelID: string, signal?: AbortSignal): Promise<ModelByQuotaResponse>;\n /** 列出当前用户的全部桶 */\n listBuckets(signal?: AbortSignal): Promise<ModelBucket[]>;\n /** @deprecated 系数已退役, 网关恒返回 []。*/\n /** 拉取模型系数表; SDK 自带 8s TTL 内存缓存以减小调用风暴. */\n listCoefficients(signal?: AbortSignal): Promise<ModelCoefficient[]>;\n /** @deprecated 系数已退役, 网关恒返回 []。*/\n /** 手动失效系数缓存 (admin 调价后建议立即调一次) */\n invalidateCoefficientCache(): void;\n }\n}\n\nClient.prototype.getBalance = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<EntitlementBalance>>(\n 'GET',\n '/entitlements/balance',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getBalanceDetail = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<BalanceDetail>>(\n 'GET',\n '/entitlements/balance-detail',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listEntitlements = async function (this: Client, status: string, signal?: AbortSignal) {\n let path = '/entitlements';\n if (status !== '') {\n path += `?status=${encodeURIComponent(status)}`;\n }\n const resp = await this.doJSON<APIResponse<EntitlementItem[]>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.listConsumeRecords = async function (\n this: Client,\n page: number,\n pageSize: number,\n signal?: AbortSignal,\n) {\n const path = `/entitlements/consume-records?page=${page}&pageSize=${pageSize}`;\n const resp = await this.doJSON<APIResponse<ConsumeRecordPage>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.claimMonthlyFree = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<EntitlementItem>>(\n 'POST',\n '/entitlements/claim-monthly',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getByModel = async function (this: Client, modelID: string, signal?: AbortSignal) {\n if (modelID === '') throw new Error('modelID required');\n const path = `/entitlements/by-model?modelId=${encodeURIComponent(modelID)}`;\n const resp = await this.doJSON<APIResponse<ModelByQuotaResponse>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.listBuckets = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<ModelBucket[]>>(\n 'GET',\n '/entitlements/buckets',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listCoefficients = async function (this: Client, signal?: AbortSignal) {\n // 简单内存缓存 + TTL (8s)\n if (this.coefCacheData && Date.now() - this.coefCacheTimeMs < coefCacheTTLMs) {\n return [...this.coefCacheData]; // shallow copy 防外部篡改\n }\n const resp = await this.doJSON<APIResponse<ModelCoefficient[]>>(\n 'GET',\n '/entitlements/coefficients',\n null,\n signal,\n );\n this.coefCacheData = [...resp.data];\n this.coefCacheTimeMs = Date.now();\n return resp.data;\n};\n\nClient.prototype.invalidateCoefficientCache = function (this: Client) {\n this.coefCacheData = null;\n this.coefCacheTimeMs = 0;\n};\n","// client/packages.ts — 端口自 acosmi-sdk-go/client.go (Token Packages / 商城 section)\n\nimport type { APIResponse, YudaoPageResult } from '../shared/api-response';\nimport type {\n BuyResponse,\n OrderListItem,\n PayPayload,\n TokenPackage,\n} from './types';\nimport { OrderTerminalError } from '../shared/errors';\nimport { Client } from '../core/client';\nimport { isOrderSuccess, isOrderTerminal } from '../core/http';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 获取商城流量包列表 (兼容 yudao 分页和直接数组两种格式) */\n listTokenPackages(signal?: AbortSignal): Promise<TokenPackage[]>;\n /** 获取流量包详情 */\n getTokenPackageDetail(packageID: string, signal?: AbortSignal): Promise<TokenPackage>;\n /** 购买流量包 (创建订单) */\n buyTokenPackage(packageID: string, payload: PayPayload | null, signal?: AbortSignal): Promise<BuyResponse>;\n /** 查询订单支付状态 */\n getOrderStatus(orderID: string, signal?: AbortSignal): Promise<BuyResponse>;\n /** 查询我的订单列表 */\n listMyOrders(signal?: AbortSignal): Promise<OrderListItem[]>;\n /**\n * 轮询订单支付状态直到终态\n * 成功支付返回 BuyResponse; 终态失败抛 OrderTerminalError\n * 终态判定基于 paymentStatus (回退 orderStatus)\n * pollIntervalMs <= 0 时默认 2 秒\n */\n waitForPayment(orderID: string, pollIntervalMs: number, signal?: AbortSignal): Promise<BuyResponse>;\n }\n}\n\nClient.prototype.listTokenPackages = async function (this: Client, signal?: AbortSignal) {\n const raw = await this.doJSON<APIResponse<unknown>>('GET', '/token-packages', null, signal);\n // 尝试 yudao 分页格式\n if (raw.data && typeof raw.data === 'object' && 'list' in raw.data) {\n const page = raw.data as YudaoPageResult<TokenPackage>;\n if (Array.isArray(page.list)) return page.list;\n }\n // 降级: 直接数组\n if (Array.isArray(raw.data)) return raw.data as TokenPackage[];\n throw new Error('decode token packages: unexpected shape');\n};\n\nClient.prototype.getTokenPackageDetail = async function (\n this: Client,\n packageID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<TokenPackage>>(\n 'GET',\n `/token-packages/${encodeURIComponent(packageID)}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.buyTokenPackage = async function (\n this: Client,\n packageID: string,\n payload: PayPayload | null,\n signal?: AbortSignal,\n) {\n const body = payload ?? null;\n const resp = await this.doJSON<APIResponse<BuyResponse>>(\n 'POST',\n `/token-packages/${encodeURIComponent(packageID)}/buy`,\n body,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getOrderStatus = async function (\n this: Client,\n orderID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<BuyResponse>>(\n 'GET',\n `/token-packages/orders/${encodeURIComponent(orderID)}/status`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listMyOrders = async function (this: Client, signal?: AbortSignal) {\n const raw = await this.doJSON<APIResponse<unknown>>('GET', '/token-packages/my', null, signal);\n if (raw.data && typeof raw.data === 'object' && 'list' in raw.data) {\n const page = raw.data as YudaoPageResult<OrderListItem>;\n if (Array.isArray(page.list)) return page.list;\n }\n if (Array.isArray(raw.data)) return raw.data as OrderListItem[];\n throw new Error('decode orders: unexpected shape');\n};\n\nClient.prototype.waitForPayment = async function (\n this: Client,\n orderID: string,\n pollIntervalMs: number,\n signal?: AbortSignal,\n) {\n if (pollIntervalMs <= 0) pollIntervalMs = 2000;\n while (true) {\n const status = await this.getOrderStatus(orderID, signal);\n const st = status.paymentStatus ?? status.orderStatus;\n if (isOrderTerminal(st)) {\n if (isOrderSuccess(st)) return status;\n throw new OrderTerminalError(orderID, st);\n }\n await sleepWithSignal(pollIntervalMs, signal);\n }\n};\n\nasync function sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n if (signal && signal.aborted) throw new Error('aborted');\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n if (signal && abortHandler) signal.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n let abortHandler: (() => void) | undefined;\n if (signal) {\n abortHandler = () => {\n clearTimeout(t);\n signal.removeEventListener('abort', abortHandler!);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n }\n });\n}\n","// client/wallet.ts — 端口自 acosmi-sdk-go/client.go (Wallet section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { Transaction, WalletStats } from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 获取钱包统计 (余额/月消费/月充值) */\n getWalletStats(signal?: AbortSignal): Promise<WalletStats>;\n /** 获取最近交易记录 */\n getWalletTransactions(signal?: AbortSignal): Promise<Transaction[]>;\n }\n}\n\nClient.prototype.getWalletStats = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<WalletStats>>('GET', '/wallet/stats', null, signal);\n return resp.data;\n};\n\nClient.prototype.getWalletTransactions = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<Transaction[]>>(\n 'GET',\n '/wallet/transactions',\n null,\n signal,\n );\n return resp.data;\n};\n","// client/skills.ts — 端口自 acosmi-sdk-go/client.go (Skill Store + Generator section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n CertificationStatus,\n GenerateSkillRequest,\n GenerateSkillResult,\n OptimizeSkillRequest,\n OptimizeSkillResult,\n SkillBrowseListResponse,\n SkillBrowseResponse,\n SkillStoreItem,\n SkillStoreQuery,\n SkillSummary,\n} from './types';\nimport { RateLimitError, isUserAccessTokenRejected } from '../shared/errors';\nimport { Client } from '../core/client';\nimport {\n classifyTransport,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n readLimitedText,\n} from '../core/http';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 浏览技能商店 (公共端点, 无需认证) */\n browseSkillStore(query: SkillStoreQuery, signal?: AbortSignal): Promise<SkillStoreItem[]>;\n /** 浏览公共技能商店 (V3 分页接口) */\n browseSkills(\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n ): Promise<SkillBrowseResponse>;\n /** 轻量浏览公共技能商店 (fields=minimal, 响应体积缩减 90%+) */\n browseSkillsList(\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n ): Promise<SkillBrowseListResponse>;\n /** 获取技能商店中某个技能的详情 (公共端点) */\n getSkillDetail(skillID: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /** 按 key 精确查找公共技能 (公共端点) */\n resolveSkill(key: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /** 安装技能到当前用户的租户空间 (需 OAuth scope: skill_store) */\n installSkill(skillID: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /**\n * 下载技能 ZIP 包 (公共端点, 双模式)\n * 有 token 时自动附带 (享受无限流), 无 token 时匿名 (受限流)\n * @returns [data, filename]; 限流时抛 RateLimitError\n */\n downloadSkill(skillID: string, signal?: AbortSignal): Promise<{ data: Uint8Array; filename: string }>;\n /**\n * 上传技能 ZIP 包\n * @param scope \"TENANT\"\n * @param intent \"PERSONAL\" (仅自己用) 或 \"PUBLIC_INTENT\" (走认证→公开)\n */\n uploadSkill(zipData: Uint8Array, scope: string, intent: string, signal?: AbortSignal): Promise<SkillStoreItem>;\n /** 获取技能统计概览 */\n getSkillSummary(signal?: AbortSignal): Promise<SkillSummary>;\n /** 触发技能认证管线 (异步) */\n certifySkill(skillID: string, signal?: AbortSignal): Promise<void>;\n /** 查询技能认证状态 */\n getCertificationStatus(skillID: string, signal?: AbortSignal): Promise<CertificationStatus>;\n /** 根据自然语言描述生成技能定义 (基于独立 LLM) */\n generateSkill(req: GenerateSkillRequest, signal?: AbortSignal): Promise<GenerateSkillResult>;\n /** 优化已有技能定义 */\n optimizeSkill(req: OptimizeSkillRequest, signal?: AbortSignal): Promise<OptimizeSkillResult>;\n /** 校验技能定义正确性 */\n validateSkill(skillName: string, signal?: AbortSignal): Promise<void>;\n }\n}\n\nClient.prototype.browseSkillStore = async function (\n this: Client,\n query: SkillStoreQuery,\n signal?: AbortSignal,\n) {\n const resp = await this.browseSkills(\n 1,\n 50,\n query.category ?? '',\n query.keyword ?? '',\n query.tag ?? '',\n '',\n signal,\n );\n return resp.items;\n};\n\nClient.prototype.browseSkills = async function (\n this: Client,\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n) {\n const qv = new URLSearchParams();\n qv.set('page', String(page));\n qv.set('pageSize', String(pageSize));\n if (category) qv.set('category', category);\n if (keyword) qv.set('keyword', keyword);\n if (tag) qv.set('tag', tag);\n if (source) qv.set('source', source);\n const resp = await this.doPublicJSON<APIResponse<SkillBrowseResponse>>(\n 'GET',\n `/skill-store?${qv.toString()}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.browseSkillsList = async function (\n this: Client,\n page: number,\n pageSize: number,\n category: string,\n keyword: string,\n tag: string,\n source: string,\n signal?: AbortSignal,\n) {\n const qv = new URLSearchParams();\n qv.set('page', String(page));\n qv.set('pageSize', String(pageSize));\n qv.set('fields', 'minimal');\n if (category) qv.set('category', category);\n if (keyword) qv.set('keyword', keyword);\n if (tag) qv.set('tag', tag);\n if (source) qv.set('source', source);\n const resp = await this.doPublicJSON<APIResponse<SkillBrowseListResponse>>(\n 'GET',\n `/skill-store?${qv.toString()}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getSkillDetail = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doPublicJSON<APIResponse<SkillStoreItem>>(\n 'GET',\n `/skill-store/${encodeURIComponent(skillID)}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.resolveSkill = async function (\n this: Client,\n key: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doPublicJSON<APIResponse<SkillStoreItem>>(\n 'GET',\n `/skill-store/resolve/${encodeURIComponent(key)}`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.installSkill = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<SkillStoreItem>>(\n 'POST',\n `/skill-store/${encodeURIComponent(skillID)}/install`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.downloadSkill = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n // 5min 超时 (大文件下载)\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 5 * 60 * 1000);\n let parentHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) ctl.abort();\n else {\n parentHandler = () => ctl.abort();\n signal.addEventListener('abort', parentHandler);\n }\n }\n\n try {\n const url = this.apiURL(`/skill-store/${encodeURIComponent(skillID)}/download`);\n const headers: Record<string, string> = {};\n let token = '';\n try {\n token = await this.ensureToken(ctl.signal);\n } catch {\n // 公共端点允许无 token\n }\n if (token) headers['Authorization'] = `Bearer ${token}`;\n\n let resp: Response;\n try {\n resp = await this.fetchImpl(url, { method: 'GET', headers, signal: ctl.signal });\n } catch (e) {\n throw classifyTransport('GET ' + `/skill-store/${skillID}/download`, url, e);\n }\n\n if (resp.status === 429) {\n const bodyText = await readLimitedText(resp.body!, maxErrorBodySize);\n throw new RateLimitError('匿名下载已达限制', resp.headers.get('Retry-After') ?? '', bodyText);\n }\n\n if (!resp.ok) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw new Error(\n `download skill: ${parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers).message}`,\n );\n }\n\n const data = await readLimited(resp.body!, maxDownloadSize + 1);\n if (data.byteLength > maxDownloadSize) {\n throw new Error(`download skill: response exceeds ${maxDownloadSize >> 20}MB limit`);\n }\n\n let filename = 'skill.zip';\n const cd = resp.headers.get('Content-Disposition');\n if (cd) {\n const idx = cd.indexOf('filename');\n if (idx !== -1) {\n const parts = cd.slice(idx).split('=', 2);\n if (parts.length === 2) {\n filename = parts[1]!.trim().replace(/^[\"' ]+|[\"' ]+$/g, '');\n }\n }\n }\n\n return { data, filename };\n } finally {\n clearTimeout(timer);\n if (parentHandler && signal) signal.removeEventListener('abort', parentHandler);\n }\n};\n\nClient.prototype.uploadSkill = async function (\n this: Client,\n zipData: Uint8Array,\n scope: string,\n intent: string,\n signal?: AbortSignal,\n) {\n return uploadSkillInternal(this, zipData, scope, intent, false, signal);\n};\n\nasync function uploadSkillInternal(\n c: Client,\n zipData: Uint8Array,\n scope: string,\n intent: string,\n retried: boolean,\n signal?: AbortSignal,\n): Promise<SkillStoreItem> {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), 5 * 60 * 1000);\n let parentHandler: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) ctl.abort();\n else {\n parentHandler = () => ctl.abort();\n signal.addEventListener('abort', parentHandler);\n }\n }\n\n try {\n const token = await c.ensureToken(ctl.signal);\n\n // 用 FormData (多端通用) 替代 Go mime/multipart\n const form = new FormData();\n form.append('scope', scope);\n form.append('intent', intent);\n // Blob 在浏览器/Node 18+ 都可用\n // 显式 cast: TS 5.7+ Uint8Array<ArrayBufferLike> 与 BlobPart 严格度问题\n const blob = new Blob([zipData as BlobPart], { type: 'application/zip' });\n form.append('file', blob, 'skill.zip');\n\n const url = c.apiURL('/skill-store/upload');\n let resp: Response;\n try {\n resp = await c.fetchImpl(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n body: form,\n signal: ctl.signal,\n });\n } catch (e) {\n throw classifyTransport('POST /skill-store/upload', url, e);\n }\n\n if (resp.status === 401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n try {\n await c.forceRefresh(ctl.signal, token);\n } catch (refreshErr) {\n throw new Error(\n `upload: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`,\n );\n }\n return uploadSkillInternal(c, zipData, scope, intent, true, signal);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = await readLimited(resp.body!, maxErrorBodySize);\n throw new Error(\n `upload: ${parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers).message}`,\n );\n }\n\n const text = await resp.text();\n const result = JSON.parse(text) as { data: { skill: SkillStoreItem } };\n return result.data.skill;\n } finally {\n clearTimeout(timer);\n if (parentHandler && signal) signal.removeEventListener('abort', parentHandler);\n }\n}\n\nClient.prototype.getSkillSummary = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<SkillSummary>>('GET', '/skills/summary', null, signal);\n return resp.data;\n};\n\nClient.prototype.certifySkill = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'POST',\n `/skill-store/${encodeURIComponent(skillID)}/certify`,\n null,\n signal,\n );\n};\n\nClient.prototype.getCertificationStatus = async function (\n this: Client,\n skillID: string,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<CertificationStatus>>(\n 'GET',\n `/skill-store/${encodeURIComponent(skillID)}/certification`,\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.generateSkill = async function (\n this: Client,\n req: GenerateSkillRequest,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<GenerateSkillResult>>(\n 'POST',\n '/skill-generator/generate',\n req,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.optimizeSkill = async function (\n this: Client,\n req: OptimizeSkillRequest,\n signal?: AbortSignal,\n) {\n const resp = await this.doJSON<APIResponse<OptimizeSkillResult>>(\n 'POST',\n '/skill-generator/optimize',\n req,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.validateSkill = async function (\n this: Client,\n skillName: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'POST',\n '/skill-generator/validate',\n { skillName },\n signal,\n );\n};\n","// client/tools.ts — 端口自 acosmi-sdk-go/client.go (Unified Tools section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { ToolListResponse, ToolView } from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 获取当前用户租户下的所有工具 (Skill 优先 + Plugin 兜底) */\n listTools(signal?: AbortSignal): Promise<ToolView[]>;\n /** 获取单个工具详情 */\n getTool(toolID: string, signal?: AbortSignal): Promise<ToolView>;\n }\n}\n\nClient.prototype.listTools = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<ToolListResponse>>('GET', '/tools', null, signal);\n return resp.data.skills;\n};\n\nClient.prototype.getTool = async function (this: Client, toolID: string, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<ToolView>>(\n 'GET',\n `/tools/${encodeURIComponent(toolID)}`,\n null,\n signal,\n );\n return resp.data;\n};\n","// notifications/types.ts — 通知 / WebSocket 推送域类型。\n//\n// 端口自 acosmi-sdk-go/types.go (v0.19.0) 的 Notifications / WebSocket 类型 段。\n//\n// 命名约定:字段名 = Go json tag 字面量 (wire format), 不做 camelCase 重映射。\n\n// =============================================================================\n// Notifications\n// =============================================================================\n\n/** 单条通知 */\nexport interface Notification {\n id: string;\n title: string;\n content: string;\n /** system | billing | security | task | commission | entitlement */\n type: string;\n isRead: boolean;\n createdAt: string;\n}\n\n/** 分页通知列表 */\nexport interface NotificationList {\n list: Notification[];\n unreadCount: number;\n total: number;\n page: number;\n pageSize: number;\n}\n\n/** 未读通知计数 */\nexport interface NotificationUnreadCount {\n unreadCount: number;\n}\n\n/** 通知偏好 (按类型+渠道) */\nexport interface NotificationPreference {\n typeCode: string;\n channelInApp: boolean;\n channelEmail: boolean;\n channelSms: boolean;\n channelPush: boolean;\n}\n\n/** 推送设备注册 */\nexport interface DeviceRegistration {\n /** android | ios | harmony */\n platform: string;\n token: string;\n appVersion: string;\n}\n\n// =============================================================================\n// WebSocket 类型 (forward-declared 这里, 实现在 ws.ts)\n// =============================================================================\n\n/** 服务端推送事件 */\nexport interface WSEvent {\n type: string;\n topic?: string;\n /** json.RawMessage in Go */\n data?: unknown;\n connId?: string;\n timestamp?: string;\n message?: string;\n}\n\n/**\n * 从 WSEvent 中解析通知\n * 返回 null 表示该事件不是系统通知\n */\nexport function parseNotificationEvent(ev: WSEvent): Notification | null {\n if (ev.type !== 'event' || ev.topic !== 'system') {\n return null;\n }\n if (ev.data == null) return null;\n let n: Notification;\n try {\n // ev.data 在 wire 上是 raw JSON, 但 JSON.parse 接收 string;\n // 接收方反序列化时可能已经是对象。两种形态都接住:\n if (typeof ev.data === 'string') {\n n = JSON.parse(ev.data);\n } else {\n n = ev.data as Notification;\n }\n } catch {\n return null;\n }\n if (!n.id) return null;\n return n;\n}\n","// client/notifications.ts — 端口自 acosmi-sdk-go/client.go (Notifications section)\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n DeviceRegistration,\n NotificationList,\n NotificationPreference,\n NotificationUnreadCount,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 分页查询通知列表 */\n listNotifications(\n page: number,\n pageSize: number,\n typeFilter: string,\n signal?: AbortSignal,\n ): Promise<NotificationList>;\n /** 获取未读通知数量 */\n getUnreadCount(signal?: AbortSignal): Promise<number>;\n /** 标记单条通知已读 */\n markNotificationRead(id: string, signal?: AbortSignal): Promise<void>;\n /** 标记全部通知已读 */\n markAllNotificationsRead(signal?: AbortSignal): Promise<void>;\n /** 删除通知 */\n deleteNotification(id: string, signal?: AbortSignal): Promise<void>;\n /** 注册推送设备 token */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n registerDevice(reg: DeviceRegistration, signal?: AbortSignal): Promise<void>;\n /** 注销推送设备 token */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n unregisterDevice(token: string, signal?: AbortSignal): Promise<void>;\n /** 获取通知偏好设置 */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n listNotificationPreferences(signal?: AbortSignal): Promise<NotificationPreference[]>;\n /** 更新通知偏好 */\n /** @experimental 网关尚未提供 /devices/* 与 /notification-preferences/* 端点, 调用将 404。后端实现落地前请勿在生产使用。 */\n updateNotificationPreference(\n typeCode: string,\n pref: NotificationPreference,\n signal?: AbortSignal,\n ): Promise<void>;\n }\n}\n\nClient.prototype.listNotifications = async function (\n this: Client,\n page: number,\n pageSize: number,\n typeFilter: string,\n signal?: AbortSignal,\n) {\n let path = `/notifications?page=${page}&pageSize=${pageSize}`;\n if (typeFilter) path += `&type=${encodeURIComponent(typeFilter)}`;\n const resp = await this.doJSON<APIResponse<NotificationList>>('GET', path, null, signal);\n return resp.data;\n};\n\nClient.prototype.getUnreadCount = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<NotificationUnreadCount>>(\n 'GET',\n '/notifications/unread-count',\n null,\n signal,\n );\n return resp.data.unreadCount;\n};\n\nClient.prototype.markNotificationRead = async function (\n this: Client,\n id: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'PUT',\n `/notifications/${encodeURIComponent(id)}/read`,\n null,\n signal,\n );\n};\n\nClient.prototype.markAllNotificationsRead = async function (this: Client, signal?: AbortSignal) {\n await this.doJSON<APIResponse<unknown>>('PUT', '/notifications/read-all', null, signal);\n};\n\nClient.prototype.deleteNotification = async function (\n this: Client,\n id: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'DELETE',\n `/notifications/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n};\n\nClient.prototype.registerDevice = async function (\n this: Client,\n reg: DeviceRegistration,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>('POST', '/devices/register', reg, signal);\n};\n\nClient.prototype.unregisterDevice = async function (\n this: Client,\n token: string,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'DELETE',\n `/devices/${encodeURIComponent(token)}`,\n null,\n signal,\n );\n};\n\nClient.prototype.listNotificationPreferences = async function (this: Client, signal?: AbortSignal) {\n const resp = await this.doJSON<APIResponse<NotificationPreference[]>>(\n 'GET',\n '/notification-preferences',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.updateNotificationPreference = async function (\n this: Client,\n typeCode: string,\n pref: NotificationPreference,\n signal?: AbortSignal,\n) {\n await this.doJSON<APIResponse<unknown>>(\n 'PUT',\n `/notification-preferences/${encodeURIComponent(typeCode)}`,\n pref,\n signal,\n );\n};\n","// ws.ts — 端口自 acosmi-sdk-go/ws.go (308 行)\n//\n// WebSocket 长连接 — Client.prototype 扩展。\n// 跨端: 浏览器原生 / Node 22+ 原生 / Node 18-21 + 'ws' 包 (用户自行 polyfill)\n//\n// Go 用 gorilla/websocket, TS 用全局 WebSocket constructor。\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { WSEvent } from './types';\nimport { Client } from '../core/client';\nimport { maxErrorBodySize, parseHTTPErrorWithHeader, readLimited } from '../core/http';\nimport type { CredentialSnapshot } from '../core/store';\n\n/** WebSocket 长连接配置 */\nexport interface WSConfig {\n /** 收到服务端事件回调 */\n onEvent?: (ev: WSEvent) => void;\n /** 连接建立回调 */\n onConnect?: () => void;\n /** 断线回调 */\n onDisconnect?: (err: unknown) => void;\n /** 自动订阅的主题 */\n topics?: string[];\n /** 最小重连间隔 (ms, 默认 2000) */\n reconnectMinMs?: number;\n /** 最大重连间隔 (ms, 默认 60000) */\n reconnectMaxMs?: number;\n /** 是否自动重连 (默认 true) */\n autoReconnect?: boolean;\n}\n\ninterface WSStateImpl {\n conn: WebSocket | null;\n cfg: Required<WSConfig>;\n abort: AbortController;\n done: Promise<void>;\n doneResolve: () => void;\n connected: boolean;\n owner: WSOwner | null;\n}\n\ntype WSOwner = Pick<CredentialSnapshot, 'storeInstanceId' | 'authSessionId' | 'principal'>;\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 建立 WebSocket 长连接 — 等待首次连接成功或 abort。\n */\n connect(cfg: WSConfig, signal?: AbortSignal): Promise<void>;\n\n /** 优雅断开 WebSocket 连接 */\n disconnect(): Promise<void>;\n\n /** WebSocket 是否已连接 */\n isConnected(): boolean;\n }\n}\n\nClient.prototype.connect = async function (this: Client, cfg: WSConfig, signal?: AbortSignal) {\n // 幂等化重复 connect: 已有连接/重连 loop 时先优雅断开旧的, 否则旧 wsLoop 的后台\n // 自动重连定时器会和新连接并存 → 多个 WebSocket + 多个 setTimeout loop 泄漏 (FD + 内存)。\n // disconnect() 会 abort 旧 ws、关旧 conn、并等待旧读循环退出 (最多 5s)。\n const oldDisconnect = this.ws ? this.disconnect() : Promise.resolve();\n\n const noop = () => {};\n const filledCfg: Required<WSConfig> = {\n onEvent: cfg.onEvent ?? noop,\n onConnect: cfg.onConnect ?? noop,\n onDisconnect: cfg.onDisconnect ?? noop,\n topics: cfg.topics ?? [],\n reconnectMinMs: cfg.reconnectMinMs ?? 2000,\n reconnectMaxMs: cfg.reconnectMaxMs ?? 60_000,\n autoReconnect: cfg.autoReconnect ?? true,\n };\n\n let resolveDone!: () => void;\n const done = new Promise<void>((r) => {\n resolveDone = r;\n });\n\n const abort = new AbortController();\n if (signal) {\n if (signal.aborted) abort.abort();\n else signal.addEventListener('abort', () => abort.abort());\n }\n\n const ws: WSStateImpl = {\n conn: null,\n cfg: filledCfg,\n abort,\n done,\n doneResolve: resolveDone,\n connected: false,\n owner: null,\n };\n\n // Register before the first await so disconnect/replacement can cancel a\n // ticket request or handshake that has not produced a socket yet.\n this.ws = ws as unknown as Client['ws'];\n try {\n await oldDisconnect;\n await assertCurrent(this, ws);\n await wsConnectOnce(this, ws);\n } catch (error) {\n ws.abort.abort();\n if (this.ws === ws as unknown as Client['ws']) this.ws = null;\n ws.doneResolve();\n throw error;\n }\n\n // 后台读循环 + 自动重连\n void wsLoop(this, ws);\n};\n\nClient.prototype.disconnect = async function (this: Client) {\n const ws = this.ws as unknown as WSStateImpl | null;\n this.ws = null;\n if (!ws) return;\n\n ws.abort.abort();\n ws.connected = false;\n\n if (ws.conn) {\n try {\n ws.conn.close(1000, '');\n } catch {\n /* ignore */\n }\n }\n\n // 等待读循环退出 (最多 5s)\n await Promise.race([\n ws.done,\n new Promise<void>((resolve) => setTimeout(resolve, 5000)),\n ]);\n};\n\nClient.prototype.isConnected = function (this: Client) {\n const ws = this.ws as unknown as WSStateImpl | null;\n if (!ws) return false;\n return ws.connected;\n};\n\n// ============================================================================\n// 内部实现\n// ============================================================================\n\nfunction wsURL(c: Client): string {\n const base = c.apiURL('/ws');\n return base.replace(/^http:\\/\\//, 'ws://').replace(/^https:\\/\\//, 'wss://');\n}\n\nfunction getWebSocketCtor(): typeof WebSocket {\n const WSCtor = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n if (!WSCtor) {\n throw new Error(\n 'WebSocket not available — on Node ≤21 set globalThis.WebSocket = require(\"ws\") before connect',\n );\n }\n return WSCtor;\n}\n\nfunction sameOwner(a: WSOwner | null, b: WSOwner | null): boolean {\n return a?.storeInstanceId === b?.storeInstanceId &&\n a?.authSessionId === b?.authSessionId &&\n a?.principal?.issuer === b?.principal?.issuer &&\n a?.principal?.subject === b?.principal?.subject &&\n a?.principal?.organizationId === b?.principal?.organizationId;\n}\n\nasync function readOwner(c: Client, signal: AbortSignal): Promise<WSOwner | null> {\n if (c.credentialMode !== 'versioned') return null;\n const snapshot = await c.getCredentialSnapshot(signal);\n return { storeInstanceId: snapshot.storeInstanceId, authSessionId: snapshot.authSessionId,\n principal: snapshot.principal };\n}\n\nasync function assertCurrent(c: Client, ws: WSStateImpl): Promise<void> {\n if (ws.abort.signal.aborted || c.ws !== ws as unknown as Client['ws']) throw new Error('websocket connection superseded');\n if (ws.owner !== null && !sameOwner(ws.owner, await readOwner(c, ws.abort.signal))) {\n ws.abort.abort();\n throw new Error('websocket credential owner changed');\n }\n}\n\nasync function wsConnectOnce(c: Client, ws: WSStateImpl): Promise<void> {\n const observedOwner = await readOwner(c, ws.abort.signal);\n if (ws.owner === null) ws.owner = observedOwner;\n else if (!sameOwner(ws.owner, observedOwner)) throw new Error('websocket credential owner changed');\n await assertCurrent(c, ws);\n const url = wsURL(c);\n const WSCtor = getWebSocketCtor();\n\n // 鉴权 — 一次性 stream ticket 流程 (D7 根因修复).\n // 网关 /ws 守卫为 StreamTicketOr(...): 优先消费 ?ticket=, 回退读 Authorization\n // **请求头** (extractBearerToken), 而非旧实现假设的 ?token= query。浏览器原生\n // WebSocket 无法传自定义 header, 故旧的 ?token= 既对浏览器失效, 又把长效 JWT\n // 明文暴露在反代/网关/devtools 的 access log 里。\n //\n // 现改为: 每次 (重)连接前用已鉴权客户端 POST /ws/stream-ticket 换一张短时\n // 一次性 ticket (~30-60s TTL, 单次使用), 放入 ?ticket= query。ticket 即便落日志\n // 也已失效, 不泄露长效凭证。重连必须重新铸新 ticket (旧 ticket 已被消费/过期)。\n const token = await c.ensureToken(ws.abort.signal);\n await assertCurrent(c, ws);\n const ticketURL = c.apiURL('/ws/stream-ticket');\n await assertCurrent(c, ws);\n const ticketHTTP = await c.doRequest({ method: 'POST', url: ticketURL,\n headers: { Authorization: `Bearer ${token}` } }, ws.abort.signal);\n if (!ticketHTTP.ok) {\n const body = ticketHTTP.body ? await readLimited(ticketHTTP.body, maxErrorBodySize) : new Uint8Array();\n throw parseHTTPErrorWithHeader(ticketHTTP.status, body, ticketHTTP.headers);\n }\n const ticketResp = await ticketHTTP.json() as APIResponse<{ ticket: string; expiresIn: number }>;\n await assertCurrent(c, ws);\n const ticket = ticketResp.data.ticket;\n\n const u = new URL(url);\n u.searchParams.set('ticket', ticket);\n\n let conn: WebSocket;\n try {\n conn = new WSCtor(u.toString());\n } catch (e) {\n throw new Error(`dial: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n // 等待 open + welcome 消息\n await new Promise<void>((resolve, reject) => {\n let opened = false;\n const handshakeTimer = setTimeout(() => {\n if (!opened) {\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error('dial: handshake timeout'));\n }\n }, 30_000);\n const abortHandshake = () => {\n clearTimeout(handshakeTimer);\n try { conn.close(); } catch { /* ignore */ }\n reject(new Error('websocket connection aborted'));\n };\n ws.abort.signal.addEventListener('abort', abortHandshake, { once: true });\n\n conn.addEventListener('open', () => {\n if (ws.abort.signal.aborted || c.ws !== ws as unknown as Client['ws']) {\n try { conn.close(); } catch { /* ignore */ }\n return;\n }\n opened = true;\n });\n\n conn.addEventListener('error', (e: Event) => {\n clearTimeout(handshakeTimer);\n ws.abort.signal.removeEventListener('abort', abortHandshake);\n reject(new Error(`dial: ${(e as ErrorEvent).message ?? 'connection error'}`));\n });\n\n conn.addEventListener('message', (e: MessageEvent) => {\n // 第一条 message 应为 welcome\n try {\n const msg = e.data as string;\n const welcome = JSON.parse(msg) as WSEvent;\n if (welcome.type !== 'welcome') {\n clearTimeout(handshakeTimer);\n ws.abort.signal.removeEventListener('abort', abortHandshake);\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`unexpected first message: ${welcome.type}`));\n return;\n }\n void assertCurrent(c, ws).then(() => {\n clearTimeout(handshakeTimer);\n ws.abort.signal.removeEventListener('abort', abortHandshake);\n ws.conn = conn;\n ws.connected = true;\n\n // 自动订阅主题\n if (ws.cfg.topics.length > 0) {\n try {\n conn.send(\n JSON.stringify({\n type: 'subscribe',\n topics: ws.cfg.topics,\n }),\n );\n } catch (sendErr) {\n ws.conn = null;\n ws.connected = false;\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`send subscribe: ${sendErr instanceof Error ? sendErr.message : String(sendErr)}`));\n return;\n }\n }\n\n ws.cfg.onConnect();\n // eslint-disable-next-line no-console\n console.log(`[acosmi-sdk] websocket connected, connId=${welcome.connId ?? ''}`);\n resolve();\n }).catch(reject);\n } catch (parseErr) {\n clearTimeout(handshakeTimer);\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`parse welcome: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`));\n }\n }, { once: true });\n });\n}\n\nasync function wsLoop(c: Client, ws: WSStateImpl): Promise<void> {\n try {\n while (true) {\n // 读循环\n await wsReadLoop(c, ws);\n\n // 检查是否该退出\n if (ws.abort.signal.aborted) return;\n\n // 关闭旧连接, 防止 FD 泄漏\n if (ws.conn) {\n try {\n ws.conn.close();\n } catch {\n /* ignore */\n }\n ws.conn = null;\n }\n ws.connected = false;\n\n if (!ws.cfg.autoReconnect) return;\n\n // 自动重连 (指数退避)\n let delay = ws.cfg.reconnectMinMs;\n while (true) {\n if (ws.abort.signal.aborted) return;\n await sleepWithSignal(delay, ws.abort.signal).catch(() => {\n /* aborted */\n });\n if (ws.abort.signal.aborted) return;\n\n // eslint-disable-next-line no-console\n console.log(`[acosmi-sdk] websocket reconnecting (delay=${delay}ms)...`);\n try {\n await wsConnectOnce(c, ws);\n break; // 重连成功\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(`[acosmi-sdk] websocket reconnect failed: ${err instanceof Error ? err.message : String(err)}`);\n delay = Math.min(delay * 2, ws.cfg.reconnectMaxMs);\n }\n }\n }\n } finally {\n ws.doneResolve();\n }\n}\n\nasync function wsReadLoop(c: Client, ws: WSStateImpl): Promise<void> {\n const conn = ws.conn;\n if (!conn) return;\n\n return new Promise<void>((resolve) => {\n const handleMessage = (e: MessageEvent) => {\n try {\n const data = e.data as string;\n const event = JSON.parse(data) as WSEvent;\n void assertCurrent(c, ws).then(() => {\n try { ws.cfg.onEvent(event); } catch { /* observer isolation */ }\n }).catch(() => {\n try { conn.close(); } catch { /* ignore */ }\n });\n } catch {\n // 解析失败忽略\n }\n };\n\n const handleClose = (e: CloseEvent) => {\n conn.removeEventListener('message', handleMessage);\n conn.removeEventListener('close', handleClose);\n conn.removeEventListener('error', handleError);\n try {\n ws.cfg.onDisconnect(new Error(`closed: code=${e.code} reason=${e.reason}`));\n } catch {\n // ignore\n }\n resolve();\n };\n\n const handleError = (e: Event) => {\n conn.removeEventListener('message', handleMessage);\n conn.removeEventListener('close', handleClose);\n conn.removeEventListener('error', handleError);\n try {\n ws.cfg.onDisconnect(e);\n } catch {\n // ignore\n }\n resolve();\n };\n\n conn.addEventListener('message', handleMessage);\n conn.addEventListener('close', handleClose);\n conn.addEventListener('error', handleError);\n\n if (ws.abort.signal.aborted) {\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n } else {\n ws.abort.signal.addEventListener(\n 'abort',\n () => {\n try {\n conn.close();\n } catch {\n /* ignore */\n }\n },\n { once: true },\n );\n }\n });\n}\n\nasync function sleepWithSignal(ms: number, signal: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n if (signal.aborted) throw new Error('aborted');\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n signal.removeEventListener('abort', abortHandler);\n resolve();\n }, ms);\n const abortHandler = () => {\n clearTimeout(t);\n signal.removeEventListener('abort', abortHandler);\n reject(new Error('aborted'));\n };\n signal.addEventListener('abort', abortHandler);\n });\n}\n","// Agent Runs public SDK protocol.\n//\n// Public TypeScript API uses camelCase. The HTTP wire protocol uses snake_case\n// and is converted in client/agent-runs.ts.\n\nimport type {\n AdapterKind,\n PermissionPolicy,\n RunnerKind,\n WorkspacePolicy,\n} from './remote-control';\n\nexport type AgentRunStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Remote-control runtime selector (Phase 3 / contract §3).\n * - 'standard' existing chat/workflow path (default; backward compatible)\n * - 'crabcode_remote' CrabCode remote-control session; requires runner + adapter\n */\nexport type AgentRunRuntime = 'standard' | 'crabcode_remote';\n\nexport interface AgentRunLocalContextPolicy {\n enabled?: boolean;\n readonly?: boolean;\n maxBytes?: number;\n allowedTools?: string[];\n}\n\nexport interface AgentRunArtifactPolicy {\n enabled?: boolean;\n maxFiles?: number;\n}\n\n/**\n * Run metadata 约定键 (契约 §18.3 r4, additive)。\n *\n * 服务端防滥用上限: ≤32 条 / 键 ≤64B / 值 ≤2KB (`validateAgentRunMetadata`)。\n * - `title` 列表显示标题; 缺省由服务端从 input 首行派生 (60 rune 截断)。\n * - `workspace` 用户声明的期望项目目录; desktop runner 经\n * `revealRemoteToken()` 响应的 `workspace` 字段回传, 由桌面 launcher\n * 决定是否 chdir 采纳 (路径不存在/越权时回退本机当前目录并提示)。\n */\nexport const AGENT_RUN_META_TITLE = 'title';\nexport const AGENT_RUN_META_WORKSPACE = 'workspace';\n\nexport interface AgentRunCreateRequest {\n appId: string;\n mode?: string;\n sessionId?: string;\n input: string;\n messages?: unknown[];\n model?: string;\n activeSkillIds?: string[];\n knowledgeBaseIds?: string[];\n /**\n * 自由 KV 元数据。远控 run 的约定键见 {@link AGENT_RUN_META_TITLE} /\n * {@link AGENT_RUN_META_WORKSPACE} (契约 §18.3 r4)。\n */\n metadata?: Record<string, string>;\n localContextPolicy?: AgentRunLocalContextPolicy;\n artifactPolicy?: AgentRunArtifactPolicy;\n\n // Phase 3+ remote-control extension (contract §3 / ADR-2):\n // When `runtime === 'crabcode_remote'`, `runner` + `adapter` are required and\n // the per-session permission/workspace policies are sent to the gateway.\n // Wire-format snake_case; SDK forwards even on older backends that ignore\n // unknown fields (forward compatible by design).\n runtime?: AgentRunRuntime;\n runner?: RunnerKind;\n adapter?: AdapterKind;\n permissionPolicy?: PermissionPolicy;\n workspacePolicy?: WorkspacePolicy;\n /**\n * BYO 模型密钥公开引用 (契约 §18.2; 仅远控 runtime + runner='cloud')。\n * 只传 `crabcodeByok.create()` 返回的 credentialRef; 明文/密文绝不过此请求 —\n * 解密只发生在网关 launchCloudRunner 的子进程 env 注入点。\n */\n byokCredentialRef?: string;\n}\n\n/**\n * Narrow type for `agentRuns.createRemoteRun(req)`:\n * - runtime is fixed to `'crabcode_remote'`;\n * - runner + adapter are required;\n * - inherits everything else from AgentRunCreateRequest.\n */\nexport interface AgentRunRemoteCreateRequest extends AgentRunCreateRequest {\n runtime: 'crabcode_remote';\n runner: RunnerKind;\n adapter: AdapterKind;\n}\n\n// 注: streamRemoteControl 不接受 options。按契约 §4, `error` 事件恒为非终结\n// (终结性错误由 `done.reason` / `done.final_status` 承载), 流仅在 `done` / `settle`\n// 终结事件后自然结束, 从不抛异常; 因此无需 yield/throw 开关 (此前的\n// RemoteControlStreamOptions.yieldNonTerminalErrors 是从不被读取的 no-op, 已删除)。\n\nexport interface AgentRun {\n runId: string;\n sessionId: string;\n appId?: string;\n mode?: string;\n status: AgentRunStatus;\n createdAt?: string;\n startedAt?: string;\n completedAt?: string;\n error?: AgentRunErrorPayload;\n metadata?: Record<string, string>;\n // 远控元数据 (Phase 5C 控制台列表; 标准 run 为 'standard'/缺省)。\n // view 永不携带 session token / policy / messages 任何形态 (契约 §6)。\n runtime?: AgentRunRuntime | string;\n runner?: RunnerKind | string;\n adapter?: AdapterKind | string;\n}\n\n/** `agentRuns.list()` 过滤/分页参数 (GET /agent-runs, Phase 5C 控制台)。 */\nexport interface AgentRunListOptions {\n /** 按 runtime 过滤, 例 'crabcode_remote' (远控控制台列表)。 */\n runtime?: AgentRunRuntime | string;\n /** 按状态过滤, 例 'running'。 */\n status?: AgentRunStatus | string;\n /** 页码, 1 起; 缺省 1。 */\n page?: number;\n /** 每页条数; 缺省 20, 服务端上限 100。 */\n pageSize?: number;\n}\n\n/** `agentRuns.list()` 结果 — 分页形状对齐 listConsumeRecords ({records,total,page,pageSize})。 */\nexport interface AgentRunListResult {\n records: AgentRun[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport interface AgentRunCreateResponse {\n runId: string;\n sessionId: string;\n status: AgentRunStatus;\n}\n\nexport interface AgentRunArtifact {\n id: string;\n filename: string;\n contentType?: string;\n size?: number;\n type?: string;\n metadata?: Record<string, string>;\n}\n\nexport interface AgentRunArtifactList {\n artifacts: AgentRunArtifact[];\n}\n\nexport interface AgentRunDownload {\n data: Uint8Array;\n filename: string;\n contentType?: string;\n}\n\nexport interface AgentRunUsage {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheCreateTokens?: number;\n exact?: boolean;\n source?: string;\n [key: string]: unknown;\n}\n\nexport interface AgentRunSettlement {\n requestId?: string;\n status?: string;\n consumeStatus?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cacheReadTokens?: number;\n cacheCreateTokens?: number;\n tokenRemaining?: number;\n callRemaining?: number;\n retryQueued?: boolean;\n exact?: boolean;\n [key: string]: unknown;\n}\n\nexport interface AgentRunErrorPayload {\n code?: string;\n message: string;\n stage?: string;\n retryable?: boolean;\n /** 窗口限额场景 (code=\"window_limit_exceeded\"): 触发的窗口档位 \"FIVE_HOUR\" | \"WEEKLY\" */\n windowKind?: string;\n /** 窗口限额场景: 预计恢复时间 (ISO-8601 UTC) */\n windowResetAt?: string;\n /**\n * [W1 2026-07-11 软限额] 窗口限额场景: 该拒绝可否被用户「继续」开关豁免 (5h 严格模式=true;\n * 周窗/显式禁止/灰度关=false)。老网关不返回 (omitempty) → 缺失, 客户端按硬等待处理。\n */\n windowOverridable?: boolean;\n raw?: unknown;\n}\n\nexport interface AgentRunLocalToolResult {\n requestId: string;\n ok: boolean;\n content?: unknown;\n error?: string;\n}\n\nexport interface AgentRunLocalToolHandlerContext {\n runId: string;\n requestId: string;\n name: string;\n signal: AbortSignal;\n}\n\nexport type AgentRunLocalToolHandler = (\n input: unknown,\n context: AgentRunLocalToolHandlerContext,\n) => Promise<unknown> | unknown;\n\nexport interface AgentRunStreamOptions {\n /**\n * true by default. When enabled, an error event is converted into\n * AgentRunStreamError after the event has been parsed.\n */\n throwOnError?: boolean;\n}\n\nexport interface AgentRunRunOptions extends AgentRunStreamOptions {}\n\nexport interface AgentRunWithLocalToolsOptions extends AgentRunRunOptions {\n timeoutMs?: number;\n onEvent?: (event: AgentRunStreamEvent) => void | Promise<void>;\n}\n\nexport type AgentRunStreamEvent =\n | { type: 'run_started'; runId: string; sessionId: string }\n | { type: 'status'; status: AgentRunStatus | string; message?: string }\n | { type: 'text_delta'; text: string }\n | { type: 'reasoning_delta'; text: string }\n | { type: 'tool_call'; id: string; name: string; input?: unknown }\n | { type: 'tool_result'; id: string; name?: string; result?: unknown; error?: string }\n | { type: 'local_tool_request'; requestId: string; name: string; input: unknown }\n | { type: 'artifact'; artifact: AgentRunArtifact }\n | { type: 'sources'; sources: unknown }\n | { type: 'usage'; usage: AgentRunUsage }\n | { type: 'settle'; settlement: AgentRunSettlement }\n | { type: 'error'; error: AgentRunErrorPayload }\n | { type: 'done'; runId: string; status: AgentRunStatus | string };\n\nexport class AgentRunStreamError extends Error {\n event: Extract<AgentRunStreamEvent, { type: 'error' }>;\n code: string;\n stage: string;\n retryable: boolean;\n\n constructor(event: Extract<AgentRunStreamEvent, { type: 'error' }>) {\n const err = event.error;\n super(err.stage ? `agent run failed: ${err.stage}: ${err.message}` : `agent run failed: ${err.message}`);\n this.name = 'AgentRunStreamError';\n this.event = event;\n this.code = err.code ?? '';\n this.stage = err.stage ?? '';\n this.retryable = err.retryable ?? false;\n }\n}\n","// Acosmi 远程控制 CrabCode 多接入面 — SDK 类型契约 (Phase 3 骨架).\n//\n// 契约源: docs/audit/sdk-remote-control-contract-2026-05-27.md §3-§4 (Phase 0 frozen).\n//\n// 设计纪律:\n// - HTTP wire 协议字段为 snake_case (与 Nexus Go side 一致);\n// - 公开 TypeScript API 一律 camelCase;\n// - `parseRemoteControlEvent` 负责 wire -> TS 翻译, 不识别的 type 返回 null;\n// - 11 个 event type 严格对齐契约 §4, 任何新增需先改契约文档再扩本文件;\n// - 严禁复用旧 chat SSE 名 (intent_confirmation / on_session_reset / sources /\n// reasoning_clear / plan_*); 它们在远控 stream 不再存在 (契约 §4 末)。\n\n// =============================================================================\n// AdapterKind / RunnerKind (契约 §3 placement 矩阵)\n// =============================================================================\n\nexport type AdapterKind =\n | 'remote_io'\n | 'app_server_tcp_ws'\n | 'bridge_ccr'\n | 'app_server_uds'\n | 'stdio_stream_json'\n | 'tauri_managed_app_server';\n\nexport type RunnerKind = 'cloud' | 'desktop' | 'local_embedded';\n\n// =============================================================================\n// Workspace / Permission Policy (与 Go side 字段名一致)\n// =============================================================================\n\nexport interface WorkspacePolicy {\n readOnly?: boolean;\n allowedPaths?: string[];\n deniedPaths?: string[];\n maxBytes?: number;\n}\n\nexport interface PermissionPolicy {\n shellAllowed?: boolean;\n shellDenyList?: string[];\n networkAllowed?: boolean;\n writeAllowed?: boolean;\n approvalTimeoutMs?: number;\n requiredActors?: string[];\n}\n\n// =============================================================================\n// Placement / Ref\n// =============================================================================\n\nexport interface RemoteSessionPlacement {\n tenantId: string;\n userId: string;\n appId: string;\n runId: string;\n runner: RunnerKind;\n adapter: AdapterKind;\n ttlMs?: number;\n workspace?: WorkspacePolicy;\n permission?: PermissionPolicy;\n}\n\nexport interface RemoteSessionRef {\n sessionId: string;\n runId: string;\n tenantId: string;\n userId: string;\n adapter: AdapterKind;\n createdAt?: string;\n expiresAt?: string;\n}\n\n// =============================================================================\n// Event union (契约 §4 — 11 种事件, 严禁扩展)\n// =============================================================================\n\nexport type RemoteControlEventType =\n | 'text_delta'\n | 'reasoning_delta'\n | 'tool_call'\n | 'tool_result'\n | 'permission_request'\n | 'permission_result'\n | 'usage'\n | 'settle'\n | 'status'\n | 'error'\n | 'done';\n\nexport interface RemoteControlTextDelta {\n type: 'text_delta';\n index: number;\n text: string;\n}\n\nexport interface RemoteControlReasoningDelta {\n type: 'reasoning_delta';\n index: number;\n text: string;\n}\n\nexport interface RemoteControlToolCall {\n type: 'tool_call';\n toolCallId: string;\n name: string;\n input?: unknown;\n source?: string;\n}\n\nexport interface RemoteControlToolResult {\n type: 'tool_result';\n toolCallId: string;\n ok: boolean;\n output?: unknown;\n error?: string;\n}\n\nexport interface RemoteControlPermissionRequest {\n type: 'permission_request';\n requestId: string;\n kind: string;\n payload?: unknown;\n deadlineMs?: number;\n}\n\nexport interface RemoteControlPermissionResult {\n type: 'permission_result';\n requestId: string;\n decision: 'allow' | 'deny' | string;\n actor?: string;\n decidedAt?: string;\n}\n\nexport interface RemoteControlUsage {\n type: 'usage';\n inputTokens?: number;\n outputTokens?: number;\n cacheRead?: number;\n cacheCreate?: number;\n exact?: boolean;\n}\n\nexport interface RemoteControlSettle {\n type: 'settle';\n status: string;\n billed?: boolean;\n}\n\nexport interface RemoteControlStatus {\n type: 'status';\n phase:\n | 'created'\n | 'connecting'\n | 'connected'\n | 'running'\n | 'cancelling'\n | 'terminating'\n | string;\n message?: string;\n}\n\nexport interface RemoteControlError {\n type: 'error';\n code: string;\n message: string;\n retryable?: boolean;\n kind?: string;\n}\n\nexport interface RemoteControlDone {\n type: 'done';\n reason: string;\n runId: string;\n finalStatus: string;\n}\n\nexport type RemoteControlEvent =\n | RemoteControlTextDelta\n | RemoteControlReasoningDelta\n | RemoteControlToolCall\n | RemoteControlToolResult\n | RemoteControlPermissionRequest\n | RemoteControlPermissionResult\n | RemoteControlUsage\n | RemoteControlSettle\n | RemoteControlStatus\n | RemoteControlError\n | RemoteControlDone;\n\n// =============================================================================\n// Wire -> TS 解析\n// =============================================================================\n\ntype WireRecord = Record<string, unknown>;\n\nfunction asRecord(v: unknown): WireRecord | null {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) return null;\n return v as WireRecord;\n}\n\nfunction str(rec: WireRecord, key: string): string | undefined {\n const v = rec[key];\n return typeof v === 'string' ? v : undefined;\n}\n\nfunction num(rec: WireRecord, key: string): number | undefined {\n const v = rec[key];\n return typeof v === 'number' && Number.isFinite(v) ? v : undefined;\n}\n\nfunction bool(rec: WireRecord, key: string): boolean | undefined {\n const v = rec[key];\n return typeof v === 'boolean' ? v : undefined;\n}\n\n/**\n * 把后端 SSE/JSON wire payload 翻译成强类型 RemoteControlEvent。\n *\n * - wire 字段 snake_case (text_delta / tool_call_id / permission_request ...);\n * - TS API 字段 camelCase (toolCallId / requestId ...);\n * - 未知 type / 缺失关键字段返回 null, 调用方应当忽略并打 warn;\n * - 不抛异常: 一律返回 null。\n */\nexport function parseRemoteControlEvent(raw: unknown): RemoteControlEvent | null {\n const rec = asRecord(raw);\n if (!rec) return null;\n const type = str(rec, 'type');\n if (!type) return null;\n\n switch (type as RemoteControlEventType) {\n case 'text_delta': {\n const index = num(rec, 'index');\n const text = str(rec, 'text');\n if (typeof index !== 'number' || typeof text !== 'string') return null;\n return { type: 'text_delta', index, text };\n }\n case 'reasoning_delta': {\n const index = num(rec, 'index');\n const text = str(rec, 'text');\n if (typeof index !== 'number' || typeof text !== 'string') return null;\n return { type: 'reasoning_delta', index, text };\n }\n case 'tool_call': {\n const toolCallId = str(rec, 'tool_call_id') ?? str(rec, 'toolCallId');\n const name = str(rec, 'name');\n if (!toolCallId || !name) return null;\n return {\n type: 'tool_call',\n toolCallId,\n name,\n input: rec['input'],\n source: str(rec, 'source'),\n };\n }\n case 'tool_result': {\n const toolCallId = str(rec, 'tool_call_id') ?? str(rec, 'toolCallId');\n const ok = bool(rec, 'ok');\n if (!toolCallId || typeof ok !== 'boolean') return null;\n return {\n type: 'tool_result',\n toolCallId,\n ok,\n output: rec['output'],\n error: str(rec, 'error'),\n };\n }\n case 'permission_request': {\n const requestId = str(rec, 'request_id') ?? str(rec, 'requestId');\n const kind = str(rec, 'kind');\n if (!requestId || !kind) return null;\n return {\n type: 'permission_request',\n requestId,\n kind,\n payload: rec['payload'],\n deadlineMs: num(rec, 'deadline_ms') ?? num(rec, 'deadlineMs'),\n };\n }\n case 'permission_result': {\n const requestId = str(rec, 'request_id') ?? str(rec, 'requestId');\n const decision = str(rec, 'decision');\n if (!requestId || !decision) return null;\n return {\n type: 'permission_result',\n requestId,\n decision,\n actor: str(rec, 'actor'),\n decidedAt: str(rec, 'decided_at') ?? str(rec, 'decidedAt'),\n };\n }\n case 'usage': {\n return {\n type: 'usage',\n inputTokens: num(rec, 'input_tokens') ?? num(rec, 'inputTokens'),\n outputTokens: num(rec, 'output_tokens') ?? num(rec, 'outputTokens'),\n cacheRead: num(rec, 'cache_read') ?? num(rec, 'cacheRead'),\n cacheCreate: num(rec, 'cache_create') ?? num(rec, 'cacheCreate'),\n exact: bool(rec, 'exact'),\n };\n }\n case 'settle': {\n const status = str(rec, 'status');\n if (!status) return null;\n return { type: 'settle', status, billed: bool(rec, 'billed') };\n }\n case 'status': {\n const phase = str(rec, 'phase');\n if (!phase) return null;\n return { type: 'status', phase, message: str(rec, 'message') };\n }\n case 'error': {\n const code = str(rec, 'code');\n const message = str(rec, 'message');\n if (!code || !message) return null;\n return {\n type: 'error',\n code,\n message,\n retryable: bool(rec, 'retryable'),\n kind: str(rec, 'kind'),\n };\n }\n case 'done': {\n const reason = str(rec, 'reason');\n const runId = str(rec, 'run_id') ?? str(rec, 'runId');\n const finalStatus = str(rec, 'final_status') ?? str(rec, 'finalStatus');\n if (!reason || !runId || !finalStatus) return null;\n return { type: 'done', reason, runId, finalStatus };\n }\n default:\n return null;\n }\n}\n\n/**\n * isTerminalRemoteEvent — 仅 `done` 与 `settle` 终结一个 stream。\n *\n * 注意契约 §4 关于 error:\n * - 终结性错误进入 `done`;\n * - 非终结 error 不结束 stream;\n * 因此 `error` 本身不算 terminal, `done` 才是。\n */\nexport function isTerminalRemoteEvent(ev: RemoteControlEvent): boolean {\n return ev.type === 'done' || ev.type === 'settle';\n}\n\n// =============================================================================\n// 远控管理面请求/响应类型 (契约 §18.1 附录 A; Phase 5B/5C)\n// =============================================================================\n\n/**\n * C 端/平台可下达的 permission 决策 (契约 §14)。\n *\n * 仅 `approved` | `rejected` — `timeout` / `cancelled` 由服务端 reaper/cancel\n * 路径产生, 客户端不可下达。\n */\nexport type RemotePermissionDecision = 'approved' | 'rejected';\n\n/** `agentRuns.submitPermissionResult()` 请求 — 回写 permission_request 的决策。 */\nexport interface RemotePermissionResultRequest {\n /** 对应 permission_request 事件的 requestId。 */\n requestId: string;\n decision: RemotePermissionDecision;\n /** 可选决策理由 (透传给 CrabCode control_response)。 */\n reason?: string;\n}\n\n/** `agentRuns.submitUserMessage()` 请求 — 会话中途追加用户消息 (Phase 5C 输入框)。 */\nexport interface RemoteUserMessageRequest {\n /** 消息正文; 服务端上限 64KB。Role 由服务端硬编码 'user' (契约 §6 #5 防注入)。 */\n content: string;\n /** 幂等键; 缺省由服务端生成并在 ack 中返回。 */\n requestId?: string;\n}\n\n/** `agentRuns.submitUserMessage()` 确认。 */\nexport interface RemoteUserMessageAck {\n ok: boolean;\n /** 服务端最终采用的幂等键 (请求未带时为服务端生成值)。 */\n requestId: string;\n}\n\n/**\n * `agentRuns.revealRemoteToken()` 响应 — desktop launcher 一次性 session token\n * (Phase 5B; 仅 runner='desktop')。\n *\n * 安全红线 (契约 §6): token 一次性消费 (重复调用 409), TTL ≤ 1h; 永不落\n * 浏览器存储 (localStorage/cookie), 应由 native 层接收后只注入 CrabCode\n * 子进程 env。\n */\nexport interface RemoteSessionTokenGrant {\n accessToken: string;\n /** CrabCode 回连的 RemoteIO WS 完整地址 (公网 wss 基址 + run 路径 + tenant_id)。 */\n sessionUrl: string;\n tenantId: string;\n /**\n * 用户在 metadata.workspace 声明的期望项目目录 (契约 §18.3 r4); 缺省 undefined。\n * 桌面端决定是否 chdir 采纳 (路径不存在/越权时回退并提示)。\n */\n workspace?: string;\n}\n","// client/agent-runs.ts — SDK-facing Agent Run Gateway client.\n\nimport type { APIResponse } from '../shared/api-response';\nimport { apiResponseBusinessError } from '../shared/api-response';\nimport { isUserAccessTokenRejected } from '../shared/errors';\nimport { Client, DEFAULT_API_TIMEOUT_MS } from '../core/client';\nimport {\n iterSSELines,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../core/http';\nimport {\n AgentRunStreamError,\n type AgentRun,\n type AgentRunArtifact,\n type AgentRunCreateRequest,\n type AgentRunCreateResponse,\n type AgentRunDownload,\n type AgentRunErrorPayload,\n type AgentRunListOptions,\n type AgentRunListResult,\n type AgentRunLocalToolHandler,\n type AgentRunLocalToolResult,\n type AgentRunRemoteCreateRequest,\n type AgentRunRunOptions,\n type AgentRunStatus,\n type AgentRunStreamEvent,\n type AgentRunStreamOptions,\n type AgentRunWithLocalToolsOptions,\n} from './types';\nimport {\n isTerminalRemoteEvent,\n parseRemoteControlEvent,\n type AdapterKind,\n type PermissionPolicy,\n type RemoteControlEvent,\n type RemotePermissionResultRequest,\n type RemoteSessionTokenGrant,\n type RemoteUserMessageAck,\n type RemoteUserMessageRequest,\n type RunnerKind,\n type WorkspacePolicy,\n} from './remote-control';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** SDK-facing cloud agent run gateway. */\n readonly agentRuns: AgentRunsClient;\n }\n}\n\nconst agentRunsByClient = new WeakMap<Client, AgentRunsClient>();\n\nObject.defineProperty(Client.prototype, 'agentRuns', {\n configurable: true,\n enumerable: false,\n get(this: Client): AgentRunsClient {\n let existing = agentRunsByClient.get(this);\n if (!existing) {\n existing = new AgentRunsClient(this);\n agentRunsByClient.set(this, existing);\n }\n return existing;\n },\n});\n\nexport class AgentRunsClient {\n constructor(private readonly client: Client) {}\n\n async create(\n req: AgentRunCreateRequest,\n signal?: AbortSignal,\n ): Promise<AgentRunCreateResponse> {\n const resp = await this.requestAPI<WireAgentRunCreateResponse>(\n 'POST',\n '/agent-runs',\n toWireCreateRequest(req),\n signal,\n { retryOn401: false },\n );\n return fromWireCreateResponse(resp);\n }\n\n /**\n * List the caller's own agent runs, newest first (GET /agent-runs, Phase 5C\n * console). Returns view metadata only — never session tokens, policies or\n * messages (contract §6). Filter remote-control runs with\n * `{ runtime: 'crabcode_remote' }`.\n */\n async list(\n opts: AgentRunListOptions = {},\n signal?: AbortSignal,\n ): Promise<AgentRunListResult> {\n const params = new URLSearchParams();\n if (opts.runtime) params.set('runtime', opts.runtime);\n if (opts.status) params.set('status', opts.status);\n if (opts.page != null) params.set('page', String(opts.page));\n if (opts.pageSize != null) params.set('page_size', String(opts.pageSize));\n const qs = params.toString();\n const resp = await this.requestAPI<WireAgentRunListResult>(\n 'GET',\n `/agent-runs${qs ? `?${qs}` : ''}`,\n null,\n signal,\n { retryOn401: true },\n );\n return {\n records: (resp.records ?? []).map(fromWireRun),\n total: typeof resp.total === 'number' ? resp.total : 0,\n page: typeof resp.page === 'number' ? resp.page : 1,\n pageSize: typeof resp.pageSize === 'number' ? resp.pageSize : 20,\n };\n }\n\n get(runId: string, signal?: AbortSignal): Promise<AgentRun> {\n return this.requestAPI<WireAgentRun>(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}`,\n null,\n signal,\n { retryOn401: true },\n ).then(fromWireRun);\n }\n\n stream(\n runId: string,\n opts: AgentRunStreamOptions = {},\n signal?: AbortSignal,\n ): AsyncIterable<AgentRunStreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.streamGen(runId, opts, signal),\n };\n }\n\n cancel(runId: string, signal?: AbortSignal): Promise<AgentRun> {\n return this.requestAPI<WireAgentRun>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/cancel`,\n {},\n signal,\n { retryOn401: false },\n ).then(fromWireRun);\n }\n\n /**\n * Create a CrabCode remote-control agent run (contract §3, ADR-2 + ADR-5).\n *\n * Equivalent to `create()` with `runtime: 'crabcode_remote'` and the required\n * `runner` + `adapter` fields set. Per-session policies (permission/workspace)\n * are forwarded to the gateway, which is the only side allowed to enforce\n * them (contract §6). The SDK never enforces remote permissions client-side.\n *\n * The corresponding stream uses `streamRemoteControl(runId)`, NOT `stream()`,\n * because the event union is different (contract §4).\n */\n async createRemoteRun(\n req: AgentRunRemoteCreateRequest,\n signal?: AbortSignal,\n ): Promise<AgentRunCreateResponse> {\n if (req.runtime !== 'crabcode_remote') {\n throw new Error('createRemoteRun: runtime must be \"crabcode_remote\"');\n }\n if (!req.runner) throw new Error('createRemoteRun: runner is required');\n if (!req.adapter) throw new Error('createRemoteRun: adapter is required');\n return this.create(req, signal);\n }\n\n /**\n * Stream remote-control events for a CrabCode remote run (contract §4).\n *\n * Yields the canonical 11-event union: text_delta / reasoning_delta /\n * tool_call / tool_result / permission_request / permission_result /\n * usage / settle / status / error / done.\n *\n * Iteration ends naturally when a terminal event (`done` or `settle`) is\n * observed. Per contract §4, `error` alone is non-terminal — terminal errors\n * are carried by `done.reason` / `done.final_status`.\n *\n * Unknown event types and malformed frames are silently skipped (warn-only),\n * matching `parseRemoteControlEvent`'s null-return contract.\n */\n streamRemoteControl(\n runId: string,\n signal?: AbortSignal,\n ): AsyncIterable<RemoteControlEvent> {\n return {\n [Symbol.asyncIterator]: () => this.streamRemoteControlGen(runId, signal),\n };\n }\n\n /**\n * Submit a permission decision for a pending `permission_request` event\n * (POST /agent-runs/:runId/permission-results, contract §4/§9/§14).\n *\n * Only `approved` | `rejected` may be submitted by clients — `timeout` /\n * `cancelled` are produced server-side. Requires an OAuth token with the\n * explicit `remote_control` scope (or a web JWT). 409 means the remote\n * session is gone (e.g. already terminated).\n */\n async submitPermissionResult(\n runId: string,\n result: RemotePermissionResultRequest,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.requestAPI<{ ok?: boolean }>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/permission-results`,\n {\n request_id: result.requestId,\n decision: result.decision,\n reason: result.reason,\n },\n signal,\n { retryOn401: false },\n );\n }\n\n /**\n * Append a mid-session user message to a remote run\n * (POST /agent-runs/:runId/messages, Phase 5C). The message role is\n * hard-coded to 'user' server-side (contract §6 #5 prompt-injection\n * defence); content is limited to 64KB. Requires the explicit\n * `remote_control` scope (or a web JWT).\n */\n async submitUserMessage(\n runId: string,\n message: RemoteUserMessageRequest,\n signal?: AbortSignal,\n ): Promise<RemoteUserMessageAck> {\n const resp = await this.requestAPI<{ ok?: boolean; request_id?: string }>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/messages`,\n { request_id: message.requestId, content: message.content },\n signal,\n { retryOn401: false },\n );\n return {\n ok: resp?.ok === true,\n requestId: resp?.request_id ?? message.requestId ?? '',\n };\n }\n\n /**\n * Reveal the one-shot remote session token for a desktop-runner run\n * (POST /agent-runs/:runId/remote-token, Phase 5B; contract §18.1).\n *\n * Desktop launcher only: the token is single-consumption (a second call\n * returns 409) and must never touch browser storage — receive it in the\n * native layer and inject it into the CrabCode child-process env only\n * (contract §6). Cloud / local_embedded runners never expose tokens over\n * HTTP (403). Requires the explicit `remote_control` scope.\n */\n async revealRemoteToken(\n runId: string,\n signal?: AbortSignal,\n ): Promise<RemoteSessionTokenGrant> {\n const resp = await this.requestAPI<WireRemoteSessionTokenGrant>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/remote-token`,\n {},\n signal,\n { retryOn401: false },\n );\n return {\n accessToken: resp?.access_token ?? '',\n sessionUrl: resp?.session_url ?? '',\n tenantId: resp?.tenant_id ?? '',\n workspace: resp?.workspace || undefined,\n };\n }\n\n private async *streamRemoteControlGen(\n runId: string,\n signal?: AbortSignal,\n ): AsyncGenerator<RemoteControlEvent, void, void> {\n const resp = await this.requestRaw(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/stream`,\n null,\n signal,\n { retryOn401: true, accept: 'text/event-stream' },\n );\n if (!resp.body) {\n throw new Error('remote-control stream: empty response body');\n }\n for await (const rawEvent of readAgentRunSSEFrames(resp.body)) {\n const ev = parseRemoteControlEvent(rawEvent);\n if (!ev) continue;\n yield ev;\n if (isTerminalRemoteEvent(ev)) return;\n }\n }\n\n listArtifacts(runId: string, signal?: AbortSignal): Promise<AgentRunArtifact[]> {\n return this.requestAPI<WireAgentRunArtifactList>(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/artifacts`,\n null,\n signal,\n { retryOn401: true },\n ).then((r) => (r.artifacts ?? []).map(fromWireArtifact));\n }\n\n async downloadArtifact(\n runId: string,\n artifactId: string,\n signal?: AbortSignal,\n ): Promise<AgentRunDownload> {\n const resp = await this.requestRaw(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/artifacts/${encodeURIComponent(artifactId)}`,\n null,\n signal,\n { retryOn401: true },\n );\n const contentType = resp.headers.get('Content-Type') ?? undefined;\n const filename = filenameFromContentDisposition(resp.headers.get('Content-Disposition')) ?? artifactId;\n // 多读 1 字节探测超限 — 与 skills.downloadSkill 一致, 拒绝静默截断 (否则下游拿到\n // 被砍断的不完整产物却毫无感知)。\n const data = await readLimited(resp.body!, maxDownloadSize + 1);\n if (data.byteLength > maxDownloadSize) {\n throw new Error(`download artifact: response exceeds ${maxDownloadSize >> 20}MB limit`);\n }\n return { data, filename, contentType };\n }\n\n submitLocalToolResult(\n runId: string,\n result: AgentRunLocalToolResult,\n signal?: AbortSignal,\n ): Promise<AgentRun> {\n return this.requestAPI<WireAgentRun>(\n 'POST',\n `/agent-runs/${encodeURIComponent(runId)}/local-tool-results`,\n toWireLocalToolResult(result),\n signal,\n { retryOn401: false },\n ).then(fromWireRun);\n }\n\n run(\n req: AgentRunCreateRequest,\n opts: AgentRunRunOptions = {},\n signal?: AbortSignal,\n ): AsyncIterable<AgentRunStreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.runGen(req, opts, signal),\n };\n }\n\n runWithLocalTools(\n req: AgentRunCreateRequest,\n handlers: Record<string, AgentRunLocalToolHandler>,\n opts: AgentRunWithLocalToolsOptions = {},\n signal?: AbortSignal,\n ): AsyncIterable<AgentRunStreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.runWithLocalToolsGen(req, handlers, opts, signal),\n };\n }\n\n private async *runGen(\n req: AgentRunCreateRequest,\n opts: AgentRunRunOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentRunStreamEvent, void, void> {\n const created = await this.create(req, signal);\n yield* this.stream(created.runId, opts, signal);\n }\n\n private async *runWithLocalToolsGen(\n req: AgentRunCreateRequest,\n handlers: Record<string, AgentRunLocalToolHandler>,\n opts: AgentRunWithLocalToolsOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentRunStreamEvent, void, void> {\n let currentRunId = '';\n for await (const event of this.run(req, opts, signal)) {\n if (event.type === 'run_started') {\n currentRunId = event.runId;\n }\n\n if (opts.onEvent) await opts.onEvent(event);\n\n let localToolTask: Promise<void> | undefined;\n if (event.type === 'local_tool_request') {\n if (currentRunId === '') {\n throw new Error('local tool request arrived before run_started');\n }\n localToolTask = this.invokeLocalTool(currentRunId, event, handlers, opts.timeoutMs, signal).then(async (result) => {\n await this.submitLocalToolResult(currentRunId, result, signal);\n });\n }\n\n yield event;\n if (localToolTask) await localToolTask;\n }\n }\n\n private async invokeLocalTool(\n runId: string,\n event: Extract<AgentRunStreamEvent, { type: 'local_tool_request' }>,\n handlers: Record<string, AgentRunLocalToolHandler>,\n timeoutMs = 30_000,\n signal?: AbortSignal,\n ): Promise<AgentRunLocalToolResult> {\n const handler = handlers[event.name];\n if (!handler) {\n return {\n requestId: event.requestId,\n ok: false,\n error: `local tool rejected: no handler for ${event.name}`,\n };\n }\n\n const ctl = new AbortController();\n let parentAbort: (() => void) | undefined;\n if (signal) {\n if (signal.aborted) ctl.abort();\n else {\n parentAbort = () => ctl.abort();\n signal.addEventListener('abort', parentAbort);\n }\n }\n\n // 硬超时根因修复: 即使 handler 完全忽略 ctx.signal (不响应协作式取消) 也不会永挂。\n // Promise.race 一边跑 handler, 一边跑一个在 timeoutMs 后 resolve 为稳定失败结果的\n // promise; 超时方胜出即立刻返回, 不再等 handler。ctl.signal 仍传给 handler 以便\n // 配合的实现尽早收手。\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutResult: Promise<AgentRunLocalToolResult> = new Promise((resolve) => {\n timer = setTimeout(() => {\n ctl.abort(); // 协作式取消提示 (handler 若监听 signal 可尽早退出)\n resolve({\n requestId: event.requestId,\n ok: false,\n error: `local tool timed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n });\n\n const handlerTask: Promise<AgentRunLocalToolResult> = (async () => {\n const content = await handler(event.input, {\n runId,\n requestId: event.requestId,\n name: event.name,\n signal: ctl.signal,\n });\n return { requestId: event.requestId, ok: true, content };\n })();\n // 超时方先胜出时, handler 后续 reject 不能逃逸成未捕获异常。\n handlerTask.catch(() => {});\n\n try {\n return await Promise.race([handlerTask, timeoutResult]);\n } catch (e) {\n // 仅 handler 抢先 reject 会落这里 (超时分支永不 reject)。\n if (signal?.aborted) throw e;\n const timedOut = ctl.signal.aborted;\n return {\n requestId: event.requestId,\n ok: false,\n error: timedOut ? `local tool timed out after ${timeoutMs}ms` : errorMessage(e),\n };\n } finally {\n clearTimeout(timer);\n if (parentAbort && signal) signal.removeEventListener('abort', parentAbort);\n }\n }\n\n private async *streamGen(\n runId: string,\n opts: AgentRunStreamOptions,\n signal?: AbortSignal,\n ): AsyncGenerator<AgentRunStreamEvent, void, void> {\n const resp = await this.requestRaw(\n 'GET',\n `/agent-runs/${encodeURIComponent(runId)}/stream`,\n null,\n signal,\n { retryOn401: true, accept: 'text/event-stream' },\n );\n if (!resp.body) {\n throw new Error('agent run stream: empty response body');\n }\n\n for await (const event of readAgentRunEvents(resp.body)) {\n if (event.type === 'error' && opts.throwOnError !== false) {\n throw new AgentRunStreamError(event);\n }\n yield event;\n }\n }\n\n private async requestAPI<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: RequestOptions,\n ): Promise<T> {\n // 非流式 JSON 请求套默认超时 (调用方可经 opts.timeoutMs 覆盖)。\n // stream / download 路径直接调 requestRaw 且不带 timeoutMs, 保留长连接语义。\n const resp = await this.requestRaw(method, path, body, signal, {\n ...opts,\n timeoutMs: opts.timeoutMs ?? DEFAULT_API_TIMEOUT_MS,\n });\n const text = await resp.text();\n // 空 body 的成功响应 (HTTP 204 / 200 空体) — 不要 JSON.parse('') (抛 SyntaxError)。\n // 与 core doJSONFullInternal / compliance executeJson 一致, 空响应返回 undefined。\n if (!text) return undefined as unknown as T;\n const result = JSON.parse(text) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(result);\n if (bizErr) throw bizErr;\n return result.data;\n }\n\n private async requestRaw(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: RequestOptions,\n retried = false,\n ): Promise<Response> {\n // opts.timeoutMs 仅由非流式 JSON 路径 (requestAPI) 设置 — 用组合 signal (超时 + 用户 signal,\n // 任一触发都 abort) 替换裸 signal; 流式/下载路径不带 timeoutMs, signal 原样透传保留长连接。\n if (opts.timeoutMs != null && opts.timeoutMs > 0) {\n const ctl = this.client.withRequestTimeout(opts.timeoutMs, signal);\n try {\n return await this.requestRawInner(method, path, body, ctl.signal, opts, retried);\n } finally {\n ctl.dispose();\n }\n }\n return this.requestRawInner(method, path, body, signal, opts, retried);\n }\n\n private async requestRawInner(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: RequestOptions,\n retried: boolean,\n ): Promise<Response> {\n const token = await this.client.ensureToken(signal);\n const url = this.client.apiURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n Accept: opts.accept ?? 'application/json',\n };\n let bodyStr: string | undefined;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n headers['Content-Type'] = 'application/json';\n }\n\n const resp = await this.client.doRequest({ method, url, headers, body: bodyStr }, signal);\n\n if (resp.status === 401 && opts.retryOn401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n await this.client.forceRefresh(signal, token);\n // 复用同一组合 signal (含剩余超时预算): 直接走 inner, 不再重套超时。\n return this.requestRawInner(method, path, body, signal, opts, true);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n return resp;\n }\n}\n\ninterface RequestOptions {\n retryOn401: boolean;\n accept?: string;\n /** 非流式 JSON 请求的超时上限 (毫秒); 未设置 = 无超时 (流式/下载路径)。 */\n timeoutMs?: number;\n}\n\ninterface WireAgentRunCreateRequest {\n app_id: string;\n mode?: string;\n session_id?: string;\n input: string;\n messages?: unknown[];\n model?: string;\n active_skill_ids?: string[];\n knowledge_base_ids?: string[];\n metadata?: Record<string, string>;\n local_context_policy?: {\n enabled?: boolean;\n readonly?: boolean;\n max_bytes?: number;\n allowed_tools?: string[];\n };\n artifact_policy?: {\n enabled?: boolean;\n max_files?: number;\n };\n // Phase 3+ remote-control wire fields (contract §3 + §6).\n runtime?: string;\n runner?: RunnerKind;\n adapter?: AdapterKind;\n permission_policy?: WirePermissionPolicy;\n workspace_policy?: WireWorkspacePolicy;\n byok_credential_ref?: string;\n}\n\ninterface WirePermissionPolicy {\n shell_allowed?: boolean;\n shell_deny_list?: string[];\n network_allowed?: boolean;\n write_allowed?: boolean;\n approval_timeout_ms?: number;\n required_actors?: string[];\n}\n\ninterface WireWorkspacePolicy {\n read_only?: boolean;\n allowed_paths?: string[];\n denied_paths?: string[];\n max_bytes?: number;\n}\n\ninterface WireAgentRun {\n run_id?: string;\n session_id?: string;\n app_id?: string;\n mode?: string;\n status?: string;\n created_at?: string;\n started_at?: string;\n completed_at?: string;\n error?: unknown;\n metadata?: Record<string, string>;\n // 远控 view 元数据 (Phase 5C; 标准 run 缺省)。\n runtime?: string;\n runner?: string;\n adapter?: string;\n}\n\n// List 分页信封 — 外层键对齐 listConsumeRecords ({records,total,page,pageSize},\n// 注意 pageSize 是 camelCase), records 内元素仍为 snake_case 的 run view。\ninterface WireAgentRunListResult {\n records?: WireAgentRun[];\n total?: number;\n page?: number;\n pageSize?: number;\n}\n\ninterface WireRemoteSessionTokenGrant {\n access_token?: string;\n session_url?: string;\n tenant_id?: string;\n workspace?: string;\n}\n\ninterface WireAgentRunCreateResponse {\n run_id?: string;\n session_id?: string;\n status?: string;\n}\n\ninterface WireAgentRunArtifact {\n id?: string;\n artifact_id?: string;\n filename?: string;\n name?: string;\n content_type?: string;\n mime_type?: string;\n size?: number;\n type?: string;\n metadata?: Record<string, string>;\n}\n\ninterface WireAgentRunArtifactList {\n artifacts?: WireAgentRunArtifact[];\n}\n\nfunction toWirePermissionPolicy(p: PermissionPolicy): WirePermissionPolicy {\n return {\n shell_allowed: p.shellAllowed,\n shell_deny_list: p.shellDenyList,\n network_allowed: p.networkAllowed,\n write_allowed: p.writeAllowed,\n approval_timeout_ms: p.approvalTimeoutMs,\n required_actors: p.requiredActors,\n };\n}\n\nfunction toWireWorkspacePolicy(p: WorkspacePolicy): WireWorkspacePolicy {\n return {\n read_only: p.readOnly,\n allowed_paths: p.allowedPaths,\n denied_paths: p.deniedPaths,\n max_bytes: p.maxBytes,\n };\n}\n\nfunction toWireCreateRequest(req: AgentRunCreateRequest): WireAgentRunCreateRequest {\n return {\n app_id: req.appId,\n mode: req.mode,\n session_id: req.sessionId,\n input: req.input,\n messages: req.messages,\n model: req.model,\n active_skill_ids: req.activeSkillIds,\n knowledge_base_ids: req.knowledgeBaseIds,\n metadata: req.metadata,\n local_context_policy: req.localContextPolicy\n ? {\n enabled: req.localContextPolicy.enabled,\n readonly: req.localContextPolicy.readonly,\n max_bytes: req.localContextPolicy.maxBytes,\n allowed_tools: req.localContextPolicy.allowedTools,\n }\n : undefined,\n runtime: req.runtime,\n runner: req.runner,\n adapter: req.adapter,\n permission_policy: req.permissionPolicy ? toWirePermissionPolicy(req.permissionPolicy) : undefined,\n workspace_policy: req.workspacePolicy ? toWireWorkspacePolicy(req.workspacePolicy) : undefined,\n byok_credential_ref: req.byokCredentialRef,\n artifact_policy: req.artifactPolicy\n ? {\n enabled: req.artifactPolicy.enabled,\n max_files: req.artifactPolicy.maxFiles,\n }\n : undefined,\n };\n}\n\nfunction toWireLocalToolResult(result: AgentRunLocalToolResult): Record<string, unknown> {\n return {\n request_id: result.requestId,\n ok: result.ok,\n content: result.content,\n error: result.error,\n };\n}\n\nfunction fromWireCreateResponse(resp: WireAgentRunCreateResponse): AgentRunCreateResponse {\n return {\n runId: resp.run_id ?? '',\n sessionId: resp.session_id ?? '',\n status: toStatus(resp.status),\n };\n}\n\nfunction fromWireRun(resp: WireAgentRun): AgentRun {\n return {\n runId: resp.run_id ?? '',\n sessionId: resp.session_id ?? '',\n appId: resp.app_id,\n mode: resp.mode,\n status: toStatus(resp.status),\n createdAt: resp.created_at,\n startedAt: resp.started_at,\n completedAt: resp.completed_at,\n error: normalizeError(resp.error),\n metadata: resp.metadata,\n runtime: resp.runtime,\n runner: resp.runner,\n adapter: resp.adapter,\n };\n}\n\nfunction fromWireArtifact(resp: WireAgentRunArtifact): AgentRunArtifact {\n return {\n id: resp.id ?? resp.artifact_id ?? '',\n filename: resp.filename ?? resp.name ?? resp.id ?? resp.artifact_id ?? 'artifact',\n contentType: resp.content_type ?? resp.mime_type,\n size: typeof resp.size === 'number' ? resp.size : undefined,\n type: resp.type,\n metadata: resp.metadata,\n };\n}\n\n/**\n * readAgentRunSSEFrames — emits raw parsed JSON payloads from the SSE body,\n * one per SSE event. Used by `streamRemoteControl` to feed\n * `parseRemoteControlEvent` (contract §4 union).\n *\n * Skips empty frames, `[DONE]` markers, comments, and JSON parse errors.\n * Returns `event_name` injected into the payload as `__event__` when the\n * payload itself does not carry a `type` field, so downstream parsers can\n * recover the SSE event name.\n */\nasync function* readAgentRunSSEFrames(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>, void, void> {\n let eventName = '';\n let dataLines: string[] = [];\n\n const flush = (): Record<string, unknown> | null => {\n if (dataLines.length === 0) return null;\n const data = dataLines.join('\\n');\n dataLines = [];\n if (data === '[DONE]') return null;\n try {\n const parsed = JSON.parse(data);\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n const obj = parsed as Record<string, unknown>;\n if (!('type' in obj) && eventName) {\n obj.type = eventName;\n }\n return obj;\n }\n } catch {\n // malformed frame: skip\n }\n return null;\n };\n\n for await (const line of iterSSELines(body)) {\n if (line === '') {\n const frame = flush();\n eventName = '';\n if (frame) yield frame;\n continue;\n }\n if (line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n const frame = flush();\n if (frame) yield frame;\n}\n\nasync function* readAgentRunEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<AgentRunStreamEvent, void, void> {\n let eventName = '';\n let dataLines: string[] = [];\n\n const flush = (): AgentRunStreamEvent | null => {\n if (dataLines.length === 0) return null;\n const data = dataLines.join('\\n');\n dataLines = [];\n if (data === '[DONE]') return null;\n return parseAgentRunEvent(eventName, data);\n };\n\n for await (const line of iterSSELines(body)) {\n if (line === '') {\n const event = flush();\n eventName = '';\n if (event) yield event;\n continue;\n }\n if (line.startsWith(':')) continue;\n if (line.startsWith('event:')) {\n eventName = line.slice('event:'.length).trim();\n continue;\n }\n if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n\n const event = flush();\n if (event) yield event;\n}\n\nfunction parseAgentRunEvent(eventName: string, data: string): AgentRunStreamEvent {\n const payload = JSON.parse(data) as unknown;\n const obj = isRecord(payload) ? payload : { type: eventName, data: payload };\n const type = stringField(obj, 'type') || eventName;\n\n switch (type) {\n case 'run_started':\n return {\n type: 'run_started',\n runId: stringField(obj, 'run_id', 'runId'),\n sessionId: stringField(obj, 'session_id', 'sessionId'),\n };\n case 'status':\n return {\n type: 'status',\n status: stringField(obj, 'status'),\n message: optionalStringField(obj, 'message'),\n };\n case 'text_delta':\n return { type: 'text_delta', text: stringField(obj, 'text') };\n case 'reasoning_delta':\n return { type: 'reasoning_delta', text: stringField(obj, 'text') };\n case 'tool_call':\n return {\n type: 'tool_call',\n id: stringField(obj, 'id'),\n name: stringField(obj, 'name'),\n input: obj.input,\n };\n case 'tool_result':\n return {\n type: 'tool_result',\n id: stringField(obj, 'id'),\n name: optionalStringField(obj, 'name'),\n result: obj.result,\n error: optionalStringField(obj, 'error'),\n };\n case 'local_tool_request':\n return {\n type: 'local_tool_request',\n requestId: stringField(obj, 'request_id', 'requestId'),\n name: stringField(obj, 'name'),\n input: obj.input,\n };\n case 'artifact':\n return {\n type: 'artifact',\n artifact: fromWireArtifact((isRecord(obj.artifact) ? obj.artifact : obj) as WireAgentRunArtifact),\n };\n case 'sources':\n return { type: 'sources', sources: obj.sources };\n case 'usage':\n return {\n type: 'usage',\n usage: normalizeUsage(isRecord(obj.usage) ? obj.usage : obj),\n };\n case 'settle':\n return {\n type: 'settle',\n settlement: normalizeSettlement(isRecord(obj.settlement) ? obj.settlement : obj),\n };\n case 'error':\n return { type: 'error', error: normalizeError(obj.error) ?? normalizeError(obj)! };\n case 'done':\n return {\n type: 'done',\n runId: stringField(obj, 'run_id', 'runId'),\n status: stringField(obj, 'status'),\n };\n default:\n return {\n type: 'error',\n error: {\n code: 'unknown_event',\n message: `unknown agent run event: ${type}`,\n raw: obj,\n },\n };\n }\n}\n\nfunction normalizeUsage(value: Record<string, unknown>) {\n return {\n ...value,\n inputTokens: numberField(value, 'input_tokens', 'inputTokens'),\n outputTokens: numberField(value, 'output_tokens', 'outputTokens'),\n totalTokens: numberField(value, 'total_tokens', 'totalTokens'),\n cacheReadTokens: numberField(value, 'cache_read_tokens', 'cacheReadTokens'),\n cacheCreateTokens: numberField(value, 'cache_create_tokens', 'cacheCreateTokens'),\n exact: booleanField(value, 'exact'),\n source: optionalStringField(value, 'source'),\n };\n}\n\nfunction normalizeSettlement(value: Record<string, unknown>) {\n return {\n ...value,\n requestId: optionalStringField(value, 'request_id', 'requestId'),\n status: optionalStringField(value, 'status'),\n consumeStatus: optionalStringField(value, 'consume_status', 'consumeStatus'),\n inputTokens: numberField(value, 'input_tokens', 'inputTokens'),\n outputTokens: numberField(value, 'output_tokens', 'outputTokens'),\n totalTokens: numberField(value, 'total_tokens', 'totalTokens'),\n cacheReadTokens: numberField(value, 'cache_read_tokens', 'cacheReadTokens'),\n cacheCreateTokens: numberField(value, 'cache_create_tokens', 'cacheCreateTokens'),\n tokenRemaining: numberField(value, 'token_remaining', 'tokenRemaining'),\n callRemaining: numberField(value, 'call_remaining', 'callRemaining'),\n retryQueued: booleanField(value, 'retry_queued', 'retryQueued'),\n exact: booleanField(value, 'exact'),\n };\n}\n\nfunction normalizeError(value: unknown): AgentRunErrorPayload | undefined {\n if (value == null) return undefined;\n if (typeof value === 'string') return { message: value, raw: value };\n if (!isRecord(value)) return { message: String(value), raw: value };\n return {\n code: optionalStringField(value, 'code', 'error_code', 'errorCode'),\n message: stringField(value, 'message', 'error') || 'agent run failed',\n stage: optionalStringField(value, 'stage'),\n retryable: typeof value.retryable === 'boolean' ? value.retryable : undefined,\n // 窗口限额扩展 (code=\"window_limit_exceeded\"): 契约 wire 为 camelCase, 蛇形兼容兜底。\n windowKind: optionalStringField(value, 'windowKind', 'window_kind'),\n windowResetAt: optionalStringField(value, 'windowResetAt', 'window_reset_at'),\n raw: value,\n };\n}\n\nfunction toStatus(status: string | undefined): AgentRunStatus {\n switch (status) {\n case 'running':\n case 'completed':\n case 'failed':\n case 'cancelled':\n return status;\n default:\n return 'queued';\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction stringField(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'string') return value;\n }\n return '';\n}\n\nfunction optionalStringField(obj: Record<string, unknown>, ...keys: string[]): string | undefined {\n const value = stringField(obj, ...keys);\n return value === '' ? undefined : value;\n}\n\nfunction numberField(obj: Record<string, unknown>, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n return undefined;\n}\n\nfunction booleanField(obj: Record<string, unknown>, ...keys: string[]): boolean | undefined {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'boolean') return value;\n }\n return undefined;\n}\n\nfunction filenameFromContentDisposition(value: string | null): string | null {\n if (!value) return null;\n const utf8 = /filename\\*=UTF-8''([^;]+)/i.exec(value);\n if (utf8?.[1]) {\n try {\n return decodeURIComponent(utf8[1]);\n } catch {\n return utf8[1];\n }\n }\n const plain = /filename=\"?([^\";]+)\"?/i.exec(value);\n return plain?.[1] ?? null;\n}\n\nfunction errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","// agent-runs/byok.ts — CrabCode 远控 BYO 模型密钥管理面 (契约 §18.2, W4 2026-06-10).\n//\n// 端点: /api/v4/crabcode/byok-credentials (wire snake_case; remote-control 平面)。\n// 守卫: AuthOrDesktopScope(\"remote_control\") — 网页 JWT 用户直接过 (自管自己的\n// 密钥), desktop/SDK OAuth token 须显式 remote_control scope。\n//\n// 安全红线 (契约 §6 附录 A):\n// - 任何端点不回 plaintext / ciphertext; 创建/轮换的明文只在请求体出现一次,\n// 加密落库后即弃; 列表一律 masked 视图 (ref + fingerprint + 元数据);\n// - 调用方拿到的 credentialRef 是唯一可持有的引用 —— 把它传给\n// `agentRuns.createRemoteRun({ byokCredentialRef })` (仅 runner='cloud');\n// 解密只发生在网关 launchCloudRunner 的子进程 env 注入点;\n// - SDK 不缓存、不打印明文; 调用方同样不应将明文落任何持久化存储。\n\nimport type { APIResponse } from '../shared/api-response';\nimport { Client } from '../core/client';\n\n/** 允许的第三方提供商 (与网关 byokAllowedProviders / managed_model Provider 谱系对齐)。 */\nexport type ByokProvider =\n | 'anthropic'\n | 'openai'\n | 'deepseek'\n | 'dashscope'\n | 'zhipu'\n | 'volcengine'\n | 'custom';\n\nexport type ByokCredentialStatus = 'active' | 'revoked';\n\n/** BYOK 密钥 masked 视图 — 永不含明文/密文。 */\nexport interface ByokCredential {\n credentialRef: string;\n provider: ByokProvider | string;\n name?: string;\n /** 仅 provider='custom' 时存在 (https:// 起始)。 */\n baseUrl?: string;\n /** 明文指纹 (轮换后变化; 用于\"是否同一把钥匙\"的人工核对)。 */\n fingerprint?: string;\n status: ByokCredentialStatus | string;\n createdAt?: string;\n lastUsedAt?: string;\n}\n\n/** `crabcodeByok.create()` 请求。明文一次性提交, 服务端加密落库后即弃。 */\nexport interface ByokCreateRequest {\n provider: ByokProvider;\n /** API key 明文; ≤4KB, 不得含换行。 */\n plaintext: string;\n /** 显示名; ≤100 字符。 */\n name?: string;\n /** 仅 provider='custom' 必填 (必须 https://); 其他 provider 不可设。 */\n baseUrl?: string;\n}\n\ninterface WireByokCredential {\n credential_ref?: string;\n provider?: string;\n name?: string;\n base_url?: string;\n fingerprint?: string;\n status?: string;\n created_at?: string;\n last_used_at?: string;\n}\n\nfunction fromWireByok(v: WireByokCredential): ByokCredential {\n return {\n credentialRef: v.credential_ref ?? '',\n provider: v.provider ?? '',\n name: v.name || undefined,\n baseUrl: v.base_url || undefined,\n fingerprint: v.fingerprint || undefined,\n status: v.status ?? '',\n createdAt: v.created_at || undefined,\n lastUsedAt: v.last_used_at || undefined,\n };\n}\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** CrabCode 远控 BYO 模型密钥管理面 (契约 §18.2)。 */\n readonly crabcodeByok: CrabCodeByokClient;\n }\n}\n\nconst byokByClient = new WeakMap<Client, CrabCodeByokClient>();\n\nObject.defineProperty(Client.prototype, 'crabcodeByok', {\n configurable: true,\n enumerable: false,\n get(this: Client): CrabCodeByokClient {\n let existing = byokByClient.get(this);\n if (!existing) {\n existing = new CrabCodeByokClient(this);\n byokByClient.set(this, existing);\n }\n return existing;\n },\n});\n\nexport class CrabCodeByokClient {\n constructor(private readonly client: Client) {}\n\n /** 列出调用者自己的密钥 (masked; 新→旧, 服务端上限 100 条)。 */\n async list(signal?: AbortSignal): Promise<ByokCredential[]> {\n const resp = await this.client.doJSON<APIResponse<{ items?: WireByokCredential[] }>>(\n 'GET',\n '/crabcode/byok-credentials',\n null,\n signal,\n );\n return (resp.data?.items ?? []).map(fromWireByok);\n }\n\n /**\n * 创建密钥 — 明文一次性提交, 返回 masked 视图。\n * 单用户上限 20 把; provider='custom' 必须带 https:// baseUrl。\n */\n async create(req: ByokCreateRequest, signal?: AbortSignal): Promise<ByokCredential> {\n const resp = await this.client.doJSON<APIResponse<WireByokCredential>>(\n 'POST',\n '/crabcode/byok-credentials',\n {\n provider: req.provider,\n name: req.name,\n base_url: req.baseUrl,\n plaintext: req.plaintext,\n },\n signal,\n );\n return fromWireByok(resp.data ?? {});\n }\n\n /** 轮换密钥明文 — credentialRef 不变, fingerprint 更新。已吊销的密钥不可轮换 (400)。 */\n async rotate(\n credentialRef: string,\n newPlaintext: string,\n signal?: AbortSignal,\n ): Promise<ByokCredential> {\n const resp = await this.client.doJSON<APIResponse<WireByokCredential>>(\n 'POST',\n `/crabcode/byok-credentials/${encodeURIComponent(credentialRef)}/rotate`,\n { new_plaintext: newPlaintext },\n signal,\n );\n return fromWireByok(resp.data ?? {});\n }\n\n /** 吊销密钥 (软状态 + 服务端抹密文, 不可恢复; 幂等 — 重复吊销返回当前视图)。 */\n async revoke(credentialRef: string, signal?: AbortSignal): Promise<ByokCredential> {\n const resp = await this.client.doJSON<APIResponse<WireByokCredential>>(\n 'POST',\n `/crabcode/byok-credentials/${encodeURIComponent(credentialRef)}/revoke`,\n {},\n signal,\n );\n return fromWireByok(resp.data ?? {});\n }\n}\n","// compliance/scopes.ts — 端口自 acosmi-sdk-go/scopes.go (v0.19.0)\n//\n// 合规履约 scope。\n//\n// 三处必须字面量一致, 任一变更需同步另外两处:\n// - Go: nexus-v4/backend/internal/handler/desktop_oauth.go DesktopOAuthScopes\n// - Java: tk-dist/yudao-module-compliance-api ComplianceScopes\n// - TS: 本文件 ScopeCompliance* 常量\n//\n// 调用 compliance API 时必须按这些常量声明所需 scope; 不允许通过 ScopeAI /\n// ScopeAccount 隐式获得 compliance 权限。合规 scope 不做分组合并 — 服务端按细粒度\n// 校验, SDK 也只应按需申请最小集合。\n\nexport const ScopeComplianceEvidenceRead = 'compliance:evidence:read';\nexport const ScopeComplianceEvidenceWrite = 'compliance:evidence:write';\n\nexport const ScopeComplianceTimestampIssue = 'compliance:timestamp:issue';\nexport const ScopeComplianceTimestampVerify = 'compliance:timestamp:verify';\n\nexport const ScopeComplianceContractSigningRead = 'compliance:contract_signing:read';\nexport const ScopeComplianceContractSigningWrite = 'compliance:contract_signing:write';\n\nexport const ScopeComplianceSealManage = 'compliance:seal:manage';\nexport const ScopeComplianceSealApprovalRequest = 'compliance:seal_approval:request';\nexport const ScopeComplianceSealApprovalApprove = 'compliance:seal_approval:approve';\nexport const ScopeComplianceSealUseExecute = 'compliance:seal_use:execute';\n\nexport const ScopeComplianceReportsRead = 'compliance:reports:read';\nexport const ScopeComplianceReportsWrite = 'compliance:reports:write';\nexport const ScopeComplianceReportsPublish = 'compliance:reports:publish';\n\nexport const ScopeComplianceContractTemplateRead = 'compliance:contract_template:read';\nexport const ScopeComplianceContractTemplateWrite = 'compliance:contract_template:write';\n\n/** 类型联合:合规域细粒度 scope。Java compliance verifier 只按细粒度匹配, 不做分组展开。 */\nexport type ComplianceScope =\n | typeof ScopeComplianceEvidenceRead\n | typeof ScopeComplianceEvidenceWrite\n | typeof ScopeComplianceTimestampIssue\n | typeof ScopeComplianceTimestampVerify\n | typeof ScopeComplianceContractSigningRead\n | typeof ScopeComplianceContractSigningWrite\n | typeof ScopeComplianceSealManage\n | typeof ScopeComplianceSealApprovalRequest\n | typeof ScopeComplianceSealApprovalApprove\n | typeof ScopeComplianceSealUseExecute\n | typeof ScopeComplianceReportsRead\n | typeof ScopeComplianceReportsWrite\n | typeof ScopeComplianceReportsPublish\n | typeof ScopeComplianceContractTemplateRead\n | typeof ScopeComplianceContractTemplateWrite;\n\n/** 全部合规域 scope。OAuth 申请合规权限时使用; 谨慎一次性申请全部, 推荐按业务最小集合申请。 */\nexport function complianceScopes(): ComplianceScope[] {\n return [\n ScopeComplianceEvidenceRead,\n ScopeComplianceEvidenceWrite,\n ScopeComplianceTimestampIssue,\n ScopeComplianceTimestampVerify,\n ScopeComplianceContractSigningRead,\n ScopeComplianceContractSigningWrite,\n ScopeComplianceSealManage,\n ScopeComplianceSealApprovalRequest,\n ScopeComplianceSealApprovalApprove,\n ScopeComplianceSealUseExecute,\n ScopeComplianceReportsRead,\n ScopeComplianceReportsWrite,\n ScopeComplianceReportsPublish,\n ScopeComplianceContractTemplateRead,\n ScopeComplianceContractTemplateWrite,\n ];\n}\n","// compliance/status.ts — 合规域稳定 API 契约(前端可见的最小集合)。\n//\n// 设计原则:\n// - SDK / 插件 / SaaS 不感知下游履约通道材料或内部流水字段。\n// 本文件只暴露面向用户的状态/错误码语义。\n// - 本文件导出的错误码常量是 **SDK 内部 symbolic key**,不是 Java 服务端的 wire 错误码。\n// Java 后端通过 ErrorCodeConstants 暴露的是 1-031-xxx-xxx 数值码;wire 上读到的是\n// {code: number, message: string}。前端要做分类判断时,使用 `compliance/errors.ts`\n// 的 `classifyComplianceError(BusinessError)` 拿到 ComplianceErrorInfo.key,\n// 再按本文件的 symbolic 常量 switch。本文件常量字面量供 SDK 内部分支判断与文档使用,\n// 不是服务端 wire 字段。\n// - 业务入口在后端层关闭时,前端拿到 ENVELOPE_GATE_CLOSED / PROVIDER_NOT_CONFIGURED\n// 必须展示\"功能未开放\",不得自行重试或绕过。\n\n/**\n * Compliance envelope 稳定业务状态。\n *\n * 字面量与 Java `EnvelopeStatusEnum` 的 `name()` 一致(这是 enum,是 wire 上的实际\n * 字符串);前端按这些字符串分支展示文案。\n */\nexport type ComplianceEnvelopeStatus =\n | 'DRAFT'\n | 'CONTRACT_READY'\n | 'APPROVED'\n | 'SIGN_PENDING'\n | 'PENDING_EVIDENCE' // provider 报告成功 / callback 已到,但本地证据链尚未就绪 — 不可承诺扣费\n | 'PENDING_RECONCILIATION' // provider unknown/retrying / 本地 verify 失败 — 进入人工对账\n | 'SUCCESS'\n | 'FAILED'\n | 'CANCELED';\n\n/** Compliance 用印审批稳定状态。 */\nexport type ComplianceSealApprovalStatus =\n | 'DRAFT'\n | 'SUBMITTED'\n | 'APPROVED'\n | 'REJECTED'\n | 'CANCELED'\n | 'USED'\n | 'EXPIRED';\n\n/** Provider 业务状态(前端可见的脱敏视图,不暴露下游内部字段)。 */\nexport type ComplianceProviderStatus =\n | 'pending'\n | 'success'\n | 'failed'\n | 'unknown' // 不可承诺扣费;客户必须等查询/对账完成\n | 'retrying'; // 不可承诺扣费\n\n/**\n * 计费 / 履约的对外稳定状态视图。distribution compliance-billing 内部 API\n * (quote/reserve/commit/cancel/reconcile) 不暴露给前端 — 前端只能看见这 4 个语义。\n */\nexport type ComplianceBillingDisplayStatus =\n | 'reserved' // 已预占,待 provider 成功 + 本地验证\n | 'committed' // 已确认扣费\n | 'canceled' // 已取消\n | 'pending_reconciliation'; // 等待人工对账,扣费状态未确认\n\n// ===========================================================================\n// 错误码(字面量与 Java ErrorCodeConstants 一致)\n// ===========================================================================\n\n/** 高风险动作 step-up — 重新做 OAuth introspection 或重新登录,提升 token 等级后再尝试。 */\nexport const ErrComplianceStepUpRequired = 'COMPLIANCE_STEP_UP_REQUIRED';\n\n/** envelope 闸门关闭 — 审批 gate 等条件未同时就绪,前端展示\"功能开放中\"。 */\nexport const ErrEnvelopeGateClosed = 'ENVELOPE_GATE_CLOSED';\n\n/** 履约 provider 未配置 — 受控环境材料缺失时业务路径会一致拒绝,不要前端重试。 */\nexport const ErrProviderNotConfigured = 'PROVIDER_NOT_CONFIGURED';\n\n/** Provider 返回 unknown / retrying — 客户必须等待对账,前端展示\"处理中(人工核对)\"。 */\nexport const ErrProviderUnknownNoRetry = 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY';\n\n/** callback 不能直接确认扣费 — 后端守门,前端无需处理,记录到审计日志展示即可。 */\nexport const ErrBillingCallbackCannotCommit = 'BILLING_CALLBACK_CANNOT_COMMIT';\n\n/** provider 成功但本地未验证通过,不允许扣费。 */\nexport const ErrBillingCommitRequiresLocalVerify = 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY';\n\n/** distribution compliance-billing 必须 S2S — 前端误调用时拿到该错误码,禁止 retry。 */\nexport const ErrBillingS2sForbidden = 'BILLING_S2S_FORBIDDEN';\n\n/** 审批 gate 各类失败语义(前端展示\"审批中 / 审批已用 / 审批失效\")。 */\nexport const ErrSealApprovalNotApproved = 'SEAL_APPROVAL_STATE_NOT_APPROVED';\nexport const ErrSealApprovalExpired = 'SEAL_APPROVAL_EXPIRED';\nexport const ErrSealApprovalNonceUsed = 'SEAL_APPROVAL_NONCE_USED';\nexport const ErrSealApprovalContractHashMismatch = 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH';\nexport const ErrSealApprovalSealMismatch = 'SEAL_APPROVAL_SEAL_MISMATCH';\nexport const ErrSealApprovalLocationMismatch = 'SEAL_APPROVAL_LOCATION_MISMATCH';\nexport const ErrSealApprovalTransactorMismatch = 'SEAL_APPROVAL_TRANSACTOR_MISMATCH';\n\n/** 用印重复消费防护 — 前端遇到该错误必须刷新审批单状态,不允许\"换一次 nonce 再试\"。 */\nexport const ErrSealUseAlreadyConsumed = 'SEAL_USE_ALREADY_CONSUMED';\n\n/** 该错误码联合用于前端选择性展示文案;非穷举式 enum,后端保留新增空间。 */\nexport type ComplianceClientErrorCode =\n | typeof ErrComplianceStepUpRequired\n | typeof ErrEnvelopeGateClosed\n | typeof ErrProviderNotConfigured\n | typeof ErrProviderUnknownNoRetry\n | typeof ErrBillingCallbackCannotCommit\n | typeof ErrBillingCommitRequiresLocalVerify\n | typeof ErrBillingS2sForbidden\n | typeof ErrSealApprovalNotApproved\n | typeof ErrSealApprovalExpired\n | typeof ErrSealApprovalNonceUsed\n | typeof ErrSealApprovalContractHashMismatch\n | typeof ErrSealApprovalSealMismatch\n | typeof ErrSealApprovalLocationMismatch\n | typeof ErrSealApprovalTransactorMismatch\n | typeof ErrSealUseAlreadyConsumed;\n\n/**\n * 判定一个错误码是否属于\"需要前端引导用户重新认证/审批\"的高级语义,\n * 而不是简单 retry。这类错误前端不允许在 UI 层做自动重试。\n */\nexport function isComplianceTerminalError(code: string): boolean {\n switch (code) {\n case ErrEnvelopeGateClosed:\n case ErrProviderNotConfigured:\n case ErrProviderUnknownNoRetry:\n case ErrBillingCallbackCannotCommit:\n case ErrBillingCommitRequiresLocalVerify:\n case ErrBillingS2sForbidden:\n case ErrSealApprovalNonceUsed:\n case ErrSealApprovalExpired:\n case ErrSealApprovalContractHashMismatch:\n case ErrSealApprovalSealMismatch:\n case ErrSealApprovalLocationMismatch:\n case ErrSealApprovalTransactorMismatch:\n case ErrSealUseAlreadyConsumed:\n return true;\n default:\n return false;\n }\n}\n\n/**\n * \"是否允许在 UI 上呈现为'扣费已确认'\"的判定。\n * provider 状态为 unknown / retrying / pending 时一律不展示为已确认。\n */\nexport function isBillingConfirmable(\n providerStatus: ComplianceProviderStatus | undefined,\n billingStatus: ComplianceBillingDisplayStatus | undefined,\n): boolean {\n return providerStatus === 'success' && billingStatus === 'committed';\n}\n","// compliance/errors.ts — Java numeric ErrorCode → SDK symbolic key.\n//\n// 设计原则:\n// - Java 后端通过 cn.iocoder.yudao.module.compliance.enums.ErrorCodeConstants 暴露\n// 数值错误码(1-031-xxx-xxx)。本文件按段位 + 具体码值映射为 SDK 内部 symbolic key,\n// 仅作 SDK 分支判断 / 文档说明,不作为 wire response 反序列化字段。\n// - 不要尝试从后端 message 文案做正则识别 — message 是中文可变的,code 才是合同。\n// - retryable / terminal / stepUpRequired 严格按\"是否安全自动重发\"语义:\n// * stepUpRequired: 客户端引导用户重新做 OAuth introspection / step-up,不要静默 retry。\n// * retryable: 仅对幂等的网络/资源短暂错误为 true(当前默认全为 false,因为\n// compliance 写接口严禁自动重发)。\n// * terminal: 不需要 SDK 再次轮询;用户必须用新 idempotency-key 重新发起。\n//\n// =============================================================================\n// v1.9.0+ admin 写端点行为变更 (主仓 K10AdminController IMPL-E + IMPL-F)\n// =============================================================================\n//\n// 主仓 csign / compliance-billing admin 写端点 (POST `/api/admin/csign/seals` /\n// `/api/distribution/compliance-billing/commit|cancel|refund` 等) 在 v1.9.0+ 改用\n// 标准 HTTP 状态码语义, 不再统一返 `200 + CommonResult{ok:false, code:N}`:\n//\n// - 跨租户访问别人的资源 → `HTTPError statusCode=403` (FORBIDDEN)\n// - 资源不存在 / 已删除 → `HTTPError statusCode=404` (NOT_FOUND)\n// - 印章/能力未配置 → `HTTPError statusCode=501` (NOT_IMPLEMENTED, 主仓\n// `GlobalErrorCodeConstants.NOT_IMPLEMENTED`, 旧\n// `NOT_CONFIGURED_CODE` 别名指向同一码)\n// - 业务校验失败 → `HTTPError statusCode=400` + CommonResult.error code/message\n//\n// 这些是通用 HTTP 状态码契约, 不属于 compliance 1-031-xxx-xxx 业务段位, 故本文件\n// 不引入新数值码. 集成方应对:\n//\n// try {\n// await client.compliance.someAdminWriteMethod(...);\n// } catch (e) {\n// if (e instanceof HTTPError) {\n// if (e.statusCode === 403) /* 跨租户 */;\n// if (e.statusCode === 404) /* 资源不存在 */;\n// if (e.statusCode === 501) /* 印章未配置 */;\n// }\n// }\n//\n// 不再读 `CommonResult.ok` 字段判定 admin 写端点成功 — v1.9.0+ HTTP 状态码即真相,\n// 4xx/5xx 必抛 HTTPError, 不再 `200 + {ok:false}` 静默失败.\n\nimport type { BusinessError } from '../shared/errors';\n\n/**\n * SDK 内部 symbolic key;用于代码分支判断与文档。**不是 wire contract**。\n */\nexport type ComplianceErrorKey =\n // 通用 / token / scope\n | 'COMPLIANCE_UNAUTHORIZED'\n | 'COMPLIANCE_INSUFFICIENT_SCOPE'\n | 'COMPLIANCE_STEP_UP_REQUIRED'\n | 'COMPLIANCE_TOKEN_INVALID'\n // 主体快照\n | 'SUBJECT_SNAPSHOT_REQUIRED'\n | 'SUBJECT_SNAPSHOT_NOT_FOUND'\n | 'SUBJECT_SNAPSHOT_TENANT_MISMATCH'\n // Evidence / Timestamp / Package / Report\n | 'EVIDENCE_ASSET_NOT_FOUND'\n | 'EVIDENCE_ASSET_HASH_MISMATCH'\n | 'EVIDENCE_ASSET_PAYLOAD_REQUIRED'\n | 'TIMESTAMP_TOKEN_NOT_FOUND'\n | 'TIMESTAMP_PROVIDER_FAILED'\n | 'TIMESTAMP_PROVIDER_UNKNOWN'\n | 'TIMESTAMP_LOCAL_VERIFY_FAILED'\n | 'TIMESTAMP_PROVIDER_NOT_AVAILABLE'\n | 'EVIDENCE_PACKAGE_NOT_FOUND'\n | 'EVIDENCE_PACKAGE_TIMESTAMP_REQUIRED'\n | 'EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH'\n | 'REPORT_NOT_FOUND'\n | 'REPORT_ALREADY_PUBLISHED'\n | 'REPORT_DRAFT_REQUIRED'\n | 'EVIDENCE_VERIFY_TARGET_REQUIRED'\n | 'EVIDENCE_VERIFY_TARGET_NOT_FOUND'\n // Provider request\n | 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY'\n | 'PROVIDER_CALLBACK_SOURCE_INVALID'\n | 'PROVIDER_NOT_CONFIGURED'\n | 'PROVIDER_REQUEST_NOT_FOUND'\n | 'PROVIDER_REQUEST_IDEMPOTENCY_REQUIRED'\n | 'PROVIDER_REQUEST_STATUS_NOT_TERMINAL'\n // Envelope\n | 'ENVELOPE_NOT_FOUND'\n | 'ENVELOPE_TENANT_MISMATCH'\n | 'ENVELOPE_STATE_NOT_ALLOWED'\n | 'ENVELOPE_GATE_CLOSED'\n | 'CONTRACT_NOT_FOUND'\n | 'CONTRACT_HASH_MISMATCH'\n | 'PROVIDER_AUTHORIZATION_NOT_CONFIRMED'\n | 'ENVELOPE_EVIDENCE_NOT_READY'\n // Seal approval\n | 'SEAL_ASSET_NOT_FOUND'\n | 'SEAL_APPROVAL_NOT_FOUND'\n | 'SEAL_APPROVAL_STATE_NOT_APPROVED'\n | 'SEAL_APPROVAL_EXPIRED'\n | 'SEAL_APPROVAL_ALREADY_USED'\n | 'SEAL_APPROVAL_NONCE_USED'\n | 'SEAL_APPROVAL_SEAL_MISMATCH'\n | 'SEAL_APPROVAL_LOCATION_MISMATCH'\n | 'SEAL_APPROVAL_TRANSACTOR_MISMATCH'\n | 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH'\n | 'SEAL_APPROVAL_INVALID_TRANSITION'\n | 'SEAL_USE_ALREADY_CONSUMED'\n // Audit chain\n | 'AUDIT_CHAIN_TAMPER_DETECTED'\n // Billing\n | 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY'\n | 'BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS'\n | 'BILLING_CALLBACK_CANNOT_COMMIT'\n | 'BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE'\n | 'BILLING_S2S_FORBIDDEN'\n // SDK fallback\n | 'UNKNOWN_COMPLIANCE_ERROR';\n\n/** 单个错误的 SDK 视图。 */\nexport interface ComplianceErrorInfo {\n /** Java numeric error code (wire contract)。 */\n code: number;\n /** 服务端原始 message(中文,可变);仅用于日志/展示。 */\n message: string;\n /** SDK 分支判断用 symbolic key。 */\n key: ComplianceErrorKey;\n /** 是否安全自动重试 — compliance 写接口几乎全为 false。 */\n retryable: boolean;\n /** 是否已经是终态 — 用户必须用新 idempotency-key 重新发起。 */\n terminal: boolean;\n /** 高风险动作需要 step-up / introspection。 */\n stepUpRequired: boolean;\n}\n\n// =============================================================================\n// numeric → symbolic 映射(与 Java ErrorCodeConstants 同步)。\n// =============================================================================\n\nconst CODE_TO_KEY: Record<number, ComplianceErrorKey> = {\n // 通用 / token / scope (1-031-000-xxx)\n 1031000001: 'COMPLIANCE_UNAUTHORIZED',\n 1031000002: 'COMPLIANCE_TOKEN_INVALID',\n 1031000003: 'COMPLIANCE_TOKEN_INVALID',\n 1031000004: 'COMPLIANCE_TOKEN_INVALID',\n 1031000005: 'COMPLIANCE_TOKEN_INVALID',\n 1031000006: 'COMPLIANCE_TOKEN_INVALID',\n 1031000007: 'COMPLIANCE_TOKEN_INVALID',\n 1031000008: 'COMPLIANCE_TOKEN_INVALID',\n 1031000009: 'COMPLIANCE_TOKEN_INVALID',\n 1031000010: 'COMPLIANCE_TOKEN_INVALID',\n 1031000011: 'COMPLIANCE_TOKEN_INVALID',\n 1031000012: 'COMPLIANCE_INSUFFICIENT_SCOPE',\n 1031000013: 'COMPLIANCE_STEP_UP_REQUIRED',\n // Subject snapshot (1-031-001-xxx)\n 1031001001: 'SUBJECT_SNAPSHOT_NOT_FOUND',\n 1031001002: 'SUBJECT_SNAPSHOT_TENANT_MISMATCH',\n 1031001003: 'SUBJECT_SNAPSHOT_REQUIRED',\n // Evidence / Timestamp / Package / Report (1-031-002-xxx)\n 1031002001: 'EVIDENCE_ASSET_NOT_FOUND',\n 1031002002: 'SUBJECT_SNAPSHOT_TENANT_MISMATCH',\n 1031002003: 'EVIDENCE_ASSET_HASH_MISMATCH',\n 1031002004: 'EVIDENCE_ASSET_PAYLOAD_REQUIRED',\n 1031002005: 'EVIDENCE_ASSET_PAYLOAD_REQUIRED',\n 1031002006: 'TIMESTAMP_TOKEN_NOT_FOUND',\n 1031002007: 'TIMESTAMP_PROVIDER_FAILED',\n 1031002008: 'TIMESTAMP_PROVIDER_UNKNOWN',\n 1031002009: 'TIMESTAMP_LOCAL_VERIFY_FAILED',\n 1031002010: 'TIMESTAMP_PROVIDER_NOT_AVAILABLE',\n 1031002011: 'EVIDENCE_PACKAGE_NOT_FOUND',\n 1031002012: 'EVIDENCE_PACKAGE_TIMESTAMP_REQUIRED',\n 1031002013: 'EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH',\n 1031002014: 'REPORT_NOT_FOUND',\n 1031002015: 'REPORT_ALREADY_PUBLISHED',\n 1031002016: 'REPORT_DRAFT_REQUIRED',\n 1031002017: 'EVIDENCE_VERIFY_TARGET_REQUIRED',\n 1031002018: 'EVIDENCE_VERIFY_TARGET_NOT_FOUND',\n // Provider request (1-031-003-xxx)\n 1031003001: 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY',\n 1031003002: 'PROVIDER_CALLBACK_SOURCE_INVALID',\n 1031003003: 'PROVIDER_NOT_CONFIGURED',\n 1031003010: 'PROVIDER_REQUEST_NOT_FOUND',\n 1031003011: 'PROVIDER_REQUEST_IDEMPOTENCY_REQUIRED',\n 1031003012: 'PROVIDER_REQUEST_STATUS_NOT_TERMINAL',\n // Envelope (1-031-004-xxx)\n 1031004001: 'ENVELOPE_NOT_FOUND',\n 1031004002: 'ENVELOPE_TENANT_MISMATCH',\n 1031004003: 'ENVELOPE_STATE_NOT_ALLOWED',\n 1031004004: 'ENVELOPE_GATE_CLOSED',\n 1031004005: 'CONTRACT_NOT_FOUND',\n 1031004006: 'CONTRACT_HASH_MISMATCH',\n 1031004007: 'CONTRACT_NOT_FOUND',\n 1031004008: 'PROVIDER_AUTHORIZATION_NOT_CONFIRMED',\n 1031004009: 'PROVIDER_AUTHORIZATION_NOT_CONFIRMED',\n 1031004010: 'ENVELOPE_EVIDENCE_NOT_READY',\n // Seal approval / use (1-031-005-xxx)\n 1031005001: 'SEAL_ASSET_NOT_FOUND',\n 1031005010: 'SEAL_APPROVAL_NOT_FOUND',\n 1031005011: 'SEAL_APPROVAL_NOT_FOUND',\n 1031005012: 'SEAL_APPROVAL_STATE_NOT_APPROVED',\n 1031005013: 'SEAL_APPROVAL_EXPIRED',\n 1031005014: 'SEAL_APPROVAL_ALREADY_USED',\n 1031005015: 'SEAL_APPROVAL_NONCE_USED',\n 1031005016: 'SEAL_APPROVAL_SEAL_MISMATCH',\n 1031005017: 'SEAL_APPROVAL_LOCATION_MISMATCH',\n 1031005018: 'SEAL_APPROVAL_TRANSACTOR_MISMATCH',\n 1031005019: 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH',\n 1031005020: 'SEAL_APPROVAL_INVALID_TRANSITION',\n 1031005030: 'SEAL_USE_ALREADY_CONSUMED',\n // Billing (1-031-006-xxx)\n 1031006004: 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY',\n 1031006005: 'BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS',\n 1031006007: 'BILLING_CALLBACK_CANNOT_COMMIT',\n 1031006008: 'BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE',\n 1031006009: 'BILLING_S2S_FORBIDDEN',\n // Audit (1-031-007-xxx)\n 1031007011: 'AUDIT_CHAIN_TAMPER_DETECTED',\n};\n\nconst STEP_UP_KEYS = new Set<ComplianceErrorKey>(['COMPLIANCE_STEP_UP_REQUIRED']);\n\nconst TERMINAL_KEYS = new Set<ComplianceErrorKey>([\n 'ENVELOPE_GATE_CLOSED',\n 'PROVIDER_NOT_CONFIGURED',\n 'PROVIDER_REQUEST_UNKNOWN_NO_RETRY',\n 'BILLING_CALLBACK_CANNOT_COMMIT',\n 'BILLING_COMMIT_REQUIRES_LOCAL_VERIFY',\n 'BILLING_COMMIT_REQUIRES_PROVIDER_SUCCESS',\n 'BILLING_PROVIDER_UNKNOWN_NOT_COMMITTABLE',\n 'BILLING_S2S_FORBIDDEN',\n 'SEAL_APPROVAL_NONCE_USED',\n 'SEAL_APPROVAL_EXPIRED',\n 'SEAL_APPROVAL_CONTRACT_HASH_MISMATCH',\n 'SEAL_APPROVAL_SEAL_MISMATCH',\n 'SEAL_APPROVAL_LOCATION_MISMATCH',\n 'SEAL_APPROVAL_TRANSACTOR_MISMATCH',\n 'SEAL_USE_ALREADY_CONSUMED',\n 'CONTRACT_HASH_MISMATCH',\n 'TIMESTAMP_LOCAL_VERIFY_FAILED',\n 'EVIDENCE_PACKAGE_MANIFEST_HASH_MISMATCH',\n 'AUDIT_CHAIN_TAMPER_DETECTED',\n 'PROVIDER_REQUEST_NOT_FOUND',\n 'EVIDENCE_ASSET_HASH_MISMATCH',\n 'EVIDENCE_VERIFY_TARGET_NOT_FOUND',\n 'REPORT_ALREADY_PUBLISHED',\n]);\n\n// 真正\"网络层 / 资源短暂不可用\"才允许 retryable=true。compliance 错误几乎全部 false。\nconst RETRYABLE_KEYS = new Set<ComplianceErrorKey>([]);\n\n/**\n * 把一个 BusinessError 分类为 compliance 视图。\n * 非 compliance 段位的错误码会回退到 UNKNOWN_COMPLIANCE_ERROR,调用方应该当作业务错误处理。\n */\nexport function classifyComplianceError(err: BusinessError): ComplianceErrorInfo {\n const key = CODE_TO_KEY[err.code] ?? 'UNKNOWN_COMPLIANCE_ERROR';\n return {\n code: err.code,\n message: err.message,\n key,\n retryable: RETRYABLE_KEYS.has(key),\n terminal: TERMINAL_KEYS.has(key),\n stepUpRequired: STEP_UP_KEYS.has(key),\n };\n}\n\n/**\n * 判断 BusinessError 是否属于 compliance 段位(1-031-xxx-xxx)。\n * 不在段位的错误码可能来自其它 yudao 模块,按通用业务错误处理即可。\n */\nexport function isComplianceBusinessError(err: BusinessError): boolean {\n return err.code >= 1031000000 && err.code <= 1031999999;\n}\n","// compliance/client.ts — Compliance 域 SDK-facing subclient。\n//\n// 设计原则(严格):\n// - 走独立 base URL(client.complianceURL(path)),不复用 /api/v4 路径。\n// - GET 认证读走 retryOn401=true(与 agent-runs 同节奏,幂等安全)。\n// - 公开 verify 走 publicRead:无 token 匿名请求,有 token 附带 Authorization 以保留\n// 审计上下文;public 端点不应要求认证 → 401 不触发 forceRefresh,也不做 refresh replay。\n// - POST 写操作走专属 helper:发送前 ensureToken 一次确保 token fresh;遇到 401\n// 直接抛 HTTPError,不自动重放 — compliance 写接口可能在 provider 侧落幂等写入,\n// SDK 自动重放会导致 provider 重复请求 / 重复扣费风险。\n// - 写操作支持 Idempotency-Key header;调用方应持久化 key,重试 / 恢复时复用。\n// - polling helper 按 verificationStatus / provider request status 分类:UNKNOWN /\n// RETRYING / PENDING 继续轮询;VERIFIED / SUCCESS → 返回;FAILED / LOCAL_VERIFY_FAILED\n// → 抛 typed error;总超时后抛 polling timeout(不自动重发原请求)。\n// - SDK 不传 provider 字段;服务端按配置选择 provider,不再接受调用方指定。\n\nimport { Client, DEFAULT_API_TIMEOUT_MS } from '../core/client';\nimport { isUserAccessTokenRejected, type BusinessError } from '../shared/errors';\nimport type { APIResponse } from '../shared/api-response';\nimport { apiResponseBusinessError } from '../shared/api-response';\nimport {\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../core/http';\nimport type { PageRequest, PageResult } from '../shared/pagination';\nimport type { CompliancePollOptions, ComplianceWriteOptions } from './types';\nimport type {\n CreateEvidenceAssetRequest,\n EvidenceAsset,\n EvidenceAssetPageItem,\n EvidencePackage,\n EvidencePackagePageItem,\n ListEvidenceAssetsRequest,\n ListEvidencePackagesRequest,\n PublicEvidenceVerifyResult,\n} from './evidence/types';\nimport type {\n ComplianceTimestampVerificationStatus,\n IssueTimestampRequest,\n ListTimestampsRequest,\n TimestampPageItem,\n TimestampToken,\n TimestampVerifyResult,\n TsaProvider,\n TsaStats,\n VerifyTimestampRequest,\n} from './timestamp/types';\nimport type {\n ComplianceReport,\n CreateReportRequest,\n ListReportsRequest,\n ReportDownload,\n ReportPageItem,\n} from './report/types';\nimport type {\n CreateH5SigningUrlRequest,\n CreateSigningEnvelopeRequest,\n EnvelopeContractItem,\n ListSigningEnvelopesRequest,\n SignEnvelopeRequest,\n SigningEnvelope,\n SigningEnvelopePageItem,\n VoidEnvelopeRequest,\n} from './signing/types';\nimport type {\n ApproveSealApprovalQuery,\n CancelSealApprovalQuery,\n ListSealApprovalsRequest,\n ListSealUsesRequest,\n RejectSealApprovalQuery,\n SealApproval,\n SealApprovalPageItem,\n SealUsePageItem,\n SubmitSealApprovalRequest,\n} from './seal-approval/types';\nimport type {\n ComplianceProviderRequestStatus,\n ProviderRequestStatusView,\n} from './provider/types';\nimport type {\n ComplianceCapability,\n ListOperationsRequest,\n OperationDetail,\n OperationPageItem,\n} from './operation/types';\nimport type {\n ContractTemplatePageItem,\n ContractTemplateResp,\n ContractTemplateVersion,\n CreateContractTemplateRequest,\n ListContractTemplatesRequest,\n UpdateContractTemplateRequest,\n UploadContractTemplatePdfRequest,\n} from './template/types';\nimport {\n classifyComplianceError,\n isComplianceBusinessError,\n type ComplianceErrorInfo,\n} from './errors';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** SDK-facing 时间章与电子证据 / 合同签署能力。 */\n readonly compliance: ComplianceClient;\n }\n}\n\nconst cache = new WeakMap<Client, ComplianceClient>();\n\nObject.defineProperty(Client.prototype, 'compliance', {\n configurable: true,\n enumerable: false,\n get(this: Client): ComplianceClient {\n let existing = cache.get(this);\n if (!existing) {\n existing = new ComplianceClient(this);\n cache.set(this, existing);\n }\n return existing;\n },\n});\n\n/**\n * compliance 业务方法默认轮询参数。\n */\nconst DEFAULT_POLL: Required<Omit<CompliancePollOptions, 'signal'>> = {\n timeoutMs: 60_000,\n initialIntervalMs: 1_000,\n maxIntervalMs: 5_000,\n multiplier: 1.5,\n};\n\n/**\n * 当 compliance polling 检测到终态失败 / 已过 timeout / step-up 时抛出。\n *\n * 分类逻辑:终态失败优先于 timeout;timeout 不算 retryable,调用方必须用新 idempotency-key\n * 重新发起整条链路。\n */\nexport class CompliancePollError extends Error {\n readonly kind: 'timeout' | 'terminal_failure' | 'step_up_required' | 'unknown';\n readonly lastInfo?: ComplianceErrorInfo;\n\n constructor(\n message: string,\n kind: 'timeout' | 'terminal_failure' | 'step_up_required' | 'unknown',\n lastInfo?: ComplianceErrorInfo,\n ) {\n super(message);\n this.name = 'CompliancePollError';\n this.kind = kind;\n this.lastInfo = lastInfo;\n }\n}\n\ninterface WriteContext {\n idempotencyKey?: string;\n signal?: AbortSignal;\n}\n\nexport class ComplianceClient {\n constructor(private readonly client: Client) {}\n\n // =========================================================================\n // Evidence Asset\n // =========================================================================\n\n /** 创建证据资产(写)。 */\n createEvidenceAsset(\n req: CreateEvidenceAssetRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<EvidenceAsset> {\n return this.write<EvidenceAsset>(\n 'POST',\n '/compliance/evidence/assets',\n req,\n writeCtx(opts),\n );\n }\n\n /** 读 — 证据资产详情。 */\n getEvidenceAsset(id: number, signal?: AbortSignal): Promise<EvidenceAsset> {\n return this.read<EvidenceAsset>(\n 'GET',\n `/compliance/evidence/assets/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 证据资产分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 yudao `PageResult<T>`\n * (`{ total, list }`)。所有过滤项可选;`createTimeStart` / `createTimeEnd`\n * 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listEvidenceAssets(\n req: ListEvidenceAssetsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<EvidenceAssetPageItem>> {\n return this.read<PageResult<EvidenceAssetPageItem>>(\n 'GET',\n `/compliance/evidence/assets/page${pageQuery(req, ['assetType', 'status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 公开 verify。隐私边界:返回字段不含 PII / 合同原文 / storage / provider raw。\n *\n * 匿名可调用:未 login 时走匿名请求,不会抛 `not authorized, call login() first`。\n * 已 login / 已持有 token 时附带 `Authorization` 以保留审计上下文。public 端点不\n * 应要求认证 — 收到 401 直接抛 HTTPError,不触发 `forceRefresh`,也不做 refresh\n * replay。\n */\n verifyEvidencePublic(\n params: { evidenceNo?: string; publicVerifyCode?: string },\n signal?: AbortSignal,\n ): Promise<PublicEvidenceVerifyResult> {\n const q = new URLSearchParams();\n if (params.evidenceNo) q.set('evidenceNo', params.evidenceNo);\n if (params.publicVerifyCode) q.set('publicVerifyCode', params.publicVerifyCode);\n const qs = q.toString();\n return this.publicRead<PublicEvidenceVerifyResult>(\n 'GET',\n `/compliance/evidence/verify${qs ? '?' + qs : ''}`,\n signal,\n );\n }\n\n // =========================================================================\n // Timestamp\n // =========================================================================\n\n /** 申请时间章(写)。SDK 永远不传 provider 字段。 */\n issueTimestamp(\n req: IssueTimestampRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<TimestampToken> {\n return this.write<TimestampToken>('POST', '/compliance/timestamps', req, writeCtx(opts));\n }\n\n /** 给已有资产申请时间章。SDK 永远不传 provider 字段。 */\n issueTimestampForAsset(\n assetId: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<TimestampToken> {\n return this.write<TimestampToken>(\n 'POST',\n `/compliance/evidence/assets/${encodeURIComponent(assetId)}/timestamp`,\n null,\n writeCtx(opts),\n );\n }\n\n /** 读 — 时间章 token 详情。 */\n getTimestamp(id: number, signal?: AbortSignal): Promise<TimestampToken> {\n return this.read<TimestampToken>(\n 'GET',\n `/compliance/timestamps/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 时间章分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listTimestamps(\n req: ListTimestampsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<TimestampPageItem>> {\n return this.read<PageResult<TimestampPageItem>>(\n 'GET',\n `/compliance/timestamps/page${pageQuery(req, ['provider', 'verificationStatus', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /** verify — 本地离线校验已申请的时间章。 */\n verifyTimestamp(\n req: VerifyTimestampRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<TimestampVerifyResult> {\n return this.write<TimestampVerifyResult>(\n 'POST',\n '/compliance/timestamps/verify',\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 轮询到 VERIFIED 终态。\n * - VERIFIED → 返回 token;\n * - FAILED / LOCAL_VERIFY_FAILED → 抛 {@link CompliancePollError} kind='terminal_failure';\n * - UNKNOWN / RETRYING / PENDING → 继续轮询直到 timeout;\n * - timeout → 抛 {@link CompliancePollError} kind='timeout'。\n */\n async waitForTimestampVerified(\n id: number,\n opts: CompliancePollOptions = {},\n ): Promise<TimestampToken> {\n return this.poll<TimestampToken>(\n () => this.getTimestamp(id, opts.signal),\n (t) => classifyTimestamp(t.verificationStatus as ComplianceTimestampVerificationStatus),\n opts,\n );\n }\n\n // =========================================================================\n // TSA readonly views (read-only — compliance gateway S3 / gap-register U-7)\n // =========================================================================\n\n /**\n * 读 — 时间章授权机构(TSA)provider 列表(compliance gateway S3)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G3 为每个 TSA provider 返回\n * 一条 {@link TsaProvider}:名称、所处环境、当前是否可用。只读视图,不含\n * provider 端点 / 凭证 / 证书等内部接入材料。\n */\n listTsaProviders(signal?: AbortSignal): Promise<TsaProvider[]> {\n return this.read<TsaProvider[]>(\n 'GET',\n '/compliance/timestamps/providers',\n null,\n signal,\n );\n }\n\n /**\n * 读 — 时间章统计视图(compliance gateway S3)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 {@link TsaStats}:时间章总数\n * + 按校验状态分桶的计数。只读聚合视图。\n */\n getTsaStats(signal?: AbortSignal): Promise<TsaStats> {\n return this.read<TsaStats>(\n 'GET',\n '/compliance/timestamps/stats',\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Evidence Package\n // =========================================================================\n\n /** 构建证据包(写)。 */\n buildEvidencePackage(\n assetId: number,\n timestampTokenId?: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<EvidencePackage> {\n const tsParam = timestampTokenId == null\n ? ''\n : '?timestampTokenId=' + encodeURIComponent(timestampTokenId);\n return this.write<EvidencePackage>(\n 'POST',\n `/compliance/evidence/assets/${encodeURIComponent(assetId)}/packages${tsParam}`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 读 — 证据包分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listEvidencePackages(\n req: ListEvidencePackagesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<EvidencePackagePageItem>> {\n return this.read<PageResult<EvidencePackagePageItem>>(\n 'GET',\n `/compliance/evidence/packages/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Report\n // =========================================================================\n\n /** 创建证据报告(写)。 */\n createReport(\n req: CreateReportRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ComplianceReport> {\n return this.write<ComplianceReport>('POST', '/compliance/reports', req, writeCtx(opts));\n }\n\n /** 读 — 报告详情。 */\n getReport(id: number, signal?: AbortSignal): Promise<ComplianceReport> {\n return this.read<ComplianceReport>(\n 'GET',\n `/compliance/reports/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 证据报告分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listReports(\n req: ListReportsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<ReportPageItem>> {\n return this.read<PageResult<ReportPageItem>>(\n 'GET',\n `/compliance/reports/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 发布报告(写,step-up 必须)。\n *\n * `@status gated` — step-up 闸门未闭合前服务端会一致返回\n * `COMPLIANCE_STEP_UP_REQUIRED`(数值码 1031000013)。SDK 不会自动重试、不伪成功;\n * 调用方需要引导用户重新做 OAuth introspection 或重新登录后再次调用本方法\n *(使用同一 idempotency-key)。方法状态分级见 `docs/compliance.md` Method Status。\n */\n publishReport(id: number, opts: ComplianceWriteOptions = {}): Promise<ComplianceReport> {\n return this.write<ComplianceReport>(\n 'POST',\n `/compliance/reports/${encodeURIComponent(id)}/publish`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 下载报告(读)。返回 {@link ReportDownload}:报告 hash + 资产 hash + 证据包 hash +\n * 时间章 serial/genTime,足以离线复核。\n * 不返回 bodyCanonicalJson / storage key / subject snapshot id。\n */\n downloadReport(id: number, signal?: AbortSignal): Promise<ReportDownload> {\n return this.read<ReportDownload>(\n 'GET',\n `/compliance/reports/${encodeURIComponent(id)}/download`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Signing Envelope\n // =========================================================================\n\n /** 创建 envelope(写)。返回 envelope id。 */\n createSigningEnvelope(\n req: CreateSigningEnvelopeRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<number> {\n return this.write<number>(\n 'POST',\n '/compliance/signing-envelopes',\n req,\n writeCtx(opts),\n );\n }\n\n /** 读 — envelope 详情。租户由服务端从 compliance token principal 推导。 */\n getSigningEnvelope(\n envelopeId: number,\n signal?: AbortSignal,\n ): Promise<SigningEnvelope> {\n return this.read<SigningEnvelope>(\n 'GET',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 签署 envelope 分页列表(compliance gateway S1)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;`createTimeStart` /\n * `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n */\n listSigningEnvelopes(\n req: ListSigningEnvelopesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<SigningEnvelopePageItem>> {\n return this.read<PageResult<SigningEnvelopePageItem>>(\n 'GET',\n `/compliance/signing-envelopes/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 正式签署(写,step-up 必须)。\n *\n * `@status gated` — 服务端闸门关闭时会一致返回 `ENVELOPE_GATE_CLOSED` (1031004004)。\n * SDK 不重试、不伪成功;调用方应该将该错误展示为\"功能未开放\"。\n */\n signEnvelope(\n envelopeId: number,\n req: SignEnvelopeRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n return this.write<void>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/sign`,\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 创建 H5 签署短链(写,step-up 必须)。\n *\n * `@status gated` — 同 {@link signEnvelope}:服务端闸门关闭时 SDK 不重试、不伪成功。\n */\n createH5SigningUrl(\n envelopeId: number,\n req: CreateH5SigningUrlRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<string> {\n return this.write<string>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/h5-url`,\n req,\n writeCtx(opts),\n );\n }\n\n /** 同步 provider 状态(写但只读对账,不创建新 provider 请求)。 */\n syncSigningEnvelopeStatus(\n envelopeId: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n return this.write<void>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/sync-provider-status`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 读 — envelope 下挂的合同列表(compliance gateway S4)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G4 为每份挂在该 envelope 上的\n * 合同返回一条 {@link EnvelopeContractItem}:编号 / 标题 / MIME / 大小 / 哈希\n * 指纹 / 状态。返回普通数组(非 `PageResult`)。SDK-safe 视图——不含合同原文 /\n * storage key / provider raw payload。\n */\n listEnvelopeContracts(\n envelopeId: number,\n signal?: AbortSignal,\n ): Promise<EnvelopeContractItem[]> {\n return this.read<EnvelopeContractItem[]>(\n 'GET',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/contracts`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — envelope 关联的 provider 请求列表(compliance gateway S4)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G4 复用操作投影\n * {@link OperationPageItem}:描述每次 provider 请求本身的执行进度,与 envelope\n * 领域状态正交。返回普通数组(非 `PageResult`)。\n */\n listEnvelopeProviderRequests(\n envelopeId: number,\n signal?: AbortSignal,\n ): Promise<OperationPageItem[]> {\n return this.read<OperationPageItem[]>(\n 'GET',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/provider-requests`,\n null,\n signal,\n );\n }\n\n /**\n * 作废 envelope(写,compliance gateway S4)。\n *\n * 走 compliance 写路径——发送前 `ensureToken` 一次、不自动重试、`401` 不刷新\n * 重放;支持 `Idempotency-Key` header(强烈建议调用方持久化幂等键,重试 / 恢复\n * 时复用,避免重复作废)。`req.reason` 为必填的作废原因,随 JSON body 提交。\n */\n voidEnvelope(\n envelopeId: number,\n req: VoidEnvelopeRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<boolean> {\n return this.write<boolean>(\n 'POST',\n `/compliance/signing-envelopes/${encodeURIComponent(envelopeId)}/void`,\n req,\n writeCtx(opts),\n );\n }\n\n // =========================================================================\n // Seal Approval\n // =========================================================================\n\n /**\n * 提交用印审批申请(写)。\n *\n * `@status production-ready` — 服务端以 `Idempotency-Key` + 业务请求指纹做重放保护:\n * 同 key + 同请求 → 返回原审批 id;同 key + 不同请求 → 拒绝复用幂等键。强烈建议调用方\n * 持久化 `idempotencyKey`,网络重试 / 任务恢复时复用,避免重复创建审批单。\n */\n submitSealApproval(\n req: SubmitSealApprovalRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<number> {\n return this.write<number>(\n 'POST',\n '/compliance/seal-approvals',\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 审批通过用印申请(写,step-up 必须)。\n *\n * `@status gated` — step-up 未闭合前服务端会返回 `COMPLIANCE_STEP_UP_REQUIRED`。\n * SDK 不重试、不伪成功。方法状态分级见 `docs/compliance.md` Method Status。\n */\n approveSealApproval(\n id: number,\n query: ApproveSealApprovalQuery,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n const q = new URLSearchParams();\n if (query.expiresAt) q.set('expiresAt', query.expiresAt);\n if (query.note) q.set('note', query.note);\n const qs = q.toString();\n return this.write<void>(\n 'POST',\n `/compliance/seal-approvals/${encodeURIComponent(id)}/approve${qs ? '?' + qs : ''}`,\n null,\n writeCtx(opts),\n );\n }\n\n rejectSealApproval(\n id: number,\n query: RejectSealApprovalQuery,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n const q = new URLSearchParams();\n if (query.reason) q.set('reason', query.reason);\n const qs = q.toString();\n return this.write<void>(\n 'POST',\n `/compliance/seal-approvals/${encodeURIComponent(id)}/reject${qs ? '?' + qs : ''}`,\n null,\n writeCtx(opts),\n );\n }\n\n cancelSealApproval(\n id: number,\n query: CancelSealApprovalQuery,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n const q = new URLSearchParams();\n if (query.reason) q.set('reason', query.reason);\n const qs = q.toString();\n return this.write<void>(\n 'POST',\n `/compliance/seal-approvals/${encodeURIComponent(id)}/cancel${qs ? '?' + qs : ''}`,\n null,\n writeCtx(opts),\n );\n }\n\n listPendingSealApprovals(\n signal?: AbortSignal,\n ): Promise<SealApproval[]> {\n return this.read<SealApproval[]>(\n 'GET',\n '/compliance/seal-approvals/pending',\n null,\n signal,\n );\n }\n\n getSealApproval(id: number, signal?: AbortSignal): Promise<SealApproval> {\n return this.read<SealApproval>(\n 'GET',\n `/compliance/seal-approvals/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 用印审批分页列表(compliance gateway S1)。\n *\n * 与 {@link listPendingSealApprovals}(仅 pending、不分页)不同,本方法支持分页与\n * 状态 / 时间过滤。走 GET 读路径。返回 yudao `PageResult<T>`。所有过滤项可选;\n * `createTimeStart` / `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,\n * SDK 原样透传。\n */\n listSealApprovals(\n req: ListSealApprovalsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<SealApprovalPageItem>> {\n return this.read<PageResult<SealApprovalPageItem>>(\n 'GET',\n `/compliance/seal-approvals/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Seal Use (read-only — compliance gateway S6 / gap-register U-4)\n // =========================================================================\n\n /**\n * 读 — 用印执行记录分页列表(compliance gateway S6)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 yudao `PageResult<T>`\n * (`{ total, list }`)。一次用印执行(seal use)描述 envelope / contract /\n * seal / 审批联动后【真正调用 provider 落章】的那一笔记录,与 envelope\n * 领域状态正交。所有过滤项可选;`createTimeStart` / `createTimeEnd` 由调用方\n * 按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。\n *\n * 与后端复用同一只读 scope `CONTRACT_SIGNING_READ`\n *({@link ScopeComplianceContractSigningRead})——不引入新 scope。\n */\n listSealUses(\n req: ListSealUsesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<SealUsePageItem>> {\n return this.read<PageResult<SealUsePageItem>>(\n 'GET',\n `/compliance/seal-uses/page${pageQuery(req, ['sealId', 'envelopeId', 'usageStatus', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Provider Request (read-only)\n // =========================================================================\n\n getProviderRequest(id: number, signal?: AbortSignal): Promise<ProviderRequestStatusView> {\n return this.read<ProviderRequestStatusView>(\n 'GET',\n `/compliance/provider-requests/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 轮询 provider request 到 SUCCESS / FAILED 终态。\n * - SUCCESS / FAILED → 返回最后视图;\n * - UNKNOWN / RETRYING / PENDING → 继续轮询;\n * - timeout → 抛 {@link CompliancePollError} kind='timeout',不自动重发原 provider 请求。\n *\n * SUCCESS 不代表 billing 已 commit;调用方仍需通过业务侧 envelope / asset 终态判断。\n */\n async waitForProviderRequestTerminal(\n id: number,\n opts: CompliancePollOptions = {},\n ): Promise<ProviderRequestStatusView> {\n return this.poll<ProviderRequestStatusView>(\n () => this.getProviderRequest(id, opts.signal),\n (v) => classifyProviderStatus(v.status as ComplianceProviderRequestStatus),\n opts,\n );\n }\n\n // =========================================================================\n // Capabilities (read-only — compliance gateway S2 / gap-register U-6)\n // =========================================================================\n\n /**\n * 读 — compliance 能力闸门列表(compliance gateway S2)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。后端 G2 为每个高风险 / 收费动作\n * (`signEnvelope` / `createH5SigningUrl` / `publishReport` /\n * `approveSealApproval` / `executeSealUse` / `createSeal`)返回一条\n * {@link ComplianceCapability}:是否可执行、所处状态、所需 scope / step-up。\n *\n * 调用方在高风险动作执行【前】查询本结果做门控;拿不到能力时必须 fail-closed\n *(按 `executable=false` 处理)。\n */\n getCapabilities(signal?: AbortSignal): Promise<ComplianceCapability[]> {\n return this.read<ComplianceCapability[]>(\n 'GET',\n '/compliance/capabilities',\n null,\n signal,\n );\n }\n\n /**\n * 读 — 单个动作的能力闸门视图(便捷方法)。\n *\n * 拉取完整 {@link getCapabilities} 列表并返回 `action` 匹配的那一条,无匹配时\n * 返回 `undefined`。**每次调用产生一次网络请求**——需要门控多个动作时应改用\n * {@link getCapabilities} 一次性取回再本地查表,避免重复请求。\n *\n * 与 {@link getCapabilities} 一致走 GET 读路径(允许 401 单次刷新重放)。\n */\n async getFeatureGate(\n action: string,\n signal?: AbortSignal,\n ): Promise<ComplianceCapability | undefined> {\n const caps = await this.getCapabilities(signal);\n return caps.find((c) => c.action === action);\n }\n\n // =========================================================================\n // Operation projection (read-only — compliance gateway S2 / gap-register U-5)\n // =========================================================================\n\n /**\n * 读 — compliance 操作投影分页列表(compliance gateway S2)。\n *\n * 走 GET 读路径。返回 yudao `PageResult<T>`(`{ total, list }`)。所有过滤项\n * 可选;`createTimeStart` / `createTimeEnd` 由调用方按 `yyyy-MM-dd HH:mm:ss`\n * 提供,SDK 原样透传,不做格式校验或时区转换。\n *\n * 操作投影描述【一次操作】本身的执行进度,与履约对象的领域状态正交。\n */\n listOperations(\n req: ListOperationsRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<OperationPageItem>> {\n return this.read<PageResult<OperationPageItem>>(\n 'GET',\n `/compliance/operations/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — compliance 操作投影详情(compliance gateway S2)。\n *\n * `id` 为数值行主键(非 `operationId` 幂等键)。走 GET 读路径(允许 401 单次\n * 刷新重放)。\n */\n getOperation(id: number, signal?: AbortSignal): Promise<OperationDetail> {\n return this.read<OperationDetail>(\n 'GET',\n `/compliance/operations/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Contract Template (compliance gateway S5 — gap-register U-2)\n // =========================================================================\n\n /**\n * 创建合同模板(写)。\n *\n * 走 compliance 写路径——发送前 `ensureToken` 一次、不自动重试、`401` 不刷新\n * 重放;支持 `Idempotency-Key` header(强烈建议调用方持久化幂等键,重试 / 恢复\n * 时复用,避免重复创建模板)。模板创建后初始状态为 `DRAFT`。\n */\n createContractTemplate(\n req: CreateContractTemplateRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n '/compliance/contract-templates',\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 更新合同模板(写,仅 DRAFT 状态)。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。所有字段\n * 可选,缺省字段视为不修改。服务端在 PUBLISHED / ARCHIVED 状态下会拒绝更新。\n */\n updateContractTemplate(\n id: number,\n req: UpdateContractTemplateRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}`,\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 删除合同模板(写,仅 DRAFT 状态)。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。服务端\n * 在 PUBLISHED / ARCHIVED 状态下会拒绝删除——已发布的模板应改走 `archive`。\n */\n deleteContractTemplate(\n id: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<void> {\n return this.write<void>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/delete`,\n null,\n writeCtx(opts),\n );\n }\n\n /** 读 — 合同模板详情。 */\n getContractTemplate(\n id: number,\n signal?: AbortSignal,\n ): Promise<ContractTemplateResp> {\n return this.read<ContractTemplateResp>(\n 'GET',\n `/compliance/contract-templates/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n }\n\n /**\n * 读 — 合同模板分页列表(compliance gateway S5)。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 yudao `PageResult<T>`\n * (`{ total, list }`)。所有过滤项可选;`createTimeStart` / `createTimeEnd`\n * 由调用方按 `yyyy-MM-dd HH:mm:ss` 提供,SDK 原样透传。列表项视图\n * {@link ContractTemplatePageItem} 不含 `fields`——字段叠加只在详情 / 版本\n * 快照里返回。\n */\n listContractTemplates(\n req: ListContractTemplatesRequest = {},\n signal?: AbortSignal,\n ): Promise<PageResult<ContractTemplatePageItem>> {\n return this.read<PageResult<ContractTemplatePageItem>>(\n 'GET',\n `/compliance/contract-templates/page${pageQuery(req, ['status', 'createTimeStart', 'createTimeEnd'])}`,\n null,\n signal,\n );\n }\n\n /**\n * 上传合同模板 PDF(写)。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。请求体\n * 为 `{ pdfBase64 }`;SDK 不在客户端做 PDF 解析 / 几何校验,原样透传给后端。\n * 返回上传后的最新模板视图(含 `pdfHash` / `pdfPageCount`)。\n */\n uploadContractTemplatePdf(\n id: number,\n req: UploadContractTemplatePdfRequest,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/pdf`,\n req,\n writeCtx(opts),\n );\n }\n\n /**\n * 发布合同模板(写)。DRAFT → PUBLISHED,落版本快照。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。\n * publish 后 `currentVersion` 递增,`fields` 与 `pdfHash` 同步固化进版本表。\n */\n publishContractTemplate(\n id: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/publish`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 归档合同模板(写)。PUBLISHED → ARCHIVED。\n *\n * 走 compliance 写路径——`Idempotency-Key`、不重试、`401` 不刷新重放。\n * 已归档模板只读,不再允许 publish / 编辑 / 删除。\n */\n archiveContractTemplate(\n id: number,\n opts: ComplianceWriteOptions = {},\n ): Promise<ContractTemplateResp> {\n return this.write<ContractTemplateResp>(\n 'POST',\n `/compliance/contract-templates/${encodeURIComponent(id)}/archive`,\n null,\n writeCtx(opts),\n );\n }\n\n /**\n * 读 — 合同模板版本快照列表。\n *\n * 走 GET 读路径(允许 401 单次刷新重放)。返回 {@link ContractTemplateVersion}\n * 普通数组(非 `PageResult`)——每次 publish 落一个不可变快照,记录当时的\n * `name` / `pdfHash` / `fields` / `statusAtSnapshot`,是离线复核 / 版本对账\n * 的依据。\n */\n listContractTemplateVersions(\n id: number,\n signal?: AbortSignal,\n ): Promise<ContractTemplateVersion[]> {\n return this.read<ContractTemplateVersion[]>(\n 'GET',\n `/compliance/contract-templates/${encodeURIComponent(id)}/versions`,\n null,\n signal,\n );\n }\n\n // =========================================================================\n // Error classification (re-export for convenience)\n // =========================================================================\n\n classifyError(err: unknown): ComplianceErrorInfo | null {\n if (!isBusinessErrorLike(err)) return null;\n if (!isComplianceBusinessError(err)) return null;\n return classifyComplianceError(err);\n }\n\n // =========================================================================\n // Internal helpers\n // =========================================================================\n\n /**\n * 读路径:GET / 公开 verify。允许 401 单次刷新后重放(GET 幂等安全)。\n * 与 client.doJSONFullInternal 行为一致;不复用其代码因为 base URL 不同。\n */\n private async read<T>(\n method: 'GET' | 'HEAD' | 'OPTIONS',\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n extraHeaders: Record<string, string> = {},\n ): Promise<T> {\n return this.executeJson<T>(method, path, body, signal, {\n retryOn401: true,\n extraHeaders,\n });\n }\n\n /**\n * 公开读路径:public verify。\n *\n * 与 {@link read} 的区别 — public 端点不应要求认证:\n * - 无 token 时匿名请求:ensureToken 抛 `not authorized` 会被吞掉,继续匿名发送。\n * - 有 token 时附带 `Authorization`,保留后端审计上下文。\n * - 不做 401 refresh replay:401 直接抛 HTTPError,不触发 `forceRefresh`。\n *\n * URL 仍走 `client.complianceURL(path)`,不复用 `/api/v4`;底层复用\n * `client.doRequest`,不新增 fetch/axios 直连。\n */\n private async publicRead<T>(\n method: 'GET' | 'HEAD' | 'OPTIONS',\n path: string,\n signal: AbortSignal | undefined,\n ): Promise<T> {\n let token = '';\n try {\n token = await this.client.ensureToken(signal);\n } catch {\n // public 端点允许未授权 — 吞掉 `not authorized`,继续匿名请求。\n }\n\n const url = this.client.complianceURL(path);\n const headers: Record<string, string> = { Accept: 'application/json' };\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const resp = await this.client.doRequest({ method, url, headers }, signal);\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = resp.body\n ? await readLimited(resp.body, maxErrorBodySize)\n : new Uint8Array();\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n if (!text) return undefined as unknown as T;\n const parsed = JSON.parse(text) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(parsed);\n if (bizErr) throw bizErr;\n return parsed.data;\n }\n\n /**\n * 写路径:POST。\n * - 发送前 ensureToken 一次确保 token fresh。\n * - 不自动 401 重放:401 → 抛 HTTPError;调用方必须自己刷新 token 后用同一\n * idempotency-key 重新发起,避免 provider 侧重复请求。\n * - 不走 doRequestWithRetry:写操作不允许 5xx/timeout 自动重试。\n */\n private async write<T>(\n method: 'POST' | 'PUT' | 'DELETE',\n path: string,\n body: unknown | null,\n ctx: WriteContext & { extraHeaders?: Record<string, string> },\n ): Promise<T> {\n const headers: Record<string, string> = { ...(ctx.extraHeaders ?? {}) };\n if (ctx.idempotencyKey) headers['Idempotency-Key'] = ctx.idempotencyKey;\n return this.executeJson<T>(method, path, body, ctx.signal, {\n retryOn401: false,\n extraHeaders: headers,\n });\n }\n\n private async executeJson<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: { retryOn401: boolean; extraHeaders: Record<string, string> },\n retried = false,\n ): Promise<T> {\n // 非流式 JSON 请求套默认超时 — 组合 signal (超时 + 用户 signal, 任一触发都 abort),\n // 避免上游 hang 导致 Promise 永不 settle。compliance 无流式/下载路径, 全部 JSON。\n const ctl = this.client.withRequestTimeout(DEFAULT_API_TIMEOUT_MS, signal);\n try {\n return await this.executeJsonInner<T>(method, path, body, ctl.signal, opts, retried);\n } finally {\n ctl.dispose();\n }\n }\n\n private async executeJsonInner<T>(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n opts: { retryOn401: boolean; extraHeaders: Record<string, string> },\n retried: boolean,\n ): Promise<T> {\n const token = await this.client.ensureToken(signal);\n const url = this.client.complianceURL(path);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n Accept: 'application/json',\n ...opts.extraHeaders,\n };\n let bodyStr: string | undefined;\n if (body != null) {\n bodyStr = typeof body === 'string' ? body : JSON.stringify(body);\n headers['Content-Type'] = 'application/json';\n }\n\n const resp = await this.client.doRequest({ method, url, headers, body: bodyStr }, signal);\n\n if (resp.status === 401 && opts.retryOn401 && !retried) {\n const bodyBytes = resp.body ? await readLimited(resp.body, maxErrorBodySize) : new Uint8Array();\n const authError = parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n if (!isUserAccessTokenRejected(authError)) throw authError;\n await this.client.forceRefresh(signal, token);\n // 复用同一组合 signal (含剩余超时预算), 不再重套超时。\n return this.executeJsonInner<T>(method, path, body, signal, opts, true);\n }\n\n if (resp.status < 200 || resp.status >= 300) {\n const bodyBytes = resp.body\n ? await readLimited(resp.body, maxErrorBodySize)\n : new Uint8Array();\n throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);\n }\n\n const text = await resp.text();\n if (!text) return undefined as unknown as T;\n const parsed = JSON.parse(text) as APIResponse<T>;\n const bizErr = apiResponseBusinessError(parsed);\n if (bizErr) throw bizErr;\n return parsed.data;\n }\n\n private async poll<T>(\n fetcher: () => Promise<T>,\n classify: (value: T) => PollDecision,\n opts: CompliancePollOptions,\n ): Promise<T> {\n const cfg = {\n timeoutMs: opts.timeoutMs ?? DEFAULT_POLL.timeoutMs,\n initialIntervalMs: opts.initialIntervalMs ?? DEFAULT_POLL.initialIntervalMs,\n maxIntervalMs: opts.maxIntervalMs ?? DEFAULT_POLL.maxIntervalMs,\n multiplier: opts.multiplier ?? DEFAULT_POLL.multiplier,\n };\n const deadline = Date.now() + cfg.timeoutMs;\n let interval = cfg.initialIntervalMs;\n let lastValue: T | undefined;\n\n while (Date.now() < deadline) {\n if (opts.signal?.aborted) {\n // 中途 abort: 带上已观测到的最后状态 (若有), 便于排障定位停在哪一步。\n throw new CompliancePollError(\n 'compliance poll aborted',\n 'unknown',\n deriveLastInfo(lastValue, false),\n );\n }\n lastValue = await fetcher();\n const decision = classify(lastValue);\n if (decision === 'done') return lastValue;\n if (decision === 'failed') {\n // 终态失败: 把最后一次轮询到的状态视图作为 lastInfo 带出 (terminal=true)。\n throw new CompliancePollError(\n 'compliance poll observed terminal failure',\n 'terminal_failure',\n deriveLastInfo(lastValue, true),\n );\n }\n // decision === 'continue' → wait then retry\n const sleepMs = Math.min(interval, deadline - Date.now());\n if (sleepMs <= 0) break;\n await sleep(sleepMs, opts.signal);\n interval = Math.min(Math.floor(interval * cfg.multiplier), cfg.maxIntervalMs);\n }\n // 超时: 带上最后一次轮询到的 (非终态) 状态, 让调用方知道卡在哪个 status。\n throw new CompliancePollError(\n 'compliance poll timed out',\n 'timeout',\n deriveLastInfo(lastValue, false),\n );\n }\n}\n\n/**\n * 从最后一次轮询到的状态视图派生 {@link ComplianceErrorInfo}, 供 CompliancePollError 携带最后状态。\n *\n * 轮询返回的是状态视图 (TimestampToken / ProviderRequestStatusView 等) 而非 ComplianceErrorInfo,\n * 故这里做 best-effort 字段探测: 优先取常见状态字段 (status / verificationStatus) 作为可读 message,\n * 并在状态视图内联携带服务端 errorCode / errorMessage 时映射进 code / message。\n * 拿不到任何状态 (lastValue 为 undefined, 即首次 fetch 前就 abort) 时返回 undefined。\n *\n * 不伪造 numeric error code (默认 0) — 这是\"最后状态\"诊断载体, 非真实错误码分类。\n */\nfunction deriveLastInfo(value: unknown, terminal: boolean): ComplianceErrorInfo | undefined {\n if (value == null || typeof value !== 'object') return undefined;\n const v = value as Record<string, unknown>;\n\n const statusStr =\n (typeof v['status'] === 'string' && v['status']) ||\n (typeof v['verificationStatus'] === 'string' && v['verificationStatus']) ||\n '';\n\n const rawCode = v['errorCode'] ?? v['code'];\n const code = typeof rawCode === 'number' ? rawCode : 0;\n\n const rawMsg = v['errorMessage'] ?? v['message'];\n const message =\n (typeof rawMsg === 'string' && rawMsg) ||\n (statusStr ? `last polled status: ${statusStr}` : '') ||\n 'compliance poll: last observed status (no detail)';\n\n return {\n code,\n message,\n key: 'UNKNOWN_COMPLIANCE_ERROR',\n retryable: false,\n terminal,\n stepUpRequired: false,\n };\n}\n\ntype PollDecision = 'continue' | 'done' | 'failed';\n\nfunction classifyTimestamp(\n status: ComplianceTimestampVerificationStatus | string,\n): PollDecision {\n switch (status) {\n case 'VERIFIED':\n return 'done';\n case 'FAILED':\n case 'LOCAL_VERIFY_FAILED':\n return 'failed';\n case 'PENDING':\n case 'UNKNOWN':\n case 'RETRYING':\n default:\n return 'continue';\n }\n}\n\nfunction classifyProviderStatus(\n status: ComplianceProviderRequestStatus | string,\n): PollDecision {\n switch (status) {\n case 'SUCCESS':\n return 'done';\n case 'FAILED':\n return 'failed';\n case 'PENDING':\n case 'UNKNOWN':\n case 'RETRYING':\n default:\n return 'continue';\n }\n}\n\n/**\n * 把分页请求 + 命名空间各自的过滤字段拼成 query string(含前导 `?`,空则返回 `''`)。\n *\n * - 分页 / 排序字段(`pageNo` / `pageSize` / `sortBy` / `sortDirection`)来自共享\n * `PageRequest`,由本函数统一处理。\n * - `filterKeys` 是调用方命名空间各自声明的过滤字段名白名单 —— 仅这些键会被读取,\n * 值经 `String()` 归一后原样透传(`createTimeStart` / `createTimeEnd` 等 datetime\n * 字符串不在 SDK 侧做格式校验或时区转换)。\n * - `null` / `undefined` / 空字符串的字段一律跳过,不发送空参数。\n */\nfunction pageQuery<T extends PageRequest>(req: T, filterKeys: ReadonlyArray<keyof T>): string {\n const q = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value == null) return;\n const s = typeof value === 'string' ? value : String(value);\n if (s === '') return;\n q.set(key, s);\n };\n append('pageNo', req.pageNo);\n append('pageSize', req.pageSize);\n append('sortBy', req.sortBy);\n append('sortDirection', req.sortDirection);\n for (const key of filterKeys) {\n append(String(key), req[key]);\n }\n const qs = q.toString();\n return qs ? '?' + qs : '';\n}\n\nfunction writeCtx(\n opts: ComplianceWriteOptions,\n extraHeaders: Record<string, string> = {},\n): WriteContext & { extraHeaders: Record<string, string> } {\n return {\n idempotencyKey: opts.idempotencyKey,\n signal: opts.signal,\n extraHeaders,\n };\n}\n\nfunction isBusinessErrorLike(err: unknown): err is BusinessError {\n if (err == null || typeof err !== 'object') return false;\n return typeof (err as { code?: unknown }).code === 'number';\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new CompliancePollError('compliance poll aborted', 'unknown'));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n reject(new CompliancePollError('compliance poll aborted', 'unknown'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","// bug-report.ts — 端口自 acosmi-sdk-go/bug_report.go (v0.17.0)\n//\n// V30 CrabCode CLI bug 报告端点封装:\n// - POST /api/v4/crabcode_cli_feedback — Bearer JWT (account scope), 限流 20/h/user\n// - GET /api/v4/crabcode/bug/:bug_id — 公开 (无 auth), 限流 60/min/IP\n//\n// 设计要点:\n// - reportData 用 unknown (调用方任意 JSON 可编码对象), 后端只解析为 map 用于脱敏 + 字段抽取,\n// 不做严格 schema 校验\n// - 服务端兜底脱敏 6 类正则 (anthropic-key/openai-key/github/aws/google/bearer),\n// 调用方无须自行做密钥过滤\n// - 公开 GET 端点走 doPublicJSON, 无 token 也能调\n\nimport { Client } from '../core/client';\n\n/** POST /api/v4/crabcode_cli_feedback 返回体 */\nexport interface BugReportResult {\n /** 服务端生成的 UUID (写入 GitHub Issue body 用) */\n feedback_id: string;\n /** 公开页链接, 形如 https://<base>/chat/crabcode/bug/<uuid> */\n detail_url: string;\n}\n\n/**\n * GET /api/v4/crabcode/bug/:id 返回体 (公开 ViewModel)\n *\n * errors / transcript / extras 用 unknown[] / Record<string, unknown>:\n * 客户端 reportData schema 会随版本变, SDK 不强 typed.\n */\nexport interface BugView {\n id: string;\n description: string;\n platform?: string;\n terminal?: string;\n version?: string;\n messageCount: number;\n hasErrors: boolean;\n status: string;\n clientDatetime?: string;\n createdAt: string;\n errors?: unknown[];\n transcript?: unknown[];\n extras?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// 响应解包 —— 这两个端点返回**裸字段**, 不是平台通用的 {code, data, msg} 信封.\n//\n// 真源: nexus-v4 `internal/handler/crabcode_bug.go`\n// Submit -> c.JSON(200, gin.H{\"feedback_id\": ..., \"detail_url\": ...})\n// AdminGet -> c.JSON(200, view)\n// Go SDK (bug_report.go, 本文件的移植源) 也是直接 decode 进 BugReportResult,\n// 没有 .data 一层 —— 是本 TS 移植和 Rust 移植自己加了信封.\n//\n// 后果不是「读不到值」这么轻: 加了信封的版本恒返回 undefined, 而网关此时**已经\n// 落库并发出通知邮件**. CrabCode GUI 的「问题反馈」因此两个多月里每次都提示失败,\n// 上游每次都收到一封通知 —— 两边各自看起来都像对方的问题.\n//\n// 这里裸形态优先 + 信封形态兜底: 网关将来若统一成信封, 无需再动 SDK.\n// 两种形态都取不到必填字段时**抛错**, 不静默返回 undefined —— 沉默正是上一版\n// 让调用方无从判断的原因.\n// ---------------------------------------------------------------------------\n\ntype EnvelopeTolerant<T> = (T & { data?: T | null }) | undefined;\ntype BugReportEnvelopeTolerant = EnvelopeTolerant<Partial<BugReportResult>>;\ntype BugViewEnvelopeTolerant = EnvelopeTolerant<Partial<BugView>>;\n\nfunction unwrapBugReport<T extends object>(\n raw: EnvelopeTolerant<Partial<T>>,\n op: string,\n isComplete: (value: Partial<T>) => boolean,\n): T {\n if (raw && isComplete(raw)) return raw as T;\n const inner = raw?.data;\n if (inner && isComplete(inner)) return inner as T;\n const keys = raw && typeof raw === 'object' ? Object.keys(raw) : [];\n throw new Error(\n `acosmi: ${op}: gateway accepted the request but the response is missing required fields ` +\n `(observed keys: ${keys.length > 0 ? keys.join(',') : '<none>'})`,\n );\n}\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 上报一份 CrabCode bug 报告.\n *\n * reportData 是任意 JSON 可编码对象, 后端只解析为 map 做脱敏 + 字段抽取.\n *\n * 错误:\n * - HTTPError 401 — token 过期 (内部已做一次 refresh + retry, 仍 401 抛出)\n * - HTTPError 403 type=\"permission_error\" message 含 \"Custom data retention settings\"\n * — 用户所在组织 ZDR, 拒绝收集 (调用方应提示用户走外部渠道)\n * - HTTPError 400 type=\"invalid_request_error\" — content 不是合法 JSON 或 reportData 编码失败\n * - HTTPError 429 — 限流 20/h/user (retryAfter 字段含建议等待秒数)\n * - NetworkError — 传输层错误 (timeout / EOF / unreachable)\n */\n submitBugReport(reportData: unknown, signal?: AbortSignal): Promise<BugReportResult>;\n\n /**\n * 取公开 ViewModel (无需 auth, 任意人凭 ID 可读).\n *\n * 用途: SSR 公开页后端 fetch / 维护者诊断 CLI / 集成测试.\n *\n * 错误:\n * - HTTPError 404 — bug 不存在或被软删\n * - HTTPError 429 — 限流 60/min/IP\n * - NetworkError — 传输层错误\n */\n getBugReport(bugID: string, signal?: AbortSignal): Promise<BugView>;\n }\n}\n\nClient.prototype.submitBugReport = async function (\n this: Client,\n reportData: unknown,\n signal?: AbortSignal,\n) {\n if (reportData == null) {\n throw new Error('acosmi: reportData required');\n }\n let contentStr: string;\n try {\n contentStr = JSON.stringify(reportData);\n } catch (e) {\n throw new Error(`acosmi: marshal reportData: ${e instanceof Error ? e.message : String(e)}`);\n }\n const result = await this.doJSON<BugReportEnvelopeTolerant>(\n 'POST',\n '/crabcode_cli_feedback',\n { content: contentStr },\n signal,\n );\n return unwrapBugReport(result, 'submitBugReport', (r) =>\n typeof r.feedback_id === 'string' && r.feedback_id.length > 0,\n );\n};\n\nClient.prototype.getBugReport = async function (this: Client, bugID: string, signal?: AbortSignal) {\n const trimmed = bugID.trim();\n if (trimmed === '') {\n throw new Error('acosmi: bugID required');\n }\n // 公开端点 — 不强制 token (账号系统未登录 / token 过期场景下也能查)\n const resp = await this.doPublicJSON<BugViewEnvelopeTolerant>(\n 'GET',\n `/crabcode/bug/${trimmed}`,\n null,\n signal,\n );\n return unwrapBugReport(resp, 'getBugReport', (r) => typeof r.id === 'string');\n};\n","// subscription/client.ts — 商品化总规划 P1 订阅域 API 调用 (declaration merging Client).\n//\n// 端点对应 tk-dist `/api/distribution/public/pricing/plans`,\n// 通过 Go 网关 `/api/v4/distribution/public/pricing/plans` 反向代理 (P3 商品中心接入时落地).\n// P1 阶段 SDK 暴露 namespace, 后端代理路由 P3 子窗口补.\n//\n// 当前订阅的规范入口是网关 GET /entitlements/membership (getMembership) —— C 端会员中心订阅概览。\n// 旧的 /distribution/user/subscriptions 路径网关从未暴露 (恒 404), 已移除; listUserSubscriptions 现委托 getMembership。\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n Membership,\n SubscriptionAudience,\n SubscriptionPlan,\n SubscriptionTier,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 列出当前可售订阅计划; audience='PERSONAL'|'ENTERPRISE' 可选过滤 */\n listPlans(\n audience?: SubscriptionAudience,\n signal?: AbortSignal,\n ): Promise<SubscriptionPlan[]>;\n\n /** 查询当前用户会员/订阅概览 (C 端会员中心)。无活跃订阅时 hasActive=false/isFree=true。 */\n getMembership(signal?: AbortSignal): Promise<Membership>;\n\n /** 由活跃权益推导订阅层级 (free/pro)。 */\n getSubscriptionTier(signal?: AbortSignal): Promise<SubscriptionTier>;\n\n /** 订阅支付前绑定硬闸。返回 {ok:true} 表示已绑定手机/邮箱可放行支付。\n * 未绑定时网关返回 HTTP 403 + 业务码 41001 (doJSON 抛 HTTPError), 调用方应据此引导用户先绑定联系方式再支付。 */\n subscriptionPrecheck(signal?: AbortSignal): Promise<{ ok: boolean }>;\n\n /** @deprecated 网关无订阅列表端点; 旧实现打 /distribution/user/subscriptions 恒 404。改用 getMembership()。\n * 本方法现委托 getMembership(): 有活跃订阅返回单元素数组, 否则空数组。 */\n listUserSubscriptions(signal?: AbortSignal): Promise<Membership[]>;\n\n /**\n * 按 planCode 精确取单个可售订阅计划 (V41 起 planCode 在 active 内唯一)。\n * 复用 listPlans 客户端过滤, 未命中返回 null。减少 C 端按字段手筛 (deep-review §12.3)。\n */\n getPlanByCode(planCode: string, signal?: AbortSignal): Promise<SubscriptionPlan | null>;\n }\n}\n\nClient.prototype.listPlans = async function (\n this: Client,\n audience?: SubscriptionAudience,\n signal?: AbortSignal,\n): Promise<SubscriptionPlan[]> {\n const query = audience ? `?audience=${encodeURIComponent(audience)}` : '';\n const resp = await this.doJSON<APIResponse<SubscriptionPlan[]>>(\n 'GET',\n `/distribution/public/pricing/plans${query}`,\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\nClient.prototype.getMembership = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<Membership> {\n const resp = await this.doJSON<APIResponse<Membership>>(\n 'GET',\n '/entitlements/membership',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.getSubscriptionTier = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<SubscriptionTier> {\n const resp = await this.doJSON<APIResponse<SubscriptionTier>>(\n 'GET',\n '/entitlements/subscription',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.subscriptionPrecheck = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<{ ok: boolean }> {\n const resp = await this.doJSON<APIResponse<{ ok: boolean }>>(\n 'GET',\n '/consumer/subscriptions/precheck',\n null,\n signal,\n );\n return resp.data;\n};\n\nClient.prototype.listUserSubscriptions = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<Membership[]> {\n const m = await this.getMembership(signal);\n return m.hasActive ? [m] : [];\n};\n\nClient.prototype.getPlanByCode = async function (\n this: Client,\n planCode: string,\n signal?: AbortSignal,\n): Promise<SubscriptionPlan | null> {\n if (!planCode) return null;\n const plans = await this.listPlans(undefined, signal);\n return plans.find((p) => p.planCode === planCode) ?? null;\n};\n","// pricing/client.ts — 公开业务参数 API (商品化总规划 P1 §13.2).\n//\n// 端点: tk-dist `/api/distribution/public/pricing/config` + `/models` (经 Go 反代).\n// P1 SDK 仅暴露 namespace; P3 商品中心接入时网关路由补.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n PricingConfig,\n PublicModelSummary,\n ComplianceSku,\n ComplianceQuoteResponse,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 查询公开业务参数. 不传 key → 默认返三件 (tk_to_fen_ratio/usd_cny_rate/freezone_reset_timezone);\n * 传 key (白名单内) → 仅返该 key. caller 自解析数值/布尔.\n */\n getPricingConfig(key?: string, signal?: AbortSignal): Promise<PricingConfig>;\n\n /** 公开模型列表 (P3 商品中心会重做; P1 阶段后端 stub 返空数组) */\n listPublicModels(signal?: AbortSignal): Promise<PublicModelSummary[]>;\n\n // =========================================================================\n // 商品化总规划 P4 §-1.2.B — csign 电子认证 SKU (公开匿名可读)\n // =========================================================================\n\n /**\n * 列出 csign 公开 SKU (匿名可调用).\n * @param region 区域 CN / OS / GLOBAL (空 fallback CN, 同时返回 GLOBAL)\n */\n listComplianceSkus(region?: string, signal?: AbortSignal): Promise<ComplianceSku[]>;\n\n /**\n * 匿名估价 (无用户态, 不查覆盖余额, 仅返回 overage 价 × 数量).\n * 真实用户报价含套餐覆盖需走登录后服务端 quote 端点。\n */\n quoteCompliance(\n skuCode: string,\n quantity?: number,\n region?: string,\n signal?: AbortSignal,\n ): Promise<ComplianceQuoteResponse>;\n }\n}\n\nClient.prototype.getPricingConfig = async function (\n this: Client,\n key?: string,\n signal?: AbortSignal,\n): Promise<PricingConfig> {\n const query = key ? `?key=${encodeURIComponent(key)}` : '';\n const resp = await this.doJSON<APIResponse<PricingConfig>>(\n 'GET',\n `/distribution/public/pricing/config${query}`,\n null,\n signal,\n );\n return resp.data ?? {};\n};\n\nClient.prototype.listPublicModels = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<PublicModelSummary[]> {\n const resp = await this.doJSON<APIResponse<PublicModelSummary[]>>(\n 'GET',\n '/distribution/public/pricing/models',\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\n// =============================================================================\n// 商品化总规划 P4 §-1.2.B — csign 电子认证 SKU\n// =============================================================================\n\nClient.prototype.listComplianceSkus = async function (\n this: Client,\n region?: string,\n signal?: AbortSignal,\n): Promise<ComplianceSku[]> {\n const query = region ? `?region=${encodeURIComponent(region)}` : '';\n const resp = await this.doJSON<APIResponse<ComplianceSku[]>>(\n 'GET',\n `/distribution/public/compliance/skus${query}`,\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\nClient.prototype.quoteCompliance = async function (\n this: Client,\n skuCode: string,\n quantity?: number,\n region?: string,\n signal?: AbortSignal,\n): Promise<ComplianceQuoteResponse> {\n if (!skuCode) {\n throw new Error('quoteCompliance: skuCode is required');\n }\n const params: string[] = [`skuCode=${encodeURIComponent(skuCode)}`];\n if (quantity != null) params.push(`quantity=${quantity}`);\n if (region) params.push(`region=${encodeURIComponent(region)}`);\n const resp = await this.doJSON<APIResponse<ComplianceQuoteResponse>>(\n 'GET',\n `/distribution/public/compliance/quote?${params.join('&')}`,\n null,\n signal,\n );\n return resp.data ?? { skuCode, available: false };\n};\n","// products/types.ts — 商品化总规划 P3 商品中心类型 (与 tk-dist DistProductMappingDO + AppPublicProductController 对齐).\n//\n// 端口自 tk-dist `controller/app/product/AppPublicProductController.toPublicResponse`.\n// 公开端点字段白名单严格 — feature_gate_json / retired_at / sales_channel_json / price_snapshot_policy 不暴露.\n\n/** 商品族 (与 V47 dist_product_mapping.product_family 对齐) */\nexport type ProductFamily =\n | 'MODEL_MEMBERSHIP'\n | 'TOKEN_PACK'\n | 'COMPLIANCE'\n | 'LEGAL'\n | 'DESIGN_AGENT'\n | 'ENTERPRISE';\n\n/** 受众 */\nexport type Audience = 'PERSONAL' | 'ENTERPRISE' | 'DEVELOPER';\n\n/** 计费模式 */\nexport type BillingMode = 'ONE_TIME' | 'SUBSCRIPTION' | 'METERED' | 'HYBRID';\n\n/** 地区范围 */\nexport type RegionScope = 'CN' | 'OS' | 'GLOBAL';\n\n/** 商品族枚举常量 (供 UI dropdown / 校验使用, 与后端 enum 严格对齐) */\nexport const ProductFamilyEnum = {\n MODEL_MEMBERSHIP: 'MODEL_MEMBERSHIP',\n TOKEN_PACK: 'TOKEN_PACK',\n COMPLIANCE: 'COMPLIANCE',\n LEGAL: 'LEGAL',\n DESIGN_AGENT: 'DESIGN_AGENT',\n ENTERPRISE: 'ENTERPRISE',\n} as const satisfies Record<ProductFamily, ProductFamily>;\n\nexport const AudienceEnum = {\n PERSONAL: 'PERSONAL',\n ENTERPRISE: 'ENTERPRISE',\n DEVELOPER: 'DEVELOPER',\n} as const satisfies Record<Audience, Audience>;\n\nexport const BillingModeEnum = {\n ONE_TIME: 'ONE_TIME',\n SUBSCRIPTION: 'SUBSCRIPTION',\n METERED: 'METERED',\n HYBRID: 'HYBRID',\n} as const satisfies Record<BillingMode, BillingMode>;\n\nexport const RegionScopeEnum = {\n CN: 'CN',\n OS: 'OS',\n GLOBAL: 'GLOBAL',\n} as const satisfies Record<RegionScope, RegionScope>;\n\n/**\n * 公开商品响应 (字段白名单严格).\n * <p>\n * 后端 toPublicResponse 仅输出以下字段; 不会出现 featureGateJson / retiredAt / salesChannelJson / priceSnapshotPolicy.\n * displayMetadataJson 是后端原文字符串 (caller 自 JSON.parse, 缺省可能为 null).\n */\nexport interface Product {\n id: number;\n /** 公开 slug = biz_product_id (V1 建表 UNIQUE) */\n publicSlug: string;\n displayName: string;\n productFamily: ProductFamily | null;\n audience: Audience | null;\n billingMode: BillingMode | null;\n regionScope: RegionScope | null;\n basePriceFen: number | null;\n tokenQuota: number | null;\n /** 后端原文 JSON 字符串 (含 title/subtitle/badge/highlights/icon 等), 由 caller 自解析 */\n displayMetadataJson: string | null;\n}\n","// products/client.ts — 公开商品 API (商品化总规划 P3 §3.2).\n//\n// 端点: tk-dist `/api/distribution/public/products/{by-family,by-slug}` (经 Go 反代).\n// 字段白名单与 controller/app/product/AppPublicProductController#toPublicResponse 同源.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type { Product, ProductFamily, Audience, RegionScope } from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /**\n * 按商品族查询在售商品. 全参可空 (后端无过滤即返全部在售).\n * @param family 商品族 (MODEL_MEMBERSHIP / TOKEN_PACK / ...)\n * @param audience 受众 (PERSONAL / ENTERPRISE / DEVELOPER)\n * @param region 区域 (CN / OS / GLOBAL); 命中时同时返回 GLOBAL 商品\n */\n listProductsByFamily(\n family?: ProductFamily,\n audience?: Audience,\n region?: RegionScope,\n signal?: AbortSignal,\n ): Promise<Product[]>;\n\n /**\n * 按 slug 查询单个在售商品. slug = biz_product_id (UNIQUE).\n * 找不到或已下架 → 抛 HTTP 404.\n */\n getProductBySlug(\n slug: string,\n region?: RegionScope,\n signal?: AbortSignal,\n ): Promise<Product>;\n }\n}\n\nClient.prototype.listProductsByFamily = async function (\n this: Client,\n family?: ProductFamily,\n audience?: Audience,\n region?: RegionScope,\n signal?: AbortSignal,\n): Promise<Product[]> {\n const params: string[] = [];\n if (family) params.push(`family=${encodeURIComponent(family)}`);\n if (audience) params.push(`audience=${encodeURIComponent(audience)}`);\n if (region) params.push(`region=${encodeURIComponent(region)}`);\n const query = params.length > 0 ? `?${params.join('&')}` : '';\n const resp = await this.doJSON<APIResponse<Product[]>>(\n 'GET',\n `/distribution/public/products/by-family${query}`,\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\n};\n\nClient.prototype.getProductBySlug = async function (\n this: Client,\n slug: string,\n region?: RegionScope,\n signal?: AbortSignal,\n): Promise<Product> {\n if (!slug) {\n throw new Error('getProductBySlug: slug is required');\n }\n const query = region ? `?region=${encodeURIComponent(region)}` : '';\n const resp = await this.doJSON<APIResponse<Product>>(\n 'GET',\n `/distribution/public/products/by-slug/${encodeURIComponent(slug)}${query}`,\n null,\n signal,\n );\n if (!resp.data) {\n throw new Error(`getProductBySlug: product not found (slug=${slug})`);\n }\n return resp.data;\n};\n","// casehall/client.ts — 法律案件咨询 namespace API (商品化总规划 P5 方案 B 2026-05-25).\n//\n// 端点路径形如 `/casehall/app/...` (C 端公开) 或 `/casehall/me/...` (登录态).\n// P5 阶段 SDK 暴露 namespace; 真正的网关反代与登录态校验由后续窗口在\n// nexus-v4 网关层路由白名单中开放。\n//\n// admin 板块 9 模块 (`/casehall/admin/...`) 不在 SDK 边界, 仅 admin UI 直连。\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n LawyerSummary,\n SubmitCaseLeadRequest,\n CaseLead,\n CaseMatter,\n LegalConsultation,\n BookConsultationRequest,\n LegalServiceOrder,\n LegalServiceSku,\n LawyerCredentialMyView,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n // =========================================================================\n // 律师库 (C 端公开)\n // =========================================================================\n\n /**\n * 列出已认证律师 (公开端点, 仅返回 VERIFIED + ACTIVE 状态; PII L3 字段已脱敏).\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listLawyers(\n params?: { practiceArea?: string; location?: string; pageNo?: number; pageSize?: number },\n signal?: AbortSignal,\n ): Promise<LawyerSummary[]>;\n\n /**\n * 获取律师公开详情 (脱敏)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n getLawyer(id: number, signal?: AbortSignal): Promise<LawyerSummary>;\n\n // =========================================================================\n // 案件线索 (C 端登录态)\n // =========================================================================\n\n /**\n * 提交案件线索 (登录态)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n submitCaseLead(req: SubmitCaseLeadRequest, signal?: AbortSignal): Promise<{ id: number }>;\n\n /**\n * 我的案件线索列表。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listMyCaseLeads(signal?: AbortSignal): Promise<CaseLead[]>;\n\n /**\n * 我的案件列表 (委托后)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n getMyCases(signal?: AbortSignal): Promise<CaseMatter[]>;\n\n // =========================================================================\n // 法律咨询\n // =========================================================================\n\n /**\n * 预约法律咨询 (skuCode 必填; lawyerId 可选, 留空走 AI 推荐池)。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n bookConsultation(req: BookConsultationRequest, signal?: AbortSignal): Promise<{ consultationId: number }>;\n\n /**\n * 我的咨询单列表。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listMyConsultations(signal?: AbortSignal): Promise<LegalConsultation[]>;\n\n // =========================================================================\n // 法律服务订单 & SKU\n // =========================================================================\n\n /**\n * 我的法律服务订单列表。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listMyLegalOrders(signal?: AbortSignal): Promise<LegalServiceOrder[]>;\n\n /**\n * 列出公开的 LEGAL_SERVICE SKU (匿名可调用, 复用 dist_compliance_sku benefit_type='LEGAL_SERVICE')。\n * @experimental 对应后端 consumer 端点尚未实现 (casehall 模块当前仅 getMyLawyerCredentialStatus 在产); 调用将返回 404。\n */\n listLegalSKUs(region?: string, signal?: AbortSignal): Promise<LegalServiceSku[]>;\n\n // =========================================================================\n // 律师自查执业证审核状态 (v2.0.0+, P5 Phase 3 复核)\n // =========================================================================\n\n /**\n * 律师自查执业证审核状态 — 返回登录用户作为律师身份提交的所有 credential 列表.\n * 普通用户 (无 lawyer_profile) 调返 [] 不抛.\n *\n * v2.0.0+ 新增. 端点 `GET /api/casehall/lawyer-credentials/my`.\n * @returns 按 createTime 倒序的 credential 列表\n */\n getMyLawyerCredentialStatus(signal?: AbortSignal): Promise<LawyerCredentialMyView[]>;\n }\n}\n\n// --- Lawyer ---\n\nClient.prototype.listLawyers = async function (\n this: Client,\n params?: { practiceArea?: string; location?: string; pageNo?: number; pageSize?: number },\n signal?: AbortSignal,\n): Promise<LawyerSummary[]> {\n const qs = new URLSearchParams();\n if (params?.practiceArea) qs.set('practiceArea', params.practiceArea);\n if (params?.location) qs.set('location', params.location);\n if (params?.pageNo != null) qs.set('pageNo', String(params.pageNo));\n if (params?.pageSize != null) qs.set('pageSize', String(params.pageSize));\n const q = qs.toString() ? `?${qs.toString()}` : '';\n const resp = await this.doJSON<APIResponse<LawyerSummary[]>>(\n 'GET',\n `/casehall/app/lawyers${q}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.getLawyer = async function (\n this: Client,\n id: number,\n signal?: AbortSignal,\n): Promise<LawyerSummary> {\n const resp = await this.doJSON<APIResponse<LawyerSummary>>(\n 'GET',\n `/casehall/app/lawyers/${id}`,\n null,\n signal,\n );\n if (!resp.data) throw new Error(`lawyer ${id} not found`);\n return resp.data;\n};\n\n// --- Case Lead ---\n\nClient.prototype.submitCaseLead = async function (\n this: Client,\n req: SubmitCaseLeadRequest,\n signal?: AbortSignal,\n): Promise<{ id: number }> {\n const resp = await this.doJSON<APIResponse<{ id: number }>>(\n 'POST',\n `/casehall/me/case-leads`,\n req,\n signal,\n );\n return resp.data ?? { id: 0 };\n};\n\nClient.prototype.listMyCaseLeads = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<CaseLead[]> {\n const resp = await this.doJSON<APIResponse<CaseLead[]>>(\n 'GET',\n `/casehall/me/case-leads`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.getMyCases = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<CaseMatter[]> {\n const resp = await this.doJSON<APIResponse<CaseMatter[]>>(\n 'GET',\n `/casehall/me/cases`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Consultation ---\n\nClient.prototype.bookConsultation = async function (\n this: Client,\n req: BookConsultationRequest,\n signal?: AbortSignal,\n): Promise<{ consultationId: number }> {\n const resp = await this.doJSON<APIResponse<{ consultationId: number }>>(\n 'POST',\n `/casehall/me/consultations`,\n req,\n signal,\n );\n return resp.data ?? { consultationId: 0 };\n};\n\nClient.prototype.listMyConsultations = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<LegalConsultation[]> {\n const resp = await this.doJSON<APIResponse<LegalConsultation[]>>(\n 'GET',\n `/casehall/me/consultations`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Order & SKU ---\n\nClient.prototype.listMyLegalOrders = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<LegalServiceOrder[]> {\n const resp = await this.doJSON<APIResponse<LegalServiceOrder[]>>(\n 'GET',\n `/casehall/me/orders`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.listLegalSKUs = async function (\n this: Client,\n region?: string,\n signal?: AbortSignal,\n): Promise<LegalServiceSku[]> {\n const q = region ? `?region=${encodeURIComponent(region)}&benefitType=LEGAL_SERVICE` : `?benefitType=LEGAL_SERVICE`;\n const resp = await this.doJSON<APIResponse<LegalServiceSku[]>>(\n 'GET',\n `/casehall/app/legal-skus${q}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Lawyer Credential Self-Check (v2.0.0+, P5 Phase 3 复核) ---\n\nClient.prototype.getMyLawyerCredentialStatus = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<LawyerCredentialMyView[]> {\n const resp = await this.doJSON<APIResponse<LawyerCredentialMyView[]>>(\n 'GET',\n `/api/casehall/lawyer-credentials/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n","// enterprise/client.ts — 企业席位 (P6a) namespace API (商品化总规划 2026-05-25).\n//\n// 端点路径形如 `/api/admin/enterprises/...` (后台管理) 或 `/me/enterprises/...` (登录态).\n// P6a 阶段 SDK 暴露 namespace; 真正的网关反代由后续 wave 在 nexus-v4 网关层路由白名单中开放.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n EnterpriseSummary,\n EnterpriseMember,\n OrgSubscription,\n OrgSeat,\n InviteMemberRequest,\n AssignSeatRequest,\n OrgConsumeReport,\n EnterpriseKycMyStatusView,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n // =====================================================================\n // 企业组织 (登录态: 我所在的企业)\n // =====================================================================\n\n /** 列出我所在的企业 (用户作为成员加入的企业列表). */\n listMyEnterprises(signal?: AbortSignal): Promise<EnterpriseSummary[]>;\n\n /** 获取企业详情. */\n getEnterprise(id: number, signal?: AbortSignal): Promise<EnterpriseSummary>;\n\n // =====================================================================\n // 成员管理\n // =====================================================================\n\n /** 邀请成员加入 (P6a 简化: 直接 add, OWNER/ADMIN 可调用). */\n inviteMember(req: InviteMemberRequest, signal?: AbortSignal): Promise<EnterpriseMember>;\n\n /** 列出企业成员. */\n listEnterpriseMembers(enterpriseId: number, signal?: AbortSignal): Promise<EnterpriseMember[]>;\n\n // =====================================================================\n // 订阅 + 席位\n // =====================================================================\n\n /** 列出企业订阅. */\n listOrgSubscriptions(enterpriseId: number, signal?: AbortSignal): Promise<OrgSubscription[]>;\n\n /** 列出订阅下的席位 (1 订阅 N 席, seat_no 1..N). */\n listSeats(orgSubscriptionId: number, signal?: AbortSignal): Promise<OrgSeat[]>;\n\n /** 分配席位 (月度变更次数 +1, 超 3 次返 41xxx 业务码 §-1.2.D 钉死). */\n assignSeat(req: AssignSeatRequest, signal?: AbortSignal): Promise<OrgSeat>;\n\n /** 收回席位 (席位状态 → AVAILABLE, 累计用量保留). */\n revokeSeat(seatId: number, note?: string, signal?: AbortSignal): Promise<void>;\n\n // =====================================================================\n // 用量报表\n // =====================================================================\n\n /** 企业消耗汇总 (订阅维度池子合计; 完整账单留 P6b). */\n getOrgConsumeReport(enterpriseId: number, signal?: AbortSignal): Promise<OrgConsumeReport>;\n\n // =====================================================================\n // KYC 自查 (v2.0.0+, P6a Phase 3 复核)\n // =====================================================================\n\n /**\n * 企业 OWNER 自查 KYC 状态 — 返回登录用户作为 OWNER 的企业的最新 KYC 状态.\n * 用户不是任何企业 OWNER 时返 `{enterpriseId:undefined}` 的空 view, 不抛.\n *\n * v2.0.0+ 新增. 端点 `GET /api/distribution/enterprise/kyc/my`.\n * 单 OWNER 单企业假设; 多企业取第一个 ACTIVE OWNER 企业.\n */\n getMyEnterpriseKycStatus(signal?: AbortSignal): Promise<EnterpriseKycMyStatusView>;\n }\n}\n\n// =====================================================================\n// 实现 (HTTP 路径以 tk-dist admin / me 端点对齐)\n// =====================================================================\n\nClient.prototype.listMyEnterprises = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<EnterpriseSummary[]> {\n const resp = await this.doJSON<APIResponse<EnterpriseSummary[]>>(\n 'GET',\n `/me/enterprises`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.getEnterprise = async function (\n this: Client,\n id: number,\n signal?: AbortSignal,\n): Promise<EnterpriseSummary> {\n const resp = await this.doJSON<APIResponse<EnterpriseSummary>>(\n 'GET',\n `/api/admin/enterprises/${id}`,\n null,\n signal,\n );\n if (!resp.data) throw new Error(`enterprise ${id} not found`);\n return resp.data;\n};\n\nClient.prototype.inviteMember = async function (\n this: Client,\n req: InviteMemberRequest,\n signal?: AbortSignal,\n): Promise<EnterpriseMember> {\n const resp = await this.doJSON<APIResponse<EnterpriseMember>>(\n 'POST',\n `/api/admin/enterprise-members`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('invite member failed');\n return resp.data;\n};\n\nClient.prototype.listEnterpriseMembers = async function (\n this: Client,\n enterpriseId: number,\n signal?: AbortSignal,\n): Promise<EnterpriseMember[]> {\n const resp = await this.doJSON<APIResponse<EnterpriseMember[]>>(\n 'GET',\n `/api/admin/enterprise-members/by-enterprise/${enterpriseId}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.listOrgSubscriptions = async function (\n this: Client,\n enterpriseId: number,\n signal?: AbortSignal,\n): Promise<OrgSubscription[]> {\n const resp = await this.doJSON<APIResponse<OrgSubscription[]>>(\n 'GET',\n `/api/admin/org-subscriptions/by-enterprise/${enterpriseId}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.listSeats = async function (\n this: Client,\n orgSubscriptionId: number,\n signal?: AbortSignal,\n): Promise<OrgSeat[]> {\n const resp = await this.doJSON<APIResponse<OrgSeat[]>>(\n 'GET',\n `/api/admin/org-seats/by-subscription/${orgSubscriptionId}`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\nClient.prototype.assignSeat = async function (\n this: Client,\n req: AssignSeatRequest,\n signal?: AbortSignal,\n): Promise<OrgSeat> {\n const resp = await this.doJSON<APIResponse<OrgSeat>>(\n 'POST',\n `/api/admin/org-seats/assign`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('assign seat failed');\n return resp.data;\n};\n\nClient.prototype.revokeSeat = async function (\n this: Client,\n seatId: number,\n note?: string,\n signal?: AbortSignal,\n): Promise<void> {\n const qs = note ? `?note=${encodeURIComponent(note)}` : '';\n await this.doJSON<APIResponse<boolean>>(\n 'POST',\n `/api/admin/org-seats/${seatId}/revoke${qs}`,\n null,\n signal,\n );\n};\n\nClient.prototype.getOrgConsumeReport = async function (\n this: Client,\n enterpriseId: number,\n signal?: AbortSignal,\n): Promise<OrgConsumeReport> {\n const resp = await this.doJSON<APIResponse<OrgConsumeReport>>(\n 'GET',\n `/api/admin/enterprise-settlements/overview/${enterpriseId}`,\n null,\n signal,\n );\n if (!resp.data) {\n return {\n enterpriseId,\n subscriptionCount: 0,\n totalPoolTk: 0,\n totalUsedTk: 0,\n totalPriceFen: 0,\n };\n }\n return resp.data;\n};\n\n// =====================================================================\n// KYC 自查 (v2.0.0+, P6a Phase 3 复核)\n// =====================================================================\n\nClient.prototype.getMyEnterpriseKycStatus = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<EnterpriseKycMyStatusView> {\n const resp = await this.doJSON<APIResponse<EnterpriseKycMyStatusView>>(\n 'GET',\n `/api/distribution/enterprise/kyc/my`,\n null,\n signal,\n );\n return resp.data ?? {};\n};\n","// finance/client.ts — 财务 (P7) namespace API (商品化总规划 2026-05-25).\n//\n// 决策 14 对公转账: 弹窗 + 企微对接销售/财务, 零银行 API.\n// 决策 15 退款规则: 订阅不退 / token 包 7 天未用全额 / 服务交付后不退.\n//\n// 端点路径形如 /api/distribution/finance/*. admin 板块 (审批/财务工作台) 由 admin UI\n// 直连 /api/admin/finance/**, 不在 SDK 边界.\n\nimport type { APIResponse } from '../shared/api-response';\nimport type {\n Invoice,\n RequestInvoiceInput,\n RefundRecord,\n RequestRefundInput,\n CorporateTransfer,\n InitiateCorporateTransferInput,\n InitiateCorporateTransferResult,\n} from './types';\nimport { Client } from '../core/client';\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n // ========================================================================\n // 退款 (决策 15)\n // ========================================================================\n\n /** 申请退款 (决策 15: 按 policyCode 自动判定; NO_REFUND 即时拒)。 */\n requestRefund(req: RequestRefundInput, signal?: AbortSignal): Promise<RefundRecord>;\n\n /** 我的退款记录。 */\n listMyRefunds(signal?: AbortSignal): Promise<RefundRecord[]>;\n\n // ========================================================================\n // 发票\n // ========================================================================\n\n /** 申请开票。 */\n requestInvoice(req: RequestInvoiceInput, signal?: AbortSignal): Promise<Invoice>;\n\n /** 我的发票列表。 */\n listMyInvoices(signal?: AbortSignal): Promise<Invoice[]>;\n\n // ========================================================================\n // 对公转账 (决策 14: 弹窗 + 企微对接)\n // ========================================================================\n\n /**\n * 发起对公转账 — 决策 14:\n * 服务端创建 INITIATED 记录, 返回销售名片二维码 + 销售企微 ID + 财务邮箱,\n * 前端据此渲染弹窗引导用户加销售企微, 零银行 API.\n */\n initiateCorporateTransfer(\n req: InitiateCorporateTransferInput,\n signal?: AbortSignal,\n ): Promise<InitiateCorporateTransferResult>;\n\n /** 上传对公转账凭证 URL。 */\n uploadCorporateTransferProof(\n id: number,\n proofUrl: string,\n signal?: AbortSignal,\n ): Promise<boolean>;\n\n /** 我的对公转账记录。 */\n listMyCorporateTransfers(signal?: AbortSignal): Promise<CorporateTransfer[]>;\n }\n}\n\n// --- Refund ---\n\nClient.prototype.requestRefund = async function (\n this: Client,\n req: RequestRefundInput,\n signal?: AbortSignal,\n): Promise<RefundRecord> {\n const resp = await this.doJSON<APIResponse<RefundRecord>>(\n 'POST',\n `/api/distribution/finance/refund/request`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('refund/request: empty response');\n return resp.data;\n};\n\nClient.prototype.listMyRefunds = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<RefundRecord[]> {\n const resp = await this.doJSON<APIResponse<RefundRecord[]>>(\n 'GET',\n `/api/distribution/finance/refund/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Invoice ---\n\nClient.prototype.requestInvoice = async function (\n this: Client,\n req: RequestInvoiceInput,\n signal?: AbortSignal,\n): Promise<Invoice> {\n const resp = await this.doJSON<APIResponse<Invoice>>(\n 'POST',\n `/api/distribution/finance/invoice/request`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('invoice/request: empty response');\n return resp.data;\n};\n\nClient.prototype.listMyInvoices = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<Invoice[]> {\n const resp = await this.doJSON<APIResponse<Invoice[]>>(\n 'GET',\n `/api/distribution/finance/invoice/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n\n// --- Corporate Transfer (决策 14) ---\n\nClient.prototype.initiateCorporateTransfer = async function (\n this: Client,\n req: InitiateCorporateTransferInput,\n signal?: AbortSignal,\n): Promise<InitiateCorporateTransferResult> {\n const resp = await this.doJSON<APIResponse<InitiateCorporateTransferResult>>(\n 'POST',\n `/api/distribution/finance/corporate-transfer/initiate`,\n req,\n signal,\n );\n if (!resp.data) throw new Error('corporate-transfer/initiate: empty response');\n return resp.data;\n};\n\nClient.prototype.uploadCorporateTransferProof = async function (\n this: Client,\n id: number,\n proofUrl: string,\n signal?: AbortSignal,\n): Promise<boolean> {\n // P2-017: 后端契约是 @RequestParam(\"proofUrl\"), 走 query (非 body).\n // URLSearchParams 自动 URI-encode, 但与 path 拼接需注意: path 不可含 '?'.\n // 改为 encodeURIComponent 直拼, 等价但 0 依赖 URLSearchParams 行为, 更鲁棒.\n const path =\n `/api/distribution/finance/corporate-transfer/${encodeURIComponent(String(id))}/upload-proof`\n + `?proofUrl=${encodeURIComponent(proofUrl)}`;\n const resp = await this.doJSON<APIResponse<boolean>>('POST', path, null, signal);\n return resp.data ?? false;\n};\n\nClient.prototype.listMyCorporateTransfers = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<CorporateTransfer[]> {\n const resp = await this.doJSON<APIResponse<CorporateTransfer[]>>(\n 'GET',\n `/api/distribution/finance/corporate-transfer/my`,\n null,\n signal,\n );\n return resp.data ?? [];\n};\n","// Acosmi 第三方聊天 bridge 控制面 — SDK 类型契约 (Phase 7 骨架).\n//\n// 契约源: docs/audit/sdk-remote-control-contract-2026-05-27.md §6 (Secret zero-knowledge)\n// + §7 (旧抽象不可复用) + 主索引 §5 Phase 7 + ADR-8.\n//\n// 设计纪律:\n// - chatbridge 资源 GET 走 nexus-v4 model-direct 序列化, wire 字段为 camelCase\n// (与 model/chat_bridge.go 的 json tag 逐字一致; 契约 §12 chatbridge 平面)。\n// 注意: 这与 remote-control 平面 (agent-runs 事件/policy 用 snake_case) 不同 ——\n// nexus-v4 的 wire 约定按平面分, 不是全局统一;\n// - 公开 TypeScript API 与 wire 同为 camelCase;\n// - 平台 secret (plaintext / token / signing key) 永不出现在 SDK 公共 namespace;\n// SDK 只见 read-only metadata + CredentialRef + fingerprint + ChannelEvents;\n// - 7 个平台严格枚举, 任何新增需先改契约文档 + 主索引 §5 Phase 7 再扩本文件;\n// - 平台原始 thread / sender / workspace ID 一律 hash 后入 SDK; 永不持原值;\n// - 严禁复用 app_channels / chat_completions / managed-models 承载平台 secret。\n\n// =============================================================================\n// Platform / Region / IntegrationStatus (与 Go side `service/chatbridge/types.go` 对齐)\n// =============================================================================\n\nexport type Platform =\n | 'feishu'\n | 'wecom'\n | 'dingtalk'\n | 'slack'\n | 'teams'\n | 'telegram'\n | 'whatsapp';\n\nexport type Region = 'cn' | 'intl';\n\nexport type IntegrationStatus = 'pending' | 'active' | 'suspended' | 'revoked';\n\n// =============================================================================\n// CredentialRef branded type\n// =============================================================================\n\n/**\n * CredentialRef — chat-bridge 凭证公开引用 (`cred_<22 char base32>`).\n *\n * branded type 防止 plaintext secret 字符串被误传到需要 CredentialRef 的位置。\n * SDK 调用方应仅持有 CredentialRef, 永不持 plaintext。\n */\nexport type CredentialRef = string & { readonly __brand: 'CredentialRef' };\n\n// =============================================================================\n// Channel event 公共类型 (read-only events; secret 永不出现)\n// =============================================================================\n\n/**\n * ChannelAttachment — 入站附件 / 出站文件附件.\n *\n * 安全约束 (ADR-8):\n * - `url` 必须由 bridge runtime 解析过 (Acosmi 内部存储 URL); 严禁是平台原始签名 URL。\n * - `contentType` 是标准 MIME; `kind` 是 bridge 内部分类 (image/file/audio/video/link/...)。\n */\nexport interface ChannelAttachment {\n kind: string;\n url: string;\n size?: number;\n contentType?: string;\n}\n\n/**\n * ChannelCardAction — 出站交互卡片按钮 / 自由输入.\n *\n * `kind`: 'approve' | 'reject' | 'cancel' | 'free_text' | 其他 bridge 自定义。\n * `id` 是 bridge 侧稳定 action id, 用于把用户点击映射回原 requestId 幂等键。\n */\nexport interface ChannelCardAction {\n kind: string;\n id: string;\n label: string;\n}\n\n/**\n * ChannelCard — 出站交互卡片 (permission / tool_status / done / error).\n */\nexport interface ChannelCard {\n kind: string;\n title: string;\n body: string;\n actions?: ChannelCardAction[];\n}\n\n/**\n * ChannelInboundEvent — bridge runtime 视角的入站平台消息.\n *\n * 安全约束:\n * - `threadHash` / `senderHash` 是 SHA256(平台原始 ID), 不允许直接是平台 ID;\n * - `metadata` 仅含非敏感字段 (例: locale, message_kind), 严禁含 plaintext secret;\n * - `messageId` 是平台原生 message id, 仅用于平台侧 ack / dedup, 不进 AgentRun transcript。\n */\nexport interface ChannelInboundEvent {\n platform: Platform;\n threadHash: string;\n senderHash?: string;\n content: string;\n attachments?: ChannelAttachment[];\n messageId?: string;\n receivedAt?: string; // ISO-8601\n metadata?: Record<string, string>;\n}\n\n/**\n * ChannelOutboundEvent — bridge runtime 出站平台消息 / 卡片.\n *\n * Metadata 仅含非敏感投递参数 (例: card_locale), 严禁含 plaintext secret。\n */\nexport interface ChannelOutboundEvent {\n threadHash: string;\n content?: string;\n cards?: ChannelCard[];\n metadata?: Record<string, string>;\n}\n\n/**\n * BridgeThreadRef — bridge runtime 内部 thread 引用 (Acosmi 三元组).\n *\n * 永不携带 platform secret / 原始平台 ID。\n */\nexport interface BridgeThreadRef {\n threadId: string;\n runId?: string;\n remoteSessionId?: string;\n tenantId: string;\n userId: string;\n appId: string;\n}\n\n// =============================================================================\n// Public 只读视图 (admin/管理后台 GET 用; 严禁含 Ciphertext / Plaintext)\n// =============================================================================\n\n/**\n * ChatIntegration — 平台安装记录的 SDK 只读视图.\n *\n * Phase 7B 起由 `client.chatBridge` 按此型号 GET (响应 camelCase, 契约 §12)。\n */\nexport interface ChatIntegration {\n id: string;\n tenantId: string;\n appId: string;\n platform: Platform;\n region: Region;\n workspaceIdHash?: string;\n botIdHash?: string;\n status: IntegrationStatus;\n /**\n * @deprecated 服务端从不返回此字段 (model ConfigJSON json:\"-\", 防 secret 误入\n * 后整体不外发) — 读取恒为 undefined。写入走 createIntegration({ configJson })。\n */\n configJson?: string;\n installedByUserId?: string;\n lastUsedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * ChatCredentialPublic — 凭证的 SDK 只读视图 (绝不含 ciphertext / plaintext).\n *\n * 仅暴露公开字段: `credentialRef` / `fingerprint` / `keyId` / `version` / `status`。\n */\nexport interface ChatCredentialPublic {\n credentialRef: CredentialRef;\n integrationId: string;\n platform: Platform;\n region: Region;\n secretKind: string;\n fingerprint: string;\n keyId: string;\n version: number;\n status: 'active' | 'rotating' | 'revoked' | string;\n lastUsedAt?: string;\n rotatedAt?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n/**\n * ChatThread — 平台 thread 到 Acosmi session 的映射 (SDK 只读视图).\n *\n * 永不携带原始 platform thread / sender ID; 仅含 SHA256 hash。\n */\nexport interface ChatThread {\n id: string;\n tenantId: string;\n integrationId: string;\n platformThreadHash: string;\n platform: Platform;\n userId: string;\n appId: string;\n sessionId?: string;\n lastRunId?: string;\n senderHash?: string;\n lastInboundAt?: string;\n lastOutboundAt?: string;\n}\n\n/**\n * ChatBridgeSession — 一次 bridge runtime 会话 (SDK 只读视图).\n */\nexport interface ChatBridgeSession {\n id: string;\n tenantId: string;\n threadId: string;\n integrationId: string;\n runId?: string;\n remoteSessionId?: string;\n status: 'created' | 'routing' | 'active' | 'paused' | 'closed' | 'errored' | string;\n adapter?: string;\n lastFrameAt?: string;\n closedAt?: string;\n disconnectReason?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// =============================================================================\n// 平台 / 区域 / 状态 常量集合 (运行时 valid 校验用; SDK runtime 检查匿名外部输入)\n// =============================================================================\n\nexport const ALL_PLATFORMS: readonly Platform[] = [\n 'feishu',\n 'wecom',\n 'dingtalk',\n 'slack',\n 'teams',\n 'telegram',\n 'whatsapp',\n] as const;\n\nexport const ALL_REGIONS: readonly Region[] = ['cn', 'intl'] as const;\n\nexport const ALL_INTEGRATION_STATUS: readonly IntegrationStatus[] = [\n 'pending',\n 'active',\n 'suspended',\n 'revoked',\n] as const;\n\n/**\n * isPlatform — runtime type guard for {@link Platform}.\n *\n * 用途: SDK 解析 wire payload 时校验未知字段; 不直接抛异常, 调用方决策。\n */\nexport function isPlatform(v: unknown): v is Platform {\n return typeof v === 'string' && (ALL_PLATFORMS as readonly string[]).includes(v);\n}\n\n/**\n * isRegion — runtime type guard for {@link Region}.\n */\nexport function isRegion(v: unknown): v is Region {\n return typeof v === 'string' && (ALL_REGIONS as readonly string[]).includes(v);\n}\n\n/**\n * isIntegrationStatus — runtime type guard for {@link IntegrationStatus}.\n */\nexport function isIntegrationStatus(v: unknown): v is IntegrationStatus {\n return typeof v === 'string' && (ALL_INTEGRATION_STATUS as readonly string[]).includes(v);\n}\n\n/**\n * isChannelInboundEvent — 极简 type guard, 用于 wire payload 入口校验.\n *\n * 仅校验必填字段 (platform/threadHash/content); 其他字段交给调用方按需校验。\n * 不抛异常: 失败返回 false。\n */\nexport function isChannelInboundEvent(v: unknown): v is ChannelInboundEvent {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) return false;\n const r = v as Record<string, unknown>;\n return (\n isPlatform(r.platform) &&\n typeof r.threadHash === 'string' &&\n r.threadHash.length > 0 &&\n typeof r.content === 'string'\n );\n}\n\n/**\n * 把任意字符串安全 brand 成 {@link CredentialRef}; 不做合法性校验.\n *\n * Phase 7B SDK 客户端 wire 解析时使用 — 服务端返回的 `credential_ref` 字段一律走它。\n * 调用方自行判断格式 (例: 是否 `cred_` 前缀)。\n */\nexport function asCredentialRef(s: string): CredentialRef {\n return s as CredentialRef;\n}\n","// chatbridge/client.ts — 第三方聊天 bridge 控制面客户端 (Phase 7B 落地).\n//\n// 端点: /api/v4/chat-bridge/* (nexus-v4 routes_business.go registerChatBridgeRoutes)。\n// 契约源: docs/audit/sdk-remote-control-contract-2026-05-27.md §6 + §12 + ADR-8。\n//\n// Wire 平面 (契约 §12, 与 remote-control 平面不同):\n// - 请求体字段 = snake_case (handler ShouldBindJSON 结构体 tag: app_id /\n// workspace_id / config_json / secret_kind / new_plaintext ...);\n// - 响应 data = model 直接序列化的 camelCase (model/chat_bridge.go json tag:\n// appId / credentialRef / secretKind ...), 与本域 types.ts 逐字一致。\n//\n// 守卫 (最小授权三档; OAuth token 须显式申请, chat_bridge 不进 allScopes()):\n// - chat_bridge:read → listIntegrations / getIntegration / listCredentials\n// - chat_bridge:write → createIntegration / updateIntegrationStatus / storeCredential\n// - chat_bridge:rotate → rotateCredential / revokeCredential (高风险)\n//\n// 安全红线 (契约 §6 Secret zero-knowledge):\n// - 任何端点不回 plaintext / ciphertext (model Ciphertext/ConfigJSON json:\"-\");\n// - 创建/轮换的明文只在请求体出现一次, SDK 不缓存不打印;\n// - 跨租户引用服务端一律 404 (不暴露存在性)。\n\nimport type { APIResponse } from '../shared/api-response';\nimport { Client } from '../core/client';\nimport {\n asCredentialRef,\n type ChatCredentialPublic,\n type ChatIntegration,\n type IntegrationStatus,\n type Platform,\n type Region,\n} from './types';\n\n/** `chatBridge.createIntegration()` 请求 (wire snake_case 由 SDK 转换)。 */\nexport interface CreateIntegrationRequest {\n /** 绑定的 Acosmi app。 */\n appId: string;\n platform: Platform;\n region: Region;\n /** 平台 workspace/企业 原始 ID; 服务端只存 SHA256 hash。 */\n workspaceId?: string;\n /** 平台 bot 原始 ID; 服务端只存 SHA256 hash。 */\n botId?: string;\n /** 仅非敏感配置 (rate limit / feature toggles); 严禁含 secret。 */\n configJson?: string;\n}\n\n/** `chatBridge.storeCredential()` 请求 — 明文一次性提交。 */\nexport interface StoreCredentialRequest {\n /** 凭证种类 (平台相关, 例: app_secret / signing_secret / bot_token)。 */\n secretKind: string;\n /** 凭证明文; 加密落库后即弃, 响应只回 masked 视图。 */\n plaintext: string;\n region?: Region;\n platform?: Platform;\n}\n\ndeclare module '@acosmi/sdk-ts' {\n interface Client {\n /** 第三方聊天 bridge 控制面 (Phase 7B; 契约 §6/§12/ADR-8)。 */\n readonly chatBridge: ChatBridgeClient;\n }\n}\n\nconst chatBridgeByClient = new WeakMap<Client, ChatBridgeClient>();\n\nObject.defineProperty(Client.prototype, 'chatBridge', {\n configurable: true,\n enumerable: false,\n get(this: Client): ChatBridgeClient {\n let existing = chatBridgeByClient.get(this);\n if (!existing) {\n existing = new ChatBridgeClient(this);\n chatBridgeByClient.set(this, existing);\n }\n return existing;\n },\n});\n\nexport class ChatBridgeClient {\n constructor(private readonly client: Client) {}\n\n // ---------------------------------------------------------------------------\n // Integration 管理面\n // ---------------------------------------------------------------------------\n\n /** 创建平台集成 (chat_bridge:write)。云端控制台与下游 (CrabCode) 调的是同一端点/同一份数据。 */\n async createIntegration(\n req: CreateIntegrationRequest,\n signal?: AbortSignal,\n ): Promise<ChatIntegration> {\n const resp = await this.client.doJSON<APIResponse<ChatIntegration>>(\n 'POST',\n '/chat-bridge/integrations',\n {\n app_id: req.appId,\n platform: req.platform,\n region: req.region,\n workspace_id: req.workspaceId,\n bot_id: req.botId,\n config_json: req.configJson,\n },\n signal,\n );\n return resp.data;\n }\n\n /** 列出本租户集成 (chat_bridge:read; masked 视图)。可按 appId 过滤。 */\n async listIntegrations(appId?: string, signal?: AbortSignal): Promise<ChatIntegration[]> {\n const qs = appId ? `?app_id=${encodeURIComponent(appId)}` : '';\n const resp = await this.client.doJSON<APIResponse<{ items?: ChatIntegration[] }>>(\n 'GET',\n `/chat-bridge/integrations${qs}`,\n null,\n signal,\n );\n return resp.data?.items ?? [];\n }\n\n /** 取单个集成 (chat_bridge:read)。不存在/跨租户一律 404。 */\n async getIntegration(id: string, signal?: AbortSignal): Promise<ChatIntegration> {\n const resp = await this.client.doJSON<APIResponse<ChatIntegration>>(\n 'GET',\n `/chat-bridge/integrations/${encodeURIComponent(id)}`,\n null,\n signal,\n );\n return resp.data;\n }\n\n /** 更新集成状态 (chat_bridge:write): pending | active | suspended | revoked。 */\n async updateIntegrationStatus(\n id: string,\n status: IntegrationStatus,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.client.doJSON<APIResponse<{ ok?: boolean }>>(\n 'PATCH',\n `/chat-bridge/integrations/${encodeURIComponent(id)}/status`,\n { status },\n signal,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Credential 管理面 (vault)\n // ---------------------------------------------------------------------------\n\n /** 存凭证 (chat_bridge:write) — 明文一次性提交, 返回 masked 记录 (ref+fingerprint)。 */\n async storeCredential(\n integrationId: string,\n req: StoreCredentialRequest,\n signal?: AbortSignal,\n ): Promise<ChatCredentialPublic> {\n const resp = await this.client.doJSON<APIResponse<ChatCredentialPublic>>(\n 'POST',\n `/chat-bridge/integrations/${encodeURIComponent(integrationId)}/credentials`,\n {\n secret_kind: req.secretKind,\n plaintext: req.plaintext,\n region: req.region,\n platform: req.platform,\n },\n signal,\n );\n return brandCredential(resp.data);\n }\n\n /** 列出集成的凭证 (chat_bridge:read; masked, 永不含明文/密文)。 */\n async listCredentials(\n integrationId: string,\n signal?: AbortSignal,\n ): Promise<ChatCredentialPublic[]> {\n const resp = await this.client.doJSON<APIResponse<{ items?: ChatCredentialPublic[] }>>(\n 'GET',\n `/chat-bridge/integrations/${encodeURIComponent(integrationId)}/credentials`,\n null,\n signal,\n );\n return (resp.data?.items ?? []).map(brandCredential);\n }\n\n /** 轮换凭证 (chat_bridge:rotate, 高风险) — ref 不变, fingerprint 更新。 */\n async rotateCredential(\n integrationId: string,\n secretKind: string,\n newPlaintext: string,\n signal?: AbortSignal,\n ): Promise<ChatCredentialPublic> {\n const resp = await this.client.doJSON<APIResponse<ChatCredentialPublic>>(\n 'POST',\n `/chat-bridge/integrations/${encodeURIComponent(integrationId)}/credentials/rotate`,\n { secret_kind: secretKind, new_plaintext: newPlaintext },\n signal,\n );\n return brandCredential(resp.data);\n }\n\n /** 吊销凭证 (chat_bridge:rotate) — 软吊销 + 服务端抹密文。 */\n async revokeCredential(credentialRef: string, signal?: AbortSignal): Promise<void> {\n await this.client.doJSON<APIResponse<{ ok?: boolean }>>(\n 'POST',\n `/chat-bridge/credentials/${encodeURIComponent(credentialRef)}/revoke`,\n {},\n signal,\n );\n }\n}\n\n// 服务端返回的 credentialRef 是裸 string; 出 SDK 边界前统一 brand 成 CredentialRef\n// (运行时恒等, 只改类型), 防止与 plaintext 字符串互窜 (types.ts branded 约定)。\nfunction brandCredential(c: ChatCredentialPublic): ChatCredentialPublic {\n if (c && typeof c.credentialRef === 'string') {\n return { ...c, credentialRef: asCredentialRef(c.credentialRef) };\n }\n return c;\n}\n"]}