@harrylabsj/kiwi 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +150 -0
  3. package/contracts/candidate-agent-dto-1.0.README.md +39 -0
  4. package/contracts/candidate-agent-dto-1.0.schema.json +172 -0
  5. package/contracts/interop/kiwi-buyer-message-send.json +43 -0
  6. package/contracts/interop/knp-data-part-examples.json +243 -0
  7. package/contracts/kiwi-catalog/1.0/agent-record.schema.json +78 -0
  8. package/contracts/kiwi-catalog/1.0/listing-record.schema.json +88 -0
  9. package/contracts/kiwi-catalog/1.0/listing-search-result.schema.json +60 -0
  10. package/contracts/negotiation/1.0/schema.json +501 -0
  11. package/contracts/shopping.negotiation/0.1/capabilities.schema.json +47 -0
  12. package/contracts/shopping.negotiation/0.1/decision.schema.json +120 -0
  13. package/contracts/shopping.negotiation/0.1/policy-result.schema.json +52 -0
  14. package/contracts/shopping.negotiation/0.1/snapshot.schema.json +172 -0
  15. package/dist/a2a/client/client.d.ts +33 -0
  16. package/dist/a2a/client/client.js +161 -0
  17. package/dist/a2a/client/client.js.map +1 -0
  18. package/dist/a2a/client/error.d.ts +35 -0
  19. package/dist/a2a/client/error.js +34 -0
  20. package/dist/a2a/client/error.js.map +1 -0
  21. package/dist/a2a/client/index.d.ts +29 -0
  22. package/dist/a2a/client/index.js +26 -0
  23. package/dist/a2a/client/index.js.map +1 -0
  24. package/dist/a2a/client/jsonrpc.d.ts +49 -0
  25. package/dist/a2a/client/jsonrpc.js +85 -0
  26. package/dist/a2a/client/jsonrpc.js.map +1 -0
  27. package/dist/a2a/client/parse.d.ts +18 -0
  28. package/dist/a2a/client/parse.js +134 -0
  29. package/dist/a2a/client/parse.js.map +1 -0
  30. package/dist/a2a/client/types.d.ts +102 -0
  31. package/dist/a2a/client/types.js +26 -0
  32. package/dist/a2a/client/types.js.map +1 -0
  33. package/dist/a2a/client/url-policy.d.ts +44 -0
  34. package/dist/a2a/client/url-policy.js +242 -0
  35. package/dist/a2a/client/url-policy.js.map +1 -0
  36. package/dist/a2a/negotiate.d.ts +68 -0
  37. package/dist/a2a/negotiate.js +288 -0
  38. package/dist/a2a/negotiate.js.map +1 -0
  39. package/dist/a2a/node.d.ts +37 -0
  40. package/dist/a2a/node.js +155 -0
  41. package/dist/a2a/node.js.map +1 -0
  42. package/dist/a2a/server/auth.d.ts +38 -0
  43. package/dist/a2a/server/auth.js +112 -0
  44. package/dist/a2a/server/auth.js.map +1 -0
  45. package/dist/a2a/server/card.d.ts +19 -0
  46. package/dist/a2a/server/card.js +81 -0
  47. package/dist/a2a/server/card.js.map +1 -0
  48. package/dist/a2a/server/errors.d.ts +109 -0
  49. package/dist/a2a/server/errors.js +178 -0
  50. package/dist/a2a/server/errors.js.map +1 -0
  51. package/dist/a2a/server/handler.d.ts +22 -0
  52. package/dist/a2a/server/handler.js +57 -0
  53. package/dist/a2a/server/handler.js.map +1 -0
  54. package/dist/a2a/server/inbound-message.d.ts +37 -0
  55. package/dist/a2a/server/inbound-message.js +104 -0
  56. package/dist/a2a/server/inbound-message.js.map +1 -0
  57. package/dist/a2a/server/index.d.ts +43 -0
  58. package/dist/a2a/server/index.js +42 -0
  59. package/dist/a2a/server/index.js.map +1 -0
  60. package/dist/a2a/server/merchant-handler.d.ts +69 -0
  61. package/dist/a2a/server/merchant-handler.js +316 -0
  62. package/dist/a2a/server/merchant-handler.js.map +1 -0
  63. package/dist/a2a/server/pipeline.d.ts +69 -0
  64. package/dist/a2a/server/pipeline.js +329 -0
  65. package/dist/a2a/server/pipeline.js.map +1 -0
  66. package/dist/a2a/server/server.d.ts +64 -0
  67. package/dist/a2a/server/server.js +420 -0
  68. package/dist/a2a/server/server.js.map +1 -0
  69. package/dist/a2a/server/task-registry.d.ts +31 -0
  70. package/dist/a2a/server/task-registry.js +67 -0
  71. package/dist/a2a/server/task-registry.js.map +1 -0
  72. package/dist/a2a/server/throttle.d.ts +154 -0
  73. package/dist/a2a/server/throttle.js +289 -0
  74. package/dist/a2a/server/throttle.js.map +1 -0
  75. package/dist/a2a/server/types.d.ts +191 -0
  76. package/dist/a2a/server/types.js +17 -0
  77. package/dist/a2a/server/types.js.map +1 -0
  78. package/dist/a2a/server/ucp.d.ts +49 -0
  79. package/dist/a2a/server/ucp.js +85 -0
  80. package/dist/a2a/server/ucp.js.map +1 -0
  81. package/dist/a2a/task/index.d.ts +24 -0
  82. package/dist/a2a/task/index.js +22 -0
  83. package/dist/a2a/task/index.js.map +1 -0
  84. package/dist/a2a/task/ledger.d.ts +48 -0
  85. package/dist/a2a/task/ledger.js +65 -0
  86. package/dist/a2a/task/ledger.js.map +1 -0
  87. package/dist/a2a/task/poller.d.ts +93 -0
  88. package/dist/a2a/task/poller.js +184 -0
  89. package/dist/a2a/task/poller.js.map +1 -0
  90. package/dist/a2a/task/state.d.ts +72 -0
  91. package/dist/a2a/task/state.js +119 -0
  92. package/dist/a2a/task/state.js.map +1 -0
  93. package/dist/a2a/ucp-agent.d.ts +49 -0
  94. package/dist/a2a/ucp-agent.js +78 -0
  95. package/dist/a2a/ucp-agent.js.map +1 -0
  96. package/dist/agent/agent-db.d.ts +31 -0
  97. package/dist/agent/agent-db.js +91 -0
  98. package/dist/agent/agent-db.js.map +1 -0
  99. package/dist/agent/buyer/buyer-tools.d.ts +70 -0
  100. package/dist/agent/buyer/buyer-tools.js +1353 -0
  101. package/dist/agent/buyer/buyer-tools.js.map +1 -0
  102. package/dist/agent/buyer/ranker.d.ts +53 -0
  103. package/dist/agent/buyer/ranker.js +153 -0
  104. package/dist/agent/buyer/ranker.js.map +1 -0
  105. package/dist/agent/buyer/scheduler.d.ts +58 -0
  106. package/dist/agent/buyer/scheduler.js +317 -0
  107. package/dist/agent/buyer/scheduler.js.map +1 -0
  108. package/dist/agent/buyer/search-loop.d.ts +42 -0
  109. package/dist/agent/buyer/search-loop.js +280 -0
  110. package/dist/agent/buyer/search-loop.js.map +1 -0
  111. package/dist/agent/buyer/task-store.d.ts +178 -0
  112. package/dist/agent/buyer/task-store.js +637 -0
  113. package/dist/agent/buyer/task-store.js.map +1 -0
  114. package/dist/agent/buyer/types.d.ts +222 -0
  115. package/dist/agent/buyer/types.js +124 -0
  116. package/dist/agent/buyer/types.js.map +1 -0
  117. package/dist/agent/chat-tools.d.ts +41 -0
  118. package/dist/agent/chat-tools.js +193 -0
  119. package/dist/agent/chat-tools.js.map +1 -0
  120. package/dist/agent/chat-tui.d.ts +49 -0
  121. package/dist/agent/chat-tui.js +314 -0
  122. package/dist/agent/chat-tui.js.map +1 -0
  123. package/dist/agent/connector/fake-connector.d.ts +50 -0
  124. package/dist/agent/connector/fake-connector.js +138 -0
  125. package/dist/agent/connector/fake-connector.js.map +1 -0
  126. package/dist/agent/connector/http-connector.d.ts +49 -0
  127. package/dist/agent/connector/http-connector.js +208 -0
  128. package/dist/agent/connector/http-connector.js.map +1 -0
  129. package/dist/agent/connector/types.d.ts +103 -0
  130. package/dist/agent/connector/types.js +97 -0
  131. package/dist/agent/connector/types.js.map +1 -0
  132. package/dist/agent/fake-chat-model.d.ts +22 -0
  133. package/dist/agent/fake-chat-model.js +134 -0
  134. package/dist/agent/fake-chat-model.js.map +1 -0
  135. package/dist/agent/kernel.d.ts +258 -0
  136. package/dist/agent/kernel.js +1099 -0
  137. package/dist/agent/kernel.js.map +1 -0
  138. package/dist/agent/memory/schema.d.ts +32 -0
  139. package/dist/agent/memory/schema.js +291 -0
  140. package/dist/agent/memory/schema.js.map +1 -0
  141. package/dist/agent/memory/store.d.ts +193 -0
  142. package/dist/agent/memory/store.js +881 -0
  143. package/dist/agent/memory/store.js.map +1 -0
  144. package/dist/agent/memory/types.d.ts +139 -0
  145. package/dist/agent/memory/types.js +119 -0
  146. package/dist/agent/memory/types.js.map +1 -0
  147. package/dist/agent/memory/vault.d.ts +49 -0
  148. package/dist/agent/memory/vault.js +125 -0
  149. package/dist/agent/memory/vault.js.map +1 -0
  150. package/dist/agent/merchant/action-candidate.d.ts +106 -0
  151. package/dist/agent/merchant/action-candidate.js +241 -0
  152. package/dist/agent/merchant/action-candidate.js.map +1 -0
  153. package/dist/agent/merchant/credential-broker.d.ts +67 -0
  154. package/dist/agent/merchant/credential-broker.js +76 -0
  155. package/dist/agent/merchant/credential-broker.js.map +1 -0
  156. package/dist/agent/merchant/fake-merchant-client.d.ts +47 -0
  157. package/dist/agent/merchant/fake-merchant-client.js +143 -0
  158. package/dist/agent/merchant/fake-merchant-client.js.map +1 -0
  159. package/dist/agent/merchant/merchant-client.d.ts +49 -0
  160. package/dist/agent/merchant/merchant-client.js +186 -0
  161. package/dist/agent/merchant/merchant-client.js.map +1 -0
  162. package/dist/agent/merchant/merchant-tools.d.ts +74 -0
  163. package/dist/agent/merchant/merchant-tools.js +582 -0
  164. package/dist/agent/merchant/merchant-tools.js.map +1 -0
  165. package/dist/agent/merchant/types.d.ts +119 -0
  166. package/dist/agent/merchant/types.js +133 -0
  167. package/dist/agent/merchant/types.js.map +1 -0
  168. package/dist/agent/mode.d.ts +32 -0
  169. package/dist/agent/mode.js +34 -0
  170. package/dist/agent/mode.js.map +1 -0
  171. package/dist/agent/negotiation-chat.d.ts +81 -0
  172. package/dist/agent/negotiation-chat.js +330 -0
  173. package/dist/agent/negotiation-chat.js.map +1 -0
  174. package/dist/agent/session.d.ts +22 -0
  175. package/dist/agent/session.js +164 -0
  176. package/dist/agent/session.js.map +1 -0
  177. package/dist/agent/system-prompt.d.ts +26 -0
  178. package/dist/agent/system-prompt.js +77 -0
  179. package/dist/agent/system-prompt.js.map +1 -0
  180. package/dist/agent/write-gate.d.ts +98 -0
  181. package/dist/agent/write-gate.js +76 -0
  182. package/dist/agent/write-gate.js.map +1 -0
  183. package/dist/cli.d.ts +18 -0
  184. package/dist/cli.js +1139 -0
  185. package/dist/cli.js.map +1 -0
  186. package/dist/commerce/data-source.d.ts +88 -0
  187. package/dist/commerce/data-source.js +25 -0
  188. package/dist/commerce/data-source.js.map +1 -0
  189. package/dist/commerce/erp-source.d.ts +51 -0
  190. package/dist/commerce/erp-source.js +184 -0
  191. package/dist/commerce/erp-source.js.map +1 -0
  192. package/dist/commerce/fake-client.d.ts +167 -0
  193. package/dist/commerce/fake-client.js +549 -0
  194. package/dist/commerce/fake-client.js.map +1 -0
  195. package/dist/commerce/http-client.d.ts +73 -0
  196. package/dist/commerce/http-client.js +284 -0
  197. package/dist/commerce/http-client.js.map +1 -0
  198. package/dist/commerce/local-db-source.d.ts +50 -0
  199. package/dist/commerce/local-db-source.js +162 -0
  200. package/dist/commerce/local-db-source.js.map +1 -0
  201. package/dist/commerce/shopping-cli-source.d.ts +57 -0
  202. package/dist/commerce/shopping-cli-source.js +206 -0
  203. package/dist/commerce/shopping-cli-source.js.map +1 -0
  204. package/dist/commerce/types.d.ts +146 -0
  205. package/dist/commerce/types.js +31 -0
  206. package/dist/commerce/types.js.map +1 -0
  207. package/dist/config/profile.d.ts +122 -0
  208. package/dist/config/profile.js +386 -0
  209. package/dist/config/profile.js.map +1 -0
  210. package/dist/contracts/negotiation-schema.d.ts +28 -0
  211. package/dist/contracts/negotiation-schema.js +101 -0
  212. package/dist/contracts/negotiation-schema.js.map +1 -0
  213. package/dist/contracts/schemas.d.ts +31 -0
  214. package/dist/contracts/schemas.js +122 -0
  215. package/dist/contracts/schemas.js.map +1 -0
  216. package/dist/counterparty/a2a-direct/index.d.ts +41 -0
  217. package/dist/counterparty/a2a-direct/index.js +330 -0
  218. package/dist/counterparty/a2a-direct/index.js.map +1 -0
  219. package/dist/counterparty/channel.d.ts +200 -0
  220. package/dist/counterparty/channel.js +61 -0
  221. package/dist/counterparty/channel.js.map +1 -0
  222. package/dist/counterparty/index.d.ts +28 -0
  223. package/dist/counterparty/index.js +24 -0
  224. package/dist/counterparty/index.js.map +1 -0
  225. package/dist/counterparty/platform-api/index.d.ts +41 -0
  226. package/dist/counterparty/platform-api/index.js +65 -0
  227. package/dist/counterparty/platform-api/index.js.map +1 -0
  228. package/dist/counterparty/registry.d.ts +51 -0
  229. package/dist/counterparty/registry.js +71 -0
  230. package/dist/counterparty/registry.js.map +1 -0
  231. package/dist/counterparty/shopping-cli-hosted/index.d.ts +36 -0
  232. package/dist/counterparty/shopping-cli-hosted/index.js +337 -0
  233. package/dist/counterparty/shopping-cli-hosted/index.js.map +1 -0
  234. package/dist/discovery/agent-card/error.d.ts +28 -0
  235. package/dist/discovery/agent-card/error.js +31 -0
  236. package/dist/discovery/agent-card/error.js.map +1 -0
  237. package/dist/discovery/agent-card/extensions.d.ts +20 -0
  238. package/dist/discovery/agent-card/extensions.js +59 -0
  239. package/dist/discovery/agent-card/extensions.js.map +1 -0
  240. package/dist/discovery/agent-card/index.d.ts +29 -0
  241. package/dist/discovery/agent-card/index.js +38 -0
  242. package/dist/discovery/agent-card/index.js.map +1 -0
  243. package/dist/discovery/agent-card/secrets.d.ts +30 -0
  244. package/dist/discovery/agent-card/secrets.js +240 -0
  245. package/dist/discovery/agent-card/secrets.js.map +1 -0
  246. package/dist/discovery/agent-card/types.d.ts +110 -0
  247. package/dist/discovery/agent-card/types.js +37 -0
  248. package/dist/discovery/agent-card/types.js.map +1 -0
  249. package/dist/discovery/agent-card/validate.d.ts +31 -0
  250. package/dist/discovery/agent-card/validate.js +210 -0
  251. package/dist/discovery/agent-card/validate.js.map +1 -0
  252. package/dist/discovery/capability/error.d.ts +23 -0
  253. package/dist/discovery/capability/error.js +28 -0
  254. package/dist/discovery/capability/error.js.map +1 -0
  255. package/dist/discovery/capability/index.d.ts +21 -0
  256. package/dist/discovery/capability/index.js +21 -0
  257. package/dist/discovery/capability/index.js.map +1 -0
  258. package/dist/discovery/capability/intersect.d.ts +56 -0
  259. package/dist/discovery/capability/intersect.js +137 -0
  260. package/dist/discovery/capability/intersect.js.map +1 -0
  261. package/dist/discovery/catalog-source/errors.d.ts +32 -0
  262. package/dist/discovery/catalog-source/errors.js +41 -0
  263. package/dist/discovery/catalog-source/errors.js.map +1 -0
  264. package/dist/discovery/catalog-source/index.d.ts +30 -0
  265. package/dist/discovery/catalog-source/index.js +29 -0
  266. package/dist/discovery/catalog-source/index.js.map +1 -0
  267. package/dist/discovery/catalog-source/kiwi-record.d.ts +183 -0
  268. package/dist/discovery/catalog-source/kiwi-record.js +72 -0
  269. package/dist/discovery/catalog-source/kiwi-record.js.map +1 -0
  270. package/dist/discovery/catalog-source/kiwi-schema.d.ts +33 -0
  271. package/dist/discovery/catalog-source/kiwi-schema.js +106 -0
  272. package/dist/discovery/catalog-source/kiwi-schema.js.map +1 -0
  273. package/dist/discovery/catalog-source/kiwi-source.d.ts +38 -0
  274. package/dist/discovery/catalog-source/kiwi-source.js +318 -0
  275. package/dist/discovery/catalog-source/kiwi-source.js.map +1 -0
  276. package/dist/discovery/catalog-source/register.d.ts +48 -0
  277. package/dist/discovery/catalog-source/register.js +83 -0
  278. package/dist/discovery/catalog-source/register.js.map +1 -0
  279. package/dist/discovery/catalog-source/schema.d.ts +21 -0
  280. package/dist/discovery/catalog-source/schema.js +63 -0
  281. package/dist/discovery/catalog-source/schema.js.map +1 -0
  282. package/dist/discovery/catalog-source/source.d.ts +45 -0
  283. package/dist/discovery/catalog-source/source.js +197 -0
  284. package/dist/discovery/catalog-source/source.js.map +1 -0
  285. package/dist/discovery/catalog-source/types.d.ts +122 -0
  286. package/dist/discovery/catalog-source/types.js +30 -0
  287. package/dist/discovery/catalog-source/types.js.map +1 -0
  288. package/dist/discovery/index.d.ts +25 -0
  289. package/dist/discovery/index.js +25 -0
  290. package/dist/discovery/index.js.map +1 -0
  291. package/dist/discovery/resolve.d.ts +175 -0
  292. package/dist/discovery/resolve.js +367 -0
  293. package/dist/discovery/resolve.js.map +1 -0
  294. package/dist/discovery/ucp/error.d.ts +25 -0
  295. package/dist/discovery/ucp/error.js +27 -0
  296. package/dist/discovery/ucp/error.js.map +1 -0
  297. package/dist/discovery/ucp/index.d.ts +33 -0
  298. package/dist/discovery/ucp/index.js +28 -0
  299. package/dist/discovery/ucp/index.js.map +1 -0
  300. package/dist/discovery/ucp/intersect.d.ts +148 -0
  301. package/dist/discovery/ucp/intersect.js +312 -0
  302. package/dist/discovery/ucp/intersect.js.map +1 -0
  303. package/dist/discovery/ucp/resolver.d.ts +62 -0
  304. package/dist/discovery/ucp/resolver.js +214 -0
  305. package/dist/discovery/ucp/resolver.js.map +1 -0
  306. package/dist/discovery/ucp/types.d.ts +97 -0
  307. package/dist/discovery/ucp/types.js +103 -0
  308. package/dist/discovery/ucp/types.js.map +1 -0
  309. package/dist/discovery/ucp/validate.d.ts +38 -0
  310. package/dist/discovery/ucp/validate.js +232 -0
  311. package/dist/discovery/ucp/validate.js.map +1 -0
  312. package/dist/discovery/ucp/vendor.d.ts +60 -0
  313. package/dist/discovery/ucp/vendor.js +61 -0
  314. package/dist/discovery/ucp/vendor.js.map +1 -0
  315. package/dist/doctor.d.ts +26 -0
  316. package/dist/doctor.js +113 -0
  317. package/dist/doctor.js.map +1 -0
  318. package/dist/exit-codes.d.ts +26 -0
  319. package/dist/exit-codes.js +27 -0
  320. package/dist/exit-codes.js.map +1 -0
  321. package/dist/fanout/disclosure.d.ts +138 -0
  322. package/dist/fanout/disclosure.js +188 -0
  323. package/dist/fanout/disclosure.js.map +1 -0
  324. package/dist/fanout/index.d.ts +32 -0
  325. package/dist/fanout/index.js +30 -0
  326. package/dist/fanout/index.js.map +1 -0
  327. package/dist/fanout/orchestrator.d.ts +153 -0
  328. package/dist/fanout/orchestrator.js +439 -0
  329. package/dist/fanout/orchestrator.js.map +1 -0
  330. package/dist/fanout/policy.d.ts +128 -0
  331. package/dist/fanout/policy.js +130 -0
  332. package/dist/fanout/policy.js.map +1 -0
  333. package/dist/handoff/acp-commerce.d.ts +58 -0
  334. package/dist/handoff/acp-commerce.js +69 -0
  335. package/dist/handoff/acp-commerce.js.map +1 -0
  336. package/dist/handoff/authorization.d.ts +127 -0
  337. package/dist/handoff/authorization.js +107 -0
  338. package/dist/handoff/authorization.js.map +1 -0
  339. package/dist/handoff/candidate.d.ts +94 -0
  340. package/dist/handoff/candidate.js +172 -0
  341. package/dist/handoff/candidate.js.map +1 -0
  342. package/dist/handoff/channel.d.ts +88 -0
  343. package/dist/handoff/channel.js +189 -0
  344. package/dist/handoff/channel.js.map +1 -0
  345. package/dist/handoff/completion.d.ts +44 -0
  346. package/dist/handoff/completion.js +136 -0
  347. package/dist/handoff/completion.js.map +1 -0
  348. package/dist/handoff/delivery.d.ts +59 -0
  349. package/dist/handoff/delivery.js +185 -0
  350. package/dist/handoff/delivery.js.map +1 -0
  351. package/dist/handoff/destination.d.ts +39 -0
  352. package/dist/handoff/destination.js +99 -0
  353. package/dist/handoff/destination.js.map +1 -0
  354. package/dist/handoff/errors.d.ts +34 -0
  355. package/dist/handoff/errors.js +47 -0
  356. package/dist/handoff/errors.js.map +1 -0
  357. package/dist/handoff/idempotency.d.ts +51 -0
  358. package/dist/handoff/idempotency.js +168 -0
  359. package/dist/handoff/idempotency.js.map +1 -0
  360. package/dist/handoff/index.d.ts +46 -0
  361. package/dist/handoff/index.js +48 -0
  362. package/dist/handoff/index.js.map +1 -0
  363. package/dist/handoff/ledger.d.ts +94 -0
  364. package/dist/handoff/ledger.js +195 -0
  365. package/dist/handoff/ledger.js.map +1 -0
  366. package/dist/handoff/lifecycle.d.ts +29 -0
  367. package/dist/handoff/lifecycle.js +102 -0
  368. package/dist/handoff/lifecycle.js.map +1 -0
  369. package/dist/handoff/metrics.d.ts +56 -0
  370. package/dist/handoff/metrics.js +78 -0
  371. package/dist/handoff/metrics.js.map +1 -0
  372. package/dist/handoff/operator-approval.d.ts +143 -0
  373. package/dist/handoff/operator-approval.js +287 -0
  374. package/dist/handoff/operator-approval.js.map +1 -0
  375. package/dist/handoff/order-record.d.ts +104 -0
  376. package/dist/handoff/order-record.js +235 -0
  377. package/dist/handoff/order-record.js.map +1 -0
  378. package/dist/handoff/package.d.ts +102 -0
  379. package/dist/handoff/package.js +132 -0
  380. package/dist/handoff/package.js.map +1 -0
  381. package/dist/handoff/transaction.d.ts +96 -0
  382. package/dist/handoff/transaction.js +263 -0
  383. package/dist/handoff/transaction.js.map +1 -0
  384. package/dist/handoff/ucp-checkout/cart-channel.d.ts +111 -0
  385. package/dist/handoff/ucp-checkout/cart-channel.js +370 -0
  386. package/dist/handoff/ucp-checkout/cart-channel.js.map +1 -0
  387. package/dist/handoff/ucp-checkout/cart-parse.d.ts +22 -0
  388. package/dist/handoff/ucp-checkout/cart-parse.js +102 -0
  389. package/dist/handoff/ucp-checkout/cart-parse.js.map +1 -0
  390. package/dist/handoff/ucp-checkout/cart-types.d.ts +93 -0
  391. package/dist/handoff/ucp-checkout/cart-types.js +38 -0
  392. package/dist/handoff/ucp-checkout/cart-types.js.map +1 -0
  393. package/dist/handoff/ucp-checkout/channel.d.ts +159 -0
  394. package/dist/handoff/ucp-checkout/channel.js +636 -0
  395. package/dist/handoff/ucp-checkout/channel.js.map +1 -0
  396. package/dist/handoff/ucp-checkout/client.d.ts +88 -0
  397. package/dist/handoff/ucp-checkout/client.js +228 -0
  398. package/dist/handoff/ucp-checkout/client.js.map +1 -0
  399. package/dist/handoff/ucp-checkout/endpoint.d.ts +36 -0
  400. package/dist/handoff/ucp-checkout/endpoint.js +145 -0
  401. package/dist/handoff/ucp-checkout/endpoint.js.map +1 -0
  402. package/dist/handoff/ucp-checkout/index.d.ts +35 -0
  403. package/dist/handoff/ucp-checkout/index.js +36 -0
  404. package/dist/handoff/ucp-checkout/index.js.map +1 -0
  405. package/dist/handoff/ucp-checkout/parse.d.ts +71 -0
  406. package/dist/handoff/ucp-checkout/parse.js +349 -0
  407. package/dist/handoff/ucp-checkout/parse.js.map +1 -0
  408. package/dist/handoff/ucp-checkout/totals.d.ts +41 -0
  409. package/dist/handoff/ucp-checkout/totals.js +36 -0
  410. package/dist/handoff/ucp-checkout/totals.js.map +1 -0
  411. package/dist/handoff/ucp-checkout/types.d.ts +149 -0
  412. package/dist/handoff/ucp-checkout/types.js +58 -0
  413. package/dist/handoff/ucp-checkout/types.js.map +1 -0
  414. package/dist/handoff/url-safety.d.ts +44 -0
  415. package/dist/handoff/url-safety.js +121 -0
  416. package/dist/handoff/url-safety.js.map +1 -0
  417. package/dist/i18n.d.ts +24 -0
  418. package/dist/i18n.js +27 -0
  419. package/dist/i18n.js.map +1 -0
  420. package/dist/negotiation/action-candidate.d.ts +97 -0
  421. package/dist/negotiation/action-candidate.js +160 -0
  422. package/dist/negotiation/action-candidate.js.map +1 -0
  423. package/dist/negotiation/condition/evaluator.d.ts +36 -0
  424. package/dist/negotiation/condition/evaluator.js +123 -0
  425. package/dist/negotiation/condition/evaluator.js.map +1 -0
  426. package/dist/negotiation/context-map/index.d.ts +23 -0
  427. package/dist/negotiation/context-map/index.js +22 -0
  428. package/dist/negotiation/context-map/index.js.map +1 -0
  429. package/dist/negotiation/context-map/store.d.ts +51 -0
  430. package/dist/negotiation/context-map/store.js +186 -0
  431. package/dist/negotiation/context-map/store.js.map +1 -0
  432. package/dist/negotiation/context-map/types.d.ts +29 -0
  433. package/dist/negotiation/context-map/types.js +57 -0
  434. package/dist/negotiation/context-map/types.js.map +1 -0
  435. package/dist/negotiation/domain/common.d.ts +95 -0
  436. package/dist/negotiation/domain/common.js +216 -0
  437. package/dist/negotiation/domain/common.js.map +1 -0
  438. package/dist/negotiation/domain/envelope.d.ts +55 -0
  439. package/dist/negotiation/domain/envelope.js +110 -0
  440. package/dist/negotiation/domain/envelope.js.map +1 -0
  441. package/dist/negotiation/domain/identifiers.d.ts +65 -0
  442. package/dist/negotiation/domain/identifiers.js +130 -0
  443. package/dist/negotiation/domain/identifiers.js.map +1 -0
  444. package/dist/negotiation/domain/objects.d.ts +149 -0
  445. package/dist/negotiation/domain/objects.js +335 -0
  446. package/dist/negotiation/domain/objects.js.map +1 -0
  447. package/dist/negotiation/idempotency/index.d.ts +26 -0
  448. package/dist/negotiation/idempotency/index.js +25 -0
  449. package/dist/negotiation/idempotency/index.js.map +1 -0
  450. package/dist/negotiation/idempotency/store.d.ts +52 -0
  451. package/dist/negotiation/idempotency/store.js +189 -0
  452. package/dist/negotiation/idempotency/store.js.map +1 -0
  453. package/dist/negotiation/idempotency/types.d.ts +102 -0
  454. package/dist/negotiation/idempotency/types.js +47 -0
  455. package/dist/negotiation/idempotency/types.js.map +1 -0
  456. package/dist/negotiation/jcs.d.ts +21 -0
  457. package/dist/negotiation/jcs.js +114 -0
  458. package/dist/negotiation/jcs.js.map +1 -0
  459. package/dist/negotiation/ledger/event.d.ts +142 -0
  460. package/dist/negotiation/ledger/event.js +206 -0
  461. package/dist/negotiation/ledger/event.js.map +1 -0
  462. package/dist/negotiation/ledger/index.d.ts +26 -0
  463. package/dist/negotiation/ledger/index.js +25 -0
  464. package/dist/negotiation/ledger/index.js.map +1 -0
  465. package/dist/negotiation/ledger/store.d.ts +97 -0
  466. package/dist/negotiation/ledger/store.js +338 -0
  467. package/dist/negotiation/ledger/store.js.map +1 -0
  468. package/dist/negotiation/prompt.d.ts +34 -0
  469. package/dist/negotiation/prompt.js +113 -0
  470. package/dist/negotiation/prompt.js.map +1 -0
  471. package/dist/negotiation/recovery/index.d.ts +26 -0
  472. package/dist/negotiation/recovery/index.js +24 -0
  473. package/dist/negotiation/recovery/index.js.map +1 -0
  474. package/dist/negotiation/recovery/outbound.d.ts +49 -0
  475. package/dist/negotiation/recovery/outbound.js +34 -0
  476. package/dist/negotiation/recovery/outbound.js.map +1 -0
  477. package/dist/negotiation/recovery/recover.d.ts +59 -0
  478. package/dist/negotiation/recovery/recover.js +486 -0
  479. package/dist/negotiation/recovery/recover.js.map +1 -0
  480. package/dist/negotiation/recovery/types.d.ts +85 -0
  481. package/dist/negotiation/recovery/types.js +17 -0
  482. package/dist/negotiation/recovery/types.js.map +1 -0
  483. package/dist/negotiation/state/phase.d.ts +70 -0
  484. package/dist/negotiation/state/phase.js +200 -0
  485. package/dist/negotiation/state/phase.js.map +1 -0
  486. package/dist/negotiation/types.d.ts +139 -0
  487. package/dist/negotiation/types.js +24 -0
  488. package/dist/negotiation/types.js.map +1 -0
  489. package/dist/net/safe-http.d.ts +54 -0
  490. package/dist/net/safe-http.js +116 -0
  491. package/dist/net/safe-http.js.map +1 -0
  492. package/dist/operator/controller.d.ts +181 -0
  493. package/dist/operator/controller.js +784 -0
  494. package/dist/operator/controller.js.map +1 -0
  495. package/dist/operator/runner.d.ts +128 -0
  496. package/dist/operator/runner.js +248 -0
  497. package/dist/operator/runner.js.map +1 -0
  498. package/dist/operator/store.d.ts +39 -0
  499. package/dist/operator/store.js +169 -0
  500. package/dist/operator/store.js.map +1 -0
  501. package/dist/operator/strategy.d.ts +54 -0
  502. package/dist/operator/strategy.js +249 -0
  503. package/dist/operator/strategy.js.map +1 -0
  504. package/dist/operator/tui.d.ts +27 -0
  505. package/dist/operator/tui.js +395 -0
  506. package/dist/operator/tui.js.map +1 -0
  507. package/dist/operator/types.d.ts +224 -0
  508. package/dist/operator/types.js +17 -0
  509. package/dist/operator/types.js.map +1 -0
  510. package/dist/product-buyer.d.ts +74 -0
  511. package/dist/product-buyer.js +161 -0
  512. package/dist/product-buyer.js.map +1 -0
  513. package/dist/product-cli.d.ts +56 -0
  514. package/dist/product-cli.js +175 -0
  515. package/dist/product-cli.js.map +1 -0
  516. package/dist/product-compat.d.ts +50 -0
  517. package/dist/product-compat.js +63 -0
  518. package/dist/product-compat.js.map +1 -0
  519. package/dist/product-init.d.ts +73 -0
  520. package/dist/product-init.js +203 -0
  521. package/dist/product-init.js.map +1 -0
  522. package/dist/product-publish.d.ts +85 -0
  523. package/dist/product-publish.js +216 -0
  524. package/dist/product-publish.js.map +1 -0
  525. package/dist/protocol/legacy-shopping-negotiation/adapter.d.ts +42 -0
  526. package/dist/protocol/legacy-shopping-negotiation/adapter.js +561 -0
  527. package/dist/protocol/legacy-shopping-negotiation/adapter.js.map +1 -0
  528. package/dist/protocol/legacy-shopping-negotiation/mapping.d.ts +78 -0
  529. package/dist/protocol/legacy-shopping-negotiation/mapping.js +321 -0
  530. package/dist/protocol/legacy-shopping-negotiation/mapping.js.map +1 -0
  531. package/dist/protocol/legacy-shopping-negotiation/money.d.ts +49 -0
  532. package/dist/protocol/legacy-shopping-negotiation/money.js +70 -0
  533. package/dist/protocol/legacy-shopping-negotiation/money.js.map +1 -0
  534. package/dist/protocol/legacy-shopping-negotiation/types.d.ts +107 -0
  535. package/dist/protocol/legacy-shopping-negotiation/types.js +34 -0
  536. package/dist/protocol/legacy-shopping-negotiation/types.js.map +1 -0
  537. package/dist/runtime/buyer-policy.d.ts +58 -0
  538. package/dist/runtime/buyer-policy.js +89 -0
  539. package/dist/runtime/buyer-policy.js.map +1 -0
  540. package/dist/runtime/fake-model.d.ts +77 -0
  541. package/dist/runtime/fake-model.js +307 -0
  542. package/dist/runtime/fake-model.js.map +1 -0
  543. package/dist/runtime/foreground.d.ts +56 -0
  544. package/dist/runtime/foreground.js +97 -0
  545. package/dist/runtime/foreground.js.map +1 -0
  546. package/dist/runtime/heartbeat.d.ts +36 -0
  547. package/dist/runtime/heartbeat.js +49 -0
  548. package/dist/runtime/heartbeat.js.map +1 -0
  549. package/dist/runtime/merchant-turn.d.ts +35 -0
  550. package/dist/runtime/merchant-turn.js +20 -0
  551. package/dist/runtime/merchant-turn.js.map +1 -0
  552. package/dist/runtime/model.d.ts +40 -0
  553. package/dist/runtime/model.js +86 -0
  554. package/dist/runtime/model.js.map +1 -0
  555. package/dist/runtime/negotiation-turn.d.ts +101 -0
  556. package/dist/runtime/negotiation-turn.js +317 -0
  557. package/dist/runtime/negotiation-turn.js.map +1 -0
  558. package/dist/runtime/tools.d.ts +64 -0
  559. package/dist/runtime/tools.js +236 -0
  560. package/dist/runtime/tools.js.map +1 -0
  561. package/dist/supervisor/init.d.ts +31 -0
  562. package/dist/supervisor/init.js +222 -0
  563. package/dist/supervisor/init.js.map +1 -0
  564. package/dist/supervisor/logs.d.ts +28 -0
  565. package/dist/supervisor/logs.js +101 -0
  566. package/dist/supervisor/logs.js.map +1 -0
  567. package/dist/supervisor/manage.d.ts +72 -0
  568. package/dist/supervisor/manage.js +419 -0
  569. package/dist/supervisor/manage.js.map +1 -0
  570. package/dist/supervisor/manifest.d.ts +69 -0
  571. package/dist/supervisor/manifest.js +209 -0
  572. package/dist/supervisor/manifest.js.map +1 -0
  573. package/dist/supervisor/stack-config.d.ts +79 -0
  574. package/dist/supervisor/stack-config.js +262 -0
  575. package/dist/supervisor/stack-config.js.map +1 -0
  576. package/dist/supervisor/wrapper.d.ts +17 -0
  577. package/dist/supervisor/wrapper.js +138 -0
  578. package/dist/supervisor/wrapper.js.map +1 -0
  579. package/dist/trust/identity/auth-verifier.d.ts +96 -0
  580. package/dist/trust/identity/auth-verifier.js +166 -0
  581. package/dist/trust/identity/auth-verifier.js.map +1 -0
  582. package/dist/trust/identity/identity-binding.d.ts +63 -0
  583. package/dist/trust/identity/identity-binding.js +59 -0
  584. package/dist/trust/identity/identity-binding.js.map +1 -0
  585. package/dist/trust/identity/index.d.ts +38 -0
  586. package/dist/trust/identity/index.js +31 -0
  587. package/dist/trust/identity/index.js.map +1 -0
  588. package/dist/trust/identity/jws.d.ts +64 -0
  589. package/dist/trust/identity/jws.js +178 -0
  590. package/dist/trust/identity/jws.js.map +1 -0
  591. package/dist/trust/identity/keys.d.ts +71 -0
  592. package/dist/trust/identity/keys.js +118 -0
  593. package/dist/trust/identity/keys.js.map +1 -0
  594. package/dist/trust/identity/message-signature.d.ts +105 -0
  595. package/dist/trust/identity/message-signature.js +297 -0
  596. package/dist/trust/identity/message-signature.js.map +1 -0
  597. package/dist/trust/identity/nonce.d.ts +45 -0
  598. package/dist/trust/identity/nonce.js +50 -0
  599. package/dist/trust/identity/nonce.js.map +1 -0
  600. package/dist/trust/identity/signature-base.d.ts +84 -0
  601. package/dist/trust/identity/signature-base.js +261 -0
  602. package/dist/trust/identity/signature-base.js.map +1 -0
  603. package/dist/trust/identity/trust-policy.d.ts +92 -0
  604. package/dist/trust/identity/trust-policy.js +95 -0
  605. package/dist/trust/identity/trust-policy.js.map +1 -0
  606. package/dist/trust/index.d.ts +21 -0
  607. package/dist/trust/index.js +22 -0
  608. package/dist/trust/index.js.map +1 -0
  609. package/dist/trust/records/evaluator.d.ts +76 -0
  610. package/dist/trust/records/evaluator.js +122 -0
  611. package/dist/trust/records/evaluator.js.map +1 -0
  612. package/dist/trust/records/index.d.ts +28 -0
  613. package/dist/trust/records/index.js +26 -0
  614. package/dist/trust/records/index.js.map +1 -0
  615. package/dist/trust/records/store.d.ts +75 -0
  616. package/dist/trust/records/store.js +339 -0
  617. package/dist/trust/records/store.js.map +1 -0
  618. package/dist/trust/records/types.d.ts +159 -0
  619. package/dist/trust/records/types.js +40 -0
  620. package/dist/trust/records/types.js.map +1 -0
  621. package/dist/tui/banner.d.ts +46 -0
  622. package/dist/tui/banner.js +99 -0
  623. package/dist/tui/banner.js.map +1 -0
  624. package/dist/tui/styles.d.ts +70 -0
  625. package/dist/tui/styles.js +197 -0
  626. package/dist/tui/styles.js.map +1 -0
  627. package/dist/tui/theme.d.ts +63 -0
  628. package/dist/tui/theme.js +136 -0
  629. package/dist/tui/theme.js.map +1 -0
  630. package/examples/profiles/buyer.deepseek.yaml +34 -0
  631. package/examples/profiles/buyer.fake.yaml +36 -0
  632. package/examples/profiles/buyer.local.yaml +40 -0
  633. package/examples/profiles/merchant.deepseek.yaml +32 -0
  634. package/examples/profiles/merchant.fake.yaml +31 -0
  635. package/examples/profiles/merchant.local.yaml +34 -0
  636. package/package.json +55 -0
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copyright 2026 harrylabsj
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export interface MerchantInitOptions {
18
+ /** 商家名称(写进 profile 注释与 owner 可读性)。 */
19
+ merchantName: string;
20
+ /**
21
+ * shopping-cli merchant_id —— 身份锚(agent_id/owner_id 同源)。
22
+ * 缺省从 merchantName 派生(普通商家只需要知道自己名称);
23
+ * 显式指定用于对接已有 shopping-cli 商家数据。
24
+ */
25
+ merchantId?: string;
26
+ /** shopping-cli API base URL(Kiwi ↔ shopping-cli 连接)。 */
27
+ shoppingCliUrl?: string;
28
+ /** shopping-cli SQLite 路径(连接验证与 publish 用;记录于报告)。 */
29
+ shoppingCliDb?: string;
30
+ /** kiwi-catalog base URL(publish/start 用)。 */
31
+ catalogUrl?: string;
32
+ /** 私有底价(minor 单位;merchant_policy.min_unit_price_private)。 */
33
+ floorPriceMinor?: number;
34
+ /** 自动磋商开关(merchant_policy.auto_negotiate,缺省 false)。 */
35
+ autoNegotiate?: boolean;
36
+ /** profile 输出路径(缺省 ./merchant.yaml)。 */
37
+ outputPath?: string;
38
+ /** 覆盖已存在的输出文件(缺省拒绝)。 */
39
+ force?: boolean;
40
+ /**
41
+ * shopping-cli 缺失时自动安装(pip install shopping-cli,PyPI 包名定稿)。
42
+ * 只检测到缺失才执行;安装失败 fail-closed(warning,不假装装好)。
43
+ * rev1.1 §3.2:Merchant 无需知晓并单独安装数据引擎。
44
+ */
45
+ autoInstallShoppingCli?: boolean;
46
+ modelProvider?: string;
47
+ modelName?: string;
48
+ apiKeyEnv?: string;
49
+ /** 测试注入。 */
50
+ spawnImpl?: typeof import("node:child_process").spawnSync;
51
+ fetchImpl?: typeof fetch;
52
+ }
53
+ export interface MerchantInitStep {
54
+ ok: boolean;
55
+ detail?: string;
56
+ }
57
+ export interface MerchantInitReport {
58
+ ok: boolean;
59
+ profile_path: string;
60
+ agent_id: string;
61
+ steps: {
62
+ shopping_cli_detected: MerchantInitStep;
63
+ shopping_cli_reachable: MerchantInitStep;
64
+ profile_written: MerchantInitStep;
65
+ data_dir_initialized: MerchantInitStep;
66
+ };
67
+ warnings: string[];
68
+ }
69
+ /**
70
+ * 执行 merchant init。fail-closed:profile 写盘失败 → ok:false;
71
+ * shopping-cli 检测/可达性失败只记 warning(生成不阻塞,但报告可见)。
72
+ */
73
+ export declare function merchantInit(options: MerchantInitOptions): Promise<MerchantInitReport>;
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copyright 2026 harrylabsj
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * `kiwi merchant init`(product-strategy rev1.1 §3.2/§19 D1)。
19
+ *
20
+ * 首次初始化引导,产出可直接被 `kiwi merchant start` / `kiwi merchant
21
+ * publish` 使用的 merchant profile:
22
+ *
23
+ * 1. shopping-cli 依赖检测(缺失 → warning + 引导提示,不阻塞生成);
24
+ * 2. Kiwi ↔ shopping-cli 连接可达性(/health,失败 warning 不阻塞);
25
+ * 3. 生成 merchant profile(agent_id = merchant_id —— D2 身份统一,
26
+ * publish 无需 --shopping-cli-merchant 映射);
27
+ * 4. 初始化数据目录(AgentKernel 的 state/sessions,0700)。
28
+ *
29
+ * 身份锚 = shopping-cli merchant_id(数据引擎的 merchant 身份);profile
30
+ * 不存任何 secret(token_env 只写环境变量名,与 loadProfile 约定一致)。
31
+ */
32
+ import { spawnSync } from "node:child_process";
33
+ import { randomBytes } from "node:crypto";
34
+ import { existsSync, writeFileSync } from "node:fs";
35
+ import path from "node:path";
36
+ import { stringify as stringifyYaml } from "yaml";
37
+ import { agentDataDir, ensurePathsForDir } from "./agent/agent-db.js";
38
+ import { RUNTIME_VERSION } from "./config/profile.js";
39
+ import { PROTOCOL_VERSION } from "./negotiation/types.js";
40
+ import { detectShoppingCli } from "./product-cli.js";
41
+ function slugifyMerchantId(name) {
42
+ const slug = name
43
+ .trim()
44
+ .toLowerCase()
45
+ .replace(/[^a-z0-9\u4e00-\u9fff]+/g, "-")
46
+ .replace(/^-+|-+$/g, "");
47
+ if (slug !== "")
48
+ return slug;
49
+ return `merchant-${randomBytes(3).toString("hex")}`;
50
+ }
51
+ /**
52
+ * 执行 merchant init。fail-closed:profile 写盘失败 → ok:false;
53
+ * shopping-cli 检测/可达性失败只记 warning(生成不阻塞,但报告可见)。
54
+ */
55
+ export async function merchantInit(options) {
56
+ const warnings = [];
57
+ // 商家号缺省从名称派生(用户只需要知道自己的商家名称;显式指定用于
58
+ // 对接已有 shopping-cli 商家数据)。派生规则:小写 + 空白/特殊字符转
59
+ // '-';中文保留;空结果回退随机。
60
+ const merchantId = options.merchantId !== undefined && options.merchantId.trim() !== ""
61
+ ? options.merchantId.trim()
62
+ : slugifyMerchantId(options.merchantName);
63
+ // ── Step 1: shopping-cli 依赖检测(缺失时按需自动安装)──────────────────
64
+ let detected = detectShoppingCli(options.spawnImpl);
65
+ if (!detected.ok && options.autoInstallShoppingCli === true) {
66
+ const spawn = options.spawnImpl ?? spawnSync;
67
+ let install;
68
+ try {
69
+ install = spawn("pip", ["install", "shopping-cli"], {
70
+ encoding: "utf-8",
71
+ timeout: 300_000,
72
+ });
73
+ }
74
+ catch (err) {
75
+ install = {
76
+ status: -1,
77
+ stdout: "",
78
+ stderr: err instanceof Error ? err.message : String(err),
79
+ };
80
+ }
81
+ if (install.status === 0) {
82
+ // PATH 可能未刷新:重检测,失败也给明确指引
83
+ detected = detectShoppingCli(options.spawnImpl);
84
+ if (detected.ok) {
85
+ warnings.push("shopping-cli 已自动安装(数据引擎就绪)。");
86
+ }
87
+ else {
88
+ warnings.push("pip install shopping-cli 完成但 `shopping` 命令仍不可用——" +
89
+ "可能需要刷新 PATH 或重新打开终端。");
90
+ }
91
+ }
92
+ else {
93
+ warnings.push(`自动安装失败(pip install shopping-cli 退出 ${install.status ?? "?"})——` +
94
+ `请手动安装后重试(${String(install.stderr ?? "").trim().slice(0, 200)})。`);
95
+ }
96
+ }
97
+ if (!detected.ok) {
98
+ warnings.push(`shopping-cli 未检测到(${detected.error ?? "?"})——Kiwi Merchant 需要它;` +
99
+ "安装已默认自动尝试,可用 `kiwi merchant init --no-install` 跳过自动安装、稍后手动安装。");
100
+ }
101
+ // ── Step 2: Kiwi ↔ shopping-cli 连接可达性 ──────────────────────────────
102
+ const shoppingCliUrl = (options.shoppingCliUrl ?? "http://127.0.0.1:8765").replace(/\/+$/, "");
103
+ let reachable;
104
+ try {
105
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
106
+ const response = await fetchImpl(`${shoppingCliUrl}/health`, {
107
+ signal: AbortSignal.timeout(2_000),
108
+ });
109
+ reachable = response.ok
110
+ ? { ok: true, detail: shoppingCliUrl }
111
+ : { ok: false, detail: `HTTP ${response.status} from ${shoppingCliUrl}` };
112
+ }
113
+ catch (err) {
114
+ reachable = {
115
+ ok: false,
116
+ detail: `${shoppingCliUrl} 不可达:${err instanceof Error ? err.message : String(err)}`,
117
+ };
118
+ }
119
+ if (!reachable.ok) {
120
+ warnings.push(`shopping-cli API ${shoppingCliUrl} 不可达——` +
121
+ "profile 仍会生成,但 `kiwi merchant start` 的磋商/数据工具会 fail-closed。");
122
+ }
123
+ // ── Step 3: 生成 merchant profile ───────────────────────────────────────
124
+ const agentId = merchantId; // D2 身份统一:agent_id = shopping-cli merchant_id
125
+ const floorPriceMinor = options.floorPriceMinor ?? 0;
126
+ const profile = {
127
+ // 由 `kiwi merchant init` 生成(D1)。secret 永不入 profile:token_env
128
+ // 只写环境变量名(与 loadProfile 约定一致)。
129
+ runtime_version: RUNTIME_VERSION, // profile schema 版本(与产品版本独立)
130
+ protocol_version: PROTOCOL_VERSION,
131
+ agent_id: agentId,
132
+ role: "merchant",
133
+ owner_id: merchantId,
134
+ commerce: {
135
+ base_url: shoppingCliUrl,
136
+ token_env: "SHOPPING_MERCHANT_TOKEN",
137
+ backend: "local_marketplace",
138
+ },
139
+ model: {
140
+ provider: options.modelProvider ?? "deepseek",
141
+ model: options.modelName ?? "deepseek-v4-flash",
142
+ api_key_env: options.apiKeyEnv ?? "DEEPSEEK_API_KEY",
143
+ },
144
+ runtime: {
145
+ mode: "once",
146
+ poll_interval_seconds: 5,
147
+ turn_timeout_seconds: 90,
148
+ max_model_steps: 4,
149
+ max_retries: 2,
150
+ },
151
+ merchant_policy: {
152
+ min_unit_price_private: floorPriceMinor / 100,
153
+ auto_negotiate: options.autoNegotiate ?? false,
154
+ human_review_on: ["below_floor", "exceptional_warranty", "suspicious_content"],
155
+ },
156
+ };
157
+ const outputPath = options.outputPath ?? path.resolve("merchant.yaml");
158
+ let written;
159
+ if (existsSync(outputPath) && !options.force) {
160
+ written = { ok: false, detail: `已存在:${outputPath}(用 --force 覆盖)` };
161
+ }
162
+ else {
163
+ try {
164
+ writeFileSync(outputPath, `# Kiwi Merchant profile — generated by \`kiwi merchant init\` (${new Date().toISOString()})\n` +
165
+ `# Merchant: ${options.merchantName}\n` +
166
+ stringifyYaml(profile), { mode: 0o600 });
167
+ written = { ok: true, detail: outputPath };
168
+ }
169
+ catch (err) {
170
+ written = {
171
+ ok: false,
172
+ detail: `写盘失败:${err instanceof Error ? err.message : String(err)}`,
173
+ };
174
+ }
175
+ }
176
+ // ── Step 4: 初始化数据目录(AgentKernel state/sessions,0700)───────────
177
+ let dataDirOk = true;
178
+ let dataDirDetail = "";
179
+ try {
180
+ const paths = ensurePathsForDir(agentDataDir(agentId));
181
+ dataDirDetail = paths.dir;
182
+ }
183
+ catch (err) {
184
+ dataDirOk = false;
185
+ dataDirDetail = err instanceof Error ? err.message : String(err);
186
+ }
187
+ const ok = written.ok && dataDirOk;
188
+ return {
189
+ ok,
190
+ profile_path: outputPath,
191
+ agent_id: agentId,
192
+ steps: {
193
+ shopping_cli_detected: detected.ok
194
+ ? { ok: true, detail: detected.version ?? "found" }
195
+ : { ok: false, detail: detected.error ?? "not found" },
196
+ shopping_cli_reachable: reachable,
197
+ profile_written: written,
198
+ data_dir_initialized: dataDirOk ? { ok: true, detail: dataDirDetail } : { ok: false, detail: dataDirDetail },
199
+ },
200
+ warnings,
201
+ };
202
+ }
203
+ //# sourceMappingURL=product-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-init.js","sourceRoot":"","sources":["../src/product-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copyright 2026 harrylabsj
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
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
+ import { spawnSync } from "node:child_process";
32
+ import type { AgentProfile } from "./config/profile.js";
33
+ export interface MerchantPublishOptions {
34
+ /** merchant profile(role: merchant;agent_id = catalog merchant_id)。 */
35
+ profile: AgentProfile;
36
+ /** kiwi-catalog base URL(缺省由调用方解析 KIWI_CATALOG_URL)。 */
37
+ catalogBaseUrl: string;
38
+ /** KIWI_CATALOG_OWNER_TOKEN_SECRET(owner token 派生)。 */
39
+ ownerTokenSecret: string;
40
+ /** shopping-cli SQLite 数据库路径(listings publish-listings --db)。 */
41
+ shoppingCliDb: string;
42
+ /** shopping-cli 可执行名/路径(缺省 "shopping")。 */
43
+ shoppingCliPath?: string;
44
+ /** shopping-cli 的 merchant_id(缺省 = profile.agent_id;init 统一身份前的显式映射)。 */
45
+ shoppingCliMerchant?: string;
46
+ /** catalog 注册域名(缺省 KIWI_CATALOG_DOMAIN / merchant-{agent_id}.local)。 */
47
+ catalogDomain?: string;
48
+ /** 测试注入。 */
49
+ fetchImpl?: typeof fetch;
50
+ spawnImpl?: typeof spawnSync;
51
+ }
52
+ export interface StepAgent {
53
+ ok: boolean;
54
+ catalog_agent_id?: string;
55
+ error?: string;
56
+ }
57
+ export interface StepListings {
58
+ ok: boolean;
59
+ skipped_reason?: string;
60
+ published?: number;
61
+ skipped?: number;
62
+ withdrawn?: number;
63
+ errors?: string[];
64
+ raw?: unknown;
65
+ }
66
+ export interface StepCompat {
67
+ ok: boolean;
68
+ version?: string;
69
+ error?: string;
70
+ }
71
+ export interface MerchantPublishReport {
72
+ ok: boolean;
73
+ steps: {
74
+ shopping_cli_compat: StepCompat;
75
+ agent: StepAgent;
76
+ listings: StepListings;
77
+ };
78
+ }
79
+ /**
80
+ * 执行一次 publish 编排。fail-closed:
81
+ * - agent 注册失败 → 短路(listings 依赖 owner agent 存在),ok:false;
82
+ * - listings spawn/报告失败 → ok:false + 错误明细;
83
+ * - 全成功 → ok:true + 分步计数。
84
+ */
85
+ export declare function merchantPublish(options: MerchantPublishOptions): Promise<MerchantPublishReport>;
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Copyright 2026 harrylabsj
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
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
+ import { spawnSync } from "node:child_process";
32
+ import { registerCatalogAgent } from "./discovery/catalog-source/register.js";
33
+ import { SHOPPING_CLI_COMPAT, compatRangeText, versionInRange } from "./product-compat.js";
34
+ function safeAgentId(agentId) {
35
+ return agentId.replace(/[^a-z0-9-]/gi, "-").toLowerCase();
36
+ }
37
+ /**
38
+ * 执行一次 publish 编排。fail-closed:
39
+ * - agent 注册失败 → 短路(listings 依赖 owner agent 存在),ok:false;
40
+ * - listings spawn/报告失败 → ok:false + 错误明细;
41
+ * - 全成功 → ok:true + 分步计数。
42
+ */
43
+ export async function merchantPublish(options) {
44
+ 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;
50
+ const domain = options.catalogDomain ??
51
+ process.env.KIWI_CATALOG_DOMAIN ??
52
+ `merchant-${safeAgentId(merchantId)}.local`;
53
+ // ── Step 0: shopping-cli 版本兼容检查(D3 矩阵共同消费,fail-closed)──
54
+ // 矩阵单一来源 = product-compat.ts;与 `kiwi doctor` 共同消费。
55
+ const versionSpawn = options.spawnImpl ?? spawnSync;
56
+ let versionResult;
57
+ try {
58
+ versionResult = versionSpawn(options.shoppingCliPath ?? "shopping", ["--version"], {
59
+ encoding: "utf-8",
60
+ timeout: 5_000,
61
+ });
62
+ }
63
+ catch (err) {
64
+ return {
65
+ ok: false,
66
+ steps: {
67
+ shopping_cli_compat: {
68
+ ok: false,
69
+ error: `shopping-cli 版本检测失败:${err instanceof Error ? err.message : String(err)}`,
70
+ },
71
+ agent: { ok: false, error: "shopping-cli 版本不兼容,未执行注册" },
72
+ listings: { ok: false, skipped_reason: "shopping-cli 版本不兼容" },
73
+ },
74
+ };
75
+ }
76
+ const versionText = String(versionResult.stdout ?? "").split("\n")[0] ?? "";
77
+ if (!versionInRange(versionText, SHOPPING_CLI_COMPAT)) {
78
+ return {
79
+ ok: false,
80
+ steps: {
81
+ shopping_cli_compat: {
82
+ ok: false,
83
+ version: versionText !== "" ? versionText : undefined,
84
+ error: `shopping-cli ${versionText !== "" ? versionText : "版本无法识别"} 超出 Kiwi 支持范围` +
85
+ `(${compatRangeText(SHOPPING_CLI_COMPAT)})`,
86
+ },
87
+ agent: { ok: false, error: "shopping-cli 版本不兼容,未执行注册" },
88
+ listings: { ok: false, skipped_reason: "shopping-cli 版本不兼容" },
89
+ },
90
+ };
91
+ }
92
+ const compatStep = {
93
+ ok: true,
94
+ ...(versionText !== "" ? { version: versionText } : {}),
95
+ };
96
+ // ── Step 1: 确认/注册 owner Agent(幂等:先查复用,没有再注册)──────────
97
+ // 重复 publish 必须是安全操作(rev1.1 §4.5):kiwi-catalog 一商家一 agent
98
+ // 约束下二次 register 会 409——先按 merchant 查询已有 agent,有则复用。
99
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
100
+ const baseUrl = options.catalogBaseUrl.replace(/\/+$/, "");
101
+ let catalogAgentId;
102
+ let agentError;
103
+ try {
104
+ const lookupUrl = `${baseUrl}/v1/agent-catalog/merchants/${encodeURIComponent(merchantId)}/agents`;
105
+ const lookup = await fetchImpl(lookupUrl, { signal: AbortSignal.timeout(15_000) });
106
+ if (lookup.ok) {
107
+ const body = (await lookup.json());
108
+ const existing = body.results?.[0]?.catalog_agent_id;
109
+ if (typeof existing === "string" && existing !== "") {
110
+ catalogAgentId = existing;
111
+ }
112
+ }
113
+ // 查询失败(网络/非 2xx)不短路——继续尝试注册;注册失败才报错。
114
+ if (catalogAgentId === undefined) {
115
+ const reg = await registerCatalogAgent({
116
+ catalogBaseUrl: options.catalogBaseUrl,
117
+ domain,
118
+ merchantId,
119
+ ownerTokenSecret: options.ownerTokenSecret,
120
+ agentCardUrl: `${domain}/.well-known/agent-card.json`,
121
+ fetchImpl: options.fetchImpl,
122
+ timeoutMs: 15_000,
123
+ });
124
+ catalogAgentId = reg.catalogAgentId;
125
+ }
126
+ }
127
+ catch (err) {
128
+ agentError = err instanceof Error ? err.message : String(err);
129
+ }
130
+ if (agentError !== undefined || catalogAgentId === undefined) {
131
+ return {
132
+ ok: false,
133
+ steps: {
134
+ shopping_cli_compat: compatStep,
135
+ agent: { ok: false, error: agentError ?? "catalog register returned no agent id" },
136
+ listings: { ok: false, skipped_reason: "agent 注册失败(listings 依赖 owner agent)" },
137
+ },
138
+ };
139
+ }
140
+ // ── Step 2: 进程调用 shopping-cli 发布 listings ─────────────────────────
141
+ // --db 是 shopping-cli 顶层参数,必须在子命令之前(usage: shopping.py [--db DB] {cmd})。
142
+ const spawn = options.spawnImpl ?? spawnSync;
143
+ const args = [
144
+ "--db", options.shoppingCliDb,
145
+ "listings",
146
+ "publish-listings",
147
+ "--merchant", merchantId,
148
+ "--kiwi-catalog-url", options.catalogBaseUrl,
149
+ "--owner-token-secret", options.ownerTokenSecret,
150
+ "--owner-agent-id", catalogAgentId,
151
+ "--format", "json",
152
+ ];
153
+ let result;
154
+ try {
155
+ result = spawn(options.shoppingCliPath ?? "shopping", args, {
156
+ encoding: "utf-8",
157
+ timeout: 60_000,
158
+ });
159
+ }
160
+ catch (err) {
161
+ return {
162
+ ok: false,
163
+ steps: {
164
+ shopping_cli_compat: compatStep,
165
+ agent: { ok: true, catalog_agent_id: catalogAgentId },
166
+ listings: {
167
+ ok: false,
168
+ errors: [`shopping-cli spawn failed: ${err instanceof Error ? err.message : String(err)}`],
169
+ },
170
+ },
171
+ };
172
+ }
173
+ const stdout = String(result.stdout ?? "");
174
+ const stderr = String(result.stderr ?? "");
175
+ let raw;
176
+ try {
177
+ raw = stdout !== "" ? JSON.parse(stdout) : undefined;
178
+ }
179
+ 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;
200
+ return {
201
+ ok,
202
+ steps: {
203
+ shopping_cli_compat: compatStep,
204
+ agent: { ok: true, catalog_agent_id: catalogAgentId },
205
+ listings: {
206
+ ok,
207
+ published,
208
+ skipped,
209
+ withdrawn,
210
+ ...(reportErrors.length > 0 ? { errors: reportErrors } : {}),
211
+ ...(raw !== undefined ? { raw } : {}),
212
+ },
213
+ },
214
+ };
215
+ }
216
+ //# sourceMappingURL=product-publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-publish.js","sourceRoot":"","sources":["../src/product-publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
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 { NegotiationEnvelope } from "../../negotiation/domain/envelope.js";
17
+ import type { AcceptedNonbindingAgreement } from "../../negotiation/domain/objects.js";
18
+ import { type NegotiationDecision, type PolicyResult, type SnapshotMessage } from "../../negotiation/types.js";
19
+ import type { LegacyMessageContext, LegacyToKnpContext, TranslationResult } from "./types.js";
20
+ export type { TranslationResult, TranslationNote } from "./types.js";
21
+ /**
22
+ * shopping.negotiation/0.1 ↔ KNP/1.0 适配器。
23
+ *
24
+ * 纯数据转换:任何路径都不执行写入/发送;调用方负责把结果交给对应通道。
25
+ */
26
+ export declare class LegacyNegotiationAdapter {
27
+ private readonly opts;
28
+ constructor(opts?: {
29
+ now?: () => string;
30
+ currencyExponentOf?: (currency: string) => number;
31
+ });
32
+ private now;
33
+ private exponentOf;
34
+ legacyDecisionToEnvelope(decision: NegotiationDecision, ctx: LegacyToKnpContext): TranslationResult<NegotiationEnvelope>;
35
+ private buildDecisionPayload;
36
+ envelopeToLegacyDecision(envelope: NegotiationEnvelope): TranslationResult<NegotiationDecision>;
37
+ legacyMessageToEnvelope(message: SnapshotMessage, ctx: LegacyMessageContext): TranslationResult<NegotiationEnvelope>;
38
+ envelopeToLegacyMessage(envelope: NegotiationEnvelope): TranslationResult<SnapshotMessage>;
39
+ agreementToLegacyPolicyResult(agreement: AcceptedNonbindingAgreement): TranslationResult<PolicyResult>;
40
+ private validateKnpEnvelope;
41
+ private legacyReplyTarget;
42
+ }