@ia-qa/self-healing 1.8.1 → 1.9.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.
package/README.md CHANGED
@@ -98,6 +98,9 @@ npx ia-qa-heal audit # does my suite still name things that exist?
98
98
  `audit` is read-only and advisory (exit 0 unless `--strict`) — it answers on day one, before
99
99
  you have any history to compare against.
100
100
 
101
+ Rather fill in a form than answer questions in a terminal? `npx ia-qa-heal ui` in a folder with
102
+ no config opens the [console](#the-console--ia-qa-heal-ui) on a setup form that writes the same file.
103
+
101
104
  **Then one command, for good:**
102
105
 
103
106
  ```bash
@@ -540,6 +543,12 @@ A local web console for the rows where the tool gave up: highlighted crops of ea
540
543
  the `file:line` of every test that breaks, the verbs as plain-language buttons, and the history
541
544
  as charts. `--shortcut` writes a desktop launcher.
542
545
 
546
+ Opened in a folder that has no `.ia-qa/config.json`, it shows a **setup form** instead: the
547
+ app's address, the pages (read from the sitemap, or typed), and how the app logs in — and it
548
+ writes the same file `init` would. It never overwrites a config, and no field asks for a
549
+ secret: the login answers are the *names* of environment variables or SSM parameters, and a
550
+ browser login is handed over as the `ia-qa-heal login` command to run.
551
+
543
552
  It is **loopback only** (`127.0.0.1`), every request carries a per-process token, the Host
544
553
  header is pinned, and its buttons spawn this package's own CLI with a fixed argv — never a
545
554
  string from the request. It **refuses to start under CI** (an interactive surface there is a
@@ -599,7 +608,7 @@ say what each is for, every input it takes, every API call the browser really ma
599
608
  no LLM, same local-first promise as this package.
600
609
 
601
610
  ```bash
602
- npx @ia-qa/qa-discovery scan https://your-app.example.com --save --report
611
+ npx -p @ia-qa/qa-discovery ia-qa-discover scan https://your-app.example.com --save --report
603
612
  ```
604
613
 
605
614
  **It also answers a question this package cannot.** `run` records which pages your suite really
package/TUTORIAL.md CHANGED
@@ -244,7 +244,11 @@ npm install -D @ia-qa/self-healing
244
244
  npx ia-qa-heal init
245
245
  ```
246
246
 
247
- It asks a few questions (your app's URL, whether there's a login, which pages to map) and writes `.ia-qa/config.json`. **You never hand-write that file — the wizard does it.** But it helps to know what's inside, because it's the one file you'll tweak:
247
+ It asks a few questions (your app's URL, whether there's a login, which pages to map) and writes `.ia-qa/config.json`. **You never hand-write that file — the wizard does it.**
248
+
249
+ **Prefer a form to questions in a terminal?** Run `npx ia-qa-heal ui` in the project folder instead: with no config yet, the console opens on a setup form — the same questions in your browser, writing the same file ([Step 6.8](#step-68--no-terminal-open-the-console)).
250
+
251
+ Either way, it helps to know what's inside, because it's the one file you'll tweak:
248
252
 
249
253
  - **🔑 Credentials** — you store the *name* of an environment variable, never the password itself. The real value stays in your `.env` / shell / AWS. **Loading it is your job:** the CLI reads `process.env` and never opens a `.env` file, so a key sitting only in `.env` will not be seen — run `map` under `npx dotenv-cli --` (or Node's `--env-file-if-exists`, 20.12+). Only `map` logs in; `diff`, `baseline`, `audit` and `check` read the mapping and need no credentials. If a variable is missing, the tool stops and names the exact variable to set — it never guesses and never writes a secret to disk.
250
254
  - **🌐 URLs to visit** — the list of pages to map. A page that lives behind a click instead of its own URL (a tab or modal an app swaps in) is reached by naming the control to click, not by a URL.
@@ -601,6 +605,13 @@ A local page opens in your browser with three things a terminal cannot give you:
601
605
  click away.
602
606
  - **The run history as charts** — see [§8.3](#83-the-trend-ia-qa-heal-history).
603
607
 
608
+ **Nothing set up yet? Open it anyway.** In a folder with no `.ia-qa/config.json`, the console shows
609
+ a setup form instead: the app's address, the pages (read from the sitemap in one click, or typed),
610
+ and how the app logs in. The panel beside it shows the exact file that will be written, and it is
611
+ the same file `init` writes. It never overwrites a config, and no field asks for a password: you
612
+ give the *names* of the variables that hold the credentials, and a browser login is handed over
613
+ as the `ia-qa-heal login` command to run once in a terminal.
614
+
604
615
  Once, per project, so nobody ever types a command again:
605
616
 
606
617
  ```bash
@@ -618,10 +629,10 @@ leaves a process running behind your back. It can do **nothing the CLI would ref
618
629
  it would simply hang.
619
630
 
620
631
  Working on several projects? The header carries a **Project** dropdown. Pick
621
- **+ Add another project…** and paste the folder's path it must already contain a `.ia-qa`
622
- directory (run `ia-qa-heal init` there once if not). Everything you add is remembered, so it is one
623
- click from then on, and `ia-qa-heal ui --forget [dir]` takes it back out (deleting nothing inside
624
- the project).
632
+ **+ Add another project…** and paste the folder's path. A folder that has never been set up opens
633
+ on the setup form above, and joins the list once its config is written. Everything you add is
634
+ remembered, so it is one click from then on, and `ia-qa-heal ui --forget [dir]` takes it back out
635
+ (deleting nothing inside the project).
625
636
 
626
637
  ---
627
638
 
@@ -924,6 +935,7 @@ npx ia-qa-heal graph --format markdown # the navigation graph, one card per p
924
935
  npx ia-qa-heal run # the whole loop: capture (your suite, IAQA_CAPTURE=1) → diff → confirm → fix → re-run to verify
925
936
 
926
937
  npx ia-qa-heal ui # the local console: decide with pictures, verbs as buttons, history as charts
938
+ # (in a folder with no config: a setup form that writes it)
927
939
  npx ia-qa-heal ui --shortcut # once per project: a desktop icon that opens it in one click
928
940
  npx ia-qa-heal ui --forget [dir] # drop a project from the console's switcher
929
941
  npx ia-qa-heal history [--json] # the trend: verdicts over time, coverage, which pages churn
@@ -150,7 +150,11 @@ async function runIngest(args) {
150
150
  console.log(`\n If you have been handed an app and no tests, \`@ia-qa/qa-discovery\` is the step before:`);
151
151
  console.log(` it crawls the app and writes down what is in it — pages, inputs, API calls — so you know`);
152
152
  console.log(` what there is to test. Then come back here to keep those tests alive.`);
153
- console.log(` npx @ia-qa/qa-discovery scan <url> --save --report`);
153
+ // `-p` is not decoration: this package publishes three binaries and none is named
154
+ // after it, so `npx @ia-qa/qa-discovery …` exits with "could not determine executable
155
+ // to run" — verified. Handing a broken command to the one user whose premise already
156
+ // failed is worse than saying nothing.
157
+ console.log(` npx -p @ia-qa/qa-discovery ia-qa-discover scan <url> --save --report`);
154
158
  }
155
159
  else if (selectors.length === 0 && names.length === 0) {
156
160
  console.log(`\n ${usage.scanned} file${usage.scanned === 1 ? '' : 's'} scanned, no locator literals found. ` +
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/cli/ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/cli/ingest.ts"],"names":[],"mappings":"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"}
package/dist/ui/page.js CHANGED
@@ -207,6 +207,61 @@ th{color:var(--muted);font-weight:600;font-size:10.5px;text-transform:uppercase;
207
207
  td.n{text-align:right;font-variant-numeric:tabular-nums}
208
208
  .axis{fill:#71717a;font-size:10px}
209
209
  .note{color:var(--muted);font-size:12px;margin-top:8px}
210
+ /* The setup form, for a folder with no config. Same vocabulary as the rest of the
211
+ page: the card, the pill CTA, the dashed line that states what leaves the machine. */
212
+ [hidden]{display:none!important}
213
+ .lede-s{font-size:13px;margin-bottom:16px}
214
+ code.k{background:var(--surface2);border:1px solid var(--border);border-radius:5px;padding:1px 6px;font:11.5px ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--orange2)}
215
+ .step{border-top:1px solid var(--border);padding:18px 0}
216
+ .st{display:flex;align-items:center;gap:10px;margin-bottom:10px}
217
+ .st-row{display:flex;align-items:center;gap:10px}
218
+ .st-row .v{font-size:12.5px;color:var(--muted);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
219
+ .st-row .aside{margin-left:auto;font-size:12px;color:var(--muted)}
220
+ .st-row a{margin-left:auto;font-size:12px;text-decoration:none}
221
+ .st-lock{opacity:.45}
222
+ .field{font:inherit;font-size:13px;width:100%;background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:9px;padding:9px 12px;outline:none}
223
+ .field:focus{border-color:var(--orange)}
224
+ .field.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}
225
+ .rowf{display:flex;gap:8px;align-items:center}
226
+ .rowb{display:flex;gap:8px;margin-bottom:10px}
227
+ .cta:disabled{opacity:.5;cursor:default}
228
+ .su-found{display:flex;align-items:baseline;gap:10px;margin:16px 0 4px}
229
+ .su-all{margin-left:auto;display:flex;gap:10px;font-size:12px}
230
+ .su-all a,.su-rm{text-decoration:none}
231
+ .su-row{cursor:pointer;align-items:center}
232
+ .su-n{font-size:12.5px;font-weight:600;width:170px;flex:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
233
+ .su-p{font:11.5px ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--muted);word-break:break-all;flex:1}
234
+ .su-rm{font-size:11.5px}
235
+ .chk{width:15px;height:15px;border-radius:4px;border:1.5px solid #3f3f46;flex:none;display:inline-flex;align-items:center;justify-content:center}
236
+ .chk.on{background:var(--orange);border-color:var(--orange)}
237
+ .su-more{margin-top:10px}
238
+ .su-add{margin-top:18px}
239
+ .su-add .note{margin:0 0 6px}
240
+ .btn-s{font-size:12.5px;padding:8px 12px;flex:none}
241
+ .opts{display:flex;flex-direction:column;gap:10px}
242
+ .opt{display:flex;gap:11px;border:1px solid var(--border);border-radius:12px;padding:14px 15px;background:var(--surface2);cursor:pointer}
243
+ .opt-on{border-color:var(--orange);background:#f9731610;cursor:default}
244
+ .opt-b{flex:1;min-width:0}
245
+ .opt-b b{font-size:13px}
246
+ .r{width:15px;height:15px;border-radius:50%;border:1.5px solid #3f3f46;flex:none;margin-top:3px}
247
+ .r-on{border-color:var(--orange);background:radial-gradient(circle,var(--orange) 0 3.5px,transparent 4px)}
248
+ .lbl{font-size:12px;color:var(--muted);margin-bottom:6px}
249
+ .su-sub{margin-top:14px}
250
+ .seg{display:inline-flex;border:1px solid var(--border);border-radius:99px;padding:3px;background:var(--bg);gap:3px}
251
+ .seg span{font-size:12.5px;padding:4px 12px;border-radius:99px;color:var(--muted);border:1px solid transparent;cursor:pointer}
252
+ .seg span.on{font-weight:600;background:#f9731618;color:var(--orange2);border-color:var(--orange)}
253
+ .g2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}
254
+ .g3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:10px}
255
+ @media(max-width:700px){.g2,.g3{grid-template-columns:1fr}}
256
+ .su-dash{margin-top:12px;font-size:12px;color:var(--muted);border:1px dashed var(--border);border-radius:8px;padding:9px 11px}
257
+ .su-foot{border-top:1px solid var(--border);padding-top:16px;display:flex;align-items:center;gap:12px;flex-wrap:wrap}
258
+ .su-err{margin-top:10px;font-size:12.5px;color:#fda4af;white-space:pre-wrap}
259
+ .su-file{font-size:12.5px;margin-bottom:10px;word-break:break-all}
260
+ .su-json{white-space:pre;max-height:none;overflow:auto;margin-top:0}
261
+ .su-miss{margin-top:10px;font-size:12px;color:#fcd34d}
262
+ .su-miss li{margin-top:3px}
263
+ .su-promise{display:flex;flex-direction:column;gap:8px;margin-top:14px;font-size:12px;color:var(--muted)}
264
+ .su-promise b{color:var(--text)}
210
265
  </style>
211
266
  </head><body>
212
267
  <header><div class="wrap head">
@@ -224,7 +279,24 @@ td.n{text-align:right;font-variant-numeric:tabular-nums}
224
279
  </div></header>
225
280
  <main><div class="wrap">
226
281
  <div id="update"></div>
227
- <section class="grid cols">
282
+ <!-- Shown instead of everything below when the folder has no config: nothing
283
+ else on this page can say anything true about an app it has no address for. -->
284
+ <section class="grid cols" id="setupSec" hidden>
285
+ <div class="card" id="setupForm"></div>
286
+ <div class="card">
287
+ <h2>What this writes</h2>
288
+ <div class="su-file">One file: <code class="k" id="setupPath"></code></div>
289
+ <div class="log su-json" id="setupJson"></div>
290
+ <div class="note" id="setupMore"></div>
291
+ <div id="setupProblems"></div>
292
+ <div class="su-promise">
293
+ <div>🔑 <b>References only.</b> A password, a token or a cookie is never written to this file, and no field on this page asks for one.</div>
294
+ <div>📦 This file is meant to be committed.</div>
295
+ <div>🔒 Setting up sends nothing anywhere — except the sitemap request in step 2, and only if you click it.</div>
296
+ </div>
297
+ </div>
298
+ </section>
299
+ <section class="grid cols" id="mainGrid">
228
300
  <div class="card" id="verdictCard"><div class="empty">loading…</div></div>
229
301
  <div class="card">
230
302
  <h2>Actions</h2>
@@ -281,7 +353,13 @@ let LAST_STATE = {};
281
353
 
282
354
  function render(s) {
283
355
  LAST_STATE = s || {};
284
- renderPicker(s); renderUpdate(s); renderHead(s); renderVerdict(s); renderActions(s);
356
+ renderPicker(s); renderUpdate(s); renderHead(s);
357
+ const setup = Boolean(s.project && s.project.needsSetup);
358
+ q('#setupSec').hidden = !setup;
359
+ q('#mainGrid').hidden = setup;
360
+ ['#decisions', '#project', '#history'].forEach((id) => { q(id).closest('section').hidden = setup; });
361
+ if (setup) { q('#findingsCard').hidden = true; renderSetup(s); return; }
362
+ renderVerdict(s); renderActions(s);
285
363
  renderDecisions(s); renderHistory(s); renderGoto(s); bindCopy();
286
364
  }
287
365
 
@@ -329,8 +407,12 @@ function renderPicker(s) {
329
407
  // terminal, the feature could never start existing.
330
408
  wrap.style.display = '';
331
409
  const sel = q('#picker');
410
+ // A folder being set up is not in the list yet — it joins once its config is
411
+ // written — but it is the one on screen, so the menu has to say so.
412
+ const listed = list.some((p) => p.dir === s.activeDir);
332
413
  sel.innerHTML =
333
- list.map((p) =>
414
+ (listed ? '' : '<option value="' + esc(s.activeDir) + '" selected>' + esc(shortDir(s.activeDir)) + ' — not set up yet</option>')
415
+ + list.map((p) =>
334
416
  '<option value="' + esc(p.dir) + '"' + (p.dir === s.activeDir ? ' selected' : '') + '>'
335
417
  + esc(shortDir(p.dir)) + (p.baseUrl ? ' — ' + esc(p.baseUrl) : '') + '</option>'
336
418
  ).join('')
@@ -364,8 +446,7 @@ function askForFolder() {
364
446
  const v = prompt(
365
447
  'Add a project to this console.\\n\\n'
366
448
  + 'Paste the full path of the project folder — the one you would open in your '
367
- + 'editor. It must already contain a .ia-qa folder (run "ia-qa-heal init" there '
368
- + 'if it does not).',
449
+ + 'editor. If it has never been set up, the console walks you through it.',
369
450
  ''
370
451
  );
371
452
  return v && v.trim() ? v.trim() : null;
@@ -782,6 +863,333 @@ function bindCopy() {
782
863
  });
783
864
  }
784
865
 
866
+ /* ---- setup: a folder with no .ia-qa/config.json ------------------------ */
867
+
868
+ /* The file ia-qa-heal init writes, asked for in three steps. The panel on the
869
+ right is the server's own plan for the answers so far — the function the write
870
+ goes through — so it cannot show one file and write another. No field here
871
+ takes a secret: the login answers are the NAMES of variables. */
872
+ const ENV_DEFAULTS = { usernameKey: 'E2E_USERNAME', passwordKey: 'E2E_PASSWORD' };
873
+ const SSM_DEFAULTS = { usernameKey: '/staging/app/username', passwordKey: '/staging/app/password' };
874
+ const CHECK_SVG = '<svg width="11" height="11" viewBox="0 0 16 16" fill="none" stroke="#09090b" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8.5l3 3 6-7"/></svg>';
875
+ const setupBlank = () => ({
876
+ step: 1, baseUrl: '', found: null, foundFor: '', reason: [], capped: false, selected: {}, showAll: false, manual: [],
877
+ mode: '', store: 'env', usernameKey: ENV_DEFAULTS.usernameKey, passwordKey: ENV_DEFAULTS.passwordKey, region: 'eu-west-3',
878
+ loginUrl: '/login', usernameSelector: 'input[name="email"]', passwordSelector: 'input[type="password"]',
879
+ submitSelector: 'button[type="submit"]', busy: false, error: '',
880
+ });
881
+ let SETUP = setupBlank();
882
+ let setupDir = null;
883
+ let previewTimer = null;
884
+
885
+ async function postJson(pathname, body) {
886
+ const r = await fetch(pathname + '?t=' + T, {
887
+ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),
888
+ });
889
+ return r.json();
890
+ }
891
+
892
+ function setupPages() {
893
+ return (SETUP.found || []).filter((p) => SETUP.selected[p.url]).concat(SETUP.manual);
894
+ }
895
+
896
+ function setupBody() {
897
+ const S = SETUP;
898
+ const login = S.mode === 'form'
899
+ ? { mode: 'form', store: S.store, usernameKey: S.usernameKey, passwordKey: S.passwordKey, region: S.region,
900
+ loginUrl: S.loginUrl, usernameSelector: S.usernameSelector, passwordSelector: S.passwordSelector,
901
+ submitSelector: S.submitSelector }
902
+ : { mode: S.mode };
903
+ return { baseUrl: S.baseUrl, pages: setupPages().map((p) => ({ name: p.name, url: p.url })), login: login };
904
+ }
905
+
906
+ function renderSetup(s) {
907
+ // Answers typed for one folder must never be written into the next one picked.
908
+ if (setupDir !== s.activeDir) { SETUP = setupBlank(); setupDir = s.activeDir; }
909
+ drawSetup();
910
+ refreshPreview();
911
+ }
912
+
913
+ function sitemapUrl(base) {
914
+ try { return new URL('/sitemap.xml', base).toString(); } catch (e) { return base + '/sitemap.xml'; }
915
+ }
916
+
917
+ function stepRow(n, label, value) {
918
+ return '<div class="step st-row"><span class="num">' + n + ' of 3</span><b>' + esc(label) + '</b>'
919
+ + '<span class="v">' + esc(value) + '</span><a href="#" data-goto="' + n + '">change</a></div>';
920
+ }
921
+
922
+ function drawSetup() {
923
+ const S = SETUP;
924
+ let h = '<h2>Set up this folder</h2>'
925
+ + '<div class="lede-s">This folder has no <code class="k">.ia-qa/config.json</code> yet, so there is nothing to look at. '
926
+ + 'Answer three questions and the console writes it for you — the same file <code class="k">ia-qa-heal init</code> would.</div>';
927
+
928
+ if (S.step === 1) {
929
+ h += '<div class="step"><div class="st"><span class="num">1 of 3</span><b>Where does the app live?</b></div>'
930
+ + '<div class="rowf"><input class="field" id="su-url" placeholder="https://staging.example.com" autocomplete="off" spellcheck="false" value="' + esc(S.baseUrl) + '">'
931
+ + '<button class="cta" id="su-next1">Next</button></div>'
932
+ + '<div class="note">The address your tests run against. A staging server beats production if you have one.</div></div>'
933
+ + '<div class="step st-row st-lock"><span class="num">2 of 3</span><b>Which pages should it watch?</b><span class="aside">needs the address first</span></div>';
934
+ } else {
935
+ h += stepRow(1, 'App', S.baseUrl);
936
+ if (S.step === 2) h += pagesStep();
937
+ else { const n = setupPages().length; h += stepRow(2, 'Pages', n + ' page' + (n === 1 ? '' : 's')); }
938
+ }
939
+
940
+ if (S.step === 3) h += loginStep();
941
+ else h += '<div class="step st-row' + (S.step === 1 ? ' st-lock' : '') + '"><span class="num">3 of 3</span><b>Does the app ask you to log in?</b>'
942
+ + (S.step === 2 ? '<span class="aside">not answered yet</span>' : '') + '</div>';
943
+
944
+ const ready = S.step === 3 && S.mode && !S.busy;
945
+ h += '<div class="su-foot"><button class="cta" id="su-write"' + (ready ? '' : ' disabled') + '>'
946
+ + (S.busy && S.step === 3 ? 'Writing…' : 'Write the config ✎') + '</button>'
947
+ + '<span class="note" style="margin:0">Changes one file on your computer. Nothing is committed.</span></div>'
948
+ + (S.error ? '<div class="su-err">' + esc(S.error) + '</div>' : '');
949
+ q('#setupForm').innerHTML = h;
950
+ bindSetup();
951
+ }
952
+
953
+ function pagesStep() {
954
+ const S = SETUP;
955
+ let h = '<div class="step"><div class="st"><span class="num">2 of 3</span><b>Which pages should it watch?</b></div>'
956
+ + '<div class="rowb"><button class="cta" id="su-sitemap"' + (S.busy ? ' disabled' : '') + '>'
957
+ + (S.busy ? 'Reading the sitemap…' : S.found ? 'Read the sitemap again' : 'Find them in the sitemap') + '</button></div>'
958
+ + '<div class="net-line" style="margin-top:0">🔗 One request to <b>' + esc(sitemapUrl(S.baseUrl)) + '</b> (and robots.txt if the sitemap lives elsewhere) — plain GET, no browser, no login, nothing else sent.</div>';
959
+ if (S.found && S.found.length === 0) {
960
+ h += '<div class="note">' + S.reason.map(esc).join('<br>') + '<br>Add the pages by hand below.</div>';
961
+ } else if (S.found) {
962
+ const n = S.found.length;
963
+ const sel = S.found.filter((p) => S.selected[p.url]).length;
964
+ h += '<div class="su-found"><b>Found ' + n + ' page' + (n === 1 ? '' : 's') + (S.capped ? ' — the first ' + n + ', the sitemap lists more' : '') + '.</b>'
965
+ + '<span class="note" style="margin:0">' + sel + ' selected</span>'
966
+ + '<span class="su-all"><a href="#" id="su-all">select all</a><a href="#" id="su-none">none</a></span></div>'
967
+ + (S.showAll ? S.found : S.found.slice(0, 8)).map((p) => pageRow(p, Boolean(S.selected[p.url]), 'u', p.url)).join('');
968
+ if (!S.showAll && n > 8) h += '<button class="cta su-more" id="su-more">Show the ' + (n - 8) + ' others</button>';
969
+ }
970
+ h += S.manual.map((p, i) => pageRow(p, true, 'm', String(i))).join('');
971
+ h += '<div class="su-add"><div class="note">A page the sitemap does not list — a route behind the login, say — can be added by hand.</div>'
972
+ + '<div class="rowf"><input class="field" id="su-mname" placeholder="name" style="width:170px;flex:none" autocomplete="off">'
973
+ + '<input class="field mono" id="su-mpath" placeholder="/path" autocomplete="off" spellcheck="false">'
974
+ + '<button class="btn-s" id="su-madd">Add</button></div></div>'
975
+ + '<div class="rowb" style="margin:14px 0 0"><button class="cta" id="su-next2"' + (setupPages().length ? '' : ' disabled') + '>Next</button></div></div>';
976
+ return h;
977
+ }
978
+
979
+ function pageRow(p, on, kind, key) {
980
+ return '<div class="frow su-row" data-kind="' + kind + '" data-key="' + esc(key) + '">'
981
+ + '<span class="chk' + (on ? ' on' : '') + '">' + (on ? CHECK_SVG : '') + '</span>'
982
+ + '<span class="su-n" title="' + esc(p.name) + '">' + esc(p.name) + '</span><span class="su-p">' + esc(p.url) + '</span>'
983
+ + (kind === 'm' ? '<a href="#" class="su-rm">remove</a>' : '') + '</div>';
984
+ }
985
+
986
+ function loginStep() {
987
+ const S = SETUP;
988
+ const opt = (mode, title, body) => '<div class="opt' + (S.mode === mode ? ' opt-on' : '') + '" data-mode="' + mode + '">'
989
+ + '<span class="r' + (S.mode === mode ? ' r-on' : '') + '"></span><div class="opt-b"><b>' + title + '</b>' + body + '</div></div>';
990
+ return '<div class="step"><div class="st"><span class="num">3 of 3</span><b>Does the app ask you to log in?</b></div><div class="opts">'
991
+ + opt('none', 'No — the pages are public', '')
992
+ + opt('session', 'Yes — I will log in myself, in a browser',
993
+ '<div class="note">Works with any login: single sign-on, two-factor, a code by email. A browser window opens, you sign in the way you always do, and the session is kept for the next captures.</div>'
994
+ + '<div class="upd-cmd"><code>ia-qa-heal login</code><button class="copy" data-copy="ia-qa-heal login" data-copy-label="copy command">copy command</button></div>'
995
+ + '<div class="note">Run it once in a terminal, after setup. The console cannot open that window for you: it waits for a person at the keyboard. The session file holds live cookies, so it is kept out of git.</div>')
996
+ + opt('form', 'Yes — fill a plain login form from stored credentials',
997
+ '<div class="note">For pipelines: no human needed. A username, a password and a submit button, nothing fancier. Single sign-on and two-factor will not get through this way.</div>'
998
+ + (S.mode === 'form' ? formFields() : ''))
999
+ + '</div></div>';
1000
+ }
1001
+
1002
+ function formFields() {
1003
+ const S = SETUP;
1004
+ const env = S.store === 'env';
1005
+ const field = (key, label) => '<div><div class="lbl">' + label + '</div><input class="field mono" data-f="' + key + '" value="' + esc(S[key]) + '" autocomplete="off" spellcheck="false"></div>';
1006
+ return '<div class="su-sub"><div class="lbl">Where are the credentials kept?</div><div class="seg">'
1007
+ + '<span data-store="env"' + (env ? ' class="on"' : '') + '>Environment variables</span>'
1008
+ + '<span data-store="aws-ssm"' + (env ? '' : ' class="on"') + '>AWS SSM Parameter Store</span></div></div>'
1009
+ + '<div class="g2">' + field('usernameKey', env ? 'Variable holding the username' : 'SSM parameter holding the username')
1010
+ + field('passwordKey', env ? 'Variable holding the password' : 'SSM parameter holding the password') + '</div>'
1011
+ + (env ? '' : '<div class="su-sub" style="max-width:260px">' + field('region', 'AWS region') + '</div>')
1012
+ + '<div class="su-dash">These are the <b style="color:var(--text)">names</b> of ' + (env ? 'variables' : 'parameters') + ', not their values. '
1013
+ + 'There is no password field on this page, on purpose: the value stays ' + (env ? 'in your environment' : 'in SSM') + ' and is only read when a capture logs in.</div>'
1014
+ + '<div class="su-sub" style="max-width:260px">' + field('loginUrl', 'Login page') + '</div>'
1015
+ + '<details class="tech"><summary>Form fields — the defaults fit most plain forms</summary><div class="g3">'
1016
+ + field('usernameSelector', 'Username field') + field('passwordSelector', 'Password field') + field('submitSelector', 'Submit button')
1017
+ + '</div></details>';
1018
+ }
1019
+
1020
+ function bindSetup() {
1021
+ const S = SETUP;
1022
+ const box = q('#setupForm');
1023
+ const on = (sel, fn) => { const el = q(sel); if (el) el.onclick = (e) => { e.preventDefault(); fn(); }; };
1024
+ const url = q('#su-url');
1025
+ if (url) {
1026
+ url.oninput = () => { S.baseUrl = url.value.trim(); schedulePreview(); };
1027
+ url.onkeydown = (e) => { if (e.key === 'Enter') nextFromUrl(); };
1028
+ url.focus();
1029
+ }
1030
+ on('#su-next1', nextFromUrl);
1031
+ on('#su-sitemap', readSitemapNow);
1032
+ on('#su-all', () => { S.found.forEach((p) => { S.selected[p.url] = true; }); drawSetup(); schedulePreview(); });
1033
+ on('#su-none', () => { S.selected = {}; drawSetup(); schedulePreview(); });
1034
+ on('#su-more', () => { S.showAll = true; drawSetup(); });
1035
+ on('#su-madd', addManualPage);
1036
+ on('#su-next2', () => { S.step = 3; S.error = ''; drawSetup(); schedulePreview(); });
1037
+ on('#su-write', writeSetupNow);
1038
+ const mpath = q('#su-mpath');
1039
+ if (mpath) mpath.onkeydown = (e) => { if (e.key === 'Enter') addManualPage(); };
1040
+ box.querySelectorAll('[data-goto]').forEach((a) => {
1041
+ a.onclick = (e) => { e.preventDefault(); S.step = Number(a.dataset.goto); S.error = ''; drawSetup(); schedulePreview(); };
1042
+ });
1043
+ box.querySelectorAll('.su-row').forEach((row) => {
1044
+ row.onclick = (e) => {
1045
+ if (row.dataset.kind === 'm') {
1046
+ if (e.target.classList.contains('su-rm')) {
1047
+ e.preventDefault();
1048
+ S.manual.splice(Number(row.dataset.key), 1);
1049
+ drawSetup(); schedulePreview();
1050
+ }
1051
+ return;
1052
+ }
1053
+ const k = row.dataset.key;
1054
+ if (S.selected[k]) delete S.selected[k]; else S.selected[k] = true;
1055
+ drawSetup(); schedulePreview();
1056
+ };
1057
+ });
1058
+ box.querySelectorAll('[data-mode]').forEach((el) => {
1059
+ el.onclick = () => {
1060
+ if (S.mode === el.dataset.mode) return;
1061
+ S.mode = el.dataset.mode; S.error = '';
1062
+ drawSetup(); schedulePreview();
1063
+ };
1064
+ });
1065
+ box.querySelectorAll('[data-store]').forEach((el) => {
1066
+ el.onclick = (e) => { e.stopPropagation(); switchStore(el.dataset.store); };
1067
+ });
1068
+ box.querySelectorAll('input[data-f]').forEach((el) => {
1069
+ el.oninput = () => { S[el.dataset.f] = el.value.trim(); schedulePreview(); };
1070
+ });
1071
+ bindCopy();
1072
+ }
1073
+
1074
+ function nextFromUrl() {
1075
+ const S = SETUP;
1076
+ let ok = false;
1077
+ try { const u = new URL(S.baseUrl); ok = u.protocol === 'http:' || u.protocol === 'https:'; } catch (e) { ok = false; }
1078
+ if (!ok) {
1079
+ S.error = 'Type the full address, starting with http:// or https:// — for example https://staging.example.com';
1080
+ drawSetup();
1081
+ return;
1082
+ }
1083
+ // Pages read from another address belong to another app.
1084
+ if (S.foundFor && S.foundFor !== S.baseUrl) { S.found = null; S.selected = {}; S.foundFor = ''; }
1085
+ S.error = ''; S.step = 2;
1086
+ drawSetup(); schedulePreview();
1087
+ }
1088
+
1089
+ async function readSitemapNow() {
1090
+ const S = SETUP;
1091
+ S.busy = true; S.error = ''; drawSetup();
1092
+ try {
1093
+ const r = await postJson('/api/setup/sitemap', { baseUrl: S.baseUrl });
1094
+ if (r.error) S.error = r.error;
1095
+ else {
1096
+ S.found = r.pages; S.reason = r.reason || []; S.capped = Boolean(r.capped);
1097
+ S.foundFor = S.baseUrl; S.showAll = false; S.selected = {};
1098
+ r.pages.forEach((p) => { S.selected[p.url] = true; });
1099
+ }
1100
+ } catch (e) {
1101
+ S.error = 'The console lost contact with its server: ' + e;
1102
+ }
1103
+ S.busy = false;
1104
+ drawSetup(); schedulePreview();
1105
+ }
1106
+
1107
+ function addManualPage() {
1108
+ const S = SETUP;
1109
+ const name = q('#su-mname').value.trim();
1110
+ let where = q('#su-mpath').value.trim();
1111
+ if (!name || !where) { S.error = 'A page needs a name and a path.'; drawSetup(); return; }
1112
+ const low = where.toLowerCase();
1113
+ if (where.charAt(0) !== '/' && low.indexOf('http://') !== 0 && low.indexOf('https://') !== 0) where = '/' + where;
1114
+ S.manual.push({ name: name, url: where });
1115
+ S.error = '';
1116
+ drawSetup(); schedulePreview();
1117
+ }
1118
+
1119
+ function switchStore(store) {
1120
+ const S = SETUP;
1121
+ if (S.store === store) return;
1122
+ const from = store === 'env' ? SSM_DEFAULTS : ENV_DEFAULTS;
1123
+ const to = store === 'env' ? ENV_DEFAULTS : SSM_DEFAULTS;
1124
+ if (S.usernameKey === from.usernameKey) S.usernameKey = to.usernameKey;
1125
+ if (S.passwordKey === from.passwordKey) S.passwordKey = to.passwordKey;
1126
+ S.store = store;
1127
+ drawSetup(); schedulePreview();
1128
+ }
1129
+
1130
+ function schedulePreview() {
1131
+ clearTimeout(previewTimer);
1132
+ previewTimer = setTimeout(refreshPreview, 250);
1133
+ }
1134
+
1135
+ async function refreshPreview() {
1136
+ let r;
1137
+ try { r = await postJson('/api/setup/preview', setupBody()); } catch (e) { return; }
1138
+ const cfg = r.config || {};
1139
+ const pages = cfg.pages || [];
1140
+ const shown = Object.assign({}, cfg, { pages: pages.slice(0, 7) });
1141
+ q('#setupPath').textContent = r.file || '';
1142
+ q('#setupJson').textContent = JSON.stringify(shown, null, 2);
1143
+ const more = pages.length - 7;
1144
+ q('#setupMore').textContent = more > 0 ? '… and ' + more + ' more page' + (more === 1 ? '' : 's') + ' in the file.' : '';
1145
+ const missing = SETUP.step === 3 ? (r.problems || []) : [];
1146
+ q('#setupProblems').innerHTML = missing.length
1147
+ ? '<ul class="su-miss">' + missing.map((p) => '<li>' + esc(p) + '</li>').join('') + '</ul>'
1148
+ : '';
1149
+ }
1150
+
1151
+ async function writeSetupNow() {
1152
+ const S = SETUP;
1153
+ S.busy = true; S.error = ''; drawSetup();
1154
+ let r;
1155
+ try { r = await postJson('/api/setup/write', setupBody()); }
1156
+ catch (e) { r = { error: 'The console lost contact with its server: ' + e }; }
1157
+ S.busy = false;
1158
+ if (!r.written) { S.error = r.error || 'The config could not be written.'; drawSetup(); return; }
1159
+ SETUP = setupBlank(); setupDir = null;
1160
+ render(r.state);
1161
+ showSetupDone(r);
1162
+ }
1163
+
1164
+ /* The result lands where every other result does — in the Actions card — and
1165
+ says what the chosen login still needs from a person, because that is the one
1166
+ step this form could not take for them. */
1167
+ function showSetupDone(r) {
1168
+ const missing = r.missingEnv || [];
1169
+ let what;
1170
+ if (r.login === 'session') {
1171
+ what = 'Next, log in once from a terminal in this folder. A browser opens, you sign in the way you always do, and the session is kept for every capture after that.';
1172
+ } else if (r.login === 'form' && r.store === 'aws-ssm') {
1173
+ what = 'Only the SSM parameter names were saved. Your local AWS credentials fetch the values when a capture logs in.';
1174
+ } else if (r.login === 'form') {
1175
+ what = 'Only the variable names were saved.' + (missing.length
1176
+ ? ' ' + missing.join(' and ') + (missing.length === 1 ? ' is' : ' are') + ' not set in the environment this console was started from — set '
1177
+ + (missing.length === 1 ? 'it' : 'them') + ' there and reopen the console before the first capture, or it will stop at the login page and say so.'
1178
+ : ' Both are set in the environment this console runs in.');
1179
+ } else {
1180
+ what = 'No login — the pages will be read the way a visitor sees them.';
1181
+ }
1182
+ q('#result').innerHTML = '<div class="res res-ok"><div class="res-head">✅ <span>Done</span></div>'
1183
+ + '<div class="res-what"><b style="color:var(--text)">' + esc(r.headline) + '</b></div>'
1184
+ + '<div class="res-what">' + esc(what) + '</div>'
1185
+ + (r.login === 'session'
1186
+ ? '<div class="upd-cmd"><code>ia-qa-heal login</code><button class="copy" data-copy="ia-qa-heal login" data-copy-label="copy command">copy command</button></div>'
1187
+ : '')
1188
+ + '<div id="next"></div></div>';
1189
+ renderNext(r.next);
1190
+ bindCopy();
1191
+ }
1192
+
785
1193
  /* ---- history ---------------------------------------------------------- */
786
1194
 
787
1195
  function renderHistory(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ui/page.ts"],"names":[],"mappings":";;AAqBA,8CAi2BC;AAt3BD;;;;;;;;;;;;;;;;GAgBG;AACH,qCAAiD;AACjD,sCAAyD;AACzD,iCAAuC;AAEvC,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,yEAAyE;IACzE,EAAE;IACF,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,4DAA4D;IAC5D,EAAE;IACF,+EAA+E;IAC/E,2EAA2E;IAC3E,8EAA8E;IAC9E,oEAAoE;IACpE,EAAE;IACF,iFAAiF;IACjF,kFAAkF;IAClF,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;IACjC,uFAAuF;IACvF,wFAAwF;IACxF,uFAAuF;IACvF,sFAAsF;IACtF,MAAM,IAAI,GAAG,IAAA,oBAAa,GAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,gEAAgE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI;QACnG,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;;;;EAIP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gHAiKuG,qBAAY,IAAI,OAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAqDxI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2lBf,8BAAqB;;;;;;;;;;;;;;;;;;eAkBxB,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ui/page.ts"],"names":[],"mappings":";;AAqBA,8CAyvCC;AA9wCD;;;;;;;;;;;;;;;;GAgBG;AACH,qCAAiD;AACjD,sCAAyD;AACzD,iCAAuC;AAEvC,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,yEAAyE;IACzE,EAAE;IACF,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,4DAA4D;IAC5D,EAAE;IACF,+EAA+E;IAC/E,2EAA2E;IAC3E,8EAA8E;IAC9E,oEAAoE;IACpE,EAAE;IACF,iFAAiF;IACjF,kFAAkF;IAClF,4EAA4E;IAC5E,MAAM,OAAO,GAAG,IAAA,uBAAc,GAAE,CAAC;IACjC,uFAAuF;IACvF,wFAAwF;IACxF,uFAAuF;IACvF,sFAAsF;IACtF,MAAM,IAAI,GAAG,IAAA,oBAAa,GAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC,gEAAgE,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI;QACnG,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;;;;EAIP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gHAwNuG,qBAAY,IAAI,OAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAsExI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA26Bf,8BAAqB;;;;;;;;;;;;;;;;;;eAkBxB,CAAC;AAChB,CAAC"}
package/dist/ui/server.js CHANGED
@@ -51,6 +51,7 @@ const crypto = __importStar(require("crypto"));
51
51
  const child_process_1 = require("child_process");
52
52
  const config_1 = require("../config");
53
53
  const registry_1 = require("./registry");
54
+ const setup_1 = require("./setup");
54
55
  const diff_1 = require("../cli/diff");
55
56
  const ingest_1 = require("../ingest");
56
57
  const evidence_1 = require("../evidence");
@@ -413,6 +414,20 @@ function setActiveProject(dir) {
413
414
  function getActiveProject() {
414
415
  return activeDir ?? (0, config_1.baseDir)();
415
416
  }
417
+ /**
418
+ * A capture is at least one page contract, not a directory. `saveConfig` creates `mapping/`
419
+ * empty, and reading that as a capture told a freshly set-up folder "You have a capture of
420
+ * the app" and offered to promote it — a baseline of nothing. `_`-prefixed entries are
421
+ * layouts, shots and resolutions, never pages.
422
+ */
423
+ function hasContracts(dir) {
424
+ try {
425
+ return fs.readdirSync(dir).some((f) => f.endsWith('.json') && !f.startsWith('_'));
426
+ }
427
+ catch {
428
+ return false;
429
+ }
430
+ }
416
431
  function buildState() {
417
432
  if (activeDir)
418
433
  (0, config_1.setBaseDir)(activeDir);
@@ -436,9 +451,17 @@ function buildState() {
436
451
  configFile: path.join((0, config_1.baseDir)(), config_1.CONFIG_DIR, 'config.json'),
437
452
  };
438
453
  }
439
- catch {
454
+ catch (e) {
440
455
  project.dir = (0, config_1.baseDir)();
441
- project.error = 'No .ia-qa/config.json in this folder run `ia-qa-heal init` here.';
456
+ // Absent and broken are two different answers. An absent config gets the setup form; a
457
+ // broken one is the user's file and gets its error — never a form that would replace it.
458
+ if (fs.existsSync((0, config_1.configPath)())) {
459
+ project.error = `.ia-qa/config.json is here but cannot be read — ${e instanceof Error ? e.message : String(e)}`;
460
+ }
461
+ else {
462
+ project.needsSetup = true;
463
+ project.error = 'No .ia-qa/config.json in this folder yet — set it up below.';
464
+ }
442
465
  }
443
466
  // Which frameworks the suite is actually written in, read off the inventory
444
467
  // rather than guessed from a folder name — `ingest` already recorded the call
@@ -459,7 +482,7 @@ function buildState() {
459
482
  hasBaseline: fs.existsSync(base),
460
483
  // Told apart because the empty state's advice differs: with a capture and no
461
484
  // reference the next step is to promote one, not to "capture the app" again.
462
- hasMapping: fs.existsSync(current),
485
+ hasMapping: hasContracts(current),
463
486
  history: { entries: history, summary: (0, history_1.summarize)(history) },
464
487
  actions: actionCatalogue(),
465
488
  };
@@ -711,8 +734,11 @@ async function handle(req, res, token, onBye) {
711
734
  * the console exists for people who do not have one.
712
735
  *
713
736
  * So consent can also be given here — but it is still consent, not discovery:
714
- * a path is only accepted if it actually holds `.ia-qa/config.json`, and it is
715
- * *registered*, which means `ui --forget` can take it back. Nothing scans.
737
+ * a project is *registered* only once it holds `.ia-qa/config.json`, which means
738
+ * `ui --forget` can take it back. Nothing scans. A folder that has never been set
739
+ * up opens on the setup form instead of a refusal — that refusal used to say "run
740
+ * `ia-qa-heal init` there", a terminal instruction for the people without one —
741
+ * and joins the list the moment the form has written its config.
716
742
  */
717
743
  if (req.method === 'POST' && url.pathname === '/api/project/add') {
718
744
  let body;
@@ -725,31 +751,98 @@ async function handle(req, res, token, onBye) {
725
751
  }
726
752
  const raw = typeof body.dir === 'string' ? body.dir.trim().replace(/^["']|["']$/g, '') : '';
727
753
  if (raw === '') {
728
- send(res, 400, 'application/json', JSON.stringify({ error: 'Give the folder that holds your .ia-qa directory.' }));
754
+ send(res, 400, 'application/json', JSON.stringify({ error: 'Give the path of the project folder.' }));
729
755
  return;
730
756
  }
731
757
  const dir = path.resolve(raw);
732
- if (!(0, registry_1.isProjectDir)(dir)) {
758
+ if (path.basename(dir) === config_1.CONFIG_DIR) {
733
759
  send(res, 400, 'application/json', JSON.stringify({
734
- error: `No .ia-qa/config.json in ${dir}\n\n` +
735
- `Pick the project's top folder — the one you would open in your editor, ` +
736
- `not the .ia-qa folder itself. If that project has never been set up, run ` +
737
- `\`ia-qa-heal init\` in it first.`,
760
+ error: `That is the ${config_1.CONFIG_DIR} folder itself. Pick the project's top folder — the one you would open in your editor.`,
738
761
  }));
739
762
  return;
740
763
  }
741
- setActiveProject(dir);
742
- let addedUrl;
764
+ let isFolder = false;
743
765
  try {
744
- addedUrl = (0, config_1.loadConfig)().baseUrl;
766
+ isFolder = fs.statSync(dir).isDirectory();
745
767
  }
746
768
  catch {
747
- /* a project whose config will not parse can still be selected, and shown as broken */
769
+ isFolder = false;
770
+ }
771
+ if (!isFolder) {
772
+ send(res, 400, 'application/json', JSON.stringify({ error: `${dir} is not a folder on this machine.` }));
773
+ return;
774
+ }
775
+ setActiveProject(dir);
776
+ if ((0, registry_1.isProjectDir)(dir)) {
777
+ let addedUrl;
778
+ try {
779
+ addedUrl = (0, config_1.loadConfig)().baseUrl;
780
+ }
781
+ catch {
782
+ /* a project whose config will not parse can still be selected, and shown as broken */
783
+ }
784
+ (0, registry_1.rememberProject)(dir, addedUrl);
748
785
  }
749
- (0, registry_1.rememberProject)(dir, addedUrl);
750
786
  send(res, 200, 'application/json; charset=utf-8', JSON.stringify(buildState()));
751
787
  return;
752
788
  }
789
+ /**
790
+ * The setup form's three calls — see ui/setup.ts. `preview` and `write` run the same
791
+ * `planSetup`, so the panel on the page is the file that would be written. None of them
792
+ * spawns anything. The one new authority is writing `.ia-qa/config.json` into the folder
793
+ * this console is showing, and only where none exists; the sitemap read is the same
794
+ * plain fetch `init --discover` makes, to an address the user typed.
795
+ */
796
+ if (req.method === 'POST' && url.pathname.startsWith('/api/setup/')) {
797
+ let body;
798
+ try {
799
+ body = JSON.parse(await readBody(req));
800
+ }
801
+ catch {
802
+ send(res, 400, 'application/json', JSON.stringify({ error: 'bad request body' }));
803
+ return;
804
+ }
805
+ const dir = getActiveProject();
806
+ if (url.pathname === '/api/setup/sitemap') {
807
+ try {
808
+ const found = await (0, setup_1.readSitemap)(typeof body.baseUrl === 'string' ? body.baseUrl.trim() : '');
809
+ send(res, 200, 'application/json; charset=utf-8', JSON.stringify(found));
810
+ }
811
+ catch (e) {
812
+ send(res, 400, 'application/json', JSON.stringify({ error: e instanceof Error ? e.message : String(e) }));
813
+ }
814
+ return;
815
+ }
816
+ if (url.pathname === '/api/setup/preview') {
817
+ send(res, 200, 'application/json; charset=utf-8', JSON.stringify({ ...(0, setup_1.planSetup)(body, dir), file: (0, config_1.configPath)(dir) }));
818
+ return;
819
+ }
820
+ if (url.pathname === '/api/setup/write') {
821
+ const result = (0, setup_1.writeSetup)(body, dir);
822
+ if (!result.written) {
823
+ send(res, 400, 'application/json', JSON.stringify({ error: result.error, problems: result.plan?.problems ?? [] }));
824
+ return;
825
+ }
826
+ const { config, mode, missingEnv } = result.plan;
827
+ (0, registry_1.rememberProject)(dir, config.baseUrl);
828
+ const n = config.pages.length;
829
+ // `map` stops at a login wall it cannot pass — before `login` has run, or with the
830
+ // form's variables absent from this process — so it is offered only where it can work.
831
+ const canLook = mode === 'none' || (mode === 'form' && missingEnv.length === 0);
832
+ send(res, 200, 'application/json; charset=utf-8', JSON.stringify({
833
+ written: result.file,
834
+ headline: `.ia-qa/config.json written — ${n} page${n === 1 ? '' : 's'}`,
835
+ login: mode,
836
+ store: config.secrets.username?.source ?? null,
837
+ missingEnv,
838
+ next: canLook
839
+ ? [{ id: 'map', label: 'Look at the app', means: ACTIONS.map.means, writes: ACTIONS.map.writes }]
840
+ : [],
841
+ state: buildState(),
842
+ }));
843
+ return;
844
+ }
845
+ }
753
846
  if (req.method === 'POST' && url.pathname === '/api/run') {
754
847
  let body;
755
848
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6QA,0CAIC;AAiBD,kCA4CC;AAmBD,wCAYC;AAaD,8BASC;AAUD,8BAiBC;AAOD,wCAIC;AAwCD,4CAGC;AAED,4CAEC;AA2KD,0BA6DC;AAoUD,8BAoBC;AAxhCD,2CAA6B;AAC7B,uCAAyB;AACzB,2CAA6B;AAC7B,+CAAiC;AACjC,iDAAsC;AACtC,sCAA0I;AAC1I,yCAAkG;AAClG,mCAAgF;AAChF,sCAA+D;AAC/D,sCAAsC;AACtC,0CAAwD;AACxD,wCAAoD;AACpD,sCAAyC;AAEzC,sCAA4F;AAC5F,wCAA4E;AAC5E,iCAA2C;AAuD3C;;;;;;;;;;;;;;GAcG;AACH,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,gFAAgF;AAChF,iEAAiE;AACjE,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,2FAA2F;AAC9E,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAsC3C,MAAM,OAAO,GAA2B;IACtC,GAAG,EAAE;QACH,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC;QAC9B,KAAK,EAAE,uBAAuB;QAC9B,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,qHAAqH;KAC7H;IACD,MAAM,EAAE;QACN,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,KAAK,EAAE,0BAA0B;QACjC,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,iGAAiG;KACzG;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,iHAAiH;KACzH;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,KAAK,EAAE,kCAAkC;QACzC,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,8HAA8H;QACrI,sEAAsE;QACtE,yEAAyE;QACzE,2EAA2E;QAC3E,KAAK,EAAE;YACL,GAAG,EAAE,sCAAsC;YAC3C,KAAK,EAAE,sCAAsC;SAC9C;KACF;IACD,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,KAAK,EAAE,4BAA4B;QACnC,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,0HAA0H;QACjI,KAAK,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE;KACnD;IACD;;;;;;;;;;OAUG;IACH,YAAY,EAAE;QACZ,IAAI,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,CAAC;QAC/C,KAAK,EAAE,kCAAkC;QACzC,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,iLAAiL;QACxL,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE;KACnD;IACD,eAAe,EAAE;QACf,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC;QACtC,KAAK,EAAE,wCAAwC;QAC/C,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,4KAA4K;QACnL,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE;KACnD;IACD,SAAS,EAAE;QACT,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;QAC1B,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,2GAA2G;KACnH;IACD,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,KAAK,CAAC;QACb,KAAK,EAAE,sBAAsB;QAC7B,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,uGAAuG;KAC/G;IACD;;;;;;;;;;;OAWG;IACH,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QAC/B,KAAK,EAAE,mCAAmC;QAC1C,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,qKAAqK;KAC7K;IACD;;;;OAIG;IACH,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;QAC7B,KAAK,EAAE,iCAAiC;QACxC,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,iMAAiM;QACxM,SAAS,EAAE,IAAI;KAChB;IACD;;;;;OAKG;IACH,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC;QAC1C,KAAK,EAAE,8BAA8B;QACrC,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,kIAAkI;QACzI,SAAS,EAAE,IAAI;KAChB;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;QACxC,KAAK,EAAE,8BAA8B;QACrC,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,4IAA4I;QACnJ,SAAS,EAAE,IAAI;KAChB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,KAAK,EAAE,6BAA6B;QACpC,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,yFAAyF;KACjG;CACF,CAAC;AAEF,SAAgB,eAAe;IAC7B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,WAAW,CAAC,QAAgB,EAAE,IAAY,EAAE,KAA0B;IACpF,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,EAAU,EAAQ,EAAE;QAC/B,IAAI,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9E,2EAA2E;QAC3E,uCAAuC;QACvC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClB,GAAG,CAAC,eAAe,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;QAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK;QAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/D;;;;;;;;;;;OAWG;IACH;;;;;;;;OAQG;IACH,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,MAAM;YAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC3C,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,QAAQ,KAAK,gBAAgB,IAAI,IAAI,KAAK,MAAM;QAAE,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAClF,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAA4C,CAAC;QACnG,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAiC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAE7F,SAAgB,SAAS,CAAC,MAAc;IACtC,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM;QACnC,QAAQ,EAAE,CAAC,IAAA,sBAAa,EAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9E,KAAK,EAAE,MAAM;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAA2B,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAEtF;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,MAAc;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAgB,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9F,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM;QAC1C,QAAQ,EAAE,CAAC,IAAA,qBAAa,EAAC,MAAM,CAAC,EAAE,GAAG,IAAA,mBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACrE,KAAK,EAAE,MAAM;KACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAwB;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,CAAC;AACxE,CAAC;AAED,SAAS,QAAQ;IACf,8EAA8E;IAC9E,6DAA6D;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC;AAgBD;;;;;GAKG;AACH;;;;;;;;;GASG;AACH,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,SAAS,GAAG,GAAG,CAAC;IAChB,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,SAAS,IAAI,IAAA,gBAAO,GAAE,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,SAAS;QAAE,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAA,mBAAU,GAAE,CAAC;IAE7B,6EAA6E;IAC7E,8EAA8E;IAC9E,0EAA0E;IAC1E,+CAA+C;IAC/C,IAAI,OAAO,GAA4B,EAAE,OAAO,EAAE,IAAA,0BAAiB,GAAE,EAAE,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,mBAAU,GAAE,CAAC;QACzB,OAAO,GAAG;YACR,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;YACvB,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACpD,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;YAC9B,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;YAC5C,GAAG,EAAE,IAAA,gBAAO,GAAE;YACd,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAA,gBAAO,GAAE,EAAE,mBAAU,EAAE,aAAa,CAAC;SAC5D,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,GAAG,IAAA,gBAAO,GAAE,CAAC;QACxB,uFAAuF;QACvF,yFAAyF;QACzF,IAAI,EAAE,CAAC,UAAU,CAAC,IAAA,mBAAU,GAAE,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,GAAG,mDAAmD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,KAAK,GAAG,6DAA6D,CAAC;QAChF,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,8EAA8E;IAC9E,mCAAmC;IACnC,MAAM,SAAS,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,SAAS;QAC1B,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACpF,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,OAAO,GAAG,IAAA,qBAAW,GAAE,CAAC;IAC9B,MAAM,KAAK,GAA4B;QACrC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,IAAI,CAAC,EAAE;QAC1E,yEAAyE;QACzE,+DAA+D;QAC/D,QAAQ,EAAE,IAAA,uBAAY,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACnG,SAAS,EAAE,gBAAgB,EAAE;QAC7B,sEAAsE;QACtE,MAAM,EAAE,IAAA,qBAAY,GAAE;QACtB,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAChC,6EAA6E;QAC7E,6EAA6E;QAC7E,UAAU,EAAE,YAAY,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAA,mBAAS,EAAC,OAAO,CAAC,EAAE;QAC1D,OAAO,EAAE,eAAe,EAAE;KAC3B,CAAC;IAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,IAAA,qBAAc,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC5B,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,uBAAgB,EAAC,OAAO,CAAC,CAAC;IACtC,+EAA+E;IAC/E,mFAAmF;IACnF,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,aAAa,GAAG,KAAK,CAAC;IAChD,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IACpB,KAAK,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAE9F,2EAA2E;IAC3E,MAAM,KAAK,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC1B,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;QACjD,IAAI,QAAQ;YAAE,SAAS;QACvB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAC7E,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAElC,MAAM,IAAI,GAAG,IAAA,uBAAY,EAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,GAAuB,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,CAAC,CAAgB,CAAC;QACjG,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,IAAA,sBAAW,EAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACvC,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,IAAI;gBACV,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc;gBACnG,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxF,KAAK,EAAE,EAAE,EAAE,KAAK;gBAChB,UAAU,EAAE,EAAE,EAAE,UAAU,IAAI,EAAE;gBAChC,IAAI,EAAE,EAAE,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IACtC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,IAAI,CAAC,GAAwB,EAAE,IAAY,EAAE,IAAY,EAAE,IAAqB;IACvF,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;QAClB,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,UAAU;QAC3B,2EAA2E;QAC3E,4DAA4D;QAC5D,wBAAwB,EAAE,SAAS;QACnC,iBAAiB,EAAE,MAAM;QACzB,yBAAyB,EACvB,iKAAiK;KACpK,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAyB,EAAE,KAAK,GAAG,EAAE,GAAG,IAAI;IAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACnB,IAAI,IAAI,CAAC,CAAC;YACV,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,OAAkB,EAAE;IAEpB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAErD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,WAAW,GAAwB,IAAI,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,KAAK,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;YAChC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,4EAA4E;IAC5E,wBAAwB;IACxB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,IAAI,GACR,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,GAAG,KAAK,GAAG,YAAY,CAAC;YAC3C,CAAC,QAAQ,KAAK,CAAC,IAAI,GAAG,GAAG,QAAQ,GAAG,iBAAiB,CAAC;YACtD,CAAC,QAAQ,KAAK,CAAC,IAAI,GAAG,GAAG,SAAS,GAAG,kBAAkB,CAAC,CAAC;QAC3D,IAAI,IAAI,EAAE,CAAC;YACT,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,WAAW,EAAE,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,8EAA8E;QAC9E,8EAA8E;QAC9E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,MAAM,GAAG,GAAG,oBAAoB,IAAI,OAAO,KAAK,EAAE,CAAC;IACnD,OAAO;QACL,GAAG;QACH,KAAK,EAAE,GAAG,EAAE;YACV,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QACD,MAAM,EAAE,CAAC,EAAc,EAAE,EAAE;YACzB,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,GAAyB,EACzB,GAAwB,EACxB,KAAa,EACb,KAAiB;IAEjB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,gDAAgD,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAK,GAAG,CAAC,OAAO,CAAC,cAAc,CAAwB,IAAI,EAAE,CAAC;IACrG,8EAA8E;IAC9E,gDAAgD;IAChD,MAAM,EAAE,GACN,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC7B,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,yCAAyC,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,0BAA0B,EAAE,IAAA,wBAAiB,EAAC,KAAK,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,sEAAsE;IACtE,8EAA8E;IAC9E,iEAAiE;IACjE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,0EAA0E;IAC1E,0EAA0E;IAC1E,qDAAqD;IACrD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,IAAI,SAAS;YAAE,IAAA,mBAAU,EAAC,SAAS,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,iBAAQ,GAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,6BAA6B,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,6EAA6E;IAC7E,2EAA2E;IAC3E,mBAAmB;IACnB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;QAC7D,IAAI,IAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAqB,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAA,kCAAuB,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CACF,GAAG,EACH,GAAG,EACH,kBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EACH,6GAA6G;aAChH,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtB,+DAA+D;QAC/D,IAAI,IAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAA,mBAAU,GAAE,CAAC,OAAO,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,8EAA8E;QAChF,CAAC;QACD,IAAA,0BAAe,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACjE,IAAI,IAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAqB,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAC,CAAC;YACtG,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,mBAAU,EAAE,CAAC;YACtC,IAAI,CACF,GAAG,EACH,GAAG,EACH,kBAAkB,EAClB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,eAAe,mBAAU,wFAAwF;aACzH,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,mCAAmC,EAAE,CAAC,CAAC,CAAC;YACzG,OAAO;QACT,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,IAAA,uBAAY,EAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,QAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAA,mBAAU,GAAE,CAAC,OAAO,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,sFAAsF;YACxF,CAAC;YACD,IAAA,0BAAe,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED;;;;;;OAMG;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpE,IAAI,IAAkB,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAiB,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAE/B,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAW,EAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7F,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5G,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAA,iBAAS,EAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAA,mBAAU,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtH,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;gBACnH,OAAO;YACT,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YACjD,IAAA,0BAAe,EAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAC9B,mFAAmF;YACnF,uFAAuF;YACvF,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;YAChF,IAAI,CACF,GAAG,EACH,GAAG,EACH,iCAAiC,EACjC,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,MAAM,CAAC,IAAI;gBACpB,QAAQ,EAAE,gCAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;gBACvE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,IAAI;gBAC9C,UAAU;gBACV,IAAI,EAAE,OAAO;oBACX,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;oBACjG,CAAC,CAAC,EAAE;gBACN,KAAK,EAAE,UAAU,EAAE;aACpB,CAAC,CACH,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACzD,IAAI,IAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAwB,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QACD,2EAA2E;QAC3E,qEAAqE;QACrE,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC9E,2EAA2E;QAC3E,6EAA6E;QAC7E,gEAAgE;QAChE,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,QAAQ,KAAK,OAAO;gBACpB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC1B,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,IAAI,GAAG,UAAU,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAG,UAAsC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzG,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK;YACxB,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK;YACxB,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM;SAC3B,CAAC,CAAC,CAAC;QACJ,IAAI,CACF,GAAG,EACH,GAAG,EACH,iCAAiC,EACjC,IAAI,CAAC,SAAS,CAAC;YACb,GAAG,MAAM;YACT,GAAG,IAAI;YACP,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI;YACJ,uEAAuE;YACvE,2CAA2C;YAC3C,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI;SACxC,CAAC,CACH,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH;;;;;;;;;;;;GAYG;AACH,2EAA2E;AAC3E,yEAAyE;AACzE,sCAAsC;AACtC,MAAM,UAAU,GAAG,0CAA0C,CAAC;AAE9D,MAAM,YAAY,GAA2B;IAC3C,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF,SAAgB,SAAS,CAAC,MAAc,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,+EAA+E;IAC/E,wEAAwE;IACxE,yEAAyE;IACzE,2EAA2E;IAC3E,wEAAwE;IACxE,WAAW;IACX,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,OAAO;QACL,IAAI,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACrC,QAAQ,EACN,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAChD,qEAAqE;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,IAAc;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE;YAC3D,KAAK,EAAE,KAAK;YACZ,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;SACnD,CAAC,CAAC;QACH,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,CAAC,KAAa,EAAQ,EAAE;YAClC,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI;gBAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { type IaQaConfig, type PageTarget } from '../config';
2
+ import { type FetchLike } from '../discovery/sitemap';
3
+ /**
4
+ * The console's setup form — the file `ia-qa-heal init` writes, from a browser.
5
+ *
6
+ * `ui` opened in a folder with no config used to answer "run `ia-qa-heal init` here": a
7
+ * terminal instruction, printed to the one population the console exists for because it
8
+ * does not have one. This is the same wizard without the terminal.
9
+ *
10
+ * Three rules hold it, and the tests pin each:
11
+ * - **One door for preview and write.** `planSetup` builds the config and lists what is
12
+ * still missing; the page's "What this writes" panel is its output, and `writeSetup`
13
+ * refuses while that list is not empty. What the page shows is what lands on disk.
14
+ * - **It never overwrites.** It exists for a folder that has no config. A config that is
15
+ * there but broken is the user's file to fix — rewriting it from a form would discard
16
+ * whatever they had, silently.
17
+ * - **It holds no secret.** The login answers are the NAMES of environment variables or
18
+ * SSM parameters, exactly as in `init`. A field that took a password would put one on
19
+ * the wire and in a page; the browser login stays `ia-qa-heal login`, which needs a
20
+ * terminal by design and is handed over as a command to copy.
21
+ */
22
+ export type LoginMode = 'none' | 'session' | 'form';
23
+ export interface SetupRequest {
24
+ baseUrl?: unknown;
25
+ pages?: unknown;
26
+ login?: Record<string, unknown>;
27
+ }
28
+ export interface SetupPlan {
29
+ config: IaQaConfig;
30
+ problems: string[];
31
+ /** Env var names the form points at that this process's environment lacks. Presence only — a value is never read out. */
32
+ missingEnv: string[];
33
+ mode: LoginMode | null;
34
+ }
35
+ export type SetupWrite = {
36
+ written: true;
37
+ file: string;
38
+ plan: SetupPlan;
39
+ } | {
40
+ written: false;
41
+ error: string;
42
+ plan?: SetupPlan;
43
+ };
44
+ export interface SitemapAnswer {
45
+ pages: PageTarget[];
46
+ /** Why nothing came back — the same sentences `init --discover` prints. Empty when pages were found. */
47
+ reason: string[];
48
+ /** True when the list stopped at the cap: the sitemap holds more than was returned. */
49
+ capped: boolean;
50
+ }
51
+ export declare function isWebAddress(value: string): boolean;
52
+ export declare function planSetup(body: SetupRequest, cwd: string): SetupPlan;
53
+ export declare function writeSetup(body: SetupRequest, cwd: string): SetupWrite;
54
+ /** Step 2's "Find them in the sitemap" — the same plain-fetch reading `init --discover` does. */
55
+ export declare function readSitemap(baseUrl: string, fetchImpl?: FetchLike): Promise<SitemapAnswer>;
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isWebAddress = isWebAddress;
37
+ exports.planSetup = planSetup;
38
+ exports.writeSetup = writeSetup;
39
+ exports.readSitemap = readSitemap;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const config_1 = require("../config");
43
+ const init_1 = require("../cli/init");
44
+ const sitemap_1 = require("../discovery/sitemap");
45
+ const ENV_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
46
+ const SSM_NAME = /^\/?[A-Za-z0-9_.-]+(\/[A-Za-z0-9_.-]+)*$/;
47
+ const AWS_REGION = /^[a-z]{2}(-[a-z]+)+-\d+$/;
48
+ const MAX_PAGES = 500;
49
+ const MAX_FIELD = 300;
50
+ const SITEMAP_CAP = 200;
51
+ const text = (v) => (typeof v === 'string' ? v.trim() : '');
52
+ function isWebAddress(value) {
53
+ try {
54
+ const u = new URL(value);
55
+ return u.protocol === 'http:' || u.protocol === 'https:';
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ const isPageUrl = (value) => value.startsWith('/') || isWebAddress(value);
62
+ // `mappingPath` turns a name into a filename this way, so two names that collapse to the
63
+ // same string would share one contract file and overwrite each other on every `map`.
64
+ const fileKey = (name) => name.replace(/[^a-zA-Z0-9._-]/g, '-');
65
+ function readPages(raw, problems) {
66
+ if (!Array.isArray(raw))
67
+ return [];
68
+ if (raw.length > MAX_PAGES) {
69
+ problems.push(`${raw.length} pages is more than one setup takes (${MAX_PAGES}). Keep the pages your tests visit — ` +
70
+ `"Which pages am I not testing yet?" adds the rest later.`);
71
+ return [];
72
+ }
73
+ const pages = [];
74
+ const seen = new Map();
75
+ for (const item of raw) {
76
+ const name = text(item?.name);
77
+ const url = text(item?.url);
78
+ if (!name || !url) {
79
+ problems.push('Every page needs a name and a path.');
80
+ continue;
81
+ }
82
+ if (name.length > 120) {
83
+ problems.push(`The page name "${name.slice(0, 40)}…" is too long — it becomes a filename.`);
84
+ continue;
85
+ }
86
+ if (!isPageUrl(url)) {
87
+ problems.push(`"${url}" (page "${name}") is not a path like /cart, nor a full http(s) address.`);
88
+ continue;
89
+ }
90
+ const clash = seen.get(fileKey(name));
91
+ if (clash !== undefined) {
92
+ problems.push(`"${clash}" and "${name}" would share one contract file — give them different names.`);
93
+ continue;
94
+ }
95
+ seen.set(fileKey(name), name);
96
+ pages.push({ name, url });
97
+ }
98
+ return pages;
99
+ }
100
+ function readLogin(raw, problems, missingEnv) {
101
+ const mode = text(raw?.mode);
102
+ if (mode !== 'none' && mode !== 'session' && mode !== 'form') {
103
+ problems.push('Does the app ask you to log in? Pick one of the three answers.');
104
+ return { mode: null, secrets: {} };
105
+ }
106
+ // A browser session needs nothing in the config: `login` writes `.ia-qa/session.json`,
107
+ // which `map` already picks up by default.
108
+ if (mode !== 'form')
109
+ return { mode, secrets: {} };
110
+ const source = text(raw?.store) === 'aws-ssm' ? 'aws-ssm' : 'env';
111
+ const what = source === 'env' ? 'environment variable' : 'SSM parameter';
112
+ const shape = source === 'env' ? ENV_NAME : SSM_NAME;
113
+ const region = text(raw?.region);
114
+ const keys = { username: text(raw?.usernameKey), password: text(raw?.passwordKey) };
115
+ const isName = (key) => shape.test(key) && key.length <= MAX_FIELD;
116
+ for (const [label, key] of Object.entries(keys)) {
117
+ const example = source === 'env' ? `E2E_${label.toUpperCase()}` : `/staging/app/${label}`;
118
+ // Never echoed, and never carried into the config below: whatever was typed into a name
119
+ // field that is not a name may be the secret itself, and the preview sends the config
120
+ // straight back onto the page.
121
+ if (!key)
122
+ problems.push(`Which ${what} holds the ${label}? The name is missing.`);
123
+ else if (!isName(key)) {
124
+ problems.push(`The ${label} field does not look like an ${what} name. It takes the NAME (like ${example}), never the ${label} itself.`);
125
+ }
126
+ }
127
+ if (keys.username && keys.username === keys.password) {
128
+ problems.push(`The username and the password point at the same ${what}.`);
129
+ }
130
+ if (source === 'aws-ssm' && !AWS_REGION.test(region)) {
131
+ problems.push('The AWS region is missing or not in the usual shape (eu-west-3, us-east-1…).');
132
+ }
133
+ const fields = {
134
+ loginUrl: text(raw?.loginUrl),
135
+ usernameSelector: text(raw?.usernameSelector),
136
+ passwordSelector: text(raw?.passwordSelector),
137
+ submitSelector: text(raw?.submitSelector),
138
+ };
139
+ if (!isPageUrl(fields.loginUrl))
140
+ problems.push('The login page should be a path like /login, or a full http(s) address.');
141
+ const selectorLabels = [
142
+ ['usernameSelector', 'username field'],
143
+ ['passwordSelector', 'password field'],
144
+ ['submitSelector', 'submit button'],
145
+ ];
146
+ for (const [field, label] of selectorLabels) {
147
+ if (!fields[field] || fields[field].length > MAX_FIELD)
148
+ problems.push(`The selector for the ${label} is missing.`);
149
+ }
150
+ if (source === 'env') {
151
+ for (const key of [keys.username, keys.password]) {
152
+ if (ENV_NAME.test(key) && !process.env[key])
153
+ missingEnv.push(key);
154
+ }
155
+ }
156
+ const ref = (key) => ({ source, key: isName(key) ? key : '', ...(source === 'aws-ssm' ? { region } : {}) });
157
+ return {
158
+ mode,
159
+ secrets: { username: ref(keys.username), password: ref(keys.password) },
160
+ auth: { ...fields, usernameSecret: 'username', passwordSecret: 'password' },
161
+ };
162
+ }
163
+ function planSetup(body, cwd) {
164
+ const problems = [];
165
+ const missingEnv = [];
166
+ const baseUrl = text(body?.baseUrl);
167
+ if (!baseUrl)
168
+ problems.push('Where does the app live? The address is missing.');
169
+ else if (!isWebAddress(baseUrl))
170
+ problems.push(`"${baseUrl}" is not a web address — it starts with http:// or https://.`);
171
+ const pages = readPages(body?.pages, problems);
172
+ if (pages.length === 0)
173
+ problems.push('No page selected yet — pick at least one, from the sitemap or by hand.');
174
+ const login = readLogin(body?.login, problems, missingEnv);
175
+ // Detected, never asked — the same call `init --yes` makes, so both doors write the same file.
176
+ const testCommand = (0, init_1.detectTestCommand)(cwd);
177
+ const config = {
178
+ framework: 'playwright',
179
+ baseUrl,
180
+ secrets: login.secrets,
181
+ ...(login.auth ? { auth: login.auth } : {}),
182
+ pages,
183
+ ...(testCommand ? { testCommand } : {}),
184
+ };
185
+ return { config, problems: [...new Set(problems)], missingEnv, mode: login.mode };
186
+ }
187
+ function writeSetup(body, cwd) {
188
+ if (path.basename(cwd) === config_1.CONFIG_DIR) {
189
+ return { written: false, error: `This is the ${config_1.CONFIG_DIR} folder itself — set up the project's top folder instead.` };
190
+ }
191
+ if (fs.existsSync((0, config_1.configPath)(cwd))) {
192
+ return {
193
+ written: false,
194
+ error: `${config_1.CONFIG_DIR}/config.json already exists here. This form only sets up a folder that has none — it never overwrites one.`,
195
+ };
196
+ }
197
+ const plan = planSetup(body, cwd);
198
+ if (plan.problems.length > 0)
199
+ return { written: false, error: plan.problems[0], plan };
200
+ return { written: true, file: (0, config_1.saveConfig)(plan.config, cwd), plan };
201
+ }
202
+ /** Step 2's "Find them in the sitemap" — the same plain-fetch reading `init --discover` does. */
203
+ async function readSitemap(baseUrl, fetchImpl) {
204
+ if (!isWebAddress(baseUrl))
205
+ throw new Error('The address must start with http:// or https://.');
206
+ const { candidates, stats } = await (0, sitemap_1.discoverFromSitemap)(baseUrl, {
207
+ maxUrls: SITEMAP_CAP,
208
+ ...(fetchImpl ? { fetchImpl } : {}),
209
+ });
210
+ return {
211
+ pages: candidates.map((c) => ({ name: c.name, url: c.url })),
212
+ reason: candidates.length === 0 ? (0, sitemap_1.emptySitemapReason)(stats).map((line) => line.trim()) : [],
213
+ capped: candidates.length >= SITEMAP_CAP,
214
+ };
215
+ }
216
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/ui/setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ia-qa/self-healing",
3
- "version": "1.8.1",
3
+ "version": "1.9.0",
4
4
  "description": "Your Playwright, Cypress or Selenium tests break when a selector moves — this finds the element again and rewrites the test. Deterministic: no LLM decides whether your build passes. Runs entirely on your machine, with a local MCP server for agents.",
5
5
  "keywords": [
6
6
  "self-healing",