@vibesdotdev/logging 0.0.1
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 +80 -0
- package/SPEC.md +65 -0
- package/dist/audit/audit.descriptor.d.ts +11 -0
- package/dist/audit/audit.descriptor.d.ts.map +1 -0
- package/dist/audit/audit.descriptor.js +40 -0
- package/dist/audit/audit.descriptor.js.map +1 -0
- package/dist/audit/audit.storage.schema.d.ts +79 -0
- package/dist/audit/audit.storage.schema.d.ts.map +1 -0
- package/dist/audit/audit.storage.schema.js +33 -0
- package/dist/audit/audit.storage.schema.js.map +1 -0
- package/dist/audit/index.d.ts +2 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +2 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/cli/logs.descriptor.d.ts +9 -0
- package/dist/cli/logs.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.descriptor.js +16 -0
- package/dist/cli/logs.descriptor.js.map +1 -0
- package/dist/cli/logs.list.descriptor.d.ts +9 -0
- package/dist/cli/logs.list.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.list.descriptor.js +23 -0
- package/dist/cli/logs.list.descriptor.js.map +1 -0
- package/dist/cli/logs.list.impl.d.ts +13 -0
- package/dist/cli/logs.list.impl.d.ts.map +1 -0
- package/dist/cli/logs.list.impl.js +81 -0
- package/dist/cli/logs.list.impl.js.map +1 -0
- package/dist/cli/logs.rotate.descriptor.d.ts +9 -0
- package/dist/cli/logs.rotate.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.rotate.descriptor.js +34 -0
- package/dist/cli/logs.rotate.descriptor.js.map +1 -0
- package/dist/cli/logs.rotate.impl.d.ts +17 -0
- package/dist/cli/logs.rotate.impl.d.ts.map +1 -0
- package/dist/cli/logs.rotate.impl.js +48 -0
- package/dist/cli/logs.rotate.impl.js.map +1 -0
- package/dist/cli/logs.search.descriptor.d.ts +9 -0
- package/dist/cli/logs.search.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.search.descriptor.js +55 -0
- package/dist/cli/logs.search.descriptor.js.map +1 -0
- package/dist/cli/logs.search.impl.d.ts +22 -0
- package/dist/cli/logs.search.impl.d.ts.map +1 -0
- package/dist/cli/logs.search.impl.js +145 -0
- package/dist/cli/logs.search.impl.js.map +1 -0
- package/dist/cli/logs.tail.descriptor.d.ts +9 -0
- package/dist/cli/logs.tail.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.tail.descriptor.js +43 -0
- package/dist/cli/logs.tail.descriptor.js.map +1 -0
- package/dist/cli/logs.tail.impl.d.ts +19 -0
- package/dist/cli/logs.tail.impl.d.ts.map +1 -0
- package/dist/cli/logs.tail.impl.js +78 -0
- package/dist/cli/logs.tail.impl.js.map +1 -0
- package/dist/cli/logs.view.descriptor.d.ts +9 -0
- package/dist/cli/logs.view.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.view.descriptor.js +51 -0
- package/dist/cli/logs.view.descriptor.js.map +1 -0
- package/dist/cli/logs.view.impl.d.ts +21 -0
- package/dist/cli/logs.view.impl.d.ts.map +1 -0
- package/dist/cli/logs.view.impl.js +85 -0
- package/dist/cli/logs.view.impl.js.map +1 -0
- package/dist/cli/types.d.ts +57 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +9 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/contexts/audit.d.ts +34 -0
- package/dist/contexts/audit.d.ts.map +1 -0
- package/dist/contexts/audit.js +13 -0
- package/dist/contexts/audit.js.map +1 -0
- package/dist/contexts/fallback-logger.d.ts +3 -0
- package/dist/contexts/fallback-logger.d.ts.map +1 -0
- package/dist/contexts/fallback-logger.js +67 -0
- package/dist/contexts/fallback-logger.js.map +1 -0
- package/dist/contexts/index.d.ts +8 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/contexts/index.js +9 -0
- package/dist/contexts/index.js.map +1 -0
- package/dist/contexts/logger.d.ts +26 -0
- package/dist/contexts/logger.d.ts.map +1 -0
- package/dist/contexts/logger.js +88 -0
- package/dist/contexts/logger.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +10 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +118 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/namespace.d.ts +69 -0
- package/dist/core/namespace.d.ts.map +1 -0
- package/dist/core/namespace.js +136 -0
- package/dist/core/namespace.js.map +1 -0
- package/dist/core/parsing.d.ts +3 -0
- package/dist/core/parsing.d.ts.map +1 -0
- package/dist/core/parsing.js +25 -0
- package/dist/core/parsing.js.map +1 -0
- package/dist/core/types.d.ts +69 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/docs/levels.docs.descriptor.d.ts +4 -0
- package/dist/docs/levels.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/levels.docs.descriptor.js +342 -0
- package/dist/docs/levels.docs.descriptor.js.map +1 -0
- package/dist/docs/structured.docs.descriptor.d.ts +4 -0
- package/dist/docs/structured.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/structured.docs.descriptor.js +442 -0
- package/dist/docs/structured.docs.descriptor.js.map +1 -0
- package/dist/docs/transports.docs.descriptor.d.ts +4 -0
- package/dist/docs/transports.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/transports.docs.descriptor.js +426 -0
- package/dist/docs/transports.docs.descriptor.js.map +1 -0
- package/dist/formatters/index.d.ts +7 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +8 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/json/json.formatters.descriptor.d.ts +9 -0
- package/dist/formatters/json/json.formatters.descriptor.d.ts.map +1 -0
- package/dist/formatters/json/json.formatters.descriptor.js +22 -0
- package/dist/formatters/json/json.formatters.descriptor.js.map +1 -0
- package/dist/formatters/json/json.impl.d.ts +22 -0
- package/dist/formatters/json/json.impl.d.ts.map +1 -0
- package/dist/formatters/json/json.impl.js +32 -0
- package/dist/formatters/json/json.impl.js.map +1 -0
- package/dist/formatters/json5/json5.descriptor.d.ts +9 -0
- package/dist/formatters/json5/json5.descriptor.d.ts.map +1 -0
- package/dist/formatters/json5/json5.descriptor.js +22 -0
- package/dist/formatters/json5/json5.descriptor.js.map +1 -0
- package/dist/formatters/json5/json5.impl.d.ts +23 -0
- package/dist/formatters/json5/json5.impl.d.ts.map +1 -0
- package/dist/formatters/json5/json5.impl.js +34 -0
- package/dist/formatters/json5/json5.impl.js.map +1 -0
- package/dist/formatters/jsonl/jsonl.descriptor.d.ts +10 -0
- package/dist/formatters/jsonl/jsonl.descriptor.d.ts.map +1 -0
- package/dist/formatters/jsonl/jsonl.descriptor.js +23 -0
- package/dist/formatters/jsonl/jsonl.descriptor.js.map +1 -0
- package/dist/formatters/jsonl/jsonl.impl.d.ts +21 -0
- package/dist/formatters/jsonl/jsonl.impl.d.ts.map +1 -0
- package/dist/formatters/jsonl/jsonl.impl.js +30 -0
- package/dist/formatters/jsonl/jsonl.impl.js.map +1 -0
- package/dist/formatters/pretty/pretty.descriptor.d.ts +9 -0
- package/dist/formatters/pretty/pretty.descriptor.d.ts.map +1 -0
- package/dist/formatters/pretty/pretty.descriptor.js +23 -0
- package/dist/formatters/pretty/pretty.descriptor.js.map +1 -0
- package/dist/formatters/pretty/pretty.impl.cli.d.ts +23 -0
- package/dist/formatters/pretty/pretty.impl.cli.d.ts.map +1 -0
- package/dist/formatters/pretty/pretty.impl.cli.js +81 -0
- package/dist/formatters/pretty/pretty.impl.cli.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/kinds/audit.d.ts +85 -0
- package/dist/kinds/audit.d.ts.map +1 -0
- package/dist/kinds/audit.js +71 -0
- package/dist/kinds/audit.js.map +1 -0
- package/dist/kinds/contexts.d.ts +21 -0
- package/dist/kinds/contexts.d.ts.map +1 -0
- package/dist/kinds/contexts.js +8 -0
- package/dist/kinds/contexts.js.map +1 -0
- package/dist/kinds/formatter.d.ts +42 -0
- package/dist/kinds/formatter.d.ts.map +1 -0
- package/dist/kinds/formatter.js +69 -0
- package/dist/kinds/formatter.js.map +1 -0
- package/dist/kinds/index.d.ts +13 -0
- package/dist/kinds/index.d.ts.map +1 -0
- package/dist/kinds/index.js +13 -0
- package/dist/kinds/index.js.map +1 -0
- package/dist/kinds/logger.contracts.d.ts +16 -0
- package/dist/kinds/logger.contracts.d.ts.map +1 -0
- package/dist/kinds/logger.contracts.js +9 -0
- package/dist/kinds/logger.contracts.js.map +1 -0
- package/dist/kinds/logger.d.ts +15 -0
- package/dist/kinds/logger.d.ts.map +1 -0
- package/dist/kinds/logger.impl.d.ts +40 -0
- package/dist/kinds/logger.impl.d.ts.map +1 -0
- package/dist/kinds/logger.impl.js +139 -0
- package/dist/kinds/logger.impl.js.map +1 -0
- package/dist/kinds/logger.js +28 -0
- package/dist/kinds/logger.js.map +1 -0
- package/dist/kinds/logger.utils.d.ts +15 -0
- package/dist/kinds/logger.utils.d.ts.map +1 -0
- package/dist/kinds/logger.utils.js +55 -0
- package/dist/kinds/logger.utils.js.map +1 -0
- package/dist/kinds/output.contracts.d.ts +50 -0
- package/dist/kinds/output.contracts.d.ts.map +1 -0
- package/dist/kinds/output.contracts.js +10 -0
- package/dist/kinds/output.contracts.js.map +1 -0
- package/dist/kinds/output.d.ts +20 -0
- package/dist/kinds/output.d.ts.map +1 -0
- package/dist/kinds/output.impl.d.ts +22 -0
- package/dist/kinds/output.impl.d.ts.map +1 -0
- package/dist/kinds/output.impl.js +84 -0
- package/dist/kinds/output.impl.js.map +1 -0
- package/dist/kinds/output.js +29 -0
- package/dist/kinds/output.js.map +1 -0
- package/dist/kinds/output.types.d.ts +92 -0
- package/dist/kinds/output.types.d.ts.map +1 -0
- package/dist/kinds/output.types.js +7 -0
- package/dist/kinds/output.types.js.map +1 -0
- package/dist/kinds/sink.d.ts +40 -0
- package/dist/kinds/sink.d.ts.map +1 -0
- package/dist/kinds/sink.js +61 -0
- package/dist/kinds/sink.js.map +1 -0
- package/dist/logger.context.descriptor.d.ts +21 -0
- package/dist/logger.context.descriptor.d.ts.map +1 -0
- package/dist/logger.context.descriptor.js +12 -0
- package/dist/logger.context.descriptor.js.map +1 -0
- package/dist/logging.cli.plugin.d.ts +20 -0
- package/dist/logging.cli.plugin.d.ts.map +1 -0
- package/dist/logging.cli.plugin.js +39 -0
- package/dist/logging.cli.plugin.js.map +1 -0
- package/dist/logging.plugin.d.ts +16 -0
- package/dist/logging.plugin.d.ts.map +1 -0
- package/dist/logging.plugin.js +83 -0
- package/dist/logging.plugin.js.map +1 -0
- package/dist/outputs/index.d.ts +7 -0
- package/dist/outputs/index.d.ts.map +1 -0
- package/dist/outputs/index.js +8 -0
- package/dist/outputs/index.js.map +1 -0
- package/dist/outputs/remote/remote.descriptor.d.ts +10 -0
- package/dist/outputs/remote/remote.descriptor.d.ts.map +1 -0
- package/dist/outputs/remote/remote.descriptor.js +24 -0
- package/dist/outputs/remote/remote.descriptor.js.map +1 -0
- package/dist/outputs/remote/remote.impl.d.ts +50 -0
- package/dist/outputs/remote/remote.impl.d.ts.map +1 -0
- package/dist/outputs/remote/remote.impl.js +178 -0
- package/dist/outputs/remote/remote.impl.js.map +1 -0
- package/dist/outputs.context.descriptor.d.ts +19 -0
- package/dist/outputs.context.descriptor.d.ts.map +1 -0
- package/dist/outputs.context.descriptor.js +9 -0
- package/dist/outputs.context.descriptor.js.map +1 -0
- package/dist/outputs.context.impl.d.ts +9 -0
- package/dist/outputs.context.impl.d.ts.map +1 -0
- package/dist/outputs.context.impl.js +18 -0
- package/dist/outputs.context.impl.js.map +1 -0
- package/dist/paths.d.ts +8 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/schemas/audit.d.ts +133 -0
- package/dist/schemas/audit.d.ts.map +1 -0
- package/dist/schemas/audit.js +80 -0
- package/dist/schemas/audit.js.map +1 -0
- package/dist/schemas/entry.d.ts +74 -0
- package/dist/schemas/entry.d.ts.map +1 -0
- package/dist/schemas/entry.js +62 -0
- package/dist/schemas/entry.js.map +1 -0
- package/dist/schemas/formatter.d.ts +46 -0
- package/dist/schemas/formatter.d.ts.map +1 -0
- package/dist/schemas/formatter.js +31 -0
- package/dist/schemas/formatter.js.map +1 -0
- package/dist/schemas/index.d.ts +12 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +18 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/logger.d.ts +48 -0
- package/dist/schemas/logger.d.ts.map +1 -0
- package/dist/schemas/logger.js +27 -0
- package/dist/schemas/logger.js.map +1 -0
- package/dist/schemas/output.d.ts +68 -0
- package/dist/schemas/output.d.ts.map +1 -0
- package/dist/schemas/output.js +48 -0
- package/dist/schemas/output.js.map +1 -0
- package/dist/schemas/sink.d.ts +52 -0
- package/dist/schemas/sink.d.ts.map +1 -0
- package/dist/schemas/sink.js +30 -0
- package/dist/schemas/sink.js.map +1 -0
- package/dist/sinks/buffer/buffer.descriptor.d.ts +4 -0
- package/dist/sinks/buffer/buffer.descriptor.d.ts.map +1 -0
- package/dist/sinks/buffer/buffer.descriptor.js +11 -0
- package/dist/sinks/buffer/buffer.descriptor.js.map +1 -0
- package/dist/sinks/buffer/buffer.impl.cli.d.ts +21 -0
- package/dist/sinks/buffer/buffer.impl.cli.d.ts.map +1 -0
- package/dist/sinks/buffer/buffer.impl.cli.js +34 -0
- package/dist/sinks/buffer/buffer.impl.cli.js.map +1 -0
- package/dist/sinks/console/console.descriptor.d.ts +10 -0
- package/dist/sinks/console/console.descriptor.d.ts.map +1 -0
- package/dist/sinks/console/console.descriptor.js +17 -0
- package/dist/sinks/console/console.descriptor.js.map +1 -0
- package/dist/sinks/console/console.impl.browser.d.ts +21 -0
- package/dist/sinks/console/console.impl.browser.d.ts.map +1 -0
- package/dist/sinks/console/console.impl.browser.js +57 -0
- package/dist/sinks/console/console.impl.browser.js.map +1 -0
- package/dist/sinks/console/console.impl.cli.d.ts +21 -0
- package/dist/sinks/console/console.impl.cli.d.ts.map +1 -0
- package/dist/sinks/console/console.impl.cli.js +57 -0
- package/dist/sinks/console/console.impl.cli.js.map +1 -0
- package/dist/sinks/index.d.ts +8 -0
- package/dist/sinks/index.d.ts.map +1 -0
- package/dist/sinks/index.js +8 -0
- package/dist/sinks/index.js.map +1 -0
- package/dist/sinks/memory/memory.descriptor.d.ts +10 -0
- package/dist/sinks/memory/memory.descriptor.d.ts.map +1 -0
- package/dist/sinks/memory/memory.descriptor.js +17 -0
- package/dist/sinks/memory/memory.descriptor.js.map +1 -0
- package/dist/sinks/memory/memory.impl.d.ts +50 -0
- package/dist/sinks/memory/memory.impl.d.ts.map +1 -0
- package/dist/sinks/memory/memory.impl.js +88 -0
- package/dist/sinks/memory/memory.impl.js.map +1 -0
- package/dist/sinks/stdout/stdout.descriptor.d.ts +4 -0
- package/dist/sinks/stdout/stdout.descriptor.d.ts.map +1 -0
- package/dist/sinks/stdout/stdout.descriptor.js +11 -0
- package/dist/sinks/stdout/stdout.descriptor.js.map +1 -0
- package/dist/sinks/stdout/stdout.impl.cli.d.ts +10 -0
- package/dist/sinks/stdout/stdout.impl.cli.d.ts.map +1 -0
- package/dist/sinks/stdout/stdout.impl.cli.js +21 -0
- package/dist/sinks/stdout/stdout.impl.cli.js.map +1 -0
- package/dist/sinks.context.descriptor.d.ts +19 -0
- package/dist/sinks.context.descriptor.d.ts.map +1 -0
- package/dist/sinks.context.descriptor.js +9 -0
- package/dist/sinks.context.descriptor.js.map +1 -0
- package/dist/sinks.context.impl.d.ts +9 -0
- package/dist/sinks.context.impl.d.ts.map +1 -0
- package/dist/sinks.context.impl.js +18 -0
- package/dist/sinks.context.impl.js.map +1 -0
- package/package.json +331 -0
- package/src/audit/audit.descriptor.ts +45 -0
- package/src/audit/audit.storage.schema.ts +57 -0
- package/src/audit/index.ts +8 -0
- package/src/cli/logs.descriptor.ts +19 -0
- package/src/cli/logs.list.descriptor.ts +28 -0
- package/src/cli/logs.list.impl.ts +93 -0
- package/src/cli/logs.rotate.descriptor.ts +40 -0
- package/src/cli/logs.rotate.impl.ts +61 -0
- package/src/cli/logs.search.descriptor.ts +61 -0
- package/src/cli/logs.search.impl.ts +173 -0
- package/src/cli/logs.tail.descriptor.ts +49 -0
- package/src/cli/logs.tail.impl.ts +105 -0
- package/src/cli/logs.view.descriptor.ts +57 -0
- package/src/cli/logs.view.impl.ts +108 -0
- package/src/cli/types.ts +59 -0
- package/src/contexts/audit.ts +36 -0
- package/src/contexts/fallback-logger.ts +80 -0
- package/src/contexts/index.ts +23 -0
- package/src/contexts/logger.ts +119 -0
- package/src/core/index.ts +32 -0
- package/src/core/logger.ts +150 -0
- package/src/core/namespace.ts +195 -0
- package/src/core/parsing.ts +21 -0
- package/src/core/types.ts +82 -0
- package/src/docs/levels.docs.descriptor.ts +344 -0
- package/src/docs/structured.docs.descriptor.ts +444 -0
- package/src/docs/transports.docs.descriptor.ts +428 -0
- package/src/formatters/index.ts +6 -0
- package/src/formatters/json/json.formatters.descriptor.ts +25 -0
- package/src/formatters/json/json.impl.ts +41 -0
- package/src/formatters/json5/json5.descriptor.ts +25 -0
- package/src/formatters/json5/json5.impl.ts +43 -0
- package/src/formatters/jsonl/jsonl.descriptor.ts +26 -0
- package/src/formatters/jsonl/jsonl.impl.ts +39 -0
- package/src/formatters/pretty/pretty.descriptor.ts +26 -0
- package/src/formatters/pretty/pretty.impl.cli.ts +101 -0
- package/src/index.ts +190 -0
- package/src/kinds/audit.ts +169 -0
- package/src/kinds/contexts.ts +22 -0
- package/src/kinds/formatter.ts +117 -0
- package/src/kinds/index.ts +25 -0
- package/src/kinds/logger.contracts.ts +17 -0
- package/src/kinds/logger.impl.ts +206 -0
- package/src/kinds/logger.ts +46 -0
- package/src/kinds/logger.utils.ts +91 -0
- package/src/kinds/output.contracts.ts +54 -0
- package/src/kinds/output.impl.ts +118 -0
- package/src/kinds/output.ts +59 -0
- package/src/kinds/output.types.ts +105 -0
- package/src/kinds/sink.ts +100 -0
- package/src/logger.context.descriptor.ts +13 -0
- package/src/logging.cli.plugin.ts +43 -0
- package/src/logging.plugin.ts +93 -0
- package/src/outputs/index.ts +6 -0
- package/src/outputs/remote/remote.descriptor.ts +27 -0
- package/src/outputs/remote/remote.impl.ts +218 -0
- package/src/outputs.context.descriptor.ts +10 -0
- package/src/outputs.context.impl.ts +30 -0
- package/src/paths.ts +10 -0
- package/src/schemas/audit.ts +98 -0
- package/src/schemas/entry.ts +88 -0
- package/src/schemas/formatter.ts +37 -0
- package/src/schemas/index.ts +80 -0
- package/src/schemas/logger.ts +38 -0
- package/src/schemas/output.ts +62 -0
- package/src/schemas/sink.ts +39 -0
- package/src/sinks/buffer/buffer.descriptor.ts +13 -0
- package/src/sinks/buffer/buffer.impl.cli.ts +49 -0
- package/src/sinks/console/console.descriptor.ts +20 -0
- package/src/sinks/console/console.impl.browser.ts +69 -0
- package/src/sinks/console/console.impl.cli.ts +71 -0
- package/src/sinks/index.ts +8 -0
- package/src/sinks/memory/memory.descriptor.ts +20 -0
- package/src/sinks/memory/memory.impl.ts +119 -0
- package/src/sinks/stdout/stdout.descriptor.ts +13 -0
- package/src/sinks/stdout/stdout.impl.cli.ts +27 -0
- package/src/sinks.context.descriptor.ts +10 -0
- package/src/sinks.context.impl.ts +30 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pretty Formatter Implementation (CLI)
|
|
3
|
+
*
|
|
4
|
+
* Colorized output using ansis for terminal display.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { FormatterImplementation, FormatterContext } from '../../kinds/formatter.ts';
|
|
8
|
+
import type { FormatterDescriptor } from '../../schemas/formatter.ts';
|
|
9
|
+
import type { RuntimeLogEntry, LogLevel } from '../../schemas/entry.ts';
|
|
10
|
+
import ansis from 'ansis';
|
|
11
|
+
|
|
12
|
+
/** Level colors */
|
|
13
|
+
const LEVEL_COLORS: Record<LogLevel, (text: string) => string> = {
|
|
14
|
+
debug: (t) => ansis.gray(t),
|
|
15
|
+
info: (t) => ansis.blue(t),
|
|
16
|
+
warn: (t) => ansis.yellow(t),
|
|
17
|
+
error: (t) => ansis.red(t)
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/** Level symbols */
|
|
21
|
+
const LEVEL_SYMBOLS: Record<LogLevel, string> = {
|
|
22
|
+
debug: '·',
|
|
23
|
+
info: '●',
|
|
24
|
+
warn: '▲',
|
|
25
|
+
error: '✖'
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Pretty formatter - colorized CLI output.
|
|
30
|
+
*/
|
|
31
|
+
export default class PrettyFormatter implements FormatterImplementation {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly descriptor: FormatterDescriptor;
|
|
34
|
+
private readonly useColors: boolean;
|
|
35
|
+
private readonly includeTimestamp: boolean;
|
|
36
|
+
|
|
37
|
+
constructor(descriptor: FormatterDescriptor, _context: FormatterContext) {
|
|
38
|
+
this.id = descriptor.id;
|
|
39
|
+
this.descriptor = descriptor;
|
|
40
|
+
this.useColors = descriptor.options?.colors ?? true;
|
|
41
|
+
this.includeTimestamp = descriptor.options?.includeTimestamp ?? true;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
format(entry: RuntimeLogEntry): string {
|
|
45
|
+
const { level, namespace, message, timestamp, context } = entry;
|
|
46
|
+
const colorFn = this.useColors ? LEVEL_COLORS[level] : (t: string) => t;
|
|
47
|
+
const symbol = LEVEL_SYMBOLS[level];
|
|
48
|
+
|
|
49
|
+
const parts: string[] = [];
|
|
50
|
+
|
|
51
|
+
// Timestamp
|
|
52
|
+
if (this.includeTimestamp) {
|
|
53
|
+
const time = new Date(timestamp).toLocaleTimeString('en-US', { hour12: false });
|
|
54
|
+
parts.push(this.useColors ? ansis.dim(time) : time);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Level symbol
|
|
58
|
+
parts.push(colorFn(symbol));
|
|
59
|
+
|
|
60
|
+
// Namespace
|
|
61
|
+
parts.push(this.useColors ? ansis.cyan(`[${namespace}]`) : `[${namespace}]`);
|
|
62
|
+
|
|
63
|
+
// Message
|
|
64
|
+
parts.push(message);
|
|
65
|
+
|
|
66
|
+
// Context (if any non-standard fields)
|
|
67
|
+
const contextKeys = Object.keys(context).filter(
|
|
68
|
+
(k) => !['timestamp', 'level', 'namespace', 'runtime'].includes(k)
|
|
69
|
+
);
|
|
70
|
+
if (contextKeys.length > 0) {
|
|
71
|
+
const contextObj: Record<string, unknown> = {};
|
|
72
|
+
for (const key of contextKeys) {
|
|
73
|
+
contextObj[key] = context[key];
|
|
74
|
+
}
|
|
75
|
+
const contextStr = JSON.stringify(contextObj);
|
|
76
|
+
parts.push(this.useColors ? ansis.dim(contextStr) : contextStr);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return parts.join(' ');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
parse(formatted: string): RuntimeLogEntry {
|
|
83
|
+
// Pretty format is not designed for parsing back
|
|
84
|
+
// Return a minimal entry with the raw line as message
|
|
85
|
+
return {
|
|
86
|
+
timestamp: new Date().toISOString(),
|
|
87
|
+
level: 'info',
|
|
88
|
+
namespace: 'unknown',
|
|
89
|
+
message: formatted,
|
|
90
|
+
context: {}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
formatBatch(entries: RuntimeLogEntry[]): string {
|
|
95
|
+
return entries.map((e) => this.format(e)).join('\n');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
parseBatch(formatted: string): RuntimeLogEntry[] {
|
|
99
|
+
return formatted.split('\n').map((line) => this.parse(line));
|
|
100
|
+
}
|
|
101
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vibes Logging Module
|
|
3
|
+
*
|
|
4
|
+
* Runtime-aligned logging with sinks, formatters, outputs, and audit trails.
|
|
5
|
+
*
|
|
6
|
+
* ## Usage Pattern
|
|
7
|
+
*
|
|
8
|
+
* 1. Define a logger descriptor in your module:
|
|
9
|
+
* ```ts
|
|
10
|
+
* // myapp/logging/myapp.logger.descriptor.ts
|
|
11
|
+
* import type { LoggerDescriptor } from '@vibesdotdev/logging';
|
|
12
|
+
*
|
|
13
|
+
* const descriptor: LoggerDescriptor = {
|
|
14
|
+
* kind: 'logging/logger',
|
|
15
|
+
* id: 'myapp',
|
|
16
|
+
* namespace: 'myapp',
|
|
17
|
+
* runtime: 'server',
|
|
18
|
+
* sinks: ['console'],
|
|
19
|
+
* level: 'info'
|
|
20
|
+
* };
|
|
21
|
+
*
|
|
22
|
+
* export default descriptor;
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* 2. Get the logger from runtime:
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { getLogger } from '@vibesdotdev/logging';
|
|
28
|
+
*
|
|
29
|
+
* const logger = getLogger('myapp');
|
|
30
|
+
* logger.info('Application started', { version: '1.0.0' });
|
|
31
|
+
*
|
|
32
|
+
* // Child loggers
|
|
33
|
+
* const dbLogger = logger.child('database');
|
|
34
|
+
* dbLogger.debug('Connected to database');
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* 3. Audit logging:
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { auditLog } from '@vibesdotdev/logging';
|
|
40
|
+
*
|
|
41
|
+
* await auditLog({
|
|
42
|
+
* category: 'authentication',
|
|
43
|
+
* severity: 'medium',
|
|
44
|
+
* action: 'login',
|
|
45
|
+
* actor: { id: 'user-123', type: 'user' },
|
|
46
|
+
* outcome: 'success'
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @module
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
// Plugin
|
|
54
|
+
export { default as loggingPlugin } from './logging.plugin';
|
|
55
|
+
|
|
56
|
+
// Core logger types
|
|
57
|
+
export type { Logger, Runtime, RuntimeLoggerOptions, RuntimeLoggerConfig } from './core/types.ts';
|
|
58
|
+
|
|
59
|
+
// Re-export LoggerChildOptions from schemas
|
|
60
|
+
export type { LoggerChildOptions } from './schemas/index.ts';
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Default logger instance.
|
|
64
|
+
* For most server-side code, use this directly.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { logger } from '@vibesdotdev/logging';
|
|
69
|
+
* logger.info('Server started');
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
import { getDefaultLogger } from './contexts/logger.ts';
|
|
73
|
+
export const logger = getDefaultLogger();
|
|
74
|
+
|
|
75
|
+
// Namespace utilities
|
|
76
|
+
export {
|
|
77
|
+
parseNamespaceSettings,
|
|
78
|
+
parseNamespaceSettingsFromEnv,
|
|
79
|
+
shouldLog,
|
|
80
|
+
updateNamespaceSettings,
|
|
81
|
+
getNamespaceSettings,
|
|
82
|
+
defaultNamespaceSettings,
|
|
83
|
+
type NamespaceSettings,
|
|
84
|
+
type NamespaceSelector,
|
|
85
|
+
type NamespaceSelectors
|
|
86
|
+
} from './core/namespace.ts';
|
|
87
|
+
|
|
88
|
+
// Schemas
|
|
89
|
+
export {
|
|
90
|
+
// Entry types
|
|
91
|
+
LogLevelSchema,
|
|
92
|
+
type LogLevel,
|
|
93
|
+
LOG_LEVEL_ORDER,
|
|
94
|
+
LogContextSchema,
|
|
95
|
+
type LogContext,
|
|
96
|
+
LoggerChildOptionsSchema,
|
|
97
|
+
RuntimeLogEntrySchema,
|
|
98
|
+
type RuntimeLogEntry,
|
|
99
|
+
type RequestLogContext,
|
|
100
|
+
type JobLogContext,
|
|
101
|
+
type PerformanceTracker,
|
|
102
|
+
type PerformanceTrackerParams,
|
|
103
|
+
// Sink schemas
|
|
104
|
+
SinkDescriptorSchema,
|
|
105
|
+
type SinkDescriptor,
|
|
106
|
+
type SinkFormat,
|
|
107
|
+
type SinkBatching,
|
|
108
|
+
// Formatter schemas
|
|
109
|
+
FormatterDescriptorSchema,
|
|
110
|
+
type FormatterDescriptor,
|
|
111
|
+
type FormatterOptions,
|
|
112
|
+
// Output schemas
|
|
113
|
+
OutputDescriptorSchema,
|
|
114
|
+
type OutputDescriptor,
|
|
115
|
+
type OutputRotation,
|
|
116
|
+
type OutputBuffering,
|
|
117
|
+
type OutputStorage,
|
|
118
|
+
// Audit schemas
|
|
119
|
+
AuditDescriptorSchema,
|
|
120
|
+
type AuditDescriptor,
|
|
121
|
+
AuditEntrySchema,
|
|
122
|
+
type AuditEntry,
|
|
123
|
+
type AuditCategory,
|
|
124
|
+
type AuditSeverity,
|
|
125
|
+
type AuditOutcome,
|
|
126
|
+
type AuditActor,
|
|
127
|
+
type AuditTarget,
|
|
128
|
+
// Logger schemas
|
|
129
|
+
LoggerDescriptorSchema,
|
|
130
|
+
type LoggerDescriptor,
|
|
131
|
+
type LoggerRuntime
|
|
132
|
+
} from './schemas/index.ts';
|
|
133
|
+
|
|
134
|
+
// Kinds
|
|
135
|
+
export { sinkKind, type SinkImplementation, type SinkContext } from './kinds/sink.ts';
|
|
136
|
+
export {
|
|
137
|
+
formatterKind,
|
|
138
|
+
type FormatterImplementation,
|
|
139
|
+
type FormatterContext
|
|
140
|
+
} from './kinds/formatter.ts';
|
|
141
|
+
export {
|
|
142
|
+
outputKind,
|
|
143
|
+
type OutputImplementation,
|
|
144
|
+
type OutputContext,
|
|
145
|
+
type OutputReadOptions,
|
|
146
|
+
type OutputTailOptions,
|
|
147
|
+
type TailHandle,
|
|
148
|
+
type OutputStats
|
|
149
|
+
} from './kinds/output.ts';
|
|
150
|
+
export {
|
|
151
|
+
auditKind,
|
|
152
|
+
type AuditImplementation,
|
|
153
|
+
type AuditContext,
|
|
154
|
+
type AuditLogInput,
|
|
155
|
+
type AuditQueryOptions
|
|
156
|
+
} from './kinds/audit.ts';
|
|
157
|
+
export { loggerKind } from './kinds/logger.ts';
|
|
158
|
+
export { type LoggerImplementation, type LoggerContext } from './kinds/logger.impl';
|
|
159
|
+
|
|
160
|
+
// Context providers
|
|
161
|
+
export {
|
|
162
|
+
// Logger context
|
|
163
|
+
configureLoggerContext,
|
|
164
|
+
createLoggerContextProvider,
|
|
165
|
+
getLoggerContext,
|
|
166
|
+
setLoggerContext,
|
|
167
|
+
getLogger,
|
|
168
|
+
getDefaultLogger,
|
|
169
|
+
registerLogger,
|
|
170
|
+
initializeLoggers,
|
|
171
|
+
type LoggerContextConfig,
|
|
172
|
+
type LoggerContextProvider,
|
|
173
|
+
type RuntimeLogger,
|
|
174
|
+
// Audit context types only — use runtime to resolve audit implementations
|
|
175
|
+
type AuditContextConfig,
|
|
176
|
+
type AuditContextProvider
|
|
177
|
+
} from './contexts/index.ts';
|
|
178
|
+
|
|
179
|
+
// Sinks (types only — implementations autoloaded by runtime)
|
|
180
|
+
export { type MemorySinkQueryOptions } from './sinks/index.ts';
|
|
181
|
+
|
|
182
|
+
// Audit (storage schemas only — implementations autoloaded by runtime)
|
|
183
|
+
export {
|
|
184
|
+
AuditEntryStorageSchema,
|
|
185
|
+
type AuditEntryStorage,
|
|
186
|
+
type AuditRetentionPolicy,
|
|
187
|
+
DEFAULT_RETENTION_POLICIES,
|
|
188
|
+
type AuditStorageConfig,
|
|
189
|
+
defaultAuditStorageConfig
|
|
190
|
+
} from './audit/index.ts';
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Logging Kind Definition
|
|
3
|
+
*
|
|
4
|
+
* Audit loggers capture compliance and security events.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { RuntimeKindDescriptor, KindContext, RuntimeDescriptor } from '@vibesdotdev/runtime/schemas/kind';
|
|
8
|
+
import type { RuntimeScope } from '@vibesdotdev/runtime/schemas/scope';
|
|
9
|
+
import {
|
|
10
|
+
AuditDescriptorSchema,
|
|
11
|
+
type AuditDescriptor,
|
|
12
|
+
type AuditEntry,
|
|
13
|
+
type AuditCategory,
|
|
14
|
+
type AuditSeverity,
|
|
15
|
+
type AuditOutcome,
|
|
16
|
+
type AuditActor,
|
|
17
|
+
type AuditTarget
|
|
18
|
+
} from '../schemas/audit.ts';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Input for logging an audit event.
|
|
22
|
+
*/
|
|
23
|
+
export interface AuditLogInput {
|
|
24
|
+
/** Event category */
|
|
25
|
+
category: AuditCategory;
|
|
26
|
+
/** Severity level */
|
|
27
|
+
severity: AuditSeverity;
|
|
28
|
+
/** Action performed */
|
|
29
|
+
action: string;
|
|
30
|
+
/** Who triggered the event */
|
|
31
|
+
actor: AuditActor;
|
|
32
|
+
/** What was affected (optional) */
|
|
33
|
+
target?: AuditTarget;
|
|
34
|
+
/** Event outcome */
|
|
35
|
+
outcome: AuditOutcome;
|
|
36
|
+
/** Additional context */
|
|
37
|
+
context?: Record<string, unknown>;
|
|
38
|
+
/** Error details */
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Query options for retrieving audit entries.
|
|
44
|
+
*/
|
|
45
|
+
export interface AuditQueryOptions {
|
|
46
|
+
/** Filter by category */
|
|
47
|
+
category?: AuditCategory;
|
|
48
|
+
/** Filter by severity (minimum) */
|
|
49
|
+
severity?: AuditSeverity;
|
|
50
|
+
/** Filter by actor ID */
|
|
51
|
+
actorId?: string;
|
|
52
|
+
/** Filter by target ID */
|
|
53
|
+
targetId?: string;
|
|
54
|
+
/** Filter by action */
|
|
55
|
+
action?: string;
|
|
56
|
+
/** Filter by outcome */
|
|
57
|
+
outcome?: AuditOutcome;
|
|
58
|
+
/** Start time (ISO 8601) */
|
|
59
|
+
after?: string;
|
|
60
|
+
/** End time (ISO 8601) */
|
|
61
|
+
before?: string;
|
|
62
|
+
/** Maximum entries to return */
|
|
63
|
+
limit?: number;
|
|
64
|
+
/** Offset for pagination */
|
|
65
|
+
offset?: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Audit implementation interface.
|
|
70
|
+
* Implementations persist audit entries with integrity guarantees.
|
|
71
|
+
*/
|
|
72
|
+
export interface AuditImplementation {
|
|
73
|
+
/** Log an audit event */
|
|
74
|
+
log(input: AuditLogInput): Promise<AuditEntry>;
|
|
75
|
+
/** Query audit entries (if supported) */
|
|
76
|
+
query?(options: AuditQueryOptions): Promise<AuditEntry[]>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Context provided to audit implementations.
|
|
81
|
+
*/
|
|
82
|
+
export interface AuditContext extends KindContext {
|
|
83
|
+
/** Runtime reference */
|
|
84
|
+
readonly runtime: unknown;
|
|
85
|
+
/** Workspace path for storage */
|
|
86
|
+
readonly workspacePath?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Default audit implementation - logs to stderr.
|
|
91
|
+
* Used when no specific implementation is registered.
|
|
92
|
+
*/
|
|
93
|
+
class DefaultAuditImplementation implements AuditImplementation {
|
|
94
|
+
readonly id: string;
|
|
95
|
+
readonly descriptor: AuditDescriptor;
|
|
96
|
+
|
|
97
|
+
constructor(descriptor: RuntimeDescriptor, _context: AuditContext) {
|
|
98
|
+
this.id = descriptor.id;
|
|
99
|
+
this.descriptor = descriptor as AuditDescriptor;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async log(input: AuditLogInput): Promise<AuditEntry> {
|
|
103
|
+
const entry: AuditEntry = {
|
|
104
|
+
id: crypto.randomUUID(),
|
|
105
|
+
timestamp: new Date().toISOString(),
|
|
106
|
+
category: input.category,
|
|
107
|
+
severity: input.severity,
|
|
108
|
+
action: input.action,
|
|
109
|
+
actor: input.actor,
|
|
110
|
+
target: input.target,
|
|
111
|
+
outcome: input.outcome,
|
|
112
|
+
context: input.context,
|
|
113
|
+
error: input.error
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Default: log to stderr to avoid stdout pollution (critical for MCP stdio)
|
|
117
|
+
console.error(`[AUDIT] ${JSON.stringify(entry)}`);
|
|
118
|
+
|
|
119
|
+
return entry;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Audit kind resolution logic.
|
|
125
|
+
* Selects audit logger based on category and hardware.
|
|
126
|
+
*/
|
|
127
|
+
function resolveAudit(
|
|
128
|
+
candidates: RuntimeDescriptor[],
|
|
129
|
+
scope: RuntimeScope,
|
|
130
|
+
_context: KindContext
|
|
131
|
+
): AuditDescriptor | undefined {
|
|
132
|
+
const typed = candidates as AuditDescriptor[];
|
|
133
|
+
if (typed.length === 0) return undefined;
|
|
134
|
+
if (typed.length === 1) return typed[0];
|
|
135
|
+
|
|
136
|
+
const hardware = scope.hardware;
|
|
137
|
+
|
|
138
|
+
// Filter by hardware compatibility
|
|
139
|
+
const matching = typed.filter((d) => {
|
|
140
|
+
if (!d.hardware || d.hardware.length === 0) return true;
|
|
141
|
+
return d.hardware.includes(hardware);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
if (matching.length === 0) return undefined;
|
|
145
|
+
|
|
146
|
+
// Prefer audits with explicit hardware match
|
|
147
|
+
const explicit = matching.filter((d) => d.hardware && d.hardware.length > 0);
|
|
148
|
+
if (explicit.length > 0) return explicit[0];
|
|
149
|
+
|
|
150
|
+
return matching[0];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Audit kind definition for runtime registration.
|
|
155
|
+
*/
|
|
156
|
+
export const auditKind: RuntimeKindDescriptor<AuditDescriptor, AuditImplementation, AuditContext> =
|
|
157
|
+
{
|
|
158
|
+
id: 'logging/audit',
|
|
159
|
+
descriptorSchema: AuditDescriptorSchema,
|
|
160
|
+
defaultImplementation: DefaultAuditImplementation,
|
|
161
|
+
resolve: resolveAudit,
|
|
162
|
+
contexts: ['runtime/workspace-path']
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
declare module '@vibesdotdev/runtime/schemas/kind-types' {
|
|
166
|
+
interface KindTypeMap {
|
|
167
|
+
'logging/audit': { descriptor: AuditDescriptor; impl: AuditImplementation };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Context Types
|
|
3
|
+
*
|
|
4
|
+
* Shared context interfaces to avoid circular dependencies.
|
|
5
|
+
* This file contains only type definitions - no implementations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { KindContext } from '@vibesdotdev/runtime/schemas/kind';
|
|
9
|
+
import type { SinkImplementation } from './sink.ts';
|
|
10
|
+
import type { OutputImplementation } from './output.ts';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Context provided to logger implementations.
|
|
14
|
+
*/
|
|
15
|
+
export interface LoggerContext extends KindContext {
|
|
16
|
+
/** Runtime reference */
|
|
17
|
+
readonly runtime: unknown;
|
|
18
|
+
/** Available sinks for this logger */
|
|
19
|
+
readonly sinks?: Map<string, SinkImplementation> | SinkImplementation[];
|
|
20
|
+
/** Available outputs for this logger */
|
|
21
|
+
readonly outputs?: Map<string, OutputImplementation> | OutputImplementation[];
|
|
22
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Formatter Kind Definition
|
|
3
|
+
*
|
|
4
|
+
* Formatters serialize log entries to various output formats.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { RuntimeKindDescriptor, KindContext, RuntimeDescriptor } from '@vibesdotdev/runtime/schemas/kind';
|
|
8
|
+
import type { RuntimeScope } from '@vibesdotdev/runtime/schemas/scope';
|
|
9
|
+
import { FormatterDescriptorSchema, type FormatterDescriptor } from '../schemas/formatter.ts';
|
|
10
|
+
import type { RuntimeLogEntry } from '../schemas/entry.ts';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Formatter implementation interface.
|
|
14
|
+
* Implementations convert log entries to/from string representation.
|
|
15
|
+
*/
|
|
16
|
+
export interface FormatterImplementation {
|
|
17
|
+
/** Format a single log entry */
|
|
18
|
+
format(entry: RuntimeLogEntry): string;
|
|
19
|
+
/** Parse a formatted string back to log entry */
|
|
20
|
+
parse(formatted: string): RuntimeLogEntry;
|
|
21
|
+
/** Format multiple entries (batch optimization) */
|
|
22
|
+
formatBatch?(entries: RuntimeLogEntry[]): string;
|
|
23
|
+
/** Parse multiple formatted strings */
|
|
24
|
+
parseBatch?(formatted: string): RuntimeLogEntry[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Context provided to formatter implementations.
|
|
29
|
+
*/
|
|
30
|
+
export interface FormatterContext extends KindContext {
|
|
31
|
+
/** Runtime reference */
|
|
32
|
+
readonly runtime: unknown;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Default formatter implementation - JSON output.
|
|
37
|
+
* Used when no specific implementation is registered.
|
|
38
|
+
*/
|
|
39
|
+
class DefaultFormatterImplementation implements FormatterImplementation {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly descriptor: FormatterDescriptor;
|
|
42
|
+
|
|
43
|
+
constructor(descriptor: RuntimeDescriptor, _context: FormatterContext) {
|
|
44
|
+
this.id = descriptor.id;
|
|
45
|
+
this.descriptor = descriptor as FormatterDescriptor;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
format(entry: RuntimeLogEntry): string {
|
|
49
|
+
return JSON.stringify(entry);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
parse(formatted: string): RuntimeLogEntry {
|
|
53
|
+
return JSON.parse(formatted) as RuntimeLogEntry;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
formatBatch(entries: RuntimeLogEntry[]): string {
|
|
57
|
+
return entries.map((e) => this.format(e)).join('\n');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
parseBatch(formatted: string): RuntimeLogEntry[] {
|
|
61
|
+
return formatted
|
|
62
|
+
.split('\n')
|
|
63
|
+
.filter((line) => line.trim())
|
|
64
|
+
.map((line) => this.parse(line));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Formatter kind resolution logic.
|
|
70
|
+
* Selects formatter based on format and hardware.
|
|
71
|
+
*/
|
|
72
|
+
function resolveFormatter(
|
|
73
|
+
candidates: RuntimeDescriptor[],
|
|
74
|
+
scope: RuntimeScope,
|
|
75
|
+
_context: KindContext
|
|
76
|
+
): FormatterDescriptor | undefined {
|
|
77
|
+
const typed = candidates as FormatterDescriptor[];
|
|
78
|
+
if (typed.length === 0) return undefined;
|
|
79
|
+
if (typed.length === 1) return typed[0];
|
|
80
|
+
|
|
81
|
+
const hardware = scope.hardware;
|
|
82
|
+
|
|
83
|
+
// Filter by hardware compatibility
|
|
84
|
+
const matching = typed.filter((d) => {
|
|
85
|
+
if (!d.hardware || d.hardware.length === 0) return true;
|
|
86
|
+
return d.hardware.includes(hardware);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (matching.length === 0) return undefined;
|
|
90
|
+
|
|
91
|
+
// Prefer formatters with explicit hardware match
|
|
92
|
+
const explicit = matching.filter((d) => d.hardware && d.hardware.length > 0);
|
|
93
|
+
if (explicit.length > 0) return explicit[0];
|
|
94
|
+
|
|
95
|
+
return matching[0];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Formatter kind definition for runtime registration.
|
|
100
|
+
*/
|
|
101
|
+
export const formatterKind: RuntimeKindDescriptor<
|
|
102
|
+
FormatterDescriptor,
|
|
103
|
+
FormatterImplementation,
|
|
104
|
+
FormatterContext
|
|
105
|
+
> = {
|
|
106
|
+
id: 'logging/formatter',
|
|
107
|
+
descriptorSchema: FormatterDescriptorSchema,
|
|
108
|
+
defaultImplementation: DefaultFormatterImplementation,
|
|
109
|
+
resolve: resolveFormatter,
|
|
110
|
+
contexts: []
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
declare module '@vibesdotdev/runtime/schemas/kind-types' {
|
|
114
|
+
interface KindTypeMap {
|
|
115
|
+
'logging/formatter': { descriptor: FormatterDescriptor; impl: FormatterImplementation };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { sinkKind, type SinkImplementation, type SinkContext } from './sink.ts';
|
|
2
|
+
import { formatterKind, type FormatterImplementation, type FormatterContext } from './formatter.ts';
|
|
3
|
+
import { outputKind, type OutputImplementation, type OutputContext } from './output.ts';
|
|
4
|
+
import {
|
|
5
|
+
auditKind,
|
|
6
|
+
type AuditImplementation,
|
|
7
|
+
type AuditContext,
|
|
8
|
+
type AuditLogInput,
|
|
9
|
+
type AuditQueryOptions
|
|
10
|
+
} from './audit.ts';
|
|
11
|
+
import { loggerKind } from './logger.ts';
|
|
12
|
+
import DefaultLoggerImplementation, { type LoggerImplementation, type LoggerContext } from './logger.impl';
|
|
13
|
+
|
|
14
|
+
export { sinkKind, type SinkImplementation, type SinkContext };
|
|
15
|
+
export { formatterKind, type FormatterImplementation, type FormatterContext };
|
|
16
|
+
export { outputKind, type OutputImplementation, type OutputContext };
|
|
17
|
+
export {
|
|
18
|
+
auditKind,
|
|
19
|
+
type AuditImplementation,
|
|
20
|
+
type AuditContext,
|
|
21
|
+
type AuditLogInput,
|
|
22
|
+
type AuditQueryOptions
|
|
23
|
+
};
|
|
24
|
+
export { loggerKind };
|
|
25
|
+
export { DefaultLoggerImplementation, type LoggerImplementation, type LoggerContext };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger kind context contract.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `./logger.impl.ts` so the helper module
|
|
5
|
+
* (`./logger.utils.ts`) can reference `LoggerContext` without forming a
|
|
6
|
+
* cycle (logger.impl imports value helpers from logger.utils).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { KindContext } from '@vibesdotdev/runtime/schemas/kind';
|
|
10
|
+
import type { OutputImplementation } from './output.contracts';
|
|
11
|
+
import type { SinkImplementation } from './sink.ts';
|
|
12
|
+
|
|
13
|
+
export interface LoggerContext extends KindContext {
|
|
14
|
+
readonly runtime: unknown;
|
|
15
|
+
readonly sinks?: Map<string, SinkImplementation> | SinkImplementation[];
|
|
16
|
+
readonly outputs?: Map<string, OutputImplementation> | OutputImplementation[];
|
|
17
|
+
}
|