@tanstack/ai 0.35.0 → 0.36.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 (208) hide show
  1. package/package.json +2 -2
  2. package/skills/ai-core/tool-calling/SKILL.md +26 -1
  3. package/src/activities/chat/index.ts +8 -0
  4. package/src/activities/chat/tools/lazy-tool-manager.ts +12 -4
  5. package/src/activities/chat/tools/lazy-tools.ts +33 -0
  6. package/src/index.ts +5 -0
  7. package/src/types.ts +23 -1
  8. package/dist/esm/activities/chat/adapter.d.ts +0 -163
  9. package/dist/esm/activities/chat/adapter.js +0 -17
  10. package/dist/esm/activities/chat/adapter.js.map +0 -1
  11. package/dist/esm/activities/chat/agent-loop-strategies.d.ts +0 -59
  12. package/dist/esm/activities/chat/agent-loop-strategies.js +0 -23
  13. package/dist/esm/activities/chat/agent-loop-strategies.js.map +0 -1
  14. package/dist/esm/activities/chat/index.d.ts +0 -264
  15. package/dist/esm/activities/chat/index.js +0 -1723
  16. package/dist/esm/activities/chat/index.js.map +0 -1
  17. package/dist/esm/activities/chat/mcp/manager.d.ts +0 -25
  18. package/dist/esm/activities/chat/mcp/manager.js +0 -71
  19. package/dist/esm/activities/chat/mcp/manager.js.map +0 -1
  20. package/dist/esm/activities/chat/mcp/types.d.ts +0 -56
  21. package/dist/esm/activities/chat/messages.d.ts +0 -78
  22. package/dist/esm/activities/chat/messages.js +0 -374
  23. package/dist/esm/activities/chat/messages.js.map +0 -1
  24. package/dist/esm/activities/chat/middleware/builder.d.ts +0 -46
  25. package/dist/esm/activities/chat/middleware/builder.js +0 -17
  26. package/dist/esm/activities/chat/middleware/builder.js.map +0 -1
  27. package/dist/esm/activities/chat/middleware/capabilities.d.ts +0 -93
  28. package/dist/esm/activities/chat/middleware/capabilities.js +0 -45
  29. package/dist/esm/activities/chat/middleware/capabilities.js.map +0 -1
  30. package/dist/esm/activities/chat/middleware/compose.d.ts +0 -87
  31. package/dist/esm/activities/chat/middleware/compose.js +0 -510
  32. package/dist/esm/activities/chat/middleware/compose.js.map +0 -1
  33. package/dist/esm/activities/chat/middleware/define.d.ts +0 -20
  34. package/dist/esm/activities/chat/middleware/define.js +0 -7
  35. package/dist/esm/activities/chat/middleware/define.js.map +0 -1
  36. package/dist/esm/activities/chat/middleware/index.d.ts +0 -10
  37. package/dist/esm/activities/chat/middleware/tool-cache-middleware.d.ts +0 -89
  38. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js +0 -76
  39. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js.map +0 -1
  40. package/dist/esm/activities/chat/middleware/types.d.ts +0 -405
  41. package/dist/esm/activities/chat/middleware/validate.d.ts +0 -19
  42. package/dist/esm/activities/chat/middleware/validate.js +0 -30
  43. package/dist/esm/activities/chat/middleware/validate.js.map +0 -1
  44. package/dist/esm/activities/chat/runtime-context-types.d.ts +0 -43
  45. package/dist/esm/activities/chat/stream/index.d.ts +0 -11
  46. package/dist/esm/activities/chat/stream/json-parser.d.ts +0 -38
  47. package/dist/esm/activities/chat/stream/json-parser.js +0 -28
  48. package/dist/esm/activities/chat/stream/json-parser.js.map +0 -1
  49. package/dist/esm/activities/chat/stream/message-updaters.d.ts +0 -81
  50. package/dist/esm/activities/chat/stream/message-updaters.js +0 -253
  51. package/dist/esm/activities/chat/stream/message-updaters.js.map +0 -1
  52. package/dist/esm/activities/chat/stream/processor.d.ts +0 -439
  53. package/dist/esm/activities/chat/stream/processor.js +0 -1426
  54. package/dist/esm/activities/chat/stream/processor.js.map +0 -1
  55. package/dist/esm/activities/chat/stream/strategies.d.ts +0 -43
  56. package/dist/esm/activities/chat/stream/strategies.js +0 -54
  57. package/dist/esm/activities/chat/stream/strategies.js.map +0 -1
  58. package/dist/esm/activities/chat/stream/types.d.ts +0 -90
  59. package/dist/esm/activities/chat/tools/lazy-tool-manager.d.ts +0 -81
  60. package/dist/esm/activities/chat/tools/lazy-tool-manager.js +0 -188
  61. package/dist/esm/activities/chat/tools/lazy-tool-manager.js.map +0 -1
  62. package/dist/esm/activities/chat/tools/schema-converter.d.ts +0 -140
  63. package/dist/esm/activities/chat/tools/schema-converter.js +0 -167
  64. package/dist/esm/activities/chat/tools/schema-converter.js.map +0 -1
  65. package/dist/esm/activities/chat/tools/tool-calls.d.ts +0 -140
  66. package/dist/esm/activities/chat/tools/tool-calls.js +0 -512
  67. package/dist/esm/activities/chat/tools/tool-calls.js.map +0 -1
  68. package/dist/esm/activities/chat/tools/tool-definition.d.ts +0 -135
  69. package/dist/esm/activities/chat/tools/tool-definition.js +0 -25
  70. package/dist/esm/activities/chat/tools/tool-definition.js.map +0 -1
  71. package/dist/esm/activities/error-payload.d.ts +0 -30
  72. package/dist/esm/activities/error-payload.js +0 -54
  73. package/dist/esm/activities/error-payload.js.map +0 -1
  74. package/dist/esm/activities/generateAudio/adapter.d.ts +0 -62
  75. package/dist/esm/activities/generateAudio/adapter.js +0 -16
  76. package/dist/esm/activities/generateAudio/adapter.js.map +0 -1
  77. package/dist/esm/activities/generateAudio/index.d.ts +0 -85
  78. package/dist/esm/activities/generateAudio/index.js +0 -114
  79. package/dist/esm/activities/generateAudio/index.js.map +0 -1
  80. package/dist/esm/activities/generateImage/adapter.d.ts +0 -78
  81. package/dist/esm/activities/generateImage/adapter.js +0 -16
  82. package/dist/esm/activities/generateImage/adapter.js.map +0 -1
  83. package/dist/esm/activities/generateImage/index.d.ts +0 -134
  84. package/dist/esm/activities/generateImage/index.js +0 -121
  85. package/dist/esm/activities/generateImage/index.js.map +0 -1
  86. package/dist/esm/activities/generateSpeech/adapter.d.ts +0 -62
  87. package/dist/esm/activities/generateSpeech/adapter.js +0 -16
  88. package/dist/esm/activities/generateSpeech/adapter.js.map +0 -1
  89. package/dist/esm/activities/generateSpeech/index.d.ts +0 -96
  90. package/dist/esm/activities/generateSpeech/index.js +0 -119
  91. package/dist/esm/activities/generateSpeech/index.js.map +0 -1
  92. package/dist/esm/activities/generateTranscription/adapter.d.ts +0 -62
  93. package/dist/esm/activities/generateTranscription/adapter.js +0 -16
  94. package/dist/esm/activities/generateTranscription/adapter.js.map +0 -1
  95. package/dist/esm/activities/generateTranscription/index.d.ts +0 -109
  96. package/dist/esm/activities/generateTranscription/index.js +0 -109
  97. package/dist/esm/activities/generateTranscription/index.js.map +0 -1
  98. package/dist/esm/activities/generateVideo/adapter.d.ts +0 -145
  99. package/dist/esm/activities/generateVideo/adapter.js +0 -30
  100. package/dist/esm/activities/generateVideo/adapter.js.map +0 -1
  101. package/dist/esm/activities/generateVideo/index.d.ts +0 -223
  102. package/dist/esm/activities/generateVideo/index.js +0 -295
  103. package/dist/esm/activities/generateVideo/index.js.map +0 -1
  104. package/dist/esm/activities/generateVideo/snap.d.ts +0 -14
  105. package/dist/esm/activities/generateVideo/snap.js +0 -54
  106. package/dist/esm/activities/generateVideo/snap.js.map +0 -1
  107. package/dist/esm/activities/index.d.ts +0 -27
  108. package/dist/esm/activities/index.js +0 -43
  109. package/dist/esm/activities/index.js.map +0 -1
  110. package/dist/esm/activities/middleware/index.d.ts +0 -2
  111. package/dist/esm/activities/middleware/run.d.ts +0 -20
  112. package/dist/esm/activities/middleware/run.js +0 -42
  113. package/dist/esm/activities/middleware/run.js.map +0 -1
  114. package/dist/esm/activities/middleware/types.d.ts +0 -118
  115. package/dist/esm/activities/stream-generation-result.d.ts +0 -15
  116. package/dist/esm/activities/stream-generation-result.js +0 -49
  117. package/dist/esm/activities/stream-generation-result.js.map +0 -1
  118. package/dist/esm/activities/summarize/adapter.d.ts +0 -74
  119. package/dist/esm/activities/summarize/adapter.js +0 -16
  120. package/dist/esm/activities/summarize/adapter.js.map +0 -1
  121. package/dist/esm/activities/summarize/chat-stream-summarize.d.ts +0 -45
  122. package/dist/esm/activities/summarize/chat-stream-summarize.js +0 -212
  123. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +0 -1
  124. package/dist/esm/activities/summarize/index.d.ts +0 -108
  125. package/dist/esm/activities/summarize/index.js +0 -113
  126. package/dist/esm/activities/summarize/index.js.map +0 -1
  127. package/dist/esm/adapter-internals.d.ts +0 -5
  128. package/dist/esm/adapter-internals.js +0 -10
  129. package/dist/esm/adapter-internals.js.map +0 -1
  130. package/dist/esm/client.d.ts +0 -44
  131. package/dist/esm/client.js +0 -67
  132. package/dist/esm/client.js.map +0 -1
  133. package/dist/esm/extend-adapter.d.ts +0 -152
  134. package/dist/esm/extend-adapter.js +0 -21
  135. package/dist/esm/extend-adapter.js.map +0 -1
  136. package/dist/esm/index.d.ts +0 -44
  137. package/dist/esm/index.js +0 -106
  138. package/dist/esm/index.js.map +0 -1
  139. package/dist/esm/logger/console-logger.d.ts +0 -29
  140. package/dist/esm/logger/console-logger.js +0 -83
  141. package/dist/esm/logger/console-logger.js.map +0 -1
  142. package/dist/esm/logger/internal-logger.d.ts +0 -41
  143. package/dist/esm/logger/internal-logger.js +0 -86
  144. package/dist/esm/logger/internal-logger.js.map +0 -1
  145. package/dist/esm/logger/resolve.d.ts +0 -14
  146. package/dist/esm/logger/resolve.js +0 -54
  147. package/dist/esm/logger/resolve.js.map +0 -1
  148. package/dist/esm/logger/types.d.ts +0 -75
  149. package/dist/esm/middlewares/content-guard.d.ts +0 -77
  150. package/dist/esm/middlewares/content-guard.js +0 -156
  151. package/dist/esm/middlewares/content-guard.js.map +0 -1
  152. package/dist/esm/middlewares/index.d.ts +0 -2
  153. package/dist/esm/middlewares/index.js +0 -7
  154. package/dist/esm/middlewares/index.js.map +0 -1
  155. package/dist/esm/middlewares/otel.d.ts +0 -81
  156. package/dist/esm/middlewares/otel.js +0 -745
  157. package/dist/esm/middlewares/otel.js.map +0 -1
  158. package/dist/esm/middlewares/tool-cache.d.ts +0 -1
  159. package/dist/esm/middlewares/usage-attributes.d.ts +0 -24
  160. package/dist/esm/middlewares/usage-attributes.js +0 -43
  161. package/dist/esm/middlewares/usage-attributes.js.map +0 -1
  162. package/dist/esm/realtime/index.d.ts +0 -28
  163. package/dist/esm/realtime/index.js +0 -8
  164. package/dist/esm/realtime/index.js.map +0 -1
  165. package/dist/esm/realtime/types.d.ts +0 -282
  166. package/dist/esm/stream-to-response.d.ts +0 -102
  167. package/dist/esm/stream-to-response.js +0 -121
  168. package/dist/esm/stream-to-response.js.map +0 -1
  169. package/dist/esm/strip-to-spec-middleware.d.ts +0 -18
  170. package/dist/esm/strip-to-spec-middleware.js +0 -20
  171. package/dist/esm/strip-to-spec-middleware.js.map +0 -1
  172. package/dist/esm/system-prompts.d.ts +0 -66
  173. package/dist/esm/system-prompts.js +0 -23
  174. package/dist/esm/system-prompts.js.map +0 -1
  175. package/dist/esm/tool-registry.d.ts +0 -81
  176. package/dist/esm/tool-registry.js +0 -49
  177. package/dist/esm/tool-registry.js.map +0 -1
  178. package/dist/esm/tools/provider-tool.d.ts +0 -30
  179. package/dist/esm/tools/provider-tool.js +0 -7
  180. package/dist/esm/tools/provider-tool.js.map +0 -1
  181. package/dist/esm/types.d.ts +0 -1573
  182. package/dist/esm/utilities/ag-ui-wire.d.ts +0 -44
  183. package/dist/esm/utilities/ag-ui-wire.js +0 -107
  184. package/dist/esm/utilities/ag-ui-wire.js.map +0 -1
  185. package/dist/esm/utilities/chat-params.d.ts +0 -85
  186. package/dist/esm/utilities/chat-params.js +0 -100
  187. package/dist/esm/utilities/chat-params.js.map +0 -1
  188. package/dist/esm/utilities/errors.d.ts +0 -13
  189. package/dist/esm/utilities/errors.js +0 -22
  190. package/dist/esm/utilities/errors.js.map +0 -1
  191. package/dist/esm/utilities/media-prompt.d.ts +0 -35
  192. package/dist/esm/utilities/media-prompt.js +0 -43
  193. package/dist/esm/utilities/media-prompt.js.map +0 -1
  194. package/dist/esm/utilities/numbers.d.ts +0 -8
  195. package/dist/esm/utilities/numbers.js +0 -12
  196. package/dist/esm/utilities/numbers.js.map +0 -1
  197. package/dist/esm/utilities/sampling-keys.d.ts +0 -20
  198. package/dist/esm/utilities/sampling-keys.js +0 -20
  199. package/dist/esm/utilities/sampling-keys.js.map +0 -1
  200. package/dist/esm/utilities/tool-result.d.ts +0 -21
  201. package/dist/esm/utilities/tool-result.js +0 -37
  202. package/dist/esm/utilities/tool-result.js.map +0 -1
  203. package/dist/esm/utilities/usage.d.ts +0 -31
  204. package/dist/esm/utilities/usage.js +0 -11
  205. package/dist/esm/utilities/usage.js.map +0 -1
  206. package/dist/esm/utils.d.ts +0 -17
  207. package/dist/esm/utils.js +0 -20
  208. package/dist/esm/utils.js.map +0 -1
@@ -1,152 +0,0 @@
1
- import { Modality } from './types.js';
2
- /**
3
- * Definition for a custom model to add to an adapter.
4
- *
5
- * @template TName - The model name as a literal string type
6
- * @template TInput - Array of supported input modalities
7
- * @template TOptions - Provider options type for this model
8
- *
9
- * @example
10
- * ```typescript
11
- * const customModels = [
12
- * createModel('my-custom-model', ['text', 'image']),
13
- * ] as const
14
- * ```
15
- */
16
- export interface ExtendedModelDef<TName extends string = string, TInput extends ReadonlyArray<Modality> = ReadonlyArray<Modality>, TOptions = unknown, TFeatures extends ReadonlyArray<string> = ReadonlyArray<string>, TTools extends ReadonlyArray<string> = ReadonlyArray<string>> {
17
- /** The model name identifier */
18
- name: TName;
19
- /** Supported input modalities for this model */
20
- input: TInput;
21
- /** Type brand for provider options - use `{} as YourOptionsType` */
22
- modelOptions: TOptions;
23
- /** Optional declared features (e.g. 'reasoning', 'structured_outputs') */
24
- features?: TFeatures;
25
- /** Optional declared provider tools (e.g. 'web_search') */
26
- tools?: TTools;
27
- }
28
- /** Capability bag accepted by the object form of `createModel`. */
29
- export interface ModelCapabilities<TInput extends ReadonlyArray<Modality> = ReadonlyArray<Modality>, TFeatures extends ReadonlyArray<string> = ReadonlyArray<string>, TTools extends ReadonlyArray<string> = ReadonlyArray<string>, TOptions = unknown> {
30
- input?: TInput;
31
- features?: TFeatures;
32
- tools?: TTools;
33
- modelOptions?: TOptions;
34
- }
35
- /**
36
- * Creates a custom model definition for use with `extendAdapter`.
37
- *
38
- * This is a helper function that provides proper type inference without
39
- * requiring manual `as const` casts on individual properties.
40
- *
41
- * @template TName - The model name (inferred from argument)
42
- * @template TInput - The input modalities array (inferred from argument)
43
- *
44
- * @param name - The model name identifier (literal string)
45
- * @param input - Array of supported input modalities
46
- * @returns A properly typed model definition for use with `extendAdapter`
47
- *
48
- * @example
49
- * ```typescript
50
- * import { extendAdapter, createModel } from '@tanstack/ai'
51
- * import { openaiText } from '@tanstack/ai-openai'
52
- *
53
- * // Define custom models with full type inference
54
- * const customModels = [
55
- * createModel('my-fine-tuned-gpt4', ['text', 'image']),
56
- * createModel('local-llama', ['text']),
57
- * ] as const
58
- *
59
- * const myOpenai = extendAdapter(openaiText, customModels)
60
- * ```
61
- *
62
- * @example
63
- * ```typescript
64
- * // Capabilities object form - declare features and provider tools
65
- * const reasoner = createModel('reasoner', {
66
- * input: ['text'],
67
- * features: ['reasoning', 'structured_outputs'],
68
- * tools: ['web_search'],
69
- * })
70
- * ```
71
- */
72
- export declare function createModel<const TName extends string, const TInput extends ReadonlyArray<Modality>>(name: TName, input: TInput): ExtendedModelDef<TName, TInput>;
73
- export declare function createModel<const TName extends string, const TCaps extends ModelCapabilities>(name: TName, capabilities: TCaps): ExtendedModelDef<TName, TCaps['input'] extends ReadonlyArray<Modality> ? TCaps['input'] : ReadonlyArray<Modality>, TCaps['modelOptions'], TCaps['features'] extends ReadonlyArray<string> ? TCaps['features'] : ReadonlyArray<string>, TCaps['tools'] extends ReadonlyArray<string> ? TCaps['tools'] : ReadonlyArray<string>>;
74
- /**
75
- * Extract the model name union from an array of model definitions.
76
- */
77
- type ExtractCustomModelNames<TDefs extends ReadonlyArray<ExtendedModelDef>> = TDefs[number]['name'];
78
- /**
79
- * The widest factory shape `extendAdapter` accepts: any function taking a
80
- * model as its first parameter. Parameters are contravariant, so `never`
81
- * params and an `unknown` return accept every factory without resorting
82
- * to `any`.
83
- */
84
- type AnyAdapterFactory = (model: never, ...args: Array<never>) => unknown;
85
- /**
86
- * Infer the model parameter type from an adapter factory function.
87
- * For generic functions like `<T extends Union>(model: T)`, this gets `T` which
88
- * TypeScript treats as the constraint union when used in parameter position.
89
- */
90
- type InferFactoryModels<TFactory> = TFactory extends (model: infer TModel, ...args: Array<never>) => unknown ? TModel extends string ? TModel : string : string;
91
- /**
92
- * Infer the adapter return type from a factory function.
93
- */
94
- type InferAdapterReturn<TFactory> = TFactory extends (...args: Array<never>) => infer TReturn ? TReturn : never;
95
- /**
96
- * Extracts all parameter types after the model parameter from a factory,
97
- * preserving labels and optionality (e.g. `[apiKey: string, config?: C]`).
98
- * Note: overloaded factories resolve against their last overload (a
99
- * `Parameters` limitation).
100
- */
101
- type InferRestArgs<TFactory extends AnyAdapterFactory> = Parameters<TFactory> extends [unknown?, ...infer TRest] ? TRest : [];
102
- /**
103
- * The factory signature produced by `extendAdapter`: accepts both original
104
- * and custom model names while preserving all remaining parameters and the
105
- * return type of the original factory.
106
- */
107
- type ExtendedFactory<TFactory extends AnyAdapterFactory, TDefs extends ReadonlyArray<ExtendedModelDef>> = (model: InferFactoryModels<TFactory> | ExtractCustomModelNames<TDefs>, ...args: InferRestArgs<TFactory>) => InferAdapterReturn<TFactory>;
108
- /**
109
- * Extends an existing adapter factory with additional custom models.
110
- *
111
- * The extended adapter accepts both original models (with full original type inference)
112
- * and custom models (with types from your definitions).
113
- *
114
- * At runtime, this simply passes through to the original factory - no validation is performed.
115
- * The original factory's signature is fully preserved, including any config parameters.
116
- *
117
- * @param factory - The original adapter factory function (e.g., `openaiText`, `anthropicText`)
118
- * @param models - Array of custom model definitions with `name` and `input`
119
- * @returns A new factory function that accepts both original and custom models
120
- *
121
- * @example
122
- * ```typescript
123
- * import { extendAdapter, createModel } from '@tanstack/ai'
124
- * import { openaiText } from '@tanstack/ai-openai'
125
- *
126
- * // Define custom models
127
- * const customModels = [
128
- * createModel('my-fine-tuned-gpt4', ['text', 'image']),
129
- * createModel('local-llama', ['text']),
130
- * ] as const
131
- *
132
- * // Create extended adapter
133
- * const myOpenai = extendAdapter(openaiText, customModels)
134
- *
135
- * // Use with original models - full type inference preserved
136
- * const gpt4 = myOpenai('gpt-4o')
137
- *
138
- * // Use with custom models
139
- * const custom = myOpenai('my-fine-tuned-gpt4')
140
- *
141
- * // Type error: 'invalid-model' is not a valid model
142
- * // myOpenai('invalid-model')
143
- *
144
- * // Works with chat()
145
- * chat({
146
- * adapter: myOpenai('my-fine-tuned-gpt4'),
147
- * messages: [...]
148
- * })
149
- * ```
150
- */
151
- export declare function extendAdapter<TFactory extends AnyAdapterFactory, const TDefs extends ReadonlyArray<ExtendedModelDef>>(factory: TFactory, _customModels: TDefs): ExtendedFactory<TFactory, TDefs>;
152
- export {};
@@ -1,21 +0,0 @@
1
- function createModel(name, second) {
2
- if (Array.isArray(second)) {
3
- return { name, input: second, modelOptions: {} };
4
- }
5
- const caps = second;
6
- return {
7
- name,
8
- input: caps.input ?? ["text"],
9
- modelOptions: caps.modelOptions ?? {},
10
- features: caps.features,
11
- tools: caps.tools
12
- };
13
- }
14
- function extendAdapter(factory, _customModels) {
15
- return factory;
16
- }
17
- export {
18
- createModel,
19
- extendAdapter
20
- };
21
- //# sourceMappingURL=extend-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extend-adapter.js","sources":["../../src/extend-adapter.ts"],"sourcesContent":["import type { Modality } from './types'\n\n// ===========================\n// Extended Model Definition\n// ===========================\n\n/**\n * Definition for a custom model to add to an adapter.\n *\n * @template TName - The model name as a literal string type\n * @template TInput - Array of supported input modalities\n * @template TOptions - Provider options type for this model\n *\n * @example\n * ```typescript\n * const customModels = [\n * createModel('my-custom-model', ['text', 'image']),\n * ] as const\n * ```\n */\nexport interface ExtendedModelDef<\n TName extends string = string,\n TInput extends ReadonlyArray<Modality> = ReadonlyArray<Modality>,\n TOptions = unknown,\n TFeatures extends ReadonlyArray<string> = ReadonlyArray<string>,\n TTools extends ReadonlyArray<string> = ReadonlyArray<string>,\n> {\n /** The model name identifier */\n name: TName\n /** Supported input modalities for this model */\n input: TInput\n /** Type brand for provider options - use `{} as YourOptionsType` */\n modelOptions: TOptions\n /** Optional declared features (e.g. 'reasoning', 'structured_outputs') */\n features?: TFeatures\n /** Optional declared provider tools (e.g. 'web_search') */\n tools?: TTools\n}\n\n/** Capability bag accepted by the object form of `createModel`. */\nexport interface ModelCapabilities<\n TInput extends ReadonlyArray<Modality> = ReadonlyArray<Modality>,\n TFeatures extends ReadonlyArray<string> = ReadonlyArray<string>,\n TTools extends ReadonlyArray<string> = ReadonlyArray<string>,\n TOptions = unknown,\n> {\n input?: TInput\n features?: TFeatures\n tools?: TTools\n modelOptions?: TOptions\n}\n\n/**\n * Creates a custom model definition for use with `extendAdapter`.\n *\n * This is a helper function that provides proper type inference without\n * requiring manual `as const` casts on individual properties.\n *\n * @template TName - The model name (inferred from argument)\n * @template TInput - The input modalities array (inferred from argument)\n *\n * @param name - The model name identifier (literal string)\n * @param input - Array of supported input modalities\n * @returns A properly typed model definition for use with `extendAdapter`\n *\n * @example\n * ```typescript\n * import { extendAdapter, createModel } from '@tanstack/ai'\n * import { openaiText } from '@tanstack/ai-openai'\n *\n * // Define custom models with full type inference\n * const customModels = [\n * createModel('my-fine-tuned-gpt4', ['text', 'image']),\n * createModel('local-llama', ['text']),\n * ] as const\n *\n * const myOpenai = extendAdapter(openaiText, customModels)\n * ```\n *\n * @example\n * ```typescript\n * // Capabilities object form - declare features and provider tools\n * const reasoner = createModel('reasoner', {\n * input: ['text'],\n * features: ['reasoning', 'structured_outputs'],\n * tools: ['web_search'],\n * })\n * ```\n */\n// Overload 1 — legacy positional input array (unchanged behavior)\nexport function createModel<\n const TName extends string,\n const TInput extends ReadonlyArray<Modality>,\n>(name: TName, input: TInput): ExtendedModelDef<TName, TInput>\n// Overload 2 — capabilities object\nexport function createModel<\n const TName extends string,\n const TCaps extends ModelCapabilities,\n>(\n name: TName,\n capabilities: TCaps,\n): ExtendedModelDef<\n TName,\n TCaps['input'] extends ReadonlyArray<Modality>\n ? TCaps['input']\n : ReadonlyArray<Modality>,\n TCaps['modelOptions'],\n TCaps['features'] extends ReadonlyArray<string>\n ? TCaps['features']\n : ReadonlyArray<string>,\n TCaps['tools'] extends ReadonlyArray<string>\n ? TCaps['tools']\n : ReadonlyArray<string>\n>\n// Implementation\nexport function createModel(\n name: string,\n second: ReadonlyArray<Modality> | ModelCapabilities,\n): ExtendedModelDef {\n if (Array.isArray(second)) {\n return { name, input: second, modelOptions: {} }\n }\n const caps = second as ModelCapabilities\n return {\n name,\n input: caps.input ?? (['text'] as ReadonlyArray<Modality>),\n modelOptions: caps.modelOptions ?? {},\n features: caps.features,\n tools: caps.tools,\n }\n}\n\n// ===========================\n// Type Extraction Utilities\n// ===========================\n\n/**\n * Extract the model name union from an array of model definitions.\n */\ntype ExtractCustomModelNames<TDefs extends ReadonlyArray<ExtendedModelDef>> =\n TDefs[number]['name']\n\n// ===========================\n// Factory Type Inference\n// ===========================\n\n/**\n * The widest factory shape `extendAdapter` accepts: any function taking a\n * model as its first parameter. Parameters are contravariant, so `never`\n * params and an `unknown` return accept every factory without resorting\n * to `any`.\n */\ntype AnyAdapterFactory = (model: never, ...args: Array<never>) => unknown\n\n/**\n * Infer the model parameter type from an adapter factory function.\n * For generic functions like `<T extends Union>(model: T)`, this gets `T` which\n * TypeScript treats as the constraint union when used in parameter position.\n */\ntype InferFactoryModels<TFactory> = TFactory extends (\n model: infer TModel,\n ...args: Array<never>\n) => unknown\n ? TModel extends string\n ? TModel\n : string\n : string\n\n/**\n * Infer the adapter return type from a factory function.\n */\ntype InferAdapterReturn<TFactory> = TFactory extends (\n ...args: Array<never>\n) => infer TReturn\n ? TReturn\n : never\n\n/**\n * Extracts all parameter types after the model parameter from a factory,\n * preserving labels and optionality (e.g. `[apiKey: string, config?: C]`).\n * Note: overloaded factories resolve against their last overload (a\n * `Parameters` limitation).\n */\ntype InferRestArgs<TFactory extends AnyAdapterFactory> =\n Parameters<TFactory> extends [unknown?, ...infer TRest] ? TRest : []\n\n/**\n * The factory signature produced by `extendAdapter`: accepts both original\n * and custom model names while preserving all remaining parameters and the\n * return type of the original factory.\n */\ntype ExtendedFactory<\n TFactory extends AnyAdapterFactory,\n TDefs extends ReadonlyArray<ExtendedModelDef>,\n> = (\n model: InferFactoryModels<TFactory> | ExtractCustomModelNames<TDefs>,\n ...args: InferRestArgs<TFactory>\n) => InferAdapterReturn<TFactory>\n\n// ===========================\n// extendAdapter Function\n// ===========================\n\n/**\n * Extends an existing adapter factory with additional custom models.\n *\n * The extended adapter accepts both original models (with full original type inference)\n * and custom models (with types from your definitions).\n *\n * At runtime, this simply passes through to the original factory - no validation is performed.\n * The original factory's signature is fully preserved, including any config parameters.\n *\n * @param factory - The original adapter factory function (e.g., `openaiText`, `anthropicText`)\n * @param models - Array of custom model definitions with `name` and `input`\n * @returns A new factory function that accepts both original and custom models\n *\n * @example\n * ```typescript\n * import { extendAdapter, createModel } from '@tanstack/ai'\n * import { openaiText } from '@tanstack/ai-openai'\n *\n * // Define custom models\n * const customModels = [\n * createModel('my-fine-tuned-gpt4', ['text', 'image']),\n * createModel('local-llama', ['text']),\n * ] as const\n *\n * // Create extended adapter\n * const myOpenai = extendAdapter(openaiText, customModels)\n *\n * // Use with original models - full type inference preserved\n * const gpt4 = myOpenai('gpt-4o')\n *\n * // Use with custom models\n * const custom = myOpenai('my-fine-tuned-gpt4')\n *\n * // Type error: 'invalid-model' is not a valid model\n * // myOpenai('invalid-model')\n *\n * // Works with chat()\n * chat({\n * adapter: myOpenai('my-fine-tuned-gpt4'),\n * messages: [...]\n * })\n * ```\n */\nexport function extendAdapter<\n TFactory extends AnyAdapterFactory,\n const TDefs extends ReadonlyArray<ExtendedModelDef>,\n>(factory: TFactory, _customModels: TDefs): ExtendedFactory<TFactory, TDefs>\n// The implementation signature stays at the honest `AnyAdapterFactory` width;\n// the overload above performs the deliberate model-union widening.\nexport function extendAdapter(\n factory: AnyAdapterFactory,\n _customModels: ReadonlyArray<ExtendedModelDef>,\n): AnyAdapterFactory {\n // At runtime, we simply pass through to the original factory.\n // The _customModels parameter is only used for type inference.\n // No runtime validation - users are trusted to pass valid model names.\n return factory\n}\n"],"names":[],"mappings":"AAmHO,SAAS,YACd,MACA,QACkB;AAClB,MAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,WAAO,EAAE,MAAM,OAAO,QAAQ,cAAc,CAAA,EAAC;AAAA,EAC/C;AACA,QAAM,OAAO;AACb,SAAO;AAAA,IACL;AAAA,IACA,OAAO,KAAK,SAAU,CAAC,MAAM;AAAA,IAC7B,cAAc,KAAK,gBAAgB,CAAA;AAAA,IACnC,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,EAAA;AAEhB;AA0HO,SAAS,cACd,SACA,eACmB;AAInB,SAAO;AACT;"}
@@ -1,44 +0,0 @@
1
- export { chat, summarize, generateImage, generateAudio, generateVideo, getVideoJobStatus, generateSpeech, generateTranscription, } from './activities/index.js';
2
- export { createChatOptions } from './activities/chat/index.js';
3
- export { createSummarizeOptions } from './activities/summarize/index.js';
4
- export { createImageOptions } from './activities/generateImage/index.js';
5
- export { createAudioOptions } from './activities/generateAudio/index.js';
6
- export { createVideoOptions } from './activities/generateVideo/index.js';
7
- export { createSpeechOptions } from './activities/generateSpeech/index.js';
8
- export { createTranscriptionOptions } from './activities/generateTranscription/index.js';
9
- export type { AIAdapter, ImageAdapter, AnyImageAdapter, TextAdapter, AnyTextAdapter, AnySummarizeAdapter, SummarizeAdapter, AnyAudioAdapter, AudioAdapter, AnyTTSAdapter, TTSAdapter, AnyTranscriptionAdapter, TranscriptionAdapter, AnyVideoAdapter, VideoAdapter, } from './activities/index.js';
10
- export { toolDefinition, type ToolDefinition, type ToolDefinitionInstance, type ToolDefinitionConfig, type ServerTool, type ClientTool, type AnyClientTool, type InferToolName, type InferToolInput, type InferToolOutput, } from './activities/chat/tools/tool-definition.js';
11
- export type { MCPToolSource, ChatMCPOptions, MCPConnectionPolicy, } from './activities/chat/mcp/types.js';
12
- export { MCPDuplicateToolNameError } from './activities/chat/mcp/manager.js';
13
- export { convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema, StandardSchemaValidationError, } from './activities/chat/tools/schema-converter.js';
14
- export { streamToText, toServerSentEventsStream, toServerSentEventsResponse, toHttpStream, toHttpResponse, } from './stream-to-response.js';
15
- export { ToolCallManager } from './activities/chat/tools/tool-calls.js';
16
- export { DISCOVERY_TOOL_NAME } from './activities/chat/tools/lazy-tool-manager.js';
17
- export type { ProviderTool } from './tools/provider-tool.js';
18
- export { brandProviderTool } from './tools/provider-tool.js';
19
- export { maxIterations, untilFinishReason, combineStrategies, } from './activities/chat/agent-loop-strategies.js';
20
- export { createToolRegistry, createFrozenRegistry, type ToolRegistry, } from './tool-registry.js';
21
- export type { ChatMiddleware, ChatMiddlewareContext, ChatMiddlewarePhase, ChatMiddlewareConfig, StructuredOutputMiddlewareConfig, ToolCallHookContext, BeforeToolCallDecision, AfterToolCallInfo, IterationInfo, ToolPhaseCompleteInfo, UsageInfo, FinishInfo, AbortInfo, ErrorInfo, } from './activities/chat/middleware/index.js';
22
- export type { GenerationMiddleware, GenerationMiddlewareContext, GenerationActivity, GenerationUsageInfo, GenerationFinishInfo, GenerationAbortInfo, GenerationErrorInfo, AnyGenerationMiddleware, } from './activities/middleware/index.js';
23
- export { createCapability, defineChatMiddleware, createChatMiddleware, } from './activities/chat/middleware/index.js';
24
- export type { Capability, CapabilityHandle, CapabilityContext, CapabilityGetter, CapabilityProvider, } from './activities/chat/middleware/index.js';
25
- export * from './types.js';
26
- export { buildBaseUsage, type BaseUsageInput } from './utilities/usage.js';
27
- export { resolveMediaPrompt } from './utilities/media-prompt.js';
28
- export type { ResolvedMediaPrompt } from './utilities/media-prompt.js';
29
- export type { SystemPrompt, NormalizedSystemPrompt } from './system-prompts.js';
30
- export { normalizeSystemPrompts } from './system-prompts.js';
31
- export { detectImageMimeType } from './utils.js';
32
- export { realtimeToken } from './realtime/index.js';
33
- export type { RealtimeToken, RealtimeTokenAdapter, RealtimeTokenOptions, RealtimeSessionConfig, VADConfig, RealtimeMessage, RealtimeMessagePart, RealtimeTextPart, RealtimeAudioPart, RealtimeToolCallPart, RealtimeToolResultPart, RealtimeImagePart, RealtimeStatus, RealtimeMode, AudioVisualization, RealtimeEvent, RealtimeEventPayloads, RealtimeEventHandler, RealtimeErrorCode, RealtimeError, RealtimeAdapter, RealtimeConnection, } from './realtime/index.js';
34
- export { convertMessagesToModelMessages, generateMessageId, uiMessageToModelMessages, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, } from './activities/chat/messages.js';
35
- export { StreamProcessor, createReplayStream, ImmediateStrategy, PunctuationStrategy, BatchStrategy, WordBoundaryStrategy, CompositeStrategy, PartialJSONParser, defaultJSONParser, parsePartialJSON, } from './activities/chat/stream/index.js';
36
- export type { ChunkStrategy, ChunkRecording, InternalToolCallState, ProcessorResult, ProcessorState, StreamProcessorEvents, StreamProcessorOptions, ToolCallState, ToolResultState, JSONParser, } from './activities/chat/stream/index.js';
37
- export { chatParamsFromRequest, chatParamsFromRequestBody, mergeAgentTools, } from './utilities/chat-params.js';
38
- export { uiMessagesToWire } from './utilities/ag-ui-wire.js';
39
- export type { WireMessage } from './utilities/ag-ui-wire.js';
40
- export { isContentPart, isContentPartArray, normalizeToolResult, } from './utilities/tool-result.js';
41
- export { createModel, extendAdapter } from './extend-adapter.js';
42
- export type { ExtendedModelDef, ModelCapabilities } from './extend-adapter.js';
43
- export type { Logger, DebugCategories, DebugConfig, DebugOption, } from './logger/types.js';
44
- export { ConsoleLogger } from './logger/console-logger.js';
package/dist/esm/index.js DELETED
@@ -1,106 +0,0 @@
1
- import { chat, createChatOptions } from "./activities/chat/index.js";
2
- import { createSummarizeOptions, summarize } from "./activities/summarize/index.js";
3
- import { createImageOptions, generateImage } from "./activities/generateImage/index.js";
4
- import { createAudioOptions, generateAudio } from "./activities/generateAudio/index.js";
5
- import { createVideoOptions, generateVideo, getVideoJobStatus } from "./activities/generateVideo/index.js";
6
- import { createSpeechOptions, generateSpeech } from "./activities/generateSpeech/index.js";
7
- import { createTranscriptionOptions, generateTranscription } from "./activities/generateTranscription/index.js";
8
- import { toolDefinition } from "./activities/chat/tools/tool-definition.js";
9
- import { MCPDuplicateToolNameError } from "./activities/chat/mcp/manager.js";
10
- import { StandardSchemaValidationError, convertSchemaToJsonSchema, isStandardSchema, parseWithStandardSchema } from "./activities/chat/tools/schema-converter.js";
11
- import { streamToText, toHttpResponse, toHttpStream, toServerSentEventsResponse, toServerSentEventsStream } from "./stream-to-response.js";
12
- import { ToolCallManager } from "./activities/chat/tools/tool-calls.js";
13
- import { DISCOVERY_TOOL_NAME } from "./activities/chat/tools/lazy-tool-manager.js";
14
- import { brandProviderTool } from "./tools/provider-tool.js";
15
- import { combineStrategies, maxIterations, untilFinishReason } from "./activities/chat/agent-loop-strategies.js";
16
- import { createFrozenRegistry, createToolRegistry } from "./tool-registry.js";
17
- import { buildBaseUsage } from "./utilities/usage.js";
18
- import { resolveMediaPrompt } from "./utilities/media-prompt.js";
19
- import { normalizeSystemPrompts } from "./system-prompts.js";
20
- import { detectImageMimeType } from "./utils.js";
21
- import { realtimeToken } from "./realtime/index.js";
22
- import { convertMessagesToModelMessages, generateMessageId, modelMessageToUIMessage, modelMessagesToUIMessages, normalizeToUIMessage, uiMessageToModelMessages } from "./activities/chat/messages.js";
23
- import { chatParamsFromRequest, chatParamsFromRequestBody, mergeAgentTools } from "./utilities/chat-params.js";
24
- import { uiMessagesToWire } from "./utilities/ag-ui-wire.js";
25
- import { isContentPart, isContentPartArray, normalizeToolResult } from "./utilities/tool-result.js";
26
- import { createModel, extendAdapter } from "./extend-adapter.js";
27
- import { ConsoleLogger } from "./logger/console-logger.js";
28
- import { BatchStrategy, CompositeStrategy, ImmediateStrategy, PunctuationStrategy, WordBoundaryStrategy } from "./activities/chat/stream/strategies.js";
29
- import { EventType } from "@ag-ui/core";
30
- import { PartialJSONParser, defaultJSONParser, parsePartialJSON } from "./activities/chat/stream/json-parser.js";
31
- import { StreamProcessor, createReplayStream } from "./activities/chat/stream/processor.js";
32
- import { createCapability } from "./activities/chat/middleware/capabilities.js";
33
- import { createChatMiddleware } from "./activities/chat/middleware/builder.js";
34
- import { defineChatMiddleware } from "./activities/chat/middleware/define.js";
35
- export {
36
- BatchStrategy,
37
- CompositeStrategy,
38
- ConsoleLogger,
39
- DISCOVERY_TOOL_NAME,
40
- EventType,
41
- ImmediateStrategy,
42
- MCPDuplicateToolNameError,
43
- PartialJSONParser,
44
- PunctuationStrategy,
45
- StandardSchemaValidationError,
46
- StreamProcessor,
47
- ToolCallManager,
48
- WordBoundaryStrategy,
49
- brandProviderTool,
50
- buildBaseUsage,
51
- chat,
52
- chatParamsFromRequest,
53
- chatParamsFromRequestBody,
54
- combineStrategies,
55
- convertMessagesToModelMessages,
56
- convertSchemaToJsonSchema,
57
- createAudioOptions,
58
- createCapability,
59
- createChatMiddleware,
60
- createChatOptions,
61
- createFrozenRegistry,
62
- createImageOptions,
63
- createModel,
64
- createReplayStream,
65
- createSpeechOptions,
66
- createSummarizeOptions,
67
- createToolRegistry,
68
- createTranscriptionOptions,
69
- createVideoOptions,
70
- defaultJSONParser,
71
- defineChatMiddleware,
72
- detectImageMimeType,
73
- extendAdapter,
74
- generateAudio,
75
- generateImage,
76
- generateMessageId,
77
- generateSpeech,
78
- generateTranscription,
79
- generateVideo,
80
- getVideoJobStatus,
81
- isContentPart,
82
- isContentPartArray,
83
- isStandardSchema,
84
- maxIterations,
85
- mergeAgentTools,
86
- modelMessageToUIMessage,
87
- modelMessagesToUIMessages,
88
- normalizeSystemPrompts,
89
- normalizeToUIMessage,
90
- normalizeToolResult,
91
- parsePartialJSON,
92
- parseWithStandardSchema,
93
- realtimeToken,
94
- resolveMediaPrompt,
95
- streamToText,
96
- summarize,
97
- toHttpResponse,
98
- toHttpStream,
99
- toServerSentEventsResponse,
100
- toServerSentEventsStream,
101
- toolDefinition,
102
- uiMessageToModelMessages,
103
- uiMessagesToWire,
104
- untilFinishReason
105
- };
106
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,29 +0,0 @@
1
- import { Logger } from './types.js';
2
- /**
3
- * Default `Logger` implementation that routes each level to the matching
4
- * `console` method:
5
- *
6
- * - `debug` → `console.debug`
7
- * - `info` → `console.info`
8
- * - `warn` → `console.warn`
9
- * - `error` → `console.error`
10
- *
11
- * When a `meta` object is supplied it is rendered with the strategy that
12
- * actually surfaces it on the current runtime (see {@link MetaStrategy}):
13
- * depth-unlimited `console.dir` on Node, circular-safe JSON on Cloudflare
14
- * Workers, and an extra console argument everywhere else.
15
- *
16
- * This is the logger used when `debug` is enabled on any activity and no
17
- * custom `logger` is supplied via `debug: { logger }`.
18
- */
19
- export declare class ConsoleLogger implements Logger {
20
- /** Log a debug-level message; forwards to `console.debug`. */
21
- debug(message: string, meta?: Record<string, unknown>): void;
22
- /** Log an info-level message; forwards to `console.info`. */
23
- info(message: string, meta?: Record<string, unknown>): void;
24
- /** Log a warning-level message; forwards to `console.warn`. */
25
- warn(message: string, meta?: Record<string, unknown>): void;
26
- /** Log an error-level message; forwards to `console.error`. */
27
- error(message: string, meta?: Record<string, unknown>): void;
28
- private emit;
29
- }
@@ -1,83 +0,0 @@
1
- const DIR_OPTIONS = { depth: null, colors: true };
2
- function resolveMetaStrategy() {
3
- try {
4
- if (globalThis.navigator?.userAgent === "Cloudflare-Workers") return "json";
5
- } catch {
6
- }
7
- if (typeof process !== "undefined" && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- a partial process global (bundler shims) may lack versions
8
- typeof process.versions?.node === "string") {
9
- return "dir";
10
- }
11
- return "arg";
12
- }
13
- function stringifyMetaSafely(value) {
14
- const seen = /* @__PURE__ */ new WeakSet();
15
- try {
16
- return JSON.stringify(
17
- value,
18
- (_key, entry) => {
19
- if (typeof entry === "bigint") return entry.toString();
20
- if (entry instanceof Error) {
21
- return {
22
- name: entry.name,
23
- message: entry.message,
24
- stack: entry.stack
25
- };
26
- }
27
- if (typeof entry === "object" && entry !== null) {
28
- if (seen.has(entry)) return "[Circular]";
29
- seen.add(entry);
30
- }
31
- return entry;
32
- },
33
- 2
34
- );
35
- } catch {
36
- try {
37
- return String(value);
38
- } catch {
39
- return "[Unserializable meta]";
40
- }
41
- }
42
- }
43
- class ConsoleLogger {
44
- /** Log a debug-level message; forwards to `console.debug`. */
45
- debug(message, meta) {
46
- this.emit("debug", message, meta);
47
- }
48
- /** Log an info-level message; forwards to `console.info`. */
49
- info(message, meta) {
50
- this.emit("info", message, meta);
51
- }
52
- /** Log a warning-level message; forwards to `console.warn`. */
53
- warn(message, meta) {
54
- this.emit("warn", message, meta);
55
- }
56
- /** Log an error-level message; forwards to `console.error`. */
57
- error(message, meta) {
58
- this.emit("error", message, meta);
59
- }
60
- emit(level, message, meta) {
61
- if (meta === void 0) {
62
- console[level](message);
63
- return;
64
- }
65
- switch (resolveMetaStrategy()) {
66
- case "dir":
67
- console[level](message);
68
- console.dir(meta, DIR_OPTIONS);
69
- break;
70
- case "json":
71
- console[level](`${message}
72
- ${stringifyMetaSafely(meta)}`);
73
- break;
74
- case "arg":
75
- console[level](message, meta);
76
- break;
77
- }
78
- }
79
- }
80
- export {
81
- ConsoleLogger
82
- };
83
- //# sourceMappingURL=console-logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"console-logger.js","sources":["../../../src/logger/console-logger.ts"],"sourcesContent":["import type { Logger } from './types'\n\n/**\n * `util.inspect` options used with `console.dir` on Node so deeply nested\n * structures (e.g. provider chunk payloads with `usage`, `output`,\n * `reasoning`, `tools`) render in full instead of truncating to\n * `[Object]` / `[Array]`.\n */\nconst DIR_OPTIONS = { depth: null, colors: true } as const\n\n/**\n * How `meta` should be rendered on the current runtime:\n *\n * - `dir` — Node. `console.dir(meta, { depth: null, colors: true })` gives a\n * depth-unlimited, colored inspect dump.\n * - `json` — Cloudflare Workers / workerd. workerd never forwards\n * `console.dir` output to the terminal (with or without options), and its\n * own inspect of extra console arguments truncates nested objects, so the\n * payload is appended as circular-safe pretty-printed JSON instead.\n * - `arg` — everything else (browsers, Deno, Bun). `meta` is passed as an\n * extra console argument: devtools keep collapsible object trees and the\n * runtime's inspect handles circular references natively.\n */\ntype MetaStrategy = 'dir' | 'json' | 'arg'\n\nfunction resolveMetaStrategy(): MetaStrategy {\n // workerd must be detected before the Node check: under the `nodejs_compat`\n // flag it emulates `process.versions.node`, but still drops `console.dir`.\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- navigator is missing on Node < 21 despite the DOM lib typing it as always present\n if (globalThis.navigator?.userAgent === 'Cloudflare-Workers') return 'json'\n } catch {\n // A locked-down runtime with a throwing `userAgent` getter is not workerd;\n // fall through to the remaining checks rather than crash the log call.\n }\n if (\n typeof process !== 'undefined' &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- a partial process global (bundler shims) may lack versions\n typeof process.versions?.node === 'string'\n ) {\n return 'dir'\n }\n return 'arg'\n}\n\n/**\n * `JSON.stringify` hardened for debug payloads: circular references collapse\n * to `\"[Circular]\"`, `Error` instances expand to `name`/`message`/`stack`\n * (they would otherwise stringify to `{}`), and `bigint` values become\n * strings (they would otherwise throw). Never throws — falls back to\n * `String(value)` and, if even that coercion throws, a placeholder.\n */\nfunction stringifyMetaSafely(value: unknown): string {\n const seen = new WeakSet<object>()\n try {\n return JSON.stringify(\n value,\n (_key, entry: unknown) => {\n if (typeof entry === 'bigint') return entry.toString()\n if (entry instanceof Error) {\n return {\n name: entry.name,\n message: entry.message,\n stack: entry.stack,\n }\n }\n if (typeof entry === 'object' && entry !== null) {\n if (seen.has(entry)) return '[Circular]'\n seen.add(entry)\n }\n return entry\n },\n 2,\n )\n } catch {\n try {\n return String(value)\n } catch {\n return '[Unserializable meta]'\n }\n }\n}\n\n/**\n * Default `Logger` implementation that routes each level to the matching\n * `console` method:\n *\n * - `debug` → `console.debug`\n * - `info` → `console.info`\n * - `warn` → `console.warn`\n * - `error` → `console.error`\n *\n * When a `meta` object is supplied it is rendered with the strategy that\n * actually surfaces it on the current runtime (see {@link MetaStrategy}):\n * depth-unlimited `console.dir` on Node, circular-safe JSON on Cloudflare\n * Workers, and an extra console argument everywhere else.\n *\n * This is the logger used when `debug` is enabled on any activity and no\n * custom `logger` is supplied via `debug: { logger }`.\n */\nexport class ConsoleLogger implements Logger {\n /** Log a debug-level message; forwards to `console.debug`. */\n debug(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', message, meta)\n }\n\n /** Log an info-level message; forwards to `console.info`. */\n info(message: string, meta?: Record<string, unknown>): void {\n this.emit('info', message, meta)\n }\n\n /** Log a warning-level message; forwards to `console.warn`. */\n warn(message: string, meta?: Record<string, unknown>): void {\n this.emit('warn', message, meta)\n }\n\n /** Log an error-level message; forwards to `console.error`. */\n error(message: string, meta?: Record<string, unknown>): void {\n this.emit('error', message, meta)\n }\n\n private emit(\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n meta?: Record<string, unknown>,\n ): void {\n if (meta === undefined) {\n console[level](message)\n return\n }\n switch (resolveMetaStrategy()) {\n case 'dir':\n console[level](message)\n console.dir(meta, DIR_OPTIONS)\n break\n case 'json':\n console[level](`${message}\\n${stringifyMetaSafely(meta)}`)\n break\n case 'arg':\n console[level](message, meta)\n break\n }\n }\n}\n"],"names":[],"mappings":"AAQA,MAAM,cAAc,EAAE,OAAO,MAAM,QAAQ,KAAA;AAiB3C,SAAS,sBAAoC;AAG3C,MAAI;AAEF,QAAI,WAAW,WAAW,cAAc,qBAAsB,QAAO;AAAA,EACvE,QAAQ;AAAA,EAGR;AACA,MACE,OAAO,YAAY;AAAA,EAEnB,OAAO,QAAQ,UAAU,SAAS,UAClC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AASA,SAAS,oBAAoB,OAAwB;AACnD,QAAM,2BAAW,QAAA;AACjB,MAAI;AACF,WAAO,KAAK;AAAA,MACV;AAAA,MACA,CAAC,MAAM,UAAmB;AACxB,YAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAA;AAC5C,YAAI,iBAAiB,OAAO;AAC1B,iBAAO;AAAA,YACL,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,YACf,OAAO,MAAM;AAAA,UAAA;AAAA,QAEjB;AACA,YAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,cAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,eAAK,IAAI,KAAK;AAAA,QAChB;AACA,eAAO;AAAA,MACT;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ,QAAQ;AACN,QAAI;AACF,aAAO,OAAO,KAAK;AAAA,IACrB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAmBO,MAAM,cAAgC;AAAA;AAAA,EAE3C,MAAM,SAAiB,MAAsC;AAC3D,SAAK,KAAK,SAAS,SAAS,IAAI;AAAA,EAClC;AAAA;AAAA,EAGA,KAAK,SAAiB,MAAsC;AAC1D,SAAK,KAAK,QAAQ,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA,EAGA,KAAK,SAAiB,MAAsC;AAC1D,SAAK,KAAK,QAAQ,SAAS,IAAI;AAAA,EACjC;AAAA;AAAA,EAGA,MAAM,SAAiB,MAAsC;AAC3D,SAAK,KAAK,SAAS,SAAS,IAAI;AAAA,EAClC;AAAA,EAEQ,KACN,OACA,SACA,MACM;AACN,QAAI,SAAS,QAAW;AACtB,cAAQ,KAAK,EAAE,OAAO;AACtB;AAAA,IACF;AACA,YAAQ,uBAAoB;AAAA,MAC1B,KAAK;AACH,gBAAQ,KAAK,EAAE,OAAO;AACtB,gBAAQ,IAAI,MAAM,WAAW;AAC7B;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,EAAE,GAAG,OAAO;AAAA,EAAK,oBAAoB,IAAI,CAAC,EAAE;AACzD;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,EAAE,SAAS,IAAI;AAC5B;AAAA,IAAA;AAAA,EAEN;AACF;"}
@@ -1,41 +0,0 @@
1
- import { DebugCategories, Logger } from './types.js';
2
- /**
3
- * Fully-resolved categories map. Every flag is a definite boolean (never
4
- * undefined), produced by `resolveDebugOption` from a `DebugOption`.
5
- */
6
- export type ResolvedCategories = Required<DebugCategories>;
7
- export declare class InternalLogger {
8
- private readonly logger;
9
- private readonly categories;
10
- constructor(logger: Logger, categories: ResolvedCategories);
11
- /** Whether a category is enabled. Cheap, safe to call on hot paths. */
12
- isEnabled(category: keyof ResolvedCategories): boolean;
13
- private emit;
14
- /** Log a raw chunk/frame received from a provider SDK. */
15
- provider(message: string, meta?: Record<string, unknown>): void;
16
- /** Log a chunk/result yielded to the consumer after middleware. */
17
- output(message: string, meta?: Record<string, unknown>): void;
18
- /** Log inputs/outputs around a middleware hook invocation. Chat-only. */
19
- middleware(message: string, meta?: Record<string, unknown>): void;
20
- /** Log before/after a tool-call execution. Chat-only. */
21
- tools(message: string, meta?: Record<string, unknown>): void;
22
- /** Log an agent-loop iteration marker or phase transition. Chat-only. */
23
- agentLoop(message: string, meta?: Record<string, unknown>): void;
24
- /** Log a config transform returned by a middleware `onConfig` hook. Chat-only. */
25
- config(message: string, meta?: Record<string, unknown>): void;
26
- /**
27
- * Log a caught error. Defaults to on even when `debug` is unspecified.
28
- * Uses the underlying logger's `error` level.
29
- */
30
- errors(message: string, meta?: Record<string, unknown>): void;
31
- /** Log outgoing request metadata before an adapter SDK call. */
32
- request(message: string, meta?: Record<string, unknown>): void;
33
- /**
34
- * Log a non-fatal misconfiguration or recoverable anomaly. Gated by the
35
- * `errors` category — on by default (and when `debug` is unspecified), so
36
- * silent-drop conditions surface, but still silenced by `debug: false`,
37
- * which honors the "disable everything including errors" contract. Routes to
38
- * the underlying logger's `warn` level.
39
- */
40
- warn(message: string, meta?: Record<string, unknown>): void;
41
- }
@@ -1,86 +0,0 @@
1
- const CATEGORY_EMOJI = {
2
- request: "📤",
3
- provider: "📥",
4
- output: "📨",
5
- middleware: "🧩",
6
- tools: "🔧",
7
- agentLoop: "🔁",
8
- config: "⚙️",
9
- errors: "❌"
10
- };
11
- class InternalLogger {
12
- constructor(logger, categories) {
13
- this.logger = logger;
14
- this.categories = categories;
15
- }
16
- logger;
17
- categories;
18
- /** Whether a category is enabled. Cheap, safe to call on hot paths. */
19
- isEnabled(category) {
20
- return this.categories[category];
21
- }
22
- emit(level, category, message, meta) {
23
- if (!this.categories[category]) return;
24
- const emoji = CATEGORY_EMOJI[category];
25
- const prefixed = `${emoji} [tanstack-ai:${category}] ${emoji} ${message}`;
26
- try {
27
- if (level === "error") this.logger.error(prefixed, meta);
28
- else this.logger.debug(prefixed, meta);
29
- } catch {
30
- }
31
- }
32
- /** Log a raw chunk/frame received from a provider SDK. */
33
- provider(message, meta) {
34
- this.emit("debug", "provider", message, meta);
35
- }
36
- /** Log a chunk/result yielded to the consumer after middleware. */
37
- output(message, meta) {
38
- this.emit("debug", "output", message, meta);
39
- }
40
- /** Log inputs/outputs around a middleware hook invocation. Chat-only. */
41
- middleware(message, meta) {
42
- this.emit("debug", "middleware", message, meta);
43
- }
44
- /** Log before/after a tool-call execution. Chat-only. */
45
- tools(message, meta) {
46
- this.emit("debug", "tools", message, meta);
47
- }
48
- /** Log an agent-loop iteration marker or phase transition. Chat-only. */
49
- agentLoop(message, meta) {
50
- this.emit("debug", "agentLoop", message, meta);
51
- }
52
- /** Log a config transform returned by a middleware `onConfig` hook. Chat-only. */
53
- config(message, meta) {
54
- this.emit("debug", "config", message, meta);
55
- }
56
- /**
57
- * Log a caught error. Defaults to on even when `debug` is unspecified.
58
- * Uses the underlying logger's `error` level.
59
- */
60
- errors(message, meta) {
61
- this.emit("error", "errors", message, meta);
62
- }
63
- /** Log outgoing request metadata before an adapter SDK call. */
64
- request(message, meta) {
65
- this.emit("debug", "request", message, meta);
66
- }
67
- /**
68
- * Log a non-fatal misconfiguration or recoverable anomaly. Gated by the
69
- * `errors` category — on by default (and when `debug` is unspecified), so
70
- * silent-drop conditions surface, but still silenced by `debug: false`,
71
- * which honors the "disable everything including errors" contract. Routes to
72
- * the underlying logger's `warn` level.
73
- */
74
- warn(message, meta) {
75
- if (!this.categories.errors) return;
76
- const prefixed = `⚠️ [tanstack-ai:warn] ⚠️ ${message}`;
77
- try {
78
- this.logger.warn(prefixed, meta);
79
- } catch {
80
- }
81
- }
82
- }
83
- export {
84
- InternalLogger
85
- };
86
- //# sourceMappingURL=internal-logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"internal-logger.js","sources":["../../../src/logger/internal-logger.ts"],"sourcesContent":["import type { DebugCategories, Logger } from './types'\n\n/**\n * Fully-resolved categories map. Every flag is a definite boolean (never\n * undefined), produced by `resolveDebugOption` from a `DebugOption`.\n */\nexport type ResolvedCategories = Required<DebugCategories>\n\n/**\n * Package-internal logger wrapper used by every activity and adapter in\n * `@tanstack/ai`. Wraps a user-supplied (or default `ConsoleLogger`) `Logger`\n * plus a fully-resolved per-category map. Each category has a dedicated\n * method that no-ops when its flag is `false`, or prepends a\n * `[tanstack-ai:<category>] ` prefix and calls the underlying logger's\n * `error` (for the `errors` category) or `debug` (for everything else).\n *\n * Not exported from the package root. Adapter packages consume it via the\n * `@tanstack/ai/adapter-internals` subpath export.\n */\n/**\n * Emoji marker per category — bracketing the `[tanstack-ai:<cat>]` tag on\n * both sides makes it trivial to visually pick out a category when scanning\n * dense streaming logs.\n */\nconst CATEGORY_EMOJI: Record<keyof ResolvedCategories, string> = {\n request: '📤',\n provider: '📥',\n output: '📨',\n middleware: '🧩',\n tools: '🔧',\n agentLoop: '🔁',\n config: '⚙️',\n errors: '❌',\n}\n\nexport class InternalLogger {\n constructor(\n private readonly logger: Logger,\n private readonly categories: ResolvedCategories,\n ) {}\n\n /** Whether a category is enabled. Cheap, safe to call on hot paths. */\n isEnabled(category: keyof ResolvedCategories): boolean {\n return this.categories[category]\n }\n\n private emit(\n level: 'debug' | 'error',\n category: keyof ResolvedCategories,\n message: string,\n meta?: Record<string, unknown>,\n ): void {\n if (!this.categories[category]) return\n const emoji = CATEGORY_EMOJI[category]\n const prefixed = `${emoji} [tanstack-ai:${category}] ${emoji} ${message}`\n try {\n if (level === 'error') this.logger.error(prefixed, meta)\n else this.logger.debug(prefixed, meta)\n } catch {\n // User-supplied logger threw; swallow so we never mask the original\n // error that triggered this log call.\n }\n }\n\n /** Log a raw chunk/frame received from a provider SDK. */\n provider(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'provider', message, meta)\n }\n\n /** Log a chunk/result yielded to the consumer after middleware. */\n output(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'output', message, meta)\n }\n\n /** Log inputs/outputs around a middleware hook invocation. Chat-only. */\n middleware(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'middleware', message, meta)\n }\n\n /** Log before/after a tool-call execution. Chat-only. */\n tools(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'tools', message, meta)\n }\n\n /** Log an agent-loop iteration marker or phase transition. Chat-only. */\n agentLoop(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'agentLoop', message, meta)\n }\n\n /** Log a config transform returned by a middleware `onConfig` hook. Chat-only. */\n config(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'config', message, meta)\n }\n\n /**\n * Log a caught error. Defaults to on even when `debug` is unspecified.\n * Uses the underlying logger's `error` level.\n */\n errors(message: string, meta?: Record<string, unknown>): void {\n this.emit('error', 'errors', message, meta)\n }\n\n /** Log outgoing request metadata before an adapter SDK call. */\n request(message: string, meta?: Record<string, unknown>): void {\n this.emit('debug', 'request', message, meta)\n }\n\n /**\n * Log a non-fatal misconfiguration or recoverable anomaly. Gated by the\n * `errors` category — on by default (and when `debug` is unspecified), so\n * silent-drop conditions surface, but still silenced by `debug: false`,\n * which honors the \"disable everything including errors\" contract. Routes to\n * the underlying logger's `warn` level.\n */\n warn(message: string, meta?: Record<string, unknown>): void {\n if (!this.categories.errors) return\n const prefixed = `⚠️ [tanstack-ai:warn] ⚠️ ${message}`\n try {\n this.logger.warn(prefixed, meta)\n } catch {\n // User-supplied logger threw; swallow so a broken logger never masks the\n // condition we were trying to surface.\n }\n }\n}\n"],"names":[],"mappings":"AAwBA,MAAM,iBAA2D;AAAA,EAC/D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,MAAM,eAAe;AAAA,EAC1B,YACmB,QACA,YACjB;AAFiB,SAAA,SAAA;AACA,SAAA,aAAA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA;AAAA,EAInB,UAAU,UAA6C;AACrD,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EAEQ,KACN,OACA,UACA,SACA,MACM;AACN,QAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,UAAM,QAAQ,eAAe,QAAQ;AACrC,UAAM,WAAW,GAAG,KAAK,iBAAiB,QAAQ,KAAK,KAAK,IAAI,OAAO;AACvE,QAAI;AACF,UAAI,UAAU,QAAS,MAAK,OAAO,MAAM,UAAU,IAAI;AAAA,UAClD,MAAK,OAAO,MAAM,UAAU,IAAI;AAAA,IACvC,QAAQ;AAAA,IAGR;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,SAAiB,MAAsC;AAC9D,SAAK,KAAK,SAAS,YAAY,SAAS,IAAI;AAAA,EAC9C;AAAA;AAAA,EAGA,OAAO,SAAiB,MAAsC;AAC5D,SAAK,KAAK,SAAS,UAAU,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,WAAW,SAAiB,MAAsC;AAChE,SAAK,KAAK,SAAS,cAAc,SAAS,IAAI;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,SAAiB,MAAsC;AAC3D,SAAK,KAAK,SAAS,SAAS,SAAS,IAAI;AAAA,EAC3C;AAAA;AAAA,EAGA,UAAU,SAAiB,MAAsC;AAC/D,SAAK,KAAK,SAAS,aAAa,SAAS,IAAI;AAAA,EAC/C;AAAA;AAAA,EAGA,OAAO,SAAiB,MAAsC;AAC5D,SAAK,KAAK,SAAS,UAAU,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAiB,MAAsC;AAC5D,SAAK,KAAK,SAAS,UAAU,SAAS,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,QAAQ,SAAiB,MAAsC;AAC7D,SAAK,KAAK,SAAS,WAAW,SAAS,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,SAAiB,MAAsC;AAC1D,QAAI,CAAC,KAAK,WAAW,OAAQ;AAC7B,UAAM,WAAW,4BAA4B,OAAO;AACpD,QAAI;AACF,WAAK,OAAO,KAAK,UAAU,IAAI;AAAA,IACjC,QAAQ;AAAA,IAGR;AAAA,EACF;AACF;"}
@@ -1,14 +0,0 @@
1
- import { InternalLogger } from './internal-logger.js';
2
- import { DebugOption } from './types.js';
3
- /**
4
- * Normalize a `DebugOption` into an `InternalLogger` ready to be threaded
5
- * through the library's activities and adapters. See the `DebugOption`
6
- * resolution table in the spec for the complete rules.
7
- *
8
- * - `undefined`: only the `errors` category is enabled; default `ConsoleLogger`.
9
- * - `true`: all categories enabled; default `ConsoleLogger`.
10
- * - `false`: all categories disabled (including `errors`); default `ConsoleLogger`.
11
- * - `DebugConfig`: each unspecified category defaults to `true`; an optional
12
- * `logger` replaces the default `ConsoleLogger`.
13
- */
14
- export declare function resolveDebugOption(debug: DebugOption | undefined): InternalLogger;