@acosmi/sdk-ts 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +12 -3
- package/dist/browser/index.mjs +60 -9
- package/dist/browser/index.mjs.map +1 -1
- package/dist/index.mjs +60 -9
- package/dist/index.mjs.map +1 -1
- package/dist/node/index.cjs +60 -8
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +39 -8
- package/dist/node/index.d.ts +39 -8
- package/dist/node/index.mjs +60 -9
- package/dist/node/index.mjs.map +1 -1
- package/docs/compliance.md +36 -0
- package/package.json +6 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/betas.ts","../src/adapters/anthropic.ts","../src/adapters/openai.ts","../src/adapters/index.ts","../src/index.ts","../src/model-helpers.ts","../src/auth.ts","../src/scopes.ts","../src/compliance-status.ts","../src/compliance-errors.ts","../src/client.ts","../src/store.ts","../src/retry.ts","../src/stream-meta.ts","../src/client-helpers.ts","../src/client/compliance.ts","../src/sanitize/index.ts","../src/sanitize/types.ts","../src/sanitize/config.ts","../src/sanitize/history.ts","../src/sanitize/defensive.ts","../src/agent-runs-types.ts","../src/client/agent-runs.ts","../src/client/entitlements.ts","../src/client/packages.ts","../src/client/wallet.ts","../src/client/skills.ts","../src/client/tools.ts","../src/client/notifications.ts","../src/sanitize-bridge.ts","../src/ws.ts","../src/bug-report.ts"],"names":["stopJSON","ProviderFormat","parseOpenAIResponseToAnthropic","sleep","isPlainObject","event","sleepWithSignal"],"mappings":"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","file":"index.mjs","sourcesContent":["// types.ts — 端口自 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// 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 return Date.now() > expiresAt - 30_000;\n}\n\n/** 动态注册响应 */\nexport interface ClientRegistration {\n client_id: string;\n client_secret?: string;\n}\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/**\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// ---------- 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// OpenAI 兼容响应类型 (非 Anthropic 厂商)\n// =============================================================================\n\nexport interface OpenAIChatResponse {\n id: string;\n /** \"chat.completion\" */\n object: string;\n model: string;\n choices: OpenAIChatChoice[];\n usage: OpenAIUsage;\n}\n\nexport interface OpenAIChatChoice {\n index: number;\n message: OpenAIChatMessage;\n /** \"stop\", \"tool_calls\", \"length\" */\n finish_reason: string;\n}\n\nexport interface OpenAIChatMessage {\n role: string;\n content: string;\n tool_calls?: OpenAIToolCall[];\n /** GLM/DeepSeek thinking */\n reasoning_content?: string;\n}\n\nexport interface OpenAIToolCall {\n id: string;\n /** \"function\" */\n type: string;\n function: OpenAIFunctionCall;\n}\n\nexport interface OpenAIFunctionCall {\n name: string;\n arguments: string;\n}\n\nexport interface OpenAIUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\n/** OpenAI SSE delta 格式 */\nexport interface OpenAIStreamChunk {\n id: string;\n /** \"chat.completion.chunk\" */\n object: string;\n choices: OpenAIStreamChoice[];\n usage?: OpenAIUsage;\n}\n\nexport interface OpenAIStreamChoice {\n index: number;\n delta: OpenAIStreamDelta;\n finish_reason: string | null;\n}\n\nexport interface OpenAIStreamDelta {\n role?: string;\n content?: string;\n reasoning_content?: string;\n tool_calls?: OpenAIStreamToolCall[];\n}\n\nexport interface OpenAIStreamToolCall {\n index: number;\n id?: string;\n type?: string;\n function: OpenAIFunctionCall;\n}\n\n// =============================================================================\n// ChatResponse / AnthropicResponse\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 * 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\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\n// =============================================================================\n// Entitlements\n// =============================================================================\n\n/** 权益余额 (聚合) */\nexport interface EntitlementBalance {\n totalTokenQuota: number;\n totalTokenUsed: number;\n totalTokenRemaining: number;\n totalCallQuota: number;\n totalCallUsed: number;\n totalCallRemaining: number;\n activeEntitlements: number;\n}\n\n/** 单条权益明细 */\nexport interface EntitlementItem {\n id: string;\n type: string;\n status: string;\n tokenQuota: number;\n tokenUsed: number;\n tokenRemaining: number;\n callQuota: number;\n callUsed: number;\n callRemaining: number;\n expiresAt?: string;\n sourceId?: string;\n sourceType?: string;\n remark?: string;\n createdAt: string;\n}\n\n/** 详细余额 (含每条权益明细) */\nexport interface BalanceDetail {\n totalTokenQuota: number;\n totalTokenUsed: number;\n totalTokenRemaining: number;\n totalCallQuota: number;\n totalCallUsed: number;\n totalCallRemaining: number;\n activeEntitlements: number;\n entitlements: EntitlementItem[];\n}\n\n/** 核销记录 */\nexport interface ConsumeRecord {\n id: string;\n entitlementId: string;\n requestId: string;\n modelId?: string;\n tokensConsumed: number;\n status: string;\n createdAt: string;\n}\n\n/** 核销记录分页响应 */\nexport interface ConsumeRecordPage {\n records: ConsumeRecord[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n// =============================================================================\n// V29 Per-Model Bucket\n// =============================================================================\n\n/**\n * 单桶视图 (用户多桶 hero / 模型切换提示用)\n *\n * 字段名仍叫 ETU 但 T3 死代码清除后 = raw token (V29 系数管理已退役)。\n */\nexport interface ModelBucket {\n bucketId: string;\n entitlementId: string;\n /** \"*\" = 通配 */\n modelId: string;\n /** COMMERCIAL / GENERIC */\n bucketClass: string;\n tokenQuota: number;\n tokenUsed: number;\n tokenRemaining: number;\n callQuota: number;\n callUsed: number;\n callRemaining: number;\n allowedModelsJson?: string;\n}\n\n/** GetByModel 响应; primaryBucket 在 bucketId 为空时表示无可用桶。 */\nexport interface ModelByQuotaResponse {\n modelId: string;\n /** 折算后剩余 (调度判定用) */\n etuRemaining: number;\n /** 反系数估算的原始 token (UI 展示用) */\n rawTokenRemaining: number;\n hasQuota: boolean;\n primaryBucket?: ModelBucket;\n}\n\n/** 单条模型系数 (SDK TTL 8s 缓存源) */\nexport interface ModelCoefficient {\n modelId: string;\n tenantId: string;\n inputCoef: number;\n outputCoef: number;\n cacheReadCoef: number;\n cacheCreationCoef: number;\n version: number;\n effectiveAt: string;\n}\n\n// =============================================================================\n// Token Packages (商城)\n// =============================================================================\n\n/** 流量包商品。price 用 string (Go json.Number) 避免浮点精度丢失。 */\nexport interface TokenPackage {\n id: string;\n name: string;\n description?: string;\n tokenQuota: number;\n callQuota?: number;\n price: string;\n validDays: number;\n isEnabled: boolean;\n sortOrder?: number;\n}\n\n/** 订单。amount 用 string (Go json.Number) 避免精度丢失。 */\nexport interface Order {\n id: string;\n packageId: string;\n packageName?: string;\n amount: string;\n status: string;\n payUrl?: string;\n createdAt: string;\n}\n\n/** 订单状态 */\nexport interface OrderStatus {\n orderId: string;\n status: string;\n}\n\n/** 下单请求 */\nexport interface PayPayload {\n payMethod?: string;\n}\n\n// =============================================================================\n// Wallet (钱包)\n// =============================================================================\n\n/** 钱包统计。金额使用 string (Go json.Number) 避免浮点精度丢失 (金融安全) */\nexport interface WalletStats {\n balance: string;\n monthlyConsumption: string;\n monthlyRecharge: string;\n transactionCount: number;\n}\n\n/** 交易记录 */\nexport interface Transaction {\n id: string;\n type: string;\n amount: string;\n remark?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// Skill Store\n// =============================================================================\n\nexport interface SkillStoreItem {\n id: string;\n pluginId: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n category: string;\n inputSchema: string;\n outputSchema: string;\n timeout: number;\n retryCount: number;\n retryDelay: number;\n version: string;\n totalCalls: number;\n avgDurationMs: number;\n successRate: number;\n isEnabled: boolean;\n securityLevel: string;\n securityScore: number;\n scope: string;\n status: string;\n downloadCount: number;\n readme: string;\n tags: string[];\n author: string;\n publisherId: string;\n isPublished: boolean;\n pluginName: string;\n pluginIcon: string;\n updatedAt: string;\n visibility?: string;\n certificationStatus?: string;\n source?: string;\n}\n\n/** 技能商店搜索参数 (非 wire 类型, 用于 client 方法参数) */\nexport interface SkillStoreQuery {\n category?: string;\n keyword?: string;\n tag?: string;\n}\n\n/** 技能统计概览 */\nexport interface SkillSummary {\n installed: number;\n created: number;\n total: number;\n storeAvailable: number;\n}\n\n/** 技能商店分页浏览响应 */\nexport interface SkillBrowseResponse {\n items: SkillStoreItem[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n/**\n * 技能商店列表项(轻量,仅含浏览所需字段)\n * 配合服务端 fields=minimal 参数使用,响应体积缩减 90%+\n */\nexport interface SkillStoreListItem {\n id: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n category: string;\n version: string;\n author: string;\n downloadCount: number;\n tags: string[];\n certificationStatus?: string;\n visibility?: string;\n source?: string;\n updatedAt: string;\n}\n\n/** 技能商店轻量浏览响应 */\nexport interface SkillBrowseListResponse {\n items: SkillStoreListItem[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n/** 技能认证状态响应 */\nexport interface CertificationStatus {\n skillId: string;\n certificationStatus: string;\n certifiedAt?: number;\n securityLevel?: string;\n securityScore: number;\n report?: unknown;\n}\n\n// =============================================================================\n// Skill Generator\n// =============================================================================\n\nexport interface GenerateSkillRequest {\n purpose: string;\n examples?: string[];\n inputHints?: string;\n outputHints?: string;\n category?: string;\n language?: string;\n}\n\nexport interface GenerateSkillResult {\n skillName: string;\n skillKey: string;\n description: string;\n skillMd: string;\n inputSchema: string;\n outputSchema: string;\n testCases: string[];\n readme: string;\n category: string;\n tags: string[];\n timeout: number;\n}\n\nexport interface OptimizeSkillRequest {\n skillName: string;\n description?: string;\n inputSchema?: string;\n outputSchema?: string;\n readme?: string;\n aspects?: string[];\n}\n\nexport interface OptimizeSkillResult {\n optimizedSkill: GenerateSkillResult;\n changes: string[];\n score: number;\n}\n\n// =============================================================================\n// Unified Tools\n// =============================================================================\n\nexport interface ToolView {\n id: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n category: string;\n inputSchema: string;\n outputSchema: string;\n timeout: number;\n isEnabled: boolean;\n provider?: ToolProvider;\n}\n\nexport interface ToolProvider {\n id: string;\n name: string;\n icon: string;\n sourceType: string;\n mcpEndpoint?: string;\n isEnabled: boolean;\n}\n\nexport interface ToolListResponse {\n skills: ToolView[];\n total: number;\n}\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\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\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","// 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 BusinessError,\n ThinkingHighMinMaxTokens,\n ThinkingMax,\n ThinkingMaxFallbackMaxTokens,\n ThinkingOff,\n} from '../types';\nimport { buildBetas } from '../betas';\nimport { ProviderFormat, type ProviderAdapter } from './index';\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 if (req.metadata) {\n body['metadata'] = req.metadata;\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 已由 SDK 管理,\n // extraBody 中不应包含这些 key, 否则会覆盖 SDK 计算结果\n if (req.extraBody) {\n for (const [k, v] of Object.entries(req.extraBody)) {\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 {\n type AnthropicContentBlock,\n type AnthropicResponse,\n type ChatContentBlock,\n type ChatRequest,\n type ChatResponse,\n type ModelCapabilities,\n type OpenAIChatResponse,\n type OpenAIStreamChunk,\n type StreamEvent,\n BusinessError,\n ThinkingHigh,\n ThinkingMax,\n ThinkingOff,\n} from '../types';\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 // ── 流式选项 ──\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 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 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.blockIndex,\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 (如果有)\n if (this.thinkingStarted && !this.thinkingStopped) {\n this.thinkingStopped = true;\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 }\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 // 关闭 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 const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.blockIndex,\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 非空 → 按其值返回 (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 */\nexport function getAdapterForModel(m: ManagedModel): ProviderAdapter {\n const pref = (m.preferred_format ?? '').trim().toLowerCase();\n switch (pref) {\n case 'anthropic':\n return new AnthropicAdapter();\n case 'openai':\n return new OpenAIAdapter();\n }\n\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 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 };\n","// index.ts — Acosmi SDK TypeScript 主入口\n//\n// 端口源: acosmi-sdk-go v0.19.0 (一字不差对齐)\n//\n// 双格式红线: AnthropicAdapter + OpenAIAdapter 等地位 (对应两个不同下游产品)。\n\n// === 类型 ===\nexport * from './types';\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// === Auth helpers ===\nexport {\n discover,\n register,\n authorize,\n exchangeCode,\n refreshToken,\n revokeToken,\n newTokenSet,\n isSSLError,\n EventAuthURL,\n EventComplete,\n EventError,\n ErrDiscovery,\n ErrRegistration,\n ErrBrowserOpen,\n ErrAuthDenied,\n ErrTimeout,\n ErrTokenExchange,\n ErrSSLProxy,\n type LoginEvent,\n type LoginEventType,\n type LoginErrCode,\n type LoginOptions,\n type AuthorizeResult,\n} from './auth';\n\n// === Scopes ===\nexport * from './scopes';\n\n// === Compliance ===\n// 暴露 envelope/审批/provider/billing 的对外稳定状态与错误码 + SDK 公共领域类型\n// + 数值错误码 → symbolic key 的分类器;不暴露下游材料、provider ledger /\n// distribution billing 内部 API。\nexport * from './compliance-status';\nexport * from './compliance-types';\nexport {\n classifyComplianceError,\n isComplianceBusinessError,\n type ComplianceErrorInfo,\n type ComplianceErrorKey,\n} from './compliance-errors';\nexport { ComplianceClient, CompliancePollError } from './client/compliance';\n\n// === TokenStore ===\nexport {\n type TokenStore,\n FileTokenStore,\n LocalStorageTokenStore,\n InMemoryTokenStore,\n newFileTokenStore,\n fileLockDefaults,\n} from './store';\n\n// === Retry ===\nexport {\n type RetryPolicy,\n type RetryRequestInfo,\n DefaultRetryPolicy,\n defaultRetryable,\n defaultSafeToRetry,\n computeBackoff,\n effectivePolicy,\n} from './retry';\n\n// === Sanitize ===\nexport * as sanitize from './sanitize';\n\n// === Stream meta ===\nexport { extractAnthropicBlockMeta, type BlockMeta } from './stream-meta';\n\n// === Agent Runs ===\nexport * from './agent-runs-types';\nexport { AgentRunsClient } from './client/agent-runs';\n\n// === Betas ===\nexport { buildBetas, uniqueMerge } from './betas';\n\n// === Client + 业务 mixins (必须 side-effect import 才能挂 prototype) ===\nexport { Client, type Config, type FilterStatus } from './client';\nexport {\n FilterStatusOK,\n FilterStatusAdminBypass,\n FilterStatusInternalBypass,\n FilterStatusDisabledByFlag,\n FilterStatusFallbackTkdistError,\n FilterStatusFallbackTkdistSkew,\n FilterStatusFallbackNoBuckets,\n FilterStatusFallbackMissingUser,\n FilterStatusUnknown,\n} from './client';\n\n// 业务方法 — side-effect import 注入到 Client.prototype\nimport './client/entitlements';\nimport './client/packages';\nimport './client/wallet';\nimport './client/skills';\nimport './client/tools';\nimport './client/notifications';\nimport './client/agent-runs';\nimport './client/compliance';\nimport './sanitize-bridge';\nimport './ws';\nimport './bug-report';\n\nexport type { WSConfig } from './ws';\nexport type { BugReportResult, BugView } from './bug-report';\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","// auth.ts — 端口自 acosmi-sdk-go/auth.go (474 行)\n//\n// 跨平台 OAuth 2.1 PKCE helpers + Node-only authorize (HTTP callback server)。\n// 浏览器调用 authorize 会抛错 — 浏览器侧应自行实现 popup window + redirect handler。\n\nimport type { ClientRegistration, ServerMetadata, TokenResponse, TokenSet } from './types';\n\n/** auth 专用超时 (毫秒) — 与 Go authHTTPClient 30s 一致 */\nconst authTimeoutMs = 30_000;\n\n// =============================================================================\n// Discovery\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(serverURL: string, signal?: AbortSignal): 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/desktop`;\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetch(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// Dynamic Client Registration (RFC 7591)\n// =============================================================================\n\n/** 动态注册桌面客户端,获取 client_id */\nexport async function register(\n meta: ServerMetadata,\n appName: string,\n signal?: AbortSignal,\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 fetch(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\nasync function generateCodeVerifier(): 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 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\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\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 * 浏览器环境会抛错 — 浏览器侧应自行实现 popup window + 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// 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): 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);\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): 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);\n}\n\n/** 刷新 access_token */\nexport async function refreshToken(\n meta: ServerMetadata,\n clientID: string,\n refreshTokenValue: string,\n signal?: AbortSignal,\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);\n}\n\n/** 吊销 token. 服务端不支持吊销时静默跳过. */\nexport async function revokeToken(\n meta: ServerMetadata,\n token: string,\n signal?: AbortSignal,\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 fetch(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): Promise<TokenResponse> {\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetch(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_description?: string } = {};\n try {\n errBody = (await resp.json()) as { error_description?: string };\n } catch {\n // ignore\n }\n throw new Error(`token: HTTP ${resp.status}: ${errBody.error_description ?? ''}`);\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","// 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: 本文件 ComplianceScope* 常量\n// 合规 scope 不做分组合并 — 服务端按细粒度校验, SDK 也只应按需申请最小集合。\n\nexport const ScopeAI = 'ai'; // 模型服务: 模型调用 + 流量包 + 权益\nexport const ScopeSkills = 'skills'; // 技能与工具: 技能商店 + 工具列表 + 执行\nexport const ScopeAccount = 'account'; // 账户信息: 个人资料 + 钱包余额 + 交易记录\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// ===========================================================================\n// 合规履约 scope\n// ===========================================================================\n//\n// 调用 compliance API 时必须按这些常量声明所需 scope; 不允许通过 ScopeAI /\n// ScopeAccount 隐式获得 compliance 权限。\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 ScopeComplianceReportsPublish = 'compliance:reports:publish';\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 ScopeComplianceReportsPublish;\n\n/** 全部分组 scope (推荐) */\nexport function allScopes(): string[] {\n return [ScopeAI, ScopeSkills, ScopeAccount];\n}\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 ScopeComplianceReportsPublish,\n ];\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","// 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\nimport type { BusinessError } from './types';\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","// 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 {\n type AnthropicResponse,\n type ChatRequest,\n type ChatResponse,\n type ManagedModel,\n type ModelCapabilities,\n type ModelCoefficient,\n type QuotaSummary,\n type ServerMetadata,\n type SourcesEvent,\n type StreamEvent,\n type StreamSettlement,\n type TokenSet,\n ModelNotFoundError,\n apiResponseBusinessError,\n parseSettlement,\n parseSourcesEvent,\n tokenSetIsExpired,\n type APIResponse,\n} from './types';\nimport {\n discover,\n exchangeCode,\n exchangeCodeWithExpiry,\n refreshToken,\n register,\n revokeToken,\n authorize,\n newTokenSet,\n isSSLError,\n EventComplete,\n EventError,\n ErrDiscovery,\n ErrRegistration,\n ErrSSLProxy,\n ErrTokenExchange,\n type LoginEvent,\n type LoginErrCode,\n type LoginOptions,\n} from './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 './adapters/index';\nimport { extractAnthropicBlockMeta, type BlockMeta } from './stream-meta';\nimport { newOpenAIStreamConverter } from './adapters/openai';\nimport {\n classifyTransport,\n iterSSELines,\n maxErrorBodySize,\n modelCacheTTLMs,\n parseHTTPErrorWithHeader,\n parseStreamError,\n readLimited,\n} from './client-helpers';\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// Config\n// =============================================================================\n\n/** 客户端配置 */\nexport interface Config {\n /**\n * nexus-v4 API 根地址 (默认 https://acosmi.com)。\n * SDK 自动追加 /api/v4, 无需手动拼接。\n */\n serverURL?: 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// =============================================================================\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 /** 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 this.serverURL = (cfg.serverURL ?? 'https://acosmi.com').replace(/\\/+$/, '');\n this.complianceBaseURL = cfg.complianceBaseURL\n ? cfg.complianceBaseURL.replace(/\\/+$/, '')\n : 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 /** 当前 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);\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);\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);\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 );\n } else {\n tokenResp = await exchangeCode(\n meta,\n clientID,\n result.code,\n result.redirectURI,\n verifier,\n signal,\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 meta = await discover(this.serverURL, signal);\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);\n } catch {\n // ignore\n }\n try {\n await revokeToken(meta, tokens.refresh_token, signal);\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 if (this.meta == null) {\n try {\n this.meta = await discover(this.serverURL, signal);\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(this.meta, this.tokens.client_id, this.tokens.refresh_token, signal);\n } catch (e) {\n throw new Error(`refresh token: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n this.tokens = newTokenSet(tokenResp, this.tokens.client_id, this.serverURL);\n try {\n await this.store.save(this.tokens);\n } catch (e) {\n console.warn(`[acosmi-sdk] warning: save refreshed token failed: ${e instanceof Error ? e.message : String(e)}`);\n }\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 if (this.meta == null) {\n this.meta = await discover(this.serverURL, signal);\n }\n const tokenResp = await refreshToken(\n this.meta,\n this.tokens.client_id,\n this.tokens.refresh_token,\n signal,\n );\n this.tokens = newTokenSet(tokenResp, this.tokens.client_id, this.serverURL);\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 }\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 req.stream = false;\n // chat 请求可能 30-120s+, 使用 5 分钟超时而非默认 30s\n const ctl = withRequestTimeout(5 * 60 * 1000, signal);\n try {\n const { body, adapter } = await this.buildChatRequest(modelID, req, 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 * 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 req.stream = false;\n const ctl = withRequestTimeout(5 * 60 * 1000, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, req);\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 req.stream = false;\n const ctl = withRequestTimeout(5 * 60 * 1000, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, req);\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('./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 req.stream = true;\n const { body, adapter } = await this.buildChatRequest(modelID, req, 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 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 req.stream = true;\n const { body, adapter } = await this.buildChatRequest(modelID, req, 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 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 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 let base = 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 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 ): Promise<{ result: Uint8Array; headers: Headers }> {\n return this.doJSONFullRawInternal(method, path, body, signal, false);\n }\n\n private async doJSONFullRawInternal(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n retried: boolean,\n ): Promise<{ result: Uint8Array; 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.doJSONFullRawInternal(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 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 * 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 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\ninterface 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","// 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 './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 await fs.writeFile(tmp, data, { encoding: 'utf8', mode: 0o600 });\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 }\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 return JSON.parse(data) as TokenSet;\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 try {\n return JSON.parse(data) as TokenSet;\n } catch {\n return null;\n }\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 './types';\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","// 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 './types';\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","// client/compliance.ts — Compliance 域 SDK-facing subclient。\n//\n// 设计原则(严格):\n// - 走独立 base URL(client.complianceURL(path)),不复用 /api/v4 路径。\n// - GET 走 retryOn401=true(与 agent-runs 同节奏,幂等安全)。\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 } from '../client';\nimport type { APIResponse, BusinessError } from '../types';\nimport { apiResponseBusinessError } from '../types';\nimport {\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../client-helpers';\nimport type {\n ApproveSealApprovalQuery,\n CancelSealApprovalQuery,\n CompliancePollOptions,\n ComplianceProviderRequestStatus,\n ComplianceReport,\n ComplianceTimestampVerificationStatus,\n ComplianceWriteOptions,\n CreateEvidenceAssetRequest,\n CreateH5SigningUrlRequest,\n CreateReportRequest,\n CreateSigningEnvelopeRequest,\n EvidenceAsset,\n EvidencePackage,\n IssueTimestampRequest,\n ProviderRequestStatusView,\n PublicEvidenceVerifyResult,\n RejectSealApprovalQuery,\n ReportDownload,\n SealApproval,\n SignEnvelopeRequest,\n SigningEnvelope,\n SubmitSealApprovalRequest,\n TimestampToken,\n TimestampVerifyResult,\n VerifyTimestampRequest,\n} from '../compliance-types';\nimport {\n classifyComplianceError,\n isComplianceBusinessError,\n type ComplianceErrorInfo,\n} from '../compliance-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 * 公开 verify。隐私边界:返回字段不含 PII / 合同原文 / storage / provider raw。\n * 服务端不要求 compliance scope(公开端点);但 SDK 仍带上 token 以便审计。\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.read<PublicEvidenceVerifyResult>(\n 'GET',\n `/compliance/evidence/verify${qs ? '?' + qs : ''}`,\n null,\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 /** 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 // 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 // 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 * 发布报告(写,step-up 必须)。\n *\n * 缺少 step-up 时服务端会返回 `COMPLIANCE_STEP_UP_REQUIRED`(数值码\n * 1031000013)。SDK 不会自动重试;调用方需要引导用户重新做 OAuth introspection 或\n * 重新登录后再次调用本方法(使用同一 idempotency-key)。\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 * 正式签署(写,step-up 必须)。\n *\n * 服务端闸门关闭时会一致返回 `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 * 同上:服务端闸门关闭时 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 // Seal Approval\n // =========================================================================\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 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 // 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 // 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 * 写路径: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 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 return this.executeJson<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 throw new CompliancePollError('compliance poll aborted', 'unknown');\n }\n lastValue = await fetcher();\n const decision = classify(lastValue);\n if (decision === 'done') return lastValue;\n if (decision === 'failed') {\n throw new CompliancePollError(\n 'compliance poll observed terminal failure',\n 'terminal_failure',\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 throw new CompliancePollError('compliance poll timed out', 'timeout');\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\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","// 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","// 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\nexport type AgentRunStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';\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\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","// client/agent-runs.ts — SDK-facing Agent Run Gateway client.\n\nimport type { APIResponse } from '../types';\nimport { apiResponseBusinessError } from '../types';\nimport { Client } from '../client';\nimport {\n iterSSELines,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../client-helpers';\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 AgentRunRunOptions,\n type AgentRunStatus,\n type AgentRunStreamEvent,\n type AgentRunStreamOptions,\n type AgentRunWithLocalToolsOptions,\n} from '../agent-runs-types';\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 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 const data = await readLimited(resp.body!, maxDownloadSize);\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 const timer = setTimeout(() => ctl.abort(), timeoutMs);\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 try {\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 } catch (e) {\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 const resp = await this.requestRaw(method, path, body, signal, opts);\n const text = await resp.text();\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 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 return this.requestRaw(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}\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}\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 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 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\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","// client/entitlements.ts — 端口自 acosmi-sdk-go/client.go (Entitlements + V29 Per-Model Bucket section)\n//\n// declaration merging 扩展 Client class.\n\nimport type {\n APIResponse,\n BalanceDetail,\n ConsumeRecordPage,\n EntitlementBalance,\n EntitlementItem,\n ModelBucket,\n ModelByQuotaResponse,\n ModelCoefficient,\n} from '../types';\nimport { Client } from '../client';\nimport { coefCacheTTLMs } from '../client-helpers';\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 {\n APIResponse,\n Order,\n OrderStatus,\n PayPayload,\n TokenPackage,\n YudaoPageResult,\n} from '../types';\nimport { OrderTerminalError } from '../types';\nimport { Client } from '../client';\nimport { isOrderSuccess, isOrderTerminal } from '../client-helpers';\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, Transaction, WalletStats } from '../types';\nimport { Client } from '../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 {\n APIResponse,\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 '../types';\nimport { Client } from '../client';\nimport {\n classifyTransport,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n readLimitedText,\n} from '../client-helpers';\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, ToolListResponse, ToolView } from '../types';\nimport { Client } from '../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","// client/notifications.ts — 端口自 acosmi-sdk-go/client.go (Notifications section)\n\nimport type {\n APIResponse,\n DeviceRegistration,\n NotificationList,\n NotificationPreference,\n NotificationUnreadCount,\n} from '../types';\nimport { Client } from '../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","// 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 './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","// 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 './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 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 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","// 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 './types';\nimport { Client } from './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"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/betas.ts","../src/adapters/anthropic.ts","../src/adapters/openai.ts","../src/adapters/index.ts","../src/index.ts","../src/model-helpers.ts","../src/auth.ts","../src/scopes.ts","../src/compliance-status.ts","../src/compliance-errors.ts","../src/client.ts","../src/store.ts","../src/retry.ts","../src/stream-meta.ts","../src/client-helpers.ts","../src/client/compliance.ts","../src/sanitize/index.ts","../src/sanitize/types.ts","../src/sanitize/config.ts","../src/sanitize/history.ts","../src/sanitize/defensive.ts","../src/agent-runs-types.ts","../src/client/agent-runs.ts","../src/client/entitlements.ts","../src/client/packages.ts","../src/client/wallet.ts","../src/client/skills.ts","../src/client/tools.ts","../src/client/notifications.ts","../src/sanitize-bridge.ts","../src/ws.ts","../src/bug-report.ts"],"names":["stopJSON","ProviderFormat","parseOpenAIResponseToAnthropic","sleep","isPlainObject","event","sleepWithSignal"],"mappings":"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","file":"index.mjs","sourcesContent":["// types.ts — 端口自 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// 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 return Date.now() > expiresAt - 30_000;\n}\n\n/** 动态注册响应 */\nexport interface ClientRegistration {\n client_id: string;\n client_secret?: string;\n}\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/**\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// ---------- 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// OpenAI 兼容响应类型 (非 Anthropic 厂商)\n// =============================================================================\n\nexport interface OpenAIChatResponse {\n id: string;\n /** \"chat.completion\" */\n object: string;\n model: string;\n choices: OpenAIChatChoice[];\n usage: OpenAIUsage;\n}\n\nexport interface OpenAIChatChoice {\n index: number;\n message: OpenAIChatMessage;\n /** \"stop\", \"tool_calls\", \"length\" */\n finish_reason: string;\n}\n\nexport interface OpenAIChatMessage {\n role: string;\n content: string;\n tool_calls?: OpenAIToolCall[];\n /** GLM/DeepSeek thinking */\n reasoning_content?: string;\n}\n\nexport interface OpenAIToolCall {\n id: string;\n /** \"function\" */\n type: string;\n function: OpenAIFunctionCall;\n}\n\nexport interface OpenAIFunctionCall {\n name: string;\n arguments: string;\n}\n\nexport interface OpenAIUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\n/** OpenAI SSE delta 格式 */\nexport interface OpenAIStreamChunk {\n id: string;\n /** \"chat.completion.chunk\" */\n object: string;\n choices: OpenAIStreamChoice[];\n usage?: OpenAIUsage;\n}\n\nexport interface OpenAIStreamChoice {\n index: number;\n delta: OpenAIStreamDelta;\n finish_reason: string | null;\n}\n\nexport interface OpenAIStreamDelta {\n role?: string;\n content?: string;\n reasoning_content?: string;\n tool_calls?: OpenAIStreamToolCall[];\n}\n\nexport interface OpenAIStreamToolCall {\n index: number;\n id?: string;\n type?: string;\n function: OpenAIFunctionCall;\n}\n\n// =============================================================================\n// ChatResponse / AnthropicResponse\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 * 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\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\n// =============================================================================\n// Entitlements\n// =============================================================================\n\n/** 权益余额 (聚合) */\nexport interface EntitlementBalance {\n totalTokenQuota: number;\n totalTokenUsed: number;\n totalTokenRemaining: number;\n totalCallQuota: number;\n totalCallUsed: number;\n totalCallRemaining: number;\n activeEntitlements: number;\n}\n\n/** 单条权益明细 */\nexport interface EntitlementItem {\n id: string;\n type: string;\n status: string;\n tokenQuota: number;\n tokenUsed: number;\n tokenRemaining: number;\n callQuota: number;\n callUsed: number;\n callRemaining: number;\n expiresAt?: string;\n sourceId?: string;\n sourceType?: string;\n remark?: string;\n createdAt: string;\n}\n\n/** 详细余额 (含每条权益明细) */\nexport interface BalanceDetail {\n totalTokenQuota: number;\n totalTokenUsed: number;\n totalTokenRemaining: number;\n totalCallQuota: number;\n totalCallUsed: number;\n totalCallRemaining: number;\n activeEntitlements: number;\n entitlements: EntitlementItem[];\n}\n\n/** 核销记录 */\nexport interface ConsumeRecord {\n id: string;\n entitlementId: string;\n requestId: string;\n modelId?: string;\n tokensConsumed: number;\n status: string;\n createdAt: string;\n}\n\n/** 核销记录分页响应 */\nexport interface ConsumeRecordPage {\n records: ConsumeRecord[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n// =============================================================================\n// V29 Per-Model Bucket\n// =============================================================================\n\n/**\n * 单桶视图 (用户多桶 hero / 模型切换提示用)\n *\n * 字段名仍叫 ETU 但 T3 死代码清除后 = raw token (V29 系数管理已退役)。\n */\nexport interface ModelBucket {\n bucketId: string;\n entitlementId: string;\n /** \"*\" = 通配 */\n modelId: string;\n /** COMMERCIAL / GENERIC */\n bucketClass: string;\n tokenQuota: number;\n tokenUsed: number;\n tokenRemaining: number;\n callQuota: number;\n callUsed: number;\n callRemaining: number;\n allowedModelsJson?: string;\n}\n\n/** GetByModel 响应; primaryBucket 在 bucketId 为空时表示无可用桶。 */\nexport interface ModelByQuotaResponse {\n modelId: string;\n /** 折算后剩余 (调度判定用) */\n etuRemaining: number;\n /** 反系数估算的原始 token (UI 展示用) */\n rawTokenRemaining: number;\n hasQuota: boolean;\n primaryBucket?: ModelBucket;\n}\n\n/** 单条模型系数 (SDK TTL 8s 缓存源) */\nexport interface ModelCoefficient {\n modelId: string;\n tenantId: string;\n inputCoef: number;\n outputCoef: number;\n cacheReadCoef: number;\n cacheCreationCoef: number;\n version: number;\n effectiveAt: string;\n}\n\n// =============================================================================\n// Token Packages (商城)\n// =============================================================================\n\n/** 流量包商品。price 用 string (Go json.Number) 避免浮点精度丢失。 */\nexport interface TokenPackage {\n id: string;\n name: string;\n description?: string;\n tokenQuota: number;\n callQuota?: number;\n price: string;\n validDays: number;\n isEnabled: boolean;\n sortOrder?: number;\n}\n\n/** 订单。amount 用 string (Go json.Number) 避免精度丢失。 */\nexport interface Order {\n id: string;\n packageId: string;\n packageName?: string;\n amount: string;\n status: string;\n payUrl?: string;\n createdAt: string;\n}\n\n/** 订单状态 */\nexport interface OrderStatus {\n orderId: string;\n status: string;\n}\n\n/** 下单请求 */\nexport interface PayPayload {\n payMethod?: string;\n}\n\n// =============================================================================\n// Wallet (钱包)\n// =============================================================================\n\n/** 钱包统计。金额使用 string (Go json.Number) 避免浮点精度丢失 (金融安全) */\nexport interface WalletStats {\n balance: string;\n monthlyConsumption: string;\n monthlyRecharge: string;\n transactionCount: number;\n}\n\n/** 交易记录 */\nexport interface Transaction {\n id: string;\n type: string;\n amount: string;\n remark?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// Skill Store\n// =============================================================================\n\nexport interface SkillStoreItem {\n id: string;\n pluginId: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n category: string;\n inputSchema: string;\n outputSchema: string;\n timeout: number;\n retryCount: number;\n retryDelay: number;\n version: string;\n totalCalls: number;\n avgDurationMs: number;\n successRate: number;\n isEnabled: boolean;\n securityLevel: string;\n securityScore: number;\n scope: string;\n status: string;\n downloadCount: number;\n readme: string;\n tags: string[];\n author: string;\n publisherId: string;\n isPublished: boolean;\n pluginName: string;\n pluginIcon: string;\n updatedAt: string;\n visibility?: string;\n certificationStatus?: string;\n source?: string;\n}\n\n/** 技能商店搜索参数 (非 wire 类型, 用于 client 方法参数) */\nexport interface SkillStoreQuery {\n category?: string;\n keyword?: string;\n tag?: string;\n}\n\n/** 技能统计概览 */\nexport interface SkillSummary {\n installed: number;\n created: number;\n total: number;\n storeAvailable: number;\n}\n\n/** 技能商店分页浏览响应 */\nexport interface SkillBrowseResponse {\n items: SkillStoreItem[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n/**\n * 技能商店列表项(轻量,仅含浏览所需字段)\n * 配合服务端 fields=minimal 参数使用,响应体积缩减 90%+\n */\nexport interface SkillStoreListItem {\n id: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n category: string;\n version: string;\n author: string;\n downloadCount: number;\n tags: string[];\n certificationStatus?: string;\n visibility?: string;\n source?: string;\n updatedAt: string;\n}\n\n/** 技能商店轻量浏览响应 */\nexport interface SkillBrowseListResponse {\n items: SkillStoreListItem[];\n total: number;\n page: number;\n pageSize: number;\n}\n\n/** 技能认证状态响应 */\nexport interface CertificationStatus {\n skillId: string;\n certificationStatus: string;\n certifiedAt?: number;\n securityLevel?: string;\n securityScore: number;\n report?: unknown;\n}\n\n// =============================================================================\n// Skill Generator\n// =============================================================================\n\nexport interface GenerateSkillRequest {\n purpose: string;\n examples?: string[];\n inputHints?: string;\n outputHints?: string;\n category?: string;\n language?: string;\n}\n\nexport interface GenerateSkillResult {\n skillName: string;\n skillKey: string;\n description: string;\n skillMd: string;\n inputSchema: string;\n outputSchema: string;\n testCases: string[];\n readme: string;\n category: string;\n tags: string[];\n timeout: number;\n}\n\nexport interface OptimizeSkillRequest {\n skillName: string;\n description?: string;\n inputSchema?: string;\n outputSchema?: string;\n readme?: string;\n aspects?: string[];\n}\n\nexport interface OptimizeSkillResult {\n optimizedSkill: GenerateSkillResult;\n changes: string[];\n score: number;\n}\n\n// =============================================================================\n// Unified Tools\n// =============================================================================\n\nexport interface ToolView {\n id: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n category: string;\n inputSchema: string;\n outputSchema: string;\n timeout: number;\n isEnabled: boolean;\n provider?: ToolProvider;\n}\n\nexport interface ToolProvider {\n id: string;\n name: string;\n icon: string;\n sourceType: string;\n mcpEndpoint?: string;\n isEnabled: boolean;\n}\n\nexport interface ToolListResponse {\n skills: ToolView[];\n total: number;\n}\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\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\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","// 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 BusinessError,\n ThinkingHighMinMaxTokens,\n ThinkingMax,\n ThinkingMaxFallbackMaxTokens,\n ThinkingOff,\n} from '../types';\nimport { buildBetas } from '../betas';\nimport { ProviderFormat, type ProviderAdapter } from './index';\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 if (req.metadata) {\n body['metadata'] = req.metadata;\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 已由 SDK 管理,\n // extraBody 中不应包含这些 key, 否则会覆盖 SDK 计算结果\n if (req.extraBody) {\n for (const [k, v] of Object.entries(req.extraBody)) {\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 {\n type AnthropicContentBlock,\n type AnthropicResponse,\n type ChatContentBlock,\n type ChatRequest,\n type ChatResponse,\n type ModelCapabilities,\n type OpenAIChatResponse,\n type OpenAIStreamChunk,\n type StreamEvent,\n BusinessError,\n ThinkingHigh,\n ThinkingMax,\n ThinkingOff,\n} from '../types';\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 // ── 流式选项 ──\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 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 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.blockIndex,\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 (如果有)\n if (this.thinkingStarted && !this.thinkingStopped) {\n this.thinkingStopped = true;\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 }\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 // 关闭 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 const stopJSON = JSON.stringify({\n type: 'content_block_stop',\n index: this.blockIndex,\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 非空 → 按其值返回 (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 */\nexport function getAdapterForModel(m: ManagedModel): ProviderAdapter {\n const pref = (m.preferred_format ?? '').trim().toLowerCase();\n switch (pref) {\n case 'anthropic':\n return new AnthropicAdapter();\n case 'openai':\n return new OpenAIAdapter();\n }\n\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 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 };\n","// index.ts — Acosmi SDK TypeScript 主入口\n//\n// 端口源: acosmi-sdk-go v0.19.0 (一字不差对齐)\n//\n// 双格式红线: AnthropicAdapter + OpenAIAdapter 等地位 (对应两个不同下游产品)。\n\n// === 类型 ===\nexport * from './types';\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// === Auth helpers ===\nexport {\n discover,\n register,\n authorize,\n exchangeCode,\n refreshToken,\n revokeToken,\n newTokenSet,\n isSSLError,\n EventAuthURL,\n EventComplete,\n EventError,\n ErrDiscovery,\n ErrRegistration,\n ErrBrowserOpen,\n ErrAuthDenied,\n ErrTimeout,\n ErrTokenExchange,\n ErrSSLProxy,\n type LoginEvent,\n type LoginEventType,\n type LoginErrCode,\n type LoginOptions,\n type AuthorizeResult,\n} from './auth';\n\n// === Scopes ===\nexport * from './scopes';\n\n// === Compliance ===\n// 暴露 envelope/审批/provider/billing 的对外稳定状态与错误码 + SDK 公共领域类型\n// + 数值错误码 → symbolic key 的分类器;不暴露下游材料、provider ledger /\n// distribution billing 内部 API。\nexport * from './compliance-status';\nexport * from './compliance-types';\nexport {\n classifyComplianceError,\n isComplianceBusinessError,\n type ComplianceErrorInfo,\n type ComplianceErrorKey,\n} from './compliance-errors';\nexport { ComplianceClient, CompliancePollError } from './client/compliance';\n\n// === TokenStore ===\nexport {\n type TokenStore,\n FileTokenStore,\n LocalStorageTokenStore,\n InMemoryTokenStore,\n newFileTokenStore,\n fileLockDefaults,\n} from './store';\n\n// === Retry ===\nexport {\n type RetryPolicy,\n type RetryRequestInfo,\n DefaultRetryPolicy,\n defaultRetryable,\n defaultSafeToRetry,\n computeBackoff,\n effectivePolicy,\n} from './retry';\n\n// === Sanitize ===\nexport * as sanitize from './sanitize';\n\n// === Stream meta ===\nexport { extractAnthropicBlockMeta, type BlockMeta } from './stream-meta';\n\n// === Agent Runs ===\nexport * from './agent-runs-types';\nexport { AgentRunsClient } from './client/agent-runs';\n\n// === Betas ===\nexport { buildBetas, uniqueMerge } from './betas';\n\n// === Client + 业务 mixins (必须 side-effect import 才能挂 prototype) ===\nexport { Client, type Config, type FilterStatus } from './client';\nexport {\n FilterStatusOK,\n FilterStatusAdminBypass,\n FilterStatusInternalBypass,\n FilterStatusDisabledByFlag,\n FilterStatusFallbackTkdistError,\n FilterStatusFallbackTkdistSkew,\n FilterStatusFallbackNoBuckets,\n FilterStatusFallbackMissingUser,\n FilterStatusUnknown,\n} from './client';\n\n// 业务方法 — side-effect import 注入到 Client.prototype\nimport './client/entitlements';\nimport './client/packages';\nimport './client/wallet';\nimport './client/skills';\nimport './client/tools';\nimport './client/notifications';\nimport './client/agent-runs';\nimport './client/compliance';\nimport './sanitize-bridge';\nimport './ws';\nimport './bug-report';\n\nexport type { WSConfig } from './ws';\nexport type { BugReportResult, BugView } from './bug-report';\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","// auth.ts — 端口自 acosmi-sdk-go/auth.go (474 行)\n//\n// 跨平台 OAuth 2.1 PKCE helpers + Node-only authorize (HTTP callback server)。\n// 浏览器调用 authorize 会抛错 — 浏览器侧应自行实现 popup window + redirect handler。\n\nimport type { ClientRegistration, ServerMetadata, TokenResponse, TokenSet } from './types';\n\n/** auth 专用超时 (毫秒) — 与 Go authHTTPClient 30s 一致 */\nconst authTimeoutMs = 30_000;\n\n// =============================================================================\n// Discovery\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(serverURL: string, signal?: AbortSignal): 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/desktop`;\n\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetch(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// Dynamic Client Registration (RFC 7591)\n// =============================================================================\n\n/** 动态注册桌面客户端,获取 client_id */\nexport async function register(\n meta: ServerMetadata,\n appName: string,\n signal?: AbortSignal,\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 fetch(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\nasync function generateCodeVerifier(): 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 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\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\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 * 浏览器环境会抛错 — 浏览器侧应自行实现 popup window + 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// 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): 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);\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): 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);\n}\n\n/** 刷新 access_token */\nexport async function refreshToken(\n meta: ServerMetadata,\n clientID: string,\n refreshTokenValue: string,\n signal?: AbortSignal,\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);\n}\n\n/** 吊销 token. 服务端不支持吊销时静默跳过. */\nexport async function revokeToken(\n meta: ServerMetadata,\n token: string,\n signal?: AbortSignal,\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 fetch(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): Promise<TokenResponse> {\n const ctl = withTimeout(authTimeoutMs, signal);\n let resp: Response;\n try {\n resp = await fetch(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_description?: string } = {};\n try {\n errBody = (await resp.json()) as { error_description?: string };\n } catch {\n // ignore\n }\n throw new Error(`token: HTTP ${resp.status}: ${errBody.error_description ?? ''}`);\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","// 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: 本文件 ComplianceScope* 常量\n// 合规 scope 不做分组合并 — 服务端按细粒度校验, SDK 也只应按需申请最小集合。\n\nexport const ScopeAI = 'ai'; // 模型服务: 模型调用 + 流量包 + 权益\nexport const ScopeSkills = 'skills'; // 技能与工具: 技能商店 + 工具列表 + 执行\nexport const ScopeAccount = 'account'; // 账户信息: 个人资料 + 钱包余额 + 交易记录\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// ===========================================================================\n// 合规履约 scope\n// ===========================================================================\n//\n// 调用 compliance API 时必须按这些常量声明所需 scope; 不允许通过 ScopeAI /\n// ScopeAccount 隐式获得 compliance 权限。\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\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\n/** 全部分组 scope (推荐) */\nexport function allScopes(): string[] {\n return [ScopeAI, ScopeSkills, ScopeAccount];\n}\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 ];\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","// 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\nimport type { BusinessError } from './types';\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","// 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 {\n type AnthropicResponse,\n type ChatRequest,\n type ChatResponse,\n type ManagedModel,\n type ModelCapabilities,\n type ModelCoefficient,\n type QuotaSummary,\n type ServerMetadata,\n type SourcesEvent,\n type StreamEvent,\n type StreamSettlement,\n type TokenSet,\n ModelNotFoundError,\n apiResponseBusinessError,\n parseSettlement,\n parseSourcesEvent,\n tokenSetIsExpired,\n type APIResponse,\n} from './types';\nimport {\n discover,\n exchangeCode,\n exchangeCodeWithExpiry,\n refreshToken,\n register,\n revokeToken,\n authorize,\n newTokenSet,\n isSSLError,\n EventComplete,\n EventError,\n ErrDiscovery,\n ErrRegistration,\n ErrSSLProxy,\n ErrTokenExchange,\n type LoginEvent,\n type LoginErrCode,\n type LoginOptions,\n} from './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 './adapters/index';\nimport { extractAnthropicBlockMeta, type BlockMeta } from './stream-meta';\nimport { newOpenAIStreamConverter } from './adapters/openai';\nimport {\n classifyTransport,\n iterSSELines,\n maxErrorBodySize,\n modelCacheTTLMs,\n parseHTTPErrorWithHeader,\n parseStreamError,\n readLimited,\n} from './client-helpers';\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// Config\n// =============================================================================\n\n/** 客户端配置 */\nexport interface Config {\n /**\n * nexus-v4 API 根地址 (默认 https://acosmi.com)。\n * SDK 自动追加 /api/v4, 无需手动拼接。\n */\n serverURL?: 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// =============================================================================\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 /** 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 this.serverURL = (cfg.serverURL ?? 'https://acosmi.com').replace(/\\/+$/, '');\n this.complianceBaseURL = cfg.complianceBaseURL\n ? cfg.complianceBaseURL.replace(/\\/+$/, '')\n : 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 /** 当前 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);\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);\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);\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 );\n } else {\n tokenResp = await exchangeCode(\n meta,\n clientID,\n result.code,\n result.redirectURI,\n verifier,\n signal,\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 meta = await discover(this.serverURL, signal);\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);\n } catch {\n // ignore\n }\n try {\n await revokeToken(meta, tokens.refresh_token, signal);\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 if (this.meta == null) {\n try {\n this.meta = await discover(this.serverURL, signal);\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(this.meta, this.tokens.client_id, this.tokens.refresh_token, signal);\n } catch (e) {\n throw new Error(`refresh token: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n this.tokens = newTokenSet(tokenResp, this.tokens.client_id, this.serverURL);\n try {\n await this.store.save(this.tokens);\n } catch (e) {\n console.warn(`[acosmi-sdk] warning: save refreshed token failed: ${e instanceof Error ? e.message : String(e)}`);\n }\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 if (this.meta == null) {\n this.meta = await discover(this.serverURL, signal);\n }\n const tokenResp = await refreshToken(\n this.meta,\n this.tokens.client_id,\n this.tokens.refresh_token,\n signal,\n );\n this.tokens = newTokenSet(tokenResp, this.tokens.client_id, this.serverURL);\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 }\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 req.stream = false;\n // chat 请求可能 30-120s+, 使用 5 分钟超时而非默认 30s\n const ctl = withRequestTimeout(5 * 60 * 1000, signal);\n try {\n const { body, adapter } = await this.buildChatRequest(modelID, req, 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 * 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 req.stream = false;\n const ctl = withRequestTimeout(5 * 60 * 1000, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, req);\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 req.stream = false;\n const ctl = withRequestTimeout(5 * 60 * 1000, signal);\n try {\n const caps = this.getCachedCapabilities(modelID) ?? zeroModelCapabilities();\n const body = adapter.buildRequestBody(caps, req);\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('./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 req.stream = true;\n const { body, adapter } = await this.buildChatRequest(modelID, req, 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 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 req.stream = true;\n const { body, adapter } = await this.buildChatRequest(modelID, req, 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 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 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 let base = 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 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 ): Promise<{ result: Uint8Array; headers: Headers }> {\n return this.doJSONFullRawInternal(method, path, body, signal, false);\n }\n\n private async doJSONFullRawInternal(\n method: string,\n path: string,\n body: unknown | null,\n signal: AbortSignal | undefined,\n retried: boolean,\n ): Promise<{ result: Uint8Array; 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.doJSONFullRawInternal(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 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 * 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 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\ninterface 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","// 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 './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 await fs.writeFile(tmp, data, { encoding: 'utf8', mode: 0o600 });\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 }\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 return JSON.parse(data) as TokenSet;\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 try {\n return JSON.parse(data) as TokenSet;\n } catch {\n return null;\n }\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 './types';\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","// 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 './types';\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","// client/compliance.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 } from '../client';\nimport type { APIResponse, BusinessError } from '../types';\nimport { apiResponseBusinessError } from '../types';\nimport {\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../client-helpers';\nimport type {\n ApproveSealApprovalQuery,\n CancelSealApprovalQuery,\n CompliancePollOptions,\n ComplianceProviderRequestStatus,\n ComplianceReport,\n ComplianceTimestampVerificationStatus,\n ComplianceWriteOptions,\n CreateEvidenceAssetRequest,\n CreateH5SigningUrlRequest,\n CreateReportRequest,\n CreateSigningEnvelopeRequest,\n EvidenceAsset,\n EvidencePackage,\n IssueTimestampRequest,\n ProviderRequestStatusView,\n PublicEvidenceVerifyResult,\n RejectSealApprovalQuery,\n ReportDownload,\n SealApproval,\n SignEnvelopeRequest,\n SigningEnvelope,\n SubmitSealApprovalRequest,\n TimestampToken,\n TimestampVerifyResult,\n VerifyTimestampRequest,\n} from '../compliance-types';\nimport {\n classifyComplianceError,\n isComplianceBusinessError,\n type ComplianceErrorInfo,\n} from '../compliance-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 * 公开 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 /** 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 // 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 // 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 * 发布报告(写,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 * 正式签署(写,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 // 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 // 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 // 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 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 return this.executeJson<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 throw new CompliancePollError('compliance poll aborted', 'unknown');\n }\n lastValue = await fetcher();\n const decision = classify(lastValue);\n if (decision === 'done') return lastValue;\n if (decision === 'failed') {\n throw new CompliancePollError(\n 'compliance poll observed terminal failure',\n 'terminal_failure',\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 throw new CompliancePollError('compliance poll timed out', 'timeout');\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\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","// 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","// 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\nexport type AgentRunStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';\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\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","// client/agent-runs.ts — SDK-facing Agent Run Gateway client.\n\nimport type { APIResponse } from '../types';\nimport { apiResponseBusinessError } from '../types';\nimport { Client } from '../client';\nimport {\n iterSSELines,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n} from '../client-helpers';\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 AgentRunRunOptions,\n type AgentRunStatus,\n type AgentRunStreamEvent,\n type AgentRunStreamOptions,\n type AgentRunWithLocalToolsOptions,\n} from '../agent-runs-types';\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 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 const data = await readLimited(resp.body!, maxDownloadSize);\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 const timer = setTimeout(() => ctl.abort(), timeoutMs);\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 try {\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 } catch (e) {\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 const resp = await this.requestRaw(method, path, body, signal, opts);\n const text = await resp.text();\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 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 return this.requestRaw(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}\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}\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 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 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\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","// client/entitlements.ts — 端口自 acosmi-sdk-go/client.go (Entitlements + V29 Per-Model Bucket section)\n//\n// declaration merging 扩展 Client class.\n\nimport type {\n APIResponse,\n BalanceDetail,\n ConsumeRecordPage,\n EntitlementBalance,\n EntitlementItem,\n ModelBucket,\n ModelByQuotaResponse,\n ModelCoefficient,\n} from '../types';\nimport { Client } from '../client';\nimport { coefCacheTTLMs } from '../client-helpers';\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 {\n APIResponse,\n Order,\n OrderStatus,\n PayPayload,\n TokenPackage,\n YudaoPageResult,\n} from '../types';\nimport { OrderTerminalError } from '../types';\nimport { Client } from '../client';\nimport { isOrderSuccess, isOrderTerminal } from '../client-helpers';\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, Transaction, WalletStats } from '../types';\nimport { Client } from '../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 {\n APIResponse,\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 '../types';\nimport { Client } from '../client';\nimport {\n classifyTransport,\n maxDownloadSize,\n maxErrorBodySize,\n parseHTTPErrorWithHeader,\n readLimited,\n readLimitedText,\n} from '../client-helpers';\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, ToolListResponse, ToolView } from '../types';\nimport { Client } from '../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","// client/notifications.ts — 端口自 acosmi-sdk-go/client.go (Notifications section)\n\nimport type {\n APIResponse,\n DeviceRegistration,\n NotificationList,\n NotificationPreference,\n NotificationUnreadCount,\n} from '../types';\nimport { Client } from '../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","// 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 './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","// 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 './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 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 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","// 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 './types';\nimport { Client } from './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"]}
|