w-dispatch-ai 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +123 -35
  2. package/dist/w-dispatch-ai.umd.js +2 -2
  3. package/dist/w-dispatch-ai.umd.js.map +1 -1
  4. package/docs/WDispatchAi.mjs.html +8 -4
  5. package/docs/adapters.mjs.html +43 -7
  6. package/docs/dispatchAi.mjs.html +2 -2
  7. package/docs/dispatchAiFallback.mjs.html +42 -8
  8. package/docs/dispatchAiWkf.mjs.html +197 -0
  9. package/docs/dispatchAntigravity.mjs.html +2 -2
  10. package/docs/dispatchApiOpenaiCompat.mjs.html +516 -0
  11. package/docs/dispatchClaude.mjs.html +2 -2
  12. package/docs/dispatchCodex.mjs.html +2 -2
  13. package/docs/dispatchOpencode.mjs.html +2 -2
  14. package/docs/getCliArgs.mjs.html +2 -2
  15. package/docs/getErrorResult.mjs.html +2 -2
  16. package/docs/global.html +5768 -1469
  17. package/docs/index.html +2 -2
  18. package/docs/wkf_callAiWithFallback.mjs.html +282 -0
  19. package/docs/wkf_extractJsonLoose.mjs.html +180 -0
  20. package/docs/wkf_runFanout.mjs.html +227 -0
  21. package/docs/wkf_runFanoutPipeline.mjs.html +178 -0
  22. package/docs/wkf_runRolePipeline.mjs.html +195 -0
  23. package/g.mjs +41 -25
  24. package/package.json +1 -1
  25. package/src/WDispatchAi.mjs +6 -2
  26. package/src/adapters.mjs +41 -5
  27. package/src/dispatchAiFallback.mjs +40 -6
  28. package/src/dispatchAiWkf.mjs +125 -0
  29. package/src/dispatchApiOpenaiCompat.mjs +444 -0
  30. package/src/wkf/callAiWithFallback.mjs +210 -0
  31. package/src/wkf/extractJsonLoose.mjs +108 -0
  32. package/src/wkf/runFanout.mjs +155 -0
  33. package/src/wkf/runFanoutPipeline.mjs +106 -0
  34. package/src/wkf/runRolePipeline.mjs +123 -0
  35. package/test/tools/fakeServerForApiTest.mjs +151 -0
  36. package/test/unit-WDispatchAi.test.mjs +13 -6
  37. package/test/unit-adapters.test.mjs +5 -3
  38. package/test/unit-callAiWithFallback.test.mjs +146 -0
  39. package/test/unit-dispatchAi.test.mjs +1 -1
  40. package/test/unit-dispatchAiWkf.test.mjs +118 -0
  41. package/test/unit-dispatchApiOpenaiCompat.test.mjs +264 -0
  42. package/test/unit-extractJsonLoose.test.mjs +78 -0
  43. package/test/unit-runFanout.test.mjs +166 -0
  44. package/test/unit-runFanoutPipeline.test.mjs +86 -0
  45. package/test/unit-runRolePipeline.test.mjs +163 -0
package/README.md CHANGED
@@ -23,7 +23,8 @@ Note:
23
23
  - `dispatchCodex` needs [OpenAI Codex CLI](https://github.com/openai/codex) (`codex`) in system PATH, and uses its existing login state.
24
24
  - `dispatchOpencode` needs [opencode CLI](https://opencode.ai/) (`opencode`) in system PATH. Unlike the other two, it accepts a per-call `key`+`provider`, injected through `OPENCODE_AUTH_CONTENT`, so multiple api keys can be rotated without rewriting `auth.json`.
25
25
  - `dispatchAntigravity` needs [Google Antigravity CLI](https://antigravity.google/) (`agy`, not `antigravity`) in system PATH, and uses its existing OAuth login state (first login requires an interactive desktop session). Unlike the other three, agy takes the prompt via the `--print` flag instead of stdin, so the prompt is capped at 30000 chars (Windows command line limit); longer prompts return an error result.
26
- - Each adapter also accepts an `exe` option to pin the executable path, useful when the CLI is not in PATH (e.g. Windows Task Scheduler environments).
26
+ - `dispatchApiOpenaiCompat` needs **no cli and no login**: it calls any OpenAI-compatible endpoint directly by fetch. Known-working gateways (verified 2026-08-11): [OpenCode Zen](https://opencode.ai/docs/zen) `https://opencode.ai/zen/v1` (same `sk-...` keys as opencode cli, model names without the `opencode/` prefix, e.g. `deepseek-v4-flash-free`) and Agnes `https://apihub.agnes-ai.com/v1` (model `agnes-2.0-flash`). Note claude/codex use subscription login state, not api keys, so they cannot be called this way.
27
+ - Each cli adapter also accepts an `exe` option to pin the executable path, useful when the CLI is not in PATH (e.g. Windows Task Scheduler environments).
27
28
  - For the other three adapters the prompt is always passed through stdin, never as a positional argument, so a prompt of tens of thousands of characters will not cause `ENAMETOOLONG`.
28
29
  - All functions never reject. Success or failure is reported by the `ok` and `error` fields of the result object.
29
30
  - **Security**: `dispatchClaude` passes `--dangerously-skip-permissions` by default, so the non-interactive `-p` mode will not hang on permission prompts. If the prompt embeds untrusted content (e.g. a web page to summarize), instructions inside that content would also run without the permission gate. Pass `skipPermissions: false` to keep the CLI permission gate.
@@ -31,13 +32,15 @@ Note:
31
32
  #### Functions:
32
33
  | function | description |
33
34
  | --- | --- |
34
- | `dispatchAi(kind, prompt, opt)` | dispatch to the adapter of `kind`, one of `'opencode'`、`'claude'`、`'codex'`、`'antigravity'` |
35
+ | `dispatchAi(kind, prompt, opt)` | dispatch to the adapter of `kind`, one of `'opencode'`、`'claude'`、`'codex'`、`'antigravity'`、`'api-openai-compat'` |
35
36
  | `dispatchAiFallback(prompt, opt)` | call ai with an ordered provider list, auto rotating keys within a group and falling back to the next group |
37
+ | `dispatchAiWkf(opt)` | workflow factory: inject a named provider table once, returns bound `callAi`/`runFanout`/`runRolePipeline`/`runFanoutPipeline` |
36
38
  | `dispatchOpencode(prompt, opt)` | call an ai model by opencode cli, supports per-call api key and provider config |
37
39
  | `dispatchClaude(prompt, opt)` | call a claude model by claude code cli |
38
40
  | `dispatchCodex(prompt, opt)` | call a gpt model by openai codex cli |
39
41
  | `dispatchAntigravity(prompt, opt)` | call an ai model by google antigravity cli (`agy`), a multi-model gateway (gemini, claude, gpt-oss) |
40
- | `KINDS` | array of available kinds, `['opencode', 'claude', 'codex', 'antigravity']` |
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
+ | `KINDS` | array of available kinds, `['opencode', 'claude', 'codex', 'antigravity', 'api-openai-compat']` |
41
44
 
42
45
  #### Example:
43
46
  > **Link:** [[dev source code](https://github.com/yuda-lyu/w-dispatch-ai/blob/master/g.mjs)]
@@ -71,7 +74,7 @@ let test = async () => {
71
74
 
72
75
  //可用之AI供應商種類
73
76
  console.log('KINDS:', wdi.KINDS)
74
- // => KINDS: [ 'opencode', 'claude', 'codex', 'antigravity' ]
77
+ // => KINDS: [ 'opencode', 'claude', 'codex', 'antigravity', 'api-openai-compat' ]
75
78
 
76
79
  let prompt = '請只回覆兩個字:完成,不要有任何其他文字'
77
80
 
@@ -95,6 +98,15 @@ let test = async () => {
95
98
  console.log('antigravity:', r3b.ok, r3b.stdout.trim())
96
99
  // => antigravity: true 完成
97
100
 
101
+ //以OpenAI相容API直呼(免CLI免登入), 給baseURL+key+model即可; Zen端點即opencode CLI之自家閘道
102
+ let r3c = await wdi.dispatchApiOpenaiCompat(prompt, {
103
+ baseURL: 'https://apihub.agnes-ai.com/v1',
104
+ key: agnesKeys[0],
105
+ model: 'agnes-2.0-flash',
106
+ })
107
+ console.log('api-openai-compat:', r3c.ok, r3c.code, r3c.stdout.trim())
108
+ // => api-openai-compat: true 200 完成
109
+
98
110
  //以供應商條目輪替, 一個條目即一組(kind, model, 可選的key與provider與config), 輪到誰就用誰的CLI與模型
99
111
  //opencode支援逐次注入金鑰, 故同一provider之多把金鑰可各成一個條目
100
112
  let items = [
@@ -119,36 +131,43 @@ let test = async () => {
119
131
  //未知供應商回傳error結果物件, 不會reject
120
132
  let r4 = await wdi.dispatchAi('gemini', prompt)
121
133
  console.log('invalid kind:', r4.ok, r4.error)
122
- // => invalid kind: false unknown ai kind: "gemini" (available: opencode, claude, codex, antigravity)
134
+ // => invalid kind: false unknown ai kind: "gemini" (available: opencode, claude, codex, antigravity, api-openai-compat)
123
135
 
124
136
  //prompt非有效字串亦回傳error結果物件
125
137
  let r5 = await wdi.dispatchClaude('')
126
138
  console.log('invalid prompt:', r5.ok, r5.error)
127
139
  // => invalid prompt: false prompt must be a non-empty string
128
140
 
129
- //CLI執行失敗時, 由ok、code、error與stderr判斷原因
130
- let r6 = await wdi.dispatchOpencode(prompt, {
131
- model: 'opencode/deepseek-v4-flash-free',
132
- provider: 'opencode',
141
+ //執行失敗時, 由ok、code、error與stderr判斷原因
142
+ //REST路徑之錯誤依HTTP狀態碼分流(401金鑰無效、429限流、5xx服務端), 判別比CLI之stderr字串可靠
143
+ let r6 = await wdi.dispatchApiOpenaiCompat(prompt, {
144
+ baseURL: 'https://apihub.agnes-ai.com/v1',
145
+ model: 'agnes-2.0-flash',
133
146
  key: 'sk-invalid-key',
134
147
  })
135
- console.log('invalid key:', r6.ok, r6.code, r6.error, r6.stderr.includes('Invalid API key'))
136
- // => invalid key: false 1 Exit code 1 true
148
+ console.log('invalid key:', r6.ok, r6.code, r6.error, r6.stderr.includes('无效的令牌'))
149
+ // => invalid key: false 401 HTTP 401 true
137
150
 
138
151
  //多供應商自動遞補: providers順序即優先序, 組內keys以游標輪替
139
- //此例第1把金鑰無效 → 自動換組內下一把成功; 若整組用盡會遞補下一組(claude), 再失敗遞補codex
152
+ //此例第1把金鑰無效 → 自動換組內下一把成功; 若整組用盡會遞補下一組, 依序往下
153
+ //
154
+ //【id命名】id為游標鍵與日誌標籤, 須區分到「模型」而非只到「廠商」——
155
+ // 取'claude'則日後無法同時掛sonnet與opus, 且日誌看不出實際用了哪個模型;
156
+ // 同一模型經不同路徑(REST/CLI/不同閘道)取得時額度池與故障域各自獨立,
157
+ // 屬不同供應商, 故id須帶上路徑前綴加以區分
140
158
  let r7 = await wdi.dispatchAiFallback(prompt, {
141
159
  providers: [
160
+ //REST版排前面: 免CLI、快3~5倍, 純文字任務優先走此路
142
161
  {
143
- id: 'deepseek',
144
- kind: 'opencode',
145
- model: 'opencode/deepseek-v4-flash-free',
146
- provider: 'opencode',
147
- keys: ['sk-invalid-key-demo', opencodeKeys[0]], //第1把無效, 示範組內輪替
148
- timeoutMs: 180000,
162
+ id: 'api:agnes-2.0-flash',
163
+ kind: 'api-openai-compat',
164
+ baseURL: 'https://apihub.agnes-ai.com/v1',
165
+ model: 'agnes-2.0-flash',
166
+ keys: ['sk-invalid-key-demo', agnesKeys[0]], //第1把無效, 示範組內輪替
149
167
  },
168
+ //同一個agnes模型之CLI版: 有工具能力但較慢, 額度池亦不同, 屬另一個供應商
150
169
  {
151
- id: 'agnes',
170
+ id: 'oc:agnes-ai/agnes-2.0-flash',
152
171
  kind: 'opencode',
153
172
  model: 'agnes-ai/agnes-2.0-flash',
154
173
  provider: 'agnes-ai',
@@ -156,21 +175,21 @@ let test = async () => {
156
175
  config: configAgnes, //第三方provider須另給定義
157
176
  timeoutMs: 180000,
158
177
  },
159
- { id: 'claude', kind: 'claude', model: 'sonnet' },
160
- { id: 'codex', kind: 'codex', model: 'gpt-5.6-luna', sandbox: 'read-only' },
161
- { id: 'antigravity', kind: 'antigravity', model: 'gemini-3.6-flash-low' },
178
+ { id: 'claude:sonnet', kind: 'claude', model: 'sonnet' },
179
+ { id: 'codex:gpt-5.6-luna', kind: 'codex', model: 'gpt-5.6-luna', sandbox: 'read-only' },
180
+ { id: 'agy:gemini-3.6-flash-low', kind: 'antigravity', model: 'gemini-3.6-flash-low' },
162
181
  ],
163
182
  budgetMs: 600000,
164
183
  onEvent: (ev) => console.log(' event:', ev.type, ev.keyId, ev.error || ''),
165
184
  })
166
185
  console.log('fallback:', r7.ok, r7.providerId, r7.keyIndex, r7.stdout.trim())
167
186
  console.log('tried:', r7.tried.map((x) => `${x.keyId}:${x.outcome}`).join(', '))
168
- // => event: try deepseek#0
169
- // => event: next-key deepseek#0 Exit code 1
170
- // => event: try deepseek#1
171
- // => event: ok deepseek#1
172
- // => fallback: true deepseek 1 完成
173
- // => tried: deepseek#0:next-key, deepseek#1:ok
187
+ // => event: try api:agnes-2.0-flash#0
188
+ // => event: next-key api:agnes-2.0-flash#0 HTTP 401
189
+ // => event: try api:agnes-2.0-flash#1
190
+ // => event: ok api:agnes-2.0-flash#1
191
+ // => fallback: true api:agnes-2.0-flash 1 完成
192
+ // => tried: api:agnes-2.0-flash#0:next-key, api:agnes-2.0-flash#1:ok
174
193
 
175
194
  }
176
195
  await test()
@@ -222,11 +241,40 @@ await test()
222
241
 
223
242
  注意:agy之prompt走`--print`旗標而非stdin(agy介面如此),故prompt長度上限30000字元,超過回傳錯誤結果物件(不reject)。
224
243
 
244
+ #### Choosing CLI or API (判準):
245
+ 選 `kind` 的唯一判準是**這一步需不需要「工具」**:
246
+
247
+ | 這次呼叫要做的事 | 選用 | 理由 |
248
+ | --- | --- | --- |
249
+ | 讀本機檔案、grep、執行指令、抓網頁、寫檔 | **CLI類**:`opencode`/`claude`/`codex`/`antigravity` | CLI本身是agentic harness,自帶完整工具迴圈,呼叫端什麼都不必做 |
250
+ | 摘要、分析、改寫、翻譯、產出JSON(素材皆已在prompt內) | **API類**:`api-openai-compat` | 免安裝免登入,且實測較快(Agnes:API 1~2.5s vs CLI 4~6s) |
251
+
252
+ **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` 回報失敗,不假裝成功。
253
+
254
+ 另注意 `tool_calls` 有**會話束縛**(`tool_call_id` 須於同一條messages串內回填),無法暫停後跨行程外傳給上層agent代跑;工作流各名額(如 `runFanout` 的agents)也只是同行程的async函數呼叫而非獨立agent,故「讓外殼agent提供工具給工作流內的模型使用」在本架構下不成立——**需要工具就選CLI類kind**。
255
+
256
+ **混用才是常態**:同一條 `dispatchAiFallback` 鏈可逐條目混搭kind,工作流各階段亦然——產生候選與整合收斂等純文字階段走API,需要翻閱專案檔案的階段換CLI。
257
+
258
+ #### Options only for dispatchApiOpenaiCompat:
259
+ | key | type | default | description |
260
+ | --- | --- | --- | --- |
261
+ | `baseURL` | String | 必填 | API基底網址,將於尾端接上`/chat/completions` |
262
+ | `model` | String | 必填 | 模型ID(Zen之模型名不帶`opencode/`前綴) |
263
+ | `key` | String | `''` | API key,以`Bearer`置於`Authorization`標頭,省略代表不帶認證 |
264
+ | `system` | String | `''` | system提示詞,置於messages首位 |
265
+ | `body` | Object | `{}` | 額外請求本體(`temperature`、`max_tokens`、`response_format`等),同名鍵覆寫預設 |
266
+ | `headers` | Object | `{}` | 額外請求標頭 |
267
+ | `timeoutMs` | Integer | `120000` | 逾時毫秒,逾時中止請求(含回應串流讀取) |
268
+ | `maxRetries` | Integer | `0` | 失敗重試次數;**4xx(429除外)為客戶端錯誤不重試**,429/5xx/網路錯誤/逾時線性退避重試 |
269
+ | `retryDelayMs` | Integer | `5000` | 重試間隔,實際為`retryDelayMs`×次數且上限15000ms |
270
+
271
+ 結果結構對齊execCli:`stdout`為回覆內容、`code`為HTTP狀態碼(網路錯誤/逾時為`null`)、逾時`error`以`TIMEOUT`開頭、驗證失敗為`OUTPUT_VALIDATION_FAILED`——故可直接作為`dispatchAiFallback`條目(`kind: 'api-openai-compat'`,`keys`多金鑰輪替同樣適用)與工作流provider。
272
+
225
273
  #### Options for dispatchAiFallback:
226
274
  | key | type | default | description |
227
275
  | --- | --- | --- | --- |
228
276
  | `providers` | Array | 必填 | 供應商條目陣列,**順序即優先序**。條目除`id`、`keys`外即該次調用之opt,原樣透傳對應轉接器(`kind`、`model`、`exe`、`provider`、`config`、`sandbox`、`timeoutMs`等皆放條目內) |
229
- | `providers[].id` | String | 條目索引 | 群組識別,游標以此為鍵,多金鑰條目應給予穩定`id` |
277
+ | `providers[].id` | String | 條目索引 | 群組識別,游標以此為鍵、亦為日誌標籤;本套件不解讀其內容,命名規則見下方 |
230
278
  | `providers[].keys` | Array | `[]` | 同一服務之多把API key,逐次注入輪替(`kind`為`opencode`時須同時給`provider`);省略代表沿用CLI登入狀態 |
231
279
  | `budgetMs` | Integer | 不限 | 整輪遞補之時間上限,剩餘預算會壓進每次呼叫之`timeoutMs` |
232
280
  | `minAttemptMs` | Integer | `20000` | 單次嘗試之最低剩餘預算,低於此值即停止並回報`budget exhausted` |
@@ -235,6 +283,18 @@ await test()
235
283
 
236
284
  頂層其餘設定(`timeoutMs`、`validate`、`maxRetries`等)為各attempt之共用預設,條目可覆寫;`maxRetries`建議維持預設`0`,韌性交給換家而非重試同一家。
237
285
 
286
+ **條目 `id` 之命名規則**(呼叫端負責設計,本套件只當作不透明字串使用):
287
+
288
+ `id` 在套件內只有兩個用途——游標的物件鍵(`state.cursors[id]`)與日誌標籤(`providerId`、`keyId` = `` `${id}#${keyIndex}` ``)。不查表、不比對、無格式要求,故「什麼算同一個供應商」由呼叫端定義。
289
+
290
+ | 規則 | 說明 |
291
+ | --- | --- |
292
+ | **區分到「模型」而非只到「廠商」** | ❌ `id: 'claude'` — 日後無法同時掛 sonnet 與 opus,日誌也看不出用了哪個模型<br>✅ `id: 'claude:sonnet'`、`id: 'claude:opus'` |
293
+ | **同一模型經不同路徑時須帶路徑** | 同一個 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'` |
294
+ | **務必給、務必唯一** | 未給時回退為**陣列索引字串**——索引是位置不是身分,日後於鏈中插入條目會令後續條目繼承他人的游標進度(輪替張冠李戴)。兩個條目同 `id` 則共用同一游標且日誌無法區分。 |
295
+
296
+ **同一組金鑰用於多個條目時**(例如某模型的 CLI 版與 REST 版共用同一批金鑰),各條目游標**獨立**:兩者各自從游標起點輪替,同一把金鑰可能被連續使用而另一把閒置。要共享輪替進度就給**相同** `id`(代價:日誌無法區分兩者);要能區分就分開命名(代價:額度不均攤)。此取捨由呼叫端依實際需求決定。
297
+
238
298
  **失敗分流規則**:
239
299
  | 失敗 | 判定 | 處置 |
240
300
  | --- | --- | --- |
@@ -290,17 +350,45 @@ await test()
290
350
  ```alias
291
351
  {
292
352
  // ...ok, stdout, stderr, code, error, durationMs, attempts, pid...
293
- providerId: 'deepseek', //實際使用之群組
294
- keyIndex: 1, //實際使用之金鑰索引, 無keys時為null
295
- kind: 'opencode',
296
- model: 'opencode/deepseek-v4-flash-free',
353
+ providerId: 'api:agnes-2.0-flash', //實際使用之群組(即條目id)
354
+ keyIndex: 1, //實際使用之金鑰索引, 無keys時為null
355
+ kind: 'api-openai-compat',
356
+ model: 'agnes-2.0-flash',
297
357
  tried: [ //完整嘗試歷程, 成功時亦回傳
298
- { providerId: 'deepseek', keyIndex: 0, keyId: 'deepseek#0', outcome: 'next-key', error: 'Exit code 1', durationMs: 3049 },
299
- { providerId: 'deepseek', keyIndex: 1, keyId: 'deepseek#1', outcome: 'ok', durationMs: 11742 },
358
+ { providerId: 'api:agnes-2.0-flash', keyIndex: 0, keyId: 'api:agnes-2.0-flash#0', outcome: 'next-key', error: 'HTTP 401', durationMs: 105 },
359
+ { providerId: 'api:agnes-2.0-flash', keyIndex: 1, keyId: 'api:agnes-2.0-flash#1', outcome: 'ok', durationMs: 1161 },
300
360
  ],
301
361
  }
302
362
  ```
303
363
 
364
+ #### dispatchAiWkf (workflow factory):
365
+ 注入一次provider定義表(名稱 → `dispatchAiFallback`條目)與共用預設,之後以名稱宣告工作流;名稱查無定義即回報錯誤(fail fast)。回覆經寬鬆JSON解析(`extractJsonLoose`)+自訂`check`驗證,非法回覆視為該家失敗而自動遞補;預設於prompt前掛「禁止建檔」約束(`promptPrefix: ''`可關閉)。
366
+
367
+ ```alias
368
+ let wkf = wdi.dispatchAiWkf({
369
+ providers: {
370
+ 'zen:deepseek-v4-flash-free': { kind: 'api-openai-compat', baseURL: 'https://opencode.ai/zen/v1', model: 'deepseek-v4-flash-free', keys: [...] },
371
+ 'claude:sonnet': { kind: 'claude', model: 'sonnet' },
372
+ 'codex:gpt-5.6-luna': { kind: 'codex', model: 'gpt-5.6-luna' },
373
+ },
374
+ defaults: { timeoutMs: 300000 },
375
+ })
376
+
377
+ //單一名額: 主模型+自帶遞補鏈
378
+ let r1 = await wkf.callAi('...prompt...', { spec: { use: 'zen:deepseek-v4-flash-free', fallback: ['claude:sonnet'] }, check: (j) => !!j.essence })
379
+
380
+ //Fanout: 並行多開執行 → 單點整合收斂(候選未達minCandidates時以首位候選為成果不硬整合)
381
+ 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 })
382
+
383
+ //RolePipeline: 多角色串行鏈, 各階段可自帶AI/遞補/檢核, prompt收ctx={input,prev,results,index}
384
+ 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)}` }] })
385
+
386
+ //FanoutPipeline: Fanout成果接RolePipeline(品質天花板組合)
387
+ let r4 = await wkf.runFanoutPipeline({ task, agents, integrate, stages, check })
388
+ ```
389
+
390
+ 各工作流皆部分接受:個別名額/階段失敗不炸整輪,已完成成果完整回傳(`candidates`/`results`+`failedStage`),可只重跑失敗段。
391
+
304
392
  #### Known design notes:
305
393
  - `dispatchAi(kind, prompt, opt)`會把整個`opt`原樣轉傳對應轉接器,該轉接器用不到的鍵(例如輪替條目物件內的`kind`)會被忽略,故「供應商條目物件直接當`opt`」是預期用法;`dispatchAiFallback`之providers條目沿用同一約定。
306
394
  - `dispatchAiFallback`為單向單輪:全數群組試畢即回傳最後一筆失敗結果與`tried`歷程,不回頭重試已敗的組。跨次執行僅記憶游標,不設金鑰停用清單(理由見上方失敗分流說明);需跨次跳過特定金鑰時,由呼叫端依`tried`/`onEvent`內之`error`與`stderr`自行決策。
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * w-dispatch-ai v1.0.2
2
+ * w-dispatch-ai v1.0.4
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,i=n||o||Function("return this")(),u=i.Symbol,c=Object.prototype,a=c.hasOwnProperty,l=c.toString,s=u?u.toStringTag:void 0;var f=Object.prototype.toString;var p=u?u.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,s),r=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=l.call(t);return n&&(e?t[s]=r:delete t[s]),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 b=Object.prototype,h=b.hasOwnProperty,g=b.propertyIsEnumerable,m=v(function(){return arguments}())?v:function(t){return y(t)&&h.call(t,"callee")&&!g.call(t,"callee")},j=m,_=Array.isArray;var w="object"==typeof exports&&exports&&!exports.nodeType&&exports,O=w&&"object"==typeof module&&module&&!module.nodeType&&module,x=O&&O.exports===w?i.Buffer:void 0,k=(x?x.isBuffer:void 0)||function(){return!1},A=/^(?:0|[1-9]\d*)$/;function I(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 S(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}var M={};function $(t){return function(e){return t(e)}}M["[object Float32Array]"]=M["[object Float64Array]"]=M["[object Int8Array]"]=M["[object Int16Array]"]=M["[object Int32Array]"]=M["[object Uint8Array]"]=M["[object Uint8ClampedArray]"]=M["[object Uint16Array]"]=M["[object Uint32Array]"]=!0,M["[object Arguments]"]=M["[object Array]"]=M["[object ArrayBuffer]"]=M["[object Boolean]"]=M["[object DataView]"]=M["[object Date]"]=M["[object Error]"]=M["[object Function]"]=M["[object Map]"]=M["[object Number]"]=M["[object Object]"]=M["[object RegExp]"]=M["[object Set]"]=M["[object String]"]=M["[object WeakMap]"]=!1;var T="object"==typeof exports&&exports&&!exports.nodeType&&exports,N=T&&"object"==typeof module&&module&&!module.nodeType&&module,E=N&&N.exports===T&&n.process,P=function(){try{var t=N&&N.require&&N.require("util").types;return t||E&&E.binding&&E.binding("util")}catch(t){}}(),D=P&&P.isTypedArray,F=D?$(D):function(t){return y(t)&&S(t.length)&&!!M[d(t)]},U=Object.prototype.hasOwnProperty;function z(t,e){var r=_(t),n=!r&&j(t),o=!r&&!n&&k(t),i=!r&&!n&&!o&&F(t),u=r||n||o||i,c=u?function(t,e){for(var r=-1,n=Array(t);++r<t;)n[r]=e(r);return n}(t.length,String):[],a=c.length;for(var l in t)!e&&!U.call(t,l)||u&&("length"==l||o&&("offset"==l||"parent"==l)||i&&("buffer"==l||"byteLength"==l||"byteOffset"==l)||I(l,a))||c.push(l);return c}var C=Object.prototype;function B(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||C)}function L(t,e){return function(r){return t(e(r))}}var W=L(Object.keys,Object),V=Object.prototype.hasOwnProperty;function R(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function q(t){if(!R(t))return!1;var e=d(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}function G(t){return null!=t&&S(t.length)&&!q(t)}function H(t){return G(t)?z(t):function(t){if(!B(t))return W(t);var e=[];for(var r in Object(t))V.call(t,r)&&"constructor"!=r&&e.push(r);return e}(t)}function K(t){return"symbol"==typeof t||y(t)&&"[object Symbol]"==d(t)}var J=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Y=/^\w*$/;var Q,X=i["__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,it=nt.toString,ut=ot.hasOwnProperty,ct=RegExp("^"+it.call(ut).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function at(t){return!(!R(t)||(e=t,Z&&Z in e))&&(q(t)?ct:rt).test(et(t));var e}function lt(t,e){var r=function(t,e){return null==t?void 0:t[e]}(t,e);return at(r)?r:void 0}var st=lt(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__=st?st(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(st){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 st?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]=st&&void 0===e?"__lodash_hash_undefined__":e,this};var bt=Array.prototype.splice;function ht(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])}}ht.prototype.clear=function(){this.__data__=[],this.size=0},ht.prototype.delete=function(t){var e=this.__data__,r=vt(e,t);return!(r<0)&&(r==e.length-1?e.pop():bt.call(e,r,1),--this.size,!0)},ht.prototype.get=function(t){var e=this.__data__,r=vt(e,t);return r<0?void 0:e[r][1]},ht.prototype.has=function(t){return vt(this.__data__,t)>-1},ht.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=lt(i,"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||ht),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 _t(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],i=r.cache;if(i.has(o))return i.get(o);var u=t.apply(this,n);return r.cache=i.set(o,u)||i,u};return r.cache=new(_t.Cache||jt),r}_t.Cache=jt;var wt,Ot,xt,kt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,At=/\\(\\)?/g,It=(wt=function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(""),t.replace(kt,function(t,r,n,o){e.push(n?o.replace(At,"$1"):r||t)}),e},Ot=_t(wt,function(t){return 500===xt.size&&xt.clear(),t}),xt=Ot.cache,Ot),St=It;function Mt(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=u?u.prototype:void 0,Tt=$t?$t.toString:void 0;function Nt(t){if("string"==typeof t)return t;if(_(t))return Mt(t,Nt)+"";if(K(t))return Tt?Tt.call(t):"";var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}function Et(t){return null==t?"":Nt(t)}function Pt(t,e){return _(t)?t:function(t,e){if(_(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!K(t))||Y.test(t)||!J.test(t)||null!=e&&t in Object(e)}(t,e)?[t]:St(Et(t))}function Dt(t){if("string"==typeof t||K(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}function Ft(t,e){for(var r=0,n=(e=Pt(e,t)).length;null!=t&&r<n;)t=t[Dt(e[r++])];return r&&r==n?t:void 0}function Ut(t,e,r){var n=null==t?void 0:Ft(t,e);return void 0===n?r:n}function zt(t){var e=this.__data__=new ht(t);this.size=e.size}zt.prototype.clear=function(){this.__data__=new ht,this.size=0},zt.prototype.delete=function(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r},zt.prototype.get=function(t){return this.__data__.get(t)},zt.prototype.has=function(t){return this.__data__.has(t)},zt.prototype.set=function(t,e){var r=this.__data__;if(r instanceof ht){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 Ct=function(){try{var t=lt(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),Bt=Ct;function Lt(t,e,r){"__proto__"==e&&Bt?Bt(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var Wt=Object.prototype.hasOwnProperty;function Vt(t,e,r){var n=t[e];Wt.call(t,e)&&yt(n,r)&&(void 0!==r||e in t)||Lt(t,e,r)}function Rt(t,e,r,n){var o=!r;r||(r={});for(var i=-1,u=e.length;++i<u;){var c=e[i],a=n?n(r[c],t[c],c,r,t):void 0;void 0===a&&(a=t[c]),o?Lt(r,c,a):Vt(r,c,a)}return r}var qt=Object.prototype.hasOwnProperty;function Gt(t){if(!R(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&&qt.call(t,n))&&r.push(n);return r}function Ht(t){return G(t)?z(t,!0):Gt(t)}var Kt="object"==typeof exports&&exports&&!exports.nodeType&&exports,Jt=Kt&&"object"==typeof module&&module&&!module.nodeType&&module,Yt=Jt&&Jt.exports===Kt?i.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,i=[];++r<n;){var u=t[r];e(u,r,t)&&(i[o++]=u)}return i}(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=L(Object.getPrototypeOf,Object),ie=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)ne(e,re(t)),t=oe(t);return e}:Xt,ue=ie;function ce(t,e,r){var n=e(t);return _(t)?n:ne(n,r(t))}function ae(t){return ce(t,H,re)}function le(t){return ce(t,Ht,ue)}var se=lt(i,"DataView"),fe=lt(i,"Promise"),pe=lt(i,"Set"),de=lt(i,"WeakMap"),ye="[object Map]",ve="[object Promise]",be="[object Set]",he="[object WeakMap]",ge="[object DataView]",me=et(se),je=et(gt),_e=et(fe),we=et(pe),Oe=et(de),xe=d;(se&&xe(new se(new ArrayBuffer(1)))!=ge||gt&&xe(new gt)!=ye||fe&&xe(fe.resolve())!=ve||pe&&xe(new pe)!=be||de&&xe(new de)!=he)&&(xe=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 _e:return ve;case we:return be;case Oe:return he}return e});var ke=xe,Ae=Object.prototype.hasOwnProperty;var Ie=i.Uint8Array;function Se(t){var e=new t.constructor(t.byteLength);return new Ie(e).set(new Ie(t)),e}var Me=/\w*$/;var $e=u?u.prototype:void 0,Te=$e?$e.valueOf:void 0;function Ne(t,e,r){var n,o=t.constructor;switch(e){case"[object ArrayBuffer]":return Se(t);case"[object Boolean]":case"[object Date]":return new o(+t);case"[object DataView]":return function(t,e){var r=e?Se(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?Se(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,Me.exec(t));return e.lastIndex=t.lastIndex,e}(t);case"[object Symbol]":return n=t,Te?Object(Te.call(n)):{}}}var Ee=Object.create,Pe=function(){function t(){}return function(e){if(!R(e))return{};if(Ee)return Ee(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}(),De=Pe;var Fe=P&&P.isMap,Ue=Fe?$(Fe):function(t){return y(t)&&"[object Map]"==ke(t)};var ze=P&&P.isSet,Ce=ze?$(ze):function(t){return y(t)&&"[object Set]"==ke(t)},Be="[object Arguments]",Le="[object Function]",We="[object Object]",Ve={};function Re(t,e,r,n,o,i){var u,c=1&e,a=2&e,l=4&e;if(r&&(u=o?r(t,n,o,i):r(t)),void 0!==u)return u;if(!R(t))return t;var s=_(t);if(s){if(u=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),!c)return function(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r<n;)e[r]=t[r];return e}(t,u)}else{var f=ke(t),p=f==Le||"[object GeneratorFunction]"==f;if(k(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,c);if(f==We||f==Be||p&&!o){if(u=a||p?{}:function(t){return"function"!=typeof t.constructor||B(t)?{}:De(oe(t))}(t),!c)return a?function(t,e){return Rt(t,ue(t),e)}(t,function(t,e){return t&&Rt(e,Ht(e),t)}(u,t)):function(t,e){return Rt(t,re(t),e)}(t,function(t,e){return t&&Rt(e,H(e),t)}(u,t))}else{if(!Ve[f])return o?t:{};u=Ne(t,f,c)}}i||(i=new zt);var d=i.get(t);if(d)return d;i.set(t,u),Ce(t)?t.forEach(function(n){u.add(Re(n,e,r,n,t,i))}):Ue(t)&&t.forEach(function(n,o){u.set(o,Re(n,e,r,o,t,i))});var y=s?void 0:(l?a?le:ae:a?Ht:H)(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]),Vt(u,o,Re(n,e,r,o,t,i))}),u}function qe(t,e){return e.length<2?t:Ft(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 i=Array(o);++n<o;)i[n]=t[n+e];return i}(e,0,-1))}Ve[Be]=Ve["[object Array]"]=Ve["[object ArrayBuffer]"]=Ve["[object DataView]"]=Ve["[object Boolean]"]=Ve["[object Date]"]=Ve["[object Float32Array]"]=Ve["[object Float64Array]"]=Ve["[object Int8Array]"]=Ve["[object Int16Array]"]=Ve["[object Int32Array]"]=Ve["[object Map]"]=Ve["[object Number]"]=Ve[We]=Ve["[object RegExp]"]=Ve["[object Set]"]=Ve["[object String]"]=Ve["[object Symbol]"]=Ve["[object Uint8Array]"]=Ve["[object Uint8ClampedArray]"]=Ve["[object Uint16Array]"]=Ve["[object Uint32Array]"]=!0,Ve["[object Error]"]=Ve[Le]=Ve["[object WeakMap]"]=!1;var Ge=Object.prototype.hasOwnProperty;function He(t,e){var r=-1,n=(e=Pt(e,t)).length;if(!n)return!0;for(;++r<n;){var o=Dt(e[r]);if("__proto__"===o&&!Ge.call(t,"__proto__"))return!1;if(("constructor"===o||"prototype"===o)&&r<n-1)return!1}var i=qe(t,e);return null==i||delete i[Dt(function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}(e))]}var Ke=Function.prototype,Je=Object.prototype,Ye=Ke.toString,Qe=Je.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=u?u.isConcatSpreadable:void 0;function er(t){return _(t)||j(t)||!!(tr&&t&&t[tr])}function rr(t,e,r,n,o){var i=-1,u=t.length;for(r||(r=er),o||(o=[]);++i<u;){var c=t[i];e>0&&r(c)?e>1?rr(c,e-1,r,n,o):ne(o,c):n||(o[o.length]=c)}return o}function nr(t){return(null==t?0:t.length)?rr(t,1):[]}var or=Math.max;var ir=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},ur=ir,cr=Date.now;var ar=function(t){var e=0,r=0;return function(){var n=cr(),o=16-(n-r);if(r=n,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(ur),lr=ar;var sr=function(t){return lr(function(t,e,r){return e=or(void 0===e?t.length-1:e,0),function(){for(var n=arguments,o=-1,i=or(n.length-e,0),u=Array(i);++o<i;)u[o]=n[e+o];o=-1;for(var c=Array(e+1);++o<e;)c[o]=n[o];return c[e]=r(u),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,c)}}(t,void 0,nr),t+"")}(function(t,e){var r={};if(null==t)return r;var n=!1;e=Mt(e,function(e){return e=Pt(e,t),n||(n=e.length>1),e}),Rt(t,le(t),r),n&&(r=Re(r,7,Ze));for(var o=e.length;o--;)He(r,e[o]);return r}),fr=sr;function pr(t){return"[object Object]"===Object.prototype.toString.call(t)}function dr(t){return!(!function(t){return"[object String]"===Object.prototype.toString.call(t)}(t)||""===t)}function yr(){let t,e,r=new Promise(function(){t=arguments[0],e=arguments[1]});return r.resolve=t,r.reject=e,r}function vr(t){let e=!1;if(dr(t))e=!isNaN(Number(t));else if(function(t){return"[object Number]"===Object.prototype.toString.call(t)}(t)){if(function(t){return t!=t}(t))return!1;e=!0}return e}function br(t=10){vr(t)||(t=10);let e=yr();return setTimeout(function(){e.resolve()},t),e}var hr=/\s/;var gr=/^\s+/;function mr(t){return t?t.slice(0,function(t){for(var e=t.length;e--&&hr.test(t.charAt(e)););return e}(t)+1).replace(gr,""):t}var jr=/^[-+]0x[0-9a-f]+$/i,_r=/^0b[01]+$/i,wr=/^0o[0-7]+$/i,Or=parseInt;function xr(t){if("number"==typeof t)return t;if(K(t))return NaN;if(R(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=R(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=mr(t);var r=_r.test(t);return r||wr.test(t)?Or(t.slice(2),r?2:8):jr.test(t)?NaN:+t}var kr=1/0;function Ar(t){return t?(t=xr(t))===kr||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function Ir(t){var e=Ar(t),r=e%1;return e==e?r?e-r:e:0}var Sr=i.isFinite,Mr=Math.min;var $r=function(t){var e=Math[t];return function(t,r){if(t=xr(t),(r=null==r?0:Mr(Ir(r),292))&&Sr(t)){var n=(Et(t)+"e").split("e");return+((n=(Et(e(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return e(t)}}("round"),Tr=$r;function Nr(t){if(!vr(t))return 0;return Ar(t)}function Er(t){if(!vr(t))return 0;t=Nr(t);let e=Tr(t);return"0"===String(e)?0:e}function Pr(t){return"[object Array]"===Object.prototype.toString.call(t)}function Dr(t){let e=Object.prototype.toString.call(t);return"[object Function]"===e||"[object AsyncFunction]"===e}function Fr(t){return!!vr(t)&&(t=Nr(t),"number"==typeof(e=t)&&e==Ir(e));var e}function Ur(t){if(!Fr(t))return!1;return Er(t)>0}function zr(t){if(!Fr(t))return!1;return Er(t)>=0}function Cr(t,e){return dr(t)&&zr(e)?0===(e=Er(e))?"":t.substring(0,e):""}function Br(t,e){return dr(t)&&zr(e)?0===(e=Er(e))?t:function(t,e){if(!dr(t))return"";if(!zr(e))return"";if(0===(e=Er(e)))return"";let r=t.length-e;return r<0&&(r=0),t.substring(r,r+e)}(t,t.length-e):""}function Lr(t,e,r={}){if(!dr(t))return"";if(!zr(e))return t;if(e=Er(e),t.length<=e)return t;let n=Ut(r,"funWithMsg"),o="";if(Dr(n)){let r=n(t,e);dr(r)&&(o=r)}return Cr(t,e)+`...${o}`}function Wr(t,e={}){let r=Ut(e,"fs");return!!function(t,e={}){let r=Ut(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=Ut(e,"fs"),o="";try{o=n.readFileSync(t,"utf8")}catch(t){r=t}return null!==r?{error:r}:{success:o}}(t,{fs:r})}function Rr(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var qr=t,Gr=qr.spawn,Hr=qr.exec;function Kr(t,e,r){var n={};try{Object.keys(t).forEach(function(r){t[r].forEach(function(t){n[t]||(Jr(t,e),n[t]=1)}),n[r]||(Jr(r,e),n[r]=1)})}catch(t){if(r)return r(t);throw t}if(r)return r()}function Jr(t,e){try{process.kill(parseInt(t,10),e)}catch(t){if("ESRCH"!==t.code)throw t}}function Yr(t,e,r,n,o){var i=n(t),u="";i.stdout.on("data",function(t){t=t.toString("ascii");u+=t});i.on("close",function(i){delete r[t],0==i?u.match(/\d+/g).forEach(function(i){i=parseInt(i,10),e[t].push(i),e[i]=[],r[i]=1,Yr(i,e,r,n,o)}):0==Object.keys(r).length&&o()})}var Qr=Rr(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":Hr("taskkill /pid "+t+" /T /F",r);break;case"darwin":Yr(t,n,o,function(t){return Gr("pgrep",["-P",t])},function(){Kr(n,e,r)});break;default:Yr(t,n,o,function(t){return Gr("ps",["-o","pid","--no-headers","--ppid",t])},function(){Kr(n,e,r)})}});function Xr(t){let n=Ut(Vr(t),"success","");if(!dr(n))return null;let o=n.match(/%dp0%\\(node_modules\\[^"]+)"/i);if(!o)return null;let i=e.dirname(t),u=e.join(i,o[1]);return Wr(u,{fs:r})?u:null}function Zr(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=Xr(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=`${i=o,i.replace(/[()%!^"<>&|;, ]/g,"^$&")} ${e.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 tn={funWithMsg:t=>`(truncated, total ${t.length} chars)`};function en(e,r=[],n={}){let{timeoutMs:o=12e4,cwd:i=process.cwd(),input:u,validate:c,maxBuffer:a=10485760,onStdout:l,onStderr:s,env:f}=n,p=function(t){if(Dr(t))return t;if(!dr(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(!dr(t)||""===t.trim())return!1}else if("json"===r)try{JSON.parse(t)}catch{return!1}else if("min:"===Cr(r,4)){let e=Br(r,4);if(!vr(e))return!1;let n=Er(e);if(!dr(t)||t.length<n)return!1}return!0}}(c),d=Date.now(),y=yr(),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 b=Zr(e,r),h=t.spawn(b.file,b.args,{cwd:i,stdio:["pipe","pipe","pipe"],windowsHide:!0,env:v,...b.opt}),g="",m="",j=new TextDecoder("utf-8"),_=new TextDecoder("utf-8"),w=!1,O=!1;h.stdout.on("data",t=>{let e=j.decode(t,{stream:!0});e&&(Dr(l)&&l(e),g.length<a&&(g+=e))}),h.stderr.on("data",t=>{let e=_.decode(t,{stream:!0});e&&(Dr(s)&&s(e),m.length<a&&(m+=e))}),h.stdin.on("error",()=>{}),void 0!==u&&h.stdin.write(u,"utf8"),h.stdin.end();let x=setTimeout(()=>{w||(O=!0,function(t){let e=yr();return Qr(Number(t),"SIGKILL",r=>{r?e.reject(r):e.resolve(`pid[${t}] killed`)}),e}(h.pid).catch(()=>{}),setTimeout(()=>{w||(w=!0,y.resolve({ok:!1,stdout:Lr(g,500,tn),stderr:Lr(m,500,tn),code:null,error:`TIMEOUT after ${o/1e3}s(子進程未能結束)`,durationMs:Date.now()-d,pid:h.pid}))},3e3).unref())},o);return h.on("error",t=>{w||(w=!0,clearTimeout(x),y.resolve({ok:!1,stdout:"",stderr:"",code:null,error:`${t.code||"UNKNOWN"}: ${t.message}`,durationMs:Date.now()-d,pid:h.pid}))}),h.on("close",(t,e)=>{if(w)return;w=!0,clearTimeout(x);let r=j.decode();r&&g.length<a&&(g+=r);let n=_.decode();n&&m.length<a&&(m+=n);let i=Date.now()-d;O?y.resolve({ok:!1,stdout:Lr(g,500,tn),stderr:Lr(m,500,tn),code:t,error:`TIMEOUT after ${o/1e3}s`,durationMs:i,pid:h.pid}):0===t?!p||p(g)?y.resolve({ok:!0,stdout:g,stderr:m,code:0,error:"",durationMs:i,pid:h.pid}):y.resolve({ok:!1,stdout:Lr(g,500,tn),stderr:Lr(m,500,tn),code:0,error:"OUTPUT_VALIDATION_FAILED",durationMs:i,pid:h.pid}):y.resolve({ok:!1,stdout:Lr(g,500,tn),stderr:Lr(m,1e3,tn),code:t,error:e?`Signal: ${e}`:`Exit code ${t}`,durationMs:i,pid:h.pid})}),y}async function rn(t,e=[],r={}){if(!dr(t))return{ok:!1,stdout:"",stderr:"",code:null,error:"command 須為非空字串",durationMs:0,attempts:0};Pr(e)||(e=[]),pr(r)||(r={});let{maxRetries:n=0,retryDelayMs:o=5e3,...i}=r,u=Ut(i,"cwd",null);dr(u)?i.cwd=u:i.cwd=process.cwd();let c=Ut(i,"input",null);dr(c)?i.input=c:i.input=void 0;let a=Ut(i,"env",null);pr(a)?i.env=a:i.env=void 0;let l=Ut(i,"validate",null);Dr(l)||dr(l)?i.validate=l:i.validate=void 0;let s=Ut(i,"onStdout",null);Dr(s)?i.onStdout=s:i.onStdout=void 0;let f=Ut(i,"onStderr",null);Dr(f)?i.onStderr=f:i.onStderr=void 0,n=zr(n)?Er(n):0,o=Ur(o)?Er(o):5e3;let p=Ut(i,"timeoutMs",null);Ur(p)?i.timeoutMs=Er(p):i.timeoutMs=12e4;let d,y=Ut(i,"maxBuffer",null);Ur(y)?i.maxBuffer=Er(y):i.maxBuffer=10485760;let v=0;for(let r=0;r<=n;r++){if(r>0){let t=Math.min(o*r,15e3);await br(t)}if(d=await en(t,e,i),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 nn(...t){let e=[];for(let r of t)if(Pr(r))for(let t of r)dr(t)&&e.push(t);else dr(r)&&e.push(r);return e}function on(t){return dr(t)||(t="unknown error"),{ok:!1,stdout:"",stderr:"",code:null,error:t,durationMs:0,attempts:0}}let un=["exe","model","key","provider","agent","config","extraArgs","input","env"];async function cn(t,e={}){if(!dr(t))return on("prompt must be a non-empty string");let r=Ut(e,"exe",null);dr(r)||(r="opencode");let n=Ut(e,"model",null),o=Ut(e,"agent",null);dr(o)||(o="build");let i=Ut(e,"extraArgs",null),u=nn("run",["--agent",o],dr(n)?["-m",n]:[],i),c=Ut(e,"env",null);pr(c)||(c=void 0);let a=Ut(e,"config",null);pr(a)&&(a=JSON.stringify(a)),dr(a)&&(c={...c,OPENCODE_CONFIG_CONTENT:a});let l=Ut(e,"key",null),s=Ut(e,"provider",null);return dr(l)&&dr(s)&&(c={...c,OPENCODE_AUTH_CONTENT:JSON.stringify({[s]:{type:"api",key:l}})}),rn(r,u,{...fr(e,un),input:t,env:c})}function an(t){return!0===(e=t)||!1===e||y(e)&&"[object Boolean]"==d(e);var e}let ln=["exe","model","skipPermissions","extraArgs","input"];async function sn(t,e={}){if(!dr(t))return on("prompt must be a non-empty string");let r=Ut(e,"exe",null);dr(r)||(r="claude");let n=Ut(e,"model",null),o=Ut(e,"skipPermissions",null);an(o)||(o=!0);let i=Ut(e,"extraArgs",null);return rn(r,nn("-p",o?"--dangerously-skip-permissions":[],dr(n)?["--model",n]:[],i),{...fr(e,ln),input:t})}let fn=["exe","model","sandbox","extraArgs","input"];async function pn(t,e={}){if(!dr(t))return on("prompt must be a non-empty string");let r=Ut(e,"exe",null);dr(r)||(r="codex");let n=Ut(e,"model",null),o=Ut(e,"sandbox",null);dr(o)||(o="workspace-write");let i=Ut(e,"extraArgs",null);return rn(r,nn("exec",["--sandbox",o],"--skip-git-repo-check",dr(n)?["-m",n]:[],i),{...fr(e,fn),input:t})}let dn=["exe","model","effort","skipPermissions","printTimeout","addDirs","extraArgs","input"];async function yn(t,e={}){if(!dr(t))return on("prompt must be a non-empty string");if(t.length>3e4)return on(`prompt too long (${t.length} chars > 30000), agy passes prompt via --print flag and Windows command line is capped at 32767 chars`);let r=Ut(e,"exe",null);dr(r)||(r="agy");let n=Ut(e,"model",null),o=Ut(e,"effort",null),i=Ut(e,"skipPermissions",null);an(i)||(i=!0);let u=Ut(e,"timeoutMs",null);u=Ur(u)?Er(u):3e5;let c=Ut(e,"printTimeout",null);dr(c)||(c=`${Math.max(30,Math.floor(u/1e3)-30)}s`);let a=Ut(e,"addDirs",null),l=[];if(Pr(a))for(let t of a)dr(t)&&l.push("--add-dir",t);let s=Ut(e,"extraArgs",null),f=nn(i?"--dangerously-skip-permissions":[],["--print-timeout",c],dr(n)?["--model",n]:[],dr(o)?["--effort",o]:[],l,s,["--print",t]),p=fr(e,dn);try{return await rn(r,f,{...p,timeoutMs:u})}catch(t){return on(`${t.code||"UNKNOWN"}: ${t.message}`)}}let vn={opencode:cn,claude:sn,codex:pn,antigravity:yn};function bn(t){return t!=t}function hn(t){return null==t?[]:function(t,e){return Mt(e,function(e){return t[e]})}(t,H(t))}var gn=Math.max;function mn(t,e,r,n){t=G(t)?t:hn(t),r=r&&!n?Ir(r):0;var o=t.length;return r<0&&(r=gn(o+r,0)),function(t){return"string"==typeof t||!_(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,i=r+(n?1:-1);n?i--:++i<o;)if(e(t[i],i,t))return i;return-1}(t,bn,r)}(t,e,r)>-1}async function jn(t,e,r={}){let n=H(vn);return dr(t)&&mn(n,t)?(0,vn[t])(e,r):on(`unknown ai kind: "${t}" (available: ${n.join(", ")})`)}let _n=["providers","budgetMs","minAttemptMs","store","onEvent"],wn=["id","keys"],On={cursors:{}};function xn(t){let e=Ut(t,"error","");dr(e)||(e="");let r=Ut(t,"code",null);return 0===e.indexOf("TIMEOUT")||(!!e.includes("ENOENT")||(2===r||("OUTPUT_VALIDATION_FAILED"===e||0===e.indexOf("unknown ai kind"))))}return{KINDS:H(vn),dispatchAi:jn,dispatchAiFallback:async function(t,e={}){if(!dr(t))return{...on("prompt must be a non-empty string"),tried:[]};let r=Ut(e,"providers",null),n=Pr(r)?r.filter(pr):[];if(0===n.length)return{...on("providers must be a non-empty array"),tried:[]};let o=Ut(e,"budgetMs",null);o=Ur(o)?Er(o):null;let i=null===o?null:Date.now()+o,u=Ut(e,"minAttemptMs",null);u=Ur(u)?Er(u):2e4;let c=Ut(e,"store",null),a=pr(c)&&Dr(c.get)&&Dr(c.set),l=null;if(a)try{l=c.get()}catch{}pr(l)||(l=a?{cursors:{}}:On),pr(l.cursors)||(l.cursors={});let s=()=>{if(a)try{c.set(l)}catch{}},f=Ut(e,"onEvent",null),p=t=>{if(Dr(f))try{f(t)}catch{}},d=fr(e,_n),y=[],v=null,b=null;for(let e=0;e<n.length;e++){let r=n[e],o=Ut(r,"id",null);dr(o)||(o=String(e));let c=Ut(r,"kind",null),a=Ut(r,"model",null),f=Ut(r,"keys",null),h=Pr(f)?f.filter(dr):[],g=h.length,m=fr(r,wn),j=0;if(g>0){let t=Ut(l.cursors,o,0);j=Ur(t)?Er(t)%g:0}let _=g>0?g:1,w=!1;for(let e=0;e<_&&!w;e++){let r=g>0?(j+e)%g:null,n=null===r?o:`${o}#${r}`,f={...d,...m};g>0&&(f.key=h[r]);let _=Ut(f,"timeoutMs",null);if(_=Ur(_)?Er(_):12e4,null!==i){let t=i-Date.now();if(t<u)return p({type:"budget-out",providerId:o,keyIndex:r,keyId:n,remainingMs:t}),y.push({providerId:o,keyIndex:r,keyId:n,outcome:"budget-out"}),{...on("budget exhausted"),tried:y};_=Math.min(_,t)}f.timeoutMs=_,p({type:"try",providerId:o,keyIndex:r,keyId:n,kind:c,model:a});let O=await jn(c,t,f);if(O.ok)return g>0&&(l.cursors[o]=(r+1)%g,s()),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:c,model:a,tried:y};v=O,b={providerId:o,keyIndex:r,kind:c,model:a},xn(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||on("all providers failed"),...b||{},tried:y}},dispatchOpencode:cn,dispatchClaude:sn,dispatchCodex:pn,dispatchAntigravity:yn}});
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 d=i?i.toStringTag:void 0;function p(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":d&&d 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 h(t){return y(t)&&"[object Arguments]"==p(t)}var v=Object.prototype,b=v.hasOwnProperty,g=v.propertyIsEnumerable,m=h(function(){return arguments}())?h: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[p(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 L(t,e){return function(r){return t(e(r))}}var R=L(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=p(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 R(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]"==p(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 dt=Object.prototype.hasOwnProperty;function pt(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 ht(t,e){for(var r=t.length;r--;)if(yt(t[r][0],e))return r;return-1}pt.prototype.clear=function(){this.__data__=ct?ct(null):{},this.size=0},pt.prototype.delete=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e},pt.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},pt.prototype.has=function(t){var e=this.__data__;return ct?void 0!==e[t]:dt.call(e,t)},pt.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 vt=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=ht(e,t);return!(r<0)&&(r==e.length-1?e.pop():vt.call(e,r,1),--this.size,!0)},bt.prototype.get=function(t){var e=this.__data__,r=ht(e,t);return r<0?void 0:e[r][1]},bt.prototype.has=function(t){return ht(this.__data__,t)>-1},bt.prototype.set=function(t,e){var r=this.__data__,n=ht(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 pt,map:new(gt||bt),string:new pt}},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 Lt(t,e,r){"__proto__"==e&&Bt?Bt(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var Rt=Object.prototype.hasOwnProperty;function Jt(t,e,r){var n=t[e];Rt.call(t,e)&&yt(n,r)&&(void 0!==r||e in t)||Lt(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?Lt(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=L(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"),de=st(u,"Set"),pe=st(u,"WeakMap"),ye="[object Map]",he="[object Promise]",ve="[object Set]",be="[object WeakMap]",ge="[object DataView]",me=et(ce),je=et(gt),ke=et(fe),we=et(de),Oe=et(pe),_e=p;(ce&&_e(new ce(new ArrayBuffer(1)))!=ge||gt&&_e(new gt)!=ye||fe&&_e(fe.resolve())!=he||de&&_e(new de)!=ve||pe&&_e(new pe)!=be)&&(_e=function(t){var e=p(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 he;case we:return ve;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]",Le="[object Function]",Re="[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),d=f==Le||"[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==Re||f==Be||d&&!o){if(i=a||d?{}: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 p=u.get(t);if(p)return p;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[Re]=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[Le]=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]"!=p(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 dr(t){return"[object Object]"===Object.prototype.toString.call(t)}function pr(t){return"[object String]"===Object.prototype.toString.call(t)}function yr(t){return!(!pr(t)||""===t)}function hr(){let t,e,r=new Promise(function(){t=arguments[0],e=arguments[1]});return r.resolve=t,r.reject=e,r}function vr(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(vr(t))return!1;e=!0}return e}function gr(t=10){br(t)||(t=10);let e=hr();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 Lr(t,e){return yr(t)&&Br(e)?0===(e=Pr(e))?"":t.substring(0,e):""}function Rr(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 Lr(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,d=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:"===Lr(r,4)){let e=Rr(r,4);if(!br(e))return!1;let n=Pr(e);if(!yr(t)||t.length<n)return!1}return!0}}(l),p=Date.now(),y=hr(),h={...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(h))t.includes(e.toLowerCase())&&delete h[e]}h={...h,...f}}let v=en(e,r),b=t.spawn(v.file,v.args,{cwd:u,stdio:["pipe","pipe","pipe"],windowsHide:!0,env:h,...v.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=hr();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()-p,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()-p,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()-p;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?!d||d(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=[]),dr(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);dr(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 d=Ct(u,"timeoutMs",null);zr(d)?u.timeoutMs=Pr(d):u.timeoutMs=12e4;let p,y=Ct(u,"maxBuffer",null);zr(y)?u.maxBuffer=Pr(y):u.maxBuffer=10485760;let h=0;for(let r=0;r<=n;r++){if(r>0){let t=Math.min(o*r,15e3);await gr(t)}if(p=await nn(t,e,u),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(...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);dr(l)||(l=void 0);let a=Ct(e,"config",null);dr(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]"==p(e);var e}let fn=["exe","model","skipPermissions","extraArgs","input"];async function dn(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 pn=["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,pn),input:t})}let hn=["exe","model","effort","skipPermissions","printTimeout","addDirs","extraArgs","input"];async function vn(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]),d=fr(e,hn);try{return await on(r,f,{...d,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,d="",p=null;try{let t=JSON.parse(s);f=Ct(t,"choices.0.message.content",null),d=Ct(t,"choices.0.finish_reason",""),p=Ct(t,"choices.0.message.tool_calls",null)}catch{}return"tool_calls"===d||null!=p?{ok:!1,stdout:"",stderr:Jr(s,1e3,bn),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: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);dr(i)||(i={});let l=Ct(e,"headers",null);dr(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:"===Lr(r,4)){let e=Rr(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)),d=r.replace(/\/+$/,"")+"/chat/completions",p=[];yr(u)&&p.push({role:"system",content:u}),p.push({role:"user",content:t});let y={model:n,messages:p,...i},h={"Content-Type":"application/json",...l};yr(o)&&(h.Authorization=`Bearer ${o}`);let v=null,b=0;for(let t=0;t<=s;t++){if(t>0&&await gr(Math.min(c*t,15e3)),v=await gn(d,h,y,a,f),b=t+1,v.ok)return v.attempts=b,v;let e=v.code;if(br(e)&&e>=400&&e<500&&429!==e)break}return v.attempts=b,v}let jn={opencode:sn,claude:dn,codex:yn,antigravity:vn,"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]"==p(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(dr):[];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=dr(l)&&Cr(l.get)&&Cr(l.set),s=null;if(a)try{s=l.get()}catch{}dr(s)||(s=a?{cursors:{}}:Mn),dr(s.cursors)||(s.cursors={});let c=()=>{if(a)try{l.set(s)}catch{}},f=Ct(e,"onEvent",null),d=t=>{if(Cr(f))try{f(t)}catch{}},p=fr(e,An),y=[],h=null,v=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={...p,...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 d({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,d({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()),d({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};h=O,v={providerId:o,keyIndex:r,kind:l,model:a},In(O)?(d({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):(d({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{...h||ln("all providers failed"),...v||{},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(dr(t)){for(let e in t)return!1;return!0}return!1}(t)||(!!function(t){return!(!pr(t)||""!==t)}(t)||(!!function(t){return!!Ur(t)&&0===t.length}(t)||!!vr(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(!dr(n)||!dr(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);dr(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}),d=null;f.ok&&(d=l?String(f.stdout||"").trim():a(f.stdout));let p=Ct(f,"providerId",null),y=Ct(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: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:d,prompt:p,...y}=u,h=Cr(p)?p(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),v=await Pn(h,{...l,...y,providers:r,spec:{use:f,fallback:d},check:i});return{ok:v.ok,result:v.ok?v.json:null,integrated:v.ok,agents:s,candidates:c,integrateDetail:v,totalMs:Date.now()-e,error:v.ok?"":`integrate failed: ${v.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 d=Ct(c,"prompt",null);if(!Cr(d))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 p=d({input:n,prev:s,results:i,index:t});if(!yr(p))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),h=await Pn(p,{...u,...y,providers:r,spec:{use:Ct(c,"use",""),fallback:Ct(c,"fallback",null)},check:Ct(c,"check",null)});if(l[f]=h,!h.ok)return{ok:!1,result:null,stages:l,results:i,order:a,failedStage:f,totalMs:Date.now()-e,error:`stage[${f}] failed: ${h.error}`};i[f]=h.json,s=h.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(!dr(e))throw new Error("dispatchAiWkf: opt.providers must be an object (name → provider entry)");let r=Ct(t,"defaults",null);return dr(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:dn,dispatchCodex:yn,dispatchAntigravity:vn,dispatchApiOpenaiCompat:mn}});
7
7
  //# sourceMappingURL=w-dispatch-ai.umd.js.map