@tokenbuddy/tokenbuddy 1.0.12 → 1.0.13
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/dist/src/buyer-store.d.ts +61 -0
- package/dist/src/buyer-store.d.ts.map +1 -1
- package/dist/src/buyer-store.js +12 -0
- package/dist/src/buyer-store.js.map +1 -1
- package/dist/src/cli.d.ts +47 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +287 -63
- package/dist/src/cli.js.map +1 -1
- package/dist/src/credit-tracker.d.ts +26 -0
- package/dist/src/credit-tracker.d.ts.map +1 -1
- package/dist/src/credit-tracker.js +8 -0
- package/dist/src/credit-tracker.js.map +1 -1
- package/dist/src/daemon.d.ts +29 -3
- package/dist/src/daemon.d.ts.map +1 -1
- package/dist/src/daemon.js +292 -65
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/doctor-clawtip-wallet.d.ts +25 -0
- package/dist/src/doctor-clawtip-wallet.d.ts.map +1 -1
- package/dist/src/doctor-clawtip-wallet.js +13 -0
- package/dist/src/doctor-clawtip-wallet.js.map +1 -1
- package/dist/src/doctor-diagnostics.d.ts +63 -0
- package/dist/src/doctor-diagnostics.d.ts.map +1 -1
- package/dist/src/doctor-diagnostics.js +39 -1
- package/dist/src/doctor-diagnostics.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/init-clawtip-activation.d.ts +103 -0
- package/dist/src/init-clawtip-activation.d.ts.map +1 -1
- package/dist/src/init-clawtip-activation.js +60 -0
- package/dist/src/init-clawtip-activation.js.map +1 -1
- package/dist/src/init-payment-options.d.ts +124 -0
- package/dist/src/init-payment-options.d.ts.map +1 -1
- package/dist/src/init-payment-options.js +68 -0
- package/dist/src/init-payment-options.js.map +1 -1
- package/dist/src/model-index.d.ts +9 -0
- package/dist/src/model-index.d.ts.map +1 -1
- package/dist/src/model-index.js.map +1 -1
- package/dist/src/prewarm-cache.d.ts +89 -0
- package/dist/src/prewarm-cache.d.ts.map +1 -1
- package/dist/src/prewarm-cache.js +14 -1
- package/dist/src/prewarm-cache.js.map +1 -1
- package/dist/src/prewarm-scheduler.d.ts +62 -3
- package/dist/src/prewarm-scheduler.d.ts.map +1 -1
- package/dist/src/prewarm-scheduler.js +39 -8
- package/dist/src/prewarm-scheduler.js.map +1 -1
- package/dist/src/provider-install.d.ts +89 -3
- package/dist/src/provider-install.d.ts.map +1 -1
- package/dist/src/provider-install.js +77 -19
- package/dist/src/provider-install.js.map +1 -1
- package/dist/src/route-failover.d.ts +48 -0
- package/dist/src/route-failover.d.ts.map +1 -1
- package/dist/src/route-failover.js.map +1 -1
- package/dist/src/seller-catalog.d.ts +158 -10
- package/dist/src/seller-catalog.d.ts.map +1 -1
- package/dist/src/seller-catalog.js +79 -5
- package/dist/src/seller-catalog.js.map +1 -1
- package/dist/src/seller-metadata-cache.d.ts +29 -0
- package/dist/src/seller-metadata-cache.d.ts.map +1 -0
- package/dist/src/seller-metadata-cache.js +71 -0
- package/dist/src/seller-metadata-cache.js.map +1 -0
- package/dist/src/seller-pool.d.ts +71 -0
- package/dist/src/seller-pool.d.ts.map +1 -1
- package/dist/src/seller-pool.js +6 -1
- package/dist/src/seller-pool.js.map +1 -1
- package/dist/src/seller-route-planner.d.ts +118 -0
- package/dist/src/seller-route-planner.d.ts.map +1 -0
- package/dist/src/seller-route-planner.js +160 -0
- package/dist/src/seller-route-planner.js.map +1 -0
- package/dist/src/seller-routing-config.d.ts +69 -0
- package/dist/src/seller-routing-config.d.ts.map +1 -0
- package/dist/src/seller-routing-config.js +164 -0
- package/dist/src/seller-routing-config.js.map +1 -0
- package/dist/src/seller-routing-strategy.d.ts +118 -0
- package/dist/src/seller-routing-strategy.d.ts.map +1 -0
- package/dist/src/seller-routing-strategy.js +183 -0
- package/dist/src/seller-routing-strategy.js.map +1 -0
- package/dist/src/stream-failover.d.ts +23 -0
- package/dist/src/stream-failover.d.ts.map +1 -1
- package/dist/src/stream-failover.js +4 -0
- package/dist/src/stream-failover.js.map +1 -1
- package/dist/src/tb-proxyd.js +7 -21
- package/dist/src/tb-proxyd.js.map +1 -1
- package/dist/src/terminal-detect.d.ts +51 -0
- package/dist/src/terminal-detect.d.ts.map +1 -1
- package/dist/src/terminal-detect.js +42 -0
- package/dist/src/terminal-detect.js.map +1 -1
- package/dist/src/terminal-image.d.ts +41 -0
- package/dist/src/terminal-image.d.ts.map +1 -1
- package/dist/src/terminal-image.js +15 -0
- package/dist/src/terminal-image.js.map +1 -1
- package/package.json +1 -1
- package/src/buyer-store.ts +61 -0
- package/src/cli.ts +330 -68
- package/src/credit-tracker.ts +26 -0
- package/src/daemon.ts +363 -72
- package/src/doctor-clawtip-wallet.ts +25 -0
- package/src/doctor-diagnostics.ts +63 -1
- package/src/index.ts +4 -0
- package/src/init-clawtip-activation.ts +103 -0
- package/src/init-payment-options.ts +124 -0
- package/src/model-index.ts +9 -0
- package/src/prewarm-cache.ts +99 -1
- package/src/prewarm-scheduler.ts +97 -12
- package/src/provider-install.ts +125 -27
- package/src/route-failover.ts +48 -0
- package/src/seller-catalog.ts +158 -12
- package/src/seller-metadata-cache.ts +91 -0
- package/src/seller-pool.ts +77 -1
- package/src/seller-route-planner.ts +323 -0
- package/src/seller-routing-config.ts +198 -0
- package/src/seller-routing-strategy.ts +316 -0
- package/src/stream-failover.ts +23 -0
- package/src/tb-proxyd.ts +7 -23
- package/src/terminal-detect.ts +51 -0
- package/src/terminal-image.ts +41 -0
- package/tests/cli-routing.test.ts +287 -0
- package/tests/daemon-classify.test.ts +431 -0
- package/tests/daemon-roles.test.ts +92 -0
- package/tests/seller-catalog-utilities.test.ts +70 -0
- package/tests/seller-metadata-cache.test.ts +89 -0
- package/tests/seller-route-planner.test.ts +150 -0
- package/tests/seller-routing-config.test.ts +111 -0
- package/tests/seller-routing-strategy.test.ts +166 -0
- package/tests/tokenbuddy.test.ts +446 -34
- /package/{src → tests}/credit-tracker.test.ts +0 -0
- /package/{src → tests}/model-index.test.ts +0 -0
- /package/{src → tests}/prewarm-cache.test.ts +0 -0
- /package/{src → tests}/prewarm-scheduler.test.ts +0 -0
- /package/{src → tests}/route-failover.test.ts +0 -0
- /package/{src → tests}/seller-catalog-413.test.ts +0 -0
- /package/{src → tests}/seller-pool.test.ts +0 -0
- /package/{src → tests}/stream-failover.test.ts +0 -0
- /package/{src → tests}/thousand-seller.test.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-payment-options.d.ts","sourceRoot":"","sources":["../../src/init-payment-options.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,yBAAyB,GACzB,yBAAyB,GACzB,SAAS,CAAC;AAEd,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,YAAY,EAAE,yBAAyB,CAAC;IACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB,EAAE,kBAInC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAMnD,CAAC;AAEF,eAAO,MAAM,gCAAgC;;;GAaK,CAAC;AAEnD,wBAAgB,0BAA0B,CACxC,IAAI,GAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAa,GACxD,IAAI,CAKN;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,0BAA0B,CAqB1G;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKhG;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,GAAG,SAAS,CAOjG;AAMD,wBAAgB,2BAA2B,CAAC,IAAI,GAAE,MAAyB,GAAG,yBAAyB,CAyBtG;AAMD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAenH;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,YAAY,EAAE,yBAAyB,GACtC,sBAAsB,GAAG,SAAS,CAKpC;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,YAAY,GAAE,yBAAyD,GACtE,sBAAsB,CAoCxB;AAED,wBAAgB,uBAAuB,CAAC,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,CAU3E"}
|
|
1
|
+
{"version":3,"file":"init-payment-options.d.ts","sourceRoot":"","sources":["../../src/init-payment-options.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,8CAA8C;AAC9C,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,KAAK,EAAE,iBAAiB,CAAC;IACzB,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,iDAAiD;IACjD,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,iDAAiD;IACjD,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,yBAAyB,GACzB,yBAAyB,GACzB,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW;IACX,MAAM,EAAE,mBAAmB,CAAC;IAC5B,qCAAqC;IACrC,YAAY,EAAE,yBAAyB,CAAC;IACxC,wCAAwC;IACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,qCAAqC;IACrC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0BAA0B;AAC1B,eAAO,MAAM,qBAAqB,EAAE,kBAInC,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAMnD,CAAC;AAEF,oCAAoC;AACpC,eAAO,MAAM,gCAAgC;;;GAaK,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,GAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAa,GACxD,IAAI,CAKN;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,0BAA0B,CAqB1G;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKhG;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,GAAG,SAAS,CAOjG;AAMD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,GAAE,MAAyB,GAAG,yBAAyB,CAyBtG;AAMD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAenH;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,YAAY,EAAE,yBAAyB,GACtC,sBAAsB,GAAG,SAAS,CAKpC;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,aAAa,GAAG,SAAS,EAClC,YAAY,GAAE,yBAAyD,GACtE,sBAAsB,CAoCxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,CAU3E"}
|
|
@@ -2,11 +2,13 @@ import * as p from "@clack/prompts";
|
|
|
2
2
|
import * as fs from "fs";
|
|
3
3
|
import * as os from "os";
|
|
4
4
|
import * as path from "path";
|
|
5
|
+
/** init 流程里"我自己接"的兜底选项 */
|
|
5
6
|
export const OTHER_TERMINAL_OPTION = {
|
|
6
7
|
value: "other",
|
|
7
8
|
label: "Other",
|
|
8
9
|
hint: "I will configure my own terminal using the TokenBuddy proxy endpoints."
|
|
9
10
|
};
|
|
11
|
+
/** init 流程已支持的可选支付方式(喂给 `@clack/prompts` 的 select 组件) */
|
|
10
12
|
export const INIT_PAYMENT_OPTIONS = [
|
|
11
13
|
{
|
|
12
14
|
value: "clawtip",
|
|
@@ -14,6 +16,7 @@ export const INIT_PAYMENT_OPTIONS = [
|
|
|
14
16
|
hint: "1 Fen activation fee"
|
|
15
17
|
}
|
|
16
18
|
];
|
|
19
|
+
/** init 流程"更多支付方式"占位列表(仅展示用,不可选) */
|
|
17
20
|
export const INIT_COMING_SOON_PAYMENT_OPTIONS = [
|
|
18
21
|
{
|
|
19
22
|
id: "wechat-pay",
|
|
@@ -28,9 +31,21 @@ export const INIT_COMING_SOON_PAYMENT_OPTIONS = [
|
|
|
28
31
|
label: "Coinbase Smart Wallet"
|
|
29
32
|
}
|
|
30
33
|
];
|
|
34
|
+
/**
|
|
35
|
+
* 在 init 流程的支付选择面板下追加"更多支付方式(接入中)"提示。
|
|
36
|
+
*
|
|
37
|
+
* @param note 注入的 note 函数(默认 `@clack/prompts.note`,测试可替换)
|
|
38
|
+
*/
|
|
31
39
|
export function noteInitComingSoonPayments(note = p.note) {
|
|
32
40
|
note(INIT_COMING_SOON_PAYMENT_OPTIONS.map((entry) => `- ${entry.label}(接入中)`).join("\n"), "更多支付方式");
|
|
33
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* 把 provider-install 阶段的探测结果转成 `InitTerminalSelectionState`:
|
|
44
|
+
* 已配置完成的归 `installed`;已检测到但未配置的归 `options`,末尾追加 `OTHER_TERMINAL_OPTION`。
|
|
45
|
+
*
|
|
46
|
+
* @param providers provider-install 的探测结果
|
|
47
|
+
* @returns init 流程的多选状态
|
|
48
|
+
*/
|
|
34
49
|
export function buildInitTerminalSelectionState(providers) {
|
|
35
50
|
const installed = providers
|
|
36
51
|
.filter((provider) => provider.detected && provider.status === "configured")
|
|
@@ -51,12 +66,24 @@ export function buildInitTerminalSelectionState(providers) {
|
|
|
51
66
|
options: [...options, OTHER_TERMINAL_OPTION]
|
|
52
67
|
};
|
|
53
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* 校验 init 多选面板的返回值:必须至少选一个 terminal 或选择 `Other`。
|
|
71
|
+
*
|
|
72
|
+
* @param selected `@clack/prompts` 多选返回值
|
|
73
|
+
* @returns 错误消息字符串;合法时返回 `undefined`
|
|
74
|
+
*/
|
|
54
75
|
export function validateInitTerminalSelection(selected) {
|
|
55
76
|
if (!selected || selected.length === 0) {
|
|
56
77
|
return "Select at least one terminal or choose Other.";
|
|
57
78
|
}
|
|
58
79
|
return undefined;
|
|
59
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* 把"已配置完成的 terminal"列表渲染成 init 面板顶部的摘要文案。
|
|
83
|
+
*
|
|
84
|
+
* @param installed 已配置完成的 terminal 列表
|
|
85
|
+
* @returns 多行 markdown 摘要;空列表时返回 `undefined`
|
|
86
|
+
*/
|
|
60
87
|
export function buildInstalledTerminalMessage(installed) {
|
|
61
88
|
if (installed.length === 0) {
|
|
62
89
|
return undefined;
|
|
@@ -68,6 +95,15 @@ export function buildInstalledTerminalMessage(installed) {
|
|
|
68
95
|
function defaultHomeDir() {
|
|
69
96
|
return process.env.HOME || os.homedir();
|
|
70
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* 探查 `~/.openclaw/configs/` 目录及其默认 wallet 配置:
|
|
100
|
+
* - 是否存在 configs 目录
|
|
101
|
+
* - `config.json` 是否存在
|
|
102
|
+
* - 同目录里其它文件列表(用于 missing 状态下的提示)
|
|
103
|
+
*
|
|
104
|
+
* @param home 用户 home 目录(默认读 `process.env.HOME` 或 `os.homedir()`)
|
|
105
|
+
* @returns 探查结果
|
|
106
|
+
*/
|
|
71
107
|
export function inspectOpenClawWalletConfig(home = defaultHomeDir()) {
|
|
72
108
|
const configsDir = path.join(home, ".openclaw", "configs");
|
|
73
109
|
const expectedPath = path.join(configsDir, "config.json");
|
|
@@ -96,6 +132,13 @@ export function inspectOpenClawWalletConfig(home = defaultHomeDir()) {
|
|
|
96
132
|
function stringField(value) {
|
|
97
133
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
98
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* 从 `PaymentConfig` 里识别 ClawTip 已保存的关键字段(`resourceUrl` / `orderNo`)。
|
|
137
|
+
* 两者都没有时返回 `undefined`。
|
|
138
|
+
*
|
|
139
|
+
* @param payment buyer-store 读到的 payment 配置
|
|
140
|
+
* @returns 识别出的 binding;无关键字段时返回 `undefined`
|
|
141
|
+
*/
|
|
99
142
|
export function detectExistingClawtipBinding(payment) {
|
|
100
143
|
if (!payment || payment.method !== "clawtip" || !payment.config || typeof payment.config !== "object") {
|
|
101
144
|
return undefined;
|
|
@@ -112,12 +155,28 @@ export function detectExistingClawtipBinding(payment) {
|
|
|
112
155
|
orderNo,
|
|
113
156
|
};
|
|
114
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* 判断已保存的 ClawTip binding 能否被本地 OpenClaw wallet config 复用:
|
|
160
|
+
* wallet config 必须存在并且 saved binding 至少有一个关键字段。
|
|
161
|
+
*
|
|
162
|
+
* @param payment buyer-store 读到的 payment 配置
|
|
163
|
+
* @param walletConfig `inspectOpenClawWalletConfig()` 的结果
|
|
164
|
+
* @returns 可复用 binding;不可复用时返回 `undefined`
|
|
165
|
+
*/
|
|
115
166
|
export function detectReusableClawtipBinding(payment, walletConfig) {
|
|
116
167
|
if (!walletConfig.exists) {
|
|
117
168
|
return undefined;
|
|
118
169
|
}
|
|
119
170
|
return detectExistingClawtipBinding(payment);
|
|
120
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* 综合判断 ClawTip 钱包的就绪状态:把 saved binding、wallet config 和 reuse 关系
|
|
174
|
+
* 合并成 `ClawtipWalletReadiness`,供 init 面板、doctor 和激活流程共同消费。
|
|
175
|
+
*
|
|
176
|
+
* @param payment buyer-store 读到的 payment 配置
|
|
177
|
+
* @param walletConfig 本地 wallet 探查结果(默认 `inspectOpenClawWalletConfig()`)
|
|
178
|
+
* @returns 就绪状态 + 物证 + 人类可读说明
|
|
179
|
+
*/
|
|
121
180
|
export function inspectClawtipWalletReadiness(payment, walletConfig = inspectOpenClawWalletConfig()) {
|
|
122
181
|
const savedBinding = detectExistingClawtipBinding(payment);
|
|
123
182
|
const reusableBinding = detectReusableClawtipBinding(payment, walletConfig);
|
|
@@ -151,6 +210,15 @@ export function inspectClawtipWalletReadiness(payment, walletConfig = inspectOpe
|
|
|
151
210
|
message: "ClawTip payment metadata and local OpenClaw wallet config are not configured.",
|
|
152
211
|
};
|
|
153
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* 把 init 流程的若干条摘要拼成"成功"提示:
|
|
215
|
+
* - 顶部一行 emoji + 成功消息
|
|
216
|
+
* - 中间每条摘要 `- ` 开头
|
|
217
|
+
* - 末尾附 `tb doctor` 提示
|
|
218
|
+
*
|
|
219
|
+
* @param summaryLines 摘要行(会先 trim,空行会被跳过)
|
|
220
|
+
* @returns 多行 markdown 摘要
|
|
221
|
+
*/
|
|
154
222
|
export function buildInitSuccessMessage(summaryLines = []) {
|
|
155
223
|
const lines = ["✅ TokenBuddy setup completed successfully."];
|
|
156
224
|
for (const line of summaryLines) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-payment-options.js","sourceRoot":"","sources":["../../src/init-payment-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"init-payment-options.js","sourceRoot":"","sources":["../../src/init-payment-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,19 @@ import type { RegistrySeller } from "./seller-catalog.js";
|
|
|
8
8
|
* - `sellers` is a snapshot array of the matching registry entries. Order
|
|
9
9
|
* follows the registry's `defaultSeller` preference then declaration order.
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* `ModelIndex.resolve()` 的返回结果。
|
|
13
|
+
* - `empty` 等价于 `matched = false && sellers = []`,路由层应当视为"无可用 seller"。
|
|
14
|
+
* - `sellers` 是按 `defaultSeller` 优先 + 声明顺序排序后的快照数组。
|
|
15
|
+
*/
|
|
11
16
|
export interface ModelIndexResolution {
|
|
17
|
+
/** 原始请求的模型 ID(未归一化) */
|
|
12
18
|
modelId: string;
|
|
19
|
+
/** 索引里是否至少有一个 seller 命中(已归一化匹配) */
|
|
13
20
|
matched: boolean;
|
|
21
|
+
/** 命中的 seller 列表(已按 default + 声明顺序排序的快照) */
|
|
14
22
|
sellers: RegistrySeller[];
|
|
23
|
+
/** 当前索引里 `models` 字段缺失的 seller 数(用于诊断和告警) */
|
|
15
24
|
missingModelsFlag: number;
|
|
16
25
|
}
|
|
17
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-index.d.ts","sourceRoot":"","sources":["../../src/model-index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAa1D;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAYD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAyC;IAE1D;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI;IA8D3G;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,EAAE;IAYrG;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,oBAAoB;IAStG;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIvD;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM;IA4C9F;;;OAGG;IACH,KAAK,IAAI;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;CAUF"}
|
|
1
|
+
{"version":3,"file":"model-index.d.ts","sourceRoot":"","sources":["../../src/model-index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAa1D;;;;;;;;GAQG;AACH;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,6CAA6C;IAC7C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAYD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,SAAS,CAAyC;IAE1D;;;;;;;OAOG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,IAAI;IA8D3G;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,EAAE;IAYrG;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,oBAAoB;IAStG;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIvD;;;OAGG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM;IA4C9F;;;OAGG;IACH,KAAK,IAAI;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;CAUF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-index.js","sourceRoot":"","sources":["../../src/model-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,uBAAuB,CAAC,CAAC;AAE3D;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC;
|
|
1
|
+
{"version":3,"file":"model-index.js","sourceRoot":"","sources":["../../src/model-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,uBAAuB,CAAC,CAAC;AAE3D;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC;AAqCD;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACb,SAAS,GAAwB,cAAc,EAAE,CAAC;IAE1D;;;;;;;OAOG;IACH,OAAO,CAAC,OAAyB,EAAE,OAA+D,EAAE;QAClG,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;QACnD,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,qEAAqE;YACrE,iEAAiE;YACjE,sDAAsD;YACtD,6CAA6C;YAC7C,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBACxC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB,CAAC;gBACxD,CAAC,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC/C,CAAC;gBACD,MAAM,CAAC,kBAAkB,GAAG,CAAC,GAAG,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;YACzE,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChE,aAAa,IAAI,CAAC,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,uEAAuE,EAAE;oBAC3H,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,SAAS,EAAE,MAAM,CAAC,GAAG;iBACtB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBACjD,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,GAAG;YACf,OAAO;YACP,QAAQ;YACR,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,CAAC;YAC1C,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE;YAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,kBAAkB,EAAE,aAAa;YACjC,YAAY,EAAE,QAAQ,CAAC,IAAI;SAC5B,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,4CAA4C,EAAE;YAClF,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe;YAC/C,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY;YACxC,UAAU,EAAE,OAAO,CAAC,IAAI;YACxB,aAAa,EAAE,aAAa;YAC5B,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI;SAC9C,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,OAAe,EAAE,MAAsD;QAChF,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAAe,EAAE,MAAsD;QAC7E,OAAO;YACL,OAAO;YACP,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;YACzC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB;SACrD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAA+B,EAAE,YAAoB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACnF,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC;QAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;QACpD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;QACnD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,GAAG;YACf,GAAG,IAAI,CAAC,SAAS;YACjB,OAAO;YACP,QAAQ;YACR,iBAAiB,EAAE,GAAG;SACvB,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,uCAAuC,EAAE;YAC5E,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,gBAAgB,EAAE,QAAQ,CAAC,IAAI;YAC/B,eAAe,EAAE,OAAO,CAAC,IAAI;SAC9B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK;QAQH,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY;YACxC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI;YACvC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB;YACrD,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe;YAC/C,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB;YACnD,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe;SAChD,CAAC;IACJ,CAAC;CACF;AAED,SAAS,cAAc;IACrB,OAAO;QACL,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,CAAC;QACpB,kBAAkB,EAAE,CAAC;QACrB,YAAY,EAAE,CAAC;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB,EAAE,MAAqD;IAClG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -5,33 +5,93 @@
|
|
|
5
5
|
* loader can change this without re-architecting.
|
|
6
6
|
*/
|
|
7
7
|
export declare const DEFAULT_PREWARM_TTL_MS: number;
|
|
8
|
+
/**
|
|
9
|
+
* 缓存条目的状态机。
|
|
10
|
+
* - `warming`:调度中,候选尚未稳定
|
|
11
|
+
* - `warm`:上次 commit 成功且 TTL 内
|
|
12
|
+
* - `stale`:TTL 过期或连续 commit 失败
|
|
13
|
+
* - `empty`:commit 返回 0 候选(该 (model, protocol, payment) 在当前 registry 下无 seller)
|
|
14
|
+
*/
|
|
8
15
|
export type PrewarmState = "warming" | "warm" | "stale" | "empty";
|
|
16
|
+
/**
|
|
17
|
+
* 单个 seller 在某次 prewarm commit 后的健康画像。
|
|
18
|
+
* 由 `PrewarmCache.commitWarm()` 归一化字段(score 0-100、latency 非负)后写入。
|
|
19
|
+
*/
|
|
9
20
|
export interface PrewarmCandidate {
|
|
21
|
+
/** seller 全局 ID */
|
|
10
22
|
sellerId: string;
|
|
23
|
+
/** 去掉尾部斜杠后的 seller URL */
|
|
11
24
|
url: string;
|
|
25
|
+
/** 综合健康分,0-100,0 表示彻底坏 */
|
|
12
26
|
healthScore: number;
|
|
27
|
+
/** 上一次成功的 unix 毫秒时间戳;0 表示尚无成功 */
|
|
13
28
|
lastSuccessAt: number;
|
|
29
|
+
/** 上一次失败的 unix 毫秒时间戳;0 表示尚无失败 */
|
|
14
30
|
lastFailAt: number;
|
|
31
|
+
/** 平均延迟(毫秒),用于排序时的回退指标 */
|
|
15
32
|
avgLatencyMs: number;
|
|
33
|
+
/** health probe 的延迟(毫秒),可选 */
|
|
34
|
+
healthProbeLatencyMs?: number;
|
|
35
|
+
/** 首 token 延迟(毫秒),可选;speed 排序的优先指标 */
|
|
36
|
+
ttftMs?: number;
|
|
37
|
+
/** 平均推理延迟(毫秒),可选 */
|
|
38
|
+
avgInferenceMs?: number;
|
|
39
|
+
/** 上游状态(与 seller 上报的语义对齐) */
|
|
40
|
+
upstreamStatus?: "healthy" | "degraded" | "unhealthy" | "unknown";
|
|
41
|
+
/** 上游错误类名(HTTP status / 错误码),仅在失败时存在 */
|
|
42
|
+
upstreamErrorClass?: string;
|
|
16
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* 缓存条目:以 `(modelId, protocol, paymentMethod)` 为键,存储一组候选 seller 的健康画像。
|
|
46
|
+
* `warmedAt` 是 TTL 的起点;`consecutiveWarmingFailures` 触发指数退避。
|
|
47
|
+
*/
|
|
17
48
|
export interface PrewarmEntry {
|
|
49
|
+
/** 模型 ID(已归一化) */
|
|
18
50
|
modelId: string;
|
|
51
|
+
/** 协议名(已归一化) */
|
|
19
52
|
protocol: string;
|
|
53
|
+
/** 支付方式(已归一化) */
|
|
20
54
|
paymentMethod: string;
|
|
55
|
+
/** 当前条目状态 */
|
|
21
56
|
state: PrewarmState;
|
|
57
|
+
/** 该 (model, protocol, payment) 命中的候选 seller 列表 */
|
|
22
58
|
candidates: PrewarmCandidate[];
|
|
59
|
+
/** 本次成功的 commit 时间戳,TTL 起点 */
|
|
23
60
|
warmedAt: number;
|
|
61
|
+
/** 本条目的 TTL(毫秒),commit 时可被显式覆盖 */
|
|
24
62
|
ttlMs: number;
|
|
63
|
+
/** 连续 warming 失败次数;医生面板据此判断"长期坏" */
|
|
25
64
|
consecutiveWarmingFailures: number;
|
|
65
|
+
/** 最近一次进入 warming 的时间戳,调试用 */
|
|
26
66
|
lastInFlightAt?: number;
|
|
27
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* 调度器在 commit 时传入的"原始"候选数据:所有字段都可空,
|
|
70
|
+
* 由 `toCandidate()` 做归一化(score clamp、latency 截负等)。
|
|
71
|
+
*/
|
|
28
72
|
export interface PrewarmCandidateInput {
|
|
73
|
+
/** seller ID */
|
|
29
74
|
sellerId: string;
|
|
75
|
+
/** seller URL */
|
|
30
76
|
url: string;
|
|
77
|
+
/** 健康分(可选;缺省在归一化时落到 50) */
|
|
31
78
|
healthScore?: number;
|
|
79
|
+
/** 上次成功时间戳(毫秒),可选 */
|
|
32
80
|
lastSuccessAt?: number;
|
|
81
|
+
/** 上次失败时间戳(毫秒),可选 */
|
|
33
82
|
lastFailAt?: number;
|
|
83
|
+
/** 平均延迟(毫秒),可选 */
|
|
34
84
|
avgLatencyMs?: number;
|
|
85
|
+
/** health probe 延迟(毫秒),可选 */
|
|
86
|
+
healthProbeLatencyMs?: number;
|
|
87
|
+
/** TTFT(毫秒),可选 */
|
|
88
|
+
ttftMs?: number;
|
|
89
|
+
/** 平均推理延迟(毫秒),可选 */
|
|
90
|
+
avgInferenceMs?: number;
|
|
91
|
+
/** 上游状态,可选 */
|
|
92
|
+
upstreamStatus?: "healthy" | "degraded" | "unhealthy" | "unknown";
|
|
93
|
+
/** 上游错误类名,可选 */
|
|
94
|
+
upstreamErrorClass?: string;
|
|
35
95
|
}
|
|
36
96
|
/**
|
|
37
97
|
* Build the cache key for a (model, protocol, payment) triple. The colon
|
|
@@ -44,6 +104,11 @@ interface PrewarmCacheOptions {
|
|
|
44
104
|
defaultTtlMs?: number;
|
|
45
105
|
now?: () => number;
|
|
46
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* 进程内的 (model, protocol, payment) → 候选 seller 健康画像缓存。
|
|
109
|
+
* 单线程访问(Node JS 主线程),无内部锁;`commitWarm` 是写路径,
|
|
110
|
+
* `get/freshness` 是热路径读,TTL 由 `warmedAt + ttlMs` 决定。
|
|
111
|
+
*/
|
|
47
112
|
export declare class PrewarmCache {
|
|
48
113
|
private readonly entries;
|
|
49
114
|
private readonly defaultTtlMs;
|
|
@@ -127,22 +192,46 @@ export declare class PrewarmCache {
|
|
|
127
192
|
size(): number;
|
|
128
193
|
clear(): void;
|
|
129
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* `PrewarmCache.freshness()` 的返回:一次"是否还能信任现有 prewarm"的快速判断。
|
|
197
|
+
* 在每条 inference 请求的热路径上使用,避免直接遍历缓存。
|
|
198
|
+
*/
|
|
130
199
|
export interface PrewarmFreshness {
|
|
200
|
+
/** 是否存在对应条目(false 等价于 cold path) */
|
|
131
201
|
present: boolean;
|
|
202
|
+
/** 当前是否已超过 TTL */
|
|
132
203
|
expired: boolean;
|
|
204
|
+
/** TTL 剩余 ≤ 10% 时视为"即将过期",调度器用此触发 idle 预热 */
|
|
133
205
|
expiringSoon: boolean;
|
|
206
|
+
/** 剩余 TTL(毫秒),过期时省略 */
|
|
134
207
|
remainingMs?: number;
|
|
208
|
+
/** 条目当前状态(过期时强制为 `stale`) */
|
|
135
209
|
state: PrewarmState;
|
|
210
|
+
/** 关联的缓存条目(如果有) */
|
|
136
211
|
entry?: PrewarmEntry;
|
|
137
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* `PrewarmCache.beginWarming()` 的返回值:标记一次预热进入 in-flight。
|
|
215
|
+
* `hadPrevious` 用于上层决定是否在 `warming` 期间对外暴露旧候选。
|
|
216
|
+
*/
|
|
138
217
|
export interface PrewarmBeginResult {
|
|
218
|
+
/** 缓存键(与 `prewarmKey()` 的输出等价) */
|
|
139
219
|
key: string;
|
|
220
|
+
/** 当前写回缓存的 entry(state=`warming`) */
|
|
140
221
|
entry: PrewarmEntry;
|
|
222
|
+
/** 调用前缓存里是否已有 entry,用于上层做"保留旧候选"判断 */
|
|
141
223
|
hadPrevious: boolean;
|
|
142
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* `PrewarmCache.commitWarm()` 的返回值:成功提交一次候选集合。
|
|
227
|
+
* `replacedSellers` 用于上层做候选 churn 检测。
|
|
228
|
+
*/
|
|
143
229
|
export interface PrewarmCommitResult {
|
|
230
|
+
/** 缓存键 */
|
|
144
231
|
key: string;
|
|
232
|
+
/** 提交后的新 entry(state=`warm` 或 `empty`) */
|
|
145
233
|
entry: PrewarmEntry;
|
|
234
|
+
/** 上一版 entry 的候选 seller 列表(已不再缓存的 seller ID) */
|
|
146
235
|
replacedSellers: string[];
|
|
147
236
|
}
|
|
148
237
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prewarm-cache.d.ts","sourceRoot":"","sources":["../../src/prewarm-cache.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"prewarm-cache.d.ts","sourceRoot":"","sources":["../../src/prewarm-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,11 @@ function parseKey(key) {
|
|
|
27
27
|
}
|
|
28
28
|
return { modelId, protocol, paymentMethod };
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* 进程内的 (model, protocol, payment) → 候选 seller 健康画像缓存。
|
|
32
|
+
* 单线程访问(Node JS 主线程),无内部锁;`commitWarm` 是写路径,
|
|
33
|
+
* `get/freshness` 是热路径读,TTL 由 `warmedAt + ttlMs` 决定。
|
|
34
|
+
*/
|
|
30
35
|
export class PrewarmCache {
|
|
31
36
|
entries = new Map();
|
|
32
37
|
defaultTtlMs;
|
|
@@ -270,9 +275,17 @@ function toCandidate(input) {
|
|
|
270
275
|
healthScore: clampScore(input.healthScore ?? 50),
|
|
271
276
|
lastSuccessAt: input.lastSuccessAt ?? 0,
|
|
272
277
|
lastFailAt: input.lastFailAt ?? 0,
|
|
273
|
-
avgLatencyMs: Math.max(0, input.avgLatencyMs ?? 0)
|
|
278
|
+
avgLatencyMs: Math.max(0, input.avgLatencyMs ?? 0),
|
|
279
|
+
healthProbeLatencyMs: finiteNonNegative(input.healthProbeLatencyMs),
|
|
280
|
+
ttftMs: finiteNonNegative(input.ttftMs),
|
|
281
|
+
avgInferenceMs: finiteNonNegative(input.avgInferenceMs),
|
|
282
|
+
upstreamStatus: input.upstreamStatus,
|
|
283
|
+
upstreamErrorClass: input.upstreamErrorClass
|
|
274
284
|
};
|
|
275
285
|
}
|
|
286
|
+
function finiteNonNegative(value) {
|
|
287
|
+
return Number.isFinite(value) ? Math.max(0, value) : undefined;
|
|
288
|
+
}
|
|
276
289
|
function clampScore(score) {
|
|
277
290
|
if (!Number.isFinite(score)) {
|
|
278
291
|
return 50;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prewarm-cache.js","sourceRoot":"","sources":["../../src/prewarm-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"prewarm-cache.js","sourceRoot":"","sources":["../../src/prewarm-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AA8FrD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB;IACjF,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,SAAS,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,SAAS,aAAa,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5H,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC;IACjD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AAC9C,CAAC;AAOD;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC1C,YAAY,CAAS;IACrB,GAAG,CAAe;IAEnC,YAAY,UAA+B,EAAE;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,sBAAsB,CAAC;QACnE,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC/E,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QACrD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO;YACP,YAAY,EAAE,CAAC,OAAO,IAAI,WAAW,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG;YAC1D,WAAW;YACX,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;YACtC,KAAK;SACN,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB,EAAE,KAAc;QACnF,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAiB;YAC1B,OAAO;YACP,QAAQ;YACR,aAAa;YACb,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,EAAE;YACtC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,GAAG;YACnC,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;YACpD,0BAA0B,EAAE,QAAQ,EAAE,0BAA0B,IAAI,CAAC;YACrE,cAAc,EAAE,GAAG;SACpB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,yBAAyB,EAAE;YACvE,OAAO;YACP,QAAQ;YACR,aAAa;YACb,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,aAAa,EAAE,QAAQ,EAAE,KAAK;SAC/B,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,KAMV;QACC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GAAiB;YACzB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YACrD,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;YAC7C,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;YAC1D,0BAA0B,EAAE,CAAC;YAC7B,cAAc,EAAE,GAAG;SACpB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE5B,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,uCAAuC,EAAE;gBACjF,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,aAAa,EAAE,KAAK,CAAC,aAAa;aACnC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,mCAAmC,EAAE;gBAC1E,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBACtC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,GAAG;YACH,KAAK,EAAE,IAAI;YACX,eAAe,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;SACnE,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB,EAAE,YAAqB;QAC3F,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAiB;YACzB,GAAG,QAAQ;YACX,KAAK,EAAE,OAAO;YACd,0BAA0B,EAAE,QAAQ,CAAC,0BAA0B,GAAG,CAAC;YACnE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;SAC3B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,2CAA2C,EAAE;YACzF,OAAO;YACP,QAAQ;YACR,aAAa;YACb,mBAAmB,EAAE,IAAI,CAAC,0BAA0B;YACpD,YAAY;SACb,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,QAAgB;QAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;oBACpB,GAAG,KAAK;oBACR,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,yCAAyC,EAAE;gBACzF,QAAQ;gBACR,eAAe,EAAE,OAAO;aACzB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,iCAAiC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,OAAe,EAAE,QAAgB,EAAE,aAAqB,EAAE,QAAgB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACjH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;QACjC,OAAO,GAAG,IAAI,KAAK,CAAC,KAAK,GAAG,QAAQ,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvD,GAAG,KAAK;YACR,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;SACpE,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,MAAM,GAAG,GAAwE,EAAE,CAAC;QACpF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AA+CD,SAAS,WAAW,CAAC,KAA4B;IAC/C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QAChD,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;QACvC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,CAAC;QACjC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;QAClD,oBAAoB,EAAE,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACnE,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC,cAAc,EAAE,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC;QACvD,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,36 +1,78 @@
|
|
|
1
1
|
import type { RegistrySeller } from "./seller-catalog.js";
|
|
2
2
|
import type { ModelIndex } from "./model-index.js";
|
|
3
3
|
import type { PrewarmCache } from "./prewarm-cache.js";
|
|
4
|
+
/**
|
|
5
|
+
* 触发 prewarm 的原因,用于调度器决定并发与日志分组。
|
|
6
|
+
* - `startup`:daemon 启动时的批量预热,会受 startup jitter 影响
|
|
7
|
+
* - `lazy`:用户首次请求某 (model, protocol, payment) 时触发的预热
|
|
8
|
+
* - `idle`:后台 idle tick 触发的刷新
|
|
9
|
+
* - `explicit`:`tb doctor --prewarm` 之类的显式触发
|
|
10
|
+
*/
|
|
4
11
|
export type PrewarmReason = "startup" | "lazy" | "idle" | "explicit";
|
|
12
|
+
/**
|
|
13
|
+
* 单次 health probe 的结果,由 `SellerProber` 返回。
|
|
14
|
+
* 调度器会基于 `ok` + `latencyMs` 推算 `healthScore`,并把 `upstreamStatus` 直接透传。
|
|
15
|
+
*/
|
|
5
16
|
export interface ProbeResult {
|
|
17
|
+
/** probe 是否成功(HTTP 2xx 且语义上代表"健康") */
|
|
6
18
|
ok: boolean;
|
|
19
|
+
/** probe 总耗时(毫秒),用于 healthScore 计算 */
|
|
7
20
|
latencyMs: number;
|
|
21
|
+
/** HTTP status(如果 prober 能拿到) */
|
|
8
22
|
httpStatus?: number;
|
|
23
|
+
/** 错误描述(仅当 `ok=false` 时存在,不携带敏感字段) */
|
|
9
24
|
errorMessage?: string;
|
|
25
|
+
/** 上游报告的状态,与 health probe 端点或 fallback 推断的语义对齐 */
|
|
26
|
+
upstreamStatus?: "healthy" | "degraded" | "unhealthy" | "unknown";
|
|
27
|
+
/** 上游错误类名(status code / error code) */
|
|
28
|
+
upstreamErrorClass?: string;
|
|
29
|
+
/** 首 token 延迟(毫秒),可选;speed 排序时优先使用 */
|
|
30
|
+
ttftMs?: number;
|
|
31
|
+
/** 平均推理延迟(毫秒),可选 */
|
|
32
|
+
avgInferenceMs?: number;
|
|
10
33
|
}
|
|
11
34
|
/**
|
|
12
35
|
* The probe function used by the scheduler. Decoupled so the scheduler can
|
|
13
36
|
* be unit-tested without spinning up HTTP servers. The default
|
|
14
|
-
* implementation in `
|
|
15
|
-
*
|
|
37
|
+
* implementation in `daemon.ts` calls `GET <seller.url>/health` with a 3s
|
|
38
|
+
* timeout. Probers must
|
|
16
39
|
* observe the provided `AbortSignal` and reject when it aborts so the
|
|
17
40
|
* scheduler can short-circuit in-flight probes on `stop()`.
|
|
18
41
|
*/
|
|
19
42
|
export type SellerProber = (seller: RegistrySeller, signal: AbortSignal) => Promise<ProbeResult>;
|
|
43
|
+
/**
|
|
44
|
+
* 构造 `PrewarmScheduler` 所需的依赖与可调参数。默认值见设计文档
|
|
45
|
+
* buyer-driven-fallback-design.md §18.5-§18.6:并发 4、per-seller 30s、
|
|
46
|
+
* 全局 30/min、startup jitter 5-10s。
|
|
47
|
+
*/
|
|
20
48
|
export interface PrewarmSchedulerOptions {
|
|
49
|
+
/** 共享的 model index,用于把 modelId 解析为 seller 列表 */
|
|
21
50
|
modelIndex: ModelIndex;
|
|
51
|
+
/** 共享的 prewarm 缓存,调度器写入并由控制器读取 */
|
|
22
52
|
cache: PrewarmCache;
|
|
53
|
+
/** 注入的 health prober,调度器不直接发 HTTP */
|
|
23
54
|
prober: SellerProber;
|
|
55
|
+
/** 并发上限,默认 4 */
|
|
24
56
|
concurrency?: number;
|
|
57
|
+
/** 同一 seller 两次 probe 之间的最小间隔(毫秒),默认 30000 */
|
|
25
58
|
perSellerMinIntervalMs?: number;
|
|
59
|
+
/** 每分钟最多 probe 多少次(全局节流),默认 30 */
|
|
26
60
|
maxPrewarmPerMinute?: number;
|
|
61
|
+
/** idle 循环的间隔(毫秒),默认 60000 */
|
|
27
62
|
idleIntervalMs?: number;
|
|
63
|
+
/** startup 抖动的下界(毫秒),默认 5000 */
|
|
28
64
|
startupJitterMinMs?: number;
|
|
65
|
+
/** startup 抖动的上界(毫秒),默认 10000 */
|
|
29
66
|
startupJitterMaxMs?: number;
|
|
67
|
+
/** 可注入的 sleep(支持 abort),默认 Node setTimeout */
|
|
30
68
|
sleep?: (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
69
|
+
/** 可注入的随机源,默认 `Math.random` */
|
|
31
70
|
random?: () => number;
|
|
71
|
+
/** 可注入的时钟,默认 `Date.now` */
|
|
32
72
|
now?: () => number;
|
|
73
|
+
/** 全局默认协议 filter,可被 `schedulePrewarm` 覆盖 */
|
|
33
74
|
protocol?: string;
|
|
75
|
+
/** 全局默认支付方式 filter,可被 `schedulePrewarm` 覆盖 */
|
|
34
76
|
paymentMethod?: string;
|
|
35
77
|
}
|
|
36
78
|
interface PrewarmTask {
|
|
@@ -46,15 +88,28 @@ interface PrewarmTask {
|
|
|
46
88
|
status: "queued" | "running" | "succeeded" | "failed" | "canceled" | "rate_limited";
|
|
47
89
|
errorMessage?: string;
|
|
48
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* `PrewarmScheduler.stats()` 的返回:调度器当前的运行指标快照。
|
|
93
|
+
* `tb doctor` 据此判断调度是否过载、是否长期被限流。
|
|
94
|
+
*/
|
|
49
95
|
export interface PrewarmSchedulerStats {
|
|
96
|
+
/** 当前队列里尚未开始的 task 数 */
|
|
50
97
|
queueDepth: number;
|
|
98
|
+
/** 正在 probe 的 task 数 */
|
|
51
99
|
inFlight: number;
|
|
100
|
+
/** 累计入队的 task 数(包含 rate_limited) */
|
|
52
101
|
totalScheduled: number;
|
|
102
|
+
/** 累计成功的 task 数 */
|
|
53
103
|
totalSucceeded: number;
|
|
104
|
+
/** 累计失败的 task 数(所有候选 probe 都失败) */
|
|
54
105
|
totalFailed: number;
|
|
106
|
+
/** 累计因全局节流被跳过的 task 数 */
|
|
55
107
|
totalRateLimited: number;
|
|
108
|
+
/** 最近 60 秒内发起的 probe 总数(用于判断是否撞到 maxPrewarmPerMinute) */
|
|
56
109
|
recentProbesInLastMinute: number;
|
|
110
|
+
/** 当前配置的并发上限 */
|
|
57
111
|
concurrency: number;
|
|
112
|
+
/** 当前配置的每分钟 probe 上限 */
|
|
58
113
|
maxPrewarmPerMinute: number;
|
|
59
114
|
}
|
|
60
115
|
/**
|
|
@@ -128,7 +183,11 @@ export declare class PrewarmScheduler {
|
|
|
128
183
|
* the configured jitter window. Resolves once every scheduled task has
|
|
129
184
|
* reached a terminal state.
|
|
130
185
|
*/
|
|
131
|
-
runStartupPrewarm(
|
|
186
|
+
runStartupPrewarm(inputs: Array<string | {
|
|
187
|
+
modelId: string;
|
|
188
|
+
protocol?: string;
|
|
189
|
+
paymentMethod?: string;
|
|
190
|
+
}>): Promise<void>;
|
|
132
191
|
/**
|
|
133
192
|
* Force a sweep of any cache key whose TTL is about to expire. Returns
|
|
134
193
|
* the number of tasks that were enqueued. Intended to be called from
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prewarm-scheduler.d.ts","sourceRoot":"","sources":["../../src/prewarm-scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AAIzE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"prewarm-scheduler.d.ts","sourceRoot":"","sources":["../../src/prewarm-scheduler.ts"],"names":[],"mappings":"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"}
|