@gurugokul/doomscroller 0.0.0-stage → 0.1.0

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 (57) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +300 -2
  4. package/dist/adapters/claude-code-hooks.js +171 -0
  5. package/dist/adapters/claude-code-hooks.js.map +1 -0
  6. package/dist/adapters/cli-wrapper.js +230 -0
  7. package/dist/adapters/cli-wrapper.js.map +1 -0
  8. package/dist/adapters/file-activity.js +78 -0
  9. package/dist/adapters/file-activity.js.map +1 -0
  10. package/dist/adapters/hook.js +17 -0
  11. package/dist/adapters/hook.js.map +1 -0
  12. package/dist/adapters/hotkey.js +50 -0
  13. package/dist/adapters/hotkey.js.map +1 -0
  14. package/dist/adapters/ide-activity.js +245 -0
  15. package/dist/adapters/ide-activity.js.map +1 -0
  16. package/dist/adapters/ports.js +3 -0
  17. package/dist/adapters/ports.js.map +1 -0
  18. package/dist/adapters/wrapper-tracker.js +77 -0
  19. package/dist/adapters/wrapper-tracker.js.map +1 -0
  20. package/dist/cli.js +315 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/core/config.js +192 -0
  23. package/dist/core/config.js.map +1 -0
  24. package/dist/core/daemon.js +123 -0
  25. package/dist/core/daemon.js.map +1 -0
  26. package/dist/core/ipc.js +214 -0
  27. package/dist/core/ipc.js.map +1 -0
  28. package/dist/core/logger.js +53 -0
  29. package/dist/core/logger.js.map +1 -0
  30. package/dist/core/sound.js +28 -0
  31. package/dist/core/sound.js.map +1 -0
  32. package/dist/core/state-machine.js +268 -0
  33. package/dist/core/state-machine.js.map +1 -0
  34. package/dist/core/stats.js +109 -0
  35. package/dist/core/stats.js.map +1 -0
  36. package/dist/core/targets.js +23 -0
  37. package/dist/core/targets.js.map +1 -0
  38. package/dist/core/types.js +6 -0
  39. package/dist/core/types.js.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/util/errors.js +16 -0
  43. package/dist/util/errors.js.map +1 -0
  44. package/dist/util/paths.js +70 -0
  45. package/dist/util/paths.js.map +1 -0
  46. package/dist/windows/cpu-probe.js +108 -0
  47. package/dist/windows/cpu-probe.js.map +1 -0
  48. package/dist/windows/key-listener.js +198 -0
  49. package/dist/windows/key-listener.js.map +1 -0
  50. package/dist/windows/win32.js +155 -0
  51. package/dist/windows/win32.js.map +1 -0
  52. package/dist/windows/window-controller.js +3 -0
  53. package/dist/windows/window-controller.js.map +1 -0
  54. package/package.json +57 -4
  55. package/scripts/cpu-sampler.ps1 +83 -0
  56. package/scripts/key-watcher.ps1 +132 -0
  57. package/scripts/win32-window.ps1 +344 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WrapperActivityTracker = void 0;
4
+ const state_machine_1 = require("../core/state-machine");
5
+ /**
6
+ * Enter starts a session, any output keeps it alive, and a silent gap ends it.
7
+ * Kept independent of the PTY so the timing rules are unit-testable.
8
+ */
9
+ class WrapperActivityTracker {
10
+ options;
11
+ started = false;
12
+ quietTimer = null;
13
+ scheduler;
14
+ constructor(options) {
15
+ this.options = options;
16
+ this.scheduler = options.scheduler ?? state_machine_1.systemScheduler;
17
+ }
18
+ get isStarted() {
19
+ return this.started;
20
+ }
21
+ onInput(data) {
22
+ if (this.started)
23
+ return;
24
+ if (!/[\r\n]/.test(data))
25
+ return;
26
+ this.started = true;
27
+ try {
28
+ this.options.onStarted();
29
+ }
30
+ catch {
31
+ // Adapter callbacks must not break the wrapped command.
32
+ }
33
+ this.resetQuietTimer();
34
+ }
35
+ onOutput(_data) {
36
+ if (!this.started)
37
+ return;
38
+ this.resetQuietTimer();
39
+ }
40
+ onExit() {
41
+ if (!this.started)
42
+ return;
43
+ this.finish();
44
+ }
45
+ dispose() {
46
+ if (this.quietTimer !== null) {
47
+ this.scheduler.clearTimer(this.quietTimer);
48
+ this.quietTimer = null;
49
+ }
50
+ this.started = false;
51
+ }
52
+ resetQuietTimer() {
53
+ if (this.quietTimer !== null)
54
+ this.scheduler.clearTimer(this.quietTimer);
55
+ this.quietTimer = this.scheduler.setTimer(() => {
56
+ this.quietTimer = null;
57
+ this.finish();
58
+ }, this.options.quietMs);
59
+ }
60
+ finish() {
61
+ if (!this.started)
62
+ return;
63
+ this.started = false;
64
+ if (this.quietTimer !== null) {
65
+ this.scheduler.clearTimer(this.quietTimer);
66
+ this.quietTimer = null;
67
+ }
68
+ try {
69
+ this.options.onFinished();
70
+ }
71
+ catch {
72
+ // Adapter callbacks must not break the wrapped command.
73
+ }
74
+ }
75
+ }
76
+ exports.WrapperActivityTracker = WrapperActivityTracker;
77
+ //# sourceMappingURL=wrapper-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapper-tracker.js","sourceRoot":"","sources":["../../src/adapters/wrapper-tracker.ts"],"names":[],"mappings":";;;AAAA,yDAAmE;AASnE;;;GAGG;AACH,MAAa,sBAAsB;IAKJ;IAJrB,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,GAAY,IAAI,CAAC;IAClB,SAAS,CAAY;IAEtC,YAA6B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QACzD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,+BAAe,CAAC;IACxD,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC;CACF;AAhED,wDAgEC"}
package/dist/cli.js ADDED
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ exports.main = main;
5
+ const claude_code_hooks_1 = require("./adapters/claude-code-hooks");
6
+ const cli_wrapper_1 = require("./adapters/cli-wrapper");
7
+ const hook_1 = require("./adapters/hook");
8
+ const config_1 = require("./core/config");
9
+ const daemon_1 = require("./core/daemon");
10
+ const ipc_1 = require("./core/ipc");
11
+ const logger_1 = require("./core/logger");
12
+ const stats_1 = require("./core/stats");
13
+ const types_1 = require("./core/types");
14
+ const errors_1 = require("./util/errors");
15
+ const paths_1 = require("./util/paths");
16
+ exports.VERSION = '0.1.0';
17
+ function usage() {
18
+ return `doomscroller ${exports.VERSION} - doomscroll while your coding agent works
19
+
20
+ Usage:
21
+ doomscroller daemon Run the background daemon (hotkey + IDE activity)
22
+ doomscroller hotkey Alias for daemon (the global hotkey is built in)
23
+ doomscroller start Emit agent:started (hook-safe, never blocks)
24
+ doomscroller done Emit agent:finished (hook-safe, never blocks)
25
+ doomscroller status Show the daemon state
26
+ doomscroller stop Stop a running daemon
27
+ doomscroller run -- <command> Wrap a terminal agent in a PTY
28
+ doomscroller init Create ~/.doomscroller.json
29
+ doomscroller init claude-code Merge hooks into Claude Code settings
30
+ doomscroller config [--path|--json] Show the config path and effective config
31
+ doomscroller stats [--days N|--all] Show doomscroll wait time per day
32
+
33
+ Adapters:
34
+ 1. hotkey Ctrl+Alt+D starts when idle, force-returns when working
35
+ 2. hook doomscroller start / done, plus init claude-code
36
+ 3. cli-wrapper doomscroller run -- claude
37
+ 4. ide-activity Enter in a registered IDE window
38
+
39
+ Config: ${(0, paths_1.configFilePath)()}
40
+ `;
41
+ }
42
+ function printVersion() {
43
+ process.stdout.write(`doomscroller ${exports.VERSION}\n`);
44
+ return 0;
45
+ }
46
+ async function daemonCommand(args) {
47
+ let hidden = false;
48
+ let portOverride = null;
49
+ for (let index = 0; index < args.length; index++) {
50
+ const arg = args[index];
51
+ if (arg === '--hidden') {
52
+ hidden = true;
53
+ }
54
+ else if (arg === '--port' && args[index + 1]) {
55
+ const parsed = Number(args[index + 1]);
56
+ if (Number.isFinite(parsed) && parsed > 0 && parsed <= 65535) {
57
+ portOverride = parsed;
58
+ index++;
59
+ }
60
+ }
61
+ }
62
+ const loaded = (0, config_1.loadConfig)();
63
+ const config = { ...loaded.config };
64
+ if (portOverride !== null)
65
+ config.port = portOverride;
66
+ const logger = (0, logger_1.createLogger)({ filePath: config.logPath, console: !hidden });
67
+ if (loaded.error)
68
+ logger.warn(loaded.error);
69
+ let handle;
70
+ try {
71
+ handle = await (0, daemon_1.startDaemon)(config, logger);
72
+ }
73
+ catch (error) {
74
+ const message = (0, errors_1.errorMessage)(error);
75
+ logger.error(message);
76
+ if (message.includes('could not listen') && message.includes('another daemon')) {
77
+ return 0;
78
+ }
79
+ if (!hidden)
80
+ process.stderr.write(`${message}\n`);
81
+ return 1;
82
+ }
83
+ if (!hidden) {
84
+ process.stderr.write(`doomscroller daemon running. Global hotkey: ${config.hotkey ?? 'disabled'}. Press Ctrl+C to stop.\n`);
85
+ }
86
+ let shuttingDown = false;
87
+ const shutdown = async () => {
88
+ if (shuttingDown)
89
+ return;
90
+ shuttingDown = true;
91
+ await handle.close();
92
+ process.exit(0);
93
+ };
94
+ process.on('SIGINT', () => {
95
+ void shutdown();
96
+ });
97
+ process.on('SIGTERM', () => {
98
+ void shutdown();
99
+ });
100
+ process.on('uncaughtException', (error) => {
101
+ logger.error(`uncaught exception: ${(0, errors_1.errorMessage)(error)}`);
102
+ });
103
+ process.on('unhandledRejection', (error) => {
104
+ logger.warn(`unhandled rejection: ${(0, errors_1.errorMessage)(error)}`);
105
+ });
106
+ return null;
107
+ }
108
+ async function hookEventCommand(event) {
109
+ // Claude Code writes the hook payload to stdin. Drain it without waiting so
110
+ // the writer never sees a broken pipe; the process still exits immediately.
111
+ try {
112
+ if (!process.stdin.isTTY) {
113
+ process.stdin.on('data', () => { });
114
+ process.stdin.resume();
115
+ }
116
+ }
117
+ catch {
118
+ // ignore
119
+ }
120
+ const loaded = (0, config_1.loadConfig)();
121
+ await (0, hook_1.emitHookEvent)(event, loaded.config.port);
122
+ return 0;
123
+ }
124
+ async function dispatchHelper(arg) {
125
+ const event = arg === 'start' || arg === types_1.AGENT_STARTED
126
+ ? types_1.AGENT_STARTED
127
+ : arg === 'done' || arg === types_1.AGENT_FINISHED
128
+ ? types_1.AGENT_FINISHED
129
+ : null;
130
+ if (!event)
131
+ return 0;
132
+ try {
133
+ const loaded = (0, config_1.loadConfig)();
134
+ await (0, ipc_1.dispatchWithDaemon)(event, loaded.config.port);
135
+ }
136
+ catch {
137
+ // Silence is intentional.
138
+ }
139
+ return 0;
140
+ }
141
+ async function statusCommand() {
142
+ const loaded = (0, config_1.loadConfig)();
143
+ const response = await (0, ipc_1.sendIpcRequest)(loaded.config.port, { type: 'status' }, 500);
144
+ if (!response?.ok) {
145
+ process.stdout.write('doomscroller daemon is not running\n');
146
+ return 1;
147
+ }
148
+ const target = response.target ? ` target=${response.target}` : '';
149
+ process.stdout.write(`state=${response.state ?? 'unknown'}${target}\n`);
150
+ return 0;
151
+ }
152
+ async function stopCommand() {
153
+ const loaded = (0, config_1.loadConfig)();
154
+ const response = await (0, ipc_1.sendIpcRequest)(loaded.config.port, { type: 'shutdown' }, 1500);
155
+ if (!response?.ok) {
156
+ process.stdout.write('doomscroller daemon is not running\n');
157
+ return 1;
158
+ }
159
+ process.stdout.write('doomscroller daemon stopped\n');
160
+ return 0;
161
+ }
162
+ async function runCommand(args) {
163
+ const separator = args[0] === '--' ? 1 : 0;
164
+ const commandArgs = args.slice(separator);
165
+ if (commandArgs.length === 0) {
166
+ process.stderr.write('Usage: doomscroller run -- <command> [args...]\n');
167
+ return 2;
168
+ }
169
+ const loaded = (0, config_1.loadConfig)();
170
+ const logger = (0, logger_1.createLogger)({ filePath: loaded.config.logPath, console: false });
171
+ if (loaded.error)
172
+ logger.warn(loaded.error);
173
+ return (0, cli_wrapper_1.runCliWrapper)(commandArgs, loaded.config, logger);
174
+ }
175
+ function configCommand(args) {
176
+ const loaded = (0, config_1.loadConfig)();
177
+ const pathOnly = args.includes('--path');
178
+ const jsonOnly = args.includes('--json');
179
+ if (pathOnly) {
180
+ process.stdout.write(`${loaded.path}\n`);
181
+ return 0;
182
+ }
183
+ if (!jsonOnly) {
184
+ process.stdout.write(`Config: ${loaded.path}\n`);
185
+ process.stdout.write(`Exists: ${loaded.exists ? 'yes' : 'no'}\n`);
186
+ if (loaded.error)
187
+ process.stdout.write(`Warning: ${loaded.error}\n`);
188
+ process.stdout.write('\n');
189
+ }
190
+ process.stdout.write(`${JSON.stringify(loaded.config, null, 2)}\n`);
191
+ return 0;
192
+ }
193
+ async function initCommand(args) {
194
+ if (args.length === 0) {
195
+ const result = (0, config_1.writeDefaultConfig)();
196
+ process.stdout.write(result.created
197
+ ? `Created ${result.path}\n`
198
+ : `Config already exists at ${result.path}\n`);
199
+ process.stdout.write('Next: doomscroller init claude-code\n');
200
+ return 0;
201
+ }
202
+ if (args[0] === 'claude-code') {
203
+ const configResult = (0, config_1.writeDefaultConfig)();
204
+ process.stdout.write(configResult.created
205
+ ? `Created ${configResult.path}\n`
206
+ : `Config already exists at ${configResult.path}\n`);
207
+ const result = await (0, claude_code_hooks_1.installClaudeCodeHooks)();
208
+ if (result.error) {
209
+ process.stderr.write(`Could not install Claude Code hooks: ${result.error}\n`);
210
+ return 1;
211
+ }
212
+ process.stdout.write(`Claude Code settings: ${result.settingsPath}\n`);
213
+ if (result.changed) {
214
+ process.stdout.write(` added: ${result.added.join(', ') || 'none'}\n`);
215
+ if (result.existing.length > 0) {
216
+ process.stdout.write(` already present: ${result.existing.join(', ')}\n`);
217
+ }
218
+ process.stdout.write(' backup: settings.json.doomscroller.bak\n');
219
+ }
220
+ else {
221
+ process.stdout.write(` hooks already present: ${result.existing.join(', ') || 'none'}\n`);
222
+ }
223
+ process.stdout.write('Claude Code hooks call doomscroller directly; no daemon needs to be running.\n');
224
+ return 0;
225
+ }
226
+ process.stderr.write('Usage: doomscroller init [claude-code]\n');
227
+ return 1;
228
+ }
229
+ function statsCommand(args) {
230
+ let days = 14;
231
+ for (let index = 0; index < args.length; index++) {
232
+ const arg = args[index];
233
+ if (arg === '--all') {
234
+ days = null;
235
+ }
236
+ else if (arg === '--days' && args[index + 1]) {
237
+ const parsed = Number(args[index + 1]);
238
+ if (Number.isFinite(parsed) && parsed > 0) {
239
+ days = Math.floor(parsed);
240
+ index++;
241
+ }
242
+ }
243
+ }
244
+ const loaded = (0, config_1.loadConfig)();
245
+ const records = (0, stats_1.readSessions)(loaded.config.sessionLogPath);
246
+ const rows = (0, stats_1.aggregateByDay)(records, { days });
247
+ if (rows.length === 0) {
248
+ process.stdout.write(`No sessions logged yet (${loaded.config.sessionLogPath}). Use an adapter, then finish a session.\n`);
249
+ return 0;
250
+ }
251
+ const title = days === null ? 'all time' : `last ${days} days`;
252
+ process.stdout.write(`Doomscroll wait time (${title})\n\n`);
253
+ process.stdout.write('Date Sessions Waiting Avg\n');
254
+ let totalSessions = 0;
255
+ let totalDoomscroll = 0;
256
+ for (const row of rows) {
257
+ totalSessions += row.sessions;
258
+ totalDoomscroll += row.doomscrollMs;
259
+ const average = row.sessions > 0 ? row.doomscrollMs / row.sessions : 0;
260
+ process.stdout.write(`${row.date} ${String(row.sessions).padStart(8)} ${(0, stats_1.formatDuration)(row.doomscrollMs).padStart(12)} ${(0, stats_1.formatDuration)(average).padStart(9)}\n`);
261
+ }
262
+ const overallAverage = totalSessions > 0 ? totalDoomscroll / totalSessions : 0;
263
+ process.stdout.write('\n');
264
+ process.stdout.write(`Total ${String(totalSessions).padStart(8)} ${(0, stats_1.formatDuration)(totalDoomscroll).padStart(12)} ${(0, stats_1.formatDuration)(overallAverage).padStart(9)}\n`);
265
+ return 0;
266
+ }
267
+ async function main(argv) {
268
+ const command = argv[0];
269
+ try {
270
+ switch (command) {
271
+ case undefined:
272
+ case '-h':
273
+ case '--help':
274
+ case 'help':
275
+ process.stdout.write(usage());
276
+ return 0;
277
+ case '-v':
278
+ case '--version':
279
+ case 'version':
280
+ return printVersion();
281
+ case 'daemon':
282
+ case 'hotkey':
283
+ return await daemonCommand(argv.slice(1));
284
+ case 'start':
285
+ return await hookEventCommand(types_1.AGENT_STARTED);
286
+ case 'done':
287
+ return await hookEventCommand(types_1.AGENT_FINISHED);
288
+ case '__dispatch':
289
+ return await dispatchHelper(argv[1]);
290
+ case 'status':
291
+ return await statusCommand();
292
+ case 'stop':
293
+ return await stopCommand();
294
+ case 'run':
295
+ return await runCommand(argv.slice(1));
296
+ case 'config':
297
+ return configCommand(argv.slice(1));
298
+ case 'init':
299
+ return await initCommand(argv.slice(1));
300
+ case 'stats':
301
+ return statsCommand(argv.slice(1));
302
+ default:
303
+ process.stderr.write(`Unknown command: ${command}\n\n${usage()}`);
304
+ return 1;
305
+ }
306
+ }
307
+ catch (error) {
308
+ // Hooks call start/done; those must never surface a failure to the agent.
309
+ if (command !== 'start' && command !== 'done' && command !== '__dispatch') {
310
+ process.stderr.write(`${(0, errors_1.errorMessage)(error)}\n`);
311
+ }
312
+ return 1;
313
+ }
314
+ }
315
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultConfig = defaultConfig;
7
+ exports.mergeConfig = mergeConfig;
8
+ exports.loadConfig = loadConfig;
9
+ exports.defaultConfigFileContents = defaultConfigFileContents;
10
+ exports.writeDefaultConfig = writeDefaultConfig;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const errors_1 = require("../util/errors");
14
+ const paths_1 = require("../util/paths");
15
+ const BROWSERS = ['auto', 'edge', 'chrome', 'brave', 'firefox', 'default'];
16
+ const ADAPTERS = ['hotkey', 'hook', 'cli-wrapper', 'ide-activity'];
17
+ function defaultConfig() {
18
+ return {
19
+ targets: [
20
+ 'https://www.instagram.com/',
21
+ 'https://x.com/',
22
+ 'https://www.youtube.com/shorts',
23
+ ],
24
+ delaySeconds: 10,
25
+ quietSeconds: 15,
26
+ maxDoomscrollSeconds: 600,
27
+ hotkey: 'Ctrl+Alt+D',
28
+ sound: true,
29
+ browser: 'auto',
30
+ port: 45871,
31
+ idleCpuPercent: 5,
32
+ registeredAgents: [
33
+ {
34
+ name: 'Antigravity',
35
+ adapter: 'ide-activity',
36
+ match: { process: 'antigravity' },
37
+ },
38
+ ],
39
+ logPath: (0, paths_1.defaultLogPath)(),
40
+ sessionLogPath: (0, paths_1.defaultSessionLogPath)(),
41
+ };
42
+ }
43
+ function asRecord(value) {
44
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
45
+ ? value
46
+ : null;
47
+ }
48
+ function numberOr(value, fallback, minimum) {
49
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < minimum)
50
+ return fallback;
51
+ return value;
52
+ }
53
+ function booleanOr(value, fallback) {
54
+ return typeof value === 'boolean' ? value : fallback;
55
+ }
56
+ function stringOr(value, fallback) {
57
+ return typeof value === 'string' && value.trim() !== '' ? value : fallback;
58
+ }
59
+ function parseMatch(value) {
60
+ const record = asRecord(value);
61
+ if (!record)
62
+ return undefined;
63
+ const match = {};
64
+ if (typeof record.title === 'string' && record.title.trim() !== '') {
65
+ match.title = record.title.trim();
66
+ }
67
+ if (typeof record.process === 'string' && record.process.trim() !== '') {
68
+ match.process = record.process.trim();
69
+ }
70
+ return match.title || match.process ? match : undefined;
71
+ }
72
+ function parseAgents(value, fallback) {
73
+ if (!Array.isArray(value))
74
+ return fallback;
75
+ const agents = [];
76
+ for (const item of value) {
77
+ const record = asRecord(item);
78
+ if (!record)
79
+ continue;
80
+ const name = stringOr(record.name, '').trim();
81
+ const adapter = record.adapter;
82
+ if (!name)
83
+ continue;
84
+ if (typeof adapter !== 'string' || !ADAPTERS.includes(adapter))
85
+ continue;
86
+ const agent = {
87
+ name,
88
+ adapter: adapter,
89
+ };
90
+ const match = parseMatch(record.match);
91
+ if (match)
92
+ agent.match = match;
93
+ if (typeof record.workspace === 'string' && record.workspace.trim() !== '') {
94
+ agent.workspace = (0, paths_1.expandHome)(record.workspace.trim());
95
+ }
96
+ if (typeof record.quietSeconds === 'number' && Number.isFinite(record.quietSeconds) && record.quietSeconds > 0) {
97
+ agent.quietSeconds = record.quietSeconds;
98
+ }
99
+ agents.push(agent);
100
+ }
101
+ return agents;
102
+ }
103
+ function mergeConfig(base, raw) {
104
+ const record = asRecord(raw);
105
+ if (!record)
106
+ return base;
107
+ const targets = Array.isArray(record.targets)
108
+ ? record.targets.filter((target) => typeof target === 'string' && target.trim() !== '')
109
+ : [];
110
+ const browser = BROWSERS.includes(record.browser)
111
+ ? record.browser
112
+ : base.browser;
113
+ return {
114
+ targets: targets.length > 0 ? targets : base.targets,
115
+ delaySeconds: numberOr(record.delaySeconds, base.delaySeconds, 0),
116
+ quietSeconds: numberOr(record.quietSeconds, base.quietSeconds, 1),
117
+ maxDoomscrollSeconds: numberOr(record.maxDoomscrollSeconds, base.maxDoomscrollSeconds, 0),
118
+ hotkey: record.hotkey === null
119
+ ? null
120
+ : typeof record.hotkey === 'string' && record.hotkey.trim() !== ''
121
+ ? record.hotkey.trim()
122
+ : base.hotkey,
123
+ sound: booleanOr(record.sound, base.sound),
124
+ browser,
125
+ port: Math.min(65535, Math.max(1, Math.round(numberOr(record.port, base.port, 1)))),
126
+ idleCpuPercent: numberOr(record.idleCpuPercent, base.idleCpuPercent, 0),
127
+ registeredAgents: parseAgents(record.registeredAgents, base.registeredAgents),
128
+ logPath: typeof record.logPath === 'string' && record.logPath.trim() !== ''
129
+ ? node_path_1.default.resolve((0, paths_1.expandHome)(record.logPath.trim()))
130
+ : base.logPath,
131
+ sessionLogPath: typeof record.sessionLogPath === 'string' && record.sessionLogPath.trim() !== ''
132
+ ? node_path_1.default.resolve((0, paths_1.expandHome)(record.sessionLogPath.trim()))
133
+ : base.sessionLogPath,
134
+ };
135
+ }
136
+ function loadConfig(filePath = (0, paths_1.configFilePath)()) {
137
+ const base = defaultConfig();
138
+ try {
139
+ const text = node_fs_1.default.readFileSync(filePath, 'utf8').replace(/^\uFEFF/, '');
140
+ let raw;
141
+ try {
142
+ raw = JSON.parse(text);
143
+ }
144
+ catch (error) {
145
+ return {
146
+ config: base,
147
+ path: filePath,
148
+ exists: true,
149
+ error: `Invalid JSON in ${filePath}: ${(0, errors_1.errorMessage)(error)}`,
150
+ };
151
+ }
152
+ return { config: mergeConfig(base, raw), path: filePath, exists: true };
153
+ }
154
+ catch (error) {
155
+ const code = error.code;
156
+ if (code === 'ENOENT')
157
+ return { config: base, path: filePath, exists: false };
158
+ return {
159
+ config: base,
160
+ path: filePath,
161
+ exists: false,
162
+ error: `Could not read ${filePath}: ${(0, errors_1.errorMessage)(error)}`,
163
+ };
164
+ }
165
+ }
166
+ function defaultConfigFileContents() {
167
+ const config = defaultConfig();
168
+ return `${JSON.stringify({
169
+ targets: config.targets,
170
+ delaySeconds: config.delaySeconds,
171
+ quietSeconds: config.quietSeconds,
172
+ maxDoomscrollSeconds: config.maxDoomscrollSeconds,
173
+ hotkey: config.hotkey,
174
+ sound: config.sound,
175
+ browser: config.browser,
176
+ port: config.port,
177
+ idleCpuPercent: config.idleCpuPercent,
178
+ registeredAgents: config.registeredAgents,
179
+ }, null, 2)}\n`;
180
+ }
181
+ function writeDefaultConfig(filePath = (0, paths_1.configFilePath)()) {
182
+ try {
183
+ node_fs_1.default.accessSync(filePath);
184
+ return { created: false, path: filePath };
185
+ }
186
+ catch {
187
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(filePath), { recursive: true });
188
+ node_fs_1.default.writeFileSync(filePath, defaultConfigFileContents(), 'utf8');
189
+ return { created: true, path: filePath };
190
+ }
191
+ }
192
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}