@jangts/agent-core 0.1.0 → 0.2.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 (527) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +59 -0
  3. package/development/docs/api/reference.md +1907 -1874
  4. package/development/docs/api/support.md +27 -0
  5. package/development/docs/assets/agent-core-icon.png +0 -0
  6. package/development/docs/assets/agent-core-logo.png +0 -0
  7. package/development/docs/assets/character-agent-core.png +0 -0
  8. package/development/skills/agent-core-app/scripts/create-app.mjs +267 -70
  9. package/development/skills/agent-core-app/scripts/lib/knowledge.mjs +40 -15
  10. package/development/skills/agent-core-app/scripts/lib/source.mjs +30 -2
  11. package/development/skills/agent-core-app/scripts/plan.mjs +37 -12
  12. package/development/skills/agent-core-app/scripts/prepare-source.mjs +61 -10
  13. package/development/skills/agent-core-app/scripts/resources.mjs +45 -17
  14. package/development/skills/agent-core-app/scripts/validate-knowledge.mjs +18 -1
  15. package/development/skills/agent-core-app/templates/catalog.json +36 -22
  16. package/dist/cjs/capabilities/index.js +13 -0
  17. package/dist/cjs/capabilities/invocation.js +80 -10
  18. package/dist/cjs/capabilities/model.js +126 -13
  19. package/dist/cjs/capabilities/tool-runtime.js +64 -12
  20. package/dist/cjs/capabilities/tools.js +266 -31
  21. package/dist/cjs/context/assembly.js +46 -5
  22. package/dist/cjs/context/audit.js +31 -6
  23. package/dist/cjs/context/fragments.js +54 -11
  24. package/dist/cjs/context/index.js +12 -0
  25. package/dist/cjs/context/journal.js +84 -7
  26. package/dist/cjs/context/plan.js +30 -2
  27. package/dist/cjs/diagnostics/catalog.js +11 -3
  28. package/dist/cjs/diagnostics/index.js +149 -29
  29. package/dist/cjs/diagnostics/sub-flow.js +240 -40
  30. package/dist/cjs/errors.js +99 -17
  31. package/dist/cjs/execution/branch.js +20 -4
  32. package/dist/cjs/execution/engine.js +470 -56
  33. package/dist/cjs/execution/events.js +136 -18
  34. package/dist/cjs/execution/index.js +7 -0
  35. package/dist/cjs/execution/reporting.js +75 -6
  36. package/dist/cjs/execution/state.js +161 -22
  37. package/dist/cjs/execution/workflow.js +224 -32
  38. package/dist/cjs/index.js +18 -0
  39. package/dist/cjs/kits/aggregation.js +45 -3
  40. package/dist/cjs/kits/answering/batch.js +23 -4
  41. package/dist/cjs/kits/answering/check-result.js +31 -8
  42. package/dist/cjs/kits/answering/checks.js +24 -3
  43. package/dist/cjs/kits/answering/flow.js +192 -36
  44. package/dist/cjs/kits/answering/index.js +19 -1
  45. package/dist/cjs/kits/answering/tasks.js +88 -13
  46. package/dist/cjs/kits/artifacts.js +36 -4
  47. package/dist/cjs/kits/candidates.js +47 -5
  48. package/dist/cjs/kits/delivery.js +40 -5
  49. package/dist/cjs/kits/durable.js +155 -31
  50. package/dist/cjs/kits/evidence.js +66 -15
  51. package/dist/cjs/kits/family.js +152 -22
  52. package/dist/cjs/kits/index.js +12 -1
  53. package/dist/cjs/kits/inference.js +104 -16
  54. package/dist/cjs/kits/intents/catalog.js +67 -16
  55. package/dist/cjs/kits/intents/index.js +11 -0
  56. package/dist/cjs/kits/intents/registry.js +188 -43
  57. package/dist/cjs/kits/intents/scopes.js +215 -46
  58. package/dist/cjs/kits/interaction/command.js +140 -36
  59. package/dist/cjs/kits/interaction/commands.js +86 -11
  60. package/dist/cjs/kits/interaction/handlers.js +27 -10
  61. package/dist/cjs/kits/interaction/index.js +10 -0
  62. package/dist/cjs/kits/interaction/transfer.js +80 -14
  63. package/dist/cjs/kits/knowledge/catalog.js +62 -11
  64. package/dist/cjs/kits/knowledge/index.js +16 -1
  65. package/dist/cjs/kits/knowledge/publication.js +99 -23
  66. package/dist/cjs/kits/knowledge/sections.js +33 -4
  67. package/dist/cjs/kits/normalization.js +51 -7
  68. package/dist/cjs/kits/policies.js +79 -15
  69. package/dist/cjs/kits/presentation/events.js +54 -10
  70. package/dist/cjs/kits/presentation/index.js +24 -1
  71. package/dist/cjs/kits/presentation/outputs.js +176 -38
  72. package/dist/cjs/kits/presentation/templates.js +33 -5
  73. package/dist/cjs/kits/presentation/variants.js +31 -2
  74. package/dist/cjs/kits/projection.js +63 -8
  75. package/dist/cjs/kits/rank-fusion.js +27 -4
  76. package/dist/cjs/kits/reflection-log-source.js +89 -16
  77. package/dist/cjs/kits/reflection.js +234 -60
  78. package/dist/cjs/kits/retrieval.js +98 -18
  79. package/dist/cjs/kits/search.js +180 -27
  80. package/dist/cjs/kits/text-skills.js +104 -19
  81. package/dist/cjs/kits/tools.js +415 -74
  82. package/dist/cjs/kits/vector-search.js +50 -16
  83. package/dist/cjs/mock/node.js +7 -1
  84. package/dist/cjs/mock/web.js +7 -1
  85. package/dist/cjs/mock.js +7 -1
  86. package/dist/cjs/model/binding.js +68 -17
  87. package/dist/cjs/model/call-budget.js +45 -4
  88. package/dist/cjs/model/decision-retry.js +19 -1
  89. package/dist/cjs/model/defaults.js +27 -4
  90. package/dist/cjs/model/index.js +7 -0
  91. package/dist/cjs/model/interactions/arguments.js +36 -1
  92. package/dist/cjs/model/interactions/json-object.js +48 -12
  93. package/dist/cjs/model/interactions/native-functions.js +52 -10
  94. package/dist/cjs/model/message-diagnostics.js +17 -4
  95. package/dist/cjs/model/options.js +9 -1
  96. package/dist/cjs/model/preparation.js +86 -12
  97. package/dist/cjs/model/runner.js +413 -79
  98. package/dist/cjs/model/selection-transport.js +48 -8
  99. package/dist/cjs/model/settings.js +67 -13
  100. package/dist/cjs/model/token-budget.js +69 -11
  101. package/dist/cjs/model/transports.js +59 -6
  102. package/dist/cjs/structs/common.js +11 -0
  103. package/dist/cjs/structs/debug.js +34 -5
  104. package/dist/cjs/structs/errors.js +26 -1
  105. package/dist/cjs/structs/index.js +11 -1
  106. package/dist/cjs/structs/kits/durable.js +7 -0
  107. package/dist/cjs/structs/kits/family.js +1 -0
  108. package/dist/cjs/structs/kits/interaction.js +8 -1
  109. package/dist/cjs/structs/kits/knowledge-publication.js +1 -0
  110. package/dist/cjs/structs/kits/reflection.js +18 -3
  111. package/dist/cjs/structs/model/chat-provider.js +6 -0
  112. package/dist/cjs/structs/support/model/completion.js +2 -0
  113. package/dist/cjs/structs/support/model/messages.js +2 -0
  114. package/dist/cjs/support/capabilities.js +43 -6
  115. package/dist/cjs/support/context/assembly.js +88 -16
  116. package/dist/cjs/support/context/compression.js +48 -6
  117. package/dist/cjs/support/context/fragments.js +6 -0
  118. package/dist/cjs/support/context/history.js +36 -1
  119. package/dist/cjs/support/context/index.js +11 -0
  120. package/dist/cjs/support/context/nodes.js +164 -35
  121. package/dist/cjs/support/context/processing.js +319 -61
  122. package/dist/cjs/support/context/selection-policy.js +98 -21
  123. package/dist/cjs/support/context/selection.js +61 -10
  124. package/dist/cjs/support/context/snapshot.js +29 -7
  125. package/dist/cjs/support/context/strategies.js +120 -28
  126. package/dist/cjs/support/index.js +9 -1
  127. package/dist/cjs/support/model/capabilities.js +20 -1
  128. package/dist/cjs/support/model/chat-completions.js +92 -20
  129. package/dist/cjs/support/model/children.js +34 -6
  130. package/dist/cjs/support/model/compatible-provider.js +189 -59
  131. package/dist/cjs/support/model/completion/calls.js +61 -0
  132. package/dist/cjs/support/model/completion/default.js +32 -0
  133. package/dist/cjs/support/model/completion/index.js +28 -0
  134. package/dist/cjs/support/model/completion/session.js +102 -0
  135. package/dist/cjs/support/model/index.js +12 -0
  136. package/dist/cjs/support/model/interactions/index.js +12 -1
  137. package/dist/cjs/support/model/interactions/json-object.js +6 -0
  138. package/dist/cjs/support/model/interactions/native-functions.js +6 -0
  139. package/dist/cjs/support/model/observer.js +32 -6
  140. package/dist/cjs/support/model/preview-rules.js +66 -16
  141. package/dist/cjs/support/model/reply-preview.js +77 -17
  142. package/dist/cjs/support/model/stage-transport.js +33 -7
  143. package/dist/cjs/support/model/strategies.js +75 -14
  144. package/dist/cjs/support/model/transports.js +53 -11
  145. package/dist/cjs/support/registration.js +49 -7
  146. package/dist/cjs/support/schema.js +46 -4
  147. package/dist/cjs/support/stream-events.js +60 -8
  148. package/dist/cjs/support/tool-runtime.js +6 -0
  149. package/dist/cjs/support/tools.js +79 -10
  150. package/dist/cjs/support/transport/index.js +7 -0
  151. package/dist/cjs/support/transport/json.js +28 -4
  152. package/dist/cjs/support/transport/sse.js +25 -2
  153. package/dist/cjs/utils/break-observer.js +20 -2
  154. package/dist/cjs/utils/cancellation.js +77 -9
  155. package/dist/cjs/utils/catalog.js +19 -4
  156. package/dist/cjs/utils/debug.js +14 -2
  157. package/dist/cjs/utils/index.js +8 -0
  158. package/dist/cjs/utils/interaction-definition.js +26 -6
  159. package/dist/cjs/utils/invocation.js +42 -4
  160. package/dist/cjs/utils/model-protocol.js +20 -1
  161. package/dist/cjs/utils/object.js +16 -0
  162. package/dist/cjs/utils/observer.js +22 -2
  163. package/dist/cjs/utils/protocol-registry.js +47 -4
  164. package/dist/cjs/utils/query-key.js +21 -2
  165. package/dist/cjs/utils/registration.js +18 -2
  166. package/dist/cjs/utils/rules.js +39 -11
  167. package/dist/cjs/utils/schema-adapter.js +25 -2
  168. package/dist/cjs/utils/synchronous.js +64 -7
  169. package/dist/cjs/utils/text.js +15 -1
  170. package/dist/esm/capabilities/index.d.ts +13 -0
  171. package/dist/esm/capabilities/index.js +13 -0
  172. package/dist/esm/capabilities/invocation.d.ts +16 -2
  173. package/dist/esm/capabilities/invocation.js +80 -10
  174. package/dist/esm/capabilities/model.d.ts +68 -1
  175. package/dist/esm/capabilities/model.js +126 -13
  176. package/dist/esm/capabilities/tool-runtime.d.ts +11 -0
  177. package/dist/esm/capabilities/tool-runtime.js +64 -12
  178. package/dist/esm/capabilities/tools.d.ts +96 -3
  179. package/dist/esm/capabilities/tools.js +267 -32
  180. package/dist/esm/context/assembly.d.ts +13 -2
  181. package/dist/esm/context/assembly.js +46 -5
  182. package/dist/esm/context/audit.d.ts +23 -1
  183. package/dist/esm/context/audit.js +31 -6
  184. package/dist/esm/context/fragments.d.ts +37 -3
  185. package/dist/esm/context/fragments.js +54 -11
  186. package/dist/esm/context/index.d.ts +12 -0
  187. package/dist/esm/context/index.js +12 -0
  188. package/dist/esm/context/journal.d.ts +32 -1
  189. package/dist/esm/context/journal.js +84 -7
  190. package/dist/esm/context/plan.d.ts +11 -1
  191. package/dist/esm/context/plan.js +30 -2
  192. package/dist/esm/diagnostics/catalog.js +11 -3
  193. package/dist/esm/diagnostics/index.d.ts +30 -2
  194. package/dist/esm/diagnostics/index.js +149 -29
  195. package/dist/esm/diagnostics/sub-flow.d.ts +41 -3
  196. package/dist/esm/diagnostics/sub-flow.js +240 -40
  197. package/dist/esm/errors.d.ts +22 -2
  198. package/dist/esm/errors.js +99 -17
  199. package/dist/esm/execution/branch.d.ts +19 -1
  200. package/dist/esm/execution/branch.js +20 -4
  201. package/dist/esm/execution/engine.d.ts +291 -5
  202. package/dist/esm/execution/engine.js +471 -57
  203. package/dist/esm/execution/events.d.ts +16 -2
  204. package/dist/esm/execution/events.js +136 -18
  205. package/dist/esm/execution/index.d.ts +7 -0
  206. package/dist/esm/execution/index.js +7 -0
  207. package/dist/esm/execution/reporting.d.ts +49 -1
  208. package/dist/esm/execution/reporting.js +75 -6
  209. package/dist/esm/execution/state.d.ts +126 -10
  210. package/dist/esm/execution/state.js +161 -22
  211. package/dist/esm/execution/workflow.d.ts +121 -3
  212. package/dist/esm/execution/workflow.js +224 -32
  213. package/dist/esm/index.d.ts +17 -1
  214. package/dist/esm/index.js +18 -0
  215. package/dist/esm/kits/aggregation.d.ts +34 -2
  216. package/dist/esm/kits/aggregation.js +45 -3
  217. package/dist/esm/kits/answering/batch.d.ts +17 -0
  218. package/dist/esm/kits/answering/batch.js +23 -4
  219. package/dist/esm/kits/answering/check-result.d.ts +18 -1
  220. package/dist/esm/kits/answering/check-result.js +31 -8
  221. package/dist/esm/kits/answering/checks.d.ts +11 -0
  222. package/dist/esm/kits/answering/checks.js +24 -3
  223. package/dist/esm/kits/answering/flow.d.ts +25 -2
  224. package/dist/esm/kits/answering/flow.js +192 -36
  225. package/dist/esm/kits/answering/index.d.ts +12 -0
  226. package/dist/esm/kits/answering/index.js +19 -1
  227. package/dist/esm/kits/answering/tasks.d.ts +32 -1
  228. package/dist/esm/kits/answering/tasks.js +88 -13
  229. package/dist/esm/kits/artifacts.d.ts +11 -0
  230. package/dist/esm/kits/artifacts.js +36 -4
  231. package/dist/esm/kits/candidates.d.ts +23 -1
  232. package/dist/esm/kits/candidates.js +47 -5
  233. package/dist/esm/kits/delivery.d.ts +34 -0
  234. package/dist/esm/kits/delivery.js +40 -5
  235. package/dist/esm/kits/durable.d.ts +19 -0
  236. package/dist/esm/kits/durable.js +155 -31
  237. package/dist/esm/kits/evidence.d.ts +28 -5
  238. package/dist/esm/kits/evidence.js +66 -15
  239. package/dist/esm/kits/family.d.ts +17 -1
  240. package/dist/esm/kits/family.js +152 -22
  241. package/dist/esm/kits/index.d.ts +12 -1
  242. package/dist/esm/kits/index.js +12 -1
  243. package/dist/esm/kits/inference.d.ts +64 -0
  244. package/dist/esm/kits/inference.js +104 -16
  245. package/dist/esm/kits/intents/catalog.d.ts +13 -1
  246. package/dist/esm/kits/intents/catalog.js +67 -16
  247. package/dist/esm/kits/intents/index.d.ts +11 -0
  248. package/dist/esm/kits/intents/index.js +11 -0
  249. package/dist/esm/kits/intents/registry.d.ts +61 -3
  250. package/dist/esm/kits/intents/registry.js +188 -43
  251. package/dist/esm/kits/intents/scopes.d.ts +73 -3
  252. package/dist/esm/kits/intents/scopes.js +215 -46
  253. package/dist/esm/kits/interaction/command.d.ts +38 -4
  254. package/dist/esm/kits/interaction/command.js +140 -36
  255. package/dist/esm/kits/interaction/commands.d.ts +66 -2
  256. package/dist/esm/kits/interaction/commands.js +86 -11
  257. package/dist/esm/kits/interaction/handlers.d.ts +19 -2
  258. package/dist/esm/kits/interaction/handlers.js +27 -10
  259. package/dist/esm/kits/interaction/index.d.ts +10 -0
  260. package/dist/esm/kits/interaction/index.js +10 -0
  261. package/dist/esm/kits/interaction/transfer.d.ts +39 -2
  262. package/dist/esm/kits/interaction/transfer.js +80 -14
  263. package/dist/esm/kits/knowledge/catalog.d.ts +13 -0
  264. package/dist/esm/kits/knowledge/catalog.js +62 -11
  265. package/dist/esm/kits/knowledge/index.d.ts +11 -0
  266. package/dist/esm/kits/knowledge/index.js +16 -1
  267. package/dist/esm/kits/knowledge/publication.d.ts +15 -1
  268. package/dist/esm/kits/knowledge/publication.js +99 -23
  269. package/dist/esm/kits/knowledge/sections.d.ts +31 -1
  270. package/dist/esm/kits/knowledge/sections.js +33 -4
  271. package/dist/esm/kits/normalization.d.ts +25 -2
  272. package/dist/esm/kits/normalization.js +51 -7
  273. package/dist/esm/kits/policies.d.ts +26 -3
  274. package/dist/esm/kits/policies.js +79 -15
  275. package/dist/esm/kits/presentation/events.d.ts +51 -4
  276. package/dist/esm/kits/presentation/events.js +54 -10
  277. package/dist/esm/kits/presentation/index.d.ts +12 -0
  278. package/dist/esm/kits/presentation/index.js +25 -2
  279. package/dist/esm/kits/presentation/outputs.d.ts +30 -1
  280. package/dist/esm/kits/presentation/outputs.js +176 -38
  281. package/dist/esm/kits/presentation/templates.d.ts +32 -3
  282. package/dist/esm/kits/presentation/templates.js +33 -5
  283. package/dist/esm/kits/presentation/variants.d.ts +29 -0
  284. package/dist/esm/kits/presentation/variants.js +31 -2
  285. package/dist/esm/kits/projection.d.ts +42 -5
  286. package/dist/esm/kits/projection.js +63 -8
  287. package/dist/esm/kits/rank-fusion.d.ts +21 -1
  288. package/dist/esm/kits/rank-fusion.js +28 -5
  289. package/dist/esm/kits/reflection-log-source.d.ts +28 -1
  290. package/dist/esm/kits/reflection-log-source.js +89 -16
  291. package/dist/esm/kits/reflection.d.ts +17 -1
  292. package/dist/esm/kits/reflection.js +235 -61
  293. package/dist/esm/kits/retrieval.d.ts +18 -2
  294. package/dist/esm/kits/retrieval.js +98 -18
  295. package/dist/esm/kits/search.d.ts +56 -3
  296. package/dist/esm/kits/search.js +180 -27
  297. package/dist/esm/kits/text-skills.d.ts +16 -2
  298. package/dist/esm/kits/text-skills.js +104 -19
  299. package/dist/esm/kits/tools.d.ts +122 -2
  300. package/dist/esm/kits/tools.js +416 -74
  301. package/dist/esm/kits/vector-search.d.ts +47 -1
  302. package/dist/esm/kits/vector-search.js +51 -17
  303. package/dist/esm/mock/node.d.ts +7 -0
  304. package/dist/esm/mock/node.js +7 -1
  305. package/dist/esm/mock/web.d.ts +7 -0
  306. package/dist/esm/mock/web.js +7 -1
  307. package/dist/esm/mock.d.ts +7 -0
  308. package/dist/esm/mock.js +7 -1
  309. package/dist/esm/model/binding.d.ts +32 -3
  310. package/dist/esm/model/binding.js +68 -17
  311. package/dist/esm/model/call-budget.d.ts +30 -2
  312. package/dist/esm/model/call-budget.js +45 -4
  313. package/dist/esm/model/decision-retry.d.ts +10 -1
  314. package/dist/esm/model/decision-retry.js +19 -1
  315. package/dist/esm/model/defaults.d.ts +13 -2
  316. package/dist/esm/model/defaults.js +27 -4
  317. package/dist/esm/model/index.d.ts +7 -0
  318. package/dist/esm/model/index.js +7 -0
  319. package/dist/esm/model/interactions/arguments.d.ts +27 -0
  320. package/dist/esm/model/interactions/arguments.js +36 -1
  321. package/dist/esm/model/interactions/json-object.d.ts +7 -1
  322. package/dist/esm/model/interactions/json-object.js +48 -12
  323. package/dist/esm/model/interactions/native-functions.d.ts +6 -0
  324. package/dist/esm/model/interactions/native-functions.js +52 -10
  325. package/dist/esm/model/message-diagnostics.d.ts +17 -1
  326. package/dist/esm/model/message-diagnostics.js +17 -4
  327. package/dist/esm/model/options.d.ts +18 -1
  328. package/dist/esm/model/options.js +9 -1
  329. package/dist/esm/model/preparation.d.ts +30 -2
  330. package/dist/esm/model/preparation.js +86 -12
  331. package/dist/esm/model/runner.d.ts +129 -5
  332. package/dist/esm/model/runner.js +414 -80
  333. package/dist/esm/model/selection-transport.d.ts +14 -1
  334. package/dist/esm/model/selection-transport.js +48 -8
  335. package/dist/esm/model/settings.d.ts +11 -0
  336. package/dist/esm/model/settings.js +67 -13
  337. package/dist/esm/model/token-budget.d.ts +59 -1
  338. package/dist/esm/model/token-budget.js +69 -11
  339. package/dist/esm/model/transports.d.ts +20 -2
  340. package/dist/esm/model/transports.js +59 -6
  341. package/dist/esm/structs/capabilities/invocation.d.ts +36 -0
  342. package/dist/esm/structs/capabilities/model.d.ts +27 -0
  343. package/dist/esm/structs/capabilities/tools.d.ts +38 -0
  344. package/dist/esm/structs/common.d.ts +62 -2
  345. package/dist/esm/structs/common.js +11 -0
  346. package/dist/esm/structs/context/fragments.d.ts +28 -0
  347. package/dist/esm/structs/context/journal.d.ts +28 -3
  348. package/dist/esm/structs/context/processing.d.ts +11 -0
  349. package/dist/esm/structs/debug.d.ts +58 -1
  350. package/dist/esm/structs/debug.js +34 -5
  351. package/dist/esm/structs/diagnostics.d.ts +119 -1
  352. package/dist/esm/structs/errors.d.ts +42 -1
  353. package/dist/esm/structs/errors.js +26 -1
  354. package/dist/esm/structs/execution/engine.d.ts +24 -1
  355. package/dist/esm/structs/execution/events.d.ts +12 -0
  356. package/dist/esm/structs/execution/workflow.d.ts +71 -0
  357. package/dist/esm/structs/index.d.ts +11 -1
  358. package/dist/esm/structs/index.js +11 -1
  359. package/dist/esm/structs/invocation.d.ts +30 -0
  360. package/dist/esm/structs/kits/aggregation.d.ts +12 -0
  361. package/dist/esm/structs/kits/answering/checks.d.ts +11 -0
  362. package/dist/esm/structs/kits/answering/flow.d.ts +35 -1
  363. package/dist/esm/structs/kits/answering/state.d.ts +21 -0
  364. package/dist/esm/structs/kits/answering/tasks.d.ts +21 -0
  365. package/dist/esm/structs/kits/artifacts.d.ts +14 -0
  366. package/dist/esm/structs/kits/candidates.d.ts +19 -0
  367. package/dist/esm/structs/kits/delivery.d.ts +22 -0
  368. package/dist/esm/structs/kits/durable.d.ts +56 -3
  369. package/dist/esm/structs/kits/durable.js +7 -0
  370. package/dist/esm/structs/kits/evidence.d.ts +23 -0
  371. package/dist/esm/structs/kits/family.d.ts +49 -1
  372. package/dist/esm/structs/kits/family.js +1 -0
  373. package/dist/esm/structs/kits/intents/catalog.d.ts +26 -0
  374. package/dist/esm/structs/kits/intents/registry.d.ts +34 -0
  375. package/dist/esm/structs/kits/intents/scopes.d.ts +36 -1
  376. package/dist/esm/structs/kits/interaction.d.ts +64 -0
  377. package/dist/esm/structs/kits/interaction.js +8 -1
  378. package/dist/esm/structs/kits/knowledge-publication.d.ts +43 -1
  379. package/dist/esm/structs/kits/knowledge-publication.js +1 -0
  380. package/dist/esm/structs/kits/knowledge.d.ts +39 -2
  381. package/dist/esm/structs/kits/normalization.d.ts +15 -0
  382. package/dist/esm/structs/kits/policies.d.ts +25 -1
  383. package/dist/esm/structs/kits/presentation/events.d.ts +28 -4
  384. package/dist/esm/structs/kits/presentation/outputs.d.ts +38 -1
  385. package/dist/esm/structs/kits/presentation/templates.d.ts +15 -0
  386. package/dist/esm/structs/kits/projection.d.ts +21 -0
  387. package/dist/esm/structs/kits/reflection.d.ts +61 -2
  388. package/dist/esm/structs/kits/reflection.js +18 -3
  389. package/dist/esm/structs/kits/retrieval.d.ts +38 -0
  390. package/dist/esm/structs/kits/search.d.ts +22 -0
  391. package/dist/esm/structs/kits/text-skills.d.ts +36 -0
  392. package/dist/esm/structs/kits/tools.d.ts +87 -0
  393. package/dist/esm/structs/model/chat-provider.d.ts +24 -1
  394. package/dist/esm/structs/model/chat-provider.js +6 -0
  395. package/dist/esm/structs/model/interactions.d.ts +38 -0
  396. package/dist/esm/structs/model/messages.d.ts +30 -0
  397. package/dist/esm/structs/model/runtime.d.ts +104 -6
  398. package/dist/esm/structs/support/capabilities.d.ts +19 -2
  399. package/dist/esm/structs/support/context-processing.d.ts +88 -9
  400. package/dist/esm/structs/support/context.d.ts +29 -1
  401. package/dist/esm/structs/support/model/completion.d.ts +50 -0
  402. package/dist/esm/structs/support/model/completion.js +1 -0
  403. package/dist/esm/structs/support/model/interactions.d.ts +13 -1
  404. package/dist/esm/structs/support/model/messages.d.ts +52 -0
  405. package/dist/esm/structs/support/model/messages.js +1 -0
  406. package/dist/esm/structs/support/model/provider-observer.d.ts +22 -1
  407. package/dist/esm/structs/support/model/provider.d.ts +71 -6
  408. package/dist/esm/structs/support/registration.d.ts +13 -0
  409. package/dist/esm/structs/support/schema.d.ts +14 -0
  410. package/dist/esm/structs/support/tools.d.ts +28 -0
  411. package/dist/esm/structs/support/transport/json.d.ts +16 -0
  412. package/dist/esm/structs/support/transport/sse.d.ts +15 -0
  413. package/dist/esm/structs/utils/rules.d.ts +19 -0
  414. package/dist/esm/support/capabilities.d.ts +25 -2
  415. package/dist/esm/support/capabilities.js +43 -6
  416. package/dist/esm/support/context/assembly.d.ts +35 -4
  417. package/dist/esm/support/context/assembly.js +88 -16
  418. package/dist/esm/support/context/compression.d.ts +17 -1
  419. package/dist/esm/support/context/compression.js +48 -6
  420. package/dist/esm/support/context/fragments.d.ts +6 -0
  421. package/dist/esm/support/context/fragments.js +6 -0
  422. package/dist/esm/support/context/history.d.ts +43 -0
  423. package/dist/esm/support/context/history.js +36 -1
  424. package/dist/esm/support/context/index.d.ts +13 -2
  425. package/dist/esm/support/context/index.js +12 -1
  426. package/dist/esm/support/context/nodes.d.ts +49 -3
  427. package/dist/esm/support/context/nodes.js +165 -36
  428. package/dist/esm/support/context/processing.d.ts +145 -1
  429. package/dist/esm/support/context/processing.js +320 -62
  430. package/dist/esm/support/context/selection-policy.d.ts +42 -2
  431. package/dist/esm/support/context/selection-policy.js +98 -21
  432. package/dist/esm/support/context/selection.d.ts +14 -1
  433. package/dist/esm/support/context/selection.js +61 -10
  434. package/dist/esm/support/context/snapshot.d.ts +23 -1
  435. package/dist/esm/support/context/snapshot.js +29 -7
  436. package/dist/esm/support/context/strategies.d.ts +35 -2
  437. package/dist/esm/support/context/strategies.js +120 -28
  438. package/dist/esm/support/index.d.ts +9 -1
  439. package/dist/esm/support/index.js +9 -1
  440. package/dist/esm/support/model/capabilities.d.ts +10 -0
  441. package/dist/esm/support/model/capabilities.js +20 -1
  442. package/dist/esm/support/model/chat-completions.d.ts +44 -15
  443. package/dist/esm/support/model/chat-completions.js +92 -20
  444. package/dist/esm/support/model/children.d.ts +32 -2
  445. package/dist/esm/support/model/children.js +34 -6
  446. package/dist/esm/support/model/compatible-provider.d.ts +29 -3
  447. package/dist/esm/support/model/compatible-provider.js +190 -60
  448. package/dist/esm/support/model/completion/calls.d.ts +40 -0
  449. package/dist/esm/support/model/completion/calls.js +58 -0
  450. package/dist/esm/support/model/completion/default.d.ts +10 -0
  451. package/dist/esm/support/model/completion/default.js +29 -0
  452. package/dist/esm/support/model/completion/index.d.ts +10 -0
  453. package/dist/esm/support/model/completion/index.js +22 -0
  454. package/dist/esm/support/model/completion/session.d.ts +11 -0
  455. package/dist/esm/support/model/completion/session.js +99 -0
  456. package/dist/esm/support/model/index.d.ts +14 -0
  457. package/dist/esm/support/model/index.js +12 -0
  458. package/dist/esm/support/model/interactions/index.d.ts +1 -1
  459. package/dist/esm/support/model/interactions/index.js +12 -1
  460. package/dist/esm/support/model/interactions/json-object.d.ts +6 -0
  461. package/dist/esm/support/model/interactions/json-object.js +6 -0
  462. package/dist/esm/support/model/interactions/native-functions.d.ts +6 -0
  463. package/dist/esm/support/model/interactions/native-functions.js +6 -0
  464. package/dist/esm/support/model/observer.d.ts +25 -2
  465. package/dist/esm/support/model/observer.js +32 -6
  466. package/dist/esm/support/model/preview-rules.d.ts +20 -2
  467. package/dist/esm/support/model/preview-rules.js +66 -16
  468. package/dist/esm/support/model/reply-preview.d.ts +15 -1
  469. package/dist/esm/support/model/reply-preview.js +77 -17
  470. package/dist/esm/support/model/stage-transport.d.ts +9 -1
  471. package/dist/esm/support/model/stage-transport.js +33 -7
  472. package/dist/esm/support/model/strategies.d.ts +24 -2
  473. package/dist/esm/support/model/strategies.js +75 -14
  474. package/dist/esm/support/model/transports.d.ts +17 -1
  475. package/dist/esm/support/model/transports.js +53 -11
  476. package/dist/esm/support/registration.d.ts +20 -1
  477. package/dist/esm/support/registration.js +49 -7
  478. package/dist/esm/support/schema.d.ts +31 -1
  479. package/dist/esm/support/schema.js +46 -4
  480. package/dist/esm/support/stream-events.d.ts +22 -1
  481. package/dist/esm/support/stream-events.js +60 -8
  482. package/dist/esm/support/tool-runtime.d.ts +6 -0
  483. package/dist/esm/support/tool-runtime.js +6 -0
  484. package/dist/esm/support/tools.d.ts +22 -0
  485. package/dist/esm/support/tools.js +79 -10
  486. package/dist/esm/support/transport/index.d.ts +7 -0
  487. package/dist/esm/support/transport/index.js +7 -0
  488. package/dist/esm/support/transport/json.d.ts +29 -2
  489. package/dist/esm/support/transport/json.js +28 -4
  490. package/dist/esm/support/transport/sse.d.ts +31 -1
  491. package/dist/esm/support/transport/sse.js +25 -2
  492. package/dist/esm/types.d.ts +9 -1
  493. package/dist/esm/utils/break-observer.d.ts +27 -2
  494. package/dist/esm/utils/break-observer.js +20 -2
  495. package/dist/esm/utils/cancellation.d.ts +56 -5
  496. package/dist/esm/utils/cancellation.js +77 -9
  497. package/dist/esm/utils/catalog.d.ts +20 -1
  498. package/dist/esm/utils/catalog.js +19 -4
  499. package/dist/esm/utils/debug.d.ts +20 -1
  500. package/dist/esm/utils/debug.js +14 -2
  501. package/dist/esm/utils/index.d.ts +8 -0
  502. package/dist/esm/utils/index.js +8 -0
  503. package/dist/esm/utils/interaction-definition.d.ts +18 -1
  504. package/dist/esm/utils/interaction-definition.js +26 -6
  505. package/dist/esm/utils/invocation.d.ts +36 -1
  506. package/dist/esm/utils/invocation.js +42 -4
  507. package/dist/esm/utils/model-protocol.d.ts +8 -0
  508. package/dist/esm/utils/model-protocol.js +20 -1
  509. package/dist/esm/utils/object.d.ts +16 -0
  510. package/dist/esm/utils/object.js +16 -0
  511. package/dist/esm/utils/observer.d.ts +19 -1
  512. package/dist/esm/utils/observer.js +22 -2
  513. package/dist/esm/utils/protocol-registry.d.ts +38 -1
  514. package/dist/esm/utils/protocol-registry.js +47 -4
  515. package/dist/esm/utils/query-key.d.ts +11 -1
  516. package/dist/esm/utils/query-key.js +21 -2
  517. package/dist/esm/utils/registration.d.ts +34 -2
  518. package/dist/esm/utils/registration.js +18 -2
  519. package/dist/esm/utils/rules.d.ts +81 -4
  520. package/dist/esm/utils/rules.js +39 -11
  521. package/dist/esm/utils/schema-adapter.d.ts +12 -1
  522. package/dist/esm/utils/schema-adapter.js +25 -2
  523. package/dist/esm/utils/synchronous.d.ts +60 -4
  524. package/dist/esm/utils/synchronous.js +64 -7
  525. package/dist/esm/utils/text.d.ts +15 -1
  526. package/dist/esm/utils/text.js +15 -1
  527. package/package.json +23 -3
@@ -1,28 +1,81 @@
1
+ /**
2
+ * Execution of one host-selected synchronous invocation.
3
+ *
4
+ * An invocation is the smallest Core-owned unit of work: the App decides which handler to
5
+ * call and supplies payload and authorization facts, while this module runs the handler once,
6
+ * threads cancellation and diagnostics, and pairs an optional journal start with a receipt.
7
+ * Selection, authorization and retries stay outside.
8
+ *
9
+ * Exports: `executeInvocation` and the invocation contracts re-exported at the bottom.
10
+ */
1
11
  import { invocationId } from '../utils/invocation.js';
2
12
  import { synchronous } from '../utils/synchronous.js';
3
13
  import { diagnosticError } from '../diagnostics/index.js';
4
14
  import { NodeReports } from '../execution/reporting.js';
5
- /** Execute a host-selected synchronous call. Selection, authorization facts and payload shape stay outside. */
15
+ /**
16
+ * Run one synchronous invocation and record its effects.
17
+ *
18
+ * @param invocation Handler whose `call` performs the work; its `id` becomes the tool id in
19
+ * diagnostics and journal records.
20
+ * @param input Payload handed to the handler unchanged.
21
+ * @param context App context passed to the ports below; it is never inspected here.
22
+ * @param ports Per-context callbacks for diagnostics, cancellation, journalling and receipt
23
+ * capture. All are optional: without them the handler still runs, just unrecorded.
24
+ * @returns Nothing. The outcome is conveyed through the journal receipt, when one is bound.
25
+ * @throws TypeError when the handler identity is missing, or when the handler returns a
26
+ * promise despite the synchronous contract.
27
+ * @throws Whatever the handler throws, unchanged, including the abort error raised by the
28
+ * signal checks.
29
+ */
6
30
  export function executeInvocation(invocation, input, context, ports = {}) {
7
31
  const toolId = invocation.id;
32
+ // Identify the call before touching the ports: journal and diagnostics records cannot be
33
+ // reconciled with an anonymous handler.
8
34
  if (!toolId?.trim())
9
35
  throw new TypeError('Invalid invocation handler identity');
10
36
  const journal = ports.journal?.(context), id = invocationId(), startedAtMs = Date.now();
11
- const diagnostics = ports.diagnostics?.(context)?.child(id, { invocationId: id, nodeRole: 'invocation', definitionKind: 'tool-invocation', definitionId: toolId, nodeId: toolId, nodeName: toolId, nodeKind: 'tool-invocation' });
12
- const callId = journal?.beginTool({ toolId, input, invocation: { ...diagnostics?.identity, invocationId: id, startedAtMs } });
13
- diagnostics?.emit('tool.call', () => ({ toolId, invocationId: id, ...(diagnostics?.enabled('tool.call', 'content') ? { input } : {}) }));
37
+ const diagnostics = ports.diagnostics?.(context)?.child(id, {
38
+ invocationId: id,
39
+ nodeRole: 'invocation',
40
+ definitionKind: 'tool-invocation',
41
+ definitionId: toolId,
42
+ nodeId: toolId,
43
+ nodeName: toolId,
44
+ nodeKind: 'tool-invocation',
45
+ });
46
+ const callId = journal?.beginTool({
47
+ toolId,
48
+ input,
49
+ invocation: { ...diagnostics?.identity, invocationId: id, startedAtMs },
50
+ });
51
+ diagnostics?.emit('tool.call', () => ({
52
+ toolId,
53
+ invocationId: id,
54
+ ...(diagnostics?.enabled('tool.call', 'content') ? { input } : {}),
55
+ }));
56
+ // Held outside the try block so the failure path can still tell cancellation from an error.
14
57
  let activeSignal;
15
58
  let reports;
16
59
  try {
17
60
  const checkpoint = ports.checkpoint?.(context);
18
- const signal = activeSignal = ports.signal?.(context);
61
+ const signal = (activeSignal = ports.signal?.(context));
19
62
  signal?.throwIfAborted();
20
63
  reports = new NodeReports(diagnostics, signal, 'tool.result');
21
- synchronous(invocation.call(input, context, { mode: 'sync', invocationId: id, signal: signal ?? new AbortController().signal, diagnostics,
22
- report: reports.report.bind(reports), createSubFlowLogger: reports.createSubFlowLogger.bind(reports) }), 'Invocation handlers must be synchronous');
64
+ // The helper rejects a promise and drains its rejection: a handler that turns async must
65
+ // fail here instead of escaping as an unhandled rejection.
66
+ synchronous(invocation.call(input, context, {
67
+ mode: 'sync',
68
+ invocationId: id,
69
+ signal: signal ?? new AbortController().signal,
70
+ diagnostics,
71
+ report: reports.report.bind(reports),
72
+ createSubFlowLogger: reports.createSubFlowLogger.bind(reports),
73
+ }), 'Invocation handlers must be synchronous');
23
74
  ports.signal?.(context)?.throwIfAborted();
24
75
  if (callId) {
25
76
  const receipt = ports.receipt?.(context, checkpoint);
77
+ // Cancellation may have arrived while the handler or receipt ran; a successful record
78
+ // must not be committed for a request the host has already abandoned.
26
79
  ports.signal?.(context)?.throwIfAborted();
27
80
  journal.finishTool({ invocationId: callId, status: 'success', value: receipt });
28
81
  }
@@ -31,15 +84,32 @@ export function executeInvocation(invocation, input, context, ports = {}) {
31
84
  }
32
85
  catch (error) {
33
86
  reports?.close();
34
- diagnostics?.emit('tool.result', () => ({ toolId, invocationId: id, status: activeSignal?.aborted ? 'cancelled' : 'error', durationMs: Date.now() - startedAtMs, ...(diagnostics?.enabled('tool.result', 'content') ? { error: diagnosticError(error) } : {}) }), reports?.debug());
87
+ diagnostics?.emit('tool.result', () => ({
88
+ toolId,
89
+ invocationId: id,
90
+ status: activeSignal?.aborted ? 'cancelled' : 'error',
91
+ durationMs: Date.now() - startedAtMs,
92
+ ...(diagnostics?.enabled('tool.result', 'content')
93
+ ? { error: diagnosticError(error) }
94
+ : {}),
95
+ }), reports?.debug());
35
96
  try {
36
97
  if (callId)
37
- journal.finishTool({ invocationId: callId, status: ports.signal?.(context)?.aborted ? 'cancelled' : 'error', value: ports.receiptError?.(error) });
98
+ journal.finishTool({
99
+ invocationId: callId,
100
+ // The signal, not the error shape, decides whether this counts as cancellation.
101
+ status: ports.signal?.(context)?.aborted ? 'cancelled' : 'error',
102
+ value: ports.receiptError?.(error),
103
+ });
104
+ }
105
+ catch {
106
+ /* Preserve the invocation failure if receipt recording also fails. */
38
107
  }
39
- catch { /* Preserve the invocation failure if receipt recording also fails. */ }
40
108
  throw error;
41
109
  }
42
110
  finally {
111
+ // Closing is idempotent, so a port that throws on the success path still releases the
112
+ // reporting scope.
43
113
  reports?.close();
44
114
  }
45
115
  }
@@ -2,22 +2,89 @@ import type { ModelCapabilityRegistration, RegisteredModelCapability, ModelSelec
2
2
  export { modelProtocolError } from '../utils/model-protocol.js';
3
3
  /** A request/stage projection is a sealed registry. Hosts filter availability before projection. */
4
4
  export declare class ModelCapabilityRegistry {
5
+ /** Insertion-ordered entries; iteration order is the declaration order of the catalog. */
5
6
  private readonly definitionsById;
7
+ /** Sealing is one-way: stage-time code must never extend the catalog it is executing. */
6
8
  private sealed;
9
+ /**
10
+ * @param definitions Capabilities to register immediately, in iteration order.
11
+ * @throws TypeError when a definition is invalid or its id is duplicated (raised by
12
+ * `register`).
13
+ */
7
14
  constructor(definitions?: Iterable<ModelCapabilityRegistration>);
15
+ /**
16
+ * Register one capability.
17
+ *
18
+ * @param capability Declaration with a non-empty unique id, non-empty description, an
19
+ * object-rooted JSON schema and a resolver.
20
+ * @returns This registry, for chaining.
21
+ * @throws Error when the registry is already sealed.
22
+ * @throws TypeError when the declaration is invalid or its id is already registered.
23
+ */
8
24
  register<Result>(capability: ModelCapabilityRegistration<Result>): this;
25
+ /** Frozen snapshot of the registered definitions, in insertion order. */
9
26
  get definitions(): readonly Readonly<RegisteredModelCapability>[];
27
+ /** Registered ids in declaration order. */
10
28
  ids(): readonly string[];
29
+ /** Live iterator over `[id, definition]` pairs; it reflects only entries added before sealing. */
11
30
  entries(): IterableIterator<readonly [string, RegisteredModelCapability]>;
31
+ /**
32
+ * Register several capabilities.
33
+ *
34
+ * @param definitions Declarations applied in iteration order.
35
+ * @returns This registry, for chaining.
36
+ * @throws Error or TypeError under the same conditions as `register`.
37
+ */
12
38
  registerAll(definitions: Iterable<ModelCapabilityRegistration>): this;
39
+ /**
40
+ * @param id Capability id.
41
+ * @returns The registered definition.
42
+ * @throws TypeError when the id is not registered, which usually means a stage projection
43
+ * omitted it.
44
+ */
13
45
  require(id: string): RegisteredModelCapability;
46
+ /**
47
+ * @param id Capability id.
48
+ * @returns Whether the id is registered in this registry.
49
+ */
14
50
  has(id: string): boolean;
51
+ /**
52
+ * @param id Capability id.
53
+ * @returns The registered definition, or undefined when absent.
54
+ */
15
55
  get(id: string): RegisteredModelCapability | undefined;
56
+ /** Live iterator over the registered definitions. */
16
57
  values(): IterableIterator<RegisteredModelCapability>;
58
+ /**
59
+ * Close the registry to further registration.
60
+ *
61
+ * Sealing is idempotent and does not affect existing entries.
62
+ *
63
+ * @returns This registry.
64
+ */
17
65
  seal(): this;
66
+ /**
67
+ * Derive a sealed sub-catalog for one stage.
68
+ *
69
+ * @param ids Capability ids available in the stage, in projection order. Must be non-empty
70
+ * and free of duplicates.
71
+ * @returns A new sealed registry that reuses the immutable entries of this registry.
72
+ * @throws TypeError when the selection is empty or contains a duplicate id.
73
+ * @throws Error when an id was never registered.
74
+ */
18
75
  select(ids: readonly string[]): ModelCapabilityRegistry;
76
+ /**
77
+ * Parse model-supplied arguments and run the selected capability.
78
+ *
79
+ * @param selection Capability id plus the raw `input` object produced by the model. Other
80
+ * fields, such as the originating call, are not interpreted here.
81
+ * @param context Stage identity handed to the resolver.
82
+ * @returns The resolver output.
83
+ * @throws ValidationError when the capability is unavailable in this registry or the input
84
+ * is not a plain object; parser and resolver failures propagate unchanged.
85
+ */
19
86
  resolve(selection: ModelSelection, context: Readonly<{
20
87
  stageId: string;
21
88
  }>): unknown;
22
89
  }
23
- export type { ModelCapability, ModelCapabilityRegistration, RegisteredModelCapability, ModelSelection, ModelCapabilitySource, ModelCapabilityCatalog } from '../structs/capabilities/model.js';
90
+ export type { ModelCapability, ModelCapabilityRegistration, RegisteredModelCapability, ModelSelection, ModelCapabilitySource, ModelCapabilityCatalog, } from '../structs/capabilities/model.js';
@@ -1,43 +1,143 @@
1
+ /**
2
+ * Declarative catalog of model capabilities for a request or one stage projection.
3
+ *
4
+ * A capability pairs an id and description with an input schema and a synchronous resolver,
5
+ * letting stage code parse model-supplied arguments and produce a typed value. Registration
6
+ * snapshots the schema and pins the parser and resolver to their defining object, so later
7
+ * mutation on the host side cannot change what a stage advertises.
8
+ *
9
+ * The registry is mutable until `seal()`. `select()` derives a sealed subset for a stage and
10
+ * shares the already-frozen entries rather than re-validating or re-wrapping them.
11
+ *
12
+ * Exports: `ModelCapabilityRegistry`, `modelProtocolError`, and the capability types.
13
+ */
1
14
  import { synchronous } from '../utils/synchronous.js';
2
15
  import { modelProtocolError } from '../utils/model-protocol.js';
3
16
  import { snapshotSchemaAdapter } from '../utils/schema-adapter.js';
4
17
  export { modelProtocolError } from '../utils/model-protocol.js';
5
18
  /** A request/stage projection is a sealed registry. Hosts filter availability before projection. */
6
19
  export class ModelCapabilityRegistry {
20
+ /** Insertion-ordered entries; iteration order is the declaration order of the catalog. */
7
21
  definitionsById = new Map();
22
+ /** Sealing is one-way: stage-time code must never extend the catalog it is executing. */
8
23
  sealed = false;
24
+ /**
25
+ * @param definitions Capabilities to register immediately, in iteration order.
26
+ * @throws TypeError when a definition is invalid or its id is duplicated (raised by
27
+ * `register`).
28
+ */
9
29
  constructor(definitions = []) {
10
30
  for (const definition of definitions)
11
31
  this.register(definition);
12
32
  }
33
+ /**
34
+ * Register one capability.
35
+ *
36
+ * @param capability Declaration with a non-empty unique id, non-empty description, an
37
+ * object-rooted JSON schema and a resolver.
38
+ * @returns This registry, for chaining.
39
+ * @throws Error when the registry is already sealed.
40
+ * @throws TypeError when the declaration is invalid or its id is already registered.
41
+ */
13
42
  register(capability) {
14
43
  if (this.sealed)
15
44
  throw new Error('Model capability registry is sealed');
45
+ // Model arguments are always a JSON object, so a non-object root can never validate.
16
46
  const schema = capability.inputSchema?.jsonSchema;
17
- if (!capability.id?.trim() || !capability.description?.trim() || schema?.type !== 'object'
18
- || typeof capability.resolve !== 'function' || this.definitionsById.has(capability.id))
47
+ if (!capability.id?.trim() ||
48
+ !capability.description?.trim() ||
49
+ schema?.type !== 'object' ||
50
+ typeof capability.resolve !== 'function' ||
51
+ this.definitionsById.has(capability.id))
19
52
  throw new TypeError('Invalid or duplicate model capability');
53
+ // Clone and freeze the schema, and pin `parse`, so the stored entry is independent of
54
+ // the definition object the host may keep mutating.
20
55
  const inputSchema = snapshotSchemaAdapter(capability.inputSchema, 'Model input parsers must be synchronous');
21
56
  const resolver = capability.resolve.bind(capability);
57
+ // Bind once here: a later caller cannot substitute its own receiver for the resolver.
22
58
  const resolve = (value, context) => synchronous(resolver(value, context), 'Model capability resolvers must be synchronous');
23
- this.definitionsById.set(capability.id, Object.freeze({ id: capability.id, description: capability.description, inputSchema, resolve }));
59
+ this.definitionsById.set(capability.id, Object.freeze({
60
+ id: capability.id,
61
+ description: capability.description,
62
+ inputSchema,
63
+ resolve,
64
+ }));
24
65
  return this;
25
66
  }
26
- get definitions() { return Object.freeze([...this.definitionsById.values()]); }
27
- ids() { return Object.freeze([...this.definitionsById.keys()]); }
28
- entries() { return this.definitionsById.entries(); }
29
- registerAll(definitions) { for (const definition of definitions)
30
- this.register(definition); return this; }
67
+ /** Frozen snapshot of the registered definitions, in insertion order. */
68
+ get definitions() {
69
+ return Object.freeze([...this.definitionsById.values()]);
70
+ }
71
+ /** Registered ids in declaration order. */
72
+ ids() {
73
+ return Object.freeze([...this.definitionsById.keys()]);
74
+ }
75
+ /** Live iterator over `[id, definition]` pairs; it reflects only entries added before sealing. */
76
+ entries() {
77
+ return this.definitionsById.entries();
78
+ }
79
+ /**
80
+ * Register several capabilities.
81
+ *
82
+ * @param definitions Declarations applied in iteration order.
83
+ * @returns This registry, for chaining.
84
+ * @throws Error or TypeError under the same conditions as `register`.
85
+ */
86
+ registerAll(definitions) {
87
+ for (const definition of definitions)
88
+ this.register(definition);
89
+ return this;
90
+ }
91
+ /**
92
+ * @param id Capability id.
93
+ * @returns The registered definition.
94
+ * @throws TypeError when the id is not registered, which usually means a stage projection
95
+ * omitted it.
96
+ */
31
97
  require(id) {
32
98
  const capability = this.get(id);
33
99
  if (!capability)
34
100
  throw new TypeError(`Unknown model capability: ${id}`);
35
101
  return capability;
36
102
  }
37
- has(id) { return this.definitionsById.has(id); }
38
- get(id) { return this.definitionsById.get(id); }
39
- values() { return this.definitionsById.values(); }
40
- seal() { this.sealed = true; return this; }
103
+ /**
104
+ * @param id Capability id.
105
+ * @returns Whether the id is registered in this registry.
106
+ */
107
+ has(id) {
108
+ return this.definitionsById.has(id);
109
+ }
110
+ /**
111
+ * @param id Capability id.
112
+ * @returns The registered definition, or undefined when absent.
113
+ */
114
+ get(id) {
115
+ return this.definitionsById.get(id);
116
+ }
117
+ /** Live iterator over the registered definitions. */
118
+ values() {
119
+ return this.definitionsById.values();
120
+ }
121
+ /**
122
+ * Close the registry to further registration.
123
+ *
124
+ * Sealing is idempotent and does not affect existing entries.
125
+ *
126
+ * @returns This registry.
127
+ */
128
+ seal() {
129
+ this.sealed = true;
130
+ return this;
131
+ }
132
+ /**
133
+ * Derive a sealed sub-catalog for one stage.
134
+ *
135
+ * @param ids Capability ids available in the stage, in projection order. Must be non-empty
136
+ * and free of duplicates.
137
+ * @returns A new sealed registry that reuses the immutable entries of this registry.
138
+ * @throws TypeError when the selection is empty or contains a duplicate id.
139
+ * @throws Error when an id was never registered.
140
+ */
41
141
  select(ids) {
42
142
  if (!ids.length || new Set(ids).size !== ids.length)
43
143
  throw new TypeError('Invalid capability selection');
@@ -53,9 +153,22 @@ export class ModelCapabilityRegistry {
53
153
  }
54
154
  return selected.seal();
55
155
  }
156
+ /**
157
+ * Parse model-supplied arguments and run the selected capability.
158
+ *
159
+ * @param selection Capability id plus the raw `input` object produced by the model. Other
160
+ * fields, such as the originating call, are not interpreted here.
161
+ * @param context Stage identity handed to the resolver.
162
+ * @returns The resolver output.
163
+ * @throws ValidationError when the capability is unavailable in this registry or the input
164
+ * is not a plain object; parser and resolver failures propagate unchanged.
165
+ */
56
166
  resolve(selection, context) {
57
167
  const { stageId } = context;
58
- const capability = this.definitionsById.get(selection.capabilityId) ?? modelProtocolError('Model capability is unavailable in this stage');
168
+ // Model output is untrusted: unknown ids and non-object arguments are protocol failures,
169
+ // not ordinary `undefined` results.
170
+ const capability = this.definitionsById.get(selection.capabilityId) ??
171
+ modelProtocolError('Model capability is unavailable in this stage');
59
172
  if (!selection.input || typeof selection.input !== 'object' || Array.isArray(selection.input))
60
173
  modelProtocolError('Model capability input must be an object');
61
174
  return synchronous(capability.resolve(capability.inputSchema.parse(selection.input), { stageId }), 'Model capability parsers must be synchronous');
@@ -1,3 +1,14 @@
1
1
  import { ToolRegistry } from './tools.js';
2
2
  import type { ToolDefinition, ToolRegistryOptions } from '../structs/capabilities/tools.js';
3
+ /**
4
+ * Build a sealed tool registry from typed definitions.
5
+ *
6
+ * @param definitions Tool declarations in registration order; ids must be unique.
7
+ * @param context App context captured for every call made through this registry.
8
+ * @param options Registry ports: the request-lifetime signal, diagnostics, and the error
9
+ * mapping used for unavailable tools and failure codes.
10
+ * @returns The sealed registry.
11
+ * @throws Error when the registry is sealed already or an id is duplicated.
12
+ * @throws TypeError when a definition is invalid, raised during registration.
13
+ */
3
14
  export declare function createToolRegistry<Context>(definitions: readonly ToolDefinition<unknown, unknown, Context>[], context: Context, options: ToolRegistryOptions): ToolRegistry;
@@ -1,33 +1,85 @@
1
+ /**
2
+ * Bridge from typed tool definitions to the Core `ToolRegistry`.
3
+ *
4
+ * A `ToolDefinition` is the App-facing declaration: a schema adapter plus authorize, execute
5
+ * and parseOutput handlers. This module pins those handlers to their definition and adapts
6
+ * them to the lower-level `ExecutableTool` contract, while keeping the synchronous and
7
+ * asynchronous boundaries explicit: `invokeAsync` awaits authorization and execution,
8
+ * `invoke` rejects a promise from either.
9
+ *
10
+ * Exports: `createToolRegistry`.
11
+ */
1
12
  import { assertion, synchronous, isPromiseLike } from '../utils/synchronous.js';
2
13
  import { ToolRegistry } from './tools.js';
3
- /** Preserve synchronous tools; asynchronous authorization/I/O remain awaited by Core invokeAsync. */
14
+ /**
15
+ * Run authorization and execution for one call, in that order.
16
+ *
17
+ * Authorization must resolve to undefined; a discarded boolean is treated as a contract
18
+ * violation instead of being silently ignored. Cancellation is checked before and after each
19
+ * phase so an aborted request never produces a successful value.
20
+ */
4
21
  function execute(definition, input, context, execution) {
5
22
  const { signal, mode, diagnostics, report, createSubFlowLogger } = execution;
6
23
  signal.throwIfAborted();
7
- const complete = (value) => { signal.throwIfAborted(); return value; };
24
+ // Re-check after the handler returned: work that completed during cancellation must not be
25
+ // reported as a success.
26
+ const complete = (value) => {
27
+ signal.throwIfAborted();
28
+ return value;
29
+ };
8
30
  const operation = { app: context, signal, diagnostics, report, createSubFlowLogger };
9
31
  const authorized = (result) => {
10
32
  assertion(result, 'Tool authorization must return void');
11
33
  signal.throwIfAborted();
12
34
  const value = definition.execute(input, operation);
13
- return mode === 'sync' ? complete(synchronous(value, 'Synchronous tools must not return a Promise'))
14
- : isPromiseLike(value) ? Promise.resolve(value).then(complete) : complete(value);
35
+ return mode === 'sync'
36
+ ? complete(synchronous(value, 'Synchronous tools must not return a Promise'))
37
+ : isPromiseLike(value)
38
+ ? Promise.resolve(value).then(complete)
39
+ : complete(value);
15
40
  };
16
41
  const allowed = definition.authorize(input, operation);
17
- return mode === 'sync' ? authorized(synchronous(allowed, 'Synchronous tool authorization must not return a Promise'))
18
- : isPromiseLike(allowed) ? Promise.resolve(allowed).then(authorized) : authorized(allowed);
42
+ return mode === 'sync'
43
+ ? authorized(synchronous(allowed, 'Synchronous tool authorization must not return a Promise'))
44
+ : isPromiseLike(allowed)
45
+ ? Promise.resolve(allowed).then(authorized)
46
+ : authorized(allowed);
19
47
  }
48
+ /**
49
+ * Build a sealed tool registry from typed definitions.
50
+ *
51
+ * @param definitions Tool declarations in registration order; ids must be unique.
52
+ * @param context App context captured for every call made through this registry.
53
+ * @param options Registry ports: the request-lifetime signal, diagnostics, and the error
54
+ * mapping used for unavailable tools and failure codes.
55
+ * @returns The sealed registry.
56
+ * @throws Error when the registry is sealed already or an id is duplicated.
57
+ * @throws TypeError when a definition is invalid, raised during registration.
58
+ */
20
59
  export function createToolRegistry(definitions, context, options) {
21
60
  const registry = new ToolRegistry(options);
22
- registry.registerAll(definitions.map(definition => {
61
+ registry.registerAll(definitions.map((definition) => {
23
62
  // Every entry point pins the same canonical handlers, including callers
24
63
  // that use this creator directly rather than defineToolCatalog.
25
- const { id, kind, description, inputSchema, authorize, execute: handle, parseOutput, debugSteps } = definition;
26
- const bound = Object.freeze({ id, kind, description, inputSchema,
27
- authorize: authorize.bind(definition), execute: handle.bind(definition), parseOutput: parseOutput.bind(definition),
64
+ const { id, kind, description, inputSchema, authorize, execute: handle, parseOutput, debugSteps, } = definition;
65
+ const bound = Object.freeze({
66
+ id,
67
+ kind,
68
+ description,
69
+ inputSchema,
70
+ authorize: authorize.bind(definition),
71
+ execute: handle.bind(definition),
72
+ parseOutput: parseOutput.bind(definition),
28
73
  });
29
- return { id, kind, description, debugSteps: debugSteps?.bind(definition),
30
- parseInput: inputSchema.parse.bind(inputSchema), parseOutput: bound.parseOutput,
74
+ return {
75
+ id,
76
+ kind,
77
+ description,
78
+ debugSteps: debugSteps?.bind(definition),
79
+ // Bind to the adapter captured above, so a later replacement of the property on the
80
+ // definition cannot change what this registry validates.
81
+ parseInput: inputSchema.parse.bind(inputSchema),
82
+ parseOutput: bound.parseOutput,
31
83
  execute: (input, execution) => execute(bound, input, context, execution),
32
84
  };
33
85
  }));
@@ -1,29 +1,122 @@
1
1
  import type { ToolResult } from '../structs/invocation.js';
2
2
  import type { ExecutableTool, RegisteredTool, ToolExecutionEvent, ToolRegistryPorts, ToolRegistryOptions, ToolInvocationRequest } from '../structs/capabilities/tools.js';
3
- /** Mechanism only. Visibility, authorization, schemas and semantic metadata are host registrations. */
3
+ /**
4
+ * Registry mechanism only: visibility, authorization policy, schemas and semantic metadata
5
+ * are host registrations. A registry is mutable until sealed and keeps its own call log.
6
+ */
4
7
  export declare class ToolRegistry<Tool extends ExecutableTool = ExecutableTool> {
8
+ /** Insertion order is the declaration order and is preserved by every enumeration below. */
5
9
  private readonly tools;
10
+ /** Sealing is one-way: a running stage must not add tools to the registry it executes. */
6
11
  private sealed;
12
+ /** In-memory execution facts for this registry's lifetime, one entry per completed call. */
7
13
  private readonly executionEvents;
14
+ /** Frozen snapshot of the recorded execution facts. */
8
15
  get events(): readonly Readonly<ToolExecutionEvent<Tool['kind']>>[];
9
16
  private diagnostics;
10
17
  private readonly ports;
18
+ /**
19
+ * @param options.execution Request-lifetime signal plus the diagnostics/observer source the
20
+ * registry starts from.
21
+ * @param options.errors Factories for the unknown-tool error and for failure codes.
22
+ */
11
23
  constructor({ execution, errors }?: ToolRegistryOptions);
24
+ /**
25
+ * Replace the diagnostics scope used by subsequent calls.
26
+ *
27
+ * Calls already in flight keep the scope they started with.
28
+ *
29
+ * @param diagnostics New diagnostics context, or undefined to stop emitting events.
30
+ */
12
31
  setDiagnostics(diagnostics: ToolRegistryPorts['diagnostics']): void;
32
+ /**
33
+ * Register one executable tool.
34
+ *
35
+ * The stored entry is frozen and its parsers are bound to the tool, so later changes on the
36
+ * caller's object cannot alter validation or execution.
37
+ *
38
+ * @param tool Executable tool; `id` and `kind` must be non-empty, and the parse and execute
39
+ * handlers must all be functions.
40
+ * @returns This registry, for chaining.
41
+ * @throws Error when the registry is sealed or the id is already registered.
42
+ * @throws TypeError when the tool shape is invalid.
43
+ */
13
44
  register(tool: Tool): this;
45
+ /**
46
+ * Invoke a registered tool synchronously.
47
+ *
48
+ * @param request Single request object carrying `toolId`, `input`, and optional signal and
49
+ * diagnostics. Exactly one argument is accepted; the arity check is runtime-enforced
50
+ * because callers may bypass the type system.
51
+ * @returns The tool result, with frozen invocation metadata.
52
+ * @throws TypeError when the request shape is wrong, the diagnostics belong to another run,
53
+ * or the tool returns a promise.
54
+ * @throws Error when the tool is unknown or the tool itself fails; the abort reason
55
+ * surfaces when the signal is cancelled.
56
+ */
14
57
  invoke(request: ToolInvocationRequest): ToolResult<unknown>;
58
+ /**
59
+ * Invoke a registered tool and await its result.
60
+ *
61
+ * @param request Single request object, identical to `invoke`.
62
+ * @returns The tool result once the tool settles.
63
+ * @throws TypeError or Error under the same conditions as `invoke`; rejections from an
64
+ * asynchronous tool are propagated unchanged.
65
+ */
15
66
  invokeAsync(request: ToolInvocationRequest): Promise<ToolResult<unknown>>;
67
+ /**
68
+ * Run one call: validate, parse input, execute, parse output, then record the outcome.
69
+ *
70
+ * @param name Registered tool id.
71
+ * @param input Untrusted caller input, parsed before the tool sees it.
72
+ * @param asynchronous Whether promises returned by the tool are awaited.
73
+ * @param parentDiagnostics Scope the call is recorded under; defaults to the registry's.
74
+ * @param requestSignal Per-call signal, combined with the request-lifetime signal.
75
+ * @returns The frozen result on success; every failure path throws.
76
+ */
16
77
  private execute;
78
+ /**
79
+ * Register several tools.
80
+ *
81
+ * @param tools Executable tools applied in iteration order.
82
+ * @returns This registry, for chaining.
83
+ * @throws Error or TypeError under the same conditions as `register`.
84
+ */
17
85
  registerAll(tools: Iterable<Tool>): this;
86
+ /**
87
+ * @param name Tool id.
88
+ * @returns The registered tool, or undefined when absent.
89
+ */
18
90
  get(name: string): RegisteredTool<Tool> | undefined;
91
+ /** Frozen snapshot of the registered tools, in declaration order. */
19
92
  get definitions(): readonly Readonly<RegisteredTool<Tool>>[];
93
+ /** Registered tool ids in declaration order. */
20
94
  ids(): readonly string[];
95
+ /** Live iterator over `[id, tool]` pairs; it reflects only entries added before sealing. */
21
96
  entries(): IterableIterator<[string, RegisteredTool<Tool>]>;
97
+ /**
98
+ * @param id Tool id.
99
+ * @returns The registered tool.
100
+ * @throws Error when the tool is unknown; the App-supplied `unavailable` factory can
101
+ * replace the default message.
102
+ */
22
103
  require(id: string): RegisteredTool<Tool>;
104
+ /**
105
+ * @param name Tool id.
106
+ * @returns Whether the id is registered in this registry.
107
+ */
23
108
  has(name: string): boolean;
109
+ /** Live iterator over the registered tools. */
24
110
  values(): IterableIterator<RegisteredTool<Tool>>;
111
+ /**
112
+ * Close the registry to further registration.
113
+ *
114
+ * Sealing is idempotent and does not affect existing tools.
115
+ *
116
+ * @returns This registry.
117
+ */
25
118
  seal(): this;
26
119
  }
27
- export type { ToolDefinition, ToolExecutionContext, ExecutableTool, RegisteredTool, ToolExecutionEvent, ToolRegistryPorts, ToolRegistryOptions, ToolInvocationRequest } from '../structs/capabilities/tools.js';
120
+ export type { ToolDefinition, ToolExecutionContext, ExecutableTool, RegisteredTool, ToolExecutionEvent, ToolRegistryPorts, ToolRegistryOptions, ToolInvocationRequest, } from '../structs/capabilities/tools.js';
28
121
  export { executeInvocation } from './invocation.js';
29
- export type { InvocationHandler, ToolInvocationPorts, ToolJournal } from '../structs/capabilities/invocation.js';
122
+ export type { InvocationHandler, ToolInvocationPorts, ToolJournal, } from '../structs/capabilities/invocation.js';