@harrylabsj/kiwi 0.7.22 → 0.9.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 +45 -10
- 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 +57 -4
- 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 +17 -10
- package/dist/agent/buyer/buyer-tools.js.map +1 -1
- package/dist/agent/buyer/scheduler.d.ts +1 -0
- package/dist/agent/buyer/scheduler.js +5 -1
- package/dist/agent/buyer/scheduler.js.map +1 -1
- package/dist/agent/buyer/task-store.js +5 -2
- package/dist/agent/buyer/task-store.js.map +1 -1
- package/dist/agent/chat-tools.js +10 -3
- package/dist/agent/chat-tools.js.map +1 -1
- package/dist/agent/context/fencing.d.ts +27 -0
- package/dist/agent/context/fencing.js +126 -0
- package/dist/agent/context/fencing.js.map +1 -0
- package/dist/agent/context/grounding.d.ts +18 -0
- package/dist/agent/context/grounding.js +22 -0
- package/dist/agent/context/grounding.js.map +1 -0
- package/dist/agent/host/events.d.ts +31 -0
- package/dist/agent/host/events.js +62 -0
- package/dist/agent/host/events.js.map +1 -0
- package/dist/agent/host/tui-renderer.d.ts +17 -0
- package/dist/agent/host/tui-renderer.js +125 -0
- package/dist/agent/host/tui-renderer.js.map +1 -0
- package/dist/agent/host/web-renderer.d.ts +71 -0
- package/dist/agent/host/web-renderer.js +185 -0
- package/dist/agent/host/web-renderer.js.map +1 -0
- package/dist/agent/kernel-builder.d.ts +3 -1
- package/dist/agent/kernel-builder.js +4 -1
- package/dist/agent/kernel-builder.js.map +1 -1
- package/dist/agent/kernel.d.ts +20 -1
- package/dist/agent/kernel.js +255 -14
- 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/backend.d.ts +40 -0
- package/dist/agent/merchant/intelligence/backend.js +2 -0
- package/dist/agent/merchant/intelligence/backend.js.map +1 -0
- package/dist/agent/merchant/intelligence/default-backend.d.ts +38 -0
- package/dist/agent/merchant/intelligence/default-backend.js +477 -0
- package/dist/agent/merchant/intelligence/default-backend.js.map +1 -0
- package/dist/agent/merchant/intelligence/http-analytics-source.d.ts +55 -0
- package/dist/agent/merchant/intelligence/http-analytics-source.js +193 -0
- package/dist/agent/merchant/intelligence/http-analytics-source.js.map +1 -0
- package/dist/agent/merchant/intelligence/types.d.ts +109 -0
- package/dist/agent/merchant/intelligence/types.js +2 -0
- package/dist/agent/merchant/intelligence/types.js.map +1 -0
- 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-enrichment.d.ts +10 -0
- package/dist/agent/merchant/merchant-enrichment.js +38 -0
- package/dist/agent/merchant/merchant-enrichment.js.map +1 -0
- package/dist/agent/merchant/merchant-grounding.d.ts +5 -0
- package/dist/agent/merchant/merchant-grounding.js +76 -0
- package/dist/agent/merchant/merchant-grounding.js.map +1 -0
- package/dist/agent/merchant/merchant-presentations.d.ts +8 -0
- package/dist/agent/merchant/merchant-presentations.js +207 -0
- package/dist/agent/merchant/merchant-presentations.js.map +1 -0
- package/dist/agent/merchant/merchant-tools.d.ts +8 -0
- package/dist/agent/merchant/merchant-tools.js +291 -178
- 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/agent/presentation/registry.d.ts +14 -0
- package/dist/agent/presentation/registry.js +24 -0
- package/dist/agent/presentation/registry.js.map +1 -0
- package/dist/agent/presentation/runner.d.ts +11 -0
- package/dist/agent/presentation/runner.js +17 -0
- package/dist/agent/presentation/runner.js.map +1 -0
- package/dist/agent/presentation/sanitize.d.ts +16 -0
- package/dist/agent/presentation/sanitize.js +37 -0
- package/dist/agent/presentation/sanitize.js.map +1 -0
- package/dist/agent/presentation/types.d.ts +28 -0
- package/dist/agent/presentation/types.js +8 -0
- package/dist/agent/presentation/types.js.map +1 -0
- package/dist/agent/session.d.ts +1 -1
- package/dist/agent/session.js +2 -2
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/skills/registry.d.ts +11 -0
- package/dist/agent/skills/registry.js +119 -0
- package/dist/agent/skills/registry.js.map +1 -0
- package/dist/agent/skills/tools.d.ts +6 -0
- package/dist/agent/skills/tools.js +36 -0
- package/dist/agent/skills/tools.js.map +1 -0
- package/dist/agent/skills/types.d.ts +9 -0
- package/dist/agent/skills/types.js +2 -0
- package/dist/agent/skills/types.js.map +1 -0
- package/dist/agent/supplier/scheduler.d.ts +2 -0
- package/dist/agent/supplier/scheduler.js +101 -22
- package/dist/agent/supplier/scheduler.js.map +1 -1
- package/dist/agent/supplier/store.d.ts +2 -0
- package/dist/agent/supplier/store.js +44 -0
- package/dist/agent/supplier/store.js.map +1 -1
- package/dist/agent/system-prompt.d.ts +5 -1
- package/dist/agent/system-prompt.js +20 -3
- package/dist/agent/system-prompt.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 +644 -32
- package/dist/cli.js.map +1 -1
- package/dist/config/profile.d.ts +51 -0
- package/dist/config/profile.js +185 -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/kiwi-record.d.ts +2 -0
- package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-source.js +2 -0
- package/dist/discovery/catalog-source/kiwi-source.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/handoff/authorization.js +1 -1
- package/dist/http/merchant-server.d.ts +65 -0
- package/dist/http/merchant-server.js +346 -0
- package/dist/http/merchant-server.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/stats-store.d.ts +7 -0
- package/dist/merchant/stats-store.js +11 -0
- package/dist/merchant/stats-store.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 +71 -0
- package/dist/merchant-gateway/catalog-publications.js +175 -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 +277 -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 +458 -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 +710 -0
- package/dist/merchant-gateway/entry-server.js.map +1 -0
- package/dist/merchant-gateway/instance-registration.d.ts +143 -0
- package/dist/merchant-gateway/instance-registration.js +382 -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 +184 -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 +52 -0
- package/dist/merchant-gateway/pinned-fetch.js +212 -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/negotiation/action-candidate.js +1 -1
- 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/operator/types.d.ts +1 -1
- package/dist/product-cli.d.ts +2 -2
- package/dist/product-cli.js +27 -6
- 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/dist/product-supplier.d.ts +73 -0
- package/dist/product-supplier.js +224 -5
- package/dist/product-supplier.js.map +1 -1
- package/dist/runtime/fake-model.d.ts +1 -1
- package/dist/trust/identity/jwk.d.ts +11 -0
- package/dist/trust/identity/jwk.js +2 -0
- package/dist/trust/identity/jwk.js.map +1 -0
- package/dist/trust/identity/jws.d.ts +2 -1
- package/dist/trust/identity/jws.js.map +1 -1
- package/dist/trust/identity/keys.d.ts +2 -1
- package/dist/trust/identity/keys.js.map +1 -1
- package/dist/trust/identity/message-signature.d.ts +1 -14
- package/dist/trust/identity/message-signature.js.map +1 -1
- package/dist/weixin/channel.d.ts +3 -0
- package/dist/weixin/channel.js +18 -2
- package/dist/weixin/channel.js.map +1 -1
- package/examples/profiles/merchant.deepseek.yaml +6 -0
- package/examples/profiles/merchant.fake.yaml +6 -0
- package/examples/profiles/merchant.local.yaml +6 -0
- package/package.json +9 -7
- package/skills/kiwi-buyer/SKILL.md +68 -0
- package/skills/merchant/catalog-operations/SKILL.md +17 -0
- package/skills/merchant/change-approval/SKILL.md +16 -0
- package/skills/merchant/human-review/SKILL.md +17 -0
- package/skills/merchant/inventory-operations/SKILL.md +17 -0
- package/skills/merchant/negotiation-review/SKILL.md +18 -0
- package/skills/merchant/performance-insights/SKILL.md +19 -0
- package/contracts/candidate-agent-dto-1.0.README.md +0 -43
- package/contracts/conformance/python-service/README.md +0 -19
|
@@ -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 MCP Server 入站认证(WorkBuddy Buddy 应用开发计划 阶段二)。
|
|
18
|
+
*
|
|
19
|
+
* 兼容「用户自填 Token」模式:静态 Bearer token,恒定时间比较。
|
|
20
|
+
* 正式 WorkBuddy 连接器使用 OAuth;此校验器保留给显式 token 过渡包。
|
|
21
|
+
* 校验器接口(MerchantMcpAuthVerifier)让两种方案共用 server 传输层。
|
|
22
|
+
*
|
|
23
|
+
* Token 来源与 A2A 一致的安全惯例:profile 只存环境变量名
|
|
24
|
+
* (merchant_mcp.token_env,缺省 KIWI_MERCHANT_MCP_TOKEN),secret 值绝不写
|
|
25
|
+
* profile / 日志 / 返回值。
|
|
26
|
+
*
|
|
27
|
+
* fail-closed(对齐 A2A 公网广告形态的守卫语义):
|
|
28
|
+
* - 监听非 loopback 地址且未配置校验器 → 拒绝启动;
|
|
29
|
+
* - loopback 监听且未配置校验器 → 允许启动,但返回警告文案(调用方打 stderr)。
|
|
30
|
+
*/
|
|
31
|
+
import { timingSafeEqual } from "node:crypto";
|
|
32
|
+
import { matchesPairedCredential } from "../auth/merchant-pairing.js";
|
|
33
|
+
import { isLoopbackHost } from "../a2a/client/url-policy.js";
|
|
34
|
+
/** 缺省 token 环境变量名(profile merchant_mcp.token_env 可覆盖)。 */
|
|
35
|
+
export const DEFAULT_MERCHANT_MCP_TOKEN_ENV = "KIWI_MERCHANT_MCP_TOKEN";
|
|
36
|
+
/** 常量时间 token 比较:长度恒等预检 + timingSafeEqual(与
|
|
37
|
+
* a2a/server/auth.ts tokenEquals、agent/memory/vault.ts fingerprintEquals
|
|
38
|
+
* 同一模式——逐字节短路会构成时序侧信道)。 */
|
|
39
|
+
function bearerTokenEquals(presented, expected) {
|
|
40
|
+
const a = Buffer.from(presented, "utf8");
|
|
41
|
+
const b = Buffer.from(expected, "utf8");
|
|
42
|
+
return a.length === b.length && timingSafeEqual(a, b);
|
|
43
|
+
}
|
|
44
|
+
/** 静态 Bearer token 校验(`Authorization: Bearer <token>`)。 */
|
|
45
|
+
export class StaticBearerTokenVerifier {
|
|
46
|
+
name = "static-bearer";
|
|
47
|
+
token;
|
|
48
|
+
constructor(token) {
|
|
49
|
+
if (token.length === 0) {
|
|
50
|
+
throw new Error("StaticBearerTokenVerifier requires a non-empty token");
|
|
51
|
+
}
|
|
52
|
+
this.token = token;
|
|
53
|
+
}
|
|
54
|
+
verify(ctx) {
|
|
55
|
+
const header = ctx.authorizationHeader;
|
|
56
|
+
if (header === undefined || header === "") {
|
|
57
|
+
return { ok: false, reason: "missing Authorization header" };
|
|
58
|
+
}
|
|
59
|
+
const match = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
60
|
+
if (match === null) {
|
|
61
|
+
return { ok: false, reason: "Authorization header is not a bearer token" };
|
|
62
|
+
}
|
|
63
|
+
if (!bearerTokenEquals(match[1] ?? "", this.token)) {
|
|
64
|
+
return { ok: false, reason: "invalid bearer token" };
|
|
65
|
+
}
|
|
66
|
+
return { ok: true };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 配对凭据校验器(设计 §8.4 第二期,最小授权):接受由**本实例**签发、
|
|
71
|
+
* 网关持有的那份凭据(`paired-credential.json`,只存摘要,逐请求恒定时间比较)。
|
|
72
|
+
* 与静态令牌并存——静态令牌是运维自己的入口,配对凭据是可随时轮换的那份。
|
|
73
|
+
*/
|
|
74
|
+
export class PairedCredentialVerifier {
|
|
75
|
+
dir;
|
|
76
|
+
name = "paired-credential";
|
|
77
|
+
constructor(dir) {
|
|
78
|
+
this.dir = dir;
|
|
79
|
+
}
|
|
80
|
+
verify(ctx) {
|
|
81
|
+
const header = ctx.authorizationHeader;
|
|
82
|
+
if (header === undefined || header === "") {
|
|
83
|
+
return { ok: false, reason: "missing Authorization header" };
|
|
84
|
+
}
|
|
85
|
+
const match = /^Bearer\s+(.+)$/i.exec(header.trim());
|
|
86
|
+
if (match === null) {
|
|
87
|
+
return { ok: false, reason: "Authorization header is not a bearer token" };
|
|
88
|
+
}
|
|
89
|
+
if (!matchesPairedCredential(this.dir, match[1] ?? "")) {
|
|
90
|
+
return { ok: false, reason: "invalid paired credential" };
|
|
91
|
+
}
|
|
92
|
+
// 与静态令牌同语义:不带 scope(undefined = 全量),工具级门禁由网关侧
|
|
93
|
+
// 按**用户 OAuth 令牌**的 scope 逐次执行(mcp-proxy),实例不重复判定。
|
|
94
|
+
return { ok: true };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 组合校验器:任一子校验器通过即通过(静态令牌 + 配对凭据并存)。
|
|
99
|
+
* 全部失败时返回最后一个原因,不回显任何凭据内容。
|
|
100
|
+
*/
|
|
101
|
+
export class CompositeMerchantMcpVerifier {
|
|
102
|
+
verifiers;
|
|
103
|
+
name = "composite";
|
|
104
|
+
constructor(verifiers) {
|
|
105
|
+
this.verifiers = verifiers;
|
|
106
|
+
}
|
|
107
|
+
verify(ctx) {
|
|
108
|
+
let last = { ok: false, reason: "no verifier configured" };
|
|
109
|
+
for (const verifier of this.verifiers) {
|
|
110
|
+
const result = verifier.verify(ctx);
|
|
111
|
+
if (result.ok)
|
|
112
|
+
return result;
|
|
113
|
+
last = result;
|
|
114
|
+
}
|
|
115
|
+
return last;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 从环境变量解析 Bearer 校验器。tokenEnv 缺省 DEFAULT_MERCHANT_MCP_TOKEN_ENV;
|
|
120
|
+
* 环境变量未设置或为空 → undefined(由 fail-closed 判定决定是否允许启动)。
|
|
121
|
+
*/
|
|
122
|
+
export function resolveMerchantMcpVerifier(tokenEnv, env = process.env) {
|
|
123
|
+
const envName = tokenEnv ?? DEFAULT_MERCHANT_MCP_TOKEN_ENV;
|
|
124
|
+
const token = (env[envName] ?? "").trim();
|
|
125
|
+
if (token === "")
|
|
126
|
+
return undefined;
|
|
127
|
+
return new StaticBearerTokenVerifier(token);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 启动前 fail-closed 判定。
|
|
131
|
+
* - 非 loopback host + 无校验器 → 抛错(拒绝启动);
|
|
132
|
+
* - loopback host + 无校验器 → 返回警告文案(允许启动,调用方打 stderr);
|
|
133
|
+
* - 有校验器 → undefined(无警告)。
|
|
134
|
+
*/
|
|
135
|
+
export function assertMerchantMcpAuthPolicy(host, verifier) {
|
|
136
|
+
if (verifier !== undefined)
|
|
137
|
+
return undefined;
|
|
138
|
+
if (!isLoopbackHost(host)) {
|
|
139
|
+
throw new Error(`merchant MCP server 监听非 loopback 地址(${host})但未配置认证 token,` +
|
|
140
|
+
`fail-closed 拒绝启动:请设置 ${DEFAULT_MERCHANT_MCP_TOKEN_ENV} 环境变量` +
|
|
141
|
+
"(或 profile merchant_mcp.token_env 指向的环境变量),或改用 127.0.0.1 监听。");
|
|
142
|
+
}
|
|
143
|
+
return (`⚠️ [kiwi] merchant MCP server 未配置认证 token(${DEFAULT_MERCHANT_MCP_TOKEN_ENV}),` +
|
|
144
|
+
`仅接受 ${host} 上的本地连接;公网暴露前务必配置 Bearer token。`);
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=merchant-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merchant-auth.js","sourceRoot":"","sources":["../../src/mcp/merchant-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
export declare const STATELESS_TRANSPORT_SESSION_ID = "stateless";
|
|
18
|
+
export interface MerchantMcpRuntimeDirs {
|
|
19
|
+
merchantDataDir: string;
|
|
20
|
+
principalDataDir: string;
|
|
21
|
+
transportSessionId: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function resolveMerchantMcpDirs(options: {
|
|
24
|
+
dataDir?: string;
|
|
25
|
+
agentId: string;
|
|
26
|
+
}): MerchantMcpRuntimeDirs;
|
|
@@ -0,0 +1,44 @@
|
|
|
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 MCP 运行时的数据目录接线(V2 §5.1)。
|
|
18
|
+
*
|
|
19
|
+
* 显式三个槽位分别注入,互不派生:
|
|
20
|
+
* - merchantDataDir 商家维度数据(a2a ledger、stats、oauth.sqlite)——
|
|
21
|
+
* 同一商家的多个传输会话共享同一目录;
|
|
22
|
+
* - principalDataDir principal 维度数据(审批候选 state.sqlite 等)——
|
|
23
|
+
* 当前与 merchantDataDir 同址(单商家实例唯一 principal),
|
|
24
|
+
* 槽位分离是为多 principal 演进留的机械拆分点;
|
|
25
|
+
* - transportSessionId 传输会话标识(无状态 streamableHttp 固定 "stateless")——
|
|
26
|
+
* 只是观测标签,绝不参与数据目录派生(修掉「HTTP adapter
|
|
27
|
+
* 按 sessionId 建 dataDir」的接线形态:会话不得影响持久路径)。
|
|
28
|
+
*
|
|
29
|
+
* 不变量:路径是 (dataDir?, agentId) 的纯函数——重启后路径稳定;
|
|
30
|
+
* 任何传输会话的加入/退出都不改变目录。
|
|
31
|
+
*/
|
|
32
|
+
import { agentDataDir } from "../agent/agent-db.js";
|
|
33
|
+
/** 无状态传输的固定会话标识(仅观测用;绝不参与路径派生)。 */
|
|
34
|
+
export const STATELESS_TRANSPORT_SESSION_ID = "stateless";
|
|
35
|
+
export function resolveMerchantMcpDirs(options) {
|
|
36
|
+
// agentDataDir 经 agentDirName 消毒(防路径逃逸),与 chat kernel 同一缺省。
|
|
37
|
+
const merchantDataDir = options.dataDir ?? agentDataDir(options.agentId);
|
|
38
|
+
return {
|
|
39
|
+
merchantDataDir,
|
|
40
|
+
principalDataDir: merchantDataDir,
|
|
41
|
+
transportSessionId: STATELESS_TRANSPORT_SESSION_ID,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=merchant-dirs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merchant-dirs.js","sourceRoot":"","sources":["../../src/mcp/merchant-dirs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,mCAAmC;AACnC,MAAM,CAAC,MAAM,8BAA8B,GAAG,WAAW,CAAC;AAQ1D,MAAM,UAAU,sBAAsB,CAAC,OAGtC;IACC,4DAA4D;IAC5D,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,OAAO;QACL,eAAe;QACf,gBAAgB,EAAE,eAAe;QACjC,kBAAkB,EAAE,8BAA8B;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 type { PresentationContext } from "../agent/presentation/types.js";
|
|
17
|
+
export declare const MERCHANT_RESOURCE_PREFIX = "kiwi-merchant://presentation/";
|
|
18
|
+
export interface MerchantResourceDef {
|
|
19
|
+
uri: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
mimeType: "application/json";
|
|
23
|
+
}
|
|
24
|
+
export interface MerchantResourceContent {
|
|
25
|
+
uri: string;
|
|
26
|
+
mimeType: string;
|
|
27
|
+
text: string;
|
|
28
|
+
}
|
|
29
|
+
/** 等效文本摘要(降级路径;不丢关键字段:数量/金额/状态/时间)。 */
|
|
30
|
+
export declare function textSummary(component: string, payload: unknown): string;
|
|
31
|
+
export declare function buildMerchantPresentationResources(deps: {
|
|
32
|
+
context: PresentationContext;
|
|
33
|
+
}): {
|
|
34
|
+
list: () => MerchantResourceDef[];
|
|
35
|
+
read: (uri: string) => Promise<{
|
|
36
|
+
contents: MerchantResourceContent[];
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
@@ -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":"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"}
|
|
@@ -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>;
|