@harrylabsj/kiwi 0.6.0 → 0.6.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 (167) hide show
  1. package/README.md +21 -0
  2. package/contracts/candidate-agent-dto-1.0.README.md +12 -8
  3. package/contracts/conformance/python-service/README.md +19 -0
  4. package/contracts/conformance/python-service/run.py +134 -0
  5. package/contracts/kiwi-catalog/1.0/listing-record.schema.json +11 -1
  6. package/contracts/kiwi-contracts.lock.json +7 -0
  7. package/contracts/manifest.json +61 -0
  8. package/contracts/vectors/candidate-agent.invalid-private-field.json +7 -0
  9. package/contracts/vectors/candidate-agent.valid.json +26 -0
  10. package/dist/a2a/client/client.js +39 -34
  11. package/dist/a2a/client/client.js.map +1 -1
  12. package/dist/a2a/client/url-policy.d.ts +8 -1
  13. package/dist/a2a/client/url-policy.js +18 -2
  14. package/dist/a2a/client/url-policy.js.map +1 -1
  15. package/dist/a2a/clock.d.ts +30 -0
  16. package/dist/a2a/clock.js +39 -0
  17. package/dist/a2a/clock.js.map +1 -0
  18. package/dist/a2a/negotiate.d.ts +6 -0
  19. package/dist/a2a/negotiate.js +10 -12
  20. package/dist/a2a/negotiate.js.map +1 -1
  21. package/dist/a2a/node.d.ts +23 -3
  22. package/dist/a2a/node.js +128 -18
  23. package/dist/a2a/node.js.map +1 -1
  24. package/dist/a2a/server/merchant-handler.d.ts +4 -0
  25. package/dist/a2a/server/merchant-handler.js +238 -25
  26. package/dist/a2a/server/merchant-handler.js.map +1 -1
  27. package/dist/a2a/server/pipeline.d.ts +17 -0
  28. package/dist/a2a/server/pipeline.js +89 -1
  29. package/dist/a2a/server/pipeline.js.map +1 -1
  30. package/dist/a2a/server/ucp.d.ts +30 -2
  31. package/dist/a2a/server/ucp.js +23 -14
  32. package/dist/a2a/server/ucp.js.map +1 -1
  33. package/dist/agent/agent-db.js +5 -0
  34. package/dist/agent/agent-db.js.map +1 -1
  35. package/dist/agent/buyer/buyer-tools.d.ts +5 -0
  36. package/dist/agent/buyer/buyer-tools.js +8 -1
  37. package/dist/agent/buyer/buyer-tools.js.map +1 -1
  38. package/dist/agent/buyer/types.d.ts +0 -25
  39. package/dist/agent/buyer/types.js.map +1 -1
  40. package/dist/agent/kernel-builder.d.ts +27 -0
  41. package/dist/agent/kernel-builder.js +180 -0
  42. package/dist/agent/kernel-builder.js.map +1 -0
  43. package/dist/agent/kernel.d.ts +6 -0
  44. package/dist/agent/kernel.js +95 -8
  45. package/dist/agent/kernel.js.map +1 -1
  46. package/dist/agent/memory/store.d.ts +5 -0
  47. package/dist/agent/memory/store.js +29 -1
  48. package/dist/agent/memory/store.js.map +1 -1
  49. package/dist/agent/merchant/action-candidate.js +15 -1
  50. package/dist/agent/merchant/action-candidate.js.map +1 -1
  51. package/dist/agent/merchant/merchant-client.js +22 -4
  52. package/dist/agent/merchant/merchant-client.js.map +1 -1
  53. package/dist/agent/merchant/types.d.ts +5 -2
  54. package/dist/agent/merchant/types.js +6 -2
  55. package/dist/agent/merchant/types.js.map +1 -1
  56. package/dist/agent/negotiation-chat.js +34 -14
  57. package/dist/agent/negotiation-chat.js.map +1 -1
  58. package/dist/cli.d.ts +56 -0
  59. package/dist/cli.js +141 -156
  60. package/dist/cli.js.map +1 -1
  61. package/dist/commerce/data-source.d.ts +7 -3
  62. package/dist/commerce/data-source.js.map +1 -1
  63. package/dist/commerce/http-client.js +35 -31
  64. package/dist/commerce/http-client.js.map +1 -1
  65. package/dist/commerce/shopping-cli-source.js +66 -48
  66. package/dist/commerce/shopping-cli-source.js.map +1 -1
  67. package/dist/config/profile.d.ts +7 -0
  68. package/dist/config/profile.js +23 -0
  69. package/dist/config/profile.js.map +1 -1
  70. package/dist/counterparty/a2a-direct/index.d.ts +5 -0
  71. package/dist/counterparty/a2a-direct/index.js +24 -0
  72. package/dist/counterparty/a2a-direct/index.js.map +1 -1
  73. package/dist/counterparty/shopping-cli-hosted/index.js +52 -19
  74. package/dist/counterparty/shopping-cli-hosted/index.js.map +1 -1
  75. package/dist/discovery/catalog-source/kiwi-record.d.ts +3 -0
  76. package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
  77. package/dist/discovery/catalog-source/kiwi-source.js +46 -36
  78. package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
  79. package/dist/discovery/catalog-source/register.d.ts +6 -0
  80. package/dist/discovery/catalog-source/register.js +27 -8
  81. package/dist/discovery/catalog-source/register.js.map +1 -1
  82. package/dist/discovery/catalog-source/source.js +39 -35
  83. package/dist/discovery/catalog-source/source.js.map +1 -1
  84. package/dist/discovery/resolve.d.ts +15 -0
  85. package/dist/discovery/resolve.js +59 -35
  86. package/dist/discovery/resolve.js.map +1 -1
  87. package/dist/discovery/ucp/index.d.ts +1 -1
  88. package/dist/discovery/ucp/index.js +1 -1
  89. package/dist/discovery/ucp/index.js.map +1 -1
  90. package/dist/discovery/ucp/resolver.d.ts +5 -0
  91. package/dist/discovery/ucp/resolver.js +65 -38
  92. package/dist/discovery/ucp/resolver.js.map +1 -1
  93. package/dist/discovery/ucp/vendor.d.ts +1 -1
  94. package/dist/discovery/ucp/vendor.js +1 -1
  95. package/dist/handoff/delivery.d.ts +4 -2
  96. package/dist/handoff/delivery.js +6 -1
  97. package/dist/handoff/delivery.js.map +1 -1
  98. package/dist/handoff/errors.d.ts +1 -1
  99. package/dist/handoff/errors.js +1 -0
  100. package/dist/handoff/errors.js.map +1 -1
  101. package/dist/handoff/idempotency.d.ts +10 -1
  102. package/dist/handoff/idempotency.js +13 -3
  103. package/dist/handoff/idempotency.js.map +1 -1
  104. package/dist/handoff/index.d.ts +1 -1
  105. package/dist/handoff/index.js +1 -1
  106. package/dist/handoff/index.js.map +1 -1
  107. package/dist/handoff/ledger.d.ts +9 -0
  108. package/dist/handoff/ledger.js +66 -0
  109. package/dist/handoff/ledger.js.map +1 -1
  110. package/dist/handoff/transaction.d.ts +21 -3
  111. package/dist/handoff/transaction.js +50 -11
  112. package/dist/handoff/transaction.js.map +1 -1
  113. package/dist/handoff/ucp-checkout/channel.js +15 -10
  114. package/dist/handoff/ucp-checkout/channel.js.map +1 -1
  115. package/dist/negotiation/jcs.js +11 -8
  116. package/dist/negotiation/jcs.js.map +1 -1
  117. package/dist/negotiation/lease/store.d.ts +25 -0
  118. package/dist/negotiation/lease/store.js +101 -0
  119. package/dist/negotiation/lease/store.js.map +1 -0
  120. package/dist/negotiation/recovery/recover.js +25 -1
  121. package/dist/negotiation/recovery/recover.js.map +1 -1
  122. package/dist/negotiation/state/phase.js +12 -4
  123. package/dist/negotiation/state/phase.js.map +1 -1
  124. package/dist/operator/runner.d.ts +11 -0
  125. package/dist/operator/runner.js +20 -1
  126. package/dist/operator/runner.js.map +1 -1
  127. package/dist/product-catalog.d.ts +43 -0
  128. package/dist/product-catalog.js +60 -0
  129. package/dist/product-catalog.js.map +1 -0
  130. package/dist/product-cli.d.ts +1 -1
  131. package/dist/product-cli.js +1 -1
  132. package/dist/product-publish.d.ts +15 -17
  133. package/dist/product-publish.js +279 -46
  134. package/dist/product-publish.js.map +1 -1
  135. package/dist/supervisor/stack-config.d.ts +6 -1
  136. package/dist/supervisor/stack-config.js +11 -3
  137. package/dist/supervisor/stack-config.js.map +1 -1
  138. package/dist/trust/identity/message-signature.js +17 -0
  139. package/dist/trust/identity/message-signature.js.map +1 -1
  140. package/dist/weixin/channel.d.ts +89 -0
  141. package/dist/weixin/channel.js +370 -0
  142. package/dist/weixin/channel.js.map +1 -0
  143. package/dist/weixin/cli-weixin.d.ts +29 -0
  144. package/dist/weixin/cli-weixin.js +130 -0
  145. package/dist/weixin/cli-weixin.js.map +1 -0
  146. package/dist/weixin/credentials.d.ts +33 -0
  147. package/dist/weixin/credentials.js +107 -0
  148. package/dist/weixin/credentials.js.map +1 -0
  149. package/dist/weixin/ilink-client.d.ts +44 -0
  150. package/dist/weixin/ilink-client.js +287 -0
  151. package/dist/weixin/ilink-client.js.map +1 -0
  152. package/dist/weixin/login.d.ts +37 -0
  153. package/dist/weixin/login.js +93 -0
  154. package/dist/weixin/login.js.map +1 -0
  155. package/dist/weixin/qr.d.ts +26 -0
  156. package/dist/weixin/qr.js +525 -0
  157. package/dist/weixin/qr.js.map +1 -0
  158. package/dist/weixin/types.d.ts +114 -0
  159. package/dist/weixin/types.js +48 -0
  160. package/dist/weixin/types.js.map +1 -0
  161. package/package.json +12 -2
  162. package/dist/commerce/erp-source.d.ts +0 -51
  163. package/dist/commerce/erp-source.js +0 -184
  164. package/dist/commerce/erp-source.js.map +0 -1
  165. package/dist/commerce/local-db-source.d.ts +0 -50
  166. package/dist/commerce/local-db-source.js +0 -162
  167. package/dist/commerce/local-db-source.js.map +0 -1
@@ -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 是独立部署仓(<WORKSPACE>/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 是独立部署仓(<WORKSPACE>/kiwi-catalog)," +
47
+ "请先 `pip install -e <WORKSPACE>/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,sEAAsE;oBACtE,qDAAqD;aACxD,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.2";
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.2";
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,16 +21,25 @@ 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;
38
+ /** 审查 P1-B:投影为空但 catalog 存在 ACTIVE product listing 时,默认
39
+ * 拒绝 reconcile 下架(典型成因是 --shopping-cli-merchant 不匹配或
40
+ * --shopping-cli-db 指向空库,静默全量下架=数据丢失且报告仍 ok)。
41
+ * 设为 true 显式放行"全部下架"语义(CLI --allow-empty-projection)。 */
42
+ allowEmptyProjectionReconcile?: boolean;
48
43
  /** 测试注入。 */
49
44
  fetchImpl?: typeof fetch;
50
45
  spawnImpl?: typeof spawnSync;
@@ -60,6 +55,9 @@ export interface StepListings {
60
55
  published?: number;
61
56
  skipped?: number;
62
57
  withdrawn?: number;
58
+ published_refs?: string[];
59
+ skipped_refs?: string[];
60
+ withdrawn_refs?: string[];
63
61
  errors?: string[];
64
62
  raw?: unknown;
65
63
  }
@@ -22,18 +22,80 @@
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";
36
+ import { isRedirectResponse } from "./net/safe-http.js";
33
37
  import { SHOPPING_CLI_COMPAT, compatRangeText, versionInRange } from "./product-compat.js";
34
38
  function safeAgentId(agentId) {
35
39
  return agentId.replace(/[^a-z0-9-]/gi, "-").toLowerCase();
36
40
  }
41
+ /**
42
+ * 审查 P1-10:构造注册用的 agent_card_url —— **绝对且经过校验**。
43
+ *
44
+ * `domain` 可能是裸 hostname(`merchant-x.local`,本地占位)或已含 scheme 的
45
+ * URL;统一规范化为 `<scheme>://<host>/.well-known/agent-card.json`。此前直接
46
+ * 拼接 `${domain}/.well-known/agent-card.json`——裸 hostname 时产物是相对 URL
47
+ * (catalog 无法按 well-known 验证),且若 domain 携带 userinfo/路径会污染注册
48
+ * 身份。
49
+ *
50
+ * 校验(fail-closed,任何一项不过 → 抛错短路,不发布):
51
+ * - 绝对 URL 且 http(s);
52
+ * - 远程 host 必须 https(loopback 本地形态允许 http);
53
+ * - 无 userinfo / query / fragment;
54
+ * - path 只允许空或 "/"(agent_card_url 的 well-known 路径由本函数追加)。
55
+ */
56
+ function buildAgentCardUrl(domain) {
57
+ const base = /^[a-z][a-z0-9+.-]*:\/\//i.test(domain) ? domain : `https://${domain}`;
58
+ let parsed;
59
+ try {
60
+ parsed = new URL(base);
61
+ }
62
+ catch {
63
+ throw new Error(`catalog domain 不是合法 URL/域名: "${domain}"(应为 https://<host> 形式)`);
64
+ }
65
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
66
+ throw new Error(`catalog domain 必须使用 http(s)(got ${parsed.protocol}): ${domain}`);
67
+ }
68
+ if (parsed.username !== "" || parsed.password !== "") {
69
+ throw new Error(`catalog domain 不得内嵌凭据(userinfo): ${domain}`);
70
+ }
71
+ if (parsed.search !== "" || parsed.hash !== "") {
72
+ throw new Error(`catalog domain 不得包含 query/fragment: ${domain}`);
73
+ }
74
+ if (parsed.pathname !== "" && parsed.pathname !== "/") {
75
+ throw new Error(`catalog domain 不得包含路径(agent_card_url 由本函数构造): ${domain}`);
76
+ }
77
+ const host = parsed.hostname;
78
+ const isLoopback = host === "127.0.0.1" || host === "localhost" || host === "::1";
79
+ if (parsed.protocol !== "https:" && !isLoopback) {
80
+ throw new Error(`catalog domain 远程 host 必须使用 https(本地 loopback 才允许 http): ${domain}`);
81
+ }
82
+ const port = parsed.port !== "" ? `:${parsed.port}` : "";
83
+ return `${parsed.protocol}//${host}${port}/.well-known/agent-card.json`;
84
+ }
85
+ /**
86
+ * 审查 P1-11:catalog 出站调用(可能携带 owner_token 凭据)——**绝不跟随
87
+ * 重定向**。manual redirect 下任何 3xx / opaqueredirect 立即抛错,不解析
88
+ * body:重定向会把 Authorization 头 / body / query 中的凭据转发给第三方
89
+ * host。跨源重定向是 token 泄漏路径(SC-SEC-01 同型);fail-closed 拒绝所有
90
+ * 3xx(含同源——最简且最安全的保证)。
91
+ */
92
+ async function catalogFetch(fetchImpl, url, init) {
93
+ const res = await fetchImpl(url, { ...init, redirect: "manual" });
94
+ if (isRedirectResponse(res)) {
95
+ throw new Error(`catalog request must not follow redirects (HTTP ${res.status} from ${url})`);
96
+ }
97
+ return res;
98
+ }
37
99
  /**
38
100
  * 执行一次 publish 编排。fail-closed:
39
101
  * - agent 注册失败 → 短路(listings 依赖 owner agent 存在),ok:false;
@@ -42,14 +104,21 @@ function safeAgentId(agentId) {
42
104
  */
43
105
  export async function merchantPublish(options) {
44
106
  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;
107
+ // 双身份拆分(2026-08-08 修复):catalog 侧身份与 shopping-cli 侧 merchant
108
+ // 是两个独立概念——
109
+ // - catalogMerchantId = profile.agent_id:agent 注册/复用、owner token
110
+ // 派生(HMAC)与校验、publish body merchant_id、自查端点(kiwi-catalog
111
+ // 一商家一 agent + publish 校验 owner 绑定都以此为准);
112
+ // - shoppingMerchant = --shopping-cli-merchant ?? profile.agent_id:投影
113
+ // 过滤(shopping-cli 侧 merchant)。D1 init 统一身份后两者相同;显式
114
+ // 映射用于 catalog 申请审批身份(随机 owner token)与 shopping-cli
115
+ // 商家名不同的场景——原实现把映射项当成全局身份,导致随机 token
116
+ // (KIWI_MERCHANT_TOKEN)下 publish 身份错乱。
117
+ const catalogMerchantId = profile.agent_id;
118
+ const shoppingMerchant = options.shoppingCliMerchant ?? profile.agent_id;
50
119
  const domain = options.catalogDomain ??
51
120
  process.env.KIWI_CATALOG_DOMAIN ??
52
- `merchant-${safeAgentId(merchantId)}.local`;
121
+ `merchant-${safeAgentId(catalogMerchantId)}.local`;
53
122
  // ── Step 0: shopping-cli 版本兼容检查(D3 矩阵共同消费,fail-closed)──
54
123
  // 矩阵单一来源 = product-compat.ts;与 `kiwi doctor` 共同消费。
55
124
  const versionSpawn = options.spawnImpl ?? spawnSync;
@@ -101,8 +170,8 @@ export async function merchantPublish(options) {
101
170
  let catalogAgentId;
102
171
  let agentError;
103
172
  try {
104
- const lookupUrl = `${baseUrl}/v1/agent-catalog/merchants/${encodeURIComponent(merchantId)}/agents`;
105
- const lookup = await fetchImpl(lookupUrl, { signal: AbortSignal.timeout(15_000) });
173
+ const lookupUrl = `${baseUrl}/v1/agent-catalog/merchants/${encodeURIComponent(catalogMerchantId)}/agents`;
174
+ const lookup = await catalogFetch(fetchImpl, lookupUrl, { signal: AbortSignal.timeout(15_000) });
106
175
  if (lookup.ok) {
107
176
  const body = (await lookup.json());
108
177
  const existing = body.results?.[0]?.catalog_agent_id;
@@ -115,9 +184,10 @@ export async function merchantPublish(options) {
115
184
  const reg = await registerCatalogAgent({
116
185
  catalogBaseUrl: options.catalogBaseUrl,
117
186
  domain,
118
- merchantId,
187
+ merchantId: catalogMerchantId,
188
+ ownerToken: options.ownerToken,
119
189
  ownerTokenSecret: options.ownerTokenSecret,
120
- agentCardUrl: `${domain}/.well-known/agent-card.json`,
190
+ agentCardUrl: buildAgentCardUrl(domain),
121
191
  fetchImpl: options.fetchImpl,
122
192
  timeoutMs: 15_000,
123
193
  });
@@ -137,17 +207,17 @@ export async function merchantPublish(options) {
137
207
  },
138
208
  };
139
209
  }
140
- // ── Step 2: 进程调用 shopping-cli 发布 listings ─────────────────────────
141
- // --db 是 shopping-cli 顶层参数,必须在子命令之前(usage: shopping.py [--db DB] {cmd})。
210
+ // ── Step 2: shopping-cli 投影 → 直连 catalog 发布 listings ──────────
211
+ // shopping-cli v3.0 剥离 publish-listings 后,发布面归 kiwi-catalog:
212
+ // 本步骤读取可发布投影(listings projections list --format json,只读),
213
+ // 逐条直连 POST /v1/listings/publish(owner token 直传)。--db 是
214
+ // shopping-cli 顶层参数,必须在子命令之前。
142
215
  const spawn = options.spawnImpl ?? spawnSync;
143
216
  const args = [
144
217
  "--db", options.shoppingCliDb,
145
218
  "listings",
146
- "publish-listings",
147
- "--merchant", merchantId,
148
- "--kiwi-catalog-url", options.catalogBaseUrl,
149
- "--owner-token-secret", options.ownerTokenSecret,
150
- "--owner-agent-id", catalogAgentId,
219
+ "projections",
220
+ "--merchant", shoppingMerchant,
151
221
  "--format", "json",
152
222
  ];
153
223
  let result;
@@ -172,31 +242,192 @@ export async function merchantPublish(options) {
172
242
  }
173
243
  const stdout = String(result.stdout ?? "");
174
244
  const stderr = String(result.stderr ?? "");
175
- let raw;
245
+ if (result.status !== 0) {
246
+ // fail-closed:投影读取失败(含非零退出/输出非 JSON)一律不发布
247
+ const detail = (stderr !== "" ? stderr.trim() : stdout.trim()).slice(0, 300);
248
+ return {
249
+ ok: false,
250
+ steps: {
251
+ shopping_cli_compat: compatStep,
252
+ agent: { ok: true, catalog_agent_id: catalogAgentId },
253
+ listings: {
254
+ ok: false,
255
+ errors: [`shopping-cli projections failed: ${detail !== "" ? detail : `exit ${result.status ?? "?"}`}`],
256
+ },
257
+ },
258
+ };
259
+ }
260
+ let projections = [];
176
261
  try {
177
- raw = stdout !== "" ? JSON.parse(stdout) : undefined;
262
+ const parsed = JSON.parse(stdout);
263
+ if (parsed.ok === true && Array.isArray(parsed.results)) {
264
+ projections = parsed.results;
265
+ }
178
266
  }
179
267
  catch {
180
- raw = undefined;
181
- }
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)}` : ""}`);
195
- }
196
- if (spawnFailed && raw === undefined && stdout !== "") {
197
- reportErrors.push(`shopping-cli 输出非 JSON:${stdout.slice(0, 200)}`);
198
- }
199
- const ok = !spawnFailed && reportErrors.length === 0;
268
+ // JSON → fail-closed(不发布,避免漏发)
269
+ return {
270
+ ok: false,
271
+ steps: {
272
+ shopping_cli_compat: compatStep,
273
+ agent: { ok: true, catalog_agent_id: catalogAgentId },
274
+ listings: { ok: false, errors: [`shopping-cli projections 输出非 JSON:${stdout.slice(0, 200)}`] },
275
+ },
276
+ };
277
+ }
278
+ // 逐条直连 catalog publish(投影是 canonical payload 子集;owner 身份由
279
+ // 发布方补齐:merchant_id / owner_agent_id / owner_token / handoff 默认)。
280
+ // owner token:直传优先,否则 HMAC 派生(与 register 一致)。
281
+ const effectiveOwnerToken = options.ownerToken !== undefined && options.ownerToken !== ""
282
+ ? options.ownerToken
283
+ : options.ownerTokenSecret !== undefined
284
+ ? createHmac("sha256", options.ownerTokenSecret)
285
+ .update(`kiwi-catalog-owner:${catalogMerchantId}`)
286
+ .digest("hex")
287
+ : "";
288
+ const reportErrors = [];
289
+ const publishedRefs = [];
290
+ const skippedRefs = [];
291
+ for (const projection of projections) {
292
+ const ref = String(projection.source_product_ref ?? "?");
293
+ // category 必须非空(catalog contracts.py 要求)——为空则跳过并报告,
294
+ // 不猜默认值(fail-closed)。
295
+ const category = projection.category;
296
+ if (typeof category !== "string" || category.trim() === "") {
297
+ skippedRefs.push(ref);
298
+ continue;
299
+ }
300
+ // 投影含内部元数据(_provenance 等)——catalog 契约 additionalProperties:
301
+ // false,发布前剔除 _ 前缀字段(仅 wire 字段进 body)。
302
+ const wireFields = Object.fromEntries(Object.entries(projection).filter(([key]) => !key.startsWith("_")));
303
+ // 每商品成交入口(KTH destination_ref):投影携带商家维护的
304
+ // handoff_destination(shopping-cli products.handoff_destination)。
305
+ // 映射为 listing 的 handoff_destination_ref,并剔除原始字段(catalog 契约
306
+ // 只认 handoff_destination_ref,additionalProperties:false 会拒未知键)。
307
+ const { handoff_destination: rawHandoff, ...projectionWire } = wireFields;
308
+ const handoffRef = typeof rawHandoff === "string" ? rawHandoff.trim() : "";
309
+ const body = {
310
+ ...projectionWire,
311
+ merchant_id: catalogMerchantId,
312
+ owner_agent_id: catalogAgentId,
313
+ owner_token: effectiveOwnerToken,
314
+ handoff_destination_types: ["external_checkout_url"],
315
+ };
316
+ if (handoffRef !== "") {
317
+ body.handoff_destination_ref = handoffRef;
318
+ }
319
+ if (typeof body.owner_token !== "string" || body.owner_token === "") {
320
+ reportErrors.push(`${ref}: no owner token (KIWI_MERCHANT_TOKEN 或 secret 派生)`);
321
+ continue;
322
+ }
323
+ try {
324
+ const res = await catalogFetch(fetchImpl, `${baseUrl}/v1/listings/publish`, {
325
+ method: "POST",
326
+ headers: { "Content-Type": "application/json" },
327
+ body: JSON.stringify(body),
328
+ signal: AbortSignal.timeout(20_000),
329
+ });
330
+ const payload = (await res.json());
331
+ if (res.ok && payload.ok === true) {
332
+ publishedRefs.push(ref);
333
+ }
334
+ else {
335
+ reportErrors.push(`${ref}: ${payload.error ?? `HTTP ${res.status}`}`);
336
+ }
337
+ }
338
+ catch (err) {
339
+ reportErrors.push(`${ref}: ${err instanceof Error ? err.message : String(err)}`);
340
+ }
341
+ }
342
+ // ── Step 2b: reconcile——投影消失的商品 withdraw(data-hub DoD #5)──────
343
+ // products.active=0 或已删除的商品不再出现在投影里;拉取本 agent 现有
344
+ // product listings(自查端点,owner_token 经 query),与投影 ref 集合
345
+ // diff,多出的下架(capability listing 不在投影集合,不处理)。服务端
346
+ // 对已 WITHDRAWN 幂等返回;SUSPENDED 的 listing 也允许商家 withdraw。
347
+ const projectedRefs = new Set(projections.map((p) => String(p.source_product_ref ?? "")).filter((ref) => ref !== ""));
348
+ // 审查 P1-B(2026-08-10 复验):空投影 + 既有 ACTIVE product listing =
349
+ // 配置错误典型信号(--shopping-cli-merchant 不匹配 / --shopping-cli-db
350
+ // 指向空库)——此前 reconcile 会把自查端点返回的全部 listing 下架且
351
+ // 报告仍 ok:true,自动化发布不告警。fail-closed:拒绝下架,除非显式
352
+ // allowEmptyProjectionReconcile。自查失败不在此重复判定(下方循环会报)。
353
+ let reconcileBlocked = false;
354
+ if (projections.length === 0 && options.allowEmptyProjectionReconcile !== true) {
355
+ const probeUrl = `${baseUrl}/v1/agents/${encodeURIComponent(catalogAgentId)}/listings` +
356
+ `?owner_token=${encodeURIComponent(effectiveOwnerToken)}&limit=100`;
357
+ try {
358
+ const probeRes = await catalogFetch(fetchImpl, probeUrl, { signal: AbortSignal.timeout(15_000) });
359
+ const probePayload = (await probeRes.json());
360
+ if (probeRes.ok && probePayload.ok === true) {
361
+ const hasActiveProductListing = (probePayload.results ?? []).some((rec) => String(rec.listing_type ?? "") === "product" &&
362
+ String(rec.publication_state ?? "") !== "WITHDRAWN");
363
+ if (hasActiveProductListing) {
364
+ reconcileBlocked = true;
365
+ reportErrors.push("投影为空但 catalog 存在 ACTIVE product listing:拒绝 reconcile 下架" +
366
+ "(疑似 --shopping-cli-merchant 不匹配或 --shopping-cli-db 指向空库);" +
367
+ "如确需全部下架请显式传 --allow-empty-projection");
368
+ }
369
+ }
370
+ }
371
+ catch {
372
+ // 探测失败交给下方 reconcile 循环报错(fail-closed 语义一致)
373
+ }
374
+ }
375
+ const withdrawnRefs = [];
376
+ try {
377
+ let cursor;
378
+ for (;;) {
379
+ if (reconcileBlocked)
380
+ break;
381
+ const listUrl = `${baseUrl}/v1/agents/${encodeURIComponent(catalogAgentId)}/listings` +
382
+ `?owner_token=${encodeURIComponent(effectiveOwnerToken)}&limit=100` +
383
+ (cursor !== undefined ? `&cursor=${encodeURIComponent(cursor)}` : "");
384
+ const listRes = await catalogFetch(fetchImpl, listUrl, { signal: AbortSignal.timeout(15_000) });
385
+ const listPayload = (await listRes.json());
386
+ if (!listRes.ok || listPayload.ok !== true) {
387
+ reportErrors.push(`withdraw reconcile failed: ${listPayload.error ?? `HTTP ${listRes.status}`}`);
388
+ break;
389
+ }
390
+ for (const rec of listPayload.results ?? []) {
391
+ // 只 diff product listing:capability listing 不在投影集合,不处理
392
+ if (String(rec.listing_type ?? "") !== "product")
393
+ continue;
394
+ const ref = String(rec.source_product_ref ?? "");
395
+ if (ref === "" || projectedRefs.has(ref))
396
+ continue;
397
+ if (String(rec.publication_state ?? "") === "WITHDRAWN")
398
+ continue;
399
+ const listingId = String(rec.listing_id ?? "");
400
+ if (listingId === "")
401
+ continue;
402
+ try {
403
+ const wRes = await catalogFetch(fetchImpl, `${baseUrl}/v1/listings/${encodeURIComponent(listingId)}/withdraw`, {
404
+ method: "POST",
405
+ headers: { "Content-Type": "application/json" },
406
+ body: JSON.stringify({ owner_token: effectiveOwnerToken }),
407
+ signal: AbortSignal.timeout(20_000),
408
+ });
409
+ const wPayload = (await wRes.json());
410
+ if (wRes.ok && wPayload.ok === true) {
411
+ withdrawnRefs.push(ref);
412
+ }
413
+ else {
414
+ reportErrors.push(`${ref}: withdraw ${wPayload.error ?? `HTTP ${wRes.status}`}`);
415
+ }
416
+ }
417
+ catch (err) {
418
+ reportErrors.push(`${ref}: withdraw ${err instanceof Error ? err.message : String(err)}`);
419
+ }
420
+ }
421
+ const next = listPayload.next_cursor;
422
+ if (typeof next !== "string" || next === "")
423
+ break;
424
+ cursor = next;
425
+ }
426
+ }
427
+ catch (err) {
428
+ reportErrors.push(`withdraw reconcile failed: ${err instanceof Error ? err.message : String(err)}`);
429
+ }
430
+ const ok = reportErrors.length === 0;
200
431
  return {
201
432
  ok,
202
433
  steps: {
@@ -204,11 +435,13 @@ export async function merchantPublish(options) {
204
435
  agent: { ok: true, catalog_agent_id: catalogAgentId },
205
436
  listings: {
206
437
  ok,
207
- published,
208
- skipped,
209
- withdrawn,
438
+ published: publishedRefs.length,
439
+ skipped: skippedRefs.length,
440
+ withdrawn: withdrawnRefs.length,
441
+ published_refs: publishedRefs,
442
+ skipped_refs: skippedRefs,
443
+ withdrawn_refs: withdrawnRefs,
210
444
  ...(reportErrors.length > 0 ? { errors: reportErrors } : {}),
211
- ...(raw !== undefined ? { raw } : {}),
212
445
  },
213
446
  },
214
447
  };
@@ -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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"}
@@ -75,5 +75,10 @@ export declare function parseStackConfig(raw: string, source: string): StackConf
75
75
  /** A free loopback port (best effort; the usual bind-after-close race applies). */
76
76
  export declare function pickFreePort(): Promise<number>;
77
77
  export declare function newInstanceId(): string;
78
- /** Detect the shopping-cli source checkout (sibling of the Kiwi package). */
78
+ /** Detect a nearby shopping-cli source checkout.
79
+ *
80
+ * Local development keeps the repositories as siblings, while composition CI
81
+ * checks the pinned consumer out below the Kiwi workspace. Support both
82
+ * layouts so `kiwi init` remains deterministic in either environment.
83
+ */
79
84
  export declare function detectShoppingCliSrc(packageRoot: string): string | undefined;
@@ -254,9 +254,17 @@ export async function pickFreePort() {
254
254
  export function newInstanceId() {
255
255
  return randomBytes(16).toString("hex");
256
256
  }
257
- /** Detect the shopping-cli source checkout (sibling of the Kiwi package). */
257
+ /** Detect a nearby shopping-cli source checkout.
258
+ *
259
+ * Local development keeps the repositories as siblings, while composition CI
260
+ * checks the pinned consumer out below the Kiwi workspace. Support both
261
+ * layouts so `kiwi init` remains deterministic in either environment.
262
+ */
258
263
  export function detectShoppingCliSrc(packageRoot) {
259
- const candidate = path.resolve(packageRoot, "..", "shopping-cli");
260
- return existsSync(path.join(candidate, "shopping_cli")) ? candidate : undefined;
264
+ const candidates = [
265
+ path.resolve(packageRoot, "..", "shopping-cli"),
266
+ path.resolve(packageRoot, "shopping-cli"),
267
+ ];
268
+ return candidates.find((candidate) => existsSync(path.join(candidate, "shopping_cli")));
261
269
  }
262
270
  //# sourceMappingURL=stack-config.js.map