@harrylabsj/kiwi 0.8.0 → 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.
Files changed (214) hide show
  1. package/README.md +1 -1
  2. package/dist/a2a/negotiate.d.ts +6 -2
  3. package/dist/a2a/negotiate.js +10 -3
  4. package/dist/a2a/negotiate.js.map +1 -1
  5. package/dist/a2a/node.d.ts +4 -1
  6. package/dist/a2a/node.js +56 -3
  7. package/dist/a2a/node.js.map +1 -1
  8. package/dist/a2a/server/merchant-handler.d.ts +11 -3
  9. package/dist/a2a/server/merchant-handler.js +84 -26
  10. package/dist/a2a/server/merchant-handler.js.map +1 -1
  11. package/dist/agent/buyer/buyer-tools.js +2 -2
  12. package/dist/agent/buyer/buyer-tools.js.map +1 -1
  13. package/dist/agent/kernel.js +5 -1
  14. package/dist/agent/kernel.js.map +1 -1
  15. package/dist/agent/memory/schema.d.ts +1 -1
  16. package/dist/agent/memory/schema.js +9 -1
  17. package/dist/agent/memory/schema.js.map +1 -1
  18. package/dist/agent/merchant/action-candidate.d.ts +18 -0
  19. package/dist/agent/merchant/action-candidate.js +51 -0
  20. package/dist/agent/merchant/action-candidate.js.map +1 -1
  21. package/dist/agent/merchant/fake-merchant-client.js +6 -1
  22. package/dist/agent/merchant/fake-merchant-client.js.map +1 -1
  23. package/dist/agent/merchant/intelligence/default-backend.js +25 -2
  24. package/dist/agent/merchant/intelligence/default-backend.js.map +1 -1
  25. package/dist/agent/merchant/merchant-client.d.ts +50 -1
  26. package/dist/agent/merchant/merchant-client.js +157 -8
  27. package/dist/agent/merchant/merchant-client.js.map +1 -1
  28. package/dist/agent/merchant/merchant-presentations.js +25 -2
  29. package/dist/agent/merchant/merchant-presentations.js.map +1 -1
  30. package/dist/agent/merchant/merchant-tools.js +102 -188
  31. package/dist/agent/merchant/merchant-tools.js.map +1 -1
  32. package/dist/agent/merchant/types.d.ts +6 -2
  33. package/dist/agent/merchant/types.js +45 -0
  34. package/dist/agent/merchant/types.js.map +1 -1
  35. package/dist/auth/merchant-authorization.d.ts +49 -0
  36. package/dist/auth/merchant-authorization.js +61 -0
  37. package/dist/auth/merchant-authorization.js.map +1 -0
  38. package/dist/auth/merchant-oauth.d.ts +255 -0
  39. package/dist/auth/merchant-oauth.js +764 -0
  40. package/dist/auth/merchant-oauth.js.map +1 -0
  41. package/dist/auth/merchant-pairing.d.ts +62 -0
  42. package/dist/auth/merchant-pairing.js +199 -0
  43. package/dist/auth/merchant-pairing.js.map +1 -0
  44. package/dist/auth/merchant-sessions.d.ts +71 -0
  45. package/dist/auth/merchant-sessions.js +168 -0
  46. package/dist/auth/merchant-sessions.js.map +1 -0
  47. package/dist/buyer-core/build-service.d.ts +5 -0
  48. package/dist/buyer-core/build-service.js +12 -0
  49. package/dist/buyer-core/build-service.js.map +1 -1
  50. package/dist/buyer-core/errors.d.ts +1 -1
  51. package/dist/buyer-core/errors.js +2 -0
  52. package/dist/buyer-core/errors.js.map +1 -1
  53. package/dist/buyer-core/merchant-index.d.ts +19 -4
  54. package/dist/buyer-core/merchant-index.js +137 -16
  55. package/dist/buyer-core/merchant-index.js.map +1 -1
  56. package/dist/buyer-core/negotiator.d.ts +0 -10
  57. package/dist/buyer-core/negotiator.js +12 -1
  58. package/dist/buyer-core/negotiator.js.map +1 -1
  59. package/dist/buyer-core/quote-fetcher.js +2 -1
  60. package/dist/buyer-core/quote-fetcher.js.map +1 -1
  61. package/dist/buyer-core/service.d.ts +104 -0
  62. package/dist/buyer-core/service.js +105 -1
  63. package/dist/buyer-core/service.js.map +1 -1
  64. package/dist/cli.d.ts +4 -2
  65. package/dist/cli.js +612 -20
  66. package/dist/cli.js.map +1 -1
  67. package/dist/config/profile.d.ts +30 -0
  68. package/dist/config/profile.js +126 -61
  69. package/dist/config/profile.js.map +1 -1
  70. package/dist/demo/demo-runner.js +12 -9
  71. package/dist/demo/demo-runner.js.map +1 -1
  72. package/dist/discovery/catalog-source/buyer-follows.d.ts +82 -0
  73. package/dist/discovery/catalog-source/buyer-follows.js +228 -0
  74. package/dist/discovery/catalog-source/buyer-follows.js.map +1 -0
  75. package/dist/discovery/catalog-source/connector-identity.d.ts +75 -0
  76. package/dist/discovery/catalog-source/connector-identity.js +175 -0
  77. package/dist/discovery/catalog-source/connector-identity.js.map +1 -0
  78. package/dist/discovery/catalog-source/errors.d.ts +1 -1
  79. package/dist/discovery/catalog-source/errors.js +2 -0
  80. package/dist/discovery/catalog-source/errors.js.map +1 -1
  81. package/dist/discovery/catalog-source/merchant-publications.d.ts +65 -0
  82. package/dist/discovery/catalog-source/merchant-publications.js +207 -0
  83. package/dist/discovery/catalog-source/merchant-publications.js.map +1 -0
  84. package/dist/discovery/catalog-source/register.d.ts +24 -0
  85. package/dist/discovery/catalog-source/register.js +46 -0
  86. package/dist/discovery/catalog-source/register.js.map +1 -1
  87. package/dist/discovery/catalog-source/source.js +2 -1
  88. package/dist/discovery/catalog-source/source.js.map +1 -1
  89. package/dist/fs/atomic-write.d.ts +18 -0
  90. package/dist/fs/atomic-write.js +29 -0
  91. package/dist/fs/atomic-write.js.map +1 -0
  92. package/dist/http/server.js +4 -1
  93. package/dist/http/server.js.map +1 -1
  94. package/dist/mcp/cli.d.ts +2 -0
  95. package/dist/mcp/cli.js +7 -6
  96. package/dist/mcp/cli.js.map +1 -1
  97. package/dist/mcp/merchant-auth.d.ts +78 -0
  98. package/dist/mcp/merchant-auth.js +146 -0
  99. package/dist/mcp/merchant-auth.js.map +1 -0
  100. package/dist/mcp/merchant-dirs.d.ts +26 -0
  101. package/dist/mcp/merchant-dirs.js +44 -0
  102. package/dist/mcp/merchant-dirs.js.map +1 -0
  103. package/dist/mcp/merchant-resources.d.ts +38 -0
  104. package/dist/mcp/merchant-resources.js +146 -0
  105. package/dist/mcp/merchant-resources.js.map +1 -0
  106. package/dist/mcp/merchant-server.d.ts +106 -0
  107. package/dist/mcp/merchant-server.js +615 -0
  108. package/dist/mcp/merchant-server.js.map +1 -0
  109. package/dist/mcp/merchant-tools.d.ts +103 -0
  110. package/dist/mcp/merchant-tools.js +517 -0
  111. package/dist/mcp/merchant-tools.js.map +1 -0
  112. package/dist/mcp/server.js +4 -3
  113. package/dist/mcp/server.js.map +1 -1
  114. package/dist/mcp/tools.d.ts +5 -3
  115. package/dist/mcp/tools.js +102 -5
  116. package/dist/mcp/tools.js.map +1 -1
  117. package/dist/mcp/types.d.ts +1 -1
  118. package/dist/mcp/types.js +4 -0
  119. package/dist/mcp/types.js.map +1 -1
  120. package/dist/merchant/ops.d.ts +0 -11
  121. package/dist/merchant/ops.js +13 -1
  122. package/dist/merchant/ops.js.map +1 -1
  123. package/dist/merchant/workbench-service.d.ts +189 -0
  124. package/dist/merchant/workbench-service.js +417 -0
  125. package/dist/merchant/workbench-service.js.map +1 -0
  126. package/dist/merchant-admin/pending-page.d.ts +35 -0
  127. package/dist/merchant-admin/pending-page.js +69 -0
  128. package/dist/merchant-admin/pending-page.js.map +1 -0
  129. package/dist/merchant-core/commands.d.ts +99 -0
  130. package/dist/merchant-core/commands.js +179 -0
  131. package/dist/merchant-core/commands.js.map +1 -0
  132. package/dist/merchant-core/executor.d.ts +69 -0
  133. package/dist/merchant-core/executor.js +218 -0
  134. package/dist/merchant-core/executor.js.map +1 -0
  135. package/dist/merchant-core/negotiation-adapters.d.ts +55 -0
  136. package/dist/merchant-core/negotiation-adapters.js +55 -0
  137. package/dist/merchant-core/negotiation-adapters.js.map +1 -0
  138. package/dist/merchant-core/network-checks.d.ts +65 -0
  139. package/dist/merchant-core/network-checks.js +111 -0
  140. package/dist/merchant-core/network-checks.js.map +1 -0
  141. package/dist/merchant-core/operations.d.ts +64 -0
  142. package/dist/merchant-core/operations.js +136 -0
  143. package/dist/merchant-core/operations.js.map +1 -0
  144. package/dist/merchant-core/policy-runtime.d.ts +70 -0
  145. package/dist/merchant-core/policy-runtime.js +181 -0
  146. package/dist/merchant-core/policy-runtime.js.map +1 -0
  147. package/dist/merchant-core/product-import.d.ts +67 -0
  148. package/dist/merchant-core/product-import.js +160 -0
  149. package/dist/merchant-core/product-import.js.map +1 -0
  150. package/dist/merchant-core/service.d.ts +203 -0
  151. package/dist/merchant-core/service.js +402 -0
  152. package/dist/merchant-core/service.js.map +1 -0
  153. package/dist/merchant-gateway/catalog-publications.d.ts +71 -0
  154. package/dist/merchant-gateway/catalog-publications.js +175 -0
  155. package/dist/merchant-gateway/catalog-publications.js.map +1 -0
  156. package/dist/merchant-gateway/catalog-tools.d.ts +46 -0
  157. package/dist/merchant-gateway/catalog-tools.js +277 -0
  158. package/dist/merchant-gateway/catalog-tools.js.map +1 -0
  159. package/dist/merchant-gateway/cli.d.ts +75 -0
  160. package/dist/merchant-gateway/cli.js +458 -0
  161. package/dist/merchant-gateway/cli.js.map +1 -0
  162. package/dist/merchant-gateway/credential-vault.d.ts +44 -0
  163. package/dist/merchant-gateway/credential-vault.js +111 -0
  164. package/dist/merchant-gateway/credential-vault.js.map +1 -0
  165. package/dist/merchant-gateway/entry-server.d.ts +117 -0
  166. package/dist/merchant-gateway/entry-server.js +710 -0
  167. package/dist/merchant-gateway/entry-server.js.map +1 -0
  168. package/dist/merchant-gateway/instance-registration.d.ts +143 -0
  169. package/dist/merchant-gateway/instance-registration.js +382 -0
  170. package/dist/merchant-gateway/instance-registration.js.map +1 -0
  171. package/dist/merchant-gateway/instance-tools.d.ts +58 -0
  172. package/dist/merchant-gateway/instance-tools.js +184 -0
  173. package/dist/merchant-gateway/instance-tools.js.map +1 -0
  174. package/dist/merchant-gateway/mcp-proxy.d.ts +25 -0
  175. package/dist/merchant-gateway/mcp-proxy.js +192 -0
  176. package/dist/merchant-gateway/mcp-proxy.js.map +1 -0
  177. package/dist/merchant-gateway/pinned-fetch.d.ts +52 -0
  178. package/dist/merchant-gateway/pinned-fetch.js +212 -0
  179. package/dist/merchant-gateway/pinned-fetch.js.map +1 -0
  180. package/dist/merchant-gateway/tenant-registry.d.ts +82 -0
  181. package/dist/merchant-gateway/tenant-registry.js +190 -0
  182. package/dist/merchant-gateway/tenant-registry.js.map +1 -0
  183. package/dist/merchant-gateway/tool-bundle.d.ts +26 -0
  184. package/dist/merchant-gateway/tool-bundle.js +56 -0
  185. package/dist/merchant-gateway/tool-bundle.js.map +1 -0
  186. package/dist/merchant-runtime/backup.d.ts +48 -0
  187. package/dist/merchant-runtime/backup.js +226 -0
  188. package/dist/merchant-runtime/backup.js.map +1 -0
  189. package/dist/merchant-runtime/health.d.ts +99 -0
  190. package/dist/merchant-runtime/health.js +206 -0
  191. package/dist/merchant-runtime/health.js.map +1 -0
  192. package/dist/merchant-runtime/jobs.d.ts +64 -0
  193. package/dist/merchant-runtime/jobs.js +107 -0
  194. package/dist/merchant-runtime/jobs.js.map +1 -0
  195. package/dist/merchant-runtime/manager.d.ts +94 -0
  196. package/dist/merchant-runtime/manager.js +305 -0
  197. package/dist/merchant-runtime/manager.js.map +1 -0
  198. package/dist/merchant-runtime/services.d.ts +30 -0
  199. package/dist/merchant-runtime/services.js +51 -0
  200. package/dist/merchant-runtime/services.js.map +1 -0
  201. package/dist/net/url.d.ts +26 -0
  202. package/dist/net/url.js +32 -0
  203. package/dist/net/url.js.map +1 -0
  204. package/dist/product-cli.js +22 -3
  205. package/dist/product-cli.js.map +1 -1
  206. package/dist/product-compat.d.ts +9 -1
  207. package/dist/product-compat.js +12 -1
  208. package/dist/product-compat.js.map +1 -1
  209. package/dist/product-init.js +17 -5
  210. package/dist/product-init.js.map +1 -1
  211. package/dist/product-publish.js +2 -1
  212. package/dist/product-publish.js.map +1 -1
  213. package/package.json +3 -2
  214. package/skills/kiwi-buyer/SKILL.md +2 -0
@@ -0,0 +1,175 @@
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-catalog 商家公开资料客户端(写侧,凭据为 `cmt_…`)。
18
+ *
19
+ * POST {base}/v1/merchant-publications (action=draft|publish)
20
+ * GET {base}/v1/merchant-publications/{id}
21
+ * POST {base}/v1/merchant-publications/{id}/withdraw
22
+ *
23
+ * 契约来源:kiwi-catalog 仓 kiwi_catalog/services/merchant_publications.py 的
24
+ * validate_payload / public_projection(schema v29+,M0 工作包 A)。
25
+ *
26
+ * 硬边界:
27
+ * - merchant_id 由目录按凭据绑定决定,**客户端永远不传**;
28
+ * - 本客户端只把 `action=draft` 用于常规保存;`publish` 只应由商家在门户
29
+ * 确认页触发(入口不替商家确认,见第 1 版设计 §3.3 / §4 执行控制);
30
+ * - 出站加固与既有 catalog 客户端一致:不跟随重定向、超时、响应字段校验。
31
+ */
32
+ import { PRODUCT_VERSION } from "../product-cli.js";
33
+ import { isRedirectResponse, readJsonBody } from "../net/safe-http.js";
34
+ import { CatalogSourceError } from "../discovery/catalog-source/errors.js";
35
+ import { validateBaseUrl } from "../discovery/catalog-source/source.js";
36
+ const DEFAULT_TIMEOUT_MS = 15_000;
37
+ function asRecord(value, field) {
38
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
39
+ throw new CatalogSourceError("response_invalid", `merchant-publications response is missing object field "${field}"`);
40
+ }
41
+ return value;
42
+ }
43
+ function asString(record, field) {
44
+ return typeof record[field] === "string" ? record[field] : "";
45
+ }
46
+ function toPublication(value) {
47
+ const record = asRecord(value, "publication");
48
+ const faq = Array.isArray(record.faq)
49
+ ? record.faq.map((item) => {
50
+ const entry = asRecord(item, "publication.faq[]");
51
+ return { question: asString(entry, "question"), answer: asString(entry, "answer") };
52
+ })
53
+ : [];
54
+ const publicationId = asString(record, "publication_id");
55
+ const merchantId = asString(record, "merchant_id");
56
+ if (publicationId === "" || merchantId === "") {
57
+ throw new CatalogSourceError("response_invalid", "merchant-publications response is missing publication_id or merchant_id");
58
+ }
59
+ if (record.inquiry_available !== false) {
60
+ // 第 0 版公开资料恒不可实时询价;为 true 视为协议级违规(不得向上传播)。
61
+ throw new CatalogSourceError("contract_violation", "merchant-publications projected inquiry_available must be false");
62
+ }
63
+ return {
64
+ publication_id: publicationId,
65
+ merchant_id: merchantId,
66
+ merchant_display_name: asString(record, "merchant_display_name"),
67
+ title: asString(record, "title"),
68
+ category: asString(record, "category"),
69
+ summary: asString(record, "summary"),
70
+ shop_platform: asString(record, "shop_platform"),
71
+ shop_url: asString(record, "shop_url"),
72
+ faq,
73
+ source_kind: asString(record, "source_kind"),
74
+ status: asString(record, "status"),
75
+ version: typeof record.version === "number" ? record.version : 0,
76
+ published_at: asString(record, "published_at"),
77
+ expires_at: asString(record, "expires_at"),
78
+ updated_at: asString(record, "updated_at"),
79
+ inquiry_available: false,
80
+ };
81
+ }
82
+ export class MerchantPublicationClient {
83
+ baseUrl;
84
+ deps;
85
+ constructor(deps) {
86
+ this.baseUrl = validateBaseUrl(deps.baseUrl);
87
+ this.deps = deps;
88
+ }
89
+ /** 保存草稿(action=draft;发布不由入口执行)。 */
90
+ async saveDraft(token, input) {
91
+ const body = await this.request(token, "POST", "/v1/merchant-publications", {
92
+ action: "draft",
93
+ merchant_display_name: input.merchantDisplayName,
94
+ title: input.title,
95
+ ...(input.category !== undefined ? { category: input.category } : {}),
96
+ ...(input.summary !== undefined ? { summary: input.summary } : {}),
97
+ ...(input.shopPlatform !== undefined ? { shop_platform: input.shopPlatform } : {}),
98
+ ...(input.shopUrl !== undefined ? { shop_url: input.shopUrl } : {}),
99
+ ...(input.faq !== undefined ? { faq: input.faq } : {}),
100
+ ...(input.expiresAt !== undefined ? { expires_at: input.expiresAt } : {}),
101
+ });
102
+ return {
103
+ publication: toPublication(body.publication),
104
+ created: body.created === true,
105
+ idempotent: body.idempotent === true,
106
+ };
107
+ }
108
+ async getPublication(token, publicationId) {
109
+ const body = await this.request(token, "GET", `/v1/merchant-publications/${encodeURIComponent(publicationId)}`);
110
+ return toPublication(body.publication);
111
+ }
112
+ async withdraw(token, publicationId) {
113
+ const body = await this.request(token, "POST", `/v1/merchant-publications/${encodeURIComponent(publicationId)}/withdraw`, {});
114
+ return toPublication(body.publication);
115
+ }
116
+ async request(token, method, path, body) {
117
+ if (typeof token !== "string" || token.trim() === "") {
118
+ throw new CatalogSourceError("invalid_input", "merchant publication request requires a merchant credential");
119
+ }
120
+ const fetchImpl = this.deps.fetchImpl ?? globalThis.fetch;
121
+ const timeoutMs = this.deps.timeoutMs ?? DEFAULT_TIMEOUT_MS;
122
+ const url = `${this.baseUrl}${path}`;
123
+ const controller = new AbortController();
124
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
125
+ let response;
126
+ let raw;
127
+ try {
128
+ try {
129
+ response = await fetchImpl(url, {
130
+ method,
131
+ redirect: "manual",
132
+ signal: controller.signal,
133
+ headers: {
134
+ accept: "application/json",
135
+ ...(body !== undefined ? { "content-type": "application/json" } : {}),
136
+ authorization: `Bearer ${token}`,
137
+ "user-agent": `kiwi-merchant-entry/${PRODUCT_VERSION}`,
138
+ },
139
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
140
+ });
141
+ }
142
+ catch (err) {
143
+ const name = err?.name;
144
+ const detail = err instanceof Error ? err.message : String(err);
145
+ throw new CatalogSourceError("request_failed", name === "AbortError"
146
+ ? `kiwi-catalog merchant request timed out after ${timeoutMs}ms: ${url}`
147
+ : `kiwi-catalog merchant request failed: ${url} (${detail})`);
148
+ }
149
+ if (isRedirectResponse(response)) {
150
+ throw new CatalogSourceError("request_failed", `kiwi-catalog merchant request must not follow redirects (HTTP ${response.status} from ${url})`);
151
+ }
152
+ if (response.status === 401 || response.status === 403) {
153
+ throw new CatalogSourceError("session_rejected", `kiwi-catalog rejected the merchant credential (HTTP ${response.status} from ${url})`);
154
+ }
155
+ if (!response.ok) {
156
+ throw new CatalogSourceError("request_failed", `kiwi-catalog merchant request returned HTTP ${response.status} from ${url}`);
157
+ }
158
+ try {
159
+ raw = await readJsonBody(response, { signal: controller.signal });
160
+ }
161
+ catch {
162
+ throw new CatalogSourceError("response_invalid", `kiwi-catalog merchant response from ${url} is not valid JSON`);
163
+ }
164
+ }
165
+ finally {
166
+ clearTimeout(timer);
167
+ }
168
+ const envelope = asRecord(raw, "envelope");
169
+ if (envelope.ok !== true) {
170
+ throw new CatalogSourceError("response_invalid", `merchant-publications response is not ok: ${typeof envelope.error === "string" ? envelope.error : "unknown error"}`);
171
+ }
172
+ return envelope;
173
+ }
174
+ }
175
+ //# sourceMappingURL=catalog-publications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-publications.js","sourceRoot":"","sources":["../../src/merchant-gateway/catalog-publications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
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
+ * 商家连接器第 0 版目录工具(`kiwi_catalog_*`)。
18
+ *
19
+ * merchant-buddy 第 1 版设计 §3.3 / §4 执行控制与商家连接器发布计划 §3.2:
20
+ * - 商家身份来自**已验证的 OAuth 主体**(`merchantId` 由入口从访问令牌解析,
21
+ * 绝不来自工具参数);目录凭据按该 merchant_id 从保管库取;
22
+ * - 草稿是私有状态;`request_publish` **不写入 published**,只保存草稿并给出
23
+ * 目录门户的确认入口——发布必须由商家本人在门户确认页批准;
24
+ * - 无凭据/凭据失效时工具明确报「需要重新连接」,不返回过期数据。
25
+ */
26
+ import type { ScopedMcpTools } from "../mcp/merchant-server.js";
27
+ import type { MerchantPublicationClient } from "./catalog-publications.js";
28
+ import type { MerchantCredentialStore } from "./credential-vault.js";
29
+ /** 工具所需 scope(读/写两类;与目录凭据 scope 同名)。 */
30
+ export declare function catalogToolScope(name: string): "catalog:read" | "catalog:write";
31
+ export interface CatalogToolDeps {
32
+ client: MerchantPublicationClient;
33
+ credentials: MerchantCredentialStore;
34
+ /** 目录门户地址(发布确认入口)。 */
35
+ portalBaseUrl: string;
36
+ toolOptions?: {
37
+ maxChars?: number;
38
+ };
39
+ }
40
+ /**
41
+ * 构建绑定到某个已验证商家的目录工具束。
42
+ *
43
+ * `merchantId` 必须来自 OAuth 访问令牌(入口解析),不能来自工具入参——
44
+ * 这是第 0 版商家之间隔离的唯一依据。
45
+ */
46
+ export declare function buildCatalogTools(merchantId: string, deps: CatalogToolDeps): ScopedMcpTools;
@@ -0,0 +1,277 @@
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 { CatalogSourceError } from "../discovery/catalog-source/errors.js";
17
+ import { trimTrailingSlashes } from "../net/url.js";
18
+ const READ_TOOLS = new Set([
19
+ "kiwi_catalog_get_merchant_profile",
20
+ "kiwi_catalog_get_publication_status",
21
+ ]);
22
+ const WRITE_TOOLS = new Set([
23
+ "kiwi_catalog_save_publication_draft",
24
+ "kiwi_catalog_request_publish",
25
+ "kiwi_catalog_withdraw_publication",
26
+ ]);
27
+ /** 工具所需 scope(读/写两类;与目录凭据 scope 同名)。 */
28
+ export function catalogToolScope(name) {
29
+ return WRITE_TOOLS.has(name) ? "catalog:write" : "catalog:read";
30
+ }
31
+ const DISPLAY_NAME_PARAM = { type: "string", description: "公开商家名称(买家可见)" };
32
+ const TITLE_PARAM = { type: "string", description: "商品名(买家通过它搜索到你)" };
33
+ const PUBLICATION_INPUT_SCHEMA = {
34
+ type: "object",
35
+ properties: {
36
+ merchant_display_name: DISPLAY_NAME_PARAM,
37
+ title: TITLE_PARAM,
38
+ category: { type: "string", description: "类目(选填)" },
39
+ summary: { type: "string", description: "公开简介(选填,买家可见)" },
40
+ shop_platform: { type: "string", description: "店铺平台(选填,如 淘宝/京东)" },
41
+ shop_url: { type: "string", description: "公开店铺链接(选填,http/https)" },
42
+ faq: {
43
+ type: "array",
44
+ description: "公开 FAQ(选填;每项 question/answer,不得含电话或邮箱)",
45
+ items: {
46
+ type: "object",
47
+ properties: {
48
+ question: { type: "string" },
49
+ answer: { type: "string" },
50
+ },
51
+ required: ["question", "answer"],
52
+ additionalProperties: false,
53
+ },
54
+ },
55
+ expires_at: {
56
+ type: "string",
57
+ description: "资料有效期(选填,ISO 时间;到期后不再出现在搜索中)",
58
+ },
59
+ },
60
+ required: ["merchant_display_name", "title"],
61
+ additionalProperties: false,
62
+ };
63
+ const PUBLICATION_ID_SCHEMA = {
64
+ type: "object",
65
+ properties: {
66
+ publication_id: { type: "string", description: "公开资料 id(发布回执中的 publication_id)" },
67
+ },
68
+ required: ["publication_id"],
69
+ additionalProperties: false,
70
+ };
71
+ const DEFAULT_MAX_CHARS = 8_000;
72
+ function ok(payload, maxChars) {
73
+ const text = JSON.stringify(payload);
74
+ return {
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: text.length > maxChars ? `${text.slice(0, maxChars)}…(结果已截断)` : text,
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ function fail(message) {
84
+ return { content: [{ type: "text", text: message }], isError: true };
85
+ }
86
+ function readString(args, field) {
87
+ const value = args[field];
88
+ return typeof value === "string" ? value.trim() : "";
89
+ }
90
+ function readFaq(args) {
91
+ const raw = args.faq;
92
+ if (!Array.isArray(raw))
93
+ return [];
94
+ const items = [];
95
+ for (const element of raw) {
96
+ if (element === null || typeof element !== "object")
97
+ continue;
98
+ const question = readString(element, "question");
99
+ const answer = readString(element, "answer");
100
+ if (question !== "" && answer !== "")
101
+ items.push({ question, answer });
102
+ }
103
+ return items;
104
+ }
105
+ /**
106
+ * 构建绑定到某个已验证商家的目录工具束。
107
+ *
108
+ * `merchantId` 必须来自 OAuth 访问令牌(入口解析),不能来自工具入参——
109
+ * 这是第 0 版商家之间隔离的唯一依据。
110
+ */
111
+ export function buildCatalogTools(merchantId, deps) {
112
+ const maxChars = deps.toolOptions?.maxChars ?? DEFAULT_MAX_CHARS;
113
+ const portalUrl = `${trimTrailingSlashes(deps.portalBaseUrl)}/portal/publications`;
114
+ const credential = () => {
115
+ const stored = deps.credentials.get(merchantId);
116
+ if (stored === undefined) {
117
+ throw new CatalogSourceError("session_rejected", "目录凭据不可用(未连接或已过期):请重新连接「Kiwi 商家运营」,然后在 Buddy 中重试");
118
+ }
119
+ return stored.token;
120
+ };
121
+ const credentialExpiry = () => {
122
+ const stored = deps.credentials.get(merchantId);
123
+ return stored?.expiresAt ?? "";
124
+ };
125
+ const draftInput = (args) => {
126
+ const merchantDisplayName = readString(args, "merchant_display_name");
127
+ const title = readString(args, "title");
128
+ const category = readString(args, "category");
129
+ const summary = readString(args, "summary");
130
+ const shopPlatform = readString(args, "shop_platform");
131
+ const shopUrl = readString(args, "shop_url");
132
+ const expiresAt = readString(args, "expires_at");
133
+ const faq = readFaq(args);
134
+ return {
135
+ merchantDisplayName,
136
+ title,
137
+ ...(category !== "" ? { category } : {}),
138
+ ...(summary !== "" ? { summary } : {}),
139
+ ...(shopPlatform !== "" ? { shopPlatform } : {}),
140
+ ...(shopUrl !== "" ? { shopUrl } : {}),
141
+ ...(faq.length > 0 ? { faq } : {}),
142
+ ...(expiresAt !== "" ? { expiresAt } : {}),
143
+ };
144
+ };
145
+ const handlers = {
146
+ kiwi_catalog_get_merchant_profile: async () => {
147
+ const stored = deps.credentials.get(merchantId);
148
+ return ok({
149
+ merchant_id: merchantId,
150
+ connected: stored !== undefined,
151
+ credential_expires_at: credentialExpiry(),
152
+ portal_url: portalUrl,
153
+ note: stored === undefined
154
+ ? "尚未连接或凭据已过期:请重新连接「Kiwi 商家运营」后再管理公开资料。"
155
+ : "公开资料为商家声明快照(买家看到「资料可查」,不可实时询价);发布须在目录门户确认页批准。",
156
+ }, maxChars);
157
+ },
158
+ kiwi_catalog_save_publication_draft: async (args) => {
159
+ const input = draftInput(args);
160
+ if (input.merchantDisplayName === "" || input.title === "") {
161
+ return fail("缺少必填字段:merchant_display_name 与 title 都是必填");
162
+ }
163
+ const result = await deps.client.saveDraft(credential(), input);
164
+ return ok({
165
+ publication_id: result.publication.publication_id,
166
+ merchant_id: result.publication.merchant_id,
167
+ title: result.publication.title,
168
+ status: result.publication.status,
169
+ version: result.publication.version,
170
+ created: result.created,
171
+ updated: result.idempotent,
172
+ confirm_url: portalUrl,
173
+ note: "已保存为私有草稿(未公开,采购专家搜索不到)。发布需你在目录门户的公开资料页确认。",
174
+ }, maxChars);
175
+ },
176
+ kiwi_catalog_request_publish: async (args) => {
177
+ const input = draftInput(args);
178
+ if (input.merchantDisplayName === "" || input.title === "") {
179
+ return fail("缺少必填字段:merchant_display_name 与 title 都是必填");
180
+ }
181
+ const result = await deps.client.saveDraft(credential(), input);
182
+ return ok({
183
+ publication_id: result.publication.publication_id,
184
+ status: result.publication.status,
185
+ version: result.publication.version,
186
+ confirm_url: portalUrl,
187
+ note: "草稿已保存,但**尚未发布**:请在目录门户的公开资料页核对公开预览并点击确认发布。" +
188
+ "确认前采购专家搜索不到该商品。",
189
+ }, maxChars);
190
+ },
191
+ kiwi_catalog_get_publication_status: async (args) => {
192
+ const publicationId = readString(args, "publication_id");
193
+ if (publicationId === "")
194
+ return fail("缺少 publication_id");
195
+ const publication = await deps.client.getPublication(credential(), publicationId);
196
+ return ok({
197
+ publication_id: publication.publication_id,
198
+ merchant_id: publication.merchant_id,
199
+ title: publication.title,
200
+ status: publication.status,
201
+ version: publication.version,
202
+ published_at: publication.published_at,
203
+ updated_at: publication.updated_at,
204
+ expires_at: publication.expires_at,
205
+ inquiry_available: publication.inquiry_available,
206
+ }, maxChars);
207
+ },
208
+ kiwi_catalog_withdraw_publication: async (args) => {
209
+ const publicationId = readString(args, "publication_id");
210
+ if (publicationId === "")
211
+ return fail("缺少 publication_id");
212
+ const publication = await deps.client.withdraw(credential(), publicationId);
213
+ return ok({
214
+ publication_id: publication.publication_id,
215
+ status: publication.status,
216
+ version: publication.version,
217
+ note: "已撤回:该资料不再出现在采购专家的正常搜索中。",
218
+ }, maxChars);
219
+ },
220
+ };
221
+ const tools = [
222
+ {
223
+ name: "kiwi_catalog_get_merchant_profile",
224
+ description: "读取当前已连接商家的目录身份与连接状态(只读)。返回 merchant_id、目录凭据是否可用,以及公开资料管理入口地址。",
225
+ inputSchema: { type: "object", properties: {}, additionalProperties: false },
226
+ },
227
+ {
228
+ name: "kiwi_catalog_save_publication_draft",
229
+ description: "保存商家公开资料草稿(私有,不公开)。必填 merchant_display_name 与 title;类目/简介/店铺链接/FAQ/有效期选填。" +
230
+ "草稿不会出现在采购专家搜索结果中;公开前置请用 kiwi_catalog_request_publish。不得填写电话、邮箱等联系方式(会被目录拒绝)。",
231
+ inputSchema: PUBLICATION_INPUT_SCHEMA,
232
+ },
233
+ {
234
+ name: "kiwi_catalog_request_publish",
235
+ description: "准备发布公开资料:保存草稿并返回目录门户的确认入口。**本工具不会把资料变成已发布**——必须由商家本人在门户核对公开预览并确认发布后才生效。",
236
+ inputSchema: PUBLICATION_INPUT_SCHEMA,
237
+ },
238
+ {
239
+ name: "kiwi_catalog_get_publication_status",
240
+ description: "按 publication_id 查询公开资料状态(draft/published/withdrawn)、版本与更新时间。第 0 版资料恒为不可实时询价(inquiry_available=false)。",
241
+ inputSchema: PUBLICATION_ID_SCHEMA,
242
+ },
243
+ {
244
+ name: "kiwi_catalog_withdraw_publication",
245
+ description: "撤回已发布的公开资料(终态):撤回后不再出现在采购专家搜索结果中。撤回不会删除账号或历史版本。",
246
+ inputSchema: PUBLICATION_ID_SCHEMA,
247
+ },
248
+ ];
249
+ return {
250
+ listTools: (scopes) => tools.filter((tool) => {
251
+ if (scopes === undefined)
252
+ return true;
253
+ return scopes.includes(catalogToolScope(tool.name));
254
+ }),
255
+ call: async (name, args, scopes) => {
256
+ const handler = handlers[name];
257
+ if (handler === undefined) {
258
+ return fail(`未知工具:${name}`);
259
+ }
260
+ const required = catalogToolScope(name);
261
+ if (scopes !== undefined && !scopes.includes(required)) {
262
+ return fail(`scope 不足:${name} 需要 ${required},请重新连接并授予该权限`);
263
+ }
264
+ if (!READ_TOOLS.has(name) && !WRITE_TOOLS.has(name)) {
265
+ return fail(`工具未注册:${name}`);
266
+ }
267
+ try {
268
+ return await handler(args);
269
+ }
270
+ catch (err) {
271
+ const message = err instanceof Error ? err.message : String(err);
272
+ return fail(`目录操作失败:${message}`);
273
+ }
274
+ },
275
+ };
276
+ }
277
+ //# sourceMappingURL=catalog-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-tools.js","sourceRoot":"","sources":["../../src/merchant-gateway/catalog-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
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
+ /** 默认商家连接器 source(平台唯一性待核验;核验后按此处替换即可)。 */
17
+ export declare const DEFAULT_MERCHANT_CONNECTOR_SOURCE = "kiwi-merchant";
18
+ export interface GatewayServeOptions {
19
+ publicUrl?: string;
20
+ catalogUrl: string;
21
+ source: string;
22
+ host: string;
23
+ port: number;
24
+ mcpPath: string;
25
+ dataDir: string;
26
+ connectorTokenEnv: string;
27
+ credentialKeyEnv: string;
28
+ tlsCertPath?: string;
29
+ tlsKeyPath?: string;
30
+ trustedProxy: boolean;
31
+ allowLoopbackCallback: boolean;
32
+ callbackUri?: string;
33
+ checkOnly: boolean;
34
+ portalBaseUrl?: string;
35
+ /** 运维提供的租户(实例)配置 JSON 文件;缺省表示尚无商家配对实例。 */
36
+ tenantConfigPath?: string;
37
+ }
38
+ export declare function defaultGatewayDataDir(cwd?: string): string;
39
+ /** 解析 `kiwi merchant gateway serve` 的原始 flag(含 `--check`)。 */
40
+ export declare function parseGatewayServeArgs(args: string[], env?: Record<string, string | undefined>): GatewayServeOptions;
41
+ export interface GatewayServeReadiness {
42
+ /** 公网入口(OAuth issuer / 连接回跳基准)。 */
43
+ publicUrl: string;
44
+ /** 生效的 OAuth 回调地址(source 派生或显式配置)。 */
45
+ callbackUri: string;
46
+ /** 由本进程终止 TLS。 */
47
+ directTls: boolean;
48
+ /** 监听非 loopback(依赖直接 TLS 或受信反向代理)。 */
49
+ nonLoopback: boolean;
50
+ /** 依赖加密存储的功能是否启用(缺密钥即 false)。 */
51
+ encryptedFeaturesEnabled: boolean;
52
+ /** 已注册(已配对)的商家实例数量;0 表示第 1 版路由未启用。 */
53
+ registeredInstances: number;
54
+ connectorTokenConfigured: boolean;
55
+ warnings: string[];
56
+ }
57
+ export type GatewayServeValidation = {
58
+ ok: true;
59
+ readiness: GatewayServeReadiness;
60
+ } | {
61
+ ok: false;
62
+ error: string;
63
+ };
64
+ /**
65
+ * 启动前校验(fail-closed)。纯函数,便于测试与 `--check` 复用。
66
+ *
67
+ * 规则:
68
+ * - `--public-url` 必填,且 https(loopback http 仅限本地开发);
69
+ * - 监听非 loopback 必须给出 TLS 材料,或显式 `--trusted-proxy`;
70
+ * - TLS 证书与私钥必须成对;
71
+ * - connector token 必须已配置(缺少则入口无法建立商家身份,直接拒绝启动);
72
+ * - 凭据加密密钥缺失**不**拒绝启动,但关闭依赖加密存储的功能并给出警告。
73
+ */
74
+ export declare function validateGatewayServeOptions(opts: GatewayServeOptions, env?: Record<string, string | undefined>): GatewayServeValidation;
75
+ export declare function runGatewayServe(args: string[], env?: Record<string, string | undefined>): Promise<number>;