@jterrazz/intelligence 1.6.1 → 3.0.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 (107) hide show
  1. package/README.md +69 -165
  2. package/dist/index.cjs +649 -1625
  3. package/dist/index.d.ts +5 -12
  4. package/dist/index.js +5 -12
  5. package/dist/index.js.map +1 -1
  6. package/dist/middleware/__tests__/logging.middleware.test.js +390 -0
  7. package/dist/middleware/__tests__/logging.middleware.test.js.map +1 -0
  8. package/dist/middleware/logging.middleware.d.ts +21 -0
  9. package/dist/middleware/logging.middleware.js +296 -0
  10. package/dist/middleware/logging.middleware.js.map +1 -0
  11. package/dist/parsing/__tests__/create-schema-prompt.test.js +53 -0
  12. package/dist/parsing/__tests__/create-schema-prompt.test.js.map +1 -0
  13. package/dist/parsing/__tests__/parse-object.test.d.ts +1 -0
  14. package/dist/parsing/__tests__/parse-object.test.js +193 -0
  15. package/dist/parsing/__tests__/parse-object.test.js.map +1 -0
  16. package/dist/parsing/__tests__/parse-text.test.d.ts +1 -0
  17. package/dist/parsing/__tests__/parse-text.test.js +159 -0
  18. package/dist/parsing/__tests__/parse-text.test.js.map +1 -0
  19. package/dist/parsing/create-schema-prompt.d.ts +28 -0
  20. package/dist/parsing/create-schema-prompt.js +42 -0
  21. package/dist/parsing/create-schema-prompt.js.map +1 -0
  22. package/dist/parsing/parse-object.d.ts +33 -0
  23. package/dist/parsing/parse-object.js +360 -0
  24. package/dist/parsing/parse-object.js.map +1 -0
  25. package/dist/parsing/parse-text.d.ts +14 -0
  26. package/dist/parsing/parse-text.js +80 -0
  27. package/dist/parsing/parse-text.js.map +1 -0
  28. package/dist/providers/openrouter.provider.d.ts +36 -0
  29. package/dist/providers/openrouter.provider.js +58 -0
  30. package/dist/providers/openrouter.provider.js.map +1 -0
  31. package/package.json +15 -14
  32. package/dist/adapters/agents/autonomous-agent.adapter.d.ts +0 -30
  33. package/dist/adapters/agents/autonomous-agent.adapter.js +0 -400
  34. package/dist/adapters/agents/autonomous-agent.adapter.js.map +0 -1
  35. package/dist/adapters/agents/basic-agent.adapter.d.ts +0 -27
  36. package/dist/adapters/agents/basic-agent.adapter.js +0 -339
  37. package/dist/adapters/agents/basic-agent.adapter.js.map +0 -1
  38. package/dist/adapters/agents/retryable-agent.adapter.d.ts +0 -20
  39. package/dist/adapters/agents/retryable-agent.adapter.js +0 -263
  40. package/dist/adapters/agents/retryable-agent.adapter.js.map +0 -1
  41. package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -38
  42. package/dist/adapters/models/openrouter-model.adapter.js +0 -89
  43. package/dist/adapters/models/openrouter-model.adapter.js.map +0 -1
  44. package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +0 -120
  45. package/dist/adapters/prompts/__tests__/presets.test.js +0 -31
  46. package/dist/adapters/prompts/__tests__/presets.test.js.map +0 -1
  47. package/dist/adapters/prompts/library/categories/domain.d.ts +0 -11
  48. package/dist/adapters/prompts/library/categories/domain.js +0 -12
  49. package/dist/adapters/prompts/library/categories/domain.js.map +0 -1
  50. package/dist/adapters/prompts/library/categories/format.d.ts +0 -10
  51. package/dist/adapters/prompts/library/categories/format.js +0 -11
  52. package/dist/adapters/prompts/library/categories/format.js.map +0 -1
  53. package/dist/adapters/prompts/library/categories/foundations.d.ts +0 -12
  54. package/dist/adapters/prompts/library/categories/foundations.js +0 -13
  55. package/dist/adapters/prompts/library/categories/foundations.js.map +0 -1
  56. package/dist/adapters/prompts/library/categories/language.d.ts +0 -11
  57. package/dist/adapters/prompts/library/categories/language.js +0 -12
  58. package/dist/adapters/prompts/library/categories/language.js.map +0 -1
  59. package/dist/adapters/prompts/library/categories/persona.d.ts +0 -13
  60. package/dist/adapters/prompts/library/categories/persona.js +0 -14
  61. package/dist/adapters/prompts/library/categories/persona.js.map +0 -1
  62. package/dist/adapters/prompts/library/categories/response.d.ts +0 -9
  63. package/dist/adapters/prompts/library/categories/response.js +0 -10
  64. package/dist/adapters/prompts/library/categories/response.js.map +0 -1
  65. package/dist/adapters/prompts/library/categories/tone.d.ts +0 -9
  66. package/dist/adapters/prompts/library/categories/tone.js +0 -10
  67. package/dist/adapters/prompts/library/categories/tone.js.map +0 -1
  68. package/dist/adapters/prompts/library/categories/verbosity.d.ts +0 -8
  69. package/dist/adapters/prompts/library/categories/verbosity.js +0 -9
  70. package/dist/adapters/prompts/library/categories/verbosity.js.map +0 -1
  71. package/dist/adapters/prompts/library/index.d.ts +0 -68
  72. package/dist/adapters/prompts/library/index.js +0 -26
  73. package/dist/adapters/prompts/library/index.js.map +0 -1
  74. package/dist/adapters/prompts/library/presets.d.ts +0 -17
  75. package/dist/adapters/prompts/library/presets.js +0 -45
  76. package/dist/adapters/prompts/library/presets.js.map +0 -1
  77. package/dist/adapters/prompts/system-prompt.adapter.d.ts +0 -9
  78. package/dist/adapters/prompts/system-prompt.adapter.js +0 -57
  79. package/dist/adapters/prompts/system-prompt.adapter.js.map +0 -1
  80. package/dist/adapters/prompts/user-prompt.adapter.d.ts +0 -9
  81. package/dist/adapters/prompts/user-prompt.adapter.js +0 -57
  82. package/dist/adapters/prompts/user-prompt.adapter.js.map +0 -1
  83. package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
  84. package/dist/adapters/tools/safe-tool.adapter.js +0 -283
  85. package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
  86. package/dist/adapters/utils/__tests__/ai-response-parser.test.js +0 -289
  87. package/dist/adapters/utils/__tests__/ai-response-parser.test.js.map +0 -1
  88. package/dist/adapters/utils/ai-response-parser-error.d.ts +0 -8
  89. package/dist/adapters/utils/ai-response-parser-error.js +0 -136
  90. package/dist/adapters/utils/ai-response-parser-error.js.map +0 -1
  91. package/dist/adapters/utils/ai-response-parser.d.ts +0 -60
  92. package/dist/adapters/utils/ai-response-parser.js +0 -347
  93. package/dist/adapters/utils/ai-response-parser.js.map +0 -1
  94. package/dist/ports/agent.port.d.ts +0 -17
  95. package/dist/ports/agent.port.js +0 -7
  96. package/dist/ports/agent.port.js.map +0 -1
  97. package/dist/ports/model.port.d.ts +0 -10
  98. package/dist/ports/model.port.js +0 -5
  99. package/dist/ports/model.port.js.map +0 -1
  100. package/dist/ports/prompt.port.d.ts +0 -9
  101. package/dist/ports/prompt.port.js +0 -5
  102. package/dist/ports/prompt.port.js.map +0 -1
  103. package/dist/ports/tool.port.d.ts +0 -11
  104. package/dist/ports/tool.port.js +0 -5
  105. package/dist/ports/tool.port.js.map +0 -1
  106. /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
  107. /package/dist/{adapters/utils/__tests__/ai-response-parser.test.d.ts → parsing/__tests__/create-schema-prompt.test.d.ts} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,12 +1,5 @@
1
- export { AutonomousAgentAdapter, type AutonomousAgentOptions, } from './adapters/agents/autonomous-agent.adapter.js';
2
- export { BasicAgentAdapter, type BasicAgentOptions, } from './adapters/agents/basic-agent.adapter.js';
3
- export { OpenRouterModelAdapter as OpenRouterAdapter } from './adapters/models/openrouter-model.adapter.js';
4
- export { PROMPT_LIBRARY } from './adapters/prompts/library/index.js';
5
- export { SystemPromptAdapter } from './adapters/prompts/system-prompt.adapter.js';
6
- export { UserPromptAdapter } from './adapters/prompts/user-prompt.adapter.js';
7
- export { SafeToolAdapter } from './adapters/tools/safe-tool.adapter.js';
8
- export { AIResponseParser } from './adapters/utils/ai-response-parser.js';
9
- export * from './ports/agent.port.js';
10
- export * from './ports/model.port.js';
11
- export * from './ports/prompt.port.js';
12
- export * from './ports/tool.port.js';
1
+ export { createLoggingMiddleware, type LoggingMiddlewareOptions, } from './middleware/logging.middleware.js';
2
+ export { createSchemaPrompt } from './parsing/create-schema-prompt.js';
3
+ export { parseObject, ParseObjectError } from './parsing/parse-object.js';
4
+ export { parseText, type ParseTextOptions } from './parsing/parse-text.js';
5
+ export { createOpenRouterProvider, type ModelOptions, type OpenRouterConfig, type OpenRouterMetadata, type OpenRouterProvider, } from './providers/openrouter.provider.js';
package/dist/index.js CHANGED
@@ -1,14 +1,7 @@
1
- export { AutonomousAgentAdapter } from './adapters/agents/autonomous-agent.adapter.js';
2
- export { BasicAgentAdapter } from './adapters/agents/basic-agent.adapter.js';
3
- export { OpenRouterModelAdapter as OpenRouterAdapter } from './adapters/models/openrouter-model.adapter.js';
4
- export { PROMPT_LIBRARY } from './adapters/prompts/library/index.js';
5
- export { SystemPromptAdapter } from './adapters/prompts/system-prompt.adapter.js';
6
- export { UserPromptAdapter } from './adapters/prompts/user-prompt.adapter.js';
7
- export { SafeToolAdapter } from './adapters/tools/safe-tool.adapter.js';
8
- export { AIResponseParser } from './adapters/utils/ai-response-parser.js';
9
- export * from './ports/agent.port.js';
10
- export * from './ports/model.port.js';
11
- export * from './ports/prompt.port.js';
12
- export * from './ports/tool.port.js';
1
+ export { createLoggingMiddleware } from './middleware/logging.middleware.js';
2
+ export { createSchemaPrompt } from './parsing/create-schema-prompt.js';
3
+ export { parseObject, ParseObjectError } from './parsing/parse-object.js';
4
+ export { parseText } from './parsing/parse-text.js';
5
+ export { createOpenRouterProvider } from './providers/openrouter.provider.js';
13
6
 
14
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n AutonomousAgentAdapter,\n type AutonomousAgentOptions,\n} from './adapters/agents/autonomous-agent.adapter.js';\nexport {\n BasicAgentAdapter,\n type BasicAgentOptions,\n} from './adapters/agents/basic-agent.adapter.js';\nexport { OpenRouterModelAdapter as OpenRouterAdapter } from './adapters/models/openrouter-model.adapter.js';\nexport { PROMPT_LIBRARY } from './adapters/prompts/library/index.js';\nexport { SystemPromptAdapter } from './adapters/prompts/system-prompt.adapter.js';\nexport { UserPromptAdapter } from './adapters/prompts/user-prompt.adapter.js';\nexport { SafeToolAdapter } from './adapters/tools/safe-tool.adapter.js';\nexport { AIResponseParser } from './adapters/utils/ai-response-parser.js';\n\nexport * from './ports/agent.port.js';\nexport * from './ports/model.port.js';\nexport * from './ports/prompt.port.js';\nexport * from './ports/tool.port.js';\n"],"names":["AutonomousAgentAdapter","BasicAgentAdapter","OpenRouterModelAdapter","OpenRouterAdapter","PROMPT_LIBRARY","SystemPromptAdapter","UserPromptAdapter","SafeToolAdapter","AIResponseParser"],"mappings":"AAAA,SACIA,sBAAsB,QAEnB,gDAAgD;AACvD,SACIC,iBAAiB,QAEd,2CAA2C;AAClD,SAASC,0BAA0BC,iBAAiB,QAAQ,gDAAgD;AAC5G,SAASC,cAAc,QAAQ,sCAAsC;AACrE,SAASC,mBAAmB,QAAQ,8CAA8C;AAClF,SAASC,iBAAiB,QAAQ,4CAA4C;AAC9E,SAASC,eAAe,QAAQ,wCAAwC;AACxE,SAASC,gBAAgB,QAAQ,yCAAyC;AAE1E,cAAc,wBAAwB;AACtC,cAAc,wBAAwB;AACtC,cAAc,yBAAyB;AACvC,cAAc,uBAAuB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n createLoggingMiddleware,\n type LoggingMiddlewareOptions,\n} from './middleware/logging.middleware.js';\nexport { createSchemaPrompt } from './parsing/create-schema-prompt.js';\nexport { parseObject, ParseObjectError } from './parsing/parse-object.js';\nexport { parseText, type ParseTextOptions } from './parsing/parse-text.js';\nexport {\n createOpenRouterProvider,\n type ModelOptions,\n type OpenRouterConfig,\n type OpenRouterMetadata,\n type OpenRouterProvider,\n} from './providers/openrouter.provider.js';\n"],"names":["createLoggingMiddleware","createSchemaPrompt","parseObject","ParseObjectError","parseText","createOpenRouterProvider"],"mappings":"AAAA,SACIA,uBAAuB,QAEpB,qCAAqC;AAC5C,SAASC,kBAAkB,QAAQ,oCAAoC;AACvE,SAASC,WAAW,EAAEC,gBAAgB,QAAQ,4BAA4B;AAC1E,SAASC,SAAS,QAA+B,0BAA0B;AAC3E,SACIC,wBAAwB,QAKrB,qCAAqC"}
@@ -0,0 +1,390 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _ts_generator(thisArg, body) {
31
+ var f, y, t, _ = {
32
+ label: 0,
33
+ sent: function() {
34
+ if (t[0] & 1) throw t[1];
35
+ return t[1];
36
+ },
37
+ trys: [],
38
+ ops: []
39
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
40
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
41
+ return this;
42
+ }), g;
43
+ function verb(n) {
44
+ return function(v) {
45
+ return step([
46
+ n,
47
+ v
48
+ ]);
49
+ };
50
+ }
51
+ function step(op) {
52
+ if (f) throw new TypeError("Generator is already executing.");
53
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
54
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
55
+ if (y = 0, t) op = [
56
+ op[0] & 2,
57
+ t.value
58
+ ];
59
+ switch(op[0]){
60
+ case 0:
61
+ case 1:
62
+ t = op;
63
+ break;
64
+ case 4:
65
+ _.label++;
66
+ return {
67
+ value: op[1],
68
+ done: false
69
+ };
70
+ case 5:
71
+ _.label++;
72
+ y = op[1];
73
+ op = [
74
+ 0
75
+ ];
76
+ continue;
77
+ case 7:
78
+ op = _.ops.pop();
79
+ _.trys.pop();
80
+ continue;
81
+ default:
82
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
83
+ _ = 0;
84
+ continue;
85
+ }
86
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
87
+ _.label = op[1];
88
+ break;
89
+ }
90
+ if (op[0] === 6 && _.label < t[1]) {
91
+ _.label = t[1];
92
+ t = op;
93
+ break;
94
+ }
95
+ if (t && _.label < t[2]) {
96
+ _.label = t[2];
97
+ _.ops.push(op);
98
+ break;
99
+ }
100
+ if (t[2]) _.ops.pop();
101
+ _.trys.pop();
102
+ continue;
103
+ }
104
+ op = body.call(thisArg, _);
105
+ } catch (e) {
106
+ op = [
107
+ 6,
108
+ e
109
+ ];
110
+ y = 0;
111
+ } finally{
112
+ f = t = 0;
113
+ }
114
+ if (op[0] & 5) throw op[1];
115
+ return {
116
+ value: op[0] ? op[1] : void 0,
117
+ done: true
118
+ };
119
+ }
120
+ }
121
+ import { describe, expect, it, vi } from 'vitest';
122
+ import { createLoggingMiddleware } from '../logging.middleware.js';
123
+ function createMockLogger() {
124
+ var logger = {
125
+ child: vi.fn(function() {
126
+ return logger;
127
+ }),
128
+ debug: vi.fn(),
129
+ error: vi.fn(),
130
+ info: vi.fn(),
131
+ warn: vi.fn()
132
+ };
133
+ return logger;
134
+ }
135
+ function createMockGenerateResult() {
136
+ return {
137
+ content: [
138
+ {
139
+ type: 'text',
140
+ text: 'Hello world'
141
+ }
142
+ ],
143
+ finishReason: 'stop',
144
+ usage: {
145
+ inputTokens: 10,
146
+ outputTokens: 20,
147
+ totalTokens: 30
148
+ },
149
+ warnings: []
150
+ };
151
+ }
152
+ function createMockStreamResult() {
153
+ return {
154
+ stream: new ReadableStream(),
155
+ warnings: []
156
+ };
157
+ }
158
+ describe('createLoggingMiddleware', function() {
159
+ describe('wrapGenerate', function() {
160
+ it('logs request start and completion on success', function() {
161
+ return _async_to_generator(function() {
162
+ var _middleware_wrapGenerate, logger, middleware, mockResult, doGenerate, result;
163
+ return _ts_generator(this, function(_state) {
164
+ switch(_state.label){
165
+ case 0:
166
+ logger = createMockLogger();
167
+ middleware = createLoggingMiddleware({
168
+ logger: logger
169
+ });
170
+ mockResult = createMockGenerateResult();
171
+ doGenerate = vi.fn().mockResolvedValue(mockResult);
172
+ return [
173
+ 4,
174
+ (_middleware_wrapGenerate = middleware.wrapGenerate) === null || _middleware_wrapGenerate === void 0 ? void 0 : _middleware_wrapGenerate.call(middleware, {
175
+ doGenerate: doGenerate,
176
+ doStream: vi.fn(),
177
+ params: {},
178
+ model: {}
179
+ })
180
+ ];
181
+ case 1:
182
+ result = _state.sent();
183
+ expect(logger.debug).toHaveBeenCalledTimes(2);
184
+ expect(logger.debug).toHaveBeenNthCalledWith(1, 'Model request started', {});
185
+ expect(logger.debug).toHaveBeenNthCalledWith(2, 'Model request completed', expect.objectContaining({
186
+ durationMs: expect.any(Number),
187
+ finishReason: 'stop',
188
+ usage: mockResult.usage
189
+ }));
190
+ expect(result).toBe(mockResult);
191
+ return [
192
+ 2
193
+ ];
194
+ }
195
+ });
196
+ })();
197
+ });
198
+ it('logs error on failure', function() {
199
+ return _async_to_generator(function() {
200
+ var _middleware_wrapGenerate, logger, middleware, error, doGenerate;
201
+ return _ts_generator(this, function(_state) {
202
+ switch(_state.label){
203
+ case 0:
204
+ logger = createMockLogger();
205
+ middleware = createLoggingMiddleware({
206
+ logger: logger
207
+ });
208
+ error = new Error('API error');
209
+ doGenerate = vi.fn().mockRejectedValue(error);
210
+ return [
211
+ 4,
212
+ expect((_middleware_wrapGenerate = middleware.wrapGenerate) === null || _middleware_wrapGenerate === void 0 ? void 0 : _middleware_wrapGenerate.call(middleware, {
213
+ doGenerate: doGenerate,
214
+ doStream: vi.fn(),
215
+ params: {},
216
+ model: {}
217
+ })).rejects.toThrow('API error')
218
+ ];
219
+ case 1:
220
+ _state.sent();
221
+ expect(logger.debug).toHaveBeenCalledWith('Model request started', {});
222
+ expect(logger.error).toHaveBeenCalledWith('Model request failed', expect.objectContaining({
223
+ durationMs: expect.any(Number),
224
+ error: 'API error'
225
+ }));
226
+ return [
227
+ 2
228
+ ];
229
+ }
230
+ });
231
+ })();
232
+ });
233
+ it('includes params and content when verbose is true', function() {
234
+ return _async_to_generator(function() {
235
+ var _middleware_wrapGenerate, logger, middleware, mockResult, mockParams, doGenerate;
236
+ return _ts_generator(this, function(_state) {
237
+ switch(_state.label){
238
+ case 0:
239
+ logger = createMockLogger();
240
+ middleware = createLoggingMiddleware({
241
+ logger: logger,
242
+ verbose: true
243
+ });
244
+ mockResult = createMockGenerateResult();
245
+ mockParams = {
246
+ prompt: 'Hello'
247
+ };
248
+ doGenerate = vi.fn().mockResolvedValue(mockResult);
249
+ return [
250
+ 4,
251
+ (_middleware_wrapGenerate = middleware.wrapGenerate) === null || _middleware_wrapGenerate === void 0 ? void 0 : _middleware_wrapGenerate.call(middleware, {
252
+ doGenerate: doGenerate,
253
+ doStream: vi.fn(),
254
+ params: mockParams,
255
+ model: {}
256
+ })
257
+ ];
258
+ case 1:
259
+ _state.sent();
260
+ expect(logger.debug).toHaveBeenNthCalledWith(1, 'Model request started', expect.objectContaining({
261
+ params: mockParams
262
+ }));
263
+ expect(logger.debug).toHaveBeenNthCalledWith(2, 'Model request completed', expect.objectContaining({
264
+ content: mockResult.content
265
+ }));
266
+ return [
267
+ 2
268
+ ];
269
+ }
270
+ });
271
+ })();
272
+ });
273
+ });
274
+ describe('wrapStream', function() {
275
+ it('logs stream start on success', function() {
276
+ return _async_to_generator(function() {
277
+ var _middleware_wrapStream, logger, middleware, mockResult, doStream, result;
278
+ return _ts_generator(this, function(_state) {
279
+ switch(_state.label){
280
+ case 0:
281
+ logger = createMockLogger();
282
+ middleware = createLoggingMiddleware({
283
+ logger: logger
284
+ });
285
+ mockResult = createMockStreamResult();
286
+ doStream = vi.fn().mockResolvedValue(mockResult);
287
+ return [
288
+ 4,
289
+ (_middleware_wrapStream = middleware.wrapStream) === null || _middleware_wrapStream === void 0 ? void 0 : _middleware_wrapStream.call(middleware, {
290
+ doGenerate: vi.fn(),
291
+ doStream: doStream,
292
+ params: {},
293
+ model: {}
294
+ })
295
+ ];
296
+ case 1:
297
+ result = _state.sent();
298
+ expect(logger.debug).toHaveBeenCalledWith('Model stream started', {});
299
+ expect(result === null || result === void 0 ? void 0 : result.stream).toBe(mockResult.stream);
300
+ return [
301
+ 2
302
+ ];
303
+ }
304
+ });
305
+ })();
306
+ });
307
+ it('logs error on stream failure', function() {
308
+ return _async_to_generator(function() {
309
+ var _middleware_wrapStream, logger, middleware, error, doStream;
310
+ return _ts_generator(this, function(_state) {
311
+ switch(_state.label){
312
+ case 0:
313
+ logger = createMockLogger();
314
+ middleware = createLoggingMiddleware({
315
+ logger: logger
316
+ });
317
+ error = new Error('Stream error');
318
+ doStream = vi.fn().mockRejectedValue(error);
319
+ return [
320
+ 4,
321
+ expect((_middleware_wrapStream = middleware.wrapStream) === null || _middleware_wrapStream === void 0 ? void 0 : _middleware_wrapStream.call(middleware, {
322
+ doGenerate: vi.fn(),
323
+ doStream: doStream,
324
+ params: {},
325
+ model: {}
326
+ })).rejects.toThrow('Stream error')
327
+ ];
328
+ case 1:
329
+ _state.sent();
330
+ expect(logger.error).toHaveBeenCalledWith('Model stream failed', expect.objectContaining({
331
+ durationMs: expect.any(Number),
332
+ error: 'Stream error'
333
+ }));
334
+ return [
335
+ 2
336
+ ];
337
+ }
338
+ });
339
+ })();
340
+ });
341
+ it('includes params when verbose is true', function() {
342
+ return _async_to_generator(function() {
343
+ var _middleware_wrapStream, logger, middleware, mockResult, mockParams, doStream;
344
+ return _ts_generator(this, function(_state) {
345
+ switch(_state.label){
346
+ case 0:
347
+ logger = createMockLogger();
348
+ middleware = createLoggingMiddleware({
349
+ logger: logger,
350
+ verbose: true
351
+ });
352
+ mockResult = createMockStreamResult();
353
+ mockParams = {
354
+ prompt: 'Hello'
355
+ };
356
+ doStream = vi.fn().mockResolvedValue(mockResult);
357
+ return [
358
+ 4,
359
+ (_middleware_wrapStream = middleware.wrapStream) === null || _middleware_wrapStream === void 0 ? void 0 : _middleware_wrapStream.call(middleware, {
360
+ doGenerate: vi.fn(),
361
+ doStream: doStream,
362
+ params: mockParams,
363
+ model: {}
364
+ })
365
+ ];
366
+ case 1:
367
+ _state.sent();
368
+ expect(logger.debug).toHaveBeenCalledWith('Model stream started', expect.objectContaining({
369
+ params: mockParams
370
+ }));
371
+ return [
372
+ 2
373
+ ];
374
+ }
375
+ });
376
+ })();
377
+ });
378
+ });
379
+ describe('middleware structure', function() {
380
+ it('returns middleware with v2 version', function() {
381
+ var logger = createMockLogger();
382
+ var middleware = createLoggingMiddleware({
383
+ logger: logger
384
+ });
385
+ expect(middleware.middlewareVersion).toBe('v2');
386
+ });
387
+ });
388
+ });
389
+
390
+ //# sourceMappingURL=logging.middleware.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/middleware/__tests__/logging.middleware.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from 'vitest';\n\nimport { createLoggingMiddleware } from '../logging.middleware.js';\n\nfunction createMockLogger() {\n const logger = {\n child: vi.fn(() => logger),\n debug: vi.fn(),\n error: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n };\n return logger;\n}\n\nfunction createMockGenerateResult() {\n return {\n content: [{ type: 'text' as const, text: 'Hello world' }],\n finishReason: 'stop' as const,\n usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },\n warnings: [],\n };\n}\n\nfunction createMockStreamResult() {\n return {\n stream: new ReadableStream(),\n warnings: [],\n };\n}\n\ndescribe('createLoggingMiddleware', () => {\n describe('wrapGenerate', () => {\n it('logs request start and completion on success', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const mockResult = createMockGenerateResult();\n const doGenerate = vi.fn().mockResolvedValue(mockResult);\n\n const result = await middleware.wrapGenerate?.({\n doGenerate,\n doStream: vi.fn(),\n params: {} as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenCalledTimes(2);\n expect(logger.debug).toHaveBeenNthCalledWith(1, 'Model request started', {});\n expect(logger.debug).toHaveBeenNthCalledWith(\n 2,\n 'Model request completed',\n expect.objectContaining({\n durationMs: expect.any(Number),\n finishReason: 'stop',\n usage: mockResult.usage,\n }),\n );\n expect(result).toBe(mockResult);\n });\n\n it('logs error on failure', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const error = new Error('API error');\n const doGenerate = vi.fn().mockRejectedValue(error);\n\n await expect(\n middleware.wrapGenerate?.({\n doGenerate,\n doStream: vi.fn(),\n params: {} as never,\n model: {} as never,\n }),\n ).rejects.toThrow('API error');\n\n expect(logger.debug).toHaveBeenCalledWith('Model request started', {});\n expect(logger.error).toHaveBeenCalledWith(\n 'Model request failed',\n expect.objectContaining({\n durationMs: expect.any(Number),\n error: 'API error',\n }),\n );\n });\n\n it('includes params and content when verbose is true', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger, verbose: true });\n const mockResult = createMockGenerateResult();\n const mockParams = { prompt: 'Hello' };\n const doGenerate = vi.fn().mockResolvedValue(mockResult);\n\n await middleware.wrapGenerate?.({\n doGenerate,\n doStream: vi.fn(),\n params: mockParams as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenNthCalledWith(\n 1,\n 'Model request started',\n expect.objectContaining({ params: mockParams }),\n );\n expect(logger.debug).toHaveBeenNthCalledWith(\n 2,\n 'Model request completed',\n expect.objectContaining({ content: mockResult.content }),\n );\n });\n });\n\n describe('wrapStream', () => {\n it('logs stream start on success', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const mockResult = createMockStreamResult();\n const doStream = vi.fn().mockResolvedValue(mockResult);\n\n const result = await middleware.wrapStream?.({\n doGenerate: vi.fn(),\n doStream,\n params: {} as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenCalledWith('Model stream started', {});\n expect(result?.stream).toBe(mockResult.stream);\n });\n\n it('logs error on stream failure', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n const error = new Error('Stream error');\n const doStream = vi.fn().mockRejectedValue(error);\n\n await expect(\n middleware.wrapStream?.({\n doGenerate: vi.fn(),\n doStream,\n params: {} as never,\n model: {} as never,\n }),\n ).rejects.toThrow('Stream error');\n\n expect(logger.error).toHaveBeenCalledWith(\n 'Model stream failed',\n expect.objectContaining({\n durationMs: expect.any(Number),\n error: 'Stream error',\n }),\n );\n });\n\n it('includes params when verbose is true', async () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger, verbose: true });\n const mockResult = createMockStreamResult();\n const mockParams = { prompt: 'Hello' };\n const doStream = vi.fn().mockResolvedValue(mockResult);\n\n await middleware.wrapStream?.({\n doGenerate: vi.fn(),\n doStream,\n params: mockParams as never,\n model: {} as never,\n });\n\n expect(logger.debug).toHaveBeenCalledWith(\n 'Model stream started',\n expect.objectContaining({ params: mockParams }),\n );\n });\n });\n\n describe('middleware structure', () => {\n it('returns middleware with v2 version', () => {\n const logger = createMockLogger();\n const middleware = createLoggingMiddleware({ logger });\n\n expect(middleware.middlewareVersion).toBe('v2');\n });\n });\n});\n"],"names":["describe","expect","it","vi","createLoggingMiddleware","createMockLogger","logger","child","fn","debug","error","info","warn","createMockGenerateResult","content","type","text","finishReason","usage","inputTokens","outputTokens","totalTokens","warnings","createMockStreamResult","stream","ReadableStream","middleware","mockResult","doGenerate","result","mockResolvedValue","wrapGenerate","doStream","params","model","toHaveBeenCalledTimes","toHaveBeenNthCalledWith","objectContaining","durationMs","any","Number","toBe","Error","mockRejectedValue","rejects","toThrow","toHaveBeenCalledWith","mockParams","verbose","prompt","wrapStream","middlewareVersion"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { LoggerPort } from '@jterrazz/logger';
2
+ import type { LanguageModelMiddleware } from 'ai';
3
+ export interface LoggingMiddlewareOptions {
4
+ logger: LoggerPort;
5
+ /** Include request/response details in logs (default: false) */
6
+ verbose?: boolean;
7
+ }
8
+ /**
9
+ * Creates AI SDK middleware that logs model requests and responses.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { wrapLanguageModel } from 'ai';
14
+ *
15
+ * const model = wrapLanguageModel({
16
+ * model: openrouter('anthropic/claude-sonnet-4-20250514'),
17
+ * middleware: createLoggingMiddleware({ logger }),
18
+ * });
19
+ * ```
20
+ */
21
+ export declare function createLoggingMiddleware(options: LoggingMiddlewareOptions): LanguageModelMiddleware;