@jterrazz/intelligence 2.0.0 → 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 (113) hide show
  1. package/README.md +56 -268
  2. package/dist/index.cjs +656 -2017
  3. package/dist/index.d.ts +5 -15
  4. package/dist/index.js +5 -33
  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 +14 -15
  32. package/dist/adapters/agents/chat-agent.adapter.d.ts +0 -27
  33. package/dist/adapters/agents/chat-agent.adapter.js +0 -356
  34. package/dist/adapters/agents/chat-agent.adapter.js.map +0 -1
  35. package/dist/adapters/agents/resilient-agent.adapter.d.ts +0 -20
  36. package/dist/adapters/agents/resilient-agent.adapter.js +0 -263
  37. package/dist/adapters/agents/resilient-agent.adapter.js.map +0 -1
  38. package/dist/adapters/agents/tool-agent.adapter.d.ts +0 -30
  39. package/dist/adapters/agents/tool-agent.adapter.js +0 -400
  40. package/dist/adapters/agents/tool-agent.adapter.js.map +0 -1
  41. package/dist/adapters/models/openrouter-model.adapter.d.ts +0 -23
  42. package/dist/adapters/models/openrouter-model.adapter.js +0 -148
  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/providers/openrouter-provider.adapter.d.ts +0 -34
  84. package/dist/adapters/providers/openrouter-provider.adapter.js +0 -57
  85. package/dist/adapters/providers/openrouter-provider.adapter.js.map +0 -1
  86. package/dist/adapters/tools/safe-tool.adapter.d.ts +0 -27
  87. package/dist/adapters/tools/safe-tool.adapter.js +0 -283
  88. package/dist/adapters/tools/safe-tool.adapter.js.map +0 -1
  89. package/dist/adapters/utils/__tests__/structured-response-parser.test.js +0 -289
  90. package/dist/adapters/utils/__tests__/structured-response-parser.test.js.map +0 -1
  91. package/dist/adapters/utils/structured-response-parser-error.d.ts +0 -8
  92. package/dist/adapters/utils/structured-response-parser-error.js +0 -136
  93. package/dist/adapters/utils/structured-response-parser-error.js.map +0 -1
  94. package/dist/adapters/utils/structured-response-parser.d.ts +0 -60
  95. package/dist/adapters/utils/structured-response-parser.js +0 -347
  96. package/dist/adapters/utils/structured-response-parser.js.map +0 -1
  97. package/dist/ports/agent.port.d.ts +0 -17
  98. package/dist/ports/agent.port.js +0 -7
  99. package/dist/ports/agent.port.js.map +0 -1
  100. package/dist/ports/model.port.d.ts +0 -37
  101. package/dist/ports/model.port.js +0 -5
  102. package/dist/ports/model.port.js.map +0 -1
  103. package/dist/ports/prompt.port.d.ts +0 -9
  104. package/dist/ports/prompt.port.js +0 -5
  105. package/dist/ports/prompt.port.js.map +0 -1
  106. package/dist/ports/provider.port.d.ts +0 -13
  107. package/dist/ports/provider.port.js +0 -5
  108. package/dist/ports/provider.port.js.map +0 -1
  109. package/dist/ports/tool.port.d.ts +0 -11
  110. package/dist/ports/tool.port.js +0 -5
  111. package/dist/ports/tool.port.js.map +0 -1
  112. /package/dist/{adapters/prompts/__tests__/presets.test.d.ts → middleware/__tests__/logging.middleware.test.d.ts} +0 -0
  113. /package/dist/{adapters/utils/__tests__/structured-response-parser.test.d.ts → parsing/__tests__/create-schema-prompt.test.d.ts} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,15 +1,5 @@
1
- export { ChatAgent, type ChatAgentOptions } from './adapters/agents/chat-agent.adapter.js';
2
- export { ResilientAgent, type ResilientAgentOptions, } from './adapters/agents/resilient-agent.adapter.js';
3
- export { ToolAgent, type ToolAgentOptions } from './adapters/agents/tool-agent.adapter.js';
4
- export { OpenRouterModel } from './adapters/models/openrouter-model.adapter.js';
5
- export { PROMPT_LIBRARY as PROMPTS } from './adapters/prompts/library/index.js';
6
- export { SystemPrompt } from './adapters/prompts/system-prompt.adapter.js';
7
- export { UserPrompt } from './adapters/prompts/user-prompt.adapter.js';
8
- export { type OpenRouterConfig, type OpenRouterMetadata, OpenRouterProvider, } from './adapters/providers/openrouter-provider.adapter.js';
9
- export { SafeTool } from './adapters/tools/safe-tool.adapter.js';
10
- export { StructuredResponseParser } from './adapters/utils/structured-response-parser.js';
11
- export * from './ports/agent.port.js';
12
- export * from './ports/model.port.js';
13
- export * from './ports/prompt.port.js';
14
- export * from './ports/provider.port.js';
15
- 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,35 +1,7 @@
1
- // =============================================================================
2
- // AGENTS
3
- // =============================================================================
4
- export { ChatAgent } from './adapters/agents/chat-agent.adapter.js';
5
- export { ResilientAgent } from './adapters/agents/resilient-agent.adapter.js';
6
- export { ToolAgent } from './adapters/agents/tool-agent.adapter.js';
7
- // =============================================================================
8
- // MODEL PROVIDERS
9
- // =============================================================================
10
- export { OpenRouterModel } from './adapters/models/openrouter-model.adapter.js';
11
- export { PROMPT_LIBRARY as PROMPTS } from './adapters/prompts/library/index.js';
12
- // =============================================================================
13
- // PROMPTS
14
- // =============================================================================
15
- export { SystemPrompt } from './adapters/prompts/system-prompt.adapter.js';
16
- export { UserPrompt } from './adapters/prompts/user-prompt.adapter.js';
17
- export { OpenRouterProvider } from './adapters/providers/openrouter-provider.adapter.js';
18
- // =============================================================================
19
- // TOOLS
20
- // =============================================================================
21
- export { SafeTool } from './adapters/tools/safe-tool.adapter.js';
22
- // =============================================================================
23
- // UTILITIES
24
- // =============================================================================
25
- export { StructuredResponseParser } from './adapters/utils/structured-response-parser.js';
26
- // =============================================================================
27
- // PORTS (Interfaces)
28
- // =============================================================================
29
- export * from './ports/agent.port.js';
30
- export * from './ports/model.port.js';
31
- export * from './ports/prompt.port.js';
32
- export * from './ports/provider.port.js';
33
- 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';
34
6
 
35
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// =============================================================================\n// AGENTS\n// =============================================================================\n\nexport { ChatAgent, type ChatAgentOptions } from './adapters/agents/chat-agent.adapter.js';\n\nexport {\n ResilientAgent,\n type ResilientAgentOptions,\n} from './adapters/agents/resilient-agent.adapter.js';\n\nexport { ToolAgent, type ToolAgentOptions } from './adapters/agents/tool-agent.adapter.js';\n\n// =============================================================================\n// MODEL PROVIDERS\n// =============================================================================\n\nexport { OpenRouterModel } from './adapters/models/openrouter-model.adapter.js';\n\nexport { PROMPT_LIBRARY as PROMPTS } from './adapters/prompts/library/index.js';\n\n// =============================================================================\n// PROMPTS\n// =============================================================================\n\nexport { SystemPrompt } from './adapters/prompts/system-prompt.adapter.js';\nexport { UserPrompt } from './adapters/prompts/user-prompt.adapter.js';\nexport {\n type OpenRouterConfig,\n type OpenRouterMetadata,\n OpenRouterProvider,\n} from './adapters/providers/openrouter-provider.adapter.js';\n\n// =============================================================================\n// TOOLS\n// =============================================================================\n\nexport { SafeTool } from './adapters/tools/safe-tool.adapter.js';\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\nexport { StructuredResponseParser } from './adapters/utils/structured-response-parser.js';\n\n// =============================================================================\n// PORTS (Interfaces)\n// =============================================================================\n\nexport * from './ports/agent.port.js';\nexport * from './ports/model.port.js';\nexport * from './ports/prompt.port.js';\nexport * from './ports/provider.port.js';\nexport * from './ports/tool.port.js';\n"],"names":["ChatAgent","ResilientAgent","ToolAgent","OpenRouterModel","PROMPT_LIBRARY","PROMPTS","SystemPrompt","UserPrompt","OpenRouterProvider","SafeTool","StructuredResponseParser"],"mappings":"AAAA,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,SAASA,SAAS,QAA+B,0CAA0C;AAE3F,SACIC,cAAc,QAEX,+CAA+C;AAEtD,SAASC,SAAS,QAA+B,0CAA0C;AAE3F,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,SAASC,eAAe,QAAQ,gDAAgD;AAEhF,SAASC,kBAAkBC,OAAO,QAAQ,sCAAsC;AAEhF,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAASC,YAAY,QAAQ,8CAA8C;AAC3E,SAASC,UAAU,QAAQ,4CAA4C;AACvE,SAGIC,kBAAkB,QACf,sDAAsD;AAE7D,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,SAASC,QAAQ,QAAQ,wCAAwC;AAEjE,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,SAASC,wBAAwB,QAAQ,iDAAiD;AAE1F,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF,cAAc,wBAAwB;AACtC,cAAc,wBAAwB;AACtC,cAAc,yBAAyB;AACvC,cAAc,2BAA2B;AACzC,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;