@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,154 @@
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
+ * A2A Server 反滥用限流(WP3,基线 §31)。零新增依赖。
18
+ *
19
+ * 覆盖威胁清单:
20
+ * - RFQ spam / price scraping → 双维度滑动窗口限流(per-identity + per-domain);
21
+ * - resource exhaustion → task concurrency limit(单身份在途任务上限);
22
+ * - malformed schema floods → malformed-request budget(schema_invalid 超预算
23
+ * 临时拒绝该来源,预算独立于正常限流,窗口滑动即恢复);
24
+ * - identity cycling → 未验签身份按 remoteAddress 计数(IP 比可轮换的
25
+ * 匿名身份更难伪造),且未验签限额严格于验签身份;
26
+ * - capability probing / 高信任对端 → trust-based throttling:trust level 映射限流
27
+ * 档位(T0 最严 / T3 最宽,档位表可配置,确定性)。
28
+ *
29
+ * 时钟:`now()` 返回 unix 毫秒,可注入(默认 Date.now)。所有窗口判定在 injected
30
+ * 时钟下完全确定,窗口边界为 `entry <= now - windowMs` 即过期(半开窗口)。
31
+ *
32
+ * 判定顺序(全部 fail-closed,基线 §4.6):
33
+ * 1. malformed budget 阻断(该来源或该域预算耗尽 → rate_limited);
34
+ * 2. per-identity 限流(档位速率);
35
+ * 3. per-domain 限流(有 domain 时);
36
+ * 4. 并发槽(enterTask,超限 → rate_limited)。
37
+ * 拒绝只走既有错误码表 rate_limited(errors.ts),并携带 retry_after(秒),
38
+ * 对齐 UCP 429/503 的 backoff 语义。
39
+ */
40
+ import { type TrustLevel } from "../../trust/identity/trust-policy.js";
41
+ /** 单个 trust 档位的限流参数(全部为窗口内数值,窗口见 windowMs)。 */
42
+ export interface TrustTierLimits {
43
+ /** 单位窗口内每身份(或未验签时每 remoteAddress)最多允许的请求数。 */
44
+ identityRequestsPerWindow: number;
45
+ /** 单位窗口内每域名最多允许的请求数(跨身份共享)。 */
46
+ domainRequestsPerWindow: number;
47
+ /** 单身份在途 A2A Task(并发处理中请求)上限。 */
48
+ maxConcurrentTasks: number;
49
+ /** malformed budget:窗口内 schema_invalid 达此值即临时拒绝该来源。 */
50
+ malformedBudget: number;
51
+ /** 拒绝时建议的 retry_after 秒数(UCP 429/503 语义)。 */
52
+ retryAfterSeconds: number;
53
+ }
54
+ /** T0-T3 档位表:T0 最严 / T3 最宽(基线 §28 / §31)。 */
55
+ export type ThrottleTierTable = Record<TrustLevel, TrustTierLimits>;
56
+ /** 默认档位表(每 60s 窗口;部署方可覆盖任意档位)。 */
57
+ export declare const DEFAULT_THROTTLE_TIERS: ThrottleTierTable;
58
+ export declare const DEFAULT_WINDOW_MS = 60000;
59
+ export declare const DEFAULT_UNVERIFIED_SCALE = 0.5;
60
+ export interface ThrottleOptions {
61
+ /** 滑动窗口(毫秒,默认 60_000)。 */
62
+ windowMs?: number;
63
+ /** 档位表覆盖(部分档位即可,其余用默认)。 */
64
+ tiers?: Partial<ThrottleTierTable>;
65
+ /**
66
+ * 未验签来源的 identity/concurrency 限流缩窄系数 (0,1]。
67
+ * 默认 0.5 —— 匿名来源限额严格于验签身份(§31 identity cycling 缓解)。
68
+ */
69
+ unverifiedIdentityScale?: number;
70
+ /** 时钟(unix 毫秒);可注入便于确定性测试。默认 Date.now。 */
71
+ now?: () => number;
72
+ }
73
+ export interface ThrottleRequest {
74
+ /** 认证身份(验签身份或回落值)。 */
75
+ identity: string;
76
+ /** 对端域名(per-domain 维度;由 UCP-Agent profile host 派生,缺省跳过该维度)。 */
77
+ domain?: string;
78
+ /** 对端 socket 地址;未验签时作为 per-identity 主键。 */
79
+ remoteAddress?: string;
80
+ /** 身份是否经过验签(false/缺省 = 匿名/回落 → 按 remoteAddress 且限额更严)。 */
81
+ identityVerified?: boolean;
82
+ /** 对端 trust level(T0-T3);缺省 T0(最严,fail-closed)。 */
83
+ trustLevel?: TrustLevel;
84
+ /** WP1 指纹变更短期降档信号:生效期间档位封顶 T1。 */
85
+ fingerprintChanged?: boolean;
86
+ }
87
+ export type ThrottleDecision = {
88
+ allowed: true;
89
+ } | {
90
+ allowed: false;
91
+ retryAfterSeconds: number;
92
+ reason: string;
93
+ };
94
+ export type TaskSlotResult = {
95
+ ok: true;
96
+ } | {
97
+ ok: false;
98
+ retryAfterSeconds: number;
99
+ reason: string;
100
+ };
101
+ /** 从对端 UCP-Agent 头声明的 platform profile URI 派生 domain(host)。 */
102
+ export declare function domainFromUcpProfile(profileUrl?: string): string | undefined;
103
+ /**
104
+ * 反滥用限流引擎。每个维度各自独立的滑动窗口计数器;malformed budget 独立于
105
+ * 正常限流(独立 map、独立判定),窗口滑动后自动恢复。
106
+ *
107
+ * 线程/并发模型:所有计数在单事件循环内同步访问(node 单线程),无需锁。
108
+ */
109
+ export declare class A2AServerThrottle {
110
+ private readonly windowMs;
111
+ private readonly tiers;
112
+ private readonly unverifiedScale;
113
+ private readonly now;
114
+ /** per-identity 主键(或未验签时的 remoteAddress 主键)→ 已放行时间戳。 */
115
+ private readonly identityWindow;
116
+ /** domain 主键 → 已放行时间戳。 */
117
+ private readonly domainWindow;
118
+ /** 来源主键(identity/addr + domain)→ schema_invalid 时间戳(malformed budget)。 */
119
+ private readonly malformedWindow;
120
+ /** per-identity 主键 → 当前在途任务数。 */
121
+ private readonly inflight;
122
+ constructor(options?: ThrottleOptions);
123
+ /**
124
+ * per-identity 主键:验签身份用 identity;未验签用 remoteAddress(identity
125
+ * cycling 缓解 —— 换匿名身份逃不掉同一 IP 的限额)。无 remoteAddress 时回落
126
+ * identity(此时 identity 即来源标识)。
127
+ */
128
+ private identityKeyOf;
129
+ private domainKeyOf;
130
+ /**
131
+ * 解析请求生效档位。trust level 缺省 T0(最严,fail-closed);WP1 指纹变更
132
+ * 短期降档(封顶 T1);未验签来源缩窄 identity/concurrency 限流。
133
+ */
134
+ private resolveTier;
135
+ /** 取窗口内条目并就地修剪过期项(`entry <= now - windowMs` 即过期,半开窗口)。 */
136
+ private windowEntries;
137
+ private exceedsLimit;
138
+ private record;
139
+ /**
140
+ * 限流判定(consume:允许的请求计入各自窗口)。判定顺序:malformed budget 阻断 →
141
+ * per-identity → per-domain。拒绝携带档位 retry_after。
142
+ */
143
+ check(req: ThrottleRequest): ThrottleDecision;
144
+ /**
145
+ * malformed-request budget:记录一次 schema_invalid(该来源 + 该域)。
146
+ * 与正常限流独立(独立计数器),由 pipeline 在 schema 拒绝时喂入。
147
+ */
148
+ recordMalformed(req: ThrottleRequest): void;
149
+ /** 单身份在途任务槽:超限返回拒绝(rate_limited)。 */
150
+ enterTask(req: ThrottleRequest): TaskSlotResult;
151
+ /** 释放在途任务槽(请求处理结束时由 pipeline 调用,幂等)。 */
152
+ leaveTask(req: ThrottleRequest): void;
153
+ private isMalformedBlocked;
154
+ }
@@ -0,0 +1,289 @@
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
+ * A2A Server 反滥用限流(WP3,基线 §31)。零新增依赖。
18
+ *
19
+ * 覆盖威胁清单:
20
+ * - RFQ spam / price scraping → 双维度滑动窗口限流(per-identity + per-domain);
21
+ * - resource exhaustion → task concurrency limit(单身份在途任务上限);
22
+ * - malformed schema floods → malformed-request budget(schema_invalid 超预算
23
+ * 临时拒绝该来源,预算独立于正常限流,窗口滑动即恢复);
24
+ * - identity cycling → 未验签身份按 remoteAddress 计数(IP 比可轮换的
25
+ * 匿名身份更难伪造),且未验签限额严格于验签身份;
26
+ * - capability probing / 高信任对端 → trust-based throttling:trust level 映射限流
27
+ * 档位(T0 最严 / T3 最宽,档位表可配置,确定性)。
28
+ *
29
+ * 时钟:`now()` 返回 unix 毫秒,可注入(默认 Date.now)。所有窗口判定在 injected
30
+ * 时钟下完全确定,窗口边界为 `entry <= now - windowMs` 即过期(半开窗口)。
31
+ *
32
+ * 判定顺序(全部 fail-closed,基线 §4.6):
33
+ * 1. malformed budget 阻断(该来源或该域预算耗尽 → rate_limited);
34
+ * 2. per-identity 限流(档位速率);
35
+ * 3. per-domain 限流(有 domain 时);
36
+ * 4. 并发槽(enterTask,超限 → rate_limited)。
37
+ * 拒绝只走既有错误码表 rate_limited(errors.ts),并携带 retry_after(秒),
38
+ * 对齐 UCP 429/503 的 backoff 语义。
39
+ */
40
+ import { conservativeLevel, isTrustLevel, TRUST_LEVELS, } from "../../trust/identity/trust-policy.js";
41
+ /** 默认档位表(每 60s 窗口;部署方可覆盖任意档位)。 */
42
+ export const DEFAULT_THROTTLE_TIERS = {
43
+ T0: {
44
+ identityRequestsPerWindow: 10,
45
+ domainRequestsPerWindow: 20,
46
+ maxConcurrentTasks: 2,
47
+ malformedBudget: 5,
48
+ retryAfterSeconds: 5,
49
+ },
50
+ T1: {
51
+ identityRequestsPerWindow: 30,
52
+ domainRequestsPerWindow: 60,
53
+ maxConcurrentTasks: 4,
54
+ malformedBudget: 8,
55
+ retryAfterSeconds: 2,
56
+ },
57
+ T2: {
58
+ identityRequestsPerWindow: 60,
59
+ domainRequestsPerWindow: 120,
60
+ maxConcurrentTasks: 8,
61
+ malformedBudget: 12,
62
+ retryAfterSeconds: 1,
63
+ },
64
+ T3: {
65
+ identityRequestsPerWindow: 120,
66
+ domainRequestsPerWindow: 240,
67
+ maxConcurrentTasks: 16,
68
+ malformedBudget: 20,
69
+ retryAfterSeconds: 1,
70
+ },
71
+ };
72
+ export const DEFAULT_WINDOW_MS = 60_000;
73
+ export const DEFAULT_UNVERIFIED_SCALE = 0.5;
74
+ // ---------------------------------------------------------------------------
75
+ // 工具
76
+ // ---------------------------------------------------------------------------
77
+ /** 从对端 UCP-Agent 头声明的 platform profile URI 派生 domain(host)。 */
78
+ export function domainFromUcpProfile(profileUrl) {
79
+ if (profileUrl === undefined || profileUrl === "")
80
+ return undefined;
81
+ let url;
82
+ try {
83
+ url = new URL(profileUrl);
84
+ }
85
+ catch {
86
+ return undefined;
87
+ }
88
+ if (url.protocol !== "http:" && url.protocol !== "https:")
89
+ return undefined;
90
+ const host = url.hostname.toLowerCase();
91
+ return host.length > 0 ? host : undefined;
92
+ }
93
+ function assertValidTier(level, tier) {
94
+ const fields = [
95
+ ["identityRequestsPerWindow", tier.identityRequestsPerWindow],
96
+ ["domainRequestsPerWindow", tier.domainRequestsPerWindow],
97
+ ["maxConcurrentTasks", tier.maxConcurrentTasks],
98
+ ["malformedBudget", tier.malformedBudget],
99
+ ["retryAfterSeconds", tier.retryAfterSeconds],
100
+ ];
101
+ for (const [name, value] of fields) {
102
+ if (!Number.isInteger(value) || value < 0) {
103
+ throw new TypeError(`A2AServerThrottle: tier ${level} ${name} must be a non-negative integer (got ${value})`);
104
+ }
105
+ }
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // A2AServerThrottle
109
+ // ---------------------------------------------------------------------------
110
+ /**
111
+ * 反滥用限流引擎。每个维度各自独立的滑动窗口计数器;malformed budget 独立于
112
+ * 正常限流(独立 map、独立判定),窗口滑动后自动恢复。
113
+ *
114
+ * 线程/并发模型:所有计数在单事件循环内同步访问(node 单线程),无需锁。
115
+ */
116
+ export class A2AServerThrottle {
117
+ windowMs;
118
+ tiers;
119
+ unverifiedScale;
120
+ now;
121
+ /** per-identity 主键(或未验签时的 remoteAddress 主键)→ 已放行时间戳。 */
122
+ identityWindow = new Map();
123
+ /** domain 主键 → 已放行时间戳。 */
124
+ domainWindow = new Map();
125
+ /** 来源主键(identity/addr + domain)→ schema_invalid 时间戳(malformed budget)。 */
126
+ malformedWindow = new Map();
127
+ /** per-identity 主键 → 当前在途任务数。 */
128
+ inflight = new Map();
129
+ constructor(options = {}) {
130
+ this.windowMs = options.windowMs ?? DEFAULT_WINDOW_MS;
131
+ if (!Number.isFinite(this.windowMs) || this.windowMs <= 0) {
132
+ throw new TypeError("A2AServerThrottle: windowMs must be a positive number");
133
+ }
134
+ this.unverifiedScale = options.unverifiedIdentityScale ?? DEFAULT_UNVERIFIED_SCALE;
135
+ if (!Number.isFinite(this.unverifiedScale) ||
136
+ this.unverifiedScale <= 0 ||
137
+ this.unverifiedScale > 1) {
138
+ throw new TypeError("A2AServerThrottle: unverifiedIdentityScale must be in (0, 1]");
139
+ }
140
+ this.tiers = { ...DEFAULT_THROTTLE_TIERS, ...options.tiers };
141
+ for (const level of TRUST_LEVELS)
142
+ assertValidTier(level, this.tiers[level]);
143
+ this.now = options.now ?? (() => Date.now());
144
+ }
145
+ // -- 键派生 ----------------------------------------------------------------
146
+ /**
147
+ * per-identity 主键:验签身份用 identity;未验签用 remoteAddress(identity
148
+ * cycling 缓解 —— 换匿名身份逃不掉同一 IP 的限额)。无 remoteAddress 时回落
149
+ * identity(此时 identity 即来源标识)。
150
+ */
151
+ identityKeyOf(req) {
152
+ if (req.identityVerified === true)
153
+ return `id:${req.identity}`;
154
+ return `addr:${req.remoteAddress ?? req.identity}`;
155
+ }
156
+ domainKeyOf(domain) {
157
+ return `dom:${domain}`;
158
+ }
159
+ /**
160
+ * 解析请求生效档位。trust level 缺省 T0(最严,fail-closed);WP1 指纹变更
161
+ * 短期降档(封顶 T1);未验签来源缩窄 identity/concurrency 限流。
162
+ */
163
+ resolveTier(req) {
164
+ const level = req.trustLevel !== undefined && isTrustLevel(req.trustLevel) ? req.trustLevel : "T0";
165
+ const effective = req.fingerprintChanged === true ? conservativeLevel(level, "T1") : level;
166
+ let tier = this.tiers[effective];
167
+ if (req.identityVerified !== true) {
168
+ const scale = this.unverifiedScale;
169
+ tier = {
170
+ ...tier,
171
+ identityRequestsPerWindow: Math.max(1, Math.floor(tier.identityRequestsPerWindow * scale)),
172
+ maxConcurrentTasks: Math.max(1, Math.floor(tier.maxConcurrentTasks * scale)),
173
+ };
174
+ }
175
+ return tier;
176
+ }
177
+ // -- 滑动窗口原语 ----------------------------------------------------------
178
+ /** 取窗口内条目并就地修剪过期项(`entry <= now - windowMs` 即过期,半开窗口)。 */
179
+ windowEntries(map, key, now) {
180
+ const raw = map.get(key);
181
+ if (raw === undefined || raw.length === 0)
182
+ return [];
183
+ const cutoff = now - this.windowMs;
184
+ let start = 0;
185
+ while (start < raw.length && raw[start] <= cutoff)
186
+ start += 1;
187
+ if (start === 0)
188
+ return raw;
189
+ const kept = raw.slice(start);
190
+ if (kept.length === 0)
191
+ map.delete(key);
192
+ else
193
+ map.set(key, kept);
194
+ return kept;
195
+ }
196
+ exceedsLimit(map, key, limit, now) {
197
+ return this.windowEntries(map, key, now).length >= limit;
198
+ }
199
+ record(map, key, now) {
200
+ const arr = this.windowEntries(map, key, now);
201
+ arr.push(now);
202
+ map.set(key, arr);
203
+ }
204
+ // -- 公开判定 --------------------------------------------------------------
205
+ /**
206
+ * 限流判定(consume:允许的请求计入各自窗口)。判定顺序:malformed budget 阻断 →
207
+ * per-identity → per-domain。拒绝携带档位 retry_after。
208
+ */
209
+ check(req) {
210
+ const tier = this.resolveTier(req);
211
+ const now = this.now();
212
+ const idKey = this.identityKeyOf(req);
213
+ if (this.isMalformedBlocked(idKey, tier.malformedBudget, now)) {
214
+ return {
215
+ allowed: false,
216
+ retryAfterSeconds: tier.retryAfterSeconds,
217
+ reason: "malformed request budget exhausted for source",
218
+ };
219
+ }
220
+ if (req.domain !== undefined &&
221
+ this.isMalformedBlocked(this.domainKeyOf(req.domain), tier.malformedBudget, now)) {
222
+ return {
223
+ allowed: false,
224
+ retryAfterSeconds: tier.retryAfterSeconds,
225
+ reason: `malformed request budget exhausted for domain "${req.domain}"`,
226
+ };
227
+ }
228
+ if (this.exceedsLimit(this.identityWindow, idKey, tier.identityRequestsPerWindow, now)) {
229
+ return {
230
+ allowed: false,
231
+ retryAfterSeconds: tier.retryAfterSeconds,
232
+ reason: "per-identity rate limit exceeded",
233
+ };
234
+ }
235
+ if (req.domain !== undefined &&
236
+ this.exceedsLimit(this.domainWindow, this.domainKeyOf(req.domain), tier.domainRequestsPerWindow, now)) {
237
+ return {
238
+ allowed: false,
239
+ retryAfterSeconds: tier.retryAfterSeconds,
240
+ reason: `per-domain rate limit exceeded for domain "${req.domain}"`,
241
+ };
242
+ }
243
+ this.record(this.identityWindow, idKey, now);
244
+ if (req.domain !== undefined)
245
+ this.record(this.domainWindow, this.domainKeyOf(req.domain), now);
246
+ return { allowed: true };
247
+ }
248
+ /**
249
+ * malformed-request budget:记录一次 schema_invalid(该来源 + 该域)。
250
+ * 与正常限流独立(独立计数器),由 pipeline 在 schema 拒绝时喂入。
251
+ */
252
+ recordMalformed(req) {
253
+ const now = this.now();
254
+ this.record(this.malformedWindow, this.identityKeyOf(req), now);
255
+ if (req.domain !== undefined) {
256
+ this.record(this.malformedWindow, this.domainKeyOf(req.domain), now);
257
+ }
258
+ }
259
+ /** 单身份在途任务槽:超限返回拒绝(rate_limited)。 */
260
+ enterTask(req) {
261
+ const tier = this.resolveTier(req);
262
+ const key = this.identityKeyOf(req);
263
+ const current = this.inflight.get(key) ?? 0;
264
+ if (current >= tier.maxConcurrentTasks) {
265
+ return {
266
+ ok: false,
267
+ retryAfterSeconds: tier.retryAfterSeconds,
268
+ reason: "task concurrency limit exceeded",
269
+ };
270
+ }
271
+ this.inflight.set(key, current + 1);
272
+ return { ok: true };
273
+ }
274
+ /** 释放在途任务槽(请求处理结束时由 pipeline 调用,幂等)。 */
275
+ leaveTask(req) {
276
+ const key = this.identityKeyOf(req);
277
+ const current = this.inflight.get(key);
278
+ if (current === undefined || current <= 0)
279
+ return;
280
+ if (current === 1)
281
+ this.inflight.delete(key);
282
+ else
283
+ this.inflight.set(key, current - 1);
284
+ }
285
+ isMalformedBlocked(key, budget, now) {
286
+ return this.windowEntries(this.malformedWindow, key, now).length >= budget;
287
+ }
288
+ }
289
+ //# sourceMappingURL=throttle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../../src/a2a/server/throttle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
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
+ * A2A Server(入站侧,WP2)契约类型。
18
+ *
19
+ * 边界(基线 §4.5 / §36):入站内容一律 untrusted。这里的类型只描述「校验通过
20
+ * 之后」的域对象;raw 入站数据必须先经 inbound-message.ts 的严格解析、
21
+ * pipeline.ts 的 schema/digest/幂等检查,才允许进入这些类型。
22
+ *
23
+ * 三个接缝(本 WP 定义,后续 WP 接线):
24
+ * - AuthVerifier 请求路径上的认证接缝(WP5 完整认证)。
25
+ * - NegotiationHandler 校验通过后的业务路由(后续 WP 接真正的 Negotiation Engine)。
26
+ * - AgentCardConfig 本地 discovery 配置(基线 §26)。
27
+ */
28
+ import type { A2AMessage, A2APart, A2ATaskState } from "../client/index.js";
29
+ import type { NegotiationEnvelope } from "../../negotiation/domain/envelope.js";
30
+ import type { ProtocolErrorCode } from "../../negotiation/domain/common.js";
31
+ import type { AgentSkill } from "../../discovery/agent-card/index.js";
32
+ import type { IdempotencyStore } from "../../negotiation/idempotency/index.js";
33
+ import type { LedgerStore } from "../../negotiation/ledger/index.js";
34
+ import type { UcpPublishOptions } from "./ucp.js";
35
+ import type { A2AServerThrottle, ThrottleOptions } from "./throttle.js";
36
+ import type { TrustLevel } from "../../trust/identity/trust-policy.js";
37
+ /** Agent Card 本地配置(基线 §26 / 子规范 §24.1 Discovery)。 */
38
+ export interface AgentCardConfig {
39
+ /** Agent 名称。 */
40
+ name: string;
41
+ /** Agent 描述。 */
42
+ description: string;
43
+ /** 提供方组织名。 */
44
+ providerOrganization: string;
45
+ /** 提供方主页(可选,http(s))。 */
46
+ providerUrl?: string;
47
+ /** Agent Card 的 version 字段(semver-ish)。 */
48
+ version: string;
49
+ /** 本 server 可达的 base URL(http(s)),用于派生 supportedInterfaces[].url。 */
50
+ baseUrl: string;
51
+ /** JSON-RPC A2A endpoint 路径(默认 "/")。 */
52
+ a2aPath?: string;
53
+ /**
54
+ * KNP negotiation extension URI。默认取 baseUrl origin 拼
55
+ * `/a2a/extensions/negotiation/1.0`(基线 §8.2 / §26)。
56
+ */
57
+ negotiationExtensionUri?: string;
58
+ /** 附加技能声明(可选)。 */
59
+ skills?: AgentSkill[];
60
+ /** 安全方案声明(仅元数据,不得含 secret;不变量 24)。 */
61
+ securityScheme?: {
62
+ name: string;
63
+ type: string;
64
+ };
65
+ }
66
+ /** card 配置可静态提供,也可用 provider 函数(测试/部署时 baseUrl 动态确定)。 */
67
+ export type AgentCardConfigProvider = AgentCardConfig | (() => AgentCardConfig);
68
+ /** 认证接缝输入:请求路径上可获得的、与身份判定相关的安全上下文。 */
69
+ export interface AuthContext {
70
+ /** 对端 socket 地址(node 原样,可能是 "::ffff:127.0.0.1")。 */
71
+ remoteAddress: string | undefined;
72
+ /** 原始 Authorization 头(如有)。 */
73
+ authorizationHeader: string | undefined;
74
+ /** 请求方法。 */
75
+ method: string;
76
+ /** 请求 URL(path;node 原样,origin-form)。 */
77
+ url: string;
78
+ /** 原始请求头(node 小写名)。WP5 HTTP Message Signature 验签需要。 */
79
+ headers?: Record<string, string | string[] | undefined>;
80
+ /** 请求体字节(WP5 content-digest 重算需要;POST 路径在认证前读取)。 */
81
+ body?: Buffer;
82
+ /** 请求 scheme(@target-uri 重建用);缺省按 "http" 处理。 */
83
+ scheme?: "http" | "https";
84
+ }
85
+ export interface AuthResult {
86
+ authenticated: boolean;
87
+ /** 认证通过时的调用方身份;用作协议幂等主键 (sender_identity, message_id) 的一半。 */
88
+ identity?: string;
89
+ /**
90
+ * 失败时的协议错误码(缺省按 authorization_failed 处理)。§32 词表里与认证
91
+ * 相关的还有 identity_rejected(身份绑定冲突)与 replay_detected(重放)。
92
+ */
93
+ protocolCode?: "authentication_required" | "authorization_failed" | "identity_rejected" | "replay_detected";
94
+ /** 失败原因(内部日志用,不回显给远端;§4.5)。 */
95
+ reason?: string;
96
+ /**
97
+ * 对端 trust level(T0-T3,基线 §28)。WP3 throttle 用它映射限流档位
98
+ * (T0 最严 / T3 最宽);缺省按 T0 处理(最严,fail-closed)。
99
+ */
100
+ trustLevel?: TrustLevel;
101
+ /** 身份是否经过验签(false/缺省 = 匿名/回落,throttle 按 remoteAddress 且限额更严)。 */
102
+ identityVerified?: boolean;
103
+ /** WP1 对端 Agent Card 指纹近期变更信号:生效期间 throttle 短期降档。 */
104
+ fingerprintChanged?: boolean;
105
+ }
106
+ /**
107
+ * AuthVerifier 接缝。本 WP 提供三种参考实现(auth.ts):
108
+ * `none` / `static-bearer` / `loopback-only`(未配置 verifier 时的 fail-closed 默认)。
109
+ * 完整认证在 WP5 接入。
110
+ */
111
+ export interface AuthVerifier {
112
+ readonly name: string;
113
+ verify(ctx: AuthContext): AuthResult | Promise<AuthResult>;
114
+ }
115
+ /** 入站 KNP 消息通过校验后的处理上下文(路由给 NegotiationHandler)。 */
116
+ export interface InboundNegotiationContext {
117
+ /** 已通过 schema / digest / 幂等检查的 KNP envelope(§8 / §19)。 */
118
+ envelope: NegotiationEnvelope;
119
+ /** 完整入站 A2A Message(含 text part;untrusted 但已结构化,引擎不得回写 Principal Memory)。 */
120
+ message: A2AMessage;
121
+ /** 本 server 为该入站消息生成的任务 id(§24.5:KNP MUST NOT 伪造远端 task id)。 */
122
+ taskId: string;
123
+ /** 远端 A2A contextId(params.contextId 优先,回落 message.contextId;§24.4)。 */
124
+ contextId?: string;
125
+ /** 认证身份(幂等主键的 sender 侧)。 */
126
+ senderIdentity: string;
127
+ /** 对端 socket 地址。 */
128
+ remoteAddress?: string;
129
+ /**
130
+ * 对端 UCP-Agent 头声明的 platform profile URI(基线 §25.1,WP3)。
131
+ * HTTP-based binding 的 service parameter 宣告;只读暴露给 handler,
132
+ * 不强制 —— 头缺失时缺省 undefined,请求照常处理。
133
+ */
134
+ ucpAgentProfile?: string;
135
+ }
136
+ export type NegotiationHandlerResult = {
137
+ kind: "accepted";
138
+ taskState?: A2ATaskState;
139
+ message?: A2AMessage;
140
+ artifactParts?: A2APart[];
141
+ } | {
142
+ kind: "declined";
143
+ reasonCode?: string;
144
+ taskState?: A2ATaskState;
145
+ } | {
146
+ kind: "error";
147
+ protocolCode: ProtocolErrorCode;
148
+ message: string;
149
+ };
150
+ /**
151
+ * NegotiationHandler 接缝:上层注入的「真正的」Negotiation Engine(后续 WP)。
152
+ * 本 WP 提供安全桩(handler.ts):echoHandler(原样回显)与 declineHandler
153
+ * (全部拒绝,fail-closed 默认)。
154
+ *
155
+ * 约定:`kind: "error"` 映射为 JSON-RPC 协议错误(§18,不得当作商业 Decline);
156
+ * `kind: "declined"` 是合法的商业结果,任务以 completed 结束并携带 decline 消息。
157
+ */
158
+ export interface NegotiationHandler {
159
+ readonly name: string;
160
+ handle(ctx: InboundNegotiationContext): Promise<NegotiationHandlerResult>;
161
+ }
162
+ export interface A2AServerOptions {
163
+ /** Agent Card 配置(provider 函数在每次 well-known 请求时求值)。 */
164
+ card: AgentCardConfigProvider;
165
+ /** 落账(基线 §22):入站处理证据 append-only 记录。 */
166
+ ledger: LedgerStore;
167
+ /** 协议幂等(子规范 §20):(sender_identity, message_id) 三态判定。 */
168
+ idempotency: IdempotencyStore;
169
+ /** 业务路由;缺省用 declineHandler(fail-closed,未接线引擎时拒绝一切)。 */
170
+ handler?: NegotiationHandler;
171
+ /** 认证;缺省用 loopback-only(未配置 verifier 时拒绝非 loopback 请求)。 */
172
+ authVerifier?: AuthVerifier;
173
+ /** JSON-RPC body 大小上限(字节,默认 1 MiB);超限 fail-closed。 */
174
+ maxPayloadBytes?: number;
175
+ /** 可注入时钟(RFC 3339);用于任务时间戳。 */
176
+ now?: () => string;
177
+ /** well-known Agent Card 路径(默认 "/.well-known/agent-card.json")。 */
178
+ wellKnownPath?: string;
179
+ /**
180
+ * UCP Profile 发布(WP3,基线 §25):true = 用默认选项在
181
+ * `GET /.well-known/ucp` 上发布;对象 = 自定义发布选项。缺省不发布。
182
+ * 响应头 Cache-Control 为 `public, max-age=N`(N>=60,UCP 规范强制)。
183
+ */
184
+ ucp?: boolean | UcpPublishOptions;
185
+ /**
186
+ * WP3 §31 反滥用限流。缺省不配置 → 不限流(保持既有行为);配置后判定发生在
187
+ * 认证之后、schema 校验之前(InboundPipeline.sendMessage 顶部)。
188
+ * 传 ThrottleOptions 由 server 构造;也可直接注入 A2AServerThrottle 实例(测试用)。
189
+ */
190
+ throttle?: ThrottleOptions | A2AServerThrottle;
191
+ }
@@ -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/a2a/server/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}