@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,88 @@
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 { UcpCartMessage, UcpCartResponse } from "./cart-types.js";
17
+ import type { UcpCheckoutResponse } from "./types.js";
18
+ /** REST binding 路径(UCP 2026-04-08:`POST {endpoint}/checkout-sessions`)。 */
19
+ export declare const CHECKOUT_SESSIONS_PATH = "/checkout-sessions";
20
+ export declare const CHECKOUT_COMPLETE_SUFFIX = "/complete";
21
+ export declare const CHECKOUT_CANCEL_SUFFIX = "/cancel";
22
+ /** Cart REST binding 路径(UCP 2026-04-08:`POST {endpoint}/carts`)。 */
23
+ export declare const CARTS_PATH = "/carts";
24
+ export declare const CART_CANCEL_SUFFIX = "/cancel";
25
+ export type UcpCheckoutHttpErrorCode = "unsafe_target" | "timeout" | "network" | "bad_status" | "malformed";
26
+ export interface UcpCheckoutHttpError {
27
+ kind: "error";
28
+ code: UcpCheckoutHttpErrorCode;
29
+ reason: string;
30
+ status?: number;
31
+ }
32
+ export type UcpCheckoutHttpResult = {
33
+ kind: "ok";
34
+ status: number;
35
+ response: UcpCheckoutResponse;
36
+ } | UcpCheckoutHttpError;
37
+ /**
38
+ * Cart HTTP 结果:多一档结构化 `not_found`(与 `error` 判别分开)——
39
+ * HTTP 404 / not_found error envelope → `{kind:"not_found"}`;ucp.status=error
40
+ * envelope(含 4xx)→ `{kind:"ok", response:error}` 交上层消息算法。
41
+ */
42
+ export type UcpCartHttpResult = {
43
+ kind: "ok";
44
+ status: number;
45
+ response: UcpCartResponse;
46
+ } | {
47
+ kind: "not_found";
48
+ status: number;
49
+ messages?: UcpCartMessage[];
50
+ continue_url?: string;
51
+ } | UcpCheckoutHttpError;
52
+ export interface UcpCheckoutHttpClientOptions {
53
+ endpoint: string;
54
+ fetchImpl?: typeof fetch;
55
+ timeoutMs?: number;
56
+ allowPrivateRanges?: boolean;
57
+ skipDnsCheck?: boolean;
58
+ resolveIp?: (hostname: string) => Promise<string[]>;
59
+ /** buyer 的 UCP profile URI;配置时注入 `UCP-Agent: profile="<uri>"`。 */
60
+ ucpAgentProfile?: string;
61
+ headers?: Record<string, string>;
62
+ }
63
+ export declare class UcpCheckoutHttpClient {
64
+ /** 规范化 endpoint(无尾部 `/`)。 */
65
+ readonly endpoint: string;
66
+ private readonly url;
67
+ private readonly timeoutMs;
68
+ private readonly fetchImpl;
69
+ private readonly allowPrivateRanges;
70
+ private readonly skipDnsCheck;
71
+ private readonly resolveIp?;
72
+ private readonly baseHeaders;
73
+ constructor(options: UcpCheckoutHttpClientOptions);
74
+ createSession(body: Record<string, unknown>): Promise<UcpCheckoutHttpResult>;
75
+ getSession(sessionId: string): Promise<UcpCheckoutHttpResult>;
76
+ updateSession(sessionId: string, body: Record<string, unknown>): Promise<UcpCheckoutHttpResult>;
77
+ completeSession(sessionId: string, body: Record<string, unknown>): Promise<UcpCheckoutHttpResult>;
78
+ cancelSession(sessionId: string, body: Record<string, unknown>): Promise<UcpCheckoutHttpResult>;
79
+ createCart(body: Record<string, unknown>): Promise<UcpCartHttpResult>;
80
+ getCart(cartId: string): Promise<UcpCartHttpResult>;
81
+ /** Update 全量替换语义:PUT 完整 cart 表示。 */
82
+ updateCart(cartId: string, body: Record<string, unknown>): Promise<UcpCartHttpResult>;
83
+ cancelCart(cartId: string): Promise<UcpCartHttpResult>;
84
+ /** 共享传输:SSRF 复查 + 超时 + fetch + JSON 解析。不解析 UCP 结构。 */
85
+ private requestRaw;
86
+ private request;
87
+ private requestCart;
88
+ }
@@ -0,0 +1,228 @@
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 v0.7.0 Transaction Handoff(WP2 + 补全)— UCP Checkout/Cart HTTP 客户端
18
+ * (原生 fetch)。
19
+ *
20
+ * 网络面(全部 fail-closed,§4.6):
21
+ * - SSRF 复用 a2a url-policy:构造时静态校验 endpoint(unsafe_target),
22
+ * 每个请求前 DNS 复查解析 IP(unsafe_target);
23
+ * - 超时:AbortController(timeoutMs,缺省 10s);
24
+ * - 非 2xx / 畸形响应:非 2xx 若携带合法 UCP error envelope 仍解析(供消息算法
25
+ * 分支),否则 bad_status;2xx 非 JSON / 结构非法 → malformed;
26
+ * - UCP-Agent 头(RFC 8941 Dictionary,§25.1):buyer 配置了 profile URI 时注入。
27
+ *
28
+ * Cart 操作与 checkout 共享同一传输层(requestRaw),cart 实体与 checkout 同构:
29
+ * - createCart / getCart / updateCart(全量替换 PUT)/ cancelCart;
30
+ * - not_found 与 error 判别结构化:HTTP 404 → `{kind:"not_found"}`(spec:
31
+ * Get 对不存在/过期/已取消返回 not_found);ucp.status=error → 合法 error
32
+ * envelope 交上层消息算法;传输失败 → `{kind:"error"}`。
33
+ *
34
+ * 零新增依赖:Node 22 原生 fetch + AbortController。
35
+ */
36
+ import { assertResolvableTargetUrl, assertSafeTargetUrl } from "../../a2a/client/url-policy.js";
37
+ import { isRedirectResponse, readJsonBody, SafeHttpError } from "../../net/safe-http.js";
38
+ import { serializeUcpAgentHeader, UCP_AGENT_HEADER } from "../../a2a/ucp-agent.js";
39
+ import { parseUcpCartResponse } from "./cart-parse.js";
40
+ import { UcpCheckoutParseError, parseUcpCheckoutResponse } from "./parse.js";
41
+ /** REST binding 路径(UCP 2026-04-08:`POST {endpoint}/checkout-sessions`)。 */
42
+ export const CHECKOUT_SESSIONS_PATH = "/checkout-sessions";
43
+ export const CHECKOUT_COMPLETE_SUFFIX = "/complete";
44
+ export const CHECKOUT_CANCEL_SUFFIX = "/cancel";
45
+ /** Cart REST binding 路径(UCP 2026-04-08:`POST {endpoint}/carts`)。 */
46
+ export const CARTS_PATH = "/carts";
47
+ export const CART_CANCEL_SUFFIX = "/cancel";
48
+ function httpError(code, reason, status) {
49
+ return { kind: "error", code, reason, status };
50
+ }
51
+ export class UcpCheckoutHttpClient {
52
+ /** 规范化 endpoint(无尾部 `/`)。 */
53
+ endpoint;
54
+ url;
55
+ timeoutMs;
56
+ fetchImpl;
57
+ allowPrivateRanges;
58
+ skipDnsCheck;
59
+ resolveIp;
60
+ baseHeaders;
61
+ constructor(options) {
62
+ const url = assertSafeTargetUrl(options.endpoint, {
63
+ allowPrivateRanges: options.allowPrivateRanges,
64
+ });
65
+ this.url = url;
66
+ this.endpoint = url.href.replace(/\/+$/, "");
67
+ this.timeoutMs = options.timeoutMs ?? 10_000;
68
+ this.fetchImpl = options.fetchImpl ?? globalThis.fetch;
69
+ this.allowPrivateRanges = options.allowPrivateRanges ?? false;
70
+ this.skipDnsCheck = options.skipDnsCheck ?? false;
71
+ this.resolveIp = options.resolveIp;
72
+ this.baseHeaders = {
73
+ "content-type": "application/json",
74
+ accept: "application/json",
75
+ // WP3 §25.1:buyer 配置了 UCP profile URI 时宣告 UCP-Agent(RFC 8941 Dictionary)。
76
+ ...(options.ucpAgentProfile !== undefined
77
+ ? { [UCP_AGENT_HEADER]: serializeUcpAgentHeader(options.ucpAgentProfile) }
78
+ : {}),
79
+ ...options.headers,
80
+ };
81
+ }
82
+ createSession(body) {
83
+ return this.request("POST", CHECKOUT_SESSIONS_PATH, body);
84
+ }
85
+ getSession(sessionId) {
86
+ return this.request("GET", `${CHECKOUT_SESSIONS_PATH}/${encodeURIComponent(sessionId)}`, undefined);
87
+ }
88
+ updateSession(sessionId, body) {
89
+ return this.request("PUT", `${CHECKOUT_SESSIONS_PATH}/${encodeURIComponent(sessionId)}`, body);
90
+ }
91
+ completeSession(sessionId, body) {
92
+ return this.request("POST", `${CHECKOUT_SESSIONS_PATH}/${encodeURIComponent(sessionId)}${CHECKOUT_COMPLETE_SUFFIX}`, body);
93
+ }
94
+ cancelSession(sessionId, body) {
95
+ return this.request("POST", `${CHECKOUT_SESSIONS_PATH}/${encodeURIComponent(sessionId)}${CHECKOUT_CANCEL_SUFFIX}`, body);
96
+ }
97
+ // -- Cart 操作(共享 requestRaw 传输层;Cart 实体与 checkout 同构) --------------
98
+ createCart(body) {
99
+ return this.requestCart("POST", CARTS_PATH, body);
100
+ }
101
+ getCart(cartId) {
102
+ return this.requestCart("GET", `${CARTS_PATH}/${encodeURIComponent(cartId)}`, undefined);
103
+ }
104
+ /** Update 全量替换语义:PUT 完整 cart 表示。 */
105
+ updateCart(cartId, body) {
106
+ return this.requestCart("PUT", `${CARTS_PATH}/${encodeURIComponent(cartId)}`, body);
107
+ }
108
+ cancelCart(cartId) {
109
+ return this.requestCart("POST", `${CARTS_PATH}/${encodeURIComponent(cartId)}${CART_CANCEL_SUFFIX}`, {});
110
+ }
111
+ // -- 传输层 ---------------------------------------------------------
112
+ /** 共享传输:SSRF 复查 + 超时 + fetch + JSON 解析。不解析 UCP 结构。 */
113
+ async requestRaw(method, path, body) {
114
+ // 请求前 DNS 复查:主机名解析出的每个 IP 都不得落在私网/保留段(DNS rebinding 缓解)。
115
+ try {
116
+ await assertResolvableTargetUrl(this.url, {
117
+ allowPrivateRanges: this.allowPrivateRanges,
118
+ skipDnsCheck: this.skipDnsCheck,
119
+ resolveIp: this.resolveIp,
120
+ });
121
+ }
122
+ catch (err) {
123
+ return httpError("unsafe_target", `UCP endpoint rejected: ${err instanceof Error ? err.message : String(err)}`);
124
+ }
125
+ const controller = new AbortController();
126
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
127
+ const url = `${this.endpoint}${path}`;
128
+ let response;
129
+ try {
130
+ response = await this.fetchImpl(url, {
131
+ method,
132
+ // 出站纪律(评审项 P3-1,与 a2a-client 同类的 SSRF 面):绝不跟随
133
+ // 重定向——3xx 目标不经过 SSRF/DNS 复查,恶意/被攻陷的 UCP 服务器
134
+ // 可把 checkout 请求重定向到内网/元数据服务。
135
+ redirect: "manual",
136
+ headers: this.baseHeaders,
137
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
138
+ signal: controller.signal,
139
+ });
140
+ }
141
+ catch (err) {
142
+ if (controller.signal.aborted) {
143
+ return httpError("timeout", `UCP request timed out after ${this.timeoutMs}ms`);
144
+ }
145
+ return httpError("network", `UCP request failed: ${err instanceof Error ? err.message : String(err)}`);
146
+ }
147
+ if (isRedirectResponse(response)) {
148
+ return httpError("network", `UCP endpoint must not redirect (HTTP ${response.status})`, response.status);
149
+ }
150
+ let raw;
151
+ try {
152
+ // 响应体读取在超时覆盖内 + 大小上限(对端停滞 body 不再永久挂起)。
153
+ raw = await readJsonBody(response, { signal: controller.signal });
154
+ }
155
+ catch (err) {
156
+ if (controller.signal.aborted) {
157
+ return httpError("timeout", `UCP request timed out after ${this.timeoutMs}ms`);
158
+ }
159
+ return httpError("malformed", err instanceof SafeHttpError && err.code === "response_too_large"
160
+ ? `UCP response too large: ${err.message}`
161
+ : `UCP response is not JSON${response.ok ? "" : ` (http ${response.status})`}`, response.status);
162
+ }
163
+ finally {
164
+ clearTimeout(timer);
165
+ }
166
+ return { kind: "ok", status: response.status, raw };
167
+ }
168
+ async request(method, path, body) {
169
+ const raw = await this.requestRaw(method, path, body);
170
+ if (raw.kind === "error")
171
+ return raw;
172
+ let parsed;
173
+ try {
174
+ parsed = parseUcpCheckoutResponse(raw.raw);
175
+ }
176
+ catch (err) {
177
+ const detail = err instanceof UcpCheckoutParseError ? err.message : err instanceof Error ? err.message : String(err);
178
+ return httpError("malformed", `UCP checkout response malformed: ${detail}`, raw.status);
179
+ }
180
+ const ok = raw.status >= 200 && raw.status < 300;
181
+ if (!ok) {
182
+ // 非 2xx:合法 UCP error envelope 仍走消息算法(fail-closed 结果,绝不 ok);
183
+ // success envelope 与 HTTP 层矛盾 → bad_status。
184
+ if (parsed.ucp.status === "error") {
185
+ return { kind: "ok", status: raw.status, response: parsed };
186
+ }
187
+ return httpError("bad_status", `UCP checkout HTTP ${raw.status} with inconsistent success envelope`, raw.status);
188
+ }
189
+ return { kind: "ok", status: raw.status, response: parsed };
190
+ }
191
+ async requestCart(method, path, body) {
192
+ const raw = await this.requestRaw(method, path, body);
193
+ if (raw.kind === "error")
194
+ return raw;
195
+ const status = raw.status;
196
+ let parsed;
197
+ try {
198
+ parsed = parseUcpCartResponse(raw.raw);
199
+ }
200
+ catch (err) {
201
+ // spec 事实:Get 对不存在/过期/已取消的 cart 返回 not_found → 404 优先判别
202
+ // not_found(body 非 UCP envelope 也按 not_found 处理,不翻成 malformed)。
203
+ if (status === 404)
204
+ return { kind: "not_found", status };
205
+ const detail = err instanceof UcpCheckoutParseError ? err.message : err instanceof Error ? err.message : String(err);
206
+ return httpError("malformed", `UCP cart response malformed: ${detail}`, status);
207
+ }
208
+ // 404 → 结构化 not_found(携带可用的 messages/continue_url)。
209
+ if (status === 404) {
210
+ return {
211
+ kind: "not_found",
212
+ status,
213
+ ...(parsed.ucp.status === "error"
214
+ ? { messages: parsed.messages, continue_url: parsed.continue_url }
215
+ : {}),
216
+ };
217
+ }
218
+ const ok = status >= 200 && status < 300;
219
+ if (!ok) {
220
+ if (parsed.ucp.status === "error") {
221
+ return { kind: "ok", status, response: parsed };
222
+ }
223
+ return httpError("bad_status", `UCP cart HTTP ${status} with inconsistent success envelope`, status);
224
+ }
225
+ return { kind: "ok", status, response: parsed };
226
+ }
227
+ }
228
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/handoff/ucp-checkout/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
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 { UcpProfile } from "../../discovery/ucp/types.js";
17
+ export interface FindCheckoutEndpointOptions {
18
+ /** 显式指定 checkout service 名(如 `com.example.checkout`)。 */
19
+ serviceName?: string;
20
+ }
21
+ /**
22
+ * 在 profile 中解析 checkout REST endpoint。找不到返回 undefined。
23
+ */
24
+ export declare function findCheckoutEndpoint(profile: UcpProfile, opts?: FindCheckoutEndpointOptions): string | undefined;
25
+ /**
26
+ * business profile 是否宣告 cart capability(`dev.ucp.shopping.cart`)。
27
+ * 判定:capability 名全名相等,或解析后 capability 末段为 `cart`(forward-compat,
28
+ * 不同 reverse-domain 的 cart capability 也认)。
29
+ */
30
+ export declare function profileHasCartCapability(profile: UcpProfile): boolean;
31
+ /**
32
+ * 在 profile 中解析 cart REST endpoint。与 findCheckoutEndpoint 并列;额外优先
33
+ * capability 宿主 service(`*.cart` capability 所在 service 的 rest endpoint)。
34
+ * 找不到返回 undefined。
35
+ */
36
+ export declare function findCartEndpoint(profile: UcpProfile, opts?: FindCheckoutEndpointOptions): string | undefined;
@@ -0,0 +1,145 @@
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 v0.7.0 Transaction Handoff(WP2 + 补全)— UCP checkout / cart service
18
+ * endpoint 解析 + cart capability 检测。
19
+ *
20
+ * 从 UCP profile(src/discovery/ucp)里找出 checkout / cart REST service endpoint:
21
+ * - 显式 serviceName:取 `profile.ucp.services[serviceName]` 下第一个
22
+ * transport=rest 且有 endpoint 的条目;
23
+ * - 自动探测:优先 service 名最后一段为 `checkout`/`cart` 的 rest service;
24
+ * cart 额外优先 capability 宿主 service(capability 名末段 == cart,
25
+ * 如 `dev.ucp.shopping.cart` → service `dev.ucp.shopping`);
26
+ * 回退到 spec URL 含 `checkout`/`cart` 的 rest service;
27
+ * - 找不到 → undefined(fail-closed:缺 endpoint 时 channel 拒绝构造)。
28
+ *
29
+ * cart capability 检测(profileHasCartCapability):`dev.ucp.shopping.cart`
30
+ * 在 `profile.ucp.capabilities` 里宣告。cart_id 仅在 business profile 宣告
31
+ * cart capability 时可用(spec 事实)。
32
+ *
33
+ * 只解析 endpoint(不抓取、不 SSRF);endpoint 的安全校验发生在 channel 构造
34
+ * 与请求前(复用 a2a url-policy)。
35
+ */
36
+ import { parseCapabilityNamespace, parseServiceNamespace, } from "../../discovery/ucp/types.js";
37
+ import { CART_CAPABILITY } from "./cart-types.js";
38
+ function isRestWithEndpoint(decl) {
39
+ return decl.transport === "rest" && typeof decl.endpoint === "string" && decl.endpoint.length > 0;
40
+ }
41
+ /**
42
+ * 在 profile 中解析 checkout REST endpoint。找不到返回 undefined。
43
+ */
44
+ export function findCheckoutEndpoint(profile, opts = {}) {
45
+ const services = profile.ucp.services;
46
+ if (services === undefined)
47
+ return undefined;
48
+ if (opts.serviceName !== undefined) {
49
+ const entries = services[opts.serviceName];
50
+ if (entries === undefined)
51
+ return undefined;
52
+ const hit = entries.find(isRestWithEndpoint);
53
+ return hit?.endpoint;
54
+ }
55
+ // 自动探测:优先 service 名末段 == checkout。
56
+ for (const [name, entries] of Object.entries(services)) {
57
+ const ns = parseServiceNamespace(name);
58
+ if (ns !== undefined && ns.service === "checkout") {
59
+ const hit = entries.find(isRestWithEndpoint);
60
+ if (hit !== undefined)
61
+ return hit.endpoint;
62
+ }
63
+ }
64
+ // 回退:spec URL 含 "checkout" 的 rest service。
65
+ for (const entries of Object.values(services)) {
66
+ const hit = entries.find((decl) => isRestWithEndpoint(decl) && /checkout/i.test(decl.spec));
67
+ if (hit !== undefined)
68
+ return hit.endpoint;
69
+ }
70
+ return undefined;
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Cart endpoint + capability
74
+ // ---------------------------------------------------------------------------
75
+ /**
76
+ * business profile 是否宣告 cart capability(`dev.ucp.shopping.cart`)。
77
+ * 判定:capability 名全名相等,或解析后 capability 末段为 `cart`(forward-compat,
78
+ * 不同 reverse-domain 的 cart capability 也认)。
79
+ */
80
+ export function profileHasCartCapability(profile) {
81
+ const caps = profile.ucp.capabilities;
82
+ if (caps === undefined)
83
+ return false;
84
+ for (const name of Object.keys(caps)) {
85
+ if (name === CART_CAPABILITY)
86
+ return true;
87
+ const ns = parseCapabilityNamespace(name);
88
+ if (ns !== undefined && ns.capability === "cart")
89
+ return true;
90
+ }
91
+ return false;
92
+ }
93
+ /**
94
+ * 在 profile 中解析 cart REST endpoint。与 findCheckoutEndpoint 并列;额外优先
95
+ * capability 宿主 service(`*.cart` capability 所在 service 的 rest endpoint)。
96
+ * 找不到返回 undefined。
97
+ */
98
+ export function findCartEndpoint(profile, opts = {}) {
99
+ const services = profile.ucp.services;
100
+ if (services === undefined)
101
+ return undefined;
102
+ if (opts.serviceName !== undefined) {
103
+ const entries = services[opts.serviceName];
104
+ if (entries === undefined)
105
+ return undefined;
106
+ const hit = entries.find(isRestWithEndpoint);
107
+ return hit?.endpoint;
108
+ }
109
+ // 1. capability 宿主 service:capability 名末段 == cart(如 dev.ucp.shopping.cart
110
+ // → service dev.ucp.shopping)。
111
+ const cartCapabilityServices = new Set();
112
+ const caps = profile.ucp.capabilities;
113
+ if (caps !== undefined) {
114
+ for (const name of Object.keys(caps)) {
115
+ const ns = parseCapabilityNamespace(name);
116
+ if (ns !== undefined && ns.capability === "cart") {
117
+ cartCapabilityServices.add(`${ns.reverseDomain}.${ns.service}`);
118
+ }
119
+ }
120
+ }
121
+ for (const [name, entries] of Object.entries(services)) {
122
+ if (cartCapabilityServices.has(name)) {
123
+ const hit = entries.find(isRestWithEndpoint);
124
+ if (hit !== undefined)
125
+ return hit.endpoint;
126
+ }
127
+ }
128
+ // 2. 自动探测:service 名末段 == cart。
129
+ for (const [name, entries] of Object.entries(services)) {
130
+ const ns = parseServiceNamespace(name);
131
+ if (ns !== undefined && ns.service === "cart") {
132
+ const hit = entries.find(isRestWithEndpoint);
133
+ if (hit !== undefined)
134
+ return hit.endpoint;
135
+ }
136
+ }
137
+ // 3. 回退:spec URL 含 "cart" 的 rest service。
138
+ for (const entries of Object.values(services)) {
139
+ const hit = entries.find((decl) => isRestWithEndpoint(decl) && /cart/i.test(decl.spec));
140
+ if (hit !== undefined)
141
+ return hit.endpoint;
142
+ }
143
+ return undefined;
144
+ }
145
+ //# sourceMappingURL=endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/handoff/ucp-checkout/endpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
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 v0.7.0 Transaction Handoff(WP2)— UCP Checkout client。
18
+ *
19
+ * HandoffChannel 的真实 UCP 版本:在外部交易系统(business 为 Merchant of Record)
20
+ * 上创建 / 读取 / 全量替换更新 / 请求完成 / 取消 checkout session。与 WP1 的
21
+ * 同步接缝 `HandoffChannel` 相对,本包提供异步投影 `AsyncHandoffChannel`;
22
+ * `requestCompletion` 复用 WP1 完成门禁(completion.ts),通过后才发 Complete,
23
+ * 且只附 authorization 证据引用(不构造任何支付凭据)。
24
+ *
25
+ * 零新增依赖:Node 22 原生 fetch + AbortController;SSRF 复用 a2a url-policy。
26
+ */
27
+ export { UcpCheckoutChannel, type AsyncHandoffChannel, type CartCheckoutLink, type UcpCheckoutChannelOptions, } from "./channel.js";
28
+ export { CART_CANCEL_SUFFIX, CARTS_PATH, CHECKOUT_CANCEL_SUFFIX, CHECKOUT_COMPLETE_SUFFIX, CHECKOUT_SESSIONS_PATH, UcpCheckoutHttpClient, type UcpCartHttpResult, type UcpCheckoutHttpClientOptions, type UcpCheckoutHttpError, type UcpCheckoutHttpErrorCode, type UcpCheckoutHttpResult, } from "./client.js";
29
+ export { findCartEndpoint, findCheckoutEndpoint, profileHasCartCapability, type FindCheckoutEndpointOptions, } from "./endpoint.js";
30
+ export { CART_CAPABILITY, CART_SPEC_VERSION, UCP_CART_FAILURE_CODES, type UcpCart, type UcpCartErrorResponse, type UcpCartFailureCode, type UcpCartLineItem, type UcpCartLink, type UcpCartMessage, type UcpCartResponse, type UcpCartResult, type UcpCartTotals, } from "./cart-types.js";
31
+ export { isUcpCartErrorResponse, isUcpCartSuccess, parseUcpCartResponse, } from "./cart-parse.js";
32
+ export { UcpCartChannel, type UcpCartChannelOptions, } from "./cart-channel.js";
33
+ export { UcpCheckoutParseError, decideMessages, decideResponse, groupMessages, isUcpCheckoutErrorResponse, isUcpCheckoutSuccessSession, parseUcpCheckoutResponse, summarizeMessages, type CheckoutAction, type CheckoutDecision, type MessageGrouping, } from "./parse.js";
34
+ export { validateTotals, type TotalsValidationResult } from "./totals.js";
35
+ export { DEFAULT_EXPIRY_MS, UCP_CHECKOUT_FAILURE_CODES, UCP_CHECKOUT_SPEC_VERSION, UCP_CHECKOUT_STATUSES, UCP_MESSAGE_SEVERITIES, UCP_MESSAGE_TYPES, type UcpCheckoutErrorResponse, type UcpCheckoutFailureCode, type UcpCheckoutLineItem, type UcpCheckoutLink, type UcpCheckoutMessage, type UcpCheckoutResponse, type UcpCheckoutResult, type UcpCheckoutSession, type UcpCheckoutStatus, type UcpCheckoutTotals, type UcpMessageSeverity, type UcpMessageType, } from "./types.js";
@@ -0,0 +1,36 @@
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 v0.7.0 Transaction Handoff(WP2)— UCP Checkout client。
18
+ *
19
+ * HandoffChannel 的真实 UCP 版本:在外部交易系统(business 为 Merchant of Record)
20
+ * 上创建 / 读取 / 全量替换更新 / 请求完成 / 取消 checkout session。与 WP1 的
21
+ * 同步接缝 `HandoffChannel` 相对,本包提供异步投影 `AsyncHandoffChannel`;
22
+ * `requestCompletion` 复用 WP1 完成门禁(completion.ts),通过后才发 Complete,
23
+ * 且只附 authorization 证据引用(不构造任何支付凭据)。
24
+ *
25
+ * 零新增依赖:Node 22 原生 fetch + AbortController;SSRF 复用 a2a url-policy。
26
+ */
27
+ export { UcpCheckoutChannel, } from "./channel.js";
28
+ export { CART_CANCEL_SUFFIX, CARTS_PATH, CHECKOUT_CANCEL_SUFFIX, CHECKOUT_COMPLETE_SUFFIX, CHECKOUT_SESSIONS_PATH, UcpCheckoutHttpClient, } from "./client.js";
29
+ export { findCartEndpoint, findCheckoutEndpoint, profileHasCartCapability, } from "./endpoint.js";
30
+ export { CART_CAPABILITY, CART_SPEC_VERSION, UCP_CART_FAILURE_CODES, } from "./cart-types.js";
31
+ export { isUcpCartErrorResponse, isUcpCartSuccess, parseUcpCartResponse, } from "./cart-parse.js";
32
+ export { UcpCartChannel, } from "./cart-channel.js";
33
+ export { UcpCheckoutParseError, decideMessages, decideResponse, groupMessages, isUcpCheckoutErrorResponse, isUcpCheckoutSuccessSession, parseUcpCheckoutResponse, summarizeMessages, } from "./parse.js";
34
+ export { validateTotals } from "./totals.js";
35
+ export { DEFAULT_EXPIRY_MS, UCP_CHECKOUT_FAILURE_CODES, UCP_CHECKOUT_SPEC_VERSION, UCP_CHECKOUT_STATUSES, UCP_MESSAGE_SEVERITIES, UCP_MESSAGE_TYPES, } from "./types.js";
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/handoff/ucp-checkout/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,EACL,kBAAkB,GAInB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,GAMtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,GAEzB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,sBAAsB,GAUvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,cAAc,GAEf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,aAAa,EACb,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,iBAAiB,GAIlB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAA+B,MAAM,aAAa,CAAC;AAE1E,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,GAalB,MAAM,YAAY,CAAC"}