{"_id":"@adhd/apigen-plugin-logger","_rev":"12-6c5ee445b2f1fa51ebef6ee8715f29b7","name":"@adhd/apigen-plugin-logger","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@adhd/apigen-plugin-logger","version":"0.1.0","_id":"@adhd/apigen-plugin-logger@0.1.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"0d1b85a02c89862785a9d6b57597de3fed5b7c10","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.0.tgz","fileCount":5,"integrity":"sha512-dwz3oF/wLa90B6i2HkiYPD4q8+uAEIK1D8c8Kom68jPJz6+Uo7tBMAdQ+Y5Kf215VNbpIxMqfczhTgOa0UtRKg==","signatures":[{"sig":"MEYCIQDlJFzstKIkM6Op4GwiMel0ypeitrjpQRc6SwGCIePRPwIhAOWRJ7BqMGjs2LjkG6jlkY9zqfQcS1Pgr3J1EW9eHNPg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30309},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"70af56163bc48ddfa898e1202c9bd768e7372a33","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.0_1782256668656_0.8162026908428539","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adhd/apigen-plugin-logger","version":"0.1.1","_id":"@adhd/apigen-plugin-logger@0.1.1","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"0d50e0712702749a1b4013f9f63931f4e69e8568","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.1.tgz","fileCount":6,"integrity":"sha512-vH482QZj+bIKfmctob7W2zZipxxHjbXr65np/V/e/f90Cmm/gTquGXGgFl1WecMJZ607wvucVwqF5LYKohoPpQ==","signatures":[{"sig":"MEUCIAtMueLqMgwt93hiLmBwCkE9Hcw8keYjWVBSYNvD4ihUAiEA3Ph8/nK1RfYBuvtFD+9xWj5P3hl3DpJoHoK/xVEyjoU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30746},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"70af56163bc48ddfa898e1202c9bd768e7372a33","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"apigen **Layer plugin** — wraps dispatch with structured request/timing logging. Activate with `--use` on any target.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.1_1782258199676_0.007844491395285313","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@adhd/apigen-plugin-logger","version":"0.1.2","_id":"@adhd/apigen-plugin-logger@0.1.2","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"1afc33b23555b78a65557a121bcdf2a4f36cd16b","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.2.tgz","fileCount":6,"integrity":"sha512-7yDB2VhQdYoz/fq6x0qPKT1UVzsOrMDBL5TeZt43awe8atopCbdfxVzVxzCwG/bnMs+lMydhj2Rq8lDjdyPndQ==","signatures":[{"sig":"MEQCIFGb7pFkDKIJeXAg5tVXDxDrk9zOMEe6CnOTRbwhoU9/AiBAz7VoWHZu94dRys1PV3fWtQ2Tc5Sp9nILPeX5PatSyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10176},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"36e7fe6e3b1dd5a9356fb1dab93d9eb1746df8b0","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"apigen **Layer plugin** — wraps dispatch with structured request/timing logging. Activate with `--use` on any target.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.2_1784686917566_0.728571199449457","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@adhd/apigen-plugin-logger","version":"0.1.3","_id":"@adhd/apigen-plugin-logger@0.1.3","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"41b38a105d565985eaf392a5705e06b18b5f466e","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.3.tgz","fileCount":7,"integrity":"sha512-Xm/6doQZd0lvKrHjuDHmOMzkBKwkgV8I4CQHgsMjEpZ6Yr25vsMgQN5W9gRmw6cDO0cqIm6ThRIMMOunQD+UeQ==","signatures":[{"sig":"MEUCIQCYnUD0BNLlxK2J2V+4D1zj2GUoB7eaoDLTGBTjfJsbJAIgH6jgjOkD7wCpK40fttnmFihbj1xIiw68vrAMqJVpAoA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14826},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"afca4fc9097845a32a9e371ce6cd1252cbc0be6b","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.3_1784773930445_0.6486790776056257","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@adhd/apigen-plugin-logger","version":"0.1.4","_id":"@adhd/apigen-plugin-logger@0.1.4","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"45afbc2880809137970db9b52f19715015f06e55","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.4.tgz","fileCount":7,"integrity":"sha512-fw1oWxCowM04TAWTWyJCyixBridUhq3Mh6rHrFMlwcnQt638u+RFcujf8VFMdiJ0tpwMX0PgY+1bk80xBf8ivA==","signatures":[{"sig":"MEQCICV0yRvNL41ytkZwafwcQ7jxypzEtjFk1N4Vk0SK1mw5AiBpNYFkVyzHjOgNfZYXbVv3y62MS80laI06NqeLClyiZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15504},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"eb0fd170825539850ae91a64393f8a8f376d8c7b","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.4_1784831140241_0.891429441789831","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@adhd/apigen-plugin-logger","version":"0.1.5","_id":"@adhd/apigen-plugin-logger@0.1.5","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"01edf4dfa10ed27b30eea421cbd4daefc97e2b35","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.5.tgz","fileCount":7,"integrity":"sha512-sjHMftgQe9x/b2AZVh5XFf+xYmLWR4rtcV5k2GFqpTlTC8ffPn2BwnidcvXCljXyupIEStEBXQxiF+6I5t8+Lg==","signatures":[{"sig":"MEUCIDipgxx0Ozpre7qeXsuqjmzzlKa5nL2Ci2utJDt+nw53AiEAyqcq4cbb2oJLIdWpyK3Oqg/CxsgQ5xGkrWQTb7/MxZY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15643},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"60d30f61a52a3cb55285346e534382df02258264","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.5_1784934779334_0.5212884614464444","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@adhd/apigen-plugin-logger","version":"0.1.6","_id":"@adhd/apigen-plugin-logger@0.1.6","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"52899f0254ec021a8aacc805717e663f73122842","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.6.tgz","fileCount":7,"integrity":"sha512-zKjECT3xQc5ZaSSUcb5JNKJ9vIhKBS0RSdbIoNbORPcSuZx3yEPX7gREof8Kl9mUhrRXCvpOM43wEZR3elWC+Q==","signatures":[{"sig":"MEUCIE/liwOSvmAEpLwLShsrlYUJbmBaxwygsG+EuWREwU9vAiEAtZuQ0JVxE4WT1MihJ+utp3uCkwj1TGxRmYYvxK8E8ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15643},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"4a55390e41abde59d4b6c1f420851503ff727386","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.6_1784937256745_0.5087195066800612","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@adhd/apigen-plugin-logger","version":"0.1.7","_id":"@adhd/apigen-plugin-logger@0.1.7","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"46fa9a52d68ec3fc9faa3bd2952e4a96c209f708","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.1.7.tgz","fileCount":7,"integrity":"sha512-POOGBQ5fvI3YDve5IKcG9qqRueMPnmvk13QGhaU8hLgaHrlYnmQwOSw5nVqd4j+NxjAu5NHxalIaWgNCLpifrQ==","signatures":[{"sig":"MEUCIEpfvBgMldu5LKispdELfsiEw2UHa/cQOLZqC9/7mx+1AiEA5d9w+Uv59GJIN+MIulLy7MOwXABJnO15L9A2ZlxkKWk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15968},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"936d50dc3a4c827b29a00dcd8686ba968775cd06","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.1.7_1784948674244_0.523166495952833","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@adhd/apigen-plugin-logger","version":"0.2.0","_id":"@adhd/apigen-plugin-logger@0.2.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"6513f82c13d288ecdb5c40891203f2f2c661b924","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.2.0.tgz","fileCount":7,"integrity":"sha512-Y1fWcTrBgbY0669THf61dAm/SY83nL7nvrXynWKrUqZFcUj/uirH9kbSaKp1bJWcQhqtYQyiPehTco9GWZh4bw==","signatures":[{"sig":"MEQCIEtJ/LOf3uZwqySm46AEwkJ5e4a2RouCzGBSJTloI42WAiBeqo37B/e85z3ZakiWg2Rad+Z7SOI8XXHNmLq4+bjneQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15968},"main":"./index.js","types":"./index.d.ts","module":"./index.mjs","gitHead":"1dbc0638f8eb1b7c961bc9359def6f4425da5c15","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-core-client":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-plugin-logger_0.2.0_1785136558502_0.8428215222426465","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"_id":"@adhd/apigen-plugin-logger@0.2.1","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"dist":{"shasum":"64922c41f69106a73b5a29737778e32b8f5014d6","tarball":"https://registry.npmjs.org/@adhd/apigen-plugin-logger/-/apigen-plugin-logger-0.2.1.tgz","fileCount":7,"integrity":"sha512-irCFFBkL2fhWHP8jgF+5Zm6g986krUq9y5O8nNX5XBBrCLrt58Xm4Ldco3/dKmHNOEfJzLqGu4YZRoBEIeHgHg==","signatures":[{"sig":"MEQCIDtZywAtqAfrRILZ8AdFrhhtaZ4Xqy/R6MAVp1cJTT6MAiBGdJRcaokhEYLKJX9m/FTW1wiAeN4XP/MNr00AzhPceg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEGPQEtZelfR0qOZWxwsG7bK9ZBuWT/m64uQ+tP/LSnWAiEA2s+NxMeChJ9M55XaCWqK2Wmpt7AReY5bsX7wwmYznNg="}],"unpackedSize":17609},"main":"./index.js","name":"@adhd/apigen-plugin-logger","types":"./index.d.ts","module":"./index.mjs","license":"MIT","version":"0.2.1","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"homepage":"https://github.com/PseudoSky/adhd/tree/main/packages/apigen/apigen-plugin-logger#readme","keywords":["logging","apigen","plugin","typescript"],"repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git","directory":"packages/apigen/apigen-plugin-logger"},"_npmVersion":"11.6.2","description":"Logging plugin for apigen servers","directories":{},"maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","@adhd/apigen-base-errors":"^0.2.1","@adhd/apigen-core-client":"^0.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/apigen-plugin-logger_0.2.1_1790266815087_0.6950906048819347"}}},"time":{"created":"2026-06-23T22:40:35.924Z","modified":"2026-09-24T16:20:15.366Z","0.0.1":"2026-06-23T22:40:36.237Z","0.1.0":"2026-06-23T23:17:48.801Z","0.1.1":"2026-06-23T23:43:19.834Z","0.1.2":"2026-07-22T02:21:57.788Z","0.1.3":"2026-07-23T02:32:10.581Z","0.1.4":"2026-07-23T18:25:40.438Z","0.1.5":"2026-07-24T23:12:59.489Z","0.1.6":"2026-07-24T23:54:16.896Z","0.1.7":"2026-07-25T03:04:34.368Z","0.2.0":"2026-07-27T07:15:58.638Z","0.2.1":"2026-09-24T16:20:15.175Z"},"description":"Logging plugin for apigen servers","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"readme":"# @adhd/apigen-plugin-logger\n\n**Layer plugin** — wraps every operation dispatch with entry/exit/error logging. Compatible with any target plugin (MCP, Fastify, Express, CLI). Stream-lifecycle aware: logs per-chunk for streaming operations and aggregates chunk count on stream end.\n\nPart of [apigen](../README.md). Driven via [`@adhd/apigen-cli`](../../../entrypoint/apigen-cli/README.md).\n\n---\n\n## What it does\n\nWhen loaded via `--use`, the logger plugin wraps every operation call:\n\n```\n→ getUser                          (entry — op started)\n← getUser 12ms                     (exit — op completed)\n✗ getUser 45ms                     (error — op threw)\n```\n\nFor streaming operations:\n\n```\n→ streamEvents                     (entry)\n  chunk 1                          (per-chunk debug)\n  chunk 2\n← streamEvents 3200ms 2 chunks     (stream ended)\n```\n\nAll logs go to **stderr** only — stdout is reserved for the MCP stdio JSON-RPC channel.\n\n---\n\n## CLI usage\n\n```bash\n# Fastify with logging\nnpx @adhd/apigen-cli run --source api.ts --type api-fastify --opt port=3000 --use logger\n\n# MCP with logging\nnpx @adhd/apigen-cli run --source api.ts --type mcp --use logger\n\n# Custom log level and format\nnpx @adhd/apigen-cli run --source api.ts --type api-fastify --use logger \\\n  --opt 'useOptions={\"logger\":{\"level\":\"debug\",\"format\":\"pretty\"}}'\n\n# Log to a file (never stdout)\nnpx @adhd/apigen-cli run --source api.ts --type api-fastify --use logger \\\n  --opt 'useOptions={\"logger\":{\"destination\":\"./logs/api.log\"}}'\n```\n\n---\n\n## Programmatic usage\n\n```ts\nimport { extract, composeSchemas } from '@adhd/apigen-core-client';\nimport { apiFastifyPlugin } from '@adhd/apigen-plugin-api-fastify';\nimport { loggerPlugin, makeLoggerPlugin } from '@adhd/apigen-plugin-logger';\n\n// Use the default logger plugin (json lines → stderr)\nconst ops = await extract({ sourceFile: './api.ts', namespace: 'api' });\nconst schemas = composeSchemas(/* ... */);\nconst mod = await import('./api.ts');\nconst abort = new AbortController();\nprocess.on('SIGINT', () => abort.abort());\n\nawait apiFastifyPlugin.run({\n  packages: [{ id: 'api', schemas, importPath: './api.ts', fns: mod, createClient: async () => ({}) }],\n  outputDir: '',\n  options: {\n    port: 3000,\n    usePlugins: [loggerPlugin],\n  },\n  signal: abort.signal,\n  operations: ops,\n});\n```\n\n### With custom configuration\n\nUse `makeLoggerPlugin()` for per-deployment control:\n\n```ts\nimport { makeLoggerPlugin } from '@adhd/apigen-plugin-logger';\n\nawait apiFastifyPlugin.run({\n  // ...\n  options: {\n    port: 3000,\n    usePlugins: [\n      makeLoggerPlugin({ level: 'debug', format: 'pretty' }),\n    ],\n  },\n  // ...\n});\n```\n\n### Reading the logger in your domain functions\n\nThe logger plugin seeds a `Logger` instance into `call.ctx`. Downstream layers and domain functions can read it:\n\n```ts\nimport { Logger } from '@adhd/apigen-plugin-logger';\n\nexport async function getUser(ctx: Logger, id: string) {\n  // ctx is injected by apigen (first param named 'ctx')\n  // It's a Logger instance seeded by the logger plugin\n  ctx.info({ id }, `fetching user ${id}`);\n  return db.find(id);\n}\n```\n\nOr read it from `call.ctx` in a custom layer:\n\n```ts\nconst log = call.ctx.get(Logger);\nlog?.info('hello from custom layer');\n```\n\n---\n\n## Options\n\n```ts\nimport { type LoggerOptions, makeLoggerPlugin } from '@adhd/apigen-plugin-logger';\n```\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `level` | `string` | `'info'` | pino log level (`trace`, `debug`, `info`, `warn`, `error`, `fatal`) |\n| `format` | `'json' \\| 'pretty'` | `'pretty'` on TTY stderr, else `'json'` | Output format |\n| `destination` | `string` | stderr (fd 2) | File path for logs. **Never stdout.** |\n\n---\n\n## Log format (JSON mode)\n\n```json\n{\"level\":30,\"time\":\"12:00:00.000\",\"op\":\"getUser\",\"msg\":\"→ getUser\"}\n{\"level\":30,\"time\":\"12:00:00.012\",\"op\":\"getUser\",\"msg\":\"← getUser ok\",\"ms\":12}\n```\n\n---\n\n## Exports\n\n| Export | Kind |\n|--------|------|\n| `loggerPlugin` | v2 `Plugin<LoggerOptions>` — default (json → stderr) |\n| `makeLoggerPlugin(opts)` | Factory function — returns configured `Plugin<LoggerOptions>` |\n| `Logger` | Class — typed `call.ctx` key for reading the per-request logger |\n| `LoggerOptions` | TypeScript interface |\n\n```ts\nimport { loggerPlugin, makeLoggerPlugin, Logger, type LoggerOptions } from '@adhd/apigen-plugin-logger';\n```\n","readmeFilename":"README.md","homepage":"https://github.com/PseudoSky/adhd/tree/main/packages/apigen/apigen-plugin-logger#readme","keywords":["logging","apigen","plugin","typescript"],"repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git","directory":"packages/apigen/apigen-plugin-logger"},"bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"license":"MIT"}