@tencent-ai/agent-harness 0.2.0-beta.1 → 0.2.0-beta.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.
Files changed (137) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -1
  3. package/cli/CHANGELOG.md +71 -0
  4. package/cli/dist-server/shared.cjs +318 -314
  5. package/cli/dist-server/types/node/acp/acp-protocol.d.ts +40 -12
  6. package/cli/dist-server/types/node/acp/usage-by-category-calculator.d.ts +21 -0
  7. package/cli/dist-server/types/node/cli/stream-json-protocol.d.ts +15 -1
  8. package/cli/dist-server/types/node/data-fs/index.d.ts +13 -1
  9. package/cli/dist-server/types/node/hooks/hook-protocol.d.ts +2 -2
  10. package/cli/dist-server/types/node/server/sessions.d.ts +24 -0
  11. package/cli/dist-server/types/node/server/types.d.ts +6 -0
  12. package/cli/dist-server/types/node/settings/settings-protocol.d.ts +5 -0
  13. package/cli/dist-server/types/node/tools/tool-protocol.d.ts +112 -2
  14. package/cli/dist-server/types/vendor/cbc-core/node/agent/agent-protocol.d.ts +29 -0
  15. package/cli/dist-server/types/vendor/cbc-core/node/agent/agent-service.d.ts +2 -0
  16. package/cli/dist-server/types/vendor/cbc-core/node/agent/index.d.ts +1 -0
  17. package/cli/dist-server/types/vendor/cbc-core/node/agent/interceptors/input-interceptors.d.ts +1 -6
  18. package/cli/dist-server/types/vendor/cbc-core/node/agent/runner-factory.d.ts +31 -11
  19. package/cli/dist-server/types/vendor/cbc-core/node/agent/speaker-label.d.ts +44 -0
  20. package/cli/dist-server/types/vendor/cbc-core/node/agent/tool-call-loop-detector-service.d.ts +5 -4
  21. package/cli/dist-server/types/vendor/cbc-core/node/agent/tool-call-loop-guard-protocol.d.ts +1 -1
  22. package/cli/dist-server/types/vendor/cbc-core/node/agent/tool-call-loop-pattern.d.ts +15 -4
  23. package/cli/dist-server/types/vendor/cbc-core/node/hooks/agent-trigger.d.ts +6 -22
  24. package/cli/dist-server/types/vendor/cbc-core/node/hooks/hook-protocol.d.ts +4 -1
  25. package/cli/dist-server/types/vendor/cbc-core/node/session/idle-queue-drain-service.d.ts +4 -56
  26. package/cli/dist-server/types/vendor/cbc-core/node/session/index.d.ts +3 -0
  27. package/cli/dist-server/types/vendor/cbc-core/node/session/interruption-service.d.ts +55 -9
  28. package/cli/dist-server/types/vendor/cbc-core/node/session/model-response-interceptors.d.ts +18 -0
  29. package/cli/dist-server/types/vendor/cbc-core/node/session/recovery-budget.d.ts +55 -0
  30. package/cli/dist-server/types/vendor/cbc-core/node/session/session-hook-manager.d.ts +15 -0
  31. package/cli/dist-server/types/vendor/cbc-core/node/session/session-manager.d.ts +10 -1
  32. package/cli/dist-server/types/vendor/cbc-core/node/session/session-persistence-error.d.ts +43 -0
  33. package/cli/dist-server/types/vendor/cbc-core/node/session/session-protocol.d.ts +63 -4
  34. package/cli/dist-server/types/vendor/cbc-core/node/session/session-run-state-machine-protocol.d.ts +1 -0
  35. package/cli/dist-server/types/vendor/cbc-core/node/session/session-runtime-lifecycle.d.ts +5 -0
  36. package/cli/dist-server/types/vendor/cbc-core/node/session/session-store.d.ts +150 -4
  37. package/cli/dist-server/types/vendor/cbc-core/node/session/stream-timeout-retry-budget.d.ts +13 -1
  38. package/cli/dist-server/types/vendor/cbc-core/node/utils/history-utils.d.ts +23 -0
  39. package/cli/dist-server/types/vendor/cbc-core/node/utils/index.d.ts +1 -0
  40. package/cli/dist-server/types/vendor/cbc-core/node/utils/message-utils.d.ts +12 -0
  41. package/cli/dist-server/types/vendor/cbc-core/node/utils/model-utils.d.ts +7 -0
  42. package/cli/dist-server/types/vendor/cbc-core/node/utils/queue-dispatch-utils.d.ts +24 -2
  43. package/cli/dist-server/types/vendor/cbc-core/node/utils/session-utils.d.ts +4 -1
  44. package/cli/dist-server/types/vendor/cbc-core/node/utils/string-retention-utils.d.ts +4 -0
  45. package/cli/dist-server/types/vendor/cbc-shared/node/hooks/hook-types.d.ts +7 -1
  46. package/cli/dist-server/types/vendor/cbc-shared/node/index.d.ts +2 -0
  47. package/cli/dist-server/types/vendor/cbc-shared/node/model/model-errors.d.ts +7 -3
  48. package/cli/dist-server/types/vendor/cbc-shared/node/tools/tool-names.d.ts +1 -0
  49. package/cli/dist-server/types/vendor/cbc-shared/node/utils/retry-backoff.d.ts +30 -0
  50. package/cli/dist-server/types/vendor/cbc-shared/node/utils/retry-policy.d.ts +26 -0
  51. package/cli/dist-server/types/workspace/authentication/lib/common/account-scoped-external-link-authentication-provider.d.ts +2 -2
  52. package/cli/dist-server/types/workspace/authentication/lib/common/account-utils.d.ts +25 -0
  53. package/cli/dist-server/types/workspace/authentication/lib/common/authentication-manager.d.ts +2 -2
  54. package/cli/dist-server/types/workspace/authentication/lib/common/authentication-protocol.d.ts +19 -2
  55. package/cli/dist-server/types/workspace/authentication/lib/common/external-link-authentication-provider.d.ts +2 -2
  56. package/cli/dist-server/types/workspace/authentication/lib/common/wx-authentication-provider.d.ts +2 -2
  57. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/agent-protocol.d.ts +29 -0
  58. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/agent-service.d.ts +2 -0
  59. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/index.d.ts +1 -0
  60. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/interceptors/input-interceptors.d.ts +1 -6
  61. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/runner-factory.d.ts +31 -11
  62. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/speaker-label.d.ts +44 -0
  63. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/tool-call-loop-detector-service.d.ts +5 -4
  64. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/tool-call-loop-guard-protocol.d.ts +1 -1
  65. package/cli/dist-server/types/workspace/cbc-core/lib/node/agent/tool-call-loop-pattern.d.ts +15 -4
  66. package/cli/dist-server/types/workspace/cbc-core/lib/node/hooks/agent-trigger.d.ts +6 -22
  67. package/cli/dist-server/types/workspace/cbc-core/lib/node/hooks/hook-protocol.d.ts +4 -1
  68. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/idle-queue-drain-service.d.ts +4 -56
  69. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/index.d.ts +3 -0
  70. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/interruption-service.d.ts +55 -9
  71. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/model-response-interceptors.d.ts +18 -0
  72. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/recovery-budget.d.ts +55 -0
  73. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-hook-manager.d.ts +15 -0
  74. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-manager.d.ts +10 -1
  75. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-persistence-error.d.ts +43 -0
  76. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-protocol.d.ts +63 -4
  77. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-run-state-machine-protocol.d.ts +1 -0
  78. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-runtime-lifecycle.d.ts +5 -0
  79. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/session-store.d.ts +150 -4
  80. package/cli/dist-server/types/workspace/cbc-core/lib/node/session/stream-timeout-retry-budget.d.ts +13 -1
  81. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/history-utils.d.ts +23 -0
  82. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/index.d.ts +1 -0
  83. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/message-utils.d.ts +12 -0
  84. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/model-utils.d.ts +7 -0
  85. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/queue-dispatch-utils.d.ts +24 -2
  86. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/session-utils.d.ts +4 -1
  87. package/cli/dist-server/types/workspace/cbc-core/lib/node/utils/string-retention-utils.d.ts +4 -0
  88. package/cli/dist-server/types/workspace/cbc-shared/lib/node/hooks/hook-types.d.ts +7 -1
  89. package/cli/dist-server/types/workspace/cbc-shared/lib/node/index.d.ts +2 -0
  90. package/cli/dist-server/types/workspace/cbc-shared/lib/node/model/model-errors.d.ts +7 -3
  91. package/cli/dist-server/types/workspace/cbc-shared/lib/node/tools/tool-names.d.ts +1 -0
  92. package/cli/dist-server/types/workspace/cbc-shared/lib/node/utils/retry-backoff.d.ts +30 -0
  93. package/cli/dist-server/types/workspace/cbc-shared/lib/node/utils/retry-policy.d.ts +26 -0
  94. package/cli/dist-server/types/workspace/cbc-workflow/lib/node/workflow/workflow-execution.d.ts +14 -1
  95. package/cli/dist-server/types/workspace/cbc-workflow/lib/node/workflow/workflow-manager.d.ts +7 -0
  96. package/cli/dist-server/types/workspace/cbc-worktree/lib/node/worktree/worktree-session.d.ts +3 -0
  97. package/cli/dist-server/types/workspace/product/lib/common/cloud-product-provider.d.ts +9 -0
  98. package/cli/dist-server/types/workspace/product/lib/common/index.d.ts +1 -0
  99. package/cli/dist-server/types/workspace/product/lib/common/pick-market-skill-id.d.ts +13 -0
  100. package/cli/dist-server/types/workspace/product/lib/common/tool-control-catalog.d.ts +2 -2
  101. package/cli/dist-server/types/workspace/product/lib/common/types/features.d.ts +62 -2
  102. package/cli/dist-server/types/workspace/product/lib/common/types/language-model.d.ts +66 -0
  103. package/cli/dist-server/types/workspace/product/lib/common/types/product.d.ts +7 -1
  104. package/cli/dist-server/types/workspace/sandbox-cli/lib/common/backup-policy.d.ts +10 -1
  105. package/cli/dist-server/types/workspace/sandbox-cli/lib/common/center-protocol.generated.d.ts +370 -4
  106. package/cli/dist-server/types/workspace/sandbox-cli/lib/common/file-policy.d.ts +1 -1
  107. package/cli/dist-server/types/workspace/sandbox-cli/lib/node/sandbox-center-client.d.ts +216 -0
  108. package/cli/package.json +1 -1
  109. package/cli/product.cloudhosted.json +2 -2
  110. package/cli/product.internal.json +259 -40
  111. package/cli/product.ioa.json +333 -148
  112. package/cli/product.json +309 -351
  113. package/cli/product.selfhosted.json +2 -2
  114. package/docs/README.md +1 -0
  115. package/docs/in-process.md +16 -0
  116. package/lib/application/services.d.ts +3 -1
  117. package/lib/application/services.js +1 -1
  118. package/lib/components/sandbox-center.d.mts +2 -0
  119. package/lib/components/sandbox-center.mjs +1 -0
  120. package/lib/components/session-config.d.mts +2 -0
  121. package/lib/components/session-config.mjs +1 -1
  122. package/lib/harness/create-harness.js +1 -1
  123. package/lib/harness/runtime.js +1 -1
  124. package/lib/harness/types.d.ts +3 -0
  125. package/lib/integration/executor-supervisor.js +1 -1
  126. package/lib/public.d.ts +1 -0
  127. package/lib/runtime/sandbox-center.d.ts +21 -0
  128. package/lib/runtime/sandbox-center.js +1 -0
  129. package/lib/server/public.d.ts +1 -0
  130. package/lib/session/agent-backend.d.ts +2 -0
  131. package/lib/session/agent-backend.js +1 -1
  132. package/lib/session/local-fs.js +1 -1
  133. package/lib/session/server-config.js +1 -1
  134. package/lib/session/server-interactions.js +1 -1
  135. package/package.json +25 -15
  136. package/lib/session/local-options.d.ts +0 -50
  137. package/lib/session/local-options.js +0 -1
@@ -6,9 +6,21 @@ import type { Session } from './session-protocol.js';
6
6
  * terminal results are suppressed only while a retry will actually be scheduled.
7
7
  */
8
8
  export declare function hasExhaustedStreamTimeoutRetryBudget(session: Session, isFirstTokenTimeout: boolean): boolean;
9
+ /**
10
+ * `finish_reason=error` 且没有可用输出的两种空流:reasoning-only 与 no-token。
11
+ * placeholder(空 200 / 心跳帧)仍是会话层终态,由拦截器切一次备站。
12
+ */
9
13
  export declare function isRetryableEmptyStreamError(error: unknown): boolean;
10
14
  /**
11
15
  * Empty 200 / placeholder-only:拦截器最多切一次备站,会话层终态(#115866)。
12
- * reasoning-only + finish_reason=error:上游瞬时失败,会话层最多重试 1 次(#122115)。
16
+ * reasoning-only / no-token + finish_reason=error:上游瞬时失败,按 error 预算重试。
17
+ * 流空闲超时 / 首 token 超时:按各自的超时预算重试。
13
18
  */
14
19
  export declare function shouldAutoRetryStreamTimeout(session: Session, error: unknown): boolean;
20
+ /**
21
+ * 为一次流错误恢复认领额度,返回序号(1-based);不可重试或已耗尽返回 `undefined`。
22
+ * 调用方必须先用 {@link shouldAutoRetryStreamTimeout} 判定,本函数只负责同步认领。
23
+ */
24
+ export declare function claimStreamRecoveryAttempt(session: Session, error: unknown): number | undefined;
25
+ /** 认领后没有真正发起恢复时退回额度。 */
26
+ export declare function releaseStreamRecoveryAttempt(session: Session, error: unknown): void;
@@ -364,6 +364,29 @@ export declare abstract class HistoryUtils {
364
364
  */
365
365
  static filterApiErrorMessages(history: AgentInputItem[]): AgentInputItem[];
366
366
  static filterRenameHistory(history: AgentInputItem[]): AgentInputItem[];
367
+ /**
368
+ * 让 model input 里的 tool_call 与 tool_result 严格一一配对(issue #119545)。
369
+ *
370
+ * 背景:工具结果丢失(状态机吞掉 TOOL_ENDED、持久化缺口、压缩切断)后,历史里会留下
371
+ * 只有 call、没有任何 result 的孤儿。上游对 tool_calls 强制配对,一条孤儿就让整个
372
+ * 请求 400,会话从此不可恢复——而本地历史里的孤儿是持久化的,每次恢复都会重现。
373
+ *
374
+ * 三类都处理,因为上游拒的是"不配对"这件事本身,方向无关:
375
+ * 1. call 没有任何同 callId 的结果项 → 丢 call;
376
+ * 2. 同一 callId 出现多条 call(重放/重试残留)→ 只留最后一条;
377
+ * 3. 结果项的 callId 没有留下来的 call(头部被截断,或 call 属于上面两类)→ 丢结果。
378
+ *
379
+ * 判据只看"存在性",不看结果的真伪:skipRun 占位/拒绝、partial aborted 等伪结果都算
380
+ * 配对,它们的取舍归 filterTruncatedToolCalls,两者职责不重叠。改写只落在当轮副本上,
381
+ * 因此日志按轮聚合成一条并截断样本。
382
+ */
383
+ static filterUnpairedToolCalls(modelData: {
384
+ input: AgentInputItem[];
385
+ instructions?: string;
386
+ }, logger?: Logger): {
387
+ input: AgentInputItem[];
388
+ instructions?: string;
389
+ };
367
390
  static getItemsNeedingFill(history: AgentInputItem[]): FunctionCallItem[];
368
391
  static getFillItemsForNeedingFill(itemsNeedingFill: FunctionCallItem[]): FunctionCallResultItem[];
369
392
  /**
@@ -23,5 +23,6 @@ export * from './queue-dispatch-utils.js';
23
23
  export * from './run-result-utils.js';
24
24
  export * from './session-utils.js';
25
25
  export * from './summary-utils.js';
26
+ export * from './string-retention-utils.js';
26
27
  export * from './token-utils.js';
27
28
  export * from './usage-utils.js';
@@ -79,6 +79,18 @@ export declare abstract class MessageUtils {
79
79
  static createFilteredCopyForCompaction(messages: AgentInputItem[]): AgentInputItem[];
80
80
  private static filterHiddenSystemRemindersForCompaction;
81
81
  static stripSystemRemindersOutsideUserQuery(text: string): string;
82
+ /**
83
+ * 压缩链路的统计日志出口。
84
+ *
85
+ * **禁止改回 `process.stderr.write` / `process.stdout.write`**(issue #76749):
86
+ * TUI 下裸写 stderr 会破坏 Ink 帧间光标定位,导致行级 diff 错位、spinner 残留。
87
+ * 走 logger 落盘即可,既保留排查信息又不碰 TTY。
88
+ *
89
+ * `catch` 有意整段吞掉,不做分级上报:日志出口的任何失败(容器未就绪、logger 自身
90
+ * 抛错)都不得影响压缩本身;而「失败时改走 stderr 兜底」恰会在异常路径上重新引入
91
+ * 本 issue 要修掉的 TTY 裸写。统计丢失是可接受的降级。
92
+ */
93
+ private static logCompaction;
82
94
  /**
83
95
  * Microcompact: clear output of old tool results (> 1 hour) to reduce token count.
84
96
  * Modifies items in place. Should be called BEFORE createFilteredCopyForCompaction.
@@ -70,6 +70,13 @@ export declare abstract class ModelUtils {
70
70
  */
71
71
  private static readRuntimeModelId;
72
72
  static isHunyuanModel(session: Session): Promise<boolean>;
73
+ /**
74
+ * ImageGen 实际使用的图片模型是否为混元。
75
+ *
76
+ * 取「产品配置里第一个带 text-to-image tag 的模型」,与 image-service 的解析顺序一致;
77
+ * 配置里没有图片模型时会走客户端的混元兜底模型,同样按混元处理。
78
+ */
79
+ static isHunyuanImageModel(): Promise<boolean>;
73
80
  static isMandatoryApprovalTarget(session: Session, targetToolName: string): Promise<boolean>;
74
81
  }
75
82
  export {};
@@ -17,7 +17,8 @@ import type { Session } from '../session/session-protocol.js';
17
17
  * 取;CLI **不再自动 drain**。后果有两条,改这块代码前必须知道:
18
18
  * 1. `session.queue` 降级为 rich queue 的**展示镜像**(只给 CLI TUI 看),镜像段由
19
19
  * `RichMessageQueueManagerImpl.syncToSessionQueue` 整体重建;
20
- * 2. 上面列举的那些 legacy 自动 drain 路径**全部被显式短路**。
20
+ * 2. 主会话的 legacy 自动 drain 路径被短路。子任务没有客户端派发者,仍由
21
+ * MessageQueueAgentRunInterceptor 消费非镜像项(包括普通 user 消息)。
21
22
  *
22
23
  * 因此在 Mode B 下 `session.queue` 是两个所有者共用的数组:镜像段属于 rich queue,
23
24
  * 系统注入项(后台任务通知 / channel / teammate / ACP steer 等)属于各自的注入方。任何一方读写它时
@@ -63,9 +64,30 @@ export declare abstract class QueueDispatchUtils {
63
64
  * 从 `session.queue` 里挑出「自动 drain 通道」该消费的项。
64
65
  *
65
66
  * Mode A:整个队列都是待发输入,原样返回(保持既有行为)。
66
- * Mode B:只返回系统注入项,rich queue 的展示镜像不属于本通道。
67
+ * Mode B 主会话:只返回系统注入项。子任务:所有非镜像项都是真实待发输入。
67
68
  */
68
69
  static ownedQueueItems(session: Session): AgentInputItem[];
70
+ /** Task runtimes have no client queue dispatcher, including restored child sessions. */
71
+ static isTaskQueue(session: Session): boolean;
72
+ /** The legacy interceptor owns all Mode A input and Mode B task input, never rich mirrors. */
73
+ static usesLocalQueueDispatch(session: Session): boolean;
74
+ static autoDrainQueueItems(session: Session): AgentInputItem[];
75
+ /**
76
+ * Observe which items one drain invocation actually consumed.
77
+ *
78
+ * **`input` is matched by array *identity*, not contents** — a copy observes
79
+ * nothing, and the caller then reads a failed drain as having consumed
80
+ * nothing. Per instance rather than per session because a session-wide
81
+ * snapshot cannot tell this batch apart from a competing run's.
82
+ *
83
+ * @returns disposer; call it once the run settles.
84
+ */
85
+ static observeQueueDrain(input: AgentInputItem[], observer: (items: AgentInputItem[], signal?: AbortSignal) => void): () => void;
86
+ /**
87
+ * Report the items consumed for `input`. No-op when nobody observes that
88
+ * exact array instance — see {@link observeQueueDrain} for the contract.
89
+ */
90
+ static recordQueueDrain(input: AgentInputItem[], items: AgentInputItem[], signal?: AbortSignal): void;
69
91
  /**
70
92
  * Async check — reads product config when env var is not set.
71
93
  */
@@ -11,7 +11,10 @@ export declare abstract class SessionUtils {
11
11
  * session 中发生实际可见的 ID 冲突。
12
12
  */
13
13
  static subAgentId(): string;
14
- static isSubAgent(session: Session): boolean;
14
+ static isSubAgent(session: {
15
+ id?: string;
16
+ storeId?: string;
17
+ }): boolean;
15
18
  /**
16
19
  * Clone one history item for a fork without duplicating large string payloads.
17
20
  *
@@ -0,0 +1,4 @@
1
+ /** Materialize an independent string without changing its UTF-16 code units. */
2
+ export declare function copyString(value: string): string;
3
+ /** Truncate by JavaScript string length and detach the retained prefix from its parent. */
4
+ export declare function truncateAndCopyString(value: string, maxLength: number, suffix?: string): string;
@@ -83,7 +83,13 @@ export declare enum HookEvent {
83
83
  FILE_CHANGED = "FileChanged",
84
84
  CWD_CHANGED = "CwdChanged",
85
85
  /** Terminal event; does not support continueRequest. */
86
- FINAL_STOP = "FinalStop"
86
+ FINAL_STOP = "FinalStop",
87
+ /**
88
+ * Triggered when a user-typed command/skill expands into a prompt, before
89
+ * it reaches the model. Can block the expansion.
90
+ * Claude Code parity: matcher filters on `command_name`.
91
+ */
92
+ USER_PROMPT_EXPANSION = "UserPromptExpansion"
87
93
  }
88
94
  /** Hook script stdout payload. */
89
95
  export interface HookOutput {
@@ -1,6 +1,8 @@
1
1
  export * from './agent/openai-agents-types.js';
2
2
  export * from './agent-home/agent-home-envelope-body.js';
3
3
  export * from './utils/abort-utils.js';
4
+ export * from './utils/retry-backoff.js';
5
+ export * from './utils/retry-policy.js';
4
6
  export * from './settings/settings-types.js';
5
7
  export * from './tools/tool-permission-types.js';
6
8
  export * from './tools/tool-permission-messages.js';
@@ -17,10 +17,14 @@ export declare class StreamTimeoutError extends CustomError {
17
17
  }
18
18
  /**
19
19
  * placeholder:空 200 / 心跳占位,拦截器最多切一次备站,会话层终态。
20
- * reasoning-only:已流出思考、finish_reason=error 且无可用输出(#63761 / #122115),
21
- * 会话层允许 1 次有界重试。
20
+ * reasoning-only:已流出思考、finish_reason=error 且无可用输出(#63761 / #122115)。
21
+ * no-token:finish_reason=error 到达时一个模型 token 都没有(连 reasoning 也没有)。
22
+ *
23
+ * reasoning-only 与 no-token 都是上游瞬时失败,会话层按 error 恢复预算重试;
24
+ * placeholder 必须与 no-token 分开——两者共用一个值时,放开 no-token 会连带
25
+ * 推翻空 200 的终态判定。
22
26
  */
23
- export type EmptyStreamKind = 'placeholder' | 'reasoning-only';
27
+ export type EmptyStreamKind = 'placeholder' | 'reasoning-only' | 'no-token';
24
28
  /**
25
29
  * 空流错误
26
30
  * 语义上仍然是"上游没有提供模型输出",所以继承 StreamTimeoutError
@@ -63,6 +63,7 @@ export declare enum ToolNames {
63
63
  WAIT_FOR_MCP_SERVERS = "WaitForMcpServers",
64
64
  WORKFLOW = "Workflow",
65
65
  VIDEO_GEN = "VideoGen",
66
+ AUDIO_TRANSCRIBE = "AudioTranscribe",
66
67
  REPORT_FINDINGS = "ReportFindings",
67
68
  MONITOR = "Monitor",
68
69
  LIST_AGENTS = "ListAgents",
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 自动恢复链的统一口径:最多 3 次,1s 起步、2 倍指数退避(基准 1s → 2s → 4s)。
3
+ *
4
+ * 适用于会话层的 error / 网络 / 流超时恢复,以及模型层的连接级透明重试。
5
+ * 第 1 层请求级(429/502/503 等)不带网关 retry_policy 时仍保持自己的 500ms 基数,
6
+ * 所以这里只共享算法,基数与上限由调用方传入。
7
+ */
8
+ export declare const MAX_RECOVERY_RETRIES = 3;
9
+ export declare const RECOVERY_RETRY_BASE_DELAY_MS = 1000;
10
+ export declare const RECOVERY_RETRY_MAX_DELAY_MS = 32000;
11
+ export interface ExponentialBackoffOptions {
12
+ baseDelayMs: number;
13
+ maxDelayMs: number;
14
+ random?: () => number;
15
+ }
16
+ /**
17
+ * `base * 2^(attempt-1)` 封顶到 `maxDelayMs`,再做 25% 下减抖动(区间 `[0.75x, 1x]`)。
18
+ *
19
+ * 必须下减而不是上加:上加会让实际等待越过 `maxDelayMs` 25%,调用方对封顶的承诺就不成立。
20
+ * `attempt` 从 1 起,小于 1 按 1 处理。
21
+ */
22
+ export declare function computeExponentialBackoffMs(attempt: number, options: ExponentialBackoffOptions): number;
23
+ export declare function computeRecoveryBackoffMs(attempt: number, random?: () => number): number;
24
+ /**
25
+ * 可取消的等待。`signal` 在等待前或等待中 abort 时返回 `false`,正常等满返回 `true`。
26
+ *
27
+ * 返回布尔而不是 reject:恢复链上的调用方拿到 `false` 后要自己决定退还额度、跳过发起,
28
+ * 用异常表达会把「用户取消」和「真正的错误」混在一条 catch 路径里。
29
+ */
30
+ export declare function waitForRecoveryBackoff(ms: number, signal?: AbortSignal): Promise<boolean>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 模型网关在 HTTP 错误体里下发的重试指示,与 `code` / `msg` / `displayMsg` 同层:
3
+ *
4
+ * ```json
5
+ * { "code": 11101, "msg": "...", "retry_policy": { "retry": false }, "displayMsg": { ... } }
6
+ * ```
7
+ *
8
+ * - `force-retry`:策略是普通对象且 `retry !== false`(含 `true`、缺 `retry` 键、类型异常)。
9
+ * 只在本地已判定可重试的范围内把请求级重试提到 3 次,不扩大可重试状态码。
10
+ * - `forbid-retry`:策略是普通对象且 `retry === false`。不重试、不换模型、不重放备站、不做鉴权刷新重试。
11
+ * - `unset`:字段缺失、`null`、数组或其他非对象形态,完全按原有逻辑处理。
12
+ *
13
+ * 只有显式 `false` 才阻断:网关形态小改动时宁可多试一次,也不要静默丧失恢复能力。
14
+ */
15
+ export type RetryPolicyDecision = 'force-retry' | 'forbid-retry' | 'unset';
16
+ export declare const RETRY_POLICY_FIELD = "retry_policy";
17
+ /**
18
+ * 按固定层级找 `retry_policy` 原值,返回第一个存在的值(可能是非法形态,由调用方裁决)。
19
+ *
20
+ * 同一份策略会以三种形态出现:网关原始错误体(顶层或 `data` / `error.data`)、错误分析器
21
+ * 规范化后的 `{ error: { code, message, data } }`、SDK 包装后的 APIError(`error.data`,
22
+ * 外层再包一层时为 `error.error.data`)。层级写死、不递归,避免在任意嵌套里误捡字段。
23
+ */
24
+ export declare function findRetryPolicy(source: unknown): unknown;
25
+ export declare function decideRetryPolicy(policy: unknown): RetryPolicyDecision;
26
+ export declare function resolveRetryPolicy(source: unknown): RetryPolicyDecision;
@@ -194,7 +194,15 @@ export declare class WorkflowExecution {
194
194
  abortAgent(key: string, reason: string): boolean;
195
195
  private buildSpec;
196
196
  private makeStartedRecord;
197
- /** Prompt 截到 ≤4KB,与 resultPreview 同口径 */
197
+ /**
198
+ * Prompt 截到 ≤4KB,与 resultPreview 同口径。
199
+ *
200
+ * **OOM 防护 · 父串不钉**:agentLog 长期驻留 ≤200 条 record(每 run),
201
+ * 若这里直接 `prompt.slice(0, max)` 返回,V8 会让该 substring 共享原 `prompt`
202
+ * 的 backing buffer —— 主 chat 一段 100KB 的用户输入,只要有一条 record
203
+ * 引用 4KB slice,整段 100KB 都无法被 GC。改走 `truncateAndCopyString`
204
+ * 强制 detach 到独立 buffer,length/marker 语义保持不变。
205
+ */
198
206
  static previewPrompt(prompt: string): string;
199
207
  private handleCacheHit;
200
208
  private markFailedAndEmit;
@@ -238,6 +246,11 @@ export declare class WorkflowExecution {
238
246
  * 不至于像一坨 `{"results":[{"url":"...","title":"..."}` 横向铺满终端
239
247
  * - 失败回落到 `String()`
240
248
  * - undefined / null → undefined(让 record.resultPreview 自然缺省)
249
+ *
250
+ * **OOM 防护 · 父串不钉**:同 previewPrompt —— agentLog 长期驻留,slice
251
+ * 会共享原始文本 backing buffer,导致原本可回收的大 result 被 record 钉住。
252
+ * 走 `truncateAndCopyString` 物化有界父串(短值同样 copy),
253
+ * length/marker 语义保持不变。
241
254
  */
242
255
  static previewOf(result: unknown): string | undefined;
243
256
  }
@@ -129,6 +129,13 @@ export declare class WorkflowManagerImpl implements WorkflowManager {
129
129
  * 1. meta.description
130
130
  * 2. args 是字符串(CC v2.1 标准形态) → 直接截断
131
131
  * 3. args 是对象且有 .question(老形态兜底,保留兼容)
132
+ *
133
+ * **OOM 防护 · 父串不钉**:args/question 分支的 200 字符截断 走
134
+ * `truncateAndCopyString` —— description 会经 `initialRecord` → `finalRecord`
135
+ * → `recent[].record`(队列上限 50)长期驻留;直接 `.slice(0, 200)` 会让
136
+ * substring 共享原始 args 的 backing buffer,一段几十 KB 的用户输入被 200
137
+ * 字符预览钉住。长度语义保持不变(≤200 原样、>200 截到 200,不带 marker)。
138
+ * meta.description 走 JSDoc 元数据、既不是 slice 也无长度截断,保留原逻辑。
132
139
  */
133
140
  private deriveDescription;
134
141
  }
@@ -22,6 +22,8 @@ export declare class WorktreeSessionManagerImpl implements IWorktreeSessionManag
22
22
  * 在进程生命周期内维护
23
23
  */
24
24
  private currentSession;
25
+ /** 当前进行中的删除操作,避免重复退出事件并发删除同一个 worktree。 */
26
+ private removeOperation;
25
27
  private setSessionProgress;
26
28
  /**
27
29
  * 创建 worktree 会话
@@ -68,6 +70,7 @@ export declare class WorktreeSessionManagerImpl implements IWorktreeSessionManag
68
70
  * 4. 清除会话状态
69
71
  */
70
72
  removeWorktree(): Promise<WorktreeExitOperationResult | undefined>;
73
+ private performRemoveWorktree;
71
74
  /**
72
75
  * 处理退出
73
76
  * 检测变更并根据情况显示退出选项或自动清理
@@ -15,6 +15,8 @@ export declare class CloudProductProvider implements ProductProvider {
15
15
  protected readonly cloudProductManager: CloudProductManager;
16
16
  /** Process-wide duplicate suppression for consecutive skip reasons. */
17
17
  protected lastSkipReason?: string;
18
+ /** Consecutive skips carrying {@link lastSkipReason}; drives the log schedule. */
19
+ protected consecutiveSkips: number;
18
20
  protected init(): void;
19
21
  /**
20
22
  * 记录一次「本轮没去拉云端配置」并返回空配置。
@@ -23,6 +25,13 @@ export declare class CloudProductProvider implements ProductProvider {
23
25
  * 「没去拉」与「拉失败」(#58031 因此被误判为模型未上线)。
24
26
  *
25
27
  * level:warn=非预期状态值得排查,info=按配置有意禁用,避免污染告警。
28
+ *
29
+ * 只打「同因首次」是不够的(#129839):启动期竞态下第 1 轮因登录态未就绪判
30
+ * config-disabled,第 2 轮补拉**同因再跳一次**却被整条吃掉,现场只看得到一行,
31
+ * 误以为补拉已生效,实际 /model 一直是打包内置旧清单。改为按 1/2/4/8… 的次数
32
+ * 打点并带上连续计数:既保留原有的抗刷屏意图(`provide()` 每轮都跑,历史上无
33
+ * 条件 info 影响过流水线,见 9c1d1e55df0),又让「连续跳过」这一状态始终可见,
34
+ * 且行数是 O(log n) 有界的。现场日志不采集 debug,所以不能降级为 debug。
26
35
  */
27
36
  protected skip(ctx: ProductProviderContext, reason: string, level: 'warn' | 'info'): ProductConfiguration;
28
37
  provide(ctx: ProductProviderContext): Promise<ProductConfiguration>;
@@ -1,4 +1,5 @@
1
1
  export * from './types/index.js';
2
+ export { pickMarketSkillIdFromMeta } from './pick-market-skill-id.js';
2
3
  export * from './product-protocol.js';
3
4
  export * from './repository-protocol.js';
4
5
  export * from './product-manager.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 从市场 meta(`_skillhub_meta` / `_knot_meta` / `_user_meta` / `_marketplace_meta`)
3
+ * 里取市场身份。
4
+ *
5
+ * 四级取值链取写侧最宽的那份。现实中 Knot 的 `slug` 恒非空
6
+ * (`knot.ts` 的 `metaSlug = slug || skillName || String(id)`),因此 `skill_id`
7
+ * 与 `id` 两级是防御性的;保留它们是为了让读写两侧用**同一个函数**,
8
+ * 而不是让读侧比写侧窄。
9
+ *
10
+ * 契约归属 `@genie/product`:写侧(listNonPlatformSkillBlacklistItems)与读侧
11
+ * (Skill.skillId / skill_info 遥测)必须算出同一个值,否则黑名单执法漏拦。
12
+ */
13
+ export declare function pickMarketSkillIdFromMeta(meta: Record<string, unknown> | null | undefined): string | undefined;
@@ -5,9 +5,9 @@
5
5
  * marketplace MCP Servers must not enter the policy surface implicitly.
6
6
  */
7
7
  export declare const WORKBUDDY_PRODUCT_TOOL_NAMES: readonly ['WebFetch', 'WebSearch', 'ImageGen', 'VideoGen', 'ListMcpResources', 'ReadMcpResource', 'DelegateTool', 'WeChatReply', 'WeComReply'];
8
- export declare const WORKBUDDY_REQUIRED_TOOL_NAMES: readonly ['Read', 'Write', 'Edit', 'MultiEdit', 'Glob', 'Grep', 'Bash', 'PowerShell', 'AskUserQuestion', 'TaskCreate', 'TaskGet', 'TaskUpdate', 'TaskList', 'TaskStop', 'TaskOutput', 'Skill', 'LSP', 'Agent', 'SendMessage', 'ToolSearch', 'DeferExecuteTool', 'EnterPlanMode', 'ExitPlanMode', 'present_files', 'widget_guidelines', 'show_widget', 'TeamCreate', 'TeamDelete', 'SkillManage', 'StructuredOutput'];
8
+ export declare const WORKBUDDY_REQUIRED_TOOL_NAMES: readonly ['Read', 'Write', 'Edit', 'MultiEdit', 'Glob', 'Grep', 'Bash', 'PowerShell', 'AskUserQuestion', 'TaskCreate', 'TaskGet', 'TaskUpdate', 'TaskList', 'TaskStop', 'TaskOutput', 'Skill', 'LSP', 'Agent', 'SendMessage', 'ToolSearch', 'DeferExecuteTool', 'EnterPlanMode', 'ExitPlanMode', 'present_files', 'widget_guidelines', 'show_widget', 'TeamCreate', 'TeamDelete', 'StructuredOutput'];
9
9
  export declare const WORKBUDDY_BUNDLED_MCP_SERVERS: {
10
- readonly 'connector-proxy': readonly ['connect_cloud_service', 'connect_open_platform', 'workbuddy_sites_deploy', 'workbuddy_sites_unpublish', 'workbuddy_cloud_service', 'workbuddy_update_app_preview_entry', 'workbuddy_marketplace_skill', 'domain_search', 'automation_update', 'conversation_search', 'pick_location', 'agent_mail_upload_attachment', 'agent_mail_download_attachment', 'search_plugins', 'suggest_plugin_install'];
10
+ readonly 'connector-proxy': readonly ['connect_cloud_service', 'connect_open_platform', 'workbuddy_sites_deploy', 'workbuddy_sites_unpublish', 'workbuddy_cloud_service', 'workbuddy_update_app_preview_entry', 'search_and_install_skills', 'skill_management', 'domain_search', 'automation_update', 'conversation_search', 'pick_location', 'agent_mail_upload_attachment', 'agent_mail_download_attachment', 'search_plugins', 'suggest_plugin_install', 'list_installed_plugins', 'uninstall_plugin'];
11
11
  readonly miora: readonly ['miora_write_canvas', 'miora_open_canvas', 'miora_text_to_image', 'miora_edit_image', 'miora_text_to_video', 'miora_frame_to_video', 'miora_reference_to_video', 'miora_query_task'];
12
12
  readonly sheetagent: readonly ['resolve_local_excel', 'get_cell_ranges', 'set_cell_range', 'read_table', 'run_command', 'search_data', 'calculate_single_formula', 'calculate_formulas', 'fill_formula'];
13
13
  readonly weixinpay: readonly ['weixinpay_register', 'weixinpay_feedback', 'weixinpay_retry_pay', 'weixinpay_pay'];
@@ -911,6 +911,10 @@ export declare enum ProductFeature {
911
911
  * 是否启用文生视频功能
912
912
  */
913
913
  VideoGen = "VideoGen",
914
+ /**
915
+ * 是否启用录音文件识别(长音频转文本)功能
916
+ */
917
+ AudioTranscribe = "AudioTranscribe",
914
918
  /**
915
919
  * 是否开启 Artifact(本地 HTML/Markdown → 上传 → 可分享公网链接)能力。
916
920
  * issue #81031:ShareLink 工具更名为 Artifact 后的新规范 key;
@@ -1056,6 +1060,41 @@ export declare enum ProductFeature {
1056
1060
  * @default false
1057
1061
  */
1058
1062
  QuickQa = "QuickQa",
1063
+ /**
1064
+ * 首页「快速问答」入口开关。issue #124324
1065
+ *
1066
+ * 与 `QuickQa` **相互独立,不做 AND**:`QuickQa` 管能力本体(划词入口、推荐胶囊、
1067
+ * embed 空视图、会话内 mode 展示),本 key 只管首页那条新建链路 —— 场景 Tab
1068
+ * (设计创意之后的第 4 项)、`Meta/Ctrl+Shift+N`、首页输入框的 quick 模式项。
1069
+ *
1070
+ * ⚠️ **缺省值按账号算,不是固定布尔**:IOA 企业(`IOA_ENTERPRISE_IDS`)缺省开启,
1071
+ * 其余(个人账号 / 非 IOA 企业 / 未登录)缺省关闭。因此 **`product.json` 里故意
1072
+ * 不登记这个 key** —— 注入快照里一旦有 key 就走不到 `missingKeyEnabled`,写成全局
1073
+ * 布尔会把 IOA 判定整个压掉。远端 `v3/config` 显式下发时以远端为准。
1074
+ *
1075
+ * 实现见 `agent-ui` 的 `useHomeQuickAskEntryFeatureEnabled`。
1076
+ * @default IOA 为 true,其余为 false
1077
+ */
1078
+ QuickAskEntry = "QuickAskEntry",
1079
+ /**
1080
+ * 侧栏一级入口收敛开关。issue #124324
1081
+ *
1082
+ * 启用后:宿主入口文案与图标从「更多」改为「发现」,下拉按分组补分割线;且对**没配置过
1083
+ * 自定义菜单**的用户,一级栏收到「新建任务 / 定时任务 / 资料库」+ 末位「发现」共 4 项,
1084
+ * 助理、项目、专家、运营自建菜单、其余 sidebar extension 默认下沉进「发现」。
1085
+ * 关闭后:一级栏与下拉维持收敛前的原样(入口不下沉、宿主入口仍叫「更多」、无分割线)。
1086
+ *
1087
+ * ⚠️ 两个粒度不同,见 `useSidebarPrimaryCollapse`:
1088
+ * 1. 「发现」外观与分割线**只看本 flag**,与用户有没有拖过菜单无关。
1089
+ * 2. **下沉**额外要求用户没配置过自定义菜单 —— 已存配置里的 id 会被
1090
+ * `restoreCustomMenuDialogValue` 按存档分区放回去,下沉对这些用户只能半生效,
1091
+ * 所以条目位置一律听用户的配置。
1092
+ *
1093
+ * 缺省值按账号算(IOA 开、其余关),因此 **`product.json` 故意不登记这个 key** —— 与
1094
+ * `QuickAskEntry` 同理,注入快照里一旦有 key 就走不到 `missingKeyEnabled`。
1095
+ * @default IOA 为 true,其余为 false
1096
+ */
1097
+ SidebarPrimaryCollapse = "SidebarPrimaryCollapse",
1059
1098
  /**
1060
1099
  * 主任务新引擎的**远端灰度/紧急回滚**开关。
1061
1100
  * - 远端缺 key → 解析为 true(不阻断);显式 false → 强制回退 MainContentCore
@@ -1128,7 +1167,7 @@ export declare enum ProductFeature {
1128
1167
  */
1129
1168
  TencentDocsCloudSandboxBridge = "TencentDocsCloudSandboxBridge",
1130
1169
  /**
1131
- * 内置 tencent-pptx 插件首次 seed 时默认开启。
1170
+ * 内置 workbuddy-pptx 插件首次 seed 时默认开启。
1132
1171
  * 设置为 false 时跳过默认写入 enabledPlugins(kill-switch)。
1133
1172
  * @default true
1134
1173
  */
@@ -1715,6 +1754,11 @@ export declare enum ProductFeature {
1715
1754
  * @see Issue #96599
1716
1755
  */
1717
1756
  ModelRateLimitCap = "ModelRateLimitCap",
1757
+ /**
1758
+ * 模型 Preview 试用期常驻 Banner 的结构化规则配置。
1759
+ * 配置位于 `productFeaturesConfig[ModelTrialBanner].banners`,缺失即关闭。
1760
+ */
1761
+ ModelTrialBanner = "ModelTrialBanner",
1718
1762
  /**
1719
1763
  * Agent CLI 出站 A2A(Agent2Agent)能力总开关(issue #99451)。
1720
1764
  *
@@ -1825,7 +1869,23 @@ export declare enum ProductFeature {
1825
1869
  *
1826
1870
  * @default true
1827
1871
  */
1828
- TuringDeviceToken = "TuringDeviceToken"
1872
+ TuringDeviceToken = "TuringDeviceToken",
1873
+ /**
1874
+ * 统一资产管理总开关(#92015,对齐 feature/unified-asset-mgmt 分支)。
1875
+ * 打开即完整执法(拦截 / 执行 / 删除 / 付费),关闭时完全保持既有
1876
+ * Expert/Skill/Connector 行为。消费方为 `@genie/unified-asset` 的
1877
+ * `isUnifiedAssetEnabled`(CLI 侧 Skill Guard Hooks 与 server 侧门控共用)。
1878
+ * @default false
1879
+ */
1880
+ UnifiedAsset = "UnifiedAsset",
1881
+ /**
1882
+ * 技能订阅门控(付费技能 pre-call 拦截)。
1883
+ * check 链路已 fail-close,门控默认生效(缺省开)是更安全方向。
1884
+ * 当前无云端开关设计,仅登记 key 预留口子——后续接灰度开关时经
1885
+ * productFeatures 下发(消费方 skill-subscription-gate.isEnabled)。
1886
+ * @default true
1887
+ */
1888
+ SkillSubscriptionGate = "SkillSubscriptionGate"
1829
1889
  }
1830
1890
  /**
1831
1891
  * 功能配置开关
@@ -32,6 +32,24 @@ export interface ModelContextWindow {
32
32
  */
33
33
  defaultLength?: number;
34
34
  }
35
+ /**
36
+ * 视频生成能力声明(VideoGen 使用)。
37
+ *
38
+ * 分辨率未声明时按通用缺省处理:支持 720P / 1080P,默认 1080P。
39
+ * 时长未声明时仅使用通用默认值,且不接受调用方指定时长。
40
+ */
41
+ export interface ModelVideoGeneration {
42
+ /** 支持的分辨率档位,如 ['480P', '720P'] */
43
+ resolutions?: ReadonlyArray<string>;
44
+ /** 默认分辨率档位,如 '720P';应落在 resolutions 内 */
45
+ defaultResolution?: string;
46
+ /** 支持的最短视频时长(秒),如 4;与 maxSeconds 成对声明 */
47
+ minSeconds?: number;
48
+ /** 支持的最长视频时长(秒),如 30;与 minSeconds 成对声明 */
49
+ maxSeconds?: number;
50
+ /** 默认视频时长(秒),如 5;应落在 minSeconds 与 maxSeconds 之间 */
51
+ defaultSeconds?: number;
52
+ }
35
53
  export interface ModelReasoning {
36
54
  /**
37
55
  * @deprecated 使用 {@link defaultEffort} 替代;保留仅为向后兼容旧 product config。
@@ -148,6 +166,52 @@ export interface ModelGroup {
148
166
  readonly trailingActions?: readonly string[];
149
167
  readonly order?: number;
150
168
  }
169
+ /**
170
+ * 用户会员类型(Issue #87302),供 {@link ModelTier.requiredUserType} 引用。
171
+ *
172
+ * ⚠️ 这是 `@genie/agent-provider.UserType` 的镜像,字段必须保持一致。
173
+ * 不在此处直接 import `@genie/agent-provider`(product 是上层,会引入反向依赖),
174
+ * 与 {@link ModelPromotion} 同款处理。
175
+ */
176
+ export type UserType = 'free' | 'standard' | 'youth' | 'advanced' | 'flagship';
177
+ /** 模型会员权益档位级别(Issue #87302):flagship > advanced > standard > trial。 */
178
+ export type ModelTierLevel = 'flagship' | 'advanced' | 'standard' | 'trial';
179
+ /** 档位徽章(Issue #87302),本期只下发文案,颜色由客户端按 tier 写死。 */
180
+ export interface ModelTierBadge {
181
+ readonly label: string;
182
+ }
183
+ /** 档位 hover 底部说明 + 升级 CTA(Issue #87302)。 */
184
+ export interface ModelTierHover {
185
+ readonly textZh?: string;
186
+ readonly textEn?: string;
187
+ readonly action?: {
188
+ readonly type: 'upgrade';
189
+ readonly labelZh?: string;
190
+ readonly labelEn?: string;
191
+ };
192
+ }
193
+ /**
194
+ * 模型会员权益档位展示配置(Issue #87302)。
195
+ *
196
+ * 由 product config 顶层 `modelTiers` 下发,按 `modelIds` 命中模型后附加到模型元数据的
197
+ * `tier` 上(多档位命中同一模型时按 `priority` 选主)。与 {@link ModelPromotion}(按时间
198
+ * 窗口生效的运营活动)语义不同:tier 表示「按会员等级的长期权益档位」。
199
+ *
200
+ * ⚠️ 此类型与 `@genie/agent-provider.ModelTier`、以及
201
+ * `packages/workbuddy-server/src/config/contract.ts` 引用的 canonical 定义互为镜像,
202
+ * 字段必须保持一致(同款处理见 {@link ModelPromotion})。任一处改动需同步其余各处。
203
+ */
204
+ export interface ModelTier {
205
+ readonly id: string;
206
+ readonly tier: ModelTierLevel;
207
+ readonly enabled?: boolean;
208
+ readonly priority?: number;
209
+ readonly modelIds: readonly string[];
210
+ readonly badge?: ModelTierBadge;
211
+ readonly hover?: ModelTierHover;
212
+ readonly requiredUserType?: UserType;
213
+ readonly trackKey?: string;
214
+ }
151
215
  /**
152
216
  * 语言模型的定义接口,描述模型的基本属性和能力。
153
217
  */
@@ -206,6 +270,8 @@ export interface LanguageModel {
206
270
  readonly reasoning?: ModelReasoning;
207
271
  /** 上下文窗口预算配置(Issue #57413);maxInputTokens 仍表示物理上限。 */
208
272
  readonly contextWindow?: ModelContextWindow;
273
+ /** 视频生成能力(VideoGen 使用):支持的分辨率档位与默认档位。 */
274
+ readonly videoGeneration?: ModelVideoGeneration;
209
275
  /**
210
276
  * effort 级别到上游字面量的映射表。来自模型目录,
211
277
  * 由请求层在拼装 reasoning_effort 时按需翻译。
@@ -15,7 +15,7 @@ import { GalileoConfig } from './galileo.js';
15
15
  import { Instruction } from './instruction.js';
16
16
  import { IntegrationOverridesConfiguration } from './integrations.js';
17
17
  import { KnowledgeBaseConfiguration } from './knowledge-base.js';
18
- import { LanguageModel, ModelGroup, ModelPromotion, ModelRelatedModels } from './language-model.js';
18
+ import { LanguageModel, ModelGroup, ModelPromotion, ModelRelatedModels, ModelTier } from './language-model.js';
19
19
  import { LinkConfiguration } from './links.js';
20
20
  import { LogConfiguration } from './log.js';
21
21
  import { LSPExtensionConfig } from './lsp.js';
@@ -290,6 +290,12 @@ export interface ProductConfiguration {
290
290
  * `/v3/config` 顶层下发;前端按 `group.modelIds` 组装二级面板,不再按 id 前缀隐式筛选。
291
291
  */
292
292
  modelGroups?: ModelGroup[];
293
+ /**
294
+ * 模型会员权益档位展示配置(Issue #87302)。顶层下发,按 `modelIds` 命中模型后附加
295
+ * 徽章 / hover 档位标签。白名单式返回(daemon config RPC)必须显式透传该字段,
296
+ * 否则 renderer 侧读不到、档位徽章不展示(回归见 Issue #126934)。
297
+ */
298
+ modelTiers?: ModelTier[];
293
299
  /**
294
300
  * 默认关联模型配置
295
301
  * 当模型自身没有配置 relatedModels 时,使用此默认配置作为兜底
@@ -1,9 +1,18 @@
1
1
  export declare const FILE_BACKUP_DEFAULT_MAX_SIZE_MB = 3000;
2
2
  export declare const FILE_BACKUP_MIN_SIZE_MB = 1000;
3
+ /**
4
+ * 备份总大小上限的最大允许值(MB)。
5
+ *
6
+ * Rust 侧(sandbox-center)使用 u32 反序列化 `fileBackupMaxSizeMB`,
7
+ * 超过 u32 上限(4294967295)会导致 serde 报错、整条 EnableModifyBackup
8
+ * 失败,进而使当轮文件备份静默关闭。1_000_000 MB ≈ 1 TB,远超实际需求
9
+ * 且安全落在 u32 范围内。
10
+ */
11
+ export declare const FILE_BACKUP_MAX_SIZE_MB = 1000000;
3
12
  export interface FileBackupConfig {
4
13
  /** 是否启用文件备份 */
5
14
  enabled?: boolean;
6
- /** 备份总大小上限(MB),不小于 1000 */
15
+ /** 备份总大小上限(MB),有效范围 [1000, 1000000] */
7
16
  maxSizeMB?: number;
8
17
  }
9
18
  export declare const DEFAULT_MODIFY_BACKUP_EXCLUDED_DIRS: readonly ["~/.cache/", "~/.local/", "~/.npm/", "~/.pnpm-store/", "~/.cargo/", "~/.rustup/", "~/go/", "~/.gradle/", "~/.m2/", "~/.nuget/", "~/.bun/", "~/.deno/", "~/.npm-global/", "~/.pyenv/", "~/appdata/local/temp/", "~/appdata/local/npm-cache/", "~/appdata/local/pnpm/", "~/appdata/local/yarn/", "~/appdata/local/fnm_multishells/", "~/.yarn/", "~/.nvm/", "~/.fnm/", "~/appdata/local/pip/", "~/appdata/local/conda/", "~/appdata/local/uv/", "~/appdata/roaming/uv/", "~/.pyenv/", "~/.conda/", "~/miniconda3/", "~/miniforge3/", "~/appdata/local/go-build/", "~/appdata/roaming/go/", "~/.sdkman/", "~/.dotnet/", "~/appdata/local/nuget/", "~/.docker/", "~/.asdf/", "~/appdata/roaming/npm/", "~/appdata/local/microsoft/windowsapps/", "~/appdata/roaming/code/", "~/appdata/roaming/trae/", "~/appdata/roaming/microsoft/windows/powershell/", "~/appdata/local/microsoft/windows/powershell/", "~/appdata/roaming/microsoft/windows/recent/", "~/appdata/local/microsoft/windows/recent/", "C:\\openclaw\\openclaw\\", "~/Library/Caches/", "~/Library/Developer/Xcode/DerivedData/", "~/Library/Developer/CoreSimulator/Caches/", "~/.pub-cache/", "~/.ivy2/cache/", "~/.sbt/boot/", "~/.gem/specs/", "~/.cabal/packages/", "~/.cabal/store/", "~/.stack/pantry/", "~/appdata/local/pub/cache/", "~/appdata/local/pypa/virtualenv/", "**/node_modules/**", "**/.pnpm-store/**", "**/.venv/**", "**/.tox/**", "**/.nox/**", "**/__pycache__/**", "**/.pytest_cache/**", "**/.mypy_cache/**", "**/.ruff_cache/**", "**/.next/**", "**/.nuxt/**", "**/.svelte-kit/**", "**/.parcel-cache/**", "**/.turbo/**", "**/.vite/**", "**/.vite-temp/**", "**/.sass-cache/**", "**/.dart_tool/**", "**/.gradle/**", "**/.cxx/**", "**/.externalNativeBuild/**", "~/.codebuddy/debug/", "~/.codebuddy/statsig/", "~/.workbuddy/plugins/", "~/.workbuddy/skills-marketplace/", "~/.workbuddy/connectors/", "~/.workbuddy/connectors-marketplace/", "~/.workbuddy/binaries/", "~/appdata/local/codex/", "~/appdata/local/hermes/", "~/appdata/roaming/python/", "~/appdata/roaming/pip/", "~/appdata/roaming/npm-cache/", "~/appdata/roaming/nuget/", "~/appdata/local/pnpm-store/", "~/appdata/local/ms-playwright/", "~/appdata/local/google/chrome/", "~/appdata/local/google/chrome for testing/", "~/appdata/local/microsoft/windows/caches/", "~/appdata/local/microsoft/powershell/", "~/appdata/local/packages/", "C:\\Windows\\System32\\lxss\\", "**\\$RECYCLE.BIN\\**", "**\\.git\\**", "**\\.githooks\\**"];