@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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Sink Kind Definition
|
|
3
|
+
*
|
|
4
|
+
* Sinks are output destinations for log entries.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { RuntimeKindDescriptor, KindContext, RuntimeDescriptor } from '@vibesdotdev/runtime/schemas/kind';
|
|
8
|
+
import type { RuntimeScope } from '@vibesdotdev/runtime/schemas/scope';
|
|
9
|
+
import { SinkDescriptorSchema, type SinkDescriptor } from '../schemas/sink.ts';
|
|
10
|
+
import type { RuntimeLogEntry } from '../schemas/entry.ts';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Sink implementation interface.
|
|
14
|
+
* Implementations emit log entries to their destination.
|
|
15
|
+
*/
|
|
16
|
+
export interface SinkImplementation {
|
|
17
|
+
/** Emit a log entry to this sink */
|
|
18
|
+
emit(entry: RuntimeLogEntry): void | Promise<void>;
|
|
19
|
+
/** Flush any buffered entries */
|
|
20
|
+
flush?(): Promise<void>;
|
|
21
|
+
/** Close the sink and release resources */
|
|
22
|
+
close?(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Context provided to sink implementations.
|
|
27
|
+
*/
|
|
28
|
+
export interface SinkContext extends KindContext {
|
|
29
|
+
/** Runtime reference */
|
|
30
|
+
readonly runtime: unknown;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Default sink implementation - console output.
|
|
35
|
+
* Used when no specific implementation is registered.
|
|
36
|
+
*/
|
|
37
|
+
class DefaultSinkImplementation implements SinkImplementation {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly descriptor: SinkDescriptor;
|
|
40
|
+
|
|
41
|
+
constructor(descriptor: RuntimeDescriptor, _context: SinkContext) {
|
|
42
|
+
this.id = descriptor.id;
|
|
43
|
+
this.descriptor = descriptor as SinkDescriptor;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
emit(entry: RuntimeLogEntry): void {
|
|
47
|
+
const { level, namespace, message, context } = entry;
|
|
48
|
+
const prefix = `[${namespace}]`;
|
|
49
|
+
const payload = JSON.stringify(context);
|
|
50
|
+
const line = `[${level.toUpperCase()}] ${prefix} ${message} ${payload}`;
|
|
51
|
+
console.error(line);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Sink kind resolution logic.
|
|
57
|
+
* Selects sink based on hardware compatibility.
|
|
58
|
+
*/
|
|
59
|
+
function resolveSink(
|
|
60
|
+
candidates: RuntimeDescriptor[],
|
|
61
|
+
scope: RuntimeScope,
|
|
62
|
+
_context: KindContext
|
|
63
|
+
): SinkDescriptor | undefined {
|
|
64
|
+
const typed = candidates as SinkDescriptor[];
|
|
65
|
+
if (typed.length === 0) return undefined;
|
|
66
|
+
if (typed.length === 1) return typed[0];
|
|
67
|
+
|
|
68
|
+
const hardware = scope.hardware;
|
|
69
|
+
|
|
70
|
+
// Filter by hardware compatibility
|
|
71
|
+
const matching = typed.filter((d) => {
|
|
72
|
+
if (!d.hardware || d.hardware.length === 0) return true;
|
|
73
|
+
return d.hardware.includes(hardware);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (matching.length === 0) return undefined;
|
|
77
|
+
|
|
78
|
+
// Prefer sinks with explicit hardware match
|
|
79
|
+
const explicit = matching.filter((d) => d.hardware && d.hardware.length > 0);
|
|
80
|
+
if (explicit.length > 0) return explicit[0];
|
|
81
|
+
|
|
82
|
+
return matching[0];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Sink kind definition for runtime registration.
|
|
87
|
+
*/
|
|
88
|
+
export const sinkKind: RuntimeKindDescriptor<SinkDescriptor, SinkImplementation, SinkContext> = {
|
|
89
|
+
id: 'logging/sink',
|
|
90
|
+
descriptorSchema: SinkDescriptorSchema,
|
|
91
|
+
defaultImplementation: DefaultSinkImplementation,
|
|
92
|
+
resolve: resolveSink,
|
|
93
|
+
contexts: []
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
declare module '@vibesdotdev/runtime/schemas/kind-types' {
|
|
97
|
+
interface KindTypeMap {
|
|
98
|
+
'logging/sink': { descriptor: SinkDescriptor; impl: SinkImplementation };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Logger Context Descriptor
|
|
3
|
+
*
|
|
4
|
+
* Provides logger instance for CLI surface.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { createContextDescriptor } from '@vibesdotdev/runtime/factory/context';
|
|
8
|
+
|
|
9
|
+
export default createContextDescriptor({
|
|
10
|
+
id: 'cli/logger',
|
|
11
|
+
description: 'Logger instance for CLI and terminal output.',
|
|
12
|
+
hardware: ['consumer']
|
|
13
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging CLI Slice Plugin
|
|
3
|
+
*
|
|
4
|
+
* Registers the `vibes logs *` CLI surface (group + commands) against the
|
|
5
|
+
* `cli/group` and `cli/command` kinds owned by `@vibesdotdev/cli`.
|
|
6
|
+
*
|
|
7
|
+
* Per docs/architecture/RUNTIME-FIRST-MODULES.md §What Surfaces Are Allowed To Do
|
|
8
|
+
* and §Plugin Composition Rules, CLI is a surface adapter. The core
|
|
9
|
+
* `@vibesdotdev/logging/plugin` registers logging kinds and sinks/formatters/
|
|
10
|
+
* outputs that every consumer needs; this slice plugin layers the CLI surface
|
|
11
|
+
* on top so SSR/web/worker apps can consume logging without dragging the CLI
|
|
12
|
+
* machinery into their plugin chain.
|
|
13
|
+
*
|
|
14
|
+
* Apps that ship a CLI surface (account, ai, tools, cli-bin, etc.) should
|
|
15
|
+
* include both `@vibesdotdev/cli/cli.plugin` and `@vibesdotdev/logging/cli.plugin`
|
|
16
|
+
* after the core logging plugin in their `vibes.config.ts`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { createRuntimePlugin, loader } from '@vibesdotdev/runtime';
|
|
20
|
+
|
|
21
|
+
import logsGroup from './cli/logs.descriptor';
|
|
22
|
+
import logsList from './cli/logs.list.descriptor';
|
|
23
|
+
import logsSearch from './cli/logs.search.descriptor';
|
|
24
|
+
import logsTail from './cli/logs.tail.descriptor';
|
|
25
|
+
import logsRotate from './cli/logs.rotate.descriptor';
|
|
26
|
+
import logsView from './cli/logs.view.descriptor';
|
|
27
|
+
|
|
28
|
+
export default createRuntimePlugin({
|
|
29
|
+
id: 'logging.cli',
|
|
30
|
+
name: 'Logging CLI Surface',
|
|
31
|
+
description: '`vibes logs *` CLI commands for viewing, searching, tailing, rotating logs',
|
|
32
|
+
dependencies: ['logging', 'cli'],
|
|
33
|
+
|
|
34
|
+
descriptors: [logsGroup, logsList, logsSearch, logsTail, logsRotate, logsView],
|
|
35
|
+
|
|
36
|
+
loaders: [
|
|
37
|
+
loader('logs.list', { kind: 'cli/command' }, () => import('./cli/logs.list.impl.ts')),
|
|
38
|
+
loader('logs.search', { kind: 'cli/command' }, () => import('./cli/logs.search.impl.ts')),
|
|
39
|
+
loader('logs.tail', { kind: 'cli/command' }, () => import('./cli/logs.tail.impl.ts')),
|
|
40
|
+
loader('logs.rotate', { kind: 'cli/command' }, () => import('./cli/logs.rotate.impl.ts')),
|
|
41
|
+
loader('logs.view', { kind: 'cli/command' }, () => import('./cli/logs.view.impl.ts'))
|
|
42
|
+
]
|
|
43
|
+
});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Plugin
|
|
3
|
+
*
|
|
4
|
+
* Registers logging kinds (sink, formatter, output, audit, logger) with the
|
|
5
|
+
* runtime. Context providers for 'logging/sinks' and 'logging/outputs' are
|
|
6
|
+
* autoloaded.
|
|
7
|
+
*
|
|
8
|
+
* Surface-neutral: depends only on `context`. Apps that ship a CLI surface
|
|
9
|
+
* (cli-bin, account, ai, tools) layer `@vibesdotdev/logging/cli.plugin` on
|
|
10
|
+
* top to register the `vibes logs *` commands. SSR/web/worker apps where
|
|
11
|
+
* `@vibesdotdev/cli` is shimmed out by the cloud build must NOT pull in the
|
|
12
|
+
* CLI slice — see logging.cli.plugin.ts.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
createRuntimePlugin,
|
|
17
|
+
type AnyRuntimeKindDescriptor
|
|
18
|
+
} from '@vibesdotdev/runtime';
|
|
19
|
+
import { loader } from '@vibesdotdev/runtime';
|
|
20
|
+
import { sinkKind, formatterKind, outputKind, auditKind, loggerKind } from './kinds/index.ts';
|
|
21
|
+
import sinksContextDescriptor from './sinks.context.descriptor';
|
|
22
|
+
import outputsContextDescriptor from './outputs.context.descriptor';
|
|
23
|
+
import cliLoggerContextDescriptor from './logger.context.descriptor';
|
|
24
|
+
import consoleSinkDescriptor from './sinks/console/console.descriptor';
|
|
25
|
+
import bufferSinkDescriptor from './sinks/buffer/buffer.descriptor';
|
|
26
|
+
import stdoutSinkDescriptor from './sinks/stdout/stdout.descriptor';
|
|
27
|
+
import memorySinkDescriptor from './sinks/memory/memory.descriptor';
|
|
28
|
+
import prettyFormatterDescriptor from './formatters/pretty/pretty.descriptor';
|
|
29
|
+
import json5FormatterDescriptor from './formatters/json5/json5.descriptor';
|
|
30
|
+
import jsonlFormatterDescriptor from './formatters/jsonl/jsonl.descriptor';
|
|
31
|
+
import jsonFormatterDescriptor from './formatters/json/json.formatters.descriptor';
|
|
32
|
+
import remoteOutputDescriptor from './outputs/remote/remote.descriptor';
|
|
33
|
+
import defaultAuditDescriptor, { authenticationAuditDescriptor, securityAuditDescriptor } from './audit/audit.descriptor';
|
|
34
|
+
|
|
35
|
+
// Docs
|
|
36
|
+
import levelsDescriptor from './docs/levels.docs.descriptor';
|
|
37
|
+
import transportsDescriptor from './docs/transports.docs.descriptor';
|
|
38
|
+
import structuredDescriptor from './docs/structured.docs.descriptor';
|
|
39
|
+
|
|
40
|
+
export default createRuntimePlugin({
|
|
41
|
+
id: 'logging',
|
|
42
|
+
name: 'Logging Module',
|
|
43
|
+
description: 'Structured logging with sinks, formatters, outputs, and audit trails',
|
|
44
|
+
dependencies: ['context'],
|
|
45
|
+
|
|
46
|
+
// Cast required: kind descriptors use specific TDescriptor types which are
|
|
47
|
+
// contravariant in the defaultImplementation constructor parameter.
|
|
48
|
+
kinds: [
|
|
49
|
+
sinkKind,
|
|
50
|
+
formatterKind,
|
|
51
|
+
outputKind,
|
|
52
|
+
auditKind,
|
|
53
|
+
loggerKind
|
|
54
|
+
] as AnyRuntimeKindDescriptor[],
|
|
55
|
+
|
|
56
|
+
descriptors: [
|
|
57
|
+
sinksContextDescriptor,
|
|
58
|
+
outputsContextDescriptor,
|
|
59
|
+
cliLoggerContextDescriptor,
|
|
60
|
+
consoleSinkDescriptor,
|
|
61
|
+
bufferSinkDescriptor,
|
|
62
|
+
stdoutSinkDescriptor,
|
|
63
|
+
memorySinkDescriptor,
|
|
64
|
+
prettyFormatterDescriptor,
|
|
65
|
+
json5FormatterDescriptor,
|
|
66
|
+
jsonlFormatterDescriptor,
|
|
67
|
+
jsonFormatterDescriptor,
|
|
68
|
+
remoteOutputDescriptor,
|
|
69
|
+
defaultAuditDescriptor,
|
|
70
|
+
authenticationAuditDescriptor,
|
|
71
|
+
securityAuditDescriptor,
|
|
72
|
+
levelsDescriptor,
|
|
73
|
+
transportsDescriptor,
|
|
74
|
+
structuredDescriptor
|
|
75
|
+
],
|
|
76
|
+
|
|
77
|
+
loaders: [
|
|
78
|
+
loader(sinksContextDescriptor.id, { kind: 'context' }, () => import('./sinks.context.impl.ts')),
|
|
79
|
+
loader(outputsContextDescriptor.id, { kind: 'context' }, () =>
|
|
80
|
+
import('./outputs.context.impl.ts')
|
|
81
|
+
),
|
|
82
|
+
loader('console', { kind: 'logging/sink' }, () => import('./sinks/console/console.impl.cli.ts')),
|
|
83
|
+
loader('console', { kind: 'logging/sink', scope: 'browser' }, () => import('./sinks/console/console.impl.browser.ts')),
|
|
84
|
+
loader('buffer', { kind: 'logging/sink' }, () => import('./sinks/buffer/buffer.impl.cli.ts')),
|
|
85
|
+
loader('stdout', { kind: 'logging/sink' }, () => import('./sinks/stdout/stdout.impl.cli.ts')),
|
|
86
|
+
loader('memory', { kind: 'logging/sink' }, () => import('./sinks/memory/memory.impl.ts')),
|
|
87
|
+
loader('pretty', { kind: 'logging/formatter' }, () => import('./formatters/pretty/pretty.impl.cli.ts')),
|
|
88
|
+
loader('json5', { kind: 'logging/formatter' }, () => import('./formatters/json5/json5.impl.ts')),
|
|
89
|
+
loader('jsonl', { kind: 'logging/formatter' }, () => import('./formatters/jsonl/jsonl.impl.ts')),
|
|
90
|
+
loader('json', { kind: 'logging/formatter' }, () => import('./formatters/json/json.impl.ts')),
|
|
91
|
+
loader('remote', { kind: 'logging/output' }, () => import('./outputs/remote/remote.impl.ts'))
|
|
92
|
+
]
|
|
93
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Output Descriptor
|
|
3
|
+
*
|
|
4
|
+
* Sends logs to a remote HTTP endpoint.
|
|
5
|
+
* Cloud hardware target.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { OutputDescriptor } from '../../schemas/output.ts';
|
|
9
|
+
|
|
10
|
+
export const remoteOutputDescriptor: OutputDescriptor = {
|
|
11
|
+
kind: 'logging/output',
|
|
12
|
+
id: 'remote',
|
|
13
|
+
name: 'Remote Output',
|
|
14
|
+
description: 'Sends logs to a remote HTTP endpoint',
|
|
15
|
+
tags: ['cloud', 'centralized'],
|
|
16
|
+
hardware: ['cloud'],
|
|
17
|
+
storage: 'remote',
|
|
18
|
+
format: 'jsonl',
|
|
19
|
+
buffering: {
|
|
20
|
+
enabled: true,
|
|
21
|
+
size: 16384,
|
|
22
|
+
flushInterval: 5000,
|
|
23
|
+
maxBufferEntries: 5000
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default remoteOutputDescriptor;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Output Implementation
|
|
3
|
+
*
|
|
4
|
+
* Batched HTTP delivery to a logging endpoint.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
OutputImplementation,
|
|
9
|
+
OutputContext,
|
|
10
|
+
OutputReadOptions,
|
|
11
|
+
OutputTailOptions,
|
|
12
|
+
TailHandle,
|
|
13
|
+
OutputStats
|
|
14
|
+
} from '../../kinds/output.ts';
|
|
15
|
+
import type { OutputDescriptor, OutputBuffering } from '../../schemas/output.ts';
|
|
16
|
+
import type { RuntimeLogEntry } from '../../schemas/entry.ts';
|
|
17
|
+
import type { FormatterImplementation } from '../../kinds/formatter.ts';
|
|
18
|
+
import { getDefaultLogger } from '../../contexts/logger.ts';
|
|
19
|
+
const logger = getDefaultLogger();
|
|
20
|
+
|
|
21
|
+
/** Default remote endpoint */
|
|
22
|
+
const DEFAULT_ENDPOINT = 'http://localhost:3000/api/logs';
|
|
23
|
+
|
|
24
|
+
/** Metrics for buffer operations */
|
|
25
|
+
interface BufferMetrics {
|
|
26
|
+
/** Total entries added to buffer */
|
|
27
|
+
added: number;
|
|
28
|
+
/** Total entries sent successfully */
|
|
29
|
+
sent: number;
|
|
30
|
+
/** Total entries dropped due to buffer overflow */
|
|
31
|
+
dropped: number;
|
|
32
|
+
/** Total failed sends that were re-buffered for retry */
|
|
33
|
+
retried: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Remote output - sends logs via HTTP.
|
|
38
|
+
*/
|
|
39
|
+
export default class RemoteOutput implements OutputImplementation {
|
|
40
|
+
readonly id: string;
|
|
41
|
+
readonly descriptor: OutputDescriptor;
|
|
42
|
+
private readonly formatter: FormatterImplementation;
|
|
43
|
+
private readonly endpoint: string;
|
|
44
|
+
private readonly buffering: OutputBuffering;
|
|
45
|
+
private readonly maxBufferEntries: number;
|
|
46
|
+
|
|
47
|
+
private buffer: RuntimeLogEntry[] = [];
|
|
48
|
+
private flushTimer: ReturnType<typeof setInterval> | null = null;
|
|
49
|
+
private isFlushing = false;
|
|
50
|
+
private metrics: BufferMetrics = { added: 0, sent: 0, dropped: 0, retried: 0 };
|
|
51
|
+
|
|
52
|
+
constructor(descriptor: OutputDescriptor, context: OutputContext) {
|
|
53
|
+
this.id = descriptor.id;
|
|
54
|
+
this.descriptor = descriptor;
|
|
55
|
+
|
|
56
|
+
// Use formatter from context or create default
|
|
57
|
+
this.formatter = context.formatter ?? {
|
|
58
|
+
format: (e: RuntimeLogEntry) => JSON.stringify(e),
|
|
59
|
+
parse: (s: string) => JSON.parse(s) as RuntimeLogEntry,
|
|
60
|
+
formatBatch: (entries: RuntimeLogEntry[]) => entries.map((e) => JSON.stringify(e)).join('\n')
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Configuration
|
|
64
|
+
this.endpoint = descriptor.endpoint ?? DEFAULT_ENDPOINT;
|
|
65
|
+
this.buffering = descriptor.buffering ?? {
|
|
66
|
+
enabled: true,
|
|
67
|
+
size: 16384,
|
|
68
|
+
flushInterval: 5000,
|
|
69
|
+
maxBufferEntries: 10000
|
|
70
|
+
};
|
|
71
|
+
this.maxBufferEntries = this.buffering.maxBufferEntries ?? 10000;
|
|
72
|
+
|
|
73
|
+
// Start flush timer if buffering enabled
|
|
74
|
+
if (this.buffering.enabled && this.buffering.flushInterval) {
|
|
75
|
+
this.flushTimer = setInterval(() => {
|
|
76
|
+
this.flush().catch((err) => logger.error('Remote output flush error', { error: err }));
|
|
77
|
+
}, this.buffering.flushInterval);
|
|
78
|
+
this.flushTimer.unref?.();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Get current buffer metrics */
|
|
83
|
+
getMetrics(): BufferMetrics {
|
|
84
|
+
return { ...this.metrics };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Get current buffer size */
|
|
88
|
+
getBufferSize(): number {
|
|
89
|
+
return this.buffer.length;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private addToBuffer(entries: RuntimeLogEntry[]): void {
|
|
93
|
+
const spaceAvailable = this.maxBufferEntries - this.buffer.length;
|
|
94
|
+
|
|
95
|
+
if (entries.length <= spaceAvailable) {
|
|
96
|
+
// All entries fit
|
|
97
|
+
this.buffer.push(...entries);
|
|
98
|
+
this.metrics.added += entries.length;
|
|
99
|
+
} else if (spaceAvailable > 0) {
|
|
100
|
+
// Partial fit - add what we can, drop the oldest to make room for rest
|
|
101
|
+
const toAdd = entries.slice(-spaceAvailable); // Keep newest entries
|
|
102
|
+
const toDrop = entries.slice(0, entries.length - spaceAvailable);
|
|
103
|
+
this.buffer.push(...toAdd);
|
|
104
|
+
this.metrics.added += toAdd.length;
|
|
105
|
+
this.metrics.dropped += toDrop.length;
|
|
106
|
+
} else {
|
|
107
|
+
// No space - drop oldest entries to make room for newest
|
|
108
|
+
const dropCount = Math.min(entries.length, this.maxBufferEntries);
|
|
109
|
+
this.buffer.splice(0, dropCount); // Remove oldest
|
|
110
|
+
this.metrics.dropped += dropCount;
|
|
111
|
+
this.buffer.push(...entries);
|
|
112
|
+
this.metrics.added += entries.length;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async write(entry: RuntimeLogEntry): Promise<void> {
|
|
117
|
+
if (this.buffering.enabled) {
|
|
118
|
+
this.addToBuffer([entry]);
|
|
119
|
+
|
|
120
|
+
// Flush if buffer is large enough
|
|
121
|
+
const estimatedSize = JSON.stringify(this.buffer).length;
|
|
122
|
+
if (estimatedSize >= this.buffering.size) {
|
|
123
|
+
await this.flush();
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
await this.send([entry]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async writeBatch(entries: RuntimeLogEntry[]): Promise<void> {
|
|
131
|
+
if (this.buffering.enabled) {
|
|
132
|
+
this.addToBuffer(entries);
|
|
133
|
+
|
|
134
|
+
const estimatedSize = JSON.stringify(this.buffer).length;
|
|
135
|
+
if (estimatedSize >= this.buffering.size) {
|
|
136
|
+
await this.flush();
|
|
137
|
+
}
|
|
138
|
+
} else {
|
|
139
|
+
await this.send(entries);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async flush(): Promise<void> {
|
|
144
|
+
if (this.buffer.length === 0 || this.isFlushing) return;
|
|
145
|
+
|
|
146
|
+
this.isFlushing = true;
|
|
147
|
+
try {
|
|
148
|
+
const entries = this.buffer.splice(0);
|
|
149
|
+
await this.send(entries);
|
|
150
|
+
} finally {
|
|
151
|
+
this.isFlushing = false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async read(_options?: OutputReadOptions): Promise<string[]> {
|
|
156
|
+
// Remote outputs do not support reading
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
tail(_callback: (line: string) => void, _options?: OutputTailOptions): TailHandle {
|
|
161
|
+
// Remote outputs do not support tailing
|
|
162
|
+
return { close: () => {} };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async stats(): Promise<OutputStats> {
|
|
166
|
+
return { size: 0, exists: true };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async close(): Promise<void> {
|
|
170
|
+
// Clear flush timer
|
|
171
|
+
if (this.flushTimer) {
|
|
172
|
+
clearInterval(this.flushTimer);
|
|
173
|
+
this.flushTimer = null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Flush remaining buffer
|
|
177
|
+
await this.flush();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private async send(entries: RuntimeLogEntry[]): Promise<void> {
|
|
181
|
+
if (entries.length === 0) return;
|
|
182
|
+
|
|
183
|
+
const body = this.formatter.formatBatch
|
|
184
|
+
? this.formatter.formatBatch(entries)
|
|
185
|
+
: entries.map((e) => this.formatter.format(e)).join('\n');
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
const response = await fetch(this.endpoint, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
headers: {
|
|
191
|
+
'Content-Type': 'application/x-ndjson'
|
|
192
|
+
},
|
|
193
|
+
body
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
if (!response.ok) {
|
|
197
|
+
logger.error('Failed to send logs to remote endpoint', {
|
|
198
|
+
status: response.status,
|
|
199
|
+
statusText: response.statusText,
|
|
200
|
+
endpoint: this.endpoint
|
|
201
|
+
});
|
|
202
|
+
// Re-add failed entries to buffer for retry
|
|
203
|
+
this.addToBuffer(entries);
|
|
204
|
+
this.metrics.retried += entries.length;
|
|
205
|
+
} else {
|
|
206
|
+
this.metrics.sent += entries.length;
|
|
207
|
+
}
|
|
208
|
+
} catch (error) {
|
|
209
|
+
logger.error('Network error sending logs to remote endpoint', {
|
|
210
|
+
error: error instanceof Error ? error.message : String(error),
|
|
211
|
+
endpoint: this.endpoint
|
|
212
|
+
});
|
|
213
|
+
// Re-add failed entries to buffer for retry
|
|
214
|
+
this.addToBuffer(entries);
|
|
215
|
+
this.metrics.retried += entries.length;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Outputs Context Descriptor
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createContextDescriptor } from '@vibesdotdev/runtime/factory/context';
|
|
6
|
+
|
|
7
|
+
export default createContextDescriptor({
|
|
8
|
+
id: 'logging/outputs',
|
|
9
|
+
description: 'Map of resolved logging output implementations by ID.'
|
|
10
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging Outputs Context Implementation
|
|
3
|
+
*/
|
|
4
|
+
import type { OutputImplementation } from './kinds/output.ts';
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
provide: async (runtime: unknown) => {
|
|
8
|
+
const rt = runtime as {
|
|
9
|
+
hasKind(k: string): boolean;
|
|
10
|
+
query(k: string): {
|
|
11
|
+
descriptors(): { id: string }[];
|
|
12
|
+
withId(id: string): { resolve(): Promise<unknown> };
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
const map = new Map<string, OutputImplementation>();
|
|
16
|
+
if (rt.hasKind('logging/output')) {
|
|
17
|
+
for (const desc of rt.query('logging/output').descriptors()) {
|
|
18
|
+
try {
|
|
19
|
+
map.set(
|
|
20
|
+
desc.id,
|
|
21
|
+
(await rt.query('logging/output').withId(desc.id).resolve()) as OutputImplementation
|
|
22
|
+
);
|
|
23
|
+
} catch {
|
|
24
|
+
// Skip outputs that fail to resolve
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return map;
|
|
29
|
+
}
|
|
30
|
+
};
|
package/src/paths.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log path utilities (string-only, universal-isomorphic).
|
|
3
|
+
*
|
|
4
|
+
* FS-backed path resolution (getVibesGlobalLogDir, resolveLogPathFromDescriptorPath)
|
|
5
|
+
* lives in @vibesdotdev/logging-fs.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export function uniqueLogPaths(paths: Array<string | null | undefined>): string[] {
|
|
9
|
+
return Array.from(new Set(paths.filter((path): path is string => Boolean(path))));
|
|
10
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit Logging Descriptor Schema
|
|
3
|
+
*
|
|
4
|
+
* Audit logging for compliance and security events.
|
|
5
|
+
* Entries are immutable and stored with integrity guarantees.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as z from 'zod/v4';
|
|
9
|
+
import { RuntimeDescriptorSchema } from '@vibesdotdev/runtime/schemas/descriptor';
|
|
10
|
+
|
|
11
|
+
/** Audit event categories */
|
|
12
|
+
export const AuditCategorySchema = z.enum([
|
|
13
|
+
'authentication',
|
|
14
|
+
'authorization',
|
|
15
|
+
'data_access',
|
|
16
|
+
'data_modification',
|
|
17
|
+
'configuration',
|
|
18
|
+
'system',
|
|
19
|
+
'security'
|
|
20
|
+
]);
|
|
21
|
+
export type AuditCategory = z.infer<typeof AuditCategorySchema>;
|
|
22
|
+
|
|
23
|
+
/** Audit event severity levels */
|
|
24
|
+
export const AuditSeveritySchema = z.enum(['low', 'medium', 'high', 'critical']);
|
|
25
|
+
export type AuditSeverity = z.infer<typeof AuditSeveritySchema>;
|
|
26
|
+
|
|
27
|
+
/** Audit event outcome */
|
|
28
|
+
export const AuditOutcomeSchema = z.enum(['success', 'failure', 'error', 'unknown']);
|
|
29
|
+
export type AuditOutcome = z.infer<typeof AuditOutcomeSchema>;
|
|
30
|
+
|
|
31
|
+
/** Actor who triggered the audit event */
|
|
32
|
+
export const AuditActorSchema = z.object({
|
|
33
|
+
/** Actor identifier */
|
|
34
|
+
id: z.string(),
|
|
35
|
+
/** Actor type (user, service, system) */
|
|
36
|
+
type: z.enum(['user', 'service', 'system']),
|
|
37
|
+
/** Human-readable name */
|
|
38
|
+
name: z.string().optional(),
|
|
39
|
+
/** IP address */
|
|
40
|
+
ip: z.string().optional(),
|
|
41
|
+
/** User agent */
|
|
42
|
+
userAgent: z.string().optional()
|
|
43
|
+
});
|
|
44
|
+
export type AuditActor = z.infer<typeof AuditActorSchema>;
|
|
45
|
+
|
|
46
|
+
/** Target of the audit event */
|
|
47
|
+
export const AuditTargetSchema = z.object({
|
|
48
|
+
/** Target identifier */
|
|
49
|
+
id: z.string(),
|
|
50
|
+
/** Target type (e.g., 'user', 'document', 'api') */
|
|
51
|
+
type: z.string(),
|
|
52
|
+
/** Human-readable name */
|
|
53
|
+
name: z.string().optional()
|
|
54
|
+
});
|
|
55
|
+
export type AuditTarget = z.infer<typeof AuditTargetSchema>;
|
|
56
|
+
|
|
57
|
+
/** Single audit log entry */
|
|
58
|
+
export const AuditEntrySchema = z.object({
|
|
59
|
+
/** Unique entry ID */
|
|
60
|
+
id: z.string(),
|
|
61
|
+
/** Timestamp (ISO 8601) */
|
|
62
|
+
timestamp: z.string(),
|
|
63
|
+
/** Event category */
|
|
64
|
+
category: AuditCategorySchema,
|
|
65
|
+
/** Severity level */
|
|
66
|
+
severity: AuditSeveritySchema,
|
|
67
|
+
/** Action performed */
|
|
68
|
+
action: z.string(),
|
|
69
|
+
/** Who triggered the event */
|
|
70
|
+
actor: AuditActorSchema,
|
|
71
|
+
/** What was affected */
|
|
72
|
+
target: AuditTargetSchema.optional(),
|
|
73
|
+
/** Event outcome */
|
|
74
|
+
outcome: AuditOutcomeSchema,
|
|
75
|
+
/** Additional context */
|
|
76
|
+
context: z.record(z.string(), z.unknown()).optional(),
|
|
77
|
+
/** Error details (for failure/error outcomes) */
|
|
78
|
+
error: z.string().optional()
|
|
79
|
+
});
|
|
80
|
+
export type AuditEntry = z.infer<typeof AuditEntrySchema>;
|
|
81
|
+
|
|
82
|
+
/** Audit descriptor schema */
|
|
83
|
+
export const AuditDescriptorSchema = RuntimeDescriptorSchema.extend({
|
|
84
|
+
kind: z.literal('logging/audit'),
|
|
85
|
+
|
|
86
|
+
/** Event category this audit config handles */
|
|
87
|
+
category: AuditCategorySchema,
|
|
88
|
+
|
|
89
|
+
/** Minimum severity to log */
|
|
90
|
+
severity: AuditSeveritySchema.default('low'),
|
|
91
|
+
|
|
92
|
+
/** Retention period (e.g., '90d', '1y') */
|
|
93
|
+
retention: z.string().default('90d'),
|
|
94
|
+
|
|
95
|
+
/** Whether entries are immutable (append-only) */
|
|
96
|
+
immutable: z.boolean().default(true)
|
|
97
|
+
});
|
|
98
|
+
export type AuditDescriptor = z.infer<typeof AuditDescriptorSchema>;
|