@bolloon/bolloon-agent 0.5.5 → 0.6.1

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 (158) hide show
  1. package/dist/agents/execution-entry.js +10 -0
  2. package/dist/agents/goal-flywheel/wiring/seams.js +5 -1
  3. package/dist/agents/parse-tool-call.js +6 -1
  4. package/dist/agents/pi-sdk-session-factory.js +36 -3
  5. package/dist/agents/pi-sdk-tools.js +18 -8
  6. package/dist/agents/pi-sdk.js +749 -1390
  7. package/dist/agents/run-context.js +20 -0
  8. package/dist/agents/runner-resolver.js +3 -1
  9. package/dist/agents/tool-capability/index.js +51 -0
  10. package/dist/agents/workflow-pivot-loop.js +31 -10
  11. package/dist/agents/write-verify.js +60 -0
  12. package/dist/bollharness-integration/integration.js +8 -0
  13. package/dist/bollharness-integration/skill-adapter.js +32 -3
  14. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +5 -1
  15. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -1
  16. package/dist/electron-build/agents/parse-tool-call.js +6 -1
  17. package/dist/electron-build/agents/parse-tool-call.js.map +1 -1
  18. package/dist/electron-build/agents/pi-sdk-session-factory.js +36 -3
  19. package/dist/electron-build/agents/pi-sdk-session-factory.js.map +1 -1
  20. package/dist/electron-build/agents/pi-sdk-tools.js +21 -11
  21. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
  22. package/dist/electron-build/agents/pi-sdk-types.js.map +1 -1
  23. package/dist/electron-build/agents/pi-sdk.js +750 -1389
  24. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  25. package/dist/electron-build/agents/run-context.js +24 -0
  26. package/dist/electron-build/agents/run-context.js.map +1 -0
  27. package/dist/electron-build/agents/runner-resolver.js +3 -1
  28. package/dist/electron-build/agents/runner-resolver.js.map +1 -1
  29. package/dist/electron-build/agents/tool-capability/index.js +90 -0
  30. package/dist/electron-build/agents/tool-capability/index.js.map +1 -0
  31. package/dist/electron-build/agents/workflow-pivot-loop.js +31 -10
  32. package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
  33. package/dist/electron-build/agents/write-verify.js +99 -0
  34. package/dist/electron-build/agents/write-verify.js.map +1 -0
  35. package/dist/electron-build/bollharness-integration/integration.js +8 -0
  36. package/dist/electron-build/bollharness-integration/integration.js.map +1 -1
  37. package/dist/electron-build/bollharness-integration/skill-adapter.js +32 -3
  38. package/dist/electron-build/bollharness-integration/skill-adapter.js.map +1 -1
  39. package/dist/electron-build/kernel/channel-actor.js +339 -0
  40. package/dist/electron-build/kernel/channel-actor.js.map +1 -0
  41. package/dist/electron-build/kernel/control.js +102 -0
  42. package/dist/electron-build/kernel/control.js.map +1 -0
  43. package/dist/electron-build/kernel/model-runtime.js +508 -0
  44. package/dist/electron-build/kernel/model-runtime.js.map +1 -0
  45. package/dist/electron-build/kernel/run-lifecycle.js +146 -0
  46. package/dist/electron-build/kernel/run-lifecycle.js.map +1 -0
  47. package/dist/electron-build/kernel/transport.js +119 -0
  48. package/dist/electron-build/kernel/transport.js.map +1 -0
  49. package/dist/electron-build/llm/native-adapter.js +122 -0
  50. package/dist/electron-build/llm/native-adapter.js.map +1 -0
  51. package/dist/index.js +43 -19
  52. package/dist/ios/bolloon-web.json +3 -3
  53. package/dist/ios/client.js +13 -7
  54. package/dist/ios/mobile-core.js +7762 -6289
  55. package/dist/ios/mobile.js +64 -0
  56. package/dist/ios/routes-mobile-tasks.js +2 -1
  57. package/dist/ios/routes-tasks.js +16 -1
  58. package/dist/ios/routes-x402-info.js +28 -1
  59. package/dist/ios/server-storage.js +26 -5
  60. package/dist/ios/server.js +840 -862
  61. package/dist/ios/sw.js +1 -1
  62. package/dist/ios/ui/message-renderer.js +473 -29
  63. package/dist/ios/ui/step-timeline.js +13 -12
  64. package/dist/kernel/channel-actor.js +321 -0
  65. package/dist/kernel/control.js +95 -0
  66. package/dist/kernel/gate-scan.js +1350 -0
  67. package/dist/kernel/model-runtime.js +494 -0
  68. package/dist/kernel/plan-channel-actor.js +305 -0
  69. package/dist/kernel/plan-communication.js +163 -0
  70. package/dist/kernel/plan-constraint.js +152 -0
  71. package/dist/kernel/plan-deletion.js +32 -0
  72. package/dist/kernel/plan-harness.js +78 -0
  73. package/dist/kernel/plan-modelruntime.js +60 -0
  74. package/dist/kernel/plan-runcontext.js +163 -0
  75. package/dist/kernel/plan.js +149 -0
  76. package/dist/kernel/roster.js +244 -0
  77. package/dist/kernel/run-lifecycle.js +138 -0
  78. package/dist/kernel/transport.js +111 -0
  79. package/dist/llm/native-adapter.js +117 -0
  80. package/dist/web/bolloon-web.json +3 -3
  81. package/dist/web/client.js +12 -7
  82. package/dist/web/routes-tasks.js +16 -1
  83. package/dist/web/server.js +838 -862
  84. package/dist/web/sw.js +1 -1
  85. package/dist/web/ui/message-renderer.js +473 -29
  86. package/dist/web/ui/step-timeline.js +13 -12
  87. package/package.json +1 -1
  88. package/scripts/build-web.ts +74 -1
  89. package/dist/constraint-runtime/_archive_helper.d.ts +0 -1
  90. package/dist/constraint-runtime/_archive_helper.js +0 -9
  91. package/dist/constraint-runtime/assistant/index.d.ts +0 -11
  92. package/dist/constraint-runtime/assistant/index.js +0 -12
  93. package/dist/constraint-runtime/bootstrap/index.d.ts +0 -11
  94. package/dist/constraint-runtime/bootstrap/index.js +0 -12
  95. package/dist/constraint-runtime/bridge/index.d.ts +0 -11
  96. package/dist/constraint-runtime/bridge/index.js +0 -12
  97. package/dist/constraint-runtime/buddy/index.d.ts +0 -11
  98. package/dist/constraint-runtime/buddy/index.js +0 -12
  99. package/dist/constraint-runtime/cli/index.d.ts +0 -11
  100. package/dist/constraint-runtime/cli/index.js +0 -12
  101. package/dist/constraint-runtime/components/index.d.ts +0 -11
  102. package/dist/constraint-runtime/components/index.js +0 -12
  103. package/dist/constraint-runtime/constants/index.d.ts +0 -11
  104. package/dist/constraint-runtime/constants/index.js +0 -12
  105. package/dist/constraint-runtime/coordinator/index.d.ts +0 -11
  106. package/dist/constraint-runtime/coordinator/index.js +0 -12
  107. package/dist/constraint-runtime/cost_hook.d.ts +0 -2
  108. package/dist/constraint-runtime/cost_hook.js +0 -4
  109. package/dist/constraint-runtime/entrypoints/index.d.ts +0 -11
  110. package/dist/constraint-runtime/entrypoints/index.js +0 -12
  111. package/dist/constraint-runtime/execution_registry.d.ts +0 -20
  112. package/dist/constraint-runtime/execution_registry.js +0 -44
  113. package/dist/constraint-runtime/hooks/index.d.ts +0 -11
  114. package/dist/constraint-runtime/hooks/index.js +0 -12
  115. package/dist/constraint-runtime/ink.d.ts +0 -1
  116. package/dist/constraint-runtime/ink.js +0 -4
  117. package/dist/constraint-runtime/keybindings/index.d.ts +0 -11
  118. package/dist/constraint-runtime/keybindings/index.js +0 -12
  119. package/dist/constraint-runtime/memdir/index.d.ts +0 -11
  120. package/dist/constraint-runtime/memdir/index.js +0 -12
  121. package/dist/constraint-runtime/migrations/index.d.ts +0 -11
  122. package/dist/constraint-runtime/migrations/index.js +0 -12
  123. package/dist/constraint-runtime/moreright/index.d.ts +0 -11
  124. package/dist/constraint-runtime/moreright/index.js +0 -12
  125. package/dist/constraint-runtime/native_ts/index.d.ts +0 -11
  126. package/dist/constraint-runtime/native_ts/index.js +0 -12
  127. package/dist/constraint-runtime/output_styles/index.d.ts +0 -11
  128. package/dist/constraint-runtime/output_styles/index.js +0 -12
  129. package/dist/constraint-runtime/plugins/index.d.ts +0 -11
  130. package/dist/constraint-runtime/plugins/index.js +0 -12
  131. package/dist/constraint-runtime/port_manifest.d.ts +0 -7
  132. package/dist/constraint-runtime/port_manifest.js +0 -11
  133. package/dist/constraint-runtime/query.d.ts +0 -6
  134. package/dist/constraint-runtime/query.js +0 -1
  135. package/dist/constraint-runtime/remote/index.d.ts +0 -11
  136. package/dist/constraint-runtime/remote/index.js +0 -12
  137. package/dist/constraint-runtime/schemas/index.d.ts +0 -11
  138. package/dist/constraint-runtime/schemas/index.js +0 -12
  139. package/dist/constraint-runtime/screens/index.d.ts +0 -11
  140. package/dist/constraint-runtime/screens/index.js +0 -12
  141. package/dist/constraint-runtime/server/index.d.ts +0 -11
  142. package/dist/constraint-runtime/server/index.js +0 -12
  143. package/dist/constraint-runtime/services/index.d.ts +0 -11
  144. package/dist/constraint-runtime/services/index.js +0 -12
  145. package/dist/constraint-runtime/state/index.d.ts +0 -11
  146. package/dist/constraint-runtime/state/index.js +0 -12
  147. package/dist/constraint-runtime/system_init.d.ts +0 -1
  148. package/dist/constraint-runtime/system_init.js +0 -20
  149. package/dist/constraint-runtime/types/index.d.ts +0 -11
  150. package/dist/constraint-runtime/types/index.js +0 -12
  151. package/dist/constraint-runtime/upstream_proxy/index.d.ts +0 -11
  152. package/dist/constraint-runtime/upstream_proxy/index.js +0 -12
  153. package/dist/constraint-runtime/utils/index.d.ts +0 -11
  154. package/dist/constraint-runtime/utils/index.js +0 -12
  155. package/dist/constraint-runtime/vim/index.d.ts +0 -11
  156. package/dist/constraint-runtime/vim/index.js +0 -12
  157. package/dist/constraint-runtime/voice/index.d.ts +0 -11
  158. package/dist/constraint-runtime/voice/index.js +0 -12
@@ -0,0 +1,508 @@
1
+ "use strict";
2
+ /**
3
+ * **K6: ModelRuntime 骨架** —— `acquire(modelSnapshot)` **只读**入手。
4
+ *
5
+ * 本步只做三件事 (其余能力在 `plan-modelruntime.ts` 里仍是 `not-started`):
6
+ * ① **连接复用** (按 snapshot 派生 key 池化, 同一 key 只开一次连接)
7
+ * ② **timeout** (按 snapshot 的预算; 超时即中止底层调用, 不是"放弃等待")
8
+ * ③ **cancellation** (外部 AbortSignal 透传到连接, 取消真发生)
9
+ *
10
+ * 边界 (K6 红线):
11
+ * · **只读**: 绝不改 provider 配置 / API key / 默认 URL / Global model / Run snapshot;
12
+ * · 不重做既有 `selectModel` / registry / catalog / Run snapshot —— 真正的 provider 调用由 **ports 注入**
13
+ * (内核不许 import 业务模块: `KERNEL_ALLOWED_IMPORT_PREFIXES = ['kernel/']`)。
14
+ *
15
+ * 通用判据 (K2 实证): **本文件出现后, 旧写口的调用点数不许增加** —— 由 `scanModelRuntimeFile` 机械核对。
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ModelRuntime = exports.ModelAbortError = exports.ModelTimeoutError = exports.ModelCapabilityError = exports.ModelCircuitOpenError = exports.BREAKER_POLICY = exports.BACKOFF_POLICY = void 0;
19
+ exports.snapshotFromSelection = snapshotFromSelection;
20
+ exports.isRateLimited = isRateLimited;
21
+ exports.backoffDelayMs = backoffDelayMs;
22
+ exports.countsTowardBreaker = countsTowardBreaker;
23
+ exports.modelPoolKey = modelPoolKey;
24
+ /** 429 识别 (端口可以把限流表达成返回值 status=429, 或抛一个带 status 的错) */
25
+ /**
26
+ * K10 ②: 把"有效选择"投影成内核的 `ModelSnapshot` —— **只读投影 + 校验**。
27
+ * 缺 provider/model ⇒ **返回 null** (调用方自己决定降级): 不许编一个假的填进去。
28
+ * `acquire()` 自己也会拒, 但这里先拒能省掉一次"猜配置"的机会 (而且这个函数是纯的, 好判)。
29
+ */
30
+ function snapshotFromSelection(sel) {
31
+ const provider = String(sel?.provider ?? '').trim();
32
+ const model = String(sel?.model ?? '').trim();
33
+ if (!provider || !model)
34
+ return null;
35
+ const out = { provider, model };
36
+ const baseUrl = String(sel?.baseUrl ?? '').trim();
37
+ if (baseUrl)
38
+ out.baseUrl = baseUrl;
39
+ if (typeof sel?.timeoutMs === 'number')
40
+ out.timeoutMs = sel.timeoutMs;
41
+ if (sel?.capabilities)
42
+ out.capabilities = sel.capabilities;
43
+ if (sel?.fallbackProviders)
44
+ out.fallbackProviders = sel.fallbackProviders;
45
+ return out;
46
+ }
47
+ function isRateLimited(x) {
48
+ if (!x || typeof x !== 'object')
49
+ return false;
50
+ const o = x;
51
+ if (o.status === 429 || o.status === '429')
52
+ return true;
53
+ if (typeof o.error === 'string' && /\b429\b|rate ?limit/i.test(o.error))
54
+ return true;
55
+ return false;
56
+ }
57
+ /** 退避参数 (写成数据; 实现与测试共用) */
58
+ exports.BACKOFF_POLICY = {
59
+ baseMs: 200,
60
+ factor: 2,
61
+ maxMs: 5_000,
62
+ /** 抖动比例 (±) —— 防止多个调用方同拍重试 */
63
+ jitter: 0.25,
64
+ maxRetries: 3,
65
+ };
66
+ /**
67
+ * 计算第 n 次重试的等待时长 (n 从 0 起): `min(base * factor^n, max)` 再乘 ±jitter。
68
+ * `retryAfterMs` (供应商给的 Retry-After) 存在时**取最大值** —— 尊重上游而不只是听自己的退避曲线。
69
+ */
70
+ function backoffDelayMs(n, opts) {
71
+ const exp = Math.min(exports.BACKOFF_POLICY.baseMs * exports.BACKOFF_POLICY.factor ** n, exports.BACKOFF_POLICY.maxMs);
72
+ const r = opts?.random ?? Math.random;
73
+ const jittered = exp * (1 + exports.BACKOFF_POLICY.jitter * (2 * r() - 1));
74
+ return Math.max(0, Math.round(Math.max(jittered, opts?.retryAfterMs ?? 0)));
75
+ }
76
+ /**
77
+ * **熔断策略** (数据; 实现与测试共用)。按 pool key 记连续失败 ⇒ 开路 ⇒ 冷却后半开探测。
78
+ * **什么算失败**: 网络/供应商故障类; **不算**: 取消 (调用方的选择) 与 429 (那是退避的活), 见 `countsTowardBreaker`。
79
+ */
80
+ exports.BREAKER_POLICY = {
81
+ failureThreshold: 3,
82
+ cooldownMs: 30_000,
83
+ /** 半开时允许几个探测 */
84
+ halfOpenProbes: 1,
85
+ why: '连续失败 ⇒ 开路 (fail fast, 不把故障放大) · 冷却后放一个探测 ⇒ 成功闭合, 失败重新开路',
86
+ };
87
+ /** 这次失败该不该计入熔断 */
88
+ function countsTowardBreaker(err) {
89
+ if (err instanceof ModelAbortError)
90
+ return false; // 调用方取消 ⇒ 不是供应商的错
91
+ if (err instanceof ModelTimeoutError)
92
+ return true; // 超时是供应商侧症状
93
+ if (isRateLimited(err))
94
+ return false; // 限流交给退避, 不熔断
95
+ return true;
96
+ }
97
+ class ModelCircuitOpenError extends Error {
98
+ retryAtMs;
99
+ constructor(retryAtMs) {
100
+ super(`熔断中 (冷却至 ${retryAtMs})`);
101
+ this.retryAtMs = retryAtMs;
102
+ this.name = 'ModelCircuitOpenError';
103
+ }
104
+ }
105
+ exports.ModelCircuitOpenError = ModelCircuitOpenError;
106
+ class ModelCapabilityError extends Error {
107
+ missing;
108
+ unknown;
109
+ constructor(missing, unknown = false) {
110
+ super(unknown ? `未知能力 (snapshot 未声明 capabilities, 无法确认 ${missing.join(', ')})` : `缺能力: ${missing.join(', ')}`);
111
+ this.missing = missing;
112
+ this.unknown = unknown;
113
+ this.name = 'ModelCapabilityError';
114
+ }
115
+ }
116
+ exports.ModelCapabilityError = ModelCapabilityError;
117
+ class ModelTimeoutError extends Error {
118
+ budgetMs;
119
+ constructor(budgetMs) {
120
+ super(`模型调用超时 (${budgetMs}ms)`);
121
+ this.budgetMs = budgetMs;
122
+ this.name = 'ModelTimeoutError';
123
+ }
124
+ }
125
+ exports.ModelTimeoutError = ModelTimeoutError;
126
+ class ModelAbortError extends Error {
127
+ constructor() { super('模型调用被取消'); this.name = 'ModelAbortError'; }
128
+ }
129
+ exports.ModelAbortError = ModelAbortError;
130
+ /** snapshot → 池键 (只用**只读**字段; 与 provider/model/端点相关, 与调用内容无关) */
131
+ function modelPoolKey(s) {
132
+ return `${s.provider}::${s.model}::${s.baseUrl ?? ''}`;
133
+ }
134
+ class ModelRuntime {
135
+ ports;
136
+ defaultTimeoutMs;
137
+ maxConcurrency;
138
+ pool = new Map();
139
+ stats = { reused: 0, opened: 0, timeouts: 0, aborts: 0, concurrencyWaits: 0, maxObservedConcurrency: 0, rateLimited: 0, retries: 0, lastBackoffMs: 0, circuitOpened: 0, failFast: 0, capabilityRejects: 0, halfOpenProbes: 0, breakerClosed: 0, fallbacks: 0, usageRecorded: 0, usageDropped: 0 };
140
+ /** 逐 key 熔断状态 */
141
+ breakers = new Map();
142
+ /** 每 key 当前在飞的调用数 + 等待队列 (多供应商并发: 各 key 各自算) */
143
+ active = new Map();
144
+ /** 等待者 → 它的 granted 标记 (转让路径用; 见 acquireSlot) */
145
+ grantedProbe = new WeakMap();
146
+ waiters = new Map();
147
+ constructor(ports, defaultTimeoutMs = 30_000,
148
+ /** 每个 key 的最大并发 (多供应商并发: 逐 key 计数, 互不阻塞) */
149
+ maxConcurrency = 4) {
150
+ this.ports = ports;
151
+ this.defaultTimeoutMs = defaultTimeoutMs;
152
+ this.maxConcurrency = maxConcurrency;
153
+ if (typeof ports?.openConnection !== 'function')
154
+ throw new Error('ModelRuntime 需要 openConnection 端口');
155
+ }
156
+ /** **只读入口**: 取一个租约 (可能需要先开连接; 同一 pool key 复用) */
157
+ async acquire(snapshot, opts) {
158
+ if (!snapshot?.provider || !snapshot?.model)
159
+ throw new Error('acquire 需要 provider + model (缺了不许猜)');
160
+ // **只读**: 只读这些字段, 一个都不写回 (snapshot 常被上层冻结; 写它会当场抛)
161
+ const frozen = snapshot;
162
+ // ① 能力检查 (**拒在开连接之前** ⇒ 不浪费一次连接; 只读 snapshot.capabilities, 不改任何东西)
163
+ const need = opts?.require ?? [];
164
+ if (need.length > 0) {
165
+ if (!frozen.capabilities) {
166
+ this.stats.capabilityRejects += 1;
167
+ throw new ModelCapabilityError(need, true);
168
+ }
169
+ const have = new Set(frozen.capabilities);
170
+ const missing = need.filter((c) => !have.has(c));
171
+ if (missing.length > 0) {
172
+ this.stats.capabilityRejects += 1;
173
+ throw new ModelCapabilityError(missing);
174
+ }
175
+ }
176
+ const key = modelPoolKey(frozen);
177
+ const { conn } = await this.ensureConnection(frozen);
178
+ const snapshotReadonly = frozen;
179
+ let released = false;
180
+ const self = this;
181
+ return {
182
+ snapshot: snapshotReadonly,
183
+ release: () => {
184
+ if (released)
185
+ return;
186
+ released = true;
187
+ const cur = self.pool.get(key);
188
+ if (cur)
189
+ cur.leases = Math.max(0, cur.leases - 1);
190
+ },
191
+ call: async (req, opts) => {
192
+ if (released)
193
+ return { ok: false, error: '租约已归还' };
194
+ const budget = snapshotReadonly.timeoutMs ?? this.defaultTimeoutMs;
195
+ const external = opts?.signal;
196
+ if (external?.aborted) {
197
+ self.stats.aborts += 1;
198
+ throw new ModelAbortError();
199
+ }
200
+ const started = (self.ports.now ?? Date.now)();
201
+ // **候选清单 = 主 provider + 备用 (来自 snapshot, 只读)** —— 运行时绝不改全局配置
202
+ const candidates = [snapshotReadonly];
203
+ for (const p of snapshotReadonly.fallbackProviders ?? []) {
204
+ if (p && p !== snapshotReadonly.provider)
205
+ candidates.push({ ...snapshotReadonly, provider: p });
206
+ }
207
+ let last = { ok: false, error: '没有可用的 provider' };
208
+ let totalAttempts = 0;
209
+ for (let ci = 0; ci < candidates.length; ci += 1) {
210
+ const snapI = candidates[ci];
211
+ const keyI = modelPoolKey(snapI);
212
+ const isFallback = ci > 0;
213
+ if (isFallback)
214
+ self.stats.fallbacks += 1;
215
+ try {
216
+ const gate = self.breakerGate(keyI);
217
+ if (gate) {
218
+ self.stats.failFast += 1;
219
+ // 熔断开路: **有下一个候选才回退**; 否则保持"抛出"的契约 (调用方能按类型区分快速失败)
220
+ if (ci + 1 < candidates.length) {
221
+ last = { ok: false, provider: snapI.provider, fallback: isFallback, error: `熔断中 (冷却至 ${gate})` };
222
+ continue;
223
+ }
224
+ throw new ModelCircuitOpenError(gate);
225
+ }
226
+ const connI = keyI === key ? conn : (await self.ensureConnection(snapI)).conn;
227
+ await self.acquireSlot(keyI, external);
228
+ try {
229
+ for (let attempt = 0;; attempt += 1) {
230
+ totalAttempts += 1;
231
+ let result;
232
+ try {
233
+ result = await self.callOnce(connI, req, external, budget);
234
+ }
235
+ catch (err) {
236
+ if (countsTowardBreaker(err))
237
+ self.onFailure(keyI);
238
+ else
239
+ self.onSuccess(keyI);
240
+ throw err; // 取消/超时: 取消要立刻冒出去 (不回退), 超时由外层 catch 处理
241
+ }
242
+ if (result.ok) {
243
+ self.onSuccess(keyI);
244
+ const ms = (self.ports.now ?? Date.now)() - started;
245
+ const out = { ...result, provider: snapI.provider, fallback: isFallback, reused: (self.pool.get(keyI)?.leases ?? 0) > 1, ms };
246
+ await self.recordUsage(snapI, { provider: snapI.provider, model: snapI.model, ms, attempts: totalAttempts, fallback: isFallback, usage: result.usage });
247
+ return out;
248
+ }
249
+ if (!isRateLimited(result)) {
250
+ if (countsTowardBreaker(result))
251
+ self.onFailure(keyI);
252
+ else
253
+ self.onSuccess(keyI);
254
+ last = { ...result, provider: snapI.provider, fallback: isFallback, reused: (self.pool.get(keyI)?.leases ?? 0) > 1, ms: (self.ports.now ?? Date.now)() - started };
255
+ break; // 非限流失败 ⇒ 交给下一个候选
256
+ }
257
+ self.stats.rateLimited += 1;
258
+ if (attempt >= exports.BACKOFF_POLICY.maxRetries) {
259
+ last = { ...result, provider: snapI.provider, fallback: isFallback, ms: (self.ports.now ?? Date.now)() - started, error: `限流重试用尽 (${attempt + 1} 次): ${String(result.error ?? '')}` };
260
+ break; // 限流用尽 ⇒ 也可回退 (容量问题不是 bug)
261
+ }
262
+ const wait = backoffDelayMs(attempt, { retryAfterMs: Number(result.retryAfterMs ?? 0) || undefined, random: self.ports.random });
263
+ self.stats.retries += 1;
264
+ self.stats.lastBackoffMs = wait;
265
+ await self.sleepOrAbort(wait, external); // 退避期间取消 ⇒ 立刻抛
266
+ }
267
+ }
268
+ finally {
269
+ self.releaseSlot(keyI);
270
+ }
271
+ }
272
+ catch (err) {
273
+ if (err instanceof ModelAbortError)
274
+ throw err; // 调用方取消 ⇒ 不回退, 直接冒出去
275
+ if (err instanceof ModelTimeoutError) {
276
+ // 超时: **有下一个候选才回退**; 最后一个候选的超时保持原有契约 (抛出, 调用方才能区分"超时"与"软失败")
277
+ if (ci + 1 < candidates.length) {
278
+ last = { ok: false, provider: snapI.provider, fallback: isFallback, error: err.message };
279
+ continue;
280
+ }
281
+ throw err;
282
+ }
283
+ throw err;
284
+ }
285
+ }
286
+ const tried = candidates.map((c) => c.provider).join(' → ');
287
+ last = { ...last, ms: (self.ports.now ?? Date.now)() - started, error: `全部候选失败 (${tried}): ${String(last.error ?? '')}` };
288
+ await self.recordUsage(candidates[candidates.length - 1], { provider: last.provider ?? '', model: candidates[candidates.length - 1].model, ms: last.ms ?? 0, attempts: totalAttempts, fallback: candidates.length > 1, usage: undefined });
289
+ return last;
290
+ },
291
+ };
292
+ }
293
+ /** 连接池: 同一 pool key 复用; 开不起来不留脏槽 */
294
+ async ensureConnection(snapshot) {
295
+ const key = modelPoolKey(snapshot);
296
+ let slot = this.pool.get(key);
297
+ if (slot)
298
+ this.stats.reused += 1;
299
+ if (!slot) {
300
+ const controller = new AbortController(); // 连接级取消 (租约级用各自的 signal)
301
+ const opening = this.ports.openConnection(snapshot, controller.signal);
302
+ this.stats.opened += 1;
303
+ slot = { conn: undefined, opening, leases: 0 };
304
+ this.pool.set(key, slot);
305
+ try {
306
+ slot.conn = await opening;
307
+ }
308
+ catch (err) {
309
+ this.pool.delete(key); // 开不起来就不留脏槽 (否则后续全被判"复用")
310
+ throw err;
311
+ }
312
+ }
313
+ else if (!slot.conn) {
314
+ slot.conn = await slot.opening;
315
+ }
316
+ return { conn: slot.conn, key };
317
+ }
318
+ /** usage 记录: 端口抛错**不许**影响调用结果 (只记 usageDropped) */
319
+ async recordUsage(snapshot, entry) {
320
+ if (typeof this.ports.recordUsage !== 'function')
321
+ return;
322
+ try {
323
+ await this.ports.recordUsage(entry);
324
+ this.stats.usageRecorded += 1;
325
+ }
326
+ catch {
327
+ this.stats.usageDropped += 1;
328
+ }
329
+ }
330
+ /** 一次尝试 (超时与取消都走受控 controller; 底层只认一个 signal) */
331
+ async callOnce(conn, req, external, budget) {
332
+ const ctl = new AbortController();
333
+ const onExternalAbort = () => ctl.abort();
334
+ external?.addEventListener?.('abort', onExternalAbort, { once: true });
335
+ let timer;
336
+ const timeoutPromise = new Promise((_, reject) => {
337
+ timer = setTimeout(() => { this.stats.timeouts += 1; ctl.abort(); reject(new ModelTimeoutError(budget)); }, budget);
338
+ });
339
+ try {
340
+ const res = await Promise.race([conn.call(req, ctl.signal), timeoutPromise]);
341
+ return (res ?? { ok: true });
342
+ }
343
+ catch (err) {
344
+ if (err instanceof ModelTimeoutError)
345
+ throw err;
346
+ if (ctl.signal.aborted) {
347
+ this.stats.aborts += 1;
348
+ throw new ModelAbortError();
349
+ }
350
+ throw err;
351
+ }
352
+ finally {
353
+ if (timer)
354
+ clearTimeout(timer);
355
+ external?.removeEventListener?.('abort', onExternalAbort);
356
+ }
357
+ }
358
+ /** 退避睡眠 (可取消; 不真等领域: 端口注入 sleep) */
359
+ async sleepOrAbort(ms, signal) {
360
+ if (signal?.aborted) {
361
+ this.stats.aborts += 1;
362
+ throw new ModelAbortError();
363
+ }
364
+ const sleep = this.ports.sleep ?? ((d) => new Promise((r) => setTimeout(r, d)));
365
+ let onAbort;
366
+ const aborted = new Promise((_, reject) => {
367
+ if (!signal)
368
+ return;
369
+ onAbort = () => { this.stats.aborts += 1; reject(new ModelAbortError()); };
370
+ signal.addEventListener('abort', onAbort, { once: true });
371
+ });
372
+ try {
373
+ await Promise.race([sleep(ms, signal), aborted]);
374
+ }
375
+ finally {
376
+ if (onAbort)
377
+ signal?.removeEventListener?.('abort', onAbort);
378
+ }
379
+ }
380
+ /** 熔断门: 开路且未到冷却 ⇒ 返回"何时可再试" (调用方快速失败); 冷却已过 ⇒ 转半开并放行探测 */
381
+ breakerGate(key) {
382
+ const b = this.breakers.get(key);
383
+ if (!b || b.state === 'closed')
384
+ return null;
385
+ const nowMs = (this.ports.now ?? Date.now)();
386
+ if (b.state === 'open' && nowMs >= b.openUntil) {
387
+ b.state = 'half-open';
388
+ b.probes = 0;
389
+ }
390
+ if (b.state === 'open')
391
+ return b.openUntil;
392
+ if (b.probes >= exports.BREAKER_POLICY.halfOpenProbes)
393
+ return b.openUntil; // 半开探测名额用完 ⇒ 仍然快速失败
394
+ b.probes += 1;
395
+ this.stats.halfOpenProbes += 1;
396
+ return null;
397
+ }
398
+ /** 成功: 半开 ⇒ 闭合 (清零); 闭合态失败计数清零 */
399
+ onSuccess(key) {
400
+ const b = this.breakers.get(key);
401
+ if (!b)
402
+ return;
403
+ if (b.state === 'half-open') {
404
+ b.state = 'closed';
405
+ b.failures = 0;
406
+ b.probes = 0;
407
+ this.stats.breakerClosed += 1;
408
+ return;
409
+ }
410
+ b.failures = 0;
411
+ }
412
+ /** 失败: 累计; 达阈值 ⇒ 开路; 半开里失败 ⇒ 立刻重新开路 (冷却重新计时) */
413
+ onFailure(key) {
414
+ const b = this.breakers.get(key) ?? { failures: 0, state: 'closed', openUntil: 0, probes: 0 };
415
+ b.failures += 1;
416
+ const halfOpenFail = b.state === 'half-open';
417
+ if (halfOpenFail || b.failures >= exports.BREAKER_POLICY.failureThreshold) {
418
+ b.state = 'open';
419
+ b.openUntil = (this.ports.now ?? Date.now)() + exports.BREAKER_POLICY.cooldownMs;
420
+ b.probes = 0;
421
+ this.stats.circuitOpened += 1;
422
+ }
423
+ this.breakers.set(key, b);
424
+ }
425
+ /** 只读: 逐 key 熔断状态 (诊断/测试) */
426
+ breakerStates() {
427
+ const out = {};
428
+ for (const [k, v] of this.breakers)
429
+ out[k] = { failures: v.failures, state: v.state, openUntil: v.openUntil };
430
+ return out;
431
+ }
432
+ /** 取并发槽 (逐 key; 排队可取消) */
433
+ async acquireSlot(key, signal) {
434
+ const cur = this.active.get(key) ?? 0;
435
+ if (cur < this.maxConcurrency) {
436
+ this.active.set(key, cur + 1);
437
+ this.stats.maxObservedConcurrency = Math.max(this.stats.maxObservedConcurrency, cur + 1);
438
+ return;
439
+ }
440
+ if (signal?.aborted) {
441
+ this.stats.aborts += 1;
442
+ throw new ModelAbortError();
443
+ }
444
+ this.stats.concurrencyWaits += 1;
445
+ const granted = { value: false };
446
+ await new Promise((resolve, reject) => {
447
+ const list = this.waiters.get(key) ?? [];
448
+ const entry = { resolve, reject, signal };
449
+ const onAbort = () => {
450
+ const i = list.indexOf(entry);
451
+ if (i >= 0)
452
+ list.splice(i, 1);
453
+ this.stats.aborts += 1;
454
+ reject(new ModelAbortError());
455
+ };
456
+ if (signal)
457
+ signal.addEventListener('abort', onAbort, { once: true });
458
+ list.push(entry);
459
+ this.waiters.set(key, list);
460
+ const wrappedResolve = () => { if (signal)
461
+ signal.removeEventListener('abort', onAbort); resolve(); };
462
+ entry.resolve = wrappedResolve;
463
+ // 槽是**转让**来的 (releaseSlot 直接 resolve 并置 granted) ⇒ 不再自增, 否则并发账虚高 (实测踩到)
464
+ this.grantedProbe.set(entry, granted);
465
+ });
466
+ if (!granted.value) {
467
+ this.active.set(key, (this.active.get(key) ?? 0) + 1);
468
+ this.stats.maxObservedConcurrency = Math.max(this.stats.maxObservedConcurrency, this.active.get(key));
469
+ }
470
+ }
471
+ /** 还槽: 有排队者就交给它 (不释放额度, 直接转让) */
472
+ releaseSlot(key) {
473
+ const list = this.waiters.get(key) ?? [];
474
+ const next = list.shift();
475
+ if (next) {
476
+ if (!this.waiters.get(key)?.length)
477
+ this.waiters.delete(key);
478
+ const probe = this.grantedProbe.get(next);
479
+ if (probe)
480
+ probe.value = true;
481
+ next.resolve();
482
+ return;
483
+ }
484
+ const cur = this.active.get(key) ?? 0;
485
+ if (cur <= 1)
486
+ this.active.delete(key);
487
+ else
488
+ this.active.set(key, cur - 1);
489
+ }
490
+ /** 只读统计 (诊断/门用) */
491
+ snapshotStats() {
492
+ return { connections: this.pool.size, defaultTimeoutMs: this.defaultTimeoutMs, ...this.stats };
493
+ }
494
+ /** 关闭全部连接 (进程收尾用) */
495
+ async closeAll() {
496
+ const all = [...this.pool.values()];
497
+ this.pool.clear();
498
+ await Promise.all(all.map(async (s) => {
499
+ try {
500
+ const c = s.conn ?? (await s.opening);
501
+ await c.close();
502
+ }
503
+ catch { /* 关不掉的连接不阻塞收尾 */ }
504
+ }));
505
+ }
506
+ }
507
+ exports.ModelRuntime = ModelRuntime;
508
+ //# sourceMappingURL=model-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-runtime.js","sourceRoot":"","sources":["../../../src/kernel/model-runtime.ts"],"names":[],"mappings":"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"}