@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
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Job } from 'graphile-worker';
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle events emitted by graphile-worker for a job.
|
|
4
|
+
*
|
|
5
|
+
* - `job:start` — worker has picked up the job and begun execution
|
|
6
|
+
* - `job:success` — task handler resolved without throwing
|
|
7
|
+
* - `job:error` — task handler threw, but the job has retries remaining
|
|
8
|
+
* (Graphile will requeue automatically; we record the error but keep status)
|
|
9
|
+
* - `job:failed` — task handler threw and the job has exhausted its attempts
|
|
10
|
+
*/
|
|
11
|
+
export type MirrorEvent = 'job:start' | 'job:success' | 'job:error' | 'job:failed';
|
|
12
|
+
/**
|
|
13
|
+
* Patch applied to the mirror row that tracks a graphile job's lifecycle.
|
|
14
|
+
*
|
|
15
|
+
* `mirrorId` routes the update; the rest are partial fields. `status` is
|
|
16
|
+
* deliberately omitted on `job:error` so Graphile's retry semantics own
|
|
17
|
+
* the running/queued state — we only flip to `failed` once attempts are
|
|
18
|
+
* exhausted.
|
|
19
|
+
*/
|
|
20
|
+
export interface MirrorUpdate {
|
|
21
|
+
mirrorId: string;
|
|
22
|
+
status?: 'running' | 'completed' | 'failed';
|
|
23
|
+
attempts: number;
|
|
24
|
+
graphileJobId: number;
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Pure mapping from a graphile-worker lifecycle event + job to the patch
|
|
29
|
+
* we apply to the corresponding mirror row.
|
|
30
|
+
*
|
|
31
|
+
* Pure: no I/O, no clock reads, no DB writes. The caller is responsible
|
|
32
|
+
* for executing the resulting update against the mirror table.
|
|
33
|
+
*/
|
|
34
|
+
export declare function jobToMirrorUpdate(event: MirrorEvent, job: Job): MirrorUpdate;
|
|
35
|
+
//# sourceMappingURL=mirror-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-writer.d.ts","sourceRoot":"","sources":["../../src/lib/mirror-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,YAAY,CAAC;AAEnF;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,YAAY,CAmB5E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure mapping from a graphile-worker lifecycle event + job to the patch
|
|
3
|
+
* we apply to the corresponding mirror row.
|
|
4
|
+
*
|
|
5
|
+
* Pure: no I/O, no clock reads, no DB writes. The caller is responsible
|
|
6
|
+
* for executing the resulting update against the mirror table.
|
|
7
|
+
*/
|
|
8
|
+
export function jobToMirrorUpdate(event, job) {
|
|
9
|
+
const mirrorId = job.payload.mirrorId;
|
|
10
|
+
const base = {
|
|
11
|
+
mirrorId,
|
|
12
|
+
attempts: job.attempts,
|
|
13
|
+
graphileJobId: Number(job.id),
|
|
14
|
+
};
|
|
15
|
+
switch (event) {
|
|
16
|
+
case 'job:start':
|
|
17
|
+
return { ...base, status: 'running' };
|
|
18
|
+
case 'job:success':
|
|
19
|
+
return { ...base, status: 'completed' };
|
|
20
|
+
case 'job:error':
|
|
21
|
+
// Don't flip status — Graphile will requeue the job for retry.
|
|
22
|
+
return { ...base, error: job.last_error ?? undefined };
|
|
23
|
+
case 'job:failed':
|
|
24
|
+
return { ...base, status: 'failed', error: job.last_error ?? undefined };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=mirror-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-writer.js","sourceRoot":"","sources":["../../src/lib/mirror-writer.ts"],"names":[],"mappings":"AA6BA;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,GAAQ;IAC5D,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAgC,CAAC,QAAQ,CAAC;IAChE,MAAM,IAAI,GAAiB;QACzB,QAAQ;QACR,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;KAC9B,CAAC;IAEF,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,WAAW;YACd,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACxC,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC1C,KAAK,WAAW;YACd,+DAA+D;YAC/D,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC;QACzD,KAAK,YAAY;YACf,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-writer.test.d.ts","sourceRoot":"","sources":["../../src/lib/mirror-writer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { jobToMirrorUpdate } from './mirror-writer.js';
|
|
3
|
+
const baseJob = (overrides = {}) => ({
|
|
4
|
+
id: 1,
|
|
5
|
+
task_identifier: 'process_eval',
|
|
6
|
+
payload: { mirrorId: '11111111-1111-1111-1111-111111111111' },
|
|
7
|
+
attempts: 0,
|
|
8
|
+
max_attempts: 3,
|
|
9
|
+
last_error: null,
|
|
10
|
+
// ...other Job fields filled with sensible defaults
|
|
11
|
+
...overrides,
|
|
12
|
+
});
|
|
13
|
+
describe('jobToMirrorUpdate', () => {
|
|
14
|
+
it('start event marks running with attempt count', () => {
|
|
15
|
+
const update = jobToMirrorUpdate('job:start', baseJob({ attempts: 1 }));
|
|
16
|
+
expect(update).toEqual({
|
|
17
|
+
mirrorId: '11111111-1111-1111-1111-111111111111',
|
|
18
|
+
status: 'running',
|
|
19
|
+
attempts: 1,
|
|
20
|
+
graphileJobId: 1,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it('success event marks completed', () => {
|
|
24
|
+
const update = jobToMirrorUpdate('job:success', baseJob({ attempts: 2 }));
|
|
25
|
+
expect(update).toMatchObject({ status: 'completed', attempts: 2 });
|
|
26
|
+
});
|
|
27
|
+
it('error event records last error but keeps status running (will retry)', () => {
|
|
28
|
+
const update = jobToMirrorUpdate('job:error', baseJob({ attempts: 1, last_error: 'ECONNRESET' }));
|
|
29
|
+
expect(update).toMatchObject({ error: 'ECONNRESET', attempts: 1 });
|
|
30
|
+
expect(update.status).toBeUndefined(); // do not flip status — Graphile will requeue
|
|
31
|
+
});
|
|
32
|
+
it('failed event marks failed permanently with final error', () => {
|
|
33
|
+
const update = jobToMirrorUpdate('job:failed', baseJob({ attempts: 3, last_error: 'fatal' }));
|
|
34
|
+
expect(update).toEqual({
|
|
35
|
+
mirrorId: '11111111-1111-1111-1111-111111111111',
|
|
36
|
+
status: 'failed',
|
|
37
|
+
attempts: 3,
|
|
38
|
+
error: 'fatal',
|
|
39
|
+
graphileJobId: 1,
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
it('mirrorId is extracted from payload for routing the update', () => {
|
|
43
|
+
const update = jobToMirrorUpdate('job:start', baseJob());
|
|
44
|
+
expect(update.mirrorId).toBe('11111111-1111-1111-1111-111111111111');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=mirror-writer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-writer.test.js","sourceRoot":"","sources":["../../src/lib/mirror-writer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,OAAO,GAAG,CAAC,YAA0B,EAAE,EAAO,EAAE,CAAC,CAAC;IACtD,EAAE,EAAE,CAAC;IACL,eAAe,EAAE,cAAc;IAC/B,OAAO,EAAE,EAAE,QAAQ,EAAE,sCAAsC,EAAE;IAC7D,QAAQ,EAAE,CAAC;IACX,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,IAAI;IAChB,oDAAoD;IACpD,GAAG,SAAS;CACM,CAAA,CAAC;AAErB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,QAAQ,EAAE,sCAAsC;YAChD,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,CAAC;YACX,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,MAAM,GAAG,iBAAiB,CAC9B,WAAW,EACX,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CACnD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,6CAA6C;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,MAAM,GAAG,iBAAiB,CAC9B,YAAY,EACZ,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAC9C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,QAAQ,EAAE,sCAAsC;YAChD,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,OAAO;YACd,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentinel error class for handler outcomes that retry is guaranteed not to
|
|
3
|
+
* help with — e.g. "no eval cases defined for target", "session has too few
|
|
4
|
+
* events to analyze". The runner intercepts these in graphile-worker-runner
|
|
5
|
+
* and tells Graphile to skip remaining attempts (via `permanently_fail_jobs`)
|
|
6
|
+
* instead of running the same handler N more times against the same data.
|
|
7
|
+
*
|
|
8
|
+
* Use ONLY for genuinely deterministic failures. Transient errors (LLM
|
|
9
|
+
* timeout, network, tool-CLI flakiness) should remain plain Error so Graphile
|
|
10
|
+
* retries them.
|
|
11
|
+
*/
|
|
12
|
+
export declare class PermanentJobError extends Error {
|
|
13
|
+
readonly __isPermanentJobError = true;
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare function isPermanentJobError(err: unknown): err is PermanentJobError;
|
|
17
|
+
//# sourceMappingURL=permanent-job-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permanent-job-error.d.ts","sourceRoot":"","sources":["../../src/lib/permanent-job-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,qBAAqB,QAAQ;gBAE1B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAK1E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentinel error class for handler outcomes that retry is guaranteed not to
|
|
3
|
+
* help with — e.g. "no eval cases defined for target", "session has too few
|
|
4
|
+
* events to analyze". The runner intercepts these in graphile-worker-runner
|
|
5
|
+
* and tells Graphile to skip remaining attempts (via `permanently_fail_jobs`)
|
|
6
|
+
* instead of running the same handler N more times against the same data.
|
|
7
|
+
*
|
|
8
|
+
* Use ONLY for genuinely deterministic failures. Transient errors (LLM
|
|
9
|
+
* timeout, network, tool-CLI flakiness) should remain plain Error so Graphile
|
|
10
|
+
* retries them.
|
|
11
|
+
*/
|
|
12
|
+
export class PermanentJobError extends Error {
|
|
13
|
+
__isPermanentJobError = true;
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'PermanentJobError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function isPermanentJobError(err) {
|
|
20
|
+
return (err instanceof Error &&
|
|
21
|
+
err.__isPermanentJobError === true);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=permanent-job-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permanent-job-error.js","sourceRoot":"","sources":["../../src/lib/permanent-job-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,qBAAqB,GAAG,IAAI,CAAC;IAEtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,CACL,GAAG,YAAY,KAAK;QACnB,GAA2C,CAAC,qBAAqB,KAAK,IAAI,CAC5E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permanent-job-error.test.d.ts","sourceRoot":"","sources":["../../src/lib/permanent-job-error.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { PermanentJobError, isPermanentJobError } from './permanent-job-error.js';
|
|
3
|
+
describe('PermanentJobError', () => {
|
|
4
|
+
it('is an Error subclass with the expected name + message', () => {
|
|
5
|
+
const err = new PermanentJobError('boom');
|
|
6
|
+
expect(err).toBeInstanceOf(Error);
|
|
7
|
+
expect(err.name).toBe('PermanentJobError');
|
|
8
|
+
expect(err.message).toBe('boom');
|
|
9
|
+
});
|
|
10
|
+
it('is detected by isPermanentJobError', () => {
|
|
11
|
+
expect(isPermanentJobError(new PermanentJobError('x'))).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it('does not match plain errors', () => {
|
|
14
|
+
expect(isPermanentJobError(new Error('plain'))).toBe(false);
|
|
15
|
+
expect(isPermanentJobError(new TypeError('typed'))).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
it('does not match non-Error values', () => {
|
|
18
|
+
expect(isPermanentJobError('string')).toBe(false);
|
|
19
|
+
expect(isPermanentJobError(null)).toBe(false);
|
|
20
|
+
expect(isPermanentJobError(undefined)).toBe(false);
|
|
21
|
+
expect(isPermanentJobError({ message: 'plain object' })).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it('still detects subclasses of PermanentJobError', () => {
|
|
24
|
+
class MyPermanent extends PermanentJobError {
|
|
25
|
+
}
|
|
26
|
+
expect(isPermanentJobError(new MyPermanent('x'))).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=permanent-job-error.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permanent-job-error.test.js","sourceRoot":"","sources":["../../src/lib/permanent-job-error.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAElF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,mBAAmB,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,mBAAmB,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,WAAY,SAAQ,iBAAiB;SAAG;QAC9C,MAAM,CAAC,mBAAmB,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetches latest version from the API in the background and refreshes the
|
|
3
|
+
* cache if the entry is missing or older than TTL_MS. Never throws.
|
|
4
|
+
*/
|
|
5
|
+
export declare function refreshVersionCacheInBackground(): void;
|
|
6
|
+
/**
|
|
7
|
+
* Returns a one-line upgrade banner if a newer version is cached, else null.
|
|
8
|
+
* Designed to be printed to stderr by the CLI's BaseCommand on launch.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getUpgradeBanner(currentVersion: string): string | null;
|
|
11
|
+
//# sourceMappingURL=version-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"AAqEA;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAuBtD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// CLI version-check banner. Every command kicks off an async fetch to
|
|
2
|
+
// /api/cli/latest-version (cached for an hour) and prints a one-line
|
|
3
|
+
// notice on the next invocation if the cached version is newer than the
|
|
4
|
+
// currently-running CLI.
|
|
5
|
+
//
|
|
6
|
+
// Design notes:
|
|
7
|
+
// - Fire-and-forget: we never block command execution on the network.
|
|
8
|
+
// - Cache: ~/.config/rulemetric/version-check.json, TTL 1h. Stored on disk
|
|
9
|
+
// so the check survives between CLI invocations (each invocation is a
|
|
10
|
+
// fresh process — in-memory cache wouldn't help).
|
|
11
|
+
// - "Newer" uses semver-naive numeric comparison split on dots — fine for
|
|
12
|
+
// our 0.x line; tightening this is a follow-up if/when we adopt semver
|
|
13
|
+
// pre-releases.
|
|
14
|
+
// - We DO NOT have an `upgrade` command yet; the banner just says "version
|
|
15
|
+
// X.Y.Z available" and trusts the user to know how they installed.
|
|
16
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
17
|
+
import { homedir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
const CONFIG_DIR = join(homedir(), '.config', 'rulemetric');
|
|
20
|
+
const CACHE_FILE = join(CONFIG_DIR, 'version-check.json');
|
|
21
|
+
const TTL_MS = 60 * 60 * 1000; // 1h
|
|
22
|
+
function readCache() {
|
|
23
|
+
try {
|
|
24
|
+
const data = JSON.parse(readFileSync(CACHE_FILE, 'utf-8'));
|
|
25
|
+
if (typeof data.latest === 'string' && typeof data.fetchedAtMs === 'number') {
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function writeCache(entry) {
|
|
35
|
+
try {
|
|
36
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
37
|
+
writeFileSync(CACHE_FILE, JSON.stringify(entry));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Best-effort: a write failure just means we'll re-fetch next time.
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function compareVersions(a, b) {
|
|
44
|
+
const parse = (v) => v.split('.').map((n) => Number.parseInt(n, 10) || 0);
|
|
45
|
+
const pa = parse(a);
|
|
46
|
+
const pb = parse(b);
|
|
47
|
+
const len = Math.max(pa.length, pb.length);
|
|
48
|
+
for (let i = 0; i < len; i++) {
|
|
49
|
+
const ai = pa[i] ?? 0;
|
|
50
|
+
const bi = pb[i] ?? 0;
|
|
51
|
+
if (ai < bi)
|
|
52
|
+
return -1;
|
|
53
|
+
if (ai > bi)
|
|
54
|
+
return 1;
|
|
55
|
+
}
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
function getApiUrl() {
|
|
59
|
+
const env = process.env.RULEMETRIC_API_URL;
|
|
60
|
+
if (env)
|
|
61
|
+
return env.replace(/\/$/, '');
|
|
62
|
+
return 'https://rulemetric.com';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Fetches latest version from the API in the background and refreshes the
|
|
66
|
+
* cache if the entry is missing or older than TTL_MS. Never throws.
|
|
67
|
+
*/
|
|
68
|
+
export function refreshVersionCacheInBackground() {
|
|
69
|
+
const cached = readCache();
|
|
70
|
+
if (cached && Date.now() - cached.fetchedAtMs < TTL_MS)
|
|
71
|
+
return;
|
|
72
|
+
// Fire-and-forget — explicitly catch every failure mode so an unhandled
|
|
73
|
+
// rejection can never reach the user. AbortController guards against
|
|
74
|
+
// hanging connections (3s budget).
|
|
75
|
+
const controller = new AbortController();
|
|
76
|
+
const timer = setTimeout(() => controller.abort(), 3000);
|
|
77
|
+
globalThis
|
|
78
|
+
.fetch(`${getApiUrl()}/api/cli/latest-version`, { signal: controller.signal })
|
|
79
|
+
.then(async (res) => {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
if (!res.ok)
|
|
82
|
+
return;
|
|
83
|
+
const data = (await res.json());
|
|
84
|
+
if (typeof data.latest !== 'string')
|
|
85
|
+
return;
|
|
86
|
+
writeCache({ latest: data.latest, fetchedAtMs: Date.now() });
|
|
87
|
+
})
|
|
88
|
+
.catch(() => {
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
// Network error, timeout, malformed JSON — silently ignore. Banner
|
|
91
|
+
// is purely a nicety; we never want it to surface failures.
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Returns a one-line upgrade banner if a newer version is cached, else null.
|
|
96
|
+
* Designed to be printed to stderr by the CLI's BaseCommand on launch.
|
|
97
|
+
*/
|
|
98
|
+
export function getUpgradeBanner(currentVersion) {
|
|
99
|
+
const cached = readCache();
|
|
100
|
+
if (!cached)
|
|
101
|
+
return null;
|
|
102
|
+
if (compareVersions(cached.latest, currentVersion) <= 0)
|
|
103
|
+
return null;
|
|
104
|
+
return `RuleMetric ${cached.latest} available — you're on ${currentVersion}.`;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/lib/version-check.ts"],"names":[],"mappings":"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"}
|