@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,102 @@
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 — HandoffPackage(WP1 交接工件)。
18
+ *
19
+ * HandoffPackage 是把一个 KNP/1.0 `AcceptedNonbindingAgreement`(基线 §15/§16)
20
+ * 交给外部交易系统(UCP Checkout / AP2)前的安全交接工件。它携带协商达成所需的
21
+ * 全部商业事实,并做一次独立的内容寻址校验:
22
+ *
23
+ * terms_digest = RFC 8785 JCS + SHA-256 重算(src/negotiation/jcs.ts)
24
+ * MUST 等于 agreement 携带的 terms_digest
25
+ * 重算不一致 → 构造 fail-closed(HandoffError code=terms_digest_mismatch)
26
+ *
27
+ * 明确语义(基线 §3.4 / §15 / §16):HandoffPackage 不是订单、不含支付授权、
28
+ * 不代表库存预留。它只是「非绑定共识 → 交易系统」的交接载体;订单/支付/预留等
29
+ * 副作用必须发生在外部交易系统,且没有用户显式授权绝不 complete 任何 checkout。
30
+ */
31
+ import { KNP_PROTOCOL_VERSION } from "../negotiation/domain/common.js";
32
+ import type { TermSet } from "../negotiation/domain/common.js";
33
+ import type { AcceptedNonbindingAgreement } from "../negotiation/domain/objects.js";
34
+ /** WP1 交接工件版本。能力版本(capability_version)与它正交。 */
35
+ export declare const HANDOFF_PACKAGE_VERSION: "1.0";
36
+ /** 双侧身份快照:agreement 只表达 buyer|merchant 角色,身份字符串由构造方提供。 */
37
+ export interface HandoffIdentitySnapshot {
38
+ buyer_identity: string;
39
+ merchant_identity: string;
40
+ }
41
+ /**
42
+ * HandoffPackage 承载字段。
43
+ *
44
+ * - agreed_terms:完整 TermSet(结构校验过,非引用);terms_digest 是对它的
45
+ * 内容寻址,两者必须一致。
46
+ * - semantics:显式复述 KNP/1.0 无副作用约束 —— 交易系统必须把它当「交接工件」
47
+ * 而非订单/支付指令。
48
+ */
49
+ export interface HandoffPackage {
50
+ type: "handoff_package";
51
+ package_version: typeof HANDOFF_PACKAGE_VERSION;
52
+ agreement_id: string;
53
+ negotiation_id: string;
54
+ accepted_offer_id: string;
55
+ agreed_terms: TermSet;
56
+ /** contentDigest(agreed_terms),必须等于 agreement.terms_digest。 */
57
+ terms_digest: string;
58
+ identity: HandoffIdentitySnapshot;
59
+ /** 交易侧能力版本(如 UCP checkout capability 版本),opaque 字符串。 */
60
+ capability_version: string;
61
+ protocol_version: typeof KNP_PROTOCOL_VERSION;
62
+ /** 交接工件创建时间(可注入时钟),RFC 3339。 */
63
+ created_at: string;
64
+ semantics: {
65
+ /** 交接工件不是订单(基线 §15:creates_order=false)。 */
66
+ creates_order: false;
67
+ /** 交接工件不含支付授权(authorizes_payment=false)。 */
68
+ authorizes_payment: false;
69
+ /** 交接工件不代表库存预留(reserves_inventory=false)。 */
70
+ reserves_inventory: false;
71
+ };
72
+ }
73
+ export interface HandoffPackageInput {
74
+ agreement: AcceptedNonbindingAgreement;
75
+ identity: HandoffIdentitySnapshot;
76
+ /** 交易侧能力版本,如 `ucp.checkout/1`。 */
77
+ capability_version: string;
78
+ /** 覆盖 KNP protocol_version(缺省 1.0)。 */
79
+ protocol_version?: string;
80
+ /** 可注入时钟(RFC 3339);缺省 new Date().toISOString()。 */
81
+ created_at?: string;
82
+ }
83
+ /**
84
+ * 从 AcceptedNonbindingAgreement 构造 HandoffPackage。
85
+ *
86
+ * 构造即校验(fail-closed):
87
+ * 1. agreement 结构字段逐一校验;
88
+ * 2. 副作用 flag 必须为 false(KNP/1.0 §16,防御性复核);
89
+ * 3. 用 agreed_terms 重算 JCS+SHA-256 digest,必须等于 agreement.terms_digest,
90
+ * 否则抛 HandoffError(terms_digest_mismatch)。
91
+ *
92
+ * 返回值是独立拷贝 —— agreed_terms 经 validateTermSet 归一化,调用方后续改动
93
+ * agreement 不会污染 package。
94
+ */
95
+ export declare function createHandoffPackage(input: HandoffPackageInput): HandoffPackage;
96
+ /** 从已构造的 package 重算 terms_digest 并比对;false 表示工件被篡改。 */
97
+ export declare function verifyHandoffPackageDigest(pkg: HandoffPackage): boolean;
98
+ /**
99
+ * 基础结构守卫:从不可信输入解析 HandoffPackage 前的形状检查(对齐 ledger 的
100
+ * isLedgerEvent 做法)。内容一致性由 verifyHandoffPackageDigest 单独校验。
101
+ */
102
+ export declare function isHandoffPackage(value: unknown): value is HandoffPackage;
@@ -0,0 +1,132 @@
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 — HandoffPackage(WP1 交接工件)。
18
+ *
19
+ * HandoffPackage 是把一个 KNP/1.0 `AcceptedNonbindingAgreement`(基线 §15/§16)
20
+ * 交给外部交易系统(UCP Checkout / AP2)前的安全交接工件。它携带协商达成所需的
21
+ * 全部商业事实,并做一次独立的内容寻址校验:
22
+ *
23
+ * terms_digest = RFC 8785 JCS + SHA-256 重算(src/negotiation/jcs.ts)
24
+ * MUST 等于 agreement 携带的 terms_digest
25
+ * 重算不一致 → 构造 fail-closed(HandoffError code=terms_digest_mismatch)
26
+ *
27
+ * 明确语义(基线 §3.4 / §15 / §16):HandoffPackage 不是订单、不含支付授权、
28
+ * 不代表库存预留。它只是「非绑定共识 → 交易系统」的交接载体;订单/支付/预留等
29
+ * 副作用必须发生在外部交易系统,且没有用户显式授权绝不 complete 任何 checkout。
30
+ */
31
+ import { KNP_PROTOCOL_VERSION, requireNonEmptyString, requireObject, requireDigest, requireIsoTimestamp, validateTermSet, } from "../negotiation/domain/common.js";
32
+ import { validateIdentifier } from "../negotiation/domain/identifiers.js";
33
+ import { contentDigest } from "../negotiation/jcs.js";
34
+ import { HandoffError } from "./errors.js";
35
+ /** WP1 交接工件版本。能力版本(capability_version)与它正交。 */
36
+ export const HANDOFF_PACKAGE_VERSION = "1.0";
37
+ function validateIdentitySnapshot(value) {
38
+ const obj = requireObject(value, "identity");
39
+ return {
40
+ buyer_identity: validateIdentifier(obj.buyer_identity, "identity/buyer_identity"),
41
+ merchant_identity: validateIdentifier(obj.merchant_identity, "identity/merchant_identity"),
42
+ };
43
+ }
44
+ /**
45
+ * 从 AcceptedNonbindingAgreement 构造 HandoffPackage。
46
+ *
47
+ * 构造即校验(fail-closed):
48
+ * 1. agreement 结构字段逐一校验;
49
+ * 2. 副作用 flag 必须为 false(KNP/1.0 §16,防御性复核);
50
+ * 3. 用 agreed_terms 重算 JCS+SHA-256 digest,必须等于 agreement.terms_digest,
51
+ * 否则抛 HandoffError(terms_digest_mismatch)。
52
+ *
53
+ * 返回值是独立拷贝 —— agreed_terms 经 validateTermSet 归一化,调用方后续改动
54
+ * agreement 不会污染 package。
55
+ */
56
+ export function createHandoffPackage(input) {
57
+ const agreement = input.agreement;
58
+ const agreementId = validateIdentifier(agreement.agreement_id, "agreement.agreement_id");
59
+ const negotiationId = validateIdentifier(agreement.negotiation_id, "agreement.negotiation_id");
60
+ const acceptedOfferId = validateIdentifier(agreement.accepted_offer_id, "agreement.accepted_offer_id");
61
+ const agreedTerms = validateTermSet(agreement.agreed_terms, "agreement.agreed_terms");
62
+ const agreementDigest = requireDigest(agreement.terms_digest, "agreement.terms_digest");
63
+ // KNP/1.0 §16:Agreement 不得带任何交易副作用(防御性复核,防类型绕过)。
64
+ if (agreement.creates_order !== false ||
65
+ agreement.reserves_inventory !== false ||
66
+ agreement.authorizes_payment !== false) {
67
+ throw new HandoffError("invalid_agreement", "agreement MUST carry creates_order=false / reserves_inventory=false / authorizes_payment=false (KNP/1.0 §16)");
68
+ }
69
+ const identity = validateIdentitySnapshot(input.identity);
70
+ const capabilityVersion = requireNonEmptyString(input.capability_version, "capability_version");
71
+ const protocolVersion = input.protocol_version ?? KNP_PROTOCOL_VERSION;
72
+ if (protocolVersion !== KNP_PROTOCOL_VERSION) {
73
+ throw new HandoffError("invalid_input", `unsupported protocol_version ${protocolVersion}; handoff binds to ${KNP_PROTOCOL_VERSION}`, "protocol_version");
74
+ }
75
+ const createdAt = input.created_at ?? new Date().toISOString();
76
+ requireIsoTimestamp(createdAt, "created_at");
77
+ // 重算 digest:contentDigest 走 RFC 8785 JCS + SHA-256(与 agreement 同源)。
78
+ const recomputed = contentDigest(agreedTerms);
79
+ if (recomputed !== agreementDigest) {
80
+ throw new HandoffError("terms_digest_mismatch", `agreed_terms digest mismatch: recomputed ${recomputed}, agreement carries ${agreementDigest}`, "terms_digest");
81
+ }
82
+ return {
83
+ type: "handoff_package",
84
+ package_version: HANDOFF_PACKAGE_VERSION,
85
+ agreement_id: agreementId,
86
+ negotiation_id: negotiationId,
87
+ accepted_offer_id: acceptedOfferId,
88
+ agreed_terms: agreedTerms,
89
+ terms_digest: recomputed,
90
+ identity,
91
+ capability_version: capabilityVersion,
92
+ protocol_version: KNP_PROTOCOL_VERSION,
93
+ created_at: createdAt,
94
+ semantics: {
95
+ creates_order: false,
96
+ authorizes_payment: false,
97
+ reserves_inventory: false,
98
+ },
99
+ };
100
+ }
101
+ /** 从已构造的 package 重算 terms_digest 并比对;false 表示工件被篡改。 */
102
+ export function verifyHandoffPackageDigest(pkg) {
103
+ if (pkg.type !== "handoff_package" || pkg.package_version !== HANDOFF_PACKAGE_VERSION) {
104
+ return false;
105
+ }
106
+ return contentDigest(pkg.agreed_terms) === pkg.terms_digest;
107
+ }
108
+ /**
109
+ * 基础结构守卫:从不可信输入解析 HandoffPackage 前的形状检查(对齐 ledger 的
110
+ * isLedgerEvent 做法)。内容一致性由 verifyHandoffPackageDigest 单独校验。
111
+ */
112
+ export function isHandoffPackage(value) {
113
+ if (value === null || typeof value !== "object")
114
+ return false;
115
+ const obj = value;
116
+ const semantics = obj.semantics;
117
+ return (obj.type === "handoff_package" &&
118
+ obj.package_version === HANDOFF_PACKAGE_VERSION &&
119
+ typeof obj.agreement_id === "string" &&
120
+ typeof obj.negotiation_id === "string" &&
121
+ typeof obj.terms_digest === "string" &&
122
+ typeof obj.capability_version === "string" &&
123
+ typeof obj.created_at === "string" &&
124
+ obj.identity !== null &&
125
+ typeof obj.identity === "object" &&
126
+ semantics !== null &&
127
+ typeof semantics === "object" &&
128
+ semantics.creates_order === false &&
129
+ semantics.authorizes_payment === false &&
130
+ semantics.reserves_inventory === false);
131
+ }
132
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/handoff/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
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 { LedgerCapabilitySnapshot, LedgerIdentitySnapshot } from "../negotiation/ledger/event.js";
17
+ import type { HandoffCandidate, HandoffDisplaySummary } from "./candidate.js";
18
+ import type { HandoffEventStore } from "./ledger.js";
19
+ import type { HandoffIdempotencyStore } from "./idempotency.js";
20
+ import { type SafeDestinationUrl } from "./url-safety.js";
21
+ import { type DestinationType } from "./destination.js";
22
+ /** TransactionHandoff(KTH rev0.3 §6)。不可变;digest 覆盖全部内容。 */
23
+ export interface TransactionHandoff {
24
+ readonly handoff_id: string;
25
+ readonly source_candidate_id: string;
26
+ readonly source_candidate_digest: string;
27
+ readonly agreement_id: string;
28
+ readonly negotiation_id: string;
29
+ readonly terms_digest: string;
30
+ readonly merchant_identity_ref: string;
31
+ readonly destination_type: DestinationType;
32
+ readonly destination_ref: string;
33
+ readonly display_summary: HandoffDisplaySummary;
34
+ readonly created_at: string;
35
+ readonly expires_at: string;
36
+ readonly requires_user_action: boolean;
37
+ readonly creates_order: false;
38
+ readonly authorizes_payment: false;
39
+ readonly reserves_inventory: false;
40
+ readonly handoff_digest: string;
41
+ }
42
+ /** 执行结果(判别联合;调用方不得把 stale/rejected 当成功)。 */
43
+ export type ExecuteHandoffResult = {
44
+ kind: "delivered";
45
+ handoff: TransactionHandoff;
46
+ final_url?: string;
47
+ } | {
48
+ kind: "already_delivered";
49
+ handoff_id: string;
50
+ } | {
51
+ kind: "stale";
52
+ reason: string;
53
+ }
54
+ /** 目的地探测瞬时失败(超时/网络/HEAD 405):候选保持 READY,可重试。 */
55
+ | {
56
+ kind: "probe_failed";
57
+ reason: string;
58
+ } | {
59
+ kind: "rejected";
60
+ reason: string;
61
+ } | {
62
+ kind: "expired";
63
+ reason: string;
64
+ };
65
+ export interface AgreementReadResult {
66
+ agreement_id: string;
67
+ negotiation_id: string;
68
+ agreed_terms: unknown;
69
+ }
70
+ export interface ExecuteHandoffInput {
71
+ candidate: HandoffCandidate;
72
+ ledger: HandoffEventStore;
73
+ idempotency: HandoffIdempotencyStore;
74
+ identity: LedgerIdentitySnapshot;
75
+ capability: LedgerCapabilitySnapshot;
76
+ /** 策略/批准门(KTH §1 flow 的 Policy/Approval;返回拒绝则不执行)。 */
77
+ approval: (candidate: HandoffCandidate) => Promise<{
78
+ approved: boolean;
79
+ reason?: string;
80
+ evidence?: Record<string, unknown>;
81
+ }>;
82
+ /** 重读 agreement 的权威源(§10 pre-execution revalidation)。 */
83
+ agreementReader: (agreementId: string) => Promise<AgreementReadResult | undefined>;
84
+ /** 目的地 URL 安全策略(缺省 HTTPS-only + expectedHost 校验)。 */
85
+ urlSafety?: (url: string) => Promise<SafeDestinationUrl>;
86
+ now?: () => string;
87
+ }
88
+ /**
89
+ * 从 Ledger 事件流驱动执行(含生命周期/重验/幂等/落链)。
90
+ * 整个流程以候选为粒度互斥(§10.1 并发保护):lookup→(await)→record 的
91
+ * check-then-act 在无锁时两个并发执行会双双通过幂等检查、同一候选交付两次。
92
+ * 锁在幂等存储上(JSONL 与锁文件同目录,跨进程共享 dir 时同样互斥)。
93
+ */
94
+ export declare function executeHandoff(input: ExecuteHandoffInput): Promise<ExecuteHandoffResult>;
95
+ /** 供调用方构造缺省 URL 安全策略(HTTPS-only + merchant 域绑定)。 */
96
+ export declare function defaultUrlSafety(expectedHost?: string): (url: string) => Promise<SafeDestinationUrl>;
@@ -0,0 +1,263 @@
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
+ * TransactionHandoff + executeHandoff(KTH rev0.3 §6/§10;完成定义 #9-16、
18
+ * #18-19)。
19
+ *
20
+ * executeHandoff 流程:
21
+ * 1. 生命周期门:候选必须 READY(PROPOSED 时先走 approval:通过 →
22
+ * ready 事件;拒绝 → rejected 事件并返回);
23
+ * 2. pre-execution revalidation(§10):重读 agreement / 重算 terms_digest /
24
+ * 验 merchant identity / 验 destination(URL 安全)/ 验 expiry ——
25
+ * 任一变化 → handoff_candidate_stale → 返回 stale(不执行);
26
+ * 3. 幂等(§10.1):(source_candidate_id, source_candidate_digest) 已交付
27
+ * → 返回已交付结果(重试不重复交付);冲突 → fail-closed;
28
+ * 4. consumed(候选)+ delivered(handoff)事件落链,构造 TransactionHandoff
29
+ * (handoff_digest = JCS 去除自身)。
30
+ *
31
+ * 三副作用不变量(§16/§36-25):本模块绝不创建订单/授权支付/预留库存。
32
+ */
33
+ import { contentDigest } from "../negotiation/jcs.js";
34
+ import { assertNoForbiddenContent } from "../negotiation/ledger/event.js";
35
+ import { generateId } from "../negotiation/domain/identifiers.js";
36
+ import { CommerceError } from "../commerce/data-source.js";
37
+ import { foldCandidateLifecycle, transitionCandidateLifecycle } from "./lifecycle.js";
38
+ import { validateExternalDestinationUrl } from "./url-safety.js";
39
+ import { isUrlDestinationType } from "./destination.js";
40
+ function computeHandoffDigest(handoff) {
41
+ return contentDigest(handoff);
42
+ }
43
+ /**
44
+ * 从 Ledger 事件流驱动执行(含生命周期/重验/幂等/落链)。
45
+ * 整个流程以候选为粒度互斥(§10.1 并发保护):lookup→(await)→record 的
46
+ * check-then-act 在无锁时两个并发执行会双双通过幂等检查、同一候选交付两次。
47
+ * 锁在幂等存储上(JSONL 与锁文件同目录,跨进程共享 dir 时同样互斥)。
48
+ */
49
+ export async function executeHandoff(input) {
50
+ return input.idempotency.withCandidateLock(input.candidate.handoff_candidate_id, () => executeHandoffUnlocked(input));
51
+ }
52
+ async function executeHandoffUnlocked(input) {
53
+ const { candidate, ledger, idempotency } = input;
54
+ // 惰性清理(评审项 L2):prune 此前无调用方——幂等行永久保留,磁盘随
55
+ // 候选数无界增长。执行是低频操作,顺带清理过期行(保留期 ≥7 天不变)。
56
+ try {
57
+ idempotency.prune();
58
+ }
59
+ catch {
60
+ // 清理失败不影响执行(fail-safe 方向;下次执行再试)。
61
+ }
62
+ const negotiationId = candidate.negotiation_id;
63
+ const events = ledger.events(negotiationId);
64
+ const candidateEvents = events.filter((e) => e.handoff_candidate_id === candidate.handoff_candidate_id);
65
+ const state = foldCandidateLifecycle(candidateEvents);
66
+ const now = input.now ?? (() => new Date().toISOString());
67
+ // ── 0.5 协议级去重(评审项 H3)──────────────────────────────────────
68
+ // 同一 (agreement_id, destination_type, destination_ref) 已交付过 →
69
+ // already_delivered。创建期检查(buyer-tools priorDelivery)拦不住双候选
70
+ // 双批准:候选 A 创建时 B 尚未交付,两者都通过创建期检查;执行期幂等键
71
+ // (candidate_id, digest) 对每个候选都是新键。以链上事实为准——第一个
72
+ // 交付落链后,任何后续候选执行(含不同候选并发执行)都命中此检查,
73
+ // 且不触发无谓的 approval/重验。
74
+ const priorDestination = events.find((e) => e.event_kind === "handoff_delivered" &&
75
+ e.agreement_id === candidate.agreement_id &&
76
+ e.destination?.type === candidate.destination_type &&
77
+ e.destination?.ref === candidate.destination_ref);
78
+ if (priorDestination !== undefined) {
79
+ return { kind: "already_delivered", handoff_id: priorDestination.handoff_id ?? "unknown" };
80
+ }
81
+ // ── 1. 生命周期门 ────────────────────────────────────────────────────
82
+ if (state === "REJECTED")
83
+ return { kind: "rejected", reason: "candidate was rejected" };
84
+ if (state === "STALE")
85
+ return { kind: "stale", reason: "candidate is stale" };
86
+ if (state === "EXPIRED")
87
+ return { kind: "expired", reason: "candidate already expired" };
88
+ if (state === "CONSUMED") {
89
+ const consumed = events.find((e) => e.handoff_candidate_id === candidate.handoff_candidate_id && e.handoff_id !== undefined);
90
+ const handoffId = consumed?.handoff_id ?? "unknown";
91
+ // 中间态恢复(评审项 M1):consumed 已落、delivered 缺失(两次 append
92
+ // 之间崩溃)时,补落 delivered + 幂等记录——否则重试永远报"已交付"
93
+ // 但审计链上无交付证据(deliveryState 投影 undefined、metrics 缺失、
94
+ // TUI 列表显示 delivery "?")。恢复的 delivered 以候选 destination_ref
95
+ // 为兜底(首次执行的 URL 探测结果已不可得;type/ref 是候选审计事实,
96
+ // final_url 是展示字段,缺失可接受)。
97
+ const deliveredExists = events.some((e) => e.event_kind === "handoff_delivered" && e.handoff_id === handoffId);
98
+ if (!deliveredExists && handoffId !== "unknown") {
99
+ ledger.appendDeliveryEvent({
100
+ kind: "handoff_delivered",
101
+ candidate,
102
+ handoff_id: handoffId,
103
+ identity: input.identity,
104
+ capability: input.capability,
105
+ destination: { final_url: candidate.destination_ref },
106
+ occurred_at: now(),
107
+ });
108
+ idempotency.record(candidate.handoff_candidate_id, candidate.candidate_digest, handoffId);
109
+ }
110
+ return { kind: "already_delivered", handoff_id: handoffId };
111
+ }
112
+ if (state === "PROPOSED" || state === undefined) {
113
+ // PROPOSED:先走策略/批准。通过 → ready(附批准证据);拒绝 → rejected。
114
+ const approvalResult = await input.approval(candidate);
115
+ if (!approvalResult.approved) {
116
+ ledger.appendCandidateEvent({
117
+ kind: "handoff_candidate_rejected",
118
+ candidate,
119
+ identity: input.identity,
120
+ capability: input.capability,
121
+ evidence: { reason: approvalResult.reason ?? "approval rejected" },
122
+ occurred_at: now(),
123
+ });
124
+ return { kind: "rejected", reason: approvalResult.reason ?? "approval rejected" };
125
+ }
126
+ transitionCandidateLifecycle(state, "handoff_candidate_ready");
127
+ ledger.appendCandidateEvent({
128
+ kind: "handoff_candidate_ready",
129
+ candidate,
130
+ identity: input.identity,
131
+ capability: input.capability,
132
+ evidence: approvalResult.evidence,
133
+ occurred_at: now(),
134
+ });
135
+ }
136
+ else if (state !== "READY") {
137
+ return { kind: "stale", reason: `unexpected lifecycle state ${String(state)}` };
138
+ }
139
+ // ── 2. pre-execution revalidation(§10)──────────────────────────────
140
+ const agreement = await input.agreementReader(candidate.agreement_id);
141
+ if (agreement === undefined) {
142
+ return stale(input, candidate, now, "agreement no longer exists");
143
+ }
144
+ if (agreement.agreement_id !== candidate.agreement_id || agreement.negotiation_id !== candidate.negotiation_id) {
145
+ return stale(input, candidate, now, "agreement identity changed");
146
+ }
147
+ const recomputedTerms = contentDigest(agreement.agreed_terms);
148
+ if (recomputedTerms !== candidate.terms_digest) {
149
+ return stale(input, candidate, now, "terms_digest mismatch on revalidation");
150
+ }
151
+ // fail-closed 过期门:不可解析的时间戳(Date.parse 为 NaN)绝不视为
152
+ // "未过期"——NaN < x 恒 false 会让候选永不过期直接交付。与 completion.ts
153
+ // 的守卫一致:NaN 一律按过期处理。
154
+ const expiresMs = Date.parse(candidate.expires_at);
155
+ const nowMs = Date.parse(now());
156
+ if (!Number.isFinite(expiresMs) || !Number.isFinite(nowMs) || expiresMs < nowMs) {
157
+ ledger.appendCandidateEvent({
158
+ kind: "handoff_candidate_expired",
159
+ candidate,
160
+ identity: input.identity,
161
+ capability: input.capability,
162
+ occurred_at: now(),
163
+ });
164
+ return { kind: "expired", reason: "candidate expired before execution" };
165
+ }
166
+ let finalUrl;
167
+ // URL 安全只适用于 URL 承载类目的地(quote/PO/contact 等 opaque ref
168
+ // 不做 URL 探测——它们不是可点击链接,KTH §7 类型语义)。
169
+ if (input.urlSafety !== undefined && isUrlDestinationType(candidate.destination_type)) {
170
+ try {
171
+ const safe = await input.urlSafety(candidate.destination_ref);
172
+ finalUrl = safe.finalUrl;
173
+ }
174
+ catch (err) {
175
+ // 瞬时探测失败(超时/网络/HEAD 405)可重试,不置终态 STALE(评审项
176
+ // M2:此前一次 15s 超时即永久废掉候选——目的地内容并未变化,断网期间
177
+ // 每次重试都新建候选再置 stale,候选/事件堆积)。安全拒绝(scheme/
178
+ // host/DNS 保留网段 → invalid_input)仍是终态——内容确实不可用。
179
+ if (err instanceof CommerceError && err.code === "request_failed") {
180
+ return { kind: "probe_failed", reason: err.message };
181
+ }
182
+ return stale(input, candidate, now, `destination invalid: ${err instanceof Error ? err.message : String(err)}`);
183
+ }
184
+ }
185
+ // ── 3. 幂等(§10.1)─────────────────────────────────────────────────
186
+ const prior = idempotency.lookup(candidate.handoff_candidate_id, candidate.candidate_digest);
187
+ if (prior !== undefined) {
188
+ return { kind: "already_delivered", handoff_id: prior.handoff_id };
189
+ }
190
+ // ── 4. 交付:consumed + delivered 落链 ──────────────────────────────
191
+ const handoffId = generateId("handoff");
192
+ const base = {
193
+ handoff_id: handoffId,
194
+ source_candidate_id: candidate.handoff_candidate_id,
195
+ source_candidate_digest: candidate.candidate_digest,
196
+ agreement_id: candidate.agreement_id,
197
+ negotiation_id: candidate.negotiation_id,
198
+ terms_digest: candidate.terms_digest,
199
+ merchant_identity_ref: candidate.merchant_identity_ref,
200
+ destination_type: candidate.destination_type,
201
+ destination_ref: candidate.destination_ref,
202
+ display_summary: candidate.display_summary,
203
+ created_at: now(),
204
+ expires_at: candidate.expires_at,
205
+ requires_user_action: candidate.requires_user_action,
206
+ creates_order: false,
207
+ authorizes_payment: false,
208
+ reserves_inventory: false,
209
+ };
210
+ const handoff = {
211
+ ...base,
212
+ handoff_digest: computeHandoffDigest(base),
213
+ };
214
+ // 预检(评审项 M1 加固):consumed 落链前先验证 delivered 内容可落账
215
+ //(禁词扫描)。若 delivered 因 ledger_forbidden_content 失败,此时 consumed
216
+ // 已落链,会形成"已消费但无交付证据"的中间态(恢复路径虽能补,但可预
217
+ // 见的失败应发生在 consumed 之前)。
218
+ const deliveredDestination = {
219
+ type: candidate.destination_type,
220
+ ref: candidate.destination_ref,
221
+ ...(finalUrl !== undefined ? { final_url: finalUrl } : {}),
222
+ };
223
+ assertNoForbiddenContent(deliveredDestination, "destination");
224
+ ledger.appendCandidateEvent({
225
+ kind: "handoff_candidate_consumed",
226
+ candidate,
227
+ identity: input.identity,
228
+ capability: input.capability,
229
+ handoff_id: handoffId,
230
+ occurred_at: now(),
231
+ });
232
+ ledger.appendDeliveryEvent({
233
+ kind: "handoff_delivered",
234
+ candidate,
235
+ handoff_id: handoffId,
236
+ identity: input.identity,
237
+ capability: input.capability,
238
+ destination: { final_url: finalUrl ?? candidate.destination_ref },
239
+ occurred_at: now(),
240
+ });
241
+ idempotency.record(candidate.handoff_candidate_id, candidate.candidate_digest, handoffId);
242
+ return { kind: "delivered", handoff, ...(finalUrl !== undefined ? { final_url: finalUrl } : {}) };
243
+ }
244
+ // 用模块级函数而非 this(避免丢失 this 的调用方踩坑)。
245
+ function stale(input, candidate, now, reason) {
246
+ input.ledger.appendCandidateEvent({
247
+ kind: "handoff_candidate_stale",
248
+ candidate,
249
+ identity: input.identity,
250
+ capability: input.capability,
251
+ evidence: { reason },
252
+ occurred_at: now(),
253
+ });
254
+ return { kind: "stale", reason };
255
+ }
256
+ /** 供调用方构造缺省 URL 安全策略(HTTPS-only + merchant 域绑定)。 */
257
+ export function defaultUrlSafety(expectedHost) {
258
+ return (url) => validateExternalDestinationUrl(url, {
259
+ ...(expectedHost !== undefined ? { expectedHost } : {}),
260
+ allowHttp: false,
261
+ });
262
+ }
263
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/handoff/transaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAM3D,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAGtF,OAAO,EAAE,8BAA8B,EAA2B,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAwB,MAAM,kBAAkB,CAAC;AAsD9E,SAAS,oBAAoB,CAAC,OAAmD;IAC/E,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAA0B;IAC7D,OAAO,KAAK,CAAC,WAAW,CAAC,iBAAiB,CACxC,KAAK,CAAC,SAAS,CAAC,oBAAoB,EACpC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,CACpC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,KAA0B;IAC9D,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IACjD,yCAAyC;IACzC,uCAAuC;IACvC,IAAI,CAAC;QACH,WAAW,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IACD,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACxG,MAAM,KAAK,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAE1D,6DAA6D;IAC7D,8DAA8D;IAC9D,2DAA2D;IAC3D,wCAAwC;IACxC,gDAAgD;IAChD,mCAAmC;IACnC,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,UAAU,KAAK,mBAAmB;QACpC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,YAAY;QACxC,CAAC,CAAC,WAA8C,EAAE,IAAI,KAAK,SAAS,CAAC,gBAAgB;QACrF,CAAC,CAAC,WAA6C,EAAE,GAAG,KAAK,SAAS,CAAC,eAAe,CACtF,CAAC;IACF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,gBAAgB,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC;IAC7F,CAAC;IAED,mEAAmE;IACnE,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACxF,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC9E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IACzF,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,SAAS,CAAC,oBAAoB,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,CAC/F,CAAC;QACF,MAAM,SAAS,GAAG,QAAQ,EAAE,UAAU,IAAI,SAAS,CAAC;QACpD,mDAAmD;QACnD,2CAA2C;QAC3C,oDAAoD;QACpD,2DAA2D;QAC3D,2CAA2C;QAC3C,0BAA0B;QAC1B,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,mBAAmB,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,CAC1E,CAAC;QACF,IAAI,CAAC,eAAe,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAChD,MAAM,CAAC,mBAAmB,CAAC;gBACzB,IAAI,EAAE,mBAAmB;gBACzB,SAAS;gBACT,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,eAAe,EAAE;gBACrD,WAAW,EAAE,GAAG,EAAE;aACnB,CAAC,CAAC;YACH,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAChD,oDAAoD;QACpD,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,4BAA4B;gBAClC,SAAS;gBACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,mBAAmB,EAAE;gBAClE,WAAW,EAAE,GAAG,EAAE;aACnB,CAAC,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACpF,CAAC;QACD,4BAA4B,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAC/D,MAAM,CAAC,oBAAoB,CAAC;YAC1B,IAAI,EAAE,yBAAyB;YAC/B,SAAS;YACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,WAAW,EAAE,GAAG,EAAE;SACnB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,8BAA8B,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IAClF,CAAC;IAED,sEAAsE;IACtE,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,cAAc,KAAK,SAAS,CAAC,cAAc,EAAE,CAAC;QAC/G,OAAO,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,eAAe,GAAG,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,eAAe,KAAK,SAAS,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,uCAAuC,CAAC,CAAC;IAC/E,CAAC;IACD,iDAAiD;IACjD,sDAAsD;IACtD,qBAAqB;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;QAChF,MAAM,CAAC,oBAAoB,CAAC;YAC1B,IAAI,EAAE,2BAA2B;YACjC,SAAS;YACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,QAA4B,CAAC;IACjC,sDAAsD;IACtD,qCAAqC;IACrC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,oBAAoB,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC9D,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2CAA2C;YAC3C,wCAAwC;YACxC,0CAA0C;YAC1C,+CAA+C;YAC/C,IAAI,GAAG,YAAY,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAClE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YACvD,CAAC;YACD,OAAO,KAAK,CACV,KAAK,EACL,SAAS,EACT,GAAG,EACH,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;IACrE,CAAC;IAED,kEAAkE;IAClE,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,IAAI,GAA+C;QACvD,UAAU,EAAE,SAAS;QACrB,mBAAmB,EAAE,SAAS,CAAC,oBAAoB;QACnD,uBAAuB,EAAE,SAAS,CAAC,gBAAgB;QACnD,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,cAAc,EAAE,SAAS,CAAC,cAAc;QACxC,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,qBAAqB,EAAE,SAAS,CAAC,qBAAqB;QACtD,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,UAAU,EAAE,GAAG,EAAE;QACjB,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,oBAAoB,EAAE,SAAS,CAAC,oBAAoB;QACpD,aAAa,EAAE,KAAK;QACpB,kBAAkB,EAAE,KAAK;QACzB,kBAAkB,EAAE,KAAK;KAC1B,CAAC;IACF,MAAM,OAAO,GAAuB;QAClC,GAAG,IAAI;QACP,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAAC;KAC3C,CAAC;IAEF,gDAAgD;IAChD,8DAA8D;IAC9D,qCAAqC;IACrC,yBAAyB;IACzB,MAAM,oBAAoB,GAA4B;QACpD,IAAI,EAAE,SAAS,CAAC,gBAAgB;QAChC,GAAG,EAAE,SAAS,CAAC,eAAe;QAC9B,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;IACF,wBAAwB,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;IAE9D,MAAM,CAAC,oBAAoB,CAAC;QAC1B,IAAI,EAAE,4BAA4B;QAClC,SAAS;QACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,SAAS;QACrB,WAAW,EAAE,GAAG,EAAE;KACnB,CAAC,CAAC;IACH,MAAM,CAAC,mBAAmB,CAAC;QACzB,IAAI,EAAE,mBAAmB;QACzB,SAAS;QACT,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,EAAE,SAAS,EAAE,QAAQ,IAAI,SAAS,CAAC,eAAe,EAAE;QACjE,WAAW,EAAE,GAAG,EAAE;KACnB,CAAC,CAAC;IACH,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,EAAE,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAE1F,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACpG,CAAC;AAED,mCAAmC;AACnC,SAAS,KAAK,CACZ,KAA0B,EAC1B,SAA2B,EAC3B,GAAiB,EACjB,MAAc;IAEd,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAChC,IAAI,EAAE,yBAAyB;QAC/B,SAAS;QACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,EAAE,MAAM,EAAE;QACpB,WAAW,EAAE,GAAG,EAAE;KACnB,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,gBAAgB,CAAC,YAAqB;IACpD,OAAO,CAAC,GAAW,EAAE,EAAE,CACrB,8BAA8B,CAAC,GAAG,EAAE;QAClC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACP,CAAC"}