@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,130 @@
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 { trustLevelRank } from "../trust/identity/index.js";
17
+ export const DISCLOSURE_TIERS = ["anonymous", "detailed"];
18
+ /** §29 NetworkDisclosurePolicy 控制的属性清单。 */
19
+ export const DISCLOSURE_ATTRIBUTES = [
20
+ "location_precision",
21
+ "organization_identity",
22
+ "buyer_urgency",
23
+ "contact_information",
24
+ "purchase_quantity",
25
+ "budget_hints",
26
+ "customer_segment",
27
+ "historical_preferences",
28
+ ];
29
+ /** 默认披露档位:仅允许采购数量(round 2 精确数量)。预算/急迫度/身份等默认私有(§4.4)。 */
30
+ export const DEFAULT_DISCLOSURE_PROFILE = {
31
+ allowed_attributes: ["purchase_quantity"],
32
+ };
33
+ /** 默认部署策略:推荐 progressive disclosure(§30),最多 5 家、最低 T1。 */
34
+ export const DEFAULT_FANOUT_POLICY = {
35
+ max_recipients: 5,
36
+ minimum_trust: "T1",
37
+ disclosure_profile: DEFAULT_DISCLOSURE_PROFILE,
38
+ anonymous_first_round: true,
39
+ };
40
+ /** 取更严格(更高 rank)的信任要求:T3 比 T0 更严格。通用工具,供策略组合使用。 */
41
+ export function stricterTrust(a, b) {
42
+ return trustLevelRank(a) >= trustLevelRank(b) ? a : b;
43
+ }
44
+ /** 命中敏感品类规则(大小写不敏感子串匹配;缺省 rule 匹配任意品类)。 */
45
+ export function matchingCategorySensitivity(policy, category) {
46
+ if (policy.category_sensitivity === undefined)
47
+ return undefined;
48
+ const cat = category?.toLowerCase();
49
+ return policy.category_sensitivity.find((rule) => {
50
+ if (rule.category === undefined)
51
+ return true;
52
+ if (cat === undefined)
53
+ return false;
54
+ return cat.includes(rule.category.toLowerCase());
55
+ });
56
+ }
57
+ function tierFor(level, round, anonymousFirstRound, sensitive) {
58
+ if (round === 1) {
59
+ return anonymousFirstRound ? "anonymous" : "detailed";
60
+ }
61
+ // round 2:敏感品类且对端信任不足 → 披露门槛提升,只能拿匿名档。
62
+ if (sensitive?.minimum_trust !== undefined &&
63
+ trustLevelRank(level) < trustLevelRank(sensitive.minimum_trust)) {
64
+ return "anonymous";
65
+ }
66
+ return "detailed";
67
+ }
68
+ /**
69
+ * Fan-out 确定性判定(§30)。纯函数、无模型参与、无 I/O。
70
+ *
71
+ * 管线:解析信任 → 过滤(rejected / below_minimum_trust,按 base minimum_trust)
72
+ * → 确定性排序 → 截断(max_recipients)→ 按 round + 敏感性定每档 tier。
73
+ */
74
+ export function judgeFanout(policy, input) {
75
+ const { profiles, trust = {}, category, round } = input;
76
+ const sensitive = matchingCategorySensitivity(policy, category);
77
+ // Eligibility 只按 base minimum_trust 过滤;category_sensitivity 只提升披露门槛
78
+ // (tier),不改变谁能收 RFQ。
79
+ const minTrust = policy.minimum_trust;
80
+ const eligible = [];
81
+ const excluded = [];
82
+ for (const profile of profiles) {
83
+ const signal = trust[profile.identity];
84
+ // §30:record 缺失按 T0;rejected 直接排除(fail-closed)。
85
+ const level = signal?.level ?? "T0";
86
+ const rejected = signal?.rejected === true;
87
+ if (rejected) {
88
+ excluded.push({ identity: profile.identity, reason: "rejected", trust_level: level });
89
+ continue;
90
+ }
91
+ if (trustLevelRank(level) < trustLevelRank(minTrust)) {
92
+ excluded.push({
93
+ identity: profile.identity,
94
+ reason: "below_minimum_trust",
95
+ trust_level: level,
96
+ });
97
+ continue;
98
+ }
99
+ eligible.push({ identity: profile.identity, profile, level });
100
+ }
101
+ // 确定性排序:trust 降序(高信任优先)→ identity 升序(稳定 tie-break)。
102
+ eligible.sort((a, b) => {
103
+ const rankDelta = trustLevelRank(b.level) - trustLevelRank(a.level);
104
+ if (rankDelta !== 0)
105
+ return rankDelta;
106
+ return a.identity < b.identity ? -1 : a.identity > b.identity ? 1 : 0;
107
+ });
108
+ const max = policy.max_recipients !== undefined && policy.max_recipients > 0
109
+ ? policy.max_recipients
110
+ : Number.POSITIVE_INFINITY;
111
+ const chosen = eligible.slice(0, max);
112
+ for (const t of eligible.slice(max)) {
113
+ excluded.push({ identity: t.identity, reason: "truncated", trust_level: t.level });
114
+ }
115
+ const anonymousFirstRound = policy.anonymous_first_round === true || sensitive?.anonymous_first_round === true;
116
+ const recipients = chosen.map((c) => ({
117
+ identity: c.identity,
118
+ profile: c.profile,
119
+ trust_level: c.level,
120
+ tier: tierFor(c.level, round, anonymousFirstRound, sensitive),
121
+ }));
122
+ return {
123
+ round,
124
+ recipients,
125
+ excluded,
126
+ eligible_count: eligible.length,
127
+ category_sensitive: sensitive !== undefined,
128
+ };
129
+ }
130
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/fanout/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
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 — AcpCommerceAdapter 接缝(WP3)。
18
+ *
19
+ * 面向 Agentic Commerce Protocol(ACP-Commerce)checkout 生态的 HandoffChannel
20
+ * 适配占位。基线 §43:ACP-Commerce 属 v0.7.0+ Transaction Handoff,不绑定唯一实现;
21
+ * 本模块只钉住接缝形状,未来真实 ACP adapter 在同样位置替换内部实现。
22
+ *
23
+ * fail-closed 语义:
24
+ * - 未配置真实 ACP-Commerce 服务时,所有操作一律返回 fail_closed;
25
+ * - 绝不静默降级到 UCP 或其他通道(reason 明确标注 acp_commerce_not_configured);
26
+ * - 不创建订单、不处理支付凭据。
27
+ *
28
+ * 接口形状与 HandoffChannel 对齐(同一组操作、同一 HandoffResult 判别),未来
29
+ * 实现替换内部而不破坏调用方;若未来 ACP 需要异步投影,遵循 UcpCheckoutChannel
30
+ * 先例(AsyncHandoffChannel,status 判别不变)。
31
+ */
32
+ import type { PaymentAuthorization } from "./authorization.js";
33
+ import type { HandoffChannel, HandoffResult } from "./channel.js";
34
+ import type { HandoffPackage } from "./package.js";
35
+ import type { TermSet } from "../negotiation/domain/common.js";
36
+ /** ACP-Commerce 接缝当前状态(占位阶段恒为 unconfigured)。 */
37
+ export declare const ACP_COMMERCE_ADAPTER_STATUS: readonly ["unconfigured"];
38
+ export type AcpCommerceAdapterStatus = (typeof ACP_COMMERCE_ADAPTER_STATUS)[number];
39
+ /**
40
+ * 未来:ACP-Commerce checkout service endpoint / profile 配置。当前占位阶段无
41
+ * 配置字段(Record<string, never> 阻止任意值混入)。
42
+ */
43
+ export type AcpCommerceAdapterOptions = Record<string, never>;
44
+ /**
45
+ * ACP-Commerce 适配占位。实现 HandoffChannel 的全部操作,但未配置时一律
46
+ * fail-closed。`configured` 恒为 false —— 调用方可用它显式分支,而不是隐式降级。
47
+ */
48
+ export declare class AcpCommerceAdapter implements HandoffChannel {
49
+ constructor(_options?: AcpCommerceAdapterOptions);
50
+ /** 当前是否已配置真实 ACP-Commerce 服务(占位阶段恒为 false)。 */
51
+ get configured(): boolean;
52
+ get status(): AcpCommerceAdapterStatus;
53
+ createSession(pkg: HandoffPackage): HandoffResult;
54
+ getSession(ref: string): HandoffResult;
55
+ updateSession(ref: string, _terms: TermSet): HandoffResult;
56
+ requestCompletion(ref: string, _authorization: PaymentAuthorization): HandoffResult;
57
+ cancelSession(ref: string): HandoffResult;
58
+ }
@@ -0,0 +1,69 @@
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 { verifyHandoffPackageDigest } from "./package.js";
17
+ /** ACP-Commerce 接缝当前状态(占位阶段恒为 unconfigured)。 */
18
+ export const ACP_COMMERCE_ADAPTER_STATUS = ["unconfigured"];
19
+ const NOT_CONFIGURED_REASON = "acp_commerce_not_configured: no Agentic Commerce Protocol checkout service is configured; " +
20
+ "refusing to route to UCP or any other channel (fail closed)";
21
+ const SESSION_NOT_CONFIGURED = "acp_commerce_not_configured: no checkout session can exist";
22
+ /**
23
+ * ACP-Commerce 适配占位。实现 HandoffChannel 的全部操作,但未配置时一律
24
+ * fail-closed。`configured` 恒为 false —— 调用方可用它显式分支,而不是隐式降级。
25
+ */
26
+ export class AcpCommerceAdapter {
27
+ constructor(_options = {}) {
28
+ // 占位阶段无配置字段;未来真实 ACP adapter 在此接收 endpoint/profile。
29
+ }
30
+ /** 当前是否已配置真实 ACP-Commerce 服务(占位阶段恒为 false)。 */
31
+ get configured() {
32
+ return false;
33
+ }
34
+ get status() {
35
+ return "unconfigured";
36
+ }
37
+ createSession(pkg) {
38
+ // 即使未配置也先做工件形状校验,fail-closed 信息更精确;但绝不创建 session。
39
+ if (!verifyHandoffPackageDigest(pkg)) {
40
+ return { status: "fail_closed", reason: "createSession rejected: invalid handoff package" };
41
+ }
42
+ return { status: "fail_closed", reason: NOT_CONFIGURED_REASON };
43
+ }
44
+ getSession(ref) {
45
+ return {
46
+ status: "fail_closed",
47
+ reason: `${SESSION_NOT_CONFIGURED}: ${ref}`,
48
+ };
49
+ }
50
+ updateSession(ref, _terms) {
51
+ return {
52
+ status: "fail_closed",
53
+ reason: `${SESSION_NOT_CONFIGURED}: ${ref}`,
54
+ };
55
+ }
56
+ requestCompletion(ref, _authorization) {
57
+ return {
58
+ status: "fail_closed",
59
+ reason: `${NOT_CONFIGURED_REASON}; cannot complete checkout session ${ref}`,
60
+ };
61
+ }
62
+ cancelSession(ref) {
63
+ return {
64
+ status: "fail_closed",
65
+ reason: `${SESSION_NOT_CONFIGURED}: ${ref}`,
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=acp-commerce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-commerce.js","sourceRoot":"","sources":["../../src/handoff/acp-commerce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsBH,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAG1D,gDAAgD;AAChD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,cAAc,CAAU,CAAC;AASrE,MAAM,qBAAqB,GACzB,4FAA4F;IAC5F,6DAA6D,CAAC;AAEhE,MAAM,sBAAsB,GAAG,4DAA4D,CAAC;AAE5F;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAC7B,YAAY,WAAsC,EAAE;QAClD,oDAAoD;IACtD,CAAC;IAED,+CAA+C;IAC/C,IAAI,UAAU;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM;QACR,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,aAAa,CAAC,GAAmB;QAC/B,kDAAkD;QAClD,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,iDAAiD,EAAE,CAAC;QAC9F,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAClE,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,sBAAsB,KAAK,GAAG,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,GAAW,EAAE,MAAe;QACxC,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,sBAAsB,KAAK,GAAG,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,GAAW,EAAE,cAAoC;QACjE,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,qBAAqB,sCAAsC,GAAG,EAAE;SAC5E,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,sBAAsB,KAAK,GAAG,EAAE;SAC5C,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,127 @@
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 { TermSet } from "../negotiation/domain/common.js";
17
+ /** 用户显式授权确认的证据来源。 */
18
+ export declare const CONFIRMATION_EVIDENCE_KINDS: readonly ["manual", "ap2"];
19
+ export type ConfirmationEvidenceKind = (typeof CONFIRMATION_EVIDENCE_KINDS)[number];
20
+ /** 用户显式授权确认的证据:authorization 必须绑定它。 */
21
+ export interface UserConfirmationEvidence {
22
+ /** manual=操作者审批;ap2=真实 AP2 返回的确认回执。 */
23
+ kind: ConfirmationEvidenceKind;
24
+ /** 证据引用(如审批单号 / AP2 confirmation id),opaque。 */
25
+ reference: string;
26
+ /** 用户确认发生时间,RFC 3339。 */
27
+ confirmed_at: string;
28
+ }
29
+ export interface UserConfirmationEvidenceInput {
30
+ kind: ConfirmationEvidenceKind;
31
+ reference: string;
32
+ confirmed_at?: string;
33
+ }
34
+ /** 构造并校验用户确认证据(confirmed_at 缺省用 now)。 */
35
+ export declare function createUserConfirmationEvidence(input: UserConfirmationEvidenceInput, now?: () => string): UserConfirmationEvidence;
36
+ /**
37
+ * 完成门禁输入的唯一授权对象。三个绑定缺一不可:
38
+ * session_ref —— 授权只对这一个 session 有效(换 session 即失效);
39
+ * terms_digest —— 授权只对这一个 terms 内容有效(换 terms 即失效);
40
+ * evidence —— 用户显式确认证据(无人确认即不是授权)。
41
+ * intent_mandate 是 AP2 侧 mandate 引用;authorizeCheckout 前必须经 provider
42
+ * verifyIntentMandate 复核。
43
+ */
44
+ export interface PaymentAuthorization {
45
+ authorization_id: string;
46
+ session_ref: string;
47
+ terms_digest: string;
48
+ intent_mandate: string;
49
+ evidence: UserConfirmationEvidence;
50
+ approved_at: string;
51
+ /** 授权有效期终点:过期即 stale(完成门禁第 3 步)。 */
52
+ expires_at: string;
53
+ }
54
+ export interface PaymentAuthorizationInput {
55
+ authorization_id: string;
56
+ session_ref: string;
57
+ terms_digest: string;
58
+ intent_mandate: string;
59
+ evidence: UserConfirmationEvidence;
60
+ approved_at?: string;
61
+ expires_at?: string;
62
+ /** 缺省有效期长度(毫秒);缺省 30 分钟。 */
63
+ ttl_ms?: number;
64
+ }
65
+ /** 新授权 id:`authz_<uuidv7>`。 */
66
+ export declare function newAuthorizationId(): string;
67
+ /** 构造并校验 PaymentAuthorization。缺省 approved_at=now、expires_at=now+ttl_ms。 */
68
+ export declare function createPaymentAuthorization(input: PaymentAuthorizationInput, now?: () => string): PaymentAuthorization;
69
+ export interface CreateIntentMandateInput {
70
+ session_ref: string;
71
+ terms_digest: string;
72
+ terms: TermSet;
73
+ }
74
+ export type CreateIntentMandateResult = {
75
+ status: "ok";
76
+ intent_mandate: string;
77
+ } | {
78
+ status: "fail_closed";
79
+ reason: string;
80
+ } | {
81
+ status: "requires_user";
82
+ continue_url?: string;
83
+ reason: string;
84
+ };
85
+ export interface VerifyIntentMandateInput {
86
+ session_ref: string;
87
+ terms_digest: string;
88
+ }
89
+ export interface VerifyIntentMandateResult {
90
+ verified: boolean;
91
+ reason?: string;
92
+ }
93
+ export interface AuthorizeCheckoutInput {
94
+ session_ref: string;
95
+ terms_digest: string;
96
+ intent_mandate: string;
97
+ evidence: UserConfirmationEvidence;
98
+ }
99
+ export type AuthorizeCheckoutResult = {
100
+ status: "ok";
101
+ authorization: PaymentAuthorization;
102
+ } | {
103
+ status: "fail_closed";
104
+ reason: string;
105
+ };
106
+ /**
107
+ * AP2 适配接缝(基线 §43 / docs §29)。实现方 = 外部支付/checkout 系统适配器;
108
+ * Kiwi 侧只消费结构化结果,绝不伪造授权。
109
+ */
110
+ export interface AuthorizationProvider {
111
+ createIntentMandate(input: CreateIntentMandateInput): CreateIntentMandateResult;
112
+ verifyIntentMandate(intent_mandate: string, input: VerifyIntentMandateInput): VerifyIntentMandateResult;
113
+ authorizeCheckout(input: AuthorizeCheckoutInput): AuthorizeCheckoutResult;
114
+ }
115
+ /**
116
+ * fail-closed 默认实现。任何真实授权动作都拒绝:
117
+ * createIntentMandate → requires_user(无 AP2 时只有人能继续,绝不伪造 mandate);
118
+ * verifyIntentMandate → verified:false;
119
+ * authorizeCheckout → fail_closed。
120
+ */
121
+ export declare class FailClosedAuthorizationProvider implements AuthorizationProvider {
122
+ createIntentMandate(_input: CreateIntentMandateInput): CreateIntentMandateResult;
123
+ verifyIntentMandate(_intent_mandate: string, _input: VerifyIntentMandateInput): VerifyIntentMandateResult;
124
+ authorizeCheckout(_input: AuthorizeCheckoutInput): AuthorizeCheckoutResult;
125
+ }
126
+ /** terms 的 digest 便捷函数(构造 Authorization 时用)。 */
127
+ export declare function digestTerms(terms: TermSet): string;
@@ -0,0 +1,107 @@
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 — AuthorizationProvider(AP2 边界,WP1)。
18
+ *
19
+ * 基线 §43 / docs/kiwi_a2a_v1.md §29 预留给 AuthorizationProvider 的 AP2 接缝:
20
+ * Kiwi 不实现真实 AP2(外部系统),只定义适配边界,并提供一个 fail-closed 默认
21
+ * 实现(FailClosedAuthorizationProvider)——未配置真实 AP2 时:
22
+ * - createIntentMandate → requires_user(把人导向外部 checkout,绝不伪造 mandate);
23
+ * - verifyIntentMandate → verified:false(绝不认可任何 mandate);
24
+ * - authorizeCheckout → fail_closed(绝不伪造 checkout 授权)。
25
+ *
26
+ * PaymentAuthorization 必须绑定 terms_digest + session_ref + 用户确认证据,
27
+ * 防止「授权被挪用到别的 terms / 别的 session」。完成门禁(completion.ts)在
28
+ * complete 前复核这三个绑定。
29
+ */
30
+ import { requireDigest, requireIsoTimestamp, requireNonEmptyString, } from "../negotiation/domain/common.js";
31
+ import { uuidv7, validateIdentifier } from "../negotiation/domain/identifiers.js";
32
+ import { contentDigest } from "../negotiation/jcs.js";
33
+ import { HandoffError } from "./errors.js";
34
+ // ---------------------------------------------------------------------------
35
+ // 用户确认证据
36
+ // ---------------------------------------------------------------------------
37
+ /** 用户显式授权确认的证据来源。 */
38
+ export const CONFIRMATION_EVIDENCE_KINDS = ["manual", "ap2"];
39
+ /** 构造并校验用户确认证据(confirmed_at 缺省用 now)。 */
40
+ export function createUserConfirmationEvidence(input, now = () => new Date().toISOString()) {
41
+ if (!CONFIRMATION_EVIDENCE_KINDS.includes(input.kind)) {
42
+ throw new HandoffError("invalid_authorization", `evidence.kind must be one of ${CONFIRMATION_EVIDENCE_KINDS.join("|")}`, "evidence.kind");
43
+ }
44
+ const evidence = {
45
+ kind: input.kind,
46
+ reference: requireNonEmptyString(input.reference, "evidence.reference"),
47
+ confirmed_at: input.confirmed_at ?? now(),
48
+ };
49
+ requireIsoTimestamp(evidence.confirmed_at, "evidence.confirmed_at");
50
+ return evidence;
51
+ }
52
+ /** 新授权 id:`authz_<uuidv7>`。 */
53
+ export function newAuthorizationId() {
54
+ return `authz_${uuidv7()}`;
55
+ }
56
+ /** 构造并校验 PaymentAuthorization。缺省 approved_at=now、expires_at=now+ttl_ms。 */
57
+ export function createPaymentAuthorization(input, now = () => new Date().toISOString()) {
58
+ const approvedAt = input.approved_at ?? now();
59
+ requireIsoTimestamp(approvedAt, "approved_at");
60
+ const ttlMs = input.ttl_ms ?? 30 * 60 * 1000;
61
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
62
+ throw new HandoffError("invalid_authorization", "ttl_ms must be a positive number", "ttl_ms");
63
+ }
64
+ const expiresAt = input.expires_at ?? new Date(new Date(approvedAt).getTime() + ttlMs).toISOString();
65
+ requireIsoTimestamp(expiresAt, "expires_at");
66
+ const authorization = {
67
+ authorization_id: validateIdentifier(input.authorization_id, "authorization_id"),
68
+ session_ref: validateIdentifier(input.session_ref, "session_ref"),
69
+ terms_digest: requireDigest(input.terms_digest, "terms_digest"),
70
+ intent_mandate: requireNonEmptyString(input.intent_mandate, "intent_mandate"),
71
+ evidence: input.evidence,
72
+ approved_at: approvedAt,
73
+ expires_at: expiresAt,
74
+ };
75
+ requireIsoTimestamp(authorization.evidence.confirmed_at, "evidence.confirmed_at");
76
+ // 数值比较(非字符串):RFC 3339 允许带时区偏移,字符串比较跨时区会
77
+ // fail-open(如 confirmed_at 带 -08:00 偏移时事后补签可通过)。NaN 视为非法。
78
+ const confirmedMs = Date.parse(authorization.evidence.confirmed_at);
79
+ const approvedMs = Date.parse(authorization.approved_at);
80
+ if (!Number.isFinite(confirmedMs) || !Number.isFinite(approvedMs) || confirmedMs > approvedMs) {
81
+ throw new HandoffError("invalid_authorization", "evidence.confirmed_at MUST NOT be after approved_at (evidence must precede approval)", "evidence.confirmed_at");
82
+ }
83
+ return authorization;
84
+ }
85
+ const NO_AP2_REASON = "no_ap2_configured: Kiwi is not configured with a real AP2/checkout provider; refusing to fabricate any authorization";
86
+ /**
87
+ * fail-closed 默认实现。任何真实授权动作都拒绝:
88
+ * createIntentMandate → requires_user(无 AP2 时只有人能继续,绝不伪造 mandate);
89
+ * verifyIntentMandate → verified:false;
90
+ * authorizeCheckout → fail_closed。
91
+ */
92
+ export class FailClosedAuthorizationProvider {
93
+ createIntentMandate(_input) {
94
+ return { status: "requires_user", reason: NO_AP2_REASON };
95
+ }
96
+ verifyIntentMandate(_intent_mandate, _input) {
97
+ return { verified: false, reason: NO_AP2_REASON };
98
+ }
99
+ authorizeCheckout(_input) {
100
+ return { status: "fail_closed", reason: NO_AP2_REASON };
101
+ }
102
+ }
103
+ /** terms 的 digest 便捷函数(构造 Authorization 时用)。 */
104
+ export function digestTerms(terms) {
105
+ return contentDigest(terms);
106
+ }
107
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.js","sourceRoot":"","sources":["../../src/handoff/authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
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 DestinationType } from "./destination.js";
17
+ /** 展示摘要(KTH §6 display_summary;完成定义 #17 用户可见目标与摘要)。 */
18
+ export interface HandoffDisplaySummary {
19
+ readonly merchant: string;
20
+ readonly summary: string;
21
+ }
22
+ /**
23
+ * HandoffCandidate(KTH rev0.3 §5)。全部字段 readonly —— 类型层面不可变。
24
+ */
25
+ export interface HandoffCandidate {
26
+ readonly handoff_candidate_id: string;
27
+ /** 被本候选取代的旧候选(stale 后新建候选的审计链接,§5.1)。 */
28
+ readonly supersedes_candidate_id?: string;
29
+ readonly agreement_id: string;
30
+ readonly negotiation_id: string;
31
+ readonly terms_digest: string;
32
+ readonly buyer_identity_ref: string;
33
+ readonly merchant_identity_ref: string;
34
+ readonly destination_type: DestinationType;
35
+ readonly destination_ref: string;
36
+ /** 最小化、schema-validated、非秘密目的地载荷(KTH §11.3)。 */
37
+ readonly destination_payload?: Readonly<Record<string, unknown>>;
38
+ readonly display_summary: HandoffDisplaySummary;
39
+ readonly policy_version: string;
40
+ readonly expires_at: string;
41
+ readonly requires_user_action: boolean;
42
+ /** KTH/1.0 三副作用不变量:恒为 false(§16 Agreement 约束)。 */
43
+ readonly creates_order: false;
44
+ readonly authorizes_payment: false;
45
+ readonly reserves_inventory: false;
46
+ readonly candidate_digest: string;
47
+ readonly created_at: string;
48
+ }
49
+ /** 创建输入:agreement 溯源 + 目的地 + 策略元数据。 */
50
+ export interface HandoffCandidateInput {
51
+ /** 产生本候选的 agreement 的 id。 */
52
+ agreement_id: string;
53
+ /** 产生本候选的 negotiation 的 id。 */
54
+ negotiation_id: string;
55
+ /** 已谈妥的条款对象(用于重算 terms_digest;缺省用 terms_digest 原值)。 */
56
+ agreed_terms?: unknown;
57
+ /** 期望的 terms_digest;与 agreed_terms 重算值不一致 → 校验失败。 */
58
+ terms_digest?: string;
59
+ buyer_identity_ref?: string;
60
+ merchant_identity_ref?: string;
61
+ destination: {
62
+ type: DestinationType;
63
+ ref: string;
64
+ payload?: Record<string, unknown>;
65
+ };
66
+ display_summary: HandoffDisplaySummary;
67
+ policy_version: string;
68
+ /** RFC 3339 过期时间(KTH §10 重验的一部分)。 */
69
+ expires_at: string;
70
+ requires_user_action?: boolean;
71
+ /** 取代的旧候选 id(stale 审计链接)。 */
72
+ supersedes_candidate_id?: string;
73
+ created_at?: string;
74
+ }
75
+ /** 类型守卫。 */
76
+ export declare function isHandoffCandidate(value: unknown): value is HandoffCandidate;
77
+ /** 计算 candidate_digest:candidate 去除 candidate_digest 后 JCS+SHA-256。 */
78
+ export declare function computeCandidateDigest(candidate: Readonly<HandoffCandidate>): string;
79
+ /** 校验 candidate_digest 与内容自洽。 */
80
+ export declare function verifyHandoffCandidateDigest(candidate: HandoffCandidate): boolean;
81
+ /**
82
+ * 构造即校验(KTH §5):agreement 绑定、terms_digest 一致性(提供
83
+ * agreed_terms 时重算比对)、destination 校验、三 false 不变量、标识符
84
+ * 与时间戳校验。返回不可变候选(防御拷贝)。
85
+ */
86
+ export declare function createHandoffCandidate(input: HandoffCandidateInput): HandoffCandidate;
87
+ /**
88
+ * 校验并重建一个候选对象(Ledger 事件重建,§18-13)。
89
+ *
90
+ * 保留输入的 handoff_candidate_id 与 candidate_digest(不重新生成):
91
+ * 字段校验复用 createHandoffCandidate 的规则,然后以输入 id 覆盖,
92
+ * 再核对 digest(提供 digest 时)或按内容重算(缺省时)。
93
+ */
94
+ export declare function validateHandoffCandidate(value: unknown, path?: string): HandoffCandidate;