@scrylog/cli 0.3.0 → 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 (195) hide show
  1. package/dist/assets/highlights-eq9cgrbb.scm +604 -0
  2. package/dist/assets/highlights-ghv9g403.scm +205 -0
  3. package/dist/assets/highlights-hk7bwhj4.scm +284 -0
  4. package/dist/assets/highlights-r812a2qc.scm +150 -0
  5. package/dist/assets/highlights-x6tmsnaa.scm +115 -0
  6. package/dist/assets/injections-73j83es3.scm +27 -0
  7. package/dist/assets/parser.worker-xyhf83rf.js +4563 -0
  8. package/dist/assets/tree-sitter-3jzf13jk.wasm +0 -0
  9. package/dist/assets/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  10. package/dist/assets/tree-sitter-markdown-411r6y9b.wasm +0 -0
  11. package/dist/assets/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  12. package/dist/assets/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  13. package/dist/assets/tree-sitter-zig-e78zbjpm.wasm +0 -0
  14. package/dist/cli/index.js +499 -0
  15. package/dist/cli/index.js.map +61 -0
  16. package/dist/daemon/index.js +670 -0
  17. package/dist/daemon/index.js.map +1475 -0
  18. package/dist/hooks/claude.js +6 -0
  19. package/dist/hooks/claude.js.map +11 -0
  20. package/dist/hooks/codex.js +10 -0
  21. package/dist/hooks/codex.js.map +11 -0
  22. package/dist/mcp/index.js +100 -0
  23. package/dist/mcp/index.js.map +231 -0
  24. package/dist/oc/index.js +21 -0
  25. package/dist/oc/index.js.map +10 -0
  26. package/package.json +16 -13
  27. package/src/api/docs/sessions.keys.ts +0 -6
  28. package/src/api/docs/sessions.ts +0 -82
  29. package/src/api/docs/system.keys.ts +0 -5
  30. package/src/api/docs/system.ts +0 -69
  31. package/src/api/docs/usage.keys.ts +0 -3
  32. package/src/api/docs/usage.ts +0 -24
  33. package/src/api/docs/webhooks.keys.ts +0 -5
  34. package/src/api/docs/webhooks.ts +0 -78
  35. package/src/api/index.ts +0 -18
  36. package/src/api/lib/auth.ts +0 -43
  37. package/src/api/lib/errors.ts +0 -28
  38. package/src/api/lib/route.ts +0 -18
  39. package/src/api/models/claude.ts +0 -4
  40. package/src/api/models/codex.ts +0 -4
  41. package/src/api/models/opencode.ts +0 -11
  42. package/src/api/routes/sessions.ts +0 -51
  43. package/src/api/routes/system.ts +0 -106
  44. package/src/api/routes/usage.ts +0 -15
  45. package/src/api/routes/webhooks/claude.ts +0 -149
  46. package/src/api/routes/webhooks/codex.ts +0 -175
  47. package/src/api/routes/webhooks/opencode.ts +0 -112
  48. package/src/api/routes.ts +0 -93
  49. package/src/api/schemas/common.ts +0 -29
  50. package/src/api/schemas/sessions.ts +0 -86
  51. package/src/api/schemas/usage.ts +0 -51
  52. package/src/api/schemas/webhooks/claude.ts +0 -32
  53. package/src/api/schemas/webhooks/codex.ts +0 -34
  54. package/src/api/schemas/webhooks/opencode.ts +0 -29
  55. package/src/api/services/claude-session.ts +0 -9
  56. package/src/api/services/codex-session.ts +0 -8
  57. package/src/api/services/opencode-session.ts +0 -73
  58. package/src/classifier.ts +0 -206
  59. package/src/cli/commands.ts +0 -714
  60. package/src/cli/index.ts +0 -18
  61. package/src/cli/program.ts +0 -175
  62. package/src/cli/prompt.ts +0 -44
  63. package/src/daemon/cli.ts +0 -27
  64. package/src/daemon/collectors/claude/README.md +0 -108
  65. package/src/daemon/collectors/claude/collector.ts +0 -423
  66. package/src/daemon/collectors/claude/discovery.ts +0 -127
  67. package/src/daemon/collectors/claude/hooks.ts +0 -181
  68. package/src/daemon/collectors/claude/index.ts +0 -8
  69. package/src/daemon/collectors/claude/jsonl.ts +0 -85
  70. package/src/daemon/collectors/claude/transcript.ts +0 -246
  71. package/src/daemon/collectors/codex/README.md +0 -147
  72. package/src/daemon/collectors/codex/collector.ts +0 -661
  73. package/src/daemon/collectors/codex/discovery.ts +0 -104
  74. package/src/daemon/collectors/codex/hooks.ts +0 -179
  75. package/src/daemon/collectors/codex/index.ts +0 -7
  76. package/src/daemon/collectors/codex/jsonl.ts +0 -108
  77. package/src/daemon/collectors/codex/transcript.ts +0 -299
  78. package/src/daemon/collectors/git.ts +0 -353
  79. package/src/daemon/collectors/herdr/collector.ts +0 -128
  80. package/src/daemon/collectors/herdr/index.ts +0 -2
  81. package/src/daemon/collectors/herdr/normalization.ts +0 -111
  82. package/src/daemon/collectors/opencode/README.md +0 -106
  83. package/src/daemon/collectors/opencode/collector.ts +0 -545
  84. package/src/daemon/collectors/opencode/discovery.ts +0 -257
  85. package/src/daemon/collectors/opencode/index.ts +0 -5
  86. package/src/daemon/collectors/opencode/session-builder.ts +0 -59
  87. package/src/daemon/collectors/opencode-db.ts +0 -294
  88. package/src/daemon/collectors/process.ts +0 -201
  89. package/src/daemon/collectors/tmux/README.md +0 -128
  90. package/src/daemon/collectors/tmux/collector.ts +0 -492
  91. package/src/daemon/collectors/tmux/enrichment.ts +0 -242
  92. package/src/daemon/collectors/tmux/index.ts +0 -4
  93. package/src/daemon/collectors/tmux/parse.ts +0 -128
  94. package/src/daemon/collectors/usage.ts +0 -259
  95. package/src/daemon/index.ts +0 -209
  96. package/src/daemon/scheduler.ts +0 -86
  97. package/src/daemon/store.ts +0 -630
  98. package/src/detect.ts +0 -143
  99. package/src/hooks/claude.ts +0 -596
  100. package/src/hooks/codex.ts +0 -517
  101. package/src/legacy/classifier.ts +0 -215
  102. package/src/legacy/detect.ts +0 -143
  103. package/src/mcp/client-server.ts +0 -21
  104. package/src/mcp/http-handler.ts +0 -126
  105. package/src/mcp/index.ts +0 -61
  106. package/src/mcp/resources/config-current.ts +0 -19
  107. package/src/mcp/resources/index.ts +0 -11
  108. package/src/mcp/resources/sessions-active.ts +0 -19
  109. package/src/mcp/resources/sessions-all.ts +0 -19
  110. package/src/mcp/schemas/sessions.ts +0 -3
  111. package/src/mcp/server.ts +0 -17
  112. package/src/mcp/services/api-adapter.ts +0 -48
  113. package/src/mcp/services/data-source.ts +0 -22
  114. package/src/mcp/services/store-adapter.ts +0 -40
  115. package/src/mcp/tools/get-active-sessions.ts +0 -16
  116. package/src/mcp/tools/get-session-children.ts +0 -24
  117. package/src/mcp/tools/get-session-messages.ts +0 -24
  118. package/src/mcp/tools/get-session.ts +0 -23
  119. package/src/mcp/tools/index.ts +0 -15
  120. package/src/mcp/tools/list-sessions.ts +0 -16
  121. package/src/oc/index.ts +0 -302
  122. package/src/service/manager.ts +0 -284
  123. package/src/shared/config.ts +0 -511
  124. package/src/shared/ipc.ts +0 -80
  125. package/src/shared/logger.ts +0 -248
  126. package/src/shared/paths.ts +0 -73
  127. package/src/shared/platform.ts +0 -110
  128. package/src/shared/session-exclusions.ts +0 -5
  129. package/src/shared/session-view.ts +0 -302
  130. package/src/shared/terminal-capabilities.ts +0 -130
  131. package/src/shared/types.ts +0 -330
  132. package/src/shared/utils.ts +0 -339
  133. package/src/shared/version.ts +0 -44
  134. package/src/tui/App.tsx +0 -240
  135. package/src/tui/client.ts +0 -163
  136. package/src/tui/components/BindingsModal.tsx +0 -82
  137. package/src/tui/components/DashboardHeader.tsx +0 -256
  138. package/src/tui/components/KeyBar.tsx +0 -67
  139. package/src/tui/components/SessionDetailModal.tsx +0 -169
  140. package/src/tui/components/SessionsView.tsx +0 -184
  141. package/src/tui/components/TabBar.tsx +0 -40
  142. package/src/tui/components/UsageSummaryPane.tsx +0 -272
  143. package/src/tui/components/UsageView.tsx +0 -242
  144. package/src/tui/components/tool-icons.ts +0 -24
  145. package/src/tui/index.tsx +0 -106
  146. package/src/tui/keybindings.ts +0 -49
  147. package/src/tui/model.ts +0 -295
  148. package/src/tui/state.ts +0 -77
  149. package/src/tui/theme.ts +0 -110
  150. package/src/types.ts +0 -113
  151. package/src/usage/README.md +0 -323
  152. package/src/usage/api.ts +0 -99
  153. package/src/usage/client.ts +0 -3
  154. package/src/usage/clients/anthropic-oauth-usage.ts +0 -258
  155. package/src/usage/clients/anthropic-web-usage.ts +0 -329
  156. package/src/usage/clients/claude-cli-probe.ts +0 -513
  157. package/src/usage/clients/codex-app-server.ts +0 -354
  158. package/src/usage/clients/codex-oauth-usage.ts +0 -240
  159. package/src/usage/clients/opencode-go-api.ts +0 -100
  160. package/src/usage/clients/opencode-go-usage.ts +0 -577
  161. package/src/usage/errors.ts +0 -33
  162. package/src/usage/index.ts +0 -20
  163. package/src/usage/local/opencode-go-local.ts +0 -194
  164. package/src/usage/mappers.ts +0 -282
  165. package/src/usage/planner.ts +0 -118
  166. package/src/usage/providers/claude.ts +0 -233
  167. package/src/usage/providers/codex.ts +0 -115
  168. package/src/usage/providers/opencode-go.ts +0 -115
  169. package/src/usage/resolver.ts +0 -4
  170. package/src/usage/resolvers/browser-cookies.ts +0 -808
  171. package/src/usage/resolvers/claude-auth.ts +0 -208
  172. package/src/usage/resolvers/claude-cli.ts +0 -24
  173. package/src/usage/resolvers/claude-desktop-auth.ts +0 -170
  174. package/src/usage/resolvers/claude-web.ts +0 -82
  175. package/src/usage/resolvers/codex-auth.ts +0 -174
  176. package/src/usage/resolvers/keychain-coordinator.ts +0 -397
  177. package/src/usage/resolvers/opencode-go-web.ts +0 -55
  178. package/src/usage/types.ts +0 -225
  179. package/src/usage/web-session-cache.ts +0 -37
  180. /package/{src/tui → dist/cli}/assets/providers/SOURCES.md +0 -0
  181. /package/{src/tui → dist/cli}/assets/providers/claude-terminal.png +0 -0
  182. /package/{src/tui → dist/cli}/assets/providers/claude-terminal.svg +0 -0
  183. /package/{src/tui → dist/cli}/assets/providers/claude.png +0 -0
  184. /package/{src/tui → dist/cli}/assets/providers/copilot.png +0 -0
  185. /package/{src/tui → dist/cli}/assets/providers/copilot.svg +0 -0
  186. /package/{src/tui → dist/cli}/assets/providers/openai-terminal.png +0 -0
  187. /package/{src/tui → dist/cli}/assets/providers/openai-terminal.svg +0 -0
  188. /package/{src/tui → dist/cli}/assets/providers/openai.png +0 -0
  189. /package/{src/tui → dist/cli}/assets/providers/opencode-terminal.png +0 -0
  190. /package/{src/tui → dist/cli}/assets/providers/opencode-terminal.svg +0 -0
  191. /package/{src/tui → dist/cli}/assets/providers/opencode.png +0 -0
  192. /package/{src/tui → dist/cli}/assets/providers/shell.png +0 -0
  193. /package/{src/tui → dist/cli}/assets/providers/shell.svg +0 -0
  194. /package/{src/tui → dist/cli}/assets/providers/unknown.png +0 -0
  195. /package/{src/tui → dist/cli}/assets/providers/unknown.svg +0 -0
@@ -1,209 +0,0 @@
1
- #!/usr/bin/env bun
2
- import { unlinkSync, existsSync } from "node:fs";
3
- import { loadConfig } from "../shared/config";
4
- import { getSocketPath } from "../shared/ipc";
5
- import { IS_WINDOWS } from "../shared/platform";
6
- import { DaemonStore } from "./store";
7
- import { Scheduler } from "./scheduler";
8
- import { TmuxCollector } from "./collectors/tmux";
9
- import { HerdrCollector } from "./collectors/herdr";
10
- import { ProcessCollector } from "./collectors/process";
11
- import { GitCollector } from "./collectors/git";
12
- import { OpenCodeCollector } from "./collectors/opencode";
13
- import { ClaudeCollector } from "./collectors/claude";
14
- import { CodexCollector } from "./collectors/codex";
15
- import { OpenCodeDbCollector } from "./collectors/opencode-db";
16
- import { UsageCollector } from "./collectors/usage";
17
- import { createApiHandler } from "../api/index";
18
- import { createMcpHttpHandler } from "../mcp/http-handler";
19
- import { createLogger, parseLogFormat, parseLogLevel } from "../shared/logger";
20
- import { parseDaemonArgs } from "./cli";
21
-
22
- function printHelp() {
23
- process.stdout.write(`scrylogd
24
-
25
- Usage:
26
- scrylogd [options]
27
-
28
- Options:
29
- --config <path> Load config from an explicit path
30
- --log-level <level> Override daemon log level
31
- --log-format <format> Override stderr log format (pretty|json)
32
- --no-log-file Disable daemon JSONL file logging for this process
33
- -h, --help Show this help text
34
-
35
- Notes:
36
- Starts the scrylog daemon, HTTP API, and MCP HTTP listener.
37
- `);
38
- }
39
-
40
- // ── Parse CLI args ────────────────────────────────────────────────────────────
41
-
42
- const args = process.argv.slice(2);
43
- let cliOptions: ReturnType<typeof parseDaemonArgs>;
44
- try {
45
- cliOptions = parseDaemonArgs(args);
46
- } catch (error) {
47
- process.stderr.write(`scrylogd: ${error instanceof Error ? error.message : String(error)}\n`);
48
- process.exit(1);
49
- }
50
-
51
- if (cliOptions.help) {
52
- printHelp();
53
- process.exit(0);
54
- }
55
- const configPath = cliOptions.configPath;
56
- const logLevelArg = cliOptions.logLevel;
57
- const logFormatArg = cliOptions.logFormat;
58
-
59
- // ── Bootstrap ─────────────────────────────────────────────────────────────────
60
-
61
- const config = loadConfig(configPath);
62
- const logLevel = parseLogLevel(logLevelArg, config.daemon.logLevel);
63
- const logFormat = parseLogFormat(logFormatArg, config.daemon.logFormat);
64
- const logger = createLogger({
65
- level: logLevel,
66
- format: logFormat,
67
- file: {
68
- enabled: config.daemon.logFileEnabled && cliOptions.logFileEnabled,
69
- path: config.daemon.logFilePath,
70
- maxBytes: config.daemon.logFileMaxBytes,
71
- maxFiles: config.daemon.logFileMaxFiles,
72
- },
73
- });
74
- const store = new DaemonStore(logger);
75
- const scheduler = new Scheduler(store, config, logger);
76
- const processCollector = new ProcessCollector();
77
- const gitCollector = new GitCollector();
78
-
79
- scheduler.register(processCollector);
80
- scheduler.register(gitCollector);
81
- scheduler.register(new TmuxCollector(processCollector, gitCollector));
82
- scheduler.register(new HerdrCollector(gitCollector));
83
- if (config.opencode.mode === "sse") {
84
- scheduler.register(new OpenCodeCollector(gitCollector));
85
- }
86
- scheduler.register(new ClaudeCollector(gitCollector));
87
- scheduler.register(new CodexCollector(gitCollector));
88
- scheduler.register(new OpenCodeDbCollector(gitCollector));
89
- if (config.usage.enabled) {
90
- scheduler.register(new UsageCollector());
91
- }
92
-
93
- // ── Duplicate-instance detection ──────────────────────────────────────────────
94
-
95
- const socketPath = getSocketPath(config.daemon.socketPath);
96
- const apiTcpEnabled = IS_WINDOWS || config.api.tcpEnabled;
97
-
98
- if (IS_WINDOWS) {
99
- if (!config.api.tcpEnabled) {
100
- logger.warn("daemon", "Windows requires TCP for duplicate detection and API access. Using TCP regardless of config.api.tcpEnabled.", { event: "daemon.tcp_required", platform: "windows" });
101
- }
102
-
103
- // Try connecting to an existing daemon via TCP; if it responds, exit
104
- try {
105
- const probeHeaders: Record<string, string> = config.api.bearerToken
106
- ? { Authorization: `Bearer ${config.api.bearerToken}` }
107
- : {};
108
- const probeUrl = `http://localhost:${config.api.port}/api/health`;
109
- const probe = await fetch(probeUrl, { headers: probeHeaders, signal: AbortSignal.timeout(config.daemon.networkTimeoutMs) });
110
- if (probe.ok) {
111
- logger.info("daemon", "Another daemon is already running. Exiting.", { event: "daemon.duplicate_detected", listener: "tcp", url: probeUrl });
112
- process.exit(0);
113
- }
114
- } catch {
115
- // No running daemon — continue
116
- }
117
- } else {
118
- // Try connecting to an existing daemon; if it responds, exit
119
- try {
120
- const probeHeaders: Record<string, string> = config.api.bearerToken
121
- ? { Authorization: `Bearer ${config.api.bearerToken}` }
122
- : {};
123
- // @ts-ignore -- Bun-specific unix option
124
- const probe = await fetch("http://localhost/api/health", { unix: socketPath, headers: probeHeaders, signal: AbortSignal.timeout(config.daemon.networkTimeoutMs) });
125
- if (probe.ok) {
126
- logger.info("daemon", "Another daemon is already running. Exiting.", { event: "daemon.duplicate_detected", socketPath });
127
- process.exit(0);
128
- }
129
- } catch {
130
- // No running daemon — clean up stale socket and continue
131
- if (existsSync(socketPath)) {
132
- try {
133
- unlinkSync(socketPath);
134
- } catch {
135
- // Ignore cleanup errors
136
- }
137
- }
138
- }
139
- }
140
-
141
- // ── Start collectors ──────────────────────────────────────────────────────────
142
-
143
- await scheduler.start();
144
-
145
- // ── HTTP API handler (shared across Unix socket and TCP) ──────────────────────
146
-
147
- const apiHandler = createApiHandler(store, config, logger, gitCollector);
148
-
149
- // ── Unix socket listener (macOS/Linux) ────────────────────────────────────────
150
-
151
- if (!IS_WINDOWS) {
152
- // idleTimeout is not typed on the unix socket variant but is supported at runtime
153
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
- Bun.serve({
155
- unix: socketPath,
156
- fetch: apiHandler,
157
- idleTimeout: 0, // SSE connections must not be dropped on idle
158
- } as any);
159
- logger.info("daemon", "Unix socket listener started", { event: "daemon.listener_started", listener: "unix", socketPath });
160
- }
161
-
162
- // ── TCP listener ──────────────────────────────────────────────────────────────
163
-
164
- if (apiTcpEnabled) {
165
- Bun.serve({
166
- port: config.api.port,
167
- hostname: config.api.host,
168
- fetch: apiHandler,
169
- idleTimeout: 0, // SSE connections must not be dropped on idle
170
- });
171
- logger.info("daemon", "HTTP API listener started", { event: "daemon.listener_started", listener: "api", url: `http://${config.api.host}:${config.api.port}` });
172
- } else {
173
- logger.info("daemon", "HTTP API TCP listener disabled", { event: "daemon.listener_disabled", listener: "api" });
174
- }
175
-
176
- // ── MCP HTTP listener (in-daemon) ─────────────────────────────────────────────
177
-
178
- const mcpHandler = createMcpHttpHandler(store, config);
179
- if (mcpHandler) {
180
- Bun.serve({
181
- port: config.mcp.port,
182
- hostname: config.mcp.host,
183
- fetch: mcpHandler,
184
- idleTimeout: 0, // long-lived MCP connections
185
- });
186
- logger.info("daemon", "MCP HTTP listener started", { event: "daemon.listener_started", listener: "mcp", url: `http://${config.mcp.host}:${config.mcp.port}` });
187
- } else {
188
- logger.info("daemon", "MCP HTTP listener disabled", { event: "daemon.listener_disabled", listener: "mcp" });
189
- }
190
-
191
- // ── Signal handling ───────────────────────────────────────────────────────────
192
-
193
- async function shutdown(signal: string): Promise<void> {
194
- logger.info("daemon", "Received signal. Shutting down", { event: "daemon.shutdown", signal });
195
- await scheduler.stop();
196
- if (!IS_WINDOWS && existsSync(socketPath)) {
197
- try {
198
- unlinkSync(socketPath);
199
- } catch {
200
- // Ignore
201
- }
202
- }
203
- process.exit(0);
204
- }
205
-
206
- process.on("SIGTERM", () => void shutdown("SIGTERM"));
207
- process.on("SIGINT", () => void shutdown("SIGINT"));
208
-
209
- logger.info("daemon", "Started", { event: "daemon.started" });
@@ -1,86 +0,0 @@
1
- import type { ScrylogConfig } from "../shared/config";
2
- import type { Logger } from "../shared/logger";
3
- import type { DaemonStore } from "./store";
4
- import type { ProcessCollector } from "./collectors/process";
5
-
6
- export interface Collector {
7
- name: string;
8
- /** Called once to start periodic/event-driven collection */
9
- start(store: DaemonStore, config: ScrylogConfig, logger: Logger): void | Promise<void>;
10
- /** Called on daemon shutdown */
11
- stop(): void | Promise<void>;
12
- }
13
-
14
- /**
15
- * Orchestrates all collectors.
16
- * Handles lifecycle start/stop and periodic polling intervals.
17
- */
18
- export class Scheduler {
19
- private collectors: Collector[] = [];
20
- private running = false;
21
- private retentionTimer?: ReturnType<typeof setInterval>;
22
-
23
- constructor(
24
- private readonly store: DaemonStore,
25
- private readonly config: ScrylogConfig,
26
- private readonly logger: Logger,
27
- ) {}
28
-
29
- register(collector: Collector): void {
30
- this.collectors.push(collector);
31
- if (collector.name === "process" && "processes" in collector) {
32
- this.store.registerProcessCollector(collector as unknown as ProcessCollector);
33
- }
34
- }
35
-
36
- async start(): Promise<void> {
37
- if (this.running) {
38
- return;
39
- }
40
-
41
- this.running = true;
42
- this.logger.info("scheduler", "Starting all collectors", { event: "scheduler.collectors_starting", count: this.collectors.length });
43
-
44
- for (const collector of this.collectors) {
45
- try {
46
- this.store.setCollectorStatus(collector.name, { running: true, lastRunAt: Date.now() });
47
- this.logger.debug("scheduler", "Starting collector", { event: "collector.starting", collector: collector.name });
48
- await collector.start(this.store, this.config, this.logger);
49
- } catch (error) {
50
- const message = error instanceof Error ? error.message : String(error);
51
- this.logger.warn("scheduler", "Collector failed to start", { event: "collector.start_failed", collector: collector.name, errorMessage: message });
52
- this.store.setCollectorStatus(collector.name, { running: false, lastError: message });
53
- this.store.reportError(collector.name, message);
54
- }
55
- }
56
-
57
- this.store.applyRetention(this.config.retention);
58
- this.retentionTimer = setInterval(() => {
59
- this.store.applyRetention(this.config.retention);
60
- }, Math.max(this.config.daemon.pollIntervalMs, 60_000));
61
- }
62
-
63
- async stop(): Promise<void> {
64
- if (!this.running) {
65
- return;
66
- }
67
-
68
- this.running = false;
69
- this.logger.info("scheduler", "Stopping all collectors", { event: "scheduler.collectors_stopping" });
70
- if (this.retentionTimer) {
71
- clearInterval(this.retentionTimer);
72
- this.retentionTimer = undefined;
73
- }
74
-
75
- for (const collector of this.collectors) {
76
- try {
77
- await collector.stop();
78
- this.store.setCollectorStatus(collector.name, { running: false });
79
- this.logger.debug("scheduler", "Stopped collector", { event: "collector.stopped", collector: collector.name });
80
- } catch (error) {
81
- const message = error instanceof Error ? error.message : String(error);
82
- this.logger.warn("scheduler", "Collector failed to stop", { event: "collector.stop_failed", collector: collector.name, errorMessage: message });
83
- }
84
- }
85
- }
86
- }