evlog 2.19.2 → 2.21.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.
- package/README.md +30 -1
- package/dist/adapters/axiom.d.mts +1 -1
- package/dist/adapters/axiom.mjs +2 -2
- package/dist/adapters/better-stack.d.mts +1 -1
- package/dist/adapters/better-stack.mjs +2 -2
- package/dist/adapters/datadog.d.mts +1 -1
- package/dist/adapters/datadog.mjs +2 -2
- package/dist/adapters/fs.d.mts +1 -1
- package/dist/adapters/fs.mjs +1 -1
- package/dist/adapters/hyperdx.d.mts +1 -1
- package/dist/adapters/hyperdx.mjs +1 -1
- package/dist/adapters/memory.d.mts +1 -1
- package/dist/adapters/memory.mjs +1 -1
- package/dist/adapters/otlp.d.mts +1 -1
- package/dist/adapters/otlp.mjs +2 -2
- package/dist/adapters/posthog.d.mts +1 -1
- package/dist/adapters/posthog.mjs +2 -2
- package/dist/adapters/sentry.d.mts +1 -1
- package/dist/adapters/sentry.mjs +2 -2
- package/dist/ai/index.d.mts +39 -16
- package/dist/ai/index.d.mts.map +1 -1
- package/dist/ai/index.mjs +81 -16
- package/dist/ai/index.mjs.map +1 -1
- package/dist/asyncStorageScope-DnF7Xk8l.mjs +81 -0
- package/dist/asyncStorageScope-DnF7Xk8l.mjs.map +1 -0
- package/dist/{audit-CL0q7GJU.mjs → audit-BXCYMjcC.mjs} +21 -6
- package/dist/audit-BXCYMjcC.mjs.map +1 -0
- package/dist/{audit-CBfv3rl1.d.mts → audit-BZrUvjfW.d.mts} +2 -1
- package/dist/{audit-CBfv3rl1.d.mts.map → audit-BZrUvjfW.d.mts.map} +1 -1
- package/dist/audit-action.d.mts +1 -1
- package/dist/audit.d.mts +1 -1
- package/dist/audit.mjs +1 -1
- package/dist/better-auth/index.d.mts +1 -1
- package/dist/browser.d.mts +1 -1
- package/dist/{catalog-CyemiLYG.d.mts → catalog-1cQnNxR2.d.mts} +3 -3
- package/dist/{catalog-CyemiLYG.d.mts.map → catalog-1cQnNxR2.d.mts.map} +1 -1
- package/dist/catalog.d.mts +1 -1
- package/dist/{define-BuDJpV2b.d.mts → define-Ct2QyrE9.d.mts} +3 -3
- package/dist/{define-BuDJpV2b.d.mts.map → define-Ct2QyrE9.d.mts.map} +1 -1
- package/dist/{drain-6lV-g7JB.mjs → drain-AD7Mn_5_.mjs} +3 -3
- package/dist/{drain-6lV-g7JB.mjs.map → drain-AD7Mn_5_.mjs.map} +1 -1
- package/dist/elysia/index.d.mts +6 -5
- package/dist/elysia/index.d.mts.map +1 -1
- package/dist/elysia/index.mjs +11 -8
- package/dist/elysia/index.mjs.map +1 -1
- package/dist/{enrich-error-stack-next.node-BecxSKUc.mjs → enrich-error-stack-next.node-KB0Oap7R.mjs} +1 -1
- package/dist/{enrich-error-stack-next.node-BecxSKUc.mjs.map → enrich-error-stack-next.node-KB0Oap7R.mjs.map} +1 -1
- package/dist/{enricher-VdBVX4oT.d.mts → enricher-BOzt2FCi.d.mts} +2 -2
- package/dist/{enricher-VdBVX4oT.d.mts.map → enricher-BOzt2FCi.d.mts.map} +1 -1
- package/dist/enrichers.d.mts +2 -2
- package/dist/{error-CPCM5a1D.d.mts → error-BRymuv8U.d.mts} +2 -2
- package/dist/{error-CPCM5a1D.d.mts.map → error-BRymuv8U.d.mts.map} +1 -1
- package/dist/error.d.mts +1 -1
- package/dist/{errors-ZdY6Ohi6.d.mts → errors-C7qA6CAi.d.mts} +2 -2
- package/dist/{errors-ZdY6Ohi6.d.mts.map → errors-C7qA6CAi.d.mts.map} +1 -1
- package/dist/eve/index.d.mts +72 -0
- package/dist/eve/index.d.mts.map +1 -0
- package/dist/eve/index.mjs +593 -0
- package/dist/eve/index.mjs.map +1 -0
- package/dist/express/index.d.mts +2 -2
- package/dist/express/index.mjs +3 -3
- package/dist/fastify/index.d.mts +2 -2
- package/dist/fastify/index.mjs +3 -3
- package/dist/fork-S9gpZmF8.mjs +72 -0
- package/dist/fork-S9gpZmF8.mjs.map +1 -0
- package/dist/hono/index.d.mts +2 -2
- package/dist/hono/index.mjs +1 -1
- package/dist/{http-DA3RWQrm.mjs → http-CuZ6Cm2M.mjs} +2 -2
- package/dist/{http-DA3RWQrm.mjs.map → http-CuZ6Cm2M.mjs.map} +1 -1
- package/dist/http.d.mts +1 -1
- package/dist/index.d.mts +8 -8
- package/dist/index.mjs +1 -1
- package/dist/{instrumentation-create-STGmQGQt.d.mts → instrumentation-create-gSDk0leX.d.mts} +2 -2
- package/dist/{instrumentation-create-STGmQGQt.d.mts.map → instrumentation-create-gSDk0leX.d.mts.map} +1 -1
- package/dist/{integration-2PpI-bCm.mjs → integration-CeL90DtN.mjs} +3 -2
- package/dist/{integration-2PpI-bCm.mjs.map → integration-CeL90DtN.mjs.map} +1 -1
- package/dist/{logger-DWTPZ0c1.d.mts → logger-CxWz7QJ3.d.mts} +7 -3
- package/dist/logger-CxWz7QJ3.d.mts.map +1 -0
- package/dist/logger.d.mts +2 -2
- package/dist/logger.mjs +2 -2
- package/dist/{fork-Di44utlp.mjs → middleware-Cdebyfdt.mjs} +3 -69
- package/dist/middleware-Cdebyfdt.mjs.map +1 -0
- package/dist/{middleware-CjVyGyrG.d.mts → middleware-fbtEs6bq.d.mts} +2 -2
- package/dist/{middleware-CjVyGyrG.d.mts.map → middleware-fbtEs6bq.d.mts.map} +1 -1
- package/dist/nestjs/index.d.mts +2 -2
- package/dist/nestjs/index.mjs +4 -3
- package/dist/nestjs/index.mjs.map +1 -1
- package/dist/next/client.d.mts +1 -1
- package/dist/next/index.d.mts +4 -4
- package/dist/next/index.d.mts.map +1 -1
- package/dist/next/index.mjs +4 -3
- package/dist/next/index.mjs.map +1 -1
- package/dist/next/instrumentation/create.d.mts +1 -1
- package/dist/next/instrumentation/create.mjs +1 -1
- package/dist/next/instrumentation.d.mts +1 -1
- package/dist/next/stream.d.mts +1 -1
- package/dist/nitro/errorHandler.mjs +1 -1
- package/dist/nitro/module.d.mts +2 -2
- package/dist/nitro/module.mjs +1 -1
- package/dist/nitro/plugin.mjs +2 -2
- package/dist/nitro/v3/errorHandler.mjs +1 -1
- package/dist/nitro/v3/index.d.mts +2 -2
- package/dist/nitro/v3/module.d.mts +1 -1
- package/dist/nitro/v3/module.mjs +1 -1
- package/dist/nitro/v3/plugin.mjs +2 -2
- package/dist/nitro/v3/useLogger.d.mts +1 -1
- package/dist/{nitro--E4op34w.d.mts → nitro-CcN7HDnr.d.mts} +2 -2
- package/dist/{nitro--E4op34w.d.mts.map → nitro-CcN7HDnr.d.mts.map} +1 -1
- package/dist/{nitro-ClHmVj1H.mjs → nitro-DYFCSlho.mjs} +2 -2
- package/dist/{nitro-ClHmVj1H.mjs.map → nitro-DYFCSlho.mjs.map} +1 -1
- package/dist/{nitroConfigBridge-BkVWnSV3.mjs → nitroConfigBridge-lHPsE5zG.mjs} +8 -6
- package/dist/nitroConfigBridge-lHPsE5zG.mjs.map +1 -0
- package/dist/{nodeResponse-DKrYWrxk.mjs → nodeResponse-Dsl7gZUf.mjs} +1 -1
- package/dist/{nodeResponse-DKrYWrxk.mjs.map → nodeResponse-Dsl7gZUf.mjs.map} +1 -1
- package/dist/nuxt/module.d.mts +1 -1
- package/dist/nuxt/module.d.mts.map +1 -1
- package/dist/nuxt/module.mjs +44 -12
- package/dist/nuxt/module.mjs.map +1 -1
- package/dist/orpc/index.d.mts +2 -2
- package/dist/orpc/index.mjs +2 -2
- package/dist/{package-Bgs0VSDF.mjs → package-DtGhNwVN.mjs} +2 -2
- package/dist/package-DtGhNwVN.mjs.map +1 -0
- package/dist/{parseError-BwBg-iW4.d.mts → parseError-BmoJ7XeF.d.mts} +2 -2
- package/dist/parseError-BmoJ7XeF.d.mts.map +1 -0
- package/dist/react-router/index.d.mts +2 -2
- package/dist/react-router/index.mjs +3 -2
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/{register-disk-snippet-B_JyhodL.mjs → register-disk-snippet-B5svlT8-.mjs} +1 -1
- package/dist/{register-disk-snippet-B_JyhodL.mjs.map → register-disk-snippet-B5svlT8-.mjs.map} +1 -1
- package/dist/runtime/client/log.d.mts +1 -1
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs +1 -1
- package/dist/runtime/server/useLogger.d.mts +1 -1
- package/dist/runtime/utils/parseError.d.mts +2 -2
- package/dist/{storage-D4sBVffQ.mjs → storage-BeFdoGTI.mjs} +1 -1
- package/dist/{storage-D4sBVffQ.mjs.map → storage-BeFdoGTI.mjs.map} +1 -1
- package/dist/stream.d.mts +1 -1
- package/dist/stream.d.mts.map +1 -1
- package/dist/stream.mjs +7 -1
- package/dist/stream.mjs.map +1 -1
- package/dist/sveltekit/index.d.mts +2 -2
- package/dist/sveltekit/index.mjs +5 -4
- package/dist/sveltekit/index.mjs.map +1 -1
- package/dist/toolkit.d.mts +5 -5
- package/dist/toolkit.mjs +7 -6
- package/dist/types.d.mts +1 -1
- package/dist/{useLogger-DiRWGD33.d.mts → useLogger-BupVLO9_.d.mts} +2 -2
- package/dist/{useLogger-DiRWGD33.d.mts.map → useLogger-BupVLO9_.d.mts.map} +1 -1
- package/dist/{utils-XPMPENUK.d.mts → utils-D_LY-J1k.d.mts} +2 -2
- package/dist/{utils-XPMPENUK.d.mts.map → utils-D_LY-J1k.d.mts.map} +1 -1
- package/dist/utils.d.mts +1 -1
- package/dist/vite/index.d.mts +1 -1
- package/dist/workers.d.mts +1 -1
- package/dist/workers.mjs +1 -1
- package/package.json +17 -2
- package/dist/audit-CL0q7GJU.mjs.map +0 -1
- package/dist/fork-Di44utlp.mjs.map +0 -1
- package/dist/logger-DWTPZ0c1.d.mts.map +0 -1
- package/dist/nitroConfigBridge-BkVWnSV3.mjs.map +0 -1
- package/dist/package-Bgs0VSDF.mjs.map +0 -1
- package/dist/parseError-BwBg-iW4.d.mts.map +0 -1
package/dist/elysia/index.mjs
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import { t as attachForkToLogger } from "../fork-
|
|
2
|
-
import { t as defineFrameworkIntegration } from "../integration-
|
|
1
|
+
import { t as attachForkToLogger } from "../fork-S9gpZmF8.mjs";
|
|
2
|
+
import { t as defineFrameworkIntegration } from "../integration-CeL90DtN.mjs";
|
|
3
|
+
import { n as clearAsyncLocalStorage, r as patchAsyncLocalStorageEnterWith, t as bindAsyncLocalStorage } from "../asyncStorageScope-DnF7Xk8l.mjs";
|
|
3
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
5
|
import { Elysia } from "elysia";
|
|
5
6
|
//#region src/elysia/index.ts
|
|
6
7
|
const storage = new AsyncLocalStorage();
|
|
8
|
+
patchAsyncLocalStorageEnterWith(storage);
|
|
7
9
|
const activeLoggers = /* @__PURE__ */ new WeakSet();
|
|
8
10
|
/**
|
|
9
11
|
* Get the request-scoped logger from anywhere in the call stack.
|
|
10
12
|
* Must be called inside a request handled by the `evlog()` plugin.
|
|
11
13
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
* Elysia binds the logger with `enterWith()` because its lifecycle hooks are
|
|
15
|
+
* separate from the route handler. On Cloudflare Workers, a small polyfill
|
|
16
|
+
* provides `enterWith()` when the runtime omits it. Prefer `{ log }` from
|
|
17
|
+
* derive when multiple requests may interleave in the same isolate.
|
|
15
18
|
*
|
|
16
19
|
* @example
|
|
17
20
|
* ```ts
|
|
@@ -87,7 +90,7 @@ function evlog(options = {}) {
|
|
|
87
90
|
headers
|
|
88
91
|
};
|
|
89
92
|
const { logger, finish, skipped } = integration.start(ctx, options);
|
|
90
|
-
storage
|
|
93
|
+
if (!skipped) bindAsyncLocalStorage(storage, logger);
|
|
91
94
|
requestState.set(request, {
|
|
92
95
|
finish,
|
|
93
96
|
skipped,
|
|
@@ -101,7 +104,7 @@ function evlog(options = {}) {
|
|
|
101
104
|
emitted.add(request);
|
|
102
105
|
await state.finish({ status: set.status || 200 });
|
|
103
106
|
activeLoggers.delete(state.logger);
|
|
104
|
-
storage
|
|
107
|
+
clearAsyncLocalStorage(storage);
|
|
105
108
|
}).onError({ as: "global" }, async ({ request, error }) => {
|
|
106
109
|
const state = requestState.get(request);
|
|
107
110
|
if (!state || state.skipped || emitted.has(request)) return;
|
|
@@ -110,7 +113,7 @@ function evlog(options = {}) {
|
|
|
110
113
|
state.logger.error(err);
|
|
111
114
|
await state.finish({ error: err });
|
|
112
115
|
activeLoggers.delete(state.logger);
|
|
113
|
-
storage
|
|
116
|
+
clearAsyncLocalStorage(storage);
|
|
114
117
|
});
|
|
115
118
|
}
|
|
116
119
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/elysia/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport { Elysia } from 'elysia'\nimport type { AuditableLogger } from '../audit'\nimport { defineFrameworkIntegration } from '../shared/integration'\nimport type { BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\n\nconst storage = new AsyncLocalStorage<AuditableLogger>()\n\nconst activeLoggers = new WeakSet<AuditableLogger>()\n\nexport type EvlogElysiaOptions = BaseEvlogOptions\n\n/**\n * Get the request-scoped logger from anywhere in the call stack.\n * Must be called inside a request handled by the `evlog()` plugin.\n *\n *
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/elysia/index.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\nimport { Elysia } from 'elysia'\nimport type { AuditableLogger } from '../audit'\nimport {\n bindAsyncLocalStorage,\n clearAsyncLocalStorage,\n patchAsyncLocalStorageEnterWith,\n} from '../shared/asyncStorageScope'\nimport { defineFrameworkIntegration } from '../shared/integration'\nimport type { BaseEvlogOptions } from '../shared/middleware'\nimport { attachForkToLogger } from '../shared/fork'\n\nconst storage = new AsyncLocalStorage<AuditableLogger>()\npatchAsyncLocalStorageEnterWith(storage)\n\nconst activeLoggers = new WeakSet<AuditableLogger>()\n\nexport type EvlogElysiaOptions = BaseEvlogOptions\n\n/**\n * Get the request-scoped logger from anywhere in the call stack.\n * Must be called inside a request handled by the `evlog()` plugin.\n *\n * Elysia binds the logger with `enterWith()` because its lifecycle hooks are\n * separate from the route handler. On Cloudflare Workers, a small polyfill\n * provides `enterWith()` when the runtime omits it. Prefer `{ log }` from\n * derive when multiple requests may interleave in the same isolate.\n *\n * @example\n * ```ts\n * import { useLogger } from 'evlog/elysia'\n *\n * function findUser(id: string) {\n * const log = useLogger()\n * log.set({ user: { id } })\n * }\n * ```\n */\nexport function useLogger<T extends object = Record<string, unknown>>(): AuditableLogger<T> {\n const logger = storage.getStore()\n if (!logger || !activeLoggers.has(logger)) {\n throw new Error(\n '[evlog] useLogger() was called outside of an evlog plugin context. '\n + 'Make sure app.use(evlog()) is registered before your routes.',\n )\n }\n return logger as AuditableLogger<T>\n}\n\ninterface ElysiaContext {\n request: Request\n path: string\n headers: Record<string, string>\n}\n\nconst integration = defineFrameworkIntegration<ElysiaContext>({\n name: 'elysia',\n extractRequest: ({ request, path, headers }) => ({\n method: request.method,\n path,\n headers,\n requestId: headers['x-request-id'],\n }),\n attachLogger: ({ request, path, headers }, logger) => {\n attachForkToLogger(storage, logger, {\n method: request.method,\n path,\n requestId: headers['x-request-id'],\n }, {\n onChildEnter: (child) => {\n activeLoggers.add(child)\n },\n onChildExit: (child) => {\n activeLoggers.delete(child)\n },\n })\n activeLoggers.add(logger)\n },\n})\n\ninterface RequestState {\n finish: (opts?: { status?: number; error?: Error }) => Promise<unknown>\n skipped: boolean\n logger: AuditableLogger\n}\n\n/**\n * Create an evlog plugin for Elysia.\n *\n * @example\n * ```ts\n * import { Elysia } from 'elysia'\n * import { evlog } from 'evlog/elysia'\n * import { createAxiomDrain } from 'evlog/axiom'\n *\n * const app = new Elysia()\n * .use(evlog({\n * drain: createAxiomDrain(),\n * enrich: (ctx) => {\n * ctx.event.region = process.env.FLY_REGION\n * },\n * }))\n * .get('/health', ({ log }) => {\n * log.set({ route: 'health' })\n * return { ok: true }\n * })\n * .listen(3000)\n * ```\n */\nexport function evlog(options: EvlogElysiaOptions = {}) {\n const emitted = new WeakSet<Request>()\n const requestState = new WeakMap<Request, RequestState>()\n\n return new Elysia({ name: 'evlog' })\n .onRequest(({ request }) => {\n const url = new URL(request.url)\n const headers = (request.headers).toJSON?.() ?? Object.fromEntries(request.headers.entries())\n const ctx: ElysiaContext = { request, path: url.pathname, headers }\n const { logger, finish, skipped } = integration.start(ctx, options)\n if (!skipped) {\n bindAsyncLocalStorage(storage, logger)\n }\n requestState.set(request, { finish, skipped, logger })\n })\n .derive({ as: 'global' }, ({ request }) => {\n return { log: requestState.get(request)?.logger as AuditableLogger }\n })\n .onAfterResponse({ as: 'global' }, async ({ request, set }) => {\n const state = requestState.get(request)\n if (!state || state.skipped || emitted.has(request)) return\n emitted.add(request)\n await state.finish({ status: set.status as number || 200 })\n activeLoggers.delete(state.logger)\n clearAsyncLocalStorage(storage)\n })\n .onError({ as: 'global' }, async ({ request, error }) => {\n const state = requestState.get(request)\n if (!state || state.skipped || emitted.has(request)) return\n emitted.add(request)\n const err = error instanceof Error ? error : new Error(String(error))\n state.logger.error(err)\n await state.finish({ error: err })\n activeLoggers.delete(state.logger)\n clearAsyncLocalStorage(storage)\n })\n}\n"],"mappings":";;;;;;AAYA,MAAM,UAAU,IAAI,mBAAoC;AACxD,gCAAgC,QAAQ;AAExC,MAAM,gCAAgB,IAAI,SAA0B;;;;;;;;;;;;;;;;;;;;AAuBpD,SAAgB,YAA4E;CAC1F,MAAM,SAAS,QAAQ,UAAU;AACjC,KAAI,CAAC,UAAU,CAAC,cAAc,IAAI,OAAO,CACvC,OAAM,IAAI,MACR,kIAED;AAEH,QAAO;;AAST,MAAM,cAAc,2BAA0C;CAC5D,MAAM;CACN,iBAAiB,EAAE,SAAS,MAAM,eAAe;EAC/C,QAAQ,QAAQ;EAChB;EACA;EACA,WAAW,QAAQ;EACpB;CACD,eAAe,EAAE,SAAS,MAAM,WAAW,WAAW;AACpD,qBAAmB,SAAS,QAAQ;GAClC,QAAQ,QAAQ;GAChB;GACA,WAAW,QAAQ;GACpB,EAAE;GACD,eAAe,UAAU;AACvB,kBAAc,IAAI,MAAM;;GAE1B,cAAc,UAAU;AACtB,kBAAc,OAAO,MAAM;;GAE9B,CAAC;AACF,gBAAc,IAAI,OAAO;;CAE5B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;AA+BF,SAAgB,MAAM,UAA8B,EAAE,EAAE;CACtD,MAAM,0BAAU,IAAI,SAAkB;CACtC,MAAM,+BAAe,IAAI,SAAgC;AAEzD,QAAO,IAAI,OAAO,EAAE,MAAM,SAAS,CAAC,CACjC,WAAW,EAAE,cAAc;EAC1B,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;EAChC,MAAM,UAAW,QAAQ,QAAS,UAAU,IAAI,OAAO,YAAY,QAAQ,QAAQ,SAAS,CAAC;EAC7F,MAAM,MAAqB;GAAE;GAAS,MAAM,IAAI;GAAU;GAAS;EACnE,MAAM,EAAE,QAAQ,QAAQ,YAAY,YAAY,MAAM,KAAK,QAAQ;AACnE,MAAI,CAAC,QACH,uBAAsB,SAAS,OAAO;AAExC,eAAa,IAAI,SAAS;GAAE;GAAQ;GAAS;GAAQ,CAAC;GACtD,CACD,OAAO,EAAE,IAAI,UAAU,GAAG,EAAE,cAAc;AACzC,SAAO,EAAE,KAAK,aAAa,IAAI,QAAQ,EAAE,QAA2B;GACpE,CACD,gBAAgB,EAAE,IAAI,UAAU,EAAE,OAAO,EAAE,SAAS,UAAU;EAC7D,MAAM,QAAQ,aAAa,IAAI,QAAQ;AACvC,MAAI,CAAC,SAAS,MAAM,WAAW,QAAQ,IAAI,QAAQ,CAAE;AACrD,UAAQ,IAAI,QAAQ;AACpB,QAAM,MAAM,OAAO,EAAE,QAAQ,IAAI,UAAoB,KAAK,CAAC;AAC3D,gBAAc,OAAO,MAAM,OAAO;AAClC,yBAAuB,QAAQ;GAC/B,CACD,QAAQ,EAAE,IAAI,UAAU,EAAE,OAAO,EAAE,SAAS,YAAY;EACvD,MAAM,QAAQ,aAAa,IAAI,QAAQ;AACvC,MAAI,CAAC,SAAS,MAAM,WAAW,QAAQ,IAAI,QAAQ,CAAE;AACrD,UAAQ,IAAI,QAAQ;EACpB,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;AACrE,QAAM,OAAO,MAAM,IAAI;AACvB,QAAM,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC;AAClC,gBAAc,OAAO,MAAM,OAAO;AAClC,yBAAuB,QAAQ;GAC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich-error-stack-next.node-
|
|
1
|
+
{"version":3,"file":"enrich-error-stack-next.node-KB0Oap7R.mjs","names":[],"sources":["../src/shared/enrich-error-stack-next.node.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { isAbsolute, relative } from 'node:path'\nimport { pathToFileURL, fileURLToPath } from 'node:url'\nimport { isFrameworkRuntimePath } from './pretty-error'\n\n/** Parsed stack frame from Next.js `parseStack`. */\ninterface NextParsedFrame {\n file: string | null\n line1: number | null\n column1: number | null\n methodName: string | null\n arguments: string[]\n}\n\ntype SourceMapConsumerInstance = {\n originalPositionFor: (pos: { line: number, column: number }) => {\n source: string | null\n line: number | null\n column: number | null\n name: string | null\n }\n}\n\nconst require = createRequire(import.meta.url)\n\nfunction formatMappedFrame(\n methodName: string | null,\n sourceURL: string | null,\n line1: number | null,\n column1: number | null,\n): string {\n let sourceLocation = line1 !== null ? `:${line1}` : ''\n if (column1 !== null && sourceLocation !== '') {\n sourceLocation += `:${column1}`\n }\n\n let fileLocation: string\n if (sourceURL !== null && sourceURL.startsWith('file://') && URL.canParse(sourceURL)) {\n fileLocation = relative(process.cwd(), fileURLToPath(sourceURL))\n } else if (sourceURL !== null && sourceURL.startsWith('/')) {\n fileLocation = relative(process.cwd(), sourceURL)\n } else {\n fileLocation = sourceURL ?? 'unknown'\n }\n\n return methodName\n ? ` at ${methodName} (${fileLocation}${sourceLocation})`\n : ` at ${fileLocation}${sourceLocation}`\n}\n\nfunction shouldSkipMappedSource(source: string): boolean {\n const normalized = source.replace(/\\\\/g, '/')\n return normalized.includes('node_modules')\n || normalized.includes('/packages/evlog/')\n || isFrameworkRuntimePath(normalized)\n}\n\nfunction resolveFrameFile(frame: NextParsedFrame): string | null {\n if (!frame.file) return null\n if (frame.file.startsWith('file://')) {\n try {\n return fileURLToPath(frame.file)\n } catch {\n return frame.file\n }\n }\n if (isAbsolute(frame.file)) return frame.file\n return null\n}\n\nfunction getSourceMapConsumer(\n frameFile: string,\n cache: Map<string, SourceMapConsumerInstance | null>,\n): SourceMapConsumerInstance | null {\n const cached = cache.get(frameFile)\n if (cached !== undefined) return cached\n\n const mapPath = `${frameFile}.map`\n if (!existsSync(mapPath)) {\n cache.set(frameFile, null)\n return null\n }\n\n try {\n const sourceMapModule = require('next/dist/compiled/source-map') as {\n SourceMapConsumer: new(payload: unknown, sourceMapURL: string) => SourceMapConsumerInstance\n }\n const payload = JSON.parse(readFileSync(mapPath, 'utf8')) as unknown\n const chunkUrl = pathToFileURL(frameFile).href\n const consumer = new sourceMapModule.SourceMapConsumer(payload, `${chunkUrl}.map`)\n cache.set(frameFile, consumer)\n return consumer\n } catch {\n cache.set(frameFile, null)\n return null\n }\n}\n\nfunction mapFrame(\n frame: NextParsedFrame,\n cache: Map<string, SourceMapConsumerInstance | null>,\n): { frame: NextParsedFrame, skipped: boolean } {\n if (frame.file?.startsWith('node:')) {\n return { frame, skipped: true }\n }\n\n const frameFile = resolveFrameFile(frame)\n if (!frameFile || frame.line1 === null) {\n return { frame, skipped: false }\n }\n\n const consumer = getSourceMapConsumer(frameFile, cache)\n if (!consumer) {\n if (frameFile.includes('.next/')) {\n return { frame, skipped: true }\n }\n return { frame, skipped: false }\n }\n\n const sourcePosition = consumer.originalPositionFor({\n line: frame.line1,\n column: (frame.column1 ?? 1) - 1,\n })\n\n if (!sourcePosition.source || sourcePosition.line === null) {\n return { frame, skipped: frameFile.includes('.next/') }\n }\n\n if (shouldSkipMappedSource(sourcePosition.source)) {\n return { frame, skipped: true }\n }\n\n return {\n frame: {\n ...frame,\n file: sourcePosition.source,\n line1: sourcePosition.line,\n column1: sourcePosition.column === null ? null : sourcePosition.column + 1,\n methodName: sourcePosition.name ?? frame.methodName,\n },\n skipped: false,\n }\n}\n\n/**\n * Rewrite `error.stack` with Turbopack/Webpack source-mapped frames in Next.js dev.\n * Reads sibling `.map` files for `.next` chunks (same resolution as the dev overlay).\n */\nexport function enrichErrorStackFromNextDev(error: Error): void {\n if (process.env.NODE_ENV === 'production') return\n if (!error.stack) return\n\n try {\n const { parseStack } = require('next/dist/server/lib/parse-stack') as {\n parseStack: (stack: string, distDir?: string) => NextParsedFrame[]\n }\n\n const frames = parseStack(error.stack)\n if (frames.length === 0) return\n\n const cache = new Map<string, SourceMapConsumerInstance | null>()\n const mappedLines: string[] = []\n\n for (const frame of frames) {\n const { frame: mapped, skipped } = mapFrame(frame, cache)\n if (skipped) continue\n mappedLines.push(formatMappedFrame(mapped.methodName, mapped.file, mapped.line1, mapped.column1))\n }\n\n if (mappedLines.length === 0) return\n\n error.stack = `${error.name || 'Error'}: ${error.message}\\n${mappedLines.join('\\n')}`\n } catch {\n // Next internals unavailable — keep the original stack\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as EnrichContext, ht as WideEvent } from "./audit-
|
|
1
|
+
import { W as EnrichContext, ht as WideEvent } from "./audit-BZrUvjfW.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/shared/enricher.d.ts
|
|
4
4
|
interface EnricherOptions {
|
|
@@ -39,4 +39,4 @@ interface EnricherDefinition<T> {
|
|
|
39
39
|
declare function defineEnricher<T>(def: EnricherDefinition<T>, options?: EnricherOptions): (ctx: EnrichContext) => void;
|
|
40
40
|
//#endregion
|
|
41
41
|
export { EnricherOptions as n, defineEnricher as r, EnricherDefinition as t };
|
|
42
|
-
//# sourceMappingURL=enricher-
|
|
42
|
+
//# sourceMappingURL=enricher-BOzt2FCi.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enricher-
|
|
1
|
+
{"version":3,"file":"enricher-BOzt2FCi.d.mts","names":[],"sources":["../src/shared/enricher.ts"],"mappings":";;;UAGiB,eAAA;;AAAjB;;;EAKE,SAAA;AAAA;AAAA,UAGe,kBAAA;EAAkB;EAEjC,IAAA;EAKc;;;;EAAd,KAAA,SAAc,SAAA;EAPoB;EASlC,OAAA,GAAU,GAAA,EAAK,aAAA,KAAkB,CAAA;AAAA;;;;;;;;AAoBnC;;;;;;;;;;iBAAgB,cAAA,GAAA,CACd,GAAA,EAAK,kBAAA,CAAmB,CAAA,GACxB,OAAA,GAAS,eAAA,IACP,GAAA,EAAK,aAAA"}
|
package/dist/enrichers.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { W as EnrichContext } from "./audit-
|
|
2
|
-
import { n as EnricherOptions } from "./enricher-
|
|
1
|
+
import { W as EnrichContext } from "./audit-BZrUvjfW.mjs";
|
|
2
|
+
import { n as EnricherOptions } from "./enricher-BOzt2FCi.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/enrichers/index.d.ts
|
|
5
5
|
interface UserAgentInfo {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { q as ErrorOptions } from "./audit-
|
|
1
|
+
import { q as ErrorOptions } from "./audit-BZrUvjfW.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/error.d.ts
|
|
4
4
|
/**
|
|
@@ -72,4 +72,4 @@ declare class EvlogError extends Error {
|
|
|
72
72
|
declare function createError(options: ErrorOptions | string): EvlogError;
|
|
73
73
|
//#endregion
|
|
74
74
|
export { createError as n, EvlogError as t };
|
|
75
|
-
//# sourceMappingURL=error-
|
|
75
|
+
//# sourceMappingURL=error-BRymuv8U.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-
|
|
1
|
+
{"version":3,"file":"error-BRymuv8U.d.mts","names":[],"sources":["../src/error.ts"],"mappings":";;;;;AAsBA;;;;;;;;;;;;;;cAAa,UAAA,SAAmB,KAAA;EAc1B;EAAA,SAXK,IAAA;;WAEA,MAAA;EAAA,SACA,GAAA;EAAA,SACA,GAAA;EAAA,SACA,IAAA;EAgDL;;;;EAAA,IA1CA,QAAA,CAAA,GAAY,MAAA;cAIJ,OAAA,EAAS,YAAA;EAkDZ;EAAA,IAtBL,UAAA,CAAA;EA2DM;EAAA,IAtDN,UAAA,CAAA;EAsDY;EAAA,IAjDZ,aAAA,CAAA;EAsFqB;EAAA,IAjFrB,IAAA,CAAA;IAAU,IAAA;IAAe,GAAA;IAAc,GAAA;IAAc,IAAA;EAAA;EAOhD,QAAA,CAAA;EAqCT,MAAA,CAAA,GAAU,MAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;iBAqCI,WAAA,CAAY,OAAA,EAAS,YAAA,YAAwB,UAAA"}
|
package/dist/error.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as createError, t as EvlogError } from "./error-
|
|
1
|
+
import { n as createError, t as EvlogError } from "./error-BRymuv8U.mjs";
|
|
2
2
|
export { EvlogError, createError, createError as createEvlogError };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ct as RouteConfig } from "./audit-
|
|
1
|
+
import { ct as RouteConfig } from "./audit-BZrUvjfW.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/shared/routes.d.ts
|
|
4
4
|
declare function shouldLog(path: string, include?: string[], exclude?: string[]): boolean;
|
|
@@ -36,4 +36,4 @@ declare function getServiceForPath(path: string, routes?: Record<string, RouteCo
|
|
|
36
36
|
declare function extractErrorStatus(error: unknown): number;
|
|
37
37
|
//#endregion
|
|
38
38
|
export { getServiceForPath as n, shouldLog as r, extractErrorStatus as t };
|
|
39
|
-
//# sourceMappingURL=errors-
|
|
39
|
+
//# sourceMappingURL=errors-C7qA6CAi.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors-
|
|
1
|
+
{"version":3,"file":"errors-C7qA6CAi.d.mts","names":[],"sources":["../src/shared/routes.ts","../src/shared/errors.ts"],"mappings":";;;iBAGgB,SAAA,CAAU,IAAA,UAAc,OAAA,aAAoB,OAAA;;AAA5D;;;;;;;;;AAsCA;;;;;;;;;;;iBAAgB,iBAAA,CAAkB,IAAA,UAAc,MAAA,GAAS,MAAA,SAAe,WAAA;;;;;;AAtCxE;;;;iBCIgB,kBAAA,CAAmB,KAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { et as LoggerConfig, l as AuditableLogger } from "../audit-BZrUvjfW.mjs";
|
|
2
|
+
import { t as BaseEvlogOptions } from "../middleware-fbtEs6bq.mjs";
|
|
3
|
+
import { ModelCost } from "../ai/index.mjs";
|
|
4
|
+
import { HookDefinition } from "eve/hooks";
|
|
5
|
+
|
|
6
|
+
//#region src/eve/index.d.ts
|
|
7
|
+
/** Options for {@link defineEvlogHook}. */
|
|
8
|
+
interface EvlogEveOptions extends BaseEvlogOptions {
|
|
9
|
+
/** Passed to {@link initLogger} on the first hook invocation. */
|
|
10
|
+
init?: LoggerConfig;
|
|
11
|
+
/**
|
|
12
|
+
* When `true` (default), user message content from `message.received` is
|
|
13
|
+
* omitted from the wide event. Set to `false` to include a truncated preview.
|
|
14
|
+
*/
|
|
15
|
+
redactMessage?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Pricing map for {@link AIEventData.estimatedCost}. Keys are model IDs,
|
|
18
|
+
* values are dollars per 1M tokens — same shape as `evlog/ai`.
|
|
19
|
+
*/
|
|
20
|
+
cost?: Record<string, ModelCost>;
|
|
21
|
+
/**
|
|
22
|
+
* Model ID used with `cost` when eve stream events do not expose the model
|
|
23
|
+
* name. When `cost` has exactly one entry, that key is used automatically.
|
|
24
|
+
*/
|
|
25
|
+
model?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Max in-memory sessions for context carry-over and approval state.
|
|
28
|
+
* Oldest sessions are evicted when exceeded. Default `256`.
|
|
29
|
+
*/
|
|
30
|
+
maxSessions?: number;
|
|
31
|
+
}
|
|
32
|
+
/** Minimal session shape accepted by {@link useLogger} as a fallback lookup key. */
|
|
33
|
+
interface EveTurnSessionContext {
|
|
34
|
+
readonly session: {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly turn?: {
|
|
37
|
+
readonly id?: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
declare function useLogger(ctx?: EveTurnSessionContext): AuditableLogger;
|
|
42
|
+
/**
|
|
43
|
+
* Create an eve stream hook that emits one evlog wide event per agent turn.
|
|
44
|
+
*
|
|
45
|
+
* Export the result as the default export of `agent/hooks/evlog.ts`. eve
|
|
46
|
+
* auto-discovers hook files; evlog maps turn lifecycle events to a wide event
|
|
47
|
+
* with AI usage, tool executions, and your drain/enrich/keep pipeline.
|
|
48
|
+
*
|
|
49
|
+
* Complements eve Agent Runs and OpenTelemetry — it does not replace them.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* // agent/hooks/evlog.ts
|
|
54
|
+
* import { defineEvlogHook } from 'evlog/eve'
|
|
55
|
+
* import { createAxiomDrain } from 'evlog/axiom'
|
|
56
|
+
*
|
|
57
|
+
* export default defineEvlogHook({
|
|
58
|
+
* drain: createAxiomDrain(),
|
|
59
|
+
* enrich: (ctx) => {
|
|
60
|
+
* ctx.event.runtime = process.env.VERCEL_REGION
|
|
61
|
+
* },
|
|
62
|
+
* })
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
declare function defineEvlogHook(options?: EvlogEveOptions): HookDefinition;
|
|
66
|
+
/** @internal Simulates eve tool execution where AsyncLocalStorage did not propagate. */
|
|
67
|
+
declare function detachActiveTurnLoggerForTests(): void;
|
|
68
|
+
/** @internal Resets module state between unit tests. Clears turn maps, session context, and the Eve init flag. */
|
|
69
|
+
declare function resetEvlogEveForTests(): void;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { EveTurnSessionContext, EvlogEveOptions, type ModelCost, defineEvlogHook, detachActiveTurnLoggerForTests, resetEvlogEveForTests, useLogger };
|
|
72
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/eve/index.ts"],"mappings":";;;;;;;UAiBiB,eAAA,SAAwB,gBAAA;EAAR;EAE/B,IAAA,GAAO,YAAA;EAAA;;;;EAKP,aAAA;EAPuD;;;;EAYvD,IAAA,GAAO,MAAA,SAAe,SAAA;EAAtB;;;;EAKA,KAAA;EAKW;;AAIb;;EAJE,WAAA;AAAA;;UAIe,qBAAA;EAAA,SACN,OAAA;IAAA,SACE,EAAA;IAAA,SACA,IAAA;MAAA,SAAkB,EAAA;IAAA;EAAA;AAAA;AAAA,iBA4Of,SAAA,CAAU,GAAA,GAAM,qBAAA,GAAwB,eAAA;;;;;;AA8WxD;;;;;;;;;AA2MA;;;;;AAMA;;;;iBAjNgB,eAAA,CAAgB,OAAA,GAAS,eAAA,GAAuB,cAAA;;iBA2MhD,8BAAA,CAAA;;iBAMA,qBAAA,CAAA"}
|