w-dispatch-ai 1.0.3 → 1.0.5
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/README.md +153 -43
- package/dist/w-dispatch-ai.umd.js +2 -2
- package/dist/w-dispatch-ai.umd.js.map +1 -1
- package/docs/WDispatchAi.mjs.html +8 -4
- package/docs/adapters.mjs.html +36 -2
- package/docs/dfTimeoutMs.mjs.html +98 -0
- package/docs/dispatchAi.mjs.html +2 -2
- package/docs/dispatchAiFallback.mjs.html +55 -16
- package/docs/dispatchAiWkf.mjs.html +42 -8
- package/docs/dispatchAntigravity.mjs.html +23 -12
- package/docs/dispatchApiOpenaiCompat.mjs.html +40 -6
- package/docs/dispatchClaude.mjs.html +17 -4
- package/docs/dispatchCodex.mjs.html +16 -3
- package/docs/dispatchOpencode.mjs.html +16 -3
- package/docs/getCliArgs.mjs.html +2 -2
- package/docs/getErrorResult.mjs.html +2 -2
- package/docs/global.html +511 -66
- package/docs/index.html +2 -2
- package/docs/resolveProviders.mjs.html +189 -0
- package/docs/wkf_callAiWithFallback.mjs.html +22 -11
- package/docs/wkf_extractJsonLoose.mjs.html +2 -2
- package/docs/wkf_runFanout.mjs.html +7 -7
- package/docs/wkf_runFanoutPipeline.mjs.html +7 -7
- package/docs/wkf_runRolePipeline.mjs.html +6 -6
- package/g.mjs +30 -23
- package/package.json +1 -1
- package/src/WDispatchAi.mjs +6 -2
- package/src/adapters.mjs +34 -0
- package/src/dfTimeoutMs.mjs +26 -0
- package/src/dispatchAiFallback.mjs +53 -14
- package/src/dispatchAiWkf.mjs +40 -6
- package/src/dispatchAntigravity.mjs +21 -10
- package/src/dispatchApiOpenaiCompat.mjs +38 -4
- package/src/dispatchClaude.mjs +15 -2
- package/src/dispatchCodex.mjs +14 -1
- package/src/dispatchOpencode.mjs +14 -1
- package/src/providers.mjs +133 -0
- package/src/resolveProviders.mjs +117 -0
- package/src/wkf/callAiWithFallback.mjs +20 -9
- package/src/wkf/runFanout.mjs +5 -5
- package/src/wkf/runFanoutPipeline.mjs +5 -5
- package/src/wkf/runRolePipeline.mjs +4 -4
- package/test/tools/fakeServerForApiTest.mjs +14 -0
- package/test/unit-WDispatchAi.test.mjs +9 -3
- package/test/unit-dispatchAi.test.mjs +1 -1
- package/test/unit-dispatchAiFallback.test.mjs +25 -0
- package/test/unit-dispatchAntigravity.test.mjs +25 -5
- package/test/unit-dispatchApiOpenaiCompat.test.mjs +31 -0
- package/test/unit-providers.test.mjs +66 -0
- package/test/unit-resolveProviders.test.mjs +85 -0
package/README.md
CHANGED
|
@@ -40,6 +40,8 @@ Note:
|
|
|
40
40
|
| `dispatchCodex(prompt, opt)` | call a gpt model by openai codex cli |
|
|
41
41
|
| `dispatchAntigravity(prompt, opt)` | call an ai model by google antigravity cli (`agy`), a multi-model gateway (gemini, claude, gpt-oss) |
|
|
42
42
|
| `dispatchApiOpenaiCompat(prompt, opt)` | call an ai model by direct fetch to any OpenAI-compatible API (`baseURL`+`key`+`model`), no cli and no login required |
|
|
43
|
+
| `providers` | curated provider entries verified by real tests (cli and rest paths), pick or use all via `resolveProviders` |
|
|
44
|
+
| `resolveProviders(providers, opt)` | expand `envVar` → `keys` from env (comma-separated, missing vars auto-skipped), supports `pick` subset by id |
|
|
43
45
|
| `KINDS` | array of available kinds, `['opencode', 'claude', 'codex', 'antigravity', 'api-openai-compat']` |
|
|
44
46
|
|
|
45
47
|
#### Example:
|
|
@@ -138,29 +140,36 @@ let test = async () => {
|
|
|
138
140
|
console.log('invalid prompt:', r5.ok, r5.error)
|
|
139
141
|
// => invalid prompt: false prompt must be a non-empty string
|
|
140
142
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
143
|
+
//執行失敗時, 由ok、code、error與stderr判斷原因
|
|
144
|
+
//REST路徑之錯誤依HTTP狀態碼分流(401金鑰無效、429限流、5xx服務端), 判別比CLI之stderr字串可靠
|
|
145
|
+
let r6 = await wdi.dispatchApiOpenaiCompat(prompt, {
|
|
146
|
+
baseURL: 'https://apihub.agnes-ai.com/v1',
|
|
147
|
+
model: 'agnes-2.0-flash',
|
|
145
148
|
key: 'sk-invalid-key',
|
|
146
149
|
})
|
|
147
|
-
console.log('invalid key:', r6.ok, r6.code, r6.error, r6.stderr.includes('
|
|
148
|
-
// => invalid key: false
|
|
150
|
+
console.log('invalid key:', r6.ok, r6.code, r6.error, r6.stderr.includes('无效的令牌'))
|
|
151
|
+
// => invalid key: false 401 HTTP 401 true
|
|
149
152
|
|
|
150
153
|
//多供應商自動遞補: providers順序即優先序, 組內keys以游標輪替
|
|
151
|
-
//此例第1把金鑰無效 → 自動換組內下一把成功;
|
|
154
|
+
//此例第1把金鑰無效 → 自動換組內下一把成功; 若整組用盡會遞補下一組, 依序往下
|
|
155
|
+
//
|
|
156
|
+
//【id命名】id為游標鍵與日誌標籤, 須區分到「模型」而非只到「廠商」——
|
|
157
|
+
// 取'claude'則日後無法同時掛sonnet與opus, 且日誌看不出實際用了哪個模型;
|
|
158
|
+
// 同一模型經不同路徑(REST/CLI/不同閘道)取得時額度池與故障域各自獨立,
|
|
159
|
+
// 屬不同供應商, 故id須帶上路徑前綴加以區分
|
|
152
160
|
let r7 = await wdi.dispatchAiFallback(prompt, {
|
|
153
161
|
providers: [
|
|
162
|
+
//REST版排前面: 免CLI、快3~5倍, 純文字任務優先走此路
|
|
154
163
|
{
|
|
155
|
-
id: '
|
|
156
|
-
kind: '
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
keys: ['sk-invalid-key-demo',
|
|
160
|
-
timeoutMs: 180000,
|
|
164
|
+
id: 'agnes:agnes-2.0-flash',
|
|
165
|
+
kind: 'api-openai-compat',
|
|
166
|
+
baseURL: 'https://apihub.agnes-ai.com/v1',
|
|
167
|
+
model: 'agnes-2.0-flash',
|
|
168
|
+
keys: ['sk-invalid-key-demo', agnesKeys[0]], //第1把無效, 示範組內輪替
|
|
161
169
|
},
|
|
170
|
+
//同一個agnes模型之CLI版: 有工具能力但較慢, 額度池亦不同, 屬另一個供應商
|
|
162
171
|
{
|
|
163
|
-
id: 'agnes',
|
|
172
|
+
id: 'oc:agnes-ai/agnes-2.0-flash',
|
|
164
173
|
kind: 'opencode',
|
|
165
174
|
model: 'agnes-ai/agnes-2.0-flash',
|
|
166
175
|
provider: 'agnes-ai',
|
|
@@ -168,21 +177,21 @@ let test = async () => {
|
|
|
168
177
|
config: configAgnes, //第三方provider須另給定義
|
|
169
178
|
timeoutMs: 180000,
|
|
170
179
|
},
|
|
171
|
-
{ id: 'claude', kind: 'claude', model: 'sonnet' },
|
|
172
|
-
{ id: 'codex', kind: 'codex', model: 'gpt-5.6-luna', sandbox: 'read-only' },
|
|
173
|
-
{ id: '
|
|
180
|
+
{ id: 'claude:sonnet', kind: 'claude', model: 'sonnet' },
|
|
181
|
+
{ id: 'codex:gpt-5.6-luna', kind: 'codex', model: 'gpt-5.6-luna', sandbox: 'read-only' },
|
|
182
|
+
{ id: 'agy:gemini-3.6-flash-low', kind: 'antigravity', model: 'gemini-3.6-flash-low' },
|
|
174
183
|
],
|
|
175
184
|
budgetMs: 600000,
|
|
176
185
|
onEvent: (ev) => console.log(' event:', ev.type, ev.keyId, ev.error || ''),
|
|
177
186
|
})
|
|
178
187
|
console.log('fallback:', r7.ok, r7.providerId, r7.keyIndex, r7.stdout.trim())
|
|
179
188
|
console.log('tried:', r7.tried.map((x) => `${x.keyId}:${x.outcome}`).join(', '))
|
|
180
|
-
// => event: try
|
|
181
|
-
// => event: next-key
|
|
182
|
-
// => event: try
|
|
183
|
-
// => event: ok
|
|
184
|
-
// => fallback: true
|
|
185
|
-
// => tried:
|
|
189
|
+
// => event: try agnes:agnes-2.0-flash#0
|
|
190
|
+
// => event: next-key agnes:agnes-2.0-flash#0 HTTP 401
|
|
191
|
+
// => event: try agnes:agnes-2.0-flash#1
|
|
192
|
+
// => event: ok agnes:agnes-2.0-flash#1
|
|
193
|
+
// => fallback: true agnes:agnes-2.0-flash 1 完成
|
|
194
|
+
// => tried: agnes:agnes-2.0-flash#0:next-key, agnes:agnes-2.0-flash#1:ok
|
|
186
195
|
|
|
187
196
|
}
|
|
188
197
|
await test()
|
|
@@ -197,7 +206,7 @@ await test()
|
|
|
197
206
|
| `exe` | String | 各CLI名稱 | 執行檔名稱或絕對路徑,給予名稱時由系統`PATH`解析 |
|
|
198
207
|
| `model` | String | `''` | 模型ID,未給予則不帶模型旗標,由CLI自行決定 |
|
|
199
208
|
| `extraArgs` | Array | `[]` | 額外命令列旗標字串陣列,接於固定旗標之後 |
|
|
200
|
-
| `timeoutMs` | Integer | `
|
|
209
|
+
| `timeoutMs` | Integer | `300000` | 逾時毫秒,逾時將強制關閉子進程及其子孫程序;**全套件統一預設**(所有轉接器與各層一致,單一來源`dfTimeoutMs.mjs`),由opt傳入即可覆寫 |
|
|
201
210
|
| `cwd` | String | `process.cwd()` | 子進程工作目錄 |
|
|
202
211
|
| `validate` | String\|Function | `undefined` | `stdout`驗證規則,可用`'nonempty'`、`'json'`、`'min:100'`,多規則以逗號串接,亦可給予`(stdout)=>Boolean` |
|
|
203
212
|
| `maxRetries` | Integer | `0` | 失敗後最大重試次數,遇`ENOENT`或exit code 2視為不可重試而立即中止 |
|
|
@@ -229,11 +238,25 @@ await test()
|
|
|
229
238
|
| `effort` | String | `''` | `'low'`、`'medium'`、`'high'`,需agy>=1.1.11;建議搭配不帶檔位之基礎slug(如`gemini-3.1-pro`),與帶檔位slug併用且檔位不一致時agy回conflicts錯誤 |
|
|
230
239
|
| `skipPermissions` | Boolean | `true` | 是否帶`--dangerously-skip-permissions`旗標 |
|
|
231
240
|
| `printTimeout` | String | 由`timeoutMs`推導 | agy自身等待上限(如`'10m'`、`'570s'`),預設`timeoutMs`扣30秒緩衝(下限30秒),令CLI先於外層逾時而回報自身錯誤訊息 |
|
|
232
|
-
| `addDirs` | Array |
|
|
233
|
-
| `timeoutMs` | Integer | `300000` | agy
|
|
241
|
+
| `addDirs` | Array | 自動納入cwd | 加入workspace之目錄字串陣列,逐項展開為`--add-dir`。agy以自身scratch目錄為工作區而**不採子進程cwd**,故未給時自動納入有效cwd令檔案可視範圍與其他CLI一致;明示給陣列(含`[]`代表不揭露任何目錄)則完全尊重呼叫端 |
|
|
242
|
+
| `timeoutMs` | Integer | `300000` | 全套件統一預設(恰對齊agy自身print-timeout之5m0s) |
|
|
234
243
|
|
|
235
244
|
注意:agy之prompt走`--print`旗標而非stdin(agy介面如此),故prompt長度上限30000字元,超過回傳錯誤結果物件(不reject)。
|
|
236
245
|
|
|
246
|
+
#### Choosing CLI or API (判準):
|
|
247
|
+
選 `kind` 的唯一判準是**這一步需不需要「工具」**:
|
|
248
|
+
|
|
249
|
+
| 這次呼叫要做的事 | 選用 | 理由 |
|
|
250
|
+
| --- | --- | --- |
|
|
251
|
+
| 讀本機檔案、grep、執行指令、抓網頁、寫檔 | **CLI類**:`opencode`/`claude`/`codex`/`antigravity` | CLI本身是agentic harness,自帶完整工具迴圈,呼叫端什麼都不必做 |
|
|
252
|
+
| 摘要、分析、改寫、翻譯、產出JSON(素材皆已在prompt內) | **API類**:`api-openai-compat` | 免安裝免登入,且實測較快(Agnes:API 1~2.5s vs CLI 4~6s) |
|
|
253
|
+
|
|
254
|
+
**API類不支援工具,且不會自建工具迴圈**——實測(2026-08-11)閘道端零內建工具:Zen與Agnes對 `tools:[{type:'web_search'}]` 皆回400並要求 `function.parameters`,即只接受「呼叫端自行定義且自行執行」的function工具。協定層雖支援function calling(Zen之 `nemotron-3-ultra-free` 與Agnes皆實測回 `finish_reason:'tool_calls'`),但工具的定義、執行、錯誤處理與安全邊界全須自行實作維護,等同重造CLI已提供的harness。故模型回 `tool_calls` 時本套件一律以 `TOOL_CALLS_UNSUPPORTED` 回報失敗,不假裝成功。
|
|
255
|
+
|
|
256
|
+
另注意 `tool_calls` 有**會話束縛**(`tool_call_id` 須於同一條messages串內回填),無法暫停後跨行程外傳給上層agent代跑;工作流各名額(如 `runFanout` 的agents)也只是同行程的async函數呼叫而非獨立agent,故「讓外殼agent提供工具給工作流內的模型使用」在本架構下不成立——**需要工具就選CLI類kind**。
|
|
257
|
+
|
|
258
|
+
**混用才是常態**:同一條 `dispatchAiFallback` 鏈可逐條目混搭kind,工作流各階段亦然——產生候選與整合收斂等純文字階段走API,需要翻閱專案檔案的階段換CLI。
|
|
259
|
+
|
|
237
260
|
#### Options only for dispatchApiOpenaiCompat:
|
|
238
261
|
| key | type | default | description |
|
|
239
262
|
| --- | --- | --- | --- |
|
|
@@ -243,7 +266,7 @@ await test()
|
|
|
243
266
|
| `system` | String | `''` | system提示詞,置於messages首位 |
|
|
244
267
|
| `body` | Object | `{}` | 額外請求本體(`temperature`、`max_tokens`、`response_format`等),同名鍵覆寫預設 |
|
|
245
268
|
| `headers` | Object | `{}` | 額外請求標頭 |
|
|
246
|
-
| `timeoutMs` | Integer | `
|
|
269
|
+
| `timeoutMs` | Integer | `300000` | 逾時毫秒,逾時中止請求(含回應串流讀取);全套件統一預設 |
|
|
247
270
|
| `maxRetries` | Integer | `0` | 失敗重試次數;**4xx(429除外)為客戶端錯誤不重試**,429/5xx/網路錯誤/逾時線性退避重試 |
|
|
248
271
|
| `retryDelayMs` | Integer | `5000` | 重試間隔,實際為`retryDelayMs`×次數且上限15000ms |
|
|
249
272
|
|
|
@@ -253,15 +276,27 @@ await test()
|
|
|
253
276
|
| key | type | default | description |
|
|
254
277
|
| --- | --- | --- | --- |
|
|
255
278
|
| `providers` | Array | 必填 | 供應商條目陣列,**順序即優先序**。條目除`id`、`keys`外即該次調用之opt,原樣透傳對應轉接器(`kind`、`model`、`exe`、`provider`、`config`、`sandbox`、`timeoutMs`等皆放條目內) |
|
|
256
|
-
| `providers[].id` | String | 條目索引 |
|
|
279
|
+
| `providers[].id` | String | 條目索引 | 群組識別,游標以此為鍵、亦為日誌標籤;本套件不解讀其內容,命名規則見下方 |
|
|
257
280
|
| `providers[].keys` | Array | `[]` | 同一服務之多把API key,逐次注入輪替(`kind`為`opencode`時須同時給`provider`);省略代表沿用CLI登入狀態 |
|
|
258
281
|
| `budgetMs` | Integer | 不限 | 整輪遞補之時間上限,剩餘預算會壓進每次呼叫之`timeoutMs` |
|
|
259
282
|
| `minAttemptMs` | Integer | `20000` | 單次嘗試之最低剩餘預算,低於此值即停止並回報`budget exhausted` |
|
|
260
283
|
| `store` | Object | 行程內記憶體 | 狀態持久化`{get:()=>state, set:(state)=>{}}`,state僅含`cursors`(逐群組游標);假定單行程序列調用 |
|
|
261
|
-
| `onEvent` | Function | 無 | 事件回調`(ev)=>{}`,`ev.type`為`'try'`、`'ok'`、`'next-key'`、`'skip-group'`、`'budget-out'
|
|
284
|
+
| `onEvent` | Function | 無 | 事件回調`(ev)=>{}`,`ev.type`為`'try'`、`'ok'`、`'next-key'`、`'skip-group'`、`'budget-out'`;失敗事件另帶`stdout`(被拒回覆)與`stderr`(錯誤輸出,皆已截斷)供診斷;回調拋出例外不影響主流程 |
|
|
262
285
|
|
|
263
286
|
頂層其餘設定(`timeoutMs`、`validate`、`maxRetries`等)為各attempt之共用預設,條目可覆寫;`maxRetries`建議維持預設`0`,韌性交給換家而非重試同一家。
|
|
264
287
|
|
|
288
|
+
**條目 `id` 之命名規則**(呼叫端負責設計,本套件只當作不透明字串使用):
|
|
289
|
+
|
|
290
|
+
`id` 在套件內只有兩個用途——游標的物件鍵(`state.cursors[id]`)與日誌標籤(`providerId`、`keyId` = `` `${id}#${keyIndex}` ``)。不查表、不比對、無格式要求,故「什麼算同一個供應商」由呼叫端定義。
|
|
291
|
+
|
|
292
|
+
| 規則 | 說明 |
|
|
293
|
+
| --- | --- |
|
|
294
|
+
| **區分到「模型」而非只到「廠商」** | ❌ `id: 'claude'` — 日後無法同時掛 sonnet 與 opus,日誌也看不出用了哪個模型<br>✅ `id: 'claude:sonnet'`、`id: 'claude:opus'` |
|
|
295
|
+
| **同一模型經不同路徑時須帶路徑** | 同一個 laguna 可經 Poolside 官方 REST、OpenRouter、opencode CLI 三條路,額度池與故障域各自獨立,屬三個供應商:<br>`'poolside:laguna-s-2.1'`、`'or:poolside/laguna-s-2.1:free'`、`'oc:poolside/poolside/laguna-s-2.1'` |
|
|
296
|
+
| **務必給、務必唯一** | 未給時回退為**陣列索引字串**——索引是位置不是身分,日後於鏈中插入條目會令後續條目繼承他人的游標進度(輪替張冠李戴)。兩個條目同 `id` 則共用同一游標且日誌無法區分。 |
|
|
297
|
+
|
|
298
|
+
**同一組金鑰用於多個條目時**(例如某模型的 CLI 版與 REST 版共用同一批金鑰),各條目游標**獨立**:兩者各自從游標起點輪替,同一把金鑰可能被連續使用而另一把閒置。要共享輪替進度就給**相同** `id`(代價:日誌無法區分兩者);要能區分就分開命名(代價:額度不均攤)。此取捨由呼叫端依實際需求決定。
|
|
299
|
+
|
|
265
300
|
**失敗分流規則**:
|
|
266
301
|
| 失敗 | 判定 | 處置 |
|
|
267
302
|
| --- | --- | --- |
|
|
@@ -317,38 +352,38 @@ await test()
|
|
|
317
352
|
```alias
|
|
318
353
|
{
|
|
319
354
|
// ...ok, stdout, stderr, code, error, durationMs, attempts, pid...
|
|
320
|
-
providerId: '
|
|
321
|
-
keyIndex: 1,
|
|
322
|
-
kind: '
|
|
323
|
-
model: '
|
|
324
|
-
tried: [ //完整嘗試歷程,
|
|
325
|
-
{ providerId: '
|
|
326
|
-
{ providerId: '
|
|
355
|
+
providerId: 'agnes:agnes-2.0-flash', //實際使用之群組(即條目id)
|
|
356
|
+
keyIndex: 1, //實際使用之金鑰索引, 無keys時為null
|
|
357
|
+
kind: 'api-openai-compat',
|
|
358
|
+
model: 'agnes-2.0-flash',
|
|
359
|
+
tried: [ //完整嘗試歷程, 成功時亦回傳; 失敗項另含stdout(被拒回覆)與stderr(錯誤輸出, 皆已截斷)供診斷
|
|
360
|
+
{ providerId: 'agnes:agnes-2.0-flash', keyIndex: 0, keyId: 'agnes:agnes-2.0-flash#0', outcome: 'next-key', error: 'HTTP 401', durationMs: 105 },
|
|
361
|
+
{ providerId: 'agnes:agnes-2.0-flash', keyIndex: 1, keyId: 'agnes:agnes-2.0-flash#1', outcome: 'ok', durationMs: 1161 },
|
|
327
362
|
],
|
|
328
363
|
}
|
|
329
364
|
```
|
|
330
365
|
|
|
331
366
|
#### dispatchAiWkf (workflow factory):
|
|
332
|
-
注入一次provider定義表(名稱 → `dispatchAiFallback`條目)與共用預設,之後以名稱宣告工作流;名稱查無定義即回報錯誤(fail fast)。回覆經寬鬆JSON解析(`extractJsonLoose`)+自訂`check`驗證,非法回覆視為該家失敗而自動遞補;預設於prompt前掛「禁止建檔」約束(`promptPrefix: ''`可關閉)。
|
|
367
|
+
注入一次provider定義表(名稱 → `dispatchAiFallback`條目)與共用預設,之後以名稱宣告工作流;名稱查無定義即回報錯誤(fail fast)。回覆經寬鬆JSON解析(`extractJsonLoose`)+自訂`check`驗證,非法回覆視為該家失敗而自動遞補;預設於prompt前掛「禁止建檔」約束(`promptPrefix: ''`可關閉);措辭豁免唯讀查閱——codex以shell讀檔,一律禁指令會令其無法讀取專案檔案且靜默回拒答(2026-08-13實測)。
|
|
333
368
|
|
|
334
369
|
```alias
|
|
335
370
|
let wkf = wdi.dispatchAiWkf({
|
|
336
371
|
providers: {
|
|
337
|
-
'deepseek': { kind: 'opencode', model: '
|
|
338
|
-
'sonnet': { kind: 'claude', model: 'sonnet' },
|
|
339
|
-
'luna': { kind: 'codex', model: 'gpt-5.6-luna' },
|
|
372
|
+
'zen:deepseek-v4-flash-free': { kind: 'api-openai-compat', baseURL: 'https://opencode.ai/zen/v1', model: 'deepseek-v4-flash-free', keys: [...] },
|
|
373
|
+
'claude:sonnet': { kind: 'claude', model: 'sonnet' },
|
|
374
|
+
'codex:gpt-5.6-luna': { kind: 'codex', model: 'gpt-5.6-luna' },
|
|
340
375
|
},
|
|
341
376
|
defaults: { timeoutMs: 300000 },
|
|
342
377
|
})
|
|
343
378
|
|
|
344
379
|
//單一名額: 主模型+自帶遞補鏈
|
|
345
|
-
let r1 = await wkf.callAi('...prompt...', { spec: { use: 'deepseek', fallback: ['sonnet'] }, check: (j) => !!j.essence })
|
|
380
|
+
let r1 = await wkf.callAi('...prompt...', { spec: { use: 'zen:deepseek-v4-flash-free', fallback: ['claude:sonnet'] }, check: (j) => !!j.essence })
|
|
346
381
|
|
|
347
382
|
//Fanout: 並行多開執行 → 單點整合收斂(候選未達minCandidates時以首位候選為成果不硬整合)
|
|
348
|
-
let r2 = await wkf.runFanout({ task, agents: [{ use: 'deepseek', fallback: ['sonnet'] }, { use: 'sonnet' }], integrate: { use: 'luna' }, check })
|
|
383
|
+
let r2 = await wkf.runFanout({ task, agents: [{ use: 'zen:deepseek-v4-flash-free', fallback: ['claude:sonnet'] }, { use: 'claude:sonnet' }], integrate: { use: 'codex:gpt-5.6-luna' }, check })
|
|
349
384
|
|
|
350
385
|
//RolePipeline: 多角色串行鏈, 各階段可自帶AI/遞補/檢核, prompt收ctx={input,prev,results,index}
|
|
351
|
-
let r3 = await wkf.runRolePipeline({ input, stages: [{ id: 'draft', use: 'sonnet', prompt: (ctx) => `...` }, { id: 'audit', use: 'luna', prompt: (ctx) => `...${JSON.stringify(ctx.prev)}` }] })
|
|
386
|
+
let r3 = await wkf.runRolePipeline({ input, stages: [{ id: 'draft', use: 'claude:sonnet', prompt: (ctx) => `...` }, { id: 'audit', use: 'codex:gpt-5.6-luna', prompt: (ctx) => `...${JSON.stringify(ctx.prev)}` }] })
|
|
352
387
|
|
|
353
388
|
//FanoutPipeline: Fanout成果接RolePipeline(品質天花板組合)
|
|
354
389
|
let r4 = await wkf.runFanoutPipeline({ task, agents, integrate, stages, check })
|
|
@@ -356,6 +391,81 @@ let r4 = await wkf.runFanoutPipeline({ task, agents, integrate, stages, check })
|
|
|
356
391
|
|
|
357
392
|
各工作流皆部分接受:個別名額/階段失敗不炸整輪,已完成成果完整回傳(`candidates`/`results`+`failedStage`),可只重跑失敗段。
|
|
358
393
|
|
|
394
|
+
#### Timeout 總覽(各層預設、行為與調整方式):
|
|
395
|
+
|
|
396
|
+
**一句話**:全套件單一預設 **`300000`(5分鐘,單一來源 [src/dfTimeoutMs.mjs](https://github.com/yuda-lyu/w-dispatch-ai/blob/master/src/dfTimeoutMs.mjs))**——不論直接呼叫轉接器、或經 `dispatchAiFallback`/工作流,「單次AI嘗試」的逾時都是它;工作流本身**沒有**獨立的總時限參數(總時長=結構×單次,見下方公式)。
|
|
397
|
+
|
|
398
|
+
**階梯結構**(由細至粗,數值須嚴格遞增):
|
|
399
|
+
|
|
400
|
+
```alias
|
|
401
|
+
agy --print-timeout(自動=timeoutMs−30s)
|
|
402
|
+
< timeoutMs(單次嘗試,統一預設300000)
|
|
403
|
+
< budgetMs(單一名額之遞補鏈總預算,預設null不限)
|
|
404
|
+
< 工作流總時長(無獨立參數,由結構推導)
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
**各參數一覽**:
|
|
408
|
+
|
|
409
|
+
| 參數 | 作用範圍 | 預設 | 逾時後果/備註 |
|
|
410
|
+
| --- | --- | --- | --- |
|
|
411
|
+
| `timeoutMs` | **單次AI嘗試**,所有kind一致(直接呼叫與工作流內皆同一數字) | `300000` | CLI強殺子進程樹/API中止請求;`error`以`TIMEOUT`開頭 → fallback視為**與金鑰無關**,整組跳過(不逐把空耗) |
|
|
412
|
+
| `printTimeout` | 僅antigravity,agy自身等待上限 | 自動=timeoutMs−30s | 令CLI先於外層逾時,錯誤訊息來自agy自身;一般無須手動設 |
|
|
413
|
+
| `budgetMs` | `dispatchAiFallback`整輪遞補(=工作流的一個名額/階段) | `null`不限 | 有值時剩餘預算會壓進每次嘗試的timeoutMs;用盡回`budget exhausted` |
|
|
414
|
+
| `minAttemptMs` | 搭配budgetMs的開工門檻 | `20000` | 剩餘預算低於此值即不再開工;**無budgetMs時不作用** |
|
|
415
|
+
| 工作流總時長 | `runFanout`/`runRolePipeline`/`runFanoutPipeline` | 無(刻意) | 由結構推導,要上限就設各名額的`budgetMs` |
|
|
416
|
+
|
|
417
|
+
**工作流總時長公式**(每次嘗試≤timeoutMs;K=遞補鏈組數、M=階段數):
|
|
418
|
+
|
|
419
|
+
| 工作流 | 正常情況 | 最壞情況(多家連環卡死) |
|
|
420
|
+
| --- | --- | --- |
|
|
421
|
+
| `callAi`單一名額 | 首家耗時 | K×timeoutMs(逾時型失敗每組只燒一次即跳組;額度型失敗為秒級) |
|
|
422
|
+
| `runFanout` | 最慢名額+整合名額(agents**並行**) | ≈2×K×timeoutMs |
|
|
423
|
+
| `runRolePipeline` | Σ各階段(**序列**) | ≈M×K×timeoutMs |
|
|
424
|
+
| `runFanoutPipeline` | 上兩者相加 | ≈(2+M)×K×timeoutMs |
|
|
425
|
+
|
|
426
|
+
量級感受:內建providers 9條全上陣時,一個名額最壞9×300s=45min;3階段RolePipeline最壞約2.25小時(正常情況為秒級~分鐘級,最壞只在多家連環卡死時發生)。
|
|
427
|
+
|
|
428
|
+
**外部調整四層**(細者覆蓋粗者,全部免改套件程式):
|
|
429
|
+
1. **全域**:`dispatchAiWkf({ defaults: { timeoutMs, budgetMs, minAttemptMs } })`
|
|
430
|
+
2. **單工作流**:`runFanout({ callOpt: { timeoutMs... } })`
|
|
431
|
+
3. **單階段/名額**:stage/agent 規格上直接給 `timeoutMs`/`budgetMs`
|
|
432
|
+
4. **單條目**:provider 條目給 `timeoutMs`(如已知會卡死之供應商給小蓋子,卡死成本從名額預算縮為該蓋子)
|
|
433
|
+
|
|
434
|
+
**三種常用設定**:
|
|
435
|
+
|
|
436
|
+
```alias
|
|
437
|
+
//1. 簡單任務(秒級~分鐘級): 什麼都不用設, 全走統一預設300000
|
|
438
|
+
|
|
439
|
+
//2. 要給工作流總上限: 設每名額budgetMs(序列工作流總上限≈Σ各階段budget; fanout≈名額+整合)
|
|
440
|
+
let wkf = wdi.dispatchAiWkf({ providers: table, defaults: {
|
|
441
|
+
budgetMs: 900000, //每名額至多15min → 3階段RolePipeline總上限≈45min
|
|
442
|
+
minAttemptMs: 60000, //剩餘不足1min就不再開工
|
|
443
|
+
} })
|
|
444
|
+
|
|
445
|
+
//3. 複雜任務(單一AI工作約15min, fallback須能走到最末):
|
|
446
|
+
let wkf2 = wdi.dispatchAiWkf({ providers: table, defaults: {
|
|
447
|
+
timeoutMs: 1200000, //20min=15min工作+33%餘裕(太緊會殺掉合法執行)
|
|
448
|
+
minAttemptMs: 1200000, //剩餘不足完整視窗即不開工——開了也不可能完成, 純浪費
|
|
449
|
+
budgetMs: 4800000, //鏈長K×timeoutMs(K=4→80min): 逾時每組只燒一次即跳組, 故保證走得到最末; 無外部時限可null
|
|
450
|
+
} })
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
#### providers.mjs(內建供應商定義檔):
|
|
454
|
+
[src/providers.mjs](https://github.com/yuda-lyu/w-dispatch-ai/blob/master/src/providers.mjs) 收錄實測可用之條目(CLI版與REST版),金鑰以 `envVar` 間接引用(機密只放 `.env`),經 `resolveProviders` 展開後即可直接使用或以 `pick` 自選:
|
|
455
|
+
|
|
456
|
+
```alias
|
|
457
|
+
import wdi from 'w-dispatch-ai'
|
|
458
|
+
process.loadEnvFile('./.env') //OPENCODE_KEYS/AGNES_KEYS/POOLSIDE_KEYS, 逗號分隔多把
|
|
459
|
+
|
|
460
|
+
//全取: envVar → keys, 缺環境變數之條目自動停用並列入skipped
|
|
461
|
+
let { providers, table, skipped } = wdi.resolveProviders(wdi.providers)
|
|
462
|
+
|
|
463
|
+
//自選: pick順序即遞補優先序; providers餵dispatchAiFallback, table餵dispatchAiWkf
|
|
464
|
+
let picked = wdi.resolveProviders(wdi.providers, { pick: ['agnes:agnes-2.0-flash', 'claude:sonnet'] })
|
|
465
|
+
let r = await wdi.dispatchAiFallback(prompt, { providers: picked.providers, timeoutMs: 1200000 })
|
|
466
|
+
let wkf = wdi.dispatchAiWkf({ providers: picked.table, defaults: { timeoutMs: 1200000 } })
|
|
467
|
+
```
|
|
468
|
+
|
|
359
469
|
#### Known design notes:
|
|
360
470
|
- `dispatchAi(kind, prompt, opt)`會把整個`opt`原樣轉傳對應轉接器,該轉接器用不到的鍵(例如輪替條目物件內的`kind`)會被忽略,故「供應商條目物件直接當`opt`」是預期用法;`dispatchAiFallback`之providers條目沿用同一約定。
|
|
361
471
|
- `dispatchAiFallback`為單向單輪:全數群組試畢即回傳最後一筆失敗結果與`tried`歷程,不回頭重試已敗的組。跨次執行僅記憶游標,不設金鑰停用清單(理由見上方失敗分流說明);需跨次跳過特定金鑰時,由呼叫端依`tried`/`onEvent`內之`error`與`stderr`自行決策。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* w-dispatch-ai v1.0.
|
|
2
|
+
* w-dispatch-ai v1.0.5
|
|
3
3
|
* (c) 2018-2021 yuda-lyu(semisphere)
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("child_process"),require("path"),require("fs")):"function"==typeof define&&define.amd?define(["child_process","path","fs"],e):(t="undefined"!=typeof globalThis?globalThis:t||self)["w-dispatch-ai"]=e(t.child_process,t.path,t.fs)}(this,function(t,e,r){"use strict";var n="object"==typeof global&&global&&global.Object===Object&&global,o="object"==typeof self&&self&&self.Object===Object&&self,u=n||o||Function("return this")(),i=u.Symbol,l=Object.prototype,a=l.hasOwnProperty,s=l.toString,c=i?i.toStringTag:void 0;var f=Object.prototype.toString;var p=i?i.toStringTag:void 0;function d(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":p&&p in Object(t)?function(t){var e=a.call(t,c),r=t[c];try{t[c]=void 0;var n=!0}catch(t){}var o=s.call(t);return n&&(e?t[c]=r:delete t[c]),o}(t):function(t){return f.call(t)}(t)}function y(t){return null!=t&&"object"==typeof t}function v(t){return y(t)&&"[object Arguments]"==d(t)}var h=Object.prototype,b=h.hasOwnProperty,g=h.propertyIsEnumerable,m=v(function(){return arguments}())?v:function(t){return y(t)&&b.call(t,"callee")&&!g.call(t,"callee")},j=m,k=Array.isArray;var w="object"==typeof exports&&exports&&!exports.nodeType&&exports,O=w&&"object"==typeof module&&module&&!module.nodeType&&module,_=O&&O.exports===w?u.Buffer:void 0,x=(_?_.isBuffer:void 0)||function(){return!1},A=/^(?:0|[1-9]\d*)$/;function S(t,e){var r=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==r||"symbol"!=r&&A.test(t))&&t>-1&&t%1==0&&t<e}function M(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}var I={};function $(t){return function(e){return t(e)}}I["[object Float32Array]"]=I["[object Float64Array]"]=I["[object Int8Array]"]=I["[object Int16Array]"]=I["[object Int32Array]"]=I["[object Uint8Array]"]=I["[object Uint8ClampedArray]"]=I["[object Uint16Array]"]=I["[object Uint32Array]"]=!0,I["[object Arguments]"]=I["[object Array]"]=I["[object ArrayBuffer]"]=I["[object Boolean]"]=I["[object DataView]"]=I["[object Date]"]=I["[object Error]"]=I["[object Function]"]=I["[object Map]"]=I["[object Number]"]=I["[object Object]"]=I["[object RegExp]"]=I["[object Set]"]=I["[object String]"]=I["[object WeakMap]"]=!1;var N="object"==typeof exports&&exports&&!exports.nodeType&&exports,T=N&&"object"==typeof module&&module&&!module.nodeType&&module,D=T&&T.exports===N&&n.process,E=function(){try{var t=T&&T.require&&T.require("util").types;return t||D&&D.binding&&D.binding("util")}catch(t){}}(),P=E&&E.isTypedArray,U=P?$(P):function(t){return y(t)&&M(t.length)&&!!I[d(t)]},C=Object.prototype.hasOwnProperty;function F(t,e){var r=k(t),n=!r&&j(t),o=!r&&!n&&x(t),u=!r&&!n&&!o&&U(t),i=r||n||o||u,l=i?function(t,e){for(var r=-1,n=Array(t);++r<t;)n[r]=e(r);return n}(t.length,String):[],a=l.length;for(var s in t)!e&&!C.call(t,s)||i&&("length"==s||o&&("offset"==s||"parent"==s)||u&&("buffer"==s||"byteLength"==s||"byteOffset"==s)||S(s,a))||l.push(s);return l}var z=Object.prototype;function B(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||z)}function R(t,e){return function(r){return t(e(r))}}var L=R(Object.keys,Object),J=Object.prototype.hasOwnProperty;function W(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function V(t){if(!W(t))return!1;var e=d(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}function H(t){return null!=t&&M(t.length)&&!V(t)}function q(t){return H(t)?F(t):function(t){if(!B(t))return L(t);var e=[];for(var r in Object(t))J.call(t,r)&&"constructor"!=r&&e.push(r);return e}(t)}function G(t){return"symbol"==typeof t||y(t)&&"[object Symbol]"==d(t)}var K=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Y=/^\w*$/;var Q,X=u["__core-js_shared__"],Z=(Q=/[^.]+$/.exec(X&&X.keys&&X.keys.IE_PROTO||""))?"Symbol(src)_1."+Q:"";var tt=Function.prototype.toString;function et(t){if(null!=t){try{return tt.call(t)}catch(t){}try{return t+""}catch(t){}}return""}var rt=/^\[object .+?Constructor\]$/,nt=Function.prototype,ot=Object.prototype,ut=nt.toString,it=ot.hasOwnProperty,lt=RegExp("^"+ut.call(it).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function at(t){return!(!W(t)||(e=t,Z&&Z in e))&&(V(t)?lt:rt).test(et(t));var e}function st(t,e){var r=function(t,e){return null==t?void 0:t[e]}(t,e);return at(r)?r:void 0}var ct=st(Object,"create");var ft=Object.prototype.hasOwnProperty;var pt=Object.prototype.hasOwnProperty;function dt(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}function yt(t,e){return t===e||t!=t&&e!=e}function vt(t,e){for(var r=t.length;r--;)if(yt(t[r][0],e))return r;return-1}dt.prototype.clear=function(){this.__data__=ct?ct(null):{},this.size=0},dt.prototype.delete=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e},dt.prototype.get=function(t){var e=this.__data__;if(ct){var r=e[t];return"__lodash_hash_undefined__"===r?void 0:r}return ft.call(e,t)?e[t]:void 0},dt.prototype.has=function(t){var e=this.__data__;return ct?void 0!==e[t]:pt.call(e,t)},dt.prototype.set=function(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=ct&&void 0===e?"__lodash_hash_undefined__":e,this};var ht=Array.prototype.splice;function bt(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}bt.prototype.clear=function(){this.__data__=[],this.size=0},bt.prototype.delete=function(t){var e=this.__data__,r=vt(e,t);return!(r<0)&&(r==e.length-1?e.pop():ht.call(e,r,1),--this.size,!0)},bt.prototype.get=function(t){var e=this.__data__,r=vt(e,t);return r<0?void 0:e[r][1]},bt.prototype.has=function(t){return vt(this.__data__,t)>-1},bt.prototype.set=function(t,e){var r=this.__data__,n=vt(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this};var gt=st(u,"Map");function mt(t,e){var r,n,o=t.__data__;return("string"==(n=typeof(r=e))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==r:null===r)?o["string"==typeof e?"string":"hash"]:o.map}function jt(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}jt.prototype.clear=function(){this.size=0,this.__data__={hash:new dt,map:new(gt||bt),string:new dt}},jt.prototype.delete=function(t){var e=mt(this,t).delete(t);return this.size-=e?1:0,e},jt.prototype.get=function(t){return mt(this,t).get(t)},jt.prototype.has=function(t){return mt(this,t).has(t)},jt.prototype.set=function(t,e){var r=mt(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this};function kt(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var r=function(){var n=arguments,o=e?e.apply(this,n):n[0],u=r.cache;if(u.has(o))return u.get(o);var i=t.apply(this,n);return r.cache=u.set(o,i)||u,i};return r.cache=new(kt.Cache||jt),r}kt.Cache=jt;var wt,Ot,_t,xt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,At=/\\(\\)?/g,St=(wt=function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(xt,function(t,r,n,o){e.push(n?o.replace(At,"$1"):r||t)}),e},Ot=kt(wt,function(t){return 500===_t.size&&_t.clear(),t}),_t=Ot.cache,Ot),Mt=St;function It(t,e){for(var r=-1,n=null==t?0:t.length,o=Array(n);++r<n;)o[r]=e(t[r],r,t);return o}var $t=i?i.prototype:void 0,Nt=$t?$t.toString:void 0;function Tt(t){if("string"==typeof t)return t;if(k(t))return It(t,Tt)+"";if(G(t))return Nt?Nt.call(t):"";var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}function Dt(t){return null==t?"":Tt(t)}function Et(t,e){return k(t)?t:function(t,e){if(k(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!G(t))||Y.test(t)||!K.test(t)||null!=e&&t in Object(e)}(t,e)?[t]:Mt(Dt(t))}function Pt(t){if("string"==typeof t||G(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}function Ut(t,e){for(var r=0,n=(e=Et(e,t)).length;null!=t&&r<n;)t=t[Pt(e[r++])];return r&&r==n?t:void 0}function Ct(t,e,r){var n=null==t?void 0:Ut(t,e);return void 0===n?r:n}function Ft(t){var e=this.__data__=new bt(t);this.size=e.size}Ft.prototype.clear=function(){this.__data__=new bt,this.size=0},Ft.prototype.delete=function(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r},Ft.prototype.get=function(t){return this.__data__.get(t)},Ft.prototype.has=function(t){return this.__data__.has(t)},Ft.prototype.set=function(t,e){var r=this.__data__;if(r instanceof bt){var n=r.__data__;if(!gt||n.length<199)return n.push([t,e]),this.size=++r.size,this;r=this.__data__=new jt(n)}return r.set(t,e),this.size=r.size,this};var zt=function(){try{var t=st(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),Bt=zt;function Rt(t,e,r){"__proto__"==e&&Bt?Bt(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var Lt=Object.prototype.hasOwnProperty;function Jt(t,e,r){var n=t[e];Lt.call(t,e)&&yt(n,r)&&(void 0!==r||e in t)||Rt(t,e,r)}function Wt(t,e,r,n){var o=!r;r||(r={});for(var u=-1,i=e.length;++u<i;){var l=e[u],a=n?n(r[l],t[l],l,r,t):void 0;void 0===a&&(a=t[l]),o?Rt(r,l,a):Jt(r,l,a)}return r}var Vt=Object.prototype.hasOwnProperty;function Ht(t){if(!W(t))return function(t){var e=[];if(null!=t)for(var r in Object(t))e.push(r);return e}(t);var e=B(t),r=[];for(var n in t)("constructor"!=n||!e&&Vt.call(t,n))&&r.push(n);return r}function qt(t){return H(t)?F(t,!0):Ht(t)}var Gt="object"==typeof exports&&exports&&!exports.nodeType&&exports,Kt=Gt&&"object"==typeof module&&module&&!module.nodeType&&module,Yt=Kt&&Kt.exports===Gt?u.Buffer:void 0,Qt=Yt?Yt.allocUnsafe:void 0;function Xt(){return[]}var Zt=Object.prototype.propertyIsEnumerable,te=Object.getOwnPropertySymbols,ee=te?function(t){return null==t?[]:(t=Object(t),function(t,e){for(var r=-1,n=null==t?0:t.length,o=0,u=[];++r<n;){var i=t[r];e(i,r,t)&&(u[o++]=i)}return u}(te(t),function(e){return Zt.call(t,e)}))}:Xt,re=ee;function ne(t,e){for(var r=-1,n=e.length,o=t.length;++r<n;)t[o+r]=e[r];return t}var oe=R(Object.getPrototypeOf,Object),ue=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)ne(e,re(t)),t=oe(t);return e}:Xt,ie=ue;function le(t,e,r){var n=e(t);return k(t)?n:ne(n,r(t))}function ae(t){return le(t,q,re)}function se(t){return le(t,qt,ie)}var ce=st(u,"DataView"),fe=st(u,"Promise"),pe=st(u,"Set"),de=st(u,"WeakMap"),ye="[object Map]",ve="[object Promise]",he="[object Set]",be="[object WeakMap]",ge="[object DataView]",me=et(ce),je=et(gt),ke=et(fe),we=et(pe),Oe=et(de),_e=d;(ce&&_e(new ce(new ArrayBuffer(1)))!=ge||gt&&_e(new gt)!=ye||fe&&_e(fe.resolve())!=ve||pe&&_e(new pe)!=he||de&&_e(new de)!=be)&&(_e=function(t){var e=d(t),r="[object Object]"==e?t.constructor:void 0,n=r?et(r):"";if(n)switch(n){case me:return ge;case je:return ye;case ke:return ve;case we:return he;case Oe:return be}return e});var xe=_e,Ae=Object.prototype.hasOwnProperty;var Se=u.Uint8Array;function Me(t){var e=new t.constructor(t.byteLength);return new Se(e).set(new Se(t)),e}var Ie=/\w*$/;var $e=i?i.prototype:void 0,Ne=$e?$e.valueOf:void 0;function Te(t,e,r){var n,o=t.constructor;switch(e){case"[object ArrayBuffer]":return Me(t);case"[object Boolean]":case"[object Date]":return new o(+t);case"[object DataView]":return function(t,e){var r=e?Me(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}(t,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return function(t,e){var r=e?Me(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}(t,r);case"[object Map]":case"[object Set]":return new o;case"[object Number]":case"[object String]":return new o(t);case"[object RegExp]":return function(t){var e=new t.constructor(t.source,Ie.exec(t));return e.lastIndex=t.lastIndex,e}(t);case"[object Symbol]":return n=t,Ne?Object(Ne.call(n)):{}}}var De=Object.create,Ee=function(){function t(){}return function(e){if(!W(e))return{};if(De)return De(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}(),Pe=Ee;var Ue=E&&E.isMap,Ce=Ue?$(Ue):function(t){return y(t)&&"[object Map]"==xe(t)};var Fe=E&&E.isSet,ze=Fe?$(Fe):function(t){return y(t)&&"[object Set]"==xe(t)},Be="[object Arguments]",Re="[object Function]",Le="[object Object]",Je={};function We(t,e,r,n,o,u){var i,l=1&e,a=2&e,s=4&e;if(r&&(i=o?r(t,n,o,u):r(t)),void 0!==i)return i;if(!W(t))return t;var c=k(t);if(c){if(i=function(t){var e=t.length,r=new t.constructor(e);return e&&"string"==typeof t[0]&&Ae.call(t,"index")&&(r.index=t.index,r.input=t.input),r}(t),!l)return function(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r<n;)e[r]=t[r];return e}(t,i)}else{var f=xe(t),p=f==Re||"[object GeneratorFunction]"==f;if(x(t))return function(t,e){if(e)return t.slice();var r=t.length,n=Qt?Qt(r):new t.constructor(r);return t.copy(n),n}(t,l);if(f==Le||f==Be||p&&!o){if(i=a||p?{}:function(t){return"function"!=typeof t.constructor||B(t)?{}:Pe(oe(t))}(t),!l)return a?function(t,e){return Wt(t,ie(t),e)}(t,function(t,e){return t&&Wt(e,qt(e),t)}(i,t)):function(t,e){return Wt(t,re(t),e)}(t,function(t,e){return t&&Wt(e,q(e),t)}(i,t))}else{if(!Je[f])return o?t:{};i=Te(t,f,l)}}u||(u=new Ft);var d=u.get(t);if(d)return d;u.set(t,i),ze(t)?t.forEach(function(n){i.add(We(n,e,r,n,t,u))}):Ce(t)&&t.forEach(function(n,o){i.set(o,We(n,e,r,o,t,u))});var y=c?void 0:(s?a?se:ae:a?qt:q)(t);return function(t,e){for(var r=-1,n=null==t?0:t.length;++r<n&&!1!==e(t[r],r,t););}(y||t,function(n,o){y&&(n=t[o=n]),Jt(i,o,We(n,e,r,o,t,u))}),i}function Ve(t,e){return e.length<2?t:Ut(t,function(t,e,r){var n=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(r=r>o?o:r)<0&&(r+=o),o=e>r?0:r-e>>>0,e>>>=0;for(var u=Array(o);++n<o;)u[n]=t[n+e];return u}(e,0,-1))}Je[Be]=Je["[object Array]"]=Je["[object ArrayBuffer]"]=Je["[object DataView]"]=Je["[object Boolean]"]=Je["[object Date]"]=Je["[object Float32Array]"]=Je["[object Float64Array]"]=Je["[object Int8Array]"]=Je["[object Int16Array]"]=Je["[object Int32Array]"]=Je["[object Map]"]=Je["[object Number]"]=Je[Le]=Je["[object RegExp]"]=Je["[object Set]"]=Je["[object String]"]=Je["[object Symbol]"]=Je["[object Uint8Array]"]=Je["[object Uint8ClampedArray]"]=Je["[object Uint16Array]"]=Je["[object Uint32Array]"]=!0,Je["[object Error]"]=Je[Re]=Je["[object WeakMap]"]=!1;var He=Object.prototype.hasOwnProperty;function qe(t,e){var r=-1,n=(e=Et(e,t)).length;if(!n)return!0;for(;++r<n;){var o=Pt(e[r]);if("__proto__"===o&&!He.call(t,"__proto__"))return!1;if(("constructor"===o||"prototype"===o)&&r<n-1)return!1}var u=Ve(t,e);return null==u||delete u[Pt(function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}(e))]}var Ge=Function.prototype,Ke=Object.prototype,Ye=Ge.toString,Qe=Ke.hasOwnProperty,Xe=Ye.call(Object);function Ze(t){return function(t){if(!y(t)||"[object Object]"!=d(t))return!1;var e=oe(t);if(null===e)return!0;var r=Qe.call(e,"constructor")&&e.constructor;return"function"==typeof r&&r instanceof r&&Ye.call(r)==Xe}(t)?void 0:t}var tr=i?i.isConcatSpreadable:void 0;function er(t){return k(t)||j(t)||!!(tr&&t&&t[tr])}function rr(t,e,r,n,o){var u=-1,i=t.length;for(r||(r=er),o||(o=[]);++u<i;){var l=t[u];e>0&&r(l)?e>1?rr(l,e-1,r,n,o):ne(o,l):n||(o[o.length]=l)}return o}function nr(t){return(null==t?0:t.length)?rr(t,1):[]}var or=Math.max;var ur=Bt?function(t,e){return Bt(t,"toString",{configurable:!0,enumerable:!1,value:(r=e,function(){return r}),writable:!0});var r}:function(t){return t},ir=ur,lr=Date.now;var ar=function(t){var e=0,r=0;return function(){var n=lr(),o=16-(n-r);if(r=n,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(ir),sr=ar;var cr=function(t){return sr(function(t,e,r){return e=or(void 0===e?t.length-1:e,0),function(){for(var n=arguments,o=-1,u=or(n.length-e,0),i=Array(u);++o<u;)i[o]=n[e+o];o=-1;for(var l=Array(e+1);++o<e;)l[o]=n[o];return l[e]=r(i),function(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}(t,this,l)}}(t,void 0,nr),t+"")}(function(t,e){var r={};if(null==t)return r;var n=!1;e=It(e,function(e){return e=Et(e,t),n||(n=e.length>1),e}),Wt(t,se(t),r),n&&(r=We(r,7,Ze));for(var o=e.length;o--;)qe(r,e[o]);return r}),fr=cr;function pr(t){return"[object Object]"===Object.prototype.toString.call(t)}function dr(t){return"[object String]"===Object.prototype.toString.call(t)}function yr(t){return!(!dr(t)||""===t)}function vr(){let t,e,r=new Promise(function(){t=arguments[0],e=arguments[1]});return r.resolve=t,r.reject=e,r}function hr(t){return t!=t}function br(t){let e=!1;if(yr(t))e=!isNaN(Number(t));else if(function(t){return"[object Number]"===Object.prototype.toString.call(t)}(t)){if(hr(t))return!1;e=!0}return e}function gr(t=10){br(t)||(t=10);let e=vr();return setTimeout(function(){e.resolve()},t),e}var mr=/\s/;var jr=/^\s+/;function kr(t){return t?t.slice(0,function(t){for(var e=t.length;e--&&mr.test(t.charAt(e)););return e}(t)+1).replace(jr,""):t}var wr=/^[-+]0x[0-9a-f]+$/i,Or=/^0b[01]+$/i,_r=/^0o[0-7]+$/i,xr=parseInt;function Ar(t){if("number"==typeof t)return t;if(G(t))return NaN;if(W(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=W(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=kr(t);var r=Or.test(t);return r||_r.test(t)?xr(t.slice(2),r?2:8):wr.test(t)?NaN:+t}var Sr=1/0;function Mr(t){return t?(t=Ar(t))===Sr||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function Ir(t){var e=Mr(t),r=e%1;return e==e?r?e-r:e:0}var $r=u.isFinite,Nr=Math.min;var Tr=function(t){var e=Math[t];return function(t,r){if(t=Ar(t),(r=null==r?0:Nr(Ir(r),292))&&$r(t)){var n=(Dt(t)+"e").split("e");return+((n=(Dt(e(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return e(t)}}("round"),Dr=Tr;function Er(t){if(!br(t))return 0;return Mr(t)}function Pr(t){if(!br(t))return 0;t=Er(t);let e=Dr(t);return"0"===String(e)?0:e}function Ur(t){return"[object Array]"===Object.prototype.toString.call(t)}function Cr(t){let e=Object.prototype.toString.call(t);return"[object Function]"===e||"[object AsyncFunction]"===e}function Fr(t){return!!br(t)&&(t=Er(t),"number"==typeof(e=t)&&e==Ir(e));var e}function zr(t){if(!Fr(t))return!1;return Pr(t)>0}function Br(t){if(!Fr(t))return!1;return Pr(t)>=0}function Rr(t,e){return yr(t)&&Br(e)?0===(e=Pr(e))?"":t.substring(0,e):""}function Lr(t,e){return yr(t)&&Br(e)?0===(e=Pr(e))?t:function(t,e){if(!yr(t))return"";if(!Br(e))return"";if(0===(e=Pr(e)))return"";let r=t.length-e;return r<0&&(r=0),t.substring(r,r+e)}(t,t.length-e):""}function Jr(t,e,r={}){if(!yr(t))return"";if(!Br(e))return t;if(e=Pr(e),t.length<=e)return t;let n=Ct(r,"funWithMsg"),o="";if(Cr(n)){let r=n(t,e);yr(r)&&(o=r)}return Rr(t,e)+`...${o}`}function Wr(t,e={}){let r=Ct(e,"fs");return!!function(t,e={}){let r=Ct(e,"fs"),n=!1;try{r.statSync(t),n=!0}catch{n=!1}return n}(t,{fs:r})&&(!r.lstatSync(t).isDirectory()&&!r.lstatSync(t).isSymbolicLink())}function Vr(t){return function(t,e={}){let r=null,n=Ct(e,"fs"),o="";try{o=n.readFileSync(t,"utf8")}catch(t){r=t}return null!==r?{error:r}:{success:o}}(t,{fs:r})}function Hr(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var qr=t,Gr=qr.spawn,Kr=qr.exec;function Yr(t,e,r){var n={};try{Object.keys(t).forEach(function(r){t[r].forEach(function(t){n[t]||(Qr(t,e),n[t]=1)}),n[r]||(Qr(r,e),n[r]=1)})}catch(t){if(r)return r(t);throw t}if(r)return r()}function Qr(t,e){try{process.kill(parseInt(t,10),e)}catch(t){if("ESRCH"!==t.code)throw t}}function Xr(t,e,r,n,o){var u=n(t),i="";u.stdout.on("data",function(t){t=t.toString("ascii");i+=t});u.on("close",function(u){delete r[t],0==u?i.match(/\d+/g).forEach(function(u){u=parseInt(u,10),e[t].push(u),e[u]=[],r[u]=1,Xr(u,e,r,n,o)}):0==Object.keys(r).length&&o()})}var Zr=Hr(function(t,e,r){if("function"==typeof e&&void 0===r&&(r=e,e=void 0),t=parseInt(t),Number.isNaN(t)){if(r)return r(new Error("pid must be a number"));throw new Error("pid must be a number")}var n={},o={};switch(n[t]=[],o[t]=1,process.platform){case"win32":Kr("taskkill /pid "+t+" /T /F",r);break;case"darwin":Xr(t,n,o,function(t){return Gr("pgrep",["-P",t])},function(){Yr(n,e,r)});break;default:Xr(t,n,o,function(t){return Gr("ps",["-o","pid","--no-headers","--ppid",t])},function(){Yr(n,e,r)})}});function tn(t){let n=Ct(Vr(t),"success","");if(!yr(n))return null;let o=n.match(/%dp0%\\(node_modules\\[^"]+)"/i);if(!o)return null;let u=e.dirname(t),i=e.join(u,o[1]);return Wr(i,{fs:r})?i:null}function en(r,n){if("win32"!==process.platform)return{file:r,args:n};let o=function(r){if("win32"!==process.platform)return r;if(/\.(cmd|exe|bat|ps1)$/i.test(r))return r;if(e.isAbsolute(r))return r;try{let e=t.execFileSync("where",[r],{encoding:"utf8",timeout:5e3,windowsHide:!0,shell:!1,stdio:["ignore","pipe","ignore"]}).trim().split(/\r?\n/),n=e.find(t=>/\.cmd$/i.test(t));return n||(e.find(t=>/\.exe$/i.test(t))||e[0]||r)}catch{return r}}(r);if(/\.exe$/i.test(o))return{file:o,args:n};if(/\.(cmd|bat)$/i.test(o)){let t=tn(o);if(t)return/\.exe$/i.test(t)?{file:t,args:n}:{file:process.execPath,args:[t,...n]};let e=n.map(t=>`"${t.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\*)$/,"$1$1")}"`.replace(/[()%!^"<>&|]/g,"^$&")),r=`${u=o,u.replace(/[()%!^"<>&|;, ]/g,"^$&")} ${e.join(" ")}`;return{file:process.env.comspec||process.env.COMSPEC||"cmd.exe",args:["/d","/s","/c",`"${r}"`],opt:{windowsVerbatimArguments:!0}}}var u;return{file:o,args:n}}let rn={funWithMsg:t=>`(truncated, total ${t.length} chars)`};function nn(e,r=[],n={}){let{timeoutMs:o=12e4,cwd:u=process.cwd(),input:i,validate:l,maxBuffer:a=10485760,onStdout:s,onStderr:c,env:f}=n,p=function(t){if(Cr(t))return t;if(!yr(t))return null;let e=t.split(",").map(t=>t.trim()).filter(Boolean);return 0===e.length?null:t=>{for(let r of e)if("nonempty"===r){if(!yr(t)||""===t.trim())return!1}else if("json"===r)try{JSON.parse(t)}catch{return!1}else if("min:"===Rr(r,4)){let e=Lr(r,4);if(!br(e))return!1;let n=Pr(e);if(!yr(t)||t.length<n)return!1}return!0}}(l),d=Date.now(),y=vr(),v={...process.env,PYTHONIOENCODING:"utf-8"};if(void 0!==f){if("win32"===process.platform){let t=Object.keys(f).map(t=>t.toLowerCase());for(let e of Object.keys(v))t.includes(e.toLowerCase())&&delete v[e]}v={...v,...f}}let h=en(e,r),b=t.spawn(h.file,h.args,{cwd:u,stdio:["pipe","pipe","pipe"],windowsHide:!0,env:v,...h.opt}),g="",m="",j=new TextDecoder("utf-8"),k=new TextDecoder("utf-8"),w=!1,O=!1;b.stdout.on("data",t=>{let e=j.decode(t,{stream:!0});e&&(Cr(s)&&s(e),g.length<a&&(g+=e))}),b.stderr.on("data",t=>{let e=k.decode(t,{stream:!0});e&&(Cr(c)&&c(e),m.length<a&&(m+=e))}),b.stdin.on("error",()=>{}),void 0!==i&&b.stdin.write(i,"utf8"),b.stdin.end();let _=setTimeout(()=>{w||(O=!0,function(t){let e=vr();return Zr(Number(t),"SIGKILL",r=>{r?e.reject(r):e.resolve(`pid[${t}] killed`)}),e}(b.pid).catch(()=>{}),setTimeout(()=>{w||(w=!0,y.resolve({ok:!1,stdout:Jr(g,500,rn),stderr:Jr(m,500,rn),code:null,error:`TIMEOUT after ${o/1e3}s(子進程未能結束)`,durationMs:Date.now()-d,pid:b.pid}))},3e3).unref())},o);return b.on("error",t=>{w||(w=!0,clearTimeout(_),y.resolve({ok:!1,stdout:"",stderr:"",code:null,error:`${t.code||"UNKNOWN"}: ${t.message}`,durationMs:Date.now()-d,pid:b.pid}))}),b.on("close",(t,e)=>{if(w)return;w=!0,clearTimeout(_);let r=j.decode();r&&g.length<a&&(g+=r);let n=k.decode();n&&m.length<a&&(m+=n);let u=Date.now()-d;O?y.resolve({ok:!1,stdout:Jr(g,500,rn),stderr:Jr(m,500,rn),code:t,error:`TIMEOUT after ${o/1e3}s`,durationMs:u,pid:b.pid}):0===t?!p||p(g)?y.resolve({ok:!0,stdout:g,stderr:m,code:0,error:"",durationMs:u,pid:b.pid}):y.resolve({ok:!1,stdout:Jr(g,500,rn),stderr:Jr(m,500,rn),code:0,error:"OUTPUT_VALIDATION_FAILED",durationMs:u,pid:b.pid}):y.resolve({ok:!1,stdout:Jr(g,500,rn),stderr:Jr(m,1e3,rn),code:t,error:e?`Signal: ${e}`:`Exit code ${t}`,durationMs:u,pid:b.pid})}),y}async function on(t,e=[],r={}){if(!yr(t))return{ok:!1,stdout:"",stderr:"",code:null,error:"command 須為非空字串",durationMs:0,attempts:0};Ur(e)||(e=[]),pr(r)||(r={});let{maxRetries:n=0,retryDelayMs:o=5e3,...u}=r,i=Ct(u,"cwd",null);yr(i)?u.cwd=i:u.cwd=process.cwd();let l=Ct(u,"input",null);yr(l)?u.input=l:u.input=void 0;let a=Ct(u,"env",null);pr(a)?u.env=a:u.env=void 0;let s=Ct(u,"validate",null);Cr(s)||yr(s)?u.validate=s:u.validate=void 0;let c=Ct(u,"onStdout",null);Cr(c)?u.onStdout=c:u.onStdout=void 0;let f=Ct(u,"onStderr",null);Cr(f)?u.onStderr=f:u.onStderr=void 0,n=Br(n)?Pr(n):0,o=zr(o)?Pr(o):5e3;let p=Ct(u,"timeoutMs",null);zr(p)?u.timeoutMs=Pr(p):u.timeoutMs=12e4;let d,y=Ct(u,"maxBuffer",null);zr(y)?u.maxBuffer=Pr(y):u.maxBuffer=10485760;let v=0;for(let r=0;r<=n;r++){if(r>0){let t=Math.min(o*r,15e3);await gr(t)}if(d=await nn(t,e,u),v=r+1,d.ok)return d.attempts=v,d;if(d.error.includes("ENOENT"))break;if(2===d.code)break}return d.attempts=v,d}function un(...t){let e=[];for(let r of t)if(Ur(r))for(let t of r)yr(t)&&e.push(t);else yr(r)&&e.push(r);return e}function ln(t){return yr(t)||(t="unknown error"),{ok:!1,stdout:"",stderr:"",code:null,error:t,durationMs:0,attempts:0}}let an=["exe","model","key","provider","agent","config","extraArgs","input","env"];async function sn(t,e={}){if(!yr(t))return ln("prompt must be a non-empty string");let r=Ct(e,"exe",null);yr(r)||(r="opencode");let n=Ct(e,"model",null),o=Ct(e,"agent",null);yr(o)||(o="build");let u=Ct(e,"extraArgs",null),i=un("run",["--agent",o],yr(n)?["-m",n]:[],u),l=Ct(e,"env",null);pr(l)||(l=void 0);let a=Ct(e,"config",null);pr(a)&&(a=JSON.stringify(a)),yr(a)&&(l={...l,OPENCODE_CONFIG_CONTENT:a});let s=Ct(e,"key",null),c=Ct(e,"provider",null);return yr(s)&&yr(c)&&(l={...l,OPENCODE_AUTH_CONTENT:JSON.stringify({[c]:{type:"api",key:s}})}),on(r,i,{...fr(e,an),input:t,env:l})}function cn(t){return!0===(e=t)||!1===e||y(e)&&"[object Boolean]"==d(e);var e}let fn=["exe","model","skipPermissions","extraArgs","input"];async function pn(t,e={}){if(!yr(t))return ln("prompt must be a non-empty string");let r=Ct(e,"exe",null);yr(r)||(r="claude");let n=Ct(e,"model",null),o=Ct(e,"skipPermissions",null);cn(o)||(o=!0);let u=Ct(e,"extraArgs",null);return on(r,un("-p",o?"--dangerously-skip-permissions":[],yr(n)?["--model",n]:[],u),{...fr(e,fn),input:t})}let dn=["exe","model","sandbox","extraArgs","input"];async function yn(t,e={}){if(!yr(t))return ln("prompt must be a non-empty string");let r=Ct(e,"exe",null);yr(r)||(r="codex");let n=Ct(e,"model",null),o=Ct(e,"sandbox",null);yr(o)||(o="workspace-write");let u=Ct(e,"extraArgs",null);return on(r,un("exec",["--sandbox",o],"--skip-git-repo-check",yr(n)?["-m",n]:[],u),{...fr(e,dn),input:t})}let vn=["exe","model","effort","skipPermissions","printTimeout","addDirs","extraArgs","input"];async function hn(t,e={}){if(!yr(t))return ln("prompt must be a non-empty string");if(t.length>3e4)return ln(`prompt too long (${t.length} chars > 30000), agy passes prompt via --print flag and Windows command line is capped at 32767 chars`);let r=Ct(e,"exe",null);yr(r)||(r="agy");let n=Ct(e,"model",null),o=Ct(e,"effort",null),u=Ct(e,"skipPermissions",null);cn(u)||(u=!0);let i=Ct(e,"timeoutMs",null);i=zr(i)?Pr(i):3e5;let l=Ct(e,"printTimeout",null);yr(l)||(l=`${Math.max(30,Math.floor(i/1e3)-30)}s`);let a=Ct(e,"addDirs",null),s=[];if(Ur(a))for(let t of a)yr(t)&&s.push("--add-dir",t);let c=Ct(e,"extraArgs",null),f=un(u?"--dangerously-skip-permissions":[],["--print-timeout",l],yr(n)?["--model",n]:[],yr(o)?["--effort",o]:[],s,c,["--print",t]),p=fr(e,vn);try{return await on(r,f,{...p,timeoutMs:i})}catch(t){return ln(`${t.code||"UNKNOWN"}: ${t.message}`)}}let bn={funWithMsg:t=>`(truncated, total ${t.length} chars)`};async function gn(t,e,r,n,o){let u=Date.now(),i=new AbortController,l=setTimeout(()=>{i.abort()},n),a=null,s="";try{a=await fetch(t,{method:"POST",headers:e,body:JSON.stringify(r),signal:i.signal}),s=await a.text()}catch(t){clearTimeout(l);let e=Date.now()-u;return"AbortError"===t.name?{ok:!1,stdout:"",stderr:"",code:null,error:`TIMEOUT after ${n/1e3}s`,durationMs:e}:{ok:!1,stdout:"",stderr:"",code:null,error:`FETCH_ERROR: ${Ct(t,"cause.code","")||t.message}`,durationMs:e}}clearTimeout(l);let c=Date.now()-u;if(!a.ok)return{ok:!1,stdout:"",stderr:Jr(s,1e3,bn),code:a.status,error:`HTTP ${a.status}`,durationMs:c};let f=null;try{f=Ct(JSON.parse(s),"choices.0.message.content",null)}catch{}return null==f?{ok:!1,stdout:"",stderr:Jr(s,500,bn),code:a.status,error:"INVALID_RESPONSE: missing choices[0].message.content",durationMs:c}:("string"!=typeof f&&(f=JSON.stringify(f)),o&&!o(f)?{ok:!1,stdout:Jr(f,500,bn),stderr:"",code:a.status,error:"OUTPUT_VALIDATION_FAILED",durationMs:c}:{ok:!0,stdout:f,stderr:"",code:a.status,error:"",durationMs:c})}async function mn(t,e={}){if(!yr(t))return ln("prompt must be a non-empty string");let r=Ct(e,"baseURL",null);if(!yr(r))return ln("baseURL must be a non-empty string");let n=Ct(e,"model",null);if(!yr(n))return ln("model must be a non-empty string");let o=Ct(e,"key",null),u=Ct(e,"system",null),i=Ct(e,"body",null);pr(i)||(i={});let l=Ct(e,"headers",null);pr(l)||(l={});let a=Ct(e,"timeoutMs",null);a=zr(a)?Pr(a):12e4;let s=Ct(e,"maxRetries",null);s=Br(s)?Pr(s):0;let c=Ct(e,"retryDelayMs",null);c=zr(c)?Pr(c):5e3;let f=function(t){if(Cr(t))return t;if(!yr(t))return null;let e=t.split(",").map(t=>t.trim()).filter(Boolean);return 0===e.length?null:t=>{for(let r of e)if("nonempty"===r){if(!yr(t)||""===t.trim())return!1}else if("json"===r)try{JSON.parse(t)}catch{return!1}else if("min:"===Rr(r,4)){let e=Lr(r,4);if(!br(e))return!1;let n=Pr(e);if(!yr(t)||t.length<n)return!1}return!0}}(Ct(e,"validate",null)),p=r.replace(/\/+$/,"")+"/chat/completions",d=[];yr(u)&&d.push({role:"system",content:u}),d.push({role:"user",content:t});let y={model:n,messages:d,...i},v={"Content-Type":"application/json",...l};yr(o)&&(v.Authorization=`Bearer ${o}`);let h=null,b=0;for(let t=0;t<=s;t++){if(t>0&&await gr(Math.min(c*t,15e3)),h=await gn(p,v,y,a,f),b=t+1,h.ok)return h.attempts=b,h;let e=h.code;if(br(e)&&e>=400&&e<500&&429!==e)break}return h.attempts=b,h}let jn={opencode:sn,claude:pn,codex:yn,antigravity:hn,"api-openai-compat":mn};function kn(t){return t!=t}function wn(t){return null==t?[]:function(t,e){return It(e,function(e){return t[e]})}(t,q(t))}var On=Math.max;function _n(t,e,r,n){t=H(t)?t:wn(t),r=r&&!n?Ir(r):0;var o=t.length;return r<0&&(r=On(o+r,0)),function(t){return"string"==typeof t||!k(t)&&y(t)&&"[object String]"==d(t)}(t)?r<=o&&t.indexOf(e,r)>-1:!!o&&function(t,e,r){return e==e?function(t,e,r){for(var n=r-1,o=t.length;++n<o;)if(t[n]===e)return n;return-1}(t,e,r):function(t,e,r,n){for(var o=t.length,u=r+(n?1:-1);n?u--:++u<o;)if(e(t[u],u,t))return u;return-1}(t,kn,r)}(t,e,r)>-1}async function xn(t,e,r={}){let n=q(jn);return yr(t)&&_n(n,t)?(0,jn[t])(e,r):ln(`unknown ai kind: "${t}" (available: ${n.join(", ")})`)}let An=["providers","budgetMs","minAttemptMs","store","onEvent"],Sn=["id","keys"],Mn={cursors:{}};function In(t){let e=Ct(t,"error","");yr(e)||(e="");let r=Ct(t,"code",null);return 0===e.indexOf("TIMEOUT")||(!!e.includes("ENOENT")||(2===r||("OUTPUT_VALIDATION_FAILED"===e||0===e.indexOf("unknown ai kind"))))}async function $n(t,e={}){if(!yr(t))return{...ln("prompt must be a non-empty string"),tried:[]};let r=Ct(e,"providers",null),n=Ur(r)?r.filter(pr):[];if(0===n.length)return{...ln("providers must be a non-empty array"),tried:[]};let o=Ct(e,"budgetMs",null);o=zr(o)?Pr(o):null;let u=null===o?null:Date.now()+o,i=Ct(e,"minAttemptMs",null);i=zr(i)?Pr(i):2e4;let l=Ct(e,"store",null),a=pr(l)&&Cr(l.get)&&Cr(l.set),s=null;if(a)try{s=l.get()}catch{}pr(s)||(s=a?{cursors:{}}:Mn),pr(s.cursors)||(s.cursors={});let c=()=>{if(a)try{l.set(s)}catch{}},f=Ct(e,"onEvent",null),p=t=>{if(Cr(f))try{f(t)}catch{}},d=fr(e,An),y=[],v=null,h=null;for(let e=0;e<n.length;e++){let r=n[e],o=Ct(r,"id",null);yr(o)||(o=String(e));let l=Ct(r,"kind",null),a=Ct(r,"model",null),f=Ct(r,"keys",null),b=Ur(f)?f.filter(yr):[],g=b.length,m=fr(r,Sn),j=0;if(g>0){let t=Ct(s.cursors,o,0);j=zr(t)?Pr(t)%g:0}let k=g>0?g:1,w=!1;for(let e=0;e<k&&!w;e++){let r=g>0?(j+e)%g:null,n=null===r?o:`${o}#${r}`,f={...d,...m};g>0&&(f.key=b[r]);let k=Ct(f,"timeoutMs",null);if(k=zr(k)?Pr(k):12e4,null!==u){let t=u-Date.now();if(t<i)return p({type:"budget-out",providerId:o,keyIndex:r,keyId:n,remainingMs:t}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"budget-out"}),{...ln("budget exhausted"),tried:y};k=Math.min(k,t)}f.timeoutMs=k,p({type:"try",providerId:o,keyIndex:r,keyId:n,kind:l,model:a});let O=await xn(l,t,f);if(O.ok)return g>0&&(s.cursors[o]=(r+1)%g,c()),p({type:"ok",providerId:o,keyIndex:r,keyId:n,durationMs:O.durationMs}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"ok",durationMs:O.durationMs}),{...O,providerId:o,keyIndex:r,kind:l,model:a,tried:y};v=O,h={providerId:o,keyIndex:r,kind:l,model:a},In(O)?(p({type:"skip-group",providerId:o,keyIndex:r,keyId:n,error:O.error}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"skip-group",error:O.error,durationMs:O.durationMs}),w=!0):(p({type:"next-key",providerId:o,keyIndex:r,keyId:n,error:O.error}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"next-key",error:O.error,durationMs:O.durationMs}))}}return{...v||ln("all providers failed"),...h||{},tried:y}}function Nn(t){return!!function(t){return"[object Undefined]"===Object.prototype.toString.call(t)}(t)||(!!function(t){return"[object Null]"===Object.prototype.toString.call(t)}(t)||(!!function(t){if(pr(t)){for(let e in t)return!1;return!0}return!1}(t)||(!!function(t){return!(!dr(t)||""!==t)}(t)||(!!function(t){return!!Ur(t)&&0===t.length}(t)||!!hr(t)))))}function Tn(t){return!!Ur(t)&&(0!==t.length&&(1!==t.length||!Nn(t[0])))}function Dn(t){let e=String(t||"");if(e=e.replace(new RegExp(String.fromCharCode(27)+"\\[[0-9;]*m","g"),""),e=e.replace(/```(?:json)?/g,""),e=e.trim(),""===e)return null;try{let t=JSON.parse(e);if(null!==t&&"object"==typeof t)return t}catch(t){}let r=-1;for(let t=0;t<e.length;t++)if("{"===e[t]||"["===e[t]){r=t;break}if(r<0)return null;let n=0,o=!1,u=!1;for(let t=r;t<e.length;t++){let i=e[t];if(o)u?u=!1:"\\"===i?u=!0:'"'===i&&(o=!1);else if('"'===i)o=!0;else if("{"===i||"["===i)n++;else if(("}"===i||"]"===i)&&(n--,0===n)){try{let n=JSON.parse(e.slice(r,t+1));if(null!==n&&"object"==typeof n)return n}catch(t){}return null}}return null}let En=["【執行約束】你只需把結果輸出在回覆內容中。","禁止建立、修改或刪除任何檔案,禁止執行任何指令——呼叫端只讀取你的回覆文字,","任何寫入磁碟的動作都不會被採用,只會製造無人讀取的垃圾檔。","",""].join("\n");async function Pn(t,e={}){let r=Date.now();if(!yr(t))return{ok:!1,json:null,error:"prompt must be a non-empty string",ms:0,tried:[]};let n=Ct(e,"providers",null),o=Ct(e,"spec",null);if(!pr(n)||!pr(o))return{ok:!1,json:null,error:`no valid provider for spec: ${JSON.stringify(o)}`,ms:0,tried:[]};let{chain:u,missing:i}=function(t,e){let r=[Ct(e,"use","")],n=Ct(e,"fallback",null);Tn(n)&&(r=[...r,...n]);let o=[],u=[];for(let e of r){let r=Ct(t,e,null);pr(r)?o.push({id:e,...r}):u.push(String(e))}return{chain:o,missing:u}}(n,o);if(i.length>0)return{ok:!1,json:null,error:`unknown provider name(s): ${i.join(", ")}`,ms:0,tried:[]};if(0===u.length)return{ok:!1,json:null,error:`no valid provider for spec: ${JSON.stringify(o)}`,ms:0,tried:[]};let l=!0===Ct(e,"rawText",!1),a=Ct(e,"parse",null);Cr(a)||(a=Dn);let s=Ct(e,"check",null);Cr(s)||(s=null);let c=Ct(e,"promptPrefix",null);yr(c)||(c=""===c?"":En);let f=await $n(c+t,{providers:u,validate:t=>{if(l){let e=String(t||"").trim();return""!==e&&(!s||!0===s(e))}let e=a(t);return null!==e&&(!s||!0===s(e))},timeoutMs:Ct(e,"timeoutMs",null)||3e5,budgetMs:Ct(e,"budgetMs",null)||void 0,maxRetries:Ct(e,"maxRetries",null)||0,cwd:Ct(e,"cwd",null)||process.cwd(),store:Ct(e,"store",null)||void 0,onEvent:Ct(e,"onEvent",null)||void 0}),p=null;f.ok&&(p=l?String(f.stdout||"").trim():a(f.stdout));let d=Ct(f,"providerId",null),y=Ct(f,"keyIndex",null);return{ok:f.ok&&null!==p,json:p,providerId:d,keyIndex:y,keyId:null===y?d:`${d}#${y}`,ms:Date.now()-r,tried:Ct(f,"tried",[]),error:f.ok?"":Ct(f,"error","unknown error")}}async function Un(t={}){let e=Date.now(),r=Ct(t,"providers",null),n=Ct(t,"task",""),o=Ct(t,"agents",null),u=Ct(t,"integrate",null),i=Ct(t,"check",null),l=Ct(t,"callOpt",{});if(!yr(n))return{ok:!1,result:null,integrated:!1,agents:[],candidates:[],totalMs:0,error:"task must be a non-empty string"};if(!Tn(o))return{ok:!1,result:null,integrated:!1,agents:[],candidates:[],totalMs:0,error:"agents must be a non-empty array"};let a=Ct(t,"minCandidates",null);a=zr(a)?Pr(a):2;let s=await Promise.all(o.map(t=>{let{use:e,fallback:o,...u}=t;return Pn(n,{...l,...u,providers:r,spec:{use:e,fallback:o},check:i})})),c=s.filter(t=>t.ok).map(t=>t.json);if(0===c.length)return{ok:!1,result:null,integrated:!1,agents:s,candidates:c,totalMs:Date.now()-e,error:"all agents failed"};if(1===c.length||c.length<a)return{ok:!0,result:c[0],integrated:!1,agents:s,candidates:c,totalMs:Date.now()-e,error:""};if(!u||!yr(Ct(u,"use","")))return{ok:!1,result:null,integrated:!1,agents:s,candidates:c,totalMs:Date.now()-e,error:"integrate spec (with use) is required"};let{use:f,fallback:p,prompt:d,...y}=u,v=Cr(d)?d(c):function(t,e={}){let r=Ct(e,"schema",""),n=yr(r)?`\n只回覆 JSON 物件,不要任何其他說明文字,格式與候選相同:\n${r}\n`:"\n只回覆 JSON 物件,不要任何其他說明文字,格式與候選相同。\n";return`你是整合者。以下是同一任務由 ${t.length} 個獨立執行產生的候選結果(JSON),請整合成單一最佳版本:擇優合併、去重、保留最完整的證據標注與爭議呈現,不可加入候選中沒有的數字或結論。\n${n}\n${t.map((t,e)=>`【候選 ${e+1}】\n${JSON.stringify(t)}`).join("\n\n")}`}(c,t),h=await Pn(v,{...l,...y,providers:r,spec:{use:f,fallback:p},check:i});return{ok:h.ok,result:h.ok?h.json:null,integrated:h.ok,agents:s,candidates:c,integrateDetail:h,totalMs:Date.now()-e,error:h.ok?"":`integrate failed: ${h.error}`}}let Cn=["id","use","fallback","prompt","check"];async function Fn(t={}){let e=Date.now(),r=Ct(t,"providers",null),n=Ct(t,"input",null),o=Ct(t,"stages",null),u=Ct(t,"callOpt",{});if(!Tn(o))return{ok:!1,result:null,stages:{},results:{},order:[],failedStage:null,totalMs:0,error:"stages must be a non-empty array"};let i={},l={},a=[],s=null;for(let t=0;t<o.length;t++){let c=o[t],f=yr(Ct(c,"id",""))?c.id:`stage${t+1}`;a.push(f);let p=Ct(c,"prompt",null);if(!Cr(p))return l[f]={ok:!1,error:`stage[${f}].prompt must be a function`},{ok:!1,result:null,stages:l,results:i,order:a,failedStage:f,totalMs:Date.now()-e,error:l[f].error};let d=p({input:n,prev:s,results:i,index:t});if(!yr(d))return l[f]={ok:!1,error:`stage[${f}].prompt returned empty`},{ok:!1,result:null,stages:l,results:i,order:a,failedStage:f,totalMs:Date.now()-e,error:l[f].error};let y=fr(c,Cn),v=await Pn(d,{...u,...y,providers:r,spec:{use:Ct(c,"use",""),fallback:Ct(c,"fallback",null)},check:Ct(c,"check",null)});if(l[f]=v,!v.ok)return{ok:!1,result:null,stages:l,results:i,order:a,failedStage:f,totalMs:Date.now()-e,error:`stage[${f}] failed: ${v.error}`};i[f]=v.json,s=v.json}return{ok:!0,result:s,stages:l,results:i,order:a,failedStage:null,totalMs:Date.now()-e,error:""}}return{KINDS:q(jn),dispatchAi:xn,dispatchAiFallback:$n,dispatchAiWkf:function(t={}){let e=Ct(t,"providers",null);if(!pr(e))throw new Error("dispatchAiWkf: opt.providers must be an object (name → provider entry)");let r=Ct(t,"defaults",null);return pr(r)||(r={}),{providers:e,callAi:(t,n={})=>Pn(t,{...r,...n,providers:e}),runFanout:(t={})=>Un({...t,providers:e,callOpt:{...r,...Ct(t,"callOpt",{})}}),runRolePipeline:(t={})=>Fn({...t,providers:e,callOpt:{...r,...Ct(t,"callOpt",{})}}),runFanoutPipeline:(t={})=>async function(t={}){let e=Date.now(),r=await Un({providers:Ct(t,"providers",null),task:Ct(t,"task",""),agents:Ct(t,"agents",null),integrate:Ct(t,"integrate",null),check:Ct(t,"check",null),schema:Ct(t,"schema",""),minCandidates:Ct(t,"minCandidates",null),callOpt:Ct(t,"callOpt",{})});if(!r.ok)return{ok:!1,result:null,A:r,B:null,totalMs:Date.now()-e,error:`A failed: ${r.error}`};let n=await Fn({providers:Ct(t,"providers",null),input:r.result,stages:Ct(t,"stages",null),callOpt:Ct(t,"callOpt",{})});return{ok:n.ok,result:n.ok?n.result:null,A:r,B:n,totalMs:Date.now()-e,error:n.ok?"":`B failed: ${n.error}`}}({...t,providers:e,callOpt:{...r,...Ct(t,"callOpt",{})}})}},dispatchOpencode:sn,dispatchClaude:pn,dispatchCodex:yn,dispatchAntigravity:hn,dispatchApiOpenaiCompat:mn}});
|
|
6
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("child_process"),require("path"),require("fs")):"function"==typeof define&&define.amd?define(["child_process","path","fs"],t):(e="undefined"!=typeof globalThis?globalThis:e||self)["w-dispatch-ai"]=t(e.child_process,e.path,e.fs)}(this,function(e,t,r){"use strict";var n="object"==typeof global&&global&&global.Object===Object&&global,o="object"==typeof self&&self&&self.Object===Object&&self,i=n||o||Function("return this")(),u=i.Symbol,l=Object.prototype,a=l.hasOwnProperty,s=l.toString,c=u?u.toStringTag:void 0;var f=Object.prototype.toString;var d=u?u.toStringTag:void 0;function p(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":d&&d in Object(e)?function(e){var t=a.call(e,c),r=e[c];try{e[c]=void 0;var n=!0}catch(e){}var o=s.call(e);return n&&(t?e[c]=r:delete e[c]),o}(e):function(e){return f.call(e)}(e)}function y(e){return null!=e&&"object"==typeof e}function h(e){return y(e)&&"[object Arguments]"==p(e)}var v=Object.prototype,g=v.hasOwnProperty,b=v.propertyIsEnumerable,m=h(function(){return arguments}())?h:function(e){return y(e)&&g.call(e,"callee")&&!b.call(e,"callee")},j=m,k=Array.isArray;var w="object"==typeof exports&&exports&&!exports.nodeType&&exports,_=w&&"object"==typeof module&&module&&!module.nodeType&&module,O=_&&_.exports===w?i.Buffer:void 0,x=(O?O.isBuffer:void 0)||function(){return!1},S=/^(?:0|[1-9]\d*)$/;function A(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&S.test(e))&&e>-1&&e%1==0&&e<t}function M(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}var I={};function $(e){return function(t){return e(t)}}I["[object Float32Array]"]=I["[object Float64Array]"]=I["[object Int8Array]"]=I["[object Int16Array]"]=I["[object Int32Array]"]=I["[object Uint8Array]"]=I["[object Uint8ClampedArray]"]=I["[object Uint16Array]"]=I["[object Uint32Array]"]=!0,I["[object Arguments]"]=I["[object Array]"]=I["[object ArrayBuffer]"]=I["[object Boolean]"]=I["[object DataView]"]=I["[object Date]"]=I["[object Error]"]=I["[object Function]"]=I["[object Map]"]=I["[object Number]"]=I["[object Object]"]=I["[object RegExp]"]=I["[object Set]"]=I["[object String]"]=I["[object WeakMap]"]=!1;var E="object"==typeof exports&&exports&&!exports.nodeType&&exports,N=E&&"object"==typeof module&&module&&!module.nodeType&&module,T=N&&N.exports===E&&n.process,D=function(){try{var e=N&&N.require&&N.require("util").types;return e||T&&T.binding&&T.binding("util")}catch(e){}}(),P=D&&D.isTypedArray,U=P?$(P):function(e){return y(e)&&M(e.length)&&!!I[p(e)]},C=Object.prototype.hasOwnProperty;function F(e,t){var r=k(e),n=!r&&j(e),o=!r&&!n&&x(e),i=!r&&!n&&!o&&U(e),u=r||n||o||i,l=u?function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}(e.length,String):[],a=l.length;for(var s in e)!t&&!C.call(e,s)||u&&("length"==s||o&&("offset"==s||"parent"==s)||i&&("buffer"==s||"byteLength"==s||"byteOffset"==s)||A(s,a))||l.push(s);return l}var L=Object.prototype;function z(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||L)}function R(e,t){return function(r){return e(t(r))}}var B=R(Object.keys,Object),V=Object.prototype.hasOwnProperty;function J(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function W(e){if(!J(e))return!1;var t=p(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}function K(e){return null!=e&&M(e.length)&&!W(e)}function G(e){return K(e)?F(e):function(e){if(!z(e))return B(e);var t=[];for(var r in Object(e))V.call(e,r)&&"constructor"!=r&&t.push(r);return t}(e)}function H(e){return"symbol"==typeof e||y(e)&&"[object Symbol]"==p(e)}var Y=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,q=/^\w*$/;var Q,X=i["__core-js_shared__"],Z=(Q=/[^.]+$/.exec(X&&X.keys&&X.keys.IE_PROTO||""))?"Symbol(src)_1."+Q:"";var ee=Function.prototype.toString;function te(e){if(null!=e){try{return ee.call(e)}catch(e){}try{return e+""}catch(e){}}return""}var re=/^\[object .+?Constructor\]$/,ne=Function.prototype,oe=Object.prototype,ie=ne.toString,ue=oe.hasOwnProperty,le=RegExp("^"+ie.call(ue).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ae(e){return!(!J(e)||(t=e,Z&&Z in t))&&(W(e)?le:re).test(te(e));var t}function se(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return ae(r)?r:void 0}var ce=se(Object,"create");var fe=Object.prototype.hasOwnProperty;var de=Object.prototype.hasOwnProperty;function pe(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function ye(e,t){return e===t||e!=e&&t!=t}function he(e,t){for(var r=e.length;r--;)if(ye(e[r][0],t))return r;return-1}pe.prototype.clear=function(){this.__data__=ce?ce(null):{},this.size=0},pe.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},pe.prototype.get=function(e){var t=this.__data__;if(ce){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return fe.call(t,e)?t[e]:void 0},pe.prototype.has=function(e){var t=this.__data__;return ce?void 0!==t[e]:de.call(t,e)},pe.prototype.set=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=ce&&void 0===t?"__lodash_hash_undefined__":t,this};var ve=Array.prototype.splice;function ge(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}ge.prototype.clear=function(){this.__data__=[],this.size=0},ge.prototype.delete=function(e){var t=this.__data__,r=he(t,e);return!(r<0)&&(r==t.length-1?t.pop():ve.call(t,r,1),--this.size,!0)},ge.prototype.get=function(e){var t=this.__data__,r=he(t,e);return r<0?void 0:t[r][1]},ge.prototype.has=function(e){return he(this.__data__,e)>-1},ge.prototype.set=function(e,t){var r=this.__data__,n=he(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};var be=se(i,"Map");function me(e,t){var r,n,o=e.__data__;return("string"==(n=typeof(r=t))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==r:null===r)?o["string"==typeof t?"string":"hash"]:o.map}function je(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}je.prototype.clear=function(){this.size=0,this.__data__={hash:new pe,map:new(be||ge),string:new pe}},je.prototype.delete=function(e){var t=me(this,e).delete(e);return this.size-=t?1:0,t},je.prototype.get=function(e){return me(this,e).get(e)},je.prototype.has=function(e){return me(this,e).has(e)},je.prototype.set=function(e,t){var r=me(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this};function ke(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var u=e.apply(this,n);return r.cache=i.set(o,u)||i,u};return r.cache=new(ke.Cache||je),r}ke.Cache=je;var we,_e,Oe,xe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Se=/\\(\\)?/g,Ae=(we=function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(xe,function(e,r,n,o){t.push(n?o.replace(Se,"$1"):r||e)}),t},_e=ke(we,function(e){return 500===Oe.size&&Oe.clear(),e}),Oe=_e.cache,_e),Me=Ae;function Ie(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}var $e=u?u.prototype:void 0,Ee=$e?$e.toString:void 0;function Ne(e){if("string"==typeof e)return e;if(k(e))return Ie(e,Ne)+"";if(H(e))return Ee?Ee.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function Te(e){return null==e?"":Ne(e)}function De(e,t){return k(e)?e:function(e,t){if(k(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!H(e))||q.test(e)||!Y.test(e)||null!=t&&e in Object(t)}(e,t)?[e]:Me(Te(e))}function Pe(e){if("string"==typeof e||H(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function Ue(e,t){for(var r=0,n=(t=De(t,e)).length;null!=e&&r<n;)e=e[Pe(t[r++])];return r&&r==n?e:void 0}function Ce(e,t,r){var n=null==e?void 0:Ue(e,t);return void 0===n?r:n}function Fe(e){var t=this.__data__=new ge(e);this.size=t.size}Fe.prototype.clear=function(){this.__data__=new ge,this.size=0},Fe.prototype.delete=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r},Fe.prototype.get=function(e){return this.__data__.get(e)},Fe.prototype.has=function(e){return this.__data__.has(e)},Fe.prototype.set=function(e,t){var r=this.__data__;if(r instanceof ge){var n=r.__data__;if(!be||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new je(n)}return r.set(e,t),this.size=r.size,this};var Le=function(){try{var e=se(Object,"defineProperty");return e({},"",{}),e}catch(e){}}(),ze=Le;function Re(e,t,r){"__proto__"==t&&ze?ze(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}var Be=Object.prototype.hasOwnProperty;function Ve(e,t,r){var n=e[t];Be.call(e,t)&&ye(n,r)&&(void 0!==r||t in e)||Re(e,t,r)}function Je(e,t,r,n){var o=!r;r||(r={});for(var i=-1,u=t.length;++i<u;){var l=t[i],a=n?n(r[l],e[l],l,r,e):void 0;void 0===a&&(a=e[l]),o?Re(r,l,a):Ve(r,l,a)}return r}var We=Object.prototype.hasOwnProperty;function Ke(e){if(!J(e))return function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t}(e);var t=z(e),r=[];for(var n in e)("constructor"!=n||!t&&We.call(e,n))&&r.push(n);return r}function Ge(e){return K(e)?F(e,!0):Ke(e)}var He="object"==typeof exports&&exports&&!exports.nodeType&&exports,Ye=He&&"object"==typeof module&&module&&!module.nodeType&&module,qe=Ye&&Ye.exports===He?i.Buffer:void 0,Qe=qe?qe.allocUnsafe:void 0;function Xe(){return[]}var Ze=Object.prototype.propertyIsEnumerable,et=Object.getOwnPropertySymbols,tt=et?function(e){return null==e?[]:(e=Object(e),function(e,t){for(var r=-1,n=null==e?0:e.length,o=0,i=[];++r<n;){var u=e[r];t(u,r,e)&&(i[o++]=u)}return i}(et(e),function(t){return Ze.call(e,t)}))}:Xe,rt=tt;function nt(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e}var ot=R(Object.getPrototypeOf,Object),it=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)nt(t,rt(e)),e=ot(e);return t}:Xe,ut=it;function lt(e,t,r){var n=t(e);return k(e)?n:nt(n,r(e))}function at(e){return lt(e,G,rt)}function st(e){return lt(e,Ge,ut)}var ct=se(i,"DataView"),ft=se(i,"Promise"),dt=se(i,"Set"),pt=se(i,"WeakMap"),yt="[object Map]",ht="[object Promise]",vt="[object Set]",gt="[object WeakMap]",bt="[object DataView]",mt=te(ct),jt=te(be),kt=te(ft),wt=te(dt),_t=te(pt),Ot=p;(ct&&Ot(new ct(new ArrayBuffer(1)))!=bt||be&&Ot(new be)!=yt||ft&&Ot(ft.resolve())!=ht||dt&&Ot(new dt)!=vt||pt&&Ot(new pt)!=gt)&&(Ot=function(e){var t=p(e),r="[object Object]"==t?e.constructor:void 0,n=r?te(r):"";if(n)switch(n){case mt:return bt;case jt:return yt;case kt:return ht;case wt:return vt;case _t:return gt}return t});var xt=Ot,St=Object.prototype.hasOwnProperty;var At=i.Uint8Array;function Mt(e){var t=new e.constructor(e.byteLength);return new At(t).set(new At(e)),t}var It=/\w*$/;var $t=u?u.prototype:void 0,Et=$t?$t.valueOf:void 0;function Nt(e,t,r){var n,o=e.constructor;switch(t){case"[object ArrayBuffer]":return Mt(e);case"[object Boolean]":case"[object Date]":return new o(+e);case"[object DataView]":return function(e,t){var r=t?Mt(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return function(e,t){var r=t?Mt(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}(e,r);case"[object Map]":case"[object Set]":return new o;case"[object Number]":case"[object String]":return new o(e);case"[object RegExp]":return function(e){var t=new e.constructor(e.source,It.exec(e));return t.lastIndex=e.lastIndex,t}(e);case"[object Symbol]":return n=e,Et?Object(Et.call(n)):{}}}var Tt=Object.create,Dt=function(){function e(){}return function(t){if(!J(t))return{};if(Tt)return Tt(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}(),Pt=Dt;var Ut=D&&D.isMap,Ct=Ut?$(Ut):function(e){return y(e)&&"[object Map]"==xt(e)};var Ft=D&&D.isSet,Lt=Ft?$(Ft):function(e){return y(e)&&"[object Set]"==xt(e)},zt="[object Arguments]",Rt="[object Function]",Bt="[object Object]",Vt={};function Jt(e,t,r,n,o,i){var u,l=1&t,a=2&t,s=4&t;if(r&&(u=o?r(e,n,o,i):r(e)),void 0!==u)return u;if(!J(e))return e;var c=k(e);if(c){if(u=function(e){var t=e.length,r=new e.constructor(t);return t&&"string"==typeof e[0]&&St.call(e,"index")&&(r.index=e.index,r.input=e.input),r}(e),!l)return function(e,t){var r=-1,n=e.length;for(t||(t=Array(n));++r<n;)t[r]=e[r];return t}(e,u)}else{var f=xt(e),d=f==Rt||"[object GeneratorFunction]"==f;if(x(e))return function(e,t){if(t)return e.slice();var r=e.length,n=Qe?Qe(r):new e.constructor(r);return e.copy(n),n}(e,l);if(f==Bt||f==zt||d&&!o){if(u=a||d?{}:function(e){return"function"!=typeof e.constructor||z(e)?{}:Pt(ot(e))}(e),!l)return a?function(e,t){return Je(e,ut(e),t)}(e,function(e,t){return e&&Je(t,Ge(t),e)}(u,e)):function(e,t){return Je(e,rt(e),t)}(e,function(e,t){return e&&Je(t,G(t),e)}(u,e))}else{if(!Vt[f])return o?e:{};u=Nt(e,f,l)}}i||(i=new Fe);var p=i.get(e);if(p)return p;i.set(e,u),Lt(e)?e.forEach(function(n){u.add(Jt(n,t,r,n,e,i))}):Ct(e)&&e.forEach(function(n,o){u.set(o,Jt(n,t,r,o,e,i))});var y=c?void 0:(s?a?st:at:a?Ge:G)(e);return function(e,t){for(var r=-1,n=null==e?0:e.length;++r<n&&!1!==t(e[r],r,e););}(y||e,function(n,o){y&&(n=e[o=n]),Ve(u,o,Jt(n,t,r,o,e,i))}),u}function Wt(e,t){return t.length<2?e:Ue(e,function(e,t,r){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),(r=r>o?o:r)<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(o);++n<o;)i[n]=e[n+t];return i}(t,0,-1))}Vt[zt]=Vt["[object Array]"]=Vt["[object ArrayBuffer]"]=Vt["[object DataView]"]=Vt["[object Boolean]"]=Vt["[object Date]"]=Vt["[object Float32Array]"]=Vt["[object Float64Array]"]=Vt["[object Int8Array]"]=Vt["[object Int16Array]"]=Vt["[object Int32Array]"]=Vt["[object Map]"]=Vt["[object Number]"]=Vt[Bt]=Vt["[object RegExp]"]=Vt["[object Set]"]=Vt["[object String]"]=Vt["[object Symbol]"]=Vt["[object Uint8Array]"]=Vt["[object Uint8ClampedArray]"]=Vt["[object Uint16Array]"]=Vt["[object Uint32Array]"]=!0,Vt["[object Error]"]=Vt[Rt]=Vt["[object WeakMap]"]=!1;var Kt=Object.prototype.hasOwnProperty;function Gt(e,t){var r=-1,n=(t=De(t,e)).length;if(!n)return!0;for(;++r<n;){var o=Pe(t[r]);if("__proto__"===o&&!Kt.call(e,"__proto__"))return!1;if(("constructor"===o||"prototype"===o)&&r<n-1)return!1}var i=Wt(e,t);return null==i||delete i[Pe(function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}(t))]}var Ht=Function.prototype,Yt=Object.prototype,qt=Ht.toString,Qt=Yt.hasOwnProperty,Xt=qt.call(Object);function Zt(e){return function(e){if(!y(e)||"[object Object]"!=p(e))return!1;var t=ot(e);if(null===t)return!0;var r=Qt.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&qt.call(r)==Xt}(e)?void 0:e}var er=u?u.isConcatSpreadable:void 0;function tr(e){return k(e)||j(e)||!!(er&&e&&e[er])}function rr(e,t,r,n,o){var i=-1,u=e.length;for(r||(r=tr),o||(o=[]);++i<u;){var l=e[i];t>0&&r(l)?t>1?rr(l,t-1,r,n,o):nt(o,l):n||(o[o.length]=l)}return o}function nr(e){return(null==e?0:e.length)?rr(e,1):[]}var or=Math.max;var ir=ze?function(e,t){return ze(e,"toString",{configurable:!0,enumerable:!1,value:(r=t,function(){return r}),writable:!0});var r}:function(e){return e},ur=ir,lr=Date.now;var ar=function(e){var t=0,r=0;return function(){var n=lr(),o=16-(n-r);if(r=n,o>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(ur),sr=ar;var cr=function(e){return sr(function(e,t,r){return t=or(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,i=or(n.length-t,0),u=Array(i);++o<i;)u[o]=n[t+o];o=-1;for(var l=Array(t+1);++o<t;)l[o]=n[o];return l[t]=r(u),function(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}(e,this,l)}}(e,void 0,nr),e+"")}(function(e,t){var r={};if(null==e)return r;var n=!1;t=Ie(t,function(t){return t=De(t,e),n||(n=t.length>1),t}),Je(e,st(e),r),n&&(r=Jt(r,7,Zt));for(var o=t.length;o--;)Gt(r,t[o]);return r}),fr=cr,dr=/\s/;var pr=/^\s+/;function yr(e){return e?e.slice(0,function(e){for(var t=e.length;t--&&dr.test(e.charAt(t)););return t}(e)+1).replace(pr,""):e}var hr=/^[-+]0x[0-9a-f]+$/i,vr=/^0b[01]+$/i,gr=/^0o[0-7]+$/i,br=parseInt;function mr(e){if("number"==typeof e)return e;if(H(e))return NaN;if(J(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=J(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=yr(e);var r=vr.test(e);return r||gr.test(e)?br(e.slice(2),r?2:8):hr.test(e)?NaN:+e}var jr=1/0;function kr(e){return e?(e=mr(e))===jr||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function wr(e){var t=kr(e),r=t%1;return t==t?r?t-r:t:0}function _r(e){return"[object String]"===Object.prototype.toString.call(e)}function Or(e){return!(!_r(e)||""===e)}function xr(e){return e!=e}function Sr(e){let t=!1;if(Or(e))t=!isNaN(Number(e));else if(function(e){return"[object Number]"===Object.prototype.toString.call(e)}(e)){if(xr(e))return!1;t=!0}return t}function Ar(e){if(!Sr(e))return 0;return kr(e)}function Mr(e){return!!Sr(e)&&(e=Ar(e),"number"==typeof(t=e)&&t==wr(t));var t}var Ir=i.isFinite,$r=Math.min;var Er=function(e){var t=Math[e];return function(e,r){if(e=mr(e),(r=null==r?0:$r(wr(r),292))&&Ir(e)){var n=(Te(e)+"e").split("e");return+((n=(Te(t(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return t(e)}}("round"),Nr=Er;function Tr(e){if(!Sr(e))return 0;e=Ar(e);let t=Nr(e);return"0"===String(t)?0:t}function Dr(e){if(!Mr(e))return!1;return Tr(e)>0}function Pr(e){return"[object Object]"===Object.prototype.toString.call(e)}function Ur(){let e,t,r=new Promise(function(){e=arguments[0],t=arguments[1]});return r.resolve=e,r.reject=t,r}function Cr(e=10){Sr(e)||(e=10);let t=Ur();return setTimeout(function(){t.resolve()},e),t}function Fr(e){return"[object Array]"===Object.prototype.toString.call(e)}function Lr(e){let t=Object.prototype.toString.call(e);return"[object Function]"===t||"[object AsyncFunction]"===t}function zr(e){if(!Mr(e))return!1;return Tr(e)>=0}function Rr(e,t){return Or(e)&&zr(t)?0===(t=Tr(t))?"":e.substring(0,t):""}function Br(e,t){return Or(e)&&zr(t)?0===(t=Tr(t))?e:function(e,t){if(!Or(e))return"";if(!zr(t))return"";if(0===(t=Tr(t)))return"";let r=e.length-t;return r<0&&(r=0),e.substring(r,r+t)}(e,e.length-t):""}function Vr(e,t,r={}){if(!Or(e))return"";if(!zr(t))return e;if(t=Tr(t),e.length<=t)return e;let n=Ce(r,"funWithMsg"),o="";if(Lr(n)){let r=n(e,t);Or(r)&&(o=r)}return Rr(e,t)+`...${o}`}function Jr(e,t={}){let r=Ce(t,"fs");return!!function(e,t={}){let r=Ce(t,"fs"),n=!1;try{r.statSync(e),n=!0}catch{n=!1}return n}(e,{fs:r})&&(!r.lstatSync(e).isDirectory()&&!r.lstatSync(e).isSymbolicLink())}function Wr(e){return function(e,t={}){let r=null,n=Ce(t,"fs"),o="";try{o=n.readFileSync(e,"utf8")}catch(e){r=e}return null!==r?{error:r}:{success:o}}(e,{fs:r})}function Kr(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Gr=e,Hr=Gr.spawn,Yr=Gr.exec;function qr(e,t,r){var n={};try{Object.keys(e).forEach(function(r){e[r].forEach(function(e){n[e]||(Qr(e,t),n[e]=1)}),n[r]||(Qr(r,t),n[r]=1)})}catch(e){if(r)return r(e);throw e}if(r)return r()}function Qr(e,t){try{process.kill(parseInt(e,10),t)}catch(e){if("ESRCH"!==e.code)throw e}}function Xr(e,t,r,n,o){var i=n(e),u="";i.stdout.on("data",function(e){e=e.toString("ascii");u+=e});i.on("close",function(i){delete r[e],0==i?u.match(/\d+/g).forEach(function(i){i=parseInt(i,10),t[e].push(i),t[i]=[],r[i]=1,Xr(i,t,r,n,o)}):0==Object.keys(r).length&&o()})}var Zr=Kr(function(e,t,r){if("function"==typeof t&&void 0===r&&(r=t,t=void 0),e=parseInt(e),Number.isNaN(e)){if(r)return r(new Error("pid must be a number"));throw new Error("pid must be a number")}var n={},o={};switch(n[e]=[],o[e]=1,process.platform){case"win32":Yr("taskkill /pid "+e+" /T /F",r);break;case"darwin":Xr(e,n,o,function(e){return Hr("pgrep",["-P",e])},function(){qr(n,t,r)});break;default:Xr(e,n,o,function(e){return Hr("ps",["-o","pid","--no-headers","--ppid",e])},function(){qr(n,t,r)})}});function en(e){let n=Ce(Wr(e),"success","");if(!Or(n))return null;let o=n.match(/%dp0%\\(node_modules\\[^"]+)"/i);if(!o)return null;let i=t.dirname(e),u=t.join(i,o[1]);return Jr(u,{fs:r})?u:null}function tn(r,n){if("win32"!==process.platform)return{file:r,args:n};let o=function(r){if("win32"!==process.platform)return r;if(/\.(cmd|exe|bat|ps1)$/i.test(r))return r;if(t.isAbsolute(r))return r;try{let t=e.execFileSync("where",[r],{encoding:"utf8",timeout:5e3,windowsHide:!0,shell:!1,stdio:["ignore","pipe","ignore"]}).trim().split(/\r?\n/),n=t.find(e=>/\.cmd$/i.test(e));return n||(t.find(e=>/\.exe$/i.test(e))||t[0]||r)}catch{return r}}(r);if(/\.exe$/i.test(o))return{file:o,args:n};if(/\.(cmd|bat)$/i.test(o)){let e=en(o);if(e)return/\.exe$/i.test(e)?{file:e,args:n}:{file:process.execPath,args:[e,...n]};let t=n.map(e=>`"${e.replace(/(\\*)"/g,'$1$1\\"').replace(/(\\*)$/,"$1$1")}"`.replace(/[()%!^"<>&|]/g,"^$&")),r=`${i=o,i.replace(/[()%!^"<>&|;, ]/g,"^$&")} ${t.join(" ")}`;return{file:process.env.comspec||process.env.COMSPEC||"cmd.exe",args:["/d","/s","/c",`"${r}"`],opt:{windowsVerbatimArguments:!0}}}var i;return{file:o,args:n}}let rn={funWithMsg:e=>`(truncated, total ${e.length} chars)`};function nn(t,r=[],n={}){let{timeoutMs:o=12e4,cwd:i=process.cwd(),input:u,validate:l,maxBuffer:a=10485760,onStdout:s,onStderr:c,env:f}=n,d=function(e){if(Lr(e))return e;if(!Or(e))return null;let t=e.split(",").map(e=>e.trim()).filter(Boolean);return 0===t.length?null:e=>{for(let r of t)if("nonempty"===r){if(!Or(e)||""===e.trim())return!1}else if("json"===r)try{JSON.parse(e)}catch{return!1}else if("min:"===Rr(r,4)){let t=Br(r,4);if(!Sr(t))return!1;let n=Tr(t);if(!Or(e)||e.length<n)return!1}return!0}}(l),p=Date.now(),y=Ur(),h={...process.env,PYTHONIOENCODING:"utf-8"};if(void 0!==f){if("win32"===process.platform){let e=Object.keys(f).map(e=>e.toLowerCase());for(let t of Object.keys(h))e.includes(t.toLowerCase())&&delete h[t]}h={...h,...f}}let v=tn(t,r),g=e.spawn(v.file,v.args,{cwd:i,stdio:["pipe","pipe","pipe"],windowsHide:!0,env:h,...v.opt}),b="",m="",j=new TextDecoder("utf-8"),k=new TextDecoder("utf-8"),w=!1,_=!1;g.stdout.on("data",e=>{let t=j.decode(e,{stream:!0});t&&(Lr(s)&&s(t),b.length<a&&(b+=t))}),g.stderr.on("data",e=>{let t=k.decode(e,{stream:!0});t&&(Lr(c)&&c(t),m.length<a&&(m+=t))}),g.stdin.on("error",()=>{}),void 0!==u&&g.stdin.write(u,"utf8"),g.stdin.end();let O=setTimeout(()=>{w||(_=!0,function(e){let t=Ur();return Zr(Number(e),"SIGKILL",r=>{r?t.reject(r):t.resolve(`pid[${e}] killed`)}),t}(g.pid).catch(()=>{}),setTimeout(()=>{w||(w=!0,y.resolve({ok:!1,stdout:Vr(b,500,rn),stderr:Vr(m,500,rn),code:null,error:`TIMEOUT after ${o/1e3}s(子進程未能結束)`,durationMs:Date.now()-p,pid:g.pid}))},3e3).unref())},o);return g.on("error",e=>{w||(w=!0,clearTimeout(O),y.resolve({ok:!1,stdout:"",stderr:"",code:null,error:`${e.code||"UNKNOWN"}: ${e.message}`,durationMs:Date.now()-p,pid:g.pid}))}),g.on("close",(e,t)=>{if(w)return;w=!0,clearTimeout(O);let r=j.decode();r&&b.length<a&&(b+=r);let n=k.decode();n&&m.length<a&&(m+=n);let i=Date.now()-p;_?y.resolve({ok:!1,stdout:Vr(b,500,rn),stderr:Vr(m,500,rn),code:e,error:`TIMEOUT after ${o/1e3}s`,durationMs:i,pid:g.pid}):0===e?!d||d(b)?y.resolve({ok:!0,stdout:b,stderr:m,code:0,error:"",durationMs:i,pid:g.pid}):y.resolve({ok:!1,stdout:Vr(b,500,rn),stderr:Vr(m,500,rn),code:0,error:"OUTPUT_VALIDATION_FAILED",durationMs:i,pid:g.pid}):y.resolve({ok:!1,stdout:Vr(b,500,rn),stderr:Vr(m,1e3,rn),code:e,error:t?`Signal: ${t}`:`Exit code ${e}`,durationMs:i,pid:g.pid})}),y}async function on(e,t=[],r={}){if(!Or(e))return{ok:!1,stdout:"",stderr:"",code:null,error:"command 須為非空字串",durationMs:0,attempts:0};Fr(t)||(t=[]),Pr(r)||(r={});let{maxRetries:n=0,retryDelayMs:o=5e3,...i}=r,u=Ce(i,"cwd",null);Or(u)?i.cwd=u:i.cwd=process.cwd();let l=Ce(i,"input",null);Or(l)?i.input=l:i.input=void 0;let a=Ce(i,"env",null);Pr(a)?i.env=a:i.env=void 0;let s=Ce(i,"validate",null);Lr(s)||Or(s)?i.validate=s:i.validate=void 0;let c=Ce(i,"onStdout",null);Lr(c)?i.onStdout=c:i.onStdout=void 0;let f=Ce(i,"onStderr",null);Lr(f)?i.onStderr=f:i.onStderr=void 0,n=zr(n)?Tr(n):0,o=Dr(o)?Tr(o):5e3;let d=Ce(i,"timeoutMs",null);Dr(d)?i.timeoutMs=Tr(d):i.timeoutMs=12e4;let p,y=Ce(i,"maxBuffer",null);Dr(y)?i.maxBuffer=Tr(y):i.maxBuffer=10485760;let h=0;for(let r=0;r<=n;r++){if(r>0){let e=Math.min(o*r,15e3);await Cr(e)}if(p=await nn(e,t,i),h=r+1,p.ok)return p.attempts=h,p;if(p.error.includes("ENOENT"))break;if(2===p.code)break}return p.attempts=h,p}function un(...e){let t=[];for(let r of e)if(Fr(r))for(let e of r)Or(e)&&t.push(e);else Or(r)&&t.push(r);return t}function ln(e){return Or(e)||(e="unknown error"),{ok:!1,stdout:"",stderr:"",code:null,error:e,durationMs:0,attempts:0}}let an=3e5,sn=["exe","model","key","provider","agent","config","extraArgs","input","env"];async function cn(e,t={}){if(!Or(e))return ln("prompt must be a non-empty string");let r=Ce(t,"exe",null);Or(r)||(r="opencode");let n=Ce(t,"model",null),o=Ce(t,"agent",null);Or(o)||(o="build");let i=Ce(t,"extraArgs",null),u=un("run",["--agent",o],Or(n)?["-m",n]:[],i),l=Ce(t,"env",null);Pr(l)||(l=void 0);let a=Ce(t,"config",null);Pr(a)&&(a=JSON.stringify(a)),Or(a)&&(l={...l,OPENCODE_CONFIG_CONTENT:a});let s=Ce(t,"key",null),c=Ce(t,"provider",null);Or(s)&&Or(c)&&(l={...l,OPENCODE_AUTH_CONTENT:JSON.stringify({[c]:{type:"api",key:s}})});let f=Ce(t,"timeoutMs",null);return f=Dr(f)?Tr(f):an,on(r,u,{...fr(t,sn),input:e,env:l,timeoutMs:f})}function fn(e){return!0===(t=e)||!1===t||y(t)&&"[object Boolean]"==p(t);var t}let dn=["exe","model","skipPermissions","extraArgs","input"];async function pn(e,t={}){if(!Or(e))return ln("prompt must be a non-empty string");let r=Ce(t,"exe",null);Or(r)||(r="claude");let n=Ce(t,"model",null),o=Ce(t,"skipPermissions",null);fn(o)||(o=!0);let i=Ce(t,"extraArgs",null),u=un("-p",o?"--dangerously-skip-permissions":[],Or(n)?["--model",n]:[],i),l=Ce(t,"timeoutMs",null);return l=Dr(l)?Tr(l):an,on(r,u,{...fr(t,dn),input:e,timeoutMs:l})}let yn=["exe","model","sandbox","extraArgs","input"];async function hn(e,t={}){if(!Or(e))return ln("prompt must be a non-empty string");let r=Ce(t,"exe",null);Or(r)||(r="codex");let n=Ce(t,"model",null),o=Ce(t,"sandbox",null);Or(o)||(o="workspace-write");let i=Ce(t,"extraArgs",null),u=un("exec",["--sandbox",o],"--skip-git-repo-check",Or(n)?["-m",n]:[],i),l=Ce(t,"timeoutMs",null);return l=Dr(l)?Tr(l):an,on(r,u,{...fr(t,yn),input:e,timeoutMs:l})}let vn=an,gn=["exe","model","effort","skipPermissions","printTimeout","addDirs","extraArgs","input"];async function bn(e,t={}){if(!Or(e))return ln("prompt must be a non-empty string");if(e.length>3e4)return ln(`prompt too long (${e.length} chars > 30000), agy passes prompt via --print flag and Windows command line is capped at 32767 chars`);let r=Ce(t,"exe",null);Or(r)||(r="agy");let n=Ce(t,"model",null),o=Ce(t,"effort",null),i=Ce(t,"skipPermissions",null);fn(i)||(i=!0);let u=Ce(t,"timeoutMs",null);u=Dr(u)?Tr(u):vn;let l=Ce(t,"printTimeout",null);Or(l)||(l=`${Math.max(30,Math.floor(u/1e3)-30)}s`);let a=Ce(t,"addDirs",null);if(!Fr(a)){let e=Ce(t,"cwd",null);Or(e)||(e=process.cwd()),a=[e]}let s=[];for(let e of a)Or(e)&&s.push("--add-dir",e);let c=Ce(t,"extraArgs",null),f=un(i?"--dangerously-skip-permissions":[],["--print-timeout",l],Or(n)?["--model",n]:[],Or(o)?["--effort",o]:[],s,c,["--print",e]),d=fr(t,gn);try{return await on(r,f,{...d,timeoutMs:u})}catch(e){return ln(`${e.code||"UNKNOWN"}: ${e.message}`)}}let mn=an,jn={funWithMsg:e=>`(truncated, total ${e.length} chars)`};async function kn(e,t,r,n,o){let i=Date.now(),u=new AbortController,l=setTimeout(()=>{u.abort()},n),a=null,s="";try{a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(r),signal:u.signal}),s=await a.text()}catch(e){clearTimeout(l);let t=Date.now()-i;return"AbortError"===e.name?{ok:!1,stdout:"",stderr:"",code:null,error:`TIMEOUT after ${n/1e3}s`,durationMs:t}:{ok:!1,stdout:"",stderr:"",code:null,error:`FETCH_ERROR: ${Ce(e,"cause.code","")||e.message}`,durationMs:t}}clearTimeout(l);let c=Date.now()-i;if(!a.ok)return{ok:!1,stdout:"",stderr:Vr(s,1e3,jn),code:a.status,error:`HTTP ${a.status}`,durationMs:c};let f=null,d="",p=null;try{let e=JSON.parse(s);f=Ce(e,"choices.0.message.content",null),d=Ce(e,"choices.0.finish_reason",""),p=Ce(e,"choices.0.message.tool_calls",null)}catch{}return"tool_calls"===d||null!=p?{ok:!1,stdout:"",stderr:Vr(s,1e3,jn),code:a.status,error:"TOOL_CALLS_UNSUPPORTED: use a cli kind (opencode/claude/codex/antigravity) when tools are needed",durationMs:c}:null==f?{ok:!1,stdout:"",stderr:Vr(s,500,jn),code:a.status,error:"INVALID_RESPONSE: missing choices[0].message.content",durationMs:c}:("string"!=typeof f&&(f=JSON.stringify(f)),o&&!o(f)?{ok:!1,stdout:Vr(f,500,jn),stderr:"",code:a.status,error:"OUTPUT_VALIDATION_FAILED",durationMs:c}:{ok:!0,stdout:f,stderr:"",code:a.status,error:"",durationMs:c})}async function wn(e,t={}){if(!Or(e))return ln("prompt must be a non-empty string");let r=Ce(t,"baseURL",null);if(!Or(r))return ln("baseURL must be a non-empty string");let n=Ce(t,"model",null);if(!Or(n))return ln("model must be a non-empty string");let o=Ce(t,"key",null),i=Ce(t,"system",null),u=Ce(t,"body",null);Pr(u)||(u={});let l=Ce(t,"headers",null);Pr(l)||(l={});let a=Ce(t,"timeoutMs",null);a=Dr(a)?Tr(a):mn;let s=Ce(t,"maxRetries",null);s=zr(s)?Tr(s):0;let c=Ce(t,"retryDelayMs",null);c=Dr(c)?Tr(c):5e3;let f=function(e){if(Lr(e))return e;if(!Or(e))return null;let t=e.split(",").map(e=>e.trim()).filter(Boolean);return 0===t.length?null:e=>{for(let r of t)if("nonempty"===r){if(!Or(e)||""===e.trim())return!1}else if("json"===r)try{JSON.parse(e)}catch{return!1}else if("min:"===Rr(r,4)){let t=Br(r,4);if(!Sr(t))return!1;let n=Tr(t);if(!Or(e)||e.length<n)return!1}return!0}}(Ce(t,"validate",null)),d=r.replace(/\/+$/,"")+"/chat/completions",p=[];Or(i)&&p.push({role:"system",content:i}),p.push({role:"user",content:e});let y={model:n,messages:p,...u},h={"Content-Type":"application/json",...l};Or(o)&&(h.Authorization=`Bearer ${o}`);let v=null,g=0;for(let e=0;e<=s;e++){if(e>0&&await Cr(Math.min(c*e,15e3)),v=await kn(d,h,y,a,f),g=e+1,v.ok)return v.attempts=g,v;let t=v.code;if(Sr(t)&&t>=400&&t<500&&429!==t)break}return v.attempts=g,v}let _n={opencode:cn,claude:pn,codex:hn,antigravity:bn,"api-openai-compat":wn};function On(e){return e!=e}function xn(e){return null==e?[]:function(e,t){return Ie(t,function(t){return e[t]})}(e,G(e))}var Sn=Math.max;function An(e,t,r,n){e=K(e)?e:xn(e),r=r&&!n?wr(r):0;var o=e.length;return r<0&&(r=Sn(o+r,0)),function(e){return"string"==typeof e||!k(e)&&y(e)&&"[object String]"==p(e)}(e)?r<=o&&e.indexOf(t,r)>-1:!!o&&function(e,t,r){return t==t?function(e,t,r){for(var n=r-1,o=e.length;++n<o;)if(e[n]===t)return n;return-1}(e,t,r):function(e,t,r,n){for(var o=e.length,i=r+(n?1:-1);n?i--:++i<o;)if(t(e[i],i,e))return i;return-1}(e,On,r)}(e,t,r)>-1}async function Mn(e,t,r={}){let n=G(_n);return Or(e)&&An(n,e)?(0,_n[e])(t,r):ln(`unknown ai kind: "${e}" (available: ${n.join(", ")})`)}let In=["providers","budgetMs","minAttemptMs","store","onEvent"],$n=["id","keys"],En=an,Nn={cursors:{}};function Tn(e){let t=Ce(e,"error","");Or(t)||(t="");let r=Ce(e,"code",null);return 0===t.indexOf("TIMEOUT")||(!!t.includes("ENOENT")||(2===r||("OUTPUT_VALIDATION_FAILED"===t||0===t.indexOf("unknown ai kind"))))}async function Dn(e,t={}){if(!Or(e))return{...ln("prompt must be a non-empty string"),tried:[]};let r=Ce(t,"providers",null),n=Fr(r)?r.filter(Pr):[];if(0===n.length)return{...ln("providers must be a non-empty array"),tried:[]};let o=Ce(t,"budgetMs",null);o=Dr(o)?Tr(o):null;let i=null===o?null:Date.now()+o,u=Ce(t,"minAttemptMs",null);u=Dr(u)?Tr(u):2e4;let l=Ce(t,"store",null),a=Pr(l)&&Lr(l.get)&&Lr(l.set),s=null;if(a)try{s=l.get()}catch{}Pr(s)||(s=a?{cursors:{}}:Nn),Pr(s.cursors)||(s.cursors={});let c=()=>{if(a)try{l.set(s)}catch{}},f=Ce(t,"onEvent",null),d=e=>{if(Lr(f))try{f(e)}catch{}},p=fr(t,In),y=[],h=null,v=null;for(let t=0;t<n.length;t++){let r=n[t],o=Ce(r,"id",null);Or(o)||(o=String(t));let l=Ce(r,"kind",null),a=Ce(r,"model",null),f=Ce(r,"keys",null),g=Fr(f)?f.filter(Or):[],b=g.length,m=fr(r,$n),j=0;if(b>0){let e=Ce(s.cursors,o,0);j=Dr(e)?Tr(e)%b:0}let k=b>0?b:1,w=!1;for(let t=0;t<k&&!w;t++){let r=b>0?(j+t)%b:null,n=null===r?o:`${o}#${r}`,f={...p,...m};b>0&&(f.key=g[r]);let k=Ce(f,"timeoutMs",null);if(k=Dr(k)?Tr(k):En,null!==i){let e=i-Date.now();if(e<u)return d({type:"budget-out",providerId:o,keyIndex:r,keyId:n,remainingMs:e}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"budget-out"}),{...ln("budget exhausted"),tried:y};k=Math.min(k,e)}f.timeoutMs=k,d({type:"try",providerId:o,keyIndex:r,keyId:n,kind:l,model:a});let _=await Mn(l,e,f);if(_.ok)return b>0&&(s.cursors[o]=(r+1)%b,c()),d({type:"ok",providerId:o,keyIndex:r,keyId:n,durationMs:_.durationMs}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"ok",durationMs:_.durationMs}),{..._,providerId:o,keyIndex:r,kind:l,model:a,tried:y};h=_,v={providerId:o,keyIndex:r,kind:l,model:a},Tn(_)?(d({type:"skip-group",providerId:o,keyIndex:r,keyId:n,error:_.error,stdout:_.stdout,stderr:_.stderr}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"skip-group",error:_.error,stdout:_.stdout,stderr:_.stderr,durationMs:_.durationMs}),w=!0):(d({type:"next-key",providerId:o,keyIndex:r,keyId:n,error:_.error,stdout:_.stdout,stderr:_.stderr}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"next-key",error:_.error,stdout:_.stdout,stderr:_.stderr,durationMs:_.durationMs}))}}return{...h||ln("all providers failed"),...v||{},tried:y}}function Pn(e){return!!function(e){return"[object Undefined]"===Object.prototype.toString.call(e)}(e)||(!!function(e){return"[object Null]"===Object.prototype.toString.call(e)}(e)||(!!function(e){if(Pr(e)){for(let t in e)return!1;return!0}return!1}(e)||(!!function(e){return!(!_r(e)||""!==e)}(e)||(!!function(e){return!!Fr(e)&&0===e.length}(e)||!!xr(e)))))}function Un(e){return!!Fr(e)&&(0!==e.length&&(1!==e.length||!Pn(e[0])))}function Cn(e){let t=String(e||"");if(t=t.replace(new RegExp(String.fromCharCode(27)+"\\[[0-9;]*m","g"),""),t=t.replace(/```(?:json)?/g,""),t=t.trim(),""===t)return null;try{let e=JSON.parse(t);if(null!==e&&"object"==typeof e)return e}catch(e){}let r=-1;for(let e=0;e<t.length;e++)if("{"===t[e]||"["===t[e]){r=e;break}if(r<0)return null;let n=0,o=!1,i=!1;for(let e=r;e<t.length;e++){let u=t[e];if(o)i?i=!1:"\\"===u?i=!0:'"'===u&&(o=!1);else if('"'===u)o=!0;else if("{"===u||"["===u)n++;else if(("}"===u||"]"===u)&&(n--,0===n)){try{let n=JSON.parse(t.slice(r,e+1));if(null!==n&&"object"==typeof n)return n}catch(e){}return null}}return null}let Fn=["【執行約束】你只需把結果輸出在回覆內容中。","禁止建立、修改或刪除任何檔案,也不要執行任何會改動磁碟或系統狀態的指令——","呼叫端只讀取你的回覆文字,任何寫入磁碟的動作都不會被採用,只會製造無人讀取的垃圾檔。","唯讀查閱(讀取檔案、搜尋內容、列出目錄)不在此限,需要時請照常使用。","",""].join("\n");async function Ln(e,t={}){let r=Date.now();if(!Or(e))return{ok:!1,json:null,error:"prompt must be a non-empty string",ms:0,tried:[]};let n=Ce(t,"providers",null),o=Ce(t,"spec",null);if(!Pr(n)||!Pr(o))return{ok:!1,json:null,error:`no valid provider for spec: ${JSON.stringify(o)}`,ms:0,tried:[]};let{chain:i,missing:u}=function(e,t){let r=[Ce(t,"use","")],n=Ce(t,"fallback",null);Un(n)&&(r=[...r,...n]);let o=[],i=[];for(let t of r){let r=Ce(e,t,null);Pr(r)?o.push({id:t,...r}):i.push(String(t))}return{chain:o,missing:i}}(n,o);if(u.length>0)return{ok:!1,json:null,error:`unknown provider name(s): ${u.join(", ")}`,ms:0,tried:[]};if(0===i.length)return{ok:!1,json:null,error:`no valid provider for spec: ${JSON.stringify(o)}`,ms:0,tried:[]};let l=!0===Ce(t,"rawText",!1),a=Ce(t,"parse",null);Lr(a)||(a=Cn);let s=Ce(t,"check",null);Lr(s)||(s=null);let c=Ce(t,"promptPrefix",null);Or(c)||(c=""===c?"":Fn);let f=await Dn(c+e,{providers:i,validate:e=>{if(l){let t=String(e||"").trim();return""!==t&&(!s||!0===s(t))}let t=a(e);return null!==t&&(!s||!0===s(t))},timeoutMs:Ce(t,"timeoutMs",null)||an,budgetMs:Ce(t,"budgetMs",null)||void 0,maxRetries:Ce(t,"maxRetries",null)||0,cwd:Ce(t,"cwd",null)||process.cwd(),store:Ce(t,"store",null)||void 0,onEvent:Ce(t,"onEvent",null)||void 0}),d=null;f.ok&&(d=l?String(f.stdout||"").trim():a(f.stdout));let p=Ce(f,"providerId",null),y=Ce(f,"keyIndex",null);return{ok:f.ok&&null!==d,json:d,providerId:p,keyIndex:y,keyId:null===y?p:`${p}#${y}`,ms:Date.now()-r,tried:Ce(f,"tried",[]),error:f.ok?"":Ce(f,"error","unknown error")}}async function zn(e={}){let t=Date.now(),r=Ce(e,"providers",null),n=Ce(e,"task",""),o=Ce(e,"agents",null),i=Ce(e,"integrate",null),u=Ce(e,"check",null),l=Ce(e,"callOpt",{});if(!Or(n))return{ok:!1,result:null,integrated:!1,agents:[],candidates:[],totalMs:0,error:"task must be a non-empty string"};if(!Un(o))return{ok:!1,result:null,integrated:!1,agents:[],candidates:[],totalMs:0,error:"agents must be a non-empty array"};let a=Ce(e,"minCandidates",null);a=Dr(a)?Tr(a):2;let s=await Promise.all(o.map(e=>{let{use:t,fallback:o,...i}=e;return Ln(n,{...l,...i,providers:r,spec:{use:t,fallback:o},check:u})})),c=s.filter(e=>e.ok).map(e=>e.json);if(0===c.length)return{ok:!1,result:null,integrated:!1,agents:s,candidates:c,totalMs:Date.now()-t,error:"all agents failed"};if(1===c.length||c.length<a)return{ok:!0,result:c[0],integrated:!1,agents:s,candidates:c,totalMs:Date.now()-t,error:""};if(!i||!Or(Ce(i,"use","")))return{ok:!1,result:null,integrated:!1,agents:s,candidates:c,totalMs:Date.now()-t,error:"integrate spec (with use) is required"};let{use:f,fallback:d,prompt:p,...y}=i,h=Lr(p)?p(c):function(e,t={}){let r=Ce(t,"schema",""),n=Or(r)?`\n只回覆 JSON 物件,不要任何其他說明文字,格式與候選相同:\n${r}\n`:"\n只回覆 JSON 物件,不要任何其他說明文字,格式與候選相同。\n";return`你是整合者。以下是同一任務由 ${e.length} 個獨立執行產生的候選結果(JSON),請整合成單一最佳版本:擇優合併、去重、保留最完整的證據標注與爭議呈現,不可加入候選中沒有的數字或結論。\n${n}\n${e.map((e,t)=>`【候選 ${t+1}】\n${JSON.stringify(e)}`).join("\n\n")}`}(c,e),v=await Ln(h,{...l,...y,providers:r,spec:{use:f,fallback:d},check:u});return{ok:v.ok,result:v.ok?v.json:null,integrated:v.ok,agents:s,candidates:c,integrateDetail:v,totalMs:Date.now()-t,error:v.ok?"":`integrate failed: ${v.error}`}}let Rn=["id","use","fallback","prompt","check"];async function Bn(e={}){let t=Date.now(),r=Ce(e,"providers",null),n=Ce(e,"input",null),o=Ce(e,"stages",null),i=Ce(e,"callOpt",{});if(!Un(o))return{ok:!1,result:null,stages:{},results:{},order:[],failedStage:null,totalMs:0,error:"stages must be a non-empty array"};let u={},l={},a=[],s=null;for(let e=0;e<o.length;e++){let c=o[e],f=Or(Ce(c,"id",""))?c.id:`stage${e+1}`;a.push(f);let d=Ce(c,"prompt",null);if(!Lr(d))return l[f]={ok:!1,error:`stage[${f}].prompt must be a function`},{ok:!1,result:null,stages:l,results:u,order:a,failedStage:f,totalMs:Date.now()-t,error:l[f].error};let p=d({input:n,prev:s,results:u,index:e});if(!Or(p))return l[f]={ok:!1,error:`stage[${f}].prompt returned empty`},{ok:!1,result:null,stages:l,results:u,order:a,failedStage:f,totalMs:Date.now()-t,error:l[f].error};let y=fr(c,Rn),h=await Ln(p,{...i,...y,providers:r,spec:{use:Ce(c,"use",""),fallback:Ce(c,"fallback",null)},check:Ce(c,"check",null)});if(l[f]=h,!h.ok)return{ok:!1,result:null,stages:l,results:u,order:a,failedStage:f,totalMs:Date.now()-t,error:`stage[${f}] failed: ${h.error}`};u[f]=h.json,s=h.json}return{ok:!0,result:s,stages:l,results:u,order:a,failedStage:null,totalMs:Date.now()-t,error:""}}let Vn={KINDS:G(_n),dispatchAi:Mn,dispatchAiFallback:Dn,dispatchAiWkf:function(e={}){let t=Ce(e,"providers",null);if(!Pr(t))throw new Error("dispatchAiWkf: opt.providers must be an object (name → provider entry)");let r=Ce(e,"defaults",null);return Pr(r)||(r={}),{providers:t,callAi:(e,n={})=>Ln(e,{...r,...n,providers:t}),runFanout:(e={})=>zn({...e,providers:t,callOpt:{...r,...Ce(e,"callOpt",{})}}),runRolePipeline:(e={})=>Bn({...e,providers:t,callOpt:{...r,...Ce(e,"callOpt",{})}}),runFanoutPipeline:(e={})=>async function(e={}){let t=Date.now(),r=await zn({providers:Ce(e,"providers",null),task:Ce(e,"task",""),agents:Ce(e,"agents",null),integrate:Ce(e,"integrate",null),check:Ce(e,"check",null),schema:Ce(e,"schema",""),minCandidates:Ce(e,"minCandidates",null),callOpt:Ce(e,"callOpt",{})});if(!r.ok)return{ok:!1,result:null,A:r,B:null,totalMs:Date.now()-t,error:`A failed: ${r.error}`};let n=await Bn({providers:Ce(e,"providers",null),input:r.result,stages:Ce(e,"stages",null),callOpt:Ce(e,"callOpt",{})});return{ok:n.ok,result:n.ok?n.result:null,A:r,B:n,totalMs:Date.now()-t,error:n.ok?"":`B failed: ${n.error}`}}({...e,providers:t,callOpt:{...r,...Ce(e,"callOpt",{})}})}},dispatchOpencode:cn,dispatchClaude:pn,dispatchCodex:hn,dispatchAntigravity:bn,dispatchApiOpenaiCompat:wn,providers:[{id:"oc:opencode/deepseek-v4-flash-free",model:"opencode/deepseek-v4-flash-free",kind:"opencode",envVar:"OPENCODE_KEYS",provider:"opencode",config:{permission:{edit:"deny",write:"deny",bash:"deny"}}},{id:"oc:agnes-ai/agnes-2.5-flash",model:"agnes-ai/agnes-2.5-flash",kind:"opencode",envVar:"AGNES_KEYS",provider:"agnes-ai",config:{provider:{"agnes-ai":{npm:"@ai-sdk/openai-compatible",name:"Agnes",options:{baseURL:"https://apihub.agnes-ai.com/v1"},models:{"agnes-2.5-flash":{name:"Agnes 2.5 Flash"}}}},permission:{edit:"deny",write:"deny",bash:"deny"}}},{id:"oc:poolside/poolside/laguna-s-2.1",model:"poolside/poolside/laguna-s-2.1",kind:"opencode",envVar:"POOLSIDE_KEYS",provider:"poolside",config:{provider:{poolside:{npm:"@ai-sdk/openai-compatible",name:"Poolside",options:{baseURL:"https://inference.poolside.ai/v1"},models:{"poolside/laguna-s-2.1":{name:"Laguna S 2.1"}}}},permission:{edit:"deny",write:"deny",bash:"deny"}}},{id:"agy:gemini-3.7-flash-high",model:"gemini-3.7-flash-high",kind:"antigravity",addDirs:["."]},{id:"claude:sonnet",model:"sonnet",kind:"claude",extraArgs:["--disallowedTools","Write,Edit,NotebookEdit,Bash"]},{id:"codex:gpt-5.6-luna",model:"gpt-5.6-luna",kind:"codex",sandbox:"read-only"},{id:"zen:deepseek-v4-flash-free",model:"deepseek-v4-flash-free",kind:"api-openai-compat",envVar:"OPENCODE_KEYS",baseURL:"https://opencode.ai/zen/v1",body:{max_tokens:8192}},{id:"agnes:agnes-2.5-flash",model:"agnes-2.5-flash",kind:"api-openai-compat",envVar:"AGNES_KEYS",baseURL:"https://apihub.agnes-ai.com/v1",body:{max_tokens:8192}},{id:"poolside:laguna-s-2.1",model:"poolside/laguna-s-2.1",kind:"api-openai-compat",envVar:"POOLSIDE_KEYS",baseURL:"https://inference.poolside.ai/v1",body:{max_tokens:8192,chat_template_kwargs:{enable_thinking:!1}}}],resolveProviders:function(e,t={}){let r=Ce(t,"env",null);Pr(r)||(r="undefined"!=typeof process&&process&&Pr(process.env)?process.env:{});let n=Fr(e)?e.filter(Pr):[],o=Ce(t,"pick",null),i=[],u=n;if(Un(o)){u=[];for(let e of o){let t=n.find(t=>Ce(t,"id",null)===e);t?u.push(t):i.push(String(e))}}let l=[],a=[];for(let e of u){let t=Ce(e,"envVar",null);if(!Or(t)||Un(Ce(e,"keys",null))){l.push(fr(e,["envVar"]));continue}let n=String(Ce(r,t,"")||"").split(",").map(e=>e.trim()).filter(Boolean);0!==n.length?l.push({...fr(e,["envVar"]),keys:n}):a.push({id:Ce(e,"id",""),envVar:t})}let s={};for(let e of l)s[e.id]=e;return{providers:l,table:s,skipped:a,missing:i}}};return Vn});
|
|
7
7
|
//# sourceMappingURL=w-dispatch-ai.umd.js.map
|