@gobing-ai/ts-infra 0.3.1 → 0.3.2

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.
Files changed (101) hide show
  1. package/README.md +52 -29
  2. package/dist/api-client.d.ts +13 -0
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +15 -4
  5. package/dist/event-bus/default-observers.d.ts +53 -0
  6. package/dist/event-bus/default-observers.d.ts.map +1 -0
  7. package/dist/event-bus/default-observers.js +107 -0
  8. package/dist/event-bus/event-bus.d.ts.map +1 -1
  9. package/dist/event-bus/event-bus.js +1 -0
  10. package/dist/event-bus/file-observer.d.ts +25 -0
  11. package/dist/event-bus/file-observer.d.ts.map +1 -0
  12. package/dist/event-bus/file-observer.js +110 -0
  13. package/dist/event-bus/index.d.ts +2 -0
  14. package/dist/event-bus/index.d.ts.map +1 -1
  15. package/dist/event-bus/index.js +2 -0
  16. package/dist/event-bus/types.d.ts +6 -0
  17. package/dist/event-bus/types.d.ts.map +1 -1
  18. package/dist/events.d.ts +100 -0
  19. package/dist/events.d.ts.map +1 -0
  20. package/dist/events.js +12 -0
  21. package/dist/index.d.ts +4 -4
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +3 -5
  24. package/dist/job-queue/db-job-queue.d.ts.map +1 -1
  25. package/dist/job-queue/db-job-queue.js +45 -34
  26. package/dist/job-queue/index.d.ts +0 -1
  27. package/dist/job-queue/index.d.ts.map +1 -1
  28. package/dist/job-queue/index.js +0 -1
  29. package/dist/job-queue/types.d.ts +7 -0
  30. package/dist/job-queue/types.d.ts.map +1 -1
  31. package/dist/job-queue-db.d.ts +2 -0
  32. package/dist/job-queue-db.d.ts.map +1 -0
  33. package/dist/job-queue-db.js +1 -0
  34. package/dist/logger.d.ts +39 -7
  35. package/dist/logger.d.ts.map +1 -1
  36. package/dist/logger.js +76 -73
  37. package/dist/scheduler/action.d.ts +97 -1
  38. package/dist/scheduler/action.d.ts.map +1 -1
  39. package/dist/scheduler/action.js +111 -0
  40. package/dist/scheduler/cloudflare.d.ts +6 -0
  41. package/dist/scheduler/cloudflare.d.ts.map +1 -1
  42. package/dist/scheduler/cloudflare.js +6 -0
  43. package/dist/scheduler/factory.d.ts +2 -0
  44. package/dist/scheduler/factory.d.ts.map +1 -1
  45. package/dist/scheduler/factory.js +2 -0
  46. package/dist/scheduler/index.d.ts +2 -2
  47. package/dist/scheduler/index.d.ts.map +1 -1
  48. package/dist/scheduler/index.js +2 -2
  49. package/dist/scheduler/node.d.ts +4 -0
  50. package/dist/scheduler/node.d.ts.map +1 -1
  51. package/dist/scheduler/node.js +4 -0
  52. package/dist/scheduler/noop.d.ts +1 -0
  53. package/dist/scheduler/noop.d.ts.map +1 -1
  54. package/dist/scheduler/noop.js +1 -0
  55. package/dist/scheduler/wrap-handler.d.ts +18 -0
  56. package/dist/scheduler/wrap-handler.d.ts.map +1 -0
  57. package/dist/scheduler/wrap-handler.js +41 -0
  58. package/dist/scheduler-cloudflare.d.ts +2 -0
  59. package/dist/scheduler-cloudflare.d.ts.map +1 -0
  60. package/dist/scheduler-cloudflare.js +1 -0
  61. package/dist/scheduler-node.d.ts +2 -0
  62. package/dist/scheduler-node.d.ts.map +1 -0
  63. package/dist/scheduler-node.js +1 -0
  64. package/dist/telemetry/config.d.ts +4 -0
  65. package/dist/telemetry/config.d.ts.map +1 -1
  66. package/dist/telemetry/metrics.d.ts +19 -0
  67. package/dist/telemetry/metrics.d.ts.map +1 -1
  68. package/dist/telemetry/metrics.js +19 -0
  69. package/dist/telemetry/sdk.d.ts +4 -0
  70. package/dist/telemetry/sdk.d.ts.map +1 -1
  71. package/dist/telemetry/sdk.js +4 -0
  72. package/dist/telemetry/tracing.d.ts +12 -0
  73. package/dist/telemetry/tracing.d.ts.map +1 -1
  74. package/dist/telemetry/tracing.js +12 -0
  75. package/package.json +19 -2
  76. package/src/api-client.ts +15 -4
  77. package/src/event-bus/default-observers.ts +117 -0
  78. package/src/event-bus/event-bus.ts +1 -0
  79. package/src/event-bus/file-observer.ts +142 -0
  80. package/src/event-bus/index.ts +7 -0
  81. package/src/event-bus/types.ts +6 -0
  82. package/src/events.ts +108 -0
  83. package/src/index.ts +44 -7
  84. package/src/job-queue/db-job-queue.ts +50 -38
  85. package/src/job-queue/index.ts +0 -1
  86. package/src/job-queue/types.ts +7 -0
  87. package/src/job-queue-db.ts +1 -0
  88. package/src/logger.ts +102 -77
  89. package/src/scheduler/action.ts +164 -1
  90. package/src/scheduler/cloudflare.ts +6 -0
  91. package/src/scheduler/factory.ts +2 -0
  92. package/src/scheduler/index.ts +13 -2
  93. package/src/scheduler/node.ts +4 -0
  94. package/src/scheduler/noop.ts +1 -0
  95. package/src/scheduler/wrap-handler.ts +50 -0
  96. package/src/scheduler-cloudflare.ts +1 -0
  97. package/src/scheduler-node.ts +1 -0
  98. package/src/telemetry/config.ts +4 -0
  99. package/src/telemetry/metrics.ts +19 -0
  100. package/src/telemetry/sdk.ts +4 -0
  101. package/src/telemetry/tracing.ts +12 -0
package/dist/logger.js CHANGED
@@ -1,99 +1,102 @@
1
1
  /**
2
- * Structured JSON logger with levels (trace/debug/info/warn/error/fatal).
2
+ * Structured logger for ts-infra, backed by LogTape.
3
3
  *
4
- * No external dependencies console-based implementation.
4
+ * LogTape owns level filtering, sink routing, and formatting; this module
5
+ * adapts LogTape's template-string logger to the ts-infra `Logger` contract
6
+ * (`method(msg, data?)` + `child(context)`) so call-sites stay backend-agnostic.
7
+ *
8
+ * ADR-011: ts-infra must not touch `node:fs`/`process.stderr`. The console sink
9
+ * is LogTape's own (`getConsoleSink`); the file sink is supplied by the caller
10
+ * (typically `@gobing-ai/ts-runtime`, which owns FileSystem) via
11
+ * {@link InitLoggerOptions.fileSink}.
5
12
  */
6
- const LEVEL_ORDER = {
7
- trace: 0,
8
- debug: 1,
9
- info: 2,
10
- warn: 3,
11
- error: 4,
12
- fatal: 5,
13
- };
14
- class ConsoleLogger {
15
- category;
16
- context;
17
- constructor(category, context = {}) {
18
- this.category = category;
19
- this.context = { category, ...context };
20
- }
21
- log(level, msg, data) {
22
- // Read the level dynamically so re-initialization affects cached loggers too.
23
- if (LEVEL_ORDER[level] < LEVEL_ORDER[globalLevel])
24
- return;
25
- if (globalMuted)
26
- return;
27
- const entry = {
28
- level,
29
- message: msg,
30
- timestamp: new Date().toISOString(),
31
- ...this.context,
32
- ...data,
33
- };
34
- const json = JSON.stringify(entry);
35
- switch (level) {
36
- case 'error':
37
- case 'fatal':
38
- console.error(json);
39
- break;
40
- case 'warn':
41
- console.warn(json);
42
- break;
43
- case 'debug':
44
- case 'trace':
45
- console.debug(json);
46
- break;
47
- default:
48
- console.log(json);
49
- }
13
+ import { ConfigError, configure, getConsoleSink, getJsonLinesFormatter, getTextFormatter, getLogger as ltGetLogger, reset, } from '@logtape/logtape';
14
+ /** Root category every ts-infra logger lives under, so one config rule covers them all. */
15
+ const ROOT_CATEGORY = 'app';
16
+ /** Map the ts-infra level name to LogTape's (`warn` → `warning`). */
17
+ function toLogTapeLevel(level) {
18
+ return level === 'warn' ? 'warning' : level;
19
+ }
20
+ /** Module-level mute flag — LogTape has no global mute, so the adapter gates on it. */
21
+ let muted = false;
22
+ /**
23
+ * Mute or unmute all logger output. Useful for tests. Gating happens in the
24
+ * adapter before delegating to LogTape, so muting is synchronous and global.
25
+ */
26
+ export function setLoggerMuted(value) {
27
+ muted = value;
28
+ }
29
+ /** Adapter: ts-infra `Logger` over a LogTape logger. */
30
+ class LogTapeLogger {
31
+ inner;
32
+ constructor(inner) {
33
+ this.inner = inner;
50
34
  }
51
35
  trace(msg, data) {
52
- this.log('trace', msg, data);
36
+ if (!muted)
37
+ this.inner.trace(msg, data ?? {});
53
38
  }
54
39
  debug(msg, data) {
55
- this.log('debug', msg, data);
40
+ if (!muted)
41
+ this.inner.debug(msg, data ?? {});
56
42
  }
57
43
  info(msg, data) {
58
- this.log('info', msg, data);
44
+ if (!muted)
45
+ this.inner.info(msg, data ?? {});
59
46
  }
60
47
  warn(msg, data) {
61
- this.log('warn', msg, data);
48
+ if (!muted)
49
+ this.inner.warn(msg, data ?? {});
62
50
  }
63
51
  error(msg, data) {
64
- this.log('error', msg, data);
52
+ if (!muted)
53
+ this.inner.error(msg, data ?? {});
65
54
  }
66
55
  fatal(msg, data) {
67
- this.log('fatal', msg, data);
56
+ if (!muted)
57
+ this.inner.fatal(msg, data ?? {});
68
58
  }
69
59
  child(context) {
70
- return new ConsoleLogger(this.category, { ...this.context, ...context });
60
+ return new LogTapeLogger(this.inner.with(context));
71
61
  }
72
62
  }
73
- const loggers = new Map();
74
- let globalLevel = 'info';
75
- let globalMuted = false;
76
63
  /**
77
- * Mute or unmute all logger console output. Useful for tests.
78
- */
79
- export function setLoggerMuted(muted) {
80
- globalMuted = muted;
81
- }
82
- /**
83
- * Get or create a logger for the given category.
64
+ * Get a logger for the given category. Categories are nested under the
65
+ * `app` root so a single `initializeLogger` rule configures them all.
84
66
  */
85
67
  export function getLogger(category) {
86
- const existing = loggers.get(category);
87
- if (existing)
88
- return existing;
89
- const logger = new ConsoleLogger(category);
90
- loggers.set(category, logger);
91
- return logger;
68
+ return new LogTapeLogger(ltGetLogger([ROOT_CATEGORY, category]));
92
69
  }
93
70
  /**
94
- * Initialize the logger subsystem with a minimum log level.
71
+ * Configure LogTape with console and/or file sinks. Call once at startup;
72
+ * safe to call again to reconfigure — the prior config is reset first so the
73
+ * latest call wins (LogTape throws `ConfigError` on double-configure otherwise).
95
74
  */
96
- export function initializeLogger(level = 'info') {
97
- globalLevel = level;
98
- loggers.clear();
75
+ export async function initializeLogger(options = {}) {
76
+ const { level = 'info', console: enableConsole = true, fileSink, json = true } = options;
77
+ const lowestLevel = toLogTapeLevel(level);
78
+ const formatter = json ? getJsonLinesFormatter() : getTextFormatter();
79
+ const sinks = {};
80
+ if (enableConsole) {
81
+ sinks.console = getConsoleSink({ formatter });
82
+ }
83
+ if (fileSink) {
84
+ sinks.file = (record) => {
85
+ fileSink(formatter(record));
86
+ };
87
+ }
88
+ await reset();
89
+ try {
90
+ await configure({
91
+ sinks,
92
+ loggers: [
93
+ { category: [ROOT_CATEGORY], lowestLevel, sinks: Object.keys(sinks) },
94
+ { category: ['logtape', 'meta'], lowestLevel: 'warning', sinks: [] },
95
+ ],
96
+ });
97
+ }
98
+ catch (error) {
99
+ if (!(error instanceof ConfigError))
100
+ throw error;
101
+ }
99
102
  }
@@ -1,5 +1,101 @@
1
1
  /**
2
- * Scheduler action type re-export.
2
+ * Named scheduler actions and a registry, plus built-in actions.
3
+ *
4
+ * Opt-in by design: `createDefaultRegistry` only auto-registers the side-effect-
5
+ * free `LogAction`. Actions with side effects (`QueueStatsAction` needs a DAO
6
+ * provider, `HealthPingAction` needs a file writer) are included only when their
7
+ * dependency is supplied — downstream code decides what to enable.
3
8
  */
9
+ import type { EventBus } from '../event-bus/event-bus';
10
+ import type { QueueEvents } from '../events';
11
+ import type { QueueStats } from '../job-queue/types';
12
+ import type { ScheduledAction } from './types';
13
+ /** Lazily provides a DAO with `getStats()`, deferred to execution time. */
14
+ export type QueueStatsDaoProvider = () => Promise<{
15
+ getStats(): Promise<QueueStats>;
16
+ }>;
17
+ /**
18
+ * Minimal writer for {@link HealthPingAction}. ADR-011: ts-infra does not touch
19
+ * `node:fs`; the caller injects a writer (e.g. ts-runtime `FileSystem`).
20
+ */
21
+ export interface HealthPingWriter {
22
+ /** Write `content` to `path`, replacing any existing file. */
23
+ writeFile(path: string, content: string): void | Promise<void>;
24
+ }
25
+ /**
26
+ * A named action invokable by the scheduler. Registered in an
27
+ * {@link ActionRegistry} and resolved by name; `execute()` matches the
28
+ * adapter's no-arg {@link ScheduledAction} signature.
29
+ */
30
+ export interface SchedulerAction {
31
+ /** Unique action name registered in the registry. */
32
+ readonly name: string;
33
+ /** Execute the action. */
34
+ execute(): Promise<void>;
35
+ }
36
+ /** Bridge a {@link SchedulerAction} to a plain {@link ScheduledAction} for adapter registration. */
37
+ export declare function toScheduledAction(action: SchedulerAction): ScheduledAction;
38
+ /**
39
+ * Registry of named {@link SchedulerAction} instances, resolved at scheduler
40
+ * startup. Duplicate names are rejected.
41
+ */
42
+ export declare class ActionRegistry {
43
+ private readonly map;
44
+ constructor(actions?: SchedulerAction[]);
45
+ /** Register an action. @throws if the name is already registered. */
46
+ register(action: SchedulerAction): void;
47
+ /** Look up an action by name. */
48
+ get(name: string): SchedulerAction | undefined;
49
+ /** Whether an action with the given name exists. */
50
+ has(name: string): boolean;
51
+ /** All registered action names. */
52
+ names(): string[];
53
+ }
54
+ /** Logs a structured info message on every invocation. Registered as `"log"`. */
55
+ export declare class LogAction implements SchedulerAction {
56
+ readonly name: string;
57
+ constructor(name?: string);
58
+ execute(): Promise<void>;
59
+ }
60
+ /**
61
+ * Queries the queue DAO for stats and logs them; emits `queue.stats` when a
62
+ * system bus is provided. Registered as `"queue-stats"`.
63
+ */
64
+ export declare class QueueStatsAction implements SchedulerAction {
65
+ private readonly daoProvider;
66
+ private readonly systemBus;
67
+ readonly name = "queue-stats";
68
+ constructor(daoProvider: QueueStatsDaoProvider, systemBus?: EventBus<QueueEvents> | null);
69
+ execute(): Promise<void>;
70
+ }
71
+ /**
72
+ * Writes a timestamped heartbeat file on every invocation. Registered as
73
+ * `"health-ping"`. File I/O is delegated to an injected {@link HealthPingWriter}.
74
+ */
75
+ export declare class HealthPingAction implements SchedulerAction {
76
+ private readonly writer;
77
+ private readonly filePath;
78
+ readonly name = "health-ping";
79
+ constructor(writer: HealthPingWriter, filePath?: string);
80
+ execute(): Promise<void>;
81
+ }
82
+ /** Options for {@link createDefaultRegistry}. */
83
+ export interface CreateDefaultRegistryOptions {
84
+ /** DAO provider for `QueueStatsAction`. Omit to exclude that action. */
85
+ queueStatsDaoProvider?: QueueStatsDaoProvider;
86
+ /** Writer for `HealthPingAction`. Omit to exclude that action. */
87
+ healthPingWriter?: HealthPingWriter;
88
+ /** File path for `HealthPingAction`. Default `"data/scheduler-heartbeat.json"`. */
89
+ healthPingPath?: string;
90
+ /** System bus forwarded to `QueueStatsAction` for `queue.stats` events. */
91
+ systemBus?: EventBus<QueueEvents> | null;
92
+ }
93
+ /**
94
+ * Create an {@link ActionRegistry} with the built-in actions. Only `LogAction`
95
+ * is always present (no side effects); `QueueStatsAction` and `HealthPingAction`
96
+ * are included only when their dependency (`queueStatsDaoProvider` /
97
+ * `healthPingWriter`) is supplied — so nothing with side effects is auto-wired.
98
+ */
99
+ export declare function createDefaultRegistry(options?: CreateDefaultRegistryOptions): ActionRegistry;
4
100
  export type { ScheduledAction } from './types';
5
101
  //# sourceMappingURL=action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/scheduler/action.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/scheduler/action.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAI/C,2EAA2E;AAC3E,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC;IAAE,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,CAAC,CAAC;AAEvF;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,8DAA8D;IAC9D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAE1E;AAED;;;GAGG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsC;gBAE9C,OAAO,CAAC,EAAE,eAAe,EAAE;IAMvC,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAOvC,iCAAiC;IACjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI9C,oDAAoD;IACpD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,mCAAmC;IACnC,KAAK,IAAI,MAAM,EAAE;CAGpB;AAED,iFAAiF;AACjF,qBAAa,SAAU,YAAW,eAAe;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,SAAQ;IAIlB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,eAAe;IAIhD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ9B,QAAQ,CAAC,IAAI,iBAAiB;gBAGT,WAAW,EAAE,qBAAqB,EAClC,SAAS,GAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAW;IAG7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAMjC;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,eAAe;IAIhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ7B,QAAQ,CAAC,IAAI,iBAAiB;gBAGT,MAAM,EAAE,gBAAgB,EACxB,QAAQ,SAAkC;IAGzD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAOjC;AAED,iDAAiD;AACjD,MAAM,WAAW,4BAA4B;IACzC,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,cAAc,CAShG;AAED,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Named scheduler actions and a registry, plus built-in actions.
3
+ *
4
+ * Opt-in by design: `createDefaultRegistry` only auto-registers the side-effect-
5
+ * free `LogAction`. Actions with side effects (`QueueStatsAction` needs a DAO
6
+ * provider, `HealthPingAction` needs a file writer) are included only when their
7
+ * dependency is supplied — downstream code decides what to enable.
8
+ */
9
+ import { getLogger } from '../logger.js';
10
+ const logger = getLogger('scheduler.action');
11
+ /** Bridge a {@link SchedulerAction} to a plain {@link ScheduledAction} for adapter registration. */
12
+ export function toScheduledAction(action) {
13
+ return () => action.execute();
14
+ }
15
+ /**
16
+ * Registry of named {@link SchedulerAction} instances, resolved at scheduler
17
+ * startup. Duplicate names are rejected.
18
+ */
19
+ export class ActionRegistry {
20
+ map = new Map();
21
+ constructor(actions) {
22
+ if (actions) {
23
+ for (const action of actions)
24
+ this.register(action);
25
+ }
26
+ }
27
+ /** Register an action. @throws if the name is already registered. */
28
+ register(action) {
29
+ if (this.map.has(action.name)) {
30
+ throw new Error(`Duplicate scheduler action name: "${action.name}"`);
31
+ }
32
+ this.map.set(action.name, action);
33
+ }
34
+ /** Look up an action by name. */
35
+ get(name) {
36
+ return this.map.get(name);
37
+ }
38
+ /** Whether an action with the given name exists. */
39
+ has(name) {
40
+ return this.map.has(name);
41
+ }
42
+ /** All registered action names. */
43
+ names() {
44
+ return [...this.map.keys()];
45
+ }
46
+ }
47
+ /** Logs a structured info message on every invocation. Registered as `"log"`. */
48
+ export class LogAction {
49
+ name;
50
+ constructor(name = 'log') {
51
+ this.name = name;
52
+ }
53
+ async execute() {
54
+ logger.info('Scheduled action executed', { action: this.name });
55
+ }
56
+ }
57
+ /**
58
+ * Queries the queue DAO for stats and logs them; emits `queue.stats` when a
59
+ * system bus is provided. Registered as `"queue-stats"`.
60
+ */
61
+ export class QueueStatsAction {
62
+ daoProvider;
63
+ systemBus;
64
+ name = 'queue-stats';
65
+ constructor(daoProvider, systemBus = null) {
66
+ this.daoProvider = daoProvider;
67
+ this.systemBus = systemBus;
68
+ }
69
+ async execute() {
70
+ const dao = await this.daoProvider();
71
+ const stats = await dao.getStats();
72
+ logger.info('Queue stats snapshot', { action: this.name, ...stats });
73
+ this.systemBus?.emit('queue.stats', stats);
74
+ }
75
+ }
76
+ /**
77
+ * Writes a timestamped heartbeat file on every invocation. Registered as
78
+ * `"health-ping"`. File I/O is delegated to an injected {@link HealthPingWriter}.
79
+ */
80
+ export class HealthPingAction {
81
+ writer;
82
+ filePath;
83
+ name = 'health-ping';
84
+ constructor(writer, filePath = 'data/scheduler-heartbeat.json') {
85
+ this.writer = writer;
86
+ this.filePath = filePath;
87
+ }
88
+ async execute() {
89
+ const content = JSON.stringify({
90
+ lastRun: new Date().toISOString(),
91
+ jobName: this.name,
92
+ });
93
+ await this.writer.writeFile(this.filePath, content);
94
+ }
95
+ }
96
+ /**
97
+ * Create an {@link ActionRegistry} with the built-in actions. Only `LogAction`
98
+ * is always present (no side effects); `QueueStatsAction` and `HealthPingAction`
99
+ * are included only when their dependency (`queueStatsDaoProvider` /
100
+ * `healthPingWriter`) is supplied — so nothing with side effects is auto-wired.
101
+ */
102
+ export function createDefaultRegistry(options = {}) {
103
+ const actions = [new LogAction()];
104
+ if (options.queueStatsDaoProvider) {
105
+ actions.push(new QueueStatsAction(options.queueStatsDaoProvider, options.systemBus ?? null));
106
+ }
107
+ if (options.healthPingWriter) {
108
+ actions.push(new HealthPingAction(options.healthPingWriter, options.healthPingPath));
109
+ }
110
+ return new ActionRegistry(actions);
111
+ }
@@ -7,6 +7,12 @@ interface CfScheduledEvent {
7
7
  interface CfEventContext {
8
8
  waitUntil(promise: Promise<unknown>): void;
9
9
  }
10
+ /**
11
+ * Scheduler adapter for Cloudflare Workers Cron Triggers.
12
+ *
13
+ * Register cron→action pairs, then call {@link CloudflareSchedulerAdapter.handleScheduledEvent}
14
+ * from the Worker's `scheduled()` export.
15
+ */
10
16
  export declare class CloudflareSchedulerAdapter implements SchedulerAdapter {
11
17
  private readonly entries;
12
18
  constructor();
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/scheduler/cloudflare.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,UAAU,gBAAgB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,UAAU,cAAc;IACpB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,qBAAa,0BAA2B,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;;IAI9D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAI/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI;CAY3E"}
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/scheduler/cloudflare.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,UAAU,gBAAgB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,UAAU,cAAc;IACpB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;GAKG;AACH,qBAAa,0BAA2B,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;;IAI9D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAI/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI;CAY3E"}
@@ -3,6 +3,12 @@
3
3
  * Uses minimal local type declarations — no @cloudflare/workers-types dependency.
4
4
  */
5
5
  import { getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal } from '../telemetry/metrics.js';
6
+ /**
7
+ * Scheduler adapter for Cloudflare Workers Cron Triggers.
8
+ *
9
+ * Register cron→action pairs, then call {@link CloudflareSchedulerAdapter.handleScheduledEvent}
10
+ * from the Worker's `scheduled()` export.
11
+ */
6
12
  export class CloudflareSchedulerAdapter {
7
13
  entries = new Map();
8
14
  constructor() { }
@@ -1,7 +1,9 @@
1
1
  import type { ScheduledAction, SchedulerAdapter } from './types';
2
+ /** Set the runtime scheduler adapter. Call before {@link initScheduler}. */
2
3
  export declare function setSchedulerAdapter(adapter: SchedulerAdapter): void;
3
4
  /** Reset the scheduler adapter singleton. For testing. */
4
5
  export declare function resetSchedulerAdapter(): void;
6
+ /** Get the currently configured scheduler adapter, or `undefined` if not set. */
5
7
  export declare function getSchedulerAdapter(): SchedulerAdapter | undefined;
6
8
  /**
7
9
  * Initialize the scheduler adapter and register cron entries.
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/scheduler/factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIjE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEnE;AAED,0DAA0D;AAC1D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,GAAG,gBAAgB,CAa9F"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/scheduler/factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIjE,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEnE;AAED,0DAA0D;AAC1D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,GAAG,gBAAgB,CAa9F"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { NoopSchedulerAdapter } from './noop.js';
5
5
  let runtimeAdapter;
6
+ /** Set the runtime scheduler adapter. Call before {@link initScheduler}. */
6
7
  export function setSchedulerAdapter(adapter) {
7
8
  runtimeAdapter = adapter;
8
9
  }
@@ -10,6 +11,7 @@ export function setSchedulerAdapter(adapter) {
10
11
  export function resetSchedulerAdapter() {
11
12
  runtimeAdapter = undefined;
12
13
  }
14
+ /** Get the currently configured scheduler adapter, or `undefined` if not set. */
13
15
  export function getSchedulerAdapter() {
14
16
  return runtimeAdapter;
15
17
  }
@@ -1,6 +1,6 @@
1
- export { CloudflareSchedulerAdapter } from './cloudflare';
1
+ export { ActionRegistry, type CreateDefaultRegistryOptions, createDefaultRegistry, HealthPingAction, type HealthPingWriter, LogAction, QueueStatsAction, type QueueStatsDaoProvider, type SchedulerAction, toScheduledAction, } from './action';
2
2
  export { getSchedulerAdapter, initScheduler, resetSchedulerAdapter, setSchedulerAdapter } from './factory';
3
- export { NodeSchedulerAdapter } from './node';
4
3
  export { NoopSchedulerAdapter } from './noop';
5
4
  export type { ScheduledAction, SchedulerAdapter } from './types';
5
+ export { wrapScheduledHandler } from './wrap-handler';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EACd,KAAK,4BAA4B,EACjC,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,SAAS,EACT,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,iBAAiB,GACpB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1,4 +1,4 @@
1
- export { CloudflareSchedulerAdapter } from './cloudflare.js';
1
+ export { ActionRegistry, createDefaultRegistry, HealthPingAction, LogAction, QueueStatsAction, toScheduledAction, } from './action.js';
2
2
  export { getSchedulerAdapter, initScheduler, resetSchedulerAdapter, setSchedulerAdapter } from './factory.js';
3
- export { NodeSchedulerAdapter } from './node.js';
4
3
  export { NoopSchedulerAdapter } from './noop.js';
4
+ export { wrapScheduledHandler } from './wrap-handler.js';
@@ -1,4 +1,8 @@
1
1
  import type { ScheduledAction, SchedulerAdapter } from './types';
2
+ /**
3
+ * Scheduler adapter for Node.js using a setInterval-based approach.
4
+ * No external cron library dependency — cron expressions are parsed minimally.
5
+ */
2
6
  export declare class NodeSchedulerAdapter implements SchedulerAdapter {
3
7
  private readonly entries;
4
8
  private running;
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/scheduler/node.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA6BjE,qBAAa,oBAAqB,YAAW,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,OAAO,CAAS;;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,UAAU;YAOJ,gBAAgB;CAYjC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/scheduler/node.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA6BjE;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,OAAO,CAAS;;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,UAAU;YAOJ,gBAAgB;CAYjC"}
@@ -21,6 +21,10 @@ function parseInterval(cron) {
21
21
  }
22
22
  return 60_000; // fallback: every minute
23
23
  }
24
+ /**
25
+ * Scheduler adapter for Node.js using a setInterval-based approach.
26
+ * No external cron library dependency — cron expressions are parsed minimally.
27
+ */
24
28
  export class NodeSchedulerAdapter {
25
29
  entries = [];
26
30
  running = false;
@@ -2,6 +2,7 @@
2
2
  * No-op scheduler adapter for testing and environments without scheduling.
3
3
  */
4
4
  import type { ScheduledAction, SchedulerAdapter } from './types';
5
+ /** Scheduler adapter that discards all registrations — for testing and environments without scheduling. */
5
6
  export declare class NoopSchedulerAdapter implements SchedulerAdapter {
6
7
  constructor();
7
8
  register(_cron: string, _action: ScheduledAction): void;
@@ -1 +1 @@
1
- {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/scheduler/noop.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,qBAAa,oBAAqB,YAAW,gBAAgB;;IAGzD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAIjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/scheduler/noop.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,2GAA2G;AAC3G,qBAAa,oBAAqB,YAAW,gBAAgB;;IAGzD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAIjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
@@ -1,3 +1,4 @@
1
+ /** Scheduler adapter that discards all registrations — for testing and environments without scheduling. */
1
2
  export class NoopSchedulerAdapter {
2
3
  constructor() { }
3
4
  register(_cron, _action) {
@@ -0,0 +1,18 @@
1
+ import type { EventBus } from '../event-bus/event-bus';
2
+ import type { SchedulerEvents } from '../events';
3
+ import type { ScheduledAction } from './types';
4
+ /**
5
+ * Wrap a scheduled action with OTel tracing, duration measurement, and
6
+ * `scheduler.job.executed` event emission.
7
+ *
8
+ * Composes *on top of* the adapter's inline metrics (executed/failed/duration
9
+ * counters live in the Node/Cloudflare adapters) — this wrapper adds the named
10
+ * tracing span and the lifecycle event, neither of which the adapters provide.
11
+ * Opt-in: wrap an action before registering it when you want that visibility.
12
+ *
13
+ * @param name - Job name, surfaced as `scheduler.job_name` on the span/event.
14
+ * @param action - The action to wrap (new no-arg `ScheduledAction` signature).
15
+ * @param systemBus - Optional bus to emit `scheduler.job.executed` on.
16
+ */
17
+ export declare function wrapScheduledHandler(name: string, action: ScheduledAction, systemBus?: EventBus<SchedulerEvents> | null): ScheduledAction;
18
+ //# sourceMappingURL=wrap-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-handler.d.ts","sourceRoot":"","sources":["../../src/scheduler/wrap-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,EACvB,SAAS,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,GAC7C,eAAe,CA2BjB"}
@@ -0,0 +1,41 @@
1
+ import { addSpanAttributes, addSpanEvent, traceAsync } from '../telemetry/tracing.js';
2
+ /**
3
+ * Wrap a scheduled action with OTel tracing, duration measurement, and
4
+ * `scheduler.job.executed` event emission.
5
+ *
6
+ * Composes *on top of* the adapter's inline metrics (executed/failed/duration
7
+ * counters live in the Node/Cloudflare adapters) — this wrapper adds the named
8
+ * tracing span and the lifecycle event, neither of which the adapters provide.
9
+ * Opt-in: wrap an action before registering it when you want that visibility.
10
+ *
11
+ * @param name - Job name, surfaced as `scheduler.job_name` on the span/event.
12
+ * @param action - The action to wrap (new no-arg `ScheduledAction` signature).
13
+ * @param systemBus - Optional bus to emit `scheduler.job.executed` on.
14
+ */
15
+ export function wrapScheduledHandler(name, action, systemBus) {
16
+ return async () => {
17
+ const startTime = performance.now();
18
+ return traceAsync('scheduler.job', async (span) => {
19
+ addSpanAttributes({ 'scheduler.job_name': name });
20
+ let execError;
21
+ try {
22
+ await action();
23
+ }
24
+ catch (error) {
25
+ execError = error instanceof Error ? error.message : String(error);
26
+ addSpanEvent('scheduler.job.error', { 'scheduler.error': execError });
27
+ span.setStatus({ code: 2, message: execError }); // ERROR
28
+ throw error;
29
+ }
30
+ finally {
31
+ const durationMs = Math.round(performance.now() - startTime);
32
+ addSpanAttributes({ 'scheduler.duration_ms': durationMs });
33
+ systemBus?.emit('scheduler.job.executed', {
34
+ name,
35
+ durationMs,
36
+ ...(execError !== undefined ? { error: execError } : {}),
37
+ });
38
+ }
39
+ });
40
+ };
41
+ }
@@ -0,0 +1,2 @@
1
+ export { CloudflareSchedulerAdapter } from './scheduler/cloudflare';
2
+ //# sourceMappingURL=scheduler-cloudflare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-cloudflare.d.ts","sourceRoot":"","sources":["../src/scheduler-cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1 @@
1
+ export { CloudflareSchedulerAdapter } from './scheduler/cloudflare.js';
@@ -0,0 +1,2 @@
1
+ export { NodeSchedulerAdapter } from './scheduler/node';
2
+ //# sourceMappingURL=scheduler-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-node.d.ts","sourceRoot":"","sources":["../src/scheduler-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ export { NodeSchedulerAdapter } from './scheduler/node.js';
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * Telemetry configuration interface.
3
3
  */
4
+ /**
5
+ * Full telemetry configuration: master enable switch, service name,
6
+ * environment, and debug-level DB statement capture.
7
+ */
4
8
  export interface TelemetryConfig {
5
9
  /** Master switch — when false, all tracing degrades to no-ops. */
6
10
  enabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC5B,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAQD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,GAAE,sBAA2B,GAAG,eAAe,CAU9F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAQD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,GAAE,sBAA2B,GAAG,eAAe,CAU9F"}