replicas-engine 0.1.234 → 0.1.236
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/src/index.js +81 -42
- package/package.json +1 -1
package/dist/src/index.js
CHANGED
|
@@ -1783,7 +1783,7 @@ function isClaudeAuthErrorText(text) {
|
|
|
1783
1783
|
}
|
|
1784
1784
|
|
|
1785
1785
|
// ../shared/src/engine/environment.ts
|
|
1786
|
-
var DAYTONA_SNAPSHOT_ID = "29-05-2026-royal-york-
|
|
1786
|
+
var DAYTONA_SNAPSHOT_ID = "29-05-2026-royal-york-v7";
|
|
1787
1787
|
var DESKTOP_NOVNC_PORT = 6080;
|
|
1788
1788
|
|
|
1789
1789
|
// ../shared/src/engine/types.ts
|
|
@@ -3260,33 +3260,67 @@ var EnvironmentDetailsService = class {
|
|
|
3260
3260
|
var environmentDetailsService = new EnvironmentDetailsService();
|
|
3261
3261
|
|
|
3262
3262
|
// src/services/start-hook-logs-service.ts
|
|
3263
|
-
import { createHash } from "crypto";
|
|
3264
3263
|
import { mkdir as mkdir4, readFile as readFile3, writeFile as writeFile3, readdir as readdir2 } from "fs/promises";
|
|
3265
3264
|
import { homedir as homedir6 } from "os";
|
|
3266
3265
|
import { join as join8 } from "path";
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
return `repo-${
|
|
3266
|
+
|
|
3267
|
+
// src/services/hook-log-files.ts
|
|
3268
|
+
import { createHash } from "crypto";
|
|
3269
|
+
var ENVIRONMENT_HOOK_LOG_FILENAME = "environment.json";
|
|
3270
|
+
function repoHookLogFilename(repoName) {
|
|
3271
|
+
const safe = repoName.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
3272
|
+
const hash = createHash("sha256").update(repoName).digest("hex").slice(0, 8);
|
|
3273
|
+
return `repo-${safe}-${hash}.json`;
|
|
3275
3274
|
}
|
|
3275
|
+
|
|
3276
|
+
// src/services/start-hook-logs-service.ts
|
|
3277
|
+
var LOGS_DIR = join8(homedir6(), ".replicas", "start-hook-logs");
|
|
3276
3278
|
function withPreview(stored) {
|
|
3277
3279
|
const preview = buildHookOutputPreview(stored.output);
|
|
3278
3280
|
return { ...stored, ...preview };
|
|
3279
3281
|
}
|
|
3282
|
+
function isObject(value) {
|
|
3283
|
+
return typeof value === "object" && value !== null;
|
|
3284
|
+
}
|
|
3285
|
+
function optionalString(value) {
|
|
3286
|
+
return typeof value === "string" ? value : void 0;
|
|
3287
|
+
}
|
|
3288
|
+
function normalizeStored(raw) {
|
|
3289
|
+
if (!isObject(raw)) return null;
|
|
3290
|
+
if (typeof raw.output !== "string" || typeof raw.exitCode !== "number") return null;
|
|
3291
|
+
const hookType = raw.hookType === "environment" ? "environment" : "repository";
|
|
3292
|
+
const repoNameField = optionalString(raw.repoName);
|
|
3293
|
+
const hookName = optionalString(raw.hookName) ?? repoNameField ?? "";
|
|
3294
|
+
const repoName = repoNameField ?? hookName;
|
|
3295
|
+
const hookCommands = Array.isArray(raw.hookCommands) ? raw.hookCommands.filter((c) => typeof c === "string") : [];
|
|
3296
|
+
return {
|
|
3297
|
+
hookType,
|
|
3298
|
+
hookName,
|
|
3299
|
+
repoName,
|
|
3300
|
+
hookCommands,
|
|
3301
|
+
output: raw.output,
|
|
3302
|
+
exitCode: raw.exitCode,
|
|
3303
|
+
timedOut: typeof raw.timedOut === "boolean" ? raw.timedOut : false,
|
|
3304
|
+
executedAt: optionalString(raw.executedAt) ?? ""
|
|
3305
|
+
};
|
|
3306
|
+
}
|
|
3280
3307
|
var StartHookLogsService = class {
|
|
3281
3308
|
async ensureDir() {
|
|
3282
3309
|
await mkdir4(LOGS_DIR, { recursive: true });
|
|
3283
3310
|
}
|
|
3284
|
-
async
|
|
3311
|
+
async saveLog(hookType, hookName, entry) {
|
|
3285
3312
|
await this.ensureDir();
|
|
3286
|
-
const log = { repoName, ...entry };
|
|
3287
|
-
|
|
3313
|
+
const log = { hookType, hookName, repoName: hookName, ...entry };
|
|
3314
|
+
const filename = hookType === "environment" ? ENVIRONMENT_HOOK_LOG_FILENAME : repoHookLogFilename(hookName);
|
|
3315
|
+
await writeFile3(join8(LOGS_DIR, filename), `${JSON.stringify(log, null, 2)}
|
|
3288
3316
|
`, "utf-8");
|
|
3289
3317
|
}
|
|
3318
|
+
async saveEnvironmentLog(entry) {
|
|
3319
|
+
await this.saveLog("environment", "environment", entry);
|
|
3320
|
+
}
|
|
3321
|
+
async saveRepoLog(repoName, entry) {
|
|
3322
|
+
await this.saveLog("repository", repoName, entry);
|
|
3323
|
+
}
|
|
3290
3324
|
async getAllLogs() {
|
|
3291
3325
|
let files;
|
|
3292
3326
|
try {
|
|
@@ -3304,19 +3338,27 @@ var StartHookLogsService = class {
|
|
|
3304
3338
|
}
|
|
3305
3339
|
try {
|
|
3306
3340
|
const raw = await readFile3(join8(LOGS_DIR, file), "utf-8");
|
|
3307
|
-
const stored = JSON.parse(raw);
|
|
3308
|
-
|
|
3341
|
+
const stored = normalizeStored(JSON.parse(raw));
|
|
3342
|
+
if (stored) {
|
|
3343
|
+
logs.push(withPreview(stored));
|
|
3344
|
+
}
|
|
3309
3345
|
} catch {
|
|
3310
3346
|
}
|
|
3311
3347
|
}
|
|
3312
|
-
logs.sort((a, b) =>
|
|
3348
|
+
logs.sort((a, b) => {
|
|
3349
|
+
if (a.hookType !== b.hookType) {
|
|
3350
|
+
return a.hookType === "environment" ? -1 : 1;
|
|
3351
|
+
}
|
|
3352
|
+
return a.hookName.localeCompare(b.hookName);
|
|
3353
|
+
});
|
|
3313
3354
|
return logs;
|
|
3314
3355
|
}
|
|
3315
|
-
async getFullOutput(
|
|
3356
|
+
async getFullOutput(hookType, hookName) {
|
|
3357
|
+
const filename = hookType === "environment" ? ENVIRONMENT_HOOK_LOG_FILENAME : repoHookLogFilename(hookName);
|
|
3316
3358
|
try {
|
|
3317
|
-
const raw = await readFile3(join8(LOGS_DIR,
|
|
3318
|
-
const stored = JSON.parse(raw);
|
|
3319
|
-
if (stored.
|
|
3359
|
+
const raw = await readFile3(join8(LOGS_DIR, filename), "utf-8");
|
|
3360
|
+
const stored = normalizeStored(JSON.parse(raw));
|
|
3361
|
+
if (!stored || stored.hookType !== hookType || stored.hookName !== hookName) {
|
|
3320
3362
|
return null;
|
|
3321
3363
|
}
|
|
3322
3364
|
return stored.output;
|
|
@@ -3565,6 +3607,13 @@ Repositories: ${hookEntries.length}
|
|
|
3565
3607
|
onOutputChunk: (chunk) => onEvent({ type: "output", data: chunk, label: "environment" })
|
|
3566
3608
|
});
|
|
3567
3609
|
recordResult(envResult);
|
|
3610
|
+
await startHookLogsService.saveEnvironmentLog({
|
|
3611
|
+
hookCommands: [envHookContent],
|
|
3612
|
+
output: envResult.output.join(""),
|
|
3613
|
+
exitCode: envResult.exitCode,
|
|
3614
|
+
timedOut: envResult.timedOut,
|
|
3615
|
+
executedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3616
|
+
});
|
|
3568
3617
|
} else {
|
|
3569
3618
|
await environmentDetailsService.setEnvironmentStartHook("n/a");
|
|
3570
3619
|
}
|
|
@@ -9224,26 +9273,12 @@ import { existsSync as existsSync8 } from "fs";
|
|
|
9224
9273
|
import { join as join19 } from "path";
|
|
9225
9274
|
|
|
9226
9275
|
// src/services/warm-hook-logs-service.ts
|
|
9227
|
-
import { createHash as createHash2 } from "crypto";
|
|
9228
9276
|
import { mkdir as mkdir12, readFile as readFile11, writeFile as writeFile7, readdir as readdir5, appendFile as appendFile6, unlink as unlink3 } from "fs/promises";
|
|
9229
9277
|
import { homedir as homedir15 } from "os";
|
|
9230
9278
|
import { join as join18 } from "path";
|
|
9231
9279
|
var LOGS_DIR2 = join18(homedir15(), ".replicas", "warm-hook-logs");
|
|
9232
9280
|
var CURRENT_RUN_LOG = join18(LOGS_DIR2, "current-run.log");
|
|
9233
|
-
|
|
9234
|
-
const safe = name.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
9235
|
-
const hash = createHash2("sha256").update(name).digest("hex").slice(0, 8);
|
|
9236
|
-
return `${safe}-${hash}`;
|
|
9237
|
-
}
|
|
9238
|
-
function globalFilename() {
|
|
9239
|
-
return "global.json";
|
|
9240
|
-
}
|
|
9241
|
-
function environmentFilename() {
|
|
9242
|
-
return "environment.json";
|
|
9243
|
-
}
|
|
9244
|
-
function repoFilename2(repoName) {
|
|
9245
|
-
return `repo-${sanitizeFilename2(repoName)}.json`;
|
|
9246
|
-
}
|
|
9281
|
+
var GLOBAL_FILENAME = "global.json";
|
|
9247
9282
|
function withPreview2(stored) {
|
|
9248
9283
|
const preview = buildHookOutputPreview(stored.output);
|
|
9249
9284
|
return { ...stored, ...preview };
|
|
@@ -9259,7 +9294,7 @@ var WarmHookLogsService = class {
|
|
|
9259
9294
|
hookName: "organization",
|
|
9260
9295
|
...entry
|
|
9261
9296
|
};
|
|
9262
|
-
await writeFile7(join18(LOGS_DIR2,
|
|
9297
|
+
await writeFile7(join18(LOGS_DIR2, GLOBAL_FILENAME), `${JSON.stringify(log, null, 2)}
|
|
9263
9298
|
`, "utf-8");
|
|
9264
9299
|
}
|
|
9265
9300
|
async saveEnvironmentHookLog(entry) {
|
|
@@ -9269,7 +9304,7 @@ var WarmHookLogsService = class {
|
|
|
9269
9304
|
hookName: "environment",
|
|
9270
9305
|
...entry
|
|
9271
9306
|
};
|
|
9272
|
-
await writeFile7(join18(LOGS_DIR2,
|
|
9307
|
+
await writeFile7(join18(LOGS_DIR2, ENVIRONMENT_HOOK_LOG_FILENAME), `${JSON.stringify(log, null, 2)}
|
|
9273
9308
|
`, "utf-8");
|
|
9274
9309
|
}
|
|
9275
9310
|
async saveRepoHookLog(repoName, entry) {
|
|
@@ -9279,7 +9314,7 @@ var WarmHookLogsService = class {
|
|
|
9279
9314
|
hookName: repoName,
|
|
9280
9315
|
...entry
|
|
9281
9316
|
};
|
|
9282
|
-
await writeFile7(join18(LOGS_DIR2,
|
|
9317
|
+
await writeFile7(join18(LOGS_DIR2, repoHookLogFilename(repoName)), `${JSON.stringify(log, null, 2)}
|
|
9283
9318
|
`, "utf-8");
|
|
9284
9319
|
}
|
|
9285
9320
|
async getAllLogs() {
|
|
@@ -9334,7 +9369,7 @@ var WarmHookLogsService = class {
|
|
|
9334
9369
|
}
|
|
9335
9370
|
}
|
|
9336
9371
|
async getFullOutput(hookType, hookName) {
|
|
9337
|
-
const filename = hookType === "global" ?
|
|
9372
|
+
const filename = hookType === "global" ? GLOBAL_FILENAME : hookType === "environment" ? ENVIRONMENT_HOOK_LOG_FILENAME : repoHookLogFilename(hookName);
|
|
9338
9373
|
try {
|
|
9339
9374
|
const raw = await readFile11(join18(LOGS_DIR2, filename), "utf-8");
|
|
9340
9375
|
const stored = JSON.parse(raw);
|
|
@@ -10172,10 +10207,14 @@ function createV1Routes(deps) {
|
|
|
10172
10207
|
);
|
|
10173
10208
|
}
|
|
10174
10209
|
});
|
|
10175
|
-
app2.get("/start-hooks/logs/:
|
|
10210
|
+
app2.get("/start-hooks/logs/:hookType/:hookName/full", async (c) => {
|
|
10176
10211
|
try {
|
|
10177
|
-
const
|
|
10178
|
-
const
|
|
10212
|
+
const hookType = c.req.param("hookType");
|
|
10213
|
+
const hookName = c.req.param("hookName");
|
|
10214
|
+
if (hookType !== "environment" && hookType !== "repository") {
|
|
10215
|
+
return c.json(jsonError("Invalid hookType", 'Must be "environment" or "repository"'), 400);
|
|
10216
|
+
}
|
|
10217
|
+
const output = await startHookLogsService.getFullOutput(hookType, hookName);
|
|
10179
10218
|
if (output === null) {
|
|
10180
10219
|
return c.json(jsonError("Start hook log not found"), 404);
|
|
10181
10220
|
}
|