@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,29 @@
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
+ export interface ContextMapping {
17
+ negotiation_id: string;
18
+ /** 远端 A2A contextId(opaque,§9.2)。 */
19
+ remote_context_id?: string;
20
+ /** 本 negotiation 用过的 A2A taskId 列表(§9.5,非 negotiation_id 替代)。 */
21
+ task_ids: string[];
22
+ updated_at: string;
23
+ }
24
+ /** 增量更新:只更新提供的字段;task_ids 通过 addTask 追加。 */
25
+ export interface ContextMappingPatch {
26
+ remote_context_id?: string;
27
+ }
28
+ /** 从磁盘解析一条映射(untrusted)。任何字段违规 → 抛 NegotiationValidationError。 */
29
+ export declare function parseContextMapping(value: unknown): ContextMapping;
@@ -0,0 +1,57 @@
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
+ * negotiation_id ↔ 远端 A2A context 映射模型(基线 §9.2 / 子规范 §6.6–§6.7)。
18
+ *
19
+ * Kiwi 持久化:
20
+ *
21
+ * ```text
22
+ * negotiation_id ↔ remote contextId(可含 taskId 列表)
23
+ * ```
24
+ *
25
+ * 边界(§9.2 / §24.4 / §24.5):
26
+ * - `remote_context_id` 对 Kiwi 完全 opaque —— 只做结构校验(validateContextId),
27
+ * 不解析、不推断其含义;后续交互复用同一 contextId。
28
+ * - `task_ids` 是同一 negotiation 用过的 A2A taskId 列表;taskId 只是
29
+ * transport/session 状态,不得替代 negotiation_id(§9.5)。
30
+ * - 校验 fail-closed:任何字段不符合 opaque 标识符规则即拒绝。
31
+ */
32
+ import { requireIsoTimestamp } from "../domain/common.js";
33
+ import { validateContextId, validateIdentifier, validateTaskId } from "../domain/identifiers.js";
34
+ /** 从磁盘解析一条映射(untrusted)。任何字段违规 → 抛 NegotiationValidationError。 */
35
+ export function parseContextMapping(value) {
36
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
37
+ throw new Error("context mapping must be an object");
38
+ }
39
+ const obj = value;
40
+ const negotiationId = validateIdentifier(obj.negotiation_id, "negotiation_id");
41
+ const mapping = {
42
+ negotiation_id: negotiationId,
43
+ task_ids: [],
44
+ updated_at: requireIsoTimestamp(obj.updated_at, "updated_at"),
45
+ };
46
+ if (obj.remote_context_id !== undefined) {
47
+ mapping.remote_context_id = validateContextId(obj.remote_context_id, "remote_context_id");
48
+ }
49
+ if (obj.task_ids !== undefined) {
50
+ if (!Array.isArray(obj.task_ids)) {
51
+ throw new Error("context mapping task_ids must be an array");
52
+ }
53
+ mapping.task_ids = obj.task_ids.map((id, i) => validateTaskId(id, `task_ids/${i}`));
54
+ }
55
+ return mapping;
56
+ }
57
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/negotiation/context-map/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAgBjG,kEAAkE;AAClE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,aAAa,GAAG,kBAAkB,CAAC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAmB;QAC9B,cAAc,EAAE,aAAa;QAC7B,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC;KAC9D,CAAC;IACF,IAAI,GAAG,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,95 @@
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
+ * KNP/1.0 公共数据类型与校验原语(子规范 §7 Common Data Types)。
18
+ *
19
+ * Money、Quantity、TermSet 是所有 negotiation object 共享的基础类型。
20
+ * 校验采用 fail-closed(基线 §4.6 / §33):无法证明合法即为非法。
21
+ * 所有校验错误统一抛出 NegotiationValidationError,`code` 对齐子规范 §18
22
+ * 的 protocol error 词表(默认 schema_invalid;具体语义错误如
23
+ * protocol_version_unsupported / field_unsupported / state_conflict 单独标注)。
24
+ */
25
+ export declare const KNP_PROTOCOL_VERSION: "1.0";
26
+ /** KNP/1.0 协议错误词表(子规范 §18)。 */
27
+ export declare const PROTOCOL_ERROR_CODES: readonly ["protocol_version_unsupported", "capability_incompatible", "schema_invalid", "field_unsupported", "structured_text_conflict", "identity_rejected", "authentication_required", "authorization_failed", "offer_unknown", "offer_expired", "offer_withdrawn", "terms_digest_mismatch", "condition_conflict", "state_conflict", "approval_required", "idempotency_conflict", "replay_detected", "rate_limited", "temporarily_unavailable", "reconciliation_required"];
28
+ export type ProtocolErrorCode = (typeof PROTOCOL_ERROR_CODES)[number];
29
+ /** 结构/语义校验失败。`path` 为 JSON Pointer 风格的字段路径。 */
30
+ export declare class NegotiationValidationError extends Error {
31
+ readonly code: ProtocolErrorCode;
32
+ readonly path: string;
33
+ constructor(code: ProtocolErrorCode, message: string, path: string);
34
+ }
35
+ /** 默认 schema 校验错误。 */
36
+ export declare function schemaError(path: string, message: string): NegotiationValidationError;
37
+ export declare function requireObject(value: unknown, path: string): Record<string, unknown>;
38
+ export declare function requireArray(value: unknown, path: string): unknown[];
39
+ export declare function requireString(value: unknown, path: string): string;
40
+ export declare function requireNonEmptyString(value: unknown, path: string): string;
41
+ /** 整数(含 0 与负数);Number.isInteger 同时排除 NaN/Infinity/float。 */
42
+ export declare function requireInteger(value: unknown, path: string): number;
43
+ /** 布尔(v0.7.0 KTH 三副作用不变量等)。 */
44
+ export declare function requireBoolean(value: unknown, path: string): boolean;
45
+ export declare function requirePositiveNumber(value: unknown, path: string): number;
46
+ export declare function requireEnum<T extends string>(value: unknown, allowed: readonly T[], path: string): T;
47
+ /**
48
+ * RFC 3339 时间戳(子规范 §7.3)。
49
+ * 格式正则之外还要 Date.parse 真实可解析:`2026-13-01T00:00:00Z` 等越界
50
+ * 时间/日期能过正则但 Date.parse 返回 NaN(fail-open 缺口,见
51
+ * transaction.ts 过期门)。不可解析 → schemaError(fail-closed)。
52
+ */
53
+ export declare function requireIsoTimestamp(value: unknown, path: string): string;
54
+ /** `sha256:` 前缀的小写 hex 摘要(子规范 §19.2/§19.3)。 */
55
+ export declare function requireDigest(value: unknown, path: string): string;
56
+ /** 判别字段检查:`obj.type` 必须等于期望值。 */
57
+ export declare function requireType(obj: Record<string, unknown>, expected: string, path: string): void;
58
+ export interface Money {
59
+ /** 三位大写货币代码。 */
60
+ currency: string;
61
+ /** 最小货币单位;协议禁止 float 金额(§7.1)。 */
62
+ amount_minor: number;
63
+ }
64
+ export declare function validateMoney(value: unknown, path: string): Money;
65
+ export interface Quantity {
66
+ /** 正数(§7.2)。 */
67
+ value: number;
68
+ unit: string;
69
+ }
70
+ export declare function validateQuantity(value: unknown, path: string): Quantity;
71
+ export interface LineItem {
72
+ sku: string;
73
+ quantity: Quantity;
74
+ /** Offer 等 offer-like 项的 unit_price 由调用方通过 opts 强制。 */
75
+ unit_price?: Money;
76
+ }
77
+ export declare function validateLineItem(value: unknown, path: string, opts?: {
78
+ requireUnitPrice?: boolean;
79
+ }): LineItem;
80
+ export interface TermSet {
81
+ items?: LineItem[];
82
+ price_terms?: Record<string, unknown>;
83
+ fulfillment_terms?: Record<string, unknown>;
84
+ service_terms?: Record<string, unknown>;
85
+ payment_terms?: Record<string, unknown>;
86
+ valid_until?: string;
87
+ }
88
+ /**
89
+ * TermSet 校验(§7.4)。稳定顶层域:items / price_terms / fulfillment_terms /
90
+ * service_terms / payment_terms / valid_until。payment_terms 只表达商业条件,
91
+ * 不代表支付授权。
92
+ */
93
+ export declare function validateTermSet(value: unknown, path: string, opts?: {
94
+ requireUnitPrice?: boolean;
95
+ }): TermSet;
@@ -0,0 +1,216 @@
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
+ * KNP/1.0 公共数据类型与校验原语(子规范 §7 Common Data Types)。
18
+ *
19
+ * Money、Quantity、TermSet 是所有 negotiation object 共享的基础类型。
20
+ * 校验采用 fail-closed(基线 §4.6 / §33):无法证明合法即为非法。
21
+ * 所有校验错误统一抛出 NegotiationValidationError,`code` 对齐子规范 §18
22
+ * 的 protocol error 词表(默认 schema_invalid;具体语义错误如
23
+ * protocol_version_unsupported / field_unsupported / state_conflict 单独标注)。
24
+ */
25
+ export const KNP_PROTOCOL_VERSION = "1.0";
26
+ /** KNP/1.0 协议错误词表(子规范 §18)。 */
27
+ export const PROTOCOL_ERROR_CODES = [
28
+ "protocol_version_unsupported",
29
+ "capability_incompatible",
30
+ "schema_invalid",
31
+ "field_unsupported",
32
+ "structured_text_conflict",
33
+ "identity_rejected",
34
+ "authentication_required",
35
+ "authorization_failed",
36
+ "offer_unknown",
37
+ "offer_expired",
38
+ "offer_withdrawn",
39
+ "terms_digest_mismatch",
40
+ "condition_conflict",
41
+ "state_conflict",
42
+ "approval_required",
43
+ "idempotency_conflict",
44
+ "replay_detected",
45
+ "rate_limited",
46
+ "temporarily_unavailable",
47
+ "reconciliation_required",
48
+ ];
49
+ /** 结构/语义校验失败。`path` 为 JSON Pointer 风格的字段路径。 */
50
+ export class NegotiationValidationError extends Error {
51
+ code;
52
+ path;
53
+ constructor(code, message, path) {
54
+ super(message);
55
+ this.name = "NegotiationValidationError";
56
+ this.code = code;
57
+ this.path = path;
58
+ }
59
+ }
60
+ /** 默认 schema 校验错误。 */
61
+ export function schemaError(path, message) {
62
+ return new NegotiationValidationError("schema_invalid", message, path);
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // 校验原语
66
+ // ---------------------------------------------------------------------------
67
+ export function requireObject(value, path) {
68
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
69
+ throw schemaError(path, `${path} must be an object`);
70
+ }
71
+ return value;
72
+ }
73
+ export function requireArray(value, path) {
74
+ if (!Array.isArray(value)) {
75
+ throw schemaError(path, `${path} must be an array`);
76
+ }
77
+ return value;
78
+ }
79
+ export function requireString(value, path) {
80
+ if (typeof value !== "string") {
81
+ throw schemaError(path, `${path} must be a string`);
82
+ }
83
+ return value;
84
+ }
85
+ export function requireNonEmptyString(value, path) {
86
+ const s = requireString(value, path);
87
+ if (s.length === 0) {
88
+ throw schemaError(path, `${path} must be a non-empty string`);
89
+ }
90
+ return s;
91
+ }
92
+ /** 整数(含 0 与负数);Number.isInteger 同时排除 NaN/Infinity/float。 */
93
+ export function requireInteger(value, path) {
94
+ if (typeof value !== "number" || !Number.isInteger(value)) {
95
+ throw schemaError(path, `${path} must be an integer`);
96
+ }
97
+ return value;
98
+ }
99
+ /** 布尔(v0.7.0 KTH 三副作用不变量等)。 */
100
+ export function requireBoolean(value, path) {
101
+ if (typeof value !== "boolean") {
102
+ throw schemaError(path, `${path} must be a boolean`);
103
+ }
104
+ return value;
105
+ }
106
+ export function requirePositiveNumber(value, path) {
107
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
108
+ throw schemaError(path, `${path} must be a positive number`);
109
+ }
110
+ return value;
111
+ }
112
+ export function requireEnum(value, allowed, path) {
113
+ const s = requireNonEmptyString(value, path);
114
+ if (!allowed.includes(s)) {
115
+ throw schemaError(path, `${path} must be one of ${allowed.join("|")}`);
116
+ }
117
+ return s;
118
+ }
119
+ const RFC3339 = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/;
120
+ /**
121
+ * RFC 3339 时间戳(子规范 §7.3)。
122
+ * 格式正则之外还要 Date.parse 真实可解析:`2026-13-01T00:00:00Z` 等越界
123
+ * 时间/日期能过正则但 Date.parse 返回 NaN(fail-open 缺口,见
124
+ * transaction.ts 过期门)。不可解析 → schemaError(fail-closed)。
125
+ */
126
+ export function requireIsoTimestamp(value, path) {
127
+ const s = requireNonEmptyString(value, path);
128
+ if (!RFC3339.test(s)) {
129
+ throw schemaError(path, `${path} must be an RFC 3339 timestamp`);
130
+ }
131
+ if (!Number.isFinite(Date.parse(s))) {
132
+ throw schemaError(path, `${path} must be a parseable RFC 3339 timestamp`);
133
+ }
134
+ return s;
135
+ }
136
+ const DIGEST = /^sha256:[0-9a-f]{64}$/;
137
+ /** `sha256:` 前缀的小写 hex 摘要(子规范 §19.2/§19.3)。 */
138
+ export function requireDigest(value, path) {
139
+ const s = requireNonEmptyString(value, path);
140
+ if (!DIGEST.test(s)) {
141
+ throw schemaError(path, `${path} must be sha256:<64 lowercase hex>`);
142
+ }
143
+ return s;
144
+ }
145
+ /** 判别字段检查:`obj.type` 必须等于期望值。 */
146
+ export function requireType(obj, expected, path) {
147
+ if (obj.type !== expected) {
148
+ throw schemaError(`${path}/type`, `type must be ${expected}`);
149
+ }
150
+ }
151
+ export function validateMoney(value, path) {
152
+ const obj = requireObject(value, path);
153
+ const currency = requireNonEmptyString(obj.currency, `${path}/currency`);
154
+ if (!/^[A-Z]{3}$/.test(currency)) {
155
+ throw schemaError(`${path}/currency`, "currency must be a three-letter uppercase code");
156
+ }
157
+ const amountMinor = requireInteger(obj.amount_minor, `${path}/amount_minor`);
158
+ if (amountMinor < 0) {
159
+ throw schemaError(`${path}/amount_minor`, "amount_minor must be a non-negative integer");
160
+ }
161
+ return { currency, amount_minor: amountMinor };
162
+ }
163
+ export function validateQuantity(value, path) {
164
+ const obj = requireObject(value, path);
165
+ return {
166
+ value: requirePositiveNumber(obj.value, `${path}/value`),
167
+ unit: requireNonEmptyString(obj.unit, `${path}/unit`),
168
+ };
169
+ }
170
+ export function validateLineItem(value, path, opts = {}) {
171
+ const obj = requireObject(value, path);
172
+ const item = {
173
+ sku: requireNonEmptyString(obj.sku, `${path}/sku`),
174
+ quantity: validateQuantity(obj.quantity, `${path}/quantity`),
175
+ };
176
+ if (obj.unit_price !== undefined) {
177
+ item.unit_price = validateMoney(obj.unit_price, `${path}/unit_price`);
178
+ }
179
+ else if (opts.requireUnitPrice === true) {
180
+ throw schemaError(`${path}/unit_price`, "unit_price is required on offer-like items");
181
+ }
182
+ return item;
183
+ }
184
+ /**
185
+ * TermSet 校验(§7.4)。稳定顶层域:items / price_terms / fulfillment_terms /
186
+ * service_terms / payment_terms / valid_until。payment_terms 只表达商业条件,
187
+ * 不代表支付授权。
188
+ */
189
+ export function validateTermSet(value, path, opts = {}) {
190
+ const obj = requireObject(value, path);
191
+ const terms = {};
192
+ if (obj.items !== undefined) {
193
+ terms.items = requireArray(obj.items, `${path}/items`).map((item, i) => validateLineItem(item, `${path}/items/${i}`, opts));
194
+ }
195
+ if (obj.price_terms !== undefined) {
196
+ terms.price_terms = requireObject(obj.price_terms, `${path}/price_terms`);
197
+ }
198
+ if (obj.fulfillment_terms !== undefined) {
199
+ const fulfillment = requireObject(obj.fulfillment_terms, `${path}/fulfillment_terms`);
200
+ if (fulfillment.delivery_before !== undefined) {
201
+ requireIsoTimestamp(fulfillment.delivery_before, `${path}/fulfillment_terms/delivery_before`);
202
+ }
203
+ terms.fulfillment_terms = fulfillment;
204
+ }
205
+ if (obj.service_terms !== undefined) {
206
+ terms.service_terms = requireObject(obj.service_terms, `${path}/service_terms`);
207
+ }
208
+ if (obj.payment_terms !== undefined) {
209
+ terms.payment_terms = requireObject(obj.payment_terms, `${path}/payment_terms`);
210
+ }
211
+ if (obj.valid_until !== undefined) {
212
+ terms.valid_until = requireIsoTimestamp(obj.valid_until, `${path}/valid_until`);
213
+ }
214
+ return terms;
215
+ }
216
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/negotiation/domain/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
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 { KNP_PROTOCOL_VERSION } from "./common.js";
17
+ import type { NegotiationAction, NegotiationActor, NegotiationPayload } from "./objects.js";
18
+ export type EnvelopeContent = Omit<NegotiationEnvelope, "digest">;
19
+ export interface NegotiationEnvelope {
20
+ capability: string;
21
+ protocol_version: typeof KNP_PROTOCOL_VERSION;
22
+ negotiation_id: string;
23
+ exchange_id: string;
24
+ message_id: string;
25
+ in_reply_to?: string;
26
+ actor: NegotiationActor;
27
+ action: NegotiationAction;
28
+ created_at: string;
29
+ payload: NegotiationPayload;
30
+ public_message?: string;
31
+ digest: string;
32
+ }
33
+ /**
34
+ * 计算 envelope digest(§19.2):移除 digest 自身与 transport signature 字段,
35
+ * 其余字段 JCS 规范化 + SHA-256。JCS 排序键且跳过 undefined,因此字段顺序
36
+ * 无关、可选字段缺省不影响摘要。
37
+ */
38
+ export declare function computeEnvelopeDigest(input: object): string;
39
+ /**
40
+ * 对未签名字段计算 digest 并返回完整 envelope。
41
+ *
42
+ * 命名说明(基线 §19 / §31):本函数只做内容寻址 digest(JCS + SHA-256),
43
+ * 不做任何密码学签名。KNP/1.0 envelope 的 digest 是完整性/防篡改校验;
44
+ * signature 属于 transport 层且 §19.2 显式从 digest 输入中排除——digest 与
45
+ * signature 是两种性质,故不命名为 sign*。
46
+ */
47
+ export declare function finalizeEnvelope(fields: EnvelopeContent): NegotiationEnvelope;
48
+ /** 重算 digest 并与 wire digest 比较;false 表示被篡改或过期。 */
49
+ export declare function verifyEnvelopeDigest(envelope: NegotiationEnvelope): boolean;
50
+ /**
51
+ * Envelope schema 校验。未知 protocol_version / actor 非 buyer|merchant /
52
+ * action-payload 类型不匹配 / digest 格式错误均 fail-closed。
53
+ * digest 内容一致性由 verifyEnvelopeDigest 单独校验。
54
+ */
55
+ export declare function validateEnvelope(value: unknown): NegotiationEnvelope;
@@ -0,0 +1,110 @@
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
+ * KNP/1.0 Negotiation Envelope(子规范 §8,基线 §13)。
18
+ *
19
+ * digest 按 §19.2 计算:clone 后移除 `digest` 自身与 transport signature 字段,
20
+ * RFC 8785 JCS 规范化 + SHA-256,hex 小写并加 `sha256:` 前缀。
21
+ * protocol_version 只认 1.0,未知版本 fail-closed(§5 / §33-6)。
22
+ * actor 仅 buyer|merchant;system/内部事件不得冒充商业角色(§8.1)。
23
+ */
24
+ import { contentDigest } from "../jcs.js";
25
+ import { KNP_PROTOCOL_VERSION, NegotiationValidationError, requireDigest, requireEnum, requireIsoTimestamp, requireNonEmptyString, requireObject, requireString, schemaError, } from "./common.js";
26
+ import { validateIdentifier } from "./identifiers.js";
27
+ import { KNP_ACTIONS, validatePayloadForAction } from "./objects.js";
28
+ /** KNP 未定义的 transport signature 字段名:digest 计算时排除(§19.2)。 */
29
+ const TRANSPORT_SIGNATURE_FIELDS = new Set([
30
+ "signature",
31
+ "transport_signature",
32
+ "http_message_signature",
33
+ "x_message_signature",
34
+ ]);
35
+ /**
36
+ * 计算 envelope digest(§19.2):移除 digest 自身与 transport signature 字段,
37
+ * 其余字段 JCS 规范化 + SHA-256。JCS 排序键且跳过 undefined,因此字段顺序
38
+ * 无关、可选字段缺省不影响摘要。
39
+ */
40
+ export function computeEnvelopeDigest(input) {
41
+ const clean = {};
42
+ for (const key of Object.keys(input)) {
43
+ if (key === "digest")
44
+ continue;
45
+ if (TRANSPORT_SIGNATURE_FIELDS.has(key))
46
+ continue;
47
+ clean[key] = input[key];
48
+ }
49
+ return contentDigest(clean);
50
+ }
51
+ /**
52
+ * 对未签名字段计算 digest 并返回完整 envelope。
53
+ *
54
+ * 命名说明(基线 §19 / §31):本函数只做内容寻址 digest(JCS + SHA-256),
55
+ * 不做任何密码学签名。KNP/1.0 envelope 的 digest 是完整性/防篡改校验;
56
+ * signature 属于 transport 层且 §19.2 显式从 digest 输入中排除——digest 与
57
+ * signature 是两种性质,故不命名为 sign*。
58
+ */
59
+ export function finalizeEnvelope(fields) {
60
+ return { ...fields, digest: computeEnvelopeDigest(fields) };
61
+ }
62
+ /** 重算 digest 并与 wire digest 比较;false 表示被篡改或过期。 */
63
+ export function verifyEnvelopeDigest(envelope) {
64
+ const { digest, ...rest } = envelope;
65
+ return computeEnvelopeDigest(rest) === digest;
66
+ }
67
+ /**
68
+ * Envelope schema 校验。未知 protocol_version / actor 非 buyer|merchant /
69
+ * action-payload 类型不匹配 / digest 格式错误均 fail-closed。
70
+ * digest 内容一致性由 verifyEnvelopeDigest 单独校验。
71
+ */
72
+ export function validateEnvelope(value) {
73
+ const obj = requireObject(value, "/");
74
+ const capability = requireNonEmptyString(obj.capability, "/capability");
75
+ const protocolVersion = requireNonEmptyString(obj.protocol_version, "/protocol_version");
76
+ if (protocolVersion !== KNP_PROTOCOL_VERSION) {
77
+ throw new NegotiationValidationError("protocol_version_unsupported", `unsupported protocol_version ${protocolVersion}; this runtime implements ${KNP_PROTOCOL_VERSION}`, "/protocol_version");
78
+ }
79
+ const negotiationId = validateIdentifier(obj.negotiation_id, "/negotiation_id");
80
+ const exchangeId = validateIdentifier(obj.exchange_id, "/exchange_id");
81
+ const messageId = validateIdentifier(obj.message_id, "/message_id");
82
+ const inReplyTo = obj.in_reply_to === undefined ? undefined : validateIdentifier(obj.in_reply_to, "/in_reply_to");
83
+ const actor = requireEnum(obj.actor, ["buyer", "merchant"], "/actor");
84
+ const action = requireEnum(obj.action, KNP_ACTIONS, "/action");
85
+ const createdAt = requireIsoTimestamp(obj.created_at, "/created_at");
86
+ const payload = validatePayloadForAction(action, obj.payload, "/payload");
87
+ const publicMessage = obj.public_message === undefined
88
+ ? undefined
89
+ : requireString(obj.public_message, "/public_message");
90
+ const digest = requireDigest(obj.digest, "/digest");
91
+ // §14:clarification_response 必须通过 in_reply_to 引用被回答的澄清消息。
92
+ if (action === "clarification_response" && inReplyTo === undefined) {
93
+ throw schemaError("/in_reply_to", "clarification_response requires in_reply_to");
94
+ }
95
+ return {
96
+ capability,
97
+ protocol_version: KNP_PROTOCOL_VERSION,
98
+ negotiation_id: negotiationId,
99
+ exchange_id: exchangeId,
100
+ message_id: messageId,
101
+ in_reply_to: inReplyTo,
102
+ actor,
103
+ action,
104
+ created_at: createdAt,
105
+ payload,
106
+ public_message: publicMessage,
107
+ digest,
108
+ };
109
+ }
110
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../src/negotiation/domain/envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
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
+ export declare const IDENTIFIER_PREFIX: {
17
+ readonly negotiation: "neg";
18
+ readonly exchange: "ex";
19
+ readonly message: "msg";
20
+ readonly offer: "off";
21
+ readonly agreement: "agr";
22
+ readonly handoff_candidate: "hcan";
23
+ readonly handoff: "hnd";
24
+ };
25
+ export type IdentifierKind = keyof typeof IDENTIFIER_PREFIX;
26
+ /**
27
+ * UUIDv7:48 位毫秒时间戳 + version(7)/variant(10) 位 + 随机尾(§6 建议可排序)。
28
+ * rand_a 作 12 位每毫秒计数器,保证同毫秒内也单调不减(时钟回拨时锚定 lastMs)。
29
+ */
30
+ export declare function uuidv7(): string;
31
+ /** 生成带前缀的 identifier(`neg_<uuidv7>` 等)。 */
32
+ export declare function generateId(kind: IdentifierKind): string;
33
+ export declare const newNegotiationId: () => string;
34
+ export declare const newExchangeId: () => string;
35
+ export declare const newMessageId: () => string;
36
+ export declare const newOfferId: () => string;
37
+ export declare const newAgreementId: () => string;
38
+ /** opaque identifier 校验:非空、无前后空白、无控制字符、长度受限。 */
39
+ export declare function validateIdentifier(value: unknown, path: string): string;
40
+ /** A2A `contextId`:对 Kiwi opaque(§6.6)。 */
41
+ export declare function validateContextId(value: unknown, path: string): string;
42
+ /** A2A `taskId`:transport/session 状态,不得替代 negotiation_id(§6.7)。 */
43
+ export declare function validateTaskId(value: unknown, path: string): string;
44
+ /**
45
+ * 扁平 target 引用:target_message_id 是通用引用;target_offer_id 仅用于
46
+ * Offer-like 目标。两者同时存在时 MUST 解析到同一 Ledger 对象,否则
47
+ * state_conflict。
48
+ */
49
+ export interface TargetRef {
50
+ target_message_id: string;
51
+ target_offer_id?: string;
52
+ }
53
+ export declare function validateTargetRef(value: unknown, path: string): TargetRef;
54
+ export interface TargetRefResolver {
55
+ /** 消息 id → 其承载的 offer_id;未知返回 null。 */
56
+ resolveMessageOffer(messageId: string): string | null;
57
+ /** offer id → 承载它的 message_id;未知返回 null。 */
58
+ resolveOfferMessage(offerId: string): string | null;
59
+ }
60
+ /**
61
+ * 用 Ledger 视图核对 TargetRef 的一致性。只有双方都能解析且发生矛盾时才抛
62
+ * state_conflict(§9.7);单侧未知不属于这里可判定的矛盾,留给引擎按
63
+ * offer_unknown 等状态错误处理。
64
+ */
65
+ export declare function checkTargetRefAgreement(target: TargetRef, resolver: TargetRefResolver): void;