@vibesdotdev/logging 0.0.2 → 1.0.0-rc.4
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/LICENSE +18 -0
- package/README.md +101 -8
- package/dist/audit/audit-retention.job.descriptor.d.ts +60 -0
- package/dist/audit/audit-retention.job.descriptor.d.ts.map +1 -0
- package/dist/audit/audit-retention.job.descriptor.js +42 -0
- package/dist/audit/audit-retention.job.descriptor.js.map +1 -0
- package/dist/audit/audit-retention.job.impl.d.ts +23 -0
- package/dist/audit/audit-retention.job.impl.d.ts.map +1 -0
- package/dist/audit/audit-retention.job.impl.js +24 -0
- package/dist/audit/audit-retention.job.impl.js.map +1 -0
- package/dist/audit/audit.descriptor.d.ts +6 -0
- package/dist/audit/audit.descriptor.d.ts.map +1 -1
- package/dist/audit/audit.descriptor.js +72 -5
- package/dist/audit/audit.descriptor.js.map +1 -1
- package/dist/audit/audit.storage.schema.d.ts +3 -3
- package/dist/audit/index.d.ts +3 -1
- package/dist/audit/index.d.ts.map +1 -1
- package/dist/audit/index.js +4 -1
- package/dist/audit/index.js.map +1 -1
- package/dist/audit/scheduled-audit-retention.d.ts +39 -0
- package/dist/audit/scheduled-audit-retention.d.ts.map +1 -0
- package/dist/audit/scheduled-audit-retention.js +38 -0
- package/dist/audit/scheduled-audit-retention.js.map +1 -0
- package/dist/browser/capture-error.d.ts +66 -0
- package/dist/browser/capture-error.d.ts.map +1 -0
- package/dist/browser/capture-error.js +82 -0
- package/dist/browser/capture-error.js.map +1 -0
- package/dist/browser/index.d.ts +11 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +16 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/logging-browser.plugin.d.ts +9 -0
- package/dist/browser/logging-browser.plugin.d.ts.map +1 -0
- package/dist/browser/logging-browser.plugin.js +26 -0
- package/dist/browser/logging-browser.plugin.js.map +1 -0
- package/dist/browser/plugin.d.ts +2 -0
- package/dist/browser/plugin.d.ts.map +1 -0
- package/dist/browser/plugin.js +2 -0
- package/dist/browser/plugin.js.map +1 -0
- package/dist/browser/read-errors.d.ts +26 -0
- package/dist/browser/read-errors.d.ts.map +1 -0
- package/dist/browser/read-errors.js +38 -0
- package/dist/browser/read-errors.js.map +1 -0
- package/dist/browser/sinks/browser/browser.browser.descriptor.d.ts +10 -0
- package/dist/browser/sinks/browser/browser.browser.descriptor.d.ts.map +1 -0
- package/dist/browser/sinks/browser/browser.browser.descriptor.js +23 -0
- package/dist/browser/sinks/browser/browser.browser.descriptor.js.map +1 -0
- package/dist/browser/sinks/browser/browser.impl.browser.d.ts +83 -0
- package/dist/browser/sinks/browser/browser.impl.browser.d.ts.map +1 -0
- package/dist/browser/sinks/browser/browser.impl.browser.js +247 -0
- package/dist/browser/sinks/browser/browser.impl.browser.js.map +1 -0
- package/dist/cli/failures.d.ts +29 -0
- package/dist/cli/failures.d.ts.map +1 -0
- package/dist/cli/failures.js +44 -0
- package/dist/cli/failures.js.map +1 -0
- package/dist/cli/flags.d.ts +24 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +56 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/log-line.d.ts +23 -0
- package/dist/cli/log-line.d.ts.map +1 -0
- package/dist/cli/log-line.js +39 -0
- package/dist/cli/log-line.js.map +1 -0
- package/dist/cli/logging.logs.descriptor.d.ts +9 -0
- package/dist/cli/logging.logs.descriptor.d.ts.map +1 -0
- package/dist/cli/logging.logs.descriptor.js +16 -0
- package/dist/cli/logging.logs.descriptor.js.map +1 -0
- package/dist/cli/logs.audit.cleanup.descriptor.d.ts +7 -0
- package/dist/cli/logs.audit.cleanup.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.audit.cleanup.descriptor.js +21 -0
- package/dist/cli/logs.audit.cleanup.descriptor.js.map +1 -0
- package/dist/cli/logs.audit.cleanup.impl.d.ts +14 -0
- package/dist/cli/logs.audit.cleanup.impl.d.ts.map +1 -0
- package/dist/cli/logs.audit.cleanup.impl.js +60 -0
- package/dist/cli/logs.audit.cleanup.impl.js.map +1 -0
- package/dist/cli/logs.audit.descriptor.d.ts +9 -0
- package/dist/cli/logs.audit.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.audit.descriptor.js +41 -0
- package/dist/cli/logs.audit.descriptor.js.map +1 -0
- package/dist/cli/logs.audit.group.descriptor.d.ts +7 -0
- package/dist/cli/logs.audit.group.descriptor.d.ts.map +1 -0
- package/dist/cli/logs.audit.group.descriptor.js +15 -0
- package/dist/cli/logs.audit.group.descriptor.js.map +1 -0
- package/dist/cli/logs.audit.impl.d.ts +19 -0
- package/dist/cli/logs.audit.impl.d.ts.map +1 -0
- package/dist/cli/logs.audit.impl.js +83 -0
- package/dist/cli/logs.audit.impl.js.map +1 -0
- package/dist/cli/logs.descriptor.d.ts +1 -8
- package/dist/cli/logs.descriptor.d.ts.map +1 -1
- package/dist/cli/logs.descriptor.js +1 -15
- package/dist/cli/logs.descriptor.js.map +1 -1
- package/dist/cli/logs.list.impl.d.ts +4 -1
- package/dist/cli/logs.list.impl.d.ts.map +1 -1
- package/dist/cli/logs.list.impl.js +60 -63
- package/dist/cli/logs.list.impl.js.map +1 -1
- package/dist/cli/logs.rotate.descriptor.d.ts.map +1 -1
- package/dist/cli/logs.rotate.descriptor.js +7 -3
- package/dist/cli/logs.rotate.descriptor.js.map +1 -1
- package/dist/cli/logs.rotate.impl.d.ts +3 -1
- package/dist/cli/logs.rotate.impl.d.ts.map +1 -1
- package/dist/cli/logs.rotate.impl.js +72 -33
- package/dist/cli/logs.rotate.impl.js.map +1 -1
- package/dist/cli/logs.search.descriptor.d.ts.map +1 -1
- package/dist/cli/logs.search.descriptor.js +4 -0
- package/dist/cli/logs.search.descriptor.js.map +1 -1
- package/dist/cli/logs.search.impl.d.ts +3 -1
- package/dist/cli/logs.search.impl.d.ts.map +1 -1
- package/dist/cli/logs.search.impl.js +114 -108
- package/dist/cli/logs.search.impl.js.map +1 -1
- package/dist/cli/logs.tail.descriptor.d.ts.map +1 -1
- package/dist/cli/logs.tail.descriptor.js +2 -1
- package/dist/cli/logs.tail.descriptor.js.map +1 -1
- package/dist/cli/logs.tail.impl.d.ts +4 -2
- package/dist/cli/logs.tail.impl.d.ts.map +1 -1
- package/dist/cli/logs.tail.impl.js +84 -57
- package/dist/cli/logs.tail.impl.js.map +1 -1
- package/dist/cli/logs.view.impl.d.ts +2 -6
- package/dist/cli/logs.view.impl.d.ts.map +1 -1
- package/dist/cli/logs.view.impl.js +32 -50
- package/dist/cli/logs.view.impl.js.map +1 -1
- package/dist/cli/output.d.ts +29 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +29 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/{logging.cli.plugin.d.ts → cli/plugin.d.ts} +3 -3
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +45 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/cli/resolve-output.d.ts +25 -0
- package/dist/cli/resolve-output.d.ts.map +1 -0
- package/dist/cli/resolve-output.js +75 -0
- package/dist/cli/resolve-output.js.map +1 -0
- package/dist/cli/types.d.ts +13 -5
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js +3 -3
- package/dist/client/logging-client.d.ts +31 -0
- package/dist/client/logging-client.d.ts.map +1 -0
- package/dist/client/logging-client.js +44 -0
- package/dist/client/logging-client.js.map +1 -0
- package/dist/config/file-rotation.d.ts +11 -0
- package/dist/config/file-rotation.d.ts.map +1 -0
- package/dist/config/file-rotation.js +18 -0
- package/dist/config/file-rotation.js.map +1 -0
- package/dist/config/load-config.d.ts +7 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +68 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/logging.config.descriptor.d.ts +350 -0
- package/dist/config/logging.config.descriptor.d.ts.map +1 -0
- package/dist/config/logging.config.descriptor.js +208 -0
- package/dist/config/logging.config.descriptor.js.map +1 -0
- package/dist/config/otel-service.d.ts +9 -0
- package/dist/config/otel-service.d.ts.map +1 -0
- package/dist/config/otel-service.js +18 -0
- package/dist/config/otel-service.js.map +1 -0
- package/dist/contexts/bootstrap.plugin.d.ts +3 -0
- package/dist/contexts/bootstrap.plugin.d.ts.map +1 -0
- package/dist/contexts/bootstrap.plugin.js +13 -0
- package/dist/contexts/bootstrap.plugin.js.map +1 -0
- package/dist/contexts/fallback-logger.d.ts +7 -2
- package/dist/contexts/fallback-logger.d.ts.map +1 -1
- package/dist/contexts/fallback-logger.js +73 -46
- package/dist/contexts/fallback-logger.js.map +1 -1
- package/dist/contexts/index.d.ts +2 -2
- package/dist/contexts/index.d.ts.map +1 -1
- package/dist/contexts/index.js +2 -3
- package/dist/contexts/index.js.map +1 -1
- package/dist/contexts/logger.d.ts +38 -14
- package/dist/contexts/logger.d.ts.map +1 -1
- package/dist/contexts/logger.js +241 -62
- package/dist/contexts/logger.js.map +1 -1
- package/dist/core/attempt.d.ts +30 -0
- package/dist/core/attempt.d.ts.map +1 -0
- package/dist/core/attempt.js +44 -0
- package/dist/core/attempt.js.map +1 -0
- package/dist/core/emission-window.d.ts +34 -0
- package/dist/core/emission-window.d.ts.map +1 -0
- package/dist/core/emission-window.js +25 -0
- package/dist/core/emission-window.js.map +1 -0
- package/dist/core/endpoint.d.ts +54 -0
- package/dist/core/endpoint.d.ts.map +1 -0
- package/dist/core/endpoint.js +256 -0
- package/dist/core/endpoint.js.map +1 -0
- package/dist/core/entry-context.d.ts +106 -0
- package/dist/core/entry-context.d.ts.map +1 -0
- package/dist/core/entry-context.js +150 -0
- package/dist/core/entry-context.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/logger.d.ts +6 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +133 -67
- package/dist/core/logger.js.map +1 -1
- package/dist/core/namespace.d.ts +5 -2
- package/dist/core/namespace.d.ts.map +1 -1
- package/dist/core/namespace.js +15 -7
- package/dist/core/namespace.js.map +1 -1
- package/dist/core/normalize.d.ts +31 -0
- package/dist/core/normalize.d.ts.map +1 -0
- package/dist/core/normalize.js +67 -0
- package/dist/core/normalize.js.map +1 -0
- package/dist/core/otlp-headers.d.ts +53 -0
- package/dist/core/otlp-headers.d.ts.map +1 -0
- package/dist/core/otlp-headers.js +64 -0
- package/dist/core/otlp-headers.js.map +1 -0
- package/dist/core/otlp-partial-success.d.ts +48 -0
- package/dist/core/otlp-partial-success.d.ts.map +1 -0
- package/dist/core/otlp-partial-success.js +55 -0
- package/dist/core/otlp-partial-success.js.map +1 -0
- package/dist/core/outcome.d.ts +21 -0
- package/dist/core/outcome.d.ts.map +1 -0
- package/dist/core/outcome.js +24 -0
- package/dist/core/outcome.js.map +1 -0
- package/dist/core/output-resources.d.ts +15 -0
- package/dist/core/output-resources.d.ts.map +1 -0
- package/dist/core/output-resources.js +51 -0
- package/dist/core/output-resources.js.map +1 -0
- package/dist/core/parsing.d.ts.map +1 -1
- package/dist/core/parsing.js +13 -10
- package/dist/core/parsing.js.map +1 -1
- package/dist/core/redact.d.ts +161 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +581 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/root-identity.d.ts +13 -0
- package/dist/core/root-identity.d.ts.map +1 -0
- package/dist/core/root-identity.js +23 -0
- package/dist/core/root-identity.js.map +1 -0
- package/dist/core/types.d.ts +5 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/docs/cli.docs.descriptor.d.ts +4 -0
- package/dist/docs/cli.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/cli.docs.descriptor.js +97 -0
- package/dist/docs/cli.docs.descriptor.js.map +1 -0
- package/dist/docs/index.d.ts +7 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +7 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/levels.docs.descriptor.d.ts +1 -1
- package/dist/docs/levels.docs.descriptor.d.ts.map +1 -1
- package/dist/docs/levels.docs.descriptor.js +112 -246
- package/dist/docs/levels.docs.descriptor.js.map +1 -1
- package/dist/docs/logging.docs.descriptor.d.ts +4 -0
- package/dist/docs/logging.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/logging.docs.descriptor.js +105 -0
- package/dist/docs/logging.docs.descriptor.js.map +1 -0
- package/dist/docs/observability.docs.descriptor.d.ts +4 -0
- package/dist/docs/observability.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/observability.docs.descriptor.js +152 -0
- package/dist/docs/observability.docs.descriptor.js.map +1 -0
- package/dist/docs/structured.docs.descriptor.d.ts +1 -1
- package/dist/docs/structured.docs.descriptor.d.ts.map +1 -1
- package/dist/docs/structured.docs.descriptor.js +111 -267
- package/dist/docs/structured.docs.descriptor.js.map +1 -1
- package/dist/docs/transports.docs.descriptor.d.ts +1 -1
- package/dist/docs/transports.docs.descriptor.d.ts.map +1 -1
- package/dist/docs/transports.docs.descriptor.js +129 -344
- package/dist/docs/transports.docs.descriptor.js.map +1 -1
- package/dist/formatters/json/json.impl.d.ts +1 -1
- package/dist/formatters/json/json.impl.d.ts.map +1 -1
- package/dist/formatters/json/json.impl.js +3 -2
- package/dist/formatters/json/json.impl.js.map +1 -1
- package/dist/formatters/json5/json5.impl.d.ts +1 -1
- package/dist/formatters/json5/json5.impl.d.ts.map +1 -1
- package/dist/formatters/json5/json5.impl.js +3 -2
- package/dist/formatters/json5/json5.impl.js.map +1 -1
- package/dist/formatters/jsonl/jsonl.impl.d.ts +1 -1
- package/dist/formatters/jsonl/jsonl.impl.d.ts.map +1 -1
- package/dist/formatters/jsonl/jsonl.impl.js +3 -2
- package/dist/formatters/jsonl/jsonl.impl.js.map +1 -1
- package/dist/formatters/pretty/{pretty.impl.cli.d.ts → pretty.impl.consumer.d.ts} +1 -1
- package/dist/formatters/pretty/pretty.impl.consumer.d.ts.map +1 -0
- package/dist/formatters/pretty/{pretty.impl.cli.js → pretty.impl.consumer.js} +1 -1
- package/dist/formatters/pretty/pretty.impl.consumer.js.map +1 -0
- package/dist/host-files/file-audit.base.d.ts +39 -0
- package/dist/host-files/file-audit.base.d.ts.map +1 -0
- package/dist/host-files/file-audit.base.js +255 -0
- package/dist/host-files/file-audit.base.js.map +1 -0
- package/dist/host-files/file-output.base.d.ts +84 -0
- package/dist/host-files/file-output.base.d.ts.map +1 -0
- package/dist/host-files/file-output.base.js +401 -0
- package/dist/host-files/file-output.base.js.map +1 -0
- package/dist/host-files/file-output.factory.base.d.ts +31 -0
- package/dist/host-files/file-output.factory.base.d.ts.map +1 -0
- package/dist/host-files/file-output.factory.base.js +82 -0
- package/dist/host-files/file-output.factory.base.js.map +1 -0
- package/dist/host-files/file-output.read.base.d.ts +7 -0
- package/dist/host-files/file-output.read.base.d.ts.map +1 -0
- package/dist/host-files/file-output.read.base.js +229 -0
- package/dist/host-files/file-output.read.base.js.map +1 -0
- package/dist/host-files/file-sink.base.d.ts +22 -0
- package/dist/host-files/file-sink.base.d.ts.map +1 -0
- package/dist/host-files/file-sink.base.js +56 -0
- package/dist/host-files/file-sink.base.js.map +1 -0
- package/dist/host-files/host-file-logging.plugin.d.ts +11 -0
- package/dist/host-files/host-file-logging.plugin.d.ts.map +1 -0
- package/dist/host-files/host-file-logging.plugin.js +63 -0
- package/dist/host-files/host-file-logging.plugin.js.map +1 -0
- package/dist/host-files/index.d.ts +19 -0
- package/dist/host-files/index.d.ts.map +1 -0
- package/dist/host-files/index.js +18 -0
- package/dist/host-files/index.js.map +1 -0
- package/dist/host-files/rotate-appended-file.base.d.ts +35 -0
- package/dist/host-files/rotate-appended-file.base.d.ts.map +1 -0
- package/dist/host-files/rotate-appended-file.base.js +104 -0
- package/dist/host-files/rotate-appended-file.base.js.map +1 -0
- package/dist/host.d.ts +38 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +39 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +24 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -23
- package/dist/index.js.map +1 -1
- package/dist/kinds/audit.d.ts +40 -8
- package/dist/kinds/audit.d.ts.map +1 -1
- package/dist/kinds/audit.js +82 -20
- package/dist/kinds/audit.js.map +1 -1
- package/dist/kinds/contexts.d.ts +4 -3
- package/dist/kinds/contexts.d.ts.map +1 -1
- package/dist/kinds/file-output.d.ts +56 -0
- package/dist/kinds/file-output.d.ts.map +1 -0
- package/dist/kinds/file-output.js +11 -0
- package/dist/kinds/file-output.js.map +1 -0
- package/dist/kinds/formatter.d.ts +4 -6
- package/dist/kinds/formatter.d.ts.map +1 -1
- package/dist/kinds/formatter.js +4 -3
- package/dist/kinds/formatter.js.map +1 -1
- package/dist/kinds/index.d.ts +3 -3
- package/dist/kinds/index.d.ts.map +1 -1
- package/dist/kinds/index.js +3 -3
- package/dist/kinds/index.js.map +1 -1
- package/dist/kinds/logger.d.ts +4 -4
- package/dist/kinds/logger.d.ts.map +1 -1
- package/dist/kinds/logger.impl.d.ts +40 -13
- package/dist/kinds/logger.impl.d.ts.map +1 -1
- package/dist/kinds/logger.impl.js +179 -87
- package/dist/kinds/logger.impl.js.map +1 -1
- package/dist/kinds/logger.js +21 -11
- package/dist/kinds/logger.js.map +1 -1
- package/dist/kinds/logger.utils.d.ts +31 -4
- package/dist/kinds/logger.utils.d.ts.map +1 -1
- package/dist/kinds/logger.utils.js +58 -18
- package/dist/kinds/logger.utils.js.map +1 -1
- package/dist/kinds/output.d.ts +5 -11
- package/dist/kinds/output.d.ts.map +1 -1
- package/dist/kinds/output.impl.d.ts +9 -7
- package/dist/kinds/output.impl.d.ts.map +1 -1
- package/dist/kinds/output.impl.js +51 -29
- package/dist/kinds/output.impl.js.map +1 -1
- package/dist/kinds/output.js +10 -5
- package/dist/kinds/output.js.map +1 -1
- package/dist/kinds/output.types.d.ts +26 -7
- package/dist/kinds/output.types.d.ts.map +1 -1
- package/dist/kinds/sink.d.ts +6 -5
- package/dist/kinds/sink.d.ts.map +1 -1
- package/dist/kinds/sink.js +14 -7
- package/dist/kinds/sink.js.map +1 -1
- package/dist/logger.context.descriptor.d.ts +15 -1
- package/dist/logger.context.descriptor.d.ts.map +1 -1
- package/dist/logger.context.descriptor.js +1 -1
- package/dist/logger.context.descriptor.js.map +1 -1
- package/dist/logging.consumer.plugin.d.ts +4 -0
- package/dist/logging.consumer.plugin.d.ts.map +1 -0
- package/dist/logging.consumer.plugin.js +17 -0
- package/dist/logging.consumer.plugin.js.map +1 -0
- package/dist/logging.plugin.d.ts +3 -3
- package/dist/logging.plugin.d.ts.map +1 -1
- package/dist/logging.plugin.js +81 -42
- package/dist/logging.plugin.js.map +1 -1
- package/dist/observability/building-host.d.ts +11 -0
- package/dist/observability/building-host.d.ts.map +1 -0
- package/dist/observability/building-host.js +11 -0
- package/dist/observability/building-host.js.map +1 -0
- package/dist/observability/config.d.ts +36 -0
- package/dist/observability/config.d.ts.map +1 -0
- package/dist/observability/config.js +46 -0
- package/dist/observability/config.js.map +1 -0
- package/dist/observability/http/instrumented-fetch.d.ts +19 -0
- package/dist/observability/http/instrumented-fetch.d.ts.map +1 -0
- package/dist/observability/http/instrumented-fetch.js +175 -0
- package/dist/observability/http/instrumented-fetch.js.map +1 -0
- package/dist/observability/index.d.ts +8 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/lifecycle.d.ts +18 -0
- package/dist/observability/lifecycle.d.ts.map +1 -0
- package/dist/observability/lifecycle.js +44 -0
- package/dist/observability/lifecycle.js.map +1 -0
- package/dist/observability/observability/error-tracker.d.ts +43 -0
- package/dist/observability/observability/error-tracker.d.ts.map +1 -0
- package/dist/observability/observability/error-tracker.js +130 -0
- package/dist/observability/observability/error-tracker.js.map +1 -0
- package/dist/observability/should-keep-log.d.ts +8 -0
- package/dist/observability/should-keep-log.d.ts.map +1 -0
- package/dist/observability/should-keep-log.js +10 -0
- package/dist/observability/should-keep-log.js.map +1 -0
- package/dist/observability/telemetry/otel.d.ts +47 -0
- package/dist/observability/telemetry/otel.d.ts.map +1 -0
- package/dist/observability/telemetry/otel.js +542 -0
- package/dist/observability/telemetry/otel.js.map +1 -0
- package/dist/observability/telemetry/partial-success.d.ts +35 -0
- package/dist/observability/telemetry/partial-success.d.ts.map +1 -0
- package/dist/observability/telemetry/partial-success.js +94 -0
- package/dist/observability/telemetry/partial-success.js.map +1 -0
- package/dist/observability/telemetry/sdk-lifecycle.d.ts +37 -0
- package/dist/observability/telemetry/sdk-lifecycle.d.ts.map +1 -0
- package/dist/observability/telemetry/sdk-lifecycle.js +132 -0
- package/dist/observability/telemetry/sdk-lifecycle.js.map +1 -0
- package/dist/observability/telemetry/telemetry-root.d.ts +78 -0
- package/dist/observability/telemetry/telemetry-root.d.ts.map +1 -0
- package/dist/observability/telemetry/telemetry-root.js +79 -0
- package/dist/observability/telemetry/telemetry-root.js.map +1 -0
- package/dist/observability/telemetry-instrumentation.d.ts +76 -0
- package/dist/observability/telemetry-instrumentation.d.ts.map +1 -0
- package/dist/observability/telemetry-instrumentation.js +69 -0
- package/dist/observability/telemetry-instrumentation.js.map +1 -0
- package/dist/otel/index.d.ts +9 -0
- package/dist/otel/index.d.ts.map +1 -0
- package/dist/otel/index.js +12 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/otel/logging-otel.plugin.d.ts +11 -0
- package/dist/otel/logging-otel.plugin.d.ts.map +1 -0
- package/dist/otel/logging-otel.plugin.js +27 -0
- package/dist/otel/logging-otel.plugin.js.map +1 -0
- package/dist/otel/sinks/otel/otel.descriptor.d.ts +10 -0
- package/dist/otel/sinks/otel/otel.descriptor.d.ts.map +1 -0
- package/dist/otel/sinks/otel/otel.descriptor.js +23 -0
- package/dist/otel/sinks/otel/otel.descriptor.js.map +1 -0
- package/dist/otel/sinks/otel/otel.impl.d.ts +47 -0
- package/dist/otel/sinks/otel/otel.impl.d.ts.map +1 -0
- package/dist/otel/sinks/otel/otel.impl.js +202 -0
- package/dist/otel/sinks/otel/otel.impl.js.map +1 -0
- package/dist/otel/sinks/otel/otlp-log-exporter.d.ts +76 -0
- package/dist/otel/sinks/otel/otlp-log-exporter.d.ts.map +1 -0
- package/dist/otel/sinks/otel/otlp-log-exporter.js +178 -0
- package/dist/otel/sinks/otel/otlp-log-exporter.js.map +1 -0
- package/dist/outputs/file/file.outputs.descriptor.d.ts +10 -0
- package/dist/outputs/file/file.outputs.descriptor.d.ts.map +1 -0
- package/dist/outputs/file/file.outputs.descriptor.js +32 -0
- package/dist/outputs/file/file.outputs.descriptor.js.map +1 -0
- package/dist/outputs/remote/remote.descriptor.d.ts +1 -1
- package/dist/outputs/remote/remote.descriptor.d.ts.map +1 -1
- package/dist/outputs/remote/remote.descriptor.js +1 -2
- package/dist/outputs/remote/remote.descriptor.js.map +1 -1
- package/dist/outputs/remote/remote.factory.d.ts +9 -0
- package/dist/outputs/remote/remote.factory.d.ts.map +1 -0
- package/dist/outputs/remote/remote.factory.js +16 -0
- package/dist/outputs/remote/remote.factory.js.map +1 -0
- package/dist/outputs/remote/remote.impl.d.ts +40 -4
- package/dist/outputs/remote/remote.impl.d.ts.map +1 -1
- package/dist/outputs/remote/remote.impl.js +224 -99
- package/dist/outputs/remote/remote.impl.js.map +1 -1
- package/dist/outputs.context.descriptor.d.ts +15 -1
- package/dist/outputs.context.descriptor.d.ts.map +1 -1
- package/dist/outputs.context.descriptor.js +1 -1
- package/dist/outputs.context.descriptor.js.map +1 -1
- package/dist/outputs.context.impl.d.ts +2 -1
- package/dist/outputs.context.impl.d.ts.map +1 -1
- package/dist/outputs.context.impl.js +17 -9
- package/dist/outputs.context.impl.js.map +1 -1
- package/dist/paths.d.ts +24 -3
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +63 -3
- package/dist/paths.js.map +1 -1
- package/dist/rotation/rotate-appended-file.d.ts +15 -0
- package/dist/rotation/rotate-appended-file.d.ts.map +1 -0
- package/dist/rotation/rotate-appended-file.js +20 -0
- package/dist/rotation/rotate-appended-file.js.map +1 -0
- package/dist/rotation/rotation-policy.d.ts +19 -0
- package/dist/rotation/rotation-policy.d.ts.map +1 -0
- package/dist/rotation/rotation-policy.js +37 -0
- package/dist/rotation/rotation-policy.js.map +1 -0
- package/dist/schemas/audit.d.ts +25 -7
- package/dist/schemas/audit.d.ts.map +1 -1
- package/dist/schemas/audit.js +10 -4
- package/dist/schemas/audit.js.map +1 -1
- package/dist/schemas/entry.d.ts +11 -5
- package/dist/schemas/entry.d.ts.map +1 -1
- package/dist/schemas/entry.js +3 -2
- package/dist/schemas/entry.js.map +1 -1
- package/dist/schemas/file-host.d.ts +86 -0
- package/dist/schemas/file-host.d.ts.map +1 -0
- package/dist/schemas/file-host.js +10 -0
- package/dist/schemas/file-host.js.map +1 -0
- package/dist/schemas/formatter.d.ts +11 -1
- package/dist/schemas/formatter.d.ts.map +1 -1
- package/dist/schemas/formatter.js +1 -1
- package/dist/schemas/formatter.js.map +1 -1
- package/dist/schemas/index.d.ts +3 -2
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +3 -2
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/logger.d.ts +16 -1
- package/dist/schemas/logger.d.ts.map +1 -1
- package/dist/schemas/logger.js +6 -1
- package/dist/schemas/logger.js.map +1 -1
- package/dist/schemas/output-defaults.d.ts +44 -0
- package/dist/schemas/output-defaults.d.ts.map +1 -0
- package/dist/schemas/output-defaults.js +53 -0
- package/dist/schemas/output-defaults.js.map +1 -0
- package/dist/schemas/output.d.ts +25 -1
- package/dist/schemas/output.d.ts.map +1 -1
- package/dist/schemas/output.js +29 -2
- package/dist/schemas/output.js.map +1 -1
- package/dist/schemas/sink.d.ts +32 -1
- package/dist/schemas/sink.d.ts.map +1 -1
- package/dist/schemas/sink.js +17 -1
- package/dist/schemas/sink.js.map +1 -1
- package/dist/sinks/buffer/buffer.descriptor.js +1 -1
- package/dist/sinks/buffer/buffer.descriptor.js.map +1 -1
- package/dist/sinks/buffer/{buffer.impl.cli.d.ts → buffer.impl.d.ts} +3 -3
- package/dist/sinks/buffer/buffer.impl.d.ts.map +1 -0
- package/dist/sinks/buffer/buffer.impl.js +42 -0
- package/dist/sinks/buffer/buffer.impl.js.map +1 -0
- package/dist/sinks/console/console.descriptor.js +1 -1
- package/dist/sinks/console/console.descriptor.js.map +1 -1
- package/dist/sinks/console/console.impl.browser.d.ts +4 -3
- package/dist/sinks/console/console.impl.browser.d.ts.map +1 -1
- package/dist/sinks/console/console.impl.browser.js +11 -14
- package/dist/sinks/console/console.impl.browser.js.map +1 -1
- package/dist/sinks/console/{console.impl.cli.d.ts → console.impl.consumer.d.ts} +5 -4
- package/dist/sinks/console/console.impl.consumer.d.ts.map +1 -0
- package/dist/sinks/console/{console.impl.cli.js → console.impl.consumer.js} +16 -8
- package/dist/sinks/console/console.impl.consumer.js.map +1 -0
- package/dist/sinks/file/file.sinks.descriptor.d.ts +10 -0
- package/dist/sinks/file/file.sinks.descriptor.d.ts.map +1 -0
- package/dist/sinks/file/file.sinks.descriptor.js +23 -0
- package/dist/sinks/file/file.sinks.descriptor.js.map +1 -0
- package/dist/sinks/index.d.ts +1 -1
- package/dist/sinks/index.d.ts.map +1 -1
- package/dist/sinks/memory/memory.descriptor.d.ts +1 -1
- package/dist/sinks/memory/memory.descriptor.js +2 -2
- package/dist/sinks/memory/memory.descriptor.js.map +1 -1
- package/dist/sinks/memory/memory.impl.d.ts +5 -11
- package/dist/sinks/memory/memory.impl.d.ts.map +1 -1
- package/dist/sinks/memory/memory.impl.js +46 -21
- package/dist/sinks/memory/memory.impl.js.map +1 -1
- package/dist/sinks/stdout/stdout.descriptor.js +1 -1
- package/dist/sinks/stdout/stdout.descriptor.js.map +1 -1
- package/dist/sinks/stdout/{stdout.impl.cli.d.ts → stdout.impl.d.ts} +5 -4
- package/dist/sinks/stdout/stdout.impl.d.ts.map +1 -0
- package/dist/sinks/stdout/stdout.impl.js +29 -0
- package/dist/sinks/stdout/stdout.impl.js.map +1 -0
- package/dist/sinks.context.descriptor.d.ts +15 -1
- package/dist/sinks.context.descriptor.d.ts.map +1 -1
- package/dist/sinks.context.descriptor.js +1 -1
- package/dist/sinks.context.descriptor.js.map +1 -1
- package/dist/sinks.context.impl.d.ts +2 -1
- package/dist/sinks.context.impl.d.ts.map +1 -1
- package/dist/sinks.context.impl.js +17 -9
- package/dist/sinks.context.impl.js.map +1 -1
- package/dist/stdout-capture/mcp-frame.d.ts +23 -0
- package/dist/stdout-capture/mcp-frame.d.ts.map +1 -0
- package/dist/stdout-capture/mcp-frame.js +80 -0
- package/dist/stdout-capture/mcp-frame.js.map +1 -0
- package/dist/stdout-capture/stdout-capture.descriptor.d.ts +10 -0
- package/dist/stdout-capture/stdout-capture.descriptor.d.ts.map +1 -0
- package/dist/stdout-capture/stdout-capture.descriptor.js +17 -0
- package/dist/stdout-capture/stdout-capture.descriptor.js.map +1 -0
- package/dist/stdout-capture/stdout-capture.impl.d.ts +19 -0
- package/dist/stdout-capture/stdout-capture.impl.d.ts.map +1 -0
- package/dist/stdout-capture/stdout-capture.impl.js +49 -0
- package/dist/stdout-capture/stdout-capture.impl.js.map +1 -0
- package/dist/stdout-capture/stdout-capture.lease.d.ts +45 -0
- package/dist/stdout-capture/stdout-capture.lease.d.ts.map +1 -0
- package/dist/stdout-capture/stdout-capture.lease.js +338 -0
- package/dist/stdout-capture/stdout-capture.lease.js.map +1 -0
- package/dist/stdout-capture/stdout-capture.output.descriptor.d.ts +4 -0
- package/dist/stdout-capture/stdout-capture.output.descriptor.d.ts.map +1 -0
- package/dist/stdout-capture/stdout-capture.output.descriptor.js +18 -0
- package/dist/stdout-capture/stdout-capture.output.descriptor.js.map +1 -0
- package/dist/stdout-capture/stdout-capture.state.d.ts +29 -0
- package/dist/stdout-capture/stdout-capture.state.d.ts.map +1 -0
- package/dist/stdout-capture/stdout-capture.state.js +80 -0
- package/dist/stdout-capture/stdout-capture.state.js.map +1 -0
- package/dist/stdout-capture.d.ts +24 -0
- package/dist/stdout-capture.d.ts.map +1 -0
- package/dist/stdout-capture.js +28 -0
- package/dist/stdout-capture.js.map +1 -0
- package/dist/stdout-capture.plugin.d.ts +7 -0
- package/dist/stdout-capture.plugin.d.ts.map +1 -0
- package/dist/stdout-capture.plugin.js +28 -0
- package/dist/stdout-capture.plugin.js.map +1 -0
- package/package.json +308 -224
- package/dist/contexts/audit.d.ts +0 -34
- package/dist/contexts/audit.d.ts.map +0 -1
- package/dist/contexts/audit.js +0 -13
- package/dist/contexts/audit.js.map +0 -1
- package/dist/formatters/index.d.ts +0 -7
- package/dist/formatters/index.d.ts.map +0 -1
- package/dist/formatters/index.js +0 -8
- package/dist/formatters/index.js.map +0 -1
- package/dist/formatters/pretty/pretty.impl.cli.d.ts.map +0 -1
- package/dist/formatters/pretty/pretty.impl.cli.js.map +0 -1
- package/dist/kinds/logger.contracts.d.ts +0 -16
- package/dist/kinds/logger.contracts.d.ts.map +0 -1
- package/dist/kinds/logger.contracts.js +0 -9
- package/dist/kinds/logger.contracts.js.map +0 -1
- package/dist/kinds/output.contracts.d.ts +0 -50
- package/dist/kinds/output.contracts.d.ts.map +0 -1
- package/dist/kinds/output.contracts.js +0 -10
- package/dist/kinds/output.contracts.js.map +0 -1
- package/dist/logging.cli.plugin.d.ts.map +0 -1
- package/dist/logging.cli.plugin.js +0 -39
- package/dist/logging.cli.plugin.js.map +0 -1
- package/dist/outputs/index.d.ts +0 -7
- package/dist/outputs/index.d.ts.map +0 -1
- package/dist/outputs/index.js +0 -8
- package/dist/outputs/index.js.map +0 -1
- package/dist/sinks/buffer/buffer.impl.cli.d.ts.map +0 -1
- package/dist/sinks/buffer/buffer.impl.cli.js +0 -34
- package/dist/sinks/buffer/buffer.impl.cli.js.map +0 -1
- package/dist/sinks/console/console.impl.cli.d.ts.map +0 -1
- package/dist/sinks/console/console.impl.cli.js.map +0 -1
- package/dist/sinks/stdout/stdout.impl.cli.d.ts.map +0 -1
- package/dist/sinks/stdout/stdout.impl.cli.js +0 -21
- package/dist/sinks/stdout/stdout.impl.cli.js.map +0 -1
- package/src/audit/audit.descriptor.ts +0 -45
- package/src/audit/audit.storage.schema.ts +0 -57
- package/src/audit/index.ts +0 -8
- package/src/cli/logs.descriptor.ts +0 -19
- package/src/cli/logs.list.descriptor.ts +0 -28
- package/src/cli/logs.list.impl.ts +0 -93
- package/src/cli/logs.rotate.descriptor.ts +0 -40
- package/src/cli/logs.rotate.impl.ts +0 -61
- package/src/cli/logs.search.descriptor.ts +0 -61
- package/src/cli/logs.search.impl.ts +0 -173
- package/src/cli/logs.tail.descriptor.ts +0 -49
- package/src/cli/logs.tail.impl.ts +0 -105
- package/src/cli/logs.view.descriptor.ts +0 -57
- package/src/cli/logs.view.impl.ts +0 -108
- package/src/cli/types.ts +0 -59
- package/src/contexts/audit.ts +0 -36
- package/src/contexts/fallback-logger.ts +0 -80
- package/src/contexts/index.ts +0 -23
- package/src/contexts/logger.ts +0 -119
- package/src/core/index.ts +0 -32
- package/src/core/logger.ts +0 -150
- package/src/core/namespace.ts +0 -195
- package/src/core/parsing.ts +0 -21
- package/src/core/types.ts +0 -82
- package/src/docs/levels.docs.descriptor.ts +0 -344
- package/src/docs/structured.docs.descriptor.ts +0 -444
- package/src/docs/transports.docs.descriptor.ts +0 -428
- package/src/formatters/index.ts +0 -6
- package/src/formatters/json/json.formatters.descriptor.ts +0 -25
- package/src/formatters/json/json.impl.ts +0 -41
- package/src/formatters/json5/json5.descriptor.ts +0 -25
- package/src/formatters/json5/json5.impl.ts +0 -43
- package/src/formatters/jsonl/jsonl.descriptor.ts +0 -26
- package/src/formatters/jsonl/jsonl.impl.ts +0 -39
- package/src/formatters/pretty/pretty.descriptor.ts +0 -26
- package/src/formatters/pretty/pretty.impl.cli.ts +0 -101
- package/src/index.ts +0 -190
- package/src/kinds/audit.ts +0 -169
- package/src/kinds/contexts.ts +0 -22
- package/src/kinds/formatter.ts +0 -117
- package/src/kinds/index.ts +0 -25
- package/src/kinds/logger.contracts.ts +0 -17
- package/src/kinds/logger.impl.ts +0 -206
- package/src/kinds/logger.ts +0 -46
- package/src/kinds/logger.utils.ts +0 -91
- package/src/kinds/output.contracts.ts +0 -54
- package/src/kinds/output.impl.ts +0 -118
- package/src/kinds/output.ts +0 -59
- package/src/kinds/output.types.ts +0 -105
- package/src/kinds/sink.ts +0 -100
- package/src/logger.context.descriptor.ts +0 -13
- package/src/logging.cli.plugin.ts +0 -43
- package/src/logging.plugin.ts +0 -93
- package/src/outputs/index.ts +0 -6
- package/src/outputs/remote/remote.descriptor.ts +0 -27
- package/src/outputs/remote/remote.impl.ts +0 -218
- package/src/outputs.context.descriptor.ts +0 -10
- package/src/outputs.context.impl.ts +0 -30
- package/src/paths.ts +0 -10
- package/src/schemas/audit.ts +0 -98
- package/src/schemas/entry.ts +0 -88
- package/src/schemas/formatter.ts +0 -37
- package/src/schemas/index.ts +0 -80
- package/src/schemas/logger.ts +0 -38
- package/src/schemas/output.ts +0 -62
- package/src/schemas/sink.ts +0 -39
- package/src/sinks/buffer/buffer.descriptor.ts +0 -13
- package/src/sinks/buffer/buffer.impl.cli.ts +0 -49
- package/src/sinks/console/console.descriptor.ts +0 -20
- package/src/sinks/console/console.impl.browser.ts +0 -69
- package/src/sinks/console/console.impl.cli.ts +0 -71
- package/src/sinks/index.ts +0 -8
- package/src/sinks/memory/memory.descriptor.ts +0 -20
- package/src/sinks/memory/memory.impl.ts +0 -119
- package/src/sinks/stdout/stdout.descriptor.ts +0 -13
- package/src/sinks/stdout/stdout.impl.cli.ts +0 -27
- package/src/sinks.context.descriptor.ts +0 -10
- package/src/sinks.context.impl.ts +0 -30
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading and tailing a file output's active file over the host's file
|
|
3
|
+
* primitives (`LoggingFileHost`): bounded filtered reads, and a tail that
|
|
4
|
+
* follows appends and replacement of the active file through directory events.
|
|
5
|
+
*/
|
|
6
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
7
|
+
import * as z from 'zod/v4';
|
|
8
|
+
import { LoggedErrorSchema } from "../core/redact.js";
|
|
9
|
+
import { attempt, attemptSync, isMissingPath } from "../core/attempt.js";
|
|
10
|
+
const ReadOptionsSchema = z.object({
|
|
11
|
+
lines: z.number().int().nonnegative().default(50),
|
|
12
|
+
offset: z.number().int().nonnegative().default(0),
|
|
13
|
+
filter: z.union([z.string(), z.instanceof(RegExp)]).optional(),
|
|
14
|
+
ignoreCase: z.boolean().default(false)
|
|
15
|
+
});
|
|
16
|
+
function parseFilter(filter, ignoreCase) {
|
|
17
|
+
if (filter === undefined || filter === '')
|
|
18
|
+
return undefined;
|
|
19
|
+
try {
|
|
20
|
+
return filter instanceof RegExp
|
|
21
|
+
? new RegExp(filter.source, filter.flags)
|
|
22
|
+
: new RegExp(filter, ignoreCase ? 'i' : undefined);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new CapabilityError('The output filter is not a valid regular expression.', 'INVALID_INPUT', {
|
|
26
|
+
reason: 'output-read-filter-invalid', cause: error
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function matchesFilter(filter, line) {
|
|
31
|
+
if (!filter)
|
|
32
|
+
return true;
|
|
33
|
+
filter.lastIndex = 0;
|
|
34
|
+
return filter.test(line);
|
|
35
|
+
}
|
|
36
|
+
export async function readLines(host, filePath, options) {
|
|
37
|
+
const parsed = ReadOptionsSchema.safeParse(options ?? {});
|
|
38
|
+
if (!parsed.success) {
|
|
39
|
+
throw new CapabilityError('The output read options are invalid.', 'INVALID_INPUT', {
|
|
40
|
+
reason: 'output-read-options-invalid', cause: parsed.error
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const { lines: lineCount, offset, filter, ignoreCase } = parsed.data;
|
|
44
|
+
const regex = parseFilter(filter, ignoreCase);
|
|
45
|
+
const read = await attempt(() => host.readText(filePath));
|
|
46
|
+
if ('failure' in read) {
|
|
47
|
+
if (isMissingPath(read.failure))
|
|
48
|
+
return [];
|
|
49
|
+
throw new CapabilityError('Could not read the file output.', 'INTERNAL', {
|
|
50
|
+
reason: 'output-read-failed', details: { path: filePath }, cause: read.failure.cause
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
const lines = read.value.split('\n').filter(line => line.trim() && matchesFilter(regex, line));
|
|
54
|
+
const end = Math.max(0, lines.length - offset);
|
|
55
|
+
return lines.slice(Math.max(0, end - lineCount), end);
|
|
56
|
+
}
|
|
57
|
+
const TailOptionsSchema = ReadOptionsSchema.omit({ offset: true }).extend({
|
|
58
|
+
lines: z.number().int().nonnegative().default(10)
|
|
59
|
+
});
|
|
60
|
+
/** Native directory events follow both appends and replacement of the active file. */
|
|
61
|
+
export function tailFile(host, filePath, callback, options, reportError) {
|
|
62
|
+
const parsed = TailOptionsSchema.safeParse(options ?? {});
|
|
63
|
+
if (!parsed.success) {
|
|
64
|
+
throw new CapabilityError('The output tail options are invalid.', 'INVALID_INPUT', {
|
|
65
|
+
reason: 'output-tail-options-invalid', cause: parsed.error
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const { lines: initialLines, filter, ignoreCase } = parsed.data;
|
|
69
|
+
const regex = parseFilter(filter, ignoreCase);
|
|
70
|
+
const directory = host.dirname(filePath);
|
|
71
|
+
const name = host.basename(filePath);
|
|
72
|
+
let file = null;
|
|
73
|
+
let identity = null;
|
|
74
|
+
let position = 0;
|
|
75
|
+
let decoder = new TextDecoder();
|
|
76
|
+
let partial = '';
|
|
77
|
+
let initial = true;
|
|
78
|
+
let closed = false;
|
|
79
|
+
let dirty = false;
|
|
80
|
+
let reading = null;
|
|
81
|
+
let closing = null;
|
|
82
|
+
const pendingDiagnostics = new Set();
|
|
83
|
+
const diagnosticFailures = [];
|
|
84
|
+
function report(error) {
|
|
85
|
+
// A diagnostic that cannot be delivered is kept and raised by `close`.
|
|
86
|
+
const completed = attempt(() => reportError(error)).then(reported => {
|
|
87
|
+
if ('failure' in reported)
|
|
88
|
+
diagnosticFailures.push(LoggedErrorSchema.parse(reported.failure.cause));
|
|
89
|
+
});
|
|
90
|
+
pendingDiagnostics.add(completed);
|
|
91
|
+
void completed.then(() => pendingDiagnostics.delete(completed));
|
|
92
|
+
}
|
|
93
|
+
function deliver(line) {
|
|
94
|
+
if (closed || !line.trim() || !matchesFilter(regex, line))
|
|
95
|
+
return;
|
|
96
|
+
const delivered = attemptSync(() => callback(line));
|
|
97
|
+
if ('failure' in delivered)
|
|
98
|
+
report(LoggedErrorSchema.parse(delivered.failure.cause));
|
|
99
|
+
}
|
|
100
|
+
function reset() {
|
|
101
|
+
position = 0;
|
|
102
|
+
decoder = new TextDecoder();
|
|
103
|
+
partial = '';
|
|
104
|
+
}
|
|
105
|
+
async function drain() {
|
|
106
|
+
if (!file || closed)
|
|
107
|
+
return;
|
|
108
|
+
const current = await file.stat();
|
|
109
|
+
if (current.size < position)
|
|
110
|
+
reset();
|
|
111
|
+
const latest = [];
|
|
112
|
+
const bytes = new Uint8Array(65536);
|
|
113
|
+
while (!closed && position < current.size) {
|
|
114
|
+
const read = await file.read(bytes, 0, Math.min(bytes.byteLength, current.size - position), position);
|
|
115
|
+
if (read.bytesRead === 0)
|
|
116
|
+
break;
|
|
117
|
+
position += read.bytesRead;
|
|
118
|
+
const lines = (partial + decoder.decode(bytes.subarray(0, read.bytesRead), { stream: true })).split('\n');
|
|
119
|
+
partial = lines.pop() ?? '';
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
if (initial) {
|
|
122
|
+
if (initialLines > 0 && line.trim() && matchesFilter(regex, line)) {
|
|
123
|
+
latest.push(line);
|
|
124
|
+
if (latest.length > initialLines)
|
|
125
|
+
latest.shift();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else
|
|
129
|
+
deliver(line);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (initial) {
|
|
133
|
+
initial = false;
|
|
134
|
+
for (const line of latest)
|
|
135
|
+
deliver(line);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function refresh() {
|
|
139
|
+
// Drain the previous inode before switching, including an append that
|
|
140
|
+
// arrived immediately before its rename.
|
|
141
|
+
await drain();
|
|
142
|
+
if (closed)
|
|
143
|
+
return;
|
|
144
|
+
const statted = await attempt(() => host.stat(filePath));
|
|
145
|
+
if ('failure' in statted) {
|
|
146
|
+
if (isMissingPath(statted.failure))
|
|
147
|
+
return;
|
|
148
|
+
throw statted.failure.cause;
|
|
149
|
+
}
|
|
150
|
+
const selected = statted.value;
|
|
151
|
+
if (identity && identity.dev === selected.dev && identity.ino === selected.ino)
|
|
152
|
+
return;
|
|
153
|
+
if (file)
|
|
154
|
+
await file.close();
|
|
155
|
+
file = null;
|
|
156
|
+
identity = null;
|
|
157
|
+
reset();
|
|
158
|
+
const reopened = await attempt(() => host.open(filePath, 'r'));
|
|
159
|
+
if ('failure' in reopened) {
|
|
160
|
+
if (isMissingPath(reopened.failure))
|
|
161
|
+
return;
|
|
162
|
+
throw reopened.failure.cause;
|
|
163
|
+
}
|
|
164
|
+
file = reopened.value;
|
|
165
|
+
const opened = await file.stat();
|
|
166
|
+
identity = { dev: opened.dev, ino: opened.ino };
|
|
167
|
+
await drain();
|
|
168
|
+
}
|
|
169
|
+
function requestRead() {
|
|
170
|
+
if (closed)
|
|
171
|
+
return;
|
|
172
|
+
dirty = true;
|
|
173
|
+
if (reading)
|
|
174
|
+
return;
|
|
175
|
+
reading = attempt(async () => {
|
|
176
|
+
while (dirty && !closed) {
|
|
177
|
+
dirty = false;
|
|
178
|
+
await refresh();
|
|
179
|
+
}
|
|
180
|
+
}).then(refreshed => {
|
|
181
|
+
if ('failure' in refreshed)
|
|
182
|
+
report(LoggedErrorSchema.parse(refreshed.failure.cause));
|
|
183
|
+
}).finally(() => { reading = null; });
|
|
184
|
+
}
|
|
185
|
+
let watcher;
|
|
186
|
+
try {
|
|
187
|
+
host.mkdirRecursiveSync(directory);
|
|
188
|
+
watcher = host.watchDirectory(directory, (changed) => {
|
|
189
|
+
if (changed === null || changed === name)
|
|
190
|
+
requestRead();
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
throw new CapabilityError('Could not watch the file output.', 'INTERNAL', {
|
|
195
|
+
reason: 'output-tail-watch-failed', details: { path: filePath }, cause: error
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
// The watcher's failure ends its native events: report it, then release it.
|
|
199
|
+
const watchFailed = new Promise((_resolve, reject) => { watcher.onError(reject); });
|
|
200
|
+
void attempt(() => watchFailed).then(watched => {
|
|
201
|
+
if (!('failure' in watched))
|
|
202
|
+
return;
|
|
203
|
+
report(LoggedErrorSchema.parse(watched.failure.cause));
|
|
204
|
+
watcher.close();
|
|
205
|
+
});
|
|
206
|
+
requestRead();
|
|
207
|
+
return {
|
|
208
|
+
close() {
|
|
209
|
+
if (closing)
|
|
210
|
+
return closing;
|
|
211
|
+
closed = true;
|
|
212
|
+
dirty = false;
|
|
213
|
+
watcher.close();
|
|
214
|
+
closing = (async () => {
|
|
215
|
+
if (reading)
|
|
216
|
+
await reading;
|
|
217
|
+
const opened = file;
|
|
218
|
+
file = null;
|
|
219
|
+
if (opened)
|
|
220
|
+
await opened.close();
|
|
221
|
+
await Promise.all(pendingDiagnostics);
|
|
222
|
+
if (diagnosticFailures.length)
|
|
223
|
+
throw new AggregateError(diagnosticFailures, 'File tail diagnostics failed.');
|
|
224
|
+
})();
|
|
225
|
+
return closing;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=file-output.read.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-output.read.base.js","sourceRoot":"","sources":["../../src/host-files/file-output.read.base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `file` sink over the host's file primitives: a host file stream
|
|
3
|
+
* (`fileOutputFor(host)`) at the global log directory, batched by entries and
|
|
4
|
+
* elapsed time. `fileSinkFor(host)` is the class a host registers.
|
|
5
|
+
*/
|
|
6
|
+
import { type SinkImplementation, type SinkContext, type SinkDescriptor, type RuntimeLogEntry } from '../host.ts';
|
|
7
|
+
import type { LoggingFileHost } from '../schemas/file-host.ts';
|
|
8
|
+
/** File sinks and file outputs share the owner's ordered append and cleanup. */
|
|
9
|
+
export declare class FileSinkBase implements SinkImplementation {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly descriptor: SinkDescriptor;
|
|
12
|
+
private readonly output;
|
|
13
|
+
constructor(host: LoggingFileHost, descriptor: SinkDescriptor, context: SinkContext);
|
|
14
|
+
emit(entry: RuntimeLogEntry): Promise<void>;
|
|
15
|
+
flush(): Promise<void>;
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
type FileSinkClass = new (descriptor: SinkDescriptor, context: SinkContext) => FileSinkBase;
|
|
19
|
+
/** The `file` sink class over `host`, one per host. */
|
|
20
|
+
export declare function fileSinkFor(host: LoggingFileHost): FileSinkClass;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=file-sink.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-sink.base.d.ts","sourceRoot":"","sources":["../../src/host-files/file-sink.base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAEhB,KAAK,cAAc,EACnB,KAAK,eAAe,EAGpB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,gFAAgF;AAChF,qBAAa,YAAa,YAAW,kBAAkB;IACtD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW;IAmBnF,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtB;AAED,KAAK,aAAa,GAAG,KAAK,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,KAAK,YAAY,CAAC;AAI5F,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAWhE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `file` sink over the host's file primitives: a host file stream
|
|
3
|
+
* (`fileOutputFor(host)`) at the global log directory, batched by entries and
|
|
4
|
+
* elapsed time. `fileSinkFor(host)` is the class a host registers.
|
|
5
|
+
*/
|
|
6
|
+
import { SinkDescriptorSchema, OutputDescriptorSchema, getCapturedLoggingConfig } from "../host.js";
|
|
7
|
+
import { getVibesGlobalLogDir } from "../paths.js";
|
|
8
|
+
import { fileOutputFor } from "./file-output.base.js";
|
|
9
|
+
/** File sinks and file outputs share the owner's ordered append and cleanup. */
|
|
10
|
+
export class FileSinkBase {
|
|
11
|
+
id;
|
|
12
|
+
descriptor;
|
|
13
|
+
output;
|
|
14
|
+
constructor(host, descriptor, context) {
|
|
15
|
+
this.descriptor = SinkDescriptorSchema.parse(descriptor);
|
|
16
|
+
this.id = this.descriptor.id;
|
|
17
|
+
const runtime = context.runtime;
|
|
18
|
+
const logsDir = getVibesGlobalLogDir(runtime);
|
|
19
|
+
const path = host.join(logsDir, getCapturedLoggingConfig(runtime).fileName);
|
|
20
|
+
this.output = new (fileOutputFor(host))(OutputDescriptorSchema.parse({
|
|
21
|
+
kind: 'logging/output', id: this.id, storage: 'file', path, format: 'jsonl',
|
|
22
|
+
rotation: { maxSize: '10MB', maxAge: '7d', maxFiles: 5 },
|
|
23
|
+
buffering: {
|
|
24
|
+
enabled: this.descriptor.batching?.enabled ?? true,
|
|
25
|
+
// Sink batches are bounded by entries and elapsed time.
|
|
26
|
+
size: Number.MAX_SAFE_INTEGER,
|
|
27
|
+
maxBufferEntries: this.descriptor.batching?.maxSize ?? 50,
|
|
28
|
+
flushInterval: this.descriptor.batching?.maxWait ?? 2000
|
|
29
|
+
}
|
|
30
|
+
}), { runtime });
|
|
31
|
+
}
|
|
32
|
+
emit(entry) {
|
|
33
|
+
return this.output.write(entry);
|
|
34
|
+
}
|
|
35
|
+
flush() {
|
|
36
|
+
return this.output.flush();
|
|
37
|
+
}
|
|
38
|
+
close() {
|
|
39
|
+
return this.output.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const sinkClasses = new WeakMap();
|
|
43
|
+
/** The `file` sink class over `host`, one per host. */
|
|
44
|
+
export function fileSinkFor(host) {
|
|
45
|
+
let bound = sinkClasses.get(host);
|
|
46
|
+
if (!bound) {
|
|
47
|
+
bound = class FileSink extends FileSinkBase {
|
|
48
|
+
constructor(descriptor, context) {
|
|
49
|
+
super(host, descriptor, context);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
sinkClasses.set(host, bound);
|
|
53
|
+
}
|
|
54
|
+
return bound;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=file-sink.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-sink.base.js","sourceRoot":"","sources":["../../src/host-files/file-sink.base.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAGN,oBAAoB,EAGpB,sBAAsB,EACtB,wBAAwB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAuB,MAAM,uBAAuB,CAAC;AAE3E,gFAAgF;AAChF,MAAM,OAAO,YAAY;IACf,EAAE,CAAS;IACX,UAAU,CAAiB;IACnB,MAAM,CAAiB;IAExC,YAAY,IAAqB,EAAE,UAA0B,EAAE,OAAoB;QAClF,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC;YACpE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;YAC3E,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;YACxD,SAAS,EAAE;gBACV,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI;gBAClD,wDAAwD;gBACxD,IAAI,EAAE,MAAM,CAAC,gBAAgB;gBAC7B,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE;gBACzD,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI;aACxD;SACD,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,KAAsB;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACD;AAID,MAAM,WAAW,GAAG,IAAI,OAAO,EAAkC,CAAC;AAElE,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,IAAqB;IAChD,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,KAAK,GAAG,MAAM,QAAS,SAAQ,YAAY;YAC1C,YAAY,UAA0B,EAAE,OAAoB;gBAC3D,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;SACD,CAAC;QACF,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A host's file logging plugin (C092): the `file` sink, the `file` output (and
|
|
3
|
+
* the `mcp-stdout-capture` storage it backs), the file-backed audit logger and
|
|
4
|
+
* the scheduled audit retention job, each over the host's own file primitives.
|
|
5
|
+
* Each runtime-environment host registers it under its own plugin identity;
|
|
6
|
+
* consumer hardware only. `{ files: false }` registers none of them.
|
|
7
|
+
*/
|
|
8
|
+
import type { HostFileLoggingDefinition, HostFileLoggingOptions } from '../schemas/file-host.ts';
|
|
9
|
+
/** The host's file logging plugin, registered under `definition`'s identity over `definition.host`. */
|
|
10
|
+
export declare function createHostFileLoggingPlugin(definition: HostFileLoggingDefinition, options?: HostFileLoggingOptions): import("@vibesdotdev/kernel").RuntimePlugin;
|
|
11
|
+
//# sourceMappingURL=host-file-logging.plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-file-logging.plugin.d.ts","sourceRoot":"","sources":["../../src/host-files/host-file-logging.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjG,uGAAuG;AACvG,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,yBAAyB,EAAE,OAAO,GAAE,sBAA2B,+CAoDtH"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A host's file logging plugin (C092): the `file` sink, the `file` output (and
|
|
3
|
+
* the `mcp-stdout-capture` storage it backs), the file-backed audit logger and
|
|
4
|
+
* the scheduled audit retention job, each over the host's own file primitives.
|
|
5
|
+
* Each runtime-environment host registers it under its own plugin identity;
|
|
6
|
+
* consumer hardware only. `{ files: false }` registers none of them.
|
|
7
|
+
*/
|
|
8
|
+
import { CapabilityError, createRuntimePlugin, getRuntimeStdioCapture } from '@vibesdotdev/kernel';
|
|
9
|
+
import { fileOutputDescriptor } from "../outputs/file/file.outputs.descriptor.js";
|
|
10
|
+
import { fileSinkDescriptor } from "../sinks/file/file.sinks.descriptor.js";
|
|
11
|
+
import stdoutCaptureOutputDescriptor from "../stdout-capture/stdout-capture.output.descriptor.js";
|
|
12
|
+
import { ALL_AUDIT_DESCRIPTORS } from "../audit/audit.descriptor.js";
|
|
13
|
+
import { auditRetentionJobDescriptor } from "../audit/audit-retention.job.descriptor.js";
|
|
14
|
+
import { captureLoggingConfig } from "../config/load-config.js";
|
|
15
|
+
/** The host's file logging plugin, registered under `definition`'s identity over `definition.host`. */
|
|
16
|
+
export function createHostFileLoggingPlugin(definition, options = {}) {
|
|
17
|
+
const files = options.files ?? true;
|
|
18
|
+
const { host } = definition;
|
|
19
|
+
return createRuntimePlugin({
|
|
20
|
+
id: definition.id,
|
|
21
|
+
name: definition.name,
|
|
22
|
+
description: definition.description,
|
|
23
|
+
// No declared dependency on the portable `logging` plugin: a host registers this from its
|
|
24
|
+
// environment onRegister, before the composition registers `logging`. Descriptors and
|
|
25
|
+
// loaders for logging kinds that do not exist yet are queued by the kernel and install
|
|
26
|
+
// when `logging` registers its kinds; a composition without logging leaves them inert.
|
|
27
|
+
descriptors: files ? [fileSinkDescriptor, fileOutputDescriptor, auditRetentionJobDescriptor] : [],
|
|
28
|
+
onRegister: async (runtime) => {
|
|
29
|
+
if (!files)
|
|
30
|
+
return;
|
|
31
|
+
// Audit descriptors declare `optionalContext: ['runtime/workspace-path']`
|
|
32
|
+
// (Logging owns them): the file audit selects on an unbound host and
|
|
33
|
+
// its writes refuse `workspace-unbound`, typed.
|
|
34
|
+
runtime.registerLoader('logging/sink', fileSinkDescriptor.id, async () => {
|
|
35
|
+
await captureLoggingConfig(runtime);
|
|
36
|
+
return { impl: (await import("./file-sink.base.js")).fileSinkFor(host) };
|
|
37
|
+
}, { constraint: { hardware: ['consumer'] } });
|
|
38
|
+
runtime.registerLoader('logging/output', fileOutputDescriptor.id, async () => {
|
|
39
|
+
return { impl: (await import("./file-output.factory.base.js")).fileOutputFactoryFor(host) };
|
|
40
|
+
}, { constraint: { hardware: ['consumer'] } });
|
|
41
|
+
// Capture storage stays selected by the handed host's stdio capability.
|
|
42
|
+
runtime.registerLoader('logging/output', stdoutCaptureOutputDescriptor.id, async (handedRuntime) => {
|
|
43
|
+
if (!handedRuntime)
|
|
44
|
+
throw new CapabilityError('Capture storage selection requires its resolving Runtime.', 'INVALID_INPUT', {
|
|
45
|
+
reason: 'stdout-capture-runtime-missing', retryable: false
|
|
46
|
+
});
|
|
47
|
+
await getRuntimeStdioCapture(handedRuntime);
|
|
48
|
+
return { impl: (await import("./file-output.factory.base.js")).fileOutputFactoryFor(host) };
|
|
49
|
+
});
|
|
50
|
+
for (const descriptor of ALL_AUDIT_DESCRIPTORS) {
|
|
51
|
+
runtime.registerLoader('logging/audit', descriptor.id, async () => {
|
|
52
|
+
return { impl: (await import("./file-audit.base.js")).fileAuditFor(host) };
|
|
53
|
+
}, { constraint: { hardware: ['consumer'] } });
|
|
54
|
+
}
|
|
55
|
+
// The audit retention schedule is a Workers job (RC11, D19): no timer here.
|
|
56
|
+
runtime.registerLoader('workers/job', auditRetentionJobDescriptor.id, async () => {
|
|
57
|
+
const { AuditRetentionJob } = await import("../audit/audit-retention.job.impl.js");
|
|
58
|
+
return { impl: AuditRetentionJob };
|
|
59
|
+
}, { constraint: { hardware: ['consumer'] } });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=host-file-logging.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-file-logging.plugin.js","sourceRoot":"","sources":["../../src/host-files/host-file-logging.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vibesdotdev/logging/host-files
|
|
3
|
+
*
|
|
4
|
+
* The base implementation of the file contract in `@vibesdotdev/logging/host`
|
|
5
|
+
* (C092): the `file` sink, the `file` output and its streams, copy-truncate
|
|
6
|
+
* rotation, the file audit and the host plugin that registers them, all over
|
|
7
|
+
* a host's file primitives (`LoggingFileHost`). It reads no host API; each
|
|
8
|
+
* runtime-environment host supplies the primitives and registers
|
|
9
|
+
* `createHostFileLoggingPlugin` under its own identity.
|
|
10
|
+
*/
|
|
11
|
+
export { createHostFileLoggingPlugin } from './host-file-logging.plugin.ts';
|
|
12
|
+
export { FileOutputBase, fileOutputFor } from './file-output.base.ts';
|
|
13
|
+
export { FileOutputFactoryBase, fileOutputFactoryFor } from './file-output.factory.base.ts';
|
|
14
|
+
export { FileSinkBase, fileSinkFor } from './file-sink.base.ts';
|
|
15
|
+
export { FileAuditBase, fileAuditFor } from './file-audit.base.ts';
|
|
16
|
+
export { rotateAppendedFileOn } from './rotate-appended-file.base.ts';
|
|
17
|
+
export { readLines, tailFile } from './file-output.read.base.ts';
|
|
18
|
+
export type { FileTailHandle, HostFileLoggingDefinition, HostFileLoggingOptions, LoggingDirectoryWatch, LoggingFileHandle, LoggingFileHost, LoggingFileStats } from '../schemas/file-host.ts';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host-files/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EACX,cAAc,EACd,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vibesdotdev/logging/host-files
|
|
3
|
+
*
|
|
4
|
+
* The base implementation of the file contract in `@vibesdotdev/logging/host`
|
|
5
|
+
* (C092): the `file` sink, the `file` output and its streams, copy-truncate
|
|
6
|
+
* rotation, the file audit and the host plugin that registers them, all over
|
|
7
|
+
* a host's file primitives (`LoggingFileHost`). It reads no host API; each
|
|
8
|
+
* runtime-environment host supplies the primitives and registers
|
|
9
|
+
* `createHostFileLoggingPlugin` under its own identity.
|
|
10
|
+
*/
|
|
11
|
+
export { createHostFileLoggingPlugin } from "./host-file-logging.plugin.js";
|
|
12
|
+
export { FileOutputBase, fileOutputFor } from "./file-output.base.js";
|
|
13
|
+
export { FileOutputFactoryBase, fileOutputFactoryFor } from "./file-output.factory.base.js";
|
|
14
|
+
export { FileSinkBase, fileSinkFor } from "./file-sink.base.js";
|
|
15
|
+
export { FileAuditBase, fileAuditFor } from "./file-audit.base.js";
|
|
16
|
+
export { rotateAppendedFileOn } from "./rotate-appended-file.base.js";
|
|
17
|
+
export { readLines, tailFile } from "./file-output.read.base.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host-files/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy-truncate rotation for a file another process appends to (L1), over
|
|
3
|
+
* the host's file primitives (`LoggingFileHost`).
|
|
4
|
+
*
|
|
5
|
+
* PM children and the PM daemon write their stdout/stderr through inherited
|
|
6
|
+
* `O_APPEND` descriptors so the files outlive — and are adopted across —
|
|
7
|
+
* daemon restarts. Rename-based rotation would leave those writers appending
|
|
8
|
+
* to the archive, so this rotation copies the active file to `.1` and
|
|
9
|
+
* truncates it in place; an `O_APPEND` writer then continues at the new end.
|
|
10
|
+
*
|
|
11
|
+
* Semantics match the file output (`schemas/output-defaults.ts`): a file at or
|
|
12
|
+
* over `maxSizeBytes` rotates, and at most `maxFiles` archives are kept
|
|
13
|
+
* (`<path>.1` newest … `<path>.<maxFiles>` oldest).
|
|
14
|
+
*
|
|
15
|
+
* KNOWN LIMIT — bytes can be lost. Bytes a writer appends after the copy
|
|
16
|
+
* reads them and before the truncate lands are in neither file. The window
|
|
17
|
+
* is kept to the copy itself (a copy-on-write clone where the filesystem
|
|
18
|
+
* supports it) plus one truncate issued immediately after, with nothing else
|
|
19
|
+
* awaited between them. Full capture is the policy, so this limit is stated,
|
|
20
|
+
* not hidden: a writer that must lose nothing needs a log owner that holds
|
|
21
|
+
* the write side, not an inherited descriptor.
|
|
22
|
+
*
|
|
23
|
+
* A writer WITHOUT `O_APPEND` keeps its old offset after the truncate and
|
|
24
|
+
* produces a sparse file; only `O_APPEND` writers may be rotated this way.
|
|
25
|
+
*/
|
|
26
|
+
import type { AppendedFileRotation, AppendedFileRotationPolicy } from '../kinds/file-output.ts';
|
|
27
|
+
import type { LoggingFileHost } from '../schemas/file-host.ts';
|
|
28
|
+
/**
|
|
29
|
+
* Rotate `path` when it has reached `policy.maxSizeBytes`: shift
|
|
30
|
+
* `.1 … .maxFiles-1` up one, drop `.maxFiles`, copy the active file to `.1`,
|
|
31
|
+
* then truncate it in place. A missing active file is nothing to rotate; every
|
|
32
|
+
* other failure propagates. The file operations are `host`'s.
|
|
33
|
+
*/
|
|
34
|
+
export declare function rotateAppendedFileOn(host: LoggingFileHost, path: string, policy: AppendedFileRotationPolicy): Promise<AppendedFileRotation>;
|
|
35
|
+
//# sourceMappingURL=rotate-appended-file.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotate-appended-file.base.d.ts","sourceRoot":"","sources":["../../src/host-files/rotate-appended-file.base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAqD/D;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACzC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,0BAA0B,GAChC,OAAO,CAAC,oBAAoB,CAAC,CAwB/B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy-truncate rotation for a file another process appends to (L1), over
|
|
3
|
+
* the host's file primitives (`LoggingFileHost`).
|
|
4
|
+
*
|
|
5
|
+
* PM children and the PM daemon write their stdout/stderr through inherited
|
|
6
|
+
* `O_APPEND` descriptors so the files outlive — and are adopted across —
|
|
7
|
+
* daemon restarts. Rename-based rotation would leave those writers appending
|
|
8
|
+
* to the archive, so this rotation copies the active file to `.1` and
|
|
9
|
+
* truncates it in place; an `O_APPEND` writer then continues at the new end.
|
|
10
|
+
*
|
|
11
|
+
* Semantics match the file output (`schemas/output-defaults.ts`): a file at or
|
|
12
|
+
* over `maxSizeBytes` rotates, and at most `maxFiles` archives are kept
|
|
13
|
+
* (`<path>.1` newest … `<path>.<maxFiles>` oldest).
|
|
14
|
+
*
|
|
15
|
+
* KNOWN LIMIT — bytes can be lost. Bytes a writer appends after the copy
|
|
16
|
+
* reads them and before the truncate lands are in neither file. The window
|
|
17
|
+
* is kept to the copy itself (a copy-on-write clone where the filesystem
|
|
18
|
+
* supports it) plus one truncate issued immediately after, with nothing else
|
|
19
|
+
* awaited between them. Full capture is the policy, so this limit is stated,
|
|
20
|
+
* not hidden: a writer that must lose nothing needs a log owner that holds
|
|
21
|
+
* the write side, not an inherited descriptor.
|
|
22
|
+
*
|
|
23
|
+
* A writer WITHOUT `O_APPEND` keeps its old offset after the truncate and
|
|
24
|
+
* produces a sparse file; only `O_APPEND` writers may be rotated this way.
|
|
25
|
+
*/
|
|
26
|
+
import { CapabilityError, CaughtFailureSchema, valueFreeFailure } from '@vibesdotdev/kernel';
|
|
27
|
+
import * as z from 'zod/v4';
|
|
28
|
+
import { attempt, isMissingPath } from "../core/attempt.js";
|
|
29
|
+
async function removeIfPresent(host, path) {
|
|
30
|
+
const removed = await attempt(() => host.unlink(path));
|
|
31
|
+
if ('failure' in removed && !isMissingPath(removed.failure))
|
|
32
|
+
throw removed.failure.cause;
|
|
33
|
+
}
|
|
34
|
+
async function moveIfPresent(host, from, to) {
|
|
35
|
+
const moved = await attempt(() => host.rename(from, to));
|
|
36
|
+
if ('failure' in moved && !isMissingPath(moved.failure))
|
|
37
|
+
throw moved.failure.cause;
|
|
38
|
+
}
|
|
39
|
+
const RotationInputSchema = z.object({
|
|
40
|
+
path: z.string().min(1).refine((path) => !path.includes('\0')),
|
|
41
|
+
policy: z.object({
|
|
42
|
+
maxSizeBytes: z.number().finite().positive(),
|
|
43
|
+
maxFiles: z.number().int().min(1)
|
|
44
|
+
}).strict()
|
|
45
|
+
}).strict();
|
|
46
|
+
function invalidRotationInput(failure) {
|
|
47
|
+
return new CapabilityError('Rotation requires a path, maxSizeBytes > 0 and an integer maxFiles >= 1.', 'INVALID_INPUT', {
|
|
48
|
+
reason: 'rotation-policy-invalid',
|
|
49
|
+
retryable: false,
|
|
50
|
+
details: failure === undefined ? undefined : {
|
|
51
|
+
failureName: failure.name,
|
|
52
|
+
failureCode: failure.code ?? 'unspecified',
|
|
53
|
+
failureReason: failure.reason ?? 'unspecified'
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function parseRotationInput(path, policy) {
|
|
58
|
+
try {
|
|
59
|
+
return { ok: true, parsed: RotationInputSchema.safeParse({ path, policy }) };
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return { ok: false, failure: valueFreeFailure(CaughtFailureSchema.parse(error)) };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Read the public input once and return a detached copy, never caller-owned getters or proxies. */
|
|
66
|
+
function readRotationInput(path, policy) {
|
|
67
|
+
const read = parseRotationInput(path, policy);
|
|
68
|
+
if (!read.ok)
|
|
69
|
+
throw invalidRotationInput(read.failure);
|
|
70
|
+
const parsed = read.parsed;
|
|
71
|
+
if (!parsed.success)
|
|
72
|
+
throw invalidRotationInput();
|
|
73
|
+
return parsed.data;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Rotate `path` when it has reached `policy.maxSizeBytes`: shift
|
|
77
|
+
* `.1 … .maxFiles-1` up one, drop `.maxFiles`, copy the active file to `.1`,
|
|
78
|
+
* then truncate it in place. A missing active file is nothing to rotate; every
|
|
79
|
+
* other failure propagates. The file operations are `host`'s.
|
|
80
|
+
*/
|
|
81
|
+
export async function rotateAppendedFileOn(host, path, policy) {
|
|
82
|
+
const input = readRotationInput(path, policy);
|
|
83
|
+
path = input.path;
|
|
84
|
+
policy = input.policy;
|
|
85
|
+
const measured = await attempt(async () => (await host.stat(path)).size);
|
|
86
|
+
if ('failure' in measured) {
|
|
87
|
+
if (isMissingPath(measured.failure))
|
|
88
|
+
return { rotated: false };
|
|
89
|
+
throw measured.failure.cause;
|
|
90
|
+
}
|
|
91
|
+
const size = measured.value;
|
|
92
|
+
if (size < policy.maxSizeBytes)
|
|
93
|
+
return { rotated: false };
|
|
94
|
+
await removeIfPresent(host, `${path}.${policy.maxFiles}`);
|
|
95
|
+
for (let index = policy.maxFiles - 1; index >= 1; index--) {
|
|
96
|
+
await moveIfPresent(host, `${path}.${index}`, `${path}.${index + 1}`);
|
|
97
|
+
}
|
|
98
|
+
// The loss window starts here: keep the copy fast (clone when supported)
|
|
99
|
+
// and truncate the moment it completes.
|
|
100
|
+
await host.copyFileClone(path, `${path}.1`);
|
|
101
|
+
await host.truncate(path, 0);
|
|
102
|
+
return { rotated: true, previousSize: size };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=rotate-appended-file.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rotate-appended-file.base.js","sourceRoot":"","sources":["../../src/host-files/rotate-appended-file.base.ts"],"names":[],"mappings":"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"}
|