@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,17 @@
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 {};
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/negotiation/recovery/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Copyright 2026 harrylabsj
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import type { TargetScope } from "../domain/objects.js";
17
+ /** KNP/1.0 八态(§21.1 / 基线 §18.1)。 */
18
+ export declare const NEGOTIATION_PHASES: readonly ["OPEN", "AWAITING_CLARIFICATION", "OFFER_OPEN", "AGREEMENT_REACHED", "DECLINED", "WITHDRAWN", "CANCELLED", "EXPIRED"];
19
+ export type NegotiationPhase = (typeof NEGOTIATION_PHASES)[number];
20
+ /** 终态:不得重开(§17.4 / 基线 §14.4)。 */
21
+ export declare const TERMINAL_PHASES: readonly ["AGREEMENT_REACHED", "DECLINED", "WITHDRAWN", "CANCELLED", "EXPIRED"];
22
+ export type TerminalPhase = (typeof TERMINAL_PHASES)[number];
23
+ /** AWAITING_CLARIFICATION 的可恢复相位(§21.2 "previous phase / restore")。 */
24
+ export type ResumePhase = "OPEN" | "OFFER_OPEN";
25
+ /** Phase 事件(对齐 §21.2 转换表的事件列)。 */
26
+ export type NegotiationPhaseEvent = {
27
+ type: "clarification";
28
+ } | {
29
+ type: "clarification_response";
30
+ } | {
31
+ type: "offer";
32
+ offer_id: string;
33
+ } | {
34
+ type: "counter_offer";
35
+ offer_id: string;
36
+ } | {
37
+ type: "conditional_offer";
38
+ offer_id: string;
39
+ } | {
40
+ type: "offer_expired";
41
+ } | {
42
+ type: "accept_nonbinding";
43
+ offer_id: string;
44
+ } | {
45
+ type: "withdraw";
46
+ scope: TargetScope;
47
+ } | {
48
+ type: "decline";
49
+ scope: TargetScope;
50
+ } | {
51
+ type: "cancel";
52
+ } | {
53
+ type: "negotiation_expired";
54
+ };
55
+ export interface NegotiationPhaseState {
56
+ negotiation_id: string;
57
+ phase: NegotiationPhase;
58
+ /** 当前 active offer(§21.2 notes:set / replaced / cleared)。 */
59
+ active_offer_id?: string;
60
+ /** AWAITING_CLARIFICATION 时保存的恢复相位(clarification_response 时还原)。 */
61
+ resume_phase?: ResumePhase;
62
+ }
63
+ export declare function isTerminalPhase(phase: NegotiationPhase): boolean;
64
+ /** 新 negotiation 的初始状态:对应转换表首行 none → Inquiry/RFQ start → OPEN。 */
65
+ export declare function createNegotiationPhase(negotiation_id: string): NegotiationPhaseState;
66
+ /**
67
+ * 按 §21.2 转换表推进 phase。终态拒绝一切事件(不可重开);表中不存在的
68
+ * 组合抛 state_conflict。返回新状态,不改动输入。
69
+ */
70
+ export declare function transitionPhase(state: NegotiationPhaseState, event: NegotiationPhaseEvent): NegotiationPhaseState;
@@ -0,0 +1,200 @@
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 Phase 状态机(子规范 §21,基线 §18.1)。
18
+ *
19
+ * 八态:OPEN / AWAITING_CLARIFICATION / OFFER_OPEN / AGREEMENT_REACHED /
20
+ * DECLINED / WITHDRAWN / CANCELLED / EXPIRED。
21
+ *
22
+ * 事件驱动转换严格对应子规范 §21.2 Core Transition Table;表中不存在的转换
23
+ * fail-closed 抛 state_conflict。五个终态(AGREEMENT_REACHED / DECLINED /
24
+ * WITHDRAWN / CANCELLED / EXPIRED)不得以同一 negotiation_id 重开(§17.4 /
25
+ * 基线 §14.4 Reopen);新谈判必须新建 negotiation_id。
26
+ *
27
+ * 本机只维护 phase 维度的状态(含 AWAITING_CLARIFICATION 的恢复相位与
28
+ * active offer 记账);TargetRef 一致性(§9.7)、offer 存在性等由 Ledger 负责。
29
+ */
30
+ import { NegotiationValidationError } from "../domain/common.js";
31
+ /** KNP/1.0 八态(§21.1 / 基线 §18.1)。 */
32
+ export const NEGOTIATION_PHASES = [
33
+ "OPEN",
34
+ "AWAITING_CLARIFICATION",
35
+ "OFFER_OPEN",
36
+ "AGREEMENT_REACHED",
37
+ "DECLINED",
38
+ "WITHDRAWN",
39
+ "CANCELLED",
40
+ "EXPIRED",
41
+ ];
42
+ /** 终态:不得重开(§17.4 / 基线 §14.4)。 */
43
+ export const TERMINAL_PHASES = [
44
+ "AGREEMENT_REACHED",
45
+ "DECLINED",
46
+ "WITHDRAWN",
47
+ "CANCELLED",
48
+ "EXPIRED",
49
+ ];
50
+ export function isTerminalPhase(phase) {
51
+ return TERMINAL_PHASES.includes(phase);
52
+ }
53
+ /** 新 negotiation 的初始状态:对应转换表首行 none → Inquiry/RFQ start → OPEN。 */
54
+ export function createNegotiationPhase(negotiation_id) {
55
+ return { negotiation_id, phase: "OPEN" };
56
+ }
57
+ function describeEvent(event) {
58
+ switch (event.type) {
59
+ case "withdraw":
60
+ return `withdraw(scope=${event.scope})`;
61
+ case "decline":
62
+ return `decline(scope=${event.scope})`;
63
+ case "offer":
64
+ case "counter_offer":
65
+ case "conditional_offer":
66
+ case "accept_nonbinding":
67
+ return `${event.type}(${event.offer_id})`;
68
+ default:
69
+ return event.type;
70
+ }
71
+ }
72
+ function stateConflict(state, event) {
73
+ return new NegotiationValidationError("state_conflict", `illegal transition: ${state.phase} + ${describeEvent(event)}`, "/phase");
74
+ }
75
+ function applyClarification(state, event) {
76
+ if (state.phase === "OPEN") {
77
+ return {
78
+ negotiation_id: state.negotiation_id,
79
+ phase: "AWAITING_CLARIFICATION",
80
+ resume_phase: "OPEN",
81
+ };
82
+ }
83
+ if (state.phase === "OFFER_OPEN") {
84
+ return {
85
+ negotiation_id: state.negotiation_id,
86
+ phase: "AWAITING_CLARIFICATION",
87
+ resume_phase: "OFFER_OPEN",
88
+ active_offer_id: state.active_offer_id,
89
+ };
90
+ }
91
+ throw stateConflict(state, event);
92
+ }
93
+ function applyClarificationResponse(state, event) {
94
+ if (state.phase === "AWAITING_CLARIFICATION" && state.resume_phase !== undefined) {
95
+ return {
96
+ negotiation_id: state.negotiation_id,
97
+ phase: state.resume_phase,
98
+ active_offer_id: state.active_offer_id,
99
+ };
100
+ }
101
+ throw stateConflict(state, event);
102
+ }
103
+ function applyOffer(state, event) {
104
+ if (state.phase === "OPEN") {
105
+ return {
106
+ negotiation_id: state.negotiation_id,
107
+ phase: "OFFER_OPEN",
108
+ active_offer_id: event.offer_id,
109
+ };
110
+ }
111
+ throw stateConflict(state, event);
112
+ }
113
+ function applyOfferReplacement(state, event) {
114
+ if (state.phase === "OFFER_OPEN") {
115
+ return {
116
+ negotiation_id: state.negotiation_id,
117
+ phase: "OFFER_OPEN",
118
+ active_offer_id: event.offer_id,
119
+ };
120
+ }
121
+ throw stateConflict(state, event);
122
+ }
123
+ function applyOfferExpiry(state, event) {
124
+ if (state.phase === "OFFER_OPEN") {
125
+ return { negotiation_id: state.negotiation_id, phase: "OPEN" };
126
+ }
127
+ throw stateConflict(state, event);
128
+ }
129
+ function applyAccept(state, event) {
130
+ if (state.phase === "OFFER_OPEN") {
131
+ return {
132
+ negotiation_id: state.negotiation_id,
133
+ phase: "AGREEMENT_REACHED",
134
+ active_offer_id: state.active_offer_id,
135
+ };
136
+ }
137
+ throw stateConflict(state, event);
138
+ }
139
+ function applyWithdraw(state, event) {
140
+ if (event.scope === "offer") {
141
+ if (state.phase === "OFFER_OPEN") {
142
+ return { negotiation_id: state.negotiation_id, phase: "OPEN" };
143
+ }
144
+ throw stateConflict(state, event);
145
+ }
146
+ // scope=negotiation:OPEN/OFFER_OPEN → WITHDRAWN(terminal)。
147
+ if (state.phase === "OPEN" || state.phase === "OFFER_OPEN") {
148
+ return { negotiation_id: state.negotiation_id, phase: "WITHDRAWN" };
149
+ }
150
+ throw stateConflict(state, event);
151
+ }
152
+ function applyDecline(state, event) {
153
+ if (event.scope === "offer") {
154
+ if (state.phase === "OFFER_OPEN") {
155
+ return { negotiation_id: state.negotiation_id, phase: "OPEN" };
156
+ }
157
+ throw stateConflict(state, event);
158
+ }
159
+ // scope=negotiation:OPEN/OFFER_OPEN → DECLINED(terminal)。
160
+ if (state.phase === "OPEN" || state.phase === "OFFER_OPEN") {
161
+ return { negotiation_id: state.negotiation_id, phase: "DECLINED" };
162
+ }
163
+ throw stateConflict(state, event);
164
+ }
165
+ /**
166
+ * 按 §21.2 转换表推进 phase。终态拒绝一切事件(不可重开);表中不存在的
167
+ * 组合抛 state_conflict。返回新状态,不改动输入。
168
+ */
169
+ export function transitionPhase(state, event) {
170
+ // 终态不可重开:任何事件一律 state_conflict(§17.4 / 基线 §14.4)。
171
+ if (isTerminalPhase(state.phase)) {
172
+ throw stateConflict(state, event);
173
+ }
174
+ switch (event.type) {
175
+ case "clarification":
176
+ return applyClarification(state, event);
177
+ case "clarification_response":
178
+ return applyClarificationResponse(state, event);
179
+ case "offer":
180
+ return applyOffer(state, event);
181
+ case "counter_offer":
182
+ case "conditional_offer":
183
+ return applyOfferReplacement(state, event);
184
+ case "offer_expired":
185
+ return applyOfferExpiry(state, event);
186
+ case "accept_nonbinding":
187
+ return applyAccept(state, event);
188
+ case "withdraw":
189
+ return applyWithdraw(state, event);
190
+ case "decline":
191
+ return applyDecline(state, event);
192
+ case "cancel":
193
+ // 非终态(顶层守卫已保证)→ CANCELLED(terminal)。
194
+ return { negotiation_id: state.negotiation_id, phase: "CANCELLED" };
195
+ case "negotiation_expired":
196
+ // 非终态 → EXPIRED(terminal)。
197
+ return { negotiation_id: state.negotiation_id, phase: "EXPIRED" };
198
+ }
199
+ }
200
+ //# sourceMappingURL=phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase.js","sourceRoot":"","sources":["../../../src/negotiation/state/phase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
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
+ * shopping.negotiation/0.1 protocol types.
18
+ *
19
+ * These types mirror the frozen JSON schemas in
20
+ * contracts/shopping.negotiation/0.1/. The schemas are the source of truth;
21
+ * keep this file in sync with them.
22
+ */
23
+ export declare const PROTOCOL_VERSION: "shopping.negotiation/0.1";
24
+ export type Role = "buyer" | "merchant";
25
+ export type NextActor = "buyer" | "merchant" | "none";
26
+ export type ConversationStatus = "open" | "waiting_merchant" | "waiting_buyer" | "human_required" | "closed";
27
+ export type DecisionAction = "ask" | "propose" | "counter" | "accept_nonbinding" | "decline" | "escalate";
28
+ export type StockStatus = "available" | "low" | "out_of_stock" | "unknown";
29
+ export interface StockState {
30
+ status: StockStatus;
31
+ quantity: number;
32
+ observed_at: string;
33
+ /** Negotiation never reserves inventory; always false. */
34
+ reserved: false;
35
+ }
36
+ export interface DeliveryQuote {
37
+ eta_start: string;
38
+ eta_end: string;
39
+ fee: number;
40
+ }
41
+ export interface Proposal {
42
+ sku: string;
43
+ quantity: number;
44
+ unit_price: number;
45
+ currency: string;
46
+ stock: StockState;
47
+ delivery: DeliveryQuote;
48
+ after_sales_policy_refs: string[];
49
+ /** ISO date-time after which the quote is no longer a current commitment. */
50
+ valid_until: string;
51
+ }
52
+ export interface NegotiationDecision {
53
+ protocol_version: typeof PROTOCOL_VERSION;
54
+ conversation_id: string;
55
+ in_reply_to_message_id: number;
56
+ action: DecisionAction;
57
+ proposal?: Proposal;
58
+ open_issues: string[];
59
+ public_message: string;
60
+ confidence?: number;
61
+ reason_codes: string[];
62
+ request_human_review: boolean;
63
+ }
64
+ export type PolicyResultKind = "accepted" | "rejected_retryable" | "human_required";
65
+ export interface PolicyResult {
66
+ protocol_version: typeof PROTOCOL_VERSION;
67
+ result: PolicyResultKind;
68
+ conversation_id: string;
69
+ message_id?: number;
70
+ next_actor: NextActor;
71
+ reason_codes: string[];
72
+ public_reason: string;
73
+ retries_remaining: number;
74
+ }
75
+ export interface SnapshotSource {
76
+ backend: "local_marketplace" | "external_platform";
77
+ external_id?: string;
78
+ observed_at: string;
79
+ }
80
+ export interface SnapshotProduct {
81
+ sku: string;
82
+ title: string;
83
+ currency: string;
84
+ list_price: number;
85
+ description?: string;
86
+ }
87
+ export interface SnapshotMessage {
88
+ id: number;
89
+ sender_role: Role;
90
+ created_at: string;
91
+ action?: DecisionAction;
92
+ public_message: string;
93
+ proposal?: Proposal | null;
94
+ }
95
+ export interface VisiblePolicyResult {
96
+ result: PolicyResultKind;
97
+ reason_codes: string[];
98
+ public_reason: string;
99
+ }
100
+ export interface NegotiationSnapshot {
101
+ protocol_version: typeof PROTOCOL_VERSION;
102
+ conversation: {
103
+ id: string;
104
+ status: ConversationStatus;
105
+ next_actor: NextActor;
106
+ };
107
+ role: Role;
108
+ in_reply_to_message_id: number;
109
+ product: SnapshotProduct;
110
+ stock: StockState & {
111
+ source: SnapshotSource;
112
+ };
113
+ delivery: DeliveryQuote & {
114
+ notes?: string;
115
+ };
116
+ after_sales_policies: {
117
+ ref: string;
118
+ summary: string;
119
+ }[];
120
+ messages: SnapshotMessage[];
121
+ current_proposal: Proposal | null;
122
+ open_issues: string[];
123
+ policy_results: VisiblePolicyResult[];
124
+ }
125
+ export interface CapabilityFlags {
126
+ catalog_read: boolean;
127
+ inventory_read: boolean;
128
+ consultation_read: boolean;
129
+ consultation_write: boolean;
130
+ price_negotiate: boolean;
131
+ webhook: boolean;
132
+ /** shopping.negotiation/0.1 never creates orders; always false. */
133
+ orders: false;
134
+ }
135
+ export interface CommerceCapabilities {
136
+ protocol_versions: string[];
137
+ backend: "local_marketplace" | "external_platform";
138
+ capabilities: CapabilityFlags;
139
+ }
@@ -0,0 +1,24 @@
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
+ * shopping.negotiation/0.1 protocol types.
18
+ *
19
+ * These types mirror the frozen JSON schemas in
20
+ * contracts/shopping.negotiation/0.1/. The schemas are the source of truth;
21
+ * keep this file in sync with them.
22
+ */
23
+ export const PROTOCOL_VERSION = "shopping.negotiation/0.1";
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/negotiation/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAAmC,CAAC"}
@@ -0,0 +1,54 @@
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
+ * 出站 HTTP 客户端共享安全原语(出站侧加固评审项统一实施)。
18
+ *
19
+ * 仓库所有出站 fetch 客户端(A2A client / Agent Card / UCP profile / catalog /
20
+ * shopping-cli / commerce API)统一三条纪律:
21
+ *
22
+ * 1. **redirect: "manual"**:绝不跟随 3xx——重定向目标不经过 SSRF/DNS 复查,
23
+ * 且重定向可能把 Authorization 头转发给第三方(resolve/ucp 此前已实施,
24
+ * 本模块提供统一判定 `isRedirectResponse` 供其余客户端对齐)。
25
+ * 2. **超时覆盖响应体读取**:AbortController 的 timer 必须活到 body 读完——
26
+ * 对端在响应头后停滞 body 是经典的永久挂起手法(此前 timer 在 headers
27
+ * 到达即 clear,body 读不在任何超时保护内)。
28
+ * 3. **响应体大小上限**:Content-Length 预检 + 流式读取计数,超过即中断
29
+ * (防恶意对端回传 GB 级 body 打爆进程内存)。
30
+ *
31
+ * 错误全部类型化(SafeHttpError + code),调用方 catch 后映射为自己的域错误
32
+ * (fail-closed,不静默容错)。零新增依赖:Node 22 原生 fetch + streams。
33
+ */
34
+ /** 响应体上限缺省值(8 MiB;Agent Card/UCP profile 等正常响应远小于此)。 */
35
+ export declare const DEFAULT_MAX_RESPONSE_BYTES: number;
36
+ export type SafeHttpErrorCode = "redirect" | "response_too_large" | "invalid_json";
37
+ export declare class SafeHttpError extends Error {
38
+ readonly code: SafeHttpErrorCode;
39
+ constructor(code: SafeHttpErrorCode, message: string);
40
+ }
41
+ /** redirect: "manual" 下 3xx / opaqueredirect 的统一拒绝判定。 */
42
+ export declare function isRedirectResponse(response: Response): boolean;
43
+ export interface ReadJsonBodyOptions {
44
+ /** 响应体上限(缺省 DEFAULT_MAX_RESPONSE_BYTES)。 */
45
+ maxBytes?: number;
46
+ /** 请求的 AbortController signal:abort 时中断挂起的 body 读(超时兜底)。 */
47
+ signal?: AbortSignal;
48
+ }
49
+ /**
50
+ * 流式读取响应体并解析 JSON。Content-Length 预检 + 读取计数超上限即
51
+ * `response_too_large`;signal abort 会 cancel 底层流(挂起的 read 被中断,
52
+ * 由调用方按自己的超时错误路径处理);JSON 解析失败抛 `invalid_json`。
53
+ */
54
+ export declare function readJsonBody(response: Response, options?: ReadJsonBodyOptions): Promise<unknown>;
@@ -0,0 +1,116 @@
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
+ * 出站 HTTP 客户端共享安全原语(出站侧加固评审项统一实施)。
18
+ *
19
+ * 仓库所有出站 fetch 客户端(A2A client / Agent Card / UCP profile / catalog /
20
+ * shopping-cli / commerce API)统一三条纪律:
21
+ *
22
+ * 1. **redirect: "manual"**:绝不跟随 3xx——重定向目标不经过 SSRF/DNS 复查,
23
+ * 且重定向可能把 Authorization 头转发给第三方(resolve/ucp 此前已实施,
24
+ * 本模块提供统一判定 `isRedirectResponse` 供其余客户端对齐)。
25
+ * 2. **超时覆盖响应体读取**:AbortController 的 timer 必须活到 body 读完——
26
+ * 对端在响应头后停滞 body 是经典的永久挂起手法(此前 timer 在 headers
27
+ * 到达即 clear,body 读不在任何超时保护内)。
28
+ * 3. **响应体大小上限**:Content-Length 预检 + 流式读取计数,超过即中断
29
+ * (防恶意对端回传 GB 级 body 打爆进程内存)。
30
+ *
31
+ * 错误全部类型化(SafeHttpError + code),调用方 catch 后映射为自己的域错误
32
+ * (fail-closed,不静默容错)。零新增依赖:Node 22 原生 fetch + streams。
33
+ */
34
+ /** 响应体上限缺省值(8 MiB;Agent Card/UCP profile 等正常响应远小于此)。 */
35
+ export const DEFAULT_MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
36
+ export class SafeHttpError extends Error {
37
+ code;
38
+ constructor(code, message) {
39
+ super(message);
40
+ this.name = "SafeHttpError";
41
+ this.code = code;
42
+ }
43
+ }
44
+ /** redirect: "manual" 下 3xx / opaqueredirect 的统一拒绝判定。 */
45
+ export function isRedirectResponse(response) {
46
+ return (response.redirected ||
47
+ response.type === "opaqueredirect" ||
48
+ (response.status >= 300 && response.status < 400));
49
+ }
50
+ /**
51
+ * 流式读取响应体并解析 JSON。Content-Length 预检 + 读取计数超上限即
52
+ * `response_too_large`;signal abort 会 cancel 底层流(挂起的 read 被中断,
53
+ * 由调用方按自己的超时错误路径处理);JSON 解析失败抛 `invalid_json`。
54
+ */
55
+ export async function readJsonBody(response, options = {}) {
56
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_RESPONSE_BYTES;
57
+ const signal = options.signal;
58
+ // Content-Length 预检:声明长度超限直接拒绝,不开始读(快失败)。
59
+ const contentLength = response.headers.get("content-length");
60
+ if (contentLength !== null) {
61
+ const declared = Number(contentLength);
62
+ if (Number.isFinite(declared) && declared > maxBytes) {
63
+ throw new SafeHttpError("response_too_large", `response content-length ${declared} exceeds limit ${maxBytes}`);
64
+ }
65
+ }
66
+ if (response.body === null) {
67
+ throw new SafeHttpError("invalid_json", "response has no body");
68
+ }
69
+ const reader = response.body.getReader();
70
+ const chunks = [];
71
+ let total = 0;
72
+ // signal abort → cancel 底层流:挂起的 reader.read() 被中断(否则慢 body
73
+ // 会永远挂住——timer 只 abort fetch 头阶段,读阶段必须手动取消)。
74
+ const onAbort = () => {
75
+ void reader.cancel().catch(() => { });
76
+ };
77
+ signal?.addEventListener("abort", onAbort, { once: true });
78
+ try {
79
+ for (;;) {
80
+ const { done, value } = await reader.read();
81
+ if (done)
82
+ break;
83
+ total += value.byteLength;
84
+ if (total > maxBytes) {
85
+ void reader.cancel().catch(() => { });
86
+ throw new SafeHttpError("response_too_large", `response body exceeds limit ${maxBytes} bytes`);
87
+ }
88
+ chunks.push(value);
89
+ }
90
+ }
91
+ finally {
92
+ signal?.removeEventListener("abort", onAbort);
93
+ }
94
+ const text = new TextDecoder().decode(concatChunks(chunks));
95
+ try {
96
+ return JSON.parse(text);
97
+ }
98
+ catch {
99
+ throw new SafeHttpError("invalid_json", "response body is not valid JSON");
100
+ }
101
+ }
102
+ function concatChunks(chunks) {
103
+ if (chunks.length === 0)
104
+ return new Uint8Array(0);
105
+ if (chunks.length === 1)
106
+ return chunks[0] ?? new Uint8Array(0);
107
+ const total = chunks.reduce((sum, c) => sum + c.byteLength, 0);
108
+ const out = new Uint8Array(total);
109
+ let offset = 0;
110
+ for (const chunk of chunks) {
111
+ out.set(chunk, offset);
112
+ offset += chunk.byteLength;
113
+ }
114
+ return out;
115
+ }
116
+ //# sourceMappingURL=safe-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-http.js","sourceRoot":"","sources":["../../src/net/safe-http.ts"],"names":[],"mappings":"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"}