@harrylabsj/kiwi 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +96 -0
  154. package/dist/merchant-gateway/catalog-publications.js +212 -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 +315 -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 +461 -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 +747 -0
  167. package/dist/merchant-gateway/entry-server.js.map +1 -0
  168. package/dist/merchant-gateway/instance-registration.d.ts +144 -0
  169. package/dist/merchant-gateway/instance-registration.js +391 -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 +186 -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 +54 -0
  178. package/dist/merchant-gateway/pinned-fetch.js +231 -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,402 @@
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 Core 共享业务入口(V2 阶段二:src/merchant-core/service.ts)。
18
+ *
19
+ * 包装 V1 `MerchantWorkbenchService`(facade 语义不变:白名单脱敏、租户校验、
20
+ * MerchantWorkbenchError、fail-closed),在其上补齐阶段二业务面:
21
+ * - 两轨磋商统一列表(negotiation-adapters:source_protocol / source_id,
22
+ * 状态名保留各协议口径;人工处理按来源路由,A2A 人审绝不调 shopping 轨);
23
+ * - 私密阈值读取(F23):仅管理面接缝,读取写审计记录(落盘 jsonl,
24
+ * 绝不记值本身);不作为 MCP 工具暴露,私密数值不进任何工具结果。
25
+ *
26
+ * MCP 工具层(src/mcp/merchant-tools.ts)改调本服务;结构类型与
27
+ * MerchantWorkbenchService 方法面一致,既有调用方无感。
28
+ */
29
+ import { appendFileSync, mkdirSync } from "node:fs";
30
+ import { createHash } from "node:crypto";
31
+ import path from "node:path";
32
+ import { parseProductCreateInput } from "../agent/merchant/types.js";
33
+ import { MerchantWorkbenchError, MerchantWorkbenchService, } from "../merchant/workbench-service.js";
34
+ import { MerchantCommandLog } from "./commands.js";
35
+ import { MerchantExecutorRegistry } from "./executor.js";
36
+ import { parseProductCsv } from "./product-import.js";
37
+ import { credentialsPathFor, syncStatePathFor } from "../weixin/credentials.js";
38
+ import { loadCredentials, loadSyncState } from "../weixin/credentials.js";
39
+ import { WeixinError } from "../weixin/types.js";
40
+ import { assertReviewRoute, fromA2aRow, fromShoppingConsultation, } from "./negotiation-adapters.js";
41
+ export class MerchantCoreService {
42
+ /** V1 facade(委托转发;facade 语义不变)。 */
43
+ workbench;
44
+ intelligence;
45
+ privateValues;
46
+ auditDir;
47
+ capabilities;
48
+ resolveShoppingReview;
49
+ applyPolicyOverride;
50
+ currentPolicy;
51
+ commandPrincipalId;
52
+ confirmationStore;
53
+ operationsStore;
54
+ merchantDataDir;
55
+ now;
56
+ principalId;
57
+ approvalsRef;
58
+ profileRef;
59
+ modeRef;
60
+ constructor(deps) {
61
+ this.workbench = new MerchantWorkbenchService(deps);
62
+ this.now = deps.now;
63
+ this.principalId = deps.profile.agent_id;
64
+ this.approvalsRef = deps.approvals;
65
+ this.profileRef = deps.profile;
66
+ this.modeRef = deps.mode;
67
+ this.commandPrincipalId = deps.commandPrincipalId ?? deps.profile.agent_id;
68
+ if (deps.intelligence !== undefined)
69
+ this.intelligence = deps.intelligence;
70
+ if (deps.privateValues !== undefined)
71
+ this.privateValues = deps.privateValues;
72
+ if (deps.auditDir !== undefined)
73
+ this.auditDir = deps.auditDir;
74
+ if (deps.capabilities !== undefined)
75
+ this.capabilities = deps.capabilities;
76
+ if (deps.resolveShoppingReview !== undefined)
77
+ this.resolveShoppingReview = deps.resolveShoppingReview;
78
+ if (deps.applyPolicyOverride !== undefined)
79
+ this.applyPolicyOverride = deps.applyPolicyOverride;
80
+ if (deps.currentPolicy !== undefined)
81
+ this.currentPolicy = deps.currentPolicy;
82
+ if (deps.operations !== undefined)
83
+ this.operationsStore = deps.operations;
84
+ if (deps.merchantDataDir !== undefined)
85
+ this.merchantDataDir = deps.merchantDataDir;
86
+ if (deps.confirmations !== undefined)
87
+ this.confirmationStore = deps.confirmations;
88
+ }
89
+ // ---- V1 facade 委托(MCP 工具层经此调用) --------------------------------
90
+ listPublicProducts() {
91
+ return this.workbench.listPublicProducts();
92
+ }
93
+ getPublicProduct(sku, merchantId) {
94
+ return this.workbench.getPublicProduct(sku, merchantId);
95
+ }
96
+ getInventorySnapshot(sku) {
97
+ return this.workbench.getInventorySnapshot(sku);
98
+ }
99
+ listA2aNegotiations(limit) {
100
+ return this.workbench.listA2aNegotiations(limit);
101
+ }
102
+ listActiveConsultations() {
103
+ return this.workbench.listActiveConsultations();
104
+ }
105
+ listHumanReviews() {
106
+ return this.workbench.listHumanReviews();
107
+ }
108
+ getAnalytics(period) {
109
+ return this.workbench.getAnalytics(period);
110
+ }
111
+ draftProductChange(input) {
112
+ return this.workbench.draftProductChange(input);
113
+ }
114
+ recoverPendingDrafts() {
115
+ return this.workbench.recoverPendingDrafts();
116
+ }
117
+ approveCandidate(candidateId) {
118
+ return this.workbench.approveCandidate(candidateId);
119
+ }
120
+ // ---- 写闭环(V2 阶段三:持久命令记录 + 固定执行器注册表) -----------------
121
+ commandLogInstance;
122
+ /** 持久命令记录(lazy;store 即 WriteApprovalCandidateStore,单 owner 写)。 */
123
+ get commands() {
124
+ if (this.commandLogInstance === undefined) {
125
+ const executorContext = {
126
+ merchantClient: this.workbench.merchantClientRef,
127
+ profile: this.profileRef,
128
+ ownerId: this.workbench.ownerIdRef,
129
+ ...(this.operationsStore !== undefined ? { operations: this.operationsStore } : {}),
130
+ ...(this.applyPolicyOverride !== undefined
131
+ ? { applyPolicyOverride: this.applyPolicyOverride }
132
+ : {}),
133
+ ...(this.currentPolicy !== undefined ? { currentPolicy: this.currentPolicy } : {}),
134
+ ...(this.resolveShoppingReview !== undefined
135
+ ? { resolveShoppingReview: this.resolveShoppingReview }
136
+ : {}),
137
+ };
138
+ this.commandLogInstance = new MerchantCommandLog({
139
+ store: this.approvalsRef,
140
+ executors: MerchantExecutorRegistry.buildDefault(executorContext),
141
+ executorContext,
142
+ profile: this.profileRef,
143
+ mode: this.modeRef,
144
+ now: this.now,
145
+ principalId: this.commandPrincipalId,
146
+ ...(this.confirmationStore !== undefined ? { confirmations: this.confirmationStore } : {}),
147
+ });
148
+ }
149
+ return this.commandLogInstance;
150
+ }
151
+ /** prepare:商品创建(force_pending 候选,绝不直接执行)。入参白名单
152
+ * 校验 + merchant_id 钉死归属(审查 P1:否则批准后执行必然失败或可跨
153
+ * 商家写,白烧人工确认)。 */
154
+ prepareProductCreate(input) {
155
+ let product;
156
+ try {
157
+ product = parseProductCreateInput(input.product, this.workbench.ownerIdRef);
158
+ }
159
+ catch (err) {
160
+ throw new MerchantWorkbenchError("validation", `product 入参不合法:${err instanceof Error ? err.message : String(err)}`);
161
+ }
162
+ return this.commands.prepare({
163
+ tool: "kiwi_merchant_prepare_product_create",
164
+ arguments: { product },
165
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
166
+ });
167
+ }
168
+ /** prepare:库存调整。 */
169
+ prepareInventoryUpdate(input) {
170
+ if (!Number.isInteger(input.stock) || input.stock < 0) {
171
+ throw new MerchantWorkbenchError("validation", "stock 必须是非负整数");
172
+ }
173
+ return this.commands.prepare({
174
+ tool: "kiwi_merchant_prepare_inventory_update",
175
+ arguments: { sku: input.sku, stock: input.stock },
176
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
177
+ });
178
+ }
179
+ /** prepare:listing 销售状态变更(F08 语义;上游不支持 → fail-closed「不可得」)。 */
180
+ async prepareListingChange(input) {
181
+ if (this.capabilities?.listing_pause === false) {
182
+ throw new MerchantWorkbenchError("unavailable", "上游 shopping-cli 不支持 listing 暂停/恢复端点(能力探测 listing_pause=false);不可得,不降级为库存写零。");
183
+ }
184
+ return this.commands.prepare({
185
+ tool: "kiwi_merchant_prepare_listing_change",
186
+ arguments: { sku: input.sku, paused: input.paused },
187
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
188
+ });
189
+ }
190
+ /** prepare:人工处理(F14 两轨;A2A 轨执行面 fail-closed「不可得」留后续)。 */
191
+ async prepareReviewResolve(input) {
192
+ if (input.source_protocol === "a2a") {
193
+ throw new MerchantWorkbenchError("unavailable", "A2A 轨人工处理的执行面尚未落地(不经 shopping-cli resolve-review);不可得。");
194
+ }
195
+ return this.commands.prepare({
196
+ tool: "kiwi_merchant_prepare_review_resolve",
197
+ arguments: { source_id: input.source_id, resolution: input.resolution },
198
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
199
+ });
200
+ }
201
+ /** prepare:策略变更(F17 热更新;执行器写入覆盖层即生效)。 */
202
+ preparePolicyChange(input) {
203
+ return this.commands.prepare({
204
+ tool: "kiwi_merchant_prepare_policy_change",
205
+ arguments: { patch: input.patch },
206
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
207
+ });
208
+ }
209
+ /** 确认通道:批准并执行(确认凭证 + 重校验 + 幂等 + 回读)。单商家单主体
210
+ * 实例的便捷包装——主体恒为本实例 commandPrincipalId;跨主体校验在
211
+ * commands.executeApproved(管理页传入会话主体时真实生效)。 */
212
+ executeApproved(commandId, confirmationToken) {
213
+ return this.commands.executeApproved(commandId, this.commandPrincipalId, confirmationToken);
214
+ }
215
+ /** 确认通道:拒绝候选(同上:单主体便捷包装)。 */
216
+ rejectCandidate(commandId, confirmationToken) {
217
+ return this.commands.reject(commandId, this.commandPrincipalId, confirmationToken);
218
+ }
219
+ /**
220
+ * 重启恢复(阶段三推广版):恢复全部已注册写工具的 pending 命令
221
+ * (覆盖 V1 recoverPendingDrafts 语义并推广);未注册工具的死候选标 expired。
222
+ */
223
+ recoverPendingCommands() {
224
+ return this.commands.recoverPending();
225
+ }
226
+ listPendingCommands() {
227
+ return this.commands.listPending();
228
+ }
229
+ // ---- 长任务(V2 阶段四:CSV 导入/撤回 + operation 查询) -------------------
230
+ /** prepare:CSV 商品导入(预览逐行回执;幂等键缺省 = CSV 内容 hash)。 */
231
+ async prepareProductsImport(input) {
232
+ if (this.operationsStore === undefined) {
233
+ throw new MerchantWorkbenchError("unavailable", "operation store 未配置(不可得)");
234
+ }
235
+ // 幂等键(审查 P1):显式 key 与参数摘要绑定——同 key 同内容仍幂等重放,
236
+ // 同 key 不同内容不再碰撞(旧逻辑会静默返回旧 operation 并谎报成功);
237
+ // 空/纯空白 key 拒绝(nullish 兜底不覆盖空串)。
238
+ const userKey = input.idempotency_key?.trim() ?? "";
239
+ if (input.idempotency_key !== undefined && userKey === "") {
240
+ throw new MerchantWorkbenchError("validation", "idempotency_key 不能为空字符串(省略该参数即自动按内容摘要生成)");
241
+ }
242
+ const digest = createHash("sha256").update(input.csv).digest("hex").slice(0, 16);
243
+ const key = userKey !== "" ? `csv-${userKey}-${digest}` : `csv-${digest}`;
244
+ // 预览:解析 + 新增/更新判定(逐行错误回执)
245
+ const current = await this.workbench.merchantClientRef.listProducts(this.workbench.ownerIdRef);
246
+ const { preview } = parseProductCsv(input.csv, new Set(current.map((p) => p.sku)));
247
+ const prepared = await this.commands.prepare({
248
+ tool: "kiwi_merchant_prepare_products_import",
249
+ arguments: { csv: input.csv, idempotency_key: key },
250
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
251
+ });
252
+ prepared.preview = { ...prepared.preview, import_preview: preview };
253
+ return prepared;
254
+ }
255
+ /** prepare:批量撤回(listing 销售状态语义;幂等键缺省 = skus hash)。 */
256
+ async prepareProductsWithdraw(input) {
257
+ if (this.operationsStore === undefined) {
258
+ throw new MerchantWorkbenchError("unavailable", "operation store 未配置(不可得)");
259
+ }
260
+ // 幂等键(审查 P1):与 CSV 导入同规则——显式 key 绑定 skus 摘要,空串拒绝。
261
+ const userKey = input.idempotency_key?.trim() ?? "";
262
+ if (input.idempotency_key !== undefined && userKey === "") {
263
+ throw new MerchantWorkbenchError("validation", "idempotency_key 不能为空字符串(省略该参数即自动按内容摘要生成)");
264
+ }
265
+ const digest = createHash("sha256").update(input.skus.join(",")).digest("hex").slice(0, 16);
266
+ const key = userKey !== "" ? `withdraw-${userKey}-${digest}` : `withdraw-${digest}`;
267
+ return this.commands.prepare({
268
+ tool: "kiwi_merchant_prepare_products_withdraw",
269
+ arguments: { skus: input.skus, idempotency_key: key },
270
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
271
+ });
272
+ }
273
+ /** 长任务查询(read scope)。 */
274
+ getOperation(operationId) {
275
+ if (this.operationsStore === undefined) {
276
+ throw new MerchantWorkbenchError("unavailable", "operation store 未配置(不可得)");
277
+ }
278
+ const op = this.operationsStore.get(operationId);
279
+ if (op === undefined) {
280
+ throw new MerchantWorkbenchError("not_found", `未知 operation ${operationId}`);
281
+ }
282
+ return op;
283
+ }
284
+ // ---- 微信通道状态(F29:只读;脱敏;不可得明确标注) -----------------------
285
+ /**
286
+ * 微信绑定状态与同步概况(只读)。脱敏:绝不返回 bot_token。
287
+ * 最近事件列表:当前微信通道无事件存储——明确「不可得」(不编造)。
288
+ */
289
+ getWeixinStatus() {
290
+ if (this.merchantDataDir === undefined) {
291
+ throw new MerchantWorkbenchError("unavailable", "未配置 merchantDataDir,微信状态不可得");
292
+ }
293
+ const credPath = credentialsPathFor(this.merchantDataDir);
294
+ try {
295
+ const creds = loadCredentials(credPath);
296
+ const sync = loadSyncState(syncStatePathFor(this.merchantDataDir));
297
+ return {
298
+ bound: true,
299
+ account: {
300
+ bot_id: creds.ilink_bot_id,
301
+ user_id: creds.ilink_user_id,
302
+ saved_at: creds.saved_at,
303
+ },
304
+ sync: { buffered: sync.get_updates_buf !== "", seen_count: sync.seen.length },
305
+ recent_events: "不可得(微信通道无事件存储;只有同步游标与去重指纹)",
306
+ };
307
+ }
308
+ catch (err) {
309
+ if (err instanceof WeixinError && err.code === "not_configured") {
310
+ return {
311
+ bound: false,
312
+ recent_events: "不可得(未绑定)",
313
+ note: "未绑定微信(kiwi weixin 扫码登录后绑定)",
314
+ };
315
+ }
316
+ throw new MerchantWorkbenchError("unavailable", `微信状态读取失败:${err instanceof Error ? err.message : String(err)}`);
317
+ }
318
+ }
319
+ // ---- 两轨磋商(V2 §5.2) ------------------------------------------------
320
+ /**
321
+ * 统一磋商列表:A2A 轨(Ledger)+ shopping 会话轨(merchantClient),每条带
322
+ * source_protocol/source_id,状态名保留各协议口径。needs_human_review:
323
+ * 有 intelligence 时用其权威口径,否则 A2A 轨退化相位判断。
324
+ * 单轨不可用(如未配置 ledger)不拖垮另一轨:tracks 标注 unavailable,
325
+ * 明确「不可得」而非静默缺半(V2 §4:缺失数据明确显示)。
326
+ */
327
+ async listUnifiedNegotiations(limit) {
328
+ const tracks = { a2a: "ok", shopping: "ok" };
329
+ let a2aRows = [];
330
+ try {
331
+ a2aRows = (await this.workbench.listA2aNegotiations(limit)).items;
332
+ }
333
+ catch (err) {
334
+ // 仅「未配置/不可用」降级为单轨;其他错误(fail-closed)照常抛出。
335
+ if (err instanceof MerchantWorkbenchError && err.kind === "unavailable") {
336
+ tracks.a2a = "unavailable";
337
+ }
338
+ else {
339
+ throw err;
340
+ }
341
+ }
342
+ const a2aNeedsReview = new Map();
343
+ if (this.intelligence !== undefined && tracks.a2a === "ok") {
344
+ const digest = await this.intelligence.getNegotiationDigest({
345
+ merchant_id: this.workbench.ownerIdRef,
346
+ status: "all",
347
+ limit: 100,
348
+ });
349
+ for (const d of digest)
350
+ a2aNeedsReview.set(d.negotiation_id, d.needs_human_review);
351
+ }
352
+ const rows = a2aRows.map((row) => fromA2aRow(row, a2aNeedsReview.get(row.negotiation_id) ?? row.phase === "AWAITING_CLARIFICATION"));
353
+ // shopping 会话轨(上游故障 fail-closed:错误直接透出,不混轨填充)
354
+ let consultations = [];
355
+ try {
356
+ consultations = await this.workbench.merchantClientRef.listIncomingConsultations(this.workbench.ownerIdRef);
357
+ }
358
+ catch {
359
+ tracks.shopping = "unavailable";
360
+ }
361
+ for (const c of consultations)
362
+ rows.push(fromShoppingConsultation(c));
363
+ rows.sort((a, b) => (a.updated_at > b.updated_at ? -1 : a.updated_at < b.updated_at ? 1 : 0));
364
+ return { total: rows.length, items: rows, tracks };
365
+ }
366
+ /** 人工处理目标列表(两轨;每条带路由标记,调用方必须按来源路由)。 */
367
+ async listHumanReviewTargets() {
368
+ const { items } = await this.listUnifiedNegotiations(100);
369
+ return items.filter((r) => r.needs_human_review);
370
+ }
371
+ /**
372
+ * 人工处理路由守卫(V2 §5.2):A2A 来源走 a2a 通道,shopping 来源走
373
+ * shopping 通道;跨轨调用 fail-closed 抛错。
374
+ */
375
+ assertReviewRoute(row, channel) {
376
+ assertReviewRoute(row.source_protocol, channel);
377
+ }
378
+ // ---- 私密阈值(F23:管理面接缝 + 读取审计;绝不进工具结果) ---------------
379
+ /**
380
+ * 读取私密阈值(店主私密面板用;不挂 MCP 工具)。读取动作写审计记录
381
+ * (at/principal/keys 数量——绝不记值)。未配置审计目录时拒绝(fail-closed:
382
+ * 无审计不裸读私密值)。
383
+ */
384
+ readPrivateThresholds() {
385
+ if (this.privateValues === undefined) {
386
+ return [];
387
+ }
388
+ if (this.auditDir === undefined) {
389
+ throw new Error("私密阈值读取需要审计目录(auditDir);无审计不裸读(fail-closed)");
390
+ }
391
+ const values = this.privateValues();
392
+ mkdirSync(this.auditDir, { recursive: true, mode: 0o700 });
393
+ appendFileSync(path.join(this.auditDir, "private-access.jsonl"), `${JSON.stringify({
394
+ at: this.now(),
395
+ principal_id: this.principalId,
396
+ action: "read_private_thresholds",
397
+ keys_count: values.length,
398
+ })}\n`, { mode: 0o600 });
399
+ return values;
400
+ }
401
+ }
402
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/merchant-core/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
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 interface MerchantPublicationView {
18
+ readonly publication_id: string;
19
+ readonly merchant_id: string;
20
+ readonly merchant_display_name: string;
21
+ readonly title: string;
22
+ readonly category: string;
23
+ readonly summary: string;
24
+ readonly shop_platform: string;
25
+ readonly shop_url: string;
26
+ readonly faq: ReadonlyArray<{
27
+ question: string;
28
+ answer: string;
29
+ }>;
30
+ readonly source_kind: string;
31
+ readonly status: string;
32
+ readonly version: number;
33
+ readonly published_at: string;
34
+ readonly expires_at: string;
35
+ readonly updated_at: string;
36
+ readonly inquiry_available: false;
37
+ }
38
+ export interface PublicationDraftInput {
39
+ merchantDisplayName: string;
40
+ title: string;
41
+ category?: string;
42
+ summary?: string;
43
+ shopPlatform?: string;
44
+ shopUrl?: string;
45
+ faq?: ReadonlyArray<{
46
+ question: string;
47
+ answer: string;
48
+ }>;
49
+ expiresAt?: string;
50
+ }
51
+ /** 汇总里的一条公开资料(不含正文——正文由 `getPublication` 单独取)。 */
52
+ export interface MerchantStatsPublication {
53
+ readonly publicationId: string;
54
+ readonly title: string;
55
+ readonly status: string;
56
+ readonly viewCount: number;
57
+ readonly publishedAt: string;
58
+ }
59
+ /**
60
+ * 商家经营汇总(匿名聚合)。目录只给数字,不给买家身份或名单。
61
+ */
62
+ export interface MerchantStats {
63
+ readonly followersTotal: number;
64
+ readonly viewsTotal: number;
65
+ readonly publications: ReadonlyArray<MerchantStatsPublication>;
66
+ }
67
+ export interface PublicationSaveResult {
68
+ readonly publication: MerchantPublicationView;
69
+ readonly created: boolean;
70
+ readonly idempotent: boolean;
71
+ }
72
+ export interface MerchantPublicationClientDeps {
73
+ /** Catalog 服务根 URL。 */
74
+ baseUrl: string;
75
+ fetchImpl?: typeof fetch;
76
+ timeoutMs?: number;
77
+ }
78
+ export declare class MerchantPublicationClient {
79
+ private readonly baseUrl;
80
+ private readonly deps;
81
+ constructor(deps: MerchantPublicationClientDeps);
82
+ /** 保存草稿(action=draft;发布不由入口执行)。 */
83
+ saveDraft(token: string, input: PublicationDraftInput): Promise<PublicationSaveResult>;
84
+ getPublication(token: string, publicationId: string): Promise<MerchantPublicationView>;
85
+ withdraw(token: string, publicationId: string): Promise<MerchantPublicationView>;
86
+ /**
87
+ * 商家本人的匿名经营汇总(只读):关注者总数 + 公开资料浏览量明细。
88
+ *
89
+ * 目录侧该接口的设计是**只回聚合数字**——不返回买家身份、不返回关注列表、也
90
+ * 不提供向关注者发消息的通道(kiwi-catalog `publication_stats` 的契约)。
91
+ * 本方法只透出聚合数与资料本身的可公开字段,响应里的其它内容不进入返回值,
92
+ * 也就不会进模型上下文。
93
+ */
94
+ fetchStats(token: string): Promise<MerchantStats>;
95
+ private request;
96
+ }