sessionpipe 0.6.1 → 0.7.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 +16 -1
- package/dist/cli.js +1819 -1223
- package/dist/cli.js.map +4 -4
- package/dist/control/aliases.d.ts +15 -0
- package/dist/control/aliases.d.ts.map +1 -0
- package/dist/control/cli.d.ts.map +1 -1
- package/dist/control/daemon.d.ts +50 -10
- package/dist/control/daemon.d.ts.map +1 -1
- package/dist/control/pair.d.ts +2 -0
- package/dist/control/pair.d.ts.map +1 -1
- package/dist/control/route.d.ts +5 -2
- package/dist/control/route.d.ts.map +1 -1
- package/dist/hook.js +1 -1
- package/dist/index.js +69 -41
- package/dist/index.js.map +4 -4
- package/dist/run.d.ts.map +1 -1
- package/dist/worker.js +73 -45
- package/dist/worker.js.map +4 -4
- package/package.json +1 -1
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,UAAU,EAMf,MAAM,EAIN,KAAK,IAAI,EACT,KAAK,UAAU,EAOhB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,UAAU,EAMf,MAAM,EAIN,KAAK,IAAI,EACT,KAAK,UAAU,EAOhB,MAAM,mBAAmB,CAAC;AA6B3B,QAAA,MAAM,OAAO,QAAkF,CAAC;AAEhG,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAM1D;AAED;;;2BAG2B;AAC3B,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,SAAO,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB9F;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CASrD;AAED,yFAAyF;AACzF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAkBpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,GAAE;IAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAAG,IAAI,EAAE,CAkBnG;AAED,mFAAmF;AACnF,wBAAsB,MAAM,CAC1B,GAAG,EAAE,GAAG,EACR,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAoHjE;AAKD;;;;;4DAK4D;AAC5D,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,UAAU,EAAE,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqEjC;AAaD,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,eAAO,MAAM,WAAW,QAAO,MAAkC,CAAC;AAClE,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,MAAkC,CAAC;AAC3E,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,OAAqC,CAAC"}
|
package/dist/worker.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// sessionpipe 0.
|
|
2
|
+
// sessionpipe 0.7.0 · Apache-2.0 · https://sessionpipe.org
|
|
3
3
|
|
|
4
4
|
// src/worker.ts
|
|
5
|
-
import { readFileSync as
|
|
5
|
+
import { readFileSync as readFileSync10, unlinkSync as unlinkSync5 } from "node:fs";
|
|
6
6
|
|
|
7
7
|
// ../core/src/adapters/antigravity.ts
|
|
8
8
|
import {
|
|
@@ -190,6 +190,9 @@ function readClaude(lines, from) {
|
|
|
190
190
|
}
|
|
191
191
|
return pairTurns(msgs, endOf(lines));
|
|
192
192
|
}
|
|
193
|
+
function codexInjected(text) {
|
|
194
|
+
return /^<[a-z_-]+>/i.test(text) || /^# AGENTS\.md instructions\b/i.test(text);
|
|
195
|
+
}
|
|
193
196
|
function readCodex(lines, from) {
|
|
194
197
|
const msgs = [];
|
|
195
198
|
for (let i = from; i < lines.length; i++) {
|
|
@@ -201,7 +204,7 @@ function readCodex(lines, from) {
|
|
|
201
204
|
const text = textParts(p.content, ["input_text", "output_text"]).trim();
|
|
202
205
|
if (!text) continue;
|
|
203
206
|
if (p.role === "user") {
|
|
204
|
-
if (
|
|
207
|
+
if (codexInjected(text)) continue;
|
|
205
208
|
msgs.push({ role: "user", text, at, line: i });
|
|
206
209
|
} else if (p.role === "assistant") msgs.push({ role: "assistant", text, at, line: i });
|
|
207
210
|
}
|
|
@@ -1439,7 +1442,8 @@ function uninstallNotify(env) {
|
|
|
1439
1442
|
}
|
|
1440
1443
|
return { file, changed: false };
|
|
1441
1444
|
}
|
|
1442
|
-
function findRollout(threadId, env) {
|
|
1445
|
+
function findRollout(threadId, env = process.env) {
|
|
1446
|
+
if (!/^[A-Za-z0-9-]{8,128}$/.test(threadId)) return null;
|
|
1443
1447
|
let best = null;
|
|
1444
1448
|
const walk = (dir, depth) => {
|
|
1445
1449
|
let names = [];
|
|
@@ -1450,7 +1454,7 @@ function findRollout(threadId, env) {
|
|
|
1450
1454
|
}
|
|
1451
1455
|
for (const n of names.sort().reverse()) {
|
|
1452
1456
|
const p = path6.join(dir, n);
|
|
1453
|
-
if (n.endsWith(
|
|
1457
|
+
if (n.endsWith(`-${threadId}.jsonl`)) {
|
|
1454
1458
|
best = p;
|
|
1455
1459
|
return;
|
|
1456
1460
|
}
|
|
@@ -1655,7 +1659,7 @@ function codexFacts(file) {
|
|
|
1655
1659
|
const p = j.payload;
|
|
1656
1660
|
if (j.type !== "response_item" || !p || p.type !== "message" || p.role !== "user") continue;
|
|
1657
1661
|
const text = (p.content ?? []).filter((b) => b && b.type === "input_text" && typeof b.text === "string").map((b) => b.text).join("\n").trim();
|
|
1658
|
-
if (!text ||
|
|
1662
|
+
if (!text || codexInjected(text)) continue;
|
|
1659
1663
|
const line = text.split("\n").find((l) => l.trim()) ?? "";
|
|
1660
1664
|
out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\s+\S*$/, "")}\u2026` : line;
|
|
1661
1665
|
out.title_source = "first-ask";
|
|
@@ -2481,25 +2485,50 @@ var StdoutSink = class {
|
|
|
2481
2485
|
import {
|
|
2482
2486
|
appendFileSync as appendFileSync3,
|
|
2483
2487
|
existsSync as existsSync8,
|
|
2484
|
-
mkdirSync as
|
|
2488
|
+
mkdirSync as mkdirSync8,
|
|
2485
2489
|
readdirSync as readdirSync6,
|
|
2486
|
-
readFileSync as
|
|
2487
|
-
renameSync as
|
|
2490
|
+
readFileSync as readFileSync9,
|
|
2491
|
+
renameSync as renameSync3,
|
|
2488
2492
|
statSync as statSync5,
|
|
2489
2493
|
unlinkSync as unlinkSync4,
|
|
2490
|
-
writeFileSync as
|
|
2494
|
+
writeFileSync as writeFileSync7
|
|
2491
2495
|
} from "node:fs";
|
|
2492
2496
|
import os3 from "node:os";
|
|
2493
|
-
import
|
|
2497
|
+
import path13 from "node:path";
|
|
2498
|
+
|
|
2499
|
+
// src/control/aliases.ts
|
|
2500
|
+
import { chmodSync as chmodSync2, mkdirSync as mkdirSync7, readFileSync as readFileSync8, renameSync as renameSync2, writeFileSync as writeFileSync6 } from "node:fs";
|
|
2501
|
+
import path11 from "node:path";
|
|
2502
|
+
var aliasFile = (controlDir) => path11.join(controlDir, "aliases.json");
|
|
2503
|
+
function readAliases(file) {
|
|
2504
|
+
try {
|
|
2505
|
+
const j = JSON.parse(readFileSync8(file, "utf8"));
|
|
2506
|
+
if (!j || typeof j !== "object" || Array.isArray(j)) return {};
|
|
2507
|
+
const out = {};
|
|
2508
|
+
for (const [k, v] of Object.entries(j)) {
|
|
2509
|
+
const a = v;
|
|
2510
|
+
if (a && typeof a.id === "string" && a.id && typeof a.cwd === "string")
|
|
2511
|
+
out[k] = { id: a.id, cwd: a.cwd, at: typeof a.at === "string" ? a.at : "" };
|
|
2512
|
+
}
|
|
2513
|
+
return out;
|
|
2514
|
+
} catch {
|
|
2515
|
+
return {};
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
2518
|
+
function receiverIdOf(all, harness, id) {
|
|
2519
|
+
const prefix = `${harness}:`;
|
|
2520
|
+
for (const [k, a] of Object.entries(all)) if (a.id === id && k.startsWith(prefix)) return k.slice(prefix.length);
|
|
2521
|
+
return null;
|
|
2522
|
+
}
|
|
2494
2523
|
|
|
2495
2524
|
// src/control/local.ts
|
|
2496
2525
|
import net from "node:net";
|
|
2497
2526
|
import os2 from "node:os";
|
|
2498
|
-
import
|
|
2527
|
+
import path12 from "node:path";
|
|
2499
2528
|
function socketPath(state, env = process.env) {
|
|
2500
2529
|
if (env.SESSIONPIPE_SOCKET) return env.SESSIONPIPE_SOCKET;
|
|
2501
2530
|
if (process.platform === "win32") return `\\\\.\\pipe\\sessionpipe-control-${os2.userInfo().username}`;
|
|
2502
|
-
return
|
|
2531
|
+
return path12.join(state, "control.sock");
|
|
2503
2532
|
}
|
|
2504
2533
|
function ask(sock, req, timeoutMs) {
|
|
2505
2534
|
return new Promise((resolve) => {
|
|
@@ -2651,16 +2680,16 @@ function sinkWithSecrets(s, run = defaultRunner) {
|
|
|
2651
2680
|
}
|
|
2652
2681
|
|
|
2653
2682
|
// src/run.ts
|
|
2654
|
-
async function tellDaemon(state, job2, session, transcript) {
|
|
2683
|
+
async function tellDaemon(state, job2, session, cwd, transcript) {
|
|
2655
2684
|
const sock = socketPath(state);
|
|
2656
2685
|
if (process.platform !== "win32" && !existsSync8(sock)) return;
|
|
2657
2686
|
await ask(
|
|
2658
2687
|
sock,
|
|
2659
2688
|
{
|
|
2660
2689
|
op: "event",
|
|
2661
|
-
session:
|
|
2690
|
+
session: `${job2.harness}:${session}`,
|
|
2662
2691
|
event: job2.event,
|
|
2663
|
-
cwd:
|
|
2692
|
+
...cwd ? { cwd } : {},
|
|
2664
2693
|
...transcript ? { transcript } : {}
|
|
2665
2694
|
},
|
|
2666
2695
|
300
|
|
@@ -2668,9 +2697,9 @@ async function tellDaemon(state, job2, session, transcript) {
|
|
|
2668
2697
|
}
|
|
2669
2698
|
function enqueueJob(state, job2) {
|
|
2670
2699
|
const jobs = jobsDir(state);
|
|
2671
|
-
|
|
2672
|
-
const f =
|
|
2673
|
-
|
|
2700
|
+
mkdirSync8(jobs, { recursive: true, mode: 448 });
|
|
2701
|
+
const f = path13.join(jobs, `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.json`);
|
|
2702
|
+
writeFileSync7(f, JSON.stringify(job2), { mode: 384 });
|
|
2674
2703
|
return f;
|
|
2675
2704
|
}
|
|
2676
2705
|
async function sweepJobs(state, olderThanMs = 3e3, limit = 20) {
|
|
@@ -2683,11 +2712,11 @@ async function sweepJobs(state, olderThanMs = 3e3, limit = 20) {
|
|
|
2683
2712
|
}
|
|
2684
2713
|
let ran = 0;
|
|
2685
2714
|
for (const n of names.sort().slice(0, limit)) {
|
|
2686
|
-
const f =
|
|
2715
|
+
const f = path13.join(jobs, n);
|
|
2687
2716
|
let job2 = null;
|
|
2688
2717
|
try {
|
|
2689
2718
|
if (Date.now() - statSync5(f).mtimeMs < olderThanMs) continue;
|
|
2690
|
-
job2 = JSON.parse(
|
|
2719
|
+
job2 = JSON.parse(readFileSync9(f, "utf8"));
|
|
2691
2720
|
unlinkSync4(f);
|
|
2692
2721
|
} catch {
|
|
2693
2722
|
continue;
|
|
@@ -2700,10 +2729,10 @@ async function sweepJobs(state, olderThanMs = 3e3, limit = 20) {
|
|
|
2700
2729
|
}
|
|
2701
2730
|
function log(state, line) {
|
|
2702
2731
|
try {
|
|
2703
|
-
|
|
2704
|
-
const f =
|
|
2732
|
+
mkdirSync8(state, { recursive: true, mode: 448 });
|
|
2733
|
+
const f = path13.join(state, "log");
|
|
2705
2734
|
try {
|
|
2706
|
-
if (statSync5(f).size > 1024 * 1024)
|
|
2735
|
+
if (statSync5(f).size > 1024 * 1024) renameSync3(f, `${f}.1`);
|
|
2707
2736
|
} catch {
|
|
2708
2737
|
}
|
|
2709
2738
|
appendFileSync3(f, `${(/* @__PURE__ */ new Date()).toISOString()} ${line}
|
|
@@ -2712,11 +2741,11 @@ function log(state, line) {
|
|
|
2712
2741
|
}
|
|
2713
2742
|
}
|
|
2714
2743
|
function factsState(state) {
|
|
2715
|
-
const file = (h, s) =>
|
|
2744
|
+
const file = (h, s) => path13.join(state, "facts", safeId(h), `${safeId(s)}.json`);
|
|
2716
2745
|
return {
|
|
2717
2746
|
get(h, s) {
|
|
2718
2747
|
try {
|
|
2719
|
-
return JSON.parse(
|
|
2748
|
+
return JSON.parse(readFileSync9(file(h, s), "utf8"));
|
|
2720
2749
|
} catch {
|
|
2721
2750
|
return {};
|
|
2722
2751
|
}
|
|
@@ -2725,8 +2754,8 @@ function factsState(state) {
|
|
|
2725
2754
|
const cur = this.get(h, s);
|
|
2726
2755
|
const next = { ...cur, ...patch };
|
|
2727
2756
|
if (JSON.stringify(next) === JSON.stringify(cur)) return;
|
|
2728
|
-
|
|
2729
|
-
|
|
2757
|
+
mkdirSync8(path13.dirname(file(h, s)), { recursive: true, mode: 448 });
|
|
2758
|
+
writeFileSync7(file(h, s), JSON.stringify(next), { mode: 384 });
|
|
2730
2759
|
}
|
|
2731
2760
|
};
|
|
2732
2761
|
}
|
|
@@ -2754,30 +2783,33 @@ async function runJob(job2, opts = {}) {
|
|
|
2754
2783
|
if (!adapter) return { events: [], delivered: {} };
|
|
2755
2784
|
const r = adapter.fromHook({ argv: job2.argv, stdin: job2.stdin, env: { ...process.env, ...job2.env }, cwd: job2.cwd });
|
|
2756
2785
|
if (!r || !r.session.id) return { events: [], delivered: {} };
|
|
2757
|
-
|
|
2786
|
+
const id = receiverIdOf(readAliases(aliasFile(path13.join(state, "control"))), job2.harness, r.session.id) ?? r.session.id;
|
|
2787
|
+
await tellDaemon(state, job2, id, r.session.cwd, r.transcript);
|
|
2758
2788
|
const outbox = new Outbox(state);
|
|
2759
|
-
const ref = { harness: job2.harness, session:
|
|
2789
|
+
const ref = { harness: job2.harness, session: id };
|
|
2760
2790
|
let release = takeLock(state, ref);
|
|
2761
2791
|
for (let wait = 50; !release && wait <= 3200; wait *= 2) {
|
|
2762
2792
|
await new Promise((res) => setTimeout(res, wait));
|
|
2763
2793
|
release = takeLock(state, ref);
|
|
2764
2794
|
}
|
|
2765
2795
|
if (!release) {
|
|
2766
|
-
log(state, `${job2.harness} ${job2.event}: session ${
|
|
2796
|
+
log(state, `${job2.harness} ${job2.event}: session ${id} locked for 6 s, re-queued`);
|
|
2767
2797
|
enqueueJob(state, job2);
|
|
2768
2798
|
return { events: [], delivered: {} };
|
|
2769
2799
|
}
|
|
2770
2800
|
try {
|
|
2771
2801
|
const facts = factsState(state);
|
|
2772
|
-
const mem = facts.get(job2.harness,
|
|
2802
|
+
const mem = facts.get(job2.harness, id);
|
|
2773
2803
|
const heavy = !/^(PreToolUse|PostToolUse|PostToolUseFailure|BeforeTool|AfterTool|PostInvocation)$/.test(job2.event);
|
|
2774
2804
|
let learned = {};
|
|
2775
2805
|
if (heavy) {
|
|
2776
2806
|
const f = adapter.facts(r.session, r.transcript, r.hints ?? {}, facts);
|
|
2777
2807
|
const { started_at: _s, last_at: _l, first_ask: _fa, harness_version, ...rest } = f;
|
|
2778
2808
|
learned = rest;
|
|
2779
|
-
if (harness_version) facts.save(job2.harness,
|
|
2780
|
-
facts.save(job2.harness,
|
|
2809
|
+
if (harness_version) facts.save(job2.harness, id, { harness_version });
|
|
2810
|
+
facts.save(job2.harness, id, { session: { ...mem.session, ...learned } });
|
|
2811
|
+
if (job2.harness === "antigravity" && r.session.cwd && path13.isAbsolute(r.session.cwd))
|
|
2812
|
+
facts.save(job2.harness, id, { cwd: r.session.cwd });
|
|
2781
2813
|
}
|
|
2782
2814
|
const known = mem.session ?? {};
|
|
2783
2815
|
const cwdRaw = learned.cwd ?? r.session.cwd ?? known.cwd;
|
|
@@ -2787,13 +2819,13 @@ async function runJob(job2, opts = {}) {
|
|
|
2787
2819
|
...learned,
|
|
2788
2820
|
...git,
|
|
2789
2821
|
...learned.branch ? { branch: learned.branch } : {},
|
|
2790
|
-
id
|
|
2822
|
+
id,
|
|
2791
2823
|
seq: 0,
|
|
2792
2824
|
machine: machineName(cfg, os3.hostname()),
|
|
2793
2825
|
...cwdRaw ? { cwd: tilde(cwdRaw) } : {},
|
|
2794
2826
|
...r.session.model ? { model: r.session.model } : {}
|
|
2795
2827
|
};
|
|
2796
|
-
const version = facts.get(job2.harness,
|
|
2828
|
+
const version = facts.get(job2.harness, id).harness_version ?? void 0;
|
|
2797
2829
|
const events = [];
|
|
2798
2830
|
for (const a of r.events) {
|
|
2799
2831
|
const e = makeEvent(a, {
|
|
@@ -2805,7 +2837,7 @@ async function runJob(job2, opts = {}) {
|
|
|
2805
2837
|
}
|
|
2806
2838
|
const wantsTranscript = cfg.sinks.some((s) => !s.paused && Math.min(s.tier, s.max_tier ?? 3) >= 2);
|
|
2807
2839
|
if (wantsTranscript && r.transcript && r.events.some((e) => e.type === "turn.ended" || e.type === "session.ended")) {
|
|
2808
|
-
const cur = facts.get(job2.harness,
|
|
2840
|
+
const cur = facts.get(job2.harness, id);
|
|
2809
2841
|
const fromLine = Number(cur.transcript_line) || 0;
|
|
2810
2842
|
let turnNo = Number(cur.transcript_turns) || 0;
|
|
2811
2843
|
const read = adapter.readTranscript(r.transcript, fromLine);
|
|
@@ -2825,17 +2857,13 @@ async function runJob(job2, opts = {}) {
|
|
|
2825
2857
|
)
|
|
2826
2858
|
);
|
|
2827
2859
|
}
|
|
2828
|
-
if (read.turns.length)
|
|
2829
|
-
facts.save(job2.harness, r.session.id, { transcript_line: read.line, transcript_turns: turnNo });
|
|
2860
|
+
if (read.turns.length) facts.save(job2.harness, id, { transcript_line: read.line, transcript_turns: turnNo });
|
|
2830
2861
|
}
|
|
2831
2862
|
outbox.append(
|
|
2832
2863
|
ref,
|
|
2833
2864
|
events.map((e) => ({ ...e, session: redactDeep(e.session), data: redactDeep(e.data) }))
|
|
2834
2865
|
);
|
|
2835
|
-
log(
|
|
2836
|
-
state,
|
|
2837
|
-
`${job2.harness} ${job2.event}: ${events.map((e) => e.type).join(",") || "nothing"} (${r.session.id.slice(0, 8)})`
|
|
2838
|
-
);
|
|
2866
|
+
log(state, `${job2.harness} ${job2.event}: ${events.map((e) => e.type).join(",") || "nothing"} (${id.slice(0, 8)})`);
|
|
2839
2867
|
const delivered = await flush(state, cfg.sinks, outbox, ref);
|
|
2840
2868
|
if (Math.random() < 0.02) outbox.prune(cfg.keep_days ?? 30);
|
|
2841
2869
|
return { events, delivered };
|
|
@@ -2926,14 +2954,14 @@ function applySinkVerdict(name, res) {
|
|
|
2926
2954
|
} catch {
|
|
2927
2955
|
}
|
|
2928
2956
|
}
|
|
2929
|
-
var jobsDir = (state) =>
|
|
2957
|
+
var jobsDir = (state) => path13.join(state, "jobs");
|
|
2930
2958
|
|
|
2931
2959
|
// src/worker.ts
|
|
2932
2960
|
var jobFile = process.argv[2];
|
|
2933
2961
|
if (!jobFile) process.exit(0);
|
|
2934
2962
|
var job = null;
|
|
2935
2963
|
try {
|
|
2936
|
-
job = JSON.parse(
|
|
2964
|
+
job = JSON.parse(readFileSync10(jobFile, "utf8"));
|
|
2937
2965
|
} catch {
|
|
2938
2966
|
}
|
|
2939
2967
|
try {
|