@monotykamary/localterm-server 2.26.1 → 2.27.1
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/automation-store.d.ts +1 -0
- package/dist/automation-store.d.ts.map +1 -1
- package/dist/automation-store.js +25 -0
- package/dist/automation-store.js.map +1 -1
- package/dist/constants.d.ts +6 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +20 -15
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -16
- package/dist/index.js.map +1 -1
- package/dist/process-store.d.ts +15 -0
- package/dist/process-store.d.ts.map +1 -0
- package/dist/process-store.js +121 -0
- package/dist/process-store.js.map +1 -0
- package/dist/protocol.d.ts +2 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/schemas.d.ts +28 -5
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +60 -17
- package/dist/schemas.js.map +1 -1
- package/dist/secret-shims.d.ts +2 -2
- package/dist/secret-shims.d.ts.map +1 -1
- package/dist/secret-shims.js +28 -23
- package/dist/secret-shims.js.map +1 -1
- package/dist/secret-store.d.ts +1 -0
- package/dist/secret-store.d.ts.map +1 -1
- package/dist/secret-store.js +23 -32
- package/dist/secret-store.js.map +1 -1
- package/dist/types.d.ts +4 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/migrate-secrets-to-processes.d.ts +2 -0
- package/dist/utils/migrate-secrets-to-processes.d.ts.map +1 -0
- package/dist/utils/migrate-secrets-to-processes.js +109 -0
- package/dist/utils/migrate-secrets-to-processes.js.map +1 -0
- package/dist/utils/worktree-sweep.d.ts.map +1 -1
- package/dist/utils/worktree-sweep.js +26 -3
- package/dist/utils/worktree-sweep.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { PROCESSES_FILE_VERSION, PROCESSES_FILENAME, SECRETS_FILE_VERSION } from "../constants.js";
|
|
4
|
+
import { processesFileSchema, processNameSchema, secretsFileSchema, secretsFileV1Schema, } from "../schemas.js";
|
|
5
|
+
// One-time, in-place migration from the pre-flip secret-centric model to the
|
|
6
|
+
// process-centric model. v1 secrets.json stored the binary names a secret shims
|
|
7
|
+
// directly on each entry (`programs`); v2 moves that wiring into a separate
|
|
8
|
+
// processes.json where a process names which secrets it receives (the same
|
|
9
|
+
// multi-select model automations use). The flip is a clean cut-over — the
|
|
10
|
+
// stores only know the new shapes, so this runs once at startup, before they
|
|
11
|
+
// are constructed, and rewrites both files.
|
|
12
|
+
//
|
|
13
|
+
// Idempotent: if secrets.json is already v2 (or absent) it no-ops; if it is v1,
|
|
14
|
+
// it inverts `programs` into processes, merges with any existing processes.json
|
|
15
|
+
// (union of requestedSecrets per process name, deduped, order-stable), writes
|
|
16
|
+
// processes.json, then rewrites secrets.json as v2 with `programs` stripped. A
|
|
17
|
+
// later boot parses the v2 file and no-ops.
|
|
18
|
+
export const migrateSecretsToProcesses = (stateDirectory) => {
|
|
19
|
+
const secretsPath = path.join(stateDirectory, "secrets.json");
|
|
20
|
+
const processesPath = path.join(stateDirectory, PROCESSES_FILENAME);
|
|
21
|
+
let secretsRaw;
|
|
22
|
+
try {
|
|
23
|
+
secretsRaw = fs.readFileSync(secretsPath, "utf8");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
let secretsJson;
|
|
29
|
+
try {
|
|
30
|
+
secretsJson = JSON.parse(secretsRaw);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Already v2 (or some future shape the store will handle) — nothing to migrate.
|
|
36
|
+
if (secretsFileSchema.safeParse(secretsJson).success)
|
|
37
|
+
return;
|
|
38
|
+
const v1 = secretsFileV1Schema.safeParse(secretsJson);
|
|
39
|
+
if (!v1.success)
|
|
40
|
+
return;
|
|
41
|
+
// Invert: for each (secret, program) pair, the program becomes a process that
|
|
42
|
+
// requests that secret. A program listed by several secrets becomes one
|
|
43
|
+
// process requesting all of them, preserving the combined shim the old model
|
|
44
|
+
// produced (buildProgramIndex already merged them per program). Program names
|
|
45
|
+
// are filtered through processNameSchema so a hand-edited v1 file with an
|
|
46
|
+
// invalid name can't produce a processes.json the store then rejects
|
|
47
|
+
// wholesale — invalid names are dropped with a warning instead.
|
|
48
|
+
const migrated = new Map();
|
|
49
|
+
for (const entry of v1.data.secrets) {
|
|
50
|
+
for (const program of entry.programs) {
|
|
51
|
+
const nameParse = processNameSchema.safeParse(program);
|
|
52
|
+
if (!nameParse.success) {
|
|
53
|
+
console.warn(`skipping invalid program name '${program}' during migration`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const set = migrated.get(nameParse.data) ?? new Set();
|
|
57
|
+
set.add(entry.name);
|
|
58
|
+
migrated.set(nameParse.data, set);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Merge with any existing processes.json so a partial/manual processes file
|
|
62
|
+
// isn't clobbered. Union requestedSecrets per name; migrated entries first so
|
|
63
|
+
// an existing process keeps the migrated secrets ahead of its own.
|
|
64
|
+
const existingByName = new Map();
|
|
65
|
+
try {
|
|
66
|
+
const existingRaw = fs.readFileSync(processesPath, "utf8");
|
|
67
|
+
const existing = processesFileSchema.safeParse(JSON.parse(existingRaw));
|
|
68
|
+
if (existing.success) {
|
|
69
|
+
for (const process of existing.data.processes) {
|
|
70
|
+
const set = new Set(process.requestedSecrets);
|
|
71
|
+
existingByName.set(process.name, set);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// absent or invalid — start from the migrated set only
|
|
77
|
+
}
|
|
78
|
+
const merged = new Map();
|
|
79
|
+
for (const [name, secrets] of migrated) {
|
|
80
|
+
const existing = existingByName.get(name);
|
|
81
|
+
const combined = [...secrets];
|
|
82
|
+
if (existing)
|
|
83
|
+
for (const secretName of existing)
|
|
84
|
+
if (!secrets.has(secretName))
|
|
85
|
+
combined.push(secretName);
|
|
86
|
+
merged.set(name, combined);
|
|
87
|
+
existingByName.delete(name);
|
|
88
|
+
}
|
|
89
|
+
for (const [name, secrets] of existingByName) {
|
|
90
|
+
merged.set(name, [...secrets]);
|
|
91
|
+
}
|
|
92
|
+
const processes = [...merged.entries()].map(([name, requestedSecrets]) => ({
|
|
93
|
+
name,
|
|
94
|
+
requestedSecrets,
|
|
95
|
+
}));
|
|
96
|
+
const secrets = v1.data.secrets.map((entry) => ({
|
|
97
|
+
name: entry.name,
|
|
98
|
+
envVar: entry.envVar,
|
|
99
|
+
}));
|
|
100
|
+
writeJson(processesPath, { version: PROCESSES_FILE_VERSION, processes });
|
|
101
|
+
writeJson(secretsPath, { version: SECRETS_FILE_VERSION, secrets });
|
|
102
|
+
};
|
|
103
|
+
const writeJson = (filePath, payload) => {
|
|
104
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
105
|
+
const tmpPath = `${filePath}.tmp`;
|
|
106
|
+
fs.writeFileSync(tmpPath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
|
|
107
|
+
fs.renameSync(tmpPath, filePath);
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=migrate-secrets-to-processes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-secrets-to-processes.js","sourceRoot":"","sources":["../../src/utils/migrate-secrets-to-processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-sweep.d.ts","sourceRoot":"","sources":["../../src/utils/worktree-sweep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-sweep.d.ts","sourceRoot":"","sources":["../../src/utils/worktree-sweep.ts"],"names":[],"mappings":"AAiEA,eAAO,MAAM,mBAAmB,GAC9B,KAAK,MAAM,EACX,MAAK,MAAmB,EACxB,iBAAgB,CAAC,YAAY,EAAE,MAAM,KAAK,OAAqB,KAC9D,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAkC/B,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { WORKTREE_SWEEP_BATCH_LIMIT, WORKTREE_SWEEP_MAX_AGE_DAYS } from "../constants.js";
|
|
3
|
+
import { WORKTREE_SWEEP_BATCH_LIMIT, WORKTREE_SWEEP_MAX_AGE_DAYS, REPO_MARKER_FILENAME, } from "../constants.js";
|
|
4
4
|
import { WORKTREES_PARENT_DIR, listGitWorktrees } from "../git-worktrees.js";
|
|
5
5
|
import { runGit } from "./run-git.js";
|
|
6
6
|
const MS_PER_DAY_MS = 24 * 60 * 60 * 1000;
|
|
@@ -31,12 +31,33 @@ const worktreeAgeMs = (worktreePath, now) => {
|
|
|
31
31
|
return null;
|
|
32
32
|
}
|
|
33
33
|
};
|
|
34
|
+
// After a worktree is removed its project folder may be left holding only the
|
|
35
|
+
// repo-id marker — the sweep just took the last worktree, so the folder is dead
|
|
36
|
+
// weight. Reap it, but only when nothing else remains: a kept sibling worktree
|
|
37
|
+
// or any file the user dropped in must never be deleted. The folder is always
|
|
38
|
+
// this repo's own project folder (the parent of an auto-created worktree), so
|
|
39
|
+
// there's no cross-repo risk.
|
|
40
|
+
const reapEmptyProjectFolder = (worktreePath) => {
|
|
41
|
+
const projectFolder = path.dirname(worktreePath);
|
|
42
|
+
if (projectFolder === WORKTREES_PARENT_DIR)
|
|
43
|
+
return;
|
|
44
|
+
let entries;
|
|
45
|
+
try {
|
|
46
|
+
entries = fs.readdirSync(projectFolder);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!entries.every((entry) => entry === REPO_MARKER_FILENAME))
|
|
52
|
+
return;
|
|
53
|
+
fs.rmSync(projectFolder, { recursive: true, force: true });
|
|
54
|
+
};
|
|
34
55
|
// Removes stale, clean, auto-created worktrees so the shared worktrees dir
|
|
35
56
|
// doesn't accumulate orphans. Returns the paths actually removed. The current
|
|
36
57
|
// and main worktrees are never eligible; a dirty, too-new, or shell-occupied
|
|
37
58
|
// worktree is skipped silently. Never throws — a worktree that fails to remove
|
|
38
59
|
// is simply not in the returned list, so a sweep never breaks the list view
|
|
39
|
-
// that triggered it.
|
|
60
|
+
// that triggered it. A project folder emptied by the sweep is reaped too.
|
|
40
61
|
export const sweepStaleWorktrees = async (cwd, now = Date.now(), isWorktreeBusy = () => false) => {
|
|
41
62
|
const cutoff = WORKTREE_SWEEP_MAX_AGE_DAYS * MS_PER_DAY_MS;
|
|
42
63
|
let worktrees;
|
|
@@ -66,8 +87,10 @@ export const sweepStaleWorktrees = async (cwd, now = Date.now(), isWorktreeBusy
|
|
|
66
87
|
if (!(await isClean(worktree.path)))
|
|
67
88
|
continue;
|
|
68
89
|
const result = await runGit(cwd, ["worktree", "remove", worktree.path]);
|
|
69
|
-
if (result.exitCode === 0)
|
|
90
|
+
if (result.exitCode === 0) {
|
|
70
91
|
removed.push(worktree.path);
|
|
92
|
+
reapEmptyProjectFolder(worktree.path);
|
|
93
|
+
}
|
|
71
94
|
}
|
|
72
95
|
return { removed };
|
|
73
96
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-sweep.js","sourceRoot":"","sources":["../../src/utils/worktree-sweep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"worktree-sweep.js","sourceRoot":"","sources":["../../src/utils/worktree-sweep.ts"],"names":[],"mappings":"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"}
|