@harrylabsj/kiwi 0.6.0 → 0.6.1

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 (64) hide show
  1. package/dist/a2a/node.d.ts +3 -1
  2. package/dist/a2a/node.js +1 -0
  3. package/dist/a2a/node.js.map +1 -1
  4. package/dist/agent/buyer/types.d.ts +0 -25
  5. package/dist/agent/buyer/types.js.map +1 -1
  6. package/dist/agent/kernel-builder.d.ts +27 -0
  7. package/dist/agent/kernel-builder.js +180 -0
  8. package/dist/agent/kernel-builder.js.map +1 -0
  9. package/dist/cli.js +98 -154
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commerce/data-source.d.ts +4 -3
  12. package/dist/commerce/data-source.js.map +1 -1
  13. package/dist/commerce/shopping-cli-source.js +3 -2
  14. package/dist/commerce/shopping-cli-source.js.map +1 -1
  15. package/dist/config/profile.d.ts +7 -0
  16. package/dist/config/profile.js +23 -0
  17. package/dist/config/profile.js.map +1 -1
  18. package/dist/discovery/catalog-source/kiwi-record.d.ts +3 -0
  19. package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
  20. package/dist/discovery/catalog-source/kiwi-source.js +7 -1
  21. package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
  22. package/dist/discovery/catalog-source/register.d.ts +6 -0
  23. package/dist/discovery/catalog-source/register.js +15 -7
  24. package/dist/discovery/catalog-source/register.js.map +1 -1
  25. package/dist/handoff/errors.d.ts +1 -1
  26. package/dist/handoff/errors.js +1 -0
  27. package/dist/handoff/errors.js.map +1 -1
  28. package/dist/handoff/idempotency.d.ts +10 -1
  29. package/dist/handoff/idempotency.js +13 -3
  30. package/dist/handoff/idempotency.js.map +1 -1
  31. package/dist/handoff/transaction.js +13 -6
  32. package/dist/handoff/transaction.js.map +1 -1
  33. package/dist/negotiation/state/phase.js +12 -4
  34. package/dist/negotiation/state/phase.js.map +1 -1
  35. package/dist/product-catalog.d.ts +43 -0
  36. package/dist/product-catalog.js +60 -0
  37. package/dist/product-catalog.js.map +1 -0
  38. package/dist/product-cli.d.ts +1 -1
  39. package/dist/product-cli.js +1 -1
  40. package/dist/product-publish.d.ts +10 -17
  41. package/dist/product-publish.js +177 -41
  42. package/dist/product-publish.js.map +1 -1
  43. package/dist/weixin/channel.d.ts +87 -0
  44. package/dist/weixin/channel.js +356 -0
  45. package/dist/weixin/channel.js.map +1 -0
  46. package/dist/weixin/cli-weixin.d.ts +29 -0
  47. package/dist/weixin/cli-weixin.js +128 -0
  48. package/dist/weixin/cli-weixin.js.map +1 -0
  49. package/dist/weixin/credentials.d.ts +33 -0
  50. package/dist/weixin/credentials.js +107 -0
  51. package/dist/weixin/credentials.js.map +1 -0
  52. package/dist/weixin/ilink-client.d.ts +44 -0
  53. package/dist/weixin/ilink-client.js +262 -0
  54. package/dist/weixin/ilink-client.js.map +1 -0
  55. package/dist/weixin/login.d.ts +34 -0
  56. package/dist/weixin/login.js +93 -0
  57. package/dist/weixin/login.js.map +1 -0
  58. package/dist/weixin/qr.d.ts +26 -0
  59. package/dist/weixin/qr.js +525 -0
  60. package/dist/weixin/qr.js.map +1 -0
  61. package/dist/weixin/types.d.ts +114 -0
  62. package/dist/weixin/types.js +48 -0
  63. package/dist/weixin/types.js.map +1 -0
  64. package/package.json +4 -1
@@ -0,0 +1,43 @@
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 serve` —— 启动独立 kiwi-catalog 服务(CURRENT-DOCS v0.7.0)。
18
+ *
19
+ * kiwi-catalog 是独立部署仓(~/coding/kiwi-catalog),console script 入口
20
+ * `kiwi-catalog-api`(pyproject [project.scripts])。本命令以前台方式
21
+ * 转发启动该服务(stdio inherit),便于本地一体化开发;依赖检测:
22
+ * 未安装(ENOENT)→ fail-closed 提示 pip install。
23
+ *
24
+ * 缺省:--db ./kiwi-catalog.sqlite --host 127.0.0.1 --port 8600
25
+ * (与 kiwi-catalog 的缺省端口一致)。
26
+ */
27
+ import { spawnSync } from "node:child_process";
28
+ export interface CatalogServeOptions {
29
+ /** catalog SQLite 文件路径(缺省 ./kiwi-catalog.sqlite)。 */
30
+ db?: string;
31
+ host?: string;
32
+ port?: number;
33
+ /** 测试注入。 */
34
+ spawnImpl?: typeof spawnSync;
35
+ }
36
+ export interface CatalogServeResult {
37
+ ok: boolean;
38
+ /** spawn 前即失败的原因(如 kiwi-catalog 未安装)。 */
39
+ error?: string;
40
+ /** 服务是否已实际启动(Ctrl+C 停止视为正常,spawned=true)。 */
41
+ spawned?: boolean;
42
+ }
43
+ export declare function catalogServe(options?: CatalogServeOptions): CatalogServeResult;
@@ -0,0 +1,60 @@
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 serve` —— 启动独立 kiwi-catalog 服务(CURRENT-DOCS v0.7.0)。
18
+ *
19
+ * kiwi-catalog 是独立部署仓(~/coding/kiwi-catalog),console script 入口
20
+ * `kiwi-catalog-api`(pyproject [project.scripts])。本命令以前台方式
21
+ * 转发启动该服务(stdio inherit),便于本地一体化开发;依赖检测:
22
+ * 未安装(ENOENT)→ fail-closed 提示 pip install。
23
+ *
24
+ * 缺省:--db ./kiwi-catalog.sqlite --host 127.0.0.1 --port 8600
25
+ * (与 kiwi-catalog 的缺省端口一致)。
26
+ */
27
+ import { spawnSync } from "node:child_process";
28
+ export function catalogServe(options = {}) {
29
+ const spawn = options.spawnImpl ?? spawnSync;
30
+ const args = [
31
+ "--db",
32
+ options.db ?? "./kiwi-catalog.sqlite",
33
+ "--host",
34
+ options.host ?? "127.0.0.1",
35
+ "--port",
36
+ String(options.port ?? 8600),
37
+ ];
38
+ // spawnSync 对 ENOENT 不抛异常——返回 { error: ENOENT, status: null };
39
+ // Ctrl+C 停止则 status 为 null 且无 error(视为正常)。
40
+ const result = spawn("kiwi-catalog-api", args, { stdio: "inherit" });
41
+ if (result.error !== undefined) {
42
+ const code = result.error.code;
43
+ if (code === "ENOENT") {
44
+ return {
45
+ ok: false,
46
+ error: "kiwi-catalog-api 未安装——kiwi-catalog 是独立部署仓(~/coding/kiwi-catalog)," +
47
+ "请先 `pip install -e ~/coding/kiwi-catalog` 再运行本命令",
48
+ };
49
+ }
50
+ return {
51
+ ok: false,
52
+ error: `kiwi-catalog-api 启动失败:${result.error.message}`,
53
+ };
54
+ }
55
+ if (result.status !== null && result.status !== 0) {
56
+ return { ok: false, error: `kiwi-catalog-api 退出码 ${result.status}(服务日志见上方输出)` };
57
+ }
58
+ return { ok: true, spawned: true };
59
+ }
60
+ //# sourceMappingURL=product-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-catalog.js","sourceRoot":"","sources":["../src/product-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAmB/C,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;IAC7C,MAAM,IAAI,GAAG;QACX,MAAM;QACN,OAAO,CAAC,EAAE,IAAI,uBAAuB;QACrC,QAAQ;QACR,OAAO,CAAC,IAAI,IAAI,WAAW;QAC3B,QAAQ;QACR,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;KAC7B,CAAC;IACF,+DAA+D;IAC/D,2CAA2C;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAI,MAAM,CAAC,KAA2B,CAAC,IAAI,CAAC;QACtD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EACH,mEAAmE;oBACnE,kDAAkD;aACrD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,yBAAyB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;SACvD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,MAAM,CAAC,MAAM,aAAa,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC"}
@@ -28,7 +28,7 @@
28
28
  */
29
29
  import { spawnSync } from "node:child_process";
30
30
  /** 与 package.json / USAGE 同步的产品版本。 */
31
- export declare const PRODUCT_VERSION = "0.6.0";
31
+ export declare const PRODUCT_VERSION = "0.6.1";
32
32
  /**
33
33
  * 缺省 kiwi-catalog 地址(单一来源,cli.ts 各处解析一致)。
34
34
  *
@@ -30,7 +30,7 @@ import { spawnSync } from "node:child_process";
30
30
  import { EXIT } from "./exit-codes.js";
31
31
  import { SHOPPING_CLI_COMPAT, compatRangeText, versionInRange } from "./product-compat.js";
32
32
  /** 与 package.json / USAGE 同步的产品版本。 */
33
- export const PRODUCT_VERSION = "0.6.0";
33
+ export const PRODUCT_VERSION = "0.6.1";
34
34
  /**
35
35
  * 缺省 kiwi-catalog 地址(单一来源,cli.ts 各处解析一致)。
36
36
  *
@@ -14,20 +14,6 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- /**
18
- * `kiwi merchant publish` 编排(product-strategy rev1.1 §4.5/§19 D2)。
19
- *
20
- * 编排层在 kiwi 仓,调两仓能力(组件独立发布,§12):
21
- *
22
- * 1. 确认/注册 owner Agent → kiwi-catalog POST /v1/agent-catalog/agents/register
23
- * (owner_token = HMAC-SHA256("kiwi-catalog-owner:" + merchant_id),
24
- * 与 kiwi-catalog api/auth.py 逐字节一致;注册幂等 upsert)
25
- * 2. 触发 listing 发布 → 进程调用 shopping-cli
26
- * (spawn `shopping listings publish-listings`,不建 HTTP 强依赖;
27
- * digest 去重由 shopping-cli 镜像表保证幂等)
28
- * 3. 汇总分步状态 → fail-closed:agent 注册失败则短路
29
- * (listings 依赖 owner agent 存在),listings 失败报错不假装全成功。
30
- */
31
17
  import { spawnSync } from "node:child_process";
32
18
  import type { AgentProfile } from "./config/profile.js";
33
19
  export interface MerchantPublishOptions {
@@ -35,13 +21,17 @@ export interface MerchantPublishOptions {
35
21
  profile: AgentProfile;
36
22
  /** kiwi-catalog base URL(缺省由调用方解析 KIWI_CATALOG_URL)。 */
37
23
  catalogBaseUrl: string;
38
- /** KIWI_CATALOG_OWNER_TOKEN_SECRET(owner token 派生)。 */
39
- ownerTokenSecret: string;
24
+ /** KIWI_CATALOG_OWNER_TOKEN_SECRET(owner token 派生,legacy)。 */
25
+ ownerTokenSecret?: string;
26
+ /** 商家随机 owner token(v12+ 双路径;优先于 HMAC 派生)。 */
27
+ ownerToken?: string;
40
28
  /** shopping-cli SQLite 数据库路径(listings publish-listings --db)。 */
41
29
  shoppingCliDb: string;
42
30
  /** shopping-cli 可执行名/路径(缺省 "shopping")。 */
43
31
  shoppingCliPath?: string;
44
- /** shopping-cli merchant_id(缺省 = profile.agent_id;init 统一身份前的显式映射)。 */
32
+ /** shopping-cli merchant_id(投影过滤;缺省 = profile.agent_id)。
33
+ * catalog 侧身份恒为 profile.agent_id——两者不同时(如 catalog 申请
34
+ * 审批身份配随机 owner token)用本字段显式映射投影侧。 */
45
35
  shoppingCliMerchant?: string;
46
36
  /** catalog 注册域名(缺省 KIWI_CATALOG_DOMAIN / merchant-{agent_id}.local)。 */
47
37
  catalogDomain?: string;
@@ -60,6 +50,9 @@ export interface StepListings {
60
50
  published?: number;
61
51
  skipped?: number;
62
52
  withdrawn?: number;
53
+ published_refs?: string[];
54
+ skipped_refs?: string[];
55
+ withdrawn_refs?: string[];
63
56
  errors?: string[];
64
57
  raw?: unknown;
65
58
  }
@@ -22,12 +22,15 @@
22
22
  * 1. 确认/注册 owner Agent → kiwi-catalog POST /v1/agent-catalog/agents/register
23
23
  * (owner_token = HMAC-SHA256("kiwi-catalog-owner:" + merchant_id),
24
24
  * 与 kiwi-catalog api/auth.py 逐字节一致;注册幂等 upsert)
25
- * 2. 触发 listing 发布 进程调用 shopping-cli
26
- * (spawn `shopping listings publish-listings`,不建 HTTP 强依赖;
27
- * digest 去重由 shopping-cli 镜像表保证幂等)
25
+ * 2. 读投影并发布 listings spawn `shopping listings projections list`(只读)
26
+ * public-only 投影 → 逐条直连 kiwi-catalog POST /v1/listings/publish
27
+ * (v3.0 publish 面归独立 kiwi-catalog 服务,行级幂等在服务端;
28
+ * owner token 直传优先,否则按 register 同公式 HMAC 派生)
29
+ * 随后 reconcile:投影中消失的商品 POST /v1/listings/{id}/withdraw
28
30
  * 3. 汇总分步状态 → fail-closed:agent 注册失败则短路
29
31
  * (listings 依赖 owner agent 存在),listings 失败报错不假装全成功。
30
32
  */
33
+ import { createHmac } from "node:crypto";
31
34
  import { spawnSync } from "node:child_process";
32
35
  import { registerCatalogAgent } from "./discovery/catalog-source/register.js";
33
36
  import { SHOPPING_CLI_COMPAT, compatRangeText, versionInRange } from "./product-compat.js";
@@ -42,14 +45,21 @@ function safeAgentId(agentId) {
42
45
  */
43
46
  export async function merchantPublish(options) {
44
47
  const profile = options.profile;
45
- // 统一身份:agent 注册、merchant 查询、shopping-cli 发布必须用同一个
46
- // merchant_id(kiwi-catalog 一商家一 agent + publish 校验 owner 绑定)。
47
- // 缺省 = profile.agent_id;kiwi 身份与 shopping-cli merchant 不一致时
48
- // --shopping-cli-merchant 显式指定(D1 init 统一身份前的映射)。
49
- const merchantId = options.shoppingCliMerchant ?? profile.agent_id;
48
+ // 双身份拆分(2026-08-08 修复):catalog 侧身份与 shopping-cli 侧 merchant
49
+ // 是两个独立概念——
50
+ // - catalogMerchantId = profile.agent_id:agent 注册/复用、owner token
51
+ // 派生(HMAC)与校验、publish body merchant_id、自查端点(kiwi-catalog
52
+ // 一商家一 agent + publish 校验 owner 绑定都以此为准);
53
+ // - shoppingMerchant = --shopping-cli-merchant ?? profile.agent_id:投影
54
+ // 过滤(shopping-cli 侧 merchant)。D1 init 统一身份后两者相同;显式
55
+ // 映射用于 catalog 申请审批身份(随机 owner token)与 shopping-cli
56
+ // 商家名不同的场景——原实现把映射项当成全局身份,导致随机 token
57
+ // (KIWI_MERCHANT_TOKEN)下 publish 身份错乱。
58
+ const catalogMerchantId = profile.agent_id;
59
+ const shoppingMerchant = options.shoppingCliMerchant ?? profile.agent_id;
50
60
  const domain = options.catalogDomain ??
51
61
  process.env.KIWI_CATALOG_DOMAIN ??
52
- `merchant-${safeAgentId(merchantId)}.local`;
62
+ `merchant-${safeAgentId(catalogMerchantId)}.local`;
53
63
  // ── Step 0: shopping-cli 版本兼容检查(D3 矩阵共同消费,fail-closed)──
54
64
  // 矩阵单一来源 = product-compat.ts;与 `kiwi doctor` 共同消费。
55
65
  const versionSpawn = options.spawnImpl ?? spawnSync;
@@ -101,7 +111,7 @@ export async function merchantPublish(options) {
101
111
  let catalogAgentId;
102
112
  let agentError;
103
113
  try {
104
- const lookupUrl = `${baseUrl}/v1/agent-catalog/merchants/${encodeURIComponent(merchantId)}/agents`;
114
+ const lookupUrl = `${baseUrl}/v1/agent-catalog/merchants/${encodeURIComponent(catalogMerchantId)}/agents`;
105
115
  const lookup = await fetchImpl(lookupUrl, { signal: AbortSignal.timeout(15_000) });
106
116
  if (lookup.ok) {
107
117
  const body = (await lookup.json());
@@ -115,7 +125,8 @@ export async function merchantPublish(options) {
115
125
  const reg = await registerCatalogAgent({
116
126
  catalogBaseUrl: options.catalogBaseUrl,
117
127
  domain,
118
- merchantId,
128
+ merchantId: catalogMerchantId,
129
+ ownerToken: options.ownerToken,
119
130
  ownerTokenSecret: options.ownerTokenSecret,
120
131
  agentCardUrl: `${domain}/.well-known/agent-card.json`,
121
132
  fetchImpl: options.fetchImpl,
@@ -137,17 +148,17 @@ export async function merchantPublish(options) {
137
148
  },
138
149
  };
139
150
  }
140
- // ── Step 2: 进程调用 shopping-cli 发布 listings ─────────────────────────
141
- // --db 是 shopping-cli 顶层参数,必须在子命令之前(usage: shopping.py [--db DB] {cmd})。
151
+ // ── Step 2: shopping-cli 投影 → 直连 catalog 发布 listings ──────────
152
+ // shopping-cli v3.0 剥离 publish-listings 后,发布面归 kiwi-catalog:
153
+ // 本步骤读取可发布投影(listings projections list --format json,只读),
154
+ // 逐条直连 POST /v1/listings/publish(owner token 直传)。--db 是
155
+ // shopping-cli 顶层参数,必须在子命令之前。
142
156
  const spawn = options.spawnImpl ?? spawnSync;
143
157
  const args = [
144
158
  "--db", options.shoppingCliDb,
145
159
  "listings",
146
- "publish-listings",
147
- "--merchant", merchantId,
148
- "--kiwi-catalog-url", options.catalogBaseUrl,
149
- "--owner-token-secret", options.ownerTokenSecret,
150
- "--owner-agent-id", catalogAgentId,
160
+ "projections",
161
+ "--merchant", shoppingMerchant,
151
162
  "--format", "json",
152
163
  ];
153
164
  let result;
@@ -172,31 +183,154 @@ export async function merchantPublish(options) {
172
183
  }
173
184
  const stdout = String(result.stdout ?? "");
174
185
  const stderr = String(result.stderr ?? "");
175
- let raw;
186
+ if (result.status !== 0) {
187
+ // fail-closed:投影读取失败(含非零退出/输出非 JSON)一律不发布
188
+ const detail = (stderr !== "" ? stderr.trim() : stdout.trim()).slice(0, 300);
189
+ return {
190
+ ok: false,
191
+ steps: {
192
+ shopping_cli_compat: compatStep,
193
+ agent: { ok: true, catalog_agent_id: catalogAgentId },
194
+ listings: {
195
+ ok: false,
196
+ errors: [`shopping-cli projections failed: ${detail !== "" ? detail : `exit ${result.status ?? "?"}`}`],
197
+ },
198
+ },
199
+ };
200
+ }
201
+ let projections = [];
176
202
  try {
177
- raw = stdout !== "" ? JSON.parse(stdout) : undefined;
203
+ const parsed = JSON.parse(stdout);
204
+ if (parsed.ok === true && Array.isArray(parsed.results)) {
205
+ projections = parsed.results;
206
+ }
178
207
  }
179
208
  catch {
180
- raw = undefined;
209
+ // JSON → fail-closed(不发布,避免漏发)
210
+ return {
211
+ ok: false,
212
+ steps: {
213
+ shopping_cli_compat: compatStep,
214
+ agent: { ok: true, catalog_agent_id: catalogAgentId },
215
+ listings: { ok: false, errors: [`shopping-cli projections 输出非 JSON:${stdout.slice(0, 200)}`] },
216
+ },
217
+ };
218
+ }
219
+ // 逐条直连 catalog publish(投影是 canonical payload 子集;owner 身份由
220
+ // 发布方补齐:merchant_id / owner_agent_id / owner_token / handoff 默认)。
221
+ // owner token:直传优先,否则 HMAC 派生(与 register 一致)。
222
+ const effectiveOwnerToken = options.ownerToken !== undefined && options.ownerToken !== ""
223
+ ? options.ownerToken
224
+ : options.ownerTokenSecret !== undefined
225
+ ? createHmac("sha256", options.ownerTokenSecret)
226
+ .update(`kiwi-catalog-owner:${catalogMerchantId}`)
227
+ .digest("hex")
228
+ : "";
229
+ const reportErrors = [];
230
+ const publishedRefs = [];
231
+ const skippedRefs = [];
232
+ for (const projection of projections) {
233
+ const ref = String(projection.source_product_ref ?? "?");
234
+ // category 必须非空(catalog contracts.py 要求)——为空则跳过并报告,
235
+ // 不猜默认值(fail-closed)。
236
+ const category = projection.category;
237
+ if (typeof category !== "string" || category.trim() === "") {
238
+ skippedRefs.push(ref);
239
+ continue;
240
+ }
241
+ // 投影含内部元数据(_provenance 等)——catalog 契约 additionalProperties:
242
+ // false,发布前剔除 _ 前缀字段(仅 wire 字段进 body)。
243
+ const wireFields = Object.fromEntries(Object.entries(projection).filter(([key]) => !key.startsWith("_")));
244
+ const body = {
245
+ ...wireFields,
246
+ merchant_id: catalogMerchantId,
247
+ owner_agent_id: catalogAgentId,
248
+ owner_token: effectiveOwnerToken,
249
+ handoff_destination_types: ["external_checkout_url"],
250
+ };
251
+ if (typeof body.owner_token !== "string" || body.owner_token === "") {
252
+ reportErrors.push(`${ref}: no owner token (KIWI_MERCHANT_TOKEN 或 secret 派生)`);
253
+ continue;
254
+ }
255
+ try {
256
+ const res = await fetchImpl(`${baseUrl}/v1/listings/publish`, {
257
+ method: "POST",
258
+ headers: { "Content-Type": "application/json" },
259
+ body: JSON.stringify(body),
260
+ signal: AbortSignal.timeout(20_000),
261
+ });
262
+ const payload = (await res.json());
263
+ if (res.ok && payload.ok === true) {
264
+ publishedRefs.push(ref);
265
+ }
266
+ else {
267
+ reportErrors.push(`${ref}: ${payload.error ?? `HTTP ${res.status}`}`);
268
+ }
269
+ }
270
+ catch (err) {
271
+ reportErrors.push(`${ref}: ${err instanceof Error ? err.message : String(err)}`);
272
+ }
181
273
  }
182
- const report = raw ?? {};
183
- const published = Array.isArray(report.published) ? report.published.length : 0;
184
- const skipped = Array.isArray(report.skipped) ? report.skipped.length : 0;
185
- const withdrawn = Array.isArray(report.withdrawn) ? report.withdrawn.length : 0;
186
- const reportErrors = Array.isArray(report.errors)
187
- ? report.errors.map(String)
188
- : [];
189
- const spawnFailed = result.status !== 0;
190
- if (spawnFailed && reportErrors.length === 0) {
191
- const spawnError = result.error;
192
- reportErrors.push(spawnError !== undefined
193
- ? `shopping-cli spawn failed: ${spawnError.message}`
194
- : `shopping-cli exited ${result.status ?? "?"}${stderr !== "" ? `: ${stderr.trim().slice(0, 300)}` : ""}`);
274
+ // ── Step 2b: reconcile——投影消失的商品 withdraw(data-hub DoD #5)──────
275
+ // products.active=0 或已删除的商品不再出现在投影里;拉取本 agent 现有
276
+ // product listings(自查端点,owner_token query),与投影 ref 集合
277
+ // diff,多出的下架(capability listing 不在投影集合,不处理)。服务端
278
+ // 对已 WITHDRAWN 幂等返回;SUSPENDED 的 listing 也允许商家 withdraw。
279
+ const projectedRefs = new Set(projections.map((p) => String(p.source_product_ref ?? "")).filter((ref) => ref !== ""));
280
+ const withdrawnRefs = [];
281
+ try {
282
+ let cursor;
283
+ for (;;) {
284
+ const listUrl = `${baseUrl}/v1/agents/${encodeURIComponent(catalogAgentId)}/listings` +
285
+ `?owner_token=${encodeURIComponent(effectiveOwnerToken)}&limit=100` +
286
+ (cursor !== undefined ? `&cursor=${encodeURIComponent(cursor)}` : "");
287
+ const listRes = await fetchImpl(listUrl, { signal: AbortSignal.timeout(15_000) });
288
+ const listPayload = (await listRes.json());
289
+ if (!listRes.ok || listPayload.ok !== true) {
290
+ reportErrors.push(`withdraw reconcile failed: ${listPayload.error ?? `HTTP ${listRes.status}`}`);
291
+ break;
292
+ }
293
+ for (const rec of listPayload.results ?? []) {
294
+ // 只 diff product listing:capability listing 不在投影集合,不处理
295
+ if (String(rec.listing_type ?? "") !== "product")
296
+ continue;
297
+ const ref = String(rec.source_product_ref ?? "");
298
+ if (ref === "" || projectedRefs.has(ref))
299
+ continue;
300
+ if (String(rec.publication_state ?? "") === "WITHDRAWN")
301
+ continue;
302
+ const listingId = String(rec.listing_id ?? "");
303
+ if (listingId === "")
304
+ continue;
305
+ try {
306
+ const wRes = await fetchImpl(`${baseUrl}/v1/listings/${encodeURIComponent(listingId)}/withdraw`, {
307
+ method: "POST",
308
+ headers: { "Content-Type": "application/json" },
309
+ body: JSON.stringify({ owner_token: effectiveOwnerToken }),
310
+ signal: AbortSignal.timeout(20_000),
311
+ });
312
+ const wPayload = (await wRes.json());
313
+ if (wRes.ok && wPayload.ok === true) {
314
+ withdrawnRefs.push(ref);
315
+ }
316
+ else {
317
+ reportErrors.push(`${ref}: withdraw ${wPayload.error ?? `HTTP ${wRes.status}`}`);
318
+ }
319
+ }
320
+ catch (err) {
321
+ reportErrors.push(`${ref}: withdraw ${err instanceof Error ? err.message : String(err)}`);
322
+ }
323
+ }
324
+ const next = listPayload.next_cursor;
325
+ if (typeof next !== "string" || next === "")
326
+ break;
327
+ cursor = next;
328
+ }
195
329
  }
196
- if (spawnFailed && raw === undefined && stdout !== "") {
197
- reportErrors.push(`shopping-cli 输出非 JSON:${stdout.slice(0, 200)}`);
330
+ catch (err) {
331
+ reportErrors.push(`withdraw reconcile failed: ${err instanceof Error ? err.message : String(err)}`);
198
332
  }
199
- const ok = !spawnFailed && reportErrors.length === 0;
333
+ const ok = reportErrors.length === 0;
200
334
  return {
201
335
  ok,
202
336
  steps: {
@@ -204,11 +338,13 @@ export async function merchantPublish(options) {
204
338
  agent: { ok: true, catalog_agent_id: catalogAgentId },
205
339
  listings: {
206
340
  ok,
207
- published,
208
- skipped,
209
- withdrawn,
341
+ published: publishedRefs.length,
342
+ skipped: skippedRefs.length,
343
+ withdrawn: withdrawnRefs.length,
344
+ published_refs: publishedRefs,
345
+ skipped_refs: skippedRefs,
346
+ withdrawn_refs: withdrawnRefs,
210
347
  ...(reportErrors.length > 0 ? { errors: reportErrors } : {}),
211
- ...(raw !== undefined ? { raw } : {}),
212
348
  },
213
349
  },
214
350
  };
@@ -1 +1 @@
1
- {"version":3,"file":"product-publish.js","sourceRoot":"","sources":["../src/product-publish.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-publish.js","sourceRoot":"","sources":["../src/product-publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import type { AgentKernel } from "../agent/kernel.js";
17
+ import type { WeixinTimings } from "./types.js";
18
+ export interface WeixinChannelOptions {
19
+ kernel: AgentKernel;
20
+ /** iLink base URL(已解析:env > profile > default)。 */
21
+ apiBaseUrl?: string;
22
+ credentialsPath: string;
23
+ syncBufPath: string;
24
+ /** 配置白名单(配对扫描者自动授权;CLI/env/profile 合并后)。 */
25
+ allowUsers?: readonly string[];
26
+ /** 强制重新扫码(丢弃已存凭证)。 */
27
+ forceRelogin?: boolean;
28
+ /** 二维码渲染(缺省 stdout 打印)。 */
29
+ renderQr?: (qr: string[]) => void;
30
+ /** 状态行输出(缺省 stderr)。 */
31
+ notice?: (line: string) => void;
32
+ /** 日志行(缺省 stderr;不落 token/context_token)。 */
33
+ log?: (line: string) => void;
34
+ now?: () => string;
35
+ /** 时序覆盖(测试注入冷却/间隔)。 */
36
+ timings?: Partial<WeixinTimings>;
37
+ }
38
+ export interface WeixinChannelStatus {
39
+ loggedIn: boolean;
40
+ pairedUser: string | undefined;
41
+ allowCount: number;
42
+ }
43
+ /**
44
+ * 微信通道:open() 登录或加载凭证,run() 阻塞直到 /quit/致命错误/stop()。
45
+ * kernel 生命周期归 CLI 所有(对齐 cmdChat:CLI finally 里 kernel.close())。
46
+ */
47
+ export declare class WeixinChannel {
48
+ private readonly kernel;
49
+ private readonly credentialsPath;
50
+ private readonly syncBufPath;
51
+ private readonly allowUsers;
52
+ private readonly timings;
53
+ private readonly log;
54
+ private readonly now;
55
+ private client;
56
+ private credentials;
57
+ /** context_token 缓存(key = user_id;协议要求回复回显)。 */
58
+ private readonly contextTokens;
59
+ /** 去重指纹(message_id:text MD5;LRU FIFO 裁剪)。 */
60
+ private readonly seen;
61
+ private stopped;
62
+ private runPromise;
63
+ private pollAbort;
64
+ private timers;
65
+ private noticeFn;
66
+ constructor(options: WeixinChannelOptions);
67
+ static open(options: WeixinChannelOptions): Promise<WeixinChannel>;
68
+ /** 扫码登录并持久化凭证。 */
69
+ private loginAndSave;
70
+ get status(): WeixinChannelStatus;
71
+ /** 阻塞直到 /quit、致命错误或 stop();返回进程退出码。 */
72
+ run(): Promise<number>;
73
+ /** 优雅关闭:置 stopped → abort 在飞长轮询 → 写穿 sync state → 清定时器。 */
74
+ stop(): Promise<void>;
75
+ private runLoop;
76
+ private processMessage;
77
+ /** 发送消息(失败仅日志,不重试——模型回合昂贵,重试只覆盖轮询层)。 */
78
+ private trySend;
79
+ private schedulerTickOnce;
80
+ private negotiateOnce;
81
+ /** 转发给所有已授权用户(有 context_token 的优先;无 token 的首次可能不可达)。 */
82
+ private broadcast;
83
+ private startTimer;
84
+ private trimSeen;
85
+ private trimContextTokens;
86
+ private sleep;
87
+ }