@acosmi/sdk-ts 2.5.1 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +28 -10
- package/dist/browser/index.mjs +45 -9
- package/dist/browser/index.mjs.map +1 -1
- package/dist/index.mjs +45 -9
- package/dist/index.mjs.map +1 -1
- package/dist/node/adapters/anthropic.cjs.map +1 -1
- package/dist/node/adapters/anthropic.d.cts +1 -1
- package/dist/node/adapters/anthropic.d.ts +1 -1
- package/dist/node/adapters/anthropic.mjs.map +1 -1
- package/dist/node/adapters/openai.cjs.map +1 -1
- package/dist/node/adapters/openai.d.cts +2 -2
- package/dist/node/adapters/openai.d.ts +2 -2
- package/dist/node/adapters/openai.mjs.map +1 -1
- package/dist/node/{index-BdzF9tmA.d.cts → index-BrbgHn0E.d.cts} +12 -0
- package/dist/node/{index-BdzF9tmA.d.ts → index-BrbgHn0E.d.ts} +12 -0
- package/dist/node/index.cjs +49 -8
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +160 -54
- package/dist/node/index.d.ts +160 -54
- package/dist/node/index.mjs +45 -9
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/{openai-B5xWiGMs.d.cts → openai-CeM2k04b.d.cts} +1 -1
- package/dist/node/{openai-C3DcaljC.d.ts → openai-DoPpzZmv.d.ts} +1 -1
- package/docs//345/274/200/345/217/221/344/270/216/345/217/221/345/270/203/346/211/213/345/206/214.md +9 -2
- package/package.json +1 -1
package/dist/node/index.cjs.map
CHANGED
|
@@ -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/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/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"],"names":["BucketClassCommercial","ThinkingOff","ServerToolTypeWebSearch","BucketClassGeneric","ThinkingHigh","ThinkingMax","ThinkingHighMinMaxTokens","ThinkingMaxFallbackMaxTokens","RateLimitError","BusinessError","OrderTerminalError","ModelNotFoundError","HTTPError","NetworkError","StreamError","AnthropicAdapter","OpenAIAdapter","stopJSON","ProviderFormat","body","parseOpenAIResponseToAnthropic","isPlainObject","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/** 图片生成请求 (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/**\n * 模型可接收的用户输入模态 (v1.2+).\n *\n * - 'text': 文本输入\n * - 'image': 截图 / 图片输入 (多模态)\n *\n * ManagedModel.inputModalities 包含 'image' 才允许向该模型直接发图;\n * 缺失字段时调用方应保守按 text-only / unknown 处理.\n */\nexport type InputModality = 'text' | 'image';\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 pricePerMTok?: number;\n isDefault?: boolean;\n contextWindow?: number;\n capabilities: ModelCapabilities;\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 * 当前用户在此模型上的桶余额聚合 (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 * 取值: 'text' | 'image' 的子集. 'image' 表示模型可直接接收 screenshot/image 输入.\n *\n * 兼容上游字段名 input_modalities (snake_case) — listModels 在写缓存前会做归一化.\n *\n * **缺失语义**: 上游未下发时该字段为 undefined, 调用方必须保守按 text-only / unknown\n * 处理, 严禁默认假设支持 image. 同样严禁用模型名 substring 反推 modality.\n */\n inputModalities?: InputModality[];\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/**\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}\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/**\n * 从 StreamEvent 中解析搜索来源\n * 返回 null 表示该事件不是 sources 类型\n */\nexport function parseSourcesEvent(ev: StreamEvent): SourcesEvent | null {\n let wrapper: { type?: string; sources?: WebSearchSource[]; session_id?: string };\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\n constructor(statusCode: number, opts: { type?: string; message?: string; retryAfter?: number; body?: string } = {}) {\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 }\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\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 /** 例: \"provider\" / \"settlement\" */\n stage: string;\n /** 用户友好提示 (中文); 历史字段, 与 rawError 区分 */\n userMessage: string;\n /** gateway 原始 error 字符串 */\n rawError: string;\n /** 客户端是否值得重试 */\n retryable: boolean;\n\n constructor(opts: { code?: string; stage?: string; message?: string; rawError?: string; retryable?: boolean } = {}) {\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 ?? false;\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.stage = stage;\n this.userMessage = userMessage;\n this.rawError = rawError;\n this.retryable = retryable;\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 index → Anthropic block index */\n private toolBlockIndex = new Map<number, number>();\n private blockIndex = 0;\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 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 if (!this.toolBlockIndex.has(tc.index)) {\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(tc.index, 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: tc.function.name,\n input: {},\n },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n this.blockIndex++; // 递增, 为下一个 tool_call block 预留索引\n }\n if (tc.function.arguments && tc.function.arguments !== '') {\n const idx = this.toolBlockIndex.get(tc.index)!;\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: idx,\n delta: {\n type: 'input_json_delta',\n partial_json: tc.function.arguments,\n },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n }\n\n // finish_reason: 关闭所有 block + message_delta + message_stop\n if (choice.finish_reason != null && choice.finish_reason !== '') {\n // 关闭可能仍打开的 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 } else if (this.thinkingStarted && !this.thinkingStopped) {\n // 用 thinkingBlockIndex 关 — thinking-only 流末尾若有 tool block 推进过 blockIndex,\n // 这里仍要用 thinking 自己打开时记下的 index, 否则错配。\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 }\n // 关闭 tool blocks\n for (const idx of this.toolBlockIndex.values()) {\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: idx,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n }\n\n // stop_reason 映射\n let stopReason = 'end_turn';\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 }\n\n const deltaJSON = JSON.stringify({\n type: 'message_delta',\n delta: { stop_reason: stopReason },\n });\n events.push({ event: 'message_delta', data: deltaJSON });\n\n const stopJSON = JSON.stringify({ type: 'message_stop' });\n events.push({ event: 'message_stop', data: stopJSON });\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","// 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 SourcesEvent,\n type StreamEvent,\n type StreamSettlement,\n type ImageGenerationRequest,\n type ImageGenerationResponse,\n type VideoGenerationRequest,\n type VideoTaskResponse,\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 } 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 { type TokenStore, FileTokenStore, InMemoryTokenStore, LocalStorageTokenStore } 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 /** 自定义 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 */\nconst CHAT_REQUEST_TIMEOUT_MS = 11 * 60 * 1000;\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 /** fetch 实现 (默认 globalThis.fetch) */\n fetchImpl: typeof fetch;\n\n /** 互斥锁 (TS 用 Promise chain 替代 sync.Mutex) */\n private mu: Promise<void> = Promise.resolve();\n\n /** WebSocket 状态 (实际方法由 ws.ts mixin 维护) */\n ws: WSState | null = null;\n\n /** v0.15.1: token 就绪等待机制 — login 成功后 resolve, 等待方解除阻塞 */\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 /** 串行化锁 (替代 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.store = cfg.store ?? defaultTokenStore();\n this.fetchImpl = cfg.fetchImpl ?? globalThis.fetch.bind(globalThis);\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 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 // ===========================================================================\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 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 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 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): Promise<void> {\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(signal?: AbortSignal): Promise<ManagedModel[]> {\n const r = await this.listModelsWithStatus(signal);\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 ): Promise<{ models: ManagedModel[]; status: FilterStatus }> {\n const { result, headers } = await this.doJSONFull<APIResponse<ManagedModel[]>>(\n 'GET',\n '/managed-models',\n null,\n signal,\n );\n // v1.2: 写缓存前归一化 input_modalities → inputModalities (snake/camel 双名兼容)\n const normalized = normalizeInputModalities(result.data);\n this.modelCache = normalized;\n this.modelCacheTimeMs = Date.now();\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 * 查询单个模型的能力矩阵\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(modelID: string, req: ChatRequest, signal?: AbortSignal): Promise<ChatResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req (buildChatRequest 内部 sanitizer 也会改 rawMessages)。\n const r: ChatRequest = { ...req, stream: false };\n // v1.6.0: 调整为 CHAT_REQUEST_TIMEOUT_MS (11min), 容纳 DeepSeek 等上游\"首字节前 10min 保活\"窗口。\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('POST', endpoint, body, ctl.signal);\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 const { result } = await this.doJSONFullRaw('POST', endpoint, req, signal);\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 * 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 ): 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);\n }\n return this.chatMessagesOpenAI(modelID, req, adapter, signal);\n }\n\n private async chatMessagesAnthropic(\n modelID: string,\n req: ChatRequest,\n adapter: ProviderAdapter,\n signal?: AbortSignal,\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 { result } = await this.doJSONFullRaw(\n 'POST',\n `/managed-models/${encodeURIComponent(modelID)}/anthropic`,\n data,\n ctl.signal,\n );\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 ): 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 const { result } = await this.doJSONFullRaw('POST', endpoint, data, ctl.signal);\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 chatStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.chatStreamGen(modelID, req, signal, false),\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 chatMessagesStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.chatMessagesStreamGen(modelID, req, signal, false),\n };\n }\n\n private async *chatStreamGen(\n modelID: string,\n req: ChatRequest,\n signal: AbortSignal | undefined,\n retried: boolean,\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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(signal);\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);\n return;\n }\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 // 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 ): 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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(signal);\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);\n return;\n }\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 // 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 // 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 return base + path;\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 return base + path;\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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(ctl.signal);\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 /** doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse) */\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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(ctl.signal);\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 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 * 该函数 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 m.inputModalities = snake.filter(\n (v): v is 'text' | 'image' => v === 'text' || v === 'image',\n );\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 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\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 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\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\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\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 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 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 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 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('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 server.close();\n }\n}\n\nfunction htmlEscape(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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 * (含 `state` 参数 — SDK 桌面 `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 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 } finally {\n ctl.dispose();\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}\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\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 } 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 * 通用回退: 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 try {\n const obj = JSON.parse(bodyStr);\n if (obj && typeof obj === 'object') {\n const errObj = (obj as { error?: unknown }).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 }\n }\n } catch {\n // 非 JSON, body 原样保留\n }\n\n return new HTTPError(statusCode, { type, message, retryAfter, body: bodyStr });\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 };\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}\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\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/** @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","// 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 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 /** 拉取模型系数表; SDK 自带 8s TTL 内存缓存以减小调用风暴. */\n listCoefficients(signal?: AbortSignal): Promise<ModelCoefficient[]>;\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 Order,\n OrderStatus,\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<Order>;\n /** 查询订单支付状态 */\n getOrderStatus(orderID: string, signal?: AbortSignal): Promise<OrderStatus>;\n /** 查询我的订单列表 */\n listMyOrders(signal?: AbortSignal): Promise<Order[]>;\n /**\n * 轮询订单支付状态直到终态\n * 成功支付返回 status; 终态失败抛 OrderTerminalError\n * pollIntervalMs <= 0 时默认 2 秒\n */\n waitForPayment(orderID: string, pollIntervalMs: number, signal?: AbortSignal): Promise<OrderStatus>;\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<Order>>(\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<OrderStatus>>(\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<Order>;\n if (Array.isArray(page.list)) return page.list;\n }\n if (Array.isArray(raw.data)) return raw.data as Order[];\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 if (isOrderTerminal(status.status)) {\n if (isOrderSuccess(status.status)) return status;\n throw new OrderTerminalError(orderID, status.status);\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 } 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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await c.forceRefresh(ctl.signal);\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 registerDevice(reg: DeviceRegistration, signal?: AbortSignal): Promise<void>;\n /** 注销推送设备 token */\n unregisterDevice(token: string, signal?: AbortSignal): Promise<void>;\n /** 获取通知偏好设置 */\n listNotificationPreferences(signal?: AbortSignal): Promise<NotificationPreference[]>;\n /** 更新通知偏好 */\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 { WSEvent } from './types';\nimport { Client } from '../core/client';\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}\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 if (this.ws) {\n await this.disconnect();\n }\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 };\n\n // 首次连接 — 失败抛出\n await wsConnectOnce(this, ws);\n this.ws = ws as unknown as Client['ws'];\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\nasync function wsConnectOnce(c: Client, ws: WSStateImpl): Promise<void> {\n const token = await c.ensureToken(ws.abort.signal);\n const url = wsURL(c);\n const WSCtor = getWebSocketCtor();\n\n // 构造连接 — 浏览器 WebSocket 不支持自定义 header,\n // Authorization 改走 query string 子协议或 cookie (服务端约定).\n // Go 端 header 'Authorization: Bearer <token>'.\n // TS 跨端方案: token 放 URL query (?token=) 或 Sec-WebSocket-Protocol 子协议.\n // 此处用 query, 与 Go 端不完全等价 — 服务端需对应支持.\n // 注: Node 22+ ws 模块通常支持 options.headers; 浏览器不支持.\n //\n // ⚠️ 安全风险 (D7, 待后续批次): access_token 放在 URL query string 会被反向代理 /\n // 网关 / 浏览器开发者工具的 access log 明文记录, 存在泄露风险。浏览器原生 WebSocket\n // 无法传自定义 header, 这是当前跨端约束下的折中方案; 真正修复需服务端支持\n // Sec-WebSocket-Protocol 子协议携带 token 或短时一次性 ticket。本批不改实现。\n const u = new URL(url);\n u.searchParams.set('token', token);\n\n // Node ws 包 / 浏览器 WebSocket 都支持 1 个 protocols 参数,\n // 我们额外通过 Sec-WebSocket-Protocol 携带 token (可选).\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\n conn.addEventListener('open', () => {\n opened = true;\n });\n\n conn.addEventListener('error', (e: Event) => {\n clearTimeout(handshakeTimer);\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 try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`unexpected first message: ${welcome.type}`));\n return;\n }\n clearTimeout(handshakeTimer);\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 (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(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(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 try {\n ws.cfg.onEvent(event);\n } catch {\n // ignore handler 内部错误\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\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 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\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}\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 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","// 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 { 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 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 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 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 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 try {\n await resp.body?.cancel();\n } catch {}\n await this.client.forceRefresh(signal);\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}\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}\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 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 };\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): { code?: string; message: string; stage?: string; retryable?: boolean; raw?: unknown } | 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 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","// 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 {@code 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 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 try {\n await resp.body?.cancel();\n } catch { /* ignore */ }\n await this.client.forceRefresh(signal);\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 type { APIResponse } from '../shared/api-response';\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\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<APIResponse<BugReportResult>>(\n 'POST',\n '/crabcode_cli_feedback',\n { content: contentStr },\n signal,\n );\n return result.data;\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<APIResponse<BugView>>(\n 'GET',\n `/crabcode/bug/${trimmed}`,\n null,\n signal,\n );\n return resp.data;\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\nimport type { APIResponse } from '../shared/api-response';\nimport type { SubscriptionAudience, SubscriptionPlan, UserSubscription } 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 /** 列出当前用户已激活订阅 (跨档位; 通常 1 条 active) */\n listUserSubscriptions(signal?: AbortSignal): Promise<UserSubscription[]>;\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.listUserSubscriptions = async function (\n this: Client,\n signal?: AbortSignal,\n): Promise<UserSubscription[]> {\n const resp = await this.doJSON<APIResponse<UserSubscription[]>>(\n 'GET',\n '/distribution/user/subscriptions',\n null,\n signal,\n );\n return Array.isArray(resp.data) ? resp.data : [];\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 * 注意: `configJson` 仅含非敏感配置 (rate limit / feature toggles); 严禁含 secret。\n * Phase 7B handler 落地后, SDK admin 子客户端会按此型号 GET。\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 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"]}
|
|
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/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/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"],"names":["BucketClassCommercial","ThinkingOff","ServerToolTypeWebSearch","BucketClassGeneric","ThinkingHigh","ThinkingMax","ThinkingHighMinMaxTokens","ThinkingMaxFallbackMaxTokens","RateLimitError","BusinessError","OrderTerminalError","ModelNotFoundError","HTTPError","NetworkError","StreamError","AnthropicAdapter","OpenAIAdapter","stopJSON","ProviderFormat","body","parseOpenAIResponseToAnthropic","isPlainObject","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/** 图片生成请求 (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/**\n * 模型可接收的用户输入模态 (v1.2+).\n *\n * - 'text': 文本输入\n * - 'image': 截图 / 图片输入 (多模态)\n *\n * ManagedModel.inputModalities 包含 'image' 才允许向该模型直接发图;\n * 缺失字段时调用方应保守按 text-only / unknown 处理.\n */\nexport type InputModality = 'text' | 'image';\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 * 当前用户在此模型上的桶余额聚合 (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 * 取值: 'text' | 'image' 的子集. 'image' 表示模型可直接接收 screenshot/image 输入.\n *\n * 兼容上游字段名 input_modalities (snake_case) — listModels 在写缓存前会做归一化.\n *\n * **缺失语义**: 上游未下发时该字段为 undefined, 调用方必须保守按 text-only / unknown\n * 处理, 严禁默认假设支持 image. 同样严禁用模型名 substring 反推 modality.\n */\n inputModalities?: InputModality[];\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/**\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}\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/**\n * 从 StreamEvent 中解析搜索来源\n * 返回 null 表示该事件不是 sources 类型\n */\nexport function parseSourcesEvent(ev: StreamEvent): SourcesEvent | null {\n let wrapper: { type?: string; sources?: WebSearchSource[]; session_id?: string };\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\n constructor(statusCode: number, opts: { type?: string; message?: string; retryAfter?: number; body?: string } = {}) {\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 }\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\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 /** 例: \"provider\" / \"settlement\" */\n stage: string;\n /** 用户友好提示 (中文); 历史字段, 与 rawError 区分 */\n userMessage: string;\n /** gateway 原始 error 字符串 */\n rawError: string;\n /** 客户端是否值得重试 */\n retryable: boolean;\n\n constructor(opts: { code?: string; stage?: string; message?: string; rawError?: string; retryable?: boolean } = {}) {\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 ?? false;\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.stage = stage;\n this.userMessage = userMessage;\n this.rawError = rawError;\n this.retryable = retryable;\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 index → Anthropic block index */\n private toolBlockIndex = new Map<number, number>();\n private blockIndex = 0;\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 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 if (!this.toolBlockIndex.has(tc.index)) {\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(tc.index, 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: tc.function.name,\n input: {},\n },\n });\n events.push({ event: 'content_block_start', data: blockJSON });\n this.blockIndex++; // 递增, 为下一个 tool_call block 预留索引\n }\n if (tc.function.arguments && tc.function.arguments !== '') {\n const idx = this.toolBlockIndex.get(tc.index)!;\n const deltaJSON = JSON.stringify({\n type: 'content_block_delta',\n index: idx,\n delta: {\n type: 'input_json_delta',\n partial_json: tc.function.arguments,\n },\n });\n events.push({ event: 'content_block_delta', data: deltaJSON });\n }\n }\n\n // finish_reason: 关闭所有 block + message_delta + message_stop\n if (choice.finish_reason != null && choice.finish_reason !== '') {\n // 关闭可能仍打开的 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 } else if (this.thinkingStarted && !this.thinkingStopped) {\n // 用 thinkingBlockIndex 关 — thinking-only 流末尾若有 tool block 推进过 blockIndex,\n // 这里仍要用 thinking 自己打开时记下的 index, 否则错配。\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 }\n // 关闭 tool blocks\n for (const idx of this.toolBlockIndex.values()) {\n const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: idx,\n });\n events.push({ event: 'content_block_stop', data: stopJSON });\n }\n\n // stop_reason 映射\n let stopReason = 'end_turn';\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 }\n\n const deltaJSON = JSON.stringify({\n type: 'message_delta',\n delta: { stop_reason: stopReason },\n });\n events.push({ event: 'message_delta', data: deltaJSON });\n\n const stopJSON = JSON.stringify({ type: 'message_stop' });\n events.push({ event: 'message_stop', data: stopJSON });\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","// 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 SourcesEvent,\n type StreamEvent,\n type StreamSettlement,\n type ImageGenerationRequest,\n type ImageGenerationResponse,\n type VideoGenerationRequest,\n type VideoTaskResponse,\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 } 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 { type TokenStore, FileTokenStore, InMemoryTokenStore, LocalStorageTokenStore } 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 /** 自定义 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 */\nconst CHAT_REQUEST_TIMEOUT_MS = 11 * 60 * 1000;\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 /** fetch 实现 (默认 globalThis.fetch) */\n fetchImpl: typeof fetch;\n\n /** 互斥锁 (TS 用 Promise chain 替代 sync.Mutex) */\n private mu: Promise<void> = Promise.resolve();\n\n /** WebSocket 状态 (实际方法由 ws.ts mixin 维护) */\n ws: WSState | null = null;\n\n /** v0.15.1: token 就绪等待机制 — login 成功后 resolve, 等待方解除阻塞 */\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 /** 串行化锁 (替代 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.store = cfg.store ?? defaultTokenStore();\n this.fetchImpl = cfg.fetchImpl ?? globalThis.fetch.bind(globalThis);\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 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 // ===========================================================================\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 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 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 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): Promise<void> {\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(signal?: AbortSignal): Promise<ManagedModel[]> {\n const r = await this.listModelsWithStatus(signal);\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 ): Promise<{ models: ManagedModel[]; status: FilterStatus }> {\n const { result, headers } = await this.doJSONFull<APIResponse<ManagedModel[]>>(\n 'GET',\n '/managed-models',\n null,\n signal,\n );\n // v1.2: 写缓存前归一化 input_modalities → inputModalities (snake/camel 双名兼容)\n const normalized = normalizeInputModalities(result.data);\n this.modelCache = normalized;\n this.modelCacheTimeMs = Date.now();\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 * 查询单个模型的能力矩阵\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(modelID: string, req: ChatRequest, signal?: AbortSignal): Promise<ChatResponse> {\n // 浅拷贝避免原地 mutate 调用方传入的 req (buildChatRequest 内部 sanitizer 也会改 rawMessages)。\n const r: ChatRequest = { ...req, stream: false };\n // v1.6.0: 调整为 CHAT_REQUEST_TIMEOUT_MS (11min), 容纳 DeepSeek 等上游\"首字节前 10min 保活\"窗口。\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('POST', endpoint, body, ctl.signal);\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 const { result } = await this.doJSONFullRaw('POST', endpoint, req, signal);\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 * 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 ): 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);\n }\n return this.chatMessagesOpenAI(modelID, req, adapter, signal);\n }\n\n private async chatMessagesAnthropic(\n modelID: string,\n req: ChatRequest,\n adapter: ProviderAdapter,\n signal?: AbortSignal,\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 { result } = await this.doJSONFullRaw(\n 'POST',\n `/managed-models/${encodeURIComponent(modelID)}/anthropic`,\n data,\n ctl.signal,\n );\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 ): 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 const { result } = await this.doJSONFullRaw('POST', endpoint, data, ctl.signal);\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 chatStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.chatStreamGen(modelID, req, signal, false),\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 chatMessagesStream(\n modelID: string,\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncIterable<StreamEvent> {\n return {\n [Symbol.asyncIterator]: () => this.chatMessagesStreamGen(modelID, req, signal, false),\n };\n }\n\n private async *chatStreamGen(\n modelID: string,\n req: ChatRequest,\n signal: AbortSignal | undefined,\n retried: boolean,\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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(signal);\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);\n return;\n }\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 // 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 ): 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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(signal);\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);\n return;\n }\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 // 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 // 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 return base + path;\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 return base + path;\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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(ctl.signal);\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 /** doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse) */\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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await this.forceRefresh(ctl.signal);\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 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 * 该函数 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 m.inputModalities = snake.filter(\n (v): v is 'text' | 'image' => v === 'text' || v === 'image',\n );\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 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\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 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\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\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\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 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 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 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 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('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 server.close();\n }\n}\n\nfunction htmlEscape(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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 * (含 `state` 参数 — SDK 桌面 `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 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 } finally {\n ctl.dispose();\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}\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\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 } 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 * 通用回退: 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 try {\n const obj = JSON.parse(bodyStr);\n if (obj && typeof obj === 'object') {\n const errObj = (obj as { error?: unknown }).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 }\n }\n } catch {\n // 非 JSON, body 原样保留\n }\n\n return new HTTPError(statusCode, { type, message, retryAfter, body: bodyStr });\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 };\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}\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/** @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","// 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 } 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 try {\n await resp.body?.cancel();\n } catch {\n /* ignore */\n }\n try {\n await c.forceRefresh(ctl.signal);\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';\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}\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 if (this.ws) {\n await this.disconnect();\n }\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 };\n\n // 首次连接 — 失败抛出\n await wsConnectOnce(this, ws);\n this.ws = ws as unknown as Client['ws'];\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\nasync function wsConnectOnce(c: Client, ws: WSStateImpl): Promise<void> {\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 ticketResp = await c.doJSON<APIResponse<{ ticket: string; expiresIn: number }>>(\n 'POST',\n '/ws/stream-ticket',\n null,\n ws.abort.signal,\n );\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\n conn.addEventListener('open', () => {\n opened = true;\n });\n\n conn.addEventListener('error', (e: Event) => {\n clearTimeout(handshakeTimer);\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 try {\n conn.close();\n } catch {\n /* ignore */\n }\n reject(new Error(`unexpected first message: ${welcome.type}`));\n return;\n }\n clearTimeout(handshakeTimer);\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 (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(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(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 try {\n ws.cfg.onEvent(event);\n } catch {\n // ignore handler 内部错误\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\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 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\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}\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 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","// 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 { 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 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 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 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 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 try {\n await resp.body?.cancel();\n } catch {}\n await this.client.forceRefresh(signal);\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}\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}\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 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 };\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): { code?: string; message: string; stage?: string; retryable?: boolean; raw?: unknown } | 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 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","// 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 {@code 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 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 try {\n await resp.body?.cancel();\n } catch { /* ignore */ }\n await this.client.forceRefresh(signal);\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 type { APIResponse } from '../shared/api-response';\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\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<APIResponse<BugReportResult>>(\n 'POST',\n '/crabcode_cli_feedback',\n { content: contentStr },\n signal,\n );\n return result.data;\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<APIResponse<BugView>>(\n 'GET',\n `/crabcode/bug/${trimmed}`,\n null,\n signal,\n );\n return resp.data;\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 * 注意: `configJson` 仅含非敏感配置 (rate limit / feature toggles); 严禁含 secret。\n * Phase 7B handler 落地后, SDK admin 子客户端会按此型号 GET。\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 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"]}
|