@tanstack/ai 0.36.0 → 0.38.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 (215) hide show
  1. package/dist/esm/activities/chat/adapter.d.ts +163 -0
  2. package/dist/esm/activities/chat/adapter.js +17 -0
  3. package/dist/esm/activities/chat/adapter.js.map +1 -0
  4. package/dist/esm/activities/chat/agent-loop-strategies.d.ts +59 -0
  5. package/dist/esm/activities/chat/agent-loop-strategies.js +23 -0
  6. package/dist/esm/activities/chat/agent-loop-strategies.js.map +1 -0
  7. package/dist/esm/activities/chat/index.d.ts +270 -0
  8. package/dist/esm/activities/chat/index.js +1724 -0
  9. package/dist/esm/activities/chat/index.js.map +1 -0
  10. package/dist/esm/activities/chat/mcp/manager.d.ts +25 -0
  11. package/dist/esm/activities/chat/mcp/manager.js +80 -0
  12. package/dist/esm/activities/chat/mcp/manager.js.map +1 -0
  13. package/dist/esm/activities/chat/mcp/types.d.ts +78 -0
  14. package/dist/esm/activities/chat/messages.d.ts +78 -0
  15. package/dist/esm/activities/chat/messages.js +374 -0
  16. package/dist/esm/activities/chat/messages.js.map +1 -0
  17. package/dist/esm/activities/chat/middleware/builder.d.ts +46 -0
  18. package/dist/esm/activities/chat/middleware/builder.js +17 -0
  19. package/dist/esm/activities/chat/middleware/builder.js.map +1 -0
  20. package/dist/esm/activities/chat/middleware/capabilities.d.ts +93 -0
  21. package/dist/esm/activities/chat/middleware/capabilities.js +45 -0
  22. package/dist/esm/activities/chat/middleware/capabilities.js.map +1 -0
  23. package/dist/esm/activities/chat/middleware/compose.d.ts +87 -0
  24. package/dist/esm/activities/chat/middleware/compose.js +510 -0
  25. package/dist/esm/activities/chat/middleware/compose.js.map +1 -0
  26. package/dist/esm/activities/chat/middleware/define.d.ts +20 -0
  27. package/dist/esm/activities/chat/middleware/define.js +7 -0
  28. package/dist/esm/activities/chat/middleware/define.js.map +1 -0
  29. package/dist/esm/activities/chat/middleware/index.d.ts +10 -0
  30. package/dist/esm/activities/chat/middleware/tool-cache-middleware.d.ts +89 -0
  31. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js +76 -0
  32. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js.map +1 -0
  33. package/dist/esm/activities/chat/middleware/types.d.ts +405 -0
  34. package/dist/esm/activities/chat/middleware/validate.d.ts +19 -0
  35. package/dist/esm/activities/chat/middleware/validate.js +30 -0
  36. package/dist/esm/activities/chat/middleware/validate.js.map +1 -0
  37. package/dist/esm/activities/chat/runtime-context-types.d.ts +43 -0
  38. package/dist/esm/activities/chat/stream/index.d.ts +11 -0
  39. package/dist/esm/activities/chat/stream/json-parser.d.ts +38 -0
  40. package/dist/esm/activities/chat/stream/json-parser.js +28 -0
  41. package/dist/esm/activities/chat/stream/json-parser.js.map +1 -0
  42. package/dist/esm/activities/chat/stream/message-updaters.d.ts +81 -0
  43. package/dist/esm/activities/chat/stream/message-updaters.js +253 -0
  44. package/dist/esm/activities/chat/stream/message-updaters.js.map +1 -0
  45. package/dist/esm/activities/chat/stream/processor.d.ts +439 -0
  46. package/dist/esm/activities/chat/stream/processor.js +1449 -0
  47. package/dist/esm/activities/chat/stream/processor.js.map +1 -0
  48. package/dist/esm/activities/chat/stream/strategies.d.ts +43 -0
  49. package/dist/esm/activities/chat/stream/strategies.js +54 -0
  50. package/dist/esm/activities/chat/stream/strategies.js.map +1 -0
  51. package/dist/esm/activities/chat/stream/types.d.ts +90 -0
  52. package/dist/esm/activities/chat/tools/lazy-tool-manager.d.ts +82 -0
  53. package/dist/esm/activities/chat/tools/lazy-tool-manager.js +194 -0
  54. package/dist/esm/activities/chat/tools/lazy-tool-manager.js.map +1 -0
  55. package/dist/esm/activities/chat/tools/lazy-tools.d.ts +15 -0
  56. package/dist/esm/activities/chat/tools/lazy-tools.js +16 -0
  57. package/dist/esm/activities/chat/tools/lazy-tools.js.map +1 -0
  58. package/dist/esm/activities/chat/tools/schema-converter.d.ts +140 -0
  59. package/dist/esm/activities/chat/tools/schema-converter.js +167 -0
  60. package/dist/esm/activities/chat/tools/schema-converter.js.map +1 -0
  61. package/dist/esm/activities/chat/tools/tool-calls.d.ts +145 -0
  62. package/dist/esm/activities/chat/tools/tool-calls.js +548 -0
  63. package/dist/esm/activities/chat/tools/tool-calls.js.map +1 -0
  64. package/dist/esm/activities/chat/tools/tool-definition.d.ts +135 -0
  65. package/dist/esm/activities/chat/tools/tool-definition.js +25 -0
  66. package/dist/esm/activities/chat/tools/tool-definition.js.map +1 -0
  67. package/dist/esm/activities/error-payload.d.ts +30 -0
  68. package/dist/esm/activities/error-payload.js +54 -0
  69. package/dist/esm/activities/error-payload.js.map +1 -0
  70. package/dist/esm/activities/generateAudio/adapter.d.ts +62 -0
  71. package/dist/esm/activities/generateAudio/adapter.js +16 -0
  72. package/dist/esm/activities/generateAudio/adapter.js.map +1 -0
  73. package/dist/esm/activities/generateAudio/index.d.ts +85 -0
  74. package/dist/esm/activities/generateAudio/index.js +114 -0
  75. package/dist/esm/activities/generateAudio/index.js.map +1 -0
  76. package/dist/esm/activities/generateImage/adapter.d.ts +78 -0
  77. package/dist/esm/activities/generateImage/adapter.js +16 -0
  78. package/dist/esm/activities/generateImage/adapter.js.map +1 -0
  79. package/dist/esm/activities/generateImage/index.d.ts +134 -0
  80. package/dist/esm/activities/generateImage/index.js +121 -0
  81. package/dist/esm/activities/generateImage/index.js.map +1 -0
  82. package/dist/esm/activities/generateSpeech/adapter.d.ts +62 -0
  83. package/dist/esm/activities/generateSpeech/adapter.js +16 -0
  84. package/dist/esm/activities/generateSpeech/adapter.js.map +1 -0
  85. package/dist/esm/activities/generateSpeech/index.d.ts +96 -0
  86. package/dist/esm/activities/generateSpeech/index.js +119 -0
  87. package/dist/esm/activities/generateSpeech/index.js.map +1 -0
  88. package/dist/esm/activities/generateTranscription/adapter.d.ts +62 -0
  89. package/dist/esm/activities/generateTranscription/adapter.js +16 -0
  90. package/dist/esm/activities/generateTranscription/adapter.js.map +1 -0
  91. package/dist/esm/activities/generateTranscription/index.d.ts +109 -0
  92. package/dist/esm/activities/generateTranscription/index.js +109 -0
  93. package/dist/esm/activities/generateTranscription/index.js.map +1 -0
  94. package/dist/esm/activities/generateVideo/adapter.d.ts +145 -0
  95. package/dist/esm/activities/generateVideo/adapter.js +30 -0
  96. package/dist/esm/activities/generateVideo/adapter.js.map +1 -0
  97. package/dist/esm/activities/generateVideo/index.d.ts +223 -0
  98. package/dist/esm/activities/generateVideo/index.js +295 -0
  99. package/dist/esm/activities/generateVideo/index.js.map +1 -0
  100. package/dist/esm/activities/generateVideo/snap.d.ts +14 -0
  101. package/dist/esm/activities/generateVideo/snap.js +54 -0
  102. package/dist/esm/activities/generateVideo/snap.js.map +1 -0
  103. package/dist/esm/activities/index.d.ts +27 -0
  104. package/dist/esm/activities/index.js +43 -0
  105. package/dist/esm/activities/index.js.map +1 -0
  106. package/dist/esm/activities/middleware/index.d.ts +2 -0
  107. package/dist/esm/activities/middleware/run.d.ts +20 -0
  108. package/dist/esm/activities/middleware/run.js +42 -0
  109. package/dist/esm/activities/middleware/run.js.map +1 -0
  110. package/dist/esm/activities/middleware/types.d.ts +118 -0
  111. package/dist/esm/activities/stream-generation-result.d.ts +15 -0
  112. package/dist/esm/activities/stream-generation-result.js +49 -0
  113. package/dist/esm/activities/stream-generation-result.js.map +1 -0
  114. package/dist/esm/activities/summarize/adapter.d.ts +74 -0
  115. package/dist/esm/activities/summarize/adapter.js +16 -0
  116. package/dist/esm/activities/summarize/adapter.js.map +1 -0
  117. package/dist/esm/activities/summarize/chat-stream-summarize.d.ts +45 -0
  118. package/dist/esm/activities/summarize/chat-stream-summarize.js +212 -0
  119. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +1 -0
  120. package/dist/esm/activities/summarize/index.d.ts +108 -0
  121. package/dist/esm/activities/summarize/index.js +113 -0
  122. package/dist/esm/activities/summarize/index.js.map +1 -0
  123. package/dist/esm/adapter-internals.d.ts +5 -0
  124. package/dist/esm/adapter-internals.js +10 -0
  125. package/dist/esm/adapter-internals.js.map +1 -0
  126. package/dist/esm/client.d.ts +44 -0
  127. package/dist/esm/client.js +67 -0
  128. package/dist/esm/client.js.map +1 -0
  129. package/dist/esm/extend-adapter.d.ts +152 -0
  130. package/dist/esm/extend-adapter.js +21 -0
  131. package/dist/esm/extend-adapter.js.map +1 -0
  132. package/dist/esm/index.d.ts +45 -0
  133. package/dist/esm/index.js +109 -0
  134. package/dist/esm/index.js.map +1 -0
  135. package/dist/esm/logger/console-logger.d.ts +29 -0
  136. package/dist/esm/logger/console-logger.js +83 -0
  137. package/dist/esm/logger/console-logger.js.map +1 -0
  138. package/dist/esm/logger/internal-logger.d.ts +41 -0
  139. package/dist/esm/logger/internal-logger.js +86 -0
  140. package/dist/esm/logger/internal-logger.js.map +1 -0
  141. package/dist/esm/logger/resolve.d.ts +14 -0
  142. package/dist/esm/logger/resolve.js +54 -0
  143. package/dist/esm/logger/resolve.js.map +1 -0
  144. package/dist/esm/logger/types.d.ts +75 -0
  145. package/dist/esm/middlewares/content-guard.d.ts +77 -0
  146. package/dist/esm/middlewares/content-guard.js +156 -0
  147. package/dist/esm/middlewares/content-guard.js.map +1 -0
  148. package/dist/esm/middlewares/index.d.ts +2 -0
  149. package/dist/esm/middlewares/index.js +7 -0
  150. package/dist/esm/middlewares/index.js.map +1 -0
  151. package/dist/esm/middlewares/otel.d.ts +81 -0
  152. package/dist/esm/middlewares/otel.js +745 -0
  153. package/dist/esm/middlewares/otel.js.map +1 -0
  154. package/dist/esm/middlewares/tool-cache.d.ts +1 -0
  155. package/dist/esm/middlewares/usage-attributes.d.ts +24 -0
  156. package/dist/esm/middlewares/usage-attributes.js +43 -0
  157. package/dist/esm/middlewares/usage-attributes.js.map +1 -0
  158. package/dist/esm/realtime/index.d.ts +28 -0
  159. package/dist/esm/realtime/index.js +8 -0
  160. package/dist/esm/realtime/index.js.map +1 -0
  161. package/dist/esm/realtime/types.d.ts +282 -0
  162. package/dist/esm/stream-to-response.d.ts +102 -0
  163. package/dist/esm/stream-to-response.js +121 -0
  164. package/dist/esm/stream-to-response.js.map +1 -0
  165. package/dist/esm/strip-to-spec-middleware.d.ts +18 -0
  166. package/dist/esm/strip-to-spec-middleware.js +20 -0
  167. package/dist/esm/strip-to-spec-middleware.js.map +1 -0
  168. package/dist/esm/system-prompts.d.ts +66 -0
  169. package/dist/esm/system-prompts.js +23 -0
  170. package/dist/esm/system-prompts.js.map +1 -0
  171. package/dist/esm/tool-registry.d.ts +81 -0
  172. package/dist/esm/tool-registry.js +49 -0
  173. package/dist/esm/tool-registry.js.map +1 -0
  174. package/dist/esm/tools/provider-tool.d.ts +30 -0
  175. package/dist/esm/tools/provider-tool.js +7 -0
  176. package/dist/esm/tools/provider-tool.js.map +1 -0
  177. package/dist/esm/types.d.ts +1627 -0
  178. package/dist/esm/utilities/ag-ui-wire.d.ts +44 -0
  179. package/dist/esm/utilities/ag-ui-wire.js +107 -0
  180. package/dist/esm/utilities/ag-ui-wire.js.map +1 -0
  181. package/dist/esm/utilities/chat-params.d.ts +85 -0
  182. package/dist/esm/utilities/chat-params.js +100 -0
  183. package/dist/esm/utilities/chat-params.js.map +1 -0
  184. package/dist/esm/utilities/errors.d.ts +13 -0
  185. package/dist/esm/utilities/errors.js +22 -0
  186. package/dist/esm/utilities/errors.js.map +1 -0
  187. package/dist/esm/utilities/media-prompt.d.ts +35 -0
  188. package/dist/esm/utilities/media-prompt.js +43 -0
  189. package/dist/esm/utilities/media-prompt.js.map +1 -0
  190. package/dist/esm/utilities/numbers.d.ts +8 -0
  191. package/dist/esm/utilities/numbers.js +12 -0
  192. package/dist/esm/utilities/numbers.js.map +1 -0
  193. package/dist/esm/utilities/sampling-keys.d.ts +20 -0
  194. package/dist/esm/utilities/sampling-keys.js +20 -0
  195. package/dist/esm/utilities/sampling-keys.js.map +1 -0
  196. package/dist/esm/utilities/tool-result.d.ts +21 -0
  197. package/dist/esm/utilities/tool-result.js +37 -0
  198. package/dist/esm/utilities/tool-result.js.map +1 -0
  199. package/dist/esm/utilities/usage.d.ts +31 -0
  200. package/dist/esm/utilities/usage.js +11 -0
  201. package/dist/esm/utilities/usage.js.map +1 -0
  202. package/dist/esm/utils.d.ts +17 -0
  203. package/dist/esm/utils.js +20 -0
  204. package/dist/esm/utils.js.map +1 -0
  205. package/package.json +3 -3
  206. package/skills/ai-core/chat-experience/SKILL.md +30 -2
  207. package/skills/ai-core/media-generation/SKILL.md +13 -0
  208. package/skills/ai-core/tool-calling/SKILL.md +10 -3
  209. package/src/activities/chat/mcp/manager.ts +31 -1
  210. package/src/activities/chat/mcp/types.ts +23 -0
  211. package/src/activities/chat/messages.ts +5 -0
  212. package/src/activities/chat/stream/processor.ts +42 -0
  213. package/src/activities/chat/tools/tool-calls.ts +96 -2
  214. package/src/client.ts +1 -0
  215. package/src/types.ts +31 -0
@@ -0,0 +1,93 @@
1
+ /** Options accepted by a capability getter. */
2
+ export interface CapabilityGetOptions {
3
+ /** When true, return undefined instead of throwing if the capability is absent. */
4
+ optional?: boolean;
5
+ }
6
+ /**
7
+ * The minimal context shape a capability accessor needs. The full
8
+ * `ChatMiddlewareContext` satisfies this (it has `capabilities`), so accessors
9
+ * accept any middleware context without referencing `any`.
10
+ */
11
+ export interface CapabilityContext {
12
+ capabilities: CapabilityRegistry;
13
+ }
14
+ /** Reads a capability value off a context. Overloaded so the flag narrows the return. */
15
+ export interface CapabilityGetter<TValue> {
16
+ (ctx: CapabilityContext): TValue;
17
+ (ctx: CapabilityContext, opts: {
18
+ optional: true;
19
+ }): TValue | undefined;
20
+ }
21
+ /** Writes a capability value onto a context. */
22
+ export type CapabilityProvider<TValue> = (ctx: CapabilityContext, value: TValue) => void;
23
+ /**
24
+ * A capability handle. It is BOTH a `[get, provide]` tuple (array-destructurable)
25
+ * AND the identity used in middleware `requires`/`provides` declarations.
26
+ *
27
+ * Runtime identity is this object's reference. The `capabilityName` literal is
28
+ * used for diagnostics and COMPILE-TIME tracking only — capability names MUST be
29
+ * unique across an app or the type-level coverage check conflates them.
30
+ */
31
+ export type Capability<TValue = unknown, TName extends string = string> = readonly [
32
+ get: CapabilityGetter<TValue>,
33
+ provide: CapabilityProvider<TValue>
34
+ ] & {
35
+ readonly capabilityName: TName;
36
+ /** @internal Presence check for the post-setup assertion. */
37
+ has: (ctx: CapabilityContext) => boolean;
38
+ };
39
+ /**
40
+ * A capability handle with permissive value/name — for use as a constraint in
41
+ * `requires`/`provides` arrays. Concentrates `any` in one named alias (same
42
+ * convention as `AnyTextAdapter`/`AnyTool`); needed so `Capability<SpecificT>`
43
+ * is assignable to the handle-array element type.
44
+ */
45
+ export type CapabilityHandle = Capability<any, string>;
46
+ /**
47
+ * Per-request bookkeeping: which capabilities were provided, plus the
48
+ * duplicate-provide notification. Capability VALUES live in per-capability
49
+ * WeakMaps (see `createCapability`), not here — this only tracks presence.
50
+ */
51
+ export declare class CapabilityRegistry {
52
+ private readonly provided;
53
+ private onDuplicate?;
54
+ /** Register a callback fired when a handle is provided more than once. */
55
+ setOnDuplicate(cb: (name: string) => void): void;
56
+ /** Record that `handle` was provided; fire the duplicate callback on repeats. */
57
+ markProvided(handle: CapabilityHandle): void;
58
+ has(handle: CapabilityHandle): boolean;
59
+ }
60
+ /**
61
+ * Create a capability. Returns a hybrid handle that destructures to
62
+ * `[get, provide]` and is itself the identity for `requires`/`provides`.
63
+ *
64
+ * Curried so the value type is supplied explicitly while the name literal is
65
+ * INFERRED from the argument: `createCapability<T>()('name')`. (A single call
66
+ * `createCapability<T>('name')` cannot work — supplying `T` explicitly stops
67
+ * TypeScript inferring the name, collapsing it to `string` and defeating the
68
+ * compile-time coverage check that keys on the literal name.)
69
+ *
70
+ * @example Provider + consumer middleware
71
+ * ```ts
72
+ * const counterCapability = createCapability<{ value: number }>()('counter')
73
+ * const [getCounter, provideCounter] = counterCapability
74
+ *
75
+ * const withCounter = defineChatMiddleware({
76
+ * name: 'counter',
77
+ * provides: [counterCapability],
78
+ * setup(ctx) { provideCounter(ctx, { value: 0 }) },
79
+ * })
80
+ *
81
+ * const readsCounter = defineChatMiddleware({
82
+ * name: 'reads-counter',
83
+ * requires: [counterCapability],
84
+ * onChunk(ctx) { getCounter(ctx).value++ },
85
+ * })
86
+ *
87
+ * chat({ adapter, messages, middleware: [withCounter, readsCounter] })
88
+ * ```
89
+ *
90
+ * @remarks Capability `name`s must be unique across your app: compile-time
91
+ * coverage tracking keys on the name literal (runtime keys on reference).
92
+ */
93
+ export declare function createCapability<TValue = unknown>(): <const TName extends string>(name: TName) => Capability<TValue, TName>;
@@ -0,0 +1,45 @@
1
+ class CapabilityRegistry {
2
+ provided = /* @__PURE__ */ new Set();
3
+ onDuplicate;
4
+ /** Register a callback fired when a handle is provided more than once. */
5
+ setOnDuplicate(cb) {
6
+ this.onDuplicate = cb;
7
+ }
8
+ /** Record that `handle` was provided; fire the duplicate callback on repeats. */
9
+ markProvided(handle) {
10
+ if (this.provided.has(handle)) this.onDuplicate?.(handle.capabilityName);
11
+ this.provided.add(handle);
12
+ }
13
+ has(handle) {
14
+ return this.provided.has(handle);
15
+ }
16
+ }
17
+ function createCapability() {
18
+ return (name) => {
19
+ const values = /* @__PURE__ */ new WeakMap();
20
+ function get(ctx, opts) {
21
+ if (!values.has(ctx)) {
22
+ if (opts?.optional) return void 0;
23
+ throw new Error(
24
+ `Capability "${name}" was requested but never provided. Ensure a middleware provides it in setup(), ordered before this consumer.`
25
+ );
26
+ }
27
+ return values.get(ctx);
28
+ }
29
+ const provide = (ctx, value) => {
30
+ values.set(ctx, value);
31
+ ctx.capabilities.markProvided(handle);
32
+ };
33
+ const pair = [get, provide];
34
+ const handle = Object.assign(pair, {
35
+ capabilityName: name,
36
+ has: (ctx) => values.has(ctx)
37
+ });
38
+ return handle;
39
+ };
40
+ }
41
+ export {
42
+ CapabilityRegistry,
43
+ createCapability
44
+ };
45
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sources":["../../../../../src/activities/chat/middleware/capabilities.ts"],"sourcesContent":["/** Options accepted by a capability getter. */\nexport interface CapabilityGetOptions {\n /** When true, return undefined instead of throwing if the capability is absent. */\n optional?: boolean\n}\n\n/**\n * The minimal context shape a capability accessor needs. The full\n * `ChatMiddlewareContext` satisfies this (it has `capabilities`), so accessors\n * accept any middleware context without referencing `any`.\n */\nexport interface CapabilityContext {\n capabilities: CapabilityRegistry\n}\n\n/** Reads a capability value off a context. Overloaded so the flag narrows the return. */\nexport interface CapabilityGetter<TValue> {\n (ctx: CapabilityContext): TValue\n (ctx: CapabilityContext, opts: { optional: true }): TValue | undefined\n}\n\n/** Writes a capability value onto a context. */\nexport type CapabilityProvider<TValue> = (\n ctx: CapabilityContext,\n value: TValue,\n) => void\n\n/**\n * A capability handle. It is BOTH a `[get, provide]` tuple (array-destructurable)\n * AND the identity used in middleware `requires`/`provides` declarations.\n *\n * Runtime identity is this object's reference. The `capabilityName` literal is\n * used for diagnostics and COMPILE-TIME tracking only — capability names MUST be\n * unique across an app or the type-level coverage check conflates them.\n */\nexport type Capability<\n TValue = unknown,\n TName extends string = string,\n> = readonly [\n get: CapabilityGetter<TValue>,\n provide: CapabilityProvider<TValue>,\n] & {\n readonly capabilityName: TName\n /** @internal Presence check for the post-setup assertion. */\n has: (ctx: CapabilityContext) => boolean\n}\n\n/**\n * A capability handle with permissive value/name — for use as a constraint in\n * `requires`/`provides` arrays. Concentrates `any` in one named alias (same\n * convention as `AnyTextAdapter`/`AnyTool`); needed so `Capability<SpecificT>`\n * is assignable to the handle-array element type.\n */\nexport type CapabilityHandle = Capability<any, string>\n\n/**\n * Per-request bookkeeping: which capabilities were provided, plus the\n * duplicate-provide notification. Capability VALUES live in per-capability\n * WeakMaps (see `createCapability`), not here — this only tracks presence.\n */\nexport class CapabilityRegistry {\n private readonly provided = new Set<CapabilityHandle>()\n private onDuplicate?: (name: string) => void\n\n /** Register a callback fired when a handle is provided more than once. */\n setOnDuplicate(cb: (name: string) => void): void {\n this.onDuplicate = cb\n }\n\n /** Record that `handle` was provided; fire the duplicate callback on repeats. */\n markProvided(handle: CapabilityHandle): void {\n if (this.provided.has(handle)) this.onDuplicate?.(handle.capabilityName)\n this.provided.add(handle)\n }\n\n has(handle: CapabilityHandle): boolean {\n return this.provided.has(handle)\n }\n}\n\n/**\n * Create a capability. Returns a hybrid handle that destructures to\n * `[get, provide]` and is itself the identity for `requires`/`provides`.\n *\n * Curried so the value type is supplied explicitly while the name literal is\n * INFERRED from the argument: `createCapability<T>()('name')`. (A single call\n * `createCapability<T>('name')` cannot work — supplying `T` explicitly stops\n * TypeScript inferring the name, collapsing it to `string` and defeating the\n * compile-time coverage check that keys on the literal name.)\n *\n * @example Provider + consumer middleware\n * ```ts\n * const counterCapability = createCapability<{ value: number }>()('counter')\n * const [getCounter, provideCounter] = counterCapability\n *\n * const withCounter = defineChatMiddleware({\n * name: 'counter',\n * provides: [counterCapability],\n * setup(ctx) { provideCounter(ctx, { value: 0 }) },\n * })\n *\n * const readsCounter = defineChatMiddleware({\n * name: 'reads-counter',\n * requires: [counterCapability],\n * onChunk(ctx) { getCounter(ctx).value++ },\n * })\n *\n * chat({ adapter, messages, middleware: [withCounter, readsCounter] })\n * ```\n *\n * @remarks Capability `name`s must be unique across your app: compile-time\n * coverage tracking keys on the name literal (runtime keys on reference).\n */\nexport function createCapability<TValue = unknown>(): <\n const TName extends string,\n>(\n name: TName,\n) => Capability<TValue, TName> {\n return <const TName extends string>(\n name: TName,\n ): Capability<TValue, TName> => {\n // Each capability owns a typed WeakMap keyed by the context object. Because\n // the value type is TValue, reads are typed with no assertion.\n const values = new WeakMap<CapabilityContext, TValue>()\n\n function get(ctx: CapabilityContext): TValue\n function get(\n ctx: CapabilityContext,\n opts: { optional: true },\n ): TValue | undefined\n function get(\n ctx: CapabilityContext,\n opts?: CapabilityGetOptions,\n ): TValue | undefined {\n if (!values.has(ctx)) {\n if (opts?.optional) return undefined\n throw new Error(\n `Capability \"${name}\" was requested but never provided. Ensure a ` +\n `middleware provides it in setup(), ordered before this consumer.`,\n )\n }\n return values.get(ctx)\n }\n\n const provide: CapabilityProvider<TValue> = (ctx, value) => {\n values.set(ctx, value)\n ctx.capabilities.markProvided(handle)\n }\n\n const pair: readonly [\n CapabilityGetter<TValue>,\n CapabilityProvider<TValue>,\n ] = [get, provide]\n // Object.assign's return type is the intersection of the tuple and the\n // props, which IS Capability<TValue, TName> — no cast needed.\n const handle = Object.assign(pair, {\n capabilityName: name,\n has: (ctx: CapabilityContext) => values.has(ctx),\n })\n return handle\n }\n}\n"],"names":[],"mappings":"AA4DO,MAAM,mBAAmB;AAAA,EACb,+BAAe,IAAA;AAAA,EACxB;AAAA;AAAA,EAGR,eAAe,IAAkC;AAC/C,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA,EAGA,aAAa,QAAgC;AAC3C,QAAI,KAAK,SAAS,IAAI,MAAM,EAAG,MAAK,cAAc,OAAO,cAAc;AACvE,SAAK,SAAS,IAAI,MAAM;AAAA,EAC1B;AAAA,EAEA,IAAI,QAAmC;AACrC,WAAO,KAAK,SAAS,IAAI,MAAM;AAAA,EACjC;AACF;AAmCO,SAAS,mBAIe;AAC7B,SAAO,CACL,SAC8B;AAG9B,UAAM,6BAAa,QAAA;AAOnB,aAAS,IACP,KACA,MACoB;AACpB,UAAI,CAAC,OAAO,IAAI,GAAG,GAAG;AACpB,YAAI,MAAM,SAAU,QAAO;AAC3B,cAAM,IAAI;AAAA,UACR,eAAe,IAAI;AAAA,QAAA;AAAA,MAGvB;AACA,aAAO,OAAO,IAAI,GAAG;AAAA,IACvB;AAEA,UAAM,UAAsC,CAAC,KAAK,UAAU;AAC1D,aAAO,IAAI,KAAK,KAAK;AACrB,UAAI,aAAa,aAAa,MAAM;AAAA,IACtC;AAEA,UAAM,OAGF,CAAC,KAAK,OAAO;AAGjB,UAAM,SAAS,OAAO,OAAO,MAAM;AAAA,MACjC,gBAAgB;AAAA,MAChB,KAAK,CAAC,QAA2B,OAAO,IAAI,GAAG;AAAA,IAAA,CAChD;AACD,WAAO;AAAA,EACT;AACF;"}
@@ -0,0 +1,87 @@
1
+ import { StreamChunk } from '../../../types.js';
2
+ import { InternalLogger } from '../../../logger/internal-logger.js';
3
+ import { AbortInfo, AfterToolCallInfo, BeforeToolCallDecision, ChatMiddleware, ChatMiddlewareConfig, ChatMiddlewareContext, ErrorInfo, FinishInfo, IterationInfo, StructuredOutputMiddlewareConfig, ToolCallHookContext, ToolPhaseCompleteInfo, UsageInfo } from './types.js';
4
+ /**
5
+ * Internal middleware runner that manages composed execution of middleware hooks.
6
+ * Created once per chat() invocation.
7
+ */
8
+ export declare class MiddlewareRunner<TContext = unknown> {
9
+ private readonly middlewares;
10
+ private readonly logger;
11
+ constructor(middlewares: ReadonlyArray<ChatMiddleware<TContext>>, logger: InternalLogger);
12
+ get hasMiddleware(): boolean;
13
+ /**
14
+ * Pipe config through all middleware onConfig hooks in order.
15
+ * Each middleware receives the merged config from previous middleware.
16
+ * Partial returns are shallow-merged with the current config.
17
+ */
18
+ runOnConfig(ctx: ChatMiddlewareContext<TContext>, config: ChatMiddlewareConfig): Promise<ChatMiddlewareConfig>;
19
+ /**
20
+ * Pipe config through all middleware onStructuredOutputConfig hooks in order.
21
+ * Each middleware receives the merged config from previous middleware.
22
+ * Partial returns are shallow-merged with the current config.
23
+ *
24
+ * Called once at the structured-output boundary, before runOnConfig at the
25
+ * same boundary (which receives a ChatMiddlewareConfig view, no outputSchema).
26
+ */
27
+ runOnStructuredOutputConfig(ctx: ChatMiddlewareContext<TContext>, config: StructuredOutputMiddlewareConfig): Promise<StructuredOutputMiddlewareConfig>;
28
+ /**
29
+ * Run all `setup` hooks in array order, then assert every declared `provides`
30
+ * capability was actually provided. Wires the last-wins duplicate-provide
31
+ * warning into the registry. Runs before init `onConfig`.
32
+ *
33
+ * Takes the full `ChatMiddlewareContext` — the same stable context the engine
34
+ * threads through every other hook — because it both forwards `ctx` to each
35
+ * `setup` hook and emits instrumentation events from it.
36
+ */
37
+ runSetup(ctx: ChatMiddlewareContext<TContext>): Promise<void>;
38
+ /**
39
+ * Call onStart on all middleware in order.
40
+ */
41
+ runOnStart(ctx: ChatMiddlewareContext<TContext>): Promise<void>;
42
+ /**
43
+ * Pipe a single chunk through all middleware onChunk hooks in order.
44
+ * Returns the resulting chunks (0..N) to yield to the consumer.
45
+ *
46
+ * - void: pass through unchanged
47
+ * - chunk: replace with this chunk
48
+ * - chunk[]: expand to multiple chunks
49
+ * - null: drop the chunk entirely
50
+ */
51
+ runOnChunk(ctx: ChatMiddlewareContext<TContext>, chunk: StreamChunk): Promise<Array<StreamChunk>>;
52
+ /**
53
+ * Run onBeforeToolCall through middleware in order.
54
+ * Returns the first non-void decision, or undefined to continue normally.
55
+ */
56
+ runOnBeforeToolCall(ctx: ChatMiddlewareContext<TContext>, hookCtx: ToolCallHookContext): Promise<BeforeToolCallDecision>;
57
+ /**
58
+ * Run onAfterToolCall on all middleware in order.
59
+ */
60
+ runOnAfterToolCall(ctx: ChatMiddlewareContext<TContext>, info: AfterToolCallInfo): Promise<void>;
61
+ /**
62
+ * Run onUsage on all middleware in order.
63
+ */
64
+ runOnUsage(ctx: ChatMiddlewareContext<TContext>, usage: UsageInfo): Promise<void>;
65
+ /**
66
+ * Run onFinish on all middleware in order.
67
+ */
68
+ runOnFinish(ctx: ChatMiddlewareContext<TContext>, info: FinishInfo): Promise<void>;
69
+ /**
70
+ * Run onAbort on all middleware in order.
71
+ */
72
+ runOnAbort(ctx: ChatMiddlewareContext<TContext>, info: AbortInfo): Promise<void>;
73
+ /**
74
+ * Run onError on all middleware in order.
75
+ */
76
+ runOnError(ctx: ChatMiddlewareContext<TContext>, info: ErrorInfo): Promise<void>;
77
+ /**
78
+ * Run onIteration on all middleware in order.
79
+ * Called at the start of each agent loop iteration.
80
+ */
81
+ runOnIteration(ctx: ChatMiddlewareContext<TContext>, info: IterationInfo): Promise<void>;
82
+ /**
83
+ * Run onToolPhaseComplete on all middleware in order.
84
+ * Called after all tool calls in an iteration have been processed.
85
+ */
86
+ runOnToolPhaseComplete(ctx: ChatMiddlewareContext<TContext>, info: ToolPhaseCompleteInfo): Promise<void>;
87
+ }