@harrylabsj/kiwi-merchant-cloud 0.12.0 → 0.12.2

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 (50) hide show
  1. package/app/cloud/bootstrap.d.ts +2 -0
  2. package/app/cloud/bootstrap.js +93 -10
  3. package/app/cloud/bootstrap.js.map +1 -1
  4. package/app/cloud/catalog-client.d.ts +2 -0
  5. package/app/cloud/catalog-client.js +5 -1
  6. package/app/cloud/catalog-client.js.map +1 -1
  7. package/app/cloud/connect-service.d.ts +153 -0
  8. package/app/cloud/connect-service.js +897 -0
  9. package/app/cloud/connect-service.js.map +1 -0
  10. package/app/cloud/file-listing-publication.d.ts +105 -0
  11. package/app/cloud/file-listing-publication.js +436 -0
  12. package/app/cloud/file-listing-publication.js.map +1 -0
  13. package/app/cloud/merchant-connect.d.ts +19 -13
  14. package/app/cloud/merchant-connect.js +43 -284
  15. package/app/cloud/merchant-connect.js.map +1 -1
  16. package/app/cloud-sample/products.json +3 -3
  17. package/app/http/merchant-management/api.d.ts +23 -1
  18. package/app/http/merchant-management/api.js +141 -1
  19. package/app/http/merchant-management/api.js.map +1 -1
  20. package/app/http/merchant-management/page.d.ts +4 -1
  21. package/app/http/merchant-management/page.js +126 -7
  22. package/app/http/merchant-management/page.js.map +1 -1
  23. package/build-manifest.json +116 -86
  24. package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
  25. package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
  26. package/node_modules/@hono/node-server/dist/index.cjs +41 -19
  27. package/node_modules/@hono/node-server/dist/index.mjs +42 -20
  28. package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
  29. package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
  30. package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
  31. package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
  32. package/node_modules/@hono/node-server/package.json +3 -2
  33. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
  34. package/node_modules/hono/dist/cjs/jsx/utils.js +1 -1
  35. package/node_modules/hono/dist/cjs/middleware/combine/index.js +3 -1
  36. package/node_modules/hono/dist/cjs/middleware/etag/index.js +2 -2
  37. package/node_modules/hono/dist/cjs/middleware/language/language.js +1 -1
  38. package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +1 -0
  39. package/node_modules/hono/dist/jsx/utils.js +1 -1
  40. package/node_modules/hono/dist/middleware/combine/index.js +3 -1
  41. package/node_modules/hono/dist/middleware/etag/index.js +2 -2
  42. package/node_modules/hono/dist/middleware/serve-static/index.js +1 -0
  43. package/node_modules/hono/package.json +2 -2
  44. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +19 -18
  45. package/node_modules/yaml/browser/dist/nodes/Alias.js +25 -23
  46. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +19 -18
  47. package/node_modules/yaml/dist/nodes/Alias.js +25 -23
  48. package/node_modules/yaml/package.json +1 -1
  49. package/package.json +2 -2
  50. package/runtime-package.json +2 -2
@@ -13,20 +13,26 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ /**
17
+ * 独立 Merchant Runtime 的设备授权、自动绑定和名片发布(**CLI 适配层**)。
18
+ *
19
+ * 协议状态机本体在 `connect-service.ts`(createMerchantConnectionService);
20
+ * 本文件只做四件 CLI 特有的事:
21
+ *
22
+ * 1. `parsePublicOrigin` 的公网入口校验(私网/非 https/带路径一律拒绝);
23
+ * 2. 把 begin() 拿到的本人配对信息打印到**商家本机**终端并代开浏览器;
24
+ * 配对码只出现在这里——服务端后台路径(connect-service)永不输出它;
25
+ * 3. 在授权截止前以 1s 步长驱动 reconcile()(实际 poll 间隔由服务按
26
+ * interval/slow_down 节流);
27
+ * 4. 用与旧版逐字相同的 MerchantConnectError 错误码向上传递失败。
28
+ *
29
+ * 对外契约(函数签名、options 形状、返回 {agentId, bindingId, cardRevision}、
30
+ * 错误码与文案)与抽取前保持一致;`selectReusableEnrollment` /
31
+ * `priorPublishedCatalogAgentId` 实现移至 connect-service.ts,这里再导出以
32
+ * 兼容既有引用(tests/merchant-connect-migration.test.ts)。
33
+ */
16
34
  import type { AgentProfile } from "../config/profile.js";
17
- import { type AuthorizedEnrollment } from "./binding/enrollment-challenge.js";
18
- export declare class MerchantConnectError extends Error {
19
- readonly code: string;
20
- constructor(code: string, message: string);
21
- }
22
- /** Pure resume selection: only the same thumbprint+origin can reuse a grant/device code. */
23
- export declare function selectReusableEnrollment(sessions: readonly AuthorizedEnrollment[], input: {
24
- runtimeOrigin: string;
25
- keyThumbprint: string;
26
- nowMs: number;
27
- }): AuthorizedEnrollment | undefined;
28
- /** Keep the Catalog account's single-agent identity through key loss and address migration. */
29
- export declare function priorPublishedCatalogAgentId(sessions: readonly AuthorizedEnrollment[]): string | undefined;
35
+ export { MerchantConnectError, priorPublishedCatalogAgentId, selectReusableEnrollment, } from "./connect-service.js";
30
36
  export interface MerchantConnectOptions {
31
37
  profile: AgentProfile;
32
38
  dataDir: string;
@@ -13,24 +13,8 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- /** 独立 Merchant Runtime 的设备授权、自动绑定和名片发布。 */
17
- import { isIP } from "node:net";
18
- import { validateAgentCard } from "../discovery/agent-card/validate.js";
19
- import { loadOrCreateA2aSigningIdentity, toJwsSigningIdentity } from "../a2a/signing-key.js";
20
- import { writeFileAtomic } from "../fs/atomic-write.js";
21
- import { canonicalize } from "../negotiation/jcs.js";
22
- import { CatalogClient, runtimePublicKey } from "./catalog-client.js";
23
- import { enrollmentStorePath, readEnrollmentStore } from "./binding/enrollment-challenge.js";
24
- import { createHash } from "node:crypto";
25
- import { isRedirectResponse, readJsonBody } from "../net/safe-http.js";
26
- export class MerchantConnectError extends Error {
27
- code;
28
- constructor(code, message) {
29
- super(message);
30
- this.code = code;
31
- this.name = "MerchantConnectError";
32
- }
33
- }
16
+ import { createMerchantConnectionService, isPublicHostAllowed, MerchantConnectError, } from "./connect-service.js";
17
+ export { MerchantConnectError, priorPublishedCatalogAgentId, selectReusableEnrollment, } from "./connect-service.js";
34
18
  function parsePublicOrigin(raw) {
35
19
  if (raw === undefined || raw.trim() === "") {
36
20
  throw new MerchantConnectError("PUBLIC_ORIGIN_MISSING", "商家服务还没有可用的公网 HTTPS 入口,买家暂时无法连接并询价。请先运行 `kiwi merchant setup-public` 查看 DNS/Caddy 配置指引,或使用 WorkBuddy 云端应用;完成后重新运行 `kiwi merchant connect`,已有资料会保留。地址格式通过不代表外部可访问,Catalog 还会执行真实端点挑战。");
@@ -43,289 +27,64 @@ function parsePublicOrigin(raw) {
43
27
  throw new MerchantConnectError("PUBLIC_ORIGIN_INVALID", "公网入口不是合法 URL;请设置 KIWI_A2A_PUBLIC_URL=https://你的域名");
44
28
  }
45
29
  const host = url.hostname.toLowerCase();
46
- const normalizedHost = host.replace(/^\[|\]$/g, "");
47
- const ip = isIP(normalizedHost);
48
- const octets = ip === 4 ? normalizedHost.split(".").map(Number) : [];
49
- const privateIpv4 = ip === 4 && (octets[0] === 0 || octets[0] === 10 || octets[0] === 127 || octets[0] === 169 && octets[1] === 254 ||
50
- octets[0] === 192 && octets[1] === 168 || octets[0] === 172 && (octets[1] ?? 0) >= 16 && (octets[1] ?? 0) <= 31 ||
51
- octets[0] === 100 && (octets[1] ?? 0) >= 64 && (octets[1] ?? 0) <= 127 || (octets[0] ?? 0) >= 224);
52
- const privateIpv6 = ip === 6 && (normalizedHost === "::" || normalizedHost === "::1" || normalizedHost.startsWith("fc") ||
53
- normalizedHost.startsWith("fd") || normalizedHost.startsWith("fe80:") || normalizedHost.startsWith("::ffff:"));
54
30
  if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash ||
55
- (url.pathname !== "/" && url.pathname !== "") || host === "localhost" || host.endsWith(".localhost") ||
56
- host.endsWith(".local") || host.endsWith(".internal") || host.endsWith(".lan") || host.endsWith(".home") ||
57
- !host.includes(".") || privateIpv4 || privateIpv6) {
31
+ (url.pathname !== "/" && url.pathname !== "") || !isPublicHostAllowed(host)) {
58
32
  throw new MerchantConnectError("PUBLIC_ORIGIN_INVALID", "商家服务尚未配置可用的公网 HTTPS origin。请运行 `kiwi merchant setup-public` 查看入口配置指引;资料已保留,配置后重新运行连接命令。");
59
33
  }
60
34
  return url.origin;
61
35
  }
62
- function writeState(dataDir, state) {
63
- writeFileAtomic(enrollmentStorePath(dataDir), `${JSON.stringify(state)}\n`, { mode: 0o600 });
64
- }
65
- function stateSession(dataDir, enrollmentId) {
66
- const store = readEnrollmentStore(dataDir);
67
- const value = store.sessions.find((s) => s.enrollment_id === enrollmentId);
68
- return value;
69
- }
70
- /** Pure resume selection: only the same thumbprint+origin can reuse a grant/device code. */
71
- export function selectReusableEnrollment(sessions, input) {
72
- return sessions.find((session) => {
73
- const state = session;
74
- return state.runtime_origin === input.runtimeOrigin && state.key_thumbprint === input.keyThumbprint &&
75
- ["preparing", "authorized", "bound", "published"].includes(state.status) &&
76
- (state.status === "published" || Number.isFinite(Date.parse(state.expires_at)) && Date.parse(state.expires_at) > input.nowMs);
77
- });
78
- }
79
- /** Keep the Catalog account's single-agent identity through key loss and address migration. */
80
- export function priorPublishedCatalogAgentId(sessions) {
81
- const ids = new Set(sessions
82
- .map((session) => session)
83
- .filter((session) => session.status === "published" && typeof session.catalog_agent_id === "string")
84
- .map((session) => session.catalog_agent_id));
85
- if (ids.size > 1)
86
- throw new MerchantConnectError("AMBIGUOUS_MIGRATION", "本Runtime已有多个Catalog Agent历史绑定;请在Catalog先确认要迁移的商家身份。");
87
- return ids.values().next().value;
88
- }
89
- async function verifyPublicRuntimeReady(origin, expectedEndpoint, identity, fetchImpl = globalThis.fetch) {
90
- const controller = new AbortController();
91
- const timer = setTimeout(() => controller.abort(), 8_000);
92
- const url = `${origin}/.well-known/agent-card.json`;
93
- try {
94
- const response = await fetchImpl(url, { method: "GET", redirect: "manual", signal: controller.signal, headers: { accept: "application/json" } });
95
- if (isRedirectResponse(response) || !response.ok) {
96
- throw new MerchantConnectError("RUNTIME_UNREACHABLE", `暂时无法从外部读取商家服务的 Agent Card(HTTP ${response.status})。请确认服务已启动且公网入口可访问,然后重新运行 kiwi merchant connect。`);
97
- }
98
- const card = validateAgentCard(await readJsonBody(response, { signal: controller.signal }));
99
- const urls = card.supportedInterfaces.map((entry) => entry.url);
100
- if (typeof card.url !== "string" || new URL(card.url).origin !== origin || !urls.includes(expectedEndpoint)) {
101
- throw new MerchantConnectError("RUNTIME_NOT_READY", "公网入口返回的 Agent Card 与当前 Runtime 地址不一致;未发布名片。请检查反向代理与服务配置后重试。");
102
- }
103
- const signatureScheme = card.securitySchemes?.["kiwi-signature"];
104
- if (signatureScheme !== undefined && (signatureScheme.type !== "kiwi-http-message-signature" ||
105
- signatureScheme.keyid !== identity.keyid ||
106
- signatureScheme.publicKeyPem !== identity.publicKeyPem ||
107
- signatureScheme.algorithm !== "ed25519")) {
108
- throw new MerchantConnectError("RUNTIME_IDENTITY_MISMATCH", "公网服务的 A2A 签名声明与当前 Runtime 持久密钥不一致;未发布名片。请在实际承接请求的 Runtime 主机上运行连接命令。");
109
- }
110
- return card;
111
- }
112
- catch (err) {
113
- if (err instanceof MerchantConnectError)
114
- throw err;
115
- throw new MerchantConnectError("RUNTIME_UNREACHABLE", `暂时无法从外部连接你的商家服务(${err instanceof Error ? err.message : String(err)})。请确认服务已启动、TLS 证书有效且允许公网访问,然后重试。`);
116
- }
117
- finally {
118
- clearTimeout(timer);
119
- }
120
- }
121
36
  /** 失败时保留设备状态、许可与绑定回执;重跑命令按相同 enrollment 继续。 */
122
37
  export async function connectMerchant(options) {
123
38
  if (options.profile.role !== "merchant")
124
39
  throw new MerchantConnectError("PROFILE_NOT_MERCHANT", "kiwi merchant connect 需要 merchant profile");
125
40
  const origin = parsePublicOrigin(options.publicOrigin ?? process.env.KIWI_A2A_PUBLIC_URL);
126
- const endpoint = `${origin}/a2a`;
127
- const identityRaw = loadOrCreateA2aSigningIdentity(options.dataDir, origin);
128
- const identity = { signingIdentity: toJwsSigningIdentity(identityRaw), keyId: identityRaw.keyid };
129
- const fetchImpl = options.fetchImpl ?? globalThis.fetch;
130
- const client = new CatalogClient({ baseUrl: options.catalogUrl, fetchImpl });
131
- const output = options.output ?? ((line) => process.stdout.write(`${line}\n`));
41
+ const output = options.output ?? ((line) => {
42
+ process.stdout.write(`${line}\n`);
43
+ });
132
44
  const now = options.now ?? (() => new Date());
133
45
  const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
134
- const { keyThumbprint } = runtimePublicKey(identity);
135
- // 公开预览直接取运行中的真实 Agent Card,避免按 CLI 配置猜测 bearer/signature 能力。
136
- let card = await verifyPublicRuntimeReady(origin, endpoint, identityRaw, fetchImpl);
137
- const catalogOrigin = new URL(options.catalogUrl).origin;
138
- const store = readEnrollmentStore(options.dataDir);
139
- let state = selectReusableEnrollment(store.sessions, { runtimeOrigin: origin, keyThumbprint, nowMs: now().getTime() });
140
- if (state !== undefined) {
141
- if (state.catalog_origin !== catalogOrigin)
142
- throw new MerchantConnectError("CATALOG_MISMATCH", "待续办的接入任务属于另一个 Catalog;为防止许可串用,已停止。");
143
- if (state.frozen_card === undefined || typeof state.preview_digest !== "string")
144
- throw new MerchantConnectError("STATE_INVALID", "持久接入任务缺少冻结的公开名片,已停止。");
145
- const frozenDigest = `sha256:${createHash("sha256").update(canonicalize(state.frozen_card), "utf8").digest("hex")}`;
146
- if (frozenDigest !== state.preview_digest)
147
- throw new MerchantConnectError("STATE_INVALID", "持久化的已批准名片摘要不匹配,已停止。");
148
- const currentDigest = `sha256:${createHash("sha256").update(canonicalize(card), "utf8").digest("hex")}`;
149
- if (currentDigest !== state.preview_digest) {
150
- throw new MerchantConnectError(state.status === "published" ? "RUNTIME_CARD_CHANGED" : "PREVIEW_CHANGED", "公网服务当前的 Agent Card 与已批准预览不同;请核对变更并重新授权,Runtime不会静默更改已公开信息。");
46
+ const service = createMerchantConnectionService({
47
+ dataDir: options.dataDir,
48
+ catalogUrl: options.catalogUrl,
49
+ publicOrigin: origin,
50
+ generation: 1,
51
+ serviceEpoch: 1,
52
+ ...(options.fetchImpl !== undefined ? { fetchImpl: options.fetchImpl } : {}),
53
+ ...(options.now !== undefined ? { now: options.now } : {}),
54
+ });
55
+ const completed = (summary) => {
56
+ if (!summary.published || summary.agentId === null || summary.bindingId === null || summary.cardRevision === null) {
57
+ throw new MerchantConnectError("STATE_INCOMPLETE", "连接流程尚未完成,未显示已上线。");
151
58
  }
152
- card = state.frozen_card;
153
- const existingAgentId = state.catalog_agent_id;
154
- const existingBindingId = state.binding_id;
155
- const existingCardRevision = state.card_revision;
156
- if (state.status === "published" && existingAgentId !== undefined && existingBindingId !== undefined && existingCardRevision !== undefined) {
157
- const active = await client.fetchPublicBinding(existingAgentId);
158
- if (active === null || active.bindingId !== existingBindingId || active.keyThumbprint !== keyThumbprint ||
159
- active.runtimeOrigin.replace(/\/+$/, "") !== origin || active.cardRevision !== existingCardRevision ||
160
- !Number.isFinite(Date.parse(active.expiresAt)) || Date.parse(active.expiresAt) <= now().getTime() ||
161
- !["ACTIVE", "active"].includes(active.publicationState)) {
162
- throw new MerchantConnectError("PUBLICATION_NOT_ACTIVE", "Catalog 当前没有返回这条绑定和已激活名片;服务可能已暂停或撤回。请到Catalog恢复服务后再检查,Runtime不会自动恢复营业。");
163
- }
164
- if (state.merchant_id === undefined) {
165
- state = { ...state, merchant_id: active.merchantId };
166
- const latest = readEnrollmentStore(options.dataDir);
167
- latest.sessions = latest.sessions.map((s) => s.enrollment_id === state?.enrollment_id ? state : s);
168
- writeState(options.dataDir, latest);
169
- }
170
- else if (state.merchant_id !== active.merchantId) {
171
- throw new MerchantConnectError("BINDING_MERCHANT_MISMATCH", "Catalog binding的merchant_id与本地Enrollment不一致,已停止。");
172
- }
173
- return { agentId: existingAgentId, bindingId: existingBindingId, cardRevision: existingCardRevision };
59
+ return { agentId: summary.agentId, bindingId: summary.bindingId, cardRevision: summary.cardRevision };
60
+ };
61
+ // begin() 幂等:已 published 且 Catalog 侧仍 ACTIVE 时直接回结果;
62
+ // 已暂停/撤回时 begin() 抛 PUBLICATION_NOT_ACTIVE(与旧版一致)。
63
+ const first = await service.begin();
64
+ if (first.published)
65
+ return completed(first);
66
+ if (first.status === "awaiting_confirmation") {
67
+ const pairing = service.getPairing();
68
+ if (pairing === null) {
69
+ throw new MerchantConnectError("STATE_INVALID", "本地接入任务缺少配对信息,已停止。");
174
70
  }
175
- }
176
- if (state === undefined) {
177
- const expectedCatalogAgentId = priorPublishedCatalogAgentId(store.sessions);
178
- const session = await client.createDeviceEnrollment({
179
- runtimeOrigin: origin,
180
- a2aEndpoint: endpoint,
181
- generation: 1,
182
- serviceEpoch: 1,
183
- publicPreview: card,
184
- publicProfileRevision: 1,
185
- }, identity);
186
- state = {
187
- enrollment_id: session.enrollmentId,
188
- runtime_origin: origin,
189
- key_thumbprint: keyThumbprint,
190
- catalog_origin: catalogOrigin,
191
- preview_digest: `sha256:${createHash("sha256").update(canonicalize(card), "utf8").digest("hex")}`,
192
- frozen_card: card,
193
- ...(expectedCatalogAgentId !== undefined ? { expected_catalog_agent_id: expectedCatalogAgentId } : {}),
194
- expires_at: session.expiresAt,
195
- status: "preparing",
196
- device_code: session.deviceCode,
197
- user_code: session.userCode,
198
- verification_uri: session.verificationUri,
199
- interval: session.intervalSeconds,
200
- };
201
- store.sessions = [...store.sessions.filter((s) => s.status === "bound" || s.status === "published"), state];
202
- writeState(options.dataDir, store);
203
- }
204
- if (state.status === "preparing") {
205
- output(`即将授权连接 ${options.profile.name ?? options.profile.agent_id}(配对码 ${state.user_code})。请在 Catalog 页面确认店铺公开信息;不要把配对码发给他人。`);
206
- options.openBrowser?.(state.verification_uri);
207
- output(`授权页面:${state.verification_uri}`);
208
- output(`Runtime 已开始等待登录与一次「连接此服务并发布」确认;可 Ctrl+C 后重新运行命令继续。`);
209
- const deadline = Math.min(Date.parse(state.expires_at), now().getTime() + (options.timeoutMs ?? 10 * 60_000));
210
- let interval = state.interval * 1000;
211
- while (now().getTime() < deadline) {
212
- const result = await client.pollDeviceEnrollment(state.device_code, identity);
213
- if (result.status === "slow_down")
214
- interval = Math.max(interval + 5_000, result.intervalSeconds * 1000);
215
- else if (result.status === "authorization_pending")
216
- interval = Math.max(interval, result.intervalSeconds * 1000);
217
- else if (result.status === "authorized") {
218
- if (result.enrollmentId !== state.enrollment_id || result.runtimeOrigin !== origin || result.a2aEndpoint !== endpoint ||
219
- result.merchantId.trim() === "" ||
220
- state.expected_catalog_agent_id !== undefined && result.catalogAgentId !== state.expected_catalog_agent_id) {
221
- throw new MerchantConnectError("AUTHORIZED_MATERIAL_MISMATCH", "Catalog 授权材料与当前 Runtime 不一致,已停止连接。");
222
- }
223
- if (result.authorizationEpoch < 1 || result.approvedCardDigest !== state.preview_digest ||
224
- !result.scopes.includes("runtime:bind") || !result.scopes.includes("card:publish") ||
225
- !result.scopes.includes("heartbeat")) {
226
- throw new MerchantConnectError("GRANT_SCOPE_INVALID", "Catalog 接入许可缺少有效授权代次或必要范围,已停止。");
227
- }
228
- state = { ...state, status: "authorized", catalog_agent_id: result.catalogAgentId, merchant_id: result.merchantId, grant: result.grant, authorization_epoch: result.authorizationEpoch, expires_at: result.expiresAt };
229
- const latest = readEnrollmentStore(options.dataDir);
230
- latest.sessions = latest.sessions.map((s) => s.enrollment_id === state?.enrollment_id ? state : s);
231
- writeState(options.dataDir, latest);
71
+ output(`即将授权连接 ${options.profile.name ?? options.profile.agent_id}(配对码 ${pairing.userCode})。请在 Catalog 页面确认店铺公开信息;不要把配对码发给他人。`);
72
+ options.openBrowser?.(pairing.verificationUri);
73
+ output(`授权页面:${pairing.verificationUri}`);
74
+ output("Runtime 已开始等待登录与一次「连接此服务并发布」确认;可 Ctrl+C 后重新运行命令继续。");
75
+ const deadline = Math.min(Date.parse(pairing.expiresAt), now().getTime() + (options.timeoutMs ?? 10 * 60_000));
76
+ let summary = first;
77
+ while (summary.status === "awaiting_confirmation") {
78
+ if (now().getTime() >= deadline)
232
79
  break;
233
- }
234
- await sleep(interval);
235
- }
236
- }
237
- state = stateSession(options.dataDir, state.enrollment_id) ?? state;
238
- if (state.status === "preparing")
239
- throw new MerchantConnectError("AUTHORIZATION_PENDING", "尚未完成商家授权。会话已保存,运行 kiwi merchant connect 可继续。");
240
- if (state.status === "authorized") {
241
- if (state.grant === undefined || state.catalog_agent_id === undefined || state.authorization_epoch === undefined || state.merchant_id === undefined)
242
- throw new MerchantConnectError("STATE_INVALID", "本地授权状态缺少许可、授权代次、merchant_id或 catalog_agent_id");
243
- const binding = await client.bindEnrollment({
244
- enrollmentId: state.enrollment_id,
245
- grant: state.grant,
246
- catalogAgentId: state.catalog_agent_id,
247
- merchantId: state.merchant_id,
248
- runtimeOrigin: origin,
249
- a2aEndpoint: endpoint,
250
- generation: 1,
251
- serviceEpoch: 1,
252
- authorizationEpoch: state.authorization_epoch,
253
- }, identity);
254
- if (binding.keyThumbprint !== keyThumbprint)
255
- throw new MerchantConnectError("BINDING_KEY_MISMATCH", "Catalog 绑定回执的密钥与本 Runtime 不一致");
256
- const rawClaims = binding.bindingClaim["claims"];
257
- const claimMerchantId = rawClaims !== null && typeof rawClaims === "object" && !Array.isArray(rawClaims)
258
- ? rawClaims["merchant_id"]
259
- : undefined;
260
- if (typeof claimMerchantId !== "string" || claimMerchantId.trim() === "") {
261
- throw new MerchantConnectError("BINDING_CLAIM_INVALID", "Catalog已签名绑定声明缺少merchant_id;名片保持未发布。");
80
+ await sleep(1_000);
81
+ summary = await service.reconcile();
262
82
  }
263
- state = {
264
- ...state,
265
- status: "bound",
266
- binding_id: binding.bindingId,
267
- merchant_id: claimMerchantId,
268
- expected_card_revision: binding.activeCardRevision ?? 0,
269
- };
270
- const latest = readEnrollmentStore(options.dataDir);
271
- latest.sessions = latest.sessions.map((s) => {
272
- if (s.enrollment_id === state?.enrollment_id)
273
- return state;
274
- const old = s;
275
- return old.status === "published" && old.catalog_agent_id === state?.catalog_agent_id &&
276
- old.binding_id !== state?.binding_id
277
- ? { ...old, status: "replaced" }
278
- : s;
279
- });
280
- writeState(options.dataDir, latest);
281
- }
282
- if (state.status === "bound") {
283
- if (state.catalog_agent_id === undefined || state.binding_id === undefined)
284
- throw new MerchantConnectError("STATE_INVALID", "绑定状态缺少回执字段");
285
- const catalogAgentId = state.catalog_agent_id;
286
- const bindingId = state.binding_id;
287
- const expectedRevision = state.expected_card_revision ?? 0;
288
- const currentCard = await verifyPublicRuntimeReady(origin, endpoint, identityRaw, fetchImpl);
289
- if (canonicalize(currentCard) !== canonicalize(card)) {
290
- throw new MerchantConnectError("PREVIEW_CHANGED", "公网服务的公开 Agent Card 已不同于商家批准的预览;未发布名片。请重新检查并授权新的公开信息。");
291
- }
292
- let cardRevision = state.card_revision;
293
- if (cardRevision === undefined) {
294
- const publication = await client.publishCard({
295
- agentId: catalogAgentId,
296
- bindingId,
297
- generation: 1,
298
- expectedRevision,
299
- agentCard: card,
300
- a2aEndpoint: endpoint,
301
- runtimeOrigin: origin,
302
- }, identity);
303
- if (publication.revision === null)
304
- throw new MerchantConnectError("PUBLICATION_RECEIPT_INVALID", "Catalog 未返回名片 revision;绑定已保留,重试可续办");
305
- cardRevision = publication.revision;
306
- state = { ...state, card_revision: cardRevision };
307
- const latest = readEnrollmentStore(options.dataDir);
308
- latest.sessions = latest.sessions.map((s) => s.enrollment_id === state?.enrollment_id ? state : s);
309
- writeState(options.dataDir, latest);
83
+ if (summary.status === "awaiting_confirmation") {
84
+ throw new MerchantConnectError("AUTHORIZATION_PENDING", "尚未完成商家授权。会话已保存,运行 kiwi merchant connect 可继续。");
310
85
  }
311
- if (cardRevision === undefined)
312
- throw new MerchantConnectError("STATE_INVALID", "持久名片状态缺 revision");
313
- const activated = await client.activateCard({
314
- agentId: catalogAgentId,
315
- bindingId,
316
- cardRevision,
317
- expectedRevision,
318
- }, identity);
319
- if (activated.revision === null)
320
- throw new MerchantConnectError("ACTIVATION_RECEIPT_INVALID", "Catalog 未确认名片激活;绑定已保留,重试可续办");
321
- state = { ...state, status: "published", card_revision: activated.revision };
322
- const latest = readEnrollmentStore(options.dataDir);
323
- latest.sessions = latest.sessions.map((s) => s.enrollment_id === state?.enrollment_id ? state : s);
324
- writeState(options.dataDir, latest);
325
- }
326
- if (state.status !== "published" || state.catalog_agent_id === undefined || state.binding_id === undefined || state.card_revision === undefined) {
327
- throw new MerchantConnectError("STATE_INCOMPLETE", "连接流程尚未完成,未显示已上线。");
328
86
  }
329
- return { agentId: state.catalog_agent_id, bindingId: state.binding_id, cardRevision: state.card_revision };
87
+ // 授权已完成(或本次续办从 authorized/bound 起步):单趟级联到 published。
88
+ return completed(await service.reconcile());
330
89
  }
331
90
  //# sourceMappingURL=merchant-connect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merchant-connect.js","sourceRoot":"","sources":["../../src/cloud/merchant-connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merchant-connect.js","sourceRoot":"","sources":["../../src/cloud/merchant-connect.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  "schema_version": "0.1.2",
3
3
  "merchant_id": "merchant-001",
4
4
  "source": "test_fixture",
5
- "generated_at": "2026-09-29T03:01:34.367Z",
5
+ "generated_at": "2026-09-30T13:38:40.370Z",
6
6
  "products": [
7
7
  {
8
8
  "sku": "smoke-sku-1",
@@ -12,8 +12,8 @@
12
12
  "price": 120,
13
13
  "moq": 1,
14
14
  "supply_note": "Local smoke fixture only",
15
- "updated_at": "2026-09-29T03:01:34.367Z",
16
- "valid_until": "2026-10-06T03:01:34.367Z",
15
+ "updated_at": "2026-09-30T13:38:40.370Z",
16
+ "valid_until": "2026-10-07T13:38:40.370Z",
17
17
  "status": "active",
18
18
  "stock": 5,
19
19
  "test": true
@@ -16,6 +16,7 @@
16
16
  import type { IncomingMessage, ServerResponse } from "node:http";
17
17
  import type { WriteApprovalCandidate } from "../../agent/merchant/action-candidate.js";
18
18
  import type { MerchantAdminSessions } from "../../auth/merchant-sessions.js";
19
+ import { type createFileListingPublicationService } from "../../cloud/file-listing-publication.js";
19
20
  import { type CloudProductRecord, type CloudProductTable } from "../../cloud/product-source.js";
20
21
  import { MerchantImportDraftStore } from "./draft-store.js";
21
22
  import { type VerifiedActorContext } from "../../merchant/application/actor.js";
@@ -87,11 +88,13 @@ export interface MerchantManagementApiOptions {
87
88
  records: CloudProductRecord[];
88
89
  };
89
90
  /** Attach local runtime ownership and the Catalog-confirmed merchant id. */
90
- prepareTable?: (table: CloudProductTable) => CloudProductTable;
91
+ prepareTable?: (table: CloudProductTable) => CloudProductTable | Promise<CloudProductTable>;
91
92
  commit: (table: CloudProductTable) => {
92
93
  digest: string;
93
94
  };
94
95
  };
96
+ /** Explicit owner preview/confirmation for public Catalog product metadata. */
97
+ fileListingPublication?: ReturnType<typeof createFileListingPublicationService>;
95
98
  /** 策略草稿提交(MerchantPolicyRuntime.apply;缺省 → 503)。回执只含版本与摘要。 */
96
99
  policyApply?: (patch: Record<string, unknown>) => Promise<{
97
100
  version: number;
@@ -126,6 +129,25 @@ export interface MerchantManagementApiOptions {
126
129
  recordId: string;
127
130
  }) => Promise<PlatformEvidenceResult>;
128
131
  };
132
+ /** 已部署实例的目录连接;独立于需要平台回执的部署向导。 */
133
+ catalogConnection?: {
134
+ getSummary: () => Promise<{
135
+ status: string;
136
+ /** 自有固定阶段词(prepare/authorize/publish);响应侧再做白名单校验。 */
137
+ stage?: string;
138
+ published: boolean;
139
+ agentId?: string;
140
+ bindingId?: string;
141
+ bindingExpiresAt?: string;
142
+ errorCode?: string;
143
+ }>;
144
+ getPairing: () => Promise<{
145
+ user_code: string;
146
+ verification_uri: string;
147
+ expires_at: string;
148
+ } | null>;
149
+ begin: () => Promise<unknown>;
150
+ };
129
151
  /** Workbench v1 trusted confirmation authority; absent means strong-confirmation routes fail closed. */
130
152
  workbenchConfirmations?: WorkbenchConfirmationStore;
131
153
  /** Workbench Feed authority. Writes remain candidate-only through the prepare callbacks. */