@monotykamary/localterm-server 2.26.1 → 2.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/automation-store.d.ts +1 -0
  2. package/dist/automation-store.d.ts.map +1 -1
  3. package/dist/automation-store.js +25 -0
  4. package/dist/automation-store.js.map +1 -1
  5. package/dist/constants.d.ts +6 -3
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +20 -15
  8. package/dist/constants.js.map +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +80 -16
  11. package/dist/index.js.map +1 -1
  12. package/dist/process-store.d.ts +15 -0
  13. package/dist/process-store.d.ts.map +1 -0
  14. package/dist/process-store.js +121 -0
  15. package/dist/process-store.js.map +1 -0
  16. package/dist/protocol.d.ts +2 -2
  17. package/dist/protocol.d.ts.map +1 -1
  18. package/dist/protocol.js +1 -1
  19. package/dist/protocol.js.map +1 -1
  20. package/dist/schemas.d.ts +28 -5
  21. package/dist/schemas.d.ts.map +1 -1
  22. package/dist/schemas.js +60 -17
  23. package/dist/schemas.js.map +1 -1
  24. package/dist/secret-shims.d.ts +2 -2
  25. package/dist/secret-shims.d.ts.map +1 -1
  26. package/dist/secret-shims.js +28 -23
  27. package/dist/secret-shims.js.map +1 -1
  28. package/dist/secret-store.d.ts +1 -0
  29. package/dist/secret-store.d.ts.map +1 -1
  30. package/dist/secret-store.js +23 -32
  31. package/dist/secret-store.js.map +1 -1
  32. package/dist/types.d.ts +4 -1
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/utils/migrate-secrets-to-processes.d.ts +2 -0
  35. package/dist/utils/migrate-secrets-to-processes.d.ts.map +1 -0
  36. package/dist/utils/migrate-secrets-to-processes.js +109 -0
  37. package/dist/utils/migrate-secrets-to-processes.js.map +1 -0
  38. 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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAGvB,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,6EAA6E;AAC7E,4CAA4C;AAC5C,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,cAAsB,EAAQ,EAAE;IACxE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAEpE,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,WAAoB,CAAC;IACzB,IAAI,CAAC;QACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,gFAAgF;IAChF,IAAI,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO;QAAE,OAAO;IAE7D,MAAM,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,OAAO;QAAE,OAAO;IAExB,8EAA8E;IAC9E,wEAAwE;IACxE,6EAA6E;IAC7E,8EAA8E;IAC9E,0EAA0E;IAC1E,qEAAqE;IACrE,gEAAgE;IAChE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,kCAAkC,OAAO,oBAAoB,CAAC,CAAC;gBAC5E,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC9D,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,8EAA8E;IAC9E,mEAAmE;IACnE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBACtD,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,IAAI,QAAQ;YACV,KAAK,MAAM,UAAU,IAAI,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7F,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3B,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,cAAc,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,SAAS,GAAc,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC;QACpF,IAAI;QACJ,gBAAgB;KACjB,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAkB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC,CAAC;IAEJ,SAAS,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAC;IACzE,SAAS,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,OAAgB,EAAQ,EAAE;IAC7D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monotykamary/localterm-server",
3
- "version": "2.26.1",
3
+ "version": "2.27.0",
4
4
  "description": "PTY-backed HTTP/WebSocket server that powers localterm, built on Hono + node-pty.",
5
5
  "keywords": [
6
6
  "hono",