@marcopeg/hal 1.0.17 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -28
- package/dist/bot/commands/git/callback.d.ts +8 -0
- package/dist/bot/commands/git/callback.d.ts.map +1 -0
- package/dist/bot/commands/git/callback.js +72 -0
- package/dist/bot/commands/git/callback.js.map +1 -0
- package/dist/bot/commands/git/clean.d.ts +4 -0
- package/dist/bot/commands/git/clean.d.ts.map +1 -0
- package/dist/bot/commands/git/clean.js +50 -0
- package/dist/bot/commands/git/clean.js.map +1 -0
- package/dist/bot/commands/git/commit.d.ts +4 -0
- package/dist/bot/commands/git/commit.d.ts.map +1 -0
- package/dist/bot/commands/git/commit.js +72 -0
- package/dist/bot/commands/git/commit.js.map +1 -0
- package/dist/bot/commands/git/exec.d.ts +6 -0
- package/dist/bot/commands/git/exec.d.ts.map +1 -0
- package/dist/bot/commands/git/exec.js +16 -0
- package/dist/bot/commands/git/exec.js.map +1 -0
- package/dist/bot/commands/git/index.d.ts +6 -0
- package/dist/bot/commands/git/index.d.ts.map +1 -0
- package/dist/bot/commands/git/index.js +6 -0
- package/dist/bot/commands/git/index.js.map +1 -0
- package/dist/bot/commands/git/init.d.ts +4 -0
- package/dist/bot/commands/git/init.d.ts.map +1 -0
- package/dist/bot/commands/git/init.js +22 -0
- package/dist/bot/commands/git/init.js.map +1 -0
- package/dist/bot/commands/git/status.d.ts +4 -0
- package/dist/bot/commands/git/status.d.ts.map +1 -0
- package/dist/bot/commands/git/status.js +18 -0
- package/dist/bot/commands/git/status.js.map +1 -0
- package/dist/bot/commands/help.js +1 -1
- package/dist/bot/commands/help.js.map +1 -1
- package/dist/bot/commands/loader.d.ts +12 -5
- package/dist/bot/commands/loader.d.ts.map +1 -1
- package/dist/bot/commands/loader.js +73 -15
- package/dist/bot/commands/loader.js.map +1 -1
- package/dist/bot/commands/message.d.ts.map +1 -1
- package/dist/bot/commands/message.js +49 -24
- package/dist/bot/commands/message.js.map +1 -1
- package/dist/bot/commands/reset.js +1 -1
- package/dist/bot/commands/reset.js.map +1 -1
- package/dist/bot/commands/session.d.ts +2 -2
- package/dist/bot/commands/session.d.ts.map +1 -1
- package/dist/bot/commands/session.js +7 -4
- package/dist/bot/commands/session.js.map +1 -1
- package/dist/bot/commands/start.js +2 -2
- package/dist/bot/commands/start.js.map +1 -1
- package/dist/bot/commands/watcher.d.ts +2 -1
- package/dist/bot/commands/watcher.d.ts.map +1 -1
- package/dist/bot/commands/watcher.js +2 -2
- package/dist/bot/commands/watcher.js.map +1 -1
- package/dist/bot/handlers/text.d.ts.map +1 -1
- package/dist/bot/handlers/text.js +7 -0
- package/dist/bot/handlers/text.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +30 -9
- package/dist/bot.js.map +1 -1
- package/dist/cli.js +49 -19
- package/dist/cli.js.map +1 -1
- package/dist/config-watcher.d.ts +10 -0
- package/dist/config-watcher.d.ts.map +1 -0
- package/dist/config-watcher.js +49 -0
- package/dist/config-watcher.js.map +1 -0
- package/dist/config.d.ts +118 -41
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +124 -58
- package/dist/config.js.map +1 -1
- package/dist/context/resolver.d.ts +4 -0
- package/dist/context/resolver.d.ts.map +1 -1
- package/dist/context/resolver.js +8 -2
- package/dist/context/resolver.js.map +1 -1
- package/dist/default-models.d.ts +3 -0
- package/dist/default-models.d.ts.map +1 -0
- package/dist/default-models.js +16 -0
- package/dist/default-models.js.map +1 -0
- package/dist/engine/adapters/codex.d.ts.map +1 -1
- package/dist/engine/adapters/codex.js +25 -5
- package/dist/engine/adapters/codex.js.map +1 -1
- package/dist/engine/adapters/cursor.d.ts +3 -0
- package/dist/engine/adapters/cursor.d.ts.map +1 -0
- package/dist/engine/adapters/cursor.js +103 -0
- package/dist/engine/adapters/cursor.js.map +1 -0
- package/dist/engine/adapters/opencode.d.ts +2 -2
- package/dist/engine/adapters/opencode.d.ts.map +1 -1
- package/dist/engine/adapters/opencode.js +27 -11
- package/dist/engine/adapters/opencode.js.map +1 -1
- package/dist/engine/prompt.d.ts.map +1 -1
- package/dist/engine/prompt.js +8 -0
- package/dist/engine/prompt.js.map +1 -1
- package/dist/engine/registry.d.ts.map +1 -1
- package/dist/engine/registry.js +2 -0
- package/dist/engine/registry.js.map +1 -1
- package/dist/engine/types.d.ts +1 -1
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +1 -1
- package/package.json +10 -4
package/dist/bot.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Bot } from "grammy";
|
|
2
|
+
import { createGitCallbackHandler, createGitCleanHandler, createGitCommitHandler, createGitInitHandler, createGitStatusHandler, } from "./bot/commands/git/index.js";
|
|
2
3
|
import { createHelpHandler } from "./bot/commands/help.js";
|
|
3
|
-
import { loadCommands } from "./bot/commands/loader.js";
|
|
4
|
+
import { loadCommands, } from "./bot/commands/loader.js";
|
|
4
5
|
import { createResetHandler } from "./bot/commands/reset.js";
|
|
5
6
|
import { createCleanHandler } from "./bot/commands/session.js";
|
|
6
7
|
import { createStartHandler } from "./bot/commands/start.js";
|
|
@@ -25,11 +26,23 @@ export async function startBot(projectCtx) {
|
|
|
25
26
|
const { middleware: rateLimitMw, cleanup: rateLimitCleanup } = createRateLimitMiddleware(projectCtx);
|
|
26
27
|
bot.use(createAuthMiddleware(projectCtx));
|
|
27
28
|
bot.use(rateLimitMw);
|
|
28
|
-
// Wire commands
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
// Wire commands (only when enabled)
|
|
30
|
+
const cmd = config.commands;
|
|
31
|
+
if (cmd.start.enabled)
|
|
32
|
+
bot.command("start", createStartHandler(projectCtx));
|
|
33
|
+
if (cmd.help.enabled)
|
|
34
|
+
bot.command("help", createHelpHandler(projectCtx));
|
|
35
|
+
if (cmd.reset.enabled)
|
|
36
|
+
bot.command("reset", createResetHandler(projectCtx));
|
|
37
|
+
if (cmd.clean.enabled)
|
|
38
|
+
bot.command("clean", createCleanHandler(projectCtx));
|
|
39
|
+
if (cmd.git.enabled) {
|
|
40
|
+
bot.command("git_init", createGitInitHandler(projectCtx));
|
|
41
|
+
bot.command("git_status", createGitStatusHandler(projectCtx));
|
|
42
|
+
bot.command("git_commit", createGitCommitHandler(projectCtx));
|
|
43
|
+
bot.command("git_clean", createGitCleanHandler(projectCtx));
|
|
44
|
+
bot.on("callback_query:data", createGitCallbackHandler(projectCtx));
|
|
45
|
+
}
|
|
33
46
|
// Wire handlers
|
|
34
47
|
bot.on("message:text", createTextHandler(projectCtx));
|
|
35
48
|
bot.on("message:photo", createPhotoHandler(projectCtx));
|
|
@@ -59,20 +72,28 @@ export async function startBot(projectCtx) {
|
|
|
59
72
|
});
|
|
60
73
|
// Wait until the bot reports it's running (or fails)
|
|
61
74
|
await startedPromise;
|
|
75
|
+
// Derive enabled flags from resolved config
|
|
76
|
+
const enabledFlags = {
|
|
77
|
+
start: cmd.start.enabled,
|
|
78
|
+
help: cmd.help.enabled,
|
|
79
|
+
reset: cmd.reset.enabled,
|
|
80
|
+
clean: cmd.clean.enabled,
|
|
81
|
+
git: cmd.git.enabled,
|
|
82
|
+
};
|
|
62
83
|
// Register project-specific commands and skills with Telegram on startup
|
|
63
84
|
const skillsDir = engine.skillsDir(config.cwd);
|
|
64
|
-
const commands = await loadCommands(config.cwd, config.configDir, logger, skillsDir);
|
|
85
|
+
const commands = await loadCommands(config.cwd, config.configDir, logger, skillsDir, enabledFlags);
|
|
65
86
|
if (commands.length > 0) {
|
|
66
87
|
await bot.api.setMyCommands(commands.map((c) => ({ command: c.command, description: c.description })));
|
|
67
88
|
logger.info({ count: commands.length }, "Commands registered with Telegram");
|
|
68
89
|
}
|
|
69
90
|
// Start file watcher for hot-reload of command and skill files
|
|
70
|
-
const watcher = startCommandWatcher(bot, config.cwd, config.configDir, logger, skillsDir);
|
|
91
|
+
const watcher = startCommandWatcher(bot, config.cwd, config.configDir, logger, skillsDir, enabledFlags);
|
|
71
92
|
return {
|
|
72
93
|
stop: async () => {
|
|
73
94
|
await watcher.stop();
|
|
74
95
|
rateLimitCleanup();
|
|
75
|
-
await bot.stop();
|
|
96
|
+
await bot.stop(); // Stops polling; Grammy waits for in-flight updates to finish
|
|
76
97
|
await runningPromise;
|
|
77
98
|
},
|
|
78
99
|
};
|
package/dist/bot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -3,8 +3,10 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import { writeFile } from "node:fs/promises";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
5
|
import { startBot } from "./bot.js";
|
|
6
|
-
import { loadMultiConfig, resolveProjectConfig, validateProjects, } from "./config.js";
|
|
6
|
+
import { loadMultiConfig, resolveProjectConfig, tryLoadMultiConfig, validateProjects, } from "./config.js";
|
|
7
|
+
import { startConfigWatcher } from "./config-watcher.js";
|
|
7
8
|
import { evaluateBootTimeShells } from "./context/resolver.js";
|
|
9
|
+
import { getDefaultEngineModel } from "./default-models.js";
|
|
8
10
|
import { getEngine } from "./engine/index.js";
|
|
9
11
|
import { createProjectLogger, createStartupLogger } from "./logger.js";
|
|
10
12
|
// ─── Config template ──────────────────────────────────────────────────────────
|
|
@@ -55,7 +57,7 @@ Commands:
|
|
|
55
57
|
|
|
56
58
|
Options:
|
|
57
59
|
--cwd <path> Directory containing hal.config.json (default: current directory)
|
|
58
|
-
--engine <name> Engine to use: claude, copilot, codex, opencode (default: claude)
|
|
60
|
+
--engine <name> Engine to use: claude, copilot, codex, opencode, cursor (default: claude)
|
|
59
61
|
--help, -h Show this help message
|
|
60
62
|
|
|
61
63
|
Examples:
|
|
@@ -88,6 +90,7 @@ const VALID_ENGINES = [
|
|
|
88
90
|
"copilot",
|
|
89
91
|
"codex",
|
|
90
92
|
"opencode",
|
|
93
|
+
"cursor",
|
|
91
94
|
];
|
|
92
95
|
function parseArgs() {
|
|
93
96
|
const args = process.argv.slice(2);
|
|
@@ -145,7 +148,8 @@ async function runInit(cwd, engineName) {
|
|
|
145
148
|
await writeFile(configPath, template, "utf-8");
|
|
146
149
|
console.log(`Created hal.config.json in ${cwd} (engine: ${engineName})`);
|
|
147
150
|
// Scaffold engine-specific instructions file
|
|
148
|
-
const
|
|
151
|
+
const effectiveModel = getDefaultEngineModel(engineName);
|
|
152
|
+
const engine = getEngine(engineName, undefined, effectiveModel);
|
|
149
153
|
const instrFile = engine.instructionsFile();
|
|
150
154
|
const instrPath = join(cwd, instrFile);
|
|
151
155
|
if (!existsSync(instrPath)) {
|
|
@@ -160,11 +164,13 @@ async function runInit(cwd, engineName) {
|
|
|
160
164
|
process.exit(0);
|
|
161
165
|
}
|
|
162
166
|
// ─── start command ────────────────────────────────────────────────────────────
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
167
|
+
/**
|
|
168
|
+
* Load config, resolve projects, build contexts, and start all bots.
|
|
169
|
+
* Rejects if config resolution or any bot startup fails.
|
|
170
|
+
* Used for both initial run and hot-reload.
|
|
171
|
+
*/
|
|
172
|
+
async function runBotsForConfig(configDir, loaded, startupLogger) {
|
|
173
|
+
const { config: multiConfig, loadedFiles } = loaded;
|
|
168
174
|
const globals = multiConfig.globals ?? {};
|
|
169
175
|
// Resolve all project configs, skip inactive ones
|
|
170
176
|
const rootContext = multiConfig.context;
|
|
@@ -177,9 +183,7 @@ async function runStart(configDir) {
|
|
|
177
183
|
}
|
|
178
184
|
return true;
|
|
179
185
|
});
|
|
180
|
-
// Boot-time validation (unique cwds, tokens, names)
|
|
181
186
|
validateProjects(resolvedProjects);
|
|
182
|
-
// Boot-time sourcing log
|
|
183
187
|
const sourceLines = loadedFiles.map((f, i) => {
|
|
184
188
|
const isLocal = f.endsWith("hal.config.local.json");
|
|
185
189
|
const suffix = isLocal ? " [local override]" : "";
|
|
@@ -188,40 +192,66 @@ async function runStart(configDir) {
|
|
|
188
192
|
sourceLines.push(" env: process.env (bash context, last resort)");
|
|
189
193
|
startupLogger.info(`Configuration sourced:\n${sourceLines.join("\n")}`);
|
|
190
194
|
startupLogger.info({ count: resolvedProjects.length }, "Configuration loaded");
|
|
191
|
-
// Build project contexts (evaluate boot-time #{} shell commands per project)
|
|
192
195
|
const contexts = resolvedProjects.map((config) => {
|
|
193
196
|
const logger = createProjectLogger(config);
|
|
194
197
|
const shellCache = config.context
|
|
195
198
|
? evaluateBootTimeShells(config.context, logger)
|
|
196
199
|
: {};
|
|
197
|
-
const
|
|
200
|
+
const effectiveModel = config.engineModel ?? getDefaultEngineModel(config.engine);
|
|
201
|
+
const engine = getEngine(config.engine, config.engineCommand, effectiveModel);
|
|
198
202
|
return { config, logger, bootContext: { shellCache }, engine };
|
|
199
203
|
});
|
|
200
|
-
// Emit startup notices for flow=false projects
|
|
201
204
|
for (const { config } of contexts) {
|
|
202
205
|
if (!config.logging.flow) {
|
|
203
206
|
startupLogger.info(`Bot "${config.slug}" has terminal logging suppressed.${config.logging.persist ? ` Persisted logs can be read at: ${config.logDir}` : ""}`);
|
|
204
207
|
}
|
|
205
208
|
}
|
|
206
|
-
|
|
209
|
+
const handles = await Promise.all(contexts.map((ctx) => startBot(ctx)));
|
|
210
|
+
startupLogger.info({ count: handles.length }, "All bots running");
|
|
211
|
+
return handles;
|
|
212
|
+
}
|
|
213
|
+
async function runStart(configDir) {
|
|
214
|
+
const startupLogger = createStartupLogger();
|
|
215
|
+
startupLogger.info({ configDir }, "Loading configuration");
|
|
216
|
+
const loaded = loadMultiConfig(configDir);
|
|
207
217
|
let handles;
|
|
208
218
|
try {
|
|
209
|
-
handles = await
|
|
219
|
+
handles = await runBotsForConfig(configDir, loaded, startupLogger);
|
|
210
220
|
}
|
|
211
221
|
catch (err) {
|
|
212
222
|
startupLogger.error({ error: err instanceof Error ? err.message : String(err) }, "Failed to start one or more bots — aborting");
|
|
213
223
|
process.exit(1);
|
|
214
224
|
}
|
|
215
|
-
|
|
216
|
-
|
|
225
|
+
let reloading = false;
|
|
226
|
+
const configWatcher = startConfigWatcher(configDir, async () => {
|
|
227
|
+
if (reloading)
|
|
228
|
+
return;
|
|
229
|
+
reloading = true;
|
|
230
|
+
try {
|
|
231
|
+
startupLogger.info("Config change detected");
|
|
232
|
+
await Promise.all(handles.map((h) => h.stop()));
|
|
233
|
+
startupLogger.info("All bots stopped");
|
|
234
|
+
try {
|
|
235
|
+
const result = tryLoadMultiConfig(configDir);
|
|
236
|
+
handles = await runBotsForConfig(configDir, result, startupLogger);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
startupLogger.error({ error: err instanceof Error ? err.message : String(err) }, "Reload failed");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
reloading = false;
|
|
244
|
+
}
|
|
245
|
+
});
|
|
217
246
|
async function shutdown(signal) {
|
|
218
247
|
startupLogger.info({ signal }, "Received shutdown signal");
|
|
248
|
+
await configWatcher.stop();
|
|
219
249
|
await Promise.all(handles.map((h) => h.stop().catch(() => { })));
|
|
220
250
|
startupLogger.info("All bots stopped");
|
|
221
251
|
process.exit(0);
|
|
222
252
|
}
|
|
223
|
-
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
224
|
-
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
253
|
+
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
254
|
+
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
225
255
|
}
|
|
226
256
|
// ─── Entry point ──────────────────────────────────────────────────────────────
|
|
227
257
|
async function main() {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ConfigWatcherHandle {
|
|
2
|
+
stop: () => Promise<void>;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Watch the four hal config files in configDir and invoke onConfigChange
|
|
6
|
+
* (debounced) when any of them are added, changed, or removed.
|
|
7
|
+
* Use ignoreInitial so the initial scan does not trigger the callback.
|
|
8
|
+
*/
|
|
9
|
+
export declare function startConfigWatcher(configDir: string, onConfigChange: () => void | Promise<void>): ConfigWatcherHandle;
|
|
10
|
+
//# sourceMappingURL=config-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-watcher.d.ts","sourceRoot":"","sources":["../src/config-watcher.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACzC,mBAAmB,CAoCrB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import chokidar from "chokidar";
|
|
3
|
+
const CONFIG_FILES = [
|
|
4
|
+
"hal.config.json",
|
|
5
|
+
"hal.config.local.json",
|
|
6
|
+
".env",
|
|
7
|
+
".env.local",
|
|
8
|
+
];
|
|
9
|
+
const DEBOUNCE_MS = 400;
|
|
10
|
+
/**
|
|
11
|
+
* Watch the four hal config files in configDir and invoke onConfigChange
|
|
12
|
+
* (debounced) when any of them are added, changed, or removed.
|
|
13
|
+
* Use ignoreInitial so the initial scan does not trigger the callback.
|
|
14
|
+
*/
|
|
15
|
+
export function startConfigWatcher(configDir, onConfigChange) {
|
|
16
|
+
const watchedPaths = CONFIG_FILES.map((f) => join(configDir, f));
|
|
17
|
+
let debounceTimer = null;
|
|
18
|
+
let closed = false;
|
|
19
|
+
const fire = () => {
|
|
20
|
+
if (closed)
|
|
21
|
+
return;
|
|
22
|
+
debounceTimer = null;
|
|
23
|
+
onConfigChange();
|
|
24
|
+
};
|
|
25
|
+
const schedule = () => {
|
|
26
|
+
if (closed)
|
|
27
|
+
return;
|
|
28
|
+
if (debounceTimer !== null)
|
|
29
|
+
clearTimeout(debounceTimer);
|
|
30
|
+
debounceTimer = setTimeout(fire, DEBOUNCE_MS);
|
|
31
|
+
};
|
|
32
|
+
const watcher = chokidar.watch(watchedPaths, {
|
|
33
|
+
ignoreInitial: true,
|
|
34
|
+
});
|
|
35
|
+
watcher.on("add", schedule);
|
|
36
|
+
watcher.on("change", schedule);
|
|
37
|
+
watcher.on("unlink", schedule);
|
|
38
|
+
return {
|
|
39
|
+
stop: () => new Promise((resolve) => {
|
|
40
|
+
closed = true;
|
|
41
|
+
if (debounceTimer !== null) {
|
|
42
|
+
clearTimeout(debounceTimer);
|
|
43
|
+
debounceTimer = null;
|
|
44
|
+
}
|
|
45
|
+
watcher.close().then(() => resolve());
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=config-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-watcher.js","sourceRoot":"","sources":["../src/config-watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,YAAY,GAAG;IACnB,iBAAiB;IACjB,uBAAuB;IACvB,MAAM;IACN,YAAY;CACJ,CAAC;AAEX,MAAM,WAAW,GAAG,GAAG,CAAC;AAMxB;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,cAA0C;IAE1C,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,aAAa,GAAyC,IAAI,CAAC;IAC/D,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,MAAM;YAAE,OAAO;QACnB,aAAa,GAAG,IAAI,CAAC;QACrB,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM;YAAE,OAAO;QACnB,IAAI,aAAa,KAAK,IAAI;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QACxD,aAAa,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3C,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,OAAO;QACL,IAAI,EAAE,GAAkB,EAAE,CACxB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACtB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC;KACL,CAAC;AACJ,CAAC"}
|