@dsh-ft/dsh-fft-ftshare 0.0.0-stage → 0.4.0
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/LICENSE +21 -0
- package/README.md +82 -2
- package/catalog.json +9762 -0
- package/catalog.meta.json +7 -0
- package/catalog.txt +250 -0
- package/cordis.patch.yml +27 -0
- package/lib/capabilities.d.ts +47 -0
- package/lib/capabilities.d.ts.map +1 -0
- package/lib/capabilities.js +145 -0
- package/lib/capabilities.js.map +1 -0
- package/lib/catalog-host.d.ts +19 -0
- package/lib/catalog-host.d.ts.map +1 -0
- package/lib/catalog-host.js +31 -0
- package/lib/catalog-host.js.map +1 -0
- package/lib/catalog.d.ts +51 -0
- package/lib/catalog.d.ts.map +1 -0
- package/lib/catalog.js +60 -0
- package/lib/catalog.js.map +1 -0
- package/lib/client.d.ts +55 -0
- package/lib/client.d.ts.map +1 -0
- package/lib/client.js +184 -0
- package/lib/client.js.map +1 -0
- package/lib/contract.d.ts +143 -0
- package/lib/contract.d.ts.map +1 -0
- package/lib/contract.js +26 -0
- package/lib/contract.js.map +1 -0
- package/lib/errors.d.ts +87 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +271 -0
- package/lib/errors.js.map +1 -0
- package/lib/index.d.ts +89 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +271 -0
- package/lib/index.js.map +1 -0
- package/lib/mask.d.ts +66 -0
- package/lib/mask.d.ts.map +1 -0
- package/lib/mask.js +106 -0
- package/lib/mask.js.map +1 -0
- package/lib/project.d.ts +101 -0
- package/lib/project.d.ts.map +1 -0
- package/lib/project.js +335 -0
- package/lib/project.js.map +1 -0
- package/lib/route.d.ts +48 -0
- package/lib/route.d.ts.map +1 -0
- package/lib/route.js +90 -0
- package/lib/route.js.map +1 -0
- package/lib/status.d.ts +103 -0
- package/lib/status.d.ts.map +1 -0
- package/lib/status.js +134 -0
- package/lib/status.js.map +1 -0
- package/lib/tools.d.ts +38 -0
- package/lib/tools.d.ts.map +1 -0
- package/lib/tools.js +178 -0
- package/lib/tools.js.map +1 -0
- package/lib/transport.d.ts +65 -0
- package/lib/transport.d.ts.map +1 -0
- package/lib/transport.js +161 -0
- package/lib/transport.js.map +1 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +93 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
package/lib/route.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 宿主助手:把 `ctx.ftshareData` 挂到跨平面路由上(**消费方自己挂**)。
|
|
3
|
+
*
|
|
4
|
+
* 底座不声明 `dsh.client` —— 它不是客户端面,只发布两段实现。需要浏览器取数的消费方
|
|
5
|
+
* 自己挂这一行:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* ctx.inject(['connection', 'ftshareData'], scope =>
|
|
9
|
+
* scope.effect(() => registerFtshareRoute(scope.ctx, scope.ftshareData), 'ftshare: /api route'))
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* 路由是 `connection.fetch` 的**精确**路由,复用 `/api` 载体的 Host/Origin 围栏与
|
|
13
|
+
* 浏览器鉴权。契约(设计 §5.1):
|
|
14
|
+
*
|
|
15
|
+
* - **原样过桥**:成功就是一份 `FtshareCallResult`,`notice` 与 `upgradeUrl` 一起带,
|
|
16
|
+
* 面板才能把「没权限」渲染成「去升级」而不是「没有数据」;
|
|
17
|
+
* - **接口名校验**:只接受目录里的接口名,否则 400 —— 底座不能变成任意上游的穿透代理;
|
|
18
|
+
* - **取消与超时**:`request.signal` 原样转给 `call({ signal })`,面板的连点与切标的
|
|
19
|
+
* 因此能真的取消掉在途请求。
|
|
20
|
+
* @module @dsh-ft/dsh-fft-ftshare/route
|
|
21
|
+
*/
|
|
22
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
23
|
+
import { type FtshareDataService } from './contract.js';
|
|
24
|
+
/** 交给 `connection.fetch.register` 的精确路由定义。 */
|
|
25
|
+
export interface FtshareRoute {
|
|
26
|
+
/** 精确路径,不接受通配。 */
|
|
27
|
+
readonly path: string;
|
|
28
|
+
/** 允许的方法。 */
|
|
29
|
+
readonly methods: readonly string[];
|
|
30
|
+
/** 载体预读请求体的方式。 */
|
|
31
|
+
readonly requestBody: 'buffered';
|
|
32
|
+
/** 处理一次请求。 */
|
|
33
|
+
readonly fetch: (request: Request) => Promise<Response>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 造一条只回答 `/api/ftshare-data` 的路由定义(纯函数,便于测试)。
|
|
37
|
+
* @param data - 宿主侧的 `ctx.ftshareData`。
|
|
38
|
+
* @returns 路由定义。
|
|
39
|
+
*/
|
|
40
|
+
export declare function createFtshareRoute(data: FtshareDataService): FtshareRoute;
|
|
41
|
+
/**
|
|
42
|
+
* 注册路由;调用方自己决定挂在哪一层(返回值就是载体的 disposer)。
|
|
43
|
+
* @param ctx - 已经 inject 到 `connection` 的上下文。
|
|
44
|
+
* @param data - 宿主侧的 `ctx.ftshareData`。
|
|
45
|
+
* @returns 载体的注销函数,交给 `ctx.effect` 管。
|
|
46
|
+
*/
|
|
47
|
+
export declare function registerFtshareRoute(ctx: Context, data: FtshareDataService): () => Promise<void>;
|
|
48
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAG3E,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,kBAAkB;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,aAAa;IACb,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,kBAAkB;IAClB,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAA;IAChC,cAAc;IACd,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;CACxD;AAOD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAoBzE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAKhG"}
|
package/lib/route.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 宿主助手:把 `ctx.ftshareData` 挂到跨平面路由上(**消费方自己挂**)。
|
|
3
|
+
*
|
|
4
|
+
* 底座不声明 `dsh.client` —— 它不是客户端面,只发布两段实现。需要浏览器取数的消费方
|
|
5
|
+
* 自己挂这一行:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* ctx.inject(['connection', 'ftshareData'], scope =>
|
|
9
|
+
* scope.effect(() => registerFtshareRoute(scope.ctx, scope.ftshareData), 'ftshare: /api route'))
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* 路由是 `connection.fetch` 的**精确**路由,复用 `/api` 载体的 Host/Origin 围栏与
|
|
13
|
+
* 浏览器鉴权。契约(设计 §5.1):
|
|
14
|
+
*
|
|
15
|
+
* - **原样过桥**:成功就是一份 `FtshareCallResult`,`notice` 与 `upgradeUrl` 一起带,
|
|
16
|
+
* 面板才能把「没权限」渲染成「去升级」而不是「没有数据」;
|
|
17
|
+
* - **接口名校验**:只接受目录里的接口名,否则 400 —— 底座不能变成任意上游的穿透代理;
|
|
18
|
+
* - **取消与超时**:`request.signal` 原样转给 `call({ signal })`,面板的连点与切标的
|
|
19
|
+
* 因此能真的取消掉在途请求。
|
|
20
|
+
* @module @dsh-ft/dsh-fft-ftshare/route
|
|
21
|
+
*/
|
|
22
|
+
import { catalogEntryOf, missingRequiredArgs } from './catalog.js';
|
|
23
|
+
import { loadCatalog } from './catalog-host.js';
|
|
24
|
+
import { FTSHARE_DATA_ROUTE } from './contract.js';
|
|
25
|
+
import { isRecord } from './errors.js';
|
|
26
|
+
/**
|
|
27
|
+
* 造一条只回答 `/api/ftshare-data` 的路由定义(纯函数,便于测试)。
|
|
28
|
+
* @param data - 宿主侧的 `ctx.ftshareData`。
|
|
29
|
+
* @returns 路由定义。
|
|
30
|
+
*/
|
|
31
|
+
export function createFtshareRoute(data) {
|
|
32
|
+
return {
|
|
33
|
+
path: FTSHARE_DATA_ROUTE,
|
|
34
|
+
methods: ['POST'],
|
|
35
|
+
requestBody: 'buffered',
|
|
36
|
+
async fetch(request) {
|
|
37
|
+
const body = await readJsonBody(request);
|
|
38
|
+
if (body === undefined)
|
|
39
|
+
return errorResponse(400, 'bad_request', '请求体不是合法的 JSON 对象');
|
|
40
|
+
const name = typeof body.interface === 'string' ? body.interface.trim() : '';
|
|
41
|
+
const args = isRecord(body.args) ? body.args : undefined;
|
|
42
|
+
if (name === '')
|
|
43
|
+
return errorResponse(400, 'bad_request', '缺少 interface');
|
|
44
|
+
const entry = catalogEntryOf(loadCatalog(), name);
|
|
45
|
+
if (entry === undefined)
|
|
46
|
+
return errorResponse(400, 'unknown_interface', `接口 ${name} 不在目录里,不能直调`);
|
|
47
|
+
const missing = missingRequiredArgs(entry, args);
|
|
48
|
+
if (missing.length > 0)
|
|
49
|
+
return errorResponse(400, 'missing_arguments', `缺必填入参:${missing.join('、')}`);
|
|
50
|
+
const result = await data.call(name, args ?? {}, { signal: request.signal });
|
|
51
|
+
// 四态**原样**过桥:这里不翻译、不裁字段,面板与宿主看到同一份东西。
|
|
52
|
+
return json(200, result);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 注册路由;调用方自己决定挂在哪一层(返回值就是载体的 disposer)。
|
|
58
|
+
* @param ctx - 已经 inject 到 `connection` 的上下文。
|
|
59
|
+
* @param data - 宿主侧的 `ctx.ftshareData`。
|
|
60
|
+
* @returns 载体的注销函数,交给 `ctx.effect` 管。
|
|
61
|
+
*/
|
|
62
|
+
export function registerFtshareRoute(ctx, data) {
|
|
63
|
+
const connection = ctx.get('connection');
|
|
64
|
+
const fetch = connection?.fetch;
|
|
65
|
+
if (fetch === undefined)
|
|
66
|
+
throw new Error('registerFtshareRoute 需要 connection.fetch:先把 connection inject 进来');
|
|
67
|
+
return fetch.register(createFtshareRoute(data));
|
|
68
|
+
}
|
|
69
|
+
/** 读一个 JSON 对象请求体;非法或非对象时 undefined。 */
|
|
70
|
+
async function readJsonBody(request) {
|
|
71
|
+
try {
|
|
72
|
+
const parsed = await request.json();
|
|
73
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** 错误信封:客户端按 `error.code` / `error.message` 渲染成 `failed`。 */
|
|
80
|
+
function errorResponse(status, code, message) {
|
|
81
|
+
return json(status, { error: { code, message } });
|
|
82
|
+
}
|
|
83
|
+
/** JSON 应答。 */
|
|
84
|
+
function json(status, payload) {
|
|
85
|
+
return new Response(JSON.stringify(payload), {
|
|
86
|
+
status,
|
|
87
|
+
headers: { 'content-type': 'application/json' },
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=route.js.map
|
package/lib/route.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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"}
|
package/lib/status.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 失败现场与目录漂移的进程内聚合(`ftshare_status` 的数据源)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么在内存里:日志是给导出用的长文本,模型问「为什么取不到」时没有便宜的读法;
|
|
5
|
+
* 一个按指纹聚合的环形账本能把「同一个 429 打了几千次、首次/末次是什么、原文是什么」
|
|
6
|
+
* 一次答完。它只记事实,不做归因,也不主动联网。
|
|
7
|
+
* @module @dsh-ft/dsh-fft-ftshare/status
|
|
8
|
+
*/
|
|
9
|
+
import type { FtshareToolInfo } from './contract.js';
|
|
10
|
+
/** 一个失败指纹的聚合记录。 */
|
|
11
|
+
export interface FailureRecord {
|
|
12
|
+
fingerprint: string;
|
|
13
|
+
/** 最近一次失败的接口名。 */
|
|
14
|
+
tool: string;
|
|
15
|
+
state: 'denied' | 'failed';
|
|
16
|
+
code?: string;
|
|
17
|
+
status?: number;
|
|
18
|
+
/** 最近一次的上游原文/事实说明。 */
|
|
19
|
+
message: string;
|
|
20
|
+
/** 命中次数。 */
|
|
21
|
+
count: number;
|
|
22
|
+
/** 首次出现时间(ISO)。 */
|
|
23
|
+
firstAt: string;
|
|
24
|
+
/** 最近一次出现时间(ISO)。 */
|
|
25
|
+
lastAt: string;
|
|
26
|
+
/** 最近一次耗时。 */
|
|
27
|
+
lastDurationMs: number;
|
|
28
|
+
}
|
|
29
|
+
/** 记一条失败所需的输入。 */
|
|
30
|
+
export interface FailureInput {
|
|
31
|
+
fingerprint: string;
|
|
32
|
+
tool: string;
|
|
33
|
+
state: 'denied' | 'failed';
|
|
34
|
+
code?: string;
|
|
35
|
+
status?: number;
|
|
36
|
+
message: string;
|
|
37
|
+
durationMs: number;
|
|
38
|
+
/** 事件时间;默认当前时间。 */
|
|
39
|
+
at?: Date;
|
|
40
|
+
}
|
|
41
|
+
/** 目录漂移的观测结果:随包快照 vs 上游实时清单。 */
|
|
42
|
+
export interface CatalogObservation {
|
|
43
|
+
/** 随包目录条目数。 */
|
|
44
|
+
shippedCount: number;
|
|
45
|
+
/** 随包目录的规范化哈希。 */
|
|
46
|
+
shippedHash: string;
|
|
47
|
+
/** 上游实时清单条目数;还没拉过时为 undefined。 */
|
|
48
|
+
liveCount?: number;
|
|
49
|
+
/** 上游实时清单的规范化哈希。 */
|
|
50
|
+
liveHash?: string;
|
|
51
|
+
/** 是否与随包快照不一致。 */
|
|
52
|
+
changed?: boolean;
|
|
53
|
+
/** 最近一次检查时间(ISO)。 */
|
|
54
|
+
checkedAt?: string;
|
|
55
|
+
}
|
|
56
|
+
/** `ftshare_status` 的快照。 */
|
|
57
|
+
export interface StatusSnapshot {
|
|
58
|
+
/** 失败指纹,按次数从多到少。 */
|
|
59
|
+
failures: FailureRecord[];
|
|
60
|
+
/** 目录漂移观测。 */
|
|
61
|
+
catalog: CatalogObservation;
|
|
62
|
+
/** 进程启动以来记录到的失败总次数。 */
|
|
63
|
+
totalFailures: number;
|
|
64
|
+
/** 账本创建时间(ISO)。 */
|
|
65
|
+
since: string;
|
|
66
|
+
}
|
|
67
|
+
/** 失败账本:服务写、状态工具读;测试可以 new 一个隔离实例。 */
|
|
68
|
+
export interface FailureStore {
|
|
69
|
+
/**
|
|
70
|
+
* 记一次失败。
|
|
71
|
+
* @param input - 失败事实。
|
|
72
|
+
* @returns 聚合后的记录与「是否首次出现」。
|
|
73
|
+
*/
|
|
74
|
+
recordFailure(input: FailureInput): {
|
|
75
|
+
record: FailureRecord;
|
|
76
|
+
isNew: boolean;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* 记一次目录检查。
|
|
80
|
+
* @param live - 上游实时清单。
|
|
81
|
+
*/
|
|
82
|
+
recordCatalog(live: readonly FtshareToolInfo[]): void;
|
|
83
|
+
/** 读快照(拷贝,调用方改不到账本)。 */
|
|
84
|
+
snapshot(): StatusSnapshot;
|
|
85
|
+
/** 清空账本(测试用)。 */
|
|
86
|
+
clear(): void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 随包目录的规范化摘要。
|
|
90
|
+
* @returns 条目数与哈希。
|
|
91
|
+
*/
|
|
92
|
+
export declare function shippedCatalogSummary(): {
|
|
93
|
+
count: number;
|
|
94
|
+
hash: string;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* 造一个失败账本。
|
|
98
|
+
* @returns 空账本。
|
|
99
|
+
*/
|
|
100
|
+
export declare function createFailureStore(): FailureStore;
|
|
101
|
+
/** 进程级账本:服务写、`ftshare_status` 读。 */
|
|
102
|
+
export declare const statusStore: FailureStore;
|
|
103
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AASpD,mBAAmB;AACnB,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc;IACd,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,kBAAkB;AAClB,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,EAAE,CAAC,EAAE,IAAI,CAAA;CACV;AAED,gCAAgC;AAChC,MAAM,WAAW,kBAAkB;IACjC,eAAe;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kBAAkB;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,cAAc;IACd,OAAO,EAAE,kBAAkB,CAAA;IAC3B,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;IAC7E;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI,CAAA;IACrD,wBAAwB;IACxB,QAAQ,IAAI,cAAc,CAAA;IAC1B,iBAAiB;IACjB,KAAK,IAAI,IAAI,CAAA;CACd;AA0BD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMvE;AAQD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CA4EjD;AAED,oCAAoC;AACpC,eAAO,MAAM,WAAW,EAAE,YAAmC,CAAA"}
|
package/lib/status.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 失败现场与目录漂移的进程内聚合(`ftshare_status` 的数据源)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么在内存里:日志是给导出用的长文本,模型问「为什么取不到」时没有便宜的读法;
|
|
5
|
+
* 一个按指纹聚合的环形账本能把「同一个 429 打了几千次、首次/末次是什么、原文是什么」
|
|
6
|
+
* 一次答完。它只记事实,不做归因,也不主动联网。
|
|
7
|
+
* @module @dsh-ft/dsh-fft-ftshare/status
|
|
8
|
+
*/
|
|
9
|
+
import { loadCatalog } from './catalog-host.js';
|
|
10
|
+
import { hashText } from './errors.js';
|
|
11
|
+
/** 最多保留的失败指纹数;超出按最后出现时间淘汰。 */
|
|
12
|
+
const MAX_FAILURES = 50;
|
|
13
|
+
/** 存进账本的原文上限;完整原文在日志与当次工具结果里。 */
|
|
14
|
+
const MESSAGE_MAX = 500;
|
|
15
|
+
/** 按字段名排序的稳定序列化,用于目录哈希。 */
|
|
16
|
+
function stableStringify(value) {
|
|
17
|
+
if (Array.isArray(value))
|
|
18
|
+
return `[${value.map(item => stableStringify(item)).join(',')}]`;
|
|
19
|
+
if (value !== null && typeof value === 'object') {
|
|
20
|
+
const record = value;
|
|
21
|
+
const keys = Object.keys(record).filter(key => record[key] !== undefined).sort();
|
|
22
|
+
return `{${keys.map(key => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(',')}}`;
|
|
23
|
+
}
|
|
24
|
+
return JSON.stringify(value ?? null);
|
|
25
|
+
}
|
|
26
|
+
/** 一条目录/清单条目的规范化文本;两侧用同一个形状才能直接比哈希。 */
|
|
27
|
+
function canonicalLine(entry) {
|
|
28
|
+
return stableStringify({
|
|
29
|
+
name: entry.name,
|
|
30
|
+
title: entry.title,
|
|
31
|
+
description: entry.description ?? '',
|
|
32
|
+
inputSchema: entry.inputSchema ?? null,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** 随包目录的条目数与哈希(懒算一次)。 */
|
|
36
|
+
let shippedCatalog;
|
|
37
|
+
/**
|
|
38
|
+
* 随包目录的规范化摘要。
|
|
39
|
+
* @returns 条目数与哈希。
|
|
40
|
+
*/
|
|
41
|
+
export function shippedCatalogSummary() {
|
|
42
|
+
if (shippedCatalog !== undefined)
|
|
43
|
+
return shippedCatalog;
|
|
44
|
+
const entries = loadCatalog().entries;
|
|
45
|
+
const hash = hashText(entries.map(entry => canonicalLine(entry)).sort().join('\n'));
|
|
46
|
+
shippedCatalog = { count: entries.length, hash };
|
|
47
|
+
return shippedCatalog;
|
|
48
|
+
}
|
|
49
|
+
/** 随包目录的初始观测(还没拉上游清单)。 */
|
|
50
|
+
function shippedObservation() {
|
|
51
|
+
const shipped = shippedCatalogSummary();
|
|
52
|
+
return { shippedCount: shipped.count, shippedHash: shipped.hash };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 造一个失败账本。
|
|
56
|
+
* @returns 空账本。
|
|
57
|
+
*/
|
|
58
|
+
export function createFailureStore() {
|
|
59
|
+
const failures = new Map();
|
|
60
|
+
const since = new Date().toISOString();
|
|
61
|
+
let total = 0;
|
|
62
|
+
let catalog = shippedObservation();
|
|
63
|
+
const evict = () => {
|
|
64
|
+
if (failures.size <= MAX_FAILURES)
|
|
65
|
+
return;
|
|
66
|
+
const oldest = [...failures.values()].sort((left, right) => left.lastAt.localeCompare(right.lastAt))[0];
|
|
67
|
+
if (oldest !== undefined)
|
|
68
|
+
failures.delete(oldest.fingerprint);
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
recordFailure(input) {
|
|
72
|
+
const at = (input.at ?? new Date()).toISOString();
|
|
73
|
+
const existing = failures.get(input.fingerprint);
|
|
74
|
+
total += 1;
|
|
75
|
+
if (existing === undefined) {
|
|
76
|
+
const record = {
|
|
77
|
+
fingerprint: input.fingerprint,
|
|
78
|
+
tool: input.tool,
|
|
79
|
+
state: input.state,
|
|
80
|
+
...input.code !== undefined ? { code: input.code } : {},
|
|
81
|
+
...input.status !== undefined ? { status: input.status } : {},
|
|
82
|
+
message: input.message.slice(0, MESSAGE_MAX),
|
|
83
|
+
count: 1,
|
|
84
|
+
firstAt: at,
|
|
85
|
+
lastAt: at,
|
|
86
|
+
lastDurationMs: input.durationMs,
|
|
87
|
+
};
|
|
88
|
+
failures.set(input.fingerprint, record);
|
|
89
|
+
evict();
|
|
90
|
+
return { record: { ...record }, isNew: true };
|
|
91
|
+
}
|
|
92
|
+
existing.tool = input.tool;
|
|
93
|
+
existing.state = input.state;
|
|
94
|
+
existing.code = input.code;
|
|
95
|
+
existing.status = input.status;
|
|
96
|
+
existing.message = input.message.slice(0, MESSAGE_MAX);
|
|
97
|
+
existing.count += 1;
|
|
98
|
+
existing.lastAt = at;
|
|
99
|
+
existing.lastDurationMs = input.durationMs;
|
|
100
|
+
return { record: { ...existing }, isNew: false };
|
|
101
|
+
},
|
|
102
|
+
recordCatalog(live) {
|
|
103
|
+
const hash = hashText(live.map(tool => canonicalLine({
|
|
104
|
+
name: tool.tool,
|
|
105
|
+
title: tool.title,
|
|
106
|
+
...tool.description !== undefined ? { description: tool.description } : {},
|
|
107
|
+
...tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {},
|
|
108
|
+
})).sort().join('\n'));
|
|
109
|
+
catalog = {
|
|
110
|
+
...shippedObservation(),
|
|
111
|
+
liveCount: live.length,
|
|
112
|
+
liveHash: hash,
|
|
113
|
+
changed: hash !== catalog.shippedHash,
|
|
114
|
+
checkedAt: new Date().toISOString(),
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
snapshot() {
|
|
118
|
+
return {
|
|
119
|
+
failures: [...failures.values()].sort((left, right) => right.count - left.count).map(record => ({ ...record })),
|
|
120
|
+
catalog: { ...catalog },
|
|
121
|
+
totalFailures: total,
|
|
122
|
+
since,
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
clear() {
|
|
126
|
+
failures.clear();
|
|
127
|
+
total = 0;
|
|
128
|
+
catalog = shippedObservation();
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** 进程级账本:服务写、`ftshare_status` 读。 */
|
|
133
|
+
export const statusStore = createFailureStore();
|
|
134
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
package/lib/tools.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* preset 平面:把接口表里带 `expose` 的条目注册成 `ctx.tools` 里的 `ftshare_*` 工具,
|
|
3
|
+
* 外加一个长尾入口 `ftshare_call` 与一个失败现场入口 `ftshare_status`。
|
|
4
|
+
*
|
|
5
|
+
* 由 preset 行以子路径名 `@dsh-ft/dsh-fft-ftshare/tools` 挂载,因此这些工具只存在于
|
|
6
|
+
* 所选 preset 的 agent 作用域内(标准模式下不存在)。取数走全局平面提供的
|
|
7
|
+
* `ctx.ftshareData`,本平面不开连接、不碰凭据;`ftshare_status` 只读进程内账本,
|
|
8
|
+
* 不联网。
|
|
9
|
+
*
|
|
10
|
+
* 每个工具都把 {@link FtshareCallResult} 的四态结局原样印进正文:`denied` 说
|
|
11
|
+
* 「无权访问」,`empty` 才说「没有记录」。这是 P8 的教训——两种结局不能长得一样。
|
|
12
|
+
* @module @dsh-ft/dsh-fft-ftshare/tools
|
|
13
|
+
*/
|
|
14
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
15
|
+
import { type Capability } from './capabilities.js';
|
|
16
|
+
export * from './capabilities.js';
|
|
17
|
+
export * from './catalog.js';
|
|
18
|
+
/** Cordis 插件名。 */
|
|
19
|
+
export declare const name = "@dsh-ft/dsh-fft-ftshare/tools";
|
|
20
|
+
/** 注册工具要 `tools`,取数要全局 plane 的 `ftshareData`。 */
|
|
21
|
+
export declare const inject: string[];
|
|
22
|
+
/** 接口表里要下发给模型的那部分(其余条目只供本仓程序调用)。 */
|
|
23
|
+
export declare const FTSHARE_EXPOSED_CAPABILITIES: readonly Capability[];
|
|
24
|
+
/** 长尾接口的通用直调工具名。 */
|
|
25
|
+
export declare const FTSHARE_CALL_TOOL = "ftshare_call";
|
|
26
|
+
/** 失败现场查询工具名。 */
|
|
27
|
+
export declare const FTSHARE_STATUS_TOOL = "ftshare_status";
|
|
28
|
+
/**
|
|
29
|
+
* 注册接口表里每一个暴露条目,外加通用直调与失败现场查询。
|
|
30
|
+
* @param ctx - preset 子树的上下文。
|
|
31
|
+
*/
|
|
32
|
+
export declare function apply(ctx: Context): void;
|
|
33
|
+
/**
|
|
34
|
+
* 渲染失败账本。
|
|
35
|
+
* @returns 模型可见文本。
|
|
36
|
+
*/
|
|
37
|
+
export declare function renderStatus(): string;
|
|
38
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAOzE,cAAc,mBAAmB,CAAA;AACjC,cAAc,cAAc,CAAA;AAE5B,kBAAkB;AAClB,eAAO,MAAM,IAAI,kCAAkC,CAAA;AAEnD,iDAAiD;AACjD,eAAO,MAAM,MAAM,UAA2B,CAAA;AAwB9C,oCAAoC;AACpC,eAAO,MAAM,4BAA4B,EAAE,SAAS,UAAU,EACI,CAAA;AAElE,oBAAoB;AACpB,eAAO,MAAM,iBAAiB,iBAAiB,CAAA;AAE/C,iBAAiB;AACjB,eAAO,MAAM,mBAAmB,mBAAmB,CAAA;AAEnD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAIxC;AAuFD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAwBrC"}
|
package/lib/tools.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* preset 平面:把接口表里带 `expose` 的条目注册成 `ctx.tools` 里的 `ftshare_*` 工具,
|
|
3
|
+
* 外加一个长尾入口 `ftshare_call` 与一个失败现场入口 `ftshare_status`。
|
|
4
|
+
*
|
|
5
|
+
* 由 preset 行以子路径名 `@dsh-ft/dsh-fft-ftshare/tools` 挂载,因此这些工具只存在于
|
|
6
|
+
* 所选 preset 的 agent 作用域内(标准模式下不存在)。取数走全局平面提供的
|
|
7
|
+
* `ctx.ftshareData`,本平面不开连接、不碰凭据;`ftshare_status` 只读进程内账本,
|
|
8
|
+
* 不联网。
|
|
9
|
+
*
|
|
10
|
+
* 每个工具都把 {@link FtshareCallResult} 的四态结局原样印进正文:`denied` 说
|
|
11
|
+
* 「无权访问」,`empty` 才说「没有记录」。这是 P8 的教训——两种结局不能长得一样。
|
|
12
|
+
* @module @dsh-ft/dsh-fft-ftshare/tools
|
|
13
|
+
*/
|
|
14
|
+
import { defineTool } from '@deepseek-ai/dsh-tools';
|
|
15
|
+
import { FTSHARE_CAPABILITIES } from './capabilities.js';
|
|
16
|
+
import { catalogEntryOf, missingRequiredArgs } from './catalog.js';
|
|
17
|
+
import { FTSHARE_CATALOG_INDEX_PATH, loadCatalog } from './catalog-host.js';
|
|
18
|
+
import { isRecord } from './errors.js';
|
|
19
|
+
import { renderCallResult } from './project.js';
|
|
20
|
+
import { statusStore } from './status.js';
|
|
21
|
+
export * from './capabilities.js';
|
|
22
|
+
export * from './catalog.js';
|
|
23
|
+
/** Cordis 插件名。 */
|
|
24
|
+
export const name = '@dsh-ft/dsh-fft-ftshare/tools';
|
|
25
|
+
/** 注册工具要 `tools`,取数要全局 plane 的 `ftshareData`。 */
|
|
26
|
+
export const inject = ['tools', 'ftshareData'];
|
|
27
|
+
/**
|
|
28
|
+
* 工具的规范化输出:渲染好的正文加四态结局。
|
|
29
|
+
*
|
|
30
|
+
* 结局单独留一个字段,是为了让 `presentResult` 之类的消费者将来能按状态取样式,
|
|
31
|
+
* 而不必再解析正文。
|
|
32
|
+
*/
|
|
33
|
+
const outputSchema = {
|
|
34
|
+
type: 'object',
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
properties: {
|
|
37
|
+
tool: { type: 'string' },
|
|
38
|
+
state: { type: 'string' },
|
|
39
|
+
text: { type: 'string' },
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
/** 所有 `ftshare_*` 工具共用的输出:正文加四态结局。 */
|
|
43
|
+
const toolOutput = {
|
|
44
|
+
schema: outputSchema,
|
|
45
|
+
render: (_args, value) => [{ type: 'text', text: value.text ?? '' }],
|
|
46
|
+
};
|
|
47
|
+
/** 接口表里要下发给模型的那部分(其余条目只供本仓程序调用)。 */
|
|
48
|
+
export const FTSHARE_EXPOSED_CAPABILITIES = FTSHARE_CAPABILITIES.filter(entry => entry.expose !== undefined);
|
|
49
|
+
/** 长尾接口的通用直调工具名。 */
|
|
50
|
+
export const FTSHARE_CALL_TOOL = 'ftshare_call';
|
|
51
|
+
/** 失败现场查询工具名。 */
|
|
52
|
+
export const FTSHARE_STATUS_TOOL = 'ftshare_status';
|
|
53
|
+
/**
|
|
54
|
+
* 注册接口表里每一个暴露条目,外加通用直调与失败现场查询。
|
|
55
|
+
* @param ctx - preset 子树的上下文。
|
|
56
|
+
*/
|
|
57
|
+
export function apply(ctx) {
|
|
58
|
+
for (const entry of FTSHARE_EXPOSED_CAPABILITIES)
|
|
59
|
+
register(ctx, entry);
|
|
60
|
+
registerCatalogTool(ctx);
|
|
61
|
+
registerStatusTool(ctx);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 注册单个接口表条目。
|
|
65
|
+
* @param ctx - preset 子树的上下文。
|
|
66
|
+
* @param entry - 带 `expose` 的接口表条目。
|
|
67
|
+
*/
|
|
68
|
+
function register(ctx, entry) {
|
|
69
|
+
const exposed = entry.expose;
|
|
70
|
+
if (exposed === undefined)
|
|
71
|
+
return;
|
|
72
|
+
ctx.tools.register(defineTool({
|
|
73
|
+
name: exposed.name,
|
|
74
|
+
description: `${entry.title}。${exposed.description}`,
|
|
75
|
+
parameters: entry.args,
|
|
76
|
+
output: toolOutput,
|
|
77
|
+
async execute(args, exec) {
|
|
78
|
+
const result = await ctx.ftshareData.call(entry.interface, (args ?? {}), { signal: exec.signal });
|
|
79
|
+
return { tool: entry.interface, state: result.state, text: renderCallResult(entry.title, entry.interface, result) };
|
|
80
|
+
},
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 注册通用直调:`ftshare_call(interface, args)`。
|
|
85
|
+
*
|
|
86
|
+
* 它是长尾接口的唯一入口——一个工具定义换掉 250 份 schema。三种结局各有各的话:
|
|
87
|
+
* 名字不在目录(给出索引文件路径,让模型去 `grep`,而不是猜第二个名字)、套餐无权
|
|
88
|
+
* (由 {@link renderCallResult} 带上升级入口)、上游原文(由 notice 直传)。
|
|
89
|
+
* @param ctx - preset 子树的上下文。
|
|
90
|
+
*/
|
|
91
|
+
function registerCatalogTool(ctx) {
|
|
92
|
+
ctx.tools.register(defineTool({
|
|
93
|
+
name: FTSHARE_CALL_TOOL,
|
|
94
|
+
description: `直调 FTShare 目录里的任意接口。不要猜接口名:先在 ${FTSHARE_CATALOG_INDEX_PATH} 里 grep `
|
|
95
|
+
+ '(一行一个接口,格式 `接口名 | 标题 | 入参名`,带 * 的是必填),目录之外的名字会被拒绝。',
|
|
96
|
+
parameters: {
|
|
97
|
+
interface: { type: 'string', description: '上游接口名,必须来自目录索引', required: true },
|
|
98
|
+
args: { type: 'object', additionalProperties: true, description: '接口入参;必填项见目录索引里带 * 的名字' },
|
|
99
|
+
},
|
|
100
|
+
output: toolOutput,
|
|
101
|
+
async execute(args, exec) {
|
|
102
|
+
const call = isRecord(args) ? args : {};
|
|
103
|
+
const interfaceName = typeof call.interface === 'string' ? call.interface.trim() : '';
|
|
104
|
+
const callArgs = isRecord(call.args) ? call.args : {};
|
|
105
|
+
const entry = catalogEntryOf(loadCatalog(), interfaceName);
|
|
106
|
+
if (entry === undefined) {
|
|
107
|
+
return {
|
|
108
|
+
tool: interfaceName,
|
|
109
|
+
state: 'failed',
|
|
110
|
+
text: `目录里没有接口 ${interfaceName === '' ? '(未给名字)' : interfaceName},不能直调。`
|
|
111
|
+
+ `先在 ${FTSHARE_CATALOG_INDEX_PATH} 里 grep 一下:一行一个接口,格式「接口名 | 标题 | 入参名」。`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const missing = missingRequiredArgs(entry, callArgs);
|
|
115
|
+
if (missing.length > 0) {
|
|
116
|
+
return {
|
|
117
|
+
tool: entry.name,
|
|
118
|
+
state: 'failed',
|
|
119
|
+
text: `缺必填入参:${missing.join('、')}。${entry.name} 的必填项见目录索引里带 * 的名字。`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const result = await ctx.ftshareData.call(entry.name, callArgs, { signal: exec.signal });
|
|
123
|
+
return { tool: entry.name, state: result.state, text: renderCallResult(entry.title, entry.name, result) };
|
|
124
|
+
},
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 注册失败现场查询:只读进程内账本,不联网。
|
|
129
|
+
*
|
|
130
|
+
* 用户问「为什么取不到」时,模型需要的是「同一个失败打了几次、首末时间、原文」,
|
|
131
|
+
* 而不是再打一次上游。
|
|
132
|
+
* @param ctx - preset 子树的上下文。
|
|
133
|
+
*/
|
|
134
|
+
function registerStatusTool(ctx) {
|
|
135
|
+
ctx.tools.register(defineTool({
|
|
136
|
+
name: FTSHARE_STATUS_TOOL,
|
|
137
|
+
description: '查看 FTShare 最近的失败聚合(指纹、次数、首末时间、上游原文)与目录漂移;不联网、不消耗配额。',
|
|
138
|
+
parameters: {},
|
|
139
|
+
output: toolOutput,
|
|
140
|
+
async execute() {
|
|
141
|
+
return { tool: FTSHARE_STATUS_TOOL, state: 'available', text: renderStatus() };
|
|
142
|
+
},
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 渲染失败账本。
|
|
147
|
+
* @returns 模型可见文本。
|
|
148
|
+
*/
|
|
149
|
+
export function renderStatus() {
|
|
150
|
+
const snapshot = statusStore.snapshot();
|
|
151
|
+
const lines = [`FTShare 失败聚合(进程内,自 ${snapshot.since} 起共 ${snapshot.totalFailures} 次)`];
|
|
152
|
+
if (snapshot.failures.length === 0) {
|
|
153
|
+
lines.push('暂无失败记录。');
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
const shown = snapshot.failures.slice(0, 10);
|
|
157
|
+
for (const [index, record] of shown.entries()) {
|
|
158
|
+
const facts = [`×${record.count}`, record.state, record.tool];
|
|
159
|
+
if (record.code !== undefined)
|
|
160
|
+
facts.push(`码 ${record.code}`);
|
|
161
|
+
if (record.status !== undefined)
|
|
162
|
+
facts.push(`HTTP ${record.status}`);
|
|
163
|
+
lines.push(`${index + 1}. ${facts.join(' · ')}`);
|
|
164
|
+
lines.push(` 首次 ${record.firstAt} · 末次 ${record.lastAt} · 最近耗时 ${record.lastDurationMs} ms`);
|
|
165
|
+
lines.push(` 指纹 ${record.fingerprint}`);
|
|
166
|
+
lines.push(` 原文 ${record.message}`);
|
|
167
|
+
}
|
|
168
|
+
if (snapshot.failures.length > shown.length)
|
|
169
|
+
lines.push(`(共 ${snapshot.failures.length} 个指纹,只列前 ${shown.length} 个)`);
|
|
170
|
+
}
|
|
171
|
+
const catalog = snapshot.catalog;
|
|
172
|
+
const live = catalog.liveCount === undefined
|
|
173
|
+
? '上游清单未拉取'
|
|
174
|
+
: `上游 ${catalog.liveCount} 条(${catalog.liveHash})${catalog.changed === true ? ',与随包不一致' : ',与随包一致'}`;
|
|
175
|
+
lines.push(`目录:随包 ${catalog.shippedCount} 条(${catalog.shippedHash});${live}`);
|
|
176
|
+
return lines.join('\n');
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=tools.js.map
|