@harrylabsj/kiwi 0.8.0 → 0.10.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/README.md +1 -1
- package/dist/a2a/negotiate.d.ts +6 -2
- package/dist/a2a/negotiate.js +10 -3
- package/dist/a2a/negotiate.js.map +1 -1
- package/dist/a2a/node.d.ts +4 -1
- package/dist/a2a/node.js +56 -3
- package/dist/a2a/node.js.map +1 -1
- package/dist/a2a/server/merchant-handler.d.ts +11 -3
- package/dist/a2a/server/merchant-handler.js +84 -26
- package/dist/a2a/server/merchant-handler.js.map +1 -1
- package/dist/agent/buyer/buyer-tools.js +2 -2
- package/dist/agent/buyer/buyer-tools.js.map +1 -1
- package/dist/agent/kernel.js +5 -1
- package/dist/agent/kernel.js.map +1 -1
- package/dist/agent/memory/schema.d.ts +1 -1
- package/dist/agent/memory/schema.js +9 -1
- package/dist/agent/memory/schema.js.map +1 -1
- package/dist/agent/merchant/action-candidate.d.ts +18 -0
- package/dist/agent/merchant/action-candidate.js +51 -0
- package/dist/agent/merchant/action-candidate.js.map +1 -1
- package/dist/agent/merchant/fake-merchant-client.js +6 -1
- package/dist/agent/merchant/fake-merchant-client.js.map +1 -1
- package/dist/agent/merchant/intelligence/default-backend.js +25 -2
- package/dist/agent/merchant/intelligence/default-backend.js.map +1 -1
- package/dist/agent/merchant/merchant-client.d.ts +50 -1
- package/dist/agent/merchant/merchant-client.js +157 -8
- package/dist/agent/merchant/merchant-client.js.map +1 -1
- package/dist/agent/merchant/merchant-presentations.js +25 -2
- package/dist/agent/merchant/merchant-presentations.js.map +1 -1
- package/dist/agent/merchant/merchant-tools.js +102 -188
- package/dist/agent/merchant/merchant-tools.js.map +1 -1
- package/dist/agent/merchant/types.d.ts +6 -2
- package/dist/agent/merchant/types.js +45 -0
- package/dist/agent/merchant/types.js.map +1 -1
- package/dist/auth/merchant-authorization.d.ts +49 -0
- package/dist/auth/merchant-authorization.js +61 -0
- package/dist/auth/merchant-authorization.js.map +1 -0
- package/dist/auth/merchant-oauth.d.ts +255 -0
- package/dist/auth/merchant-oauth.js +764 -0
- package/dist/auth/merchant-oauth.js.map +1 -0
- package/dist/auth/merchant-pairing.d.ts +62 -0
- package/dist/auth/merchant-pairing.js +199 -0
- package/dist/auth/merchant-pairing.js.map +1 -0
- package/dist/auth/merchant-sessions.d.ts +71 -0
- package/dist/auth/merchant-sessions.js +168 -0
- package/dist/auth/merchant-sessions.js.map +1 -0
- package/dist/buyer-core/build-service.d.ts +5 -0
- package/dist/buyer-core/build-service.js +12 -0
- package/dist/buyer-core/build-service.js.map +1 -1
- package/dist/buyer-core/errors.d.ts +1 -1
- package/dist/buyer-core/errors.js +2 -0
- package/dist/buyer-core/errors.js.map +1 -1
- package/dist/buyer-core/merchant-index.d.ts +19 -4
- package/dist/buyer-core/merchant-index.js +137 -16
- package/dist/buyer-core/merchant-index.js.map +1 -1
- package/dist/buyer-core/negotiator.d.ts +0 -10
- package/dist/buyer-core/negotiator.js +12 -1
- package/dist/buyer-core/negotiator.js.map +1 -1
- package/dist/buyer-core/quote-fetcher.js +2 -1
- package/dist/buyer-core/quote-fetcher.js.map +1 -1
- package/dist/buyer-core/service.d.ts +104 -0
- package/dist/buyer-core/service.js +105 -1
- package/dist/buyer-core/service.js.map +1 -1
- package/dist/cli.d.ts +4 -2
- package/dist/cli.js +612 -20
- package/dist/cli.js.map +1 -1
- package/dist/config/profile.d.ts +30 -0
- package/dist/config/profile.js +126 -61
- package/dist/config/profile.js.map +1 -1
- package/dist/demo/demo-runner.js +12 -9
- package/dist/demo/demo-runner.js.map +1 -1
- package/dist/discovery/catalog-source/buyer-follows.d.ts +82 -0
- package/dist/discovery/catalog-source/buyer-follows.js +228 -0
- package/dist/discovery/catalog-source/buyer-follows.js.map +1 -0
- package/dist/discovery/catalog-source/connector-identity.d.ts +75 -0
- package/dist/discovery/catalog-source/connector-identity.js +175 -0
- package/dist/discovery/catalog-source/connector-identity.js.map +1 -0
- package/dist/discovery/catalog-source/errors.d.ts +1 -1
- package/dist/discovery/catalog-source/errors.js +2 -0
- package/dist/discovery/catalog-source/errors.js.map +1 -1
- package/dist/discovery/catalog-source/merchant-publications.d.ts +65 -0
- package/dist/discovery/catalog-source/merchant-publications.js +207 -0
- package/dist/discovery/catalog-source/merchant-publications.js.map +1 -0
- package/dist/discovery/catalog-source/register.d.ts +24 -0
- package/dist/discovery/catalog-source/register.js +46 -0
- package/dist/discovery/catalog-source/register.js.map +1 -1
- package/dist/discovery/catalog-source/source.js +2 -1
- package/dist/discovery/catalog-source/source.js.map +1 -1
- package/dist/fs/atomic-write.d.ts +18 -0
- package/dist/fs/atomic-write.js +29 -0
- package/dist/fs/atomic-write.js.map +1 -0
- package/dist/http/server.js +4 -1
- package/dist/http/server.js.map +1 -1
- package/dist/mcp/cli.d.ts +2 -0
- package/dist/mcp/cli.js +7 -6
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/merchant-auth.d.ts +78 -0
- package/dist/mcp/merchant-auth.js +146 -0
- package/dist/mcp/merchant-auth.js.map +1 -0
- package/dist/mcp/merchant-dirs.d.ts +26 -0
- package/dist/mcp/merchant-dirs.js +44 -0
- package/dist/mcp/merchant-dirs.js.map +1 -0
- package/dist/mcp/merchant-resources.d.ts +38 -0
- package/dist/mcp/merchant-resources.js +146 -0
- package/dist/mcp/merchant-resources.js.map +1 -0
- package/dist/mcp/merchant-server.d.ts +106 -0
- package/dist/mcp/merchant-server.js +615 -0
- package/dist/mcp/merchant-server.js.map +1 -0
- package/dist/mcp/merchant-tools.d.ts +103 -0
- package/dist/mcp/merchant-tools.js +517 -0
- package/dist/mcp/merchant-tools.js.map +1 -0
- package/dist/mcp/server.js +4 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +5 -3
- package/dist/mcp/tools.js +102 -5
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts +1 -1
- package/dist/mcp/types.js +4 -0
- package/dist/mcp/types.js.map +1 -1
- package/dist/merchant/ops.d.ts +0 -11
- package/dist/merchant/ops.js +13 -1
- package/dist/merchant/ops.js.map +1 -1
- package/dist/merchant/workbench-service.d.ts +189 -0
- package/dist/merchant/workbench-service.js +417 -0
- package/dist/merchant/workbench-service.js.map +1 -0
- package/dist/merchant-admin/pending-page.d.ts +35 -0
- package/dist/merchant-admin/pending-page.js +69 -0
- package/dist/merchant-admin/pending-page.js.map +1 -0
- package/dist/merchant-core/commands.d.ts +99 -0
- package/dist/merchant-core/commands.js +179 -0
- package/dist/merchant-core/commands.js.map +1 -0
- package/dist/merchant-core/executor.d.ts +69 -0
- package/dist/merchant-core/executor.js +218 -0
- package/dist/merchant-core/executor.js.map +1 -0
- package/dist/merchant-core/negotiation-adapters.d.ts +55 -0
- package/dist/merchant-core/negotiation-adapters.js +55 -0
- package/dist/merchant-core/negotiation-adapters.js.map +1 -0
- package/dist/merchant-core/network-checks.d.ts +65 -0
- package/dist/merchant-core/network-checks.js +111 -0
- package/dist/merchant-core/network-checks.js.map +1 -0
- package/dist/merchant-core/operations.d.ts +64 -0
- package/dist/merchant-core/operations.js +136 -0
- package/dist/merchant-core/operations.js.map +1 -0
- package/dist/merchant-core/policy-runtime.d.ts +70 -0
- package/dist/merchant-core/policy-runtime.js +181 -0
- package/dist/merchant-core/policy-runtime.js.map +1 -0
- package/dist/merchant-core/product-import.d.ts +67 -0
- package/dist/merchant-core/product-import.js +160 -0
- package/dist/merchant-core/product-import.js.map +1 -0
- package/dist/merchant-core/service.d.ts +203 -0
- package/dist/merchant-core/service.js +402 -0
- package/dist/merchant-core/service.js.map +1 -0
- package/dist/merchant-gateway/catalog-publications.d.ts +96 -0
- package/dist/merchant-gateway/catalog-publications.js +212 -0
- package/dist/merchant-gateway/catalog-publications.js.map +1 -0
- package/dist/merchant-gateway/catalog-tools.d.ts +46 -0
- package/dist/merchant-gateway/catalog-tools.js +315 -0
- package/dist/merchant-gateway/catalog-tools.js.map +1 -0
- package/dist/merchant-gateway/cli.d.ts +75 -0
- package/dist/merchant-gateway/cli.js +461 -0
- package/dist/merchant-gateway/cli.js.map +1 -0
- package/dist/merchant-gateway/credential-vault.d.ts +44 -0
- package/dist/merchant-gateway/credential-vault.js +111 -0
- package/dist/merchant-gateway/credential-vault.js.map +1 -0
- package/dist/merchant-gateway/entry-server.d.ts +117 -0
- package/dist/merchant-gateway/entry-server.js +747 -0
- package/dist/merchant-gateway/entry-server.js.map +1 -0
- package/dist/merchant-gateway/instance-registration.d.ts +144 -0
- package/dist/merchant-gateway/instance-registration.js +391 -0
- package/dist/merchant-gateway/instance-registration.js.map +1 -0
- package/dist/merchant-gateway/instance-tools.d.ts +58 -0
- package/dist/merchant-gateway/instance-tools.js +186 -0
- package/dist/merchant-gateway/instance-tools.js.map +1 -0
- package/dist/merchant-gateway/mcp-proxy.d.ts +25 -0
- package/dist/merchant-gateway/mcp-proxy.js +192 -0
- package/dist/merchant-gateway/mcp-proxy.js.map +1 -0
- package/dist/merchant-gateway/pinned-fetch.d.ts +54 -0
- package/dist/merchant-gateway/pinned-fetch.js +231 -0
- package/dist/merchant-gateway/pinned-fetch.js.map +1 -0
- package/dist/merchant-gateway/tenant-registry.d.ts +82 -0
- package/dist/merchant-gateway/tenant-registry.js +190 -0
- package/dist/merchant-gateway/tenant-registry.js.map +1 -0
- package/dist/merchant-gateway/tool-bundle.d.ts +26 -0
- package/dist/merchant-gateway/tool-bundle.js +56 -0
- package/dist/merchant-gateway/tool-bundle.js.map +1 -0
- package/dist/merchant-runtime/backup.d.ts +48 -0
- package/dist/merchant-runtime/backup.js +226 -0
- package/dist/merchant-runtime/backup.js.map +1 -0
- package/dist/merchant-runtime/health.d.ts +99 -0
- package/dist/merchant-runtime/health.js +206 -0
- package/dist/merchant-runtime/health.js.map +1 -0
- package/dist/merchant-runtime/jobs.d.ts +64 -0
- package/dist/merchant-runtime/jobs.js +107 -0
- package/dist/merchant-runtime/jobs.js.map +1 -0
- package/dist/merchant-runtime/manager.d.ts +94 -0
- package/dist/merchant-runtime/manager.js +305 -0
- package/dist/merchant-runtime/manager.js.map +1 -0
- package/dist/merchant-runtime/services.d.ts +30 -0
- package/dist/merchant-runtime/services.js +51 -0
- package/dist/merchant-runtime/services.js.map +1 -0
- package/dist/net/url.d.ts +26 -0
- package/dist/net/url.js +32 -0
- package/dist/net/url.js.map +1 -0
- package/dist/product-cli.js +22 -3
- package/dist/product-cli.js.map +1 -1
- package/dist/product-compat.d.ts +9 -1
- package/dist/product-compat.js +12 -1
- package/dist/product-compat.js.map +1 -1
- package/dist/product-init.js +17 -5
- package/dist/product-init.js.map +1 -1
- package/dist/product-publish.js +2 -1
- package/dist/product-publish.js.map +1 -1
- package/package.json +3 -2
- package/skills/kiwi-buyer/SKILL.md +2 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* 七类 merchant presentation 的 MCP Apps 资源映射(V2 阶段二)。
|
|
18
|
+
*
|
|
19
|
+
* V1 的 present_* 工具发内部 ui 事件(宿主不渲染等于丢失);本模块把同一套
|
|
20
|
+
* PresentationRegistry 组件映射为 MCP 资源:
|
|
21
|
+
* kiwi-merchant://presentation/<component>[?参数]
|
|
22
|
+
*
|
|
23
|
+
* 每个资源 read 返回两个 content:
|
|
24
|
+
* 1. application/json — 结构化 payload(经 sanitizePresentationValue 既有脱敏);
|
|
25
|
+
* 2. text/plain — 等效文本摘要(宿主不支持 MCP Apps 时的降级,不丢关键字段)。
|
|
26
|
+
*
|
|
27
|
+
* 私密类内容(阈值/成本/底价)没有任何对应资源——私密面板走管理面接缝
|
|
28
|
+
* (merchant-core readPrivateThresholds),不进工具结果与资源。
|
|
29
|
+
*/
|
|
30
|
+
import { createMerchantPresentationRegistry } from "../agent/merchant/merchant-presentations.js";
|
|
31
|
+
import { sanitizePresentationValue } from "../agent/presentation/sanitize.js";
|
|
32
|
+
export const MERCHANT_RESOURCE_PREFIX = "kiwi-merchant://presentation/";
|
|
33
|
+
/** 需要查询参数的资源(缺参数时 read 返回可读错误)。 */
|
|
34
|
+
const REQUIRED_QUERY = {
|
|
35
|
+
metrics: { param: "metric", hint: "?metric=<指标名>(如 contact_events)" },
|
|
36
|
+
change_preview: { param: "candidate_id", hint: "?candidate_id=<候选 id>" },
|
|
37
|
+
suggestions: { param: "items", hint: "?items=<建议1,建议2>(1–4 条,逗号分隔)" },
|
|
38
|
+
};
|
|
39
|
+
/** 等效文本摘要(降级路径;不丢关键字段:数量/金额/状态/时间)。 */
|
|
40
|
+
export function textSummary(component, payload) {
|
|
41
|
+
const p = (payload ?? {});
|
|
42
|
+
switch (component) {
|
|
43
|
+
case "merchant_digest": {
|
|
44
|
+
const snapshot = (p.snapshot ?? {});
|
|
45
|
+
const alerts = snapshot.alerts ?? {};
|
|
46
|
+
return [
|
|
47
|
+
`${String(p.title ?? "经营摘要")}:进行中磋商 ${alerts.active_negotiations ?? "?"},` +
|
|
48
|
+
`人工待处理 ${alerts.human_reviews ?? "?"},待审批 ${alerts.pending_actions ?? "?"},` +
|
|
49
|
+
`低库存 ${alerts.low_stock ?? "不可得"}`,
|
|
50
|
+
].join("");
|
|
51
|
+
}
|
|
52
|
+
case "metrics": {
|
|
53
|
+
const points = Array.isArray(p.points) ? p.points.length : 0;
|
|
54
|
+
return `指标 ${String(p.metric ?? "?")}:${points} 个数据点(${String(p.granularity ?? "day")} 粒度)`;
|
|
55
|
+
}
|
|
56
|
+
case "catalog": {
|
|
57
|
+
const products = Array.isArray(p.products) ? p.products.length : 0;
|
|
58
|
+
const health = (p.health ?? {});
|
|
59
|
+
return `商品目录:${products} 个商品(总数 ${health.total ?? "?"},缺货 ${health.out_of_stock ?? "不可得"})`;
|
|
60
|
+
}
|
|
61
|
+
case "negotiations": {
|
|
62
|
+
const rows = Array.isArray(p) ? p : [];
|
|
63
|
+
return `磋商列表:${rows.length} 笔`;
|
|
64
|
+
}
|
|
65
|
+
case "human_review": {
|
|
66
|
+
const reviews = Array.isArray(p.reviews) ? p.reviews.length : 0;
|
|
67
|
+
return `人工处理队列:${reviews} 项`;
|
|
68
|
+
}
|
|
69
|
+
case "change_preview": {
|
|
70
|
+
return `变更预览:${String(p.headline ?? "变更预览")}(candidate ${String(p.candidate_id ?? "?")};展示不批准不执行)`;
|
|
71
|
+
}
|
|
72
|
+
case "suggestions": {
|
|
73
|
+
const items = Array.isArray(p.suggestions) ? p.suggestions : [];
|
|
74
|
+
return `下一步建议:${items.join(";")}`;
|
|
75
|
+
}
|
|
76
|
+
default:
|
|
77
|
+
return JSON.stringify(payload);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function buildMerchantPresentationResources(deps) {
|
|
81
|
+
const registry = createMerchantPresentationRegistry();
|
|
82
|
+
const defs = registry.list().map((c) => ({
|
|
83
|
+
uri: `${MERCHANT_RESOURCE_PREFIX}${c.component}`,
|
|
84
|
+
name: c.component,
|
|
85
|
+
description: c.description,
|
|
86
|
+
mimeType: "application/json",
|
|
87
|
+
}));
|
|
88
|
+
const read = async (uri) => {
|
|
89
|
+
if (!uri.startsWith(MERCHANT_RESOURCE_PREFIX)) {
|
|
90
|
+
throw new Error(`未知资源 ${uri}(前缀 ${MERCHANT_RESOURCE_PREFIX})`);
|
|
91
|
+
}
|
|
92
|
+
const rest = uri.slice(MERCHANT_RESOURCE_PREFIX.length);
|
|
93
|
+
const qIndex = rest.indexOf("?");
|
|
94
|
+
const componentName = qIndex === -1 ? rest : rest.slice(0, qIndex);
|
|
95
|
+
const query = new URLSearchParams(qIndex === -1 ? "" : rest.slice(qIndex + 1));
|
|
96
|
+
const component = registry.list().find((c) => c.component === componentName);
|
|
97
|
+
if (component === undefined) {
|
|
98
|
+
throw new Error(`未知 presentation 资源 ${componentName}`);
|
|
99
|
+
}
|
|
100
|
+
// 参数化资源的必填查询参数
|
|
101
|
+
const required = REQUIRED_QUERY[componentName];
|
|
102
|
+
let input = {};
|
|
103
|
+
if (required !== undefined) {
|
|
104
|
+
const value = query.get(required.param);
|
|
105
|
+
if (value === null || value === "") {
|
|
106
|
+
throw new Error(`资源 ${componentName} 需要查询参数 ${required.hint}`);
|
|
107
|
+
}
|
|
108
|
+
input =
|
|
109
|
+
componentName === "suggestions"
|
|
110
|
+
? {
|
|
111
|
+
suggestions: value
|
|
112
|
+
.split(",")
|
|
113
|
+
.map((s) => s.trim())
|
|
114
|
+
.filter((s) => s !== ""),
|
|
115
|
+
}
|
|
116
|
+
: { [required.param]: value };
|
|
117
|
+
}
|
|
118
|
+
// 可选通用参数(period/granularity/limit/status/headline/note)
|
|
119
|
+
for (const key of ["period", "granularity", "status", "headline", "note"]) {
|
|
120
|
+
const v = query.get(key);
|
|
121
|
+
if (v !== null)
|
|
122
|
+
input[key] = v;
|
|
123
|
+
}
|
|
124
|
+
const limit = query.get("limit");
|
|
125
|
+
if (limit !== null && /^\d+$/.test(limit))
|
|
126
|
+
input.limit = Number(limit);
|
|
127
|
+
const validated = component.validate(input);
|
|
128
|
+
const payload = sanitizePresentationValue(await component.enrich(validated, deps.context));
|
|
129
|
+
return {
|
|
130
|
+
contents: [
|
|
131
|
+
{
|
|
132
|
+
uri,
|
|
133
|
+
mimeType: "application/json",
|
|
134
|
+
text: JSON.stringify(payload),
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
uri,
|
|
138
|
+
mimeType: "text/plain",
|
|
139
|
+
text: textSummary(componentName, payload),
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
return { list: () => defs, read };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=merchant-resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merchant-resources.js","sourceRoot":"","sources":["../../src/mcp/merchant-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,+BAA+B,CAAC;AAexE,mCAAmC;AACnC,MAAM,cAAc,GAAoD;IACtE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,iCAAiC,EAAE;IACrE,cAAc,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACxE,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,8BAA8B,EAAE;CACtE,CAAC;AAEF,uCAAuC;AACvC,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,OAAgB;IAC7D,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;IACrD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAA+C,CAAC;YAClF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACrC,OAAO;gBACL,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,MAAM,CAAC,mBAAmB,IAAI,GAAG,GAAG;oBACxE,SAAS,MAAM,CAAC,aAAa,IAAI,GAAG,QAAQ,MAAM,CAAC,eAAe,IAAI,GAAG,GAAG;oBAC5E,OAAO,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE;aACrC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,MAAM,SAAS,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;QAC9F,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAqD,CAAC;YACpF,OAAO,QAAQ,QAAQ,WAAW,MAAM,CAAC,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC,YAAY,IAAI,KAAK,GAAG,CAAC;QAC9F,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,OAAO,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC;QACjC,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,OAAO,UAAU,OAAO,IAAI,CAAC;QAC/B,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,OAAO,QAAQ,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,cAAc,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAC;QACrG,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,WAAwB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,CAAC;QACD;YACE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,IAAsC;IAIvF,MAAM,QAAQ,GAAG,kCAAkC,EAAE,CAAC;IACtD,MAAM,IAAI,GAA0B,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,GAAG,EAAE,GAAG,wBAAwB,GAAG,CAAC,CAAC,SAAS,EAAE;QAChD,IAAI,EAAE,CAAC,CAAC,SAAS;QACjB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,QAAQ,EAAE,kBAAkB;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAoD,EAAE;QACnF,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,OAAO,wBAAwB,GAAG,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC;QAC7E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,aAAa,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,eAAe;QACf,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,KAAK,GAA4B,EAAE,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,MAAM,aAAa,WAAW,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,KAAK;gBACH,aAAa,KAAK,aAAa;oBAC7B,CAAC,CAAC;wBACE,WAAW,EAAE,KAAK;6BACf,KAAK,CAAC,GAAG,CAAC;6BACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;6BACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;qBAC3B;oBACH,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QACD,wDAAwD;QACxD,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvE,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,yBAAyB,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3F,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG;oBACH,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;iBAC9B;gBACD;oBACE,GAAG;oBACH,QAAQ,EAAE,YAAY;oBACtB,IAAI,EAAE,WAAW,CAAC,aAAa,EAAE,OAAO,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
17
|
+
import type { MerchantWorkbenchSurface } from "../merchant/workbench-service.js";
|
|
18
|
+
import type { MerchantOAuthServer } from "../auth/merchant-oauth.js";
|
|
19
|
+
import type { MerchantMcpAuthVerifier } from "./merchant-auth.js";
|
|
20
|
+
import { type MerchantMcpCallResult, type MerchantMcpToolDefinition } from "./merchant-tools.js";
|
|
21
|
+
import type { buildMerchantPresentationResources } from "./merchant-resources.js";
|
|
22
|
+
import { type MerchantAdminSurface } from "../merchant-admin/pending-page.js";
|
|
23
|
+
import { type MerchantAdminSessions } from "../auth/merchant-sessions.js";
|
|
24
|
+
import type { MerchantOAuthStore } from "../auth/merchant-oauth.js";
|
|
25
|
+
/** 缺省监听地址(远程连接器形态;fail-closed 由 merchant-auth 守卫)。 */
|
|
26
|
+
export declare const DEFAULT_MERCHANT_MCP_HOST = "0.0.0.0";
|
|
27
|
+
/** 缺省端口(与 A2A 9000 分离)。 */
|
|
28
|
+
export declare const DEFAULT_MERCHANT_MCP_PORT = 9100;
|
|
29
|
+
/** 缺省 MCP endpoint 路径。 */
|
|
30
|
+
export declare const DEFAULT_MERCHANT_MCP_PATH = "/mcp";
|
|
31
|
+
export interface MerchantMcpServerOptions {
|
|
32
|
+
service: MerchantWorkbenchSurface;
|
|
33
|
+
host?: string;
|
|
34
|
+
port?: number;
|
|
35
|
+
path?: string;
|
|
36
|
+
/** 入站认证校验器;提供时所有请求必须携带有效 Bearer token。 */
|
|
37
|
+
auth?: MerchantMcpAuthVerifier;
|
|
38
|
+
/** OAuth 授权服务器(V2 阶段一):提供时挂载
|
|
39
|
+
* /.well-known/oauth-*、/oauth/register|authorize|token|revoke 端点。 */
|
|
40
|
+
oauth?: MerchantOAuthServer;
|
|
41
|
+
/** 七类 presentation 的 MCP 资源(V2 阶段二;提供时挂载 resources/list|read)。 */
|
|
42
|
+
presentations?: ReturnType<typeof buildMerchantPresentationResources>;
|
|
43
|
+
/** 配套商家确认页面(V2 阶段三;BUG-01/03 修复后:cookie 会话 + 一次性
|
|
44
|
+
* 确认凭证;write 面由会话主体逐次校验)。 */
|
|
45
|
+
admin?: {
|
|
46
|
+
merchantName: string;
|
|
47
|
+
surface: MerchantAdminSurface;
|
|
48
|
+
sessions: MerchantAdminSessions;
|
|
49
|
+
/** 一次性确认凭证存储(oauth.sqlite)。 */
|
|
50
|
+
store: MerchantOAuthStore;
|
|
51
|
+
/** 管理员凭据目录(admin-credentials.json)。 */
|
|
52
|
+
adminDir: string;
|
|
53
|
+
/** https 部署置 true(cookie 加 Secure)。 */
|
|
54
|
+
secureCookies?: boolean;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* 一次性配对码兑换(设计 §8.4 第二期):挂载 `POST /pairing/redeem`。
|
|
58
|
+
* 商家在实例机器上 `kiwi merchant mcp pair` 生成码,网关用它兑换内部凭据,
|
|
59
|
+
* 从而无需把长期令牌贴进表单。仅 token 模式(存在静态内部令牌)才有意义。
|
|
60
|
+
*/
|
|
61
|
+
pairing?: {
|
|
62
|
+
/**
|
|
63
|
+
* 配对码与配对凭据所在目录(通常为实例数据目录)。兑换时会**新签**一份
|
|
64
|
+
* 配对凭据(最小授权:由实例签发并持有,网关只拿到调用凭据;重配对即轮换)。
|
|
65
|
+
*/
|
|
66
|
+
dir: string;
|
|
67
|
+
/** 实例身份(回给网关留痕;不含任何凭据)。 */
|
|
68
|
+
instance: () => {
|
|
69
|
+
ownerId: string;
|
|
70
|
+
principalId: string;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
serverInfo?: {
|
|
74
|
+
name: string;
|
|
75
|
+
version: string;
|
|
76
|
+
};
|
|
77
|
+
/** 响应体大小上限(字符)。 */
|
|
78
|
+
maxChars?: number;
|
|
79
|
+
/** 单次工具调用超时(ms)。 */
|
|
80
|
+
requestTimeoutMs?: number;
|
|
81
|
+
}
|
|
82
|
+
export interface MerchantMcpServerHandle {
|
|
83
|
+
host: string;
|
|
84
|
+
port: number;
|
|
85
|
+
path: string;
|
|
86
|
+
url: string;
|
|
87
|
+
close: () => Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
/** 带 scope 的 MCP 工具束形状(merchant 工具与商家连接器目录工具共用)。 */
|
|
90
|
+
export interface ScopedMcpTools {
|
|
91
|
+
/** 允许异步(网关需要先向实例取工具清单);协议层会 await。 */
|
|
92
|
+
listTools(scopes: string[] | undefined): MerchantMcpToolDefinition[] | Promise<MerchantMcpToolDefinition[]>;
|
|
93
|
+
call(name: string, args: Record<string, unknown>, scopes: string[] | undefined): Promise<MerchantMcpCallResult>;
|
|
94
|
+
}
|
|
95
|
+
/** 每个请求独立的协议 Server(无状态模式),handlers 引用共享的工具分发器。
|
|
96
|
+
* scopes 来自本次请求的授权上下文(OAuth access_token);undefined = 静态
|
|
97
|
+
* token 过渡模式(全量 scope)。tools/list 按 scope 过滤,tools/call 逐次强制。 */
|
|
98
|
+
export declare function createProtocolServer(serverInfo: {
|
|
99
|
+
name: string;
|
|
100
|
+
version: string;
|
|
101
|
+
}, toolsBundle: ScopedMcpTools, scopes: string[] | undefined, presentations?: ReturnType<typeof buildMerchantPresentationResources>): Server;
|
|
102
|
+
/**
|
|
103
|
+
* 启动 Merchant MCP Server(streamable HTTP,无状态)。
|
|
104
|
+
* 返回 handle 含实际 host/port(port 传 0 时取 ephemeral 端口)与优雅关闭。
|
|
105
|
+
*/
|
|
106
|
+
export declare function startMerchantMcpServer(options: MerchantMcpServerOptions): Promise<MerchantMcpServerHandle>;
|