@rubytech/create-realagent 1.0.854 → 1.0.855

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2450,9 +2450,15 @@ function installService() {
2450
2450
  // Mirrors paths.ts and vnc.sh so all four sites compute the same numbers
2451
2451
  // regardless of which one reads brand.json first.
2452
2452
  const VNC_OFFSET = VNC_DISPLAY - 99;
2453
- const RFB_PORT = BRAND.rfbPort ?? 5900 + VNC_OFFSET;
2454
- const WEBSOCKIFY_PORT_BRAND = BRAND.websockifyPort ?? 6080 + VNC_OFFSET;
2455
- const CDP_PORT_BRAND = BRAND.cdpPort ?? 9222 + VNC_OFFSET;
2453
+ // Parenthesise the deterministic derivation. Operator-precedence already
2454
+ // groups (offset + base) ahead of nullish-coalesce, so this is purely a
2455
+ // textual change for readability and to satisfy Task 954's grep audit
2456
+ // (the runtime path was the real silent default; these are install-time
2457
+ // deterministic fallbacks but the audit is a single regex over the
2458
+ // codebase).
2459
+ const RFB_PORT = BRAND.rfbPort ?? (5900 + VNC_OFFSET);
2460
+ const WEBSOCKIFY_PORT_BRAND = BRAND.websockifyPort ?? (6080 + VNC_OFFSET);
2461
+ const CDP_PORT_BRAND = BRAND.cdpPort ?? (9222 + VNC_OFFSET);
2456
2462
  // Task 924/938 pre-flight — refuse to write service files if any of the
2457
2463
  // three brand-scoped ports is already held by a process that is NOT this
2458
2464
  // brand's own on-demand browser nor a peer brand's edge stack.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-realagent",
3
- "version": "1.0.854",
3
+ "version": "1.0.855",
4
4
  "description": "Install Real Agent — Built for agents. By agents.",
5
5
  "bin": {
6
6
  "create-realagent": "./dist/index.js"
@@ -43,6 +43,8 @@ Mode B skips Steps 1–5 of this runbook entirely — the user receives a token
43
43
 
44
44
  The manual walkthrough below exists so an operator can execute every step by hand when the system is broken or the automation is absent. For a normal setup — and for validating that the runbook's steps produce a working tunnel end-to-end — use the two scripts at `platform/plugins/cloudflare/scripts/`:
45
45
 
46
+ > **Task 954 — `list-cf-domains` is brand-arg + brand.json driven.** `list-cf-domains.sh` requires the brand name as `$1`; the .ts helper reads `cdpPort` from `${MAXY_PLATFORM_ROOT}/config/brand.json` (no silent default). Missing brand arg, missing brand.json, or missing `cdpPort` field each exit 1 with a named `reason=` token, and the route maps them to `field=config` (no Retry button — fix the install instead).
47
+
46
48
  ```
47
49
  setup-tunnel.sh <brand> <port> <hostname> [<hostname> ...]
48
50
  ```
@@ -5,11 +5,19 @@
5
5
  # token on stderr tagged `[list-cf-domains]`.
6
6
  #
7
7
  # Usage:
8
- # list-cf-domains.sh [<brand>]
8
+ # list-cf-domains.sh <brand>
9
9
  #
10
- # The brand arg (default: maxy) names the `${HOME}/.${BRAND}/logs/` directory
11
- # where selector-drift body dumps land. The script does not read brand.json
12
- # the directory is the only brand-derived path it needs.
10
+ # Task 954: brand arg is REQUIRED the prior silent default (string
11
+ # fallback to "maxy" when $1 was empty) made every non-Maxy brand's CF
12
+ # setup form fail on first use because the wrapper's child node helper
13
+ # read the Maxy CDP port from a hardcoded fallback. Missing arg now exits
14
+ # 1 with `phase=error reason=brand-arg-missing`.
15
+ #
16
+ # The wrapper also resolves and exports MAXY_PLATFORM_ROOT from its own
17
+ # script location so the .ts helper can read `<root>/config/brand.json` for
18
+ # the brand's `cdpPort` (Task 924's source of truth). Direct-SSH invocation
19
+ # works because the script lives at `<install>/platform/plugins/cloudflare/
20
+ # scripts/`, making platform root three dirs up from the resolved script.
13
21
  #
14
22
  # Runtime: Node 22's `--experimental-strip-types` runs the .ts helper
15
23
  # directly, so no tsx / playwright / ws dependency exists.
@@ -24,16 +32,29 @@ set -euo pipefail
24
32
  # Resolve symlinks before dirname — ~/list-cf-domains.sh is installed as a
25
33
  # symlink into $HOME, so the raw BASH_SOURCE[0] points at $HOME, not the
26
34
  # scripts directory where _stream-log.sh lives.
27
- source "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/_stream-log.sh"
35
+ SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
36
+ source "${SCRIPT_DIR}/_stream-log.sh"
28
37
  require_stream_log_path list-cf-domains
29
38
 
30
- BRAND="${1:-maxy}"
39
+ if [ "$#" -lt 1 ] || [ -z "${1:-}" ]; then
40
+ phase_line list-cf-domains phase=error reason=brand-arg-missing
41
+ exit 1
42
+ fi
43
+
44
+ BRAND="${1}"
31
45
  CONFIG_DIR=".${BRAND}"
32
46
  mkdir -p "${HOME}/${CONFIG_DIR}/logs"
33
47
 
48
+ # MAXY_PLATFORM_ROOT is set by the systemd service when the admin server
49
+ # spawns this script via runFormSpawn. Direct-SSH invocation has no such env
50
+ # so derive it from the resolved script location: scripts/ → cloudflare/ →
51
+ # plugins/ → platform → install root (three dirs up).
52
+ if [ -z "${MAXY_PLATFORM_ROOT:-}" ]; then
53
+ MAXY_PLATFORM_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
54
+ fi
55
+
34
56
  phase_line list-cf-domains phase=script-start brand="${BRAND}" config_dir="${CONFIG_DIR}"
35
57
 
36
- SCRIPT_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
37
58
  TS_ENTRY="${SCRIPT_DIR}/list-cf-domains.ts"
38
59
 
39
60
  if [ ! -f "${TS_ENTRY}" ]; then
@@ -47,15 +68,23 @@ fi
47
68
  # (124) from a helper-reported failure (1).
48
69
  HARD_TIMEOUT_SECS=30
49
70
 
50
- # CONFIG_DIR is consumed by the node helper when writing selector-drift dumps
51
- # to ~/.${BRAND}/logs/list-cf-domains-<ts>.html.
71
+ # Env passed through:
72
+ # - CONFIG_DIR — consumed by the node helper when writing selector-drift
73
+ # dumps to ~/.${BRAND}/logs/list-cf-domains-<ts>.html.
74
+ # - BRAND — names the brand for log lines naming the brand on
75
+ # config-class failures (helper does not derive it from
76
+ # CONFIG_DIR to keep the two concerns independent).
77
+ # - MAXY_PLATFORM_ROOT — install root the helper reads `config/brand.json`
78
+ # from for `cdpPort`. Resolved above so direct-SSH
79
+ # invocation matches the systemd-spawned path.
52
80
  #
53
81
  # `node --experimental-strip-types` (stable in Node 22.22) runs the .ts file
54
82
  # natively: type annotations are stripped, no enums / decorators are used, so
55
83
  # no TS type-transform is needed. `--no-warnings` suppresses the experimental
56
84
  # banner which would otherwise leak into stderr and confuse the route parser.
57
85
  set +e
58
- CONFIG_DIR="${CONFIG_DIR}" timeout --preserve-status --signal=TERM "${HARD_TIMEOUT_SECS}" \
86
+ CONFIG_DIR="${CONFIG_DIR}" BRAND="${BRAND}" MAXY_PLATFORM_ROOT="${MAXY_PLATFORM_ROOT}" \
87
+ timeout --preserve-status --signal=TERM "${HARD_TIMEOUT_SECS}" \
59
88
  node --experimental-strip-types --no-warnings "${TS_ENTRY}"
60
89
  EXIT_CODE=$?
61
90
  set -e
@@ -42,19 +42,29 @@
42
42
  // "selector drift" from "empty account" — both shapes arrive via
43
43
  // stdout).
44
44
 
45
- import { appendFileSync } from "node:fs";
45
+ import { appendFileSync, readFileSync } from "node:fs";
46
46
  import { writeFile } from "node:fs/promises";
47
47
  import { resolve } from "node:path";
48
48
  import { homedir } from "node:os";
49
49
  import { fileURLToPath } from "node:url";
50
50
 
51
- // CDP host/port default to the VNC Chromium's localhost bind; env overrides
52
- // exist solely so the vitest regression under platform/ui/__tests__ can force
53
- // a deterministic ECONNREFUSED (point at 127.0.0.1:1 RFC 6335 reserved,
54
- // guaranteed-refused on every platform) without depending on whether a dev
55
- // machine happens to have VNC Chromium running on 9222.
56
- const CDP_HOST = process.env.LIST_CF_DOMAINS_CDP_HOST ?? "127.0.0.1";
57
- const CDP_PORT = Number(process.env.LIST_CF_DOMAINS_CDP_PORT ?? 9222);
51
+ // CDP endpoint is resolved lazily inside `main()` so importing this module
52
+ // for in-process tests (`scrapeCurrentPage` / `scrapeDomains` under JSDOM)
53
+ // does not require an installed brand on disk.
54
+ //
55
+ // Task 954 source-of-truth contract:
56
+ // Runtime: brand.json `cdpPort` at `${MAXY_PLATFORM_ROOT}/config/brand.json`
57
+ // is authoritative. Wrapper exports MAXY_PLATFORM_ROOT and BRAND. Missing
58
+ // env / file / field → loud-fail with one of three named reasons. The
59
+ // pre-Task-954 silent CDP-port default made every non-Maxy brand fail
60
+ // `cdp-unreachable` because the helper hit Maxy's port instead of the
61
+ // brand's; Task 787 / NEO4J_URI sets the precedent that runtime config
62
+ // never falls back silently.
63
+ //
64
+ // Test overrides: when BOTH `LIST_CF_DOMAINS_CDP_HOST` and
65
+ // `LIST_CF_DOMAINS_CDP_PORT` are set, they win over brand.json. The
66
+ // existing ECONNREFUSED vitest forces `127.0.0.1:1` (RFC 6335-reserved)
67
+ // this way without an installed brand. Production never sets these.
58
68
 
59
69
  // Phase budgets total 30s (enforced by the shell wrapper's `timeout`).
60
70
  // Individual steps get sub-budgets so an early stall does not eat the
@@ -72,7 +82,14 @@ type Reason =
72
82
  | "not-signed-in"
73
83
  | "navigate-failed"
74
84
  | "table-wait-timeout"
75
- | "runtime-error";
85
+ | "runtime-error"
86
+ // Task 954 — config-class failures. The first three short-circuit before
87
+ // any CDP work begins; the route maps them to `field='config'` so the
88
+ // form renders a config-card naming the brand + path instead of a Retry
89
+ // button (retrying re-fires the same wrongly-resolved spawn — Task 787
90
+ // pattern).
91
+ | "brand-config-missing"
92
+ | "cdp-port-unresolved";
76
93
 
77
94
  // Sticky flag: once a stream-log write fails (EACCES, ENOENT, …), skip
78
95
  // subsequent file writes for the rest of this process. Repeated appends to an
@@ -120,11 +137,85 @@ function die(reason: Reason, detail = ""): never {
120
137
  process.exit(1);
121
138
  }
122
139
 
123
- async function cdpVersion(): Promise<void> {
140
+ interface CdpEndpoint {
141
+ host: string;
142
+ port: number;
143
+ source: "env-override" | "brand.json";
144
+ }
145
+
146
+ // Task 954 — single source of truth for the CDP endpoint. Called once from
147
+ // `main()` so the JSDOM scrape test (which imports `scrapeCurrentPage`
148
+ // directly without invoking `main`) does not need an installed brand.
149
+ function resolveCdpEndpoint(): CdpEndpoint {
150
+ const envHost = process.env.LIST_CF_DOMAINS_CDP_HOST;
151
+ const envPortRaw = process.env.LIST_CF_DOMAINS_CDP_PORT;
152
+ if (envHost !== undefined && envPortRaw !== undefined) {
153
+ const envPort = Number(envPortRaw);
154
+ if (!Number.isInteger(envPort) || envPort <= 0 || envPort > 65535) {
155
+ die(
156
+ "cdp-port-unresolved",
157
+ `LIST_CF_DOMAINS_CDP_PORT="${envPortRaw}" is not a valid integer port`,
158
+ );
159
+ }
160
+ return { host: envHost, port: envPort, source: "env-override" };
161
+ }
162
+
163
+ const brand = process.env.BRAND;
164
+ if (!brand) {
165
+ die(
166
+ "brand-config-missing",
167
+ "BRAND env var not set by wrapper — refusing to guess brand identity",
168
+ );
169
+ }
170
+ const platformRoot = process.env.MAXY_PLATFORM_ROOT;
171
+ if (!platformRoot) {
172
+ die(
173
+ "brand-config-missing",
174
+ "MAXY_PLATFORM_ROOT env var not set — wrapper must export it before spawn",
175
+ );
176
+ }
177
+ const brandPath = resolve(platformRoot, "config", "brand.json");
178
+ let raw: string;
179
+ try {
180
+ raw = readFileSync(brandPath, "utf-8");
181
+ } catch (err) {
182
+ // Distinct emission (not via `die`) so the path is named on the same line
183
+ // — config-card rendering on the route side keys off it.
184
+ logPhase(
185
+ `phase=error reason=brand-config-missing path=${brandPath} detail="${(err instanceof Error ? err.message : String(err)).replace(/"/g, "'").slice(0, 200)}"`,
186
+ );
187
+ process.exit(1);
188
+ }
189
+ let parsed: Record<string, unknown>;
190
+ try {
191
+ parsed = JSON.parse(raw) as Record<string, unknown>;
192
+ } catch (err) {
193
+ logPhase(
194
+ `phase=error reason=brand-config-missing path=${brandPath} detail="parse failed: ${(err instanceof Error ? err.message : String(err)).replace(/"/g, "'").slice(0, 160)}"`,
195
+ );
196
+ process.exit(1);
197
+ }
198
+ const cdpPort = parsed.cdpPort;
199
+ if (typeof cdpPort !== "number" || !Number.isInteger(cdpPort) || cdpPort <= 0 || cdpPort > 65535) {
200
+ // Names the keys actually present so a schema-drift incident surfaces
201
+ // immediately ("oh, brand.json renamed `cdpPort` to `cdp_port` in r123").
202
+ const keys = Object.keys(parsed).join(",");
203
+ logPhase(
204
+ `phase=error reason=cdp-port-unresolved brand=${brand} json_keys=${keys}`,
205
+ );
206
+ process.exit(1);
207
+ }
208
+ // Host stays 127.0.0.1 on the runtime path — vnc.sh binds Chromium's CDP
209
+ // server to localhost only, by construction. brand.json carries the port,
210
+ // not the host, because the host has never varied across brands.
211
+ return { host: "127.0.0.1", port: cdpPort, source: "brand.json" };
212
+ }
213
+
214
+ async function cdpVersion(host: string, port: number): Promise<void> {
124
215
  const controller = new AbortController();
125
216
  const timer = setTimeout(() => controller.abort(), CONNECT_TIMEOUT_MS);
126
217
  try {
127
- const res = await fetch(`http://${CDP_HOST}:${CDP_PORT}/json/version`, { signal: controller.signal });
218
+ const res = await fetch(`http://${host}:${port}/json/version`, { signal: controller.signal });
128
219
  if (!res.ok) die("cdp-unreachable", `HTTP ${res.status}`);
129
220
  } catch (err) {
130
221
  die("cdp-unreachable", err instanceof Error ? err.message : String(err));
@@ -138,12 +229,12 @@ interface CdpTarget {
138
229
  webSocketDebuggerUrl: string;
139
230
  }
140
231
 
141
- async function createTarget(): Promise<CdpTarget> {
232
+ async function createTarget(host: string, port: number): Promise<CdpTarget> {
142
233
  // `PUT /json/new?<url>` returns JSON describing the target. The URL goes
143
234
  // as a query-string argument (not a ?url= key), matching Chromium's CDP
144
235
  // server. about:blank avoids a wasted navigation — the real navigate
145
236
  // happens over WS after we attach.
146
- const endpoint = `http://${CDP_HOST}:${CDP_PORT}/json/new?about:blank`;
237
+ const endpoint = `http://${host}:${port}/json/new?about:blank`;
147
238
  let res: Response;
148
239
  try {
149
240
  res = await fetch(endpoint, { method: "PUT", signal: AbortSignal.timeout(CONNECT_TIMEOUT_MS) });
@@ -158,9 +249,9 @@ async function createTarget(): Promise<CdpTarget> {
158
249
  return target as CdpTarget;
159
250
  }
160
251
 
161
- async function closeTarget(id: string): Promise<void> {
252
+ async function closeTarget(host: string, port: number, id: string): Promise<void> {
162
253
  try {
163
- await fetch(`http://${CDP_HOST}:${CDP_PORT}/json/close/${id}`, {
254
+ await fetch(`http://${host}:${port}/json/close/${id}`, {
164
255
  signal: AbortSignal.timeout(CONNECT_TIMEOUT_MS),
165
256
  });
166
257
  } catch {
@@ -602,19 +693,20 @@ async function waitForDocumentReady(cdp: CdpClient): Promise<void> {
602
693
  }
603
694
 
604
695
  async function main(): Promise<void> {
605
- logPhase(`phase=script-start cdp=${CDP_HOST}:${CDP_PORT}`);
696
+ const endpoint = resolveCdpEndpoint();
697
+ logPhase(`phase=script-start cdp=${endpoint.host}:${endpoint.port} source=${endpoint.source}`);
606
698
 
607
- await cdpVersion();
699
+ await cdpVersion(endpoint.host, endpoint.port);
608
700
  logPhase(`phase=cdp-connect result=ok`);
609
701
 
610
- const target = await createTarget();
702
+ const target = await createTarget(endpoint.host, endpoint.port);
611
703
  logPhase(`phase=target-created targetId=${target.id.slice(0, 8)}…`);
612
704
 
613
705
  let cdp: CdpClient;
614
706
  try {
615
707
  cdp = await CdpClient.connect(target.webSocketDebuggerUrl);
616
708
  } catch (err) {
617
- await closeTarget(target.id);
709
+ await closeTarget(endpoint.host, endpoint.port, target.id);
618
710
  die("ws-connect-failed", err instanceof Error ? err.message : String(err));
619
711
  }
620
712
 
@@ -643,7 +735,7 @@ async function main(): Promise<void> {
643
735
  die("runtime-error", err instanceof Error ? err.message : String(err));
644
736
  } finally {
645
737
  cdp.close();
646
- await closeTarget(target.id);
738
+ await closeTarget(endpoint.host, endpoint.port, target.id);
647
739
  }
648
740
  }
649
741
 
@@ -9,6 +9,7 @@ Each installation has its own Cloudflare account. Sign-in is OAuth in the device
9
9
  | **Product identity** (Maxy vs Real Agent) | `brand.json` (`productName`, `configDir`) — known at install. |
10
10
  | **Cloudflare account identity** | `cert.pem` from OAuth. One account per brand per device. |
11
11
  | **Domain scope** (which zones the operator can route) | Live Cloudflare dashboard at form-render time via `list-cf-domains.sh`, not `brand.json`. Brand identity has no authority over which domains the operator's CF account holds. When the scrape returns an unexpected count (e.g. 1 on a two-zone account), the stream log's per-poll `phase=dom-scrape-poll n=<k> count=<n> domains=[…]` trajectory + the on-disk HTML dump at `~/{configDir}/logs/list-cf-domains-<ts>-count<n>-<mode>-pid<pid>.html` (earlier platform fixes — written on every scrape outcome, not just empty ones) give the operator everything they need to triage the cause without re-running. |
12
+ | **CDP port the scrape attaches to** | `brand.json` (`cdpPort`, stamped at install time) — the same brand-scoped port `vnc.sh` binds Chromium to. `list-cf-domains.sh <brand>` requires the brand arg; the helper reads `${MAXY_PLATFORM_ROOT}/config/brand.json` (no silent default). Missing brand arg, missing brand.json, or missing `cdpPort` field each exit 1 with one of three named reasons (`brand-arg-missing`, `brand-config-missing`, `cdp-port-unresolved`); the route maps all three to `field=config` so the form renders a config card naming the brand instead of a Retry button — retrying would re-fire the same wrongly-resolved spawn. |
12
13
  | **Local tunnel state** | `~/{configDir}/cloudflared/` — `cert.pem`, `<UUID>.json`, `config.yml`, `tunnel.state`, `alias-domains.json`. |
13
14
 
14
15
  There is no token-based auth for the operator-owned path (Mode A). To switch Cloudflare accounts, run `reset-tunnel.sh` (which deletes the cert and every tunnel on the current account), then run `setup-tunnel.sh` again — `cloudflared tunnel login` inside the setup script will pick a fresh account when you sign in.
@@ -340,7 +340,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
340
340
  border: 1px solid rgba(0,0,0,0.1); }
341
341
  td { padding: 6px 10px; border: 1px solid rgba(0,0,0,0.1); }
342
342
  `;function OT({data:e,onSubmit:t,submitted:n,isStreaming:r}){let{title:a,columns:o,rows:s,filePath:c,brandName:l,brandLogo:u}=e??{},d=a??`Grid`,[f,p]=(0,U.useState)(o??[`Column 1`]),[m,h]=(0,U.useState)(()=>{let e=s??[[``]];return e.length>0?e:[[``]]}),[g,_]=(0,U.useState)(null),[v,y]=(0,U.useState)(``),b=(0,U.useRef)(null),[x,S]=(0,U.useState)(()=>(o??[`Column 1`]).map(()=>wT)),C=(0,U.useRef)(null),[w,T]=(0,U.useState)(`idle`),E=(0,U.useRef)(null),O=(0,U.useRef)(null),k=(0,U.useRef)(JSON.stringify({columns:o,rows:s}));(0,U.useEffect)(()=>{let e=JSON.stringify({columns:o,rows:s});e!==k.current&&(k.current=e,o&&p(o),s&&(h(s.length>0?s:[[``]]),S(e=>{let t=o?.length??e.length;return t>e.length?[...e,...Array(t-e.length).fill(wT)]:e.slice(0,t)})))},[o,s]);let A=(0,U.useCallback)(()=>{E.current&&clearTimeout(E.current),E.current=setTimeout(()=>{T(`saving`),t(JSON.stringify({action:`save`,columns:f,rows:m,...c?{filePath:c}:{}})),O.current&&clearTimeout(O.current),T(`saved`),O.current=setTimeout(()=>T(`idle`),2e3)},500)},[f,m,c,t]);(0,U.useEffect)(()=>()=>{E.current&&clearTimeout(E.current),O.current&&clearTimeout(O.current)},[]);let j=eT({title:d,isStreaming:r,channelName:`maxy-grid-editor`,renderPopout:(0,U.useCallback)((e,t)=>{let n=e.document;n.open(),n.close(),n.title=t;let r=n.createElement(`style`);r.textContent=DT,n.head.appendChild(r);let i=n.createElement(`div`);i.className=`title`,i.textContent=t,n.body.appendChild(i);let a=n.createElement(`table`),o=n.createElement(`thead`),s=n.createElement(`tr`);for(let e of f){let t=n.createElement(`th`);t.textContent=e,s.appendChild(t)}o.appendChild(s),a.appendChild(o);let c=n.createElement(`tbody`);for(let e of m){let t=n.createElement(`tr`);for(let r of e){let e=n.createElement(`td`);e.textContent=r,t.appendChild(e)}c.appendChild(t)}a.appendChild(c),n.body.appendChild(a)},[f,m])}),M=tT({onSubmit:t}),N=(0,U.useCallback)((e,t)=>{_({row:e,col:t}),y(m[e]?.[t]??``),setTimeout(()=>b.current?.focus(),0)},[m]),P=(0,U.useCallback)(()=>{if(!g)return;let{row:e,col:t}=g;h(n=>{let r=n.map(e=>[...e]);return r[e]&&(r[e][t]=v),r}),_(null),A()},[g,v,A]),F=(0,U.useCallback)(()=>{_(null)},[]),ee=(0,U.useCallback)(e=>{if(g)if(e.key===`Tab`){e.preventDefault(),P();let{row:t,col:n}=g,r=n+1;if(r<f.length)N(t,r);else{let e=t+1;e>=m.length&&h(e=>[...e,Array(f.length).fill(``)]),N(Math.min(e,m.length),0)}}else if(e.key===`Enter`){e.preventDefault(),P();let{row:t,col:n}=g,r=t+1;r>=m.length&&h(e=>[...e,Array(f.length).fill(``)]),N(Math.min(r,m.length),n)}else e.key===`Escape`&&F()},[g,f.length,m.length,P,N,F]),I=(0,U.useCallback)(()=>{h(e=>[...e,Array(f.length).fill(``)]),A()},[f.length,A]),L=(0,U.useCallback)(e=>{h(t=>t.length<=1?[Array(f.length).fill(``)]:t.filter((t,n)=>n!==e)),g?.row===e&&_(null),A()},[f.length,g,A]),R=(0,U.useCallback)(e=>{let t=e.clipboardData.getData(`text/plain`);if(!t||!g)return;let n=t.split(`
343
- `).filter(e=>e.trim());if(n.length<=1&&!n[0]?.includes(` `)&&!n[0]?.includes(`,`))return;e.preventDefault();let r=n.slice(0,ST).map(TT);n.length>ST&&console.warn(`Grid editor: paste truncated from ${n.length} to ${ST} rows`);let{row:i,col:a}=g;h(e=>{let t=e.map(e=>[...e]);for(let e=0;e<r.length;e++){let n=i+e;for(;n>=t.length;)t.push(Array(f.length).fill(``));for(let i=0;i<r[e].length;i++){let o=a+i;o<f.length&&(t[n][o]=r[e][i])}}return t}),A()},[g,f.length,A]),z=(0,U.useCallback)(()=>{let e=ET(f,m),t=new Blob([e],{type:`text/csv;charset=utf-8;`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${d.replace(/[^a-zA-Z0-9]/g,`_`)}.csv`,r.click(),URL.revokeObjectURL(n)},[f,m,d]),te=(0,U.useCallback)(()=>{uT({title:d,content:dT(f,m),brandName:l,brandLogo:u})},[d,f,m,l,u]),ne=(0,U.useCallback)((e,t)=>{t.preventDefault(),C.current={colIndex:e,startX:t.clientX,startWidth:x[e]};let n=null,r=e=>{C.current&&(n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{if(!C.current)return;let t=e.clientX-C.current.startX,n=Math.max(CT,C.current.startWidth+t);S(e=>{let t=[...e];return t[C.current.colIndex]=n,t})}))},i=()=>{C.current=null,n&&cancelAnimationFrame(n),window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i)},[x]),re=(0,U.useCallback)(()=>{g&&M.openCommentInput()},[g,M]),B=(0,U.useCallback)(()=>{if(!g)return;let e=m[g.row]?.[g.col]??``;M.submitComment(e,{row:g.row,column:g.col})},[g,m,M]);if(n)return(0,W.jsxs)(`div`,{className:`editor-base grid-editor grid-editor--submitted`,children:[(0,W.jsxs)(`div`,{className:`editor-base__bar`,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),(0,W.jsx)(`div`,{className:`editor-base__actions`,children:(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Submitted`})})]}),(0,W.jsx)(`div`,{className:`grid-editor__body`,children:(0,W.jsx)(`div`,{className:`grid-editor__table-wrap`,children:(0,W.jsxs)(`table`,{className:`grid-editor__table`,role:`grid`,"aria-label":d,children:[(0,W.jsx)(`thead`,{children:(0,W.jsx)(`tr`,{children:f.map((e,t)=>(0,W.jsx)(`th`,{className:`grid-editor__col-header`,style:{width:x[t]},children:e},t))})}),(0,W.jsx)(`tbody`,{children:m.map((e,t)=>(0,W.jsx)(`tr`,{children:e.map((e,t)=>(0,W.jsx)(`td`,{className:`grid-editor__cell`,role:`gridcell`,style:{width:x[t]},children:(0,W.jsx)(`span`,{className:`grid-editor__cell-text`,children:e})},t))},t))})]})})})]});let ae=typeof window<`u`&&window.innerWidth<640,oe=typeof BroadcastChannel<`u`,ce=(0,W.jsxs)(`div`,{className:`editor-base__actions`,children:[w===`saving`&&(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Saving...`}),w===`saved`&&(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Saved`}),M.pendingComments.length>0&&(0,W.jsxs)(D,{variant:`ghost`,size:`sm`,onClick:M.sendComments,children:[`Send `,M.pendingComments.length,` comment`,M.pendingComments.length>1?`s`:``]}),g&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:tt,onClick:re,"aria-label":`Comment on cell`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:se,onClick:z,"aria-label":`Download CSV`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:Re,onClick:te,"aria-label":`Export PDF`}),!ae&&oe&&!j.poppedOut&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:Ie,onClick:j.handlePopout,"aria-label":`Pop out`}),!j.fullscreen&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:$e,onClick:j.handleFullscreen,"aria-label":`Full screen`}),j.fullscreen&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:it,onClick:j.exitFullscreen,"aria-label":`Exit full screen`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:at,onClick:j.handleMinimise,"aria-label":`Minimise`})]}),le=(0,W.jsxs)(`div`,{className:`grid-editor__table-wrap`,onPaste:R,children:[M.showCommentInput?(0,W.jsxs)(`div`,{className:`grid-editor__comment-popover`,children:[(0,W.jsx)(`input`,{ref:M.commentInputRef,type:`text`,value:M.commentText,onChange:e=>M.setCommentText(e.target.value),onKeyDown:e=>{e.key===`Enter`&&B(),e.key===`Escape`&&M.cancelComment()},placeholder:`Add a comment...`,className:`doc-editor__comment-input`,"aria-label":`Add comment on cell`}),(0,W.jsxs)(`div`,{className:`doc-editor__comment-actions`,children:[(0,W.jsx)(D,{variant:`primary`,size:`sm`,onClick:B,disabled:!M.commentText.trim(),children:`Add`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:ie,onClick:M.cancelComment,"aria-label":`Cancel`})]})]}):null,(0,W.jsxs)(`table`,{className:`grid-editor__table`,role:`grid`,"aria-label":d,children:[(0,W.jsx)(`thead`,{children:(0,W.jsxs)(`tr`,{children:[(0,W.jsx)(`th`,{className:`grid-editor__row-header`}),f.map((e,t)=>(0,W.jsxs)(`th`,{className:`grid-editor__col-header`,style:{width:x[t]},children:[e,(0,W.jsx)(`div`,{className:`grid-editor__resize-handle`,onMouseDown:e=>ne(t,e),role:`separator`,"aria-orientation":`vertical`})]},t))]})}),(0,W.jsx)(`tbody`,{children:m.map((e,t)=>(0,W.jsxs)(`tr`,{children:[(0,W.jsxs)(`td`,{className:`grid-editor__row-header`,children:[(0,W.jsx)(`span`,{className:`grid-editor__row-num`,children:t+1}),m.length>1&&(0,W.jsx)(`button`,{className:`grid-editor__row-delete`,onClick:()=>L(t),"aria-label":`Delete row ${t+1}`,children:(0,W.jsx)(i,{size:12})})]}),e.map((e,n)=>{let r=g?.row===t&&g?.col===n;return(0,W.jsx)(`td`,{className:`grid-editor__cell ${r?`grid-editor__cell--active`:``}`,onClick:()=>!r&&N(t,n),role:`gridcell`,"aria-selected":r,style:{width:x[n]},children:r?(0,W.jsx)(`input`,{ref:b,type:`text`,className:`grid-editor__cell-input`,value:v,onChange:e=>y(e.target.value),onKeyDown:ee,onBlur:P,"aria-label":`${f[n]} row ${t+1}`}):(0,W.jsx)(`span`,{className:`grid-editor__cell-text`,children:e})},n)})]},t))})]}),(0,W.jsxs)(`button`,{className:`grid-editor__add-row`,onClick:I,"aria-label":`Add row`,children:[(0,W.jsx)(H,{size:14}),(0,W.jsx)(`span`,{children:`Add row`})]})]});return j.fullscreen?(0,W.jsxs)(`div`,{className:`editor-base-fullscreen`,children:[(0,W.jsxs)(`div`,{className:`editor-base-fullscreen__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base-fullscreen__title`,children:d}),ce]}),(0,W.jsx)(`div`,{className:`editor-base-fullscreen__body`,style:{maxWidth:`none`},children:le})]}):j.poppedOut?(0,W.jsx)(`div`,{className:`editor-base editor-base--popout`,children:(0,W.jsxs)(`div`,{className:`editor-base__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),(0,W.jsxs)(`div`,{className:`editor-base__actions`,children:[(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Popped out`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:pt,onClick:j.handlePopIn,"aria-label":`Pop back in`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:at,onClick:j.handleMinimise,"aria-label":`Close`})]})]})}):j.minimised?(0,W.jsx)(`div`,{className:`editor-base editor-base--minimised`,onClick:j.handleExpand,role:`button`,tabIndex:0,onKeyDown:e=>e.key===`Enter`&&j.handleExpand(),children:(0,W.jsxs)(`div`,{className:`editor-base__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),(0,W.jsxs)(`div`,{className:`editor-base__actions`,onClick:e=>e.stopPropagation(),children:[!ae&&oe&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:Ie,onClick:j.handlePopout,"aria-label":`Pop out`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:$e,onClick:j.handleFullscreen,"aria-label":`Full screen`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:ut,onClick:j.handleExpand,"aria-label":`Expand`})]})]})}):(0,W.jsxs)(`div`,{className:`editor-base grid-editor`,children:[(0,W.jsxs)(`div`,{className:`editor-base__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),ce]}),(0,W.jsx)(`div`,{className:`grid-editor__body`,children:le})]})}var kT=Object.defineProperty,AT=Object.getOwnPropertySymbols,jT=Object.prototype.hasOwnProperty,MT=Object.prototype.propertyIsEnumerable,NT=(e,t,n)=>t in e?kT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,PT=(e,t)=>{for(var n in t||={})jT.call(t,n)&&NT(e,n,t[n]);if(AT)for(var n of AT(t))MT.call(t,n)&&NT(e,n,t[n]);return e},FT=(e,t)=>{var n={};for(var r in e)jT.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&AT)for(var r of AT(e))t.indexOf(r)<0&&MT.call(e,r)&&(n[r]=e[r]);return n},IT;(e=>{let t=class t{constructor(e,n,r,a){if(this.version=e,this.errorCorrectionLevel=n,this.modules=[],this.isFunction=[],e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version value out of range`);if(a<-1||a>7)throw RangeError(`Mask value out of range`);this.size=e*4+17;let o=[];for(let e=0;e<this.size;e++)o.push(!1);for(let e=0;e<this.size;e++)this.modules.push(o.slice()),this.isFunction.push(o.slice());this.drawFunctionPatterns();let s=this.addEccAndInterleave(r);if(this.drawCodewords(s),a==-1){let e=1e9;for(let t=0;t<8;t++){this.applyMask(t),this.drawFormatBits(t);let n=this.getPenaltyScore();n<e&&(a=t,e=n),this.applyMask(t)}}i(0<=a&&a<=7),this.mask=a,this.applyMask(a),this.drawFormatBits(a),this.isFunction=[]}static encodeText(n,r){let i=e.QrSegment.makeSegments(n);return t.encodeSegments(i,r)}static encodeBinary(n,r){let i=e.QrSegment.makeBytes(n);return t.encodeSegments([i],r)}static encodeSegments(e,r,a=1,s=40,c=-1,l=!0){if(!(t.MIN_VERSION<=a&&a<=s&&s<=t.MAX_VERSION)||c<-1||c>7)throw RangeError(`Invalid value`);let u,d;for(u=a;;u++){let n=t.getNumDataCodewords(u,r)*8,i=o.getTotalBits(e,u);if(i<=n){d=i;break}if(u>=s)throw RangeError(`Data too long`)}for(let e of[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH])l&&d<=t.getNumDataCodewords(u,e)*8&&(r=e);let f=[];for(let t of e){n(t.mode.modeBits,4,f),n(t.numChars,t.mode.numCharCountBits(u),f);for(let e of t.getData())f.push(e)}i(f.length==d);let p=t.getNumDataCodewords(u,r)*8;i(f.length<=p),n(0,Math.min(4,p-f.length),f),n(0,(8-f.length%8)%8,f),i(f.length%8==0);for(let e=236;f.length<p;e^=253)n(e,8,f);let m=[];for(;m.length*8<f.length;)m.push(0);return f.forEach((e,t)=>m[t>>>3]|=e<<7-(t&7)),new t(u,r,m,c)}getModule(e,t){return 0<=e&&e<this.size&&0<=t&&t<this.size&&this.modules[t][e]}getModules(){return this.modules}drawFunctionPatterns(){for(let e=0;e<this.size;e++)this.setFunctionModule(6,e,e%2==0),this.setFunctionModule(e,6,e%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let e=this.getAlignmentPatternPositions(),t=e.length;for(let n=0;n<t;n++)for(let r=0;r<t;r++)n==0&&r==0||n==0&&r==t-1||n==t-1&&r==0||this.drawAlignmentPattern(e[n],e[r]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(e){let t=this.errorCorrectionLevel.formatBits<<3|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;let a=(t<<10|n)^21522;i(a>>>15==0);for(let e=0;e<=5;e++)this.setFunctionModule(8,e,r(a,e));this.setFunctionModule(8,7,r(a,6)),this.setFunctionModule(8,8,r(a,7)),this.setFunctionModule(7,8,r(a,8));for(let e=9;e<15;e++)this.setFunctionModule(14-e,8,r(a,e));for(let e=0;e<8;e++)this.setFunctionModule(this.size-1-e,8,r(a,e));for(let e=8;e<15;e++)this.setFunctionModule(8,this.size-15+e,r(a,e));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let e=this.version;for(let t=0;t<12;t++)e=e<<1^(e>>>11)*7973;let t=this.version<<12|e;i(t>>>18==0);for(let e=0;e<18;e++){let n=r(t,e),i=this.size-11+e%3,a=Math.floor(e/3);this.setFunctionModule(i,a,n),this.setFunctionModule(a,i,n)}}drawFinderPattern(e,t){for(let n=-4;n<=4;n++)for(let r=-4;r<=4;r++){let i=Math.max(Math.abs(r),Math.abs(n)),a=e+r,o=t+n;0<=a&&a<this.size&&0<=o&&o<this.size&&this.setFunctionModule(a,o,i!=2&&i!=4)}}drawAlignmentPattern(e,t){for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)this.setFunctionModule(e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!=1)}setFunctionModule(e,t,n){this.modules[t][e]=n,this.isFunction[t][e]=!0}addEccAndInterleave(e){let n=this.version,r=this.errorCorrectionLevel;if(e.length!=t.getNumDataCodewords(n,r))throw RangeError(`Invalid argument`);let a=t.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][n],o=t.ECC_CODEWORDS_PER_BLOCK[r.ordinal][n],s=Math.floor(t.getNumRawDataModules(n)/8),c=a-s%a,l=Math.floor(s/a),u=[],d=t.reedSolomonComputeDivisor(o);for(let n=0,r=0;n<a;n++){let i=e.slice(r,r+l-o+(n<c?0:1));r+=i.length;let a=t.reedSolomonComputeRemainder(i,d);n<c&&i.push(0),u.push(i.concat(a))}let f=[];for(let e=0;e<u[0].length;e++)u.forEach((t,n)=>{(e!=l-o||n>=c)&&f.push(t[e])});return i(f.length==s),f}drawCodewords(e){if(e.length!=Math.floor(t.getNumRawDataModules(this.version)/8))throw RangeError(`Invalid argument`);let n=0;for(let t=this.size-1;t>=1;t-=2){t==6&&(t=5);for(let i=0;i<this.size;i++)for(let a=0;a<2;a++){let o=t-a,s=t+1&2?i:this.size-1-i;!this.isFunction[s][o]&&n<e.length*8&&(this.modules[s][o]=r(e[n>>>3],7-(n&7)),n++)}}i(n==e.length*8)}applyMask(e){if(e<0||e>7)throw RangeError(`Mask value out of range`);for(let t=0;t<this.size;t++)for(let n=0;n<this.size;n++){let r;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error(`Unreachable`)}!this.isFunction[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}getPenaltyScore(){let e=0;for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[n][o]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[n][o],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[o][n]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[o][n],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size-1;n++)for(let r=0;r<this.size-1;r++){let i=this.modules[n][r];i==this.modules[n][r+1]&&i==this.modules[n+1][r]&&i==this.modules[n+1][r+1]&&(e+=t.PENALTY_N2)}let n=0;for(let e of this.modules)n=e.reduce((e,t)=>e+(t?1:0),n);let r=this.size*this.size,a=Math.ceil(Math.abs(n*20-r*10)/r)-1;return i(0<=a&&a<=9),e+=a*t.PENALTY_N4,i(0<=e&&e<=2568888),e}getAlignmentPatternPositions(){if(this.version==1)return[];{let e=Math.floor(this.version/7)+2,t=this.version==32?26:Math.ceil((this.version*4+4)/(e*2-2))*2,n=[6];for(let r=this.size-7;n.length<e;r-=t)n.splice(1,0,r);return n}}static getNumRawDataModules(e){if(e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version number out of range`);let n=(16*e+128)*e+64;if(e>=2){let t=Math.floor(e/7)+2;n-=(25*t-10)*t-55,e>=7&&(n-=36)}return i(208<=n&&n<=29648),n}static getNumDataCodewords(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]}static reedSolomonComputeDivisor(e){if(e<1||e>255)throw RangeError(`Degree out of range`);let n=[];for(let t=0;t<e-1;t++)n.push(0);n.push(1);let r=1;for(let i=0;i<e;i++){for(let e=0;e<n.length;e++)n[e]=t.reedSolomonMultiply(n[e],r),e+1<n.length&&(n[e]^=n[e+1]);r=t.reedSolomonMultiply(r,2)}return n}static reedSolomonComputeRemainder(e,n){let r=n.map(e=>0);for(let i of e){let e=i^r.shift();r.push(0),n.forEach((n,i)=>r[i]^=t.reedSolomonMultiply(n,e))}return r}static reedSolomonMultiply(e,t){if(e>>>8||t>>>8)throw RangeError(`Byte out of range`);let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(t>>>r&1)*e;return i(n>>>8==0),n}finderPenaltyCountPatterns(e){let t=e[1];i(t<=this.size*3);let n=t>0&&e[2]==t&&e[3]==t*3&&e[4]==t&&e[5]==t;return(n&&e[0]>=t*4&&e[6]>=t?1:0)+(n&&e[6]>=t*4&&e[0]>=t?1:0)}finderPenaltyTerminateAndCount(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)}finderPenaltyAddHistory(e,t){t[0]==0&&(e+=this.size),t.pop(),t.unshift(e)}};t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e.QrCode=t;function n(e,t,n){if(t<0||t>31||e>>>t)throw RangeError(`Value out of range`);for(let r=t-1;r>=0;r--)n.push(e>>>r&1)}function r(e,t){return(e>>>t&1)!=0}function i(e){if(!e)throw Error(`Assertion error`)}let a=class e{constructor(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw RangeError(`Invalid argument`);this.bitData=n.slice()}static makeBytes(t){let r=[];for(let e of t)n(e,8,r);return new e(e.Mode.BYTE,t.length,r)}static makeNumeric(t){if(!e.isNumeric(t))throw RangeError(`String contains non-numeric characters`);let r=[];for(let e=0;e<t.length;){let i=Math.min(t.length-e,3);n(parseInt(t.substring(e,e+i),10),i*3+1,r),e+=i}return new e(e.Mode.NUMERIC,t.length,r)}static makeAlphanumeric(t){if(!e.isAlphanumeric(t))throw RangeError(`String contains unencodable characters in alphanumeric mode`);let r=[],i;for(i=0;i+2<=t.length;i+=2){let a=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i))*45;a+=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i+1)),n(a,11,r)}return i<t.length&&n(e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i)),6,r),new e(e.Mode.ALPHANUMERIC,t.length,r)}static makeSegments(t){return t==``?[]:e.isNumeric(t)?[e.makeNumeric(t)]:e.isAlphanumeric(t)?[e.makeAlphanumeric(t)]:[e.makeBytes(e.toUtf8ByteArray(t))]}static makeEci(t){let r=[];if(t<0)throw RangeError(`ECI assignment value out of range`);if(t<128)n(t,8,r);else if(t<16384)n(2,2,r),n(t,14,r);else if(t<1e6)n(6,3,r),n(t,21,r);else throw RangeError(`ECI assignment value out of range`);return new e(e.Mode.ECI,0,r)}static isNumeric(t){return e.NUMERIC_REGEX.test(t)}static isAlphanumeric(t){return e.ALPHANUMERIC_REGEX.test(t)}getData(){return this.bitData.slice()}static getTotalBits(e,t){let n=0;for(let r of e){let e=r.mode.numCharCountBits(t);if(r.numChars>=1<<e)return 1/0;n+=4+e+r.bitData.length}return n}static toUtf8ByteArray(e){e=encodeURI(e);let t=[];for(let n=0;n<e.length;n++)e.charAt(n)==`%`?(t.push(parseInt(e.substring(n+1,n+3),16)),n+=2):t.push(e.charCodeAt(n));return t}};a.NUMERIC_REGEX=/^[0-9]*$/,a.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,a.ALPHANUMERIC_CHARSET=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`;let o=a;e.QrSegment=a})(IT||={}),(e=>{(e=>{let t=class{constructor(e,t){this.ordinal=e,this.formatBits=t}};t.LOW=new t(0,1),t.MEDIUM=new t(1,0),t.QUARTILE=new t(2,3),t.HIGH=new t(3,2),e.Ecc=t})(e.QrCode||={})})(IT||={}),(e=>{(e=>{let t=class{constructor(e,t){this.modeBits=e,this.numBitsCharCount=t}numCharCountBits(e){return this.numBitsCharCount[Math.floor((e+7)/17)]}};t.NUMERIC=new t(1,[10,12,14]),t.ALPHANUMERIC=new t(2,[9,11,13]),t.BYTE=new t(4,[8,16,16]),t.KANJI=new t(8,[8,10,12]),t.ECI=new t(7,[0,0,0]),e.Mode=t})(e.QrSegment||={})})(IT||={});var LT=IT,RT={L:LT.QrCode.Ecc.LOW,M:LT.QrCode.Ecc.MEDIUM,Q:LT.QrCode.Ecc.QUARTILE,H:LT.QrCode.Ecc.HIGH},zT=128,BT=`L`,VT=`#FFFFFF`,HT=`#000000`,UT=!1,WT=1,GT=4,KT=0,qT=.1;function JT(e,t=0){let n=[];return e.forEach(function(e,r){let i=null;e.forEach(function(a,o){if(!a&&i!==null){n.push(`M${i+t} ${r+t}h${o-i}v1H${i+t}z`),i=null;return}if(o===e.length-1){if(!a)return;i===null?n.push(`M${o+t},${r+t} h1v1H${o+t}z`):n.push(`M${i+t},${r+t} h${o+1-i}v1H${i+t}z`);return}a&&i===null&&(i=o)})}),n.join(``)}function YT(e,t){return e.slice().map((e,n)=>n<t.y||n>=t.y+t.h?e:e.map((e,n)=>n<t.x||n>=t.x+t.w?e:!1))}function XT(e,t,n,r){if(r==null)return null;let i=e.length+n*2,a=Math.floor(t*qT),o=i/t,s=(r.width||a)*o,c=(r.height||a)*o,l=r.x==null?e.length/2-s/2:r.x*o,u=r.y==null?e.length/2-c/2:r.y*o,d=r.opacity==null?1:r.opacity,f=null;if(r.excavate){let e=Math.floor(l),t=Math.floor(u);f={x:e,y:t,w:Math.ceil(s+l-e),h:Math.ceil(c+u-t)}}let p=r.crossOrigin;return{x:l,y:u,h:c,w:s,excavation:f,opacity:d,crossOrigin:p}}function ZT(e,t){return t==null?e?GT:KT:Math.max(Math.floor(t),0)}function QT({value:e,level:t,minVersion:n,includeMargin:r,marginSize:i,imageSettings:a,size:o,boostLevel:s}){let c=U.useMemo(()=>{let r=(Array.isArray(e)?e:[e]).reduce((e,t)=>(e.push(...LT.QrSegment.makeSegments(t)),e),[]);return LT.QrCode.encodeSegments(r,RT[t],n,void 0,void 0,s)},[e,t,n,s]),{cells:l,margin:u,numCells:d,calculatedImageSettings:f}=U.useMemo(()=>{let e=c.getModules(),t=ZT(r,i);return{cells:e,margin:t,numCells:e.length+t*2,calculatedImageSettings:XT(e,o,t,a)}},[c,o,a,r,i]);return{qrcode:c,margin:u,cells:l,numCells:d,calculatedImageSettings:f}}var $T=function(){try{new Path2D().addPath(new Path2D)}catch{return!1}return!0}(),eE=U.forwardRef(function(e,t){let n=e,{value:r,size:i=zT,level:a=BT,bgColor:o=VT,fgColor:s=HT,includeMargin:c=UT,minVersion:l=WT,boostLevel:u,marginSize:d,imageSettings:f}=n,p=FT(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`marginSize`,`imageSettings`]),{style:m}=p,h=FT(p,[`style`]),g=f?.src,_=U.useRef(null),v=U.useRef(null),y=U.useCallback(e=>{_.current=e,typeof t==`function`?t(e):t&&(t.current=e)},[t]),[b,x]=U.useState(!1),{margin:S,cells:C,numCells:w,calculatedImageSettings:T}=QT({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:d,imageSettings:f,size:i});U.useEffect(()=>{if(_.current!=null){let e=_.current,t=e.getContext(`2d`);if(!t)return;let n=C,r=v.current,a=T!=null&&r!==null&&r.complete&&r.naturalHeight!==0&&r.naturalWidth!==0;a&&T.excavation!=null&&(n=YT(C,T.excavation));let c=window.devicePixelRatio||1;e.height=e.width=i*c;let l=i/w*c;t.scale(l,l),t.fillStyle=o,t.fillRect(0,0,w,w),t.fillStyle=s,$T?t.fill(new Path2D(JT(n,S))):C.forEach(function(e,n){e.forEach(function(e,r){e&&t.fillRect(r+S,n+S,1,1)})}),T&&(t.globalAlpha=T.opacity),a&&t.drawImage(r,T.x+S,T.y+S,T.w,T.h)}}),U.useEffect(()=>{x(!1)},[g]);let E=PT({height:i,width:i},m),D=null;return g!=null&&(D=U.createElement(`img`,{src:g,key:g,style:{display:`none`},onLoad:()=>{x(!0)},ref:v,crossOrigin:T?.crossOrigin})),U.createElement(U.Fragment,null,U.createElement(`canvas`,PT({style:E,height:i,width:i,ref:y,role:`img`},h)),D)});eE.displayName=`QRCodeCanvas`;var tE=U.forwardRef(function(e,t){let n=e,{value:r,size:i=zT,level:a=BT,bgColor:o=VT,fgColor:s=HT,includeMargin:c=UT,minVersion:l=WT,boostLevel:u,title:d,marginSize:f,imageSettings:p}=n,m=FT(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`title`,`marginSize`,`imageSettings`]),{margin:h,cells:g,numCells:_,calculatedImageSettings:v}=QT({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:f,imageSettings:p,size:i}),y=g,b=null;p!=null&&v!=null&&(v.excavation!=null&&(y=YT(g,v.excavation)),b=U.createElement(`image`,{href:p.src,height:v.h,width:v.w,x:v.x+h,y:v.y+h,preserveAspectRatio:`none`,opacity:v.opacity,crossOrigin:v.crossOrigin}));let x=JT(y,h);return U.createElement(`svg`,PT({height:i,width:i,viewBox:`0 0 ${_} ${_}`,ref:t,role:`img`},m),!!d&&U.createElement(`title`,null,d),U.createElement(`path`,{fill:o,d:`M0,0 h${_}v${_}H0z`,shapeRendering:`crispEdges`}),U.createElement(`path`,{fill:s,d:x,shapeRendering:`crispEdges`}),b)});tE.displayName=`QRCodeSVG`;function nE({data:e,onSubmit:t,submitted:n}){let r=e,i=(0,U.useRef)(!1),a=r?.value?.trim()??``;return(0,U.useEffect)(()=>{a&&!n&&!i.current&&(i.current=!0,t(``))},[a,n,t]),a?(0,W.jsxs)(`div`,{className:`qr-code`,children:[(0,W.jsx)(`div`,{className:`qr-code__canvas`,children:(0,W.jsx)(tE,{value:a,size:240,level:`M`,bgColor:`#ffffff`,fgColor:`#000000`})}),r?.label&&(0,W.jsx)(`div`,{className:`qr-code__label`,children:r.label})]}):(0,W.jsx)(`div`,{className:`qr-code qr-code--error`,children:`No QR data provided. Try again or ask the agent to generate a new QR code.`})}function rE(e){return e===0?`0 B`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function iE(e){return e.startsWith(`image/`)?(0,W.jsx)(Be,{size:18}):e===`application/pdf`?(0,W.jsx)(m,{size:18}):e===`text/calendar`?(0,W.jsx)(V,{size:18}):e.startsWith(`text/`)?(0,W.jsx)(h,{size:18}):e===`application/zip`||e===`application/x-zip-compressed`?(0,W.jsx)(Le,{size:18}):(0,W.jsx)(ce,{size:18})}function aE({data:e,onSubmit:t,submitted:n,sessionKey:r}){let i=e,a=(0,U.useRef)(!1),o=!!(i?.attachmentId&&i?.filename);(0,U.useEffect)(()=>{o&&!n&&!a.current&&(a.current=!0,t(JSON.stringify({_lifecycle:!0,component:`file-attachment`,event:`rendered`,attachmentId:i.attachmentId,filename:i.filename})))},[o,n,t,i]);let s=(0,U.useCallback)(()=>{if(!i?.attachmentId||!r)return;let e=`/api/admin/attachment/${i.attachmentId}?session_key=${encodeURIComponent(r)}`,t=document.createElement(`a`);t.href=e,t.download=i.filename,t.click()},[i,r]);return o?(0,W.jsx)(j,{submitted:!1,submittedLabel:`Downloaded`,actions:[{label:`Download`,variant:`primary`,onClick:s,disabled:!r}],children:(0,W.jsxs)(`div`,{className:`file-attachment`,children:[(0,W.jsx)(`div`,{className:`file-attachment__icon`,children:iE(i.mimeType)}),(0,W.jsxs)(`div`,{className:`file-attachment__info`,children:[(0,W.jsx)(`div`,{className:`file-attachment__name`,title:i.filename,children:i.filename}),(0,W.jsxs)(`div`,{className:`file-attachment__meta`,children:[rE(i.sizeBytes),` · `,i.mimeType]})]}),(0,W.jsx)(`button`,{className:`file-attachment__download`,onClick:s,disabled:!r,title:`Download file`,children:(0,W.jsx)(se,{size:16})})]})}):null}var oE=/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/,sE=/^[a-z0-9-]$/;function cE(e){return e?oE.test(e):!1}function lE(e){let t=e.toLowerCase(),n=``;for(let e of t)sE.test(e)&&(n+=e);for(;n.startsWith(`-`);)n=n.slice(1);return n}function uE(e){return[{key:`length`,label:`At least 8 characters`,met:e.length>=8},{key:`number`,label:`Contains a number`,met:/\d/.test(e)},{key:`special`,label:`Contains a special character`,met:/[^A-Za-z0-9]/.test(e)},{key:`whitespace`,label:`No spaces`,met:e.length>0&&!/\s/.test(e)}]}var dE=/https:\/\/dash\.cloudflare\.com\/argotunnel\?[^\s]+/,fE=/^OAUTH_URL:\s*(\S+)/,pE=/result=error\s+reason=([a-z0-9-]+)/;function mE(e){let t=e.match(fE);if(t)return t[1];let n=e.match(dE);return n?n[0]:null}function hE(e){let t=e.match(pE);return t?t[1]:null}var gE=/\[(\d+)\/(\d+)\]/,_E=/\bstep=([a-z0-9-]+)/,vE=2e3,yE=9e4;function bE(e){if(!e)return null;let t=e.match(gE);return t?parseInt(t[1],10):null}function xE({actionId:e,sessionKey:t,onExit:n,onOutcome:r,maxLines:i=1e3,selfRestart:a}){let[o,s]=(0,U.useState)([]),[c,l]=(0,U.useState)(null),[u,d]=(0,U.useState)(null),[f,p]=(0,U.useState)(null),[m,h]=(0,U.useState)(null),[g,_]=(0,U.useState)({phase:`idle`}),[v,b]=(0,U.useState)(!1),[x,S]=(0,U.useState)(null),C=(0,U.useRef)(null),w=(0,U.useRef)(new Set),T=(0,U.useRef)(null),E=(0,U.useRef)(0),D=(0,U.useRef)(null),O=(0,U.useRef)(null),A=(0,U.useRef)(null),j=(0,U.useRef)(null),M=(0,U.useRef)(null),N=(0,U.useRef)(null),P=(0,U.useRef)(n);P.current=n;let F=(0,U.useRef)(r);F.current=r;let ee=(0,U.useCallback)(()=>{M.current&&=(clearInterval(M.current),null),N.current&&=(clearTimeout(N.current),null)},[]),I=(0,U.useCallback)(e=>{e&&(C.current=e,S(e))},[]),L=(0,U.useCallback)(async()=>{if(m){_({phase:`respawning`});try{let e=await fetch(`/api/admin/device-browser/navigate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({url:m,intent:`open Cloudflare authorisation page`,hostname:``})}),t=await e.json().catch(()=>({}));if(e.ok&&t.ok){_({phase:`respawned`}),window.setTimeout(()=>_({phase:`idle`}),2500);return}_({phase:`failed`,reason:(t.navigateResult??t.detail??`navigation failed`).slice(0,80)})}catch(e){_({phase:`failed`,reason:(e instanceof Error?e.message:String(e)).slice(0,80)})}}},[m]),R=(0,U.useCallback)(()=>{let n=E.current>0?`&from=${E.current}`:``,r=new EventSource(`/api/admin/actions/${encodeURIComponent(e)}/stream?session_key=${encodeURIComponent(t)}${n}`);D.current=r,r.addEventListener(`line`,e=>{try{let t=JSON.parse(e.data);if(E.current=t.byteOffset,s(e=>{let n=[...e,t];return n.length>i&&n.splice(0,n.length-i),n}),!m){let e=mE(t.text);e&&h(e)}let n=t.text.match(gE);n&&I(n[0]);let r=t.text.match(_E);r&&w.current.add(r[1]);let a=hE(t.text);a&&(T.current=a),p(null)}catch(e){console.error(`[ActionLogPanel] line parse failed:`,e)}}),r.addEventListener(`heartbeat`,e=>{try{let t=JSON.parse(e.data);A.current=t,l(t),I(t.last_phase),p(null)}catch(e){console.error(`[ActionLogPanel] heartbeat parse failed:`,e)}}),r.addEventListener(`exit`,t=>{try{let n=JSON.parse(t.data);d(n);let r=n.code===0&&n.source===`persisted-log`?`restart-reconciled`:n.code===0?`completed`:n.code===null?n.kind===`restart-in-progress`?`restart-in-progress`:`exit-unobserved-no-restart-context`:`failed`;console.log(`[ActionLogPanel] outcome=${r} action=${e}`),P.current?.(n,T.current),F.current?.(r)}catch(e){console.error(`[ActionLogPanel] exit parse failed:`,e)}finally{r.close(),D.current=null,ee(),b(!1)}}),r.onerror=()=>{if(u)return;r.close(),D.current=null;let e=bE(C.current),t=!!a?.atPhase&&e!==null&&e>=a.atPhase,n=!!a?.atStep&&w.current.has(a.atStep);if((t||n)&&j.current!==null){let e=t?`phase=${C.current}`:`step=${a?.atStep}`;console.log(`[ActionLogPanel] SSE drop during self-restart window (${e}) — banner suppressed`),p(null),b(!0),z();return}p(`Connection lost — reconnecting…`),setTimeout(()=>{u||R()},1500)}},[e,t,i,a?.atPhase,a?.atStep,ee]);function z(){ee(),M.current=setInterval(async()=>{try{let e=await fetch(`/api/admin/version`,{cache:`no-store`});if(!e.ok)return;let t=(await e.json())?.installed,n=j.current;t&&n&&t!==n&&(console.log(`[ActionLogPanel] admin-server version changed ${n}→${t} — reconnecting stream`),ee(),b(!1),j.current=t,R())}catch{}},vE),N.current=setTimeout(()=>{console.log(`[ActionLogPanel] self-restart window timeout (${yE}ms) — reverting to error banner`),ee(),b(!1),p(`New version did not come up — reconnecting…`),setTimeout(()=>{u||R()},1500)},yE)}(0,U.useEffect)(()=>(R(),()=>{D.current?.close(),D.current=null,ee()}),[R,ee]),(0,U.useEffect)(()=>{if(!a)return;let e=!1;return(async()=>{try{let t=await fetch(`/api/admin/version`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();!e&&typeof n?.installed==`string`&&(j.current=n.installed)}catch{}})(),()=>{e=!0}},[e,a?.atPhase,a?.atStep]),(0,U.useEffect)(()=>{let e=O.current;e&&e.scrollHeight-e.scrollTop-e.clientHeight<80&&(e.scrollTop=e.scrollHeight)},[o]),(0,U.useEffect)(()=>{if(!u&&!v)return;let e=O.current;e&&(e.scrollTop=e.scrollHeight)},[u,v]);let te=e=>new Date(e).toLocaleTimeString(void 0,{hour12:!1}),ne=c?Math.floor(c.elapsed_since_last_line_ms/1e3):0,re=!u&&(f!==null||v),ie=re?`#666`:void 0,B=!u&&!re&&c&&ne>=5;return(0,W.jsxs)(`div`,{className:`action-log-panel`,style:{display:`flex`,flexDirection:`column`,height:`100%`,background:`#0a0a0a`,color:`#e8e8e8`,borderRadius:4,overflow:`hidden`,fontFamily:`ui-monospace, monospace`,fontSize:12},children:[(0,W.jsxs)(`div`,{style:{padding:`6px 10px`,borderBottom:`1px solid #222`,display:`flex`,gap:12,alignItems:`center`,flexWrap:`wrap`,fontSize:11},children:[(0,W.jsx)(`span`,{style:{color:`#888`},children:`action:`}),(0,W.jsx)(`span`,{children:e}),c&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{style:{color:`#888`,marginLeft:`auto`},children:`state:`}),(0,W.jsx)(`span`,{style:{color:ie},children:c.systemd_state}),x&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{style:{color:`#888`},children:`phase:`}),(0,W.jsx)(`span`,{style:{color:ie},children:x})]}),re&&(0,W.jsx)(`span`,{style:{color:`#888`,fontStyle:`italic`},children:`(stale)`}),B&&(0,W.jsxs)(`span`,{style:{color:`#e4a657`,display:`inline-flex`,alignItems:`center`,gap:4},children:[(0,W.jsx)(y,{size:11}),` silent `,ne,`s`]})]})]}),m&&!u&&(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderBottom:`1px solid #222`,background:`#1b1f2b`,display:`flex`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,W.jsx)(`span`,{style:{color:`#cbd5f5`},children:`Authorise this device on the Pi’s browser — click the zone, then Authorize.`}),(0,W.jsxs)(`button`,{type:`button`,onClick:L,disabled:g.phase===`respawning`,style:{marginLeft:`auto`,color:`#fff`,background:`#f6821f`,padding:`4px 10px`,borderRadius:3,border:`none`,cursor:g.phase===`respawning`?`wait`:`pointer`,display:`inline-flex`,alignItems:`center`,gap:6,fontSize:11,opacity:g.phase===`respawning`?.7:1},title:`Re-opens the Cloudflare page on the Pi's VNC browser`,children:[(0,W.jsx)(k,{size:12}),g.phase===`respawning`?`Re-opening on Pi…`:g.phase===`respawned`?`Re-opened on Pi`:`Re-open on Pi browser`]}),g.phase===`failed`&&(0,W.jsxs)(`span`,{style:{width:`100%`,color:`#ffc987`,fontSize:11,marginTop:4},children:[`Could not re-open on Pi: `,g.reason,`. The page should still be on the Pi VNC from the initial spawn.`]})]}),f&&!v&&(0,W.jsxs)(`div`,{style:{padding:`6px 10px`,background:`#3a2b10`,color:`#ffc987`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(_e,{size:12,className:`spin`}),` `,f]}),v&&(0,W.jsxs)(`div`,{style:{padding:`6px 10px`,background:`#132319`,color:`#9aeab0`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(_e,{size:12,className:`spin`}),` Waiting for new version…`]}),(0,W.jsxs)(`div`,{ref:O,style:{flex:1,overflow:`auto`,padding:`6px 10px`,lineHeight:1.45,whiteSpace:`pre-wrap`,wordBreak:`break-word`},children:[o.length===0&&!u&&(0,W.jsx)(`div`,{style:{color:`#888`},children:`Waiting for output…`}),o.map(e=>(0,W.jsxs)(`div`,{style:{display:`flex`,gap:10,color:e.stream===`stderr`?`#ff9999`:`#e8e8e8`},children:[(0,W.jsx)(`span`,{style:{color:`#666`,flexShrink:0},children:te(e.ts)}),(0,W.jsx)(`span`,{children:e.text})]},e.byteOffset))]}),u&&(()=>{let e=u.code,t=e===null&&u.kind===`restart-in-progress`,n=e===0,r=e!==null&&e!==0,i=Math.round(u.duration_ms/1e3);return n?(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#14331b`,color:`#9aeab0`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(De,{size:13}),(0,W.jsxs)(`span`,{children:[`Completed · `,i,`s`]})]}):r?(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#3a1717`,color:`#ff9999`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(y,{size:13}),(0,W.jsxs)(`span`,{children:[`Failed (exit `,e,`) · `,i,`s`]})]}):t?(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#132319`,color:`#9aeab0`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(_e,{size:13,className:`spin`}),(0,W.jsxs)(`span`,{children:[`Restart in progress · `,i,`s`]})]}):(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#3a2b10`,color:`#ffc987`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(y,{size:13}),(0,W.jsxs)(`span`,{children:[`Failed (exit unobserved) · `,i,`s`]})]})})()]})}var SE={title:`Authorise the tunnel in your own browser`,intro:`The Pi's browser couldn't drive the Cloudflare consent page automatically. Open the dashboard in your own browser and follow these steps:`,steps:[`The "Authorize Cloudflare Tunnel" page shows every zone on the currently-active account.`,`Click the zone you want the tunnel to be able to route DNS for.`,`Click Authorize. The browser closes or shows "You can close this page."`,`Return here and click "Try again" — the cert will land and setup will continue.`],footnote:`If the account shown in the top-left of the dashboard is not the one that owns your zone, click the account-name dropdown first and switch accounts before authorising.`},CE=18e4,wE=4096;function TE(e){let t=new TextEncoder().encode(e);return t.length<=wE?e:`${new TextDecoder(`utf-8`,{fatal:!1}).decode(t.slice(0,wE))}\n… ${t.length-wE} bytes truncated (total ${t.length} bytes)`}var EE=`__create_new__`;function DE({data:e,onSubmit:t,submitted:n,sessionKey:r,messageId:i}){let a=e,[o,s]=(0,U.useState)({status:`loading`}),[c,l]=(0,U.useState)(``),[u,d]=(0,U.useState)(``),[f,p]=(0,U.useState)(``),[m,h]=(0,U.useState)(``),[g,_]=(0,U.useState)(``),[v,y]=(0,U.useState)(``),[b,x]=(0,U.useState)(!1),[S,C]=(0,U.useState)({status:`loading`}),[w,T]=(0,U.useState)(``),[E,D]=(0,U.useState)(``),[O,k]=(0,U.useState)(!1),[A,M]=(0,U.useState)(!1),[N,P]=(0,U.useState)(null),[F,ee]=(0,U.useState)(null),[I,L]=(0,U.useState)(null),R=(0,U.useRef)(null),z=(0,U.useRef)(new Set),[te,ne]=(0,U.useState)(null),re=(0,U.useCallback)(async()=>{if(!r){s({status:`error`,field:`session`,message:`No session key available — refresh the page.`});return}s({status:`loading`});try{let e=await(await fetch(`/api/admin/cloudflare/domains?session_key=${encodeURIComponent(r)}`,{method:`GET`,headers:{Accept:`application/json`}})).json();if(!e.ok){s({status:`error`,field:e.field,message:e.message,output:e.output,correlationId:e.correlationId,streamLogPath:e.streamLogPath});return}if(e.domains.length===0){s({status:`empty`});return}s({status:`populated`,domains:e.domains}),d(t=>t||e.domains[0]),h(t=>t||e.domains[0])}catch(e){s({status:`error`,field:`script`,message:e instanceof Error?e.message:`Network error loading domains.`})}},[r]);(0,U.useEffect)(()=>{re()},[re]);let ie=(0,U.useCallback)(async()=>{if(!r){C({status:`error`,field:`session`,message:`No session key available — refresh the page.`});return}C({status:`loading`});try{let e=await(await fetch(`/api/admin/cloudflare/tunnels?session_key=${encodeURIComponent(r)}`,{method:`GET`,headers:{Accept:`application/json`}})).json();if(!e.ok){if(e.field===`cert`){C({status:`pre-oauth`,message:`First-time setup: we’ll sign you into Cloudflare and create the tunnel when you submit.`}),T(EE),e.defaultName&&D(t=>t||e.defaultName);return}C({status:`error`,field:e.field,message:e.message,output:e.output,correlationId:e.correlationId,streamLogPath:e.streamLogPath});return}if(e.tunnels.length===0){C({status:`empty`}),T(EE),e.defaultName&&D(t=>t||e.defaultName);return}C({status:`populated`,tunnels:e.tunnels});let t=e.tunnels.find(t=>t.name===e.defaultName);t?T(e=>e||t.id):(T(e=>e||EE),D(t=>t||e.defaultName))}catch(e){C({status:`error`,field:`script`,message:e instanceof Error?e.message:`Network error loading tunnels.`})}},[r]);(0,U.useEffect)(()=>{ie()},[ie]),(0,U.useEffect)(()=>()=>{R.current&&clearTimeout(R.current)},[]);let B=o.status===`populated`?o.domains:[],ae=e=>{n||O||(l(lE(e)),L(null))},oe=e=>{n||O||(p(lE(e)),L(null))},se=cE(c)&&u.length>0,ce=f!==``,le=!ce||cE(f)&&m.length>0,ue=se?`${c.replace(/-+$/,``)}.${u}`:``,de=ce&&le?`${f.replace(/-+$/,``)}.${m}`:``,fe=!(de&&de===ue),pe=uE(v),me=pe.every(e=>e.met),he=w===EE,ge=E.trim(),_e=/^[A-Za-z0-9_.-]{1,64}$/.test(ge),ve=w!==``&&(!he||_e),ye=S.status===`populated`||S.status===`empty`||S.status===`pre-oauth`,be=o.status===`populated`&&ye&&ve&&se&&le&&fe&&me&&!O,xe=c!==``&&!cE(c)?`Use lowercase letters, numbers, and hyphens. Start and end with a letter or number.`:null,Se=ce&&!cE(f)?`Use lowercase letters, numbers, and hyphens. Start and end with a letter or number.`:fe?null:`Public address must differ from the admin address.`,Ce=I?.field===`admin`?I.message:null,we=I?.field===`public`?I.message:null,Te=I?.field===`password`?I.message:null,V=I?.field===`script`||I?.field===`request`?I.message:null,Ee=()=>{M(!1),L(null),k(!1)},De=async()=>{if(!be)return;if(!r){L({field:`request`,message:`No session key available — refresh the page.`});return}k(!0),L(null),M(!1);let e=new AbortController;R.current=setTimeout(()=>{e.abort(),M(!0)},CE);let n={session_key:r,adminLabel:c.replace(/-+$/,``),adminDomain:u,password:v};ce&&(n.publicLabel=f.replace(/-+$/,``),n.publicDomain=m),g&&(n.apex=g),i&&(n.messageId=i),he?n.tunnelName=ge:n.tunnelId=w;try{let r=await fetch(`/api/admin/cloudflare/setup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n),signal:e.signal});R.current&&clearTimeout(R.current),R.current=null;let i=await r.json();if(!i.ok){L({field:i.field,message:i.message,output:i.output,correlationId:i.correlationId,streamLogPath:i.streamLogPath});let e=i.streamLogPath?`\n\nstream log: ${i.streamLogPath}`:``;t(i.output&&i.output.length>0?`Cloudflare setup failed: ${i.message}\n\n${i.output}${e}`:`Cloudflare setup failed: ${i.message}${e}`),k(!1);return}if(i.actionId){P(i.actionId);return}t(i.output)}catch(t){if(R.current&&clearTimeout(R.current),R.current=null,e.signal.aborted)return;L({field:`script`,message:t instanceof Error?t.message:`Network error — try again.`}),k(!1)}},H=(0,U.useMemo)(()=>c?`${c}.${u||`your-domain`}`:`your-name.${u||`your-domain`}`,[c,u]);if(o.status===`loading`)return(0,W.jsx)(j,{submitted:!1,actions:[],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[a?.title&&(0,W.jsx)(`div`,{className:`form-input__title`,children:a.title}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:`Reading the domains on your Cloudflare account…`})]})});if(o.status===`empty`)return(0,W.jsx)(j,{submitted:!1,actions:[{label:`Retry`,variant:`primary`,onClick:re}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:`No domains on this Cloudflare account`}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:`Add a domain in the Cloudflare dashboard first, then click Retry.`}),(0,W.jsxs)(`ol`,{className:`form-input__field-desc`,style:{margin:0,paddingLeft:20},children:[(0,W.jsxs)(`li`,{children:[`With the correct account active (top-left), click `,(0,W.jsx)(`strong`,{children:`Websites`}),` in the left-hand sidebar.`]}),(0,W.jsxs)(`li`,{children:[`Click the `,(0,W.jsx)(`strong`,{children:`Add a site`}),` button.`]}),(0,W.jsxs)(`li`,{children:[`Enter the bare domain (e.g. `,(0,W.jsx)(`code`,{children:`example.com`}),`) and click `,(0,W.jsx)(`strong`,{children:`Continue`}),`.`]}),(0,W.jsxs)(`li`,{children:[`Review Cloudflare's imported DNS records — preserve website (`,(0,W.jsx)(`code`,{children:`A`}),`), email (`,(0,W.jsx)(`code`,{children:`MX`}),`), and verification (`,(0,W.jsx)(`code`,{children:`TXT`}),`) entries.`]}),(0,W.jsx)(`li`,{children:`Copy Cloudflare's two nameservers and set them on your domain registrar.`}),(0,W.jsxs)(`li`,{children:[`Return to Cloudflare and click `,(0,W.jsx)(`strong`,{children:`Check nameservers`}),`. Wait for the zone to show `,(0,W.jsx)(`strong`,{children:`Active`}),`.`]})]})]})});if(o.status===`error`){let e=o.field===`dashboard`,t=e?`Not signed into Cloudflare on this device`:`Could not read domains from Cloudflare`,n=e?`Sign in again at the Cloudflare dashboard in the VNC browser, then click Retry. If the VNC browser is not open, ask me to run vnc.sh restart.`:o.message;return(0,W.jsx)(j,{submitted:!1,actions:[{label:`Retry`,variant:`primary`,onClick:re}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:t}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:n}),o.output&&o.output.length>0&&(0,W.jsx)(`pre`,{style:{marginTop:8,padding:8,maxHeight:280,overflow:`auto`,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:12,lineHeight:1.4,whiteSpace:`pre-wrap`,wordBreak:`break-word`,background:`var(--surface-2, rgba(0,0,0,0.04))`,borderRadius:4},children:TE(o.output)}),(o.correlationId||o.streamLogPath)&&(0,W.jsxs)(`div`,{style:{marginTop:8,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:11,color:`var(--text-secondary)`,wordBreak:`break-all`},children:[o.correlationId&&(0,W.jsxs)(`div`,{children:[`conversationId: `,o.correlationId]}),o.streamLogPath&&(0,W.jsxs)(`div`,{children:[`stream log: `,o.streamLogPath]})]})]})})}if(F)return(0,W.jsx)(j,{submitted:!1,actions:[{label:`Try again`,variant:`primary`,onClick:()=>{ee(null),P(null),L(null),k(!1),M(!1)}}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:F.card.title}),(0,W.jsx)(`div`,{className:`form-input__desc`,style:{whiteSpace:`pre-wrap`},children:F.card.intro}),(0,W.jsx)(`ol`,{style:{marginTop:10,paddingLeft:20,lineHeight:1.6},children:F.card.steps.map((e,t)=>(0,W.jsx)(`li`,{children:e},t))}),F.card.footnote&&(0,W.jsx)(`div`,{style:{marginTop:10,fontStyle:`italic`,color:`#666`},children:F.card.footnote})]})});if(N&&r){let e=te===`completed`||te===`restart-reconciled`?`Cloudflare setup complete.`:te===`failed`||te===`exit-unobserved-no-restart-context`?`Cloudflare setup failed.`:te===`restart-in-progress`?`Restart in progress — agent will reply once the service is back.`:`Cloudflare setup in progress — keep this panel open until it completes.`;return(0,W.jsx)(j,{submitted:!1,actions:[],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[a?.title&&(0,W.jsx)(`div`,{className:`form-input__title`,children:a.title}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:e}),(0,W.jsx)(`div`,{style:{marginTop:10,height:360},children:(0,W.jsx)(xE,{actionId:N,sessionKey:r,selfRestart:{atStep:`service-restart-armed`},onOutcome:e=>ne(e),onExit:(e,n)=>{if(z.current.has(N)){Nt(`cloudflare-setup-form`,{kind:`suppressed-duplicate`,actionId:N,exitCode:e.code});return}if(z.current.add(N),e.code===0){let e=`Cloudflare setup completed (actionId: ${N}).`;Nt(`cloudflare-setup-form`,{kind:`post-restart-resume-armed`,actionId:N}),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`admin-chat:post-restart-resume`,{detail:{actionId:N,message:e}}));return}if(n===`authorize-button-not-found`){ee({card:SE,actionId:N,exitCode:e.code});return}t(`Cloudflare setup failed with exit code ${e.code} (actionId: ${N}).`)}})})]})})}return A?(0,W.jsx)(j,{submitted:!1,actions:[{label:`Reset form`,variant:`ghost`,onClick:Ee}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:`Setup is taking longer than expected`}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:`The request is still running on the device — check the chat for live progress. Do not resubmit. If the script fails, the error will appear in chat and you can retry from there.`})]})}):(0,W.jsx)(j,{submitted:n,submittedLabel:`Submitting…`,actions:[{label:O?`Setting up…`:a?.submitLabel??`Set up Cloudflare`,variant:`primary`,disabled:!be,onClick:De}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[a?.title&&(0,W.jsx)(`div`,{className:`form-input__title`,children:a.title}),a?.description&&(0,W.jsx)(`div`,{className:`form-input__desc`,children:a.description}),(0,W.jsxs)(`div`,{className:`form-input__fields`,children:[(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-admin-label`,children:[`Admin address`,(0,W.jsx)(`span`,{className:`form-input__required`,children:`*`})]}),(0,W.jsxs)(`div`,{className:`tunnel-route__row`,children:[(0,W.jsx)(`input`,{id:`cf-admin-label`,className:`form-input__input tunnel-route__input`,type:`text`,autoCapitalize:`none`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,placeholder:`your-name`,value:c,onChange:e=>ae(e.target.value),disabled:n||O}),(0,W.jsx)(OE,{id:`cf-admin-domain`,value:u,options:B,onChange:d,disabled:n||O})]}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Where you access your platform remotely, via your main domain.`}),(0,W.jsxs)(`div`,{className:`form-input__field-desc`,children:[`Preview: `,(0,W.jsx)(`span`,{className:`tunnel-route__preview`,children:H})]}),(Ce||xe)&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:Ce??xe})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-public-label`,children:[`Public address`,(0,W.jsx)(`span`,{className:`tunnel-route__optional`,children:`Optional`})]}),(0,W.jsxs)(`div`,{className:`tunnel-route__row`,children:[(0,W.jsx)(`input`,{id:`cf-public-label`,className:`form-input__input tunnel-route__input`,type:`text`,autoCapitalize:`none`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,placeholder:`leave empty to skip`,value:f,onChange:e=>oe(e.target.value),disabled:n||O}),(0,W.jsx)(OE,{id:`cf-public-domain`,value:m,options:B,onChange:h,disabled:n||O||!ce})]}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Where visitors engage with your public agents, via your main domain. Leave empty for admin-only access.`}),(we||Se)&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:we??Se})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-apex`,children:[`Proxy apex`,(0,W.jsx)(`span`,{className:`tunnel-route__optional`,children:`Optional`})]}),(0,W.jsxs)(tn,{id:`cf-apex`,className:`form-input__select`,value:g,onChange:e=>_(e.target.value),disabled:n||O,children:[(0,W.jsx)(`option`,{value:``,children:`None`}),B.map(e=>(0,W.jsx)(`option`,{value:e,children:e},e))]}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Alternative domain for public agent visitors.`})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-tunnel`,children:[`Tunnel`,(0,W.jsx)(`span`,{className:`form-input__required`,children:`*`})]}),S.status===`loading`&&(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Loading tunnels from your Cloudflare account…`}),S.status===`error`&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:S.message}),S.status===`pre-oauth`&&(0,W.jsx)(`div`,{className:`form-input__field-desc`,style:{marginBottom:4},children:S.message}),ye&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(tn,{id:`cf-tunnel`,className:`form-input__select`,value:w,onChange:e=>T(e.target.value),disabled:n||O,children:[S.status===`populated`&&(0,W.jsxs)(W.Fragment,{children:[w===``&&(0,W.jsx)(`option`,{value:``,children:`Select a tunnel…`}),S.tunnels.map(e=>(0,W.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,W.jsx)(`option`,{value:EE,children:`+ Create a new tunnel…`})]}),he&&(0,W.jsx)(`div`,{className:`tunnel-route__row`,style:{marginTop:8},children:(0,W.jsx)(`input`,{id:`cf-tunnel-new-name`,className:`form-input__input tunnel-route__input`,type:`text`,autoCapitalize:`none`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,placeholder:`new-tunnel-name`,value:E,onChange:e=>D(e.target.value),disabled:n||O})}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:S.status===`pre-oauth`?`Use letters, digits, dots, dashes, underscores. 1–64 characters.`:S.status===`empty`?`No existing tunnels on your Cloudflare account — give the new tunnel a name.`:he?`Use letters, digits, dots, dashes, underscores. 1–64 characters.`:`Existing tunnels from the Cloudflare account you signed into. Hostnames you set above will be CNAME’d to whichever tunnel you pick.`}),he&&E!==``&&!_e&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:`Use letters, digits, dots, dashes, underscores. 1–64 characters.`}),I?.field===`tunnel`&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:I.message})]})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-password`,children:[`Admin password`,(0,W.jsx)(`span`,{className:`form-input__required`,children:`*`})]}),(0,W.jsxs)(`div`,{className:`tunnel-route__row`,children:[(0,W.jsx)(`input`,{id:`cf-password`,className:`form-input__input tunnel-route__input`,type:b?`text`:`password`,autoCapitalize:`none`,autoComplete:`new-password`,autoCorrect:`off`,spellCheck:!1,value:v,onChange:e=>{y(e.target.value),L(null)},disabled:n||O}),(0,W.jsx)(`button`,{type:`button`,className:`tunnel-route__suffix`,onClick:()=>x(e=>!e),disabled:n||O,style:{cursor:`pointer`,border:`none`,background:`inherit`},"aria-label":b?`Hide password`:`Show password`,children:b?`Hide`:`Show`})]}),(0,W.jsx)(`ul`,{className:`form-input__field-desc`,style:{margin:0,paddingLeft:16},children:pe.map(e=>(0,W.jsxs)(`li`,{style:{color:e.met?`var(--text)`:`var(--text-secondary)`},children:[e.met?`✓`:`○`,` `,e.label]},e.key))}),Te&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:Te})]}),V&&(0,W.jsxs)(`div`,{className:`tunnel-route__error`,role:`alert`,children:[(0,W.jsx)(`div`,{children:V}),I?.output&&I.output.length>0&&(0,W.jsx)(`pre`,{style:{marginTop:8,padding:8,maxHeight:280,overflow:`auto`,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:12,lineHeight:1.4,whiteSpace:`pre-wrap`,wordBreak:`break-word`,background:`var(--surface-2, rgba(0,0,0,0.04))`,borderRadius:4},children:TE(I.output)}),(I?.correlationId||I?.streamLogPath)&&(0,W.jsxs)(`div`,{style:{marginTop:8,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:11,color:`var(--text-secondary)`,wordBreak:`break-all`},children:[I.correlationId&&(0,W.jsxs)(`div`,{children:[`conversationId: `,I.correlationId]}),I.streamLogPath&&(0,W.jsxs)(`div`,{children:[`stream log: `,I.streamLogPath]})]})]})]})]})})}function OE({id:e,value:t,options:n,onChange:r,disabled:i}){return(0,W.jsx)(tn,{id:e,className:`tunnel-route__suffix`,value:t,onChange:e=>r(e.target.value),disabled:i,children:n.map(e=>(0,W.jsxs)(`option`,{value:e,children:[`.`,e]},e))})}var kE={"single-select":C,"multi-select":I,confirm:Qt,"info-card":$t,"action-list":en,form:nn,progress:an,"browser-viewer":sn,"rich-content-editor":xT,"grid-editor":OT,"qr-code":nE,"file-attachment":aE,"action-buttons":P,"cloudflare-setup-form":DE,"output-style":C,"thinking-view":C,"plugin-selector":I};function AE(e){let{data:t,filePath:n,onOpen:r}=e,i=n.split(`/`).pop()||n||`document.md`,a=(i.split(`.`).pop()||`doc`).toUpperCase().slice(0,6),o=n||i,s=(0,U.useRef)(!1);return(0,U.useEffect)(()=>{s.current||(s.current=!0,r({docId:o,name:i,content:t.content??``}))},[o,i,t.content,r]),(0,W.jsx)(`div`,{className:`component-card artefact-ref-card`,children:(0,W.jsxs)(`button`,{type:`button`,className:`artefact-ref-button`,onClick:()=>r({docId:o,name:i,content:t.content??``}),children:[(0,W.jsx)(`span`,{className:`artefact-ref-icon`,children:(0,W.jsx)(m,{size:16})}),(0,W.jsxs)(`span`,{className:`artefact-ref-meta`,children:[(0,W.jsx)(`span`,{className:`artefact-ref-name`,children:i}),(0,W.jsxs)(`span`,{className:`artefact-ref-tag`,children:[a,` · open in artefact pane`]})]}),(0,W.jsx)(`span`,{className:`artefact-ref-open`,children:(0,W.jsx)(Ie,{size:14})})]})})}function jE({name:e,data:t,onSubmit:n,submitted:r,isStreaming:i,sessionKey:a,messageId:o,onOpenArtefact:s}){if(e===`document-editor`&&s){let e=t??{};return(0,W.jsx)(AE,{data:e,filePath:e.filePath||e.title||`document.md`,onOpen:s})}if(e===`document-editor`)return(0,W.jsx)(aT,{data:t,onSubmit:n,submitted:r,isStreaming:i});let c=kE[e];return c?(0,W.jsx)(c,{data:t,onSubmit:n,submitted:r,isStreaming:i,sessionKey:a,messageId:o}):(console.warn(`[ComponentRenderer] Unknown component: "${e}". Registered: ${Object.keys(kE).join(`, `)}`),(0,W.jsx)(`div`,{className:`component-card component-card--error`,children:(0,W.jsxs)(`p`,{style:{fontFamily:`var(--font-body)`,fontSize:12,color:`var(--text-secondary)`},children:[`Component “`,e,`” is not available. This may require a platform update.`]})}))}var ME=/\b(?:fail|error|unable|could not|cannot|CAPTCHA|SIGN_IN_REQUIRED)\b/i;function NE(e){let t=new Date(e),n=new Date,r=String(t.getHours()).padStart(2,`0`),i=String(t.getMinutes()).padStart(2,`0`);return t.toDateString()===n.toDateString()?`${r}:${i}`:`${String(t.getDate()).padStart(2,`0`)}-${String(t.getMonth()+1).padStart(2,`0`)}-${t.getFullYear()} ${r}:${i}`}var PE=[ht,ft,xe,ut,Pe];function FE({size:e=13}){let[t,n]=(0,U.useState)(0);(0,U.useEffect)(()=>{let e=setInterval(()=>n(e=>(e+1)%8),300);return()=>clearInterval(e)},[]);let r=t<=4?t:8-t,i=PE[r];return(0,W.jsx)(i,{size:e,className:`star-loader star-frame-${r}`})}var IE=[`Thinking`,`Reasoning`,`Analyzing`,`Considering`,`Reflecting`,`Evaluating`,`Weighing`,`Synthesizing`,`Processing`,`Exploring`,`Examining`,`Assessing`,`Reviewing`,`Contemplating`,`Deliberating`],LE=60,RE=1500;function zE(){let e=(0,U.useRef)(-1),t=(0,U.useRef)(void 0),[n,r]=(0,U.useState)(()=>{let t=Math.floor(Math.random()*IE.length);return e.current=t,IE[t]+`…`});return(0,U.useEffect)(()=>{let n=!1;function i(){let t;do t=Math.floor(Math.random()*IE.length);while(t===e.current&&IE.length>1);return e.current=t,t}function a(){if(n)return;let e=IE[i()]+`…`,o=0;function s(){n||(o++,r(e.slice(0,o)),o<e.length?t.current=setTimeout(s,LE):t.current=setTimeout(a,RE))}t.current=setTimeout(s,LE)}return t.current=setTimeout(a,RE),()=>{n=!0,clearTimeout(t.current)}},[]),(0,W.jsx)(`span`,{className:`tl-thinking-typewriter`,children:n})}function BE(e,t){let n=e=>String(e??``);switch(e){case`Read`:return`Read ${n(t.file_path??t.path)}`;case`Write`:return`Write ${n(t.file_path??t.path)}`;case`Edit`:return`Edit ${n(t.file_path??t.path)}`;case`Bash`:return n(t.description??String(t.command??``).slice(0,70));case`Glob`:return`Glob ${n(t.pattern)}`;case`Grep`:return`Grep "${n(t.pattern)}" in ${n(t.path??`.`)}`;case`WebFetch`:return`Fetch ${n(t.url)}`;case`Agent`:return n(t.description??t.task??`Subagent`);case`Skill`:return n(t.skill??`Skill`);default:{let r=e.match(/^mcp__[^_]+__(.+)$/),i=r?r[1]:e,a=Object.keys(t)[0];return a?`${i}: ${n(t[a]).slice(0,50)}`:i}}}function VE({name:e,size:t=12}){let n=e.match(/^mcp__[^_]+__(.+)$/);switch(n?n[1]:e){case`Read`:return(0,W.jsx)(m,{size:t});case`Write`:return(0,W.jsx)(He,{size:t});case`Edit`:return(0,W.jsx)(Ve,{size:t});case`Bash`:return(0,W.jsx)(gt,{size:t});case`Glob`:case`Grep`:return(0,W.jsx)(fe,{size:t});case`WebFetch`:return(0,W.jsx)(k,{size:t});case`Agent`:return(0,W.jsx)(we,{size:t});case`Skill`:return(0,W.jsx)(ft,{size:t});case`memory-search`:return(0,W.jsx)(Ne,{size:t});case`memory-write`:return(0,W.jsx)(Me,{size:t});case`task-list`:return(0,W.jsx)(Oe,{size:t});case`task-create`:return(0,W.jsx)(ke,{size:t});case`contact-create`:return(0,W.jsx)(_t,{size:t});default:return(0,W.jsx)(yt,{size:t})}}function HE(e){let t=new Map,n=new Map;return e.forEach((e,r)=>{if(e.type===`tool_use`){let t=n.get(e.name)??[];t.push(r),n.set(e.name,t)}else if(e.type===`tool_result`){let i=n.get(e.name);i?.length&&t.set(i.shift(),r)}}),t}function UE(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function WE(e){let t=``;switch(e.type){case`text`:case`thinking`:t=e.content??``;break;case`tool_use`:t=JSON.stringify(e.input??{});break;case`tool_result`:t=e.output??``;break;case`subagent_start`:t=e.task??``;break;case`subagent_end`:t=e.result??``;break;case`component`:t=JSON.stringify(e.data??{});break;case`status`:t=e.message??``;break;default:return 0}return Math.ceil(t.length/4)}function GE(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return n>0?`${t}m ${n}s`:`${t}m`}function KE(e){if(e<60)return`${e.toFixed(1)}s`;let t=Math.floor(e/60),n=e%60;return n>=.1?`${t}m ${Math.floor(n)}s`:`${t}m`}function qE({icon:e,isPending:t,isError:n,doneClass:r=`tl-done`,summary:i,detail:a,tokens:o,elapsed:s,isLast:c,expanded:l,onToggle:u,selectCheck:d}){let p=!!a;return(0,W.jsxs)(`div`,{className:`tl-step`,children:[d,(0,W.jsxs)(`div`,{className:`tl-col`,children:[(0,W.jsx)(`div`,{className:`tl-icon${t?` tl-pending`:n?` tl-error`:` ${r}`}`,children:e}),!c&&(0,W.jsx)(`div`,{className:`tl-line tl-line-grow`})]}),(0,W.jsxs)(`div`,{className:`tl-body`,children:[(0,W.jsxs)(`div`,{className:`tl-row`,onClick:p?()=>{window.getSelection()?.toString()||u()}:void 0,style:{cursor:p?`pointer`:`default`},children:[(0,W.jsx)(`span`,{className:`tl-summary`,children:i}),o>0&&(0,W.jsxs)(`span`,{className:`tl-step-tokens`,children:[(0,W.jsx)(bt,{size:9}),UE(o)]}),(0,W.jsx)(`span`,{className:`tl-step-elapsed`,children:KE(s)}),p&&(0,W.jsx)(`span`,{className:`tl-chevron`,children:l?(0,W.jsx)(f,{size:10}):(0,W.jsx)(Ee,{size:10})})]}),p&&l&&(0,W.jsx)(`pre`,{className:`tl-detail`,children:a})]})]})}function JE({events:e,isStreaming:t,elapsedSeconds:n,streamStartMs:r,expandAll:i,onCompactNow:a,isCompacting:o,sessionCompacted:s,onComponentSubmit:c,submittedComponents:l,timestamp:u,selectionMode:d,selectedItems:m,onToggleItem:h,sessionKey:g,messageId:_,onOpenArtefact:v}){let[y,b]=(0,U.useState)(new Set),[x,S]=(0,U.useState)(!t),C=(0,U.useRef)(t);(0,U.useEffect)(()=>{C.current&&!t&&S(!0),!C.current&&t&&S(!1),C.current=t},[t]);let T=(0,U.useRef)(new Map),E=(0,U.useRef)(0),[O,k]=(0,U.useState)(Date.now());(0,U.useEffect)(()=>{let t=Date.now();for(let n=E.current;n<e.length;n++)T.current.has(n)||T.current.set(n,t);E.current=e.length},[e]),(0,U.useEffect)(()=>{if(!t)return;let e=setInterval(()=>k(Date.now()),100);return()=>clearInterval(e)},[t]);let A=e=>{b(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},j=(e,t)=>{let n=e===re[0]?.i&&r?r:T.current.get(e)??O,i=t===void 0?O:T.current.get(t)??O;return Math.max(0,(i-n)/1e3)},M=HE(e),N=new Set(M.values()),P=e.map((e,t)=>({e,i:t})).filter(({e})=>e.type===`text`),F=new Set(t?[]:e.map((e,t)=>({e,i:t})).filter(({e})=>e.type===`component`).map(({i:e})=>e)),ee=e=>e.type===`component`&&[`browser-viewer`,`qr-code`].includes(e.name);function I(e){if(!d||t||!u)return null;let n=`${u}_${e}`;return(0,W.jsx)(`div`,{className:`tl-select-check`,onClick:e=>e.stopPropagation(),children:(0,W.jsx)(ve,{checked:m?.has(n)??!1,onChange:()=>h?.(n)})})}let L=e.findLast(e=>e.type===`usage`),z=e.findLast(e=>e.type===`history_usage`),te=e.findLast(e=>e.type===`status`),ne=e.some(e=>e.type===`subagent_start`),re=e.map((e,t)=>({e,i:t})).filter(({e,i:n})=>e.type!==`text`&&e.type!==`usage`&&e.type!==`rate_limit`&&e.type!==`history_usage`&&e.type!==`status`&&e.type!==`done`&&e.type!==`subagent_progress`&&!N.has(n)&&!F.has(n)&&!(t&&e.type===`component`&&!ee(e))&&!(e.type===`tool_use`&&e.name===`Agent`&&ne)),B=new Map;for(let e=0;e<re.length-1;e++)B.set(re[e].i,re[e+1].i);let ae=(()=>{let e=[],t=!1,n=0;for(let{e:r}of re)if(n+=WE(r),r.type===`thinking`)t=!0;else if(r.type===`tool_use`){let t=r.name;e.includes(t)||e.push(t)}let r=[`${re.length} step${re.length===1?``:`s`}`];if(e.length>0){let t=e.slice(0,3),n=e.length-t.length;r.push(t.join(`, `)+(n>0?` +${n}`:``))}return{text:r.join(` · `),hasThinking:t,tokenSum:n}})(),oe=L?.peak_request_pct==null?L?.context_window?Math.round((L.input_tokens+L.cache_creation_tokens+L.cache_read_tokens)/L.context_window*100):null:Math.round(L.peak_request_pct*100),se=re.length>0,ce=P.length>0,le=new Set(re.map(e=>e.i)),ue=new Set(P.map(e=>e.i)),de=[];for(let t=0;t<e.length;t++){let n=e[t],r=null;if(le.has(t)?r=`steps`:ue.has(t)&&(r=`text`),!r)continue;let i=de[de.length-1];i&&i.role===r?i.items.push({e:n,i:t}):de.push({role:r,items:[{e:n,i:t}]})}let fe=P.length>0?P[P.length-1].i:-1;function pe(n,r,a,o){let s=o===a.length-1;if(n.type===`thinking`){let e=i===void 0?!y.has(r):i,t=B.get(r);return(0,W.jsxs)(`div`,{className:`tl-step`,children:[I(r),(0,W.jsxs)(`div`,{className:`tl-col`,children:[(0,W.jsx)(`div`,{className:`tl-icon tl-dim`,children:(0,W.jsx)(Je,{size:11})}),!s&&(0,W.jsx)(`div`,{className:`tl-line tl-line-grow`})]}),(0,W.jsx)(`div`,{className:`tl-body`,children:(0,W.jsxs)(`div`,{className:`tl-row tl-row-top`,onClick:()=>{window.getSelection()?.toString()||A(r)},style:{cursor:`pointer`},children:[(0,W.jsx)(`div`,{className:`tl-thinking-col`,children:e?(0,W.jsx)(`div`,{className:`tl-thinking-body`,children:n.content}):(0,W.jsxs)(`span`,{className:`tl-summary tl-thinking-label`,children:[n.content.slice(0,80),n.content.length>80?`…`:``]})}),WE(n)>0&&(0,W.jsxs)(`span`,{className:`tl-step-tokens`,children:[(0,W.jsx)(bt,{size:9}),UE(WE(n))]}),(0,W.jsx)(`span`,{className:`tl-step-elapsed`,children:KE(j(r,t))}),(0,W.jsx)(`span`,{className:`tl-chevron`,children:e?(0,W.jsx)(f,{size:10}):(0,W.jsx)(Ee,{size:10})})]})})]},r)}if(n.type===`status`)return(0,W.jsx)(`div`,{className:`tl-status`,children:n.message},r);if(n.type===`tool_use`){let t=M.get(r),a=t===void 0?void 0:e[t],o=a===void 0,c=a?.type===`tool_result`&&!!a.error,l=o?(0,W.jsx)(Qe,{size:11,className:`tl-spinner`}):c?(0,W.jsx)(ie,{size:11}):(0,W.jsx)(VE,{name:n.name,size:11}),u=n,d=a?.type===`tool_result`?`Input:
343
+ `).filter(e=>e.trim());if(n.length<=1&&!n[0]?.includes(` `)&&!n[0]?.includes(`,`))return;e.preventDefault();let r=n.slice(0,ST).map(TT);n.length>ST&&console.warn(`Grid editor: paste truncated from ${n.length} to ${ST} rows`);let{row:i,col:a}=g;h(e=>{let t=e.map(e=>[...e]);for(let e=0;e<r.length;e++){let n=i+e;for(;n>=t.length;)t.push(Array(f.length).fill(``));for(let i=0;i<r[e].length;i++){let o=a+i;o<f.length&&(t[n][o]=r[e][i])}}return t}),A()},[g,f.length,A]),z=(0,U.useCallback)(()=>{let e=ET(f,m),t=new Blob([e],{type:`text/csv;charset=utf-8;`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`${d.replace(/[^a-zA-Z0-9]/g,`_`)}.csv`,r.click(),URL.revokeObjectURL(n)},[f,m,d]),te=(0,U.useCallback)(()=>{uT({title:d,content:dT(f,m),brandName:l,brandLogo:u})},[d,f,m,l,u]),ne=(0,U.useCallback)((e,t)=>{t.preventDefault(),C.current={colIndex:e,startX:t.clientX,startWidth:x[e]};let n=null,r=e=>{C.current&&(n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{if(!C.current)return;let t=e.clientX-C.current.startX,n=Math.max(CT,C.current.startWidth+t);S(e=>{let t=[...e];return t[C.current.colIndex]=n,t})}))},i=()=>{C.current=null,n&&cancelAnimationFrame(n),window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i)},[x]),re=(0,U.useCallback)(()=>{g&&M.openCommentInput()},[g,M]),B=(0,U.useCallback)(()=>{if(!g)return;let e=m[g.row]?.[g.col]??``;M.submitComment(e,{row:g.row,column:g.col})},[g,m,M]);if(n)return(0,W.jsxs)(`div`,{className:`editor-base grid-editor grid-editor--submitted`,children:[(0,W.jsxs)(`div`,{className:`editor-base__bar`,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),(0,W.jsx)(`div`,{className:`editor-base__actions`,children:(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Submitted`})})]}),(0,W.jsx)(`div`,{className:`grid-editor__body`,children:(0,W.jsx)(`div`,{className:`grid-editor__table-wrap`,children:(0,W.jsxs)(`table`,{className:`grid-editor__table`,role:`grid`,"aria-label":d,children:[(0,W.jsx)(`thead`,{children:(0,W.jsx)(`tr`,{children:f.map((e,t)=>(0,W.jsx)(`th`,{className:`grid-editor__col-header`,style:{width:x[t]},children:e},t))})}),(0,W.jsx)(`tbody`,{children:m.map((e,t)=>(0,W.jsx)(`tr`,{children:e.map((e,t)=>(0,W.jsx)(`td`,{className:`grid-editor__cell`,role:`gridcell`,style:{width:x[t]},children:(0,W.jsx)(`span`,{className:`grid-editor__cell-text`,children:e})},t))},t))})]})})})]});let ae=typeof window<`u`&&window.innerWidth<640,oe=typeof BroadcastChannel<`u`,ce=(0,W.jsxs)(`div`,{className:`editor-base__actions`,children:[w===`saving`&&(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Saving...`}),w===`saved`&&(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Saved`}),M.pendingComments.length>0&&(0,W.jsxs)(D,{variant:`ghost`,size:`sm`,onClick:M.sendComments,children:[`Send `,M.pendingComments.length,` comment`,M.pendingComments.length>1?`s`:``]}),g&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:tt,onClick:re,"aria-label":`Comment on cell`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:se,onClick:z,"aria-label":`Download CSV`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:Re,onClick:te,"aria-label":`Export PDF`}),!ae&&oe&&!j.poppedOut&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:Ie,onClick:j.handlePopout,"aria-label":`Pop out`}),!j.fullscreen&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:$e,onClick:j.handleFullscreen,"aria-label":`Full screen`}),j.fullscreen&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:it,onClick:j.exitFullscreen,"aria-label":`Exit full screen`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:at,onClick:j.handleMinimise,"aria-label":`Minimise`})]}),le=(0,W.jsxs)(`div`,{className:`grid-editor__table-wrap`,onPaste:R,children:[M.showCommentInput?(0,W.jsxs)(`div`,{className:`grid-editor__comment-popover`,children:[(0,W.jsx)(`input`,{ref:M.commentInputRef,type:`text`,value:M.commentText,onChange:e=>M.setCommentText(e.target.value),onKeyDown:e=>{e.key===`Enter`&&B(),e.key===`Escape`&&M.cancelComment()},placeholder:`Add a comment...`,className:`doc-editor__comment-input`,"aria-label":`Add comment on cell`}),(0,W.jsxs)(`div`,{className:`doc-editor__comment-actions`,children:[(0,W.jsx)(D,{variant:`primary`,size:`sm`,onClick:B,disabled:!M.commentText.trim(),children:`Add`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:ie,onClick:M.cancelComment,"aria-label":`Cancel`})]})]}):null,(0,W.jsxs)(`table`,{className:`grid-editor__table`,role:`grid`,"aria-label":d,children:[(0,W.jsx)(`thead`,{children:(0,W.jsxs)(`tr`,{children:[(0,W.jsx)(`th`,{className:`grid-editor__row-header`}),f.map((e,t)=>(0,W.jsxs)(`th`,{className:`grid-editor__col-header`,style:{width:x[t]},children:[e,(0,W.jsx)(`div`,{className:`grid-editor__resize-handle`,onMouseDown:e=>ne(t,e),role:`separator`,"aria-orientation":`vertical`})]},t))]})}),(0,W.jsx)(`tbody`,{children:m.map((e,t)=>(0,W.jsxs)(`tr`,{children:[(0,W.jsxs)(`td`,{className:`grid-editor__row-header`,children:[(0,W.jsx)(`span`,{className:`grid-editor__row-num`,children:t+1}),m.length>1&&(0,W.jsx)(`button`,{className:`grid-editor__row-delete`,onClick:()=>L(t),"aria-label":`Delete row ${t+1}`,children:(0,W.jsx)(i,{size:12})})]}),e.map((e,n)=>{let r=g?.row===t&&g?.col===n;return(0,W.jsx)(`td`,{className:`grid-editor__cell ${r?`grid-editor__cell--active`:``}`,onClick:()=>!r&&N(t,n),role:`gridcell`,"aria-selected":r,style:{width:x[n]},children:r?(0,W.jsx)(`input`,{ref:b,type:`text`,className:`grid-editor__cell-input`,value:v,onChange:e=>y(e.target.value),onKeyDown:ee,onBlur:P,"aria-label":`${f[n]} row ${t+1}`}):(0,W.jsx)(`span`,{className:`grid-editor__cell-text`,children:e})},n)})]},t))})]}),(0,W.jsxs)(`button`,{className:`grid-editor__add-row`,onClick:I,"aria-label":`Add row`,children:[(0,W.jsx)(H,{size:14}),(0,W.jsx)(`span`,{children:`Add row`})]})]});return j.fullscreen?(0,W.jsxs)(`div`,{className:`editor-base-fullscreen`,children:[(0,W.jsxs)(`div`,{className:`editor-base-fullscreen__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base-fullscreen__title`,children:d}),ce]}),(0,W.jsx)(`div`,{className:`editor-base-fullscreen__body`,style:{maxWidth:`none`},children:le})]}):j.poppedOut?(0,W.jsx)(`div`,{className:`editor-base editor-base--popout`,children:(0,W.jsxs)(`div`,{className:`editor-base__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),(0,W.jsxs)(`div`,{className:`editor-base__actions`,children:[(0,W.jsx)(`span`,{className:`editor-base__status`,children:`Popped out`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:pt,onClick:j.handlePopIn,"aria-label":`Pop back in`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:at,onClick:j.handleMinimise,"aria-label":`Close`})]})]})}):j.minimised?(0,W.jsx)(`div`,{className:`editor-base editor-base--minimised`,onClick:j.handleExpand,role:`button`,tabIndex:0,onKeyDown:e=>e.key===`Enter`&&j.handleExpand(),children:(0,W.jsxs)(`div`,{className:`editor-base__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),(0,W.jsxs)(`div`,{className:`editor-base__actions`,onClick:e=>e.stopPropagation(),children:[!ae&&oe&&(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:Ie,onClick:j.handlePopout,"aria-label":`Pop out`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:$e,onClick:j.handleFullscreen,"aria-label":`Full screen`}),(0,W.jsx)(D,{variant:`ghost`,size:`sm`,icon:ut,onClick:j.handleExpand,"aria-label":`Expand`})]})]})}):(0,W.jsxs)(`div`,{className:`editor-base grid-editor`,children:[(0,W.jsxs)(`div`,{className:`editor-base__bar`,...j.dragBarProps,children:[(0,W.jsx)(`span`,{className:`editor-base__title`,children:d}),ce]}),(0,W.jsx)(`div`,{className:`grid-editor__body`,children:le})]})}var kT=Object.defineProperty,AT=Object.getOwnPropertySymbols,jT=Object.prototype.hasOwnProperty,MT=Object.prototype.propertyIsEnumerable,NT=(e,t,n)=>t in e?kT(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,PT=(e,t)=>{for(var n in t||={})jT.call(t,n)&&NT(e,n,t[n]);if(AT)for(var n of AT(t))MT.call(t,n)&&NT(e,n,t[n]);return e},FT=(e,t)=>{var n={};for(var r in e)jT.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&AT)for(var r of AT(e))t.indexOf(r)<0&&MT.call(e,r)&&(n[r]=e[r]);return n},IT;(e=>{let t=class t{constructor(e,n,r,a){if(this.version=e,this.errorCorrectionLevel=n,this.modules=[],this.isFunction=[],e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version value out of range`);if(a<-1||a>7)throw RangeError(`Mask value out of range`);this.size=e*4+17;let o=[];for(let e=0;e<this.size;e++)o.push(!1);for(let e=0;e<this.size;e++)this.modules.push(o.slice()),this.isFunction.push(o.slice());this.drawFunctionPatterns();let s=this.addEccAndInterleave(r);if(this.drawCodewords(s),a==-1){let e=1e9;for(let t=0;t<8;t++){this.applyMask(t),this.drawFormatBits(t);let n=this.getPenaltyScore();n<e&&(a=t,e=n),this.applyMask(t)}}i(0<=a&&a<=7),this.mask=a,this.applyMask(a),this.drawFormatBits(a),this.isFunction=[]}static encodeText(n,r){let i=e.QrSegment.makeSegments(n);return t.encodeSegments(i,r)}static encodeBinary(n,r){let i=e.QrSegment.makeBytes(n);return t.encodeSegments([i],r)}static encodeSegments(e,r,a=1,s=40,c=-1,l=!0){if(!(t.MIN_VERSION<=a&&a<=s&&s<=t.MAX_VERSION)||c<-1||c>7)throw RangeError(`Invalid value`);let u,d;for(u=a;;u++){let n=t.getNumDataCodewords(u,r)*8,i=o.getTotalBits(e,u);if(i<=n){d=i;break}if(u>=s)throw RangeError(`Data too long`)}for(let e of[t.Ecc.MEDIUM,t.Ecc.QUARTILE,t.Ecc.HIGH])l&&d<=t.getNumDataCodewords(u,e)*8&&(r=e);let f=[];for(let t of e){n(t.mode.modeBits,4,f),n(t.numChars,t.mode.numCharCountBits(u),f);for(let e of t.getData())f.push(e)}i(f.length==d);let p=t.getNumDataCodewords(u,r)*8;i(f.length<=p),n(0,Math.min(4,p-f.length),f),n(0,(8-f.length%8)%8,f),i(f.length%8==0);for(let e=236;f.length<p;e^=253)n(e,8,f);let m=[];for(;m.length*8<f.length;)m.push(0);return f.forEach((e,t)=>m[t>>>3]|=e<<7-(t&7)),new t(u,r,m,c)}getModule(e,t){return 0<=e&&e<this.size&&0<=t&&t<this.size&&this.modules[t][e]}getModules(){return this.modules}drawFunctionPatterns(){for(let e=0;e<this.size;e++)this.setFunctionModule(6,e,e%2==0),this.setFunctionModule(e,6,e%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);let e=this.getAlignmentPatternPositions(),t=e.length;for(let n=0;n<t;n++)for(let r=0;r<t;r++)n==0&&r==0||n==0&&r==t-1||n==t-1&&r==0||this.drawAlignmentPattern(e[n],e[r]);this.drawFormatBits(0),this.drawVersion()}drawFormatBits(e){let t=this.errorCorrectionLevel.formatBits<<3|e,n=t;for(let e=0;e<10;e++)n=n<<1^(n>>>9)*1335;let a=(t<<10|n)^21522;i(a>>>15==0);for(let e=0;e<=5;e++)this.setFunctionModule(8,e,r(a,e));this.setFunctionModule(8,7,r(a,6)),this.setFunctionModule(8,8,r(a,7)),this.setFunctionModule(7,8,r(a,8));for(let e=9;e<15;e++)this.setFunctionModule(14-e,8,r(a,e));for(let e=0;e<8;e++)this.setFunctionModule(this.size-1-e,8,r(a,e));for(let e=8;e<15;e++)this.setFunctionModule(8,this.size-15+e,r(a,e));this.setFunctionModule(8,this.size-8,!0)}drawVersion(){if(this.version<7)return;let e=this.version;for(let t=0;t<12;t++)e=e<<1^(e>>>11)*7973;let t=this.version<<12|e;i(t>>>18==0);for(let e=0;e<18;e++){let n=r(t,e),i=this.size-11+e%3,a=Math.floor(e/3);this.setFunctionModule(i,a,n),this.setFunctionModule(a,i,n)}}drawFinderPattern(e,t){for(let n=-4;n<=4;n++)for(let r=-4;r<=4;r++){let i=Math.max(Math.abs(r),Math.abs(n)),a=e+r,o=t+n;0<=a&&a<this.size&&0<=o&&o<this.size&&this.setFunctionModule(a,o,i!=2&&i!=4)}}drawAlignmentPattern(e,t){for(let n=-2;n<=2;n++)for(let r=-2;r<=2;r++)this.setFunctionModule(e+r,t+n,Math.max(Math.abs(r),Math.abs(n))!=1)}setFunctionModule(e,t,n){this.modules[t][e]=n,this.isFunction[t][e]=!0}addEccAndInterleave(e){let n=this.version,r=this.errorCorrectionLevel;if(e.length!=t.getNumDataCodewords(n,r))throw RangeError(`Invalid argument`);let a=t.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][n],o=t.ECC_CODEWORDS_PER_BLOCK[r.ordinal][n],s=Math.floor(t.getNumRawDataModules(n)/8),c=a-s%a,l=Math.floor(s/a),u=[],d=t.reedSolomonComputeDivisor(o);for(let n=0,r=0;n<a;n++){let i=e.slice(r,r+l-o+(n<c?0:1));r+=i.length;let a=t.reedSolomonComputeRemainder(i,d);n<c&&i.push(0),u.push(i.concat(a))}let f=[];for(let e=0;e<u[0].length;e++)u.forEach((t,n)=>{(e!=l-o||n>=c)&&f.push(t[e])});return i(f.length==s),f}drawCodewords(e){if(e.length!=Math.floor(t.getNumRawDataModules(this.version)/8))throw RangeError(`Invalid argument`);let n=0;for(let t=this.size-1;t>=1;t-=2){t==6&&(t=5);for(let i=0;i<this.size;i++)for(let a=0;a<2;a++){let o=t-a,s=t+1&2?i:this.size-1-i;!this.isFunction[s][o]&&n<e.length*8&&(this.modules[s][o]=r(e[n>>>3],7-(n&7)),n++)}}i(n==e.length*8)}applyMask(e){if(e<0||e>7)throw RangeError(`Mask value out of range`);for(let t=0;t<this.size;t++)for(let n=0;n<this.size;n++){let r;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error(`Unreachable`)}!this.isFunction[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}getPenaltyScore(){let e=0;for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[n][o]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[n][o],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size;n++){let r=!1,i=0,a=[0,0,0,0,0,0,0];for(let o=0;o<this.size;o++)this.modules[o][n]==r?(i++,i==5?e+=t.PENALTY_N1:i>5&&e++):(this.finderPenaltyAddHistory(i,a),r||(e+=this.finderPenaltyCountPatterns(a)*t.PENALTY_N3),r=this.modules[o][n],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,a)*t.PENALTY_N3}for(let n=0;n<this.size-1;n++)for(let r=0;r<this.size-1;r++){let i=this.modules[n][r];i==this.modules[n][r+1]&&i==this.modules[n+1][r]&&i==this.modules[n+1][r+1]&&(e+=t.PENALTY_N2)}let n=0;for(let e of this.modules)n=e.reduce((e,t)=>e+(t?1:0),n);let r=this.size*this.size,a=Math.ceil(Math.abs(n*20-r*10)/r)-1;return i(0<=a&&a<=9),e+=a*t.PENALTY_N4,i(0<=e&&e<=2568888),e}getAlignmentPatternPositions(){if(this.version==1)return[];{let e=Math.floor(this.version/7)+2,t=this.version==32?26:Math.ceil((this.version*4+4)/(e*2-2))*2,n=[6];for(let r=this.size-7;n.length<e;r-=t)n.splice(1,0,r);return n}}static getNumRawDataModules(e){if(e<t.MIN_VERSION||e>t.MAX_VERSION)throw RangeError(`Version number out of range`);let n=(16*e+128)*e+64;if(e>=2){let t=Math.floor(e/7)+2;n-=(25*t-10)*t-55,e>=7&&(n-=36)}return i(208<=n&&n<=29648),n}static getNumDataCodewords(e,n){return Math.floor(t.getNumRawDataModules(e)/8)-t.ECC_CODEWORDS_PER_BLOCK[n.ordinal][e]*t.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][e]}static reedSolomonComputeDivisor(e){if(e<1||e>255)throw RangeError(`Degree out of range`);let n=[];for(let t=0;t<e-1;t++)n.push(0);n.push(1);let r=1;for(let i=0;i<e;i++){for(let e=0;e<n.length;e++)n[e]=t.reedSolomonMultiply(n[e],r),e+1<n.length&&(n[e]^=n[e+1]);r=t.reedSolomonMultiply(r,2)}return n}static reedSolomonComputeRemainder(e,n){let r=n.map(e=>0);for(let i of e){let e=i^r.shift();r.push(0),n.forEach((n,i)=>r[i]^=t.reedSolomonMultiply(n,e))}return r}static reedSolomonMultiply(e,t){if(e>>>8||t>>>8)throw RangeError(`Byte out of range`);let n=0;for(let r=7;r>=0;r--)n=n<<1^(n>>>7)*285,n^=(t>>>r&1)*e;return i(n>>>8==0),n}finderPenaltyCountPatterns(e){let t=e[1];i(t<=this.size*3);let n=t>0&&e[2]==t&&e[3]==t*3&&e[4]==t&&e[5]==t;return(n&&e[0]>=t*4&&e[6]>=t?1:0)+(n&&e[6]>=t*4&&e[0]>=t?1:0)}finderPenaltyTerminateAndCount(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),t+=this.size,this.finderPenaltyAddHistory(t,n),this.finderPenaltyCountPatterns(n)}finderPenaltyAddHistory(e,t){t[0]==0&&(e+=this.size),t.pop(),t.unshift(e)}};t.MIN_VERSION=1,t.MAX_VERSION=40,t.PENALTY_N1=3,t.PENALTY_N2=3,t.PENALTY_N3=40,t.PENALTY_N4=10,t.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],t.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e.QrCode=t;function n(e,t,n){if(t<0||t>31||e>>>t)throw RangeError(`Value out of range`);for(let r=t-1;r>=0;r--)n.push(e>>>r&1)}function r(e,t){return(e>>>t&1)!=0}function i(e){if(!e)throw Error(`Assertion error`)}let a=class e{constructor(e,t,n){if(this.mode=e,this.numChars=t,this.bitData=n,t<0)throw RangeError(`Invalid argument`);this.bitData=n.slice()}static makeBytes(t){let r=[];for(let e of t)n(e,8,r);return new e(e.Mode.BYTE,t.length,r)}static makeNumeric(t){if(!e.isNumeric(t))throw RangeError(`String contains non-numeric characters`);let r=[];for(let e=0;e<t.length;){let i=Math.min(t.length-e,3);n(parseInt(t.substring(e,e+i),10),i*3+1,r),e+=i}return new e(e.Mode.NUMERIC,t.length,r)}static makeAlphanumeric(t){if(!e.isAlphanumeric(t))throw RangeError(`String contains unencodable characters in alphanumeric mode`);let r=[],i;for(i=0;i+2<=t.length;i+=2){let a=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i))*45;a+=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i+1)),n(a,11,r)}return i<t.length&&n(e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(i)),6,r),new e(e.Mode.ALPHANUMERIC,t.length,r)}static makeSegments(t){return t==``?[]:e.isNumeric(t)?[e.makeNumeric(t)]:e.isAlphanumeric(t)?[e.makeAlphanumeric(t)]:[e.makeBytes(e.toUtf8ByteArray(t))]}static makeEci(t){let r=[];if(t<0)throw RangeError(`ECI assignment value out of range`);if(t<128)n(t,8,r);else if(t<16384)n(2,2,r),n(t,14,r);else if(t<1e6)n(6,3,r),n(t,21,r);else throw RangeError(`ECI assignment value out of range`);return new e(e.Mode.ECI,0,r)}static isNumeric(t){return e.NUMERIC_REGEX.test(t)}static isAlphanumeric(t){return e.ALPHANUMERIC_REGEX.test(t)}getData(){return this.bitData.slice()}static getTotalBits(e,t){let n=0;for(let r of e){let e=r.mode.numCharCountBits(t);if(r.numChars>=1<<e)return 1/0;n+=4+e+r.bitData.length}return n}static toUtf8ByteArray(e){e=encodeURI(e);let t=[];for(let n=0;n<e.length;n++)e.charAt(n)==`%`?(t.push(parseInt(e.substring(n+1,n+3),16)),n+=2):t.push(e.charCodeAt(n));return t}};a.NUMERIC_REGEX=/^[0-9]*$/,a.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,a.ALPHANUMERIC_CHARSET=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`;let o=a;e.QrSegment=a})(IT||={}),(e=>{(e=>{let t=class{constructor(e,t){this.ordinal=e,this.formatBits=t}};t.LOW=new t(0,1),t.MEDIUM=new t(1,0),t.QUARTILE=new t(2,3),t.HIGH=new t(3,2),e.Ecc=t})(e.QrCode||={})})(IT||={}),(e=>{(e=>{let t=class{constructor(e,t){this.modeBits=e,this.numBitsCharCount=t}numCharCountBits(e){return this.numBitsCharCount[Math.floor((e+7)/17)]}};t.NUMERIC=new t(1,[10,12,14]),t.ALPHANUMERIC=new t(2,[9,11,13]),t.BYTE=new t(4,[8,16,16]),t.KANJI=new t(8,[8,10,12]),t.ECI=new t(7,[0,0,0]),e.Mode=t})(e.QrSegment||={})})(IT||={});var LT=IT,RT={L:LT.QrCode.Ecc.LOW,M:LT.QrCode.Ecc.MEDIUM,Q:LT.QrCode.Ecc.QUARTILE,H:LT.QrCode.Ecc.HIGH},zT=128,BT=`L`,VT=`#FFFFFF`,HT=`#000000`,UT=!1,WT=1,GT=4,KT=0,qT=.1;function JT(e,t=0){let n=[];return e.forEach(function(e,r){let i=null;e.forEach(function(a,o){if(!a&&i!==null){n.push(`M${i+t} ${r+t}h${o-i}v1H${i+t}z`),i=null;return}if(o===e.length-1){if(!a)return;i===null?n.push(`M${o+t},${r+t} h1v1H${o+t}z`):n.push(`M${i+t},${r+t} h${o+1-i}v1H${i+t}z`);return}a&&i===null&&(i=o)})}),n.join(``)}function YT(e,t){return e.slice().map((e,n)=>n<t.y||n>=t.y+t.h?e:e.map((e,n)=>n<t.x||n>=t.x+t.w?e:!1))}function XT(e,t,n,r){if(r==null)return null;let i=e.length+n*2,a=Math.floor(t*qT),o=i/t,s=(r.width||a)*o,c=(r.height||a)*o,l=r.x==null?e.length/2-s/2:r.x*o,u=r.y==null?e.length/2-c/2:r.y*o,d=r.opacity==null?1:r.opacity,f=null;if(r.excavate){let e=Math.floor(l),t=Math.floor(u);f={x:e,y:t,w:Math.ceil(s+l-e),h:Math.ceil(c+u-t)}}let p=r.crossOrigin;return{x:l,y:u,h:c,w:s,excavation:f,opacity:d,crossOrigin:p}}function ZT(e,t){return t==null?e?GT:KT:Math.max(Math.floor(t),0)}function QT({value:e,level:t,minVersion:n,includeMargin:r,marginSize:i,imageSettings:a,size:o,boostLevel:s}){let c=U.useMemo(()=>{let r=(Array.isArray(e)?e:[e]).reduce((e,t)=>(e.push(...LT.QrSegment.makeSegments(t)),e),[]);return LT.QrCode.encodeSegments(r,RT[t],n,void 0,void 0,s)},[e,t,n,s]),{cells:l,margin:u,numCells:d,calculatedImageSettings:f}=U.useMemo(()=>{let e=c.getModules(),t=ZT(r,i);return{cells:e,margin:t,numCells:e.length+t*2,calculatedImageSettings:XT(e,o,t,a)}},[c,o,a,r,i]);return{qrcode:c,margin:u,cells:l,numCells:d,calculatedImageSettings:f}}var $T=function(){try{new Path2D().addPath(new Path2D)}catch{return!1}return!0}(),eE=U.forwardRef(function(e,t){let n=e,{value:r,size:i=zT,level:a=BT,bgColor:o=VT,fgColor:s=HT,includeMargin:c=UT,minVersion:l=WT,boostLevel:u,marginSize:d,imageSettings:f}=n,p=FT(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`marginSize`,`imageSettings`]),{style:m}=p,h=FT(p,[`style`]),g=f?.src,_=U.useRef(null),v=U.useRef(null),y=U.useCallback(e=>{_.current=e,typeof t==`function`?t(e):t&&(t.current=e)},[t]),[b,x]=U.useState(!1),{margin:S,cells:C,numCells:w,calculatedImageSettings:T}=QT({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:d,imageSettings:f,size:i});U.useEffect(()=>{if(_.current!=null){let e=_.current,t=e.getContext(`2d`);if(!t)return;let n=C,r=v.current,a=T!=null&&r!==null&&r.complete&&r.naturalHeight!==0&&r.naturalWidth!==0;a&&T.excavation!=null&&(n=YT(C,T.excavation));let c=window.devicePixelRatio||1;e.height=e.width=i*c;let l=i/w*c;t.scale(l,l),t.fillStyle=o,t.fillRect(0,0,w,w),t.fillStyle=s,$T?t.fill(new Path2D(JT(n,S))):C.forEach(function(e,n){e.forEach(function(e,r){e&&t.fillRect(r+S,n+S,1,1)})}),T&&(t.globalAlpha=T.opacity),a&&t.drawImage(r,T.x+S,T.y+S,T.w,T.h)}}),U.useEffect(()=>{x(!1)},[g]);let E=PT({height:i,width:i},m),D=null;return g!=null&&(D=U.createElement(`img`,{src:g,key:g,style:{display:`none`},onLoad:()=>{x(!0)},ref:v,crossOrigin:T?.crossOrigin})),U.createElement(U.Fragment,null,U.createElement(`canvas`,PT({style:E,height:i,width:i,ref:y,role:`img`},h)),D)});eE.displayName=`QRCodeCanvas`;var tE=U.forwardRef(function(e,t){let n=e,{value:r,size:i=zT,level:a=BT,bgColor:o=VT,fgColor:s=HT,includeMargin:c=UT,minVersion:l=WT,boostLevel:u,title:d,marginSize:f,imageSettings:p}=n,m=FT(n,[`value`,`size`,`level`,`bgColor`,`fgColor`,`includeMargin`,`minVersion`,`boostLevel`,`title`,`marginSize`,`imageSettings`]),{margin:h,cells:g,numCells:_,calculatedImageSettings:v}=QT({value:r,level:a,minVersion:l,boostLevel:u,includeMargin:c,marginSize:f,imageSettings:p,size:i}),y=g,b=null;p!=null&&v!=null&&(v.excavation!=null&&(y=YT(g,v.excavation)),b=U.createElement(`image`,{href:p.src,height:v.h,width:v.w,x:v.x+h,y:v.y+h,preserveAspectRatio:`none`,opacity:v.opacity,crossOrigin:v.crossOrigin}));let x=JT(y,h);return U.createElement(`svg`,PT({height:i,width:i,viewBox:`0 0 ${_} ${_}`,ref:t,role:`img`},m),!!d&&U.createElement(`title`,null,d),U.createElement(`path`,{fill:o,d:`M0,0 h${_}v${_}H0z`,shapeRendering:`crispEdges`}),U.createElement(`path`,{fill:s,d:x,shapeRendering:`crispEdges`}),b)});tE.displayName=`QRCodeSVG`;function nE({data:e,onSubmit:t,submitted:n}){let r=e,i=(0,U.useRef)(!1),a=r?.value?.trim()??``;return(0,U.useEffect)(()=>{a&&!n&&!i.current&&(i.current=!0,t(``))},[a,n,t]),a?(0,W.jsxs)(`div`,{className:`qr-code`,children:[(0,W.jsx)(`div`,{className:`qr-code__canvas`,children:(0,W.jsx)(tE,{value:a,size:240,level:`M`,bgColor:`#ffffff`,fgColor:`#000000`})}),r?.label&&(0,W.jsx)(`div`,{className:`qr-code__label`,children:r.label})]}):(0,W.jsx)(`div`,{className:`qr-code qr-code--error`,children:`No QR data provided. Try again or ask the agent to generate a new QR code.`})}function rE(e){return e===0?`0 B`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function iE(e){return e.startsWith(`image/`)?(0,W.jsx)(Be,{size:18}):e===`application/pdf`?(0,W.jsx)(m,{size:18}):e===`text/calendar`?(0,W.jsx)(V,{size:18}):e.startsWith(`text/`)?(0,W.jsx)(h,{size:18}):e===`application/zip`||e===`application/x-zip-compressed`?(0,W.jsx)(Le,{size:18}):(0,W.jsx)(ce,{size:18})}function aE({data:e,onSubmit:t,submitted:n,sessionKey:r}){let i=e,a=(0,U.useRef)(!1),o=!!(i?.attachmentId&&i?.filename);(0,U.useEffect)(()=>{o&&!n&&!a.current&&(a.current=!0,t(JSON.stringify({_lifecycle:!0,component:`file-attachment`,event:`rendered`,attachmentId:i.attachmentId,filename:i.filename})))},[o,n,t,i]);let s=(0,U.useCallback)(()=>{if(!i?.attachmentId||!r)return;let e=`/api/admin/attachment/${i.attachmentId}?session_key=${encodeURIComponent(r)}`,t=document.createElement(`a`);t.href=e,t.download=i.filename,t.click()},[i,r]);return o?(0,W.jsx)(j,{submitted:!1,submittedLabel:`Downloaded`,actions:[{label:`Download`,variant:`primary`,onClick:s,disabled:!r}],children:(0,W.jsxs)(`div`,{className:`file-attachment`,children:[(0,W.jsx)(`div`,{className:`file-attachment__icon`,children:iE(i.mimeType)}),(0,W.jsxs)(`div`,{className:`file-attachment__info`,children:[(0,W.jsx)(`div`,{className:`file-attachment__name`,title:i.filename,children:i.filename}),(0,W.jsxs)(`div`,{className:`file-attachment__meta`,children:[rE(i.sizeBytes),` · `,i.mimeType]})]}),(0,W.jsx)(`button`,{className:`file-attachment__download`,onClick:s,disabled:!r,title:`Download file`,children:(0,W.jsx)(se,{size:16})})]})}):null}var oE=/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/,sE=/^[a-z0-9-]$/;function cE(e){return e?oE.test(e):!1}function lE(e){let t=e.toLowerCase(),n=``;for(let e of t)sE.test(e)&&(n+=e);for(;n.startsWith(`-`);)n=n.slice(1);return n}function uE(e){return[{key:`length`,label:`At least 8 characters`,met:e.length>=8},{key:`number`,label:`Contains a number`,met:/\d/.test(e)},{key:`special`,label:`Contains a special character`,met:/[^A-Za-z0-9]/.test(e)},{key:`whitespace`,label:`No spaces`,met:e.length>0&&!/\s/.test(e)}]}var dE=/https:\/\/dash\.cloudflare\.com\/argotunnel\?[^\s]+/,fE=/^OAUTH_URL:\s*(\S+)/,pE=/result=error\s+reason=([a-z0-9-]+)/;function mE(e){let t=e.match(fE);if(t)return t[1];let n=e.match(dE);return n?n[0]:null}function hE(e){let t=e.match(pE);return t?t[1]:null}var gE=/\[(\d+)\/(\d+)\]/,_E=/\bstep=([a-z0-9-]+)/,vE=2e3,yE=9e4;function bE(e){if(!e)return null;let t=e.match(gE);return t?parseInt(t[1],10):null}function xE({actionId:e,sessionKey:t,onExit:n,onOutcome:r,maxLines:i=1e3,selfRestart:a}){let[o,s]=(0,U.useState)([]),[c,l]=(0,U.useState)(null),[u,d]=(0,U.useState)(null),[f,p]=(0,U.useState)(null),[m,h]=(0,U.useState)(null),[g,_]=(0,U.useState)({phase:`idle`}),[v,b]=(0,U.useState)(!1),[x,S]=(0,U.useState)(null),C=(0,U.useRef)(null),w=(0,U.useRef)(new Set),T=(0,U.useRef)(null),E=(0,U.useRef)(0),D=(0,U.useRef)(null),O=(0,U.useRef)(null),A=(0,U.useRef)(null),j=(0,U.useRef)(null),M=(0,U.useRef)(null),N=(0,U.useRef)(null),P=(0,U.useRef)(n);P.current=n;let F=(0,U.useRef)(r);F.current=r;let ee=(0,U.useCallback)(()=>{M.current&&=(clearInterval(M.current),null),N.current&&=(clearTimeout(N.current),null)},[]),I=(0,U.useCallback)(e=>{e&&(C.current=e,S(e))},[]),L=(0,U.useCallback)(async()=>{if(m){_({phase:`respawning`});try{let e=await fetch(`/api/admin/device-browser/navigate`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({url:m,intent:`open Cloudflare authorisation page`,hostname:``})}),t=await e.json().catch(()=>({}));if(e.ok&&t.ok){_({phase:`respawned`}),window.setTimeout(()=>_({phase:`idle`}),2500);return}_({phase:`failed`,reason:(t.navigateResult??t.detail??`navigation failed`).slice(0,80)})}catch(e){_({phase:`failed`,reason:(e instanceof Error?e.message:String(e)).slice(0,80)})}}},[m]),R=(0,U.useCallback)(()=>{let n=E.current>0?`&from=${E.current}`:``,r=new EventSource(`/api/admin/actions/${encodeURIComponent(e)}/stream?session_key=${encodeURIComponent(t)}${n}`);D.current=r,r.addEventListener(`line`,e=>{try{let t=JSON.parse(e.data);if(E.current=t.byteOffset,s(e=>{let n=[...e,t];return n.length>i&&n.splice(0,n.length-i),n}),!m){let e=mE(t.text);e&&h(e)}let n=t.text.match(gE);n&&I(n[0]);let r=t.text.match(_E);r&&w.current.add(r[1]);let a=hE(t.text);a&&(T.current=a),p(null)}catch(e){console.error(`[ActionLogPanel] line parse failed:`,e)}}),r.addEventListener(`heartbeat`,e=>{try{let t=JSON.parse(e.data);A.current=t,l(t),I(t.last_phase),p(null)}catch(e){console.error(`[ActionLogPanel] heartbeat parse failed:`,e)}}),r.addEventListener(`exit`,t=>{try{let n=JSON.parse(t.data);d(n);let r=n.code===0&&n.source===`persisted-log`?`restart-reconciled`:n.code===0?`completed`:n.code===null?n.kind===`restart-in-progress`?`restart-in-progress`:`exit-unobserved-no-restart-context`:`failed`;console.log(`[ActionLogPanel] outcome=${r} action=${e}`),P.current?.(n,T.current),F.current?.(r)}catch(e){console.error(`[ActionLogPanel] exit parse failed:`,e)}finally{r.close(),D.current=null,ee(),b(!1)}}),r.onerror=()=>{if(u)return;r.close(),D.current=null;let e=bE(C.current),t=!!a?.atPhase&&e!==null&&e>=a.atPhase,n=!!a?.atStep&&w.current.has(a.atStep);if((t||n)&&j.current!==null){let e=t?`phase=${C.current}`:`step=${a?.atStep}`;console.log(`[ActionLogPanel] SSE drop during self-restart window (${e}) — banner suppressed`),p(null),b(!0),z();return}p(`Connection lost — reconnecting…`),setTimeout(()=>{u||R()},1500)}},[e,t,i,a?.atPhase,a?.atStep,ee]);function z(){ee(),M.current=setInterval(async()=>{try{let e=await fetch(`/api/admin/version`,{cache:`no-store`});if(!e.ok)return;let t=(await e.json())?.installed,n=j.current;t&&n&&t!==n&&(console.log(`[ActionLogPanel] admin-server version changed ${n}→${t} — reconnecting stream`),ee(),b(!1),j.current=t,R())}catch{}},vE),N.current=setTimeout(()=>{console.log(`[ActionLogPanel] self-restart window timeout (${yE}ms) — reverting to error banner`),ee(),b(!1),p(`New version did not come up — reconnecting…`),setTimeout(()=>{u||R()},1500)},yE)}(0,U.useEffect)(()=>(R(),()=>{D.current?.close(),D.current=null,ee()}),[R,ee]),(0,U.useEffect)(()=>{if(!a)return;let e=!1;return(async()=>{try{let t=await fetch(`/api/admin/version`,{cache:`no-store`});if(!t.ok)return;let n=await t.json();!e&&typeof n?.installed==`string`&&(j.current=n.installed)}catch{}})(),()=>{e=!0}},[e,a?.atPhase,a?.atStep]),(0,U.useEffect)(()=>{let e=O.current;e&&e.scrollHeight-e.scrollTop-e.clientHeight<80&&(e.scrollTop=e.scrollHeight)},[o]),(0,U.useEffect)(()=>{if(!u&&!v)return;let e=O.current;e&&(e.scrollTop=e.scrollHeight)},[u,v]);let te=e=>new Date(e).toLocaleTimeString(void 0,{hour12:!1}),ne=c?Math.floor(c.elapsed_since_last_line_ms/1e3):0,re=!u&&(f!==null||v),ie=re?`#666`:void 0,B=!u&&!re&&c&&ne>=5;return(0,W.jsxs)(`div`,{className:`action-log-panel`,style:{display:`flex`,flexDirection:`column`,height:`100%`,background:`#0a0a0a`,color:`#e8e8e8`,borderRadius:4,overflow:`hidden`,fontFamily:`ui-monospace, monospace`,fontSize:12},children:[(0,W.jsxs)(`div`,{style:{padding:`6px 10px`,borderBottom:`1px solid #222`,display:`flex`,gap:12,alignItems:`center`,flexWrap:`wrap`,fontSize:11},children:[(0,W.jsx)(`span`,{style:{color:`#888`},children:`action:`}),(0,W.jsx)(`span`,{children:e}),c&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{style:{color:`#888`,marginLeft:`auto`},children:`state:`}),(0,W.jsx)(`span`,{style:{color:ie},children:c.systemd_state}),x&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsx)(`span`,{style:{color:`#888`},children:`phase:`}),(0,W.jsx)(`span`,{style:{color:ie},children:x})]}),re&&(0,W.jsx)(`span`,{style:{color:`#888`,fontStyle:`italic`},children:`(stale)`}),B&&(0,W.jsxs)(`span`,{style:{color:`#e4a657`,display:`inline-flex`,alignItems:`center`,gap:4},children:[(0,W.jsx)(y,{size:11}),` silent `,ne,`s`]})]})]}),m&&!u&&(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderBottom:`1px solid #222`,background:`#1b1f2b`,display:`flex`,alignItems:`center`,gap:8,flexWrap:`wrap`},children:[(0,W.jsx)(`span`,{style:{color:`#cbd5f5`},children:`Authorise this device on the Pi’s browser — click the zone, then Authorize.`}),(0,W.jsxs)(`button`,{type:`button`,onClick:L,disabled:g.phase===`respawning`,style:{marginLeft:`auto`,color:`#fff`,background:`#f6821f`,padding:`4px 10px`,borderRadius:3,border:`none`,cursor:g.phase===`respawning`?`wait`:`pointer`,display:`inline-flex`,alignItems:`center`,gap:6,fontSize:11,opacity:g.phase===`respawning`?.7:1},title:`Re-opens the Cloudflare page on the Pi's VNC browser`,children:[(0,W.jsx)(k,{size:12}),g.phase===`respawning`?`Re-opening on Pi…`:g.phase===`respawned`?`Re-opened on Pi`:`Re-open on Pi browser`]}),g.phase===`failed`&&(0,W.jsxs)(`span`,{style:{width:`100%`,color:`#ffc987`,fontSize:11,marginTop:4},children:[`Could not re-open on Pi: `,g.reason,`. The page should still be on the Pi VNC from the initial spawn.`]})]}),f&&!v&&(0,W.jsxs)(`div`,{style:{padding:`6px 10px`,background:`#3a2b10`,color:`#ffc987`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(_e,{size:12,className:`spin`}),` `,f]}),v&&(0,W.jsxs)(`div`,{style:{padding:`6px 10px`,background:`#132319`,color:`#9aeab0`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(_e,{size:12,className:`spin`}),` Waiting for new version…`]}),(0,W.jsxs)(`div`,{ref:O,style:{flex:1,overflow:`auto`,padding:`6px 10px`,lineHeight:1.45,whiteSpace:`pre-wrap`,wordBreak:`break-word`},children:[o.length===0&&!u&&(0,W.jsx)(`div`,{style:{color:`#888`},children:`Waiting for output…`}),o.map(e=>(0,W.jsxs)(`div`,{style:{display:`flex`,gap:10,color:e.stream===`stderr`?`#ff9999`:`#e8e8e8`},children:[(0,W.jsx)(`span`,{style:{color:`#666`,flexShrink:0},children:te(e.ts)}),(0,W.jsx)(`span`,{children:e.text})]},e.byteOffset))]}),u&&(()=>{let e=u.code,t=e===null&&u.kind===`restart-in-progress`,n=e===0,r=e!==null&&e!==0,i=Math.round(u.duration_ms/1e3);return n?(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#14331b`,color:`#9aeab0`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(De,{size:13}),(0,W.jsxs)(`span`,{children:[`Completed · `,i,`s`]})]}):r?(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#3a1717`,color:`#ff9999`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(y,{size:13}),(0,W.jsxs)(`span`,{children:[`Failed (exit `,e,`) · `,i,`s`]})]}):t?(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#132319`,color:`#9aeab0`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(_e,{size:13,className:`spin`}),(0,W.jsxs)(`span`,{children:[`Restart in progress · `,i,`s`]})]}):(0,W.jsxs)(`div`,{style:{padding:`8px 10px`,borderTop:`1px solid #222`,background:`#3a2b10`,color:`#ffc987`,display:`flex`,alignItems:`center`,gap:8},children:[(0,W.jsx)(y,{size:13}),(0,W.jsxs)(`span`,{children:[`Failed (exit unobserved) · `,i,`s`]})]})})()]})}var SE={title:`Authorise the tunnel in your own browser`,intro:`The Pi's browser couldn't drive the Cloudflare consent page automatically. Open the dashboard in your own browser and follow these steps:`,steps:[`The "Authorize Cloudflare Tunnel" page shows every zone on the currently-active account.`,`Click the zone you want the tunnel to be able to route DNS for.`,`Click Authorize. The browser closes or shows "You can close this page."`,`Return here and click "Try again" — the cert will land and setup will continue.`],footnote:`If the account shown in the top-left of the dashboard is not the one that owns your zone, click the account-name dropdown first and switch accounts before authorising.`},CE=18e4,wE=4096;function TE(e){let t=new TextEncoder().encode(e);return t.length<=wE?e:`${new TextDecoder(`utf-8`,{fatal:!1}).decode(t.slice(0,wE))}\n… ${t.length-wE} bytes truncated (total ${t.length} bytes)`}var EE=`__create_new__`;function DE({data:e,onSubmit:t,submitted:n,sessionKey:r,messageId:i}){let a=e,[o,s]=(0,U.useState)({status:`loading`}),[c,l]=(0,U.useState)(``),[u,d]=(0,U.useState)(``),[f,p]=(0,U.useState)(``),[m,h]=(0,U.useState)(``),[g,_]=(0,U.useState)(``),[v,y]=(0,U.useState)(``),[b,x]=(0,U.useState)(!1),[S,C]=(0,U.useState)({status:`loading`}),[w,T]=(0,U.useState)(``),[E,D]=(0,U.useState)(``),[O,k]=(0,U.useState)(!1),[A,M]=(0,U.useState)(!1),[N,P]=(0,U.useState)(null),[F,ee]=(0,U.useState)(null),[I,L]=(0,U.useState)(null),R=(0,U.useRef)(null),z=(0,U.useRef)(new Set),[te,ne]=(0,U.useState)(null),re=(0,U.useCallback)(async()=>{if(!r){s({status:`error`,field:`session`,message:`No session key available — refresh the page.`});return}s({status:`loading`});try{let e=await(await fetch(`/api/admin/cloudflare/domains?session_key=${encodeURIComponent(r)}`,{method:`GET`,headers:{Accept:`application/json`}})).json();if(!e.ok){s({status:`error`,field:e.field,message:e.message,output:e.output,correlationId:e.correlationId,streamLogPath:e.streamLogPath,brand:e.brand});return}if(e.domains.length===0){s({status:`empty`});return}s({status:`populated`,domains:e.domains}),d(t=>t||e.domains[0]),h(t=>t||e.domains[0])}catch(e){s({status:`error`,field:`script`,message:e instanceof Error?e.message:`Network error loading domains.`})}},[r]);(0,U.useEffect)(()=>{re()},[re]);let ie=(0,U.useCallback)(async()=>{if(!r){C({status:`error`,field:`session`,message:`No session key available — refresh the page.`});return}C({status:`loading`});try{let e=await(await fetch(`/api/admin/cloudflare/tunnels?session_key=${encodeURIComponent(r)}`,{method:`GET`,headers:{Accept:`application/json`}})).json();if(!e.ok){if(e.field===`cert`){C({status:`pre-oauth`,message:`First-time setup: we’ll sign you into Cloudflare and create the tunnel when you submit.`}),T(EE),e.defaultName&&D(t=>t||e.defaultName);return}C({status:`error`,field:e.field,message:e.message,output:e.output,correlationId:e.correlationId,streamLogPath:e.streamLogPath});return}if(e.tunnels.length===0){C({status:`empty`}),T(EE),e.defaultName&&D(t=>t||e.defaultName);return}C({status:`populated`,tunnels:e.tunnels});let t=e.tunnels.find(t=>t.name===e.defaultName);t?T(e=>e||t.id):(T(e=>e||EE),D(t=>t||e.defaultName))}catch(e){C({status:`error`,field:`script`,message:e instanceof Error?e.message:`Network error loading tunnels.`})}},[r]);(0,U.useEffect)(()=>{ie()},[ie]),(0,U.useEffect)(()=>()=>{R.current&&clearTimeout(R.current)},[]);let B=o.status===`populated`?o.domains:[],ae=e=>{n||O||(l(lE(e)),L(null))},oe=e=>{n||O||(p(lE(e)),L(null))},se=cE(c)&&u.length>0,ce=f!==``,le=!ce||cE(f)&&m.length>0,ue=se?`${c.replace(/-+$/,``)}.${u}`:``,de=ce&&le?`${f.replace(/-+$/,``)}.${m}`:``,fe=!(de&&de===ue),pe=uE(v),me=pe.every(e=>e.met),he=w===EE,ge=E.trim(),_e=/^[A-Za-z0-9_.-]{1,64}$/.test(ge),ve=w!==``&&(!he||_e),ye=S.status===`populated`||S.status===`empty`||S.status===`pre-oauth`,be=o.status===`populated`&&ye&&ve&&se&&le&&fe&&me&&!O,xe=c!==``&&!cE(c)?`Use lowercase letters, numbers, and hyphens. Start and end with a letter or number.`:null,Se=ce&&!cE(f)?`Use lowercase letters, numbers, and hyphens. Start and end with a letter or number.`:fe?null:`Public address must differ from the admin address.`,Ce=I?.field===`admin`?I.message:null,we=I?.field===`public`?I.message:null,Te=I?.field===`password`?I.message:null,V=I?.field===`script`||I?.field===`request`?I.message:null,Ee=()=>{M(!1),L(null),k(!1)},De=async()=>{if(!be)return;if(!r){L({field:`request`,message:`No session key available — refresh the page.`});return}k(!0),L(null),M(!1);let e=new AbortController;R.current=setTimeout(()=>{e.abort(),M(!0)},CE);let n={session_key:r,adminLabel:c.replace(/-+$/,``),adminDomain:u,password:v};ce&&(n.publicLabel=f.replace(/-+$/,``),n.publicDomain=m),g&&(n.apex=g),i&&(n.messageId=i),he?n.tunnelName=ge:n.tunnelId=w;try{let r=await fetch(`/api/admin/cloudflare/setup`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(n),signal:e.signal});R.current&&clearTimeout(R.current),R.current=null;let i=await r.json();if(!i.ok){L({field:i.field,message:i.message,output:i.output,correlationId:i.correlationId,streamLogPath:i.streamLogPath});let e=i.streamLogPath?`\n\nstream log: ${i.streamLogPath}`:``;t(i.output&&i.output.length>0?`Cloudflare setup failed: ${i.message}\n\n${i.output}${e}`:`Cloudflare setup failed: ${i.message}${e}`),k(!1);return}if(i.actionId){P(i.actionId);return}t(i.output)}catch(t){if(R.current&&clearTimeout(R.current),R.current=null,e.signal.aborted)return;L({field:`script`,message:t instanceof Error?t.message:`Network error — try again.`}),k(!1)}},H=(0,U.useMemo)(()=>c?`${c}.${u||`your-domain`}`:`your-name.${u||`your-domain`}`,[c,u]);if(o.status===`loading`)return(0,W.jsx)(j,{submitted:!1,actions:[],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[a?.title&&(0,W.jsx)(`div`,{className:`form-input__title`,children:a.title}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:`Reading the domains on your Cloudflare account…`})]})});if(o.status===`empty`)return(0,W.jsx)(j,{submitted:!1,actions:[{label:`Retry`,variant:`primary`,onClick:re}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:`No domains on this Cloudflare account`}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:`Add a domain in the Cloudflare dashboard first, then click Retry.`}),(0,W.jsxs)(`ol`,{className:`form-input__field-desc`,style:{margin:0,paddingLeft:20},children:[(0,W.jsxs)(`li`,{children:[`With the correct account active (top-left), click `,(0,W.jsx)(`strong`,{children:`Websites`}),` in the left-hand sidebar.`]}),(0,W.jsxs)(`li`,{children:[`Click the `,(0,W.jsx)(`strong`,{children:`Add a site`}),` button.`]}),(0,W.jsxs)(`li`,{children:[`Enter the bare domain (e.g. `,(0,W.jsx)(`code`,{children:`example.com`}),`) and click `,(0,W.jsx)(`strong`,{children:`Continue`}),`.`]}),(0,W.jsxs)(`li`,{children:[`Review Cloudflare's imported DNS records — preserve website (`,(0,W.jsx)(`code`,{children:`A`}),`), email (`,(0,W.jsx)(`code`,{children:`MX`}),`), and verification (`,(0,W.jsx)(`code`,{children:`TXT`}),`) entries.`]}),(0,W.jsx)(`li`,{children:`Copy Cloudflare's two nameservers and set them on your domain registrar.`}),(0,W.jsxs)(`li`,{children:[`Return to Cloudflare and click `,(0,W.jsx)(`strong`,{children:`Check nameservers`}),`. Wait for the zone to show `,(0,W.jsx)(`strong`,{children:`Active`}),`.`]})]})]})});if(o.status===`error`){let e=o.field===`config`,t=o.field===`dashboard`,n=e?`Cloudflare setup misconfigured for brand "${o.brand??`unknown`}"`:t?`Not signed into Cloudflare on this device`:`Could not read domains from Cloudflare`,r=e?`${o.message}. Re-run the installer to restamp brand.json with the correct cdpPort, then re-open this form. The verbatim script output below names the missing key.`:t?`Sign in again at the Cloudflare dashboard in the VNC browser, then click Retry. If the VNC browser is not open, ask me to run vnc.sh restart.`:o.message;return(0,W.jsx)(j,{submitted:!1,actions:e?[]:[{label:`Retry`,variant:`primary`,onClick:re}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:n}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:r}),o.output&&o.output.length>0&&(0,W.jsx)(`pre`,{style:{marginTop:8,padding:8,maxHeight:280,overflow:`auto`,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:12,lineHeight:1.4,whiteSpace:`pre-wrap`,wordBreak:`break-word`,background:`var(--surface-2, rgba(0,0,0,0.04))`,borderRadius:4},children:TE(o.output)}),(o.correlationId||o.streamLogPath)&&(0,W.jsxs)(`div`,{style:{marginTop:8,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:11,color:`var(--text-secondary)`,wordBreak:`break-all`},children:[o.correlationId&&(0,W.jsxs)(`div`,{children:[`conversationId: `,o.correlationId]}),o.streamLogPath&&(0,W.jsxs)(`div`,{children:[`stream log: `,o.streamLogPath]})]})]})})}if(F)return(0,W.jsx)(j,{submitted:!1,actions:[{label:`Try again`,variant:`primary`,onClick:()=>{ee(null),P(null),L(null),k(!1),M(!1)}}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:F.card.title}),(0,W.jsx)(`div`,{className:`form-input__desc`,style:{whiteSpace:`pre-wrap`},children:F.card.intro}),(0,W.jsx)(`ol`,{style:{marginTop:10,paddingLeft:20,lineHeight:1.6},children:F.card.steps.map((e,t)=>(0,W.jsx)(`li`,{children:e},t))}),F.card.footnote&&(0,W.jsx)(`div`,{style:{marginTop:10,fontStyle:`italic`,color:`#666`},children:F.card.footnote})]})});if(N&&r){let e=te===`completed`||te===`restart-reconciled`?`Cloudflare setup complete.`:te===`failed`||te===`exit-unobserved-no-restart-context`?`Cloudflare setup failed.`:te===`restart-in-progress`?`Restart in progress — agent will reply once the service is back.`:`Cloudflare setup in progress — keep this panel open until it completes.`;return(0,W.jsx)(j,{submitted:!1,actions:[],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[a?.title&&(0,W.jsx)(`div`,{className:`form-input__title`,children:a.title}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:e}),(0,W.jsx)(`div`,{style:{marginTop:10,height:360},children:(0,W.jsx)(xE,{actionId:N,sessionKey:r,selfRestart:{atStep:`service-restart-armed`},onOutcome:e=>ne(e),onExit:(e,n)=>{if(z.current.has(N)){Nt(`cloudflare-setup-form`,{kind:`suppressed-duplicate`,actionId:N,exitCode:e.code});return}if(z.current.add(N),e.code===0){let e=`Cloudflare setup completed (actionId: ${N}).`;Nt(`cloudflare-setup-form`,{kind:`post-restart-resume-armed`,actionId:N}),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`admin-chat:post-restart-resume`,{detail:{actionId:N,message:e}}));return}if(n===`authorize-button-not-found`){ee({card:SE,actionId:N,exitCode:e.code});return}t(`Cloudflare setup failed with exit code ${e.code} (actionId: ${N}).`)}})})]})})}return A?(0,W.jsx)(j,{submitted:!1,actions:[{label:`Reset form`,variant:`ghost`,onClick:Ee}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[(0,W.jsx)(`div`,{className:`form-input__title`,children:`Setup is taking longer than expected`}),(0,W.jsx)(`div`,{className:`form-input__desc`,children:`The request is still running on the device — check the chat for live progress. Do not resubmit. If the script fails, the error will appear in chat and you can retry from there.`})]})}):(0,W.jsx)(j,{submitted:n,submittedLabel:`Submitting…`,actions:[{label:O?`Setting up…`:a?.submitLabel??`Set up Cloudflare`,variant:`primary`,disabled:!be,onClick:De}],children:(0,W.jsxs)(`div`,{className:`form-input`,children:[a?.title&&(0,W.jsx)(`div`,{className:`form-input__title`,children:a.title}),a?.description&&(0,W.jsx)(`div`,{className:`form-input__desc`,children:a.description}),(0,W.jsxs)(`div`,{className:`form-input__fields`,children:[(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-admin-label`,children:[`Admin address`,(0,W.jsx)(`span`,{className:`form-input__required`,children:`*`})]}),(0,W.jsxs)(`div`,{className:`tunnel-route__row`,children:[(0,W.jsx)(`input`,{id:`cf-admin-label`,className:`form-input__input tunnel-route__input`,type:`text`,autoCapitalize:`none`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,placeholder:`your-name`,value:c,onChange:e=>ae(e.target.value),disabled:n||O}),(0,W.jsx)(OE,{id:`cf-admin-domain`,value:u,options:B,onChange:d,disabled:n||O})]}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Where you access your platform remotely, via your main domain.`}),(0,W.jsxs)(`div`,{className:`form-input__field-desc`,children:[`Preview: `,(0,W.jsx)(`span`,{className:`tunnel-route__preview`,children:H})]}),(Ce||xe)&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:Ce??xe})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-public-label`,children:[`Public address`,(0,W.jsx)(`span`,{className:`tunnel-route__optional`,children:`Optional`})]}),(0,W.jsxs)(`div`,{className:`tunnel-route__row`,children:[(0,W.jsx)(`input`,{id:`cf-public-label`,className:`form-input__input tunnel-route__input`,type:`text`,autoCapitalize:`none`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,placeholder:`leave empty to skip`,value:f,onChange:e=>oe(e.target.value),disabled:n||O}),(0,W.jsx)(OE,{id:`cf-public-domain`,value:m,options:B,onChange:h,disabled:n||O||!ce})]}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Where visitors engage with your public agents, via your main domain. Leave empty for admin-only access.`}),(we||Se)&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:we??Se})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-apex`,children:[`Proxy apex`,(0,W.jsx)(`span`,{className:`tunnel-route__optional`,children:`Optional`})]}),(0,W.jsxs)(tn,{id:`cf-apex`,className:`form-input__select`,value:g,onChange:e=>_(e.target.value),disabled:n||O,children:[(0,W.jsx)(`option`,{value:``,children:`None`}),B.map(e=>(0,W.jsx)(`option`,{value:e,children:e},e))]}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Alternative domain for public agent visitors.`})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-tunnel`,children:[`Tunnel`,(0,W.jsx)(`span`,{className:`form-input__required`,children:`*`})]}),S.status===`loading`&&(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:`Loading tunnels from your Cloudflare account…`}),S.status===`error`&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:S.message}),S.status===`pre-oauth`&&(0,W.jsx)(`div`,{className:`form-input__field-desc`,style:{marginBottom:4},children:S.message}),ye&&(0,W.jsxs)(W.Fragment,{children:[(0,W.jsxs)(tn,{id:`cf-tunnel`,className:`form-input__select`,value:w,onChange:e=>T(e.target.value),disabled:n||O,children:[S.status===`populated`&&(0,W.jsxs)(W.Fragment,{children:[w===``&&(0,W.jsx)(`option`,{value:``,children:`Select a tunnel…`}),S.tunnels.map(e=>(0,W.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,W.jsx)(`option`,{value:EE,children:`+ Create a new tunnel…`})]}),he&&(0,W.jsx)(`div`,{className:`tunnel-route__row`,style:{marginTop:8},children:(0,W.jsx)(`input`,{id:`cf-tunnel-new-name`,className:`form-input__input tunnel-route__input`,type:`text`,autoCapitalize:`none`,autoComplete:`off`,autoCorrect:`off`,spellCheck:!1,placeholder:`new-tunnel-name`,value:E,onChange:e=>D(e.target.value),disabled:n||O})}),(0,W.jsx)(`div`,{className:`form-input__field-desc`,children:S.status===`pre-oauth`?`Use letters, digits, dots, dashes, underscores. 1–64 characters.`:S.status===`empty`?`No existing tunnels on your Cloudflare account — give the new tunnel a name.`:he?`Use letters, digits, dots, dashes, underscores. 1–64 characters.`:`Existing tunnels from the Cloudflare account you signed into. Hostnames you set above will be CNAME’d to whichever tunnel you pick.`}),he&&E!==``&&!_e&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:`Use letters, digits, dots, dashes, underscores. 1–64 characters.`}),I?.field===`tunnel`&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:I.message})]})]}),(0,W.jsxs)(`div`,{className:`form-input__field`,children:[(0,W.jsxs)(`label`,{className:`form-input__label`,htmlFor:`cf-password`,children:[`Admin password`,(0,W.jsx)(`span`,{className:`form-input__required`,children:`*`})]}),(0,W.jsxs)(`div`,{className:`tunnel-route__row`,children:[(0,W.jsx)(`input`,{id:`cf-password`,className:`form-input__input tunnel-route__input`,type:b?`text`:`password`,autoCapitalize:`none`,autoComplete:`new-password`,autoCorrect:`off`,spellCheck:!1,value:v,onChange:e=>{y(e.target.value),L(null)},disabled:n||O}),(0,W.jsx)(`button`,{type:`button`,className:`tunnel-route__suffix`,onClick:()=>x(e=>!e),disabled:n||O,style:{cursor:`pointer`,border:`none`,background:`inherit`},"aria-label":b?`Hide password`:`Show password`,children:b?`Hide`:`Show`})]}),(0,W.jsx)(`ul`,{className:`form-input__field-desc`,style:{margin:0,paddingLeft:16},children:pe.map(e=>(0,W.jsxs)(`li`,{style:{color:e.met?`var(--text)`:`var(--text-secondary)`},children:[e.met?`✓`:`○`,` `,e.label]},e.key))}),Te&&(0,W.jsx)(`div`,{className:`tunnel-route__error`,children:Te})]}),V&&(0,W.jsxs)(`div`,{className:`tunnel-route__error`,role:`alert`,children:[(0,W.jsx)(`div`,{children:V}),I?.output&&I.output.length>0&&(0,W.jsx)(`pre`,{style:{marginTop:8,padding:8,maxHeight:280,overflow:`auto`,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:12,lineHeight:1.4,whiteSpace:`pre-wrap`,wordBreak:`break-word`,background:`var(--surface-2, rgba(0,0,0,0.04))`,borderRadius:4},children:TE(I.output)}),(I?.correlationId||I?.streamLogPath)&&(0,W.jsxs)(`div`,{style:{marginTop:8,fontFamily:`var(--font-mono, ui-monospace, monospace)`,fontSize:11,color:`var(--text-secondary)`,wordBreak:`break-all`},children:[I.correlationId&&(0,W.jsxs)(`div`,{children:[`conversationId: `,I.correlationId]}),I.streamLogPath&&(0,W.jsxs)(`div`,{children:[`stream log: `,I.streamLogPath]})]})]})]})]})})}function OE({id:e,value:t,options:n,onChange:r,disabled:i}){return(0,W.jsx)(tn,{id:e,className:`tunnel-route__suffix`,value:t,onChange:e=>r(e.target.value),disabled:i,children:n.map(e=>(0,W.jsxs)(`option`,{value:e,children:[`.`,e]},e))})}var kE={"single-select":C,"multi-select":I,confirm:Qt,"info-card":$t,"action-list":en,form:nn,progress:an,"browser-viewer":sn,"rich-content-editor":xT,"grid-editor":OT,"qr-code":nE,"file-attachment":aE,"action-buttons":P,"cloudflare-setup-form":DE,"output-style":C,"thinking-view":C,"plugin-selector":I};function AE(e){let{data:t,filePath:n,onOpen:r}=e,i=n.split(`/`).pop()||n||`document.md`,a=(i.split(`.`).pop()||`doc`).toUpperCase().slice(0,6),o=n||i,s=(0,U.useRef)(!1);return(0,U.useEffect)(()=>{s.current||(s.current=!0,r({docId:o,name:i,content:t.content??``}))},[o,i,t.content,r]),(0,W.jsx)(`div`,{className:`component-card artefact-ref-card`,children:(0,W.jsxs)(`button`,{type:`button`,className:`artefact-ref-button`,onClick:()=>r({docId:o,name:i,content:t.content??``}),children:[(0,W.jsx)(`span`,{className:`artefact-ref-icon`,children:(0,W.jsx)(m,{size:16})}),(0,W.jsxs)(`span`,{className:`artefact-ref-meta`,children:[(0,W.jsx)(`span`,{className:`artefact-ref-name`,children:i}),(0,W.jsxs)(`span`,{className:`artefact-ref-tag`,children:[a,` · open in artefact pane`]})]}),(0,W.jsx)(`span`,{className:`artefact-ref-open`,children:(0,W.jsx)(Ie,{size:14})})]})})}function jE({name:e,data:t,onSubmit:n,submitted:r,isStreaming:i,sessionKey:a,messageId:o,onOpenArtefact:s}){if(e===`document-editor`&&s){let e=t??{};return(0,W.jsx)(AE,{data:e,filePath:e.filePath||e.title||`document.md`,onOpen:s})}if(e===`document-editor`)return(0,W.jsx)(aT,{data:t,onSubmit:n,submitted:r,isStreaming:i});let c=kE[e];return c?(0,W.jsx)(c,{data:t,onSubmit:n,submitted:r,isStreaming:i,sessionKey:a,messageId:o}):(console.warn(`[ComponentRenderer] Unknown component: "${e}". Registered: ${Object.keys(kE).join(`, `)}`),(0,W.jsx)(`div`,{className:`component-card component-card--error`,children:(0,W.jsxs)(`p`,{style:{fontFamily:`var(--font-body)`,fontSize:12,color:`var(--text-secondary)`},children:[`Component “`,e,`” is not available. This may require a platform update.`]})}))}var ME=/\b(?:fail|error|unable|could not|cannot|CAPTCHA|SIGN_IN_REQUIRED)\b/i;function NE(e){let t=new Date(e),n=new Date,r=String(t.getHours()).padStart(2,`0`),i=String(t.getMinutes()).padStart(2,`0`);return t.toDateString()===n.toDateString()?`${r}:${i}`:`${String(t.getDate()).padStart(2,`0`)}-${String(t.getMonth()+1).padStart(2,`0`)}-${t.getFullYear()} ${r}:${i}`}var PE=[ht,ft,xe,ut,Pe];function FE({size:e=13}){let[t,n]=(0,U.useState)(0);(0,U.useEffect)(()=>{let e=setInterval(()=>n(e=>(e+1)%8),300);return()=>clearInterval(e)},[]);let r=t<=4?t:8-t,i=PE[r];return(0,W.jsx)(i,{size:e,className:`star-loader star-frame-${r}`})}var IE=[`Thinking`,`Reasoning`,`Analyzing`,`Considering`,`Reflecting`,`Evaluating`,`Weighing`,`Synthesizing`,`Processing`,`Exploring`,`Examining`,`Assessing`,`Reviewing`,`Contemplating`,`Deliberating`],LE=60,RE=1500;function zE(){let e=(0,U.useRef)(-1),t=(0,U.useRef)(void 0),[n,r]=(0,U.useState)(()=>{let t=Math.floor(Math.random()*IE.length);return e.current=t,IE[t]+`…`});return(0,U.useEffect)(()=>{let n=!1;function i(){let t;do t=Math.floor(Math.random()*IE.length);while(t===e.current&&IE.length>1);return e.current=t,t}function a(){if(n)return;let e=IE[i()]+`…`,o=0;function s(){n||(o++,r(e.slice(0,o)),o<e.length?t.current=setTimeout(s,LE):t.current=setTimeout(a,RE))}t.current=setTimeout(s,LE)}return t.current=setTimeout(a,RE),()=>{n=!0,clearTimeout(t.current)}},[]),(0,W.jsx)(`span`,{className:`tl-thinking-typewriter`,children:n})}function BE(e,t){let n=e=>String(e??``);switch(e){case`Read`:return`Read ${n(t.file_path??t.path)}`;case`Write`:return`Write ${n(t.file_path??t.path)}`;case`Edit`:return`Edit ${n(t.file_path??t.path)}`;case`Bash`:return n(t.description??String(t.command??``).slice(0,70));case`Glob`:return`Glob ${n(t.pattern)}`;case`Grep`:return`Grep "${n(t.pattern)}" in ${n(t.path??`.`)}`;case`WebFetch`:return`Fetch ${n(t.url)}`;case`Agent`:return n(t.description??t.task??`Subagent`);case`Skill`:return n(t.skill??`Skill`);default:{let r=e.match(/^mcp__[^_]+__(.+)$/),i=r?r[1]:e,a=Object.keys(t)[0];return a?`${i}: ${n(t[a]).slice(0,50)}`:i}}}function VE({name:e,size:t=12}){let n=e.match(/^mcp__[^_]+__(.+)$/);switch(n?n[1]:e){case`Read`:return(0,W.jsx)(m,{size:t});case`Write`:return(0,W.jsx)(He,{size:t});case`Edit`:return(0,W.jsx)(Ve,{size:t});case`Bash`:return(0,W.jsx)(gt,{size:t});case`Glob`:case`Grep`:return(0,W.jsx)(fe,{size:t});case`WebFetch`:return(0,W.jsx)(k,{size:t});case`Agent`:return(0,W.jsx)(we,{size:t});case`Skill`:return(0,W.jsx)(ft,{size:t});case`memory-search`:return(0,W.jsx)(Ne,{size:t});case`memory-write`:return(0,W.jsx)(Me,{size:t});case`task-list`:return(0,W.jsx)(Oe,{size:t});case`task-create`:return(0,W.jsx)(ke,{size:t});case`contact-create`:return(0,W.jsx)(_t,{size:t});default:return(0,W.jsx)(yt,{size:t})}}function HE(e){let t=new Map,n=new Map;return e.forEach((e,r)=>{if(e.type===`tool_use`){let t=n.get(e.name)??[];t.push(r),n.set(e.name,t)}else if(e.type===`tool_result`){let i=n.get(e.name);i?.length&&t.set(i.shift(),r)}}),t}function UE(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function WE(e){let t=``;switch(e.type){case`text`:case`thinking`:t=e.content??``;break;case`tool_use`:t=JSON.stringify(e.input??{});break;case`tool_result`:t=e.output??``;break;case`subagent_start`:t=e.task??``;break;case`subagent_end`:t=e.result??``;break;case`component`:t=JSON.stringify(e.data??{});break;case`status`:t=e.message??``;break;default:return 0}return Math.ceil(t.length/4)}function GE(e){if(e<60)return`${e}s`;let t=Math.floor(e/60),n=e%60;return n>0?`${t}m ${n}s`:`${t}m`}function KE(e){if(e<60)return`${e.toFixed(1)}s`;let t=Math.floor(e/60),n=e%60;return n>=.1?`${t}m ${Math.floor(n)}s`:`${t}m`}function qE({icon:e,isPending:t,isError:n,doneClass:r=`tl-done`,summary:i,detail:a,tokens:o,elapsed:s,isLast:c,expanded:l,onToggle:u,selectCheck:d}){let p=!!a;return(0,W.jsxs)(`div`,{className:`tl-step`,children:[d,(0,W.jsxs)(`div`,{className:`tl-col`,children:[(0,W.jsx)(`div`,{className:`tl-icon${t?` tl-pending`:n?` tl-error`:` ${r}`}`,children:e}),!c&&(0,W.jsx)(`div`,{className:`tl-line tl-line-grow`})]}),(0,W.jsxs)(`div`,{className:`tl-body`,children:[(0,W.jsxs)(`div`,{className:`tl-row`,onClick:p?()=>{window.getSelection()?.toString()||u()}:void 0,style:{cursor:p?`pointer`:`default`},children:[(0,W.jsx)(`span`,{className:`tl-summary`,children:i}),o>0&&(0,W.jsxs)(`span`,{className:`tl-step-tokens`,children:[(0,W.jsx)(bt,{size:9}),UE(o)]}),(0,W.jsx)(`span`,{className:`tl-step-elapsed`,children:KE(s)}),p&&(0,W.jsx)(`span`,{className:`tl-chevron`,children:l?(0,W.jsx)(f,{size:10}):(0,W.jsx)(Ee,{size:10})})]}),p&&l&&(0,W.jsx)(`pre`,{className:`tl-detail`,children:a})]})]})}function JE({events:e,isStreaming:t,elapsedSeconds:n,streamStartMs:r,expandAll:i,onCompactNow:a,isCompacting:o,sessionCompacted:s,onComponentSubmit:c,submittedComponents:l,timestamp:u,selectionMode:d,selectedItems:m,onToggleItem:h,sessionKey:g,messageId:_,onOpenArtefact:v}){let[y,b]=(0,U.useState)(new Set),[x,S]=(0,U.useState)(!t),C=(0,U.useRef)(t);(0,U.useEffect)(()=>{C.current&&!t&&S(!0),!C.current&&t&&S(!1),C.current=t},[t]);let T=(0,U.useRef)(new Map),E=(0,U.useRef)(0),[O,k]=(0,U.useState)(Date.now());(0,U.useEffect)(()=>{let t=Date.now();for(let n=E.current;n<e.length;n++)T.current.has(n)||T.current.set(n,t);E.current=e.length},[e]),(0,U.useEffect)(()=>{if(!t)return;let e=setInterval(()=>k(Date.now()),100);return()=>clearInterval(e)},[t]);let A=e=>{b(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},j=(e,t)=>{let n=e===re[0]?.i&&r?r:T.current.get(e)??O,i=t===void 0?O:T.current.get(t)??O;return Math.max(0,(i-n)/1e3)},M=HE(e),N=new Set(M.values()),P=e.map((e,t)=>({e,i:t})).filter(({e})=>e.type===`text`),F=new Set(t?[]:e.map((e,t)=>({e,i:t})).filter(({e})=>e.type===`component`).map(({i:e})=>e)),ee=e=>e.type===`component`&&[`browser-viewer`,`qr-code`].includes(e.name);function I(e){if(!d||t||!u)return null;let n=`${u}_${e}`;return(0,W.jsx)(`div`,{className:`tl-select-check`,onClick:e=>e.stopPropagation(),children:(0,W.jsx)(ve,{checked:m?.has(n)??!1,onChange:()=>h?.(n)})})}let L=e.findLast(e=>e.type===`usage`),z=e.findLast(e=>e.type===`history_usage`),te=e.findLast(e=>e.type===`status`),ne=e.some(e=>e.type===`subagent_start`),re=e.map((e,t)=>({e,i:t})).filter(({e,i:n})=>e.type!==`text`&&e.type!==`usage`&&e.type!==`rate_limit`&&e.type!==`history_usage`&&e.type!==`status`&&e.type!==`done`&&e.type!==`subagent_progress`&&!N.has(n)&&!F.has(n)&&!(t&&e.type===`component`&&!ee(e))&&!(e.type===`tool_use`&&e.name===`Agent`&&ne)),B=new Map;for(let e=0;e<re.length-1;e++)B.set(re[e].i,re[e+1].i);let ae=(()=>{let e=[],t=!1,n=0;for(let{e:r}of re)if(n+=WE(r),r.type===`thinking`)t=!0;else if(r.type===`tool_use`){let t=r.name;e.includes(t)||e.push(t)}let r=[`${re.length} step${re.length===1?``:`s`}`];if(e.length>0){let t=e.slice(0,3),n=e.length-t.length;r.push(t.join(`, `)+(n>0?` +${n}`:``))}return{text:r.join(` · `),hasThinking:t,tokenSum:n}})(),oe=L?.peak_request_pct==null?L?.context_window?Math.round((L.input_tokens+L.cache_creation_tokens+L.cache_read_tokens)/L.context_window*100):null:Math.round(L.peak_request_pct*100),se=re.length>0,ce=P.length>0,le=new Set(re.map(e=>e.i)),ue=new Set(P.map(e=>e.i)),de=[];for(let t=0;t<e.length;t++){let n=e[t],r=null;if(le.has(t)?r=`steps`:ue.has(t)&&(r=`text`),!r)continue;let i=de[de.length-1];i&&i.role===r?i.items.push({e:n,i:t}):de.push({role:r,items:[{e:n,i:t}]})}let fe=P.length>0?P[P.length-1].i:-1;function pe(n,r,a,o){let s=o===a.length-1;if(n.type===`thinking`){let e=i===void 0?!y.has(r):i,t=B.get(r);return(0,W.jsxs)(`div`,{className:`tl-step`,children:[I(r),(0,W.jsxs)(`div`,{className:`tl-col`,children:[(0,W.jsx)(`div`,{className:`tl-icon tl-dim`,children:(0,W.jsx)(Je,{size:11})}),!s&&(0,W.jsx)(`div`,{className:`tl-line tl-line-grow`})]}),(0,W.jsx)(`div`,{className:`tl-body`,children:(0,W.jsxs)(`div`,{className:`tl-row tl-row-top`,onClick:()=>{window.getSelection()?.toString()||A(r)},style:{cursor:`pointer`},children:[(0,W.jsx)(`div`,{className:`tl-thinking-col`,children:e?(0,W.jsx)(`div`,{className:`tl-thinking-body`,children:n.content}):(0,W.jsxs)(`span`,{className:`tl-summary tl-thinking-label`,children:[n.content.slice(0,80),n.content.length>80?`…`:``]})}),WE(n)>0&&(0,W.jsxs)(`span`,{className:`tl-step-tokens`,children:[(0,W.jsx)(bt,{size:9}),UE(WE(n))]}),(0,W.jsx)(`span`,{className:`tl-step-elapsed`,children:KE(j(r,t))}),(0,W.jsx)(`span`,{className:`tl-chevron`,children:e?(0,W.jsx)(f,{size:10}):(0,W.jsx)(Ee,{size:10})})]})})]},r)}if(n.type===`status`)return(0,W.jsx)(`div`,{className:`tl-status`,children:n.message},r);if(n.type===`tool_use`){let t=M.get(r),a=t===void 0?void 0:e[t],o=a===void 0,c=a?.type===`tool_result`&&!!a.error,l=o?(0,W.jsx)(Qe,{size:11,className:`tl-spinner`}):c?(0,W.jsx)(ie,{size:11}):(0,W.jsx)(VE,{name:n.name,size:11}),u=n,d=a?.type===`tool_result`?`Input:
344
344
  ${JSON.stringify(u.input,null,2)}
345
345
 
346
346
  Result:
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Real Agent</title>
7
7
  <link rel="icon" href="/favicon.ico">
8
- <script type="module" crossorigin src="/assets/admin-DZ8Ke7t3.js"></script>
8
+ <script type="module" crossorigin src="/assets/admin-Cpk5cT4I.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-DD-I1_y5.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-BjkIZEse.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-qlgyTAkD.js">
@@ -9174,6 +9174,10 @@ function fieldFromReason(reason) {
9174
9174
  switch (reason) {
9175
9175
  case "not-signed-in":
9176
9176
  return "dashboard";
9177
+ case "brand-arg-missing":
9178
+ case "brand-config-missing":
9179
+ case "cdp-port-unresolved":
9180
+ return "config";
9177
9181
  case "cdp-unreachable":
9178
9182
  case "target-create-failed":
9179
9183
  case "ws-connect-failed":
@@ -9202,7 +9206,7 @@ app21.get("/domains", requireAdminSession, async (c) => {
9202
9206
  function logErr(line) {
9203
9207
  console.error(`[cloudflare-domains] ${line}${tag()}`);
9204
9208
  }
9205
- function err(field, message, output) {
9209
+ function err(field, message, output, brand2) {
9206
9210
  logErr(`phase=error field=${field} reason="${message.slice(0, 160).replace(/"/g, "'")}"`);
9207
9211
  if (streamLogPath) {
9208
9212
  writeRouteMilestone(
@@ -9217,7 +9221,8 @@ app21.get("/domains", requireAdminSession, async (c) => {
9217
9221
  message,
9218
9222
  output,
9219
9223
  correlationId,
9220
- streamLogPath
9224
+ streamLogPath,
9225
+ brand: brand2
9221
9226
  };
9222
9227
  return c.json(body, 200);
9223
9228
  }
@@ -9248,7 +9253,7 @@ ${result.stderr}` : ""}`;
9248
9253
  const reason = reasonMatch ? reasonMatch[1] : void 0;
9249
9254
  const field = fieldFromReason(reason);
9250
9255
  const message = reason ? `Domain discovery failed: ${reason}` : result.timedOut ? `Domain discovery timed out after ${DOMAINS_TIMEOUT_MS / 1e3}s` : `Domain discovery exited with code ${result.code ?? "null"}${result.signal ? ` (signal ${result.signal})` : ""}`;
9251
- return err(field, message, combined);
9256
+ return err(field, message, combined, field === "config" ? brand.hostname : void 0);
9252
9257
  }
9253
9258
  let domains;
9254
9259
  try {