looply-cli 0.5.22 → 0.5.23
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-hash +1 -1
- package/dist/branch-delivery-wiring.d.ts.map +1 -1
- package/dist/branch-delivery-wiring.js +9 -2
- package/dist/branch-delivery-wiring.js.map +1 -1
- package/dist/config.d.ts +9 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon-cmd.d.ts +2 -0
- package/dist/daemon-cmd.d.ts.map +1 -1
- package/dist/daemon-cmd.js +37 -0
- package/dist/daemon-cmd.js.map +1 -1
- package/dist/eas-cli-install.d.ts +47 -0
- package/dist/eas-cli-install.d.ts.map +1 -0
- package/dist/eas-cli-install.js +148 -0
- package/dist/eas-cli-install.js.map +1 -0
- package/dist/expo-release-wiring.d.ts +4 -1
- package/dist/expo-release-wiring.d.ts.map +1 -1
- package/dist/expo-release-wiring.js +19 -1
- package/dist/expo-release-wiring.js.map +1 -1
- package/dist/expo-release.d.ts +6 -1
- package/dist/expo-release.d.ts.map +1 -1
- package/dist/expo-release.js +11 -2
- package/dist/expo-release.js.map +1 -1
- package/dist/feature-report.d.ts +25 -0
- package/dist/feature-report.d.ts.map +1 -0
- package/dist/feature-report.js +112 -0
- package/dist/feature-report.js.map +1 -0
- package/dist/feature-settings-cache.d.ts +39 -0
- package/dist/feature-settings-cache.d.ts.map +1 -0
- package/dist/feature-settings-cache.js +124 -0
- package/dist/feature-settings-cache.js.map +1 -0
- package/dist/machine-secrets.d.ts +65 -0
- package/dist/machine-secrets.d.ts.map +1 -0
- package/dist/machine-secrets.js +237 -0
- package/dist/machine-secrets.js.map +1 -0
- package/dist/preview-wiring.d.ts +2 -0
- package/dist/preview-wiring.d.ts.map +1 -1
- package/dist/preview-wiring.js +21 -2
- package/dist/preview-wiring.js.map +1 -1
- package/dist/remote-command.d.ts +34 -0
- package/dist/remote-command.d.ts.map +1 -0
- package/dist/remote-command.js +37 -0
- package/dist/remote-command.js.map +1 -0
- package/dist/run-cmd.d.ts.map +1 -1
- package/dist/run-cmd.js +8 -1
- package/dist/run-cmd.js.map +1 -1
- package/dist/server-client.d.ts +34 -1
- package/dist/server-client.d.ts.map +1 -1
- package/dist/server-client.js +32 -0
- package/dist/server-client.js.map +1 -1
- package/dist/untrusted-gate.d.ts +10 -1
- package/dist/untrusted-gate.d.ts.map +1 -1
- package/dist/untrusted-gate.js +2 -2
- package/dist/untrusted-gate.js.map +1 -1
- package/dist/visual-proof-cmd.d.ts.map +1 -1
- package/dist/visual-proof-cmd.js +6 -2
- package/dist/visual-proof-cmd.js.map +1 -1
- package/dist/visual-proof-detect.d.ts +29 -0
- package/dist/visual-proof-detect.d.ts.map +1 -0
- package/dist/visual-proof-detect.js +278 -0
- package/dist/visual-proof-detect.js.map +1 -0
- package/dist/visual-proof-run.d.ts.map +1 -1
- package/dist/visual-proof-run.js +6 -2
- package/dist/visual-proof-run.js.map +1 -1
- package/package.json +57 -57
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DELIVERED_FILE = void 0;
|
|
4
|
+
exports.looplyHome = looplyHome;
|
|
5
|
+
exports.secretsDir = secretsDir;
|
|
6
|
+
exports.ensureSealKey = ensureSealKey;
|
|
7
|
+
exports.readMachineSecret = readMachineSecret;
|
|
8
|
+
exports.isDelivered = isDelivered;
|
|
9
|
+
exports.makeMachineSecretsPull = makeMachineSecretsPull;
|
|
10
|
+
exports.secretEnv = secretEnv;
|
|
11
|
+
const node_crypto_1 = require("node:crypto");
|
|
12
|
+
const node_fs_1 = require("node:fs");
|
|
13
|
+
const node_os_1 = require("node:os");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const core_1 = require("@looply/core");
|
|
16
|
+
const server_client_1 = require("./server-client");
|
|
17
|
+
/**
|
|
18
|
+
* SECRETS AN OWNER SET IN AUTORYN, OPENED ON THIS MACHINE ONLY.
|
|
19
|
+
*
|
|
20
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
21
|
+
* The machine keeps an RSA key pair in `~/.looply/keys/` (the user's own profile:
|
|
22
|
+
* no sandbox identity can read it) and gives looply-api the public half. AutoRyn
|
|
23
|
+
* seals a secret (the Expo token) to that key; looply-api relays the sealed text.
|
|
24
|
+
* Every five minutes the daemon fetches what is sealed to this machine, opens
|
|
25
|
+
* it, and writes the value to `~/.looply/secrets/<name>` — the file the Expo
|
|
26
|
+
* release already reads (`expo-token`) — then confirms the fingerprint it holds.
|
|
27
|
+
*
|
|
28
|
+
* 🔴 A VALUE IS NEVER LOGGED, NEVER REPORTED, NEVER PUT IN AN ERROR. What leaves
|
|
29
|
+
* this machine is the name, the fingerprint (a SHA-256 prefix) or a sentence
|
|
30
|
+
* saying why it could not be opened.
|
|
31
|
+
*
|
|
32
|
+
* A file a person put there by hand is never overwritten or removed: Looply only
|
|
33
|
+
* replaces or deletes a file whose fingerprint is the one it delivered itself.
|
|
34
|
+
*/
|
|
35
|
+
exports.DELIVERED_FILE = '.delivered.json';
|
|
36
|
+
function looplyHome(home = (0, node_os_1.homedir)()) {
|
|
37
|
+
return (0, node_path_1.join)(home, '.looply');
|
|
38
|
+
}
|
|
39
|
+
function secretsDir(home) {
|
|
40
|
+
return (0, node_path_1.join)(looplyHome(home), 'secrets');
|
|
41
|
+
}
|
|
42
|
+
function keysDir(home) {
|
|
43
|
+
return (0, node_path_1.join)(looplyHome(home), 'keys');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* This machine's seal key, made once. Many daemons start at once on a machine
|
|
47
|
+
* that serves many repositories, so the private key is published with a hard
|
|
48
|
+
* link — which fails if another daemon got there first — and the loser reads
|
|
49
|
+
* the winner's.
|
|
50
|
+
*/
|
|
51
|
+
function ensureSealKey(home) {
|
|
52
|
+
const dir = keysDir(home);
|
|
53
|
+
const priv = (0, node_path_1.join)(dir, 'seal.pem');
|
|
54
|
+
const pub = (0, node_path_1.join)(dir, 'seal.pub.pem');
|
|
55
|
+
if ((0, node_fs_1.existsSync)(priv) && (0, node_fs_1.existsSync)(pub))
|
|
56
|
+
return { publicKey: (0, node_fs_1.readFileSync)(pub, 'utf8'), privateKey: (0, node_fs_1.readFileSync)(priv, 'utf8') };
|
|
57
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
58
|
+
const { publicKey, privateKey } = (0, node_crypto_1.generateKeyPairSync)('rsa', {
|
|
59
|
+
modulusLength: 3072,
|
|
60
|
+
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
61
|
+
privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
|
|
62
|
+
});
|
|
63
|
+
const tmpPriv = `${priv}.${process.pid}.tmp`;
|
|
64
|
+
const tmpPub = `${pub}.${process.pid}.tmp`;
|
|
65
|
+
(0, node_fs_1.writeFileSync)(tmpPub, publicKey, { encoding: 'utf8', mode: 0o600 });
|
|
66
|
+
(0, node_fs_1.writeFileSync)(tmpPriv, privateKey, { encoding: 'utf8', mode: 0o600 });
|
|
67
|
+
try {
|
|
68
|
+
// The public half first: a reader that sees the private key always finds its public half.
|
|
69
|
+
if (!(0, node_fs_1.existsSync)(pub))
|
|
70
|
+
(0, node_fs_1.renameSync)(tmpPub, pub);
|
|
71
|
+
(0, node_fs_1.linkSync)(tmpPriv, priv);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* another daemon published first: theirs is the key */
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
(0, node_fs_1.rmSync)(tmpPriv, { force: true });
|
|
78
|
+
(0, node_fs_1.rmSync)(tmpPub, { force: true });
|
|
79
|
+
}
|
|
80
|
+
return { publicKey: (0, node_fs_1.readFileSync)(pub, 'utf8'), privateKey: (0, node_fs_1.readFileSync)(priv, 'utf8') };
|
|
81
|
+
}
|
|
82
|
+
function readDelivered(home) {
|
|
83
|
+
try {
|
|
84
|
+
const v = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(secretsDir(home), exports.DELIVERED_FILE), 'utf8'));
|
|
85
|
+
if (typeof v !== 'object' || v === null || Array.isArray(v))
|
|
86
|
+
return {};
|
|
87
|
+
return Object.fromEntries(Object.entries(v).filter((e) => typeof e[1] === 'string'));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function writeAtomic(path, text) {
|
|
94
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
95
|
+
(0, node_fs_1.writeFileSync)(tmp, text, { encoding: 'utf8', mode: 0o600 });
|
|
96
|
+
(0, node_fs_1.renameSync)(tmp, path);
|
|
97
|
+
}
|
|
98
|
+
function readValue(file) {
|
|
99
|
+
try {
|
|
100
|
+
const t = (0, node_fs_1.readFileSync)(file, 'utf8').trim();
|
|
101
|
+
return t === '' ? null : t;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** A secret's value on this machine (the file under `~/.looply/secrets`), or null. Never logged. */
|
|
108
|
+
function readMachineSecret(name, home) {
|
|
109
|
+
if (!core_1.SECRET_NAME.test(name))
|
|
110
|
+
return null;
|
|
111
|
+
return readValue((0, node_path_1.join)(secretsDir(home), (0, core_1.secretFileName)(name)));
|
|
112
|
+
}
|
|
113
|
+
/** Whether the file for `name` is the one Looply delivered (rather than one a person put there). */
|
|
114
|
+
function isDelivered(name, home) {
|
|
115
|
+
const value = readMachineSecret(name, home);
|
|
116
|
+
const fp = readDelivered(home)[name];
|
|
117
|
+
return value !== null && fp !== undefined && (0, core_1.secretFingerprint)(value) === fp;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* One pass: make sure the server has the public key, then fetch, open, write and
|
|
121
|
+
* confirm. Never throws; an offline server is the next pass's problem.
|
|
122
|
+
*/
|
|
123
|
+
function makeMachineSecretsPull(deps) {
|
|
124
|
+
let keySent = null;
|
|
125
|
+
let quiet = false;
|
|
126
|
+
return async () => {
|
|
127
|
+
let key;
|
|
128
|
+
try {
|
|
129
|
+
key = ensureSealKey(deps.home);
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
if (!quiet)
|
|
133
|
+
deps.log(`secrets : could not make this machine's seal key (${e.message})`);
|
|
134
|
+
quiet = true;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
let listed;
|
|
138
|
+
try {
|
|
139
|
+
if (keySent !== key.publicKey) {
|
|
140
|
+
await deps.client.putSealKey(key.publicKey);
|
|
141
|
+
keySent = key.publicKey;
|
|
142
|
+
}
|
|
143
|
+
listed = await deps.client.machineSecrets();
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
// An older looply-api (404), offline, or signed out: nothing to deliver now.
|
|
147
|
+
if (!(e instanceof server_client_1.ServerError) && !quiet)
|
|
148
|
+
deps.log(`secrets : could not fetch this machine's secrets (${e.message})`);
|
|
149
|
+
quiet = true;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
quiet = false;
|
|
153
|
+
const dir = secretsDir(deps.home);
|
|
154
|
+
const delivered = readDelivered(deps.home);
|
|
155
|
+
let changed = false;
|
|
156
|
+
for (const s of listed.secrets ?? []) {
|
|
157
|
+
if (!core_1.SECRET_NAME.test(s.name))
|
|
158
|
+
continue;
|
|
159
|
+
const file = (0, node_path_1.join)(dir, (0, core_1.secretFileName)(s.name));
|
|
160
|
+
const ack = (body) => deps.client.ackMachineSecret(s.name, body).catch(() => undefined);
|
|
161
|
+
if (s.removed || s.sealed === null) {
|
|
162
|
+
// Only the copy Looply put there goes; a file a person placed by hand stays.
|
|
163
|
+
if (delivered[s.name] !== undefined) {
|
|
164
|
+
const value = readValue(file);
|
|
165
|
+
if (value !== null && (0, core_1.secretFingerprint)(value) === delivered[s.name]) {
|
|
166
|
+
try {
|
|
167
|
+
(0, node_fs_1.unlinkSync)(file);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
/* already gone */
|
|
171
|
+
}
|
|
172
|
+
deps.log(`secrets : removed ${s.name} (switched off in AutoRyn)`);
|
|
173
|
+
}
|
|
174
|
+
delete delivered[s.name];
|
|
175
|
+
changed = true;
|
|
176
|
+
}
|
|
177
|
+
await ack({ fingerprint: null, problem: null });
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (delivered[s.name] === s.fingerprint && readValue(file) !== null)
|
|
181
|
+
continue;
|
|
182
|
+
const existing = readValue(file);
|
|
183
|
+
if (existing !== null && delivered[s.name] === undefined && (0, core_1.secretFingerprint)(existing) !== s.fingerprint) {
|
|
184
|
+
// A person's own file wins, as config.yaml wins over AutoRyn.
|
|
185
|
+
await ack({ fingerprint: null, problem: `this machine already has its own ${(0, core_1.secretFileName)(s.name)} file, which Looply leaves as it is; remove it on the PC to use the one set in AutoRyn` });
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
let value;
|
|
189
|
+
try {
|
|
190
|
+
value = (0, core_1.openSealed)(key.privateKey, s.sealed);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
await ack({ fingerprint: null, problem: 'this machine could not open it (sealed to another key); send it again' });
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if ((0, core_1.secretFingerprint)(value) !== s.fingerprint) {
|
|
197
|
+
await ack({ fingerprint: null, problem: 'it did not match its fingerprint; send it again' });
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
202
|
+
writeAtomic(file, value);
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
await ack({ fingerprint: null, problem: `could not be written on this machine (${e.message.replace(value, '[redacted]')})` });
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
delivered[s.name] = s.fingerprint ?? (0, core_1.secretFingerprint)(value);
|
|
209
|
+
changed = true;
|
|
210
|
+
deps.log(`secrets : ${s.name} received from AutoRyn`);
|
|
211
|
+
await ack({ fingerprint: delivered[s.name], problem: null });
|
|
212
|
+
}
|
|
213
|
+
if (changed) {
|
|
214
|
+
try {
|
|
215
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
216
|
+
writeAtomic((0, node_path_1.join)(dir, exports.DELIVERED_FILE), JSON.stringify(delivered, null, 2) + '\n');
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
/* the next pass writes it */
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/** Environment for a remote command: each named secret's value, or the names that are missing. */
|
|
225
|
+
function secretEnv(names, home) {
|
|
226
|
+
const env = {};
|
|
227
|
+
const missing = [];
|
|
228
|
+
for (const n of names ?? []) {
|
|
229
|
+
const v = process.env[n]?.trim() || readMachineSecret(n, home);
|
|
230
|
+
if (v)
|
|
231
|
+
env[n] = v;
|
|
232
|
+
else
|
|
233
|
+
missing.push(n);
|
|
234
|
+
}
|
|
235
|
+
return { env, missing };
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=machine-secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-secrets.js","sourceRoot":"","sources":["../src/machine-secrets.ts"],"names":[],"mappings":"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"}
|
package/dist/preview-wiring.d.ts
CHANGED
|
@@ -29,6 +29,8 @@ export interface PreviewWiringOpts {
|
|
|
29
29
|
} | null>;
|
|
30
30
|
heroku?: () => HerokuApi | null;
|
|
31
31
|
runCommand?: PreviewCommandRunner;
|
|
32
|
+
/** Tests: the sandboxed runner a command set in AutoRyn goes through. */
|
|
33
|
+
runContained?: PreviewCommandRunner;
|
|
32
34
|
now?: () => number;
|
|
33
35
|
}
|
|
34
36
|
export declare function makePreviewAdvancer(opts: PreviewWiringOpts): PreviewAdvancer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview-wiring.d.ts","sourceRoot":"","sources":["../src/preview-wiring.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EASL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"preview-wiring.d.ts","sourceRoot":"","sources":["../src/preview-wiring.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EASL,KAAK,oBAAoB,EAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAIrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,wBAAwB,CAAC,CAAC;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC1G,MAAM,CAAC,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,yEAAyE;IACzE,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,CAmF5E"}
|
package/dist/preview-wiring.js
CHANGED
|
@@ -7,6 +7,8 @@ const heroku_api_1 = require("./heroku-api");
|
|
|
7
7
|
const preview_environments_1 = require("./preview-environments");
|
|
8
8
|
const preview_github_1 = require("./preview-github");
|
|
9
9
|
const preview_settings_cache_1 = require("./preview-settings-cache");
|
|
10
|
+
const feature_settings_cache_1 = require("./feature-settings-cache");
|
|
11
|
+
const remote_command_1 = require("./remote-command");
|
|
10
12
|
function makePreviewAdvancer(opts) {
|
|
11
13
|
const now = opts.now ?? (() => Date.now());
|
|
12
14
|
const pull = (0, preview_settings_cache_1.makePreviewSettingsPull)({
|
|
@@ -27,10 +29,27 @@ function makePreviewAdvancer(opts) {
|
|
|
27
29
|
const t = (0, heroku_api_1.herokuToken)();
|
|
28
30
|
return t === null ? null : (0, heroku_api_1.makeHerokuApi)({ token: t.token });
|
|
29
31
|
});
|
|
30
|
-
const run = opts.runCommand ?? (0, preview_environments_1.makePreviewCommandRunner)(opts.cwd, opts.stateDir);
|
|
31
32
|
const settings = () => (0, preview_settings_cache_1.resolvePreview)(opts.config.preview?.settings, opts.stateDir).settings;
|
|
33
|
+
/**
|
|
34
|
+
* THE COMMAND: the repository's own `preview.command` (run as before, the project's code), else the one
|
|
35
|
+
* an owner set and confirmed in AutoRyn — read fresh each time, and run ONLY in the gate sandbox with
|
|
36
|
+
* internet access and the secrets it names (`remote-command.ts`).
|
|
37
|
+
*/
|
|
38
|
+
const local = opts.config.preview?.command?.trim() ? opts.config.preview : null;
|
|
39
|
+
const remote = () => (local === null ? (0, feature_settings_cache_1.readFeatureSettingsCache)(opts.stateDir)?.settings?.previewCommand ?? null : null);
|
|
40
|
+
const decl = {
|
|
41
|
+
get command() {
|
|
42
|
+
return local?.command ?? remote()?.command;
|
|
43
|
+
},
|
|
44
|
+
get teardown() {
|
|
45
|
+
return local !== null ? local.teardown : remote()?.teardown;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const host = opts.runCommand ?? (0, preview_environments_1.makePreviewCommandRunner)(opts.cwd, opts.stateDir);
|
|
49
|
+
const contained = opts.runContained ?? (0, remote_command_1.makeContainedCommandRunner)(opts.cwd, opts.stateDir, 'preview.log', remote);
|
|
50
|
+
const run = (cmd, env, timeoutMs) => (local !== null ? host(cmd, env, timeoutMs) : contained(cmd, env, timeoutMs));
|
|
32
51
|
/** One command driver for the life of the daemon: it holds the background builds. */
|
|
33
|
-
const command = (0, preview_environments_1.commandDriver)(
|
|
52
|
+
const command = (0, preview_environments_1.commandDriver)(decl, run);
|
|
34
53
|
const store = (0, preview_environments_1.filePreviewStore)(opts.stateDir);
|
|
35
54
|
const deliveries = (0, branch_delivery_1.fileDeliveryStore)(opts.stateDir);
|
|
36
55
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview-wiring.js","sourceRoot":"","sources":["../src/preview-wiring.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"preview-wiring.js","sourceRoot":"","sources":["../src/preview-wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { RemoteCommand } from '@looply/core';
|
|
2
|
+
import { type UntrustedGateDeps } from './untrusted-gate';
|
|
3
|
+
/**
|
|
4
|
+
* A COMMAND AN OWNER SET IN AUTORYN (a preview site's build, a release step),
|
|
5
|
+
* RUN WHERE GATES RUN — NEVER ON THE HOST.
|
|
6
|
+
*
|
|
7
|
+
* ─────────────────────────────────────────────────────────────────────────────
|
|
8
|
+
* A command written in the repository's own `.looply/config.yaml` is the
|
|
9
|
+
* project's code, and runs as before. A command that arrived as a remote
|
|
10
|
+
* setting is a code-execution path from outside this machine, so:
|
|
11
|
+
*
|
|
12
|
+
* - it runs in the gate sandbox (AppContainer), granted the project folder
|
|
13
|
+
* and nothing else of this machine — not the user's profile, not other
|
|
14
|
+
* repositories, not Looply's state or keys;
|
|
15
|
+
* - it gets internet access (`internet-client`), because a preview or a
|
|
16
|
+
* deploy must reach its host;
|
|
17
|
+
* - its environment is the sandbox's own plus the secrets the owner named
|
|
18
|
+
* for it (delivered sealed to this machine) and the LOOPLY_* facts —
|
|
19
|
+
* never the daemon's environment;
|
|
20
|
+
* - the owner confirmed exactly this text in AutoRyn (`confirmedBy`), and the
|
|
21
|
+
* log line says so.
|
|
22
|
+
*
|
|
23
|
+
* Its output goes to `.looply/state/run-logs/<log>`, secrets masked; what is
|
|
24
|
+
* reported anywhere else is a sentence, never the output.
|
|
25
|
+
*/
|
|
26
|
+
export interface CommandOutcome {
|
|
27
|
+
code: number;
|
|
28
|
+
stdout: string;
|
|
29
|
+
}
|
|
30
|
+
export type ContainedCommandRunner = (command: string, env: Record<string, string>, timeoutMs: number) => Promise<CommandOutcome>;
|
|
31
|
+
export declare function makeContainedCommandRunner(projectDir: string, stateDir: string, logName: string, remote: () => RemoteCommand | null, deps?: Pick<UntrustedGateDeps, 'backend' | 'toolchain'> & {
|
|
32
|
+
home?: string;
|
|
33
|
+
}): ContainedCommandRunner;
|
|
34
|
+
//# sourceMappingURL=remote-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-command.d.ts","sourceRoot":"","sources":["../src/remote-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAElI,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,aAAa,GAAG,IAAI,EAClC,IAAI,GAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,WAAW,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC9E,sBAAsB,CA0BxB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeContainedCommandRunner = makeContainedCommandRunner;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const machine_secrets_1 = require("./machine-secrets");
|
|
7
|
+
const preview_environments_1 = require("./preview-environments");
|
|
8
|
+
const untrusted_gate_1 = require("./untrusted-gate");
|
|
9
|
+
function makeContainedCommandRunner(projectDir, stateDir, logName, remote, deps = {}) {
|
|
10
|
+
return async (command, env, timeoutMs) => {
|
|
11
|
+
const r = remote();
|
|
12
|
+
const { env: secrets, missing } = (0, machine_secrets_1.secretEnv)(r?.secrets, deps.home);
|
|
13
|
+
const values = Object.values(secrets);
|
|
14
|
+
const mask = (s) => values.reduce((acc, v) => (v.length >= 6 ? acc.split(v).join('***') : acc), (0, preview_environments_1.redactSecrets)(s));
|
|
15
|
+
const note = (s) => {
|
|
16
|
+
try {
|
|
17
|
+
const dir = (0, node_path_1.join)(stateDir, 'run-logs');
|
|
18
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
19
|
+
(0, node_fs_1.appendFileSync)((0, node_path_1.join)(dir, logName), mask(s), 'utf8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
/* the log is a convenience */
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
note(`\n=== ${new Date().toISOString()} [sandbox, internet] ${command}${r ? ` (set in AutoRyn, confirmed by ${r.confirmedBy} at ${r.confirmedAt})` : ''}\n`);
|
|
26
|
+
if (missing.length > 0) {
|
|
27
|
+
const why = `the secret${missing.length === 1 ? '' : 's'} ${missing.join(', ')} ${missing.length === 1 ? 'is' : 'are'} not on this machine yet (AutoRyn → Software execution → Machine secrets)`;
|
|
28
|
+
note(`${why}\n`);
|
|
29
|
+
return { code: -1, stdout: why };
|
|
30
|
+
}
|
|
31
|
+
const run = (0, untrusted_gate_1.makeUntrustedGateRunner)(projectDir, { ...deps, network: 'internet-client', extraEnv: { ...secrets, ...env } });
|
|
32
|
+
const out = await run(command, timeoutMs);
|
|
33
|
+
note(out.output ?? '');
|
|
34
|
+
return { code: out.ok ? 0 : (out.exitCode ?? -1), stdout: (out.output ?? '').slice(-20_000) };
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=remote-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-command.js","sourceRoot":"","sources":["../src/remote-command.ts"],"names":[],"mappings":"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"}
|
package/dist/run-cmd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cmd.d.ts","sourceRoot":"","sources":["../src/run-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,OAAO,EAGL,KAAK,cAAc,EAKnB,KAAK,IAAI,EAaT,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAiC/E,OAAO,EAGL,KAAK,aAAa,EAIlB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAoBxB,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA0C9E,OAAO,EAGL,KAAK,yBAAyB,EAE/B,MAAM,uBAAuB,CAAC;AAe/B,OAAO,EAaL,KAAK,cAAc,EAEpB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run-cmd.d.ts","sourceRoot":"","sources":["../src/run-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/run-cmd.js
CHANGED
|
@@ -99,6 +99,8 @@ const provider_identity_1 = require("./provider-identity");
|
|
|
99
99
|
const agent_exec_1 = require("./agent-exec");
|
|
100
100
|
const providers_1 = require("./providers");
|
|
101
101
|
const core_4 = require("@looply/core");
|
|
102
|
+
const core_5 = require("@looply/core");
|
|
103
|
+
const feature_settings_cache_1 = require("./feature-settings-cache");
|
|
102
104
|
const queue_write_lease_1 = require("./queue-write-lease");
|
|
103
105
|
const surface_lease_1 = require("./surface-lease");
|
|
104
106
|
const spend_ledger_1 = require("./spend-ledger");
|
|
@@ -2993,7 +2995,12 @@ async function runLoop(opts) {
|
|
|
2993
2995
|
* A bug that does not show asks one question instead of spending a fix attempt — only when the
|
|
2994
2996
|
* reproduction happened in THIS Start, so a resumed goal is never asked the same thing twice.
|
|
2995
2997
|
*/
|
|
2996
|
-
|
|
2998
|
+
// On unless switched off: config.yaml `bug_repro.enabled`, else the switch in AutoRyn (feature switches).
|
|
2999
|
+
const reproSwitch = (0, core_5.bugReproEnabled)(config.bugRepro?.enabled, (0, feature_settings_cache_1.remoteFeaturesFor)(opts.cwd));
|
|
3000
|
+
if (!reproSwitch.enabled && binding.kind === 'bound' && (0, bug_repro_1.isBugGoal)(binding.goal.text)) {
|
|
3001
|
+
log(`repro : this is a bug, but reproduction-first is switched off (${reproSwitch.from === 'remote' ? 'in AutoRyn' : 'in .looply/config.yaml'}); planning the fix directly`);
|
|
3002
|
+
}
|
|
3003
|
+
if (reproSwitch.enabled && verdict.compile && scope !== null && binding.kind === 'bound' && (0, bug_repro_1.isBugGoal)(binding.goal.text)) {
|
|
2997
3004
|
let repro = reproStore.read(binding.goal.id, binding.goal.version);
|
|
2998
3005
|
if (repro === null) {
|
|
2999
3006
|
log('repro : this is a bug — writing a test that shows it before planning the fix');
|