@harrylabsj/kiwi 0.7.9 → 0.7.11

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.
Files changed (100) hide show
  1. package/contracts/commerce-intent/1.0/schema.json +124 -0
  2. package/contracts/delegation-policy/1.0/schema.json +143 -0
  3. package/contracts/effective-authorization/1.0/schema.json +167 -0
  4. package/contracts/kiwi-contracts.lock.json +1 -1
  5. package/contracts/manifest.json +25 -1
  6. package/contracts/persistent-task/1.0/schema.json +191 -0
  7. package/contracts/vectors/commerce-intent.invalid-no-items.json +7 -0
  8. package/contracts/vectors/commerce-intent.valid.json +32 -0
  9. package/contracts/vectors/delegation-policy.invalid-payment-auto.json +15 -0
  10. package/contracts/vectors/delegation-policy.valid.json +25 -0
  11. package/contracts/vectors/effective-authorization.invalid-deny-wins.json +20 -0
  12. package/contracts/vectors/effective-authorization.valid.json +23 -0
  13. package/contracts/vectors/persistent-task.invalid-no-idempotency.json +7 -0
  14. package/contracts/vectors/persistent-task.valid.json +45 -0
  15. package/dist/a2a/client/url-policy.js +52 -14
  16. package/dist/a2a/client/url-policy.js.map +1 -1
  17. package/dist/a2a/node.js +27 -1
  18. package/dist/a2a/node.js.map +1 -1
  19. package/dist/a2a/server/merchant-handler.d.ts +27 -0
  20. package/dist/a2a/server/merchant-handler.js +88 -10
  21. package/dist/a2a/server/merchant-handler.js.map +1 -1
  22. package/dist/a2a/signing-key.js +18 -0
  23. package/dist/a2a/signing-key.js.map +1 -1
  24. package/dist/buyer-core/a2a-knp.d.ts +71 -0
  25. package/dist/buyer-core/a2a-knp.js +139 -0
  26. package/dist/buyer-core/a2a-knp.js.map +1 -0
  27. package/dist/buyer-core/a2a-negotiator.d.ts +37 -0
  28. package/dist/buyer-core/a2a-negotiator.js +152 -0
  29. package/dist/buyer-core/a2a-negotiator.js.map +1 -0
  30. package/dist/buyer-core/a2a-quote-fetcher.d.ts +44 -0
  31. package/dist/buyer-core/a2a-quote-fetcher.js +178 -0
  32. package/dist/buyer-core/a2a-quote-fetcher.js.map +1 -0
  33. package/dist/buyer-core/build-service.d.ts +44 -0
  34. package/dist/buyer-core/build-service.js +76 -0
  35. package/dist/buyer-core/build-service.js.map +1 -0
  36. package/dist/buyer-core/errors.d.ts +31 -0
  37. package/dist/buyer-core/errors.js +52 -0
  38. package/dist/buyer-core/errors.js.map +1 -0
  39. package/dist/buyer-core/merchant-index.d.ts +64 -0
  40. package/dist/buyer-core/merchant-index.js +213 -0
  41. package/dist/buyer-core/merchant-index.js.map +1 -0
  42. package/dist/buyer-core/negotiator.d.ts +51 -0
  43. package/dist/buyer-core/negotiator.js +181 -0
  44. package/dist/buyer-core/negotiator.js.map +1 -0
  45. package/dist/buyer-core/quote-fetcher.d.ts +46 -0
  46. package/dist/buyer-core/quote-fetcher.js +166 -0
  47. package/dist/buyer-core/quote-fetcher.js.map +1 -0
  48. package/dist/buyer-core/service.d.ts +218 -0
  49. package/dist/buyer-core/service.js +558 -0
  50. package/dist/buyer-core/service.js.map +1 -0
  51. package/dist/buyer-core/store.d.ts +84 -0
  52. package/dist/buyer-core/store.js +256 -0
  53. package/dist/buyer-core/store.js.map +1 -0
  54. package/dist/cli.js +25 -0
  55. package/dist/cli.js.map +1 -1
  56. package/dist/config/profile.d.ts +9 -0
  57. package/dist/config/profile.js +23 -0
  58. package/dist/config/profile.js.map +1 -1
  59. package/dist/contracts/northbound-schema.d.ts +27 -0
  60. package/dist/contracts/northbound-schema.js +102 -0
  61. package/dist/contracts/northbound-schema.js.map +1 -0
  62. package/dist/handoff/destination.js +16 -5
  63. package/dist/handoff/destination.js.map +1 -1
  64. package/dist/http/cli.d.ts +16 -0
  65. package/dist/http/cli.js +123 -0
  66. package/dist/http/cli.js.map +1 -0
  67. package/dist/http/server.d.ts +39 -0
  68. package/dist/http/server.js +297 -0
  69. package/dist/http/server.js.map +1 -0
  70. package/dist/mcp/cli.d.ts +70 -0
  71. package/dist/mcp/cli.js +147 -0
  72. package/dist/mcp/cli.js.map +1 -0
  73. package/dist/mcp/server.d.ts +41 -0
  74. package/dist/mcp/server.js +141 -0
  75. package/dist/mcp/server.js.map +1 -0
  76. package/dist/mcp/tools.d.ts +28 -0
  77. package/dist/mcp/tools.js +299 -0
  78. package/dist/mcp/tools.js.map +1 -0
  79. package/dist/mcp/types.d.ts +107 -0
  80. package/dist/mcp/types.js +52 -0
  81. package/dist/mcp/types.js.map +1 -0
  82. package/dist/merchant/decision-backend.d.ts +82 -0
  83. package/dist/merchant/decision-backend.js +275 -0
  84. package/dist/merchant/decision-backend.js.map +1 -0
  85. package/dist/merchant/ops.d.ts +80 -0
  86. package/dist/merchant/ops.js +75 -0
  87. package/dist/merchant/ops.js.map +1 -0
  88. package/dist/merchant/ucp-profile.d.ts +39 -0
  89. package/dist/merchant/ucp-profile.js +55 -0
  90. package/dist/merchant/ucp-profile.js.map +1 -0
  91. package/dist/product-cli.d.ts +1 -1
  92. package/dist/product-cli.js +1 -1
  93. package/dist/product-cli.js.map +1 -1
  94. package/dist/trust/identity/auth-verifier.js +19 -1
  95. package/dist/trust/identity/auth-verifier.js.map +1 -1
  96. package/dist/trust/identity/message-signature.js +14 -8
  97. package/dist/trust/identity/message-signature.js.map +1 -1
  98. package/examples/profiles/merchant.deepseek.yaml +5 -0
  99. package/examples/profiles/merchant.fake.yaml +4 -0
  100. package/package.json +4 -2
@@ -0,0 +1,297 @@
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
+ * kiwi-buyer-http —— Buyer Core 的 HTTP 包装(战略 v2.5 §6.3/§6.5/Appendix A)。
18
+ *
19
+ * 与 MCP 同一 buyer-core(KiwiBuyerService),不同包装:证明"单核心、多包装"——
20
+ * 未来新宿主出现时接入从"重写产品"降为"写一个薄适配器"(§6.3)。
21
+ *
22
+ * 暴露与 7 个 MCP 工具一一对应的 HTTP 端点(同一语义不变量:schema/授权门/
23
+ * 幂等/错误分类)。本 server 不持有任何商业状态——状态唯一权威在持久 store。
24
+ */
25
+ import { createServer } from "node:http";
26
+ import { KiwiBuyerService } from "../buyer-core/service.js";
27
+ import { McpError } from "../buyer-core/errors.js";
28
+ import { buildMerchantUcpProfile } from "../merchant/ucp-profile.js";
29
+ export function createBuyerHttpServer(options) {
30
+ const { service, merchantUcp, merchantOps } = options;
31
+ const readJson = (req) => new Promise((resolve, reject) => {
32
+ let data = "";
33
+ req.on("data", (chunk) => {
34
+ data += chunk.toString();
35
+ if (data.length > 256 * 1024)
36
+ reject(new Error("request body too large"));
37
+ });
38
+ req.on("end", () => {
39
+ if (data.trim() === "")
40
+ return resolve({});
41
+ try {
42
+ resolve(JSON.parse(data));
43
+ }
44
+ catch {
45
+ reject(new Error("invalid JSON body"));
46
+ }
47
+ });
48
+ req.on("error", reject);
49
+ });
50
+ const send = (res, status, body) => {
51
+ res.writeHead(status, { "content-type": "application/json" });
52
+ res.end(JSON.stringify(body));
53
+ };
54
+ const sendError = (res, error) => {
55
+ if (error instanceof McpError) {
56
+ return send(res, 400, { ok: false, error: { code: error.code, message: error.message } });
57
+ }
58
+ return send(res, 500, {
59
+ ok: false,
60
+ error: { code: "internal_error", message: error instanceof Error ? error.message : String(error) },
61
+ });
62
+ };
63
+ const routes = [
64
+ { method: "GET", path: "/health", handler: async (_b, _p, res) => send(res, 200, { ok: true, service: "kiwi-buyer-http" }) },
65
+ {
66
+ method: "POST", path: "/search", handler: async (b, _p, res) => {
67
+ try {
68
+ const result = await service.search({
69
+ query: String(b.query ?? ""),
70
+ category: b.category === undefined ? undefined : String(b.category),
71
+ region: b.region === undefined ? undefined : String(b.region),
72
+ });
73
+ send(res, 200, { ok: true, result });
74
+ }
75
+ catch (e) {
76
+ sendError(res, e);
77
+ }
78
+ },
79
+ },
80
+ {
81
+ method: "POST", path: "/tasks", handler: async (b, _p, res) => {
82
+ try {
83
+ const result = await service.requestQuotes({
84
+ intent: (b.intent ?? {}),
85
+ idempotency_key: b.idempotency_key === undefined ? undefined : String(b.idempotency_key),
86
+ merchant_ids: b.merchant_ids === undefined ? undefined : b.merchant_ids.map(String),
87
+ });
88
+ send(res, 201, { ok: true, result });
89
+ }
90
+ catch (e) {
91
+ sendError(res, e);
92
+ }
93
+ },
94
+ },
95
+ {
96
+ method: "GET", path: "/tasks/:id", handler: async (_b, p, res) => {
97
+ try {
98
+ send(res, 200, { ok: true, result: service.getTask(p.id ?? "") });
99
+ }
100
+ catch (e) {
101
+ sendError(res, e);
102
+ }
103
+ },
104
+ },
105
+ {
106
+ method: "POST", path: "/tasks/:id/negotiate", handler: async (b, p, res) => {
107
+ try {
108
+ const result = await service.negotiate({
109
+ task_id: p.id ?? "",
110
+ action: b.action === "clarification" ? "clarification" : "counter_offer",
111
+ summary: String(b.summary ?? ""),
112
+ });
113
+ send(res, 200, { ok: true, result });
114
+ }
115
+ catch (e) {
116
+ sendError(res, e);
117
+ }
118
+ },
119
+ },
120
+ {
121
+ method: "POST", path: "/tasks/:id/agreement", handler: async (b, p, res) => {
122
+ try {
123
+ const result = await service.acceptAgreement({
124
+ task_id: p.id ?? "",
125
+ candidate_id: String(b.candidate_id ?? ""),
126
+ approval_id: b.approval_id === undefined ? undefined : String(b.approval_id),
127
+ });
128
+ send(res, 201, {
129
+ ok: true,
130
+ result: { agreement: result.agreement, authorization: result.authorization },
131
+ });
132
+ }
133
+ catch (e) {
134
+ sendError(res, e);
135
+ }
136
+ },
137
+ },
138
+ {
139
+ method: "GET", path: "/agreements/:id", handler: async (_b, p, res) => {
140
+ try {
141
+ send(res, 200, { ok: true, result: service.getAgreement(p.id ?? "") });
142
+ }
143
+ catch (e) {
144
+ sendError(res, e);
145
+ }
146
+ },
147
+ },
148
+ {
149
+ method: "POST", path: "/agreements/:id/handoff", handler: async (b, p, res) => {
150
+ try {
151
+ const result = await service.handoff({
152
+ agreement_id: p.id ?? "",
153
+ approval_id: String(b.approval_id ?? ""),
154
+ destination_type: String(b.destination_type ?? ""),
155
+ url: b.url === undefined ? undefined : String(b.url),
156
+ });
157
+ send(res, 200, { ok: true, result });
158
+ }
159
+ catch (e) {
160
+ sendError(res, e);
161
+ }
162
+ },
163
+ },
164
+ {
165
+ method: "POST", path: "/approvals", handler: async (b, _p, res) => {
166
+ try {
167
+ const result = service.requestApproval({
168
+ task_id: String(b.task_id ?? ""),
169
+ action: b.action,
170
+ candidate_digest: b.candidate_digest === undefined ? undefined : String(b.candidate_digest),
171
+ });
172
+ send(res, 201, { ok: true, result });
173
+ }
174
+ catch (e) {
175
+ sendError(res, e);
176
+ }
177
+ },
178
+ },
179
+ {
180
+ // Merchant Ops RFQ 队列(§7.6):kiwi.merchant.rfqs。
181
+ method: "GET", path: "/merchant/:id/rfqs", handler: async (_b, p, res) => {
182
+ const ops = merchantOps?.[p.id ?? ""];
183
+ if (ops === undefined)
184
+ return send(res, 404, { ok: false, error: { code: "merchant_not_found", message: `no ops for ${p.id}` } });
185
+ try {
186
+ send(res, 200, { ok: true, result: await ops.listRfqQueue(p.id ?? "") });
187
+ }
188
+ catch (e) {
189
+ sendError(res, e);
190
+ }
191
+ },
192
+ },
193
+ {
194
+ // Merchant Ops human_required(§7.6):kiwi.merchant.reviews。
195
+ method: "GET", path: "/merchant/:id/human-review", handler: async (_b, p, res) => {
196
+ const ops = merchantOps?.[p.id ?? ""];
197
+ if (ops === undefined)
198
+ return send(res, 404, { ok: false, error: { code: "merchant_not_found", message: `no ops for ${p.id}` } });
199
+ try {
200
+ send(res, 200, { ok: true, result: await ops.listHumanReview(p.id ?? "") });
201
+ }
202
+ catch (e) {
203
+ sendError(res, e);
204
+ }
205
+ },
206
+ },
207
+ {
208
+ // Merchant Ops analytics(§7.6):kiwi.merchant.analytics。
209
+ method: "GET", path: "/merchant/:id/analytics", handler: async (_b, p, res) => {
210
+ const ops = merchantOps?.[p.id ?? ""];
211
+ if (ops === undefined)
212
+ return send(res, 404, { ok: false, error: { code: "merchant_not_found", message: `no ops for ${p.id}` } });
213
+ try {
214
+ send(res, 200, { ok: true, result: await ops.analytics(p.id ?? "") });
215
+ }
216
+ catch (e) {
217
+ sendError(res, e);
218
+ }
219
+ },
220
+ },
221
+ {
222
+ // Merchant Ops 处理 human_required(§7.6):kiwi.merchant.approve。
223
+ method: "POST", path: "/merchant/:id/resolve-review", handler: async (b, p, res) => {
224
+ const ops = merchantOps?.[p.id ?? ""];
225
+ if (ops === undefined)
226
+ return send(res, 404, { ok: false, error: { code: "merchant_not_found", message: `no ops for ${p.id}` } });
227
+ try {
228
+ const result = await ops.resolveReview(p.id ?? "", String(b.conversation_id ?? ""), String(b.decision ?? "approve"));
229
+ send(res, 200, { ok: true, result });
230
+ }
231
+ catch (e) {
232
+ sendError(res, e);
233
+ }
234
+ },
235
+ },
236
+ {
237
+ // Merchant UCP Profile 发布(§7.1 Protocol Publishing):返回 `/.well-known/ucp`。
238
+ method: "GET", path: "/merchants/:id/ucp", handler: async (_b, p, res) => {
239
+ const mid = p.id ?? "";
240
+ const config = merchantUcp?.[mid];
241
+ if (config === undefined) {
242
+ return send(res, 404, { ok: false, error: { code: "merchant_not_found", message: `no UCP config for ${mid}` } });
243
+ }
244
+ try {
245
+ const profile = buildMerchantUcpProfile({ domain: config.domain, merchantId: mid, catalogEndpoint: config.catalogEndpoint });
246
+ send(res, 200, { ok: true, ucp: profile });
247
+ }
248
+ catch (e) {
249
+ sendError(res, e);
250
+ }
251
+ },
252
+ },
253
+ {
254
+ method: "POST", path: "/approvals/:id/approve", handler: async (b, p, res) => {
255
+ try {
256
+ service.approveApproval({
257
+ approval_id: p.id ?? "",
258
+ authorization: (b.authorization ?? {}),
259
+ });
260
+ send(res, 200, { ok: true });
261
+ }
262
+ catch (e) {
263
+ sendError(res, e);
264
+ }
265
+ },
266
+ },
267
+ ];
268
+ return createServer(async (req, res) => {
269
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
270
+ const segments = url.pathname.split("/").filter(Boolean);
271
+ const method = req.method ?? "GET";
272
+ for (const route of routes) {
273
+ const routeSegments = route.path.split("/").filter(Boolean);
274
+ if (routeSegments.length !== segments.length || route.method !== method)
275
+ continue;
276
+ let match = true;
277
+ const params = {};
278
+ for (let i = 0; i < routeSegments.length; i += 1) {
279
+ const rs = routeSegments[i];
280
+ const ss = segments[i];
281
+ if (rs.startsWith(":"))
282
+ params[rs.slice(1)] = ss;
283
+ else if (rs !== ss) {
284
+ match = false;
285
+ break;
286
+ }
287
+ }
288
+ if (!match)
289
+ continue;
290
+ const body = await readJson(req).catch(() => ({}));
291
+ await route.handler(body, params, res);
292
+ return;
293
+ }
294
+ send(res, 404, { ok: false, error: { code: "not_found", message: `${method} ${url.pathname}` } });
295
+ });
296
+ }
297
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
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
+ export declare const KIWI_MCP_VERSION = "0.1.0";
17
+ /**
18
+ * 默认 catalog 入口(kiwi-catalog 公网地址)。kiwi-buyer 默认经它发现商家;
19
+ * 用户无需配置,可用 --catalog-url <url> 覆盖。
20
+ */
21
+ export declare const DEFAULT_CATALOG_URL = "https://catalog.kiwi.harrylabsj.com";
22
+ /** 内置安全默认 DelegationPolicy(§5.3 默认映射)。 */
23
+ export declare const DEFAULT_DELEGATION_POLICY: {
24
+ readonly policy_id: "dp-default";
25
+ readonly version: "1.0";
26
+ readonly principal: "principal:unset";
27
+ readonly expires_at: "2099-12-31T23:59:59Z";
28
+ readonly actions: {
29
+ readonly discover: {
30
+ readonly mode: "auto";
31
+ };
32
+ readonly inquiry_rfq: {
33
+ readonly mode: "auto";
34
+ };
35
+ readonly compare_offers: {
36
+ readonly mode: "auto";
37
+ };
38
+ readonly counter_offer: {
39
+ readonly mode: "auto";
40
+ readonly note: "受限 AUTO:受 limits 约束";
41
+ };
42
+ readonly accept_nonbinding: {
43
+ readonly mode: "ask";
44
+ };
45
+ readonly handoff: {
46
+ readonly mode: "ask";
47
+ };
48
+ readonly payment: {
49
+ readonly mode: "never";
50
+ };
51
+ };
52
+ readonly limits: {
53
+ readonly max_rounds: 3;
54
+ };
55
+ };
56
+ export interface McpServeOptions {
57
+ db?: string;
58
+ principal?: string;
59
+ buyerAgentId?: string;
60
+ sessionId?: string;
61
+ policy?: Record<string, unknown>;
62
+ catalogUrl?: string;
63
+ marketplaceUrl?: string;
64
+ buyerBootstrapToken?: string;
65
+ a2aBearerToken?: string;
66
+ a2aAllowPrivateRanges?: boolean;
67
+ a2aSkipDnsCheck?: boolean;
68
+ a2aTimeoutMs?: number;
69
+ }
70
+ export declare function runMcpServe(args: string[]): Promise<number>;
@@ -0,0 +1,147 @@
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
+ * `kiwi mcp serve` —— 启动 kiwi-buyer-mcp stdio server(战略 v2.5 §6.1/§6.5)。
18
+ *
19
+ * 配置来源:
20
+ * --db <path> 持久 store 路径(默认 ./.kiwi/mcp/state.sqlite)
21
+ * --principal <id> Principal opaque 标识(默认 env KIWI_PRINCIPAL)
22
+ * --agent <id> buyer_agent_id(默认 env KIWI_BUYER_AGENT)
23
+ * --session <id> session_id(默认 env KIWI_SESSION)
24
+ * --policy <file> 冻结 DelegationPolicy JSON(默认 env KIWI_DELEGATION_POLICY;
25
+ * 未提供则用内置安全默认:读 AUTO、accept/handoff ASK、payment NEVER)
26
+ * --catalog-url 真实 merchant 网络:catalog 发现 → A2A 直连 merchant(listings
27
+ * 感知搜索 + A2AQuoteFetcher/A2ANegotiator)
28
+ * --marketplace-url 试点兼容:shopping-cli 直连(MarketplaceQuoteFetcher/Negotiator)
29
+ * --a2a-bearer-token / --a2a-allow-private-ranges / --a2a-skip-dns-check /
30
+ * --a2a-timeout-ms A2A 轨可选配置
31
+ *
32
+ * 执行 seam(MerchantIndex/QuoteFetcher/Negotiator)已接线:marketplaceUrl 优先,
33
+ * 否则 catalogUrl → A2A 直连 merchant 网络;本 server 负责契约面 + 持久任务/审批状态机。
34
+ */
35
+ import { readFileSync } from "node:fs";
36
+ import path from "node:path";
37
+ import { assertNorthboundContractValid } from "../contracts/northbound-schema.js";
38
+ import { buildBuyerService } from "../buyer-core/build-service.js";
39
+ import { McpServer } from "./server.js";
40
+ import { buildKiwiTools } from "./tools.js";
41
+ export const KIWI_MCP_VERSION = "0.1.0";
42
+ /**
43
+ * 默认 catalog 入口(kiwi-catalog 公网地址)。kiwi-buyer 默认经它发现商家;
44
+ * 用户无需配置,可用 --catalog-url <url> 覆盖。
45
+ */
46
+ export const DEFAULT_CATALOG_URL = "https://catalog.kiwi.harrylabsj.com";
47
+ /** 内置安全默认 DelegationPolicy(§5.3 默认映射)。 */
48
+ export const DEFAULT_DELEGATION_POLICY = {
49
+ policy_id: "dp-default",
50
+ version: "1.0",
51
+ principal: "principal:unset",
52
+ expires_at: "2099-12-31T23:59:59Z",
53
+ actions: {
54
+ discover: { mode: "auto" },
55
+ inquiry_rfq: { mode: "auto" },
56
+ compare_offers: { mode: "auto" },
57
+ counter_offer: { mode: "auto", note: "受限 AUTO:受 limits 约束" },
58
+ accept_nonbinding: { mode: "ask" },
59
+ handoff: { mode: "ask" },
60
+ payment: { mode: "never" },
61
+ },
62
+ limits: { max_rounds: 3 },
63
+ };
64
+ function readPolicy(options, principal) {
65
+ const fromEnv = process.env.KIWI_DELEGATION_POLICY;
66
+ if (fromEnv !== undefined && fromEnv.trim() !== "") {
67
+ try {
68
+ return JSON.parse(fromEnv);
69
+ }
70
+ catch {
71
+ throw new Error("KIWI_DELEGATION_POLICY is not valid JSON");
72
+ }
73
+ }
74
+ const raw = options.policy !== undefined
75
+ ? options.policy
76
+ : { ...DEFAULT_DELEGATION_POLICY, principal };
77
+ assertNorthboundContractValid("delegation-policy", raw, "delegation policy");
78
+ return raw;
79
+ }
80
+ export async function runMcpServe(args) {
81
+ const opts = {};
82
+ for (let i = 0; i < args.length; i += 1) {
83
+ const flag = args[i];
84
+ const value = args[i + 1];
85
+ if (value === undefined)
86
+ continue;
87
+ if (flag === "--db")
88
+ opts.db = value;
89
+ else if (flag === "--principal")
90
+ opts.principal = value;
91
+ else if (flag === "--agent")
92
+ opts.buyerAgentId = value;
93
+ else if (flag === "--session")
94
+ opts.sessionId = value;
95
+ else if (flag === "--catalog-url")
96
+ opts.catalogUrl = value;
97
+ else if (flag === "--marketplace-url")
98
+ opts.marketplaceUrl = value;
99
+ else if (flag === "--buyer-bootstrap-token")
100
+ opts.buyerBootstrapToken = value;
101
+ else if (flag === "--a2a-bearer-token")
102
+ opts.a2aBearerToken = value;
103
+ else if (flag === "--a2a-allow-private-ranges")
104
+ opts.a2aAllowPrivateRanges = value === "true";
105
+ else if (flag === "--a2a-skip-dns-check")
106
+ opts.a2aSkipDnsCheck = value === "true";
107
+ else if (flag === "--a2a-timeout-ms")
108
+ opts.a2aTimeoutMs = Number(value);
109
+ else if (flag === "--policy") {
110
+ try {
111
+ opts.policy = JSON.parse(readFileSync(value, "utf-8"));
112
+ }
113
+ catch {
114
+ process.stderr.write(`cannot read --policy file ${value}\n`);
115
+ return 2;
116
+ }
117
+ }
118
+ }
119
+ const principal = opts.principal ?? process.env.KIWI_PRINCIPAL ?? "principal:local";
120
+ const buyerAgentId = opts.buyerAgentId ?? process.env.KIWI_BUYER_AGENT ?? "buyer-agent:kiwi-mcp";
121
+ const sessionId = opts.sessionId ?? process.env.KIWI_SESSION ?? `session-${process.pid}`;
122
+ const policy = readPolicy(opts, principal);
123
+ const dbPath = opts.db ?? path.join(".kiwi", "mcp", "state.sqlite");
124
+ // 单核心多包装:MCP 与 HTTP 共用同一 buildBuyerService(§6.3)。
125
+ const service = buildBuyerService({
126
+ dbPath,
127
+ principal,
128
+ buyerAgentId,
129
+ sessionId,
130
+ policy,
131
+ catalogUrl: opts.catalogUrl ?? DEFAULT_CATALOG_URL,
132
+ marketplaceUrl: opts.marketplaceUrl,
133
+ buyerBootstrapToken: opts.buyerBootstrapToken ?? process.env.SHOPPING_BUYER_BOOTSTRAP_TOKEN,
134
+ a2aBearerToken: opts.a2aBearerToken,
135
+ a2aAllowPrivateRanges: opts.a2aAllowPrivateRanges,
136
+ a2aSkipDnsCheck: opts.a2aSkipDnsCheck,
137
+ a2aTimeoutMs: opts.a2aTimeoutMs,
138
+ });
139
+ const tools = buildKiwiTools(service);
140
+ const server = new McpServer({
141
+ tools,
142
+ serverInfo: { name: "kiwi-buyer-mcp", version: KIWI_MCP_VERSION },
143
+ });
144
+ await server.serve();
145
+ return 0;
146
+ }
147
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/mcp/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
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 JsonRpcResponse } from "./types.js";
17
+ import type { KiwiToolDefinition } from "./types.js";
18
+ export interface McpServerOptions {
19
+ tools: KiwiToolDefinition[];
20
+ serverInfo: {
21
+ name: string;
22
+ version: string;
23
+ };
24
+ }
25
+ export declare class McpServer {
26
+ private readonly tools;
27
+ private readonly serverInfo;
28
+ private initialized;
29
+ private initRequested;
30
+ constructor(options: McpServerOptions);
31
+ /** 处理单个 JSON-RPC 消息,返回响应(notification 返回 undefined)。 */
32
+ handleMessage(raw: string): Promise<JsonRpcResponse | undefined>;
33
+ private requireInit;
34
+ private handleInitialize;
35
+ private handleListTools;
36
+ private handleCallTool;
37
+ private result;
38
+ private error;
39
+ /** 阻塞运行 stdio 循环(CLI 入口)。逐行读 stdin,逐行写 stdout。 */
40
+ serve(): Promise<void>;
41
+ }