@rulemetric/cli 0.1.1 → 0.2.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.
- package/README.md +66 -0
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +15 -0
- package/dist/base-command.js.map +1 -1
- package/dist/commands/auth/login.d.ts.map +1 -1
- package/dist/commands/auth/login.js +7 -0
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/crons/list.d.ts +7 -0
- package/dist/commands/crons/list.d.ts.map +1 -0
- package/dist/commands/crons/list.js +24 -0
- package/dist/commands/crons/list.js.map +1 -0
- package/dist/commands/crons/run.d.ts +13 -0
- package/dist/commands/crons/run.d.ts.map +1 -0
- package/dist/commands/crons/run.js +48 -0
- package/dist/commands/crons/run.js.map +1 -0
- package/dist/commands/evals/listen.d.ts +28 -2
- package/dist/commands/evals/listen.d.ts.map +1 -1
- package/dist/commands/evals/listen.js +159 -25
- package/dist/commands/evals/listen.js.map +1 -1
- package/dist/commands/evals/listen.test.d.ts +2 -0
- package/dist/commands/evals/listen.test.d.ts.map +1 -0
- package/dist/commands/evals/listen.test.js +48 -0
- package/dist/commands/evals/listen.test.js.map +1 -0
- package/dist/commands/gateway/ensure.js +1 -1
- package/dist/commands/gateway/ensure.js.map +1 -1
- package/dist/commands/hooks/install.d.ts.map +1 -1
- package/dist/commands/hooks/install.js +40 -3
- package/dist/commands/hooks/install.js.map +1 -1
- package/dist/commands/hooks/run.js +1 -1
- package/dist/commands/hooks/run.js.map +1 -1
- package/dist/commands/hooks/uninstall.d.ts.map +1 -1
- package/dist/commands/hooks/uninstall.js +9 -1
- package/dist/commands/hooks/uninstall.js.map +1 -1
- package/dist/commands/org/current.d.ts +7 -0
- package/dist/commands/org/current.d.ts.map +1 -0
- package/dist/commands/org/current.js +70 -0
- package/dist/commands/org/current.js.map +1 -0
- package/dist/commands/org/list.d.ts +7 -0
- package/dist/commands/org/list.d.ts.map +1 -0
- package/dist/commands/org/list.js +37 -0
- package/dist/commands/org/list.js.map +1 -0
- package/dist/commands/org/switch.d.ts +13 -0
- package/dist/commands/org/switch.d.ts.map +1 -0
- package/dist/commands/org/switch.js +52 -0
- package/dist/commands/org/switch.js.map +1 -0
- package/dist/commands/proxy/restart.d.ts +11 -0
- package/dist/commands/proxy/restart.d.ts.map +1 -0
- package/dist/commands/proxy/restart.js +36 -0
- package/dist/commands/proxy/restart.js.map +1 -0
- package/dist/commands/proxy/start.d.ts.map +1 -1
- package/dist/commands/proxy/start.js +4 -0
- package/dist/commands/proxy/start.js.map +1 -1
- package/dist/commands/service/install.d.ts +16 -0
- package/dist/commands/service/install.d.ts.map +1 -1
- package/dist/commands/service/install.js +145 -6
- package/dist/commands/service/install.js.map +1 -1
- package/dist/commands/service/uninstall.d.ts.map +1 -1
- package/dist/commands/service/uninstall.js +28 -0
- package/dist/commands/service/uninstall.js.map +1 -1
- package/dist/commands/sessions/start.d.ts.map +1 -1
- package/dist/commands/sessions/start.js +5 -0
- package/dist/commands/sessions/start.js.map +1 -1
- package/dist/commands/signals/report.d.ts +10 -0
- package/dist/commands/signals/report.d.ts.map +1 -0
- package/dist/commands/signals/report.js +35 -0
- package/dist/commands/signals/report.js.map +1 -0
- package/dist/commands/signals/report.test.d.ts +2 -0
- package/dist/commands/signals/report.test.d.ts.map +1 -0
- package/dist/commands/signals/report.test.js +65 -0
- package/dist/commands/signals/report.test.js.map +1 -0
- package/dist/commands/skills/export-approved.d.ts +10 -0
- package/dist/commands/skills/export-approved.d.ts.map +1 -0
- package/dist/commands/skills/export-approved.js +31 -0
- package/dist/commands/skills/export-approved.js.map +1 -0
- package/dist/commands/skills/publish.d.ts +17 -0
- package/dist/commands/skills/publish.d.ts.map +1 -0
- package/dist/commands/skills/publish.js +80 -0
- package/dist/commands/skills/publish.js.map +1 -0
- package/dist/commands/skills/update.d.ts +3 -0
- package/dist/commands/skills/update.d.ts.map +1 -1
- package/dist/commands/skills/update.js +17 -6
- package/dist/commands/skills/update.js.map +1 -1
- package/dist/commands/suggestions/accept.d.ts +16 -0
- package/dist/commands/suggestions/accept.d.ts.map +1 -0
- package/dist/commands/suggestions/accept.js +61 -0
- package/dist/commands/suggestions/accept.js.map +1 -0
- package/dist/commands/suggestions/accept.test.d.ts +2 -0
- package/dist/commands/suggestions/accept.test.d.ts.map +1 -0
- package/dist/commands/suggestions/accept.test.js +52 -0
- package/dist/commands/suggestions/accept.test.js.map +1 -0
- package/dist/commands/suggestions/dismiss.d.ts +10 -0
- package/dist/commands/suggestions/dismiss.d.ts.map +1 -0
- package/dist/commands/suggestions/dismiss.js +26 -0
- package/dist/commands/suggestions/dismiss.js.map +1 -0
- package/dist/commands/suggestions/list.d.ts +10 -0
- package/dist/commands/suggestions/list.d.ts.map +1 -0
- package/dist/commands/suggestions/list.js +40 -0
- package/dist/commands/suggestions/list.js.map +1 -0
- package/dist/commands/suggestions/refresh.d.ts +7 -0
- package/dist/commands/suggestions/refresh.d.ts.map +1 -0
- package/dist/commands/suggestions/refresh.js +11 -0
- package/dist/commands/suggestions/refresh.js.map +1 -0
- package/dist/dashboard/Dashboard.d.ts.map +1 -1
- package/dist/dashboard/Dashboard.js +7 -1
- package/dist/dashboard/Dashboard.js.map +1 -1
- package/dist/lib/active-org-refresh.d.ts +22 -0
- package/dist/lib/active-org-refresh.d.ts.map +1 -0
- package/dist/lib/active-org-refresh.js +108 -0
- package/dist/lib/active-org-refresh.js.map +1 -0
- package/dist/lib/active-org-refresh.test.d.ts +2 -0
- package/dist/lib/active-org-refresh.test.d.ts.map +1 -0
- package/dist/lib/active-org-refresh.test.js +190 -0
- package/dist/lib/active-org-refresh.test.js.map +1 -0
- package/dist/lib/active-org.d.ts +43 -0
- package/dist/lib/active-org.d.ts.map +1 -0
- package/dist/lib/active-org.js +96 -0
- package/dist/lib/active-org.js.map +1 -0
- package/dist/lib/active-org.test.d.ts +2 -0
- package/dist/lib/active-org.test.d.ts.map +1 -0
- package/dist/lib/active-org.test.js +147 -0
- package/dist/lib/active-org.test.js.map +1 -0
- package/dist/lib/cron-registry.d.ts +47 -0
- package/dist/lib/cron-registry.d.ts.map +1 -0
- package/dist/lib/cron-registry.js +102 -0
- package/dist/lib/cron-registry.js.map +1 -0
- package/dist/lib/cron-registry.test.d.ts +2 -0
- package/dist/lib/cron-registry.test.d.ts.map +1 -0
- package/dist/lib/cron-registry.test.js +136 -0
- package/dist/lib/cron-registry.test.js.map +1 -0
- package/dist/lib/cron-runner.d.ts +16 -0
- package/dist/lib/cron-runner.d.ts.map +1 -0
- package/dist/lib/cron-runner.js +68 -0
- package/dist/lib/cron-runner.js.map +1 -0
- package/dist/lib/detect-languages.d.ts +7 -0
- package/dist/lib/detect-languages.d.ts.map +1 -0
- package/dist/lib/detect-languages.js +113 -0
- package/dist/lib/detect-languages.js.map +1 -0
- package/dist/lib/detect-languages.test.d.ts +2 -0
- package/dist/lib/detect-languages.test.d.ts.map +1 -0
- package/dist/lib/detect-languages.test.js +29 -0
- package/dist/lib/detect-languages.test.js.map +1 -0
- package/dist/lib/eval-executor.d.ts.map +1 -1
- package/dist/lib/eval-executor.js +5 -2
- package/dist/lib/eval-executor.js.map +1 -1
- package/dist/lib/gateway-entry.js +4 -1
- package/dist/lib/gateway-entry.js.map +1 -1
- package/dist/lib/gateway-lifecycle.d.ts +1 -1
- package/dist/lib/gateway-lifecycle.d.ts.map +1 -1
- package/dist/lib/gateway-lifecycle.js +13 -2
- package/dist/lib/gateway-lifecycle.js.map +1 -1
- package/dist/lib/gateway.d.ts +4 -5
- package/dist/lib/gateway.d.ts.map +1 -1
- package/dist/lib/gateway.js +68 -2
- package/dist/lib/gateway.js.map +1 -1
- package/dist/lib/graphile-worker-runner.d.ts +124 -0
- package/dist/lib/graphile-worker-runner.d.ts.map +1 -0
- package/dist/lib/graphile-worker-runner.js +526 -0
- package/dist/lib/graphile-worker-runner.js.map +1 -0
- package/dist/lib/graphile-worker-runner.test.d.ts +2 -0
- package/dist/lib/graphile-worker-runner.test.d.ts.map +1 -0
- package/dist/lib/graphile-worker-runner.test.js +153 -0
- package/dist/lib/graphile-worker-runner.test.js.map +1 -0
- package/dist/lib/handlers/cron-close-stale-sessions.d.ts +3 -0
- package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +1 -0
- package/dist/lib/handlers/cron-close-stale-sessions.js +8 -0
- package/dist/lib/handlers/cron-close-stale-sessions.js.map +1 -0
- package/dist/lib/handlers/cron-data-integrity-audit.d.ts +3 -0
- package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +1 -0
- package/dist/lib/handlers/cron-data-integrity-audit.js +16 -0
- package/dist/lib/handlers/cron-data-integrity-audit.js.map +1 -0
- package/dist/lib/handlers/cron-refresh-skills.d.ts +3 -0
- package/dist/lib/handlers/cron-refresh-skills.d.ts.map +1 -0
- package/dist/lib/handlers/cron-refresh-skills.js +91 -0
- package/dist/lib/handlers/cron-refresh-skills.js.map +1 -0
- package/dist/lib/handlers/cron-refresh-skills.test.d.ts +2 -0
- package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +1 -0
- package/dist/lib/handlers/cron-refresh-skills.test.js +114 -0
- package/dist/lib/handlers/cron-refresh-skills.test.js.map +1 -0
- package/dist/lib/handlers/cron-regenerate-insights.d.ts +3 -0
- package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +1 -0
- package/dist/lib/handlers/cron-regenerate-insights.js +6 -0
- package/dist/lib/handlers/cron-regenerate-insights.js.map +1 -0
- package/dist/lib/handlers/cron-suggest-instructions.d.ts +3 -0
- package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +1 -0
- package/dist/lib/handlers/cron-suggest-instructions.js +159 -0
- package/dist/lib/handlers/cron-suggest-instructions.js.map +1 -0
- package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +2 -0
- package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +1 -0
- package/dist/lib/handlers/cron-suggest-instructions.test.js +80 -0
- package/dist/lib/handlers/cron-suggest-instructions.test.js.map +1 -0
- package/dist/lib/handlers/process-conversation.d.ts +35 -0
- package/dist/lib/handlers/process-conversation.d.ts.map +1 -0
- package/dist/lib/handlers/process-conversation.js +35 -0
- package/dist/lib/handlers/process-conversation.js.map +1 -0
- package/dist/lib/handlers/process-eval.d.ts +32 -0
- package/dist/lib/handlers/process-eval.d.ts.map +1 -0
- package/dist/lib/handlers/process-eval.js +207 -0
- package/dist/lib/handlers/process-eval.js.map +1 -0
- package/dist/lib/handlers/process-insights.d.ts +39 -0
- package/dist/lib/handlers/process-insights.d.ts.map +1 -0
- package/dist/lib/handlers/process-insights.js +300 -0
- package/dist/lib/handlers/process-insights.js.map +1 -0
- package/dist/lib/handlers/process-launch.d.ts +29 -0
- package/dist/lib/handlers/process-launch.d.ts.map +1 -0
- package/dist/lib/handlers/process-launch.js +41 -0
- package/dist/lib/handlers/process-launch.js.map +1 -0
- package/dist/lib/hooks-config.d.ts +28 -4
- package/dist/lib/hooks-config.d.ts.map +1 -1
- package/dist/lib/hooks-config.js +138 -10
- package/dist/lib/hooks-config.js.map +1 -1
- package/dist/lib/llm-client.d.ts.map +1 -1
- package/dist/lib/llm-client.js +149 -16
- package/dist/lib/llm-client.js.map +1 -1
- package/dist/lib/mirror-writer-db.d.ts +12 -0
- package/dist/lib/mirror-writer-db.d.ts.map +1 -0
- package/dist/lib/mirror-writer-db.js +51 -0
- package/dist/lib/mirror-writer-db.js.map +1 -0
- package/dist/lib/mirror-writer.d.ts +35 -0
- package/dist/lib/mirror-writer.d.ts.map +1 -0
- package/dist/lib/mirror-writer.js +27 -0
- package/dist/lib/mirror-writer.js.map +1 -0
- package/dist/lib/mirror-writer.test.d.ts +2 -0
- package/dist/lib/mirror-writer.test.d.ts.map +1 -0
- package/dist/lib/mirror-writer.test.js +47 -0
- package/dist/lib/mirror-writer.test.js.map +1 -0
- package/dist/lib/permanent-job-error.d.ts +17 -0
- package/dist/lib/permanent-job-error.d.ts.map +1 -0
- package/dist/lib/permanent-job-error.js +23 -0
- package/dist/lib/permanent-job-error.js.map +1 -0
- package/dist/lib/permanent-job-error.test.d.ts +2 -0
- package/dist/lib/permanent-job-error.test.d.ts.map +1 -0
- package/dist/lib/permanent-job-error.test.js +29 -0
- package/dist/lib/permanent-job-error.test.js.map +1 -0
- package/dist/lib/version-check.d.ts +11 -0
- package/dist/lib/version-check.d.ts.map +1 -0
- package/dist/lib/version-check.js +106 -0
- package/dist/lib/version-check.js.map +1 -0
- package/oclif.manifest.json +611 -81
- package/package.json +19 -5
- package/dist/commands/insights/sync.d.ts +0 -17
- package/dist/commands/insights/sync.d.ts.map +0 -1
- package/dist/commands/insights/sync.js +0 -477
- package/dist/commands/insights/sync.js.map +0 -1
- package/dist/lib/eval-worker.d.ts +0 -12
- package/dist/lib/eval-worker.d.ts.map +0 -1
- package/dist/lib/eval-worker.js +0 -395
- package/dist/lib/eval-worker.js.map +0 -1
- package/dist/lib/insights-worker.d.ts +0 -10
- package/dist/lib/insights-worker.d.ts.map +0 -1
- package/dist/lib/insights-worker.js +0 -329
- package/dist/lib/insights-worker.js.map +0 -1
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
* Spawned as a detached child process by the CLI.
|
|
5
5
|
*/
|
|
6
6
|
import { startGateway, GATEWAY_PORT, MITMPROXY_PORT } from './gateway.js';
|
|
7
|
-
const { server, healthInterval } = startGateway(GATEWAY_PORT, MITMPROXY_PORT
|
|
7
|
+
const { server, healthInterval } = startGateway(GATEWAY_PORT, MITMPROXY_PORT, {
|
|
8
|
+
cliVersion: process.env.RULEMETRIC_CLI_VERSION,
|
|
9
|
+
cliEntry: process.env.RULEMETRIC_CLI_ENTRY,
|
|
10
|
+
});
|
|
8
11
|
function shutdown() {
|
|
9
12
|
console.log(`[${new Date().toISOString()}] gateway shutting down`);
|
|
10
13
|
clearInterval(healthInterval);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-entry.js","sourceRoot":"","sources":["../../src/lib/gateway-entry.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway-entry.js","sourceRoot":"","sources":["../../src/lib/gateway-entry.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE1E,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,YAAY,EAAE,cAAc,EAAE;IAC5E,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;IAC9C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;CAC3C,CAAC,CAAC;AAEH,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;IACnE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,iDAAiD;IACjD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC"}
|
|
@@ -4,6 +4,6 @@ export declare const GATEWAY_PORT = 8787;
|
|
|
4
4
|
export declare const MITMPROXY_PORT = 8788;
|
|
5
5
|
export declare function isGatewayRunning(): boolean;
|
|
6
6
|
export declare function getGatewayPid(): number | null;
|
|
7
|
-
export declare function spawnGateway(): number;
|
|
7
|
+
export declare function spawnGateway(cliVersion?: string): number;
|
|
8
8
|
export declare function stopGateway(): boolean;
|
|
9
9
|
//# sourceMappingURL=gateway-lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-lifecycle.d.ts","sourceRoot":"","sources":["../../src/lib/gateway-lifecycle.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,gBAAgB,QAAkC,CAAC;AAChE,eAAO,MAAM,gBAAgB,QAAkC,CAAC;AAChE,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,wBAAgB,gBAAgB,IAAI,OAAO,CAa1C;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAK7C;AAiBD,wBAAgB,YAAY,
|
|
1
|
+
{"version":3,"file":"gateway-lifecycle.d.ts","sourceRoot":"","sources":["../../src/lib/gateway-lifecycle.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,gBAAgB,QAAkC,CAAC;AAChE,eAAO,MAAM,gBAAgB,QAAkC,CAAC;AAChE,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,wBAAgB,gBAAgB,IAAI,OAAO,CAa1C;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAK7C;AAiBD,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAoCxD;AAED,wBAAgB,WAAW,IAAI,OAAO,CAYrC"}
|
|
@@ -46,7 +46,7 @@ function findGatewayEntry() {
|
|
|
46
46
|
throw new Error('Could not find gateway-entry.js. Is the CLI built?\n' +
|
|
47
47
|
'Searched:\n' + candidates.map(c => ` ${c}`).join('\n'));
|
|
48
48
|
}
|
|
49
|
-
export function spawnGateway() {
|
|
49
|
+
export function spawnGateway(cliVersion) {
|
|
50
50
|
if (isGatewayRunning()) {
|
|
51
51
|
const pid = getGatewayPid();
|
|
52
52
|
if (pid)
|
|
@@ -58,7 +58,18 @@ export function spawnGateway() {
|
|
|
58
58
|
const child = spawn(process.execPath, [entryPath], {
|
|
59
59
|
detached: true,
|
|
60
60
|
stdio: ['ignore', logFd, logFd],
|
|
61
|
-
env
|
|
61
|
+
// The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION
|
|
62
|
+
// identifies the CLI version that started this gateway — used to
|
|
63
|
+
// detect drift when a newer CLI starts mitmproxy with a different
|
|
64
|
+
// version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point
|
|
65
|
+
// (process.argv[1]) so the gateway can re-invoke the CLI for
|
|
66
|
+
// `proxy restart` without needing the binary in PATH. Falls back to
|
|
67
|
+
// "unknown" if the caller didn't pass them.
|
|
68
|
+
env: {
|
|
69
|
+
...process.env,
|
|
70
|
+
RULEMETRIC_CLI_VERSION: cliVersion ?? 'unknown',
|
|
71
|
+
RULEMETRIC_CLI_ENTRY: process.argv[1] ?? '',
|
|
72
|
+
},
|
|
62
73
|
});
|
|
63
74
|
child.unref();
|
|
64
75
|
if (!child.pid) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-lifecycle.js","sourceRoot":"","sources":["../../src/lib/gateway-lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhD,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB;IACvB,0EAA0E;IAC1E,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC;KACxD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,IAAI,KAAK,CACb,sDAAsD;QACtD,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;
|
|
1
|
+
{"version":3,"file":"gateway-lifecycle.js","sourceRoot":"","sources":["../../src/lib/gateway-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/gateway.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resilient HTTP proxy gateway that always accepts connections on GATEWAY_PORT.
|
|
3
|
-
* Routes through mitmproxy when it's alive, direct to upstream when it's not.
|
|
4
|
-
*/
|
|
5
1
|
import * as http from 'node:http';
|
|
6
2
|
export declare const GATEWAY_PORT = 8787;
|
|
7
3
|
export declare const MITMPROXY_PORT = 8788;
|
|
8
|
-
export declare function startGateway(port?: number, mitmproxyPort?: number
|
|
4
|
+
export declare function startGateway(port?: number, mitmproxyPort?: number, options?: {
|
|
5
|
+
cliVersion?: string;
|
|
6
|
+
cliEntry?: string;
|
|
7
|
+
}): {
|
|
9
8
|
server: http.Server;
|
|
10
9
|
healthInterval: NodeJS.Timeout;
|
|
11
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAKlC,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,cAAc,OAAO,CAAC;AAoNnC,wBAAgB,YAAY,CAC1B,IAAI,GAAE,MAAqB,EAC3B,aAAa,GAAE,MAAuB,EACtC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAA;CAAE,CAmCzD"}
|
package/dist/lib/gateway.js
CHANGED
|
@@ -2,18 +2,79 @@
|
|
|
2
2
|
* Resilient HTTP proxy gateway that always accepts connections on GATEWAY_PORT.
|
|
3
3
|
* Routes through mitmproxy when it's alive, direct to upstream when it's not.
|
|
4
4
|
*/
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
5
7
|
import * as http from 'node:http';
|
|
6
8
|
import * as net from 'node:net';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import * as path from 'node:path';
|
|
7
11
|
export const GATEWAY_PORT = 8787;
|
|
8
12
|
export const MITMPROXY_PORT = 8788;
|
|
9
13
|
const HEALTH_INTERVAL = 3000;
|
|
10
14
|
const HEALTH_TIMEOUT = 500;
|
|
15
|
+
// Floor on auto-restarts so a misconfigured drift can't trigger a restart
|
|
16
|
+
// loop. Plenty long for the user to fix any underlying problem manually.
|
|
17
|
+
const RESTART_COOLDOWN_MS = 60_000;
|
|
18
|
+
const VERSION_FILE = path.join(os.homedir(), '.config', 'rulemetric', 'proxy-addon.version');
|
|
11
19
|
let isProxyAlive = false;
|
|
12
20
|
let lastState = null;
|
|
21
|
+
// Drift state — tracked across health-check ticks. lastSeenAddonVersion is
|
|
22
|
+
// what the file said last time we read it; lastRestartAt prevents loops.
|
|
23
|
+
let lastSeenAddonVersion = null;
|
|
24
|
+
let lastRestartAt = 0;
|
|
13
25
|
function log(msg) {
|
|
14
26
|
const ts = new Date().toISOString();
|
|
15
27
|
console.log(`[${ts}] ${msg}`);
|
|
16
28
|
}
|
|
29
|
+
function readAddonVersion() {
|
|
30
|
+
try {
|
|
31
|
+
return fs.readFileSync(VERSION_FILE, 'utf-8').trim() || null;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// File may not exist yet (proxy not started, or older addon that doesn't
|
|
35
|
+
// write the file). Returning null disables drift checks for this tick.
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function maybeRestartOnDrift(gatewayCliVersion, cliEntry) {
|
|
40
|
+
// No reference version means we can't compare — skip.
|
|
41
|
+
if (gatewayCliVersion === 'unknown' || !cliEntry)
|
|
42
|
+
return;
|
|
43
|
+
const addonVersion = readAddonVersion();
|
|
44
|
+
if (!addonVersion || addonVersion === 'unknown')
|
|
45
|
+
return;
|
|
46
|
+
// Same as last tick — nothing changed, no need to log or act.
|
|
47
|
+
if (addonVersion === lastSeenAddonVersion)
|
|
48
|
+
return;
|
|
49
|
+
lastSeenAddonVersion = addonVersion;
|
|
50
|
+
if (addonVersion === gatewayCliVersion) {
|
|
51
|
+
// Drift cleared (e.g. proxy was just restarted). Quiet log, no action.
|
|
52
|
+
log(`addon version matches gateway (${gatewayCliVersion})`);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const sinceLast = Date.now() - lastRestartAt;
|
|
56
|
+
if (sinceLast < RESTART_COOLDOWN_MS) {
|
|
57
|
+
log(`addon version drift (gateway=${gatewayCliVersion}, addon=${addonVersion}); ` +
|
|
58
|
+
`restart cooldown active (${Math.round((RESTART_COOLDOWN_MS - sinceLast) / 1000)}s left)`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
log(`addon version drift detected (gateway=${gatewayCliVersion}, addon=${addonVersion}). ` +
|
|
62
|
+
`Restarting proxy to pick up latest code.`);
|
|
63
|
+
lastRestartAt = Date.now();
|
|
64
|
+
// Detached spawn — we don't want the gateway to block on the restart
|
|
65
|
+
// completing. Output goes to /dev/null; the proxy.log captures the
|
|
66
|
+
// restart events from mitmproxy itself.
|
|
67
|
+
try {
|
|
68
|
+
const child = spawn(process.execPath, [cliEntry, 'proxy', 'restart'], {
|
|
69
|
+
detached: true,
|
|
70
|
+
stdio: 'ignore',
|
|
71
|
+
});
|
|
72
|
+
child.unref();
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
log(`restart spawn failed: ${err.message}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
17
78
|
function checkProxyHealth(mitmproxyPort) {
|
|
18
79
|
const sock = net.connect({ port: mitmproxyPort, timeout: HEALTH_TIMEOUT });
|
|
19
80
|
sock.on('connect', () => {
|
|
@@ -124,7 +185,9 @@ function handleRequest(req, res, mitmproxyPort) {
|
|
|
124
185
|
});
|
|
125
186
|
req.pipe(proxyReq);
|
|
126
187
|
}
|
|
127
|
-
export function startGateway(port = GATEWAY_PORT, mitmproxyPort = MITMPROXY_PORT) {
|
|
188
|
+
export function startGateway(port = GATEWAY_PORT, mitmproxyPort = MITMPROXY_PORT, options = {}) {
|
|
189
|
+
const cliVersion = options.cliVersion ?? process.env.RULEMETRIC_CLI_VERSION ?? 'unknown';
|
|
190
|
+
const cliEntry = options.cliEntry ?? process.env.RULEMETRIC_CLI_ENTRY ?? null;
|
|
128
191
|
const server = http.createServer((req, res) => {
|
|
129
192
|
handleRequest(req, res, mitmproxyPort);
|
|
130
193
|
});
|
|
@@ -139,11 +202,14 @@ export function startGateway(port = GATEWAY_PORT, mitmproxyPort = MITMPROXY_PORT
|
|
|
139
202
|
});
|
|
140
203
|
const healthInterval = setInterval(() => {
|
|
141
204
|
checkProxyHealth(mitmproxyPort);
|
|
205
|
+
maybeRestartOnDrift(cliVersion, cliEntry);
|
|
142
206
|
}, HEALTH_INTERVAL);
|
|
143
207
|
// Do an immediate check
|
|
144
208
|
checkProxyHealth(mitmproxyPort);
|
|
209
|
+
maybeRestartOnDrift(cliVersion, cliEntry);
|
|
145
210
|
server.listen(port, '127.0.0.1', () => {
|
|
146
|
-
log(`gateway listening on 127.0.0.1:${port} (mitmproxy target: :${mitmproxyPort}
|
|
211
|
+
log(`gateway listening on 127.0.0.1:${port} (mitmproxy target: :${mitmproxyPort}, ` +
|
|
212
|
+
`cli version: ${cliVersion})`);
|
|
147
213
|
});
|
|
148
214
|
return { server, healthInterval };
|
|
149
215
|
}
|
package/dist/lib/gateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/lib/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { type JobHelpers, type Task } from 'graphile-worker';
|
|
2
|
+
export interface WorkerOptions {
|
|
3
|
+
connectionString: string;
|
|
4
|
+
log: (msg: string) => void;
|
|
5
|
+
/**
|
|
6
|
+
* The user this worker belongs to. Drives per-user task name suffixes
|
|
7
|
+
* (`process_eval__<userId>` etc.) so this laptop only claims its own
|
|
8
|
+
* user's jobs from the shared Graphile queue. The API enqueues with the
|
|
9
|
+
* matching suffix in `enqueueJob`. See docs/audits/2026-05-07-worker-audit.md.
|
|
10
|
+
*/
|
|
11
|
+
userId: string;
|
|
12
|
+
/**
|
|
13
|
+
* Called when the watchdog has decided the worker is wedged and the
|
|
14
|
+
* process should die so launchd can relaunch it. Default: `process.exit(1)`.
|
|
15
|
+
* Injectable so tests can assert the watchdog fires without killing the
|
|
16
|
+
* test runner.
|
|
17
|
+
*/
|
|
18
|
+
onFatal?: (reason: string) => void;
|
|
19
|
+
/** Override `Date.now` for deterministic watchdog tests. */
|
|
20
|
+
now?: () => number;
|
|
21
|
+
}
|
|
22
|
+
export interface WatchdogState {
|
|
23
|
+
consecutiveHeartbeatFailures: number;
|
|
24
|
+
/** ms timestamp of last successful pool:listen, or null if none yet. */
|
|
25
|
+
lastListenSuccessAt: number | null;
|
|
26
|
+
/** ms timestamp of last pool:listen:error, or null if none yet. */
|
|
27
|
+
lastListenErrorAt: number | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Pure decision function: given watchdog state and "now", return a fatal
|
|
31
|
+
* reason string if the worker should exit, or null if it's healthy. Extracted
|
|
32
|
+
* so the threshold logic can be unit-tested without booting graphile-worker
|
|
33
|
+
* or stubbing process.exit.
|
|
34
|
+
*/
|
|
35
|
+
export declare function watchdogVerdict(_state: WatchdogState, _now: number): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Derive a short status string from watchdog state for `lastError` reporting.
|
|
38
|
+
* Returns null when nothing notable; otherwise a human-readable signal the
|
|
39
|
+
* dashboard can surface (e.g. "pg listen has been failing for 240s"). This is
|
|
40
|
+
* the logged-signal replacement for the old exit paths.
|
|
41
|
+
*/
|
|
42
|
+
export declare function watchdogStatus(state: WatchdogState, now: number): string | null;
|
|
43
|
+
/**
|
|
44
|
+
* Parse `lsof -i TCP -P -n` output into a count of established sockets to the
|
|
45
|
+
* Supabase pooler, grouped by remote host.
|
|
46
|
+
*
|
|
47
|
+
* Matches BOTH pooler ports: 6543 (transaction mode) and 5432 (session mode).
|
|
48
|
+
* The worker connects through the session pooler — see deriveSessionPoolerUrl
|
|
49
|
+
* in commands/evals/listen.ts — while the API uses the transaction pooler; a
|
|
50
|
+
* counter that matched only :6543 would silently report 0 sockets for every
|
|
51
|
+
* worker. The `->` anchor is load-bearing: it matches the REMOTE port, not a
|
|
52
|
+
* local source port that happens to share those digits.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parsePoolerSockets(lsofStdout: string): {
|
|
55
|
+
total: number;
|
|
56
|
+
byNode: Record<string, number>;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Row shape returned by `reclaimStaleLocks`'s SQL — exported only so the
|
|
60
|
+
* unit test can build a matching fake without duplicating the type.
|
|
61
|
+
*/
|
|
62
|
+
export interface StaleLockRow {
|
|
63
|
+
id: number;
|
|
64
|
+
identifier: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Executor abstraction used by `reclaimStaleLocks`: a function that runs a
|
|
68
|
+
* parameterised query and returns rows. The unit test passes a `vi.fn()`; the
|
|
69
|
+
* production wrapper (`reclaimStaleLocksWithConnection`) wraps a postgres-js
|
|
70
|
+
* client. Dependency injection keeps the SQL logic testable without a live DB.
|
|
71
|
+
*/
|
|
72
|
+
export type SqlExecutor = <T = Record<string, unknown>>(sql: string, params: ReadonlyArray<unknown>) => Promise<ReadonlyArray<T>>;
|
|
73
|
+
/**
|
|
74
|
+
* Release stale Graphile job locks owned by this worker's user.
|
|
75
|
+
*
|
|
76
|
+
* The graphile_worker._private_jobs table tracks in-flight jobs via
|
|
77
|
+
* `locked_at`/`locked_by`. When a worker crashes mid-job (SIGKILL, OOM, the
|
|
78
|
+
* 10s graceful-shutdown timeout in evals/listen.ts forcing exit before
|
|
79
|
+
* graphile can release locks) those fields stay populated — and graphile's
|
|
80
|
+
* built-in lock-timeout sweeper only reclaims them after a 4-hour TTL by
|
|
81
|
+
* default. Until that fires, the job is invisible to every worker: it's not
|
|
82
|
+
* `available`, but no one is actually running it.
|
|
83
|
+
*
|
|
84
|
+
* At worker BOOT we know that no jobs belonging to OUR user are legitimately
|
|
85
|
+
* in flight (the previous instance is dead — that's why we're starting). Any
|
|
86
|
+
* lock on a task identifier ending `__<userId>` is therefore stale and safe
|
|
87
|
+
* to clear. We scope by suffix so multiple users on a shared pooler don't
|
|
88
|
+
* accidentally release each other's live locks.
|
|
89
|
+
*
|
|
90
|
+
* Best-effort: a thrown executor error is logged but swallowed. If reclaim
|
|
91
|
+
* fails, graphile's 4h timeout still kicks in eventually, and crippling
|
|
92
|
+
* worker startup over a transient DB hiccup is worse than waiting it out.
|
|
93
|
+
*
|
|
94
|
+
* Returns the count of rows released (0 on error or no-op).
|
|
95
|
+
*/
|
|
96
|
+
export declare function reclaimStaleLocks(exec: SqlExecutor, userId: string, log: (msg: string) => void): Promise<number>;
|
|
97
|
+
/**
|
|
98
|
+
* Wrap a typed handler so it conforms to graphile-worker's `Task` shape AND
|
|
99
|
+
* intercepts `PermanentJobError` to skip retry waste.
|
|
100
|
+
*
|
|
101
|
+
* How the skip works: graphile-worker decides retry-vs-permanent-fail by
|
|
102
|
+
* comparing `job.attempts >= job.max_attempts` on the in-memory `Job` object
|
|
103
|
+
* AFTER the handler throws (see graphile-worker dist/worker.js). We mutate
|
|
104
|
+
* `helpers.job.max_attempts` to equal the current attempt count just before
|
|
105
|
+
* re-throwing — that flips the inequality so Graphile emits `job:failed`
|
|
106
|
+
* instead of scheduling another retry. The mutation is purely in JS memory;
|
|
107
|
+
* Graphile uses the in-memory `Job` object for its decision and never re-reads
|
|
108
|
+
* `max_attempts` from the DB on this code path, so a SQL update isn't needed.
|
|
109
|
+
*
|
|
110
|
+
* Exported for use in integration tests that want the same retry-skip behavior
|
|
111
|
+
* the runner applies in production.
|
|
112
|
+
*/
|
|
113
|
+
export declare function makeTask<P>(handler: (payload: P, helpers: JobHelpers) => Promise<unknown>): Task;
|
|
114
|
+
/**
|
|
115
|
+
* Boot a graphile-worker runner with the four task handlers wired up.
|
|
116
|
+
*
|
|
117
|
+
* Returns a cleanup function that:
|
|
118
|
+
* 1. clears the heartbeat interval
|
|
119
|
+
* 2. fires a final `status: 'shutting_down'` heartbeat so the dashboard
|
|
120
|
+
* can show a clean shutdown rather than a missed-heartbeat timeout
|
|
121
|
+
* 3. awaits `runner.stop()` for graceful drain (in-flight jobs finish)
|
|
122
|
+
*/
|
|
123
|
+
export declare function startWorker(options: WorkerOptions): Promise<() => Promise<void>>;
|
|
124
|
+
//# sourceMappingURL=graphile-worker-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphile-worker-runner.d.ts","sourceRoot":"","sources":["../../src/lib/graphile-worker-runner.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAiB,KAAK,UAAU,EAAsB,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAahG,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAWD,MAAM,WAAW,aAAa;IAC5B,4BAA4B,EAAE,MAAM,CAAC;IACrC,wEAAwE;IACxE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,mEAAmE;IACnE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAalF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW/E;AAuBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,CAYA;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,KAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAC7D,IAAI,CAcN;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAoWtF"}
|