replicas-engine 0.1.235 → 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.
Files changed (2) hide show
  1. package/dist/src/index.js +81 -42
  2. 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-v6";
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
- var LOGS_DIR = join8(homedir6(), ".replicas", "start-hook-logs");
3268
- function sanitizeFilename(name) {
3269
- const safe = name.replace(/[^a-zA-Z0-9._-]/g, "_");
3270
- const hash = createHash("sha256").update(name).digest("hex").slice(0, 8);
3271
- return `${safe}-${hash}`;
3272
- }
3273
- function repoFilename(repoName) {
3274
- return `repo-${sanitizeFilename(repoName)}.json`;
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 saveRepoLog(repoName, entry) {
3311
+ async saveLog(hookType, hookName, entry) {
3285
3312
  await this.ensureDir();
3286
- const log = { repoName, ...entry };
3287
- await writeFile3(join8(LOGS_DIR, repoFilename(repoName)), `${JSON.stringify(log, null, 2)}
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
- logs.push(withPreview(stored));
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) => a.repoName.localeCompare(b.repoName));
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(repoName) {
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, repoFilename(repoName)), "utf-8");
3318
- const stored = JSON.parse(raw);
3319
- if (stored.repoName !== repoName) {
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
- function sanitizeFilename2(name) {
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, globalFilename()), `${JSON.stringify(log, null, 2)}
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, environmentFilename()), `${JSON.stringify(log, null, 2)}
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, repoFilename2(repoName)), `${JSON.stringify(log, null, 2)}
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" ? globalFilename() : hookType === "environment" ? environmentFilename() : repoFilename2(hookName);
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/:repoName/full", async (c) => {
10210
+ app2.get("/start-hooks/logs/:hookType/:hookName/full", async (c) => {
10176
10211
  try {
10177
- const repoName = c.req.param("repoName");
10178
- const output = await startHookLogsService.getFullOutput(repoName);
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.235",
3
+ "version": "0.1.236",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",