@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,28 @@
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
+ * discovery/ucp — UCP Profile(UCP 2026-04-08 spec family,基线 §3.2 / §25 / §43)。
18
+ *
19
+ * WP1:UCP Profile 模型 + resolver。后续 WP3 通过 discovery/resolve.ts 集成
20
+ * (本 WP 不改动 resolve.ts)。
21
+ */
22
+ export { UcpError, isUcpError } from "./error.js";
23
+ export { computeCapabilityIntersection, intersectionView, requireCapabilitiesCompatible, selectRelevantCapabilities, validateRequiresConstraint, } from "./intersect.js";
24
+ export { validateUcpProfile } from "./validate.js";
25
+ export { UcpResolver, parseCacheControl, WELL_KNOWN_UCP_PATH } from "./resolver.js";
26
+ export { buildKiwiNegotiationCapability, buildKiwiVendorProfile, KIWI_NEGOTIATION_SCHEMA_PATH, KIWI_NEGOTIATION_SPEC_PATH, KIWI_VENDOR_AUTHORITY, KIWI_VENDOR_CAPABILITY_NAME, KIWI_VENDOR_SERVICE_NAME, } from "./vendor.js";
27
+ export { UCP_TRANSPORTS, isDnsLabel, isHttpsUrl, originHostFor, parseCapabilityNamespace, parseServiceNamespace, reverseDomainToAuthority, } from "./types.js";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/discovery/ucp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,6BAA6B,EAC7B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAOpF,OAAO,EACL,8BAA8B,EAC9B,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,cAAc,EACd,UAAU,EACV,UAAU,EACV,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,148 @@
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
+ * UCP capability intersection(server-selects 语义;基线 §3.2 / §25 / §43)。
18
+ *
19
+ * UCP 官方 Intersection Algorithm(按规范给定实现,不发明):
20
+ * 1. Compute intersection —— business 的每个 capability,若 platform 也声明同名 → 纳入;
21
+ * 2. Select version —— 对交集中每个 capability,取双方 version 数组的交集;非空选最高
22
+ * (最新日期,compareUcpVersions);为空 → 该 capability 移出交集;
23
+ * 3. Prune orphaned extensions —— extends 的 parent 不在交集中则移除
24
+ * (单 parent 必须在;多 parent 数组至少一个在);
25
+ * 4. Repeat pruning —— 重复 3 直到不再变化(处理传递依赖链到不动点)。
26
+ *
27
+ * extension schema 的 requires 约束(条目内联 `requires`;真实集成从 schema 文档解析后内联):
28
+ * - requires.protocol.min / max 与 requires.capabilities.<parent>.min / max;
29
+ * min 含、max 含、max 缺省 = 无上限;版本字符串按 YYYY-MM-DD 日期比较;
30
+ * - 交集计算时若协商 protocol version 或 parent capability version 不满足 requires →
31
+ * 该 extension 排除(requires_unsatisfied)并重新剪枝;
32
+ * - requires.capabilities 的键 MUST 是其 extends 键的子集,否则该 schema 声明本身非法
33
+ * (validateRequiresConstraint;在交集里按 fail-closed 记为 requires_unsatisfied)。
34
+ *
35
+ * UCP 是 server-selects:business(服务端)负责算交集,platform 宣告自己的 profile。
36
+ * 交集为空或版本互不兼容 → capabilities_incompatible(业务结果,非 transport 错误)。
37
+ * selectRelevantCapabilities 按 UCP 'Relevance' 规则从交集挑出与某操作相关的能力集:
38
+ * root 匹配操作类型 + extension extends 命中相关 root(传递闭包)。
39
+ *
40
+ * 零新增依赖;纯函数,不抓取 schema —— requires 以条目内联形式提供。
41
+ */
42
+ import type { UcpCapabilityDeclaration, UcpProfile } from "./types.js";
43
+ /**
44
+ * capability 交集排除原因枚举:
45
+ * - `no_mutual` —— business 声明但 platform 未声明同名 capability;
46
+ * - `version_incompatible` —— 双方都声明但 version 数组无交集(版本互不兼容);
47
+ * - `orphaned_extension` —— extends 的 parent 不在交集中
48
+ * (单 parent 必须在 / 多 parent 至少一个在);
49
+ * - `requires_unsatisfied` —— requires 约束不满足,或 requires 声明本身非法(fail-closed)。
50
+ */
51
+ export type CapabilityExclusionReason = "no_mutual" | "version_incompatible" | "orphaned_extension" | "requires_unsatisfied";
52
+ /** 版本上下界(min 含、max 含、max 缺省 = 无上限)。 */
53
+ export interface UcpRequiresVersionBounds {
54
+ /** 含边界下限(YYYY-MM-DD)。 */
55
+ min?: string;
56
+ /** 含边界上限(YYYY-MM-DD);缺省 = 无上限。 */
57
+ max?: string;
58
+ }
59
+ /** extension schema 的 requires 约束。 */
60
+ export interface UcpRequiresConstraint {
61
+ /** 对协商协议版本(negotiatedProtocolVersion)的约束。 */
62
+ protocol?: UcpRequiresVersionBounds;
63
+ /** 对 extends 中 parent capability 选中版本的约束;键 MUST ⊆ extends 键。 */
64
+ capabilities?: Record<string, UcpRequiresVersionBounds>;
65
+ }
66
+ /** 携带 schema requires 的 capability 声明(requires 从 schema 文档解析后内联到条目)。 */
67
+ export interface UcpCapabilityWithRequires extends UcpCapabilityDeclaration {
68
+ requires?: UcpRequiresConstraint;
69
+ }
70
+ /** 交集活跃项:选中版本 + business 侧该版本的声明。 */
71
+ export interface ActiveCapability {
72
+ /** 双方共同版本中选出的最高(最新)版本。 */
73
+ version: string;
74
+ /** business 侧选中版本的 capability 声明(可能携带 requires)。 */
75
+ entry: UcpCapabilityWithRequires;
76
+ }
77
+ /** 被排除的 capability 记录。 */
78
+ export interface ExcludedCapability {
79
+ name: string;
80
+ reason: CapabilityExclusionReason;
81
+ }
82
+ export interface CapabilityIntersectionResult {
83
+ /** 存活的能力集(name → 选中版本 + business 侧声明),保序(business 声明顺序)。 */
84
+ active: Map<string, ActiveCapability>;
85
+ /** 被排除的 capability 及原因(仅 business 侧声明过的名字;platform-only 不出现)。 */
86
+ excluded: ExcludedCapability[];
87
+ /** 交集是否非空(false → capabilities_incompatible 业务结果)。 */
88
+ compatible: boolean;
89
+ }
90
+ /** JSON 友好的交集视图(CounterpartyProfile 用,避免把 Map 泄漏到档案里)。 */
91
+ export interface UcpIntersectionView {
92
+ /** 交集是否非空(false → capabilities_incompatible 业务结果)。 */
93
+ compatible: boolean;
94
+ /** 存活能力集(保序,business 声明顺序):name → 选中版本。 */
95
+ active: Array<{
96
+ name: string;
97
+ version: string;
98
+ }>;
99
+ /** 被排除的 capability 及原因。 */
100
+ excluded: ExcludedCapability[];
101
+ }
102
+ /** 把 computeCapabilityIntersection 的结果投影为 JSON 友好视图。 */
103
+ export declare function intersectionView(result: CapabilityIntersectionResult): UcpIntersectionView;
104
+ /** 版本字符串是否为合法 YYYY-MM-DD spec 日期。 */
105
+ export declare function isUcpVersionDate(s: string): boolean;
106
+ /**
107
+ * 版本比较:YYYY-MM-DD 按日期值比较;合法日期 > 非日期字符串;两个非日期按字典序
108
+ * 比较(确定性回退,覆盖 vendor "1.0" 等占位版本)。返回负 / 零 / 正。
109
+ */
110
+ export declare function compareUcpVersions(a: string, b: string): number;
111
+ export interface RequiresValidationResult {
112
+ valid: boolean;
113
+ /** 人类可读问题列表;valid=true 时为空。 */
114
+ problems: string[];
115
+ }
116
+ /**
117
+ * requires 声明合法性校验("该 schema 声明本身非法"判定):
118
+ * - requires 必须是对象;
119
+ * - protocol / capabilities 中每个 bounds 的 min/max 必须是合法 YYYY-MM-DD 且 min <= max;
120
+ * - requires.capabilities 的键 MUST 是其 extends 键的子集
121
+ * (单 parent extends 视为 [extends];无 extends 视为 [])。
122
+ */
123
+ export declare function validateRequiresConstraint(requires: unknown, extendsValue: string | string[] | undefined): RequiresValidationResult;
124
+ /**
125
+ * UCP capability intersection(business 侧计算,server-selects)。
126
+ *
127
+ * 严格实现四步 Intersection Algorithm + requires 约束(见文件头)。返回结构化结果:
128
+ * - `active`:存活能力集(name → 选中版本 + business 侧声明);
129
+ * - `excluded`:被排除能力及原因(reason 枚举见 CapabilityExclusionReason);
130
+ * - `compatible`:交集是否非空。
131
+ */
132
+ export declare function computeCapabilityIntersection(businessProfile: UcpProfile, platformProfile: UcpProfile, negotiatedProtocolVersion?: string): CapabilityIntersectionResult;
133
+ /** 交集为空或版本互不兼容时抛的业务错误(capabilities_incompatible,非 transport 错误)。 */
134
+ export declare class CapabilityIncompatibleError extends Error {
135
+ readonly code: "capability_incompatible";
136
+ constructor(message: string);
137
+ }
138
+ /** 兼容断言:交集为空/互不兼容时抛 CapabilityIncompatibleError;否则原样返回交集。 */
139
+ export declare function requireCapabilitiesCompatible(result: CapabilityIntersectionResult): CapabilityIntersectionResult;
140
+ /** root capability 名是否匹配操作类型:全名相等,或末段 capability 标签相等。 */
141
+ export declare function matchesOperationType(operationType: string, rootName: string): boolean;
142
+ /**
143
+ * 按 UCP 'Relevance' 规则从交集挑出与某操作相关的能力集:
144
+ * - root capability(无 extends)名匹配操作类型(matchesOperationType);
145
+ * - extension extends 命中相关 root,沿 extends 传递闭包纳入(单/多 parent 任一命中即可)。
146
+ * 返回 `active` 的一个子集(保序)。无匹配 root 时返回空集。
147
+ */
148
+ export declare function selectRelevantCapabilities(active: ReadonlyMap<string, ActiveCapability>, operationType: string): Map<string, ActiveCapability>;
@@ -0,0 +1,312 @@
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
+ /** YYYY-MM-DD spec 日期格式(UCP §43)。 */
17
+ const SPEC_DATE_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
18
+ /** 把 computeCapabilityIntersection 的结果投影为 JSON 友好视图。 */
19
+ export function intersectionView(result) {
20
+ return {
21
+ compatible: result.compatible,
22
+ active: [...result.active.entries()].map(([name, cap]) => ({ name, version: cap.version })),
23
+ excluded: result.excluded,
24
+ };
25
+ }
26
+ /** 解析 YYYY-MM-DD 为 UTC 毫秒时间戳;非法返回 undefined。 */
27
+ function parseSpecDate(s) {
28
+ const m = SPEC_DATE_RE.exec(s);
29
+ if (m === null)
30
+ return undefined;
31
+ const year = Number(m[1]);
32
+ const month = Number(m[2]);
33
+ const day = Number(m[3]);
34
+ const time = Date.UTC(year, month - 1, day);
35
+ const d = new Date(time);
36
+ if (d.getUTCFullYear() !== year || d.getUTCMonth() !== month - 1 || d.getUTCDate() !== day) {
37
+ return undefined;
38
+ }
39
+ return time;
40
+ }
41
+ /** 版本字符串是否为合法 YYYY-MM-DD spec 日期。 */
42
+ export function isUcpVersionDate(s) {
43
+ return parseSpecDate(s) !== undefined;
44
+ }
45
+ /**
46
+ * 版本比较:YYYY-MM-DD 按日期值比较;合法日期 > 非日期字符串;两个非日期按字典序
47
+ * 比较(确定性回退,覆盖 vendor "1.0" 等占位版本)。返回负 / 零 / 正。
48
+ */
49
+ export function compareUcpVersions(a, b) {
50
+ const da = parseSpecDate(a);
51
+ const db = parseSpecDate(b);
52
+ if (da !== undefined && db !== undefined)
53
+ return da - db;
54
+ if (da !== undefined)
55
+ return 1;
56
+ if (db !== undefined)
57
+ return -1;
58
+ return a < b ? -1 : a > b ? 1 : 0;
59
+ }
60
+ function indexCapabilities(profile) {
61
+ const map = new Map();
62
+ const caps = profile.ucp.capabilities;
63
+ if (caps === undefined)
64
+ return map;
65
+ for (const [name, declarations] of Object.entries(caps)) {
66
+ map.set(name, declarations.map((d) => d));
67
+ }
68
+ return map;
69
+ }
70
+ function extendsList(extendsValue) {
71
+ if (extendsValue === undefined)
72
+ return [];
73
+ return typeof extendsValue === "string" ? [extendsValue] : extendsValue;
74
+ }
75
+ /** 运行时读取条目内联 requires;malformed(非对象)返回 "malformed"(fail-closed)。 */
76
+ function readRequires(decl) {
77
+ const raw = decl.requires;
78
+ if (raw === undefined)
79
+ return undefined;
80
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw))
81
+ return "malformed";
82
+ return raw;
83
+ }
84
+ function satisfiesBounds(version, bounds) {
85
+ if (bounds === undefined)
86
+ return true;
87
+ if (bounds.min !== undefined && compareUcpVersions(version, bounds.min) < 0)
88
+ return false;
89
+ if (bounds.max !== undefined && compareUcpVersions(version, bounds.max) > 0)
90
+ return false;
91
+ return true;
92
+ }
93
+ function requiresSatisfied(requires, protocolVersion, active) {
94
+ if (requires.protocol !== undefined && !satisfiesBounds(protocolVersion, requires.protocol)) {
95
+ return false;
96
+ }
97
+ if (requires.capabilities !== undefined) {
98
+ for (const [parentName, bounds] of Object.entries(requires.capabilities)) {
99
+ const parent = active.get(parentName);
100
+ // requires 指定的 parent 不在交集中 → 无法满足(即使多 parent 其他成员仍活跃)。
101
+ if (parent === undefined)
102
+ return false;
103
+ if (!satisfiesBounds(parent.version, bounds))
104
+ return false;
105
+ }
106
+ }
107
+ return true;
108
+ }
109
+ /** 剪枝条件:root(无 extends)恒保留;extension 需至少一个 parent 在交集。 */
110
+ function hasActiveParent(extendsValue, active) {
111
+ const parents = extendsList(extendsValue);
112
+ if (parents.length === 0)
113
+ return true;
114
+ return parents.some((p) => active.has(p));
115
+ }
116
+ function validateBounds(bounds, path, problems) {
117
+ const min = bounds.min;
118
+ const max = bounds.max;
119
+ if (min !== undefined && (typeof min !== "string" || !isUcpVersionDate(min))) {
120
+ problems.push(`${path}.min must be a YYYY-MM-DD date`);
121
+ }
122
+ if (max !== undefined && (typeof max !== "string" || !isUcpVersionDate(max))) {
123
+ problems.push(`${path}.max must be a YYYY-MM-DD date`);
124
+ }
125
+ if (typeof min === "string" &&
126
+ typeof max === "string" &&
127
+ isUcpVersionDate(min) &&
128
+ isUcpVersionDate(max) &&
129
+ compareUcpVersions(min, max) > 0) {
130
+ problems.push(`${path}.min must not be greater than max`);
131
+ }
132
+ }
133
+ /**
134
+ * requires 声明合法性校验("该 schema 声明本身非法"判定):
135
+ * - requires 必须是对象;
136
+ * - protocol / capabilities 中每个 bounds 的 min/max 必须是合法 YYYY-MM-DD 且 min <= max;
137
+ * - requires.capabilities 的键 MUST 是其 extends 键的子集
138
+ * (单 parent extends 视为 [extends];无 extends 视为 [])。
139
+ */
140
+ export function validateRequiresConstraint(requires, extendsValue) {
141
+ const problems = [];
142
+ if (requires === undefined)
143
+ return { valid: true, problems };
144
+ if (requires === null || typeof requires !== "object" || Array.isArray(requires)) {
145
+ return { valid: false, problems: ["requires must be an object"] };
146
+ }
147
+ const obj = requires;
148
+ const extendsKeys = extendsList(extendsValue);
149
+ if (obj.protocol !== undefined) {
150
+ if (obj.protocol === null || typeof obj.protocol !== "object" || Array.isArray(obj.protocol)) {
151
+ problems.push("requires.protocol must be an object");
152
+ }
153
+ else {
154
+ validateBounds(obj.protocol, "requires.protocol", problems);
155
+ }
156
+ }
157
+ if (obj.capabilities !== undefined) {
158
+ if (obj.capabilities === null ||
159
+ typeof obj.capabilities !== "object" ||
160
+ Array.isArray(obj.capabilities)) {
161
+ problems.push("requires.capabilities must be an object");
162
+ }
163
+ else {
164
+ const caps = obj.capabilities;
165
+ for (const [parent, bounds] of Object.entries(caps)) {
166
+ const path = `requires.capabilities.${parent}`;
167
+ if (!extendsKeys.includes(parent)) {
168
+ problems.push(`${path}: key must be a subset of the capability's extends keys (illegal declaration)`);
169
+ continue;
170
+ }
171
+ if (bounds === null || typeof bounds !== "object" || Array.isArray(bounds)) {
172
+ problems.push(`${path} must be an object`);
173
+ continue;
174
+ }
175
+ validateBounds(bounds, path, problems);
176
+ }
177
+ }
178
+ }
179
+ return { valid: problems.length === 0, problems };
180
+ }
181
+ /**
182
+ * UCP capability intersection(business 侧计算,server-selects)。
183
+ *
184
+ * 严格实现四步 Intersection Algorithm + requires 约束(见文件头)。返回结构化结果:
185
+ * - `active`:存活能力集(name → 选中版本 + business 侧声明);
186
+ * - `excluded`:被排除能力及原因(reason 枚举见 CapabilityExclusionReason);
187
+ * - `compatible`:交集是否非空。
188
+ */
189
+ export function computeCapabilityIntersection(businessProfile, platformProfile, negotiatedProtocolVersion) {
190
+ const protocolVersion = negotiatedProtocolVersion ?? businessProfile.ucp.version;
191
+ const business = indexCapabilities(businessProfile);
192
+ const platform = indexCapabilities(platformProfile);
193
+ const excluded = [];
194
+ const active = new Map();
195
+ // Step 1 + 2:同名交集;对每个 capability 取双方 version 数组交集,非空选最高。
196
+ for (const [name, businessDecls] of business) {
197
+ const platformDecls = platform.get(name);
198
+ if (platformDecls === undefined) {
199
+ excluded.push({ name, reason: "no_mutual" });
200
+ continue;
201
+ }
202
+ const platformVersions = new Set(platformDecls.map((d) => d.version));
203
+ const common = businessDecls.map((d) => d.version).filter((v) => platformVersions.has(v));
204
+ if (common.length === 0) {
205
+ excluded.push({ name, reason: "version_incompatible" });
206
+ continue;
207
+ }
208
+ const selectedVersion = common.reduce((a, b) => (compareUcpVersions(a, b) >= 0 ? a : b));
209
+ const entry = businessDecls.find((d) => d.version === selectedVersion);
210
+ if (entry !== undefined) {
211
+ active.set(name, { version: selectedVersion, entry });
212
+ }
213
+ }
214
+ // Step 3 + 4 + requires:迭代剪枝到不动点。
215
+ // requires 先于孤儿判定(requires 不满足 → 排除并重新剪枝,其下游 extension 再判孤儿)。
216
+ let changed = true;
217
+ while (changed) {
218
+ changed = false;
219
+ for (const [name, cap] of active) {
220
+ const requires = readRequires(cap.entry);
221
+ if (requires === "malformed") {
222
+ excluded.push({ name, reason: "requires_unsatisfied" });
223
+ active.delete(name);
224
+ changed = true;
225
+ continue;
226
+ }
227
+ if (!validateRequiresConstraint(requires, cap.entry.extends).valid) {
228
+ excluded.push({ name, reason: "requires_unsatisfied" });
229
+ active.delete(name);
230
+ changed = true;
231
+ continue;
232
+ }
233
+ if (requires !== undefined && !requiresSatisfied(requires, protocolVersion, active)) {
234
+ excluded.push({ name, reason: "requires_unsatisfied" });
235
+ active.delete(name);
236
+ changed = true;
237
+ continue;
238
+ }
239
+ if (!hasActiveParent(cap.entry.extends, active)) {
240
+ excluded.push({ name, reason: "orphaned_extension" });
241
+ active.delete(name);
242
+ changed = true;
243
+ continue;
244
+ }
245
+ }
246
+ }
247
+ return { active, excluded, compatible: active.size > 0 };
248
+ }
249
+ /** 交集为空或版本互不兼容时抛的业务错误(capabilities_incompatible,非 transport 错误)。 */
250
+ export class CapabilityIncompatibleError extends Error {
251
+ code;
252
+ constructor(message) {
253
+ super(message);
254
+ this.name = "CapabilityIncompatibleError";
255
+ this.code = "capability_incompatible";
256
+ }
257
+ }
258
+ /** 兼容断言:交集为空/互不兼容时抛 CapabilityIncompatibleError;否则原样返回交集。 */
259
+ export function requireCapabilitiesCompatible(result) {
260
+ if (!result.compatible) {
261
+ const detail = result.excluded.map((e) => `${e.name} (${e.reason})`).join("; ");
262
+ throw new CapabilityIncompatibleError(`no mutually compatible UCP capabilities: ${detail || "empty intersection"}`);
263
+ }
264
+ return result;
265
+ }
266
+ /** root capability 名是否匹配操作类型:全名相等,或末段 capability 标签相等。 */
267
+ export function matchesOperationType(operationType, rootName) {
268
+ if (rootName === operationType)
269
+ return true;
270
+ const lastSegment = rootName.slice(rootName.lastIndexOf(".") + 1);
271
+ return lastSegment.length > 0 && lastSegment === operationType;
272
+ }
273
+ /**
274
+ * 按 UCP 'Relevance' 规则从交集挑出与某操作相关的能力集:
275
+ * - root capability(无 extends)名匹配操作类型(matchesOperationType);
276
+ * - extension extends 命中相关 root,沿 extends 传递闭包纳入(单/多 parent 任一命中即可)。
277
+ * 返回 `active` 的一个子集(保序)。无匹配 root 时返回空集。
278
+ */
279
+ export function selectRelevantCapabilities(active, operationType) {
280
+ const relevant = new Map();
281
+ const children = new Map();
282
+ for (const [name, cap] of active) {
283
+ for (const parent of extendsList(cap.entry.extends)) {
284
+ const list = children.get(parent);
285
+ if (list === undefined)
286
+ children.set(parent, [name]);
287
+ else
288
+ list.push(name);
289
+ }
290
+ }
291
+ const queue = [];
292
+ for (const [name, cap] of active) {
293
+ if (extendsList(cap.entry.extends).length === 0 && matchesOperationType(operationType, name)) {
294
+ relevant.set(name, cap);
295
+ queue.push(name);
296
+ }
297
+ }
298
+ while (queue.length > 0) {
299
+ const parent = queue.shift();
300
+ if (parent === undefined)
301
+ break;
302
+ for (const kid of children.get(parent) ?? []) {
303
+ const cap = active.get(kid);
304
+ if (cap !== undefined && !relevant.has(kid)) {
305
+ relevant.set(kid, cap);
306
+ queue.push(kid);
307
+ }
308
+ }
309
+ }
310
+ return relevant;
311
+ }
312
+ //# sourceMappingURL=intersect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersect.js","sourceRoot":"","sources":["../../../src/discovery/ucp/intersect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
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 { UcpRejectedEntry } from "./validate.js";
17
+ import type { UcpProfile } from "./types.js";
18
+ export declare const WELL_KNOWN_UCP_PATH = "/.well-known/ucp";
19
+ export interface UcpResolverOptions {
20
+ fetchImpl?: typeof fetch;
21
+ /** 抓取超时 ms(默认 10000)。 */
22
+ timeoutMs?: number;
23
+ /** 透传给 url-policy 的私网放行开关(默认 false,fail-closed)。 */
24
+ allowPrivateRanges?: boolean;
25
+ /** 跳过请求前 DNS 复查(测试用;生产应保持 false)。 */
26
+ skipDnsCheck?: boolean;
27
+ resolveIp?: (hostname: string) => Promise<string[]>;
28
+ /** 注入时钟(测试用)。缺省 Date.now。 */
29
+ now?: () => number;
30
+ }
31
+ export interface UcpResolveInput {
32
+ domain?: string;
33
+ profileUrl?: string;
34
+ }
35
+ export interface UcpResolveResult {
36
+ profile: UcpProfile;
37
+ /** 被 profile 校验丢弃的条目(按条目粒度拒绝,不影响其余条目)。 */
38
+ rejected: UcpRejectedEntry[];
39
+ /** `domain:<domain>` 或 `profile:<url>`。 */
40
+ source: string;
41
+ fetchedAt: number;
42
+ /** 本次响应计算的缓存 TTL(≥60s 地板)。 */
43
+ ttlMs: number;
44
+ cached: boolean;
45
+ /** 原始(未过滤)JSON,供 WP3 二次检查 / 调试。 */
46
+ rawProfile: unknown;
47
+ }
48
+ export interface CacheControlParse {
49
+ ok: boolean;
50
+ reason?: string;
51
+ maxAge?: number;
52
+ }
53
+ export declare function parseCacheControl(header: string | null): CacheControlParse;
54
+ export declare class UcpResolver {
55
+ private readonly deps;
56
+ private readonly cache;
57
+ constructor(deps?: UcpResolverOptions);
58
+ clearCache(): void;
59
+ private now;
60
+ private profileUrlFor;
61
+ resolve(input: UcpResolveInput): Promise<UcpResolveResult>;
62
+ }