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.
Files changed (66) hide show
  1. package/dist/.src-hash +1 -1
  2. package/dist/branch-delivery-wiring.d.ts.map +1 -1
  3. package/dist/branch-delivery-wiring.js +9 -2
  4. package/dist/branch-delivery-wiring.js.map +1 -1
  5. package/dist/config.d.ts +9 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +14 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/daemon-cmd.d.ts +2 -0
  10. package/dist/daemon-cmd.d.ts.map +1 -1
  11. package/dist/daemon-cmd.js +37 -0
  12. package/dist/daemon-cmd.js.map +1 -1
  13. package/dist/eas-cli-install.d.ts +47 -0
  14. package/dist/eas-cli-install.d.ts.map +1 -0
  15. package/dist/eas-cli-install.js +148 -0
  16. package/dist/eas-cli-install.js.map +1 -0
  17. package/dist/expo-release-wiring.d.ts +4 -1
  18. package/dist/expo-release-wiring.d.ts.map +1 -1
  19. package/dist/expo-release-wiring.js +19 -1
  20. package/dist/expo-release-wiring.js.map +1 -1
  21. package/dist/expo-release.d.ts +6 -1
  22. package/dist/expo-release.d.ts.map +1 -1
  23. package/dist/expo-release.js +11 -2
  24. package/dist/expo-release.js.map +1 -1
  25. package/dist/feature-report.d.ts +25 -0
  26. package/dist/feature-report.d.ts.map +1 -0
  27. package/dist/feature-report.js +112 -0
  28. package/dist/feature-report.js.map +1 -0
  29. package/dist/feature-settings-cache.d.ts +39 -0
  30. package/dist/feature-settings-cache.d.ts.map +1 -0
  31. package/dist/feature-settings-cache.js +124 -0
  32. package/dist/feature-settings-cache.js.map +1 -0
  33. package/dist/machine-secrets.d.ts +65 -0
  34. package/dist/machine-secrets.d.ts.map +1 -0
  35. package/dist/machine-secrets.js +237 -0
  36. package/dist/machine-secrets.js.map +1 -0
  37. package/dist/preview-wiring.d.ts +2 -0
  38. package/dist/preview-wiring.d.ts.map +1 -1
  39. package/dist/preview-wiring.js +21 -2
  40. package/dist/preview-wiring.js.map +1 -1
  41. package/dist/remote-command.d.ts +34 -0
  42. package/dist/remote-command.d.ts.map +1 -0
  43. package/dist/remote-command.js +37 -0
  44. package/dist/remote-command.js.map +1 -0
  45. package/dist/run-cmd.d.ts.map +1 -1
  46. package/dist/run-cmd.js +8 -1
  47. package/dist/run-cmd.js.map +1 -1
  48. package/dist/server-client.d.ts +34 -1
  49. package/dist/server-client.d.ts.map +1 -1
  50. package/dist/server-client.js +32 -0
  51. package/dist/server-client.js.map +1 -1
  52. package/dist/untrusted-gate.d.ts +10 -1
  53. package/dist/untrusted-gate.d.ts.map +1 -1
  54. package/dist/untrusted-gate.js +2 -2
  55. package/dist/untrusted-gate.js.map +1 -1
  56. package/dist/visual-proof-cmd.d.ts.map +1 -1
  57. package/dist/visual-proof-cmd.js +6 -2
  58. package/dist/visual-proof-cmd.js.map +1 -1
  59. package/dist/visual-proof-detect.d.ts +29 -0
  60. package/dist/visual-proof-detect.d.ts.map +1 -0
  61. package/dist/visual-proof-detect.js +278 -0
  62. package/dist/visual-proof-detect.js.map +1 -0
  63. package/dist/visual-proof-run.d.ts.map +1 -1
  64. package/dist/visual-proof-run.js +6 -2
  65. package/dist/visual-proof-run.js.map +1 -1
  66. 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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"}
@@ -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;AAErF,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,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,CAkE5E"}
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"}
@@ -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)({ ...(opts.config.preview?.command ? { command: opts.config.preview.command } : {}), ...(opts.config.preview?.teardown ? { teardown: opts.config.preview.teardown } : {}) }, run);
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":"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"}
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-cmd.d.ts","sourceRoot":"","sources":["../src/run-cmd.ts"],"names":[],"mappings":"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"}
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
- if (verdict.compile && scope !== null && binding.kind === 'bound' && (0, bug_repro_1.isBugGoal)(binding.goal.text)) {
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');