@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,287 @@
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 — OperatorApprovalAuthorizationProvider(WP3)。
18
+ *
19
+ * 把 operator 审批证据桥接为 AuthorizationProvider(AP2 边界)。用户/操作员在
20
+ * 审批面(approval face)上看到 HandoffPackage + checkout session 摘要后显式
21
+ * 确认(recordApproval);此后 createIntentMandate / authorizeCheckout 才能产出
22
+ * 绑定 terms_digest + session_ref + evidence 的 PaymentAuthorization。
23
+ *
24
+ * 与 WriteApprovalCandidate 生命周期对齐(基线 §19 Approval 绑定语义):
25
+ * - approval stale(expired / revoked / 底层 candidate 被 superseded / rejected)
26
+ * 即授权失效——verifyIntentMandate 返回 verified:false;
27
+ * - 未确认 / 超时 → createIntentMandate 返回 requires_user,绝不自动授权;
28
+ * - §19 绑定 candidate_digest / remote_revision / policy_version 固化在审批记录里;
29
+ * remote_revision 变化(currentRevision 回调核对)即 stale。
30
+ *
31
+ * 本模块不创建订单、不处理支付凭据;它只把「人确认过这个 package + session」这一
32
+ * 事实安全地变成完成门禁可验证的授权。
33
+ */
34
+ import { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, } from "node:fs";
35
+ import path from "node:path";
36
+ import { requireDigest, requireIsoTimestamp, requireNonEmptyString, } from "../negotiation/domain/common.js";
37
+ import { validateIdentifier } from "../negotiation/domain/identifiers.js";
38
+ import { contentDigest } from "../negotiation/jcs.js";
39
+ import { createPaymentAuthorization, createUserConfirmationEvidence, newAuthorizationId, } from "./authorization.js";
40
+ import { HandoffError } from "./errors.js";
41
+ // ---------------------------------------------------------------------------
42
+ // 审批记录与状态
43
+ // ---------------------------------------------------------------------------
44
+ /** 审批记录自身状态(撤销是显式的;过期是时间派生的)。 */
45
+ export const OPERATOR_APPROVAL_RECORD_STATUSES = ["approved", "revoked"];
46
+ /** 底层候选生命周期状态(WriteApprovalCandidate status,write-gate 适配)。 */
47
+ export const OPERATOR_APPROVAL_SOURCE_STATUSES = [
48
+ "pending_approval",
49
+ "approved",
50
+ "executed",
51
+ "rejected",
52
+ "superseded",
53
+ "expired",
54
+ ];
55
+ /** 从 HandoffSession 构造审批面摘要;缺省 remote_revision 用 session.updated_at。 */
56
+ export function summarizeCheckoutSession(session, remoteRevision) {
57
+ return {
58
+ session_ref: session.session_ref,
59
+ current_terms_digest: session.current_terms_digest,
60
+ remote_revision: remoteRevision ?? session.updated_at,
61
+ status: session.status,
62
+ };
63
+ }
64
+ /** HandoffPackage 的紧凑身份摘要(审批面确认的对象)。 */
65
+ export function digestHandoffPackage(pkg) {
66
+ return contentDigest({
67
+ agreement_id: pkg.agreement_id,
68
+ negotiation_id: pkg.negotiation_id,
69
+ accepted_offer_id: pkg.accepted_offer_id,
70
+ terms_digest: pkg.terms_digest,
71
+ package_version: pkg.package_version,
72
+ capability_version: pkg.capability_version,
73
+ });
74
+ }
75
+ /** 缺省审批窗口:对齐 createPaymentAuthorization 的授权 TTL(30 分钟)。 */
76
+ export const OPERATOR_APPROVAL_TTL_MS = 30 * 60 * 1000;
77
+ const NOT_CONFIRMED_REASON = "operator approval required: no confirmed approval for this session/terms (explicit user confirmation is mandatory; Kiwi never auto-authorizes)";
78
+ function isUsableSourceStatus(status) {
79
+ return status === "approved" || status === "executed";
80
+ }
81
+ /**
82
+ * 把 operator 审批证据桥接为 AuthorizationProvider:
83
+ * - recordApproval 记录「人在审批面确认 HandoffPackage + session 摘要」;
84
+ * - createIntentMandate:有有效审批 → ok(intent_mandate=approval_id);
85
+ * 未确认 / 超时 / 被吊销 → requires_user(绝不自动授权);
86
+ * - verifyIntentMandate:审批 stale / 吊销 / 绑定变化 → verified:false;
87
+ * - authorizeCheckout:产出绑定 terms_digest + session_ref + evidence
88
+ * (confirmed_at ≤ approved_at)的 PaymentAuthorization。
89
+ */
90
+ export class OperatorApprovalAuthorizationProvider {
91
+ records = new Map();
92
+ now;
93
+ options;
94
+ journalPath;
95
+ constructor(options = {}) {
96
+ this.now = options.now ?? (() => new Date().toISOString());
97
+ this.options = options;
98
+ if (options.persistDir !== undefined) {
99
+ mkdirSync(options.persistDir, { recursive: true, mode: 0o700 });
100
+ chmodSync(options.persistDir, 0o700);
101
+ this.journalPath = path.join(options.persistDir, "operator-approvals.jsonl");
102
+ this.replayJournal();
103
+ }
104
+ }
105
+ /** 从 JSONL 重放审批事件(同 approval_id 后事件胜出;撕裂行容忍跳过)。 */
106
+ replayJournal() {
107
+ if (this.journalPath === undefined || !existsSync(this.journalPath))
108
+ return;
109
+ const raw = readFileSync(this.journalPath, "utf-8");
110
+ for (const line of raw.split("\n")) {
111
+ if (line.length === 0)
112
+ continue;
113
+ try {
114
+ const event = JSON.parse(line);
115
+ if (event.type === "record" && event.approval?.approval_id !== undefined) {
116
+ this.records.set(event.approval.approval_id, event.approval);
117
+ }
118
+ else if (event.type === "revoke" && typeof event.approval_id === "string") {
119
+ const existing = this.records.get(event.approval_id);
120
+ if (existing !== undefined) {
121
+ this.records.set(event.approval_id, { ...existing, status: "revoked" });
122
+ }
123
+ }
124
+ }
125
+ catch {
126
+ // 撕裂行跳过(审计由事件流本身承载;审批重放容忍最后一行撕裂)。
127
+ }
128
+ }
129
+ }
130
+ /** 追加一条审批事件(单行 append,原子)。 */
131
+ journalAppend(event) {
132
+ if (this.journalPath === undefined)
133
+ return;
134
+ appendFileSync(this.journalPath, `${JSON.stringify(event)}\n`, { mode: 0o600 });
135
+ }
136
+ // -- 审批证据写入(审批面) ------------------------------------------------
137
+ /** 记录一次显式确认。返回固化后的只读审批记录。 */
138
+ recordApproval(input) {
139
+ const now = this.now();
140
+ const confirmedAt = input.confirmed_at ?? now;
141
+ requireIsoTimestamp(confirmedAt, "confirmed_at");
142
+ const ttlMs = input.ttl_ms ?? OPERATOR_APPROVAL_TTL_MS;
143
+ if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
144
+ throw new HandoffError("invalid_authorization", "ttl_ms must be a positive number", "ttl_ms");
145
+ }
146
+ const expiresAt = new Date(Date.parse(confirmedAt) + ttlMs).toISOString();
147
+ requireIsoTimestamp(expiresAt, "expires_at");
148
+ const approval = {
149
+ approval_id: validateIdentifier(input.approval_id, "approval_id"),
150
+ session_ref: validateIdentifier(input.session.session_ref, "session_ref"),
151
+ terms_digest: requireDigest(input.session.current_terms_digest, "terms_digest"),
152
+ package_digest: digestHandoffPackage(input.package),
153
+ candidate_digest: requireDigest(input.candidate_digest, "candidate_digest"),
154
+ remote_revision: requireNonEmptyString(input.session.remote_revision, "remote_revision"),
155
+ policy_version: requireNonEmptyString(input.policy_version, "policy_version"),
156
+ status: "approved",
157
+ confirmed_at: confirmedAt,
158
+ expires_at: expiresAt,
159
+ recorded_at: now,
160
+ };
161
+ this.records.set(approval.approval_id, approval);
162
+ this.journalAppend({ type: "record", approval });
163
+ return approval;
164
+ }
165
+ /** 显式撤销一条审批(对齐 WriteApprovalCandidate.reject/supersede)。 */
166
+ revokeApproval(approvalId) {
167
+ const existing = this.records.get(approvalId);
168
+ if (existing === undefined) {
169
+ throw new HandoffError("invalid_authorization", `no recorded approval ${approvalId}`);
170
+ }
171
+ const revoked = { ...existing, status: "revoked" };
172
+ this.records.set(approvalId, revoked);
173
+ this.journalAppend({ type: "revoke", approval_id: approvalId });
174
+ return revoked;
175
+ }
176
+ /** 只读取回一条审批记录。 */
177
+ getApproval(approvalId) {
178
+ return this.records.get(approvalId);
179
+ }
180
+ /** 当前审批记录数量(诊断用)。 */
181
+ get approvalCount() {
182
+ return this.records.size;
183
+ }
184
+ // -- AuthorizationProvider -------------------------------------------------
185
+ createIntentMandate(input) {
186
+ const approval = this.findUsableApproval(input.session_ref, input.terms_digest);
187
+ if (approval === undefined) {
188
+ return { status: "requires_user", reason: NOT_CONFIRMED_REASON };
189
+ }
190
+ return { status: "ok", intent_mandate: approval.approval_id };
191
+ }
192
+ verifyIntentMandate(intent_mandate, input) {
193
+ const approval = this.records.get(intent_mandate);
194
+ if (approval === undefined) {
195
+ return { verified: false, reason: `unknown approval: ${intent_mandate}` };
196
+ }
197
+ const failure = this.invalidReason(approval, input.session_ref, input.terms_digest);
198
+ if (failure !== undefined)
199
+ return { verified: false, reason: failure };
200
+ return { verified: true };
201
+ }
202
+ authorizeCheckout(input) {
203
+ const approval = this.records.get(input.intent_mandate);
204
+ if (approval === undefined) {
205
+ return { status: "fail_closed", reason: `unknown approval: ${input.intent_mandate}` };
206
+ }
207
+ const failure = this.invalidReason(approval, input.session_ref, input.terms_digest);
208
+ if (failure !== undefined) {
209
+ return { status: "fail_closed", reason: failure };
210
+ }
211
+ // 调用方传入的证据必须引用这条已确认的 operator 审批(防挪用它人证据)。
212
+ if (input.evidence.kind !== "manual" || input.evidence.reference !== approval.approval_id) {
213
+ return {
214
+ status: "fail_closed",
215
+ reason: "evidence does not reference the recorded operator approval",
216
+ };
217
+ }
218
+ const approvedAt = this.now();
219
+ // 数值比较(非字符串):跨时区偏移的 confirmed_at 字符串比较可 fail-open。
220
+ const confirmedMs = Date.parse(approval.confirmed_at);
221
+ const approvedMs = Date.parse(approvedAt);
222
+ if (!Number.isFinite(confirmedMs) || !Number.isFinite(approvedMs) || confirmedMs > approvedMs) {
223
+ return {
224
+ status: "fail_closed",
225
+ reason: "confirmed_at MUST NOT be after approved_at",
226
+ };
227
+ }
228
+ const authorization = createPaymentAuthorization({
229
+ authorization_id: newAuthorizationId(),
230
+ session_ref: approval.session_ref,
231
+ terms_digest: approval.terms_digest,
232
+ intent_mandate: approval.approval_id,
233
+ evidence: createUserConfirmationEvidence({ kind: "manual", reference: approval.approval_id, confirmed_at: approval.confirmed_at }, this.now),
234
+ approved_at: approvedAt,
235
+ expires_at: approval.expires_at,
236
+ }, this.now);
237
+ return { status: "ok", authorization };
238
+ }
239
+ // -- 内部辅助 ---------------------------------------------------------------
240
+ findUsableApproval(sessionRef, termsDigest) {
241
+ for (const approval of this.records.values()) {
242
+ if (approval.session_ref !== sessionRef)
243
+ continue;
244
+ if (approval.terms_digest !== termsDigest)
245
+ continue;
246
+ if (this.invalidReason(approval, sessionRef, termsDigest) === undefined)
247
+ return approval;
248
+ }
249
+ return undefined;
250
+ }
251
+ /** 返回审批不可用的原因;可用时返回 undefined。判定顺序固定,便于审计。 */
252
+ invalidReason(approval, sessionRef, termsDigest) {
253
+ if (approval.status !== "approved")
254
+ return "approval revoked";
255
+ if (approval.session_ref !== sessionRef) {
256
+ return "approval bound to a different session_ref (stale)";
257
+ }
258
+ if (approval.terms_digest !== termsDigest) {
259
+ return "approval bound to different terms_digest (stale)";
260
+ }
261
+ const nowMs = Date.parse(this.now());
262
+ const expiresMs = Date.parse(approval.expires_at);
263
+ if (!Number.isFinite(nowMs) || !Number.isFinite(expiresMs) || nowMs > expiresMs) {
264
+ return "approval expired (stale)";
265
+ }
266
+ if (this.options.currentRevision !== undefined) {
267
+ const current = this.options.currentRevision(sessionRef);
268
+ if (current !== undefined && current !== approval.remote_revision) {
269
+ return "remote revision changed; approval stale";
270
+ }
271
+ }
272
+ if (this.options.statusSource !== undefined) {
273
+ const state = this.options.statusSource.getApprovalState(approval.approval_id);
274
+ if (state === undefined)
275
+ return "underlying candidate unknown; approval not usable";
276
+ if (!isUsableSourceStatus(state.status)) {
277
+ return `underlying candidate status ${state.status}; approval not usable`;
278
+ }
279
+ }
280
+ return undefined;
281
+ }
282
+ }
283
+ /** 从审批记录构造 UserConfirmationEvidence(供上层在调用 authorizeCheckout 前展示)。 */
284
+ export function operatorConfirmationEvidence(approval, now = () => new Date().toISOString()) {
285
+ return createUserConfirmationEvidence({ kind: "manual", reference: approval.approval_id, confirmed_at: approval.confirmed_at }, now);
286
+ }
287
+ //# sourceMappingURL=operator-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-approval.js","sourceRoot":"","sources":["../../src/handoff/operator-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
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 { DatabaseSync } from "node:sqlite";
17
+ /** 订单行项目(只读)。 */
18
+ export interface OrderRecordLineItem {
19
+ readonly sku: string;
20
+ readonly quantity: number;
21
+ readonly unit_price?: Readonly<{
22
+ currency: string;
23
+ amount_minor: number;
24
+ }>;
25
+ }
26
+ /** Kiwi 保存的只读订单事实。全部字段 readonly —— 类型层面不可变。 */
27
+ export interface OrderRecord {
28
+ /** merchant 侧订单 id(opaque)。 */
29
+ readonly order_id: string;
30
+ /** 订单详情页 URL(merchant 权威)。 */
31
+ readonly permalink_url: string;
32
+ readonly line_items: readonly OrderRecordLineItem[];
33
+ /** merchant 侧订单状态(如 confirmed / fulfilled;Kiwi 不解释,只保存)。 */
34
+ readonly status: string;
35
+ /** 该订单履约的商业 terms 摘要(溯源:与 agreement/session 一致)。 */
36
+ readonly terms_digest: string;
37
+ readonly currency?: string;
38
+ readonly total_minor?: number;
39
+ /** 溯源:产生该订单的 agreement。 */
40
+ readonly agreement_id: string;
41
+ /** 溯源:产生该订单的 negotiation。 */
42
+ readonly negotiation_id: string;
43
+ /** 溯源:产生该订单的 checkout session。 */
44
+ readonly session_ref: string;
45
+ readonly recorded_at: string;
46
+ }
47
+ /** 摄取输入:completed checkout 的 order 字段 + 溯源上下文。 */
48
+ export interface OrderRecordSource {
49
+ order_id: string;
50
+ permalink_url: string;
51
+ line_items: readonly OrderRecordLineItem[];
52
+ status: string;
53
+ terms_digest: string;
54
+ currency?: string;
55
+ total_minor?: number;
56
+ agreement_id: string;
57
+ negotiation_id: string;
58
+ session_ref: string;
59
+ /** 可注入记录时间(RFC 3339);缺省 now。 */
60
+ recorded_at?: string;
61
+ }
62
+ /** 本地存储:目录 0700 / 数据库文件 0600(对齐 agent 数据布局)。 */
63
+ export interface OrderRecordStoreOptions {
64
+ dbPath: string;
65
+ /** 可注入时钟(RFC 3339);缺省 new Date().toISOString()。 */
66
+ now?: () => string;
67
+ }
68
+ /** 模块私有 symbol:让 ingestOrderRecord(模块函数)访问内部写入,外部不可达。 */
69
+ declare const INGEST: unique symbol;
70
+ /** 模块私有构造 token:外部无法构造 OrderRecordStore,只能经 openOrderRecordStore。 */
71
+ declare const STORE_CTOR: unique symbol;
72
+ /**
73
+ * 只读订单事实查询面。公开方法只有 get / list / findByTermsDigest /
74
+ * findByAgreement / count / close —— 没有任何写操作接口。
75
+ */
76
+ export declare class OrderRecordStore {
77
+ private readonly db;
78
+ /**
79
+ * 构造需要模块私有的 token(`STORE_CTOR` 未导出),外部无法凭空构造;
80
+ * 只能经 openOrderRecordStore 创建。
81
+ */
82
+ constructor(db: DatabaseSync, _token: typeof STORE_CTOR);
83
+ /** 按 merchant order_id 查询。 */
84
+ get(orderId: string): OrderRecord | undefined;
85
+ /** 全部订单事实(按记录时间升序)。 */
86
+ list(): readonly OrderRecord[];
87
+ /** 按 terms_digest 溯源查询(审计「哪些订单履约同一组 terms」)。 */
88
+ findByTermsDigest(termsDigest: string): readonly OrderRecord[];
89
+ /** 按 agreement 溯源查询。 */
90
+ findByAgreement(agreementId: string): readonly OrderRecord[];
91
+ /** 已保存订单事实数量。 */
92
+ count(): number;
93
+ close(): void;
94
+ private rowToRecord;
95
+ [INGEST](source: OrderRecordSource, recordedAt: string): OrderRecord;
96
+ }
97
+ /** 打开(必要时创建)本地订单事实存储;目录 0700 / 文件 0600。 */
98
+ export declare function openOrderRecordStore(options: OrderRecordStoreOptions): OrderRecordStore;
99
+ /**
100
+ * 从 completed checkout 的 order 字段摄取一条只读订单事实。这是唯一的写入路径;
101
+ * 之后只能通过只读查询读取。
102
+ */
103
+ export declare function ingestOrderRecord(store: OrderRecordStore, source: OrderRecordSource, now?: () => string): OrderRecord;
104
+ export {};
@@ -0,0 +1,235 @@
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 — OrderRecord(WP3,只读订单事实)。
18
+ *
19
+ * ⚠️ Kiwi 不是订单系统。订单由 merchant 侧创建(business 是 Merchant of Record);
20
+ * Kiwi 只保存来自 completed checkout 的只读订单事实,用于审计与溯源。Kiwi 永不
21
+ * 实现取消订单 / 退款 / 修改订单路径;支付凭据永远不经过 Kiwi。
22
+ *
23
+ * 本模块:
24
+ * - OrderRecord:类型层面不可变(全部 readonly,数组也只读);
25
+ * - OrderRecordStore:只暴露只读查询 + close,没有任何写操作接口
26
+ * (ingestOrderRecord 是模块级函数,通过模块私有 symbol 访问内部写入);
27
+ * - ingestOrderRecord:从 completed checkout 的 order 字段摄取——order
28
+ * id / permalink_url / line_items / status / terms_digest,并溯源到
29
+ * 产生它的 agreement / session。
30
+ */
31
+ import { chmodSync, existsSync, mkdirSync } from "node:fs";
32
+ import path from "node:path";
33
+ import { DatabaseSync } from "node:sqlite";
34
+ import { requireDigest, requireInteger, requireIsoTimestamp, requireNonEmptyString, requireObject, schemaError, } from "../negotiation/domain/common.js";
35
+ import { validateIdentifier } from "../negotiation/domain/identifiers.js";
36
+ // ---------------------------------------------------------------------------
37
+ // 校验
38
+ // ---------------------------------------------------------------------------
39
+ /** 非负整数(金额/数量语义,与核心 validateMoney 一致——负数不可入审计账)。 */
40
+ function requireNonNegativeInteger(value, path) {
41
+ const n = requireInteger(value, path);
42
+ if (n < 0) {
43
+ throw schemaError(path, `${path} must be a non-negative integer`);
44
+ }
45
+ return n;
46
+ }
47
+ function validateLineItem(value, index) {
48
+ const obj = requireObject(value, `line_items/${index}`);
49
+ const base = {
50
+ sku: requireNonEmptyString(obj.sku, `line_items/${index}/sku`),
51
+ quantity: requireNonNegativeInteger(obj.quantity, `line_items/${index}/quantity`),
52
+ };
53
+ if (obj.unit_price === undefined)
54
+ return base;
55
+ const price = requireObject(obj.unit_price, `line_items/${index}/unit_price`);
56
+ return {
57
+ ...base,
58
+ unit_price: {
59
+ currency: requireNonEmptyString(price.currency, `line_items/${index}/unit_price/currency`),
60
+ amount_minor: requireNonNegativeInteger(price.amount_minor, `line_items/${index}/unit_price/amount_minor`),
61
+ },
62
+ };
63
+ }
64
+ function validateSource(source) {
65
+ if (!/^https?:\/\/\S+$/.test(source.permalink_url)) {
66
+ throw schemaError("permalink_url", "permalink_url must be an http(s) URL");
67
+ }
68
+ return {
69
+ ...source,
70
+ order_id: validateIdentifier(source.order_id, "order_id"),
71
+ permalink_url: requireNonEmptyString(source.permalink_url, "permalink_url"),
72
+ line_items: source.line_items.map((item, i) => validateLineItem(item, i)),
73
+ status: requireNonEmptyString(source.status, "status"),
74
+ terms_digest: requireDigest(source.terms_digest, "terms_digest"),
75
+ ...(source.currency !== undefined
76
+ ? { currency: requireNonEmptyString(source.currency, "currency") }
77
+ : {}),
78
+ ...(source.total_minor !== undefined
79
+ ? { total_minor: requireNonNegativeInteger(source.total_minor, "total_minor") }
80
+ : {}),
81
+ agreement_id: validateIdentifier(source.agreement_id, "agreement_id"),
82
+ negotiation_id: validateIdentifier(source.negotiation_id, "negotiation_id"),
83
+ session_ref: validateIdentifier(source.session_ref, "session_ref"),
84
+ ...(source.recorded_at !== undefined
85
+ ? { recorded_at: requireIsoTimestamp(source.recorded_at, "recorded_at") }
86
+ : {}),
87
+ };
88
+ }
89
+ const ORDER_SCHEMA = `
90
+ CREATE TABLE IF NOT EXISTS order_records (
91
+ order_id TEXT PRIMARY KEY,
92
+ permalink_url TEXT NOT NULL,
93
+ line_items TEXT NOT NULL,
94
+ status TEXT NOT NULL,
95
+ terms_digest TEXT NOT NULL,
96
+ currency TEXT,
97
+ total_minor INTEGER,
98
+ agreement_id TEXT NOT NULL,
99
+ negotiation_id TEXT NOT NULL,
100
+ session_ref TEXT NOT NULL,
101
+ recorded_at TEXT NOT NULL
102
+ );
103
+ CREATE INDEX IF NOT EXISTS idx_order_terms_digest ON order_records(terms_digest);
104
+ CREATE INDEX IF NOT EXISTS idx_order_agreement_id ON order_records(agreement_id);
105
+ `;
106
+ /** 模块私有 symbol:让 ingestOrderRecord(模块函数)访问内部写入,外部不可达。 */
107
+ const INGEST = Symbol("order-record.ingest");
108
+ /** 模块私有构造 token:外部无法构造 OrderRecordStore,只能经 openOrderRecordStore。 */
109
+ const STORE_CTOR = Symbol("order-record.ctor");
110
+ /**
111
+ * 只读订单事实查询面。公开方法只有 get / list / findByTermsDigest /
112
+ * findByAgreement / count / close —— 没有任何写操作接口。
113
+ */
114
+ export class OrderRecordStore {
115
+ db;
116
+ /**
117
+ * 构造需要模块私有的 token(`STORE_CTOR` 未导出),外部无法凭空构造;
118
+ * 只能经 openOrderRecordStore 创建。
119
+ */
120
+ constructor(db, _token) {
121
+ this.db = db;
122
+ }
123
+ /** 按 merchant order_id 查询。 */
124
+ get(orderId) {
125
+ const row = this.db
126
+ .prepare("SELECT * FROM order_records WHERE order_id = ?")
127
+ .get(orderId);
128
+ return row === undefined ? undefined : this.rowToRecord(row);
129
+ }
130
+ /** 全部订单事实(按记录时间升序)。 */
131
+ list() {
132
+ const rows = this.db
133
+ .prepare("SELECT * FROM order_records ORDER BY recorded_at, order_id")
134
+ .all();
135
+ return rows.map((r) => this.rowToRecord(r));
136
+ }
137
+ /** 按 terms_digest 溯源查询(审计「哪些订单履约同一组 terms」)。 */
138
+ findByTermsDigest(termsDigest) {
139
+ const rows = this.db
140
+ .prepare("SELECT * FROM order_records WHERE terms_digest = ? ORDER BY recorded_at")
141
+ .all(termsDigest);
142
+ return rows.map((r) => this.rowToRecord(r));
143
+ }
144
+ /** 按 agreement 溯源查询。 */
145
+ findByAgreement(agreementId) {
146
+ const rows = this.db
147
+ .prepare("SELECT * FROM order_records WHERE agreement_id = ? ORDER BY recorded_at")
148
+ .all(agreementId);
149
+ return rows.map((r) => this.rowToRecord(r));
150
+ }
151
+ /** 已保存订单事实数量。 */
152
+ count() {
153
+ const row = this.db.prepare("SELECT COUNT(*) AS n FROM order_records").get();
154
+ return row.n;
155
+ }
156
+ close() {
157
+ this.db.close();
158
+ }
159
+ rowToRecord(row) {
160
+ return {
161
+ order_id: row.order_id,
162
+ permalink_url: row.permalink_url,
163
+ line_items: JSON.parse(row.line_items),
164
+ status: row.status,
165
+ terms_digest: row.terms_digest,
166
+ ...(row.currency !== null ? { currency: row.currency } : {}),
167
+ ...(row.total_minor !== null ? { total_minor: row.total_minor } : {}),
168
+ agreement_id: row.agreement_id,
169
+ negotiation_id: row.negotiation_id,
170
+ session_ref: row.session_ref,
171
+ recorded_at: row.recorded_at,
172
+ };
173
+ }
174
+ // 内部写入:只允许本模块的 ingestOrderRecord 调用(symbol 未导出)。
175
+ [INGEST](source, recordedAt) {
176
+ const record = {
177
+ order_id: source.order_id,
178
+ permalink_url: source.permalink_url,
179
+ line_items: source.line_items.map((item) => ({ ...item })),
180
+ status: source.status,
181
+ terms_digest: source.terms_digest,
182
+ ...(source.currency !== undefined ? { currency: source.currency } : {}),
183
+ ...(source.total_minor !== undefined ? { total_minor: source.total_minor } : {}),
184
+ agreement_id: source.agreement_id,
185
+ negotiation_id: source.negotiation_id,
186
+ session_ref: source.session_ref,
187
+ recorded_at: recordedAt,
188
+ };
189
+ this.db
190
+ .prepare(`INSERT INTO order_records
191
+ (order_id, permalink_url, line_items, status, terms_digest, currency,
192
+ total_minor, agreement_id, negotiation_id, session_ref, recorded_at)
193
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
194
+ ON CONFLICT(order_id) DO UPDATE SET
195
+ permalink_url=excluded.permalink_url,
196
+ line_items=excluded.line_items,
197
+ status=excluded.status,
198
+ terms_digest=excluded.terms_digest,
199
+ currency=excluded.currency,
200
+ total_minor=excluded.total_minor,
201
+ agreement_id=excluded.agreement_id,
202
+ negotiation_id=excluded.negotiation_id,
203
+ session_ref=excluded.session_ref,
204
+ recorded_at=excluded.recorded_at`)
205
+ .run(record.order_id, record.permalink_url, JSON.stringify(record.line_items), record.status, record.terms_digest, record.currency ?? null, record.total_minor ?? null, record.agreement_id, record.negotiation_id, record.session_ref, record.recorded_at);
206
+ return this.get(record.order_id);
207
+ }
208
+ }
209
+ /** 打开(必要时创建)本地订单事实存储;目录 0700 / 文件 0600。 */
210
+ export function openOrderRecordStore(options) {
211
+ if (options.dbPath === ":memory:") {
212
+ const db = new DatabaseSync(":memory:");
213
+ db.exec(ORDER_SCHEMA);
214
+ return new OrderRecordStore(db, STORE_CTOR);
215
+ }
216
+ const dir = path.dirname(options.dbPath);
217
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
218
+ chmodSync(dir, 0o700);
219
+ const db = new DatabaseSync(options.dbPath);
220
+ if (existsSync(options.dbPath))
221
+ chmodSync(options.dbPath, 0o600);
222
+ db.exec(ORDER_SCHEMA);
223
+ return new OrderRecordStore(db, STORE_CTOR);
224
+ }
225
+ /**
226
+ * 从 completed checkout 的 order 字段摄取一条只读订单事实。这是唯一的写入路径;
227
+ * 之后只能通过只读查询读取。
228
+ */
229
+ export function ingestOrderRecord(store, source, now = () => new Date().toISOString()) {
230
+ const validated = validateSource(source);
231
+ const recordedAt = validated.recorded_at ?? now();
232
+ requireIsoTimestamp(recordedAt, "recorded_at");
233
+ return store[INGEST](validated, recordedAt);
234
+ }
235
+ //# sourceMappingURL=order-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-record.js","sourceRoot":"","sources":["../../src/handoff/order-record.ts"],"names":[],"mappings":"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"}