@costrict/csc 4.2.3 → 4.2.4-beta
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/dist/cli.js +1670 -1349
- package/dist/services/rawDump/batchWorker.js +280 -614
- package/package.json +1 -1
|
@@ -2,15 +2,51 @@
|
|
|
2
2
|
var __require = typeof import.meta.require === "function" ? import.meta.require : (await import("module")).createRequire(import.meta.url);
|
|
3
3
|
|
|
4
4
|
// src/services/rawDump/state.ts
|
|
5
|
-
import { promises as
|
|
6
|
-
import
|
|
7
|
-
import path2 from "path";
|
|
5
|
+
import { promises as fs2, readFileSync, writeFileSync } from "fs";
|
|
6
|
+
import path3 from "path";
|
|
8
7
|
|
|
9
8
|
// src/services/rawDump/logger.ts
|
|
10
9
|
import { appendFileSync } from "fs";
|
|
10
|
+
import path2 from "path";
|
|
11
|
+
|
|
12
|
+
// src/services/rawDump/dirs.ts
|
|
13
|
+
import fs from "fs";
|
|
11
14
|
import os from "os";
|
|
12
15
|
import path from "path";
|
|
13
|
-
|
|
16
|
+
function getCscDir() {
|
|
17
|
+
const candidates = [
|
|
18
|
+
process.env.COSTRICT_CONFIG_DIR || "",
|
|
19
|
+
path.join(os.homedir(), ".costrict"),
|
|
20
|
+
process.env.CLAUDE_CONFIG_DIR || "",
|
|
21
|
+
path.join(os.homedir(), ".claude")
|
|
22
|
+
];
|
|
23
|
+
const exists = (d) => d && fs.existsSync(path.join(d, "history.jsonl"));
|
|
24
|
+
return candidates.find(exists) || path.join(os.homedir(), ".costrict");
|
|
25
|
+
}
|
|
26
|
+
function getRawDumpDir() {
|
|
27
|
+
return path.join(getCscDir(), "raw-dump");
|
|
28
|
+
}
|
|
29
|
+
function normalizeProjectPath(dir) {
|
|
30
|
+
return dir.replace(/:/g, "-").replace(/[/\\]/g, "-");
|
|
31
|
+
}
|
|
32
|
+
function getSessionDirectory(directory) {
|
|
33
|
+
const claudeHome = getCscDir();
|
|
34
|
+
const projectPath = normalizeProjectPath(directory);
|
|
35
|
+
const candidates = [
|
|
36
|
+
path.join(claudeHome, "projects", projectPath),
|
|
37
|
+
path.join(claudeHome, "transcripts"),
|
|
38
|
+
path.join(claudeHome, "sessions"),
|
|
39
|
+
path.join(directory, ".claude", "sessions"),
|
|
40
|
+
path.join(directory, ".claude"),
|
|
41
|
+
directory,
|
|
42
|
+
process.env.CSC_SESSION_DIR || ""
|
|
43
|
+
];
|
|
44
|
+
const exists = (d) => d && fs.existsSync(d);
|
|
45
|
+
return candidates.find(exists) || directory;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/services/rawDump/logger.ts
|
|
49
|
+
var LOG_FILE = path2.join(getRawDumpDir(), "csc-raw-dump.log");
|
|
14
50
|
function isDebugEnabled() {
|
|
15
51
|
const v = process.env.CSC_RAW_DUMP_DEBUG;
|
|
16
52
|
return v === "1" || v === "true";
|
|
@@ -41,19 +77,21 @@ function createLogger(prefix) {
|
|
|
41
77
|
|
|
42
78
|
// src/services/rawDump/state.ts
|
|
43
79
|
var log = createLogger("state");
|
|
44
|
-
var STATE_DIR =
|
|
45
|
-
var CONVERSATION_FILE =
|
|
46
|
-
var SUMMARY_FILE =
|
|
47
|
-
var COMMITS_FILE =
|
|
48
|
-
var STATISTICS_FILE =
|
|
49
|
-
var TASKS_FILE =
|
|
50
|
-
var
|
|
51
|
-
var
|
|
80
|
+
var STATE_DIR = getRawDumpDir();
|
|
81
|
+
var CONVERSATION_FILE = path3.join(STATE_DIR, "csc-conversation.json");
|
|
82
|
+
var SUMMARY_FILE = path3.join(STATE_DIR, "csc-summary.json");
|
|
83
|
+
var COMMITS_FILE = path3.join(STATE_DIR, "csc-commits.json");
|
|
84
|
+
var STATISTICS_FILE = path3.join(STATE_DIR, "csc-statistics.json");
|
|
85
|
+
var TASKS_FILE = path3.join(STATE_DIR, "csc-tasks.json");
|
|
86
|
+
var RAW_FILE = path3.join(STATE_DIR, "csc-raw.json");
|
|
87
|
+
var DEAD_LETTER_FILE = path3.join(STATE_DIR, "csc-dead-letter.jsonl");
|
|
88
|
+
var STATE_LOCK_FILE = path3.join(STATE_DIR, "csc-state.lock");
|
|
52
89
|
var state_conv = { conversation: {}, clean_time: "", total: 0, incomplete: 0 };
|
|
53
90
|
var state_summary = { summary: {}, clean_time: "", total: 0, incomplete: 0 };
|
|
54
91
|
var state_commit = { commits: {}, clean_time: "", total: 0, incomplete: 0 };
|
|
55
92
|
var state_statistics = { statistics: {}, clean_time: "", total: 0, incomplete: 0 };
|
|
56
93
|
var state_task = { tasks: {}, history_cursor: -1, total: 0, incomplete: 0 };
|
|
94
|
+
var state_raw = { total: 0, logs: {} };
|
|
57
95
|
function readLockInfo(lockPath) {
|
|
58
96
|
try {
|
|
59
97
|
const content = readFileSync(lockPath, "utf-8").trim();
|
|
@@ -239,14 +277,15 @@ async function loadAllState() {
|
|
|
239
277
|
loadSummary(),
|
|
240
278
|
loadCommits(),
|
|
241
279
|
loadStatistics(),
|
|
242
|
-
loadTasks()
|
|
280
|
+
loadTasks(),
|
|
281
|
+
loadRaw()
|
|
243
282
|
]);
|
|
244
283
|
cleanupOldRecords();
|
|
245
284
|
}
|
|
246
285
|
async function loadConversation() {
|
|
247
286
|
return withStateLock(async () => {
|
|
248
287
|
try {
|
|
249
|
-
const text = await
|
|
288
|
+
const text = await fs2.readFile(CONVERSATION_FILE, "utf-8");
|
|
250
289
|
const parsed = JSON.parse(text);
|
|
251
290
|
state_conv = {
|
|
252
291
|
conversation: parsed.conversation ?? {},
|
|
@@ -262,7 +301,7 @@ async function loadConversation() {
|
|
|
262
301
|
async function loadSummary() {
|
|
263
302
|
return withStateLock(async () => {
|
|
264
303
|
try {
|
|
265
|
-
const text = await
|
|
304
|
+
const text = await fs2.readFile(SUMMARY_FILE, "utf-8");
|
|
266
305
|
const parsed = JSON.parse(text);
|
|
267
306
|
state_summary = {
|
|
268
307
|
summary: parsed.summary ?? {},
|
|
@@ -278,7 +317,7 @@ async function loadSummary() {
|
|
|
278
317
|
async function loadCommits() {
|
|
279
318
|
return withStateLock(async () => {
|
|
280
319
|
try {
|
|
281
|
-
const text = await
|
|
320
|
+
const text = await fs2.readFile(COMMITS_FILE, "utf-8");
|
|
282
321
|
const parsed = JSON.parse(text);
|
|
283
322
|
state_commit = {
|
|
284
323
|
commits: parsed.commits ?? {},
|
|
@@ -294,7 +333,7 @@ async function loadCommits() {
|
|
|
294
333
|
async function loadStatistics() {
|
|
295
334
|
return withStateLock(async () => {
|
|
296
335
|
try {
|
|
297
|
-
const text = await
|
|
336
|
+
const text = await fs2.readFile(STATISTICS_FILE, "utf-8");
|
|
298
337
|
const parsed = JSON.parse(text);
|
|
299
338
|
state_statistics = {
|
|
300
339
|
statistics: parsed.statistics ?? {},
|
|
@@ -310,7 +349,7 @@ async function loadStatistics() {
|
|
|
310
349
|
async function loadTasks() {
|
|
311
350
|
return withStateLock(async () => {
|
|
312
351
|
try {
|
|
313
|
-
const text = await
|
|
352
|
+
const text = await fs2.readFile(TASKS_FILE, "utf-8");
|
|
314
353
|
const parsed = JSON.parse(text);
|
|
315
354
|
const tasks = parsed.tasks ?? {};
|
|
316
355
|
state_task = {
|
|
@@ -326,41 +365,62 @@ async function loadTasks() {
|
|
|
326
365
|
}
|
|
327
366
|
async function saveConversation() {
|
|
328
367
|
return withStateLock(async () => {
|
|
329
|
-
await
|
|
368
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
330
369
|
state_conv.incomplete = Object.values(state_conv.conversation).filter((ts) => !ts).length;
|
|
331
370
|
state_conv.total = Object.keys(state_conv.conversation).length;
|
|
332
|
-
await
|
|
371
|
+
await fs2.writeFile(CONVERSATION_FILE, JSON.stringify(state_conv, null, 2), "utf-8");
|
|
333
372
|
});
|
|
334
373
|
}
|
|
335
374
|
async function saveSummary() {
|
|
336
375
|
return withStateLock(async () => {
|
|
337
|
-
await
|
|
376
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
338
377
|
state_summary.incomplete = Object.values(state_summary.summary).filter((ts) => !ts).length;
|
|
339
378
|
state_summary.total = Object.keys(state_summary.summary).length;
|
|
340
|
-
await
|
|
379
|
+
await fs2.writeFile(SUMMARY_FILE, JSON.stringify(state_summary, null, 2), "utf-8");
|
|
341
380
|
});
|
|
342
381
|
}
|
|
343
382
|
async function saveCommits() {
|
|
344
383
|
return withStateLock(async () => {
|
|
345
|
-
await
|
|
384
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
346
385
|
state_commit.total = Object.keys(state_commit.commits).length;
|
|
347
|
-
await
|
|
386
|
+
await fs2.writeFile(COMMITS_FILE, JSON.stringify(state_commit, null, 2), "utf-8");
|
|
348
387
|
});
|
|
349
388
|
}
|
|
350
389
|
async function saveStatistics() {
|
|
351
390
|
return withStateLock(async () => {
|
|
352
|
-
await
|
|
391
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
353
392
|
state_statistics.incomplete = Object.values(state_statistics.statistics).filter((r) => !r.currentUploadAt).length;
|
|
354
393
|
state_statistics.total = Object.keys(state_statistics.statistics).length;
|
|
355
|
-
await
|
|
394
|
+
await fs2.writeFile(STATISTICS_FILE, JSON.stringify(state_statistics, null, 2), "utf-8");
|
|
356
395
|
});
|
|
357
396
|
}
|
|
358
397
|
async function saveTasks() {
|
|
359
398
|
return withStateLock(async () => {
|
|
360
|
-
await
|
|
399
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
361
400
|
state_task.incomplete = Object.values(state_task.tasks).filter((r) => !r.uploadedAt).length;
|
|
362
401
|
state_task.total = Object.keys(state_task.tasks).length;
|
|
363
|
-
await
|
|
402
|
+
await fs2.writeFile(TASKS_FILE, JSON.stringify(state_task, null, 2), "utf-8");
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
async function loadRaw() {
|
|
406
|
+
return withStateLock(async () => {
|
|
407
|
+
try {
|
|
408
|
+
const text = await fs2.readFile(RAW_FILE, "utf-8");
|
|
409
|
+
const parsed = JSON.parse(text);
|
|
410
|
+
state_raw = {
|
|
411
|
+
logs: parsed.logs ?? {},
|
|
412
|
+
total: Object.keys(parsed.logs ?? {}).length
|
|
413
|
+
};
|
|
414
|
+
} catch {
|
|
415
|
+
state_raw = { logs: {}, total: 0 };
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
async function saveRaw() {
|
|
420
|
+
return withStateLock(async () => {
|
|
421
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
422
|
+
state_raw.total = Object.keys(state_raw.logs).length;
|
|
423
|
+
await fs2.writeFile(RAW_FILE, JSON.stringify(state_raw, null, 2), "utf-8");
|
|
364
424
|
});
|
|
365
425
|
}
|
|
366
426
|
function addQueueTasks(tasks) {
|
|
@@ -386,38 +446,9 @@ function addQueueTasks(tasks) {
|
|
|
386
446
|
}
|
|
387
447
|
}
|
|
388
448
|
}
|
|
389
|
-
function addHistoryTasks(tasks) {
|
|
390
|
-
const seen = new Map;
|
|
391
|
-
for (let i = state_task.history_cursor + 1;i < tasks.length; i++) {
|
|
392
|
-
const item = tasks[i];
|
|
393
|
-
const key = `${item.sessionId}`;
|
|
394
|
-
const existing = seen.get(key);
|
|
395
|
-
if (!existing || i > existing.index) {
|
|
396
|
-
seen.set(key, { item, index: i });
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
for (const { item, index } of seen.values()) {
|
|
400
|
-
const historyNo = index;
|
|
401
|
-
const key = `${item.sessionId}:history-${historyNo}`;
|
|
402
|
-
const existing = state_task.tasks[key];
|
|
403
|
-
if (!existing) {
|
|
404
|
-
state_task.tasks[key] = {
|
|
405
|
-
enqueuedAt: new Date(item.timestamp).toISOString(),
|
|
406
|
-
uploadedAt: "",
|
|
407
|
-
attemptCount: 0,
|
|
408
|
-
directory: item.project,
|
|
409
|
-
sessionId: item.sessionId,
|
|
410
|
-
messageId: "",
|
|
411
|
-
historyNo
|
|
412
|
-
};
|
|
413
|
-
state_task.total++;
|
|
414
|
-
state_task.incomplete++;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
449
|
async function appendDeadLetter(entry) {
|
|
419
|
-
await
|
|
420
|
-
await
|
|
450
|
+
await fs2.mkdir(STATE_DIR, { recursive: true });
|
|
451
|
+
await fs2.writeFile(DEAD_LETTER_FILE, JSON.stringify(entry) + `
|
|
421
452
|
`, {
|
|
422
453
|
flag: "a",
|
|
423
454
|
encoding: "utf-8"
|
|
@@ -425,14 +456,14 @@ async function appendDeadLetter(entry) {
|
|
|
425
456
|
}
|
|
426
457
|
|
|
427
458
|
// src/services/rawDump/worker.ts
|
|
428
|
-
import { promises as
|
|
459
|
+
import { promises as fs8 } from "fs";
|
|
429
460
|
import { createHash as createHash2 } from "crypto";
|
|
430
|
-
import
|
|
431
|
-
import
|
|
461
|
+
import os2 from "os";
|
|
462
|
+
import path8 from "path";
|
|
432
463
|
import { fileURLToPath } from "url";
|
|
433
464
|
|
|
434
465
|
// src/costrict/provider/credentials.ts
|
|
435
|
-
import { promises as
|
|
466
|
+
import { promises as fs3 } from "fs";
|
|
436
467
|
import { join } from "path";
|
|
437
468
|
import { createHash } from "crypto";
|
|
438
469
|
import { homedir } from "os";
|
|
@@ -441,16 +472,16 @@ function getCoStrictCredentialsPath() {
|
|
|
441
472
|
return join(COSTRICT_CONFIG_DIR, "auth.json");
|
|
442
473
|
}
|
|
443
474
|
function generateMachineId() {
|
|
444
|
-
const
|
|
445
|
-
const platform =
|
|
446
|
-
const hostname =
|
|
447
|
-
const username =
|
|
475
|
+
const os2 = __require("os");
|
|
476
|
+
const platform = os2.platform();
|
|
477
|
+
const hostname = os2.hostname();
|
|
478
|
+
const username = os2.userInfo().username;
|
|
448
479
|
const machineInfo = `${platform}-${hostname}-${username}`;
|
|
449
480
|
return createHash("sha256").update(machineInfo).digest("hex");
|
|
450
481
|
}
|
|
451
482
|
async function loadCoStrictCredentials() {
|
|
452
483
|
try {
|
|
453
|
-
const content = await
|
|
484
|
+
const content = await fs3.readFile(getCoStrictCredentialsPath(), "utf-8");
|
|
454
485
|
const credentials = JSON.parse(content);
|
|
455
486
|
if (!credentials.access_token || !credentials.base_url)
|
|
456
487
|
return null;
|
|
@@ -465,8 +496,8 @@ async function loadCoStrictCredentials() {
|
|
|
465
496
|
}
|
|
466
497
|
async function saveCoStrictCredentials(credentials) {
|
|
467
498
|
const filepath = getCoStrictCredentialsPath();
|
|
468
|
-
await
|
|
469
|
-
await
|
|
499
|
+
await fs3.mkdir(COSTRICT_CONFIG_DIR, { recursive: true });
|
|
500
|
+
await fs3.writeFile(filepath, JSON.stringify(credentials, null, 2) + `
|
|
470
501
|
`, {
|
|
471
502
|
encoding: "utf-8",
|
|
472
503
|
mode: 384
|
|
@@ -477,8 +508,8 @@ async function saveCoStrictCredentials(credentials) {
|
|
|
477
508
|
import { createRequire } from "module";
|
|
478
509
|
function getVersion() {
|
|
479
510
|
try {
|
|
480
|
-
if (typeof MACRO !== "undefined" && "4.2.
|
|
481
|
-
return "4.2.
|
|
511
|
+
if (typeof MACRO !== "undefined" && "4.2.4-beta")
|
|
512
|
+
return "4.2.4-beta";
|
|
482
513
|
} catch {}
|
|
483
514
|
try {
|
|
484
515
|
const require2 = createRequire(import.meta.url);
|
|
@@ -676,10 +707,9 @@ function toCommitComment(subject) {
|
|
|
676
707
|
}
|
|
677
708
|
|
|
678
709
|
// src/services/rawDump/localStorage.ts
|
|
679
|
-
import { promises as
|
|
680
|
-
import
|
|
681
|
-
|
|
682
|
-
var DEFAULT_LOCAL_DIR = path3.join(os3.homedir(), ".claude", "raw-dump");
|
|
710
|
+
import { promises as fs4 } from "fs";
|
|
711
|
+
import path4 from "path";
|
|
712
|
+
var DEFAULT_LOCAL_DIR = getRawDumpDir();
|
|
683
713
|
var RAW_DUMP_MODE = {
|
|
684
714
|
DISABLED: 0,
|
|
685
715
|
REMOTE: 1,
|
|
@@ -699,7 +729,7 @@ function getRawDumpMode() {
|
|
|
699
729
|
return 3;
|
|
700
730
|
return 1;
|
|
701
731
|
}
|
|
702
|
-
function
|
|
732
|
+
function normalizeProjectPath2(dir) {
|
|
703
733
|
return dir.replace(/:/g, "-").replace(/[/\\]/g, "-");
|
|
704
734
|
}
|
|
705
735
|
function getDateFromTimestamp(ts) {
|
|
@@ -727,12 +757,12 @@ async function writeLocalDump(type, body) {
|
|
|
727
757
|
endpoint = "/raw-store/task-summary";
|
|
728
758
|
} else if (type == "conversation") {
|
|
729
759
|
ymd = getDateFromTimestamp(getTimestampField("conversation", body));
|
|
730
|
-
subdir =
|
|
760
|
+
subdir = path4.join(ymd, body.task_id);
|
|
731
761
|
fname = body.request_id;
|
|
732
762
|
endpoint = "/raw-store/task-conversation";
|
|
733
763
|
} else if (type == "commit") {
|
|
734
764
|
ymd = getDateFromTimestamp(getTimestampField("commit", body));
|
|
735
|
-
subdir =
|
|
765
|
+
subdir = path4.join(normalizeProjectPath2(body.repo_addr), normalizeProjectPath2(body.repo_branch), ymd);
|
|
736
766
|
fname = body.commit_id;
|
|
737
767
|
endpoint = "/raw-store/commit";
|
|
738
768
|
} else if (type == "statistics") {
|
|
@@ -743,14 +773,18 @@ async function writeLocalDump(type, body) {
|
|
|
743
773
|
const s = String(t.getSeconds()).padStart(2, "0");
|
|
744
774
|
fname = `${h}-${m}-${s}`;
|
|
745
775
|
endpoint = "/raw-store/statistics";
|
|
776
|
+
} else if (type == "raw") {
|
|
777
|
+
subdir = path4.join(normalizeProjectPath2(body.project), body.session_id);
|
|
778
|
+
fname = String(body.start_cursor);
|
|
779
|
+
endpoint = "/raw-store/raw-log";
|
|
746
780
|
} else {
|
|
747
781
|
subdir = "unknown";
|
|
748
782
|
fname = "unknown";
|
|
749
783
|
endpoint = "unknown";
|
|
750
784
|
}
|
|
751
|
-
const dumpDir =
|
|
785
|
+
const dumpDir = path4.join(dir, type, subdir);
|
|
752
786
|
const filename = `${fname}.json`;
|
|
753
|
-
const filePath =
|
|
787
|
+
const filePath = path4.join(dumpDir, filename);
|
|
754
788
|
const payload = {
|
|
755
789
|
_dumpMeta: {
|
|
756
790
|
type,
|
|
@@ -759,17 +793,16 @@ async function writeLocalDump(type, body) {
|
|
|
759
793
|
},
|
|
760
794
|
...body
|
|
761
795
|
};
|
|
762
|
-
await
|
|
763
|
-
await
|
|
796
|
+
await fs4.mkdir(dumpDir, { recursive: true });
|
|
797
|
+
await fs4.writeFile(filePath, JSON.stringify(payload, null, 2) + `
|
|
764
798
|
`, "utf-8");
|
|
765
799
|
}
|
|
766
800
|
|
|
767
801
|
// src/services/rawDump/queue.ts
|
|
768
|
-
import { promises as
|
|
769
|
-
import
|
|
770
|
-
|
|
771
|
-
var
|
|
772
|
-
var QUEUE_LOCK_FILE = path4.join(os4.homedir(), ".claude", "raw-dump", "csc-work-queue.lock");
|
|
802
|
+
import { promises as fs5 } from "fs";
|
|
803
|
+
import path5 from "path";
|
|
804
|
+
var QUEUE_FILE = path5.join(getRawDumpDir(), "csc-work-queue.jsonl");
|
|
805
|
+
var QUEUE_LOCK_FILE = path5.join(getRawDumpDir(), "csc-work-queue.lock");
|
|
773
806
|
var MAX_ATTEMPTS = 4;
|
|
774
807
|
var queue = [];
|
|
775
808
|
var queueLoaded = false;
|
|
@@ -777,7 +810,7 @@ async function loadQueue() {
|
|
|
777
810
|
if (queueLoaded)
|
|
778
811
|
return;
|
|
779
812
|
try {
|
|
780
|
-
const text = await
|
|
813
|
+
const text = await fs5.readFile(QUEUE_FILE, "utf-8");
|
|
781
814
|
queue = text.split(`
|
|
782
815
|
`).filter(Boolean).map((line) => {
|
|
783
816
|
try {
|
|
@@ -793,7 +826,7 @@ async function loadQueue() {
|
|
|
793
826
|
}
|
|
794
827
|
function clearQueue() {
|
|
795
828
|
queue = [];
|
|
796
|
-
|
|
829
|
+
fs5.writeFile(QUEUE_FILE, "", "utf-8").catch(() => {});
|
|
797
830
|
}
|
|
798
831
|
function getQueue() {
|
|
799
832
|
return [...queue];
|
|
@@ -801,7 +834,7 @@ function getQueue() {
|
|
|
801
834
|
async function acquireQueueLock() {
|
|
802
835
|
try {
|
|
803
836
|
try {
|
|
804
|
-
const stat2 = await
|
|
837
|
+
const stat2 = await fs5.readFile(QUEUE_LOCK_FILE, "utf-8");
|
|
805
838
|
const pid = parseInt(stat2, 10);
|
|
806
839
|
if (!isNaN(pid) && pid !== process.pid) {
|
|
807
840
|
try {
|
|
@@ -810,7 +843,7 @@ async function acquireQueueLock() {
|
|
|
810
843
|
} catch {}
|
|
811
844
|
}
|
|
812
845
|
} catch {}
|
|
813
|
-
await
|
|
846
|
+
await fs5.writeFile(QUEUE_LOCK_FILE, String(process.pid), "utf-8");
|
|
814
847
|
return true;
|
|
815
848
|
} catch {
|
|
816
849
|
return false;
|
|
@@ -818,460 +851,26 @@ async function acquireQueueLock() {
|
|
|
818
851
|
}
|
|
819
852
|
async function releaseQueueLock() {
|
|
820
853
|
try {
|
|
821
|
-
await
|
|
854
|
+
await fs5.writeFile(QUEUE_LOCK_FILE, "", "utf-8");
|
|
822
855
|
} catch {}
|
|
823
856
|
}
|
|
824
857
|
|
|
825
858
|
// src/services/rawDump/history.ts
|
|
826
|
-
import { promises as
|
|
827
|
-
import
|
|
828
|
-
|
|
829
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_freeGlobal.js
|
|
830
|
-
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
|
|
831
|
-
var _freeGlobal_default = freeGlobal;
|
|
832
|
-
|
|
833
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_root.js
|
|
834
|
-
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
|
|
835
|
-
var root = _freeGlobal_default || freeSelf || Function("return this")();
|
|
836
|
-
var _root_default = root;
|
|
837
|
-
|
|
838
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Symbol.js
|
|
839
|
-
var Symbol2 = _root_default.Symbol;
|
|
840
|
-
var _Symbol_default = Symbol2;
|
|
841
|
-
|
|
842
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getRawTag.js
|
|
843
|
-
var objectProto = Object.prototype;
|
|
844
|
-
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
845
|
-
var nativeObjectToString = objectProto.toString;
|
|
846
|
-
var symToStringTag = _Symbol_default ? _Symbol_default.toStringTag : undefined;
|
|
847
|
-
function getRawTag(value) {
|
|
848
|
-
var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
|
|
849
|
-
try {
|
|
850
|
-
value[symToStringTag] = undefined;
|
|
851
|
-
var unmasked = true;
|
|
852
|
-
} catch (e) {}
|
|
853
|
-
var result = nativeObjectToString.call(value);
|
|
854
|
-
if (unmasked) {
|
|
855
|
-
if (isOwn) {
|
|
856
|
-
value[symToStringTag] = tag;
|
|
857
|
-
} else {
|
|
858
|
-
delete value[symToStringTag];
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
return result;
|
|
862
|
-
}
|
|
863
|
-
var _getRawTag_default = getRawTag;
|
|
864
|
-
|
|
865
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_objectToString.js
|
|
866
|
-
var objectProto2 = Object.prototype;
|
|
867
|
-
var nativeObjectToString2 = objectProto2.toString;
|
|
868
|
-
function objectToString(value) {
|
|
869
|
-
return nativeObjectToString2.call(value);
|
|
870
|
-
}
|
|
871
|
-
var _objectToString_default = objectToString;
|
|
872
|
-
|
|
873
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseGetTag.js
|
|
874
|
-
var nullTag = "[object Null]";
|
|
875
|
-
var undefinedTag = "[object Undefined]";
|
|
876
|
-
var symToStringTag2 = _Symbol_default ? _Symbol_default.toStringTag : undefined;
|
|
877
|
-
function baseGetTag(value) {
|
|
878
|
-
if (value == null) {
|
|
879
|
-
return value === undefined ? undefinedTag : nullTag;
|
|
880
|
-
}
|
|
881
|
-
return symToStringTag2 && symToStringTag2 in Object(value) ? _getRawTag_default(value) : _objectToString_default(value);
|
|
882
|
-
}
|
|
883
|
-
var _baseGetTag_default = baseGetTag;
|
|
884
|
-
|
|
885
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isObject.js
|
|
886
|
-
function isObject(value) {
|
|
887
|
-
var type = typeof value;
|
|
888
|
-
return value != null && (type == "object" || type == "function");
|
|
889
|
-
}
|
|
890
|
-
var isObject_default = isObject;
|
|
891
|
-
|
|
892
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/isFunction.js
|
|
893
|
-
var asyncTag = "[object AsyncFunction]";
|
|
894
|
-
var funcTag = "[object Function]";
|
|
895
|
-
var genTag = "[object GeneratorFunction]";
|
|
896
|
-
var proxyTag = "[object Proxy]";
|
|
897
|
-
function isFunction(value) {
|
|
898
|
-
if (!isObject_default(value)) {
|
|
899
|
-
return false;
|
|
900
|
-
}
|
|
901
|
-
var tag = _baseGetTag_default(value);
|
|
902
|
-
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
|
|
903
|
-
}
|
|
904
|
-
var isFunction_default = isFunction;
|
|
905
|
-
|
|
906
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_coreJsData.js
|
|
907
|
-
var coreJsData = _root_default["__core-js_shared__"];
|
|
908
|
-
var _coreJsData_default = coreJsData;
|
|
909
|
-
|
|
910
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isMasked.js
|
|
911
|
-
var maskSrcKey = function() {
|
|
912
|
-
var uid = /[^.]+$/.exec(_coreJsData_default && _coreJsData_default.keys && _coreJsData_default.keys.IE_PROTO || "");
|
|
913
|
-
return uid ? "Symbol(src)_1." + uid : "";
|
|
914
|
-
}();
|
|
915
|
-
function isMasked(func) {
|
|
916
|
-
return !!maskSrcKey && maskSrcKey in func;
|
|
917
|
-
}
|
|
918
|
-
var _isMasked_default = isMasked;
|
|
919
|
-
|
|
920
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_toSource.js
|
|
921
|
-
var funcProto = Function.prototype;
|
|
922
|
-
var funcToString = funcProto.toString;
|
|
923
|
-
function toSource(func) {
|
|
924
|
-
if (func != null) {
|
|
925
|
-
try {
|
|
926
|
-
return funcToString.call(func);
|
|
927
|
-
} catch (e) {}
|
|
928
|
-
try {
|
|
929
|
-
return func + "";
|
|
930
|
-
} catch (e) {}
|
|
931
|
-
}
|
|
932
|
-
return "";
|
|
933
|
-
}
|
|
934
|
-
var _toSource_default = toSource;
|
|
935
|
-
|
|
936
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_baseIsNative.js
|
|
937
|
-
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|
938
|
-
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|
939
|
-
var funcProto2 = Function.prototype;
|
|
940
|
-
var objectProto3 = Object.prototype;
|
|
941
|
-
var funcToString2 = funcProto2.toString;
|
|
942
|
-
var hasOwnProperty2 = objectProto3.hasOwnProperty;
|
|
943
|
-
var reIsNative = RegExp("^" + funcToString2.call(hasOwnProperty2).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$");
|
|
944
|
-
function baseIsNative(value) {
|
|
945
|
-
if (!isObject_default(value) || _isMasked_default(value)) {
|
|
946
|
-
return false;
|
|
947
|
-
}
|
|
948
|
-
var pattern = isFunction_default(value) ? reIsNative : reIsHostCtor;
|
|
949
|
-
return pattern.test(_toSource_default(value));
|
|
950
|
-
}
|
|
951
|
-
var _baseIsNative_default = baseIsNative;
|
|
952
|
-
|
|
953
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getValue.js
|
|
954
|
-
function getValue(object, key) {
|
|
955
|
-
return object == null ? undefined : object[key];
|
|
956
|
-
}
|
|
957
|
-
var _getValue_default = getValue;
|
|
958
|
-
|
|
959
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getNative.js
|
|
960
|
-
function getNative(object, key) {
|
|
961
|
-
var value = _getValue_default(object, key);
|
|
962
|
-
return _baseIsNative_default(value) ? value : undefined;
|
|
963
|
-
}
|
|
964
|
-
var _getNative_default = getNative;
|
|
965
|
-
|
|
966
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_nativeCreate.js
|
|
967
|
-
var nativeCreate = _getNative_default(Object, "create");
|
|
968
|
-
var _nativeCreate_default = nativeCreate;
|
|
969
|
-
|
|
970
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashClear.js
|
|
971
|
-
function hashClear() {
|
|
972
|
-
this.__data__ = _nativeCreate_default ? _nativeCreate_default(null) : {};
|
|
973
|
-
this.size = 0;
|
|
974
|
-
}
|
|
975
|
-
var _hashClear_default = hashClear;
|
|
976
|
-
|
|
977
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashDelete.js
|
|
978
|
-
function hashDelete(key) {
|
|
979
|
-
var result = this.has(key) && delete this.__data__[key];
|
|
980
|
-
this.size -= result ? 1 : 0;
|
|
981
|
-
return result;
|
|
982
|
-
}
|
|
983
|
-
var _hashDelete_default = hashDelete;
|
|
984
|
-
|
|
985
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashGet.js
|
|
986
|
-
var HASH_UNDEFINED = "__lodash_hash_undefined__";
|
|
987
|
-
var objectProto4 = Object.prototype;
|
|
988
|
-
var hasOwnProperty3 = objectProto4.hasOwnProperty;
|
|
989
|
-
function hashGet(key) {
|
|
990
|
-
var data = this.__data__;
|
|
991
|
-
if (_nativeCreate_default) {
|
|
992
|
-
var result = data[key];
|
|
993
|
-
return result === HASH_UNDEFINED ? undefined : result;
|
|
994
|
-
}
|
|
995
|
-
return hasOwnProperty3.call(data, key) ? data[key] : undefined;
|
|
996
|
-
}
|
|
997
|
-
var _hashGet_default = hashGet;
|
|
998
|
-
|
|
999
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashHas.js
|
|
1000
|
-
var objectProto5 = Object.prototype;
|
|
1001
|
-
var hasOwnProperty4 = objectProto5.hasOwnProperty;
|
|
1002
|
-
function hashHas(key) {
|
|
1003
|
-
var data = this.__data__;
|
|
1004
|
-
return _nativeCreate_default ? data[key] !== undefined : hasOwnProperty4.call(data, key);
|
|
1005
|
-
}
|
|
1006
|
-
var _hashHas_default = hashHas;
|
|
1007
|
-
|
|
1008
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_hashSet.js
|
|
1009
|
-
var HASH_UNDEFINED2 = "__lodash_hash_undefined__";
|
|
1010
|
-
function hashSet(key, value) {
|
|
1011
|
-
var data = this.__data__;
|
|
1012
|
-
this.size += this.has(key) ? 0 : 1;
|
|
1013
|
-
data[key] = _nativeCreate_default && value === undefined ? HASH_UNDEFINED2 : value;
|
|
1014
|
-
return this;
|
|
1015
|
-
}
|
|
1016
|
-
var _hashSet_default = hashSet;
|
|
1017
|
-
|
|
1018
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Hash.js
|
|
1019
|
-
function Hash(entries) {
|
|
1020
|
-
var index = -1, length = entries == null ? 0 : entries.length;
|
|
1021
|
-
this.clear();
|
|
1022
|
-
while (++index < length) {
|
|
1023
|
-
var entry = entries[index];
|
|
1024
|
-
this.set(entry[0], entry[1]);
|
|
1025
|
-
}
|
|
1026
|
-
}
|
|
1027
|
-
Hash.prototype.clear = _hashClear_default;
|
|
1028
|
-
Hash.prototype["delete"] = _hashDelete_default;
|
|
1029
|
-
Hash.prototype.get = _hashGet_default;
|
|
1030
|
-
Hash.prototype.has = _hashHas_default;
|
|
1031
|
-
Hash.prototype.set = _hashSet_default;
|
|
1032
|
-
var _Hash_default = Hash;
|
|
1033
|
-
|
|
1034
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheClear.js
|
|
1035
|
-
function listCacheClear() {
|
|
1036
|
-
this.__data__ = [];
|
|
1037
|
-
this.size = 0;
|
|
1038
|
-
}
|
|
1039
|
-
var _listCacheClear_default = listCacheClear;
|
|
1040
|
-
|
|
1041
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/eq.js
|
|
1042
|
-
function eq(value, other) {
|
|
1043
|
-
return value === other || value !== value && other !== other;
|
|
1044
|
-
}
|
|
1045
|
-
var eq_default = eq;
|
|
1046
|
-
|
|
1047
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_assocIndexOf.js
|
|
1048
|
-
function assocIndexOf(array, key) {
|
|
1049
|
-
var length = array.length;
|
|
1050
|
-
while (length--) {
|
|
1051
|
-
if (eq_default(array[length][0], key)) {
|
|
1052
|
-
return length;
|
|
1053
|
-
}
|
|
1054
|
-
}
|
|
1055
|
-
return -1;
|
|
1056
|
-
}
|
|
1057
|
-
var _assocIndexOf_default = assocIndexOf;
|
|
1058
|
-
|
|
1059
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheDelete.js
|
|
1060
|
-
var arrayProto = Array.prototype;
|
|
1061
|
-
var splice = arrayProto.splice;
|
|
1062
|
-
function listCacheDelete(key) {
|
|
1063
|
-
var data = this.__data__, index = _assocIndexOf_default(data, key);
|
|
1064
|
-
if (index < 0) {
|
|
1065
|
-
return false;
|
|
1066
|
-
}
|
|
1067
|
-
var lastIndex = data.length - 1;
|
|
1068
|
-
if (index == lastIndex) {
|
|
1069
|
-
data.pop();
|
|
1070
|
-
} else {
|
|
1071
|
-
splice.call(data, index, 1);
|
|
1072
|
-
}
|
|
1073
|
-
--this.size;
|
|
1074
|
-
return true;
|
|
1075
|
-
}
|
|
1076
|
-
var _listCacheDelete_default = listCacheDelete;
|
|
1077
|
-
|
|
1078
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheGet.js
|
|
1079
|
-
function listCacheGet(key) {
|
|
1080
|
-
var data = this.__data__, index = _assocIndexOf_default(data, key);
|
|
1081
|
-
return index < 0 ? undefined : data[index][1];
|
|
1082
|
-
}
|
|
1083
|
-
var _listCacheGet_default = listCacheGet;
|
|
1084
|
-
|
|
1085
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheHas.js
|
|
1086
|
-
function listCacheHas(key) {
|
|
1087
|
-
return _assocIndexOf_default(this.__data__, key) > -1;
|
|
1088
|
-
}
|
|
1089
|
-
var _listCacheHas_default = listCacheHas;
|
|
1090
|
-
|
|
1091
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_listCacheSet.js
|
|
1092
|
-
function listCacheSet(key, value) {
|
|
1093
|
-
var data = this.__data__, index = _assocIndexOf_default(data, key);
|
|
1094
|
-
if (index < 0) {
|
|
1095
|
-
++this.size;
|
|
1096
|
-
data.push([key, value]);
|
|
1097
|
-
} else {
|
|
1098
|
-
data[index][1] = value;
|
|
1099
|
-
}
|
|
1100
|
-
return this;
|
|
1101
|
-
}
|
|
1102
|
-
var _listCacheSet_default = listCacheSet;
|
|
1103
|
-
|
|
1104
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_ListCache.js
|
|
1105
|
-
function ListCache(entries) {
|
|
1106
|
-
var index = -1, length = entries == null ? 0 : entries.length;
|
|
1107
|
-
this.clear();
|
|
1108
|
-
while (++index < length) {
|
|
1109
|
-
var entry = entries[index];
|
|
1110
|
-
this.set(entry[0], entry[1]);
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
ListCache.prototype.clear = _listCacheClear_default;
|
|
1114
|
-
ListCache.prototype["delete"] = _listCacheDelete_default;
|
|
1115
|
-
ListCache.prototype.get = _listCacheGet_default;
|
|
1116
|
-
ListCache.prototype.has = _listCacheHas_default;
|
|
1117
|
-
ListCache.prototype.set = _listCacheSet_default;
|
|
1118
|
-
var _ListCache_default = ListCache;
|
|
1119
|
-
|
|
1120
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_Map.js
|
|
1121
|
-
var Map2 = _getNative_default(_root_default, "Map");
|
|
1122
|
-
var _Map_default = Map2;
|
|
1123
|
-
|
|
1124
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheClear.js
|
|
1125
|
-
function mapCacheClear() {
|
|
1126
|
-
this.size = 0;
|
|
1127
|
-
this.__data__ = {
|
|
1128
|
-
hash: new _Hash_default,
|
|
1129
|
-
map: new (_Map_default || _ListCache_default),
|
|
1130
|
-
string: new _Hash_default
|
|
1131
|
-
};
|
|
1132
|
-
}
|
|
1133
|
-
var _mapCacheClear_default = mapCacheClear;
|
|
1134
|
-
|
|
1135
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_isKeyable.js
|
|
1136
|
-
function isKeyable(value) {
|
|
1137
|
-
var type = typeof value;
|
|
1138
|
-
return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null;
|
|
1139
|
-
}
|
|
1140
|
-
var _isKeyable_default = isKeyable;
|
|
1141
|
-
|
|
1142
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_getMapData.js
|
|
1143
|
-
function getMapData(map, key) {
|
|
1144
|
-
var data = map.__data__;
|
|
1145
|
-
return _isKeyable_default(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map;
|
|
1146
|
-
}
|
|
1147
|
-
var _getMapData_default = getMapData;
|
|
1148
|
-
|
|
1149
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheDelete.js
|
|
1150
|
-
function mapCacheDelete(key) {
|
|
1151
|
-
var result = _getMapData_default(this, key)["delete"](key);
|
|
1152
|
-
this.size -= result ? 1 : 0;
|
|
1153
|
-
return result;
|
|
1154
|
-
}
|
|
1155
|
-
var _mapCacheDelete_default = mapCacheDelete;
|
|
1156
|
-
|
|
1157
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheGet.js
|
|
1158
|
-
function mapCacheGet(key) {
|
|
1159
|
-
return _getMapData_default(this, key).get(key);
|
|
1160
|
-
}
|
|
1161
|
-
var _mapCacheGet_default = mapCacheGet;
|
|
1162
|
-
|
|
1163
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheHas.js
|
|
1164
|
-
function mapCacheHas(key) {
|
|
1165
|
-
return _getMapData_default(this, key).has(key);
|
|
1166
|
-
}
|
|
1167
|
-
var _mapCacheHas_default = mapCacheHas;
|
|
1168
|
-
|
|
1169
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_mapCacheSet.js
|
|
1170
|
-
function mapCacheSet(key, value) {
|
|
1171
|
-
var data = _getMapData_default(this, key), size = data.size;
|
|
1172
|
-
data.set(key, value);
|
|
1173
|
-
this.size += data.size == size ? 0 : 1;
|
|
1174
|
-
return this;
|
|
1175
|
-
}
|
|
1176
|
-
var _mapCacheSet_default = mapCacheSet;
|
|
1177
|
-
|
|
1178
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/_MapCache.js
|
|
1179
|
-
function MapCache(entries) {
|
|
1180
|
-
var index = -1, length = entries == null ? 0 : entries.length;
|
|
1181
|
-
this.clear();
|
|
1182
|
-
while (++index < length) {
|
|
1183
|
-
var entry = entries[index];
|
|
1184
|
-
this.set(entry[0], entry[1]);
|
|
1185
|
-
}
|
|
1186
|
-
}
|
|
1187
|
-
MapCache.prototype.clear = _mapCacheClear_default;
|
|
1188
|
-
MapCache.prototype["delete"] = _mapCacheDelete_default;
|
|
1189
|
-
MapCache.prototype.get = _mapCacheGet_default;
|
|
1190
|
-
MapCache.prototype.has = _mapCacheHas_default;
|
|
1191
|
-
MapCache.prototype.set = _mapCacheSet_default;
|
|
1192
|
-
var _MapCache_default = MapCache;
|
|
1193
|
-
|
|
1194
|
-
// node_modules/.bun/lodash-es@4.18.1/node_modules/lodash-es/memoize.js
|
|
1195
|
-
var FUNC_ERROR_TEXT = "Expected a function";
|
|
1196
|
-
function memoize(func, resolver) {
|
|
1197
|
-
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
|
|
1198
|
-
throw new TypeError(FUNC_ERROR_TEXT);
|
|
1199
|
-
}
|
|
1200
|
-
var memoized = function() {
|
|
1201
|
-
var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
|
|
1202
|
-
if (cache.has(key)) {
|
|
1203
|
-
return cache.get(key);
|
|
1204
|
-
}
|
|
1205
|
-
var result = func.apply(this, args);
|
|
1206
|
-
memoized.cache = cache.set(key, result) || cache;
|
|
1207
|
-
return result;
|
|
1208
|
-
};
|
|
1209
|
-
memoized.cache = new (memoize.Cache || _MapCache_default);
|
|
1210
|
-
return memoized;
|
|
1211
|
-
}
|
|
1212
|
-
memoize.Cache = _MapCache_default;
|
|
1213
|
-
var memoize_default = memoize;
|
|
1214
|
-
|
|
1215
|
-
// src/utils/envUtils.ts
|
|
1216
|
-
import { homedir as homedir2 } from "os";
|
|
1217
|
-
import { join as join2 } from "path";
|
|
1218
|
-
|
|
1219
|
-
// src/constants/branding.ts
|
|
1220
|
-
var PRODUCT_URL = "https://costrict.ai";
|
|
1221
|
-
var PRODUCT_DOCS_URL = `${PRODUCT_URL}/docs`;
|
|
1222
|
-
var PRODUCT_CHROME_URL = `${PRODUCT_URL}/chrome`;
|
|
1223
|
-
var PRODUCT_SETTINGS_URL = `${PRODUCT_URL}/settings`;
|
|
1224
|
-
var PRODUCT_CODE_URL = `${PRODUCT_URL}/code`;
|
|
1225
|
-
var PRODUCT_SESSION_URL = `${PRODUCT_URL}/session`;
|
|
1226
|
-
var PRODUCT_UPGRADE_URL = `${PRODUCT_URL}/upgrade/max`;
|
|
1227
|
-
var PRODUCT_DOWNLOAD_URL = `${PRODUCT_URL}/download`;
|
|
1228
|
-
var PRODUCT_DESKTOP_API_URL = `${PRODUCT_URL}/api/desktop`;
|
|
1229
|
-
var PRODUCT_OAUTH_CLIENT_METADATA_URL = `${PRODUCT_URL}/oauth/costrict-client-metadata`;
|
|
1230
|
-
var CONFIG_DIR_NAME = ".costrict";
|
|
1231
|
-
var LEGACY_CONFIG_DIR_NAME = ".claude";
|
|
1232
|
-
|
|
1233
|
-
// src/utils/envUtils.ts
|
|
1234
|
-
var getCostrictConfigHomeDir = memoize_default(() => {
|
|
1235
|
-
return (process.env.COSTRICT_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR ?? join2(homedir2(), CONFIG_DIR_NAME)).normalize("NFC");
|
|
1236
|
-
}, () => process.env.COSTRICT_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR);
|
|
1237
|
-
var getClaudeConfigHomeDir = getCostrictConfigHomeDir;
|
|
1238
|
-
function getLegacyConfigHomeDir() {
|
|
1239
|
-
if (process.env.COSTRICT_CONFIG_DIR || process.env.CLAUDE_CONFIG_DIR) {
|
|
1240
|
-
return;
|
|
1241
|
-
}
|
|
1242
|
-
return join2(homedir2(), LEGACY_CONFIG_DIR_NAME).normalize("NFC");
|
|
1243
|
-
}
|
|
1244
|
-
|
|
1245
|
-
// src/services/rawDump/history.ts
|
|
1246
|
-
var HISTORY_FILE = path5.join(getClaudeConfigHomeDir(), "history.jsonl");
|
|
1247
|
-
var LEGACY_HISTORY_FILE = (() => {
|
|
1248
|
-
const legacy = getLegacyConfigHomeDir();
|
|
1249
|
-
return legacy ? path5.join(legacy, "history.jsonl") : null;
|
|
1250
|
-
})();
|
|
1251
|
-
async function resolveHistoryFilePath() {
|
|
1252
|
-
try {
|
|
1253
|
-
const s = await fs5.stat(HISTORY_FILE);
|
|
1254
|
-
return { path: HISTORY_FILE, mtimeMs: Number(s.mtimeMs), size: Number(s.size) };
|
|
1255
|
-
} catch {}
|
|
1256
|
-
if (LEGACY_HISTORY_FILE) {
|
|
1257
|
-
try {
|
|
1258
|
-
const s = await fs5.stat(LEGACY_HISTORY_FILE);
|
|
1259
|
-
return { path: LEGACY_HISTORY_FILE, mtimeMs: Number(s.mtimeMs), size: Number(s.size) };
|
|
1260
|
-
} catch {}
|
|
1261
|
-
}
|
|
1262
|
-
return null;
|
|
1263
|
-
}
|
|
859
|
+
import { promises as fs6 } from "fs";
|
|
860
|
+
import path6 from "path";
|
|
861
|
+
var HISTORY_FILE = path6.join(getCscDir(), "history.jsonl");
|
|
1264
862
|
var cache = null;
|
|
1265
863
|
async function loadHistory() {
|
|
1266
864
|
const items = [];
|
|
1267
|
-
|
|
1268
|
-
|
|
865
|
+
let fileStat = null;
|
|
866
|
+
try {
|
|
867
|
+
fileStat = await fs6.stat(HISTORY_FILE);
|
|
868
|
+
} catch {
|
|
1269
869
|
cache = null;
|
|
1270
870
|
return [];
|
|
1271
871
|
}
|
|
1272
|
-
const { path: historyFile, mtimeMs, size } = resolved;
|
|
1273
872
|
try {
|
|
1274
|
-
const content = await
|
|
873
|
+
const content = await fs6.readFile(HISTORY_FILE, "utf-8");
|
|
1275
874
|
const lines = content.split(`
|
|
1276
875
|
`);
|
|
1277
876
|
for (const line of lines) {
|
|
@@ -1286,32 +885,36 @@ async function loadHistory() {
|
|
|
1286
885
|
return cache?.items ?? [];
|
|
1287
886
|
}
|
|
1288
887
|
cache = {
|
|
1289
|
-
mtime: mtimeMs,
|
|
1290
|
-
size,
|
|
888
|
+
mtime: fileStat.mtimeMs,
|
|
889
|
+
size: fileStat.size,
|
|
1291
890
|
items
|
|
1292
891
|
};
|
|
1293
892
|
return cache.items;
|
|
1294
893
|
}
|
|
1295
894
|
async function autoLoadHistory() {
|
|
1296
|
-
|
|
1297
|
-
|
|
895
|
+
let fileStat = null;
|
|
896
|
+
try {
|
|
897
|
+
fileStat = await fs6.stat(HISTORY_FILE);
|
|
898
|
+
} catch {
|
|
1298
899
|
if (cache) {
|
|
1299
900
|
return null;
|
|
1300
901
|
}
|
|
1301
902
|
return [];
|
|
1302
903
|
}
|
|
1303
|
-
if (cache && cache.mtime ===
|
|
904
|
+
if (cache && cache.mtime === fileStat.mtimeMs && cache.size === fileStat.size) {
|
|
1304
905
|
return cache.items;
|
|
1305
906
|
}
|
|
1306
907
|
return await loadHistory();
|
|
1307
908
|
}
|
|
1308
909
|
async function getProjectDirs() {
|
|
1309
910
|
if (cache) {
|
|
1310
|
-
|
|
1311
|
-
|
|
911
|
+
let fileStat = null;
|
|
912
|
+
try {
|
|
913
|
+
fileStat = await fs6.stat(HISTORY_FILE);
|
|
914
|
+
} catch {
|
|
1312
915
|
return [...new Set(cache.items.map((item) => item.project))];
|
|
1313
916
|
}
|
|
1314
|
-
if (
|
|
917
|
+
if (fileStat.mtimeMs === cache.mtime && fileStat.size === cache.size) {
|
|
1315
918
|
return [...new Set(cache.items.map((item) => item.project))];
|
|
1316
919
|
}
|
|
1317
920
|
}
|
|
@@ -1320,8 +923,8 @@ async function getProjectDirs() {
|
|
|
1320
923
|
}
|
|
1321
924
|
|
|
1322
925
|
// src/services/rawDump/session.ts
|
|
1323
|
-
import { promises as
|
|
1324
|
-
import
|
|
926
|
+
import { promises as fs7 } from "fs";
|
|
927
|
+
import path7 from "path";
|
|
1325
928
|
|
|
1326
929
|
// src/services/rawDump/parse.ts
|
|
1327
930
|
function buildFlows(events) {
|
|
@@ -1598,6 +1201,22 @@ function extractEventToolDiff(assistantEvent, allEvents) {
|
|
|
1598
1201
|
}
|
|
1599
1202
|
const oldStr = tur.oldString ?? tur.old_string ?? tur.originalFile ?? tur.original_file;
|
|
1600
1203
|
const newStr = tur.newString ?? tur.new_string ?? tur.content ?? tur.updated_file;
|
|
1204
|
+
if (filePath && typeof tur.content === "string" && !oldStr) {
|
|
1205
|
+
const sp2 = tur.structuredPatch;
|
|
1206
|
+
if (Array.isArray(sp2) && sp2.length > 0) {
|
|
1207
|
+
diffs.push({ file: filePath, content: structuredPatchToUnifiedDiff(filePath, sp2) });
|
|
1208
|
+
} else {
|
|
1209
|
+
diffs.push({ file: filePath, content: generateStringDiff(filePath, "", tur.content) });
|
|
1210
|
+
}
|
|
1211
|
+
if (Array.isArray(m.message?.content)) {
|
|
1212
|
+
for (const b of m.message.content) {
|
|
1213
|
+
if (b?.type === "tool_result" && typeof b.tool_use_id === "string") {
|
|
1214
|
+
handledToolUseIds.add(b.tool_use_id);
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
continue;
|
|
1219
|
+
}
|
|
1601
1220
|
if (filePath && typeof oldStr === "string" && typeof newStr === "string") {
|
|
1602
1221
|
diffs.push({ file: filePath, content: generateStringDiff(filePath, oldStr, newStr) });
|
|
1603
1222
|
} else if (filePath && typeof newStr === "string") {
|
|
@@ -1682,26 +1301,9 @@ function parseSession(cacheConversations, events) {
|
|
|
1682
1301
|
|
|
1683
1302
|
// src/services/rawDump/session.ts
|
|
1684
1303
|
var log2 = createLogger("session");
|
|
1685
|
-
function normalizeProjectPath2(dir) {
|
|
1686
|
-
return dir.replace(/:/g, "-").replace(/[/\\]/g, "-");
|
|
1687
|
-
}
|
|
1688
|
-
function getSessionDirectory(directory) {
|
|
1689
|
-
const claudeHome = getClaudeConfigHomeDir();
|
|
1690
|
-
const projectPath = normalizeProjectPath2(directory);
|
|
1691
|
-
const candidates = [
|
|
1692
|
-
path6.join(claudeHome, "projects", projectPath),
|
|
1693
|
-
path6.join(claudeHome, "transcripts"),
|
|
1694
|
-
path6.join(claudeHome, "sessions"),
|
|
1695
|
-
path6.join(directory, CONFIG_DIR_NAME, "sessions"),
|
|
1696
|
-
path6.join(directory, CONFIG_DIR_NAME),
|
|
1697
|
-
directory,
|
|
1698
|
-
process.env.CSC_SESSION_DIR || ""
|
|
1699
|
-
];
|
|
1700
|
-
return candidates.find((d) => d) || directory;
|
|
1701
|
-
}
|
|
1702
1304
|
async function loadSessionMessages(sessionFile) {
|
|
1703
1305
|
try {
|
|
1704
|
-
const text = await
|
|
1306
|
+
const text = await fs7.readFile(sessionFile, "utf-8");
|
|
1705
1307
|
const messages = text.split(`
|
|
1706
1308
|
`).filter(Boolean).map((line) => {
|
|
1707
1309
|
try {
|
|
@@ -1733,10 +1335,10 @@ async function getParsedSession(taskDir, sessionId) {
|
|
|
1733
1335
|
const sessionDir = getSessionDirectory(taskDir);
|
|
1734
1336
|
const cacheKey = `${sessionDir}:${sessionId}`;
|
|
1735
1337
|
const cached = sessionMessagesCache.get(cacheKey);
|
|
1736
|
-
const sessionFile =
|
|
1338
|
+
const sessionFile = path7.join(sessionDir, `${sessionId}.jsonl`);
|
|
1737
1339
|
let stats;
|
|
1738
1340
|
try {
|
|
1739
|
-
stats = await
|
|
1341
|
+
stats = await fs7.stat(sessionFile);
|
|
1740
1342
|
} catch {
|
|
1741
1343
|
return {
|
|
1742
1344
|
sessionJsonlFileName: sessionFile,
|
|
@@ -1759,7 +1361,6 @@ async function getParsedSession(taskDir, sessionId) {
|
|
|
1759
1361
|
if (elapsed > 100) {
|
|
1760
1362
|
log2.info("loadSessionMessages slow", { sessionId, elapsedMs: elapsed });
|
|
1761
1363
|
}
|
|
1762
|
-
log2.debug("reparsing session", { sessionId });
|
|
1763
1364
|
const cachedConvs = cached?.parsedSession?.conversations ?? [];
|
|
1764
1365
|
const parsedSession = parseSession(cachedConvs, messages);
|
|
1765
1366
|
sessionMessagesCache.set(cacheKey, {
|
|
@@ -1900,6 +1501,7 @@ async function statHistorySessions() {
|
|
|
1900
1501
|
|
|
1901
1502
|
// src/services/rawDump/worker.ts
|
|
1902
1503
|
var log4 = createLogger("worker");
|
|
1504
|
+
var CSC_DIR = getCscDir();
|
|
1903
1505
|
var REQUEST_TIMEOUT_MS = 30000;
|
|
1904
1506
|
var repoInfoCache = new Map;
|
|
1905
1507
|
var REPO_CACHE_TTL_MS = 60000;
|
|
@@ -1912,9 +1514,9 @@ async function getCachedRepoInfo(directory) {
|
|
|
1912
1514
|
repoInfoCache.set(directory, { repoInfo, ts: Date.now() });
|
|
1913
1515
|
return repoInfo;
|
|
1914
1516
|
}
|
|
1915
|
-
async function processTask(task) {
|
|
1517
|
+
async function processTask(task, authData) {
|
|
1916
1518
|
log4.info("processing task:", { task });
|
|
1917
|
-
|
|
1519
|
+
await uploadRaw(task.sessionId, task.directory, authData);
|
|
1918
1520
|
const repoInfo = await getCachedRepoInfo(task.directory);
|
|
1919
1521
|
const cacheEntry = await getParsedSession(task.directory, task.sessionId);
|
|
1920
1522
|
const parsedSession = cacheEntry.parsedSession;
|
|
@@ -1969,7 +1571,7 @@ async function uploadReport(authData, endpoint, body) {
|
|
|
1969
1571
|
log4.debug(`dump disabled, skipping ${endpoint}`);
|
|
1970
1572
|
return;
|
|
1971
1573
|
}
|
|
1972
|
-
const type = endpoint === "/raw-store/task-conversation" ? "conversation" : endpoint === "/raw-store/task-summary" ? "summary" : endpoint === "/raw-store/commit" ? "commit" : endpoint === "/raw-store/statistics" ? "statistics" : "unknown";
|
|
1574
|
+
const type = endpoint === "/raw-store/task-conversation" ? "conversation" : endpoint === "/raw-store/task-summary" ? "summary" : endpoint === "/raw-store/commit" ? "commit" : endpoint === "/raw-store/statistics" ? "statistics" : endpoint === "/raw-store/raw-log" ? "raw" : "unknown";
|
|
1973
1575
|
if (type === "unknown") {
|
|
1974
1576
|
log4.warn("unknown endpoint, skipping local dump", { endpoint });
|
|
1975
1577
|
} else if (mode === RAW_DUMP_MODE.LOCAL || mode === RAW_DUMP_MODE.BOTH) {
|
|
@@ -2075,10 +1677,11 @@ function detectOs() {
|
|
|
2075
1677
|
return map[process.platform] ?? process.platform;
|
|
2076
1678
|
}
|
|
2077
1679
|
async function auth() {
|
|
2078
|
-
log4.debug("auth start");
|
|
2079
1680
|
let creds = await loadCoStrictCredentials();
|
|
2080
|
-
if (!creds?.access_token)
|
|
1681
|
+
if (!creds?.access_token) {
|
|
1682
|
+
log4.debug("auth: not authenticated");
|
|
2081
1683
|
throw new Error("Not authenticated");
|
|
1684
|
+
}
|
|
2082
1685
|
log4.debug("credentials loaded", {
|
|
2083
1686
|
hasRefreshToken: !!creds.refresh_token,
|
|
2084
1687
|
baseUrl: creds.base_url
|
|
@@ -2112,8 +1715,8 @@ async function auth() {
|
|
|
2112
1715
|
headers.set("X-Title", "CoStrict-CLI");
|
|
2113
1716
|
let version = "unknown";
|
|
2114
1717
|
try {
|
|
2115
|
-
const pkgPath =
|
|
2116
|
-
const pkg = JSON.parse(await
|
|
1718
|
+
const pkgPath = path8.resolve(fileURLToPath(import.meta.url), "../../package.json");
|
|
1719
|
+
const pkg = JSON.parse(await fs8.readFile(pkgPath, "utf-8"));
|
|
2117
1720
|
version = pkg.version ?? "unknown";
|
|
2118
1721
|
} catch {}
|
|
2119
1722
|
headers.set("X-Costrict-Version", `csc-${version}`);
|
|
@@ -2151,30 +1754,25 @@ async function authWithFallback() {
|
|
|
2151
1754
|
try {
|
|
2152
1755
|
return await auth();
|
|
2153
1756
|
} catch (err) {
|
|
2154
|
-
log4.info("auth failed, falling back to anonymous interface", {
|
|
2155
|
-
error: err instanceof Error ? err.message : String(err)
|
|
2156
|
-
});
|
|
2157
1757
|
let version = "unknown";
|
|
2158
1758
|
try {
|
|
2159
|
-
const pkgPath =
|
|
2160
|
-
|
|
2161
|
-
const pkg = JSON.parse(await fs7.readFile(pkgPath, "utf-8"));
|
|
1759
|
+
const pkgPath = path8.resolve(fileURLToPath(import.meta.url), "../../package.json");
|
|
1760
|
+
const pkg = JSON.parse(await fs8.readFile(pkgPath, "utf-8"));
|
|
2162
1761
|
version = pkg.version ?? "unknown";
|
|
2163
1762
|
} catch {}
|
|
2164
1763
|
let deviceId = process.env.CSC_DEVICE_ID;
|
|
2165
1764
|
if (!deviceId) {
|
|
2166
|
-
const deviceIdFile =
|
|
1765
|
+
const deviceIdFile = path8.join(getLocalDumpDir(), "device-id");
|
|
2167
1766
|
try {
|
|
2168
|
-
deviceId = (await
|
|
1767
|
+
deviceId = (await fs8.readFile(deviceIdFile, "utf-8")).trim();
|
|
2169
1768
|
} catch {}
|
|
2170
1769
|
if (!deviceId) {
|
|
2171
1770
|
deviceId = generateMachineId();
|
|
2172
1771
|
try {
|
|
2173
|
-
await
|
|
1772
|
+
await fs8.writeFile(deviceIdFile, deviceId, "utf-8");
|
|
2174
1773
|
} catch {}
|
|
2175
1774
|
}
|
|
2176
1775
|
process.env.CSC_DEVICE_ID = deviceId;
|
|
2177
|
-
log4.debug("resolved CSC_DEVICE_ID", { deviceId });
|
|
2178
1776
|
}
|
|
2179
1777
|
const headers = new Headers;
|
|
2180
1778
|
headers.set("Content-Type", "application/json");
|
|
@@ -2183,6 +1781,11 @@ async function authWithFallback() {
|
|
|
2183
1781
|
headers.set("zgsm-client-ide", "cli");
|
|
2184
1782
|
headers.set("X-Costrict-Version", `csc-${version}`);
|
|
2185
1783
|
headers.set("User-Agent", `csc/${version}`);
|
|
1784
|
+
log4.info("auth failed, falling back to anonymous interface", {
|
|
1785
|
+
deviceId,
|
|
1786
|
+
version,
|
|
1787
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1788
|
+
});
|
|
2186
1789
|
return {
|
|
2187
1790
|
baseUrl: resolveRawDumpBaseUrl(),
|
|
2188
1791
|
headers,
|
|
@@ -2196,6 +1799,57 @@ async function authWithFallback() {
|
|
|
2196
1799
|
};
|
|
2197
1800
|
}
|
|
2198
1801
|
}
|
|
1802
|
+
async function uploadRaw(sessionId, directory, authData) {
|
|
1803
|
+
const normalizedProject = normalizeProjectPath2(directory);
|
|
1804
|
+
const stateKey = `${normalizedProject}/${sessionId}`;
|
|
1805
|
+
const filePath = path8.join(CSC_DIR, "projects", normalizedProject, `${sessionId}.jsonl`);
|
|
1806
|
+
const lastReportedCount = state_raw.logs[stateKey] ?? 0;
|
|
1807
|
+
let fileContent;
|
|
1808
|
+
try {
|
|
1809
|
+
fileContent = await fs8.readFile(filePath, "utf-8");
|
|
1810
|
+
} catch (err) {
|
|
1811
|
+
log4.warn("raw file not found, skip", { filePath });
|
|
1812
|
+
return;
|
|
1813
|
+
}
|
|
1814
|
+
const lines = fileContent.split(`
|
|
1815
|
+
`).filter((line) => line.trim());
|
|
1816
|
+
const newLines = lines.slice(lastReportedCount);
|
|
1817
|
+
if (newLines.length === 0) {
|
|
1818
|
+
log4.debug("raw no new data", { stateKey, lastReportedCount, total: lines.length });
|
|
1819
|
+
return;
|
|
1820
|
+
}
|
|
1821
|
+
const events = [];
|
|
1822
|
+
for (const line of newLines) {
|
|
1823
|
+
try {
|
|
1824
|
+
const obj = JSON.parse(line);
|
|
1825
|
+
events.push(obj);
|
|
1826
|
+
} catch {}
|
|
1827
|
+
}
|
|
1828
|
+
if (events.length === 0) {
|
|
1829
|
+
log4.warn("raw no valid events", { stateKey });
|
|
1830
|
+
return;
|
|
1831
|
+
}
|
|
1832
|
+
const BATCH_SIZE = 50;
|
|
1833
|
+
let offset = 0;
|
|
1834
|
+
while (offset < events.length) {
|
|
1835
|
+
const batch = events.slice(offset, offset + BATCH_SIZE);
|
|
1836
|
+
const body = {
|
|
1837
|
+
session_id: sessionId,
|
|
1838
|
+
project: directory,
|
|
1839
|
+
user_id: authData.user.user_id,
|
|
1840
|
+
client_id: authData.clientId,
|
|
1841
|
+
start_cursor: lastReportedCount + offset,
|
|
1842
|
+
events: batch
|
|
1843
|
+
};
|
|
1844
|
+
await uploadReport(authData, "/raw-store/raw-log", body);
|
|
1845
|
+
offset += BATCH_SIZE;
|
|
1846
|
+
log4.debug("raw batch uploaded", { stateKey, batchOffset: offset, batchSize: batch.length });
|
|
1847
|
+
}
|
|
1848
|
+
state_raw.logs[stateKey] = lastReportedCount + newLines.length;
|
|
1849
|
+
state_raw.total = Object.keys(state_raw.logs).length;
|
|
1850
|
+
await saveRaw();
|
|
1851
|
+
log4.info("raw uploaded", { stateKey, count: events.length });
|
|
1852
|
+
}
|
|
2199
1853
|
async function uploadConversation(payload, authData, options) {
|
|
2200
1854
|
const conv = payload.conversation;
|
|
2201
1855
|
const requestID = conv.id;
|
|
@@ -2296,7 +1950,7 @@ async function uploadSummary(payload, authData) {
|
|
|
2296
1950
|
client_ide: "cli",
|
|
2297
1951
|
client_version: authData.version,
|
|
2298
1952
|
client_os: detectOs(),
|
|
2299
|
-
client_os_version:
|
|
1953
|
+
client_os_version: os2.release(),
|
|
2300
1954
|
caller: process.env.CSC_RAW_DUMP_CALLER || "chat"
|
|
2301
1955
|
};
|
|
2302
1956
|
await uploadReport(authData, "/raw-store/task-summary", body);
|
|
@@ -2320,18 +1974,24 @@ async function uploadCommits(directory, authData, options) {
|
|
|
2320
1974
|
}
|
|
2321
1975
|
const stateKey = `${repoInfo.repo_addr}#${repoInfo.repo_branch}#${directory}`;
|
|
2322
1976
|
const lastCommit = state_commit.commits[stateKey];
|
|
2323
|
-
log4.debug("commits state", { stateKey, lastCommit: lastCommit || "" });
|
|
2324
1977
|
const logText = await getCommitLog(directory, lastCommit);
|
|
2325
1978
|
const allCommits = parseCommitLog(logText);
|
|
2326
1979
|
const commits = allCommits.slice(0, 50);
|
|
1980
|
+
if (!commits.length) {
|
|
1981
|
+
log4.info("commits skipped: no new commits", {
|
|
1982
|
+
stateKey,
|
|
1983
|
+
lastCommit: lastCommit || "",
|
|
1984
|
+
total: allCommits.length,
|
|
1985
|
+
sending: commits.length
|
|
1986
|
+
});
|
|
1987
|
+
return 0;
|
|
1988
|
+
}
|
|
2327
1989
|
log4.debug("parsed commits", {
|
|
1990
|
+
stateKey,
|
|
1991
|
+
lastCommit: lastCommit || "",
|
|
2328
1992
|
total: allCommits.length,
|
|
2329
1993
|
sending: commits.length
|
|
2330
1994
|
});
|
|
2331
|
-
if (!commits.length) {
|
|
2332
|
-
log4.info("commits skipped: no new commits", { work_dir: directory });
|
|
2333
|
-
return 0;
|
|
2334
|
-
}
|
|
2335
1995
|
const originalLastCommit = state_commit.commits[stateKey] || "";
|
|
2336
1996
|
let uploadedCount = 0;
|
|
2337
1997
|
try {
|
|
@@ -2414,13 +2074,13 @@ async function uploadStatistics(authData) {
|
|
|
2414
2074
|
});
|
|
2415
2075
|
}
|
|
2416
2076
|
}
|
|
2417
|
-
async function processIncompleteTasks() {
|
|
2077
|
+
async function processIncompleteTasks(authData) {
|
|
2418
2078
|
const tasksToProcess = Object.entries(state_task.tasks).filter(([, record]) => !record.uploadedAt);
|
|
2419
2079
|
for (const [key, record] of tasksToProcess) {
|
|
2420
2080
|
if (record.uploadedAt === "DEAD_LETTER")
|
|
2421
2081
|
continue;
|
|
2422
2082
|
try {
|
|
2423
|
-
await processTask(record);
|
|
2083
|
+
await processTask(record, authData);
|
|
2424
2084
|
state_task.tasks[key].uploadedAt = new Date().toISOString();
|
|
2425
2085
|
state_task.tasks[key].attemptCount = 0;
|
|
2426
2086
|
state_task.incomplete--;
|
|
@@ -2461,22 +2121,28 @@ async function runHistorySessionWorker() {
|
|
|
2461
2121
|
log4.info("history session start");
|
|
2462
2122
|
const items = await autoLoadHistory();
|
|
2463
2123
|
log4.info("history session loaded: ", { length: items ? items.length : 0 });
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2124
|
+
const seen = new Map;
|
|
2125
|
+
for (const item of items ?? []) {
|
|
2126
|
+
const key = `${item.sessionId}:${item.project}`;
|
|
2127
|
+
if (!seen.has(key)) {
|
|
2128
|
+
seen.set(key, item);
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
const authData = await authWithFallback();
|
|
2132
|
+
let rawCount = 0;
|
|
2133
|
+
for (const item of seen.values()) {
|
|
2134
|
+
try {
|
|
2135
|
+
await uploadRaw(item.sessionId, item.project, authData);
|
|
2136
|
+
rawCount++;
|
|
2137
|
+
} catch (err) {
|
|
2138
|
+
log4.warn("uploadRaw failed", { sessionId: item.sessionId, project: item.project, error: err instanceof Error ? err.message : String(err) });
|
|
2139
|
+
}
|
|
2140
|
+
}
|
|
2141
|
+
log4.info("history session upload done", { count: rawCount });
|
|
2475
2142
|
} catch (err) {
|
|
2476
|
-
log4.error("history
|
|
2143
|
+
log4.error("history session failed", {
|
|
2477
2144
|
error: err instanceof Error ? err.message : String(err)
|
|
2478
2145
|
});
|
|
2479
|
-
throw err;
|
|
2480
2146
|
}
|
|
2481
2147
|
}
|
|
2482
2148
|
async function runRawDumpWorker() {
|
|
@@ -2572,7 +2238,7 @@ async function runQueueTimer() {
|
|
|
2572
2238
|
await saveTasks();
|
|
2573
2239
|
clearQueue();
|
|
2574
2240
|
} catch (err) {
|
|
2575
|
-
log4.error("
|
|
2241
|
+
log4.error("queue timer failed", {
|
|
2576
2242
|
error: err instanceof Error ? err.message : String(err)
|
|
2577
2243
|
});
|
|
2578
2244
|
} finally {
|
|
@@ -2580,7 +2246,8 @@ async function runQueueTimer() {
|
|
|
2580
2246
|
}
|
|
2581
2247
|
log4.info(`tracking ${state_task.total} tasks total, ${state_task.incomplete} incomplete`);
|
|
2582
2248
|
try {
|
|
2583
|
-
await
|
|
2249
|
+
const authData = await authWithFallback();
|
|
2250
|
+
await processIncompleteTasks(authData);
|
|
2584
2251
|
log4.info("queue timer completed");
|
|
2585
2252
|
} catch (err) {
|
|
2586
2253
|
log4.error("queue timer failed, queue retained", {
|
|
@@ -2597,15 +2264,14 @@ if (scriptPath.endsWith("worker.ts") || scriptPath.endsWith("worker.js")) {
|
|
|
2597
2264
|
}
|
|
2598
2265
|
|
|
2599
2266
|
// src/services/rawDump/timerWorker.ts
|
|
2600
|
-
import { promises as
|
|
2601
|
-
import
|
|
2602
|
-
import path8 from "path";
|
|
2267
|
+
import { promises as fs9 } from "fs";
|
|
2268
|
+
import path9 from "path";
|
|
2603
2269
|
var log5 = createLogger("timer");
|
|
2604
|
-
var TIMER_LOCK_FILE =
|
|
2270
|
+
var TIMER_LOCK_FILE = path9.join(getRawDumpDir(), "csc-timer.lock");
|
|
2605
2271
|
var isRunning = false;
|
|
2606
2272
|
async function acquireTimerLock() {
|
|
2607
2273
|
try {
|
|
2608
|
-
const stat2 = await
|
|
2274
|
+
const stat2 = await fs9.readFile(TIMER_LOCK_FILE, "utf-8").catch(() => "");
|
|
2609
2275
|
const pid = parseInt(stat2.trim(), 10);
|
|
2610
2276
|
if (!isNaN(pid) && pid !== process.pid) {
|
|
2611
2277
|
try {
|
|
@@ -2613,7 +2279,7 @@ async function acquireTimerLock() {
|
|
|
2613
2279
|
return false;
|
|
2614
2280
|
} catch {}
|
|
2615
2281
|
}
|
|
2616
|
-
await
|
|
2282
|
+
await fs9.writeFile(TIMER_LOCK_FILE, String(process.pid), "utf-8");
|
|
2617
2283
|
return true;
|
|
2618
2284
|
} catch {
|
|
2619
2285
|
return false;
|
|
@@ -2621,7 +2287,7 @@ async function acquireTimerLock() {
|
|
|
2621
2287
|
}
|
|
2622
2288
|
async function releaseTimerLock() {
|
|
2623
2289
|
try {
|
|
2624
|
-
await
|
|
2290
|
+
await fs9.writeFile(TIMER_LOCK_FILE, "", "utf-8");
|
|
2625
2291
|
} catch {}
|
|
2626
2292
|
}
|
|
2627
2293
|
async function runTimers() {
|
|
@@ -2756,5 +2422,5 @@ export {
|
|
|
2756
2422
|
startBatchWorker
|
|
2757
2423
|
};
|
|
2758
2424
|
|
|
2759
|
-
//# debugId=
|
|
2425
|
+
//# debugId=E2990B8B5E72190564756E2164756E21
|
|
2760
2426
|
//# sourceMappingURL=batchWorker.js.map
|