@mastra/loggers 1.3.6-alpha.0 → 1.3.6-alpha.2
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.
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/docs/references/reference-logging-pino-logger.md +4 -4
- package/dist/file/index.cjs +10 -7
- package/dist/file/index.cjs.map +1 -1
- package/dist/file/index.d.ts +1 -1
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +11 -8
- package/dist/file/index.js.map +1 -1
- package/package.json +2 -2
package/dist/docs/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: mastra-loggers
|
|
|
3
3
|
description: Documentation for @mastra/loggers. Use when working with @mastra/loggers APIs, configuration, or implementation.
|
|
4
4
|
metadata:
|
|
5
5
|
package: "@mastra/loggers"
|
|
6
|
-
version: "1.3.6-alpha.
|
|
6
|
+
version: "1.3.6-alpha.2"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## When to use
|
|
@@ -98,7 +98,7 @@ Writes structured logs to a file using the `FileTransport`. The logger accepts a
|
|
|
98
98
|
|
|
99
99
|
```typescript
|
|
100
100
|
import { FileTransport } from '@mastra/loggers/file'
|
|
101
|
-
import { PinoLogger } from '@mastra/loggers
|
|
101
|
+
import { PinoLogger } from '@mastra/loggers'
|
|
102
102
|
|
|
103
103
|
export const fileLogger = new PinoLogger({
|
|
104
104
|
name: 'Mastra',
|
|
@@ -122,7 +122,7 @@ Streams structured logs to a remote Redis list using the `UpstashTransport`. The
|
|
|
122
122
|
|
|
123
123
|
```typescript
|
|
124
124
|
import { UpstashTransport } from '@mastra/loggers/upstash'
|
|
125
|
-
import { PinoLogger } from '@mastra/loggers
|
|
125
|
+
import { PinoLogger } from '@mastra/loggers'
|
|
126
126
|
|
|
127
127
|
export const upstashLogger = new PinoLogger({
|
|
128
128
|
name: 'Mastra',
|
|
@@ -156,8 +156,8 @@ You can create custom transports using the `createCustomTransport` utility to in
|
|
|
156
156
|
Creates a custom transport using `createCustomTransport` and integrates it with a third-party logging stream such as `pino-sentry-transport`. The custom transport forwards logs to an external system such as Sentry for advanced monitoring and observability.
|
|
157
157
|
|
|
158
158
|
```typescript
|
|
159
|
-
import { createCustomTransport } from '@mastra/core/
|
|
160
|
-
import { PinoLogger } from '@mastra/loggers
|
|
159
|
+
import { createCustomTransport } from '@mastra/core/logger'
|
|
160
|
+
import { PinoLogger } from '@mastra/loggers'
|
|
161
161
|
import pinoSentry from 'pino-sentry-transport'
|
|
162
162
|
|
|
163
163
|
const sentryStream = await pinoSentry({
|
package/dist/file/index.cjs
CHANGED
|
@@ -9,19 +9,22 @@ var FileTransport = class extends _mastra_core_logger.LoggerTransport {
|
|
|
9
9
|
constructor({ path }) {
|
|
10
10
|
super({ objectMode: true });
|
|
11
11
|
this.path = path;
|
|
12
|
-
if (!(0, fs.existsSync)(this.path))
|
|
13
|
-
|
|
14
|
-
throw new Error("File path does not exist");
|
|
15
|
-
}
|
|
12
|
+
if (!(0, fs.existsSync)(this.path)) throw new Error("File path does not exist");
|
|
13
|
+
if (!(0, fs.statSync)(this.path).isFile()) throw new Error(`File path must point to a file: ${this.path}`);
|
|
16
14
|
this.fileStream = (0, fs.createWriteStream)(this.path, { flags: "a" });
|
|
15
|
+
this.fileStream.on("error", (error) => {
|
|
16
|
+
if (!this.destroyed) this.destroy(error);
|
|
17
|
+
});
|
|
17
18
|
}
|
|
18
19
|
_transform(chunk, _encoding, callback) {
|
|
19
20
|
try {
|
|
20
|
-
this.fileStream.write(chunk)
|
|
21
|
+
this.fileStream.write(chunk, (error) => {
|
|
22
|
+
if (error) callback(error);
|
|
23
|
+
else callback(null, chunk);
|
|
24
|
+
});
|
|
21
25
|
} catch (error) {
|
|
22
|
-
|
|
26
|
+
callback(error);
|
|
23
27
|
}
|
|
24
|
-
callback(null, chunk);
|
|
25
28
|
}
|
|
26
29
|
_flush(callback) {
|
|
27
30
|
this.fileStream.end(() => {
|
package/dist/file/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["LoggerTransport","#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["LoggerTransport","#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n throw new Error('File path does not exist');\n }\n\n if (!statSync(this.path).isFile()) {\n throw new Error(`File path must point to a file: ${this.path}`);\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n // Without a listener, the file stream's 'error' event would crash the process.\n // Write failures already reach the transport through the write callback, so only\n // forward errors that have not destroyed the transport yet (e.g. open failures).\n this.fileStream.on('error', error => {\n if (!this.destroyed) this.destroy(error);\n });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk?: any) => void) {\n try {\n this.fileStream.write(chunk, error => {\n if (error) callback(error);\n else callback(null, chunk);\n });\n } catch (error) {\n callback(error as Error);\n }\n }\n\n _flush(callback: Function) {\n // End the file stream when transform stream ends\n this.fileStream.end(() => {\n callback();\n });\n }\n\n _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n if (typeof callback === 'function') {\n this._transform(chunk, encoding || 'utf8', callback);\n return true;\n }\n\n this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n if (error) console.error('Transform error in write:', error);\n });\n return true;\n }\n\n // Clean up resources\n _destroy(error: Error, callback: Function) {\n if (this.fileStream) {\n this.fileStream.destroy(error);\n }\n callback(error);\n }\n\n async listLogs(params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean; // default true\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs(params || {});\n } catch (error) {\n console.error('Error getting logs from file:', error);\n return { logs: [], total: 0, page: 0, perPage: 0, hasMore: false };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n }: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs({ runId, fromDate, toDate, logLevel, filters, page, perPage });\n } catch (error) {\n console.error('Error getting logs by runId from file:', error);\n return { logs: [], total: 0, page: 0, perPage: 0, hasMore: false };\n }\n }\n\n /**\n * Streams the log file line by line, counting every matching record but\n * retaining only the requested page (or all matches when pagination is off).\n */\n async #queryLogs({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults = true,\n page: pageInput,\n perPage: perPageInput,\n }: {\n runId?: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean;\n page?: number;\n perPage?: number;\n }) {\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = (perPageInput ?? 100) || 100;\n const start = (page - 1) * perPage;\n const end = start + perPage;\n const filterEntries = Object.entries(filters ?? {});\n\n const logs: BaseLogMessage[] = [];\n let total = 0;\n\n const lines = createInterface({ input: createReadStream(this.path, 'utf8'), crlfDelay: Infinity });\n for await (const line of lines) {\n if (!line.trim()) continue;\n\n let log: any;\n try {\n log = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (log === null || typeof log !== 'object') continue;\n if (runId !== undefined && log.runId !== runId) continue;\n if (!filterEntries.every(([key, value]) => log[key] === value)) continue;\n if (logLevel && log.level !== logLevel) continue;\n if (fromDate && !(new Date(log.time).getTime() >= fromDate.getTime())) continue;\n if (toDate && !(new Date(log.time).getTime() <= toDate.getTime())) continue;\n\n if (!returnPaginationResults || (total >= start && total < end)) {\n logs.push(log);\n }\n total++;\n }\n\n if (!returnPaginationResults) {\n return { logs, total, page, perPage: total, hasMore: false };\n }\n\n return { logs, total, page, perPage, hasMore: end < total };\n }\n}\n"],"mappings":"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"}
|
package/dist/file/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare class FileTransport extends LoggerTransport {
|
|
|
8
8
|
constructor({ path }: {
|
|
9
9
|
path: string;
|
|
10
10
|
});
|
|
11
|
-
_transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk
|
|
11
|
+
_transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk?: any) => void): void;
|
|
12
12
|
_flush(callback: Function): void;
|
|
13
13
|
_write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean;
|
|
14
14
|
_destroy(error: Error, callback: Function): void;
|
package/dist/file/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpE,qBAAa,aAAc,SAAQ,eAAe;;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,WAAW,CAAC;IACxB,YAAY,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpE,qBAAa,aAAc,SAAQ,eAAe;;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,WAAW,CAAC;IACxB,YAAY,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAmBrC;IAED,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,QAS7F;IAED,MAAM,CAAC,QAAQ,EAAE,QAAQ,QAKxB;IAED,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAUxF;IAGD,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAKxC;IAEK,QAAQ,CAAC,MAAM,CAAC,EAAE;QACtB,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,MAAM,CAAC,EAAE,IAAI,CAAC;QACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAClC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAOD;IAEK,eAAe,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,EACJ,OAAO,GACR,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,MAAM,CAAC,EAAE,IAAI,CAAC;QACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,cAAc,EAAE,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAOD;CAgEF"}
|
package/dist/file/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LoggerTransport } from "@mastra/core/logger";
|
|
2
|
-
import { createReadStream, createWriteStream, existsSync } from "fs";
|
|
2
|
+
import { createReadStream, createWriteStream, existsSync, statSync } from "fs";
|
|
3
3
|
import { createInterface } from "readline";
|
|
4
4
|
//#region src/file/index.ts
|
|
5
5
|
var FileTransport = class extends LoggerTransport {
|
|
@@ -8,19 +8,22 @@ var FileTransport = class extends LoggerTransport {
|
|
|
8
8
|
constructor({ path }) {
|
|
9
9
|
super({ objectMode: true });
|
|
10
10
|
this.path = path;
|
|
11
|
-
if (!existsSync(this.path))
|
|
12
|
-
|
|
13
|
-
throw new Error("File path does not exist");
|
|
14
|
-
}
|
|
11
|
+
if (!existsSync(this.path)) throw new Error("File path does not exist");
|
|
12
|
+
if (!statSync(this.path).isFile()) throw new Error(`File path must point to a file: ${this.path}`);
|
|
15
13
|
this.fileStream = createWriteStream(this.path, { flags: "a" });
|
|
14
|
+
this.fileStream.on("error", (error) => {
|
|
15
|
+
if (!this.destroyed) this.destroy(error);
|
|
16
|
+
});
|
|
16
17
|
}
|
|
17
18
|
_transform(chunk, _encoding, callback) {
|
|
18
19
|
try {
|
|
19
|
-
this.fileStream.write(chunk)
|
|
20
|
+
this.fileStream.write(chunk, (error) => {
|
|
21
|
+
if (error) callback(error);
|
|
22
|
+
else callback(null, chunk);
|
|
23
|
+
});
|
|
20
24
|
} catch (error) {
|
|
21
|
-
|
|
25
|
+
callback(error);
|
|
22
26
|
}
|
|
23
|
-
callback(null, chunk);
|
|
24
27
|
}
|
|
25
28
|
_flush(callback) {
|
|
26
29
|
this.fileStream.end(() => {
|
package/dist/file/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n
|
|
1
|
+
{"version":3,"file":"index.js","names":["#queryLogs"],"sources":["../../src/file/index.ts"],"sourcesContent":["import type { WriteStream } from 'node:fs';\nimport { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport { LoggerTransport } from '@mastra/core/logger';\nimport type { BaseLogMessage, LogLevel } from '@mastra/core/logger';\n\nexport class FileTransport extends LoggerTransport {\n path: string;\n fileStream: WriteStream;\n constructor({ path }: { path: string }) {\n super({ objectMode: true });\n this.path = path;\n\n if (!existsSync(this.path)) {\n throw new Error('File path does not exist');\n }\n\n if (!statSync(this.path).isFile()) {\n throw new Error(`File path must point to a file: ${this.path}`);\n }\n\n this.fileStream = createWriteStream(this.path, { flags: 'a' });\n // Without a listener, the file stream's 'error' event would crash the process.\n // Write failures already reach the transport through the write callback, so only\n // forward errors that have not destroyed the transport yet (e.g. open failures).\n this.fileStream.on('error', error => {\n if (!this.destroyed) this.destroy(error);\n });\n }\n\n _transform(chunk: any, _encoding: string, callback: (error: Error | null, chunk?: any) => void) {\n try {\n this.fileStream.write(chunk, error => {\n if (error) callback(error);\n else callback(null, chunk);\n });\n } catch (error) {\n callback(error as Error);\n }\n }\n\n _flush(callback: Function) {\n // End the file stream when transform stream ends\n this.fileStream.end(() => {\n callback();\n });\n }\n\n _write(chunk: any, encoding?: string, callback?: (error?: Error | null) => void): boolean {\n if (typeof callback === 'function') {\n this._transform(chunk, encoding || 'utf8', callback);\n return true;\n }\n\n this._transform(chunk, encoding || 'utf8', (error: Error | null) => {\n if (error) console.error('Transform error in write:', error);\n });\n return true;\n }\n\n // Clean up resources\n _destroy(error: Error, callback: Function) {\n if (this.fileStream) {\n this.fileStream.destroy(error);\n }\n callback(error);\n }\n\n async listLogs(params?: {\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean; // default true\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs(params || {});\n } catch (error) {\n console.error('Error getting logs from file:', error);\n return { logs: [], total: 0, page: 0, perPage: 0, hasMore: false };\n }\n }\n\n async listLogsByRunId({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n page,\n perPage,\n }: {\n runId: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n page?: number;\n perPage?: number;\n }): Promise<{\n logs: BaseLogMessage[];\n total: number;\n page: number;\n perPage: number;\n hasMore: boolean;\n }> {\n try {\n return await this.#queryLogs({ runId, fromDate, toDate, logLevel, filters, page, perPage });\n } catch (error) {\n console.error('Error getting logs by runId from file:', error);\n return { logs: [], total: 0, page: 0, perPage: 0, hasMore: false };\n }\n }\n\n /**\n * Streams the log file line by line, counting every matching record but\n * retaining only the requested page (or all matches when pagination is off).\n */\n async #queryLogs({\n runId,\n fromDate,\n toDate,\n logLevel,\n filters,\n returnPaginationResults = true,\n page: pageInput,\n perPage: perPageInput,\n }: {\n runId?: string;\n fromDate?: Date;\n toDate?: Date;\n logLevel?: LogLevel;\n filters?: Record<string, any>;\n returnPaginationResults?: boolean;\n page?: number;\n perPage?: number;\n }) {\n const page = pageInput === 0 ? 1 : (pageInput ?? 1);\n const perPage = (perPageInput ?? 100) || 100;\n const start = (page - 1) * perPage;\n const end = start + perPage;\n const filterEntries = Object.entries(filters ?? {});\n\n const logs: BaseLogMessage[] = [];\n let total = 0;\n\n const lines = createInterface({ input: createReadStream(this.path, 'utf8'), crlfDelay: Infinity });\n for await (const line of lines) {\n if (!line.trim()) continue;\n\n let log: any;\n try {\n log = JSON.parse(line);\n } catch {\n continue;\n }\n\n if (log === null || typeof log !== 'object') continue;\n if (runId !== undefined && log.runId !== runId) continue;\n if (!filterEntries.every(([key, value]) => log[key] === value)) continue;\n if (logLevel && log.level !== logLevel) continue;\n if (fromDate && !(new Date(log.time).getTime() >= fromDate.getTime())) continue;\n if (toDate && !(new Date(log.time).getTime() <= toDate.getTime())) continue;\n\n if (!returnPaginationResults || (total >= start && total < end)) {\n logs.push(log);\n }\n total++;\n }\n\n if (!returnPaginationResults) {\n return { logs, total, page, perPage: total, hasMore: false };\n }\n\n return { logs, total, page, perPage, hasMore: end < total };\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/loggers",
|
|
3
|
-
"version": "1.3.6-alpha.
|
|
3
|
+
"version": "1.3.6-alpha.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"vitest": "4.1.11",
|
|
79
79
|
"@internal/lint": "0.0.141",
|
|
80
80
|
"@internal/types-builder": "0.0.116",
|
|
81
|
-
"@mastra/core": "1.76.0-alpha.
|
|
81
|
+
"@mastra/core": "1.76.0-alpha.2"
|
|
82
82
|
},
|
|
83
83
|
"peerDependencies": {
|
|
84
84
|
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|