@tokenbuddy/tokenbuddy 1.0.12 → 1.0.14
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,29 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `detectTerminals()` 的输出单元:描述一个可被 rewrite 的 coding terminal。
|
|
3
|
+
* `detected=false` 时仍会返回,UI 用其渲染"未安装"标签而不是直接跳过。
|
|
4
|
+
*/
|
|
1
5
|
export interface TerminalCandidate {
|
|
6
|
+
/** terminal 内部 ID,例:`claude-code` / `claude-desktop` / `openclaw` / `hermes` */
|
|
2
7
|
id: string;
|
|
8
|
+
/** 人类可读名称,例:`Claude Code CLI` */
|
|
3
9
|
name: string;
|
|
10
|
+
/** 本机是否检测到该 terminal 的配置文件 */
|
|
4
11
|
detected: boolean;
|
|
12
|
+
/** 配置文件绝对路径(即使未检测到也会拼出预期路径) */
|
|
5
13
|
configPath: string;
|
|
14
|
+
/** 检测结果的说明,用于 UI 展示 */
|
|
6
15
|
reason: string;
|
|
7
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* 获取当前用户的 home 目录,作为拼装 terminal 配置路径的基准。
|
|
19
|
+
*
|
|
20
|
+
* @returns `os.homedir()` 返回的 home 路径
|
|
21
|
+
*/
|
|
8
22
|
export declare function getHomeDir(): string;
|
|
9
23
|
/**
|
|
10
24
|
* Detect which coding terminals are installed on the local system.
|
|
25
|
+
*
|
|
26
|
+
* 通过 `~/.claude/settings.json`、`Library/Application Support/Claude/...`、
|
|
27
|
+
* `~/.openclaw/config.json`、`~/.hermes/settings.json` 等约定路径判断。
|
|
28
|
+
* Claude Desktop 在非 macOS 平台上 `configPath` 可能为空字符串,
|
|
29
|
+
* 调用方需以 `detected` 字段为准。
|
|
30
|
+
*
|
|
31
|
+
* @returns terminal 候选列表(固定四个 ID 顺序)
|
|
11
32
|
*/
|
|
12
33
|
export declare function detectTerminals(): TerminalCandidate[];
|
|
13
34
|
/**
|
|
14
35
|
* Safely rewrite Claude Code settings to route requests through our proxy.
|
|
36
|
+
*
|
|
37
|
+
* 写入 `ANTHROPIC_BASE_URL` / `ANTHROPIC_AUTH_TOKEN`(占位 `TOKENBUDDY_PROXY`)/
|
|
38
|
+
* `ANTHROPIC_MODEL` / `ANTHROPIC_DEFAULT_SONNET_MODEL`。失败时仅打印日志,
|
|
39
|
+
* 不会抛出异常;调用方无需 try/catch。
|
|
40
|
+
*
|
|
41
|
+
* @param configPath `~/.claude/settings.json` 的绝对路径
|
|
42
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
43
|
+
* @param model Claude Code 默认模型 ID
|
|
15
44
|
*/
|
|
16
45
|
export declare function rewriteClaudeCode(configPath: string, proxyUrl: string, model: string): void;
|
|
17
46
|
/**
|
|
18
47
|
* Safely rewrite Claude Desktop configuration.
|
|
48
|
+
*
|
|
49
|
+
* 写入 `deploymentMode = "3p"` 到 Claude 与 Claude-3p 两个目录,
|
|
50
|
+
* 并在 `configLibrary/<DESKTOP_PROFILE_ID>.json` 写入 TokenBuddy profile。
|
|
51
|
+
* 最后更新 `_meta.json` 把 `appliedId` 指向该 profile。
|
|
52
|
+
*
|
|
53
|
+
* @param configPath Claude Desktop 主配置(`claude_desktop_config.json`)绝对路径
|
|
54
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
55
|
+
* @param model Claude Desktop 默认模型 ID
|
|
19
56
|
*/
|
|
20
57
|
export declare function rewriteClaudeDesktop(configPath: string, proxyUrl: string, model: string): void;
|
|
21
58
|
/**
|
|
22
59
|
* Rewrite Openclaw settings.
|
|
60
|
+
*
|
|
61
|
+
* 写入 `api_url` / `api_key`(占位 `TOKENBUDDY_PROXY`)/`model`。
|
|
62
|
+
* 失败仅打印日志,不抛出。
|
|
63
|
+
*
|
|
64
|
+
* @param configPath `~/.openclaw/config.json` 的绝对路径
|
|
65
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
66
|
+
* @param model Openclaw 默认模型 ID
|
|
23
67
|
*/
|
|
24
68
|
export declare function rewriteOpenclaw(configPath: string, proxyUrl: string, model: string): void;
|
|
25
69
|
/**
|
|
26
70
|
* Rewrite Hermes settings.
|
|
71
|
+
*
|
|
72
|
+
* 在 `openai` 块下写入 `base_url` / `api_key`(占位 `TOKENBUDDY_PROXY`)/`model`。
|
|
73
|
+
* 失败仅打印日志,不抛出。
|
|
74
|
+
*
|
|
75
|
+
* @param configPath `~/.hermes/settings.json` 的绝对路径
|
|
76
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
77
|
+
* @param model Hermes 默认模型 ID
|
|
27
78
|
*/
|
|
28
79
|
export declare function rewriteHermes(configPath: string, proxyUrl: string, model: string): void;
|
|
29
80
|
//# sourceMappingURL=terminal-detect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-detect.d.ts","sourceRoot":"","sources":["../../src/terminal-detect.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED
|
|
1
|
+
{"version":3,"file":"terminal-detect.d.ts","sourceRoot":"","sources":["../../src/terminal-detect.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,EAAE,CAuDrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA4B3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA0D9F;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAmBzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAsBvF"}
|
|
@@ -3,11 +3,23 @@ import * as path from "path";
|
|
|
3
3
|
import * as os from "os";
|
|
4
4
|
const PLACEHOLDER_API_KEY = "TOKENBUDDY_PROXY";
|
|
5
5
|
const DESKTOP_PROFILE_ID = "00000000-0000-4000-8000-000000178210";
|
|
6
|
+
/**
|
|
7
|
+
* 获取当前用户的 home 目录,作为拼装 terminal 配置路径的基准。
|
|
8
|
+
*
|
|
9
|
+
* @returns `os.homedir()` 返回的 home 路径
|
|
10
|
+
*/
|
|
6
11
|
export function getHomeDir() {
|
|
7
12
|
return os.homedir();
|
|
8
13
|
}
|
|
9
14
|
/**
|
|
10
15
|
* Detect which coding terminals are installed on the local system.
|
|
16
|
+
*
|
|
17
|
+
* 通过 `~/.claude/settings.json`、`Library/Application Support/Claude/...`、
|
|
18
|
+
* `~/.openclaw/config.json`、`~/.hermes/settings.json` 等约定路径判断。
|
|
19
|
+
* Claude Desktop 在非 macOS 平台上 `configPath` 可能为空字符串,
|
|
20
|
+
* 调用方需以 `detected` 字段为准。
|
|
21
|
+
*
|
|
22
|
+
* @returns terminal 候选列表(固定四个 ID 顺序)
|
|
11
23
|
*/
|
|
12
24
|
export function detectTerminals() {
|
|
13
25
|
const home = getHomeDir();
|
|
@@ -63,6 +75,14 @@ export function detectTerminals() {
|
|
|
63
75
|
}
|
|
64
76
|
/**
|
|
65
77
|
* Safely rewrite Claude Code settings to route requests through our proxy.
|
|
78
|
+
*
|
|
79
|
+
* 写入 `ANTHROPIC_BASE_URL` / `ANTHROPIC_AUTH_TOKEN`(占位 `TOKENBUDDY_PROXY`)/
|
|
80
|
+
* `ANTHROPIC_MODEL` / `ANTHROPIC_DEFAULT_SONNET_MODEL`。失败时仅打印日志,
|
|
81
|
+
* 不会抛出异常;调用方无需 try/catch。
|
|
82
|
+
*
|
|
83
|
+
* @param configPath `~/.claude/settings.json` 的绝对路径
|
|
84
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
85
|
+
* @param model Claude Code 默认模型 ID
|
|
66
86
|
*/
|
|
67
87
|
export function rewriteClaudeCode(configPath, proxyUrl, model) {
|
|
68
88
|
try {
|
|
@@ -93,6 +113,14 @@ export function rewriteClaudeCode(configPath, proxyUrl, model) {
|
|
|
93
113
|
}
|
|
94
114
|
/**
|
|
95
115
|
* Safely rewrite Claude Desktop configuration.
|
|
116
|
+
*
|
|
117
|
+
* 写入 `deploymentMode = "3p"` 到 Claude 与 Claude-3p 两个目录,
|
|
118
|
+
* 并在 `configLibrary/<DESKTOP_PROFILE_ID>.json` 写入 TokenBuddy profile。
|
|
119
|
+
* 最后更新 `_meta.json` 把 `appliedId` 指向该 profile。
|
|
120
|
+
*
|
|
121
|
+
* @param configPath Claude Desktop 主配置(`claude_desktop_config.json`)绝对路径
|
|
122
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
123
|
+
* @param model Claude Desktop 默认模型 ID
|
|
96
124
|
*/
|
|
97
125
|
export function rewriteClaudeDesktop(configPath, proxyUrl, model) {
|
|
98
126
|
try {
|
|
@@ -155,6 +183,13 @@ export function rewriteClaudeDesktop(configPath, proxyUrl, model) {
|
|
|
155
183
|
}
|
|
156
184
|
/**
|
|
157
185
|
* Rewrite Openclaw settings.
|
|
186
|
+
*
|
|
187
|
+
* 写入 `api_url` / `api_key`(占位 `TOKENBUDDY_PROXY`)/`model`。
|
|
188
|
+
* 失败仅打印日志,不抛出。
|
|
189
|
+
*
|
|
190
|
+
* @param configPath `~/.openclaw/config.json` 的绝对路径
|
|
191
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
192
|
+
* @param model Openclaw 默认模型 ID
|
|
158
193
|
*/
|
|
159
194
|
export function rewriteOpenclaw(configPath, proxyUrl, model) {
|
|
160
195
|
try {
|
|
@@ -180,6 +215,13 @@ export function rewriteOpenclaw(configPath, proxyUrl, model) {
|
|
|
180
215
|
}
|
|
181
216
|
/**
|
|
182
217
|
* Rewrite Hermes settings.
|
|
218
|
+
*
|
|
219
|
+
* 在 `openai` 块下写入 `base_url` / `api_key`(占位 `TOKENBUDDY_PROXY`)/`model`。
|
|
220
|
+
* 失败仅打印日志,不抛出。
|
|
221
|
+
*
|
|
222
|
+
* @param configPath `~/.hermes/settings.json` 的绝对路径
|
|
223
|
+
* @param proxyUrl TokenBuddy proxy 的 base URL
|
|
224
|
+
* @param model Hermes 默认模型 ID
|
|
183
225
|
*/
|
|
184
226
|
export function rewriteHermes(configPath, proxyUrl, model) {
|
|
185
227
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-detect.js","sourceRoot":"","sources":["../../src/terminal-detect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-detect.js","sourceRoot":"","sources":["../../src/terminal-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,63 @@
|
|
|
1
1
|
type TerminalEnv = Readonly<Record<string, string | undefined>>;
|
|
2
|
+
/**
|
|
3
|
+
* 终端图片的展示方式:
|
|
4
|
+
* - `inline-iterm`:iTerm2 / WezTerm 等支持的 OSC 1337 内嵌图片
|
|
5
|
+
* - `inline-kitty`:Kitty 图形协议内嵌图片
|
|
6
|
+
* - `system-open`:调系统 `open` / `xdg-open` / `cmd /c start` 打开图片
|
|
7
|
+
* - `manual`:都不可用时让用户手动打开(通常附 fallbackCommand 提示)
|
|
8
|
+
*/
|
|
2
9
|
export type TerminalImageDisplayMethod = "inline-iterm" | "inline-kitty" | "system-open" | "manual";
|
|
10
|
+
/**
|
|
11
|
+
* `displayTerminalImage()` 的返回:成功/失败 + 用的方法 + 提示消息。
|
|
12
|
+
* `displayed=false` 时调用方应回退到 `fallbackCommand` 提示用户。
|
|
13
|
+
*/
|
|
3
14
|
export interface TerminalImageDisplayResult {
|
|
15
|
+
/** 实际使用的展示方法 */
|
|
4
16
|
method: TerminalImageDisplayMethod;
|
|
17
|
+
/** 是否真的把图片写到终端/打开了 */
|
|
5
18
|
displayed: boolean;
|
|
19
|
+
/** 人类可读结果描述(给 init / doctor 用) */
|
|
6
20
|
message: string;
|
|
21
|
+
/** 仅在 `displayed=false` 时存在:建议用户手动执行的命令 */
|
|
7
22
|
fallbackCommand?: string;
|
|
8
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* `displayTerminalImage()` / `detectTerminalImageDisplay()` 的可注入依赖。
|
|
26
|
+
* 全部可选,缺省时使用真实 `process.env` / `process.platform` / `process.stdout`。
|
|
27
|
+
*/
|
|
9
28
|
export interface DisplayTerminalImageOptions {
|
|
29
|
+
/** 环境变量(默认 `process.env`) */
|
|
10
30
|
env?: TerminalEnv;
|
|
31
|
+
/** 平台(默认 `process.platform`) */
|
|
11
32
|
platform?: NodeJS.Platform;
|
|
33
|
+
/** stdout 是否为 TTY(默认 `process.stdout.isTTY`) */
|
|
12
34
|
stdoutIsTTY?: boolean;
|
|
35
|
+
/** 写入 escape sequence 的方法(默认 `process.stdout.write`) */
|
|
13
36
|
write?: (chunk: string) => void;
|
|
37
|
+
/** 调起子进程执行 system-open 命令的方法(默认 `child_process.spawn`) */
|
|
14
38
|
runCommand?: (command: string, args: string[]) => Promise<void>;
|
|
39
|
+
/** 文件存在性检查(默认 `fs.existsSync`) */
|
|
15
40
|
fileExists?: (filePath: string) => boolean;
|
|
41
|
+
/** 文件读取方法(默认 `fs.readFileSync`) */
|
|
16
42
|
readFile?: (filePath: string) => Buffer;
|
|
17
43
|
}
|
|
18
44
|
type InlineImageProtocol = "iterm" | "kitty";
|
|
45
|
+
/**
|
|
46
|
+
* 仅检测当前终端是否支持某种内嵌图片协议(Kitty / iTerm2)。
|
|
47
|
+
* 用于上层在展示前先决策"要不要走内嵌"而不直接写入任何输出。
|
|
48
|
+
*
|
|
49
|
+
* @param options 可注入依赖(env / platform / stdoutIsTTY)
|
|
50
|
+
* @returns 支持的内嵌协议;不支持时返回 `undefined`
|
|
51
|
+
*/
|
|
19
52
|
export declare function detectTerminalImageDisplay(options?: DisplayTerminalImageOptions): InlineImageProtocol | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* 把本地图片文件展示到终端:优先内嵌(Kitty / iTerm2),其次 system-open,最后 manual。
|
|
55
|
+
* 不会抛异常;任何错误都会转成 `TerminalImageDisplayResult { displayed: false }`。
|
|
56
|
+
*
|
|
57
|
+
* @param filePath 本地图片绝对路径
|
|
58
|
+
* @param options 可注入依赖
|
|
59
|
+
* @returns 展示结果(含 method / displayed / message / fallbackCommand)
|
|
60
|
+
*/
|
|
20
61
|
export declare function displayTerminalImage(filePath: string, options?: DisplayTerminalImageOptions): Promise<TerminalImageDisplayResult>;
|
|
21
62
|
export {};
|
|
22
63
|
//# sourceMappingURL=terminal-image.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-image.d.ts","sourceRoot":"","sources":["../../src/terminal-image.ts"],"names":[],"mappings":"AAIA,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAEhE,MAAM,MAAM,0BAA0B,GAClC,cAAc,GACd,cAAc,GACd,aAAa,GACb,QAAQ,CAAC;AAEb,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,0BAA0B,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED,KAAK,mBAAmB,GAAG,OAAO,GAAG,OAAO,CAAC;AA8E7C,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,GACxC,mBAAmB,GAAG,SAAS,CAKjC;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,0BAA0B,CAAC,CAmErC"}
|
|
1
|
+
{"version":3,"file":"terminal-image.d.ts","sourceRoot":"","sources":["../../src/terminal-image.ts"],"names":[],"mappings":"AAIA,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,MAAM,0BAA0B,GAClC,cAAc,GACd,cAAc,GACd,aAAa,GACb,QAAQ,CAAC;AAEb;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,gBAAgB;IAChB,MAAM,EAAE,0BAA0B,CAAC;IACnC,sBAAsB;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,6BAA6B;IAC7B,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,kCAAkC;IAClC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED,KAAK,mBAAmB,GAAG,OAAO,GAAG,OAAO,CAAC;AA8E7C;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,GACxC,mBAAmB,GAAG,SAAS,CAKjC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,0BAA0B,CAAC,CAmErC"}
|
|
@@ -65,9 +65,24 @@ function openCommandForPlatform(platform, filePath) {
|
|
|
65
65
|
}
|
|
66
66
|
return undefined;
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* 仅检测当前终端是否支持某种内嵌图片协议(Kitty / iTerm2)。
|
|
70
|
+
* 用于上层在展示前先决策"要不要走内嵌"而不直接写入任何输出。
|
|
71
|
+
*
|
|
72
|
+
* @param options 可注入依赖(env / platform / stdoutIsTTY)
|
|
73
|
+
* @returns 支持的内嵌协议;不支持时返回 `undefined`
|
|
74
|
+
*/
|
|
68
75
|
export function detectTerminalImageDisplay(options = {}) {
|
|
69
76
|
return terminalSupportsInlineImages(options.env || process.env, options.stdoutIsTTY ?? Boolean(process.stdout.isTTY));
|
|
70
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* 把本地图片文件展示到终端:优先内嵌(Kitty / iTerm2),其次 system-open,最后 manual。
|
|
80
|
+
* 不会抛异常;任何错误都会转成 `TerminalImageDisplayResult { displayed: false }`。
|
|
81
|
+
*
|
|
82
|
+
* @param filePath 本地图片绝对路径
|
|
83
|
+
* @param options 可注入依赖
|
|
84
|
+
* @returns 展示结果(含 method / displayed / message / fallbackCommand)
|
|
85
|
+
*/
|
|
71
86
|
export async function displayTerminalImage(filePath, options = {}) {
|
|
72
87
|
const fileExists = options.fileExists || fs.existsSync;
|
|
73
88
|
const readFile = options.readFile || fs.readFileSync;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-image.js","sourceRoot":"","sources":["../../src/terminal-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-image.js","sourceRoot":"","sources":["../../src/terminal-image.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/buyer-store.ts
CHANGED
|
@@ -8,6 +8,10 @@ import { createModuleLogger } from "@tokenbuddy/logging";
|
|
|
8
8
|
|
|
9
9
|
const logger = createModuleLogger("tb-proxyd");
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* buyer 端缓存的 seller access token + 余额快照。
|
|
13
|
+
* v1.2 PR-fix:每次取出都校验 `expiresAt`,避免把过期 token 发给 seller 导致 401。
|
|
14
|
+
*/
|
|
11
15
|
export interface CachedToken {
|
|
12
16
|
token: string;
|
|
13
17
|
balanceMicros: number;
|
|
@@ -23,6 +27,10 @@ export interface CachedToken {
|
|
|
23
27
|
expiresAt?: string;
|
|
24
28
|
}
|
|
25
29
|
|
|
30
|
+
/**
|
|
31
|
+
* 持久化的支付方式配置。
|
|
32
|
+
* `isDefault` 用于 `tb init` / 路由层在没有显式 method 时选默认。
|
|
33
|
+
*/
|
|
26
34
|
export interface PaymentConfig {
|
|
27
35
|
method: string;
|
|
28
36
|
enabled: boolean;
|
|
@@ -31,6 +39,9 @@ export interface PaymentConfig {
|
|
|
31
39
|
updatedAt: string;
|
|
32
40
|
}
|
|
33
41
|
|
|
42
|
+
/**
|
|
43
|
+
* 待结算的 purchase 快照(buyer 端在 `/purchase/create` 之后、`/purchase/complete` 之前的临时状态)。
|
|
44
|
+
*/
|
|
34
45
|
export interface PendingPurchaseInput {
|
|
35
46
|
purchaseId: string;
|
|
36
47
|
sellerKey: string;
|
|
@@ -42,6 +53,9 @@ export interface PendingPurchaseInput {
|
|
|
42
53
|
expiresAt?: string;
|
|
43
54
|
}
|
|
44
55
|
|
|
56
|
+
/**
|
|
57
|
+
* 完成态 purchase 的账本输入。`paymentReference` 会被 hash 之后落库(不存明文)。
|
|
58
|
+
*/
|
|
45
59
|
export interface PurchaseLedgerInput {
|
|
46
60
|
purchaseId: string;
|
|
47
61
|
sellerKey: string;
|
|
@@ -54,6 +68,10 @@ export interface PurchaseLedgerInput {
|
|
|
54
68
|
completedAt?: string;
|
|
55
69
|
}
|
|
56
70
|
|
|
71
|
+
/**
|
|
72
|
+
* `tb doctor` 与审计日志消费的"安全版" purchase 账本条目。
|
|
73
|
+
* 关键差异:`paymentReference` 已 hash 化为 `paymentReferenceHash`,永不暴露明文。
|
|
74
|
+
*/
|
|
57
75
|
export interface SafePurchaseLedgerEntry {
|
|
58
76
|
purchaseId: string;
|
|
59
77
|
sellerKey: string;
|
|
@@ -67,6 +85,10 @@ export interface SafePurchaseLedgerEntry {
|
|
|
67
85
|
completedAt?: string;
|
|
68
86
|
}
|
|
69
87
|
|
|
88
|
+
/**
|
|
89
|
+
* buyer 端单次推理请求的账本输入。
|
|
90
|
+
* `prompt` / `response` 在落库前会 hash,原始内容永不落盘。
|
|
91
|
+
*/
|
|
70
92
|
export interface InferenceLedgerInput {
|
|
71
93
|
requestId: string;
|
|
72
94
|
sellerKey: string;
|
|
@@ -86,6 +108,10 @@ export interface InferenceLedgerInput {
|
|
|
86
108
|
response?: string;
|
|
87
109
|
}
|
|
88
110
|
|
|
111
|
+
/**
|
|
112
|
+
* `tb doctor` 与审计日志消费的"安全版"推理账本条目。
|
|
113
|
+
* 关键差异:`prompt` / `response` 已 hash 化为 `promptHash` / `responseHash`。
|
|
114
|
+
*/
|
|
89
115
|
export interface SafeInferenceLedgerEntry {
|
|
90
116
|
requestId: string;
|
|
91
117
|
sellerKey: string;
|
|
@@ -106,6 +132,10 @@ export interface SafeInferenceLedgerEntry {
|
|
|
106
132
|
createdAt: string;
|
|
107
133
|
}
|
|
108
134
|
|
|
135
|
+
/**
|
|
136
|
+
* seller token 余额快照的入参。
|
|
137
|
+
* 每次推理后由 `BuyerStore.recordTokenBalance` 调用,作为路由决策的"最近一次真实余额"。
|
|
138
|
+
*/
|
|
109
139
|
export interface TokenBalanceSnapshotInput {
|
|
110
140
|
sellerKey: string;
|
|
111
141
|
token?: string;
|
|
@@ -117,6 +147,9 @@ export interface TokenBalanceSnapshotInput {
|
|
|
117
147
|
expiresAt?: string;
|
|
118
148
|
}
|
|
119
149
|
|
|
150
|
+
/**
|
|
151
|
+
* `BuyerStore.summary()` 的返回结构,用于 `tb doctor` 展示 DB 健康度。
|
|
152
|
+
*/
|
|
120
153
|
export interface BuyerStoreSummary {
|
|
121
154
|
journalMode: string;
|
|
122
155
|
paymentsCount: number;
|
|
@@ -127,6 +160,10 @@ export interface BuyerStoreSummary {
|
|
|
127
160
|
daemonRuntimeConfigCount: number;
|
|
128
161
|
}
|
|
129
162
|
|
|
163
|
+
/**
|
|
164
|
+
* `tb init` 时记录的 provider 安装快照(用于后续 `tb rollback`)。
|
|
165
|
+
* `existed` 标记安装前文件是否已存在,避免回滚覆盖用户原始内容。
|
|
166
|
+
*/
|
|
130
167
|
export interface ProviderInstallSnapshot {
|
|
131
168
|
providerId: string;
|
|
132
169
|
files: Array<{
|
|
@@ -136,6 +173,10 @@ export interface ProviderInstallSnapshot {
|
|
|
136
173
|
}>;
|
|
137
174
|
}
|
|
138
175
|
|
|
176
|
+
/**
|
|
177
|
+
* provider 维度运行时配置(由 `tb init` / `tb config` 写入)。
|
|
178
|
+
* 存的是各 provider(如 opencode / cline)需要的 model mapping 等。
|
|
179
|
+
*/
|
|
139
180
|
export interface ProviderRuntimeConfigRecord<T = unknown> {
|
|
140
181
|
providerId: string;
|
|
141
182
|
config: T;
|
|
@@ -143,6 +184,10 @@ export interface ProviderRuntimeConfigRecord<T = unknown> {
|
|
|
143
184
|
updatedAt: string;
|
|
144
185
|
}
|
|
145
186
|
|
|
187
|
+
/**
|
|
188
|
+
* 守护进程维度运行时配置(按 `configKey` 命名空间)。
|
|
189
|
+
* 比如 `seller_routing` / `prewarm` / `inference` 等 daemon 子系统的配置。
|
|
190
|
+
*/
|
|
146
191
|
export interface DaemonRuntimeConfigRecord<T = unknown> {
|
|
147
192
|
configKey: string;
|
|
148
193
|
config: T;
|
|
@@ -150,6 +195,10 @@ export interface DaemonRuntimeConfigRecord<T = unknown> {
|
|
|
150
195
|
updatedAt: string;
|
|
151
196
|
}
|
|
152
197
|
|
|
198
|
+
/**
|
|
199
|
+
* `BuyerStore` 构造选项。
|
|
200
|
+
* 优先用 `dbPath`(绝对路径),否则用 `root`(目录)+ 默认 `buyer-store.db`。
|
|
201
|
+
*/
|
|
153
202
|
export interface BuyerStoreOptions {
|
|
154
203
|
root?: string;
|
|
155
204
|
dbPath?: string;
|
|
@@ -177,6 +226,13 @@ function ensureDirForFile(filePath: string): void {
|
|
|
177
226
|
}
|
|
178
227
|
}
|
|
179
228
|
|
|
229
|
+
/**
|
|
230
|
+
* 解析 buyer store 的 DB 路径。
|
|
231
|
+
* 优先级:`dbPath` → `TOKENBUDDY_BUYER_STORE` env → `~/.tokenbuddy-store/buyer-store.db`。
|
|
232
|
+
*
|
|
233
|
+
* @param options 解析选项
|
|
234
|
+
* @returns DB 文件绝对路径
|
|
235
|
+
*/
|
|
180
236
|
export function resolveBuyerStorePath(options: BuyerStoreOptions = {}): string {
|
|
181
237
|
if (options.dbPath) {
|
|
182
238
|
return options.dbPath;
|
|
@@ -185,6 +241,11 @@ export function resolveBuyerStorePath(options: BuyerStoreOptions = {}): string {
|
|
|
185
241
|
return path.join(root, "buyer-store.db");
|
|
186
242
|
}
|
|
187
243
|
|
|
244
|
+
/**
|
|
245
|
+
* buyer 端 SQLite 持久化层。
|
|
246
|
+
* 维护:支付配置、pending purchase、purchase 账本、inference 账本、provider / daemon runtime config、token 余额快照。
|
|
247
|
+
* 内部用 SHA256 摘要替代明文敏感字段(prompt / response / paymentReference / token)。
|
|
248
|
+
*/
|
|
188
249
|
export class BuyerStore {
|
|
189
250
|
private db: DatabaseSync;
|
|
190
251
|
|