fix(compare): two-column layout with delta summary row, shape test
Browse filesPhase 1 — tests/test_compare_shape.py: asserts /api/agent/stream for a
compare query emits exactly one final event with intent="compare", two
targets each carrying an address field, and a merged paragraph that
splits at "---" into PLACE A / PLACE B sections each with citations.
6/6 pass against the live server.
Phase 2 — CompareBriefing.svelte: when plan.intent=="compare" and
finalResult lands, renders a two-column layout (1fr 1px 1fr grid,
collapses below 900 px) with:
- Per-column .address-header showing the resolved address
- Existing Briefing component in each column, no changes to Briefing
- compare-delta-bar above both columns: one row per canonical section
where the first compared number differs (e.g. "TWI: 12.4 vs 8.2")
- Stone provenance / FindingsRegion unchanged (full-width below)
During streaming the merged paragraph renders in the existing single
Briefing path; the two-column view switches in only after finalResult.
FinalResult interface gains optional intent + targets fields.
tests/e2e/compare.spec.ts: two playwright tests assert two .address-header
elements render, delta bar present, no ErrorCard, and narrow viewport
stacks columns. Both pass (7.3 m total, two full pipelines in series).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tests/test_compare_shape.py +112 -0
- web/sveltekit/build/200.html +8 -8
- web/sveltekit/build/_app/immutable/assets/4.BIuIAgmk.css +0 -1
- web/sveltekit/build/_app/immutable/assets/4.D4-aMRnd.css +1 -0
- web/sveltekit/build/_app/immutable/chunks/{CP2nnpRQ.js → 33K0dtcD.js} +1 -1
- web/sveltekit/build/_app/immutable/chunks/{DwBZTDEf.js → CbyeixEA.js} +1 -1
- web/sveltekit/build/_app/immutable/entry/{app.DDWmgh4I.js → app.BJix1erd.js} +2 -2
- web/sveltekit/build/_app/immutable/entry/start.DcdyosVQ.js +1 -0
- web/sveltekit/build/_app/immutable/entry/start.WS7Ab1IV.js +0 -1
- web/sveltekit/build/_app/immutable/nodes/{0.DGNwa6V0.js → 0.xQyF6Vnl.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/{1.Dyt3GH0K.js → 1.BfclScXS.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/{2.CM0XtI3C.js → 2.ecCZIVph.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/{3.CxmHooOJ.js → 3.3dbioiXY.js} +1 -1
- web/sveltekit/build/_app/immutable/nodes/4.B7upPKLG.js +0 -1
- web/sveltekit/build/_app/immutable/nodes/4.qvdqEXFv.js +1 -0
- web/sveltekit/build/_app/version.json +1 -1
- web/sveltekit/build/index.html +9 -9
- web/sveltekit/build/q/sample.html +8 -8
- web/sveltekit/src/lib/client/agentStream.ts +3 -0
- web/sveltekit/src/lib/components/briefing/CompareBriefing.svelte +267 -0
- web/sveltekit/src/routes/q/[queryId]/+page.svelte +11 -1
- web/sveltekit/tests/e2e/compare.spec.ts +121 -0
|
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Shape assertion for the compare-intent SSE endpoint.
|
| 3 |
+
|
| 4 |
+
Validates that /api/agent/stream emits exactly one `final` event for a compare
|
| 5 |
+
query, with the structure that the SvelteKit compare layout depends on:
|
| 6 |
+
|
| 7 |
+
final.intent == "compare"
|
| 8 |
+
final.targets == [{label, address}, {label, address}] (exactly 2)
|
| 9 |
+
final.paragraph contains "## PLACE A" and "## PLACE B" sections separated
|
| 10 |
+
by a markdown "---" divider
|
| 11 |
+
each half of the paragraph contains at least one [citation] bracket
|
| 12 |
+
|
| 13 |
+
Run against a live local server:
|
| 14 |
+
.venv/bin/uvicorn web.main:app --host 127.0.0.1 --port 7860 &
|
| 15 |
+
.venv/bin/python -m pytest tests/test_compare_shape.py -v
|
| 16 |
+
"""
|
| 17 |
+
from __future__ import annotations
|
| 18 |
+
|
| 19 |
+
import json
|
| 20 |
+
import re
|
| 21 |
+
|
| 22 |
+
import httpx
|
| 23 |
+
import pytest
|
| 24 |
+
|
| 25 |
+
BASE = "http://127.0.0.1:7860"
|
| 26 |
+
COMPARE_QUERY = "Compare 80 Pioneer Street Brooklyn to 100 Gold Street Manhattan"
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def _parse_sse_stream(raw: str) -> list[dict]:
|
| 30 |
+
"""Parse raw SSE text into a list of {type, data} dicts."""
|
| 31 |
+
events: list[dict] = []
|
| 32 |
+
current: dict = {}
|
| 33 |
+
for line in raw.splitlines():
|
| 34 |
+
if line.startswith("event:"):
|
| 35 |
+
current["type"] = line.split(":", 1)[1].strip()
|
| 36 |
+
elif line.startswith("data:"):
|
| 37 |
+
raw_data = line.split(":", 1)[1].strip()
|
| 38 |
+
try:
|
| 39 |
+
current["data"] = json.loads(raw_data)
|
| 40 |
+
except json.JSONDecodeError:
|
| 41 |
+
current["data"] = raw_data
|
| 42 |
+
elif line == "" and current:
|
| 43 |
+
events.append(current)
|
| 44 |
+
current = {}
|
| 45 |
+
if current:
|
| 46 |
+
events.append(current)
|
| 47 |
+
return events
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
@pytest.fixture(scope="module")
|
| 51 |
+
def compare_events() -> list[dict]:
|
| 52 |
+
"""Stream a compare query and return all parsed SSE events."""
|
| 53 |
+
url = f"{BASE}/api/agent/stream"
|
| 54 |
+
params = {"q": COMPARE_QUERY}
|
| 55 |
+
try:
|
| 56 |
+
with httpx.stream("GET", url, params=params, timeout=600.0) as resp:
|
| 57 |
+
resp.raise_for_status()
|
| 58 |
+
raw = resp.read().decode()
|
| 59 |
+
except httpx.ConnectError:
|
| 60 |
+
pytest.skip(f"Server not reachable at {BASE}")
|
| 61 |
+
return _parse_sse_stream(raw)
|
| 62 |
+
|
| 63 |
+
|
| 64 |
+
def test_has_plan_with_compare_intent(compare_events):
|
| 65 |
+
plans = [e for e in compare_events if e.get("type") == "plan"]
|
| 66 |
+
assert len(plans) == 1, f"Expected 1 plan event, got {len(plans)}"
|
| 67 |
+
plan = plans[0]["data"]
|
| 68 |
+
assert plan.get("intent") == "compare", f"plan.intent={plan.get('intent')!r}"
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def test_exactly_one_final_event(compare_events):
|
| 72 |
+
finals = [e for e in compare_events if e.get("type") == "final"]
|
| 73 |
+
assert len(finals) == 1, f"Expected 1 final event, got {len(finals)}"
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
def test_final_intent_is_compare(compare_events):
|
| 77 |
+
final = next(e for e in compare_events if e.get("type") == "final")
|
| 78 |
+
data = final["data"]
|
| 79 |
+
assert data.get("intent") == "compare", f"final.intent={data.get('intent')!r}"
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
def test_final_targets_has_two_addresses(compare_events):
|
| 83 |
+
final = next(e for e in compare_events if e.get("type") == "final")
|
| 84 |
+
targets = final["data"].get("targets", [])
|
| 85 |
+
assert len(targets) == 2, f"Expected 2 targets, got {len(targets)}: {targets}"
|
| 86 |
+
for i, t in enumerate(targets):
|
| 87 |
+
assert "address" in t, f"target[{i}] missing 'address' key: {t}"
|
| 88 |
+
assert isinstance(t["address"], str) and t["address"].strip(), \
|
| 89 |
+
f"target[{i}].address is blank: {t}"
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
def test_final_paragraph_has_both_place_sections(compare_events):
|
| 93 |
+
final = next(e for e in compare_events if e.get("type") == "final")
|
| 94 |
+
para = final["data"].get("paragraph", "")
|
| 95 |
+
assert "## PLACE A" in para, "paragraph missing '## PLACE A' header"
|
| 96 |
+
assert "## PLACE B" in para, "paragraph missing '## PLACE B' header"
|
| 97 |
+
assert "---" in para, "paragraph missing '---' divider between places"
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
def test_each_place_section_has_at_least_one_citation(compare_events):
|
| 101 |
+
final = next(e for e in compare_events if e.get("type") == "final")
|
| 102 |
+
para = final["data"].get("paragraph", "")
|
| 103 |
+
|
| 104 |
+
# Split at the markdown divider between PLACE A and PLACE B.
|
| 105 |
+
parts = re.split(r"\n\s*---\s*\n", para, maxsplit=1)
|
| 106 |
+
assert len(parts) == 2, f"Could not split paragraph at '---': got {len(parts)} parts"
|
| 107 |
+
|
| 108 |
+
cite_re = re.compile(r"\[[a-z][a-z0-9_]*\]", re.IGNORECASE)
|
| 109 |
+
for i, part in enumerate(parts):
|
| 110 |
+
label = "PLACE A" if i == 0 else "PLACE B"
|
| 111 |
+
cites = cite_re.findall(part)
|
| 112 |
+
assert len(cites) >= 1, f"{label} section has no [citation] brackets"
|
|
@@ -6,17 +6,17 @@
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
-
<link href="/_app/immutable/entry/start.
|
| 10 |
-
<link href="/_app/immutable/chunks/
|
| 11 |
<link href="/_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
|
| 12 |
-
<link href="/_app/immutable/entry/app.
|
| 13 |
<link href="/_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
|
| 14 |
<link href="/_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
|
| 15 |
<link href="/_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
|
| 16 |
<link href="/_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
|
| 17 |
-
<link href="/_app/immutable/nodes/0.
|
| 18 |
<link href="/_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
|
| 19 |
-
<link href="/_app/immutable/chunks/
|
| 20 |
<link href="/_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
|
| 21 |
<link href="/_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
|
| 22 |
<link href="/_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
|
|
@@ -28,15 +28,15 @@
|
|
| 28 |
<div style="display: contents">
|
| 29 |
<script>
|
| 30 |
{
|
| 31 |
-
|
| 32 |
base: ""
|
| 33 |
};
|
| 34 |
|
| 35 |
const element = document.currentScript.parentElement;
|
| 36 |
|
| 37 |
Promise.all([
|
| 38 |
-
import("/_app/immutable/entry/start.
|
| 39 |
-
import("/_app/immutable/entry/app.
|
| 40 |
]).then(([kit, app]) => {
|
| 41 |
kit.start(app, element);
|
| 42 |
});
|
|
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
+
<link href="/_app/immutable/entry/start.DcdyosVQ.js" rel="modulepreload">
|
| 10 |
+
<link href="/_app/immutable/chunks/33K0dtcD.js" rel="modulepreload">
|
| 11 |
<link href="/_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
|
| 12 |
+
<link href="/_app/immutable/entry/app.BJix1erd.js" rel="modulepreload">
|
| 13 |
<link href="/_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
|
| 14 |
<link href="/_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
|
| 15 |
<link href="/_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
|
| 16 |
<link href="/_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
|
| 17 |
+
<link href="/_app/immutable/nodes/0.xQyF6Vnl.js" rel="modulepreload">
|
| 18 |
<link href="/_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
|
| 19 |
+
<link href="/_app/immutable/chunks/CbyeixEA.js" rel="modulepreload">
|
| 20 |
<link href="/_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
|
| 21 |
<link href="/_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
|
| 22 |
<link href="/_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
|
|
|
|
| 28 |
<div style="display: contents">
|
| 29 |
<script>
|
| 30 |
{
|
| 31 |
+
__sveltekit_95np12 = {
|
| 32 |
base: ""
|
| 33 |
};
|
| 34 |
|
| 35 |
const element = document.currentScript.parentElement;
|
| 36 |
|
| 37 |
Promise.all([
|
| 38 |
+
import("/_app/immutable/entry/start.DcdyosVQ.js"),
|
| 39 |
+
import("/_app/immutable/entry/app.BJix1erd.js")
|
| 40 |
]).then(([kit, app]) => {
|
| 41 |
kit.start(app, element);
|
| 42 |
});
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
.plan-details.svelte-1q8jizq{border:1px solid var(--rule-soft);background:var(--paper-deep);margin-bottom:16px}.plan-details.svelte-1q8jizq summary:where(.svelte-1q8jizq){padding:10px 14px;cursor:pointer;font-family:var(--font-mono);font-size:12px;color:var(--ink-secondary)}.plan-stream.svelte-1q8jizq{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);white-space:pre-wrap;padding:0 14px 12px;margin:0;max-height:240px;overflow:auto}.generating-status.svelte-1q8jizq{display:flex;align-items:center;gap:12px;padding:12px 0;font-family:var(--font-mono);font-size:13px;color:var(--ink-secondary);flex-wrap:wrap}.pulse.svelte-1q8jizq{width:8px;height:8px;border-radius:50%;background:var(--accent-graphical);animation:svelte-1q8jizq-pulse 1.4s ease-in-out infinite}@keyframes svelte-1q8jizq-pulse{0%,to{opacity:.3;transform:scale(.85)}50%{opacity:1;transform:scale(1.1)}}@media(prefers-reduced-motion:reduce){.pulse.svelte-1q8jizq{animation:none;opacity:.7}}
|
|
|
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
.compare-layout.svelte-rr14x0{width:100%}.compare-delta-bar.svelte-rr14x0{border:1px solid var(--rule-soft);background:var(--paper-deep);padding:var(--s-3) var(--s-4);margin-bottom:var(--s-5);display:flex;gap:var(--s-4);align-items:flex-start;flex-wrap:wrap}.compare-delta-title.svelte-rr14x0{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-tertiary);flex-shrink:0;padding-top:1px}.compare-delta-rows.svelte-rr14x0{display:flex;flex-wrap:wrap;gap:var(--s-2) var(--s-5);flex:1}.compare-delta-row.svelte-rr14x0{display:inline-flex;align-items:baseline;gap:var(--s-2);font-family:var(--font-mono);font-size:12px}.compare-delta-section.svelte-rr14x0{color:var(--ink-tertiary);text-transform:uppercase;letter-spacing:.08em;font-size:10px;flex-shrink:0}.compare-delta-claim.svelte-rr14x0{color:var(--ink);display:inline-flex;align-items:baseline;gap:3px}.compare-delta-ctx.svelte-rr14x0{color:var(--ink-secondary);margin-right:2px}.compare-delta-a.svelte-rr14x0,.compare-delta-b.svelte-rr14x0{color:var(--accent);font-weight:600}.compare-delta-vs.svelte-rr14x0{color:var(--ink-tertiary);font-style:italic}.compare-cols.svelte-rr14x0{display:grid;grid-template-columns:1fr 1px 1fr;gap:0 var(--s-5);align-items:start}.compare-col.svelte-rr14x0{min-width:0}.compare-divider.svelte-rr14x0{background:var(--rule-soft);align-self:stretch}.compare-address-header.svelte-rr14x0{font-family:var(--font-mono);font-size:13px;font-weight:600;letter-spacing:.04em;color:var(--ink);border-bottom:1px solid var(--rule-soft);padding-bottom:var(--s-2);margin-top:0;margin-bottom:var(--s-4);line-height:1.4}@media(max-width:899px){.compare-cols.svelte-rr14x0{grid-template-columns:1fr;gap:0}.compare-divider.svelte-rr14x0{width:100%;height:1px;margin:var(--s-5) 0;align-self:auto}}.plan-details.svelte-1q8jizq{border:1px solid var(--rule-soft);background:var(--paper-deep);margin-bottom:16px}.plan-details.svelte-1q8jizq summary:where(.svelte-1q8jizq){padding:10px 14px;cursor:pointer;font-family:var(--font-mono);font-size:12px;color:var(--ink-secondary)}.plan-stream.svelte-1q8jizq{font-family:var(--font-mono);font-size:11px;color:var(--ink-tertiary);white-space:pre-wrap;padding:0 14px 12px;margin:0;max-height:240px;overflow:auto}.generating-status.svelte-1q8jizq{display:flex;align-items:center;gap:12px;padding:12px 0;font-family:var(--font-mono);font-size:13px;color:var(--ink-secondary);flex-wrap:wrap}.pulse.svelte-1q8jizq{width:8px;height:8px;border-radius:50%;background:var(--accent-graphical);animation:svelte-1q8jizq-pulse 1.4s ease-in-out infinite}@keyframes svelte-1q8jizq-pulse{0%,to{opacity:.3;transform:scale(.85)}50%{opacity:1;transform:scale(1.1)}}@media(prefers-reduced-motion:reduce){.pulse.svelte-1q8jizq{animation:none;opacity:.7}}
|
|
@@ -1 +1 @@
|
|
| 1 |
-
var rt=e=>{throw TypeError(e)};var Dt=(e,t,n)=>t.has(e)||rt("Cannot "+n);var y=(e,t,n)=>(Dt(e,t,"read from private field"),n?n.call(e):t.get(e)),A=(e,t,n)=>t.has(e)?rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{bf as Pe,bg as Vt,ai as at,a4 as T,o as I,a5 as O,ar as we,bh as Bt}from"./BTUA7_xE.js";const M=[];function Ke(e,t=Pe){let n=null;const a=new Set;function r(o){if(Vt(e,o)&&(e=o,n)){const l=!M.length;for(const c of a)c[1](),M.push(c,e);if(l){for(let c=0;c<M.length;c+=2)M[c][0](M[c+1]);M.length=0}}}function i(o){r(o(e))}function s(o,l=Pe){const c=[o,l];return a.add(c),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Me{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class ze{constructor(t,n){try{new Headers({location:n})}catch{throw new Error(`Invalid redirect location ${JSON.stringify(n)}: this string contains characters that cannot be used in HTTP headers`)}this.status=t,this.location=n}}class Fe extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Kt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Mt(e){return e.split("%25").map(decodeURI).join("%25")}function zt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function C(){}function Ft(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;function Gt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Ht=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&X.delete(Ge(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Ge(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&X.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Gt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Ge(e,n),r=X.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);X.delete(a)}}return window.fetch(t,n)}function Ge(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${Ft(...r)}"]`}return a}const Yt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Xt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return Ce(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return Ce(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(l),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return Ce(l)}).join("")}).join("")}/?$`),params:t}}function Qt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Qt)}function en(e,t,n){const a={},r=e.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;o<t.length;o+=1){const l=t[o];let c=r[o-s];if(l.chained&&l.rest&&s&&(c=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function Ce(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function tn({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Xt(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return en(m,w,a)},errors:[1,...d||[]].map(f=>e[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[r.has(o),e[o]]}}function wt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ot(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ht;const U=((ht=globalThis.__sveltekit_a4deoi)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_a4deoi)==null?void 0:pt.assets)??U??"",rn="1778104377558",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",F="sveltekit:history",Z="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ue=location.origin;function He(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function B(){return{x:pageXOffset,y:pageYOffset}}function z(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const st={...D,"":D.hover};function kt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function St(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=kt(e)}}function qe(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Ae(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Ue&&e.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function ve(e){let t=null,n=null,a=null,r=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)a===null&&(a=z(o,"preload-code")),r===null&&(r=z(o,"preload-data")),t===null&&(t=z(o,"keepfocus")),n===null&&(n=z(o,"noscroll")),i===null&&(i=z(o,"reload")),s===null&&(s=z(o,"replacestate")),o=kt(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:st[a??"off"],preload_data:st[r??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function it(e){const t=Ke(e);let n=!0;function a(){n=!0,t.update(s=>s)}function r(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const Et={v:C};function on(){const{set:e,subscribe:t}=Ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${nn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==rn;return s&&(e(!0),Et.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:a}}function Ae(e,t,n){return e.origin!==Ue||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Pn(e){}const Rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Rt];const sn=new Set([...Rt]);[...sn];function ln(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof Fe?e.status:500}function cn(e){return e instanceof Fe?e.text:"Internal Error"}let R,ee,je;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),lt="a:";var oe,se,ie,le,ce,fe,ue,de,gt,he,mt,pe,_t;fn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(lt)},ee={current:null},je={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,le,T({}));A(this,ce,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(lt)))}get data(){return I(y(this,oe))}set data(t){O(y(this,oe),t)}get form(){return I(y(this,se))}set form(t){O(y(this,se),t)}get error(){return I(y(this,ie))}set error(t){O(y(this,ie),t)}get params(){return I(y(this,le))}set params(t){O(y(this,le),t)}get route(){return I(y(this,ce))}set route(t){O(y(this,ce),t)}get state(){return I(y(this,fe))}set state(t){O(y(this,fe),t)}get status(){return I(y(this,ue))}set status(t){O(y(this,ue),t)}get url(){return I(y(this,de))}set url(t){O(y(this,de),t)}},oe=new WeakMap,se=new WeakMap,ie=new WeakMap,le=new WeakMap,ce=new WeakMap,fe=new WeakMap,ue=new WeakMap,de=new WeakMap,gt),ee=new(mt=class{constructor(){A(this,he,T(null))}get current(){return I(y(this,he))}set current(t){O(y(this,he),t)}},he=new WeakMap,mt),je=new(_t=class{constructor(){A(this,pe,T(!1))}get current(){return I(y(this,pe))}set current(t){O(y(this,pe),t)}},pe=new WeakMap,_t),Et.v=()=>je.current=!0);function un(e){Object.assign(R,e)}const dn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const N=wt(yt)??{},te=wt(vt)??{},j={url:it({}),page:it({}),navigating:Ke(null),updated:on()};function Je(e){N[e]=B()}function hn(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function ne(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(C)}async function xt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}let Ye,De,ye,P,Ve,S;const be=[],ke=[];let v=null;function Se(){var e;(e=v==null?void 0:v.fork)==null||e.then(t=>t==null?void 0:t.discard()),v=null}const _e=new Map,Lt=new Set,pn=new Set,Q=new Set;let _={branch:[],error:null,url:null},Ut=!1,Ee=!1,ct=!0,re=!1,Y=!1,At=!1,Xe=!1,Tt,k,L,V;const Re=new Set,ft=new Map,ut=new Map;async function Nn(e,t,n){var i,s,o,l;globalThis.__sveltekit_a4deoi&&(globalThis.__sveltekit_a4deoi.query,globalThis.__sveltekit_a4deoi.prerender),document.URL!==location.href&&(location.href=location.href),S=e,await((s=(i=e.hooks).init)==null?void 0:s.call(i)),Ye=tn(e),P=document.documentElement,Ve=t,De=e.nodes[0],ye=e.nodes[1],De(),ye(),k=(o=history.state)==null?void 0:o[F],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[F]:k,[Z]:L},""));const a=N[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Ln(Ve,n)):(await G({type:"enter",url:He(S.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),r()),xn()}function gn(){be.length=0,Xe=!1}function It(e){ke.some(t=>t==null?void 0:t.snapshot)&&(te[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ot(e){var t;(t=te[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function dt(){Je(k),ot(yt,N),It(L),ot(vt,te)}async function Pt(e,t,n,a){let r,i;t.invalidateAll&&Se(),await G({type:"goto",url:He(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{if(t.invalidateAll){Xe=!0,r=new Set;for(const[s,o]of ft)for(const l of o.keys())r.add(me(s,l));i=new Set;for(const[s,o]of ut)for(const l of o.keys())i.add(me(s,l))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[l,{resource:c}]of o)r!=null&&r.has(me(s,l))&&c.refresh();for(const[s,o]of ut)for(const[l,{resource:c}]of o)i!=null&&i.has(me(s,l))&&c.reconnect()})}async function mn(e){if(e.id!==(v==null?void 0:v.id)){Se();const t={};Re.add(t),v={id:e.id,token:t,promise:Ct({...e,preload:t}).then(n=>(Re.delete(t),n.type==="loaded"&&n.state.error&&Se(),n)),fork:null}}return v.promise}async function Ne(e){var n;const t=(n=await Te(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function $t(e,t,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...e.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,e.props.page),Tt=new S.root({target:t,props:{...e.props,stores:j,components:ke},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Ot(L),n){const s={from:null,to:{...a,scroll:N[k]??B()},willUnload:!1,type:"enter",complete:Promise.resolve()};Q.forEach(o=>o(s))}Ee=!0}async function xe({url:e,params:t,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(U&&(e.pathname===U||e.pathname===U+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);e.pathname=Kt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:ln(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;f<Math.max(n.length,_.branch.length);f+=1){const m=n[f],h=_.branch[f];(m==null?void 0:m.data)!==(h==null?void 0:h.data)&&(u=!0),m&&(d={...d,...m.data},u&&(c.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(c.props.page={error:i,params:t,route:{id:(s==null?void 0:s.id)??null},state:{},status:r,url:new URL(e),form:o??null,data:u?d:R.data}),c}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var c,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();return{node:l,loader:e,server:i,universal:(c=l.universal)!=null&&c.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=l.universal)==null?void 0:d.trailingSlash)??(i==null?void 0:i.slash)}}function _n(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?Jt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function wn(e,t,n,a,r,i){if(Xe)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const s of r.search_params)if(a.has(s))return!0;for(const s of r.params)if(i[s]!==_.params[s])return!0;for(const s of r.dependencies)if(be.some(o=>o(new URL(s))))return!0;return!1}function Ze(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function vn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function yn({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:nt(R),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((v==null?void 0:v.id)===e)return Re.delete(v.token),v.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(C)),c.forEach(h=>h==null?void 0:h[1]().catch(C));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!wn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Qe({loader:h[1],url:n,params:a,route:r,parent:async()=>{var ge;const q={};for(let K=0;K<g;K+=1)Object.assign(q,(ge=await f[K])==null?void 0:ge.data);return q},server_data_node:Ze(h[0]?{type:"skip"}:null,h[0]?b==null?void 0:b.server:void 0)}))});for(const h of f)h.catch(C);const m=[];for(let h=0;h<c.length;h+=1)if(c[h])try{m.push(await f[h])}catch(g){if(g instanceof ze)return{type:"redirect",location:g.location};if(Re.has(i))return yn({error:await ae(g,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=We(g),x;if(g instanceof Me)x=g.body;else{if(await j.updated.check())return await xt(),await ne(n);x=await ae(g,{params:a,url:n,route:{id:r.id}})}const $=await bn(h,m,s);return $?xe({url:n,params:a,branch:m.slice(0,$.idx).concat($.node),errors:s,status:b,error:x,route:r}):await Nt(n,{id:r.id},x,b)}else m.push(void 0);return xe({url:n,params:a,branch:m,errors:s,status:200,error:null,route:r,form:t?void 0:null})}async function bn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function et({status:e,error:t,url:n,route:a}){const r={};let i=null;try{const s=await Qe({loader:De,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Ze(i)}),o={node:await ye(),loader:ye,universal:null,server:null,data:null};return xe({url:n,params:r,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof ze)return Pt(new URL(s.location,location.href),{},0);throw s}}async function kn(e){const t=e.href;if(_e.has(t))return _e.get(t);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(e),fetch:async(i,s)=>_n(i,s,e).promise})??e;if(typeof r=="string"){const i=new URL(e);S.hash?i.hash=r:i.pathname=r,r=i}return r})();_e.set(t,a),n=await a}catch{_e.delete(t);return}return n}async function Te(e,t){if(e&&!Ae(e,U,S.hash)){const n=await kn(e);if(!n)return;const a=Sn(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Le(e),invalidating:t,route:r,params:zt(i),url:e}}}}function Sn(e){return Mt(S.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function Le(e){return(S.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function jt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=tt(_,n,e,t,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(c=>c(l)),s?null:o}async function G({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=C,block:d=C,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):jt({url:t,type:e,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),V===l&&(V=w);return}const m=k,h=L;c(),re=!0,Ee&&f.navigation.type!=="enter"&&j.navigating.set(ee.current=f.navigation);let g=p&&await Ct(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new Fe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(p==null?void 0:p.url)||t,V!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await G({type:e,url:new URL(g.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await et({status:500,error:await ae(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await j.updated.check()&&(await xt(),await ne(t,i));if(gn(),Je(m),It(h),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,H={[F]:k+=E,[Z]:L+=E,[bt]:s};(i?history.replaceState:history.pushState).call(history,H,"",t),i||hn(k,L)}const b=p&&(v==null?void 0:v.id)===p.id?v.fork:null;v!=null&&v.fork&&!b&&Se(),v=null,g.props.page.state=s;let x;if(Ee){const E=(await Promise.all(Array.from(pn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(Oe=>{Q.delete(Oe)})};E.push(W),E.forEach(Oe=>{Q.add(Oe)})}const H=f.navigation.to;_={...g.state,nav:{params:H.params,route:H.route,url:H.url}},g.props.page&&(g.props.page.url=t);const Ie=b&&await b;Ie?x=Ie.commit():(J=null,Tt.$set(g.props),J&&Object.assign(g.props.page,J),un(g.props.page),x=(K=Bt)==null?void 0:K()),At=!0}else await $t(g,Ve,!1);const{activeElement:$}=document;await x,await we(),await we();let q=null;if(ct){const E=n?n.scroll:r?B():null;E?scrollTo(E.x,E.y):(q=t.hash&&document.getElementById(qt(t)))?q.scrollIntoView():scrollTo(0,0)}const ge=document.activeElement!==$&&document.activeElement!==document.body;!a&&!ge&&An(t,!q),ct=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),re=!1,e==="popstate"&&Ot(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=B()),Q.forEach(E=>E(f.navigation)),j.navigating.set(ee.current=null)}async function Nt(e,t,n,a,r){return e.origin===Ue&&e.pathname===location.pathname&&!Ut?await et({status:a,error:n,url:e,route:t}):await ne(e,r)}function En(){let e,t={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Ne(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=St(o,P),d=c===t.element&&(c==null?void 0:c.href)===t.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=qe(c,U,S.hash);if(w||p)return;const f=ve(c),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(l<=f.preload_data){t={element:c,href:c.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else l<=f.preload_code&&(t={element:c,href:c.href},n=l,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=qe(o,U,S.hash);if(c||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(l))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=cn(e);return S.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function qn(e,t={}){return e=new URL(He(e)),e.origin!==Ue?Promise.reject(new Error("goto: invalid URL")):Pt(e,t,0)}function Rn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function xn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(dt(),!re){const r=tt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Lt.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&dt()}),(t=navigator.connection)!=null&&t.saveData||En(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=St(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=qe(a,U,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=ve(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===$e(location);if(i||l.reload&&(!w||!u)){jt({url:r,type:"link",event:n})?re=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Je(k),e(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await G({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Ae(o,U,!1))return;const l=n.target,c=ve(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),G({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[F]){const r=n.state[F];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),l=n.state[Z],c=_.url?$e(location)===$e(_.url):!1;if(l===L&&(At||c)){s!==R.state&&(R.state=s),e(o),N[k]=B(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await G({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:V,event:n})}else if(!Y){const r=new URL(location.href);e(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[F]:++k,[Z]:L},"",location.href))});for(const n of document.querySelectorAll("link"))dn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&j.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,j.page.set(nt(R)),j.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){Ut=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(c,!1)||{}),d=Ye.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=Un(g.uses)),Qe({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x<h;x+=1)Object.assign(b,(await p[x]).data);return b},server_data_node:Ze(g)})}),f=await Promise.all(p);if(d){const m=d.layouts;for(let h=0;h<m.length;h++)m[h]||f.splice(h,0,void 0)}u=await xe({url:c,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:l,route:d??null})}catch(p){if(p instanceof ze){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:c,params:r,route:i}),url:c,route:i}),e.textContent="",w=!1}finally{}u.props.page&&(u.props.page.state={}),await $t(u,e,w)}function Un(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let Be=!1;function An(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=qt(e);if(a&&document.getElementById(a)){const{x:i,y:s}=B();setTimeout(()=>{const o=history.state;Be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Be=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s<r.rangeCount;s+=1)i.push(r.getRangeAt(s));setTimeout(()=>{if(r.rangeCount===i.length){for(let s=0;s<r.rangeCount;s+=1){const o=i[s],l=r.getRangeAt(s);if(o.commonAncestorContainer!==l.commonAncestorContainer||o.startContainer!==l.startContainer||o.endContainer!==l.endContainer||o.startOffset!==l.startOffset||o.endOffset!==l.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var c,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(C),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url,scroll:B()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((d=t==null?void 0:t.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:o},fulfil:i,reject:s}}function nt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function qt(e){let t;if(S.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Nn as a,qn as g,Pn as l,R as p,j as s};
|
|
|
|
| 1 |
+
var rt=e=>{throw TypeError(e)};var Dt=(e,t,n)=>t.has(e)||rt("Cannot "+n);var y=(e,t,n)=>(Dt(e,t,"read from private field"),n?n.call(e):t.get(e)),A=(e,t,n)=>t.has(e)?rt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n);import{bf as Pe,bg as Vt,ai as at,a4 as T,o as I,a5 as O,ar as we,bh as Bt}from"./BTUA7_xE.js";const M=[];function Ke(e,t=Pe){let n=null;const a=new Set;function r(o){if(Vt(e,o)&&(e=o,n)){const l=!M.length;for(const c of a)c[1](),M.push(c,e);if(l){for(let c=0;c<M.length;c+=2)M[c][0](M[c+1]);M.length=0}}}function i(o){r(o(e))}function s(o,l=Pe){const c=[o,l];return a.add(c),a.size===1&&(n=t(r,i)||Pe),o(e),()=>{a.delete(c),a.size===0&&n&&(n(),n=null)}}return{set:r,update:i,subscribe:s}}class Me{constructor(t,n){this.status=t,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${t}`}}toString(){return JSON.stringify(this.body)}}class ze{constructor(t,n){try{new Headers({location:n})}catch{throw new Error(`Invalid redirect location ${JSON.stringify(n)}: this string contains characters that cannot be used in HTTP headers`)}this.status=t,this.location=n}}class Fe extends Error{constructor(t,n,a){super(a),this.status=t,this.text=n}}new URL("sveltekit-internal://");function Kt(e,t){return e==="/"||t==="ignore"?e:t==="never"?e.endsWith("/")?e.slice(0,-1):e:t==="always"&&!e.endsWith("/")?e+"/":e}function Mt(e){return e.split("%25").map(decodeURI).join("%25")}function zt(e){for(const t in e)e[t]=decodeURIComponent(e[t]);return e}function $e({href:e}){return e.split("#")[0]}function C(){}function Ft(...e){let t=5381;for(const n of e)if(typeof n=="string"){let a=n.length;for(;a;)t=t*33^n.charCodeAt(--a)}else if(ArrayBuffer.isView(n)){const a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let r=a.length;for(;r;)t=t*33^a[--r]}else throw new TypeError("value must be a string or TypedArray");return(t>>>0).toString(36)}new TextEncoder;function Gt(e){const t=atob(e),n=new Uint8Array(t.length);for(let a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n}const Ht=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:(t==null?void 0:t.method)||"GET")!=="GET"&&X.delete(Ge(e)),Ht(e,t));const X=new Map;function Wt(e,t){const n=Ge(e,t),a=document.querySelector(n);if(a!=null&&a.textContent){a.remove();let{body:r,...i}=JSON.parse(a.textContent);const s=a.getAttribute("data-ttl");return s&&X.set(n,{body:r,init:i,ttl:1e3*Number(s)}),a.getAttribute("data-b64")!==null&&(r=Gt(r)),Promise.resolve(new Response(r,i))}return window.fetch(e,t)}function Jt(e,t,n){if(X.size>0){const a=Ge(e,n),r=X.get(a);if(r){if(performance.now()<r.ttl&&["default","force-cache","only-if-cached",void 0].includes(n==null?void 0:n.cache))return new Response(r.body,r.init);X.delete(a)}}return window.fetch(t,n)}function Ge(e,t){let a=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t!=null&&t.headers||t!=null&&t.body){const r=[];t.headers&&r.push([...new Headers(t.headers)].join(",")),t.body&&(typeof t.body=="string"||ArrayBuffer.isView(t.body))&&r.push(t.body),a+=`[data-hash="${Ft(...r)}"]`}return a}const Yt=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function Xt(e){const t=[];return{pattern:e==="/"?/^\/$/:new RegExp(`^${Zt(e).map(a=>{const r=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(a);if(r)return t.push({name:r[1],matcher:r[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const i=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(a);if(i)return t.push({name:i[1],matcher:i[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!a)return;const s=a.split(/\[(.+?)\](?!\])/);return"/"+s.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return Ce(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return Ce(String.fromCharCode(...l.slice(2).split("-").map(m=>parseInt(m,16))));const d=Yt.exec(l),[,u,w,p,f]=d;return t.push({name:p,matcher:f,optional:!!u,rest:!!w,chained:w?c===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return Ce(l)}).join("")}).join("")}/?$`),params:t}}function Qt(e){return e!==""&&!/^\([^)]+\)$/.test(e)}function Zt(e){return e.slice(1).split("/").filter(Qt)}function en(e,t,n){const a={},r=e.slice(1),i=r.filter(o=>o!==void 0);let s=0;for(let o=0;o<t.length;o+=1){const l=t[o];let c=r[o-s];if(l.chained&&l.rest&&s&&(c=r.slice(o-s,o+1).filter(d=>d).join("/"),s=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){a[l.name]=c;const d=t[o+1],u=r[o+1];d&&!d.rest&&d.optional&&u&&l.chained&&(s=0),!d&&!u&&Object.keys(a).length===i.length&&(s=0);continue}if(l.optional&&l.chained){s++;continue}return}if(!s)return a}function Ce(e){return e.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function tn({nodes:e,server_loads:t,dictionary:n,matchers:a}){const r=new Set(t);return Object.entries(n).map(([o,[l,c,d]])=>{const{pattern:u,params:w}=Xt(o),p={id:o,exec:f=>{const m=u.exec(f);if(m)return en(m,w,a)},errors:[1,...d||[]].map(f=>e[f]),layouts:[0,...c||[]].map(s),leaf:i(l)};return p.errors.length=p.layouts.length=Math.max(p.errors.length,p.layouts.length),p});function i(o){const l=o<0;return l&&(o=~o),[l,e[o]]}function s(o){return o===void 0?o:[r.has(o),e[o]]}}function wt(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function ot(e,t,n=JSON.stringify){const a=n(t);try{sessionStorage[e]=a}catch{}}var ht;const U=((ht=globalThis.__sveltekit_95np12)==null?void 0:ht.base)??"";var pt;const nn=((pt=globalThis.__sveltekit_95np12)==null?void 0:pt.assets)??U??"",rn="1778109983909",vt="sveltekit:snapshot",yt="sveltekit:scroll",bt="sveltekit:states",an="sveltekit:pageurl",F="sveltekit:history",Z="sveltekit:navigation",D={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Ue=location.origin;function He(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){const n=document.getElementsByTagName("base");t=n.length?n[0].href:document.URL}return new URL(e,t)}function B(){return{x:pageXOffset,y:pageYOffset}}function z(e,t){return e.getAttribute(`data-sveltekit-${t}`)}const st={...D,"":D.hover};function kt(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function St(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=kt(e)}}function qe(e,t,n){let a;try{if(a=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&a.hash.match(/^#[^/]/)){const o=location.hash.split("#")[1]||"/";a.hash=`#${o}${a.hash}`}}catch{}const r=e instanceof SVGAElement?e.target.baseVal:e.target,i=!a||!!r||Ae(a,t,n)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),s=(a==null?void 0:a.origin)===Ue&&e.hasAttribute("download");return{url:a,external:i,target:r,download:s}}function ve(e){let t=null,n=null,a=null,r=null,i=null,s=null,o=e;for(;o&&o!==document.documentElement;)a===null&&(a=z(o,"preload-code")),r===null&&(r=z(o,"preload-data")),t===null&&(t=z(o,"keepfocus")),n===null&&(n=z(o,"noscroll")),i===null&&(i=z(o,"reload")),s===null&&(s=z(o,"replacestate")),o=kt(o);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:st[a??"off"],preload_data:st[r??"off"],keepfocus:l(t),noscroll:l(n),reload:l(i),replace_state:l(s)}}function it(e){const t=Ke(e);let n=!0;function a(){n=!0,t.update(s=>s)}function r(s){n=!1,t.set(s)}function i(s){let o;return t.subscribe(l=>{(o===void 0||n&&l!==o)&&s(o=l)})}return{notify:a,set:r,subscribe:i}}const Et={v:C};function on(){const{set:e,subscribe:t}=Ke(!1);let n;async function a(){clearTimeout(n);try{const r=await fetch(`${nn}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!r.ok)return!1;const s=(await r.json()).version!==rn;return s&&(e(!0),Et.v(),clearTimeout(n)),s}catch{return!1}}return{subscribe:t,check:a}}function Ae(e,t,n){return e.origin!==Ue||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Pn(e){}const Rt=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...Rt];const sn=new Set([...Rt]);[...sn];function ln(e){return e.filter(t=>t!=null)}function me(e,t){return e+"/"+t}function We(e){return e instanceof Me||e instanceof Fe?e.status:500}function cn(e){return e instanceof Fe?e.text:"Internal Error"}let R,ee,je;const fn=at.toString().includes("$$")||/function \w+\(\) \{\}/.test(at.toString()),lt="a:";var oe,se,ie,le,ce,fe,ue,de,gt,he,mt,pe,_t;fn?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(lt)},ee={current:null},je={current:!1}):(R=new(gt=class{constructor(){A(this,oe,T({}));A(this,se,T(null));A(this,ie,T(null));A(this,le,T({}));A(this,ce,T({id:null}));A(this,fe,T({}));A(this,ue,T(-1));A(this,de,T(new URL(lt)))}get data(){return I(y(this,oe))}set data(t){O(y(this,oe),t)}get form(){return I(y(this,se))}set form(t){O(y(this,se),t)}get error(){return I(y(this,ie))}set error(t){O(y(this,ie),t)}get params(){return I(y(this,le))}set params(t){O(y(this,le),t)}get route(){return I(y(this,ce))}set route(t){O(y(this,ce),t)}get state(){return I(y(this,fe))}set state(t){O(y(this,fe),t)}get status(){return I(y(this,ue))}set status(t){O(y(this,ue),t)}get url(){return I(y(this,de))}set url(t){O(y(this,de),t)}},oe=new WeakMap,se=new WeakMap,ie=new WeakMap,le=new WeakMap,ce=new WeakMap,fe=new WeakMap,ue=new WeakMap,de=new WeakMap,gt),ee=new(mt=class{constructor(){A(this,he,T(null))}get current(){return I(y(this,he))}set current(t){O(y(this,he),t)}},he=new WeakMap,mt),je=new(_t=class{constructor(){A(this,pe,T(!1))}get current(){return I(y(this,pe))}set current(t){O(y(this,pe),t)}},pe=new WeakMap,_t),Et.v=()=>je.current=!0);function un(e){Object.assign(R,e)}const dn=new Set(["icon","shortcut icon","apple-touch-icon"]);let J=null;const N=wt(yt)??{},te=wt(vt)??{},j={url:it({}),page:it({}),navigating:Ke(null),updated:on()};function Je(e){N[e]=B()}function hn(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;te[n];)delete te[n],n+=1}function ne(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(C)}async function xt(){if("serviceWorker"in navigator){const e=await navigator.serviceWorker.getRegistration(U||"/");e&&await e.update()}}let Ye,De,ye,P,Ve,S;const be=[],ke=[];let v=null;function Se(){var e;(e=v==null?void 0:v.fork)==null||e.then(t=>t==null?void 0:t.discard()),v=null}const _e=new Map,Lt=new Set,pn=new Set,Q=new Set;let _={branch:[],error:null,url:null},Ut=!1,Ee=!1,ct=!0,re=!1,Y=!1,At=!1,Xe=!1,Tt,k,L,V;const Re=new Set,ft=new Map,ut=new Map;async function Nn(e,t,n){var i,s,o,l;globalThis.__sveltekit_95np12&&(globalThis.__sveltekit_95np12.query,globalThis.__sveltekit_95np12.prerender),document.URL!==location.href&&(location.href=location.href),S=e,await((s=(i=e.hooks).init)==null?void 0:s.call(i)),Ye=tn(e),P=document.documentElement,Ve=t,De=e.nodes[0],ye=e.nodes[1],De(),ye(),k=(o=history.state)==null?void 0:o[F],L=(l=history.state)==null?void 0:l[Z],k||(k=L=Date.now(),history.replaceState({...history.state,[F]:k,[Z]:L},""));const a=N[k];function r(){a&&(history.scrollRestoration="manual",scrollTo(a.x,a.y))}n?(r(),await Ln(Ve,n)):(await G({type:"enter",url:He(S.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),r()),xn()}function gn(){be.length=0,Xe=!1}function It(e){ke.some(t=>t==null?void 0:t.snapshot)&&(te[e]=ke.map(t=>{var n;return(n=t==null?void 0:t.snapshot)==null?void 0:n.capture()}))}function Ot(e){var t;(t=te[e])==null||t.forEach((n,a)=>{var r,i;(i=(r=ke[a])==null?void 0:r.snapshot)==null||i.restore(n)})}function dt(){Je(k),ot(yt,N),It(L),ot(vt,te)}async function Pt(e,t,n,a){let r,i;t.invalidateAll&&Se(),await G({type:"goto",url:He(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:a,accept:()=>{if(t.invalidateAll){Xe=!0,r=new Set;for(const[s,o]of ft)for(const l of o.keys())r.add(me(s,l));i=new Set;for(const[s,o]of ut)for(const l of o.keys())i.add(me(s,l))}t.invalidate&&t.invalidate.forEach(Rn)}}),t.invalidateAll&&we().then(we).then(()=>{for(const[s,o]of ft)for(const[l,{resource:c}]of o)r!=null&&r.has(me(s,l))&&c.refresh();for(const[s,o]of ut)for(const[l,{resource:c}]of o)i!=null&&i.has(me(s,l))&&c.reconnect()})}async function mn(e){if(e.id!==(v==null?void 0:v.id)){Se();const t={};Re.add(t),v={id:e.id,token:t,promise:Ct({...e,preload:t}).then(n=>(Re.delete(t),n.type==="loaded"&&n.state.error&&Se(),n)),fork:null}}return v.promise}async function Ne(e){var n;const t=(n=await Te(e,!1))==null?void 0:n.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(a=>a[1]()))}async function $t(e,t,n){var i;const a={params:_.params,route:{id:((i=_.route)==null?void 0:i.id)??null},url:new URL(location.href)};_={...e.state,nav:a};const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,e.props.page),Tt=new S.root({target:t,props:{...e.props,stores:j,components:ke},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),Ot(L),n){const s={from:null,to:{...a,scroll:N[k]??B()},willUnload:!1,type:"enter",complete:Promise.resolve()};Q.forEach(o=>o(s))}Ee=!0}async function xe({url:e,params:t,branch:n,errors:a,status:r,error:i,route:s,form:o}){let l="never";if(U&&(e.pathname===U||e.pathname===U+"/"))l="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(l=f.slash);e.pathname=Kt(e.pathname,l),e.search=e.search;const c={type:"loaded",state:{url:e,params:t,branch:n,error:i,route:s},props:{constructors:ln(n).map(f=>f.node.component),page:nt(R)}};o!==void 0&&(c.props.form=o);let d={},u=!R,w=0;for(let f=0;f<Math.max(n.length,_.branch.length);f+=1){const m=n[f],h=_.branch[f];(m==null?void 0:m.data)!==(h==null?void 0:h.data)&&(u=!0),m&&(d={...d,...m.data},u&&(c.props[`data_${w}`]=d),w+=1)}return(!_.url||e.href!==_.url.href||_.error!==i||o!==void 0&&o!==R.form||u)&&(c.props.page={error:i,params:t,route:{id:(s==null?void 0:s.id)??null},state:{},status:r,url:new URL(e),form:o??null,data:u?d:R.data}),c}async function Qe({loader:e,parent:t,url:n,params:a,route:r,server_data_node:i}){var c,d;let s=null;const o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();return{node:l,loader:e,server:i,universal:(c=l.universal)!=null&&c.load?{type:"data",data:s,uses:o}:null,data:s??(i==null?void 0:i.data)??null,slash:((d=l.universal)==null?void 0:d.trailingSlash)??(i==null?void 0:i.slash)}}function _n(e,t,n){let a=e instanceof Request?e.url:e;const r=new URL(a,n);r.origin===n.origin&&(a=r.href.slice(n.origin.length));const i=Ee?Jt(a,r.href,t):Wt(a,t);return{resolved:r,promise:i}}function wn(e,t,n,a,r,i){if(Xe)return!0;if(!r)return!1;if(r.parent&&e||r.route&&t||r.url&&n)return!0;for(const s of r.search_params)if(a.has(s))return!0;for(const s of r.params)if(i[s]!==_.params[s])return!0;for(const s of r.dependencies)if(be.some(o=>o(new URL(s))))return!0;return!1}function Ze(e,t){return(e==null?void 0:e.type)==="data"?e:(e==null?void 0:e.type)==="skip"?t??null:null}function vn(e,t){if(!e)return new Set(t.searchParams.keys());const n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(const a of n){const r=e.searchParams.getAll(a),i=t.searchParams.getAll(a);r.every(s=>i.includes(s))&&i.every(s=>r.includes(s))&&n.delete(a)}return n}function yn({error:e,url:t,route:n,params:a}){return{type:"loaded",state:{error:e,url:t,route:n,params:a,branch:[]},props:{page:nt(R),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:a,route:r,preload:i}){if((v==null?void 0:v.id)===e)return Re.delete(v.token),v.promise;const{errors:s,layouts:o,leaf:l}=r,c=[...o,l];s.forEach(h=>h==null?void 0:h().catch(C)),c.forEach(h=>h==null?void 0:h[1]().catch(C));const d=_.url?e!==Le(_.url):!1,u=_.route?r.id!==_.route.id:!1,w=vn(_.url,n);let p=!1;const f=c.map(async(h,g)=>{var $;if(!h)return;const b=_.branch[g];return h[1]===(b==null?void 0:b.loader)&&!wn(p,u,d,w,($=b.universal)==null?void 0:$.uses,a)?b:(p=!0,Qe({loader:h[1],url:n,params:a,route:r,parent:async()=>{var ge;const q={};for(let K=0;K<g;K+=1)Object.assign(q,(ge=await f[K])==null?void 0:ge.data);return q},server_data_node:Ze(h[0]?{type:"skip"}:null,h[0]?b==null?void 0:b.server:void 0)}))});for(const h of f)h.catch(C);const m=[];for(let h=0;h<c.length;h+=1)if(c[h])try{m.push(await f[h])}catch(g){if(g instanceof ze)return{type:"redirect",location:g.location};if(Re.has(i))return yn({error:await ae(g,{params:a,url:n,route:{id:r.id}}),url:n,params:a,route:r});let b=We(g),x;if(g instanceof Me)x=g.body;else{if(await j.updated.check())return await xt(),await ne(n);x=await ae(g,{params:a,url:n,route:{id:r.id}})}const $=await bn(h,m,s);return $?xe({url:n,params:a,branch:m.slice(0,$.idx).concat($.node),errors:s,status:b,error:x,route:r}):await Nt(n,{id:r.id},x,b)}else m.push(void 0);return xe({url:n,params:a,branch:m,errors:s,status:200,error:null,route:r,form:t?void 0:null})}async function bn(e,t,n){for(;e--;)if(n[e]){let a=e;for(;!t[a];)a-=1;try{return{idx:a+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function et({status:e,error:t,url:n,route:a}){const r={};let i=null;try{const s=await Qe({loader:De,url:n,params:r,route:a,parent:()=>Promise.resolve({}),server_data_node:Ze(i)}),o={node:await ye(),loader:ye,universal:null,server:null,data:null};return xe({url:n,params:r,branch:[s,o],status:e,error:t,errors:[],route:null})}catch(s){if(s instanceof ze)return Pt(new URL(s.location,location.href),{},0);throw s}}async function kn(e){const t=e.href;if(_e.has(t))return _e.get(t);let n;try{const a=(async()=>{let r=await S.hooks.reroute({url:new URL(e),fetch:async(i,s)=>_n(i,s,e).promise})??e;if(typeof r=="string"){const i=new URL(e);S.hash?i.hash=r:i.pathname=r,r=i}return r})();_e.set(t,a),n=await a}catch{_e.delete(t);return}return n}async function Te(e,t){if(e&&!Ae(e,U,S.hash)){const n=await kn(e);if(!n)return;const a=Sn(n);for(const r of Ye){const i=r.exec(a);if(i)return{id:Le(e),invalidating:t,route:r,params:zt(i),url:e}}}}function Sn(e){return Mt(S.hash?e.hash.replace(/^#/,"").replace(/[?#].+/,""):e.pathname.slice(U.length))||"/"}function Le(e){return(S.hash?e.hash.replace(/^#/,""):e.pathname)+e.search}function jt({url:e,type:t,intent:n,delta:a,event:r,scroll:i}){let s=!1;const o=tt(_,n,e,t,i??null);a!==void 0&&(o.navigation.delta=a),r!==void 0&&(o.navigation.event=r);const l={...o.navigation,cancel:()=>{s=!0,o.reject(new Error("navigation cancelled"))}};return re||Lt.forEach(c=>c(l)),s?null:o}async function G({type:e,url:t,popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s={},redirect_count:o=0,nav_token:l={},accept:c=C,block:d=C,event:u}){var K;const w=V;V=l;const p=await Te(t,!1),f=e==="enter"?tt(_,p,t,e):jt({url:t,type:e,delta:n==null?void 0:n.delta,intent:p,scroll:n==null?void 0:n.scroll,event:u});if(!f){d(),V===l&&(V=w);return}const m=k,h=L;c(),re=!0,Ee&&f.navigation.type!=="enter"&&j.navigating.set(ee.current=f.navigation);let g=p&&await Ct(p);if(!g){if(Ae(t,U,S.hash))return await ne(t,i);g=await Nt(t,{id:null},await ae(new Fe(404,"Not Found",`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,i)}if(t=(p==null?void 0:p.url)||t,V!==l)return f.reject(new Error("navigation aborted")),!1;if(g.type==="redirect"){if(o<20){await G({type:e,url:new URL(g.location,t),popped:n,keepfocus:a,noscroll:r,replace_state:i,state:s,redirect_count:o+1,nav_token:l}),f.fulfil(void 0);return}g=await et({status:500,error:await ae(new Error("Redirect loop"),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}})}else g.props.page.status>=400&&await j.updated.check()&&(await xt(),await ne(t,i));if(gn(),Je(m),It(h),g.props.page.url.pathname!==t.pathname&&(t.pathname=g.props.page.url.pathname),s=n?n.state:s,!n){const E=i?0:1,H={[F]:k+=E,[Z]:L+=E,[bt]:s};(i?history.replaceState:history.pushState).call(history,H,"",t),i||hn(k,L)}const b=p&&(v==null?void 0:v.id)===p.id?v.fork:null;v!=null&&v.fork&&!b&&Se(),v=null,g.props.page.state=s;let x;if(Ee){const E=(await Promise.all(Array.from(pn,W=>W(f.navigation)))).filter(W=>typeof W=="function");if(E.length>0){let W=function(){E.forEach(Oe=>{Q.delete(Oe)})};E.push(W),E.forEach(Oe=>{Q.add(Oe)})}const H=f.navigation.to;_={...g.state,nav:{params:H.params,route:H.route,url:H.url}},g.props.page&&(g.props.page.url=t);const Ie=b&&await b;Ie?x=Ie.commit():(J=null,Tt.$set(g.props),J&&Object.assign(g.props.page,J),un(g.props.page),x=(K=Bt)==null?void 0:K()),At=!0}else await $t(g,Ve,!1);const{activeElement:$}=document;await x,await we(),await we();let q=null;if(ct){const E=n?n.scroll:r?B():null;E?scrollTo(E.x,E.y):(q=t.hash&&document.getElementById(qt(t)))?q.scrollIntoView():scrollTo(0,0)}const ge=document.activeElement!==$&&document.activeElement!==document.body;!a&&!ge&&An(t,!q),ct=!0,g.props.page&&(J&&Object.assign(g.props.page,J),Object.assign(R,g.props.page)),re=!1,e==="popstate"&&Ot(L),f.fulfil(void 0),f.navigation.to&&(f.navigation.to.scroll=B()),Q.forEach(E=>E(f.navigation)),j.navigating.set(ee.current=null)}async function Nt(e,t,n,a,r){return e.origin===Ue&&e.pathname===location.pathname&&!Ut?await et({status:a,error:n,url:e,route:t}):await ne(e,r)}function En(){let e,t={element:void 0,href:void 0},n;P.addEventListener("mousemove",o=>{const l=o.target;clearTimeout(e),e=setTimeout(()=>{i(l,D.hover)},20)});function a(o){o.defaultPrevented||i(o.composedPath()[0],D.tap)}P.addEventListener("mousedown",a),P.addEventListener("touchstart",a,{passive:!0});const r=new IntersectionObserver(o=>{for(const l of o)l.isIntersecting&&(Ne(new URL(l.target.href)),r.unobserve(l.target))},{threshold:0});async function i(o,l){const c=St(o,P),d=c===t.element&&(c==null?void 0:c.href)===t.href&&l>=n;if(!c||d)return;const{url:u,external:w,download:p}=qe(c,U,S.hash);if(w||p)return;const f=ve(c),m=u&&Le(_.url)===Le(u);if(!(f.reload||m))if(l<=f.preload_data){t={element:c,href:c.href},n=D.tap;const h=await Te(u,!1);if(!h)return;mn(h)}else l<=f.preload_code&&(t={element:c,href:c.href},n=l,Ne(u))}function s(){r.disconnect();for(const o of P.querySelectorAll("a")){const{url:l,external:c,download:d}=qe(o,U,S.hash);if(c||d)continue;const u=ve(o);u.reload||(u.preload_code===D.viewport&&r.observe(o),u.preload_code===D.eager&&Ne(l))}}Q.add(s),s()}function ae(e,t){if(e instanceof Me)return e.body;const n=We(e),a=cn(e);return S.hooks.handleError({error:e,event:t,status:n,message:a})??{message:a}}function qn(e,t={}){return e=new URL(He(e)),e.origin!==Ue?Promise.reject(new Error("goto: invalid URL")):Pt(e,t,0)}function Rn(e){if(typeof e=="function")be.push(e);else{const{href:t}=new URL(e,location.href);be.push(n=>n.href===t)}}function xn(){var t;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let a=!1;if(dt(),!re){const r=tt(_,void 0,null,"leave"),i={...r.navigation,cancel:()=>{a=!0,r.reject(new Error("navigation cancelled"))}};Lt.forEach(s=>s(i))}a?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&dt()}),(t=navigator.connection)!=null&&t.saveData||En(),P.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const a=St(n.composedPath()[0],P);if(!a)return;const{url:r,external:i,target:s,download:o}=qe(a,U,S.hash);if(!r)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const l=ve(a);if(!(a instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol==="https:"||r.protocol==="http:")||o)return;const[d,u]=(S.hash?r.hash.replace(/^#/,""):r.href).split("#"),w=d===$e(location);if(i||l.reload&&(!w||!u)){jt({url:r,type:"link",event:n})?re=!0:n.preventDefault();return}if(u!==void 0&&w){const[,p]=_.url.href.split("#");if(p===u){if(n.preventDefault(),u===""||u==="top"&&a.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const f=a.ownerDocument.getElementById(decodeURIComponent(u));f&&(f.scrollIntoView(),f.focus())}return}if(Y=!0,Je(k),e(r),!l.replace_state)return;Y=!1}n.preventDefault(),await new Promise(p=>{requestAnimationFrame(()=>{setTimeout(p,0)}),setTimeout(p,100)}),await G({type:"link",url:r,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??r.href===location.href,event:n})}),P.addEventListener("submit",n=>{if(n.defaultPrevented)return;const a=HTMLFormElement.prototype.cloneNode.call(n.target),r=n.submitter;if(((r==null?void 0:r.formTarget)||a.target)==="_blank"||((r==null?void 0:r.formMethod)||a.method)!=="get")return;const o=new URL((r==null?void 0:r.hasAttribute("formaction"))&&(r==null?void 0:r.formAction)||a.action);if(Ae(o,U,!1))return;const l=n.target,c=ve(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,r);o.search=new URLSearchParams(d).toString(),G({type:"form",url:o,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??o.href===location.href,event:n})}),addEventListener("popstate",async n=>{var a;if(!Be){if((a=n.state)!=null&&a[F]){const r=n.state[F];if(V={},r===k)return;const i=N[r],s=n.state[bt]??{},o=new URL(n.state[an]??location.href),l=n.state[Z],c=_.url?$e(location)===$e(_.url):!1;if(l===L&&(At||c)){s!==R.state&&(R.state=s),e(o),N[k]=B(),i&&scrollTo(i.x,i.y),k=r;return}const u=r-k;await G({type:"popstate",url:o,popped:{state:s,scroll:i,delta:u},accept:()=>{k=r,L=l},block:()=>{history.go(-u)},nav_token:V,event:n})}else if(!Y){const r=new URL(location.href);e(r),S.hash&&location.reload()}}}),addEventListener("hashchange",()=>{Y&&(Y=!1,history.replaceState({...history.state,[F]:++k,[Z]:L},"",location.href))});for(const n of document.querySelectorAll("link"))dn.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&j.navigating.set(ee.current=null)});function e(n){_.url=R.url=n,j.page.set(nt(R)),j.page.notify()}}async function Ln(e,{status:t=200,error:n,node_ids:a,params:r,route:i,server_route:s,data:o,form:l}){Ut=!0;const c=new URL(location.href);let d;({params:r={},route:i={id:null}}=await Te(c,!1)||{}),d=Ye.find(({id:p})=>p===i.id);let u,w=!0;try{const p=a.map(async(m,h)=>{const g=o[h];return g!=null&&g.uses&&(g.uses=Un(g.uses)),Qe({loader:S.nodes[m],url:c,params:r,route:i,parent:async()=>{const b={};for(let x=0;x<h;x+=1)Object.assign(b,(await p[x]).data);return b},server_data_node:Ze(g)})}),f=await Promise.all(p);if(d){const m=d.layouts;for(let h=0;h<m.length;h++)m[h]||f.splice(h,0,void 0)}u=await xe({url:c,params:r,branch:f,status:t,error:n,errors:d==null?void 0:d.errors,form:l,route:d??null})}catch(p){if(p instanceof ze){await ne(new URL(p.location,location.href));return}u=await et({status:We(p),error:await ae(p,{url:c,params:r,route:i}),url:c,route:i}),e.textContent="",w=!1}finally{}u.props.page&&(u.props.page.state={}),await $t(u,e,w)}function Un(e){return{dependencies:new Set((e==null?void 0:e.dependencies)??[]),params:new Set((e==null?void 0:e.params)??[]),parent:!!(e!=null&&e.parent),route:!!(e!=null&&e.route),url:!!(e!=null&&e.url),search_params:new Set((e==null?void 0:e.search_params)??[])}}let Be=!1;function An(e,t=!0){const n=document.querySelector("[autofocus]");if(n)n.focus();else{const a=qt(e);if(a&&document.getElementById(a)){const{x:i,y:s}=B();setTimeout(()=>{const o=history.state;Be=!0,location.replace(new URL(`#${a}`,location.href)),history.replaceState(o,"",e),t&&scrollTo(i,s),Be=!1})}else{const i=document.body,s=i.getAttribute("tabindex");i.tabIndex=-1,i.focus({preventScroll:!0,focusVisible:!1}),s!==null?i.setAttribute("tabindex",s):i.removeAttribute("tabindex")}const r=getSelection();if(r&&r.type!=="None"){const i=[];for(let s=0;s<r.rangeCount;s+=1)i.push(r.getRangeAt(s));setTimeout(()=>{if(r.rangeCount===i.length){for(let s=0;s<r.rangeCount;s+=1){const o=i[s],l=r.getRangeAt(s);if(o.commonAncestorContainer!==l.commonAncestorContainer||o.startContainer!==l.startContainer||o.endContainer!==l.endContainer||o.startOffset!==l.startOffset||o.endOffset!==l.endOffset)return}r.removeAllRanges()}})}}}function tt(e,t,n,a,r=null){var c,d;let i,s;const o=new Promise((u,w)=>{i=u,s=w});return o.catch(C),{navigation:{from:{params:e.params,route:{id:((c=e.route)==null?void 0:c.id)??null},url:e.url,scroll:B()},to:n&&{params:(t==null?void 0:t.params)??null,route:{id:((d=t==null?void 0:t.route)==null?void 0:d.id)??null},url:n,scroll:r},willUnload:!t,type:a,complete:o},fulfil:i,reject:s}}function nt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){const t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function qt(e){let t;if(S.hash){const[,,n]=e.hash.split("#",3);t=n??""}else t=e.hash.slice(1);return decodeURIComponent(t)}export{Nn as a,qn as g,Pn as l,R as p,j as s};
|
|
@@ -1 +1 @@
|
|
| 1 |
-
import{s as e,p as r}from"./
|
|
|
|
| 1 |
+
import{s as e,p as r}from"./33K0dtcD.js";const t={get error(){return r.error},get params(){return r.params},get status(){return r.status},get url(){return r.url}};e.updated.check;const a=t;export{a as p};
|
|
@@ -1,2 +1,2 @@
|
|
| 1 |
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.
|
| 2 |
-
var S=e=>{throw TypeError(e)};var M=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(M(e,t,"read from private field"),r?r.call(e):t.get(e)),p=(e,t,r)=>t.has(e)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),I=(e,t,r,n)=>(M(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as L,_ as b}from"../chunks/CXQd8Y6F.js";import{h as N,n as W,d as X,a3 as Z,q as $,v as tt,i as et,e as B,an as rt,j as at,a5 as A,ah as st,o as l,ao as nt,ap as ot,L as it,p as ct,aq as ut,am as dt,ai as mt,ar as _t,f as x,s as lt,a as ft,a4 as j,c as ht,r as vt,t as gt,al as k}from"../chunks/BTUA7_xE.js";import{h as yt,m as Et,u as bt,a as R,c as w,f as F,t as Rt,s as Pt}from"../chunks/CWw6qgC_.js";import{B as Ot,i as D}from"../chunks/Bd-v_9Ud.js";import{p as q}from"../chunks/CW0zSL4D.js";function V(e,t,r){var n;N&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(N){var a=$(n),s=a===rt,_=i!==null;if(s!==_){var P=tt();et(P),o.anchor=P,B(!1),o.ensure(i,i&&(y=>r(y,i))),B(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends xt{constructor(t){super({component:e,...t})}}}var f,d;class xt{constructor(t){p(this,f);p(this,d);var i;var r=new Map,n=(a,s)=>{var _=it(s,!1,!1);return r.set(a,_),_};const o=new Proxy({...t.props||{},$$events:{}},{get(a,s){return l(r.get(s)??n(s,Reflect.get(a,s)))},has(a,s){return s===st?!0:(l(r.get(s)??n(s,Reflect.get(a,s))),Reflect.has(a,s))},set(a,s,_){return A(r.get(s)??n(s,_),_),Reflect.set(a,s,_)}});I(this,d,(t.hydrate?yt:Et)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((i=t==null?void 0:t.props)!=null&&i.$$host)||t.sync===!1)&&nt(),I(this,f,o.$$events);for(const a of Object.keys(c(this,d)))a==="$set"||a==="$destroy"||a==="$on"||ot(this,a,{get(){return c(this,d)[a]},set(s){c(this,d)[a]=s},enumerable:!0});c(this,d).$set=a=>{Object.assign(o,a)},c(this,d).$destroy=()=>{bt(c(this,d))}}$set(t){c(this,d).$set(t)}$on(t,r){c(this,f)[t]=c(this,f)[t]||[];const n=(...o)=>r.call(this,...o);return c(this,f)[t].push(n),()=>{c(this,f)[t]=c(this,f)[t].filter(o=>o!==n)}}$destroy(){c(this,d).$destroy()}}f=new WeakMap,d=new WeakMap;const St={};var At=F('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),pt=F("<!> <!>",1);function It(e,t){ct(t,!0);let r=q(t,"components",23,()=>[]),n=q(t,"data_0",3,null),o=q(t,"data_1",3,null);ut(()=>t.stores.page.set(t.page)),dt(()=>{t.stores,t.page,t.constructors,r(),t.form,n(),o(),t.stores.page.notify()});let i=j(!1),a=j(!1),s=j(null);mt(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(A(a,!0),_t().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(i,!0),u});const _=k(()=>t.constructors[1]);var P=pt(),y=x(P);{var G=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(m,jt)=>{var C=w(),K=x(C);V(K,()=>l(_),(Q,U)=>{L(U(Q,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),T=>r()[1]=T,()=>{var T;return(T=r())==null?void 0:T[1]})}),R(m,C)},$$slots:{default:!0}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)},H=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)};D(y,u=>{t.constructors[1]?u(G):u(H,-1)})}var z=lt(y,2);{var J=u=>{var h=At(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};D(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};D(z,u=>{l(i)&&u(J)})}R(e,P),ft()}const Mt=Tt(It),Nt=[()=>b(()=>import("../nodes/0.
|
|
|
|
| 1 |
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.xQyF6Vnl.js","../chunks/CWw6qgC_.js","../chunks/BTUA7_xE.js","../chunks/DxQlA7U2.js","../chunks/Bd-v_9Ud.js","../chunks/CW0zSL4D.js","../chunks/CbyeixEA.js","../chunks/33K0dtcD.js","../chunks/DCD6_LXk.js","../chunks/B0XoTt7U.js","../assets/RipMark.ClxF_PAC.css","../chunks/DixtWtwq.js","../assets/0.DiQNUxm-.css","../nodes/1.BfclScXS.js","../nodes/2.ecCZIVph.js","../chunks/cDW0xQNP.js","../chunks/25_y8TFd.js","../chunks/CXQd8Y6F.js","../chunks/D907np-5.js","../assets/2.BD53GLFY.css","../nodes/3.3dbioiXY.js","../chunks/BatqQaKj.js","../assets/Briefing.Dmn9LgiV.css","../assets/3.BZfqQRM0.css","../nodes/4.qvdqEXFv.js","../chunks/BZuv-XBZ.js","../assets/stoneRegistry.bHiraU77.css","../assets/4.D4-aMRnd.css","../nodes/5.BFrkSt3u.js"])))=>i.map(i=>d[i]);
|
| 2 |
+
var S=e=>{throw TypeError(e)};var M=(e,t,r)=>t.has(e)||S("Cannot "+r);var c=(e,t,r)=>(M(e,t,"read from private field"),r?r.call(e):t.get(e)),p=(e,t,r)=>t.has(e)?S("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),I=(e,t,r,n)=>(M(e,t,"write to private field"),n?n.call(e,r):t.set(e,r),r);import{b as L,_ as b}from"../chunks/CXQd8Y6F.js";import{h as N,n as W,d as X,a3 as Z,q as $,v as tt,i as et,e as B,an as rt,j as at,a5 as A,ah as st,o as l,ao as nt,ap as ot,L as it,p as ct,aq as ut,am as dt,ai as mt,ar as _t,f as x,s as lt,a as ft,a4 as j,c as ht,r as vt,t as gt,al as k}from"../chunks/BTUA7_xE.js";import{h as yt,m as Et,u as bt,a as R,c as w,f as F,t as Rt,s as Pt}from"../chunks/CWw6qgC_.js";import{B as Ot,i as D}from"../chunks/Bd-v_9Ud.js";import{p as q}from"../chunks/CW0zSL4D.js";function V(e,t,r){var n;N&&(n=at,W());var o=new Ot(e);X(()=>{var i=t()??null;if(N){var a=$(n),s=a===rt,_=i!==null;if(s!==_){var P=tt();et(P),o.anchor=P,B(!1),o.ensure(i,i&&(y=>r(y,i))),B(!0);return}}o.ensure(i,i&&(y=>r(y,i)))},Z)}function Tt(e){return class extends xt{constructor(t){super({component:e,...t})}}}var f,d;class xt{constructor(t){p(this,f);p(this,d);var i;var r=new Map,n=(a,s)=>{var _=it(s,!1,!1);return r.set(a,_),_};const o=new Proxy({...t.props||{},$$events:{}},{get(a,s){return l(r.get(s)??n(s,Reflect.get(a,s)))},has(a,s){return s===st?!0:(l(r.get(s)??n(s,Reflect.get(a,s))),Reflect.has(a,s))},set(a,s,_){return A(r.get(s)??n(s,_),_),Reflect.set(a,s,_)}});I(this,d,(t.hydrate?yt:Et)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((i=t==null?void 0:t.props)!=null&&i.$$host)||t.sync===!1)&&nt(),I(this,f,o.$$events);for(const a of Object.keys(c(this,d)))a==="$set"||a==="$destroy"||a==="$on"||ot(this,a,{get(){return c(this,d)[a]},set(s){c(this,d)[a]=s},enumerable:!0});c(this,d).$set=a=>{Object.assign(o,a)},c(this,d).$destroy=()=>{bt(c(this,d))}}$set(t){c(this,d).$set(t)}$on(t,r){c(this,f)[t]=c(this,f)[t]||[];const n=(...o)=>r.call(this,...o);return c(this,f)[t].push(n),()=>{c(this,f)[t]=c(this,f)[t].filter(o=>o!==n)}}$destroy(){c(this,d).$destroy()}}f=new WeakMap,d=new WeakMap;const St={};var At=F('<div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px"><!></div>'),pt=F("<!> <!>",1);function It(e,t){ct(t,!0);let r=q(t,"components",23,()=>[]),n=q(t,"data_0",3,null),o=q(t,"data_1",3,null);ut(()=>t.stores.page.set(t.page)),dt(()=>{t.stores,t.page,t.constructors,r(),t.form,n(),o(),t.stores.page.notify()});let i=j(!1),a=j(!1),s=j(null);mt(()=>{const u=t.stores.page.subscribe(()=>{l(i)&&(A(a,!0),_t().then(()=>{A(s,document.title||"untitled page",!0)}))});return A(i,!0),u});const _=k(()=>t.constructors[1]);var P=pt(),y=x(P);{var G=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(m,jt)=>{var C=w(),K=x(C);V(K,()=>l(_),(Q,U)=>{L(U(Q,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),T=>r()[1]=T,()=>{var T;return(T=r())==null?void 0:T[1]})}),R(m,C)},$$slots:{default:!0}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)},H=u=>{const h=k(()=>t.constructors[0]);var v=w(),O=x(v);V(O,()=>l(h),(g,E)=>{L(E(g,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),m=>r()[0]=m,()=>{var m;return(m=r())==null?void 0:m[0]})}),R(u,v)};D(y,u=>{t.constructors[1]?u(G):u(H,-1)})}var z=lt(y,2);{var J=u=>{var h=At(),v=ht(h);{var O=g=>{var E=Rt();gt(()=>Pt(E,l(s))),R(g,E)};D(v,g=>{l(a)&&g(O)})}vt(h),R(u,h)};D(z,u=>{l(i)&&u(J)})}R(e,P),ft()}const Mt=Tt(It),Nt=[()=>b(()=>import("../nodes/0.xQyF6Vnl.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]),import.meta.url),()=>b(()=>import("../nodes/1.BfclScXS.js"),__vite__mapDeps([13,1,2,6,7]),import.meta.url),()=>b(()=>import("../nodes/2.ecCZIVph.js"),__vite__mapDeps([14,1,2,11,15,8,9,5,10,16,7,17,18,19]),import.meta.url),()=>b(()=>import("../nodes/3.3dbioiXY.js"),__vite__mapDeps([20,1,2,4,16,15,6,7,21,5,3,9,22,23]),import.meta.url),()=>b(()=>import("../nodes/4.qvdqEXFv.js"),__vite__mapDeps([24,1,2,4,6,7,21,16,5,3,9,22,25,17,18,26,11,27]),import.meta.url),()=>b(()=>import("../nodes/5.BFrkSt3u.js"),__vite__mapDeps([28,1,2,21,4,16,5,3,9,22,25,17,18,26]),import.meta.url)],Bt=[],Ft={"/":[2],"/print/[queryId]":[3],"/q/sample":[5],"/q/[queryId]":[4]},Y={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},Lt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.decode])),Yt=Object.fromEntries(Object.entries(Y.transport).map(([e,t])=>[e,t.encode])),Gt=!1,Ht=(e,t)=>Lt[e](t);export{Ht as decode,Lt as decoders,Ft as dictionary,Yt as encoders,Gt as hash,Y as hooks,St as matchers,Nt as nodes,Mt as root,Bt as server_loads};
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{l as o,a as r}from"../chunks/33K0dtcD.js";export{o as load_css,r as start};
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{l as o,a as r}from"../chunks/CP2nnpRQ.js";export{o as load_css,r as start};
|
|
|
|
|
|
|
@@ -1,2 +1,2 @@
|
|
| 1 |
-
import{c as E,a as u,s as M,f as v,d as z,e as H}from"../chunks/CWw6qgC_.js";import{p as O,f as R,o as p,a as $,al as f,s as t,c as o,r as i,t as P,aR as L}from"../chunks/BTUA7_xE.js";import{b as r,s as W}from"../chunks/DxQlA7U2.js";import{i as x}from"../chunks/Bd-v_9Ud.js";import{p as B}from"../chunks/CW0zSL4D.js";import{p as D}from"../chunks/
|
| 2 |
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="app-footer-build">All foundation models Apache-2.0 · All data from public-record federal, state, and city sources · No commercial APIs contacted at runtime · Riprap v0.4.6 · build 2026-05-06</p> <p class="app-footer-credits">Dam mark: <a href="https://thenounproject.com/icon/dam-4516918/">"Dam" by Chintuza</a> via the Noun Project, CC-BY 3.0.</p></div></footer>`);function ie(h){var l=oe();u(h,l)}var pe=v('<a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a>',1);function le(h){var l=pe();L(4),u(h,l)}var de=v("<!> <!>",1),ce=v('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function ke(h,l){O(l,!0);let N=f(()=>()=>{const e=D.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),T=f(()=>D.url.pathname.startsWith("/print/")),k=f(()=>D.url.pathname==="/"),g=f(()=>p(T)||p(k));var m=ce(),w=R(m);{var A=e=>{var C=de(),S=R(C);le(S);var s=t(S,2);{let c=f(()=>p(N)());ne(s,{get query(){return p(c)},onResetCold:()=>window.location.href="/"})}u(e,C)};x(w,e=>{p(g)||e(A)})}var _=t(w,2),j=o(_);W(j,()=>l.children),i(_);var a=t(_,2);{var d=e=>{ie(e)};x(a,e=>{p(g)||e(d)})}u(h,m),$()}export{ke as component,xe as universal};
|
|
|
|
| 1 |
+
import{c as E,a as u,s as M,f as v,d as z,e as H}from"../chunks/CWw6qgC_.js";import{p as O,f as R,o as p,a as $,al as f,s as t,c as o,r as i,t as P,aR as L}from"../chunks/BTUA7_xE.js";import{b as r,s as W}from"../chunks/DxQlA7U2.js";import{i as x}from"../chunks/Bd-v_9Ud.js";import{p as B}from"../chunks/CW0zSL4D.js";import{p as D}from"../chunks/CbyeixEA.js";import{R as U}from"../chunks/DCD6_LXk.js";import{s as G}from"../chunks/B0XoTt7U.js";import"../chunks/DixtWtwq.js";const V=!0,J=!0,K="never",xe=Object.freeze(Object.defineProperty({__proto__:null,prerender:V,ssr:J,trailingSlash:K},Symbol.toStringTag,{value:"Module"}));var Q=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-step svelte-1bjixce"> </span>',1),X=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-progress svelte-1bjixce"> </span>',1),Z=v('<span class="status-sep svelte-1bjixce">·</span> <span class="status-err svelte-1bjixce"> </span>',1),ee=v('<span class="status svelte-1bjixce" aria-live="polite" aria-atomic="true"><span class="status-dot svelte-1bjixce" aria-hidden="true"></span> <span class="status-phase svelte-1bjixce"> </span> <!> <!> <!></span>');function ae(h,l){O(l,!0);const N={geocode:"geocoding",nta_resolve:"resolving NTA",sandy_inundation:"Sandy 2012",dep_stormwater:"DEP scenarios",floodnet:"FloodNet sensors",nyc311:"NYC 311 history",noaa_tides:"NOAA tides",nws_alerts:"NWS alerts",nws_obs:"NWS hourly obs",ttm_forecast:"TTM r2 surge (zero-shot)",ttm_311_forecast:"TTM r2 weekly 311",ttm_battery_surge:"TTM Battery (NYC fine-tune)",floodnet_forecast:"FloodNet recurrence forecast",ida_hwm_2021:"Ida 2021 HWMs",prithvi_eo_v2:"Ida 2021 polygons (baked lookup)",prithvi_eo_live:"Prithvi-NYC-Pluvial v2 segmentation",microtopo_lidar:"LiDAR microtopo",mta_entrance_exposure:"MTA entrances",nycha_development_exposure:"NYCHA developments",doe_school_exposure:"DOE schools",doh_hospital_exposure:"NYS DOH hospitals",terramind_synthesis:"TerraMind v1 synthesis",terramind_lulc:"TerraMind LULC",terramind_buildings:"TerraMind Buildings",eo_chip_fetch:"fetching S2/S1/DEM chip",rag_granite_embedding:"RAG retrieval",gliner_extract:"GLiNER typed extraction"};let T=f(()=>r.phase!=="idle"&&r.phase!=="done"),k=f(()=>{switch(r.phase){case"planning":return"planning intent";case"specialists":return"gathering evidence";case"reconciling":return"reconciling";case"streaming":return r.attempt>1?`writing (reroll ${r.attempt-1})`:"writing briefing";case"error":return"error";default:return""}}),g=f(()=>{const a=r.activeStep;return a?N[a]??a:null}),m=f(()=>{if(r.phase!=="specialists"&&r.phase!=="reconciling")return null;const a=r.firedCount,d=r.totalSpecialists;return d?`${a}/${d}`:a>0?`${a}`:null}),w=f(()=>r.phase==="error"?"err":"live");var A=E(),_=R(A);{var j=a=>{var d=ee(),e=t(o(d),2),C=o(e,!0);i(e);var S=t(e,2);{var s=n=>{var b=Q(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,p(g))),u(n,b)};x(S,n=>{p(g)&&n(s)})}var c=t(S,2);{var F=n=>{var b=X(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,p(m))),u(n,b)};x(c,n=>{p(m)&&n(F)})}var Y=t(c,2);{var I=n=>{var b=Z(),y=t(R(b),2),q=o(y,!0);i(y),P(()=>M(q,r.errorMessage)),u(n,b)};x(Y,n=>{r.phase==="error"&&r.errorMessage&&n(I)})}i(d),P(()=>{G(d,"data-kind",p(w)),M(C,p(k))}),u(a,d)};x(_,a=>{p(T)&&a(j)})}u(h,A),$()}var re=v('<button type="button" class="app-header-query" aria-label="Edit query"><span class="app-header-query-icon" aria-hidden="true">⌕</span> <span class="app-header-query-text"> </span> <span class="app-header-query-edit">edit</span></button>'),te=v('<button type="button" class="app-header-link app-header-link-button svelte-f1belb" aria-label="Open curated PDF view of completed briefing in new tab">export PDF</button>'),se=v('<header class="app-header no-print" data-screen-label="App header"><div class="app-header-inner"><div class="app-header-left"><a href="/" class="riprap-wordmark" aria-label="Riprap — home"><!>riprap</a> <span class="app-header-sep">/</span> <span class="app-header-context">flood-exposure briefing</span></div> <div class="app-header-mid"><!></div> <div class="app-header-right"><a class="app-header-link" href="#methodology">methodology</a> <!> <!></div></div></header>');function ne(h,l){O(l,!0);let N=B(l,"query",3,null);function T(){if(typeof window>"u")return;const s=D.params.queryId??(D.url.pathname==="/q/sample"?"sample":"");s&&window.open(`/print/${encodeURIComponent(s)}`,"_blank","noopener")}var k=se(),g=o(k),m=o(g),w=o(m),A=o(w);U(A,{size:20}),L(),i(w),L(4),i(m);var _=t(m,2),j=o(_);{var a=s=>{var c=re(),F=t(o(c),2),Y=o(F,!0);i(F),L(2),i(c),P(()=>M(Y,N())),H("click",c,function(...I){var n;(n=l.onResetCold)==null||n.apply(this,I)}),u(s,c)};x(j,s=>{N()&&s(a)})}i(_);var d=t(_,2),e=t(o(d),2);{var C=s=>{var c=te();H("click",c,T),u(s,c)};x(e,s=>{r.ready&&s(C)})}var S=t(e,2);ae(S,{}),i(d),i(g),i(k),u(h,k),$()}z(["click"]);var oe=v(`<footer class="app-footer no-print"><div class="app-footer-inner"><p class="app-footer-guard"><strong>Riprap does not predict damage.</strong> This tool is for professional analytical work, not personal property decisions.
|
| 2 |
For residents, see <a href="https://www.floodhelpny.org">FloodHelpNY</a> · <a href="https://www.floodnet.nyc">FloodNet NYC</a>.</p> <p class="app-footer-build">All foundation models Apache-2.0 · All data from public-record federal, state, and city sources · No commercial APIs contacted at runtime · Riprap v0.4.6 · build 2026-05-06</p> <p class="app-footer-credits">Dam mark: <a href="https://thenounproject.com/icon/dam-4516918/">"Dam" by Chintuza</a> via the Noun Project, CC-BY 3.0.</p></div></footer>`);function ie(h){var l=oe();u(h,l)}var pe=v('<a href="#region-briefing" class="skip-link">Skip to briefing</a> <a href="#region-map" class="skip-link" style="left: -9999px;">Skip to map</a> <a href="#region-trace" class="skip-link" style="left: -9999px;">Skip to trace</a>',1);function le(h){var l=pe();L(4),u(h,l)}var de=v("<!> <!>",1),ce=v('<!> <main class="svelte-12qhfyh"><!></main> <!>',1);function ke(h,l){O(l,!0);let N=f(()=>()=>{const e=D.params.queryId;if(!e)return null;try{return decodeURIComponent(e)}catch{return e}}),T=f(()=>D.url.pathname.startsWith("/print/")),k=f(()=>D.url.pathname==="/"),g=f(()=>p(T)||p(k));var m=ce(),w=R(m);{var A=e=>{var C=de(),S=R(C);le(S);var s=t(S,2);{let c=f(()=>p(N)());ne(s,{get query(){return p(c)},onResetCold:()=>window.location.href="/"})}u(e,C)};x(w,e=>{p(g)||e(A)})}var _=t(w,2),j=o(_);W(j,()=>l.children),i(_);var a=t(_,2);{var d=e=>{ie(e)};x(a,e=>{p(g)||e(d)})}u(h,m),$()}export{ke as component,xe as universal};
|
|
@@ -1 +1 @@
|
|
| 1 |
-
import{a as c,f as u,s as e}from"../chunks/CWw6qgC_.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/BTUA7_xE.js";import{p as m}from"../chunks/
|
|
|
|
| 1 |
+
import{a as c,f as u,s as e}from"../chunks/CWw6qgC_.js";import{p as v,f as l,t as _,a as g,c as p,r as o,s as x}from"../chunks/BTUA7_xE.js";import{p as m}from"../chunks/CbyeixEA.js";var d=u("<h1> </h1> <p> </p>",1);function k(f,i){v(i,!0);var t=d(),r=l(t),h=p(r,!0);o(r);var a=x(r,2),n=p(a,!0);o(a),_(()=>{var s;e(h,m.status),e(n,(s=m.error)==null?void 0:s.message)}),c(f,t),g()}export{k as component};
|
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import{a as m,f as w,d as D,l as I,e as G,s as g}from"../chunks/CWw6qgC_.js";import"../chunks/DixtWtwq.js";import{b9 as U,y as S,ar as K,$ as R,_ as V,h as Q,Y as Z,aq as J,am as E,ba as q,bb as X,o as d,bc as ee,af as ae,c,aR as k,r as o,p as P,a5 as N,a as M,a4 as A,s as f,t as T,ai as se,Z as te,ak as re}from"../chunks/BTUA7_xE.js";import{h as ne}from"../chunks/cDW0xQNP.js";import{R as le}from"../chunks/DCD6_LXk.js";import{e as $}from"../chunks/25_y8TFd.js";import{r as ie,a as oe,s as de,b as ce}from"../chunks/B0XoTt7U.js";import{g as B}from"../chunks/
|
| 2 |
with Sandy high-water marks recorded <span class="land-preview-cite svelte-1anw2jf">4.7 ft above grade <sup class="svelte-1anw2jf">[c1]</sup></span>.
|
| 3 |
FloodNet FN-BK-018 has logged <span class="land-preview-cite svelte-1anw2jf">14 nuisance floods since 2023 <sup class="svelte-1anw2jf">[c2]</sup></span>.</p> <div class="land-preview-cites svelte-1anw2jf"><div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c1]</span> <span class="land-preview-cite-src svelte-1anw2jf">USGS HWM · Sandy 2012</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c2]</span> <span class="land-preview-cite-src svelte-1anw2jf">FloodNet FN-BK-018</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c3]</span> <span class="land-preview-cite-src svelte-1anw2jf">FEMA NFHL · 36047C0207</span> <span class="land-preview-cite-tier svelte-1anw2jf">modeled</span></div></div></div> <div class="land-preview-pane land-preview-pane-cards svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Evidence cards</div> <div class="land-evcard-grid svelte-1anw2jf"><article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e1</span></header> <div class="land-evcard-claim svelte-1anw2jf">4.7 ft Sandy storm-surge HWM at address</div> <div class="land-evcard-source svelte-1anw2jf">USGS High-Water Mark database · 2012</div></article> <article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e2</span></header> <div class="land-evcard-claim svelte-1anw2jf">14 nuisance-flood events, 2023–2026</div> <div class="land-evcard-source svelte-1anw2jf">FloodNet FN-BK-018 · 2 blocks north</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e3</span></header> <div class="land-evcard-claim svelte-1anw2jf">FEMA 1% annual-chance (AE) flood zone</div> <div class="land-evcard-source svelte-1anw2jf">FEMA NFHL · panel 36047C0207</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e5</span></header> <div class="land-evcard-claim svelte-1anw2jf">+30 in MSL by 2070 (NPCC4 high)</div> <div class="land-evcard-source svelte-1anw2jf">NPCC4 SLR projection · 2024</div></article></div></div> <div class="land-preview-pane land-preview-pane-map svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Map</div> <!> <div class="land-preview-mapmeta svelte-1anw2jf">80 Pioneer St, Red Hook · z14.5 · Carto Positron</div></div></div></section>`);function ke(e){var s=Se(),r=f(c(s),2),t=f(c(r),4),a=f(c(t),2);_e(a,{}),k(2),o(t),o(r),o(s),m(e,s)}var Fe=w('<article class="land-stones-detail-cell svelte-1v6nt1t"><div class="land-stones-detail-num svelte-1v6nt1t"> </div> <h3 class="land-stones-detail-name svelte-1v6nt1t"> </h3> <div class="land-stones-detail-role svelte-1v6nt1t"> </div> <p class="land-stones-detail-tag svelte-1v6nt1t"> </p> <div class="land-stones-detail-sources svelte-1v6nt1t"> </div></article>'),xe=w(`<section class="land-section-stones-detail svelte-1v6nt1t" id="methodology"><div class="land-page svelte-1v6nt1t"><div class="land-section-head svelte-1v6nt1t"><span class="section-label">How Riprap reads a place</span> <span class="land-section-meta svelte-1v6nt1t">Five Stones · one taxonomy · every briefing</span></div> <p class="land-stones-deck svelte-1v6nt1t">Each briefing routes through a fixed taxonomy of public-record specialists. Each Stone is a class of evidence.
|
| 4 |
Together they form the briefing, and every claim in the output traces back to the Stone that produced it.</p> <div class="land-stones-detail svelte-1v6nt1t"></div></div></section>`);function Le(e,s){P(s,!1);const r=[{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers",sources:"USGS HWMs · FEMA NFHL · DEP stormwater · Prithvi historical",tint:"var(--stone-cornerstone)"},{name:"Keystone",role:"the asset register",tag:"what's exposed",sources:"MTA · NYCHA · DOE · DOH · PLUTO",tint:"var(--stone-keystone)"},{name:"Touchstone",role:"the live observer",tag:"what's happening now",sources:"FloodNet sensors · 311 complaints · NWS · NOAA tide gauges",tint:"var(--stone-touchstone)"},{name:"Lodestone",role:"the projector",tag:"what's coming",sources:"NPCC4 · Granite TTM (zero-shot + NYC fine-tune) · NWS alerts",tint:"var(--stone-lodestone)"},{name:"Capstone",role:"the synthesizer",tag:"writes it all down",sources:"Granite 4.1 composer · Mellea grounding-check · WeasyPrint",tint:"var(--stone-capstone)"}];me();var t=xe(),a=c(t),n=f(c(a),4);$(n,7,()=>r,u=>u.name,(u,l,v)=>{var i=Fe();let j;var y=c(i),p=c(y,!0);o(y);var b=f(y,2),F=c(b,!0);o(b);var h=f(b,2),x=c(h,!0);o(h);var _=f(h,2),O=c(_,!0);o(_);var z=f(_,2),W=c(z,!0);o(z),o(i),T(Y=>{j=ce(i,"",j,{"--stone-tint":d(l).tint}),g(p,Y),g(F,d(l).name),g(x,d(l).role),g(O,d(l).tag),g(W,d(l).sources)},[()=>String(d(v)+1).padStart(2,"0")]),m(u,i)}),o(n),o(a),o(t),m(e,t),M()}var Ce=w('<footer class="land-footer svelte-1dcj612"><span class="land-footer-tiers svelte-1dcj612"><span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-emp svelte-1dcj612"></span>empirical</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-mod svelte-1dcj612"></span>modeled</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-prx svelte-1dcj612"></span>proxy</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-syn svelte-1dcj612"></span>synthetic</span></span> <span class="land-footer-build">Riprap v0.4.6 · NYC OpenData · FEMA NFHL · USGS · NPCC4 · Dam mark by Chintuza, Noun Project (CC-BY)</span></footer>');function Ee(e){var s=Ce();m(e,s)}var Ne=w('<meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/>'),Ae=w('<div class="land svelte-1uha8ag"><!> <div class="land-page svelte-1uha8ag"><!> <!></div> <!> <!></div>');function We(e){var s=Ae();ne("1uha8ag",v=>{var i=Ne();te(()=>{re.title="Riprap — Flood Exposure Briefing for NYC"}),m(v,i)});var r=c(s);he(r);var t=f(r,2),a=c(t);je(a,{});var n=f(a,2);ke(n),o(t);var u=f(t,2);Le(u,{});var l=f(u,2);Ee(l),o(s),m(e,s)}export{We as component};
|
|
|
|
| 1 |
+
import{a as m,f as w,d as D,l as I,e as G,s as g}from"../chunks/CWw6qgC_.js";import"../chunks/DixtWtwq.js";import{b9 as U,y as S,ar as K,$ as R,_ as V,h as Q,Y as Z,aq as J,am as E,ba as q,bb as X,o as d,bc as ee,af as ae,c,aR as k,r as o,p as P,a5 as N,a as M,a4 as A,s as f,t as T,ai as se,Z as te,ak as re}from"../chunks/BTUA7_xE.js";import{h as ne}from"../chunks/cDW0xQNP.js";import{R as le}from"../chunks/DCD6_LXk.js";import{e as $}from"../chunks/25_y8TFd.js";import{r as ie,a as oe,s as de,b as ce}from"../chunks/B0XoTt7U.js";import{g as B}from"../chunks/33K0dtcD.js";import{b as ve,_ as pe}from"../chunks/CXQd8Y6F.js";import{P as fe}from"../chunks/D907np-5.js";function ue(e,s,r=s){var t=new WeakSet;U(e,"input",async a=>{var n=a?e.defaultValue:e.value;if(n=L(e)?C(n):n,r(n),S!==null&&t.add(S),await K(),n!==(n=s())){var u=e.selectionStart,l=e.selectionEnd,v=e.value.length;if(e.value=n??"",l!==null){var i=e.value.length;u===l&&l===v&&i>v?(e.selectionStart=i,e.selectionEnd=i):(e.selectionStart=u,e.selectionEnd=Math.min(l,i))}}}),(Q&&e.defaultValue!==e.value||R(s)==null&&e.value)&&(r(L(e)?C(e.value):e.value),S!==null&&t.add(S)),V(()=>{var a=s();if(e===document.activeElement){var n=S;if(t.has(n))return}L(e)&&a===C(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}function L(e){var s=e.type;return s==="number"||s==="range"}function C(e){return e===""?null:+e}function me(e=!1){const s=Z,r=s.l.u;if(!r)return;let t=()=>ee(s.s);if(e){let a=0,n={};const u=ae(()=>{let l=!1;const v=s.s;for(const i in v)v[i]!==n[i]&&(n[i]=v[i],l=!0);return l&&a++,a});t=()=>d(u)}r.b.length&&J(()=>{H(s,t),q(r.b)}),E(()=>{const a=R(()=>r.m.map(X));return()=>{for(const n of a)typeof n=="function"&&n()}}),r.a.length&&E(()=>{H(s,t),q(r.a)})}function H(e,s){if(e.l.s)for(const r of e.l.s)d(r);s()}var we=w('<header class="land-header svelte-1ct2rgk"><span class="riprap-wordmark"><!>riprap</span> <span class="land-header-sep svelte-1ct2rgk">/</span> <span class="land-header-context svelte-1ct2rgk">Flood Exposure Briefing · NYC</span> <nav class="land-header-nav svelte-1ct2rgk"><a href="#methodology" class="svelte-1ct2rgk">Methodology</a> <a href="#sources" class="svelte-1ct2rgk">Sources</a></nav></header>');function he(e){var s=we(),r=c(s),t=c(r);le(t,{size:22}),k(),o(r),k(6),o(s),m(e,s)}var ye=w("<span> </span>"),ge=w('<main class="land-hero svelte-drzq4r"><h1 class="land-hero-h1 svelte-drzq4r"><span class="land-hero-headline svelte-drzq4r">A flood exposure briefing<br/> for <em class="svelte-drzq4r">any place</em> in New York City.</span> <span class="land-hero-deck svelte-drzq4r">Type an address. Get a written briefing where every numeric claim links to its primary public-record source.</span></h1> <form class="land-query svelte-drzq4r" role="search"><span class="land-query-prompt svelte-drzq4r" aria-hidden="true">›</span> <input type="text" placeholder="Address, neighborhood, or BBL. e.g. 80 Pioneer Street, Red Hook" class="land-query-input svelte-drzq4r" aria-label="Query an address, neighborhood, or BBL"/> <button type="submit" class="land-query-submit svelte-drzq4r">Brief this place →</button></form> <div class="land-cycling svelte-drzq4r" aria-live="polite"><span class="land-cycling-label svelte-drzq4r">Try:</span> <button type="button" class="land-cycling-rail svelte-drzq4r" title="Run this example"></button></div></main>');function je(e,s){P(s,!0);const r=["80 Pioneer Street, Red Hook","Coney Island Hospital","PS 188, Lower East Side","Hammels Houses, Rockaway","Bowling Green station","555 W 57th Street"];let t=A(""),a=A(0);E(()=>{if(typeof window>"u")return;const p=setInterval(()=>{N(a,(d(a)+1)%r.length)},2200);return()=>clearInterval(p)});function n(){const p=d(t).trim();p&&B(`/q/${encodeURIComponent(p)}`)}function u(){const p=r[d(a)];B(`/q/${encodeURIComponent(p)}`)}var l=ge(),v=f(c(l),2),i=f(c(v),2);ie(i),k(2),o(v);var j=f(v,2),y=f(c(j),2);$(y,22,()=>r,p=>p,(p,b,F)=>{var h=ye();let x;var _=c(h,!0);o(h),T(()=>{x=oe(h,1,"land-cycling-item svelte-drzq4r",null,x,{"is-active":d(F)===d(a)}),de(h,"aria-hidden",d(F)!==d(a)),g(_,b)}),m(p,h)}),o(y),o(j),o(l),I("submit",v,p=>{p.preventDefault(),n()}),ue(i,()=>d(t),p=>N(t,p)),G("click",y,u),m(e,l),M()}D(["click"]);var be=w('<div class="land-mapmini svelte-1g1r73s" role="img" aria-label="Live mini-map preview of Red Hook flood exposure layers"><div class="land-mapmini-canvas svelte-1g1r73s"></div> <div class="land-mapmini-legend svelte-1g1r73s"><span class="svelte-1g1r73s"><span class="lm-sw lm-sw-emp svelte-1g1r73s"></span>empirical</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-mod svelte-1g1r73s"></span>modeled</span> <span class="svelte-1g1r73s"><span class="lm-sw lm-sw-prx svelte-1g1r73s"></span>proxy</span></div></div>');function _e(e,s){P(s,!0);const r=[-74.0096,40.6776];let t=A(null),a=null;se(()=>{let l=!1;return(async()=>{if(!d(t)||l)return;const v=await pe(()=>import("../chunks/D4L2lGt1.js").then(i=>i.m),[],import.meta.url);l||!d(t)||(a=new v.Map({container:d(t),style:fe,center:r,zoom:14.5,interactive:!1,attributionControl:!1}),a.on("load",()=>{a&&(a.addSource("fema-ae",{type:"geojson",data:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.014,40.679],[-74.007,40.68],[-74.005,40.677],[-74.009,40.6755],[-74.014,40.679]]]}}]}}),a.addLayer({id:"fema-ae-fill",type:"fill",source:"fema-ae",paint:{"fill-color":"#2A6FA8","fill-opacity":.22}}),a.addLayer({id:"fema-ae-line",type:"line",source:"fema-ae",paint:{"line-color":"#2A6FA8","line-width":1,"line-dasharray":[3,2]}}),a.addSource("hwm-contour",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:[[-74.0125,40.679],[-74.0105,40.6792],[-74.008,40.679],[-74.006,40.6786]]}}}),a.addLayer({id:"hwm-contour-line",type:"line",source:"hwm-contour",paint:{"line-color":"#0B5394","line-width":1.4}}),a.addSource("proxy-311",{type:"geojson",data:{type:"FeatureCollection",features:[[-74.0118,40.677],[-74.0114,40.6767],[-74.0121,40.6772]].map(i=>({type:"Feature",properties:{},geometry:{type:"Point",coordinates:i}}))}}),a.addLayer({id:"proxy-311-circle",type:"circle",source:"proxy-311",paint:{"circle-radius":3,"circle-color":"transparent","circle-stroke-color":"#6B6B6B","circle-stroke-width":1}}),a.addSource("floodnet",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:[-74.0103,40.6788]}}}),a.addLayer({id:"floodnet-pin",type:"circle",source:"floodnet",paint:{"circle-radius":4,"circle-color":"#0B5394","circle-stroke-color":"#FFFFFF","circle-stroke-width":1}}),a.addSource("addr",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"Point",coordinates:r}}}),a.addLayer({id:"addr-ring",type:"circle",source:"addr",paint:{"circle-radius":9,"circle-color":"transparent","circle-stroke-color":"#0F172A","circle-stroke-width":1.4}}),a.addLayer({id:"addr-dot",type:"circle",source:"addr",paint:{"circle-radius":3,"circle-color":"#0F172A"}}))}))})(),()=>{l=!0,a&&(a.remove(),a=null)}});var n=be(),u=c(n);ve(u,l=>N(t,l),()=>d(t)),k(2),o(n),m(e,n),M()}var Se=w(`<section class="land-section svelte-1anw2jf"><div class="land-section-head svelte-1anw2jf"><span class="section-label">What you'll get back</span> <span class="land-section-meta svelte-1anw2jf">A grounded paragraph with citations, not a chatbot answer.</span></div> <div class="land-preview-grid svelte-1anw2jf"><div class="land-preview-pane land-preview-pane-excerpt svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Briefing excerpt</div> <p class="land-preview-body svelte-1anw2jf">The lot sits inside the FEMA <span class="land-preview-cite svelte-1anw2jf">1% AE flood zone <sup class="svelte-1anw2jf">[c3]</sup></span>,
|
| 2 |
with Sandy high-water marks recorded <span class="land-preview-cite svelte-1anw2jf">4.7 ft above grade <sup class="svelte-1anw2jf">[c1]</sup></span>.
|
| 3 |
FloodNet FN-BK-018 has logged <span class="land-preview-cite svelte-1anw2jf">14 nuisance floods since 2023 <sup class="svelte-1anw2jf">[c2]</sup></span>.</p> <div class="land-preview-cites svelte-1anw2jf"><div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c1]</span> <span class="land-preview-cite-src svelte-1anw2jf">USGS HWM · Sandy 2012</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c2]</span> <span class="land-preview-cite-src svelte-1anw2jf">FloodNet FN-BK-018</span> <span class="land-preview-cite-tier svelte-1anw2jf">empirical</span></div> <div class="land-preview-cite-row svelte-1anw2jf"><span class="land-preview-cite-pin svelte-1anw2jf">[c3]</span> <span class="land-preview-cite-src svelte-1anw2jf">FEMA NFHL · 36047C0207</span> <span class="land-preview-cite-tier svelte-1anw2jf">modeled</span></div></div></div> <div class="land-preview-pane land-preview-pane-cards svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Evidence cards</div> <div class="land-evcard-grid svelte-1anw2jf"><article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e1</span></header> <div class="land-evcard-claim svelte-1anw2jf">4.7 ft Sandy storm-surge HWM at address</div> <div class="land-evcard-source svelte-1anw2jf">USGS High-Water Mark database · 2012</div></article> <article class="land-evcard land-evcard-empirical svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">empirical</span> <span class="land-evcard-id svelte-1anw2jf">e2</span></header> <div class="land-evcard-claim svelte-1anw2jf">14 nuisance-flood events, 2023–2026</div> <div class="land-evcard-source svelte-1anw2jf">FloodNet FN-BK-018 · 2 blocks north</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e3</span></header> <div class="land-evcard-claim svelte-1anw2jf">FEMA 1% annual-chance (AE) flood zone</div> <div class="land-evcard-source svelte-1anw2jf">FEMA NFHL · panel 36047C0207</div></article> <article class="land-evcard land-evcard-modeled svelte-1anw2jf"><header class="land-evcard-head svelte-1anw2jf"><span class="land-evcard-tier svelte-1anw2jf">modeled</span> <span class="land-evcard-id svelte-1anw2jf">e5</span></header> <div class="land-evcard-claim svelte-1anw2jf">+30 in MSL by 2070 (NPCC4 high)</div> <div class="land-evcard-source svelte-1anw2jf">NPCC4 SLR projection · 2024</div></article></div></div> <div class="land-preview-pane land-preview-pane-map svelte-1anw2jf"><div class="land-preview-eyebrow svelte-1anw2jf">Map</div> <!> <div class="land-preview-mapmeta svelte-1anw2jf">80 Pioneer St, Red Hook · z14.5 · Carto Positron</div></div></div></section>`);function ke(e){var s=Se(),r=f(c(s),2),t=f(c(r),4),a=f(c(t),2);_e(a,{}),k(2),o(t),o(r),o(s),m(e,s)}var Fe=w('<article class="land-stones-detail-cell svelte-1v6nt1t"><div class="land-stones-detail-num svelte-1v6nt1t"> </div> <h3 class="land-stones-detail-name svelte-1v6nt1t"> </h3> <div class="land-stones-detail-role svelte-1v6nt1t"> </div> <p class="land-stones-detail-tag svelte-1v6nt1t"> </p> <div class="land-stones-detail-sources svelte-1v6nt1t"> </div></article>'),xe=w(`<section class="land-section-stones-detail svelte-1v6nt1t" id="methodology"><div class="land-page svelte-1v6nt1t"><div class="land-section-head svelte-1v6nt1t"><span class="section-label">How Riprap reads a place</span> <span class="land-section-meta svelte-1v6nt1t">Five Stones · one taxonomy · every briefing</span></div> <p class="land-stones-deck svelte-1v6nt1t">Each briefing routes through a fixed taxonomy of public-record specialists. Each Stone is a class of evidence.
|
| 4 |
Together they form the briefing, and every claim in the output traces back to the Stone that produced it.</p> <div class="land-stones-detail svelte-1v6nt1t"></div></div></section>`);function Le(e,s){P(s,!1);const r=[{name:"Cornerstone",role:"the hazard reader",tag:"what NYC's ground remembers",sources:"USGS HWMs · FEMA NFHL · DEP stormwater · Prithvi historical",tint:"var(--stone-cornerstone)"},{name:"Keystone",role:"the asset register",tag:"what's exposed",sources:"MTA · NYCHA · DOE · DOH · PLUTO",tint:"var(--stone-keystone)"},{name:"Touchstone",role:"the live observer",tag:"what's happening now",sources:"FloodNet sensors · 311 complaints · NWS · NOAA tide gauges",tint:"var(--stone-touchstone)"},{name:"Lodestone",role:"the projector",tag:"what's coming",sources:"NPCC4 · Granite TTM (zero-shot + NYC fine-tune) · NWS alerts",tint:"var(--stone-lodestone)"},{name:"Capstone",role:"the synthesizer",tag:"writes it all down",sources:"Granite 4.1 composer · Mellea grounding-check · WeasyPrint",tint:"var(--stone-capstone)"}];me();var t=xe(),a=c(t),n=f(c(a),4);$(n,7,()=>r,u=>u.name,(u,l,v)=>{var i=Fe();let j;var y=c(i),p=c(y,!0);o(y);var b=f(y,2),F=c(b,!0);o(b);var h=f(b,2),x=c(h,!0);o(h);var _=f(h,2),O=c(_,!0);o(_);var z=f(_,2),W=c(z,!0);o(z),o(i),T(Y=>{j=ce(i,"",j,{"--stone-tint":d(l).tint}),g(p,Y),g(F,d(l).name),g(x,d(l).role),g(O,d(l).tag),g(W,d(l).sources)},[()=>String(d(v)+1).padStart(2,"0")]),m(u,i)}),o(n),o(a),o(t),m(e,t),M()}var Ce=w('<footer class="land-footer svelte-1dcj612"><span class="land-footer-tiers svelte-1dcj612"><span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-emp svelte-1dcj612"></span>empirical</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-mod svelte-1dcj612"></span>modeled</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-prx svelte-1dcj612"></span>proxy</span> <span class="land-footer-tier svelte-1dcj612"><span class="lm-sw lm-sw-syn svelte-1dcj612"></span>synthetic</span></span> <span class="land-footer-build">Riprap v0.4.6 · NYC OpenData · FEMA NFHL · USGS · NPCC4 · Dam mark by Chintuza, Noun Project (CC-BY)</span></footer>');function Ee(e){var s=Ce();m(e,s)}var Ne=w('<meta name="description" content="A citation-grounded flood-exposure briefing tool for any address, neighborhood, or BBL in New York City."/>'),Ae=w('<div class="land svelte-1uha8ag"><!> <div class="land-page svelte-1uha8ag"><!> <!></div> <!> <!></div>');function We(e){var s=Ae();ne("1uha8ag",v=>{var i=Ne();te(()=>{re.title="Riprap — Flood Exposure Briefing for NYC"}),m(v,i)});var r=c(s);he(r);var t=f(r,2),a=c(t);je(a,{});var n=f(a,2);ke(n),o(t);var u=f(t,2);Le(u,{});var l=f(u,2);Ee(l),o(s),m(e,s)}export{We as component};
|
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import{d as ge,c as he,a as v,s as l,e as xe,f as p}from"../chunks/CWw6qgC_.js";import{p as ye,ai as we,f as $e,a as ke,aj as qe,o as e,a5 as F,ak as je,al as d,a4 as I,c as a,s,r as t,t as M}from"../chunks/BTUA7_xE.js";import{i as O}from"../chunks/Bd-v_9Ud.js";import{e as Se}from"../chunks/25_y8TFd.js";import{h as Fe}from"../chunks/cDW0xQNP.js";import{p as Ie}from"../chunks/
|
| 2 |
use <strong>export PDF</strong> from the header to open this view.
|
| 3 |
Snapshots are stored per-browser and persist between runs of the same query.</p></div>`),Be=p('<div class="curl svelte-uialbm"> </div>'),De=p('<li class="svelte-uialbm"><span class="cn svelte-uialbm"> </span> <span class="cglyph svelte-uialbm"><!></span> <span class="csrc svelte-uialbm"> </span> <span class="cvint svelte-uialbm"> </span> <div class="ctitle svelte-uialbm"> </div> <!> <div class="cdocid svelte-uialbm">doc_id <code> </code></div></li>'),Ge=p('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),ze=p('<article class="print-doc svelte-uialbm"><header class="print-head svelte-uialbm"><div class="print-head-top svelte-uialbm"><span class="wordmark svelte-uialbm">riprap</span> <span class="meta"> </span></div> <h1 class="print-title svelte-uialbm"> </h1> <div class="print-sub svelte-uialbm">intent <strong> </strong> </div></header> <div class="print-controls no-print svelte-uialbm"><button type="button" class="svelte-uialbm">print / save as PDF</button> <span class="hint svelte-uialbm"> </span></div> <!> <!> <footer class="print-foot svelte-uialbm"> </footer></article>'),Le=p('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function Ve(Q,U){ye(U,!0);let V=d(()=>Ie.params.queryId??""),i=I(null),T=I(!1),P=I(!1);we(()=>{const r=Te(e(V));if(!r){F(T,!0);return}F(i,r,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),F(P,!0))})})});function X(){typeof window<"u"&&window.print()}let R=d(()=>e(i)?Object.values(e(i).citations).sort((r,n)=>r.n-n.n):[]),A=d(()=>e(i)?new Date(e(i).generatedAt).toISOString().slice(0,10):"");var B=he();Fe("uialbm",r=>{qe(()=>{var n;je.title=`Riprap briefing — ${((n=e(i))==null?void 0:n.queryText)??"export"??""}`})});var Y=$e(B);{var Z=r=>{var n=Ae();v(r,n)},ee=r=>{var n=ze(),c=a(n),u=a(c),D=s(a(u),2),ae=a(D);t(D),t(u);var m=s(u,2),se=a(m,!0);t(m);var G=s(m,2),f=s(a(G)),re=a(f,!0);t(f);var ie=s(f);t(G),t(c);var b=s(c,2),z=a(b),L=s(z,2),ne=a(L,!0);t(L),t(b);var N=s(b,2);Me(N,{get blocks(){return e(i).blocks},get citations(){return e(i).citations},streaming:!1});var C=s(N,2);{var le=_=>{var g=Ge(),W=s(a(g),2);Se(W,21,()=>e(R),h=>h.id,(h,o)=>{var x=De(),y=a(x),ve=a(y);t(y);var w=s(y,2),pe=a(w);Oe(pe,{get tier(){return e(o).tier},size:9,get color(){return`var(--tier-${e(o).tier??""})`}}),t(w);var $=s(w,2),de=a($,!0);t($);var k=s($,2),ce=a(k);t(k);var q=s(k,2),ue=a(q,!0);t(q);var H=s(q,2);{var me=j=>{var S=Be(),_e=a(S,!0);t(S),M(()=>l(_e,e(o).url)),v(j,S)},fe=d(()=>e(o).url&&e(o).url.startsWith("http"));O(H,j=>{e(fe)&&j(me)})}var J=s(H,2),K=s(a(J)),be=a(K,!0);t(K),t(J),t(x),M(()=>{l(ve,`[${e(o).n??""}]`),l(de,e(o).source),l(ce,`v. ${e(o).vintage??""}`),l(ue,e(o).title),l(be,e(o).docId)}),v(h,x)}),t(W),t(g),v(_,g)};O(C,_=>{e(R).length&&_(le)})}var E=s(C,2),oe=a(E);t(E),t(n),M(()=>{l(ae,`flood-exposure briefing · v0.4.2 · ${e(A)??""}`),l(se,e(i).queryText),l(re,e(i).intent??"briefing"),l(ie,` · ${e(i).specialists??""} specialists
|
| 4 |
· ${e(i).attempts??1??""} reconcile${(e(i).attempts??1)===1?"":"s"}
|
|
|
|
| 1 |
+
import{d as ge,c as he,a as v,s as l,e as xe,f as p}from"../chunks/CWw6qgC_.js";import{p as ye,ai as we,f as $e,a as ke,aj as qe,o as e,a5 as F,ak as je,al as d,a4 as I,c as a,s,r as t,t as M}from"../chunks/BTUA7_xE.js";import{i as O}from"../chunks/Bd-v_9Ud.js";import{e as Se}from"../chunks/25_y8TFd.js";import{h as Fe}from"../chunks/cDW0xQNP.js";import{p as Ie}from"../chunks/CbyeixEA.js";import{B as Me,T as Oe}from"../chunks/BatqQaKj.js";import{l as Te}from"../chunks/DxQlA7U2.js";const Pe=!1,Re=!1,Ue=Object.freeze(Object.defineProperty({__proto__:null,prerender:Pe,ssr:Re},Symbol.toStringTag,{value:"Module"}));var Ae=p(`<div class="empty svelte-uialbm"><h1 class="svelte-uialbm">No briefing snapshot found</h1> <p>Run a briefing first at <a href="/" class="svelte-uialbm">riprap home</a>; once it finishes,
|
| 2 |
use <strong>export PDF</strong> from the header to open this view.
|
| 3 |
Snapshots are stored per-browser and persist between runs of the same query.</p></div>`),Be=p('<div class="curl svelte-uialbm"> </div>'),De=p('<li class="svelte-uialbm"><span class="cn svelte-uialbm"> </span> <span class="cglyph svelte-uialbm"><!></span> <span class="csrc svelte-uialbm"> </span> <span class="cvint svelte-uialbm"> </span> <div class="ctitle svelte-uialbm"> </div> <!> <div class="cdocid svelte-uialbm">doc_id <code> </code></div></li>'),Ge=p('<section class="print-citations svelte-uialbm"><h2 class="svelte-uialbm">Citations</h2> <ol class="svelte-uialbm"></ol></section>'),ze=p('<article class="print-doc svelte-uialbm"><header class="print-head svelte-uialbm"><div class="print-head-top svelte-uialbm"><span class="wordmark svelte-uialbm">riprap</span> <span class="meta"> </span></div> <h1 class="print-title svelte-uialbm"> </h1> <div class="print-sub svelte-uialbm">intent <strong> </strong> </div></header> <div class="print-controls no-print svelte-uialbm"><button type="button" class="svelte-uialbm">print / save as PDF</button> <span class="hint svelte-uialbm"> </span></div> <!> <!> <footer class="print-foot svelte-uialbm"> </footer></article>'),Le=p('<div class="empty svelte-uialbm"><p>Loading…</p></div>');function Ve(Q,U){ye(U,!0);let V=d(()=>Ie.params.queryId??""),i=I(null),T=I(!1),P=I(!1);we(()=>{const r=Te(e(V));if(!r){F(T,!0);return}F(i,r,!0),requestAnimationFrame(()=>{requestAnimationFrame(()=>{typeof window<"u"&&(window.print(),F(P,!0))})})});function X(){typeof window<"u"&&window.print()}let R=d(()=>e(i)?Object.values(e(i).citations).sort((r,n)=>r.n-n.n):[]),A=d(()=>e(i)?new Date(e(i).generatedAt).toISOString().slice(0,10):"");var B=he();Fe("uialbm",r=>{qe(()=>{var n;je.title=`Riprap briefing — ${((n=e(i))==null?void 0:n.queryText)??"export"??""}`})});var Y=$e(B);{var Z=r=>{var n=Ae();v(r,n)},ee=r=>{var n=ze(),c=a(n),u=a(c),D=s(a(u),2),ae=a(D);t(D),t(u);var m=s(u,2),se=a(m,!0);t(m);var G=s(m,2),f=s(a(G)),re=a(f,!0);t(f);var ie=s(f);t(G),t(c);var b=s(c,2),z=a(b),L=s(z,2),ne=a(L,!0);t(L),t(b);var N=s(b,2);Me(N,{get blocks(){return e(i).blocks},get citations(){return e(i).citations},streaming:!1});var C=s(N,2);{var le=_=>{var g=Ge(),W=s(a(g),2);Se(W,21,()=>e(R),h=>h.id,(h,o)=>{var x=De(),y=a(x),ve=a(y);t(y);var w=s(y,2),pe=a(w);Oe(pe,{get tier(){return e(o).tier},size:9,get color(){return`var(--tier-${e(o).tier??""})`}}),t(w);var $=s(w,2),de=a($,!0);t($);var k=s($,2),ce=a(k);t(k);var q=s(k,2),ue=a(q,!0);t(q);var H=s(q,2);{var me=j=>{var S=Be(),_e=a(S,!0);t(S),M(()=>l(_e,e(o).url)),v(j,S)},fe=d(()=>e(o).url&&e(o).url.startsWith("http"));O(H,j=>{e(fe)&&j(me)})}var J=s(H,2),K=s(a(J)),be=a(K,!0);t(K),t(J),t(x),M(()=>{l(ve,`[${e(o).n??""}]`),l(de,e(o).source),l(ce,`v. ${e(o).vintage??""}`),l(ue,e(o).title),l(be,e(o).docId)}),v(h,x)}),t(W),t(g),v(_,g)};O(C,_=>{e(R).length&&_(le)})}var E=s(C,2),oe=a(E);t(E),t(n),M(()=>{l(ae,`flood-exposure briefing · v0.4.2 · ${e(A)??""}`),l(se,e(i).queryText),l(re,e(i).intent??"briefing"),l(ie,` · ${e(i).specialists??""} specialists
|
| 4 |
· ${e(i).attempts??1??""} reconcile${(e(i).attempts??1)===1?"":"s"}
|
|
@@ -1 +0,0 @@
|
|
| 1 |
-
import{d as Ye,s as R,a as L,f as j,c as jt,e as Pt,t as Ot}from"../chunks/CWw6qgC_.js";import{c as S,s as N,r as b,aR as Be,t as Z,o as a,f as we,al as ne,p as zt,a4 as k,a9 as te,am as De,a5 as v,ai as Dt,a as Rt}from"../chunks/BTUA7_xE.js";import{i as G}from"../chunks/Bd-v_9Ud.js";import{p as Yt}from"../chunks/DwBZTDEf.js";import{T as dt,t as ut,a as Bt,B as Ht}from"../chunks/BatqQaKj.js";import{f as Ut,C as Gt,F as Wt,R as Kt,M as Vt}from"../chunks/BZuv-XBZ.js";import"../chunks/DixtWtwq.js";import{e as pt,i as Zt}from"../chunks/25_y8TFd.js";import{b as oe,a as Re,s as Jt}from"../chunks/B0XoTt7U.js";import{p as tt}from"../chunks/CW0zSL4D.js";import{b as z,p as Xt}from"../chunks/DxQlA7U2.js";const Qt=!1,en=!1,vr=Object.freeze(Object.defineProperty({__proto__:null,prerender:Qt,ssr:en},Symbol.toStringTag,{value:"Module"}));Ye(["click"]);Ye(["click"]);var tn=j('<div class="skeleton-section"><div class="skeleton-head"><span class="skeleton-num"> </span> <span class="skeleton-label"> </span> <span class="skeleton-spinner" aria-hidden="true">▍</span></div> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span></div>'),nn=j('<div class="skeleton-brief" role="status" aria-live="polite" aria-label="Loading briefing — geocode complete, dispatching specialists"><div class="skeleton-status"><span class="skeleton-pulse"></span> <span class="skeleton-pulse skeleton-pulse-meta"></span></div> <!></div>');function rn(n){const e=[{n:"01",label:"Status"},{n:"02",label:"Empirical evidence"},{n:"03",label:"Modeled scenarios"},{n:"04",label:"Policy context"}];var t=nn(),r=S(t),s=S(r);oe(s,"",{},{width:"62%"});var d=N(s,2);oe(d,"",{},{width:"40%"}),b(r);var o=N(r,2);pt(o,1,()=>e,p=>p.n,(p,_)=>{var l=tn(),c=S(l),g=S(c),q=S(g,!0);b(g);var Y=N(g,2),P=S(Y,!0);b(Y),Be(2),b(c);var W=N(c,2);oe(W,"",{},{width:"92%"});var T=N(W,2);oe(T,"",{},{width:"78%"});var K=N(T,2);oe(K,"",{},{width:"85%"}),b(l),Z(()=>{R(q,a(_).n),R(P,a(_).label)}),L(p,l)}),b(t),L(n,t)}var an=j('<div class="reroll-banner" role="status" aria-live="polite"><!> <div class="reroll-body"><span class="reroll-head">Regenerating to satisfy citation grounding</span> <span class="reroll-sub"> </span></div> <span class="reroll-spinner" aria-hidden="true">↻</span></div>');function sn(n,e){let t=tt(e,"attempt",3,2),r=tt(e,"max",3,3);var s=an(),d=S(s);dt(d,{tier:"modeled",size:11,color:"var(--tier-modeled)"});var o=N(d,2),p=N(S(o),2),_=S(p);b(p),b(o),Be(2),b(s),Z(()=>R(_,`Mellea reconciler · attempt ${t()??""} of ${r()??""} · previous draft dimmed below`)),L(n,s)}var on=j("<a> </a>"),ln=j('<button type="button"> </button>'),cn=j('<article role="alert" aria-live="assertive"><header class="error-card-head"><!> <span class="error-card-eyebrow"> </span></header> <h3 class="error-card-headline"> </h3> <p class="error-card-body"> </p> <div class="error-card-actions"></div> <footer class="error-card-foot"><span class="section-label">Trust signals · still on</span> <span class="error-card-foot-copy">All foundation models Apache-2.0 · No commercial APIs at runtime</span></footer></article>');function dn(n,e){const t={geocoder:{eyebrow:"Address not resolved",headline:"We couldn't resolve that to a NYC address.",body:`Try a more specific street address — for example, "80 Pioneer Street, Brooklyn." Riprap covers the five boroughs only; international addresses, NJ addresses, and points outside NYC aren't supported.`,tier:"proxy",defaultActions:["Use a sample query","Edit query"]},"all-silent":{eyebrow:"Outside evidence coverage",headline:"No specialists found evidence at this point.",body:"The address resolved, but every flood-evidence specialist returned silent. This is rare and usually means parkland, water, or a point with no nearby 311, no FloodNet sensor, and no Sandy overlap. Try a nearby street address or expand to neighborhood-mode.",tier:"proxy",defaultActions:["Try nearby address","Switch to neighborhood-mode"]},grounding:{eyebrow:"Grounding failure",headline:"Briefing prose couldn't be composed within citation constraints.",body:"Mellea rejected all reroll attempts. The underlying evidence is fine — only the prose composition failed. Download the structured evidence below, or contact support.",tier:"modeled",defaultActions:["Download evidence (JSON)","Contact support","Try again"]},backend:{eyebrow:"Backend unavailable",headline:"All routing targets exhausted.",body:"LiteLLM tried Local Ollama → HF Space T4 → AMD MI300X and didn't reach a healthy backend. This usually clears within 5 minutes during a deploy window. The hardware-pill in the header is currently red.",tier:"proxy",defaultActions:["Retry now","Switch backend"]}};let r=ne(()=>t[e.state]),s=ne(()=>e.actions??a(r).defaultActions.map(W=>({label:W})));var d=cn(),o=S(d),p=S(o);dt(p,{get tier(){return a(r).tier},size:11,get color(){return`var(--tier-${a(r).tier??""})`}});var _=N(p,2),l=S(_,!0);b(_),b(o);var c=N(o,2),g=S(c,!0);b(c);var q=N(c,2),Y=S(q,!0);b(q);var P=N(q,2);pt(P,21,()=>a(s),Zt,(W,T,K)=>{var ce=jt(),Te=we(ce);{var de=V=>{var D=on();Re(D,1,"error-card-action",null,{},{"is-primary":K===0});var Q=S(D,!0);b(D),Z(()=>{Jt(D,"href",a(T).href),R(Q,a(T).label)}),L(V,D)},ie=V=>{var D=ln();Re(D,1,"error-card-action",null,{},{"is-primary":K===0});var Q=S(D,!0);b(D),Z(()=>R(Q,a(T).label)),Pt("click",D,function(...Ce){var ue;(ue=a(T).onClick)==null||ue.apply(this,Ce)}),L(V,D)};G(Te,V=>{a(T).href?V(de):V(ie,-1)})}L(W,ce)}),b(P),Be(2),b(d),Z(()=>{Re(d,1,`error-card error-card-${e.state??""}`),R(l,e.eyebrowOverride??a(r).eyebrow),R(g,e.headlineOverride??a(r).headline),R(Y,e.bodyOverride??a(r).body)}),L(n,d)}Ye(["click"]);const X="2026-05";function un(n){return n==="fan"||n==="merge"?"fired":n==="silent"?"silent_by_design":n==="error"?"errored":"fired"}function mt(n){return[n,...(n.children??[]).flatMap(mt)]}function pn(n){const e=n.toLowerCase();return e==="sandy_inundation"||e==="sandy"||e==="dep_stormwater"||e==="dep"||e==="ida_hwm_2021"||e==="ida_hwm"||e==="prithvi_eo_v2"||e==="prithvi_water"||e==="microtopo_lidar"||e==="microtopo"?"cornerstone":e==="mta_entrance_exposure"||e==="mta_entrances"||e==="nycha_development_exposure"||e==="nycha_developments"||e==="doe_school_exposure"||e==="doe_schools"||e==="doh_hospital_exposure"||e==="doh_hospitals"||e==="terramind_synthesis"||e==="terramind"||e==="terramind_buildings"||e==="eo_chip_fetch"?"keystone":e==="floodnet"||e==="nyc311"||e==="nws_obs"||e==="noaa_tides"||e==="prithvi_eo_live"||e==="prithvi_live"||e==="terramind_lulc"?"touchstone":e==="nws_alerts"||e==="ttm_forecast"||e==="ttm_311_forecast"||e==="floodnet_forecast"||e==="ttm_battery_surge"?"lodestone":e.startsWith("reconcile")||e.startsWith("mellea")||e==="rag_granite_embedding"||e==="gliner_extract"?"capstone":null}function mn(n){const e={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};if(n)for(const t of mt(n)){const r=pn(t.name);r&&e[r].push({id:t.id||t.name,name:t.name,status:un(t.status),tier:t.tier,ms:t.ms,note:t.note??t.error??void 0})}return Object.keys(e).map(t=>({key:t,members:Ut(t,e[t])}))}function w(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function C(n){return typeof n=="string"?n:null}function M(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:null}function fn(n,e){return n.sandy!==!0?null:{id:"fsm-sandy",stone:"cornerstone",tier:"empirical",variant:"headline",source:"NYC OEM",agency:"NYC OpenData 5xsi-dfpx · Sandy 2012 inundation",vintage:"2012-10-29",title:"Hurricane Sandy 2012 inundation",headline:"Inside zone",subhead:(e&&C(e.address))??"address inside the empirical 2012 extent",body:"Address sits within the empirical Hurricane Sandy 2012 inundation extent. This is a historical fact, not a model prediction.",docId:"sandy",citeId:"sandy",mapLayer:"sandy"}}function _n(n){const e=M(n.dep);if(!e)return null;const t=[];for(const[r,s]of Object.entries(e)){const d=M(s);if(!d)continue;const o=w(d.depth_class)??0;o<=0||t.push([r.replace("dep_",""),C(d.depth_label)??"—",`class ${o}`])}return t.length?{id:"fsm-dep",stone:"cornerstone",tier:"modeled",variant:"tabular",source:"NYC DEP",agency:"NYC Department of Environmental Protection · Stormwater Flood Maps",vintage:"2021",title:"Stormwater flood scenarios at this address",columns:["scenario","depth label","class"],rows:t,sub:`${t.length} scenario${t.length===1?"":"s"} place this lot in modeled flooding`,docId:"dep_stormwater",citeId:"dep",mapLayer:"stormwater"}:null}function hn(n){const e=M(n.ida_hwm);if(!e)return null;const t=w(e.n_within_radius);if(!t||t<=0)return null;const r=[];return r.push(["count",`${t}`,`${w(e.radius_m)??800} m radius`]),w(e.max_height_above_gnd_ft)!=null&&r.push(["max above gnd",`${e.max_height_above_gnd_ft} ft`,"—"]),w(e.nearest_dist_m)!=null&&r.push(["nearest",C(e.nearest_site)??"HWM",`${e.nearest_dist_m} m`]),{id:"fsm-ida-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"USGS STN Hurricane Ida 2021 high-water marks (Event 312)",vintage:"2021-09",title:"Hurricane Ida 2021 high-water marks nearby",columns:["field","value","context"],rows:r,docId:"ida_hwm",citeId:"ida_hwm",mapLayer:"hwm"}}function vn(n){const e=M(n.prithvi_water);if(!e)return null;const t=w(e.nearest_distance_m);return t==null?null:{id:"fsm-prithvi-water",stone:"cornerstone",tier:"modeled",variant:"raster",source:"Prithvi-EO 2.0",agency:"IBM/NASA Prithvi-EO 2.0 · baked Hurricane Ida 2021 polygons",vintage:"2021-09-02",title:"Hurricane Ida 2021 — satellite-attributable inundation",rasterKind:"prithvi",headline:e.inside_water_polygon?"Inside polygon":`${t} m away`,subhead:"pre/post HLS Sentinel-2 segmentation",sub:`${w(e.n_polygons_within_500m)??0} distinct polygons within 500 m`,docId:"prithvi_water",citeId:"prithvi_water",mapLayer:"prithvi"}}function gn(n){const e=M(n.microtopo);if(!e)return null;const t=w(e.point_elev_m);if(t==null)return null;const r=[{value:`${t.toFixed(1)} m`,label:"elevation"}];return w(e.hand_m)!=null&&r.push({value:`${e.hand_m.toFixed(1)} m`,label:"HAND"}),w(e.twi)!=null&&r.push({value:`${e.twi.toFixed(1)}`,label:"TWI"}),w(e.rel_elev_pct_200m)!=null&&r.push({value:`${e.rel_elev_pct_200m}%`,label:"pct lower 200m"}),{id:"fsm-microtopo",stone:"cornerstone",tier:"proxy",variant:"scalars",source:"USGS 3DEP",agency:"USGS 3DEP DEM (LiDAR-derived) + whitebox-workflows hydrology",vintage:"2018",title:"Microtopography at this point",scalars:r,sub:"Lower percentile = topographic low point; runoff routes here.",docId:"microtopo",citeId:"microtopo"}}function yn(n){const e=[],t=M(n.mta_entrances);if(t!=null&&t.available&&Array.isArray(t.entrances))for(const o of t.entrances.slice(0,4))e.push({reg:"MTA",tier:"empirical",label:C(o.station_name)??C(o.entrance_id)??"entrance",detail:`${w(o.distance_m)??"—"} m · ${C(o.daytime_routes)??""}`.trim(),sourceId:C(o.station_id)??"MTA",note:null});else t&&t.available===!1&&e.push({reg:"MTA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no subway entrances within 1.0 mi (silent)"});const r=M(n.nycha_developments);if(r!=null&&r.available&&Array.isArray(r.developments))for(const o of r.developments.slice(0,3))e.push({reg:"NYCHA",tier:"empirical",label:C(o.development)??"development",detail:`${w(o.distance_m)??"—"} m · ${C(o.borough)??""}`.trim(),sourceId:C(o.tds_num)??null,note:null});else r&&r.available===!1&&e.push({reg:"NYCHA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no NYCHA developments within 1.0 mi (silent)"});const s=M(n.doe_schools);if(s!=null&&s.available&&Array.isArray(s.schools))for(const o of s.schools.slice(0,3))e.push({reg:"DOE",tier:"empirical",label:C(o.loc_name)??"school",detail:`${w(o.distance_m)??"—"} m · ${C(o.borough)??""}`.trim(),sourceId:C(o.loc_code)??null,note:null});else s&&s.available===!1&&e.push({reg:"DOE",tier:"empirical",label:null,detail:null,sourceId:null,note:"no schools within 1.0 mi (silent)"});const d=M(n.doh_hospitals);if(d!=null&&d.available&&Array.isArray(d.hospitals))for(const o of d.hospitals.slice(0,3))e.push({reg:"DOH",tier:"empirical",label:C(o.facility_name)??"hospital",detail:`${w(o.distance_m)??"—"} m · ${C(o.borough)??""}`.trim(),sourceId:C(o.fac_id)??null,note:null});else d&&d.available===!1&&e.push({reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi (silent)"});return e.length?{id:"fsm-registers",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:X,title:"Nearby exposed assets",registers:e,sub:`${e.filter(o=>o.label).length} of ${e.length} registers fired · joined within 1.0 mi`,docId:"registers",citeId:"registers",mapLayer:"registers"}:null}function bn(n){const e=M(n.terramind_buildings);return e!=null&&e.ok?{id:"fsm-tm-buildings",stone:"keystone",tier:"modeled",variant:"raster-pred",source:"TerraMind-NYC",agency:"msradam/TerraMind-NYC-Adapters · Buildings LoRA",vintage:"2026",title:"NYC building footprints — TerraMind LoRA",rasterKind:"buildings",headline:`${w(e.pct_buildings)??0}%`,subhead:"building-footprint coverage in chip",sub:`${w(e.n_building_components)??0} distinct components · test mIoU 0.5511`,illustrative:!0,docId:"tm_buildings",citeId:"tm_buildings",mapLayer:"buildings"}:null}function wn(n){const e=M(n.floodnet);if(!e||(w(e.n_sensors)??0)<=0)return null;const t=w(e.n_flood_events_3y)??0;return{id:"fsm-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC ultrasonic depth sensor network",vintage:"2026",title:"FloodNet sensors near this address",headline:`${t} events`,subhead:`${w(e.n_sensors)??0} sensors · last 3 y`,spark:Array.from({length:24},(r,s)=>Math.max(0,Math.round(t/24*1.4*Math.exp(-Math.pow((s-14)/4,2))+t/24))),sparkSub:"Above-curb depth events ≥ 2 cm. Synthetic monthly distribution; raw deployment-id history is in the audit panel.",docId:"floodnet",citeId:"floodnet",mapLayer:"floodnet"}}function Sn(n){var p;const e=M(n.nyc311);if(!e)return null;const t=w(e.n)??0;if(t<=0)return null;const r=M(e.by_year),s=M(e.by_descriptor),d=r?Object.values(r).map(_=>w(_)??0):Array.from({length:12},()=>Math.round(t/12)),o=s?(p=Object.entries(s).sort((_,l)=>(w(l[1])??0)-(w(_[1])??0))[0])==null?void 0:p[0]:null;return{id:"fsm-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests (Socrata erm2-nwe9)",vintage:X,title:"Recent 311 flood complaints",headline:`${t} calls`,subhead:o?`top descriptor: ${o}`:"all flood-related descriptors",histogram:d,sparkSub:`Within ${w(e.radius_m)??200} m · ${w(e.years)??5} y window. Filtered to flood-relevant descriptors.`,docId:"nyc311",citeId:"nyc311",mapLayer:"complaints"}}function xn(n){var r;const e=M(n.nws_obs);if(!e||e.error||e.station_id==null)return null;const t=[];return w(e.precip_last_hour_mm)!=null&&t.push({value:`${e.precip_last_hour_mm} mm`,label:"precip · 1h"}),w(e.precip_last_6h_mm)!=null&&t.push({value:`${e.precip_last_6h_mm} mm`,label:"precip · 6h"}),t.length?{id:"fsm-nws-obs",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:`NWS ASOS station ${C(e.station_id)??"?"}`,vintage:((r=C(e.obs_time))==null?void 0:r.slice(0,10))??X,title:"Recent precipitation",scalars:t,sub:`Nearest hourly METAR: ${C(e.station_name)??"?"} (${w(e.distance_km)??"?"} km).`,docId:"nws_obs",citeId:"nws_obs",mapLayer:"nws"}:null}function kn(n){var r;const e=M(n.noaa_tides);if(!e||e.error||w(e.observed_ft_mllw)==null)return null;const t=[{value:`${e.observed_ft_mllw} ft`,label:"observed (MLLW)"}];return w(e.predicted_ft_mllw)!=null&&t.push({value:`${e.predicted_ft_mllw} ft`,label:"predicted"}),w(e.residual_ft)!=null&&t.push({value:`${e.residual_ft} ft`,label:"residual"}),{id:"fsm-noaa",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NOAA CO-OPS",agency:`NOAA tide gauge ${C(e.station_name)??C(e.station_id)??"?"}`,vintage:((r=C(e.obs_time))==null?void 0:r.slice(0,10))??X,title:"Live water level (nearest tide gauge)",scalars:t,sub:"Residual = observed − astronomical tide; positive residual is wind / surge component.",docId:"noaa_tides",citeId:"noaa_tides",mapLayer:"noaa"}}function An(n){var r;const e=M(n.prithvi_live);if(!(e!=null&&e.ok))return null;const t=(r=C(e.item_datetime))==null?void 0:r.slice(0,10);return{id:"fsm-prithvi-live",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC-Pluvial",agency:"NASA-IBM Prithvi v2 · NYC fine-tune",vintage:t?`${t} · Sentinel-2`:"Sentinel-2",title:"Pluvial flood prediction · Prithvi-NYC-Pluvial",rasterKind:"prithvi",headline:`${w(e.pct_water_within_500m)??0}% flooded`,subhead:`water within 500 m · cloud ${w(e.cloud_cover)??"?"}%`,sub:"Test flood IoU 0.5979 on held-out NYC chips. Model interpretation, not a measurement.",illustrative:!0,docId:"prithvi_live",citeId:"prithvi_live",mapLayer:"prithvi-pluvial"}}const $n={urban:"#C66",water:"#5B7FB4",vegetation:"#5B8A4A",barren:"#A89A78",wetland:"#D9C75A"};function Nn(n){const e=M(n.terramind_lulc);if(!(e!=null&&e.ok))return null;const t=M(e.class_fractions)??{},r={urban:0,water:0,vegetation:0,barren:0,wetland:0};for(const[d,o]of Object.entries(t)){const p=d.toLowerCase();p.includes("urban")||p.includes("built")||p.includes("impervious")?r.urban+=o:p.includes("water")?r.water+=o:p.includes("tree")||p.includes("vegetation")||p.includes("crop")||p.includes("grass")?r.vegetation+=o:p.includes("bare")||p.includes("barren")||p.includes("soil")?r.barren+=o:p.includes("wet")||p.includes("marsh")?r.wetland+=o:r.barren+=o}const s=Object.entries(r).filter(([,d])=>d>0).map(([d,o])=>({k:d,pct:Math.round(o),color:$n[d]}));return{id:"fsm-tm-lulc",stone:"touchstone",tier:"synthetic",variant:"lulc",source:"TerraMind v1.2",agency:"IBM TerraMind v1.2 · Sentinel-2 inputs",vintage:"Sentinel-2",title:"Land use / land cover · TerraMind v1.2",rasterKind:"lulc",classMix:s.length?s:void 0,sub:"Synthetic prior. LULC palette is a layer convention, not a tier signal.",illustrative:!0,docId:"tm_lulc",citeId:"tm_lulc",mapLayer:"terramind-lulc"}}function Tn(n){const e=M(n.ttm_forecast);if(!(e!=null&&e.available)||!e.interesting)return null;const t=w(e.forecast_peak_ft),r=w(e.forecast_peak_minutes_ahead);return t==null||r==null?null:{id:"fsm-ttm-fc",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 (zero-shot)",agency:"IBM Granite-TimeSeries · regional",vintage:X,title:"Storm surge nowcast at The Battery — 9.6 h horizon (regional)",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:`${t} ft @ +${Math.round(r/60)}h`},headline:`${t} ft`,subhead:"peak surge residual · 9.6h horizon · 6-min cadence",sub:"Regional disclosure. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · Battery, not point-of-query",docId:"ttm_forecast",citeId:"ttm_forecast"}}function Cn(n){const e=M(n.ttm_battery_surge);if(!(e!=null&&e.available)||!e.interesting)return null;const t=w(e.forecast_peak_m),r=w(e.forecast_peak_hours_ahead);return t==null||r==null?null:{id:"fsm-ttm-batt",stone:"lodestone",tier:"modeled",variant:"timeseries-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 · NYC-specialized fine-tune",vintage:X,title:"Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)",timeseries:{hours:96,peak:{x:r,y:Math.round(t*100)},peakLabel:`${(t*100).toFixed(0)} cm @ +${r}h`},headline:`${(t*100).toFixed(0)} cm`,subhead:"peak surge · 96h horizon · hourly cadence",sub:"Fine-tuned on NYC tide-gauge history. Hourly cadence; applies city-wide via NOAA station 8518750.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery",citeId:"ttm_battery",hfModelCard:"huggingface.co/msradam/Granite-TTM-r2-Battery-Surge",rmse:"0.157 m",skillVsPersistence:"−35% vs persistence",hardwareBadge:"MI300X"}}function In(n){const e=M(n.nws_alerts);if(!e)return null;const t=w(e.n_active)??0;if(t<=0)return null;const r=Array.isArray(e.alerts)?e.alerts:[];return{id:"fsm-nws-alerts",stone:"lodestone",tier:"modeled",variant:"tabular",source:"NWS",agency:"NWS Public Alerts API · flood-relevant filter",vintage:X,title:`${t} active flood-relevant alert${t===1?"":"s"}`,columns:["event","severity","expires"],rows:r.slice(0,4).map(s=>[C(s.event)??"?",C(s.severity)??"?",(C(s.expires)??"").slice(0,16)]),sub:"Live NWS feed. If a FLOOD or FLASH FLOOD WARNING is in this list, foreground it.",docId:"nws_alerts",citeId:"nws_alerts"}}function Mn(n,e){var q;const t=n.mellea??{},r=Array.isArray(t.requirements_passed)?t.requirements_passed:Array.isArray(t.passed)?t.passed:[],s=Array.isArray(t.requirements_failed)?t.requirements_failed:Array.isArray(t.failed)?t.failed:[],d=r.length,o=s.length,p=(typeof t.requirements_total=="number"?t.requirements_total:d+o)||4,_=typeof t.n_attempts=="number"?t.n_attempts:typeof t.attempts=="number"?t.attempts:0,c=(typeof t.rerolls=="number"?t.rerolls:null)??Math.max(0,_-1),g=((q=n.citations)==null?void 0:q.length)??0;return{id:"fsm-capstone-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · Granite 4.1 + Mellea grounding check",vintage:X,title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:`${c} reroll${c===1?"":"s"}`},{k:"grounding checks",v:`${d}/${p} passed`},{k:"citations resolved",v:`${g}`},{k:"wall-clock",v:e!=null?`${e.toFixed(1)} s`:"—"}],sub:"Capstone produces prose, not cards. This meta-card is the integrity-narration UI for the entire pipeline.",docId:"capstone"}}function nt(n,e,t,r=!0){const s=n??{},d=M(s.geocode);return{cards:[fn(s,d),_n(s),hn(s),vn(s),gn(s),yn(s),bn(s),wn(s),Sn(s),xn(s),kn(s),An(s),Nn(s),In(s),Tn(s),Cn(s),r?Mn(n??{},t):null].filter(p=>p!=null),stones:mn(e),wallSeconds:t}}function qn(n,e,t,r){const d={sandy_inundation:"sandy",dep_stormwater:"dep",floodnet:"floodnet",nyc311:"nyc311",noaa_tides:"noaa_tides",nws_alerts:"nws_alerts",nws_obs:"nws_obs",ttm_forecast:"ttm_forecast",ttm_311_forecast:"ttm_311_forecast",ttm_battery_surge:"ttm_battery_surge",floodnet_forecast:"floodnet_forecast",ida_hwm_2021:"ida_hwm",prithvi_eo_v2:"prithvi_water",prithvi_eo_live:"prithvi_live",microtopo_lidar:"microtopo",mta_entrance_exposure:"mta_entrances",nycha_development_exposure:"nycha_developments",doe_school_exposure:"doe_schools",doh_hospital_exposure:"doh_hospitals",terramind_synthesis:"terramind",terramind_lulc:"terramind_lulc",terramind_buildings:"terramind_buildings",eo_chip_fetch:"eo_chip",geocode:"geocode"}[e];if(!d)return[];if(e==="sandy_inundation"){const o=t;n[d]=r&&(o==null?void 0:o.inside)===!0?!0:r?!1:null}else if(e==="dep_stormwater"){const o=t??{},p={};for(const[_,l]of Object.entries(o)){const c=typeof l=="string"?l:"";c&&(p[_]={depth_class:1,depth_label:c})}n[d]=Object.keys(p).length?p:null}else r&&t!=null?n[d]=t:n[d]=null;return[d]}const Se={subway:"MTA · USGS · FEMA · NYC OEM · NYC DEP",nycha:"NYC HA · USGS · NYC OEM · NYC DEP",school:"NYC DOE · USGS · NYC OEM · NYC DEP",hospital:"NYS DOH · USGS · NYC OEM · NYC DEP"},xe={subway:"subway entrances",nycha:"NYCHA developments",school:"public schools",hospital:"hospitals"};function ke(n){return!n||!Number.isFinite(n)?"—":`${Math.round(n)}m`}function Ae(n){return n==null||!Number.isFinite(n)?"—":`${(n*3.28084).toFixed(1)} ft`}function $e(n,e){return typeof e=="number"?e>=.5?`Inundated 2012 (${Math.round(e*100)}%)`:e>0?`Edge (${Math.round(e*100)}%)`:"—":n?"Inundated 2012":"—"}function Ne(n,e,t){return typeof t=="number"?t>=.5?`≥${Math.round(t*100)}% in scenario`:t>0?`${Math.round(t*100)}% edge`:"minimal":n&&n.length?n:e&&e>0?`class ${e}`:"minimal"}function Fn(n){return n?/elevator|easement|stair.*ramp/i.test(n):!1}function Ln(n){if(!n.available)return null;const t=(n.entrances??[]).map(r=>{const s=Fn(r.entrance_type);return{name:`${r.station_name??"?"}${r.daytime_routes?` (${String(r.daytime_routes).split(/\s+/).slice(0,3).join("/")})`:""}`,elev:Ae(r.elev_m),ada:s,fema:"Zone X",sandy:$e(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"subway",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}});return{type:xe.subway,radius:ke(n.radius_m),count:n.n_entrances??t.length,rows:t,sourceLabel:Se.subway}}function En(n){if(!n.available)return null;const t=(n.developments??[]).map(r=>{const s=r.pct_inside_sandy_2012,d=r.pct_in_dep_extreme_2080;return{name:`${r.development??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Ae(r.rep_elevation_m),ada:!1,fema:"—",sandy:$e(void 0,s),dep:Ne(void 0,void 0,d),asset:"nycha",primaryTier:s&&s>0?"empirical":"modeled"}});return{type:xe.nycha,radius:ke(n.radius_m),count:n.n_developments??t.length,rows:t,sourceLabel:Se.nycha}}function jn(n){if(!n.available)return null;const t=(n.schools??[]).map(r=>({name:`${r.school_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Ae(r.elev_m),ada:!1,fema:"—",sandy:$e(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"school",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:xe.school,radius:ke(n.radius_m),count:n.n_schools??t.length,rows:t,sourceLabel:Se.school}}function Pn(n){if(!n.available)return null;const t=(n.hospitals??[]).map(r=>({name:`${r.facility_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Ae(r.elev_m),ada:!0,fema:"—",sandy:$e(r.inside_sandy_2012),dep:Ne(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"hospital",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:xe.hospital,radius:ke(n.radius_m),count:n.n_hospitals??t.length,rows:t,sourceLabel:Se.hospital}}function On(n){if(!n)return[];const e=[],t=Ln(n.mta_entrances??{});t&&t.rows.length&&e.push(t);const r=En(n.nycha_developments??{});r&&r.rows.length&&e.push(r);const s=jn(n.doe_schools??{});s&&s.rows.length&&e.push(s);const d=Pn(n.doh_hospitals??{});return d&&d.rows.length&&e.push(d),e}function zn(n,e){const t=`/api/agent/stream?q=${encodeURIComponent(n)}`,r=new EventSource(t);let s="",d;const o=/([.?!])(\s|$)/;function p(l=!1){var g,q;let c;for(;c=o.exec(s);){const Y=c.index+c[1].length+(c[2]?c[2].length:0),P=s.slice(0,Y).trim();s=s.slice(Y),P&&((g=e.onSentence)==null||g.call(e,P,d))}l&&s.trim()&&((q=e.onSentence)==null||q.call(e,s.trim(),d),s="")}function _(l,c){r.addEventListener(l,g=>{try{c(JSON.parse(g.data))}catch{}})}return _("hello",l=>{var c;return(c=e.onHello)==null?void 0:c.call(e,l.query)}),_("plan_token",l=>{var c;return(c=e.onPlanToken)==null?void 0:c.call(e,l.delta)}),_("plan",l=>{var c;return(c=e.onPlan)==null?void 0:c.call(e,l)}),_("step",l=>{var c;return(c=e.onStep)==null?void 0:c.call(e,l)}),_("token",l=>{var c,g;l.attempt!==d&&(d=l.attempt,s="",(c=e.onAttemptStart)==null||c.call(e,l.attempt??1)),(g=e.onToken)==null||g.call(e,l.delta,l.attempt),s+=l.delta,p(!1)}),_("mellea_attempt",l=>{var c;return(c=e.onMelleaAttempt)==null?void 0:c.call(e,l)}),_("final",l=>{var c;p(!0),(c=e.onFinal)==null||c.call(e,l)}),_("error",l=>{var c;return(c=e.onError)==null?void 0:c.call(e,l.err)}),r.addEventListener("done",()=>{var l;p(!0),(l=e.onDone)==null||l.call(e),r.close()}),r.addEventListener("error",()=>{var l;p(!0),(l=e.onError)==null||l.call(e,"SSE connection error"),r.close()}),{close:()=>r.close()}}const ft=[{key:"status",label:"Status",n:"01",aliases:["status"]},{key:"empirical",label:"Empirical evidence",n:"02",tier:"empirical",aliases:["empirical evidence","empirical"]},{key:"modeled",label:"Modeled scenarios",n:"03",tier:"modeled",aliases:["modeled scenarios","modeled"]},{key:"policy",label:"Policy context",n:"04",aliases:["policy context","policy"]}];function rt(n){const e=n.toLowerCase().replace(/[.:]+\s*$/,"").trim();return ft.find(t=>t.aliases.includes(e))}const it=/(^|\n)\s*(?:\*\*([A-Z][A-Za-z\s/]+?)\.\s*\*\*|#{1,3}\s*(0[1-4])\s*[:\-—.]?\s*([^\n]+))/g;function _t(n,e,t){return{id:e,n,tier:ut(e),source:(t==null?void 0:t.source)??e.split(/[_-]/)[0].toUpperCase(),title:(t==null?void 0:t.title)??e,docId:e,url:(t==null?void 0:t.url)??"",vintage:(t==null?void 0:t.vintage)??"",retrieved:(t==null?void 0:t.retrieved)??""}}const Dn=/\[([a-z][a-z0-9_]*(?:\s*,\s*[a-z][a-z0-9_]*)*)\]/gi;function at(n){return n.split(new RegExp("(?<=[.!?])\\s+(?=[A-Z(])","g")).filter(t=>t.trim().length>0)}function st(n,e,t){let r=0;const s=[],d=[...n.matchAll(Dn)];if(d.length===0)return[{text:n}];for(const o of d){const p=n.slice(r,o.index??0),_=o[1].split(/\s*,\s*/).filter(Boolean);r=(o.index??0)+o[0].length;const l=ut(_[0]);s.push({text:p,tier:l,cite:_[0]});for(const c of _)e[c]||(e[c]=t(c))}if(r<n.length){const o=n.slice(r);o.trim()&&s.push({text:o})}return s}function Rn(n,e={}){const t={...e};let r=Object.values(t).reduce((l,c)=>Math.max(l,c.n),0)+1;const s=new Set,d=l=>(e[l]||s.add(l),_t(r++,l)),o=[],p=[];let _;for(it.lastIndex=0;_=it.exec(n);)if(_[2]!==void 0){const l=rt(_[2]);if(!l)continue;p.push({num:l.n,label:l.label,tier:l.tier,start:_.index+_[1].length,bodyStart:_.index+_[0].length})}else if(_[3]!==void 0){const l=_[3],c=(_[4]??"").trim(),g=ft.find(q=>q.n===l)??rt(c);p.push({num:l,label:(g==null?void 0:g.label)??c,tier:g==null?void 0:g.tier,titleExtra:g&&c.toLowerCase()!==g.label.toLowerCase()?c:void 0,start:_.index+_[1].length,bodyStart:_.index+_[0].length})}for(let l=0;l<p.length;l++){const c=p[l],g=p[l+1],q=n.slice(c.bodyStart,g?g.start:n.length).trim();if(q){o.push({kind:"head",n:c.num,label:c.label,tier:c.tier,title:c.titleExtra});for(const Y of q.split(/\n\s*\n/)){const P=Y.replace(/\s+/g," ").trim();if(!P)continue;const W=at(P),T=[];for(const K of W)T.push(...st(K,t,d)),T.push({text:" "});for(;T.length&&T[T.length-1].text.trim()===""&&!T[T.length-1].tier;)T.pop();T.length&&o.push({kind:"prose",parts:T})}}}if(o.length===0&&n.trim()){o.push({kind:"head",n:"01",label:"Status"});const l=n.replace(/\s+/g," ").trim(),c=at(l),g=[];for(const q of c)g.push(...st(q,t,d)),g.push({text:" "});for(;g.length&&g[g.length-1].text.trim()===""&&!g[g.length-1].tier;)g.pop();g.length&&o.push({kind:"prose",parts:g})}return{blocks:o,citations:t,unresolvedDocIds:[...s]}}const le={type:"FeatureCollection",features:[]};async function re(n){try{const e=await fetch(n);if(!e.ok)return le;const t=await e.json();return!t||t.type!=="FeatureCollection"?le:t}catch{return le}}async function Yn(n,e,t=1500){return re(`/api/layers/sandy?lat=${n}&lon=${e}&r=${t}`)}async function Bn(n,e,t=1500){return re(`/api/layers/dep_extreme_2080?lat=${n}&lon=${e}&r=${t}`)}async function ot(n,e,t=1500){return re(`/api/layers/prithvi_water?lat=${n}&lon=${e}&r=${t}`)}async function Hn(n){return re(`/api/layers/sandy_clipped?code=${encodeURIComponent(n)}`)}async function Un(n,e="dep_extreme_2080"){return re(`/api/layers/dep_clipped?code=${encodeURIComponent(n)}&scenario=${e}`)}async function lt(n,e,t=1500){return re(`/api/layers/ida_hwm?lat=${n}&lon=${e}&r=${t}`)}async function ct(n,e,t=1500){try{const r=await fetch(`/api/floodnet_near?lat=${n}&lon=${e}&r=${t}`);return r.ok?{type:"FeatureCollection",features:(await r.json()).features.map(o=>{const p=o.properties??{};return{...o,properties:{...p,count:typeof p.n_events_3y=="number"?p.n_events_3y:1}}})}:le}catch{return le}}var Gn=j('<span class="region-head-meta svelte-1q8jizq"> <!></span>'),Wn=j('<span class="region-head-meta svelte-1q8jizq">planning…</span>'),Kn=j('<div class="reroll-prev svelte-1q8jizq" aria-hidden="true"><p class="reroll-prev-line svelte-1q8jizq"> </p></div>'),Vn=j("<!> <!>",1),Zn=j('<span class="streaming-caret svelte-1q8jizq" aria-hidden="true">▍</span>'),Jn=j("<!> <!>",1),Xn=j('<details class="plan-details svelte-1q8jizq"><summary class="svelte-1q8jizq"> </summary> <pre class="plan-stream svelte-1q8jizq"> </pre></details>'),Qn=j('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Planning intent… <!></div>'),er=j('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Resolving address…</div>'),tr=j("<!> <!>",1),nr=j('<span class="region-head-meta svelte-1q8jizq"> </span>'),rr=j('<span class="region-head-meta svelte-1q8jizq">awaiting geocode…</span>'),ir=j('<div style="position: relative; flex: 1; min-height: 0;" class="svelte-1q8jizq"><!> <!></div>'),ar=j('<section class="hero-band svelte-1q8jizq"><div class="hero-band-inner svelte-1q8jizq"><div class="app-shell-top is-desktop svelte-1q8jizq"><main id="region-briefing" class="app-region app-region-brief svelte-1q8jizq" aria-labelledby="brief-h1"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Briefing</span> <!></header> <h1 id="brief-h1" class="brief-h1 svelte-1q8jizq">Flood-exposure briefing <span class="brief-h1-addr svelte-1q8jizq"> </span></h1> <!></main> <div class="app-region-side svelte-1q8jizq" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map svelte-1q8jizq" aria-label="Map region"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Map</span> <!></header> <!></aside> <aside id="region-cites" class="app-region app-region-cites svelte-1q8jizq" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom svelte-1q8jizq"><section class="app-region app-region-findings svelte-1q8jizq" aria-label="Findings"><!></section></div></div></section>');function gr(n,e){zt(e,!0);let t=ne(()=>Yt.params.queryId??""),r=ne(()=>()=>{try{return decodeURIComponent(a(t))}catch{return a(t)}}),s=k(null),d=k(""),o=k(""),p=k(null),_=k(!1),l=k(0),c=2,g=k(!1),q=k(!1),Y=k(""),P=k(null),W=k(te([])),T=k(te({id:"root",name:"briefing.run",status:"ok",ms:0,tier:null,children:[]})),K=k(null),ce="comfortable",Te="smart",de=k(!1);De(()=>{typeof window<"u"&&v(de,new URL(window.location.href).searchParams.get("grammar")==="1")});let ie=k(null),V=k(void 0),D=te({}),Q=k(0),Ce=ne(()=>{if(a(Q),a(p)){const u={...D,...a(p)};return nt(u,a(T),a(V),!0)}return nt(D,a(T),a(V),!1)});function ue(u){v(K,u,!0)}function ht(u){const i=document.getElementById("region-cites");i&&i.scrollIntoView({behavior:"smooth",block:"start"})}const He=new Set(["ttm_forecast","ttm_311_forecast","floodnet_forecast"]),Ie="group-ttm-r2";function vt(u,i,f,m){if(m==="error")return f??void 0;if(m==="silent")return f??"no data";if(i==null||typeof i!="object")return;const x=i,h={sandy_inundation:["inside"],dep_stormwater:["dep_extreme_2080","dep_moderate_2050"],floodnet:["n_sensors","n_events_3y"],nyc311:["n"],noaa_tides:["observed_ft_mllw","residual_ft","station"],nws_alerts:["n_active"],nws_obs:["p1h_mm","p6h_mm","station"],ttm_forecast:["forecast_peak_ft","forecast_peak_min_ahead"],ttm_311_forecast:["forecast_mean","forecast_peak","accelerating"],ida_hwm_2021:["n_within_800m","max_height_above_gnd_ft"],prithvi_eo_v2:["inside_water_polygon","nearest_distance_m"],prithvi_eo_live:["scene_date","pct_water_500m"],microtopo_lidar:["elev_m","pct_200m","relief_m"],mta_entrance_exposure:["n_entrances","n_inside_sandy_2012","n_in_dep_extreme_2080"],nycha_development_exposure:["n_developments","n_majority_inside_sandy_2012"],doe_school_exposure:["n_schools","n_inside_sandy_2012"],doh_hospital_exposure:["n_hospitals","n_inside_sandy_2012"],floodnet_forecast:["sensor_id","distance_m","forecast_28d","accelerating"],terramind_synthesis:["tim_chain","dem_mean_m"],rag_granite_embedding:["hits"],gliner_extract:["sources"]}[u],E=[];if(h){for(const F of h)if(x[F]!==void 0&&E.push(Ge(F,x[F])),E.length>=3)break}else for(const[F,$]of Object.entries(x))if($!==null&&typeof $!="object"&&(E.push(Ge(F,$)),E.length>=2))break;return E.join(" · ")||void 0}function gt(u){const i=[],f=u.mta_entrances;if(f&&Array.isArray(f.entrances))for(const h of f.entrances){const E=Number(h.entrance_lat),F=Number(h.entrance_lon);!Number.isFinite(E)||!Number.isFinite(F)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[F,E]},properties:{kind:"subway",name:`${h.station_name??"?"} (${h.daytime_routes??"?"})`,doc_id:`mta_entrance_${h.station_id??""}`,inside_sandy_2012:h.inside_sandy_2012===!0}})}const m=u.doe_schools;if(m&&Array.isArray(m.schools))for(const h of m.schools){const E=Number(h.school_lat),F=Number(h.school_lon);!Number.isFinite(E)||!Number.isFinite(F)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[F,E]},properties:{kind:"school",name:String(h.loc_name??h.school_name??"?"),doc_id:`doe_school_${h.loc_code??""}`,inside_sandy_2012:h.inside_sandy_2012===!0}})}const x=u.nycha_developments;if(x&&Array.isArray(x.developments))for(const h of x.developments){const E=Number(h.centroid_lat),F=Number(h.centroid_lon);if(!Number.isFinite(E)||!Number.isFinite(F))continue;const $=Number(h.pct_inside_sandy_2012??0);i.push({type:"Feature",geometry:{type:"Point",coordinates:[F,E]},properties:{kind:"nycha",name:String(h.development??"?"),doc_id:`nycha_dev_${h.tds_num??""}`,inside_sandy_2012:$>=50,pct_inside_sandy:$}})}const y=u.doh_hospitals;if(y&&Array.isArray(y.hospitals))for(const h of y.hospitals){const E=Number(h.hospital_lat),F=Number(h.hospital_lon);!Number.isFinite(E)||!Number.isFinite(F)||i.push({type:"Feature",geometry:{type:"Point",coordinates:[F,E]},properties:{kind:"hospital",name:String(h.facility_name??"?"),doc_id:`nyc_hospital_${h.fac_id??""}`,inside_sandy_2012:h.inside_sandy_2012===!0}})}return{type:"FeatureCollection",features:i}}function yt(u){return{type:"FeatureCollection",features:[]}}function Ue(u){return 1+(u.children??[]).reduce((f,m)=>f+Ue(m),0)}function Ge(u,i){if(typeof i=="number"){const f=Number.isInteger(i)?`${i}`:i.toFixed(2);return`${u}=${f}`}if(typeof i=="boolean")return`${u}=${i}`;if(typeof i=="string"){const f=i.length>24?i.slice(0,22)+"…":i;return`${u}=${f}`}return u}let ae=k(te({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),J=k(null),pe=k(null),We=k(void 0),Ke=k(void 0),me=k(void 0),fe=k(void 0),_e=k(void 0),he=k(void 0),Me=k(void 0),ve=k(void 0),bt=ne(()=>{var u,i,f,m,x,y;return{empirical:(((u=a(me))==null?void 0:u.features.length)??0)+(((i=a(ve))==null?void 0:i.features.length)??0),modeled:((f=a(fe))==null?void 0:f.features.length)??0,synthetic:(((m=a(_e))==null?void 0:m.features.length)??0)+(((x=a(Me))==null?void 0:x.features.length)??0),proxy:((y=a(he))==null?void 0:y.features.length)??0}}),ee=k(te([])),se=k(te({})),ge=[];function wt(){var x;if(!a(o)){v(ee,[],!0),v(se,{},!0),ge=[];return}const u={};(x=a(p))!=null&&x.citations&&a(p).citations.forEach((y,h)=>{u[y.doc_id]=_t(h+1,y.doc_id,{source:y.source,title:y.title,url:y.url,vintage:y.vintage})});const i=Rn(a(o),u),f={};let m=1;for(const y of ge){const h=i.citations[y];h&&(f[y]={...h,n:m++})}for(const[y,h]of Object.entries(i.citations))f[y]||(f[y]={...h,n:m++},ge.push(y));v(ee,i.blocks,!0),v(se,f,!0)}De(()=>{a(o),a(p),wt()}),De(()=>{if(!a(J))return;const{lat:u,lon:i,source:f}=a(J);f==="nta"&&a(pe)?(Hn(a(pe)).then(m=>v(me,m,!0)),Un(a(pe)).then(m=>v(fe,m,!0)),ot(u,i,2500).then(m=>v(_e,m,!0)),ct(u,i,3e3).then(m=>v(he,m,!0)),lt(u,i,3e3).then(m=>v(ve,m,!0))):(Yn(u,i).then(m=>v(me,m,!0)),Bn(u,i).then(m=>v(fe,m,!0)),ot(u,i).then(m=>v(_e,m,!0)),ct(u,i).then(m=>v(he,m,!0)),lt(u,i).then(m=>v(ve,m,!0)))}),Dt(()=>{if(z.reset(),!a(r)())return;v(ie,Date.now(),!0),z.phase="planning";const u=zn(a(r)(),{onPlanToken:i=>v(d,a(d)+i),onPlan:i=>{var f;v(s,i,!0),z.phase="specialists",z.totalSpecialists=((f=i.specialists)==null?void 0:f.length)??0},onStep:i=>{if(new Set(["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"]).has(i.step)||(z.activeStep=i.step,i.ok&&(z.firedCount=z.firedCount+1)),qn(D,i.step,i.result,i.ok),v(Q,a(Q)+1),i.step==="geocode")if(i.ok&&i.result&&typeof i.result=="object"){const A=i.result;if(typeof A.lat=="number"&&typeof A.lon=="number"){const I=typeof A.address=="string"?A.address:a(r)();v(J,{label:I,lat:A.lat,lon:A.lon,source:"geocode"},!0),v(q,!0)}}else v(P,"geocoder");if(i.step==="nta_resolve"&&i.ok&&i.result&&typeof i.result=="object"){const A=i.result,I=Array.isArray(A.bbox)?A.bbox:null,B=typeof A.nta_code=="string"?A.nta_code:null;if(I&&I.length===4&&B){v(pe,B,!0);const H=(I[0]+I[2])/2,O=(I[1]+I[3])/2,U=typeof A.nta_name=="string"?A.nta_name:a(r)();v(J,{label:U,lat:O,lon:H,source:"nta"},!0)}}const m=Bt(i.step),x=i.ok?i.result==null&&i.err==null?"silent":"ok":"error",y=Math.round((i.elapsed_s??0)*1e3),h=i.result!=null?i.result:i.err??null,E=vt(i.step,i.result,i.err,x),F={id:`step-${Ue(a(T))}`,name:i.step,status:x,ms:y,tier:m,note:E,output:h,error:x==="error"?i.err??"unknown error":void 0,model:He.has(i.step)?"granite-timeseries-ttm-r2":void 0},$={...a(T),ms:(a(T).ms??0)+y};if(He.has(i.step)){const A=[...$.children??[]];let I=A.find(O=>O.id===Ie);I||(I={id:Ie,name:"forecasting.granite-timeseries-ttm-r2",status:"fan",ms:0,tier:"modeled",note:"1 instance",model:"granite-timeseries-ttm-r2",children:[]},A.push(I));const B=[...I.children??[],F],H={...I,ms:(I.ms??0)+y,note:`${B.length} instance${B.length===1?"":"s"}`,children:B};v(T,{...$,children:A.map(O=>O.id===Ie?H:O)},!0)}else v(T,{...$,children:[...$.children??[],F]},!0)},onAttemptStart:i=>{v(l,i,!0),z.phase="reconciling",z.attempt=i,z.activeStep="granite4.1 + mellea",i>1&&(v(Y,a(o),!0),v(o,""),ge=[])},onToken:i=>{a(g)||(v(g,!0),a(l)===0&&v(l,1),z.phase="streaming",z.attempt=Math.max(1,z.attempt)),v(o,a(o)+i)},onMelleaAttempt:i=>{i.attempt>0&&(v(l,i.attempt,!0),z.attempt=i.attempt)},onFinal:i=>{var y;v(p,i,!0),i.paragraph&&v(o,i.paragraph,!0),v(W,On(i),!0);const f=i;v(We,gt(f),!0),v(Ke,yt(),!0);const m=f.terramind;if(m!=null&&m.ok&&(m!=null&&m.polygons_geojson)){const h=m.polygons_geojson;(h==null?void 0:h.type)==="FeatureCollection"&&(((y=h.features)==null?void 0:y.length)??0)>0&&v(Me,h,!0)}const x=i.mellea;x&&x.failed&&x.failed.length>0&&x.attempts&&x.attempts>=c&&v(P,"grounding")},onError:i=>{const f=i.toLowerCase();(f.includes("connection")||f.includes("502")||f.includes("503")||f.includes("timeout")||f.includes("routing"))&&v(P,"backend"),z.markError(i)},onDone:()=>{var i,f,m,x,y;v(_,!0),a(ie)!=null&&v(V,(Date.now()-a(ie))/1e3),!a(g)&&!a(P)&&a(q)&&v(P,"all-silent"),!a(P)&&a(ee).length>0&&(Xt({queryId:a(t),queryText:a(r)(),intent:((i=a(s))==null?void 0:i.intent)??null,specialists:((m=(f=a(s))==null?void 0:f.specialists)==null?void 0:m.length)??0,blocks:a(ee),citations:a(se),generatedAt:new Date().toISOString(),attempts:((y=(x=a(p))==null?void 0:x.mellea)==null?void 0:y.attempts)??a(l)}),z.markReady())}});return()=>u.close()});var qe=ar(),Ve=S(qe),Fe=S(Ve),Le=S(Fe),Ee=S(Le),St=N(S(Ee),2);{var xt=u=>{var i=Gn(),f=S(i),m=N(f);{var x=y=>{var h=Ot("· ✓ done");L(y,h)};G(m,y=>{a(_)&&y(x)})}b(i),Z(()=>{var y;return R(f,`intent: ${a(s).intent??""} · ${((y=a(s).specialists)==null?void 0:y.length)??0??""} specialists · attempt ${a(l)??""} `)}),L(u,i)},kt=u=>{var i=Wn();L(u,i)};G(St,u=>{a(s)?u(xt):u(kt,-1)})}b(Ee);var je=N(Ee,2),Ze=N(S(je)),At=S(Ze,!0);b(Ze),b(je);var $t=N(je,2);{var Nt=u=>{dn(u,{get state(){return a(P)}})},Tt=u=>{var i=tr(),f=we(i);{var m=$=>{var A=Vn(),I=we(A);sn(I,{get attempt(){return a(l)},max:c});var B=N(I,2);{var H=O=>{var U=Kn(),ye=S(U),be=S(ye);b(ye),b(U),Z(ze=>R(be,`${ze??""}…`),[()=>a(Y).slice(0,360)]),L(O,U)};G(B,O=>{a(Y)&&O(H)})}L($,A)};G(f,$=>{a(l)>1&&$(m)})}var x=N(f,2);{var y=$=>{var A=Jn(),I=we(A);Ht(I,{get blocks(){return a(ee)},get citations(){return a(se)},streaming:!1});var B=N(I,2);{var H=O=>{var U=Zn();L(O,U)};G(B,O=>{a(_)||O(H)})}L($,A)},h=$=>{rn($)},E=$=>{var A=Qn(),I=N(S(A),2);{var B=H=>{var O=Xn(),U=S(O),ye=S(U);b(U);var be=N(U,2),ze=S(be,!0);b(be),b(O),Z(()=>{R(ye,`Planner streaming (${a(d).length??""} chars)`),R(ze,a(d))}),L(H,O)};G(I,H=>{a(d)&&H(B)})}b(A),L($,A)},F=$=>{var A=er();L($,A)};G(x,$=>{a(ee).length?$(y):a(q)&&!a(g)?$(h,1):a(s)?$(F,-1):$(E,2)})}L(u,i)};G($t,u=>{a(P)?u(Nt):u(Tt,-1)})}b(Le);var Je=N(Le,2),Pe=S(Je),Oe=S(Pe),Ct=N(S(Oe),2);{var It=u=>{var i=nr(),f=S(i);b(i),Z((m,x)=>R(f,`Carto Positron · z15 · ${m??""}°N ${x??""}°W`),[()=>a(J).lat.toFixed(4),()=>Math.abs(a(J).lon).toFixed(4)]),L(u,i)},Mt=u=>{var i=rr();L(u,i)};G(Ct,u=>{a(J)?u(It):u(Mt,-1)})}b(Oe);var qt=N(Oe,2);{var Ft=u=>{var i=ir(),f=S(i);Kt(f,{get address(){return a(J)},get activeLayers(){return a(ae)},get sandyEmpirical(){return a(me)},get depModeled(){return a(fe)},get syntheticPrior(){return a(_e)},get proxy311(){return a(he)},get idaHwm(){return a(ve)},get registerPoints(){return a(We)},get registerPolygons(){return a(Ke)},get terramindLulc(){return a(Me)},get linkedKey(){return a(K)}});var m=N(f,2);Vt(m,{get active(){return a(ae)},get featureCounts(){return a(bt)},onToggle:x=>v(ae,{...a(ae),[x]:!a(ae)[x]},!0)}),b(i),L(u,i)};G(qt,u=>{a(J)&&u(Ft)})}b(Pe);var Xe=N(Pe,2),Lt=S(Xe);Gt(Lt,{get citations(){return a(se)}}),b(Xe),b(Je),b(Fe);var Qe=N(Fe,2),et=S(Qe),Et=S(et);Wt(Et,{get data(){return a(Ce)},density:ce,provenanceMode:Te,get showGrammar(){return a(de)},get linkedKey(){return a(K)},onLink:ue,onCite:ht}),b(et),b(Qe),b(Ve),b(qe),Z(u=>R(At,u),[()=>a(r)()]),L(n,qe),Rt()}export{gr as component,vr as universal};
|
|
|
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{s as U,a as M,f as L,d as Qe,c as Rt,e as Yt,t as Ht}from"../chunks/CWw6qgC_.js";import{p as gt,c as h,o as i,s as A,f as ye,r as f,t as te,al as ie,a as yt,aR as et,a4 as C,a9 as me,am as Ve,a5 as y,ai as Ut}from"../chunks/BTUA7_xE.js";import{i as X}from"../chunks/Bd-v_9Ud.js";import{p as Gt}from"../chunks/CbyeixEA.js";import{t as bt,B as wt,T as xt,a as Wt}from"../chunks/BatqQaKj.js";import{e as qe,i as Je}from"../chunks/25_y8TFd.js";import{f as Kt,C as Vt,F as Zt,R as Jt,M as Xt}from"../chunks/BZuv-XBZ.js";import"../chunks/DixtWtwq.js";import{b as ge,a as Ze,s as Qt}from"../chunks/B0XoTt7U.js";import{p as ct}from"../chunks/CW0zSL4D.js";import{b as Z,p as en}from"../chunks/DxQlA7U2.js";const tn=!1,nn=!1,Ar=Object.freeze(Object.defineProperty({__proto__:null,prerender:tn,ssr:nn},Symbol.toStringTag,{value:"Module"})),St=[{key:"status",label:"Status",n:"01",aliases:["status"]},{key:"empirical",label:"Empirical evidence",n:"02",tier:"empirical",aliases:["empirical evidence","empirical"]},{key:"modeled",label:"Modeled scenarios",n:"03",tier:"modeled",aliases:["modeled scenarios","modeled"]},{key:"policy",label:"Policy context",n:"04",aliases:["policy context","policy"]}];function dt(n){const e=n.toLowerCase().replace(/[.:]+\s*$/,"").trim();return St.find(t=>t.aliases.includes(e))}const ut=/(^|\n)\s*(?:\*\*([A-Z][A-Za-z\s/]+?)\.\s*\*\*|#{1,3}\s*(0[1-4])\s*[:\-—.]?\s*([^\n]+))/g;function kt(n,e,t){return{id:e,n,tier:bt(e),source:(t==null?void 0:t.source)??e.split(/[_-]/)[0].toUpperCase(),title:(t==null?void 0:t.title)??e,docId:e,url:(t==null?void 0:t.url)??"",vintage:(t==null?void 0:t.vintage)??"",retrieved:(t==null?void 0:t.retrieved)??""}}const rn=/\[([a-z][a-z0-9_]*(?:\s*,\s*[a-z][a-z0-9_]*)*)\]/gi;function pt(n){return n.split(new RegExp("(?<=[.!?])\\s+(?=[A-Z(])","g")).filter(t=>t.trim().length>0)}function mt(n,e,t){let r=0;const s=[],c=[...n.matchAll(rn)];if(c.length===0)return[{text:n}];for(const o of c){const u=n.slice(r,o.index??0),_=o[1].split(/\s*,\s*/).filter(Boolean);r=(o.index??0)+o[0].length;const l=bt(_[0]);s.push({text:u,tier:l,cite:_[0]});for(const d of _)e[d]||(e[d]=t(d))}if(r<n.length){const o=n.slice(r);o.trim()&&s.push({text:o})}return s}function Xe(n,e={}){const t={...e};let r=Object.values(t).reduce((l,d)=>Math.max(l,d.n),0)+1;const s=new Set,c=l=>(e[l]||s.add(l),kt(r++,l)),o=[],u=[];let _;for(ut.lastIndex=0;_=ut.exec(n);)if(_[2]!==void 0){const l=dt(_[2]);if(!l)continue;u.push({num:l.n,label:l.label,tier:l.tier,start:_.index+_[1].length,bodyStart:_.index+_[0].length})}else if(_[3]!==void 0){const l=_[3],d=(_[4]??"").trim(),b=St.find(E=>E.n===l)??dt(d);u.push({num:l,label:(b==null?void 0:b.label)??d,tier:b==null?void 0:b.tier,titleExtra:b&&d.toLowerCase()!==b.label.toLowerCase()?d:void 0,start:_.index+_[1].length,bodyStart:_.index+_[0].length})}for(let l=0;l<u.length;l++){const d=u[l],b=u[l+1],E=n.slice(d.bodyStart,b?b.start:n.length).trim();if(E){o.push({kind:"head",n:d.num,label:d.label,tier:d.tier,title:d.titleExtra});for(const G of E.split(/\n\s*\n/)){const z=G.replace(/\s+/g," ").trim();if(!z)continue;const ne=pt(z),$=[];for(const N of ne)$.push(...mt(N,t,c)),$.push({text:" "});for(;$.length&&$[$.length-1].text.trim()===""&&!$[$.length-1].tier;)$.pop();$.length&&o.push({kind:"prose",parts:$})}}}if(o.length===0&&n.trim()){o.push({kind:"head",n:"01",label:"Status"});const l=n.replace(/\s+/g," ").trim(),d=pt(l),b=[];for(const E of d)b.push(...mt(E,t,c)),b.push({text:" "});for(;b.length&&b[b.length-1].text.trim()===""&&!b[b.length-1].tier;)b.pop();b.length&&o.push({kind:"prose",parts:b})}return{blocks:o,citations:t,unresolvedDocIds:[...s]}}var an=L('<span class="compare-delta-ctx svelte-rr14x0"> </span>'),sn=L('<div class="compare-delta-row svelte-rr14x0"><span class="compare-delta-section svelte-rr14x0"> </span> <span class="compare-delta-claim svelte-rr14x0"><!> <strong class="compare-delta-a svelte-rr14x0"> </strong> <span class="compare-delta-vs svelte-rr14x0">vs</span> <strong class="compare-delta-b svelte-rr14x0"> </strong></span></div>'),on=L('<div class="compare-delta-bar svelte-rr14x0" aria-label="Key differences"><span class="compare-delta-title svelte-rr14x0">Key differences</span> <div class="compare-delta-rows svelte-rr14x0"></div></div>'),ln=L('<div class="compare-divider svelte-rr14x0" role="separator" aria-hidden="true"></div>'),cn=L('<div class="compare-col svelte-rr14x0"><h2 class="compare-address-header address-header svelte-rr14x0"> </h2> <!></div> <!>',1),dn=L('<div class="compare-layout svelte-rr14x0"><!> <div class="compare-cols svelte-rr14x0"></div></div>');function un(n,e){gt(e,!0);function t(N){return N.split(/\n\s*---\s*\n/,2).map((I,B)=>{var H,V;const j=/^##\s+PLACE\s+[AB]:\s+(.+?)(\n|$)/m.exec(I.trim()),P=((H=j==null?void 0:j[1])==null?void 0:H.trim())??((V=e.targets[B])==null?void 0:V.address)??`Place ${String.fromCharCode(65+B)}`,q=I.replace(/^##\s+PLACE\s+[AB]:\s+.+(\n|$)/m,"").trim();return{address:P,md:q}})}const r=ie(()=>t(e.paragraph)),s=ie(()=>{var N;return Xe(((N=i(r)[0])==null?void 0:N.md)??"",e.citations)}),c=ie(()=>{var N;return Xe(((N=i(r)[1])==null?void 0:N.md)??"",e.citations)}),o=ie(()=>({...e.citations,...i(s).citations,...i(c).citations}));function u(N){const D=new Map;let I="";for(const B of N)B.kind==="head"?I=B.n:B.kind==="prose"&&I&&D.set(I,(D.get(I)??"")+" "+B.parts.map(j=>j.text).join(""));return D}const _=/\b(\d[\d,]*(?:\.\d+)?)\s*(%|ft|m|km|mm)?\b/g;function l(N){const D=[];let I;for(_.lastIndex=0;(I=_.exec(N))!==null;){const B=I[1]+(I[2]??"");D.push({full:B,start:I.index})}return D}function d(N,D){return N.slice(Math.max(0,D-40),D).trim().split(/\s+/).slice(-3).join(" ")}const b={"01":"Status","02":"Empirical","03":"Modeled","04":"Policy"},E=ie(()=>{const N=u(i(s).blocks),D=u(i(c).blocks),I=[];for(const[B,j]of Object.entries(b)){const P=N.get(B)??"",q=D.get(B)??"";if(!P||!q)continue;const H=l(P),V=l(q);if(!H.length||!V.length)continue;const ae=Math.min(H.length,V.length);for(let W=0;W<ae;W++)if(H[W].full!==V[W].full){I.push({sectionLabel:j,ctx:d(P,H[W].start),aVal:H[W].full,bVal:V[W].full});break}}return I});var G=dn(),z=h(G);{var ne=N=>{var D=on(),I=A(h(D),2);qe(I,21,()=>i(E),Je,(B,j)=>{var P=sn(),q=h(P),H=h(q,!0);f(q);var V=A(q,2),ae=h(V);{var W=ve=>{var de=an(),xe=h(de);f(de),te(()=>U(xe,`${i(j).ctx??""}:`)),M(ve,de)};X(ae,ve=>{i(j).ctx&&ve(W)})}var le=A(ae,2),_e=h(le,!0);f(le);var we=A(le,4),ze=h(we,!0);f(we),f(V),f(P),te(()=>{U(H,i(j).sectionLabel),U(_e,i(j).aVal),U(ze,i(j).bVal)}),M(B,P)}),f(I),f(D),M(N,D)};X(z,N=>{i(E).length>0&&N(ne)})}var $=A(z,2);qe($,21,()=>i(r),Je,(N,D,I)=>{var B=cn(),j=ye(B),P=h(j),q=h(P,!0);f(P);var H=A(P,2);{let W=ie(()=>I===0?i(s).blocks:i(c).blocks);wt(H,{get blocks(){return i(W)},get citations(){return i(o)},streaming:!1})}f(j);var V=A(j,2);{var ae=W=>{var le=ln();M(W,le)};X(V,W=>{I===0&&W(ae)})}te(()=>U(q,i(r)[I].address)),M(N,B)}),f($),f(G),M(n,G),yt()}Qe(["click"]);Qe(["click"]);var pn=L('<div class="skeleton-section"><div class="skeleton-head"><span class="skeleton-num"> </span> <span class="skeleton-label"> </span> <span class="skeleton-spinner" aria-hidden="true">▍</span></div> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span> <span class="skeleton-pulse"></span></div>'),mn=L('<div class="skeleton-brief" role="status" aria-live="polite" aria-label="Loading briefing — geocode complete, dispatching specialists"><div class="skeleton-status"><span class="skeleton-pulse"></span> <span class="skeleton-pulse skeleton-pulse-meta"></span></div> <!></div>');function fn(n){const e=[{n:"01",label:"Status"},{n:"02",label:"Empirical evidence"},{n:"03",label:"Modeled scenarios"},{n:"04",label:"Policy context"}];var t=mn(),r=h(t),s=h(r);ge(s,"",{},{width:"62%"});var c=A(s,2);ge(c,"",{},{width:"40%"}),f(r);var o=A(r,2);qe(o,1,()=>e,u=>u.n,(u,_)=>{var l=pn(),d=h(l),b=h(d),E=h(b,!0);f(b);var G=A(b,2),z=h(G,!0);f(G),et(2),f(d);var ne=A(d,2);ge(ne,"",{},{width:"92%"});var $=A(ne,2);ge($,"",{},{width:"78%"});var N=A($,2);ge(N,"",{},{width:"85%"}),f(l),te(()=>{U(E,i(_).n),U(z,i(_).label)}),M(u,l)}),f(t),M(n,t)}var _n=L('<div class="reroll-banner" role="status" aria-live="polite"><!> <div class="reroll-body"><span class="reroll-head">Regenerating to satisfy citation grounding</span> <span class="reroll-sub"> </span></div> <span class="reroll-spinner" aria-hidden="true">↻</span></div>');function vn(n,e){let t=ct(e,"attempt",3,2),r=ct(e,"max",3,3);var s=_n(),c=h(s);xt(c,{tier:"modeled",size:11,color:"var(--tier-modeled)"});var o=A(c,2),u=A(h(o),2),_=h(u);f(u),f(o),et(2),f(s),te(()=>U(_,`Mellea reconciler · attempt ${t()??""} of ${r()??""} · previous draft dimmed below`)),M(n,s)}var hn=L("<a> </a>"),gn=L('<button type="button"> </button>'),yn=L('<article role="alert" aria-live="assertive"><header class="error-card-head"><!> <span class="error-card-eyebrow"> </span></header> <h3 class="error-card-headline"> </h3> <p class="error-card-body"> </p> <div class="error-card-actions"></div> <footer class="error-card-foot"><span class="section-label">Trust signals · still on</span> <span class="error-card-foot-copy">All foundation models Apache-2.0 · No commercial APIs at runtime</span></footer></article>');function bn(n,e){const t={geocoder:{eyebrow:"Address not resolved",headline:"We couldn't resolve that to a NYC address.",body:`Try a more specific street address — for example, "80 Pioneer Street, Brooklyn." Riprap covers the five boroughs only; international addresses, NJ addresses, and points outside NYC aren't supported.`,tier:"proxy",defaultActions:["Use a sample query","Edit query"]},"all-silent":{eyebrow:"Outside evidence coverage",headline:"No specialists found evidence at this point.",body:"The address resolved, but every flood-evidence specialist returned silent. This is rare and usually means parkland, water, or a point with no nearby 311, no FloodNet sensor, and no Sandy overlap. Try a nearby street address or expand to neighborhood-mode.",tier:"proxy",defaultActions:["Try nearby address","Switch to neighborhood-mode"]},grounding:{eyebrow:"Grounding failure",headline:"Briefing prose couldn't be composed within citation constraints.",body:"Mellea rejected all reroll attempts. The underlying evidence is fine — only the prose composition failed. Download the structured evidence below, or contact support.",tier:"modeled",defaultActions:["Download evidence (JSON)","Contact support","Try again"]},backend:{eyebrow:"Backend unavailable",headline:"All routing targets exhausted.",body:"LiteLLM tried Local Ollama → HF Space T4 → AMD MI300X and didn't reach a healthy backend. This usually clears within 5 minutes during a deploy window. The hardware-pill in the header is currently red.",tier:"proxy",defaultActions:["Retry now","Switch backend"]}};let r=ie(()=>t[e.state]),s=ie(()=>e.actions??i(r).defaultActions.map(ne=>({label:ne})));var c=yn(),o=h(c),u=h(o);xt(u,{get tier(){return i(r).tier},size:11,get color(){return`var(--tier-${i(r).tier??""})`}});var _=A(u,2),l=h(_,!0);f(_),f(o);var d=A(o,2),b=h(d,!0);f(d);var E=A(d,2),G=h(E,!0);f(E);var z=A(E,2);qe(z,21,()=>i(s),Je,(ne,$,N)=>{var D=Rt(),I=ye(D);{var B=P=>{var q=hn();Ze(q,1,"error-card-action",null,{},{"is-primary":N===0});var H=h(q,!0);f(q),te(()=>{Qt(q,"href",i($).href),U(H,i($).label)}),M(P,q)},j=P=>{var q=gn();Ze(q,1,"error-card-action",null,{},{"is-primary":N===0});var H=h(q,!0);f(q),te(()=>U(H,i($).label)),Yt("click",q,function(...V){var ae;(ae=i($).onClick)==null||ae.apply(this,V)}),M(P,q)};X(I,P=>{i($).href?P(B):P(j,-1)})}M(ne,D)}),f(z),et(2),f(c),te(()=>{Ze(c,1,`error-card error-card-${e.state??""}`),U(l,e.eyebrowOverride??i(r).eyebrow),U(b,e.headlineOverride??i(r).headline),U(G,e.bodyOverride??i(r).body)}),M(n,c)}Qe(["click"]);const ce="2026-05";function wn(n){return n==="fan"||n==="merge"?"fired":n==="silent"?"silent_by_design":n==="error"?"errored":"fired"}function At(n){return[n,...(n.children??[]).flatMap(At)]}function xn(n){const e=n.toLowerCase();return e==="sandy_inundation"||e==="sandy"||e==="dep_stormwater"||e==="dep"||e==="ida_hwm_2021"||e==="ida_hwm"||e==="prithvi_eo_v2"||e==="prithvi_water"||e==="microtopo_lidar"||e==="microtopo"?"cornerstone":e==="mta_entrance_exposure"||e==="mta_entrances"||e==="nycha_development_exposure"||e==="nycha_developments"||e==="doe_school_exposure"||e==="doe_schools"||e==="doh_hospital_exposure"||e==="doh_hospitals"||e==="terramind_synthesis"||e==="terramind"||e==="terramind_buildings"||e==="eo_chip_fetch"?"keystone":e==="floodnet"||e==="nyc311"||e==="nws_obs"||e==="noaa_tides"||e==="prithvi_eo_live"||e==="prithvi_live"||e==="terramind_lulc"?"touchstone":e==="nws_alerts"||e==="ttm_forecast"||e==="ttm_311_forecast"||e==="floodnet_forecast"||e==="ttm_battery_surge"?"lodestone":e.startsWith("reconcile")||e.startsWith("mellea")||e==="rag_granite_embedding"||e==="gliner_extract"?"capstone":null}function Sn(n){const e={cornerstone:[],keystone:[],touchstone:[],lodestone:[],capstone:[]};if(n)for(const t of At(n)){const r=xn(t.name);r&&e[r].push({id:t.id||t.name,name:t.name,status:wn(t.status),tier:t.tier,ms:t.ms,note:t.note??t.error??void 0})}return Object.keys(e).map(t=>({key:t,members:Kt(t,e[t])}))}function x(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function F(n){return typeof n=="string"?n:null}function O(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:null}function kn(n,e){return n.sandy!==!0?null:{id:"fsm-sandy",stone:"cornerstone",tier:"empirical",variant:"headline",source:"NYC OEM",agency:"NYC OpenData 5xsi-dfpx · Sandy 2012 inundation",vintage:"2012-10-29",title:"Hurricane Sandy 2012 inundation",headline:"Inside zone",subhead:(e&&F(e.address))??"address inside the empirical 2012 extent",body:"Address sits within the empirical Hurricane Sandy 2012 inundation extent. This is a historical fact, not a model prediction.",docId:"sandy",citeId:"sandy",mapLayer:"sandy"}}function An(n){const e=O(n.dep);if(!e)return null;const t=[];for(const[r,s]of Object.entries(e)){const c=O(s);if(!c)continue;const o=x(c.depth_class)??0;o<=0||t.push([r.replace("dep_",""),F(c.depth_label)??"—",`class ${o}`])}return t.length?{id:"fsm-dep",stone:"cornerstone",tier:"modeled",variant:"tabular",source:"NYC DEP",agency:"NYC Department of Environmental Protection · Stormwater Flood Maps",vintage:"2021",title:"Stormwater flood scenarios at this address",columns:["scenario","depth label","class"],rows:t,sub:`${t.length} scenario${t.length===1?"":"s"} place this lot in modeled flooding`,docId:"dep_stormwater",citeId:"dep",mapLayer:"stormwater"}:null}function Nn(n){const e=O(n.ida_hwm);if(!e)return null;const t=x(e.n_within_radius);if(!t||t<=0)return null;const r=[];return r.push(["count",`${t}`,`${x(e.radius_m)??800} m radius`]),x(e.max_height_above_gnd_ft)!=null&&r.push(["max above gnd",`${e.max_height_above_gnd_ft} ft`,"—"]),x(e.nearest_dist_m)!=null&&r.push(["nearest",F(e.nearest_site)??"HWM",`${e.nearest_dist_m} m`]),{id:"fsm-ida-hwm",stone:"cornerstone",tier:"empirical",variant:"tabular",source:"USGS",agency:"USGS STN Hurricane Ida 2021 high-water marks (Event 312)",vintage:"2021-09",title:"Hurricane Ida 2021 high-water marks nearby",columns:["field","value","context"],rows:r,docId:"ida_hwm",citeId:"ida_hwm",mapLayer:"hwm"}}function $n(n){const e=O(n.prithvi_water);if(!e)return null;const t=x(e.nearest_distance_m);return t==null?null:{id:"fsm-prithvi-water",stone:"cornerstone",tier:"modeled",variant:"raster",source:"Prithvi-EO 2.0",agency:"IBM/NASA Prithvi-EO 2.0 · baked Hurricane Ida 2021 polygons",vintage:"2021-09-02",title:"Hurricane Ida 2021 — satellite-attributable inundation",rasterKind:"prithvi",headline:e.inside_water_polygon?"Inside polygon":`${t} m away`,subhead:"pre/post HLS Sentinel-2 segmentation",sub:`${x(e.n_polygons_within_500m)??0} distinct polygons within 500 m`,docId:"prithvi_water",citeId:"prithvi_water",mapLayer:"prithvi"}}function Tn(n){const e=O(n.microtopo);if(!e)return null;const t=x(e.point_elev_m);if(t==null)return null;const r=[{value:`${t.toFixed(1)} m`,label:"elevation"}];return x(e.hand_m)!=null&&r.push({value:`${e.hand_m.toFixed(1)} m`,label:"HAND"}),x(e.twi)!=null&&r.push({value:`${e.twi.toFixed(1)}`,label:"TWI"}),x(e.rel_elev_pct_200m)!=null&&r.push({value:`${e.rel_elev_pct_200m}%`,label:"pct lower 200m"}),{id:"fsm-microtopo",stone:"cornerstone",tier:"proxy",variant:"scalars",source:"USGS 3DEP",agency:"USGS 3DEP DEM (LiDAR-derived) + whitebox-workflows hydrology",vintage:"2018",title:"Microtopography at this point",scalars:r,sub:"Lower percentile = topographic low point; runoff routes here.",docId:"microtopo",citeId:"microtopo"}}function Cn(n){const e=[],t=O(n.mta_entrances);if(t!=null&&t.available&&Array.isArray(t.entrances))for(const o of t.entrances.slice(0,4))e.push({reg:"MTA",tier:"empirical",label:F(o.station_name)??F(o.entrance_id)??"entrance",detail:`${x(o.distance_m)??"—"} m · ${F(o.daytime_routes)??""}`.trim(),sourceId:F(o.station_id)??"MTA",note:null});else t&&t.available===!1&&e.push({reg:"MTA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no subway entrances within 1.0 mi (silent)"});const r=O(n.nycha_developments);if(r!=null&&r.available&&Array.isArray(r.developments))for(const o of r.developments.slice(0,3))e.push({reg:"NYCHA",tier:"empirical",label:F(o.development)??"development",detail:`${x(o.distance_m)??"—"} m · ${F(o.borough)??""}`.trim(),sourceId:F(o.tds_num)??null,note:null});else r&&r.available===!1&&e.push({reg:"NYCHA",tier:"empirical",label:null,detail:null,sourceId:null,note:"no NYCHA developments within 1.0 mi (silent)"});const s=O(n.doe_schools);if(s!=null&&s.available&&Array.isArray(s.schools))for(const o of s.schools.slice(0,3))e.push({reg:"DOE",tier:"empirical",label:F(o.loc_name)??"school",detail:`${x(o.distance_m)??"—"} m · ${F(o.borough)??""}`.trim(),sourceId:F(o.loc_code)??null,note:null});else s&&s.available===!1&&e.push({reg:"DOE",tier:"empirical",label:null,detail:null,sourceId:null,note:"no schools within 1.0 mi (silent)"});const c=O(n.doh_hospitals);if(c!=null&&c.available&&Array.isArray(c.hospitals))for(const o of c.hospitals.slice(0,3))e.push({reg:"DOH",tier:"empirical",label:F(o.facility_name)??"hospital",detail:`${x(o.distance_m)??"—"} m · ${F(o.borough)??""}`.trim(),sourceId:F(o.fac_id)??null,note:null});else c&&c.available===!1&&e.push({reg:"DOH",tier:"empirical",label:null,detail:null,sourceId:null,note:"no acute-care hospital within 1.0 mi (silent)"});return e.length?{id:"fsm-registers",stone:"keystone",tier:"empirical",variant:"register",source:"NYC OpenData",agency:"NYC OpenData · multi-agency join",vintage:ce,title:"Nearby exposed assets",registers:e,sub:`${e.filter(o=>o.label).length} of ${e.length} registers fired · joined within 1.0 mi`,docId:"registers",citeId:"registers",mapLayer:"registers"}:null}function Mn(n){const e=O(n.terramind_buildings);return e!=null&&e.ok?{id:"fsm-tm-buildings",stone:"keystone",tier:"modeled",variant:"raster-pred",source:"TerraMind-NYC",agency:"msradam/TerraMind-NYC-Adapters · Buildings LoRA",vintage:"2026",title:"NYC building footprints — TerraMind LoRA",rasterKind:"buildings",headline:`${x(e.pct_buildings)??0}%`,subhead:"building-footprint coverage in chip",sub:`${x(e.n_building_components)??0} distinct components · test mIoU 0.5511`,illustrative:!0,docId:"tm_buildings",citeId:"tm_buildings",mapLayer:"buildings"}:null}function In(n){const e=O(n.floodnet);if(!e||(x(e.n_sensors)??0)<=0)return null;const t=x(e.n_flood_events_3y)??0;return{id:"fsm-floodnet",stone:"touchstone",tier:"empirical",variant:"spark",source:"FloodNet",agency:"FloodNet NYC ultrasonic depth sensor network",vintage:"2026",title:"FloodNet sensors near this address",headline:`${t} events`,subhead:`${x(e.n_sensors)??0} sensors · last 3 y`,spark:Array.from({length:24},(r,s)=>Math.max(0,Math.round(t/24*1.4*Math.exp(-Math.pow((s-14)/4,2))+t/24))),sparkSub:"Above-curb depth events ≥ 2 cm. Synthetic monthly distribution; raw deployment-id history is in the audit panel.",docId:"floodnet",citeId:"floodnet",mapLayer:"floodnet"}}function qn(n){var u;const e=O(n.nyc311);if(!e)return null;const t=x(e.n)??0;if(t<=0)return null;const r=O(e.by_year),s=O(e.by_descriptor),c=r?Object.values(r).map(_=>x(_)??0):Array.from({length:12},()=>Math.round(t/12)),o=s?(u=Object.entries(s).sort((_,l)=>(x(l[1])??0)-(x(_[1])??0))[0])==null?void 0:u[0]:null;return{id:"fsm-311",stone:"touchstone",tier:"proxy",variant:"histogram",source:"NYC 311",agency:"NYC 311 service requests (Socrata erm2-nwe9)",vintage:ce,title:"Recent 311 flood complaints",headline:`${t} calls`,subhead:o?`top descriptor: ${o}`:"all flood-related descriptors",histogram:c,sparkSub:`Within ${x(e.radius_m)??200} m · ${x(e.years)??5} y window. Filtered to flood-relevant descriptors.`,docId:"nyc311",citeId:"nyc311",mapLayer:"complaints"}}function Fn(n){var r;const e=O(n.nws_obs);if(!e||e.error||e.station_id==null)return null;const t=[];return x(e.precip_last_hour_mm)!=null&&t.push({value:`${e.precip_last_hour_mm} mm`,label:"precip · 1h"}),x(e.precip_last_6h_mm)!=null&&t.push({value:`${e.precip_last_6h_mm} mm`,label:"precip · 6h"}),t.length?{id:"fsm-nws-obs",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NWS",agency:`NWS ASOS station ${F(e.station_id)??"?"}`,vintage:((r=F(e.obs_time))==null?void 0:r.slice(0,10))??ce,title:"Recent precipitation",scalars:t,sub:`Nearest hourly METAR: ${F(e.station_name)??"?"} (${x(e.distance_km)??"?"} km).`,docId:"nws_obs",citeId:"nws_obs",mapLayer:"nws"}:null}function Ln(n){var r;const e=O(n.noaa_tides);if(!e||e.error||x(e.observed_ft_mllw)==null)return null;const t=[{value:`${e.observed_ft_mllw} ft`,label:"observed (MLLW)"}];return x(e.predicted_ft_mllw)!=null&&t.push({value:`${e.predicted_ft_mllw} ft`,label:"predicted"}),x(e.residual_ft)!=null&&t.push({value:`${e.residual_ft} ft`,label:"residual"}),{id:"fsm-noaa",stone:"touchstone",tier:"empirical",variant:"scalars",source:"NOAA CO-OPS",agency:`NOAA tide gauge ${F(e.station_name)??F(e.station_id)??"?"}`,vintage:((r=F(e.obs_time))==null?void 0:r.slice(0,10))??ce,title:"Live water level (nearest tide gauge)",scalars:t,sub:"Residual = observed − astronomical tide; positive residual is wind / surge component.",docId:"noaa_tides",citeId:"noaa_tides",mapLayer:"noaa"}}function En(n){var r;const e=O(n.prithvi_live);if(!(e!=null&&e.ok))return null;const t=(r=F(e.item_datetime))==null?void 0:r.slice(0,10);return{id:"fsm-prithvi-live",stone:"touchstone",tier:"modeled",variant:"raster-pred",source:"Prithvi-NYC-Pluvial",agency:"NASA-IBM Prithvi v2 · NYC fine-tune",vintage:t?`${t} · Sentinel-2`:"Sentinel-2",title:"Pluvial flood prediction · Prithvi-NYC-Pluvial",rasterKind:"prithvi",headline:`${x(e.pct_water_within_500m)??0}% flooded`,subhead:`water within 500 m · cloud ${x(e.cloud_cover)??"?"}%`,sub:"Test flood IoU 0.5979 on held-out NYC chips. Model interpretation, not a measurement.",illustrative:!0,docId:"prithvi_live",citeId:"prithvi_live",mapLayer:"prithvi-pluvial"}}const Pn={urban:"#C66",water:"#5B7FB4",vegetation:"#5B8A4A",barren:"#A89A78",wetland:"#D9C75A"};function jn(n){const e=O(n.terramind_lulc);if(!(e!=null&&e.ok))return null;const t=O(e.class_fractions)??{},r={urban:0,water:0,vegetation:0,barren:0,wetland:0};for(const[c,o]of Object.entries(t)){const u=c.toLowerCase();u.includes("urban")||u.includes("built")||u.includes("impervious")?r.urban+=o:u.includes("water")?r.water+=o:u.includes("tree")||u.includes("vegetation")||u.includes("crop")||u.includes("grass")?r.vegetation+=o:u.includes("bare")||u.includes("barren")||u.includes("soil")?r.barren+=o:u.includes("wet")||u.includes("marsh")?r.wetland+=o:r.barren+=o}const s=Object.entries(r).filter(([,c])=>c>0).map(([c,o])=>({k:c,pct:Math.round(o),color:Pn[c]}));return{id:"fsm-tm-lulc",stone:"touchstone",tier:"synthetic",variant:"lulc",source:"TerraMind v1.2",agency:"IBM TerraMind v1.2 · Sentinel-2 inputs",vintage:"Sentinel-2",title:"Land use / land cover · TerraMind v1.2",rasterKind:"lulc",classMix:s.length?s:void 0,sub:"Synthetic prior. LULC palette is a layer convention, not a tier signal.",illustrative:!0,docId:"tm_lulc",citeId:"tm_lulc",mapLayer:"terramind-lulc"}}function On(n){const e=O(n.ttm_forecast);if(!(e!=null&&e.available)||!e.interesting)return null;const t=x(e.forecast_peak_ft),r=x(e.forecast_peak_minutes_ahead);return t==null||r==null?null:{id:"fsm-ttm-fc",stone:"lodestone",tier:"modeled",variant:"timeseries",source:"Granite TTM r2 (zero-shot)",agency:"IBM Granite-TimeSeries · regional",vintage:ce,title:"Storm surge nowcast at The Battery — 9.6 h horizon (regional)",timeseries:{hours:96,peak:{x:38,y:47},peakLabel:`${t} ft @ +${Math.round(r/60)}h`},headline:`${t} ft`,subhead:"peak surge residual · 9.6h horizon · 6-min cadence",sub:"Regional disclosure. Distinct from the fine-tuned Battery surge nowcast.",spatialNote:"regional · Battery, not point-of-query",docId:"ttm_forecast",citeId:"ttm_forecast"}}function zn(n){const e=O(n.ttm_battery_surge);if(!(e!=null&&e.available)||!e.interesting)return null;const t=x(e.forecast_peak_m),r=x(e.forecast_peak_hours_ahead);return t==null||r==null?null:{id:"fsm-ttm-batt",stone:"lodestone",tier:"modeled",variant:"timeseries-ft",source:"msradam/Granite-TTM-r2-Battery-Surge",agency:"Granite TTM r2 · NYC-specialized fine-tune",vintage:ce,title:"Storm surge nowcast at The Battery — 96 h horizon (NYC-specialized fine-tune)",timeseries:{hours:96,peak:{x:r,y:Math.round(t*100)},peakLabel:`${(t*100).toFixed(0)} cm @ +${r}h`},headline:`${(t*100).toFixed(0)} cm`,subhead:"peak surge · 96h horizon · hourly cadence",sub:"Fine-tuned on NYC tide-gauge history. Hourly cadence; applies city-wide via NOAA station 8518750.",spatialNote:"regional · The Battery, not point-of-query",docId:"ttm_battery",citeId:"ttm_battery",hfModelCard:"huggingface.co/msradam/Granite-TTM-r2-Battery-Surge",rmse:"0.157 m",skillVsPersistence:"−35% vs persistence",hardwareBadge:"MI300X"}}function Dn(n){const e=O(n.nws_alerts);if(!e)return null;const t=x(e.n_active)??0;if(t<=0)return null;const r=Array.isArray(e.alerts)?e.alerts:[];return{id:"fsm-nws-alerts",stone:"lodestone",tier:"modeled",variant:"tabular",source:"NWS",agency:"NWS Public Alerts API · flood-relevant filter",vintage:ce,title:`${t} active flood-relevant alert${t===1?"":"s"}`,columns:["event","severity","expires"],rows:r.slice(0,4).map(s=>[F(s.event)??"?",F(s.severity)??"?",(F(s.expires)??"").slice(0,16)]),sub:"Live NWS feed. If a FLOOD or FLASH FLOOD WARNING is in this list, foreground it.",docId:"nws_alerts",citeId:"nws_alerts"}}function Bn(n,e){var E;const t=n.mellea??{},r=Array.isArray(t.requirements_passed)?t.requirements_passed:Array.isArray(t.passed)?t.passed:[],s=Array.isArray(t.requirements_failed)?t.requirements_failed:Array.isArray(t.failed)?t.failed:[],c=r.length,o=s.length,u=(typeof t.requirements_total=="number"?t.requirements_total:c+o)||4,_=typeof t.n_attempts=="number"?t.n_attempts:typeof t.attempts=="number"?t.attempts:0,d=(typeof t.rerolls=="number"?t.rerolls:null)??Math.max(0,_-1),b=((E=n.citations)==null?void 0:E.length)??0;return{id:"fsm-capstone-meta",stone:"capstone",tier:"modeled",variant:"meta",source:"Mellea",agency:"Capstone synthesis · Granite 4.1 + Mellea grounding check",vintage:ce,title:"Briefing reconciliation",metaRows:[{k:"mellea reroll",v:`${d} reroll${d===1?"":"s"}`},{k:"grounding checks",v:`${c}/${u} passed`},{k:"citations resolved",v:`${b}`},{k:"wall-clock",v:e!=null?`${e.toFixed(1)} s`:"—"}],sub:"Capstone produces prose, not cards. This meta-card is the integrity-narration UI for the entire pipeline.",docId:"capstone"}}function ft(n,e,t,r=!0){const s=n??{},c=O(s.geocode);return{cards:[kn(s,c),An(s),Nn(s),$n(s),Tn(s),Cn(s),Mn(s),In(s),qn(s),Fn(s),Ln(s),En(s),jn(s),Dn(s),On(s),zn(s),r?Bn(n??{},t):null].filter(u=>u!=null),stones:Sn(e),wallSeconds:t}}function Rn(n,e,t,r){const c={sandy_inundation:"sandy",dep_stormwater:"dep",floodnet:"floodnet",nyc311:"nyc311",noaa_tides:"noaa_tides",nws_alerts:"nws_alerts",nws_obs:"nws_obs",ttm_forecast:"ttm_forecast",ttm_311_forecast:"ttm_311_forecast",ttm_battery_surge:"ttm_battery_surge",floodnet_forecast:"floodnet_forecast",ida_hwm_2021:"ida_hwm",prithvi_eo_v2:"prithvi_water",prithvi_eo_live:"prithvi_live",microtopo_lidar:"microtopo",mta_entrance_exposure:"mta_entrances",nycha_development_exposure:"nycha_developments",doe_school_exposure:"doe_schools",doh_hospital_exposure:"doh_hospitals",terramind_synthesis:"terramind",terramind_lulc:"terramind_lulc",terramind_buildings:"terramind_buildings",eo_chip_fetch:"eo_chip",geocode:"geocode"}[e];if(!c)return[];if(e==="sandy_inundation"){const o=t;n[c]=r&&(o==null?void 0:o.inside)===!0?!0:r?!1:null}else if(e==="dep_stormwater"){const o=t??{},u={};for(const[_,l]of Object.entries(o)){const d=typeof l=="string"?l:"";d&&(u[_]={depth_class:1,depth_label:d})}n[c]=Object.keys(u).length?u:null}else r&&t!=null?n[c]=t:n[c]=null;return[c]}const Fe={subway:"MTA · USGS · FEMA · NYC OEM · NYC DEP",nycha:"NYC HA · USGS · NYC OEM · NYC DEP",school:"NYC DOE · USGS · NYC OEM · NYC DEP",hospital:"NYS DOH · USGS · NYC OEM · NYC DEP"},Le={subway:"subway entrances",nycha:"NYCHA developments",school:"public schools",hospital:"hospitals"};function Ee(n){return!n||!Number.isFinite(n)?"—":`${Math.round(n)}m`}function Pe(n){return n==null||!Number.isFinite(n)?"—":`${(n*3.28084).toFixed(1)} ft`}function je(n,e){return typeof e=="number"?e>=.5?`Inundated 2012 (${Math.round(e*100)}%)`:e>0?`Edge (${Math.round(e*100)}%)`:"—":n?"Inundated 2012":"—"}function Oe(n,e,t){return typeof t=="number"?t>=.5?`≥${Math.round(t*100)}% in scenario`:t>0?`${Math.round(t*100)}% edge`:"minimal":n&&n.length?n:e&&e>0?`class ${e}`:"minimal"}function Yn(n){return n?/elevator|easement|stair.*ramp/i.test(n):!1}function Hn(n){if(!n.available)return null;const t=(n.entrances??[]).map(r=>{const s=Yn(r.entrance_type);return{name:`${r.station_name??"?"}${r.daytime_routes?` (${String(r.daytime_routes).split(/\s+/).slice(0,3).join("/")})`:""}`,elev:Pe(r.elev_m),ada:s,fema:"Zone X",sandy:je(r.inside_sandy_2012),dep:Oe(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"subway",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}});return{type:Le.subway,radius:Ee(n.radius_m),count:n.n_entrances??t.length,rows:t,sourceLabel:Fe.subway}}function Un(n){if(!n.available)return null;const t=(n.developments??[]).map(r=>{const s=r.pct_inside_sandy_2012,c=r.pct_in_dep_extreme_2080;return{name:`${r.development??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Pe(r.rep_elevation_m),ada:!1,fema:"—",sandy:je(void 0,s),dep:Oe(void 0,void 0,c),asset:"nycha",primaryTier:s&&s>0?"empirical":"modeled"}});return{type:Le.nycha,radius:Ee(n.radius_m),count:n.n_developments??t.length,rows:t,sourceLabel:Fe.nycha}}function Gn(n){if(!n.available)return null;const t=(n.schools??[]).map(r=>({name:`${r.school_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Pe(r.elev_m),ada:!1,fema:"—",sandy:je(r.inside_sandy_2012),dep:Oe(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"school",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:Le.school,radius:Ee(n.radius_m),count:n.n_schools??t.length,rows:t,sourceLabel:Fe.school}}function Wn(n){if(!n.available)return null;const t=(n.hospitals??[]).map(r=>({name:`${r.facility_name??r.name??"?"}${r.borough?` · ${r.borough}`:""}`,elev:Pe(r.elev_m),ada:!0,fema:"—",sandy:je(r.inside_sandy_2012),dep:Oe(r.dep_extreme_2080_label,r.dep_extreme_2080_class),asset:"hospital",primaryTier:r.inside_sandy_2012?"empirical":"modeled"}));return{type:Le.hospital,radius:Ee(n.radius_m),count:n.n_hospitals??t.length,rows:t,sourceLabel:Fe.hospital}}function Kn(n){if(!n)return[];const e=[],t=Hn(n.mta_entrances??{});t&&t.rows.length&&e.push(t);const r=Un(n.nycha_developments??{});r&&r.rows.length&&e.push(r);const s=Gn(n.doe_schools??{});s&&s.rows.length&&e.push(s);const c=Wn(n.doh_hospitals??{});return c&&c.rows.length&&e.push(c),e}function Vn(n,e){const t=`/api/agent/stream?q=${encodeURIComponent(n)}`,r=new EventSource(t);let s="",c;const o=/([.?!])(\s|$)/;function u(l=!1){var b,E;let d;for(;d=o.exec(s);){const G=d.index+d[1].length+(d[2]?d[2].length:0),z=s.slice(0,G).trim();s=s.slice(G),z&&((b=e.onSentence)==null||b.call(e,z,c))}l&&s.trim()&&((E=e.onSentence)==null||E.call(e,s.trim(),c),s="")}function _(l,d){r.addEventListener(l,b=>{try{d(JSON.parse(b.data))}catch{}})}return _("hello",l=>{var d;return(d=e.onHello)==null?void 0:d.call(e,l.query)}),_("plan_token",l=>{var d;return(d=e.onPlanToken)==null?void 0:d.call(e,l.delta)}),_("plan",l=>{var d;return(d=e.onPlan)==null?void 0:d.call(e,l)}),_("step",l=>{var d;return(d=e.onStep)==null?void 0:d.call(e,l)}),_("token",l=>{var d,b;l.attempt!==c&&(c=l.attempt,s="",(d=e.onAttemptStart)==null||d.call(e,l.attempt??1)),(b=e.onToken)==null||b.call(e,l.delta,l.attempt),s+=l.delta,u(!1)}),_("mellea_attempt",l=>{var d;return(d=e.onMelleaAttempt)==null?void 0:d.call(e,l)}),_("final",l=>{var d;u(!0),(d=e.onFinal)==null||d.call(e,l)}),_("error",l=>{var d;return(d=e.onError)==null?void 0:d.call(e,l.err)}),r.addEventListener("done",()=>{var l;u(!0),(l=e.onDone)==null||l.call(e),r.close()}),r.addEventListener("error",()=>{var l;u(!0),(l=e.onError)==null||l.call(e,"SSE connection error"),r.close()}),{close:()=>r.close()}}const be={type:"FeatureCollection",features:[]};async function fe(n){try{const e=await fetch(n);if(!e.ok)return be;const t=await e.json();return!t||t.type!=="FeatureCollection"?be:t}catch{return be}}async function Zn(n,e,t=1500){return fe(`/api/layers/sandy?lat=${n}&lon=${e}&r=${t}`)}async function Jn(n,e,t=1500){return fe(`/api/layers/dep_extreme_2080?lat=${n}&lon=${e}&r=${t}`)}async function _t(n,e,t=1500){return fe(`/api/layers/prithvi_water?lat=${n}&lon=${e}&r=${t}`)}async function Xn(n){return fe(`/api/layers/sandy_clipped?code=${encodeURIComponent(n)}`)}async function Qn(n,e="dep_extreme_2080"){return fe(`/api/layers/dep_clipped?code=${encodeURIComponent(n)}&scenario=${e}`)}async function vt(n,e,t=1500){return fe(`/api/layers/ida_hwm?lat=${n}&lon=${e}&r=${t}`)}async function ht(n,e,t=1500){try{const r=await fetch(`/api/floodnet_near?lat=${n}&lon=${e}&r=${t}`);return r.ok?{type:"FeatureCollection",features:(await r.json()).features.map(o=>{const u=o.properties??{};return{...o,properties:{...u,count:typeof u.n_events_3y=="number"?u.n_events_3y:1}}})}:be}catch{return be}}var er=L('<span class="region-head-meta svelte-1q8jizq"> <!></span>'),tr=L('<span class="region-head-meta svelte-1q8jizq">planning…</span>'),nr=L('<div class="reroll-prev svelte-1q8jizq" aria-hidden="true"><p class="reroll-prev-line svelte-1q8jizq"> </p></div>'),rr=L("<!> <!>",1),ir=L('<span class="streaming-caret svelte-1q8jizq" aria-hidden="true">▍</span>'),ar=L("<!> <!>",1),sr=L('<details class="plan-details svelte-1q8jizq"><summary class="svelte-1q8jizq"> </summary> <pre class="plan-stream svelte-1q8jizq"> </pre></details>'),or=L('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Planning intent… <!></div>'),lr=L('<div class="generating-status svelte-1q8jizq" aria-live="polite"><span class="pulse svelte-1q8jizq"></span> Resolving address…</div>'),cr=L("<!> <!>",1),dr=L('<span class="region-head-meta svelte-1q8jizq"> </span>'),ur=L('<span class="region-head-meta svelte-1q8jizq">awaiting geocode…</span>'),pr=L('<div style="position: relative; flex: 1; min-height: 0;" class="svelte-1q8jizq"><!> <!></div>'),mr=L('<section class="hero-band svelte-1q8jizq"><div class="hero-band-inner svelte-1q8jizq"><div class="app-shell-top is-desktop svelte-1q8jizq"><main id="region-briefing" class="app-region app-region-brief svelte-1q8jizq" aria-labelledby="brief-h1"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Briefing</span> <!></header> <h1 id="brief-h1" class="brief-h1 svelte-1q8jizq">Flood-exposure briefing <span class="brief-h1-addr svelte-1q8jizq"> </span></h1> <!></main> <div class="app-region-side svelte-1q8jizq" style="grid-area: side;"><aside id="region-map" class="app-region app-region-map svelte-1q8jizq" aria-label="Map region"><header class="region-head svelte-1q8jizq"><span class="section-label svelte-1q8jizq">Map</span> <!></header> <!></aside> <aside id="region-cites" class="app-region app-region-cites svelte-1q8jizq" aria-label="Citations"><!></aside></div></div> <div class="app-shell-bottom svelte-1q8jizq"><section class="app-region app-region-findings svelte-1q8jizq" aria-label="Findings"><!></section></div></div></section>');function Nr(n,e){gt(e,!0);let t=ie(()=>Gt.params.queryId??""),r=ie(()=>()=>{try{return decodeURIComponent(i(t))}catch{return i(t)}}),s=C(null),c=C(""),o=C(""),u=C(null),_=C(!1),l=C(0),d=2,b=C(!1),E=C(!1),G=C(""),z=C(null),ne=C(me([])),$=C(me({id:"root",name:"briefing.run",status:"ok",ms:0,tier:null,children:[]})),N=C(null),D="comfortable",I="smart",B=C(!1);Ve(()=>{typeof window<"u"&&y(B,new URL(window.location.href).searchParams.get("grammar")==="1")});let j=C(null),P=C(void 0),q=me({}),H=C(0),V=ie(()=>{if(i(H),i(u)){const p={...q,...i(u)};return ft(p,i($),i(P),!0)}return ft(q,i($),i(P),!1)});function ae(p){y(N,p,!0)}function W(p){const a=document.getElementById("region-cites");a&&a.scrollIntoView({behavior:"smooth",block:"start"})}const le=new Set(["ttm_forecast","ttm_311_forecast","floodnet_forecast"]),_e="group-ttm-r2";function we(p,a,v,m){if(m==="error")return v??void 0;if(m==="silent")return v??"no data";if(a==null||typeof a!="object")return;const k=a,g={sandy_inundation:["inside"],dep_stormwater:["dep_extreme_2080","dep_moderate_2050"],floodnet:["n_sensors","n_events_3y"],nyc311:["n"],noaa_tides:["observed_ft_mllw","residual_ft","station"],nws_alerts:["n_active"],nws_obs:["p1h_mm","p6h_mm","station"],ttm_forecast:["forecast_peak_ft","forecast_peak_min_ahead"],ttm_311_forecast:["forecast_mean","forecast_peak","accelerating"],ida_hwm_2021:["n_within_800m","max_height_above_gnd_ft"],prithvi_eo_v2:["inside_water_polygon","nearest_distance_m"],prithvi_eo_live:["scene_date","pct_water_500m"],microtopo_lidar:["elev_m","pct_200m","relief_m"],mta_entrance_exposure:["n_entrances","n_inside_sandy_2012","n_in_dep_extreme_2080"],nycha_development_exposure:["n_developments","n_majority_inside_sandy_2012"],doe_school_exposure:["n_schools","n_inside_sandy_2012"],doh_hospital_exposure:["n_hospitals","n_inside_sandy_2012"],floodnet_forecast:["sensor_id","distance_m","forecast_28d","accelerating"],terramind_synthesis:["tim_chain","dem_mean_m"],rag_granite_embedding:["hits"],gliner_extract:["sources"]}[p],Y=[];if(g){for(const R of g)if(k[R]!==void 0&&Y.push(xe(R,k[R])),Y.length>=3)break}else for(const[R,Q]of Object.entries(k))if(Q!==null&&typeof Q!="object"&&(Y.push(xe(R,Q)),Y.length>=2))break;return Y.join(" · ")||void 0}function ze(p){const a=[],v=p.mta_entrances;if(v&&Array.isArray(v.entrances))for(const g of v.entrances){const Y=Number(g.entrance_lat),R=Number(g.entrance_lon);!Number.isFinite(Y)||!Number.isFinite(R)||a.push({type:"Feature",geometry:{type:"Point",coordinates:[R,Y]},properties:{kind:"subway",name:`${g.station_name??"?"} (${g.daytime_routes??"?"})`,doc_id:`mta_entrance_${g.station_id??""}`,inside_sandy_2012:g.inside_sandy_2012===!0}})}const m=p.doe_schools;if(m&&Array.isArray(m.schools))for(const g of m.schools){const Y=Number(g.school_lat),R=Number(g.school_lon);!Number.isFinite(Y)||!Number.isFinite(R)||a.push({type:"Feature",geometry:{type:"Point",coordinates:[R,Y]},properties:{kind:"school",name:String(g.loc_name??g.school_name??"?"),doc_id:`doe_school_${g.loc_code??""}`,inside_sandy_2012:g.inside_sandy_2012===!0}})}const k=p.nycha_developments;if(k&&Array.isArray(k.developments))for(const g of k.developments){const Y=Number(g.centroid_lat),R=Number(g.centroid_lon);if(!Number.isFinite(Y)||!Number.isFinite(R))continue;const Q=Number(g.pct_inside_sandy_2012??0);a.push({type:"Feature",geometry:{type:"Point",coordinates:[R,Y]},properties:{kind:"nycha",name:String(g.development??"?"),doc_id:`nycha_dev_${g.tds_num??""}`,inside_sandy_2012:Q>=50,pct_inside_sandy:Q}})}const w=p.doh_hospitals;if(w&&Array.isArray(w.hospitals))for(const g of w.hospitals){const Y=Number(g.hospital_lat),R=Number(g.hospital_lon);!Number.isFinite(Y)||!Number.isFinite(R)||a.push({type:"Feature",geometry:{type:"Point",coordinates:[R,Y]},properties:{kind:"hospital",name:String(g.facility_name??"?"),doc_id:`nyc_hospital_${g.fac_id??""}`,inside_sandy_2012:g.inside_sandy_2012===!0}})}return{type:"FeatureCollection",features:a}}function ve(p){return{type:"FeatureCollection",features:[]}}function de(p){return 1+(p.children??[]).reduce((v,m)=>v+de(m),0)}function xe(p,a){if(typeof a=="number"){const v=Number.isInteger(a)?`${a}`:a.toFixed(2);return`${p}=${v}`}if(typeof a=="boolean")return`${p}=${a}`;if(typeof a=="string"){const v=a.length>24?a.slice(0,22)+"…":a;return`${p}=${v}`}return p}let he=C(me({empirical:!0,modeled:!0,synthetic:!0,proxy:!0})),se=C(null),Se=C(null),tt=C(void 0),nt=C(void 0),ke=C(void 0),Ae=C(void 0),Ne=C(void 0),$e=C(void 0),De=C(void 0),Te=C(void 0),Nt=ie(()=>{var p,a,v,m,k,w;return{empirical:(((p=i(ke))==null?void 0:p.features.length)??0)+(((a=i(Te))==null?void 0:a.features.length)??0),modeled:((v=i(Ae))==null?void 0:v.features.length)??0,synthetic:(((m=i(Ne))==null?void 0:m.features.length)??0)+(((k=i(De))==null?void 0:k.features.length)??0),proxy:((w=i($e))==null?void 0:w.features.length)??0}}),ue=C(me([])),pe=C(me({})),Ce=[];function $t(){var k;if(!i(o)){y(ue,[],!0),y(pe,{},!0),Ce=[];return}const p={};(k=i(u))!=null&&k.citations&&i(u).citations.forEach((w,g)=>{p[w.doc_id]=kt(g+1,w.doc_id,{source:w.source,title:w.title,url:w.url,vintage:w.vintage})});const a=Xe(i(o),p),v={};let m=1;for(const w of Ce){const g=a.citations[w];g&&(v[w]={...g,n:m++})}for(const[w,g]of Object.entries(a.citations))v[w]||(v[w]={...g,n:m++},Ce.push(w));y(ue,a.blocks,!0),y(pe,v,!0)}Ve(()=>{i(o),i(u),$t()}),Ve(()=>{if(!i(se))return;const{lat:p,lon:a,source:v}=i(se);v==="nta"&&i(Se)?(Xn(i(Se)).then(m=>y(ke,m,!0)),Qn(i(Se)).then(m=>y(Ae,m,!0)),_t(p,a,2500).then(m=>y(Ne,m,!0)),ht(p,a,3e3).then(m=>y($e,m,!0)),vt(p,a,3e3).then(m=>y(Te,m,!0))):(Zn(p,a).then(m=>y(ke,m,!0)),Jn(p,a).then(m=>y(Ae,m,!0)),_t(p,a).then(m=>y(Ne,m,!0)),ht(p,a).then(m=>y($e,m,!0)),vt(p,a).then(m=>y(Te,m,!0)))}),Ut(()=>{if(Z.reset(),!i(r)())return;y(j,Date.now(),!0),Z.phase="planning";const p=Vn(i(r)(),{onPlanToken:a=>y(c,i(c)+a),onPlan:a=>{var v;y(s,a,!0),Z.phase="specialists",Z.totalSpecialists=((v=a.specialists)==null?void 0:v.length)??0},onStep:a=>{if(new Set(["reconcile_granite41","mellea_reconcile_address","reconcile_neighborhood","reconcile_development","reconcile_live_now"]).has(a.step)||(Z.activeStep=a.step,a.ok&&(Z.firedCount=Z.firedCount+1)),Rn(q,a.step,a.result,a.ok),y(H,i(H)+1),a.step==="geocode")if(a.ok&&a.result&&typeof a.result=="object"){const S=a.result;if(typeof S.lat=="number"&&typeof S.lon=="number"){const T=typeof S.address=="string"?S.address:i(r)();y(se,{label:T,lat:S.lat,lon:S.lon,source:"geocode"},!0),y(E,!0)}}else y(z,"geocoder");if(a.step==="nta_resolve"&&a.ok&&a.result&&typeof a.result=="object"){const S=a.result,T=Array.isArray(S.bbox)?S.bbox:null,K=typeof S.nta_code=="string"?S.nta_code:null;if(T&&T.length===4&&K){y(Se,K,!0);const re=(T[0]+T[2])/2,J=(T[1]+T[3])/2,ee=typeof S.nta_name=="string"?S.nta_name:i(r)();y(se,{label:ee,lat:J,lon:re,source:"nta"},!0)}}const m=Wt(a.step),k=a.ok?a.result==null&&a.err==null?"silent":"ok":"error",w=Math.round((a.elapsed_s??0)*1e3),g=a.result!=null?a.result:a.err??null,Y=we(a.step,a.result,a.err,k),R={id:`step-${de(i($))}`,name:a.step,status:k,ms:w,tier:m,note:Y,output:g,error:k==="error"?a.err??"unknown error":void 0,model:le.has(a.step)?"granite-timeseries-ttm-r2":void 0},Q={...i($),ms:(i($).ms??0)+w};if(le.has(a.step)){const S=[...Q.children??[]];let T=S.find(J=>J.id===_e);T||(T={id:_e,name:"forecasting.granite-timeseries-ttm-r2",status:"fan",ms:0,tier:"modeled",note:"1 instance",model:"granite-timeseries-ttm-r2",children:[]},S.push(T));const K=[...T.children??[],R],re={...T,ms:(T.ms??0)+w,note:`${K.length} instance${K.length===1?"":"s"}`,children:K};y($,{...Q,children:S.map(J=>J.id===_e?re:J)},!0)}else y($,{...Q,children:[...Q.children??[],R]},!0)},onAttemptStart:a=>{y(l,a,!0),Z.phase="reconciling",Z.attempt=a,Z.activeStep="granite4.1 + mellea",a>1&&(y(G,i(o),!0),y(o,""),Ce=[])},onToken:a=>{i(b)||(y(b,!0),i(l)===0&&y(l,1),Z.phase="streaming",Z.attempt=Math.max(1,Z.attempt)),y(o,i(o)+a)},onMelleaAttempt:a=>{a.attempt>0&&(y(l,a.attempt,!0),Z.attempt=a.attempt)},onFinal:a=>{var w;y(u,a,!0),a.paragraph&&y(o,a.paragraph,!0),y(ne,Kn(a),!0);const v=a;y(tt,ze(v),!0),y(nt,ve(),!0);const m=v.terramind;if(m!=null&&m.ok&&(m!=null&&m.polygons_geojson)){const g=m.polygons_geojson;(g==null?void 0:g.type)==="FeatureCollection"&&(((w=g.features)==null?void 0:w.length)??0)>0&&y(De,g,!0)}const k=a.mellea;k&&k.failed&&k.failed.length>0&&k.attempts&&k.attempts>=d&&y(z,"grounding")},onError:a=>{const v=a.toLowerCase();(v.includes("connection")||v.includes("502")||v.includes("503")||v.includes("timeout")||v.includes("routing"))&&y(z,"backend"),Z.markError(a)},onDone:()=>{var a,v,m,k,w;y(_,!0),i(j)!=null&&y(P,(Date.now()-i(j))/1e3),!i(b)&&!i(z)&&i(E)&&y(z,"all-silent"),!i(z)&&i(ue).length>0&&(en({queryId:i(t),queryText:i(r)(),intent:((a=i(s))==null?void 0:a.intent)??null,specialists:((m=(v=i(s))==null?void 0:v.specialists)==null?void 0:m.length)??0,blocks:i(ue),citations:i(pe),generatedAt:new Date().toISOString(),attempts:((w=(k=i(u))==null?void 0:k.mellea)==null?void 0:w.attempts)??i(l)}),Z.markReady())}});return()=>p.close()});var Be=mr(),rt=h(Be),Re=h(rt),Ye=h(Re),He=h(Ye),Tt=A(h(He),2);{var Ct=p=>{var a=er(),v=h(a),m=A(v);{var k=w=>{var g=Ht("· ✓ done");M(w,g)};X(m,w=>{i(_)&&w(k)})}f(a),te(()=>{var w;return U(v,`intent: ${i(s).intent??""} · ${((w=i(s).specialists)==null?void 0:w.length)??0??""} specialists · attempt ${i(l)??""} `)}),M(p,a)},Mt=p=>{var a=tr();M(p,a)};X(Tt,p=>{i(s)?p(Ct):p(Mt,-1)})}f(He);var Ue=A(He,2),it=A(h(Ue)),It=h(it,!0);f(it),f(Ue);var qt=A(Ue,2);{var Ft=p=>{bn(p,{get state(){return i(z)}})},Lt=p=>{var a=cr(),v=ye(a);{var m=S=>{var T=rr(),K=ye(T);vn(K,{get attempt(){return i(l)},max:d});var re=A(K,2);{var J=ee=>{var oe=nr(),Me=h(oe),Ie=h(Me);f(Me),f(oe),te(Ke=>U(Ie,`${Ke??""}…`),[()=>i(G).slice(0,360)]),M(ee,oe)};X(re,ee=>{i(G)&&ee(J)})}M(S,T)};X(v,S=>{i(l)>1&&S(m)})}var k=A(v,2);{var w=S=>{un(S,{get paragraph(){return i(u).paragraph},get citations(){return i(pe)},get targets(){return i(u).targets}})},g=S=>{var T=ar(),K=ye(T);wt(K,{get blocks(){return i(ue)},get citations(){return i(pe)},streaming:!1});var re=A(K,2);{var J=ee=>{var oe=ir();M(ee,oe)};X(re,ee=>{i(_)||ee(J)})}M(S,T)},Y=S=>{fn(S)},R=S=>{var T=or(),K=A(h(T),2);{var re=J=>{var ee=sr(),oe=h(ee),Me=h(oe);f(oe);var Ie=A(oe,2),Ke=h(Ie,!0);f(Ie),f(ee),te(()=>{U(Me,`Planner streaming (${i(c).length??""} chars)`),U(Ke,i(c))}),M(J,ee)};X(K,J=>{i(c)&&J(re)})}f(T),M(S,T)},Q=S=>{var T=lr();M(S,T)};X(k,S=>{var T,K,re;((T=i(s))==null?void 0:T.intent)==="compare"&&((re=(K=i(u))==null?void 0:K.targets)==null?void 0:re.length)===2?S(w):i(ue).length?S(g,1):i(E)&&!i(b)?S(Y,2):i(s)?S(Q,-1):S(R,3)})}M(p,a)};X(qt,p=>{i(z)?p(Ft):p(Lt,-1)})}f(Ye);var at=A(Ye,2),Ge=h(at),We=h(Ge),Et=A(h(We),2);{var Pt=p=>{var a=dr(),v=h(a);f(a),te((m,k)=>U(v,`Carto Positron · z15 · ${m??""}°N ${k??""}°W`),[()=>i(se).lat.toFixed(4),()=>Math.abs(i(se).lon).toFixed(4)]),M(p,a)},jt=p=>{var a=ur();M(p,a)};X(Et,p=>{i(se)?p(Pt):p(jt,-1)})}f(We);var Ot=A(We,2);{var zt=p=>{var a=pr(),v=h(a);Jt(v,{get address(){return i(se)},get activeLayers(){return i(he)},get sandyEmpirical(){return i(ke)},get depModeled(){return i(Ae)},get syntheticPrior(){return i(Ne)},get proxy311(){return i($e)},get idaHwm(){return i(Te)},get registerPoints(){return i(tt)},get registerPolygons(){return i(nt)},get terramindLulc(){return i(De)},get linkedKey(){return i(N)}});var m=A(v,2);Xt(m,{get active(){return i(he)},get featureCounts(){return i(Nt)},onToggle:k=>y(he,{...i(he),[k]:!i(he)[k]},!0)}),f(a),M(p,a)};X(Ot,p=>{i(se)&&p(zt)})}f(Ge);var st=A(Ge,2),Dt=h(st);Vt(Dt,{get citations(){return i(pe)}}),f(st),f(at),f(Re);var ot=A(Re,2),lt=h(ot),Bt=h(lt);Zt(Bt,{get data(){return i(V)},density:D,provenanceMode:I,get showGrammar(){return i(B)},get linkedKey(){return i(N)},onLink:ae,onCite:W}),f(lt),f(ot),f(rt),f(Be),te(p=>U(It,p),[()=>i(r)()]),M(n,Be),yt()}export{Nr as component,Ar as universal};
|
|
@@ -1 +1 @@
|
|
| 1 |
-
{"version":"
|
|
|
|
| 1 |
+
{"version":"1778109983909"}
|
|
@@ -6,21 +6,21 @@
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
-
<link href="./_app/immutable/entry/start.
|
| 10 |
-
<link href="./_app/immutable/chunks/
|
| 11 |
<link href="./_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
|
| 12 |
-
<link href="./_app/immutable/entry/app.
|
| 13 |
<link href="./_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
|
| 14 |
<link href="./_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
|
| 15 |
<link href="./_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
|
| 16 |
<link href="./_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
|
| 17 |
-
<link href="./_app/immutable/nodes/0.
|
| 18 |
<link href="./_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
|
| 19 |
-
<link href="./_app/immutable/chunks/
|
| 20 |
<link href="./_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
|
| 21 |
<link href="./_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
|
| 22 |
<link href="./_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
|
| 23 |
-
<link href="./_app/immutable/nodes/2.
|
| 24 |
<link href="./_app/immutable/chunks/cDW0xQNP.js" rel="modulepreload">
|
| 25 |
<link href="./_app/immutable/chunks/25_y8TFd.js" rel="modulepreload">
|
| 26 |
<link href="./_app/immutable/chunks/D907np-5.js" rel="modulepreload">
|
|
@@ -37,15 +37,15 @@
|
|
| 37 |
|
| 38 |
<script>
|
| 39 |
{
|
| 40 |
-
|
| 41 |
base: new URL(".", location).pathname.slice(0, -1)
|
| 42 |
};
|
| 43 |
|
| 44 |
const element = document.currentScript.parentElement;
|
| 45 |
|
| 46 |
Promise.all([
|
| 47 |
-
import("./_app/immutable/entry/start.
|
| 48 |
-
import("./_app/immutable/entry/app.
|
| 49 |
]).then(([kit, app]) => {
|
| 50 |
kit.start(app, element, {
|
| 51 |
node_ids: [0, 2],
|
|
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
+
<link href="./_app/immutable/entry/start.DcdyosVQ.js" rel="modulepreload">
|
| 10 |
+
<link href="./_app/immutable/chunks/33K0dtcD.js" rel="modulepreload">
|
| 11 |
<link href="./_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
|
| 12 |
+
<link href="./_app/immutable/entry/app.BJix1erd.js" rel="modulepreload">
|
| 13 |
<link href="./_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
|
| 14 |
<link href="./_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
|
| 15 |
<link href="./_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
|
| 16 |
<link href="./_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
|
| 17 |
+
<link href="./_app/immutable/nodes/0.xQyF6Vnl.js" rel="modulepreload">
|
| 18 |
<link href="./_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
|
| 19 |
+
<link href="./_app/immutable/chunks/CbyeixEA.js" rel="modulepreload">
|
| 20 |
<link href="./_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
|
| 21 |
<link href="./_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
|
| 22 |
<link href="./_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
|
| 23 |
+
<link href="./_app/immutable/nodes/2.ecCZIVph.js" rel="modulepreload">
|
| 24 |
<link href="./_app/immutable/chunks/cDW0xQNP.js" rel="modulepreload">
|
| 25 |
<link href="./_app/immutable/chunks/25_y8TFd.js" rel="modulepreload">
|
| 26 |
<link href="./_app/immutable/chunks/D907np-5.js" rel="modulepreload">
|
|
|
|
| 37 |
|
| 38 |
<script>
|
| 39 |
{
|
| 40 |
+
__sveltekit_95np12 = {
|
| 41 |
base: new URL(".", location).pathname.slice(0, -1)
|
| 42 |
};
|
| 43 |
|
| 44 |
const element = document.currentScript.parentElement;
|
| 45 |
|
| 46 |
Promise.all([
|
| 47 |
+
import("./_app/immutable/entry/start.DcdyosVQ.js"),
|
| 48 |
+
import("./_app/immutable/entry/app.BJix1erd.js")
|
| 49 |
]).then(([kit, app]) => {
|
| 50 |
kit.start(app, element, {
|
| 51 |
node_ids: [0, 2],
|
|
@@ -6,17 +6,17 @@
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
-
<link href="../_app/immutable/entry/start.
|
| 10 |
-
<link href="../_app/immutable/chunks/
|
| 11 |
<link href="../_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
|
| 12 |
-
<link href="../_app/immutable/entry/app.
|
| 13 |
<link href="../_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
|
| 14 |
<link href="../_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
|
| 15 |
<link href="../_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
|
| 16 |
<link href="../_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
|
| 17 |
-
<link href="../_app/immutable/nodes/0.
|
| 18 |
<link href="../_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
|
| 19 |
-
<link href="../_app/immutable/chunks/
|
| 20 |
<link href="../_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
|
| 21 |
<link href="../_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
|
| 22 |
<link href="../_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
|
|
@@ -38,15 +38,15 @@
|
|
| 38 |
|
| 39 |
<script>
|
| 40 |
{
|
| 41 |
-
|
| 42 |
base: new URL("..", location).pathname.slice(0, -1)
|
| 43 |
};
|
| 44 |
|
| 45 |
const element = document.currentScript.parentElement;
|
| 46 |
|
| 47 |
Promise.all([
|
| 48 |
-
import("../_app/immutable/entry/start.
|
| 49 |
-
import("../_app/immutable/entry/app.
|
| 50 |
]).then(([kit, app]) => {
|
| 51 |
kit.start(app, element, {
|
| 52 |
node_ids: [0, 5],
|
|
|
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 7 |
<meta name="description" content="Riprap — citation-grounded NYC flood-exposure briefings." />
|
| 8 |
<title>Riprap — flood-exposure briefing</title>
|
| 9 |
+
<link href="../_app/immutable/entry/start.DcdyosVQ.js" rel="modulepreload">
|
| 10 |
+
<link href="../_app/immutable/chunks/33K0dtcD.js" rel="modulepreload">
|
| 11 |
<link href="../_app/immutable/chunks/BTUA7_xE.js" rel="modulepreload">
|
| 12 |
+
<link href="../_app/immutable/entry/app.BJix1erd.js" rel="modulepreload">
|
| 13 |
<link href="../_app/immutable/chunks/CXQd8Y6F.js" rel="modulepreload">
|
| 14 |
<link href="../_app/immutable/chunks/CWw6qgC_.js" rel="modulepreload">
|
| 15 |
<link href="../_app/immutable/chunks/Bd-v_9Ud.js" rel="modulepreload">
|
| 16 |
<link href="../_app/immutable/chunks/CW0zSL4D.js" rel="modulepreload">
|
| 17 |
+
<link href="../_app/immutable/nodes/0.xQyF6Vnl.js" rel="modulepreload">
|
| 18 |
<link href="../_app/immutable/chunks/DxQlA7U2.js" rel="modulepreload">
|
| 19 |
+
<link href="../_app/immutable/chunks/CbyeixEA.js" rel="modulepreload">
|
| 20 |
<link href="../_app/immutable/chunks/DCD6_LXk.js" rel="modulepreload">
|
| 21 |
<link href="../_app/immutable/chunks/B0XoTt7U.js" rel="modulepreload">
|
| 22 |
<link href="../_app/immutable/chunks/DixtWtwq.js" rel="modulepreload">
|
|
|
|
| 38 |
|
| 39 |
<script>
|
| 40 |
{
|
| 41 |
+
__sveltekit_95np12 = {
|
| 42 |
base: new URL("..", location).pathname.slice(0, -1)
|
| 43 |
};
|
| 44 |
|
| 45 |
const element = document.currentScript.parentElement;
|
| 46 |
|
| 47 |
Promise.all([
|
| 48 |
+
import("../_app/immutable/entry/start.DcdyosVQ.js"),
|
| 49 |
+
import("../_app/immutable/entry/app.BJix1erd.js")
|
| 50 |
]).then(([kit, app]) => {
|
| 51 |
kit.start(app, element, {
|
| 52 |
node_ids: [0, 5],
|
|
@@ -51,6 +51,9 @@ export interface FinalResult {
|
|
| 51 |
tier?: string;
|
| 52 |
score?: number;
|
| 53 |
citations?: Array<{ doc_id: string; source?: string; title?: string; url?: string; vintage?: string }>;
|
|
|
|
|
|
|
|
|
|
| 54 |
}
|
| 55 |
|
| 56 |
export interface AgentStreamHandlers {
|
|
|
|
| 51 |
tier?: string;
|
| 52 |
score?: number;
|
| 53 |
citations?: Array<{ doc_id: string; source?: string; title?: string; url?: string; vintage?: string }>;
|
| 54 |
+
/** Present when intent === "compare". */
|
| 55 |
+
intent?: string;
|
| 56 |
+
targets?: Array<{ label: string; address: string }>;
|
| 57 |
}
|
| 58 |
|
| 59 |
export interface AgentStreamHandlers {
|
|
@@ -0,0 +1,267 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import Briefing from './Briefing.svelte';
|
| 3 |
+
import { parseBriefing } from '$lib/client/parseBriefing';
|
| 4 |
+
import type { BriefingBlock, Citation } from '$lib/types/claim';
|
| 5 |
+
|
| 6 |
+
interface Target {
|
| 7 |
+
label: string;
|
| 8 |
+
address: string;
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
interface Props {
|
| 12 |
+
paragraph: string;
|
| 13 |
+
citations: Record<string, Citation>;
|
| 14 |
+
targets: Target[];
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
let { paragraph, citations, targets }: Props = $props();
|
| 18 |
+
|
| 19 |
+
// Split the merged compare paragraph at the --- divider.
|
| 20 |
+
// Each half begins with `## PLACE A/B: <address>` which we strip to get
|
| 21 |
+
// clean 4-section markdown for parseBriefing.
|
| 22 |
+
function splitParagraph(para: string): { address: string; md: string }[] {
|
| 23 |
+
const halves = para.split(/\n\s*---\s*\n/, 2);
|
| 24 |
+
return halves.map((half, i) => {
|
| 25 |
+
const m = /^##\s+PLACE\s+[AB]:\s+(.+?)(\n|$)/m.exec(half.trim());
|
| 26 |
+
const address = m?.[1]?.trim() ?? targets[i]?.address ?? `Place ${String.fromCharCode(65 + i)}`;
|
| 27 |
+
const md = half.replace(/^##\s+PLACE\s+[AB]:\s+.+(\n|$)/m, '').trim();
|
| 28 |
+
return { address, md };
|
| 29 |
+
});
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
const halves = $derived(splitParagraph(paragraph));
|
| 33 |
+
const parsedA = $derived(parseBriefing(halves[0]?.md ?? '', citations));
|
| 34 |
+
const parsedB = $derived(parseBriefing(halves[1]?.md ?? '', citations));
|
| 35 |
+
|
| 36 |
+
// Both columns share the merged citation registry so cross-column
|
| 37 |
+
// doc_id numbering stays consistent.
|
| 38 |
+
const allCitations = $derived({
|
| 39 |
+
...citations,
|
| 40 |
+
...parsedA.citations,
|
| 41 |
+
...parsedB.citations
|
| 42 |
+
});
|
| 43 |
+
|
| 44 |
+
// Collect prose text keyed by section number ('01'–'04').
|
| 45 |
+
function sectionTexts(blocks: BriefingBlock[]): Map<string, string> {
|
| 46 |
+
const map = new Map<string, string>();
|
| 47 |
+
let cur = '';
|
| 48 |
+
for (const b of blocks) {
|
| 49 |
+
if (b.kind === 'head') cur = b.n;
|
| 50 |
+
else if (b.kind === 'prose' && cur) {
|
| 51 |
+
map.set(cur, (map.get(cur) ?? '') + ' ' + b.parts.map((p) => p.text).join(''));
|
| 52 |
+
}
|
| 53 |
+
}
|
| 54 |
+
return map;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
// Return all numbers (with optional unit suffix) in a text, in order.
|
| 58 |
+
const NUM_RE = /\b(\d[\d,]*(?:\.\d+)?)\s*(%|ft|m|km|mm)?\b/g;
|
| 59 |
+
function findNumbers(text: string): Array<{ full: string; start: number }> {
|
| 60 |
+
const hits: Array<{ full: string; start: number }> = [];
|
| 61 |
+
let m: RegExpExecArray | null;
|
| 62 |
+
NUM_RE.lastIndex = 0;
|
| 63 |
+
while ((m = NUM_RE.exec(text)) !== null) {
|
| 64 |
+
const full = m[1] + (m[2] ?? '');
|
| 65 |
+
hits.push({ full, start: m.index });
|
| 66 |
+
}
|
| 67 |
+
return hits;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
// Up to 3 words immediately before `start` in `text`.
|
| 71 |
+
function ctxBefore(text: string, start: number): string {
|
| 72 |
+
const snippet = text.slice(Math.max(0, start - 40), start).trim();
|
| 73 |
+
return snippet.split(/\s+/).slice(-3).join(' ');
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
const SECTION_LABELS: Record<string, string> = {
|
| 77 |
+
'01': 'Status',
|
| 78 |
+
'02': 'Empirical',
|
| 79 |
+
'03': 'Modeled',
|
| 80 |
+
'04': 'Policy'
|
| 81 |
+
};
|
| 82 |
+
|
| 83 |
+
interface DeltaRow {
|
| 84 |
+
sectionLabel: string;
|
| 85 |
+
ctx: string;
|
| 86 |
+
aVal: string;
|
| 87 |
+
bVal: string;
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
// One delta row per canonical section where the first compared number differs.
|
| 91 |
+
const deltaRows = $derived.by<DeltaRow[]>(() => {
|
| 92 |
+
const textsA = sectionTexts(parsedA.blocks);
|
| 93 |
+
const textsB = sectionTexts(parsedB.blocks);
|
| 94 |
+
const rows: DeltaRow[] = [];
|
| 95 |
+
for (const [n, label] of Object.entries(SECTION_LABELS)) {
|
| 96 |
+
const tA = textsA.get(n) ?? '';
|
| 97 |
+
const tB = textsB.get(n) ?? '';
|
| 98 |
+
if (!tA || !tB) continue;
|
| 99 |
+
const numsA = findNumbers(tA);
|
| 100 |
+
const numsB = findNumbers(tB);
|
| 101 |
+
if (!numsA.length || !numsB.length) continue;
|
| 102 |
+
const len = Math.min(numsA.length, numsB.length);
|
| 103 |
+
for (let i = 0; i < len; i++) {
|
| 104 |
+
if (numsA[i].full !== numsB[i].full) {
|
| 105 |
+
rows.push({
|
| 106 |
+
sectionLabel: label,
|
| 107 |
+
ctx: ctxBefore(tA, numsA[i].start),
|
| 108 |
+
aVal: numsA[i].full,
|
| 109 |
+
bVal: numsB[i].full
|
| 110 |
+
});
|
| 111 |
+
break;
|
| 112 |
+
}
|
| 113 |
+
}
|
| 114 |
+
}
|
| 115 |
+
return rows;
|
| 116 |
+
});
|
| 117 |
+
</script>
|
| 118 |
+
|
| 119 |
+
<div class="compare-layout">
|
| 120 |
+
{#if deltaRows.length > 0}
|
| 121 |
+
<div class="compare-delta-bar" aria-label="Key differences">
|
| 122 |
+
<span class="compare-delta-title">Key differences</span>
|
| 123 |
+
<div class="compare-delta-rows">
|
| 124 |
+
{#each deltaRows as row}
|
| 125 |
+
<div class="compare-delta-row">
|
| 126 |
+
<span class="compare-delta-section">{row.sectionLabel}</span>
|
| 127 |
+
<span class="compare-delta-claim">
|
| 128 |
+
{#if row.ctx}<span class="compare-delta-ctx">{row.ctx}:</span>{/if}
|
| 129 |
+
<strong class="compare-delta-a">{row.aVal}</strong>
|
| 130 |
+
<span class="compare-delta-vs"> vs </span>
|
| 131 |
+
<strong class="compare-delta-b">{row.bVal}</strong>
|
| 132 |
+
</span>
|
| 133 |
+
</div>
|
| 134 |
+
{/each}
|
| 135 |
+
</div>
|
| 136 |
+
</div>
|
| 137 |
+
{/if}
|
| 138 |
+
|
| 139 |
+
<div class="compare-cols">
|
| 140 |
+
{#each halves as half, i}
|
| 141 |
+
<div class="compare-col">
|
| 142 |
+
<h2 class="compare-address-header address-header">
|
| 143 |
+
{halves[i].address}
|
| 144 |
+
</h2>
|
| 145 |
+
<Briefing
|
| 146 |
+
blocks={i === 0 ? parsedA.blocks : parsedB.blocks}
|
| 147 |
+
citations={allCitations}
|
| 148 |
+
streaming={false}
|
| 149 |
+
/>
|
| 150 |
+
</div>
|
| 151 |
+
{#if i === 0}
|
| 152 |
+
<div class="compare-divider" role="separator" aria-hidden="true"></div>
|
| 153 |
+
{/if}
|
| 154 |
+
{/each}
|
| 155 |
+
</div>
|
| 156 |
+
</div>
|
| 157 |
+
|
| 158 |
+
<style>
|
| 159 |
+
.compare-layout {
|
| 160 |
+
width: 100%;
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
/* Delta summary bar — above both columns */
|
| 164 |
+
.compare-delta-bar {
|
| 165 |
+
border: 1px solid var(--rule-soft);
|
| 166 |
+
background: var(--paper-deep);
|
| 167 |
+
padding: var(--s-3) var(--s-4);
|
| 168 |
+
margin-bottom: var(--s-5);
|
| 169 |
+
display: flex;
|
| 170 |
+
gap: var(--s-4);
|
| 171 |
+
align-items: flex-start;
|
| 172 |
+
flex-wrap: wrap;
|
| 173 |
+
}
|
| 174 |
+
.compare-delta-title {
|
| 175 |
+
font-family: var(--font-mono);
|
| 176 |
+
font-size: 10px;
|
| 177 |
+
font-weight: 600;
|
| 178 |
+
letter-spacing: 0.1em;
|
| 179 |
+
text-transform: uppercase;
|
| 180 |
+
color: var(--ink-tertiary);
|
| 181 |
+
flex-shrink: 0;
|
| 182 |
+
padding-top: 1px;
|
| 183 |
+
}
|
| 184 |
+
.compare-delta-rows {
|
| 185 |
+
display: flex;
|
| 186 |
+
flex-wrap: wrap;
|
| 187 |
+
gap: var(--s-2) var(--s-5);
|
| 188 |
+
flex: 1;
|
| 189 |
+
}
|
| 190 |
+
.compare-delta-row {
|
| 191 |
+
display: inline-flex;
|
| 192 |
+
align-items: baseline;
|
| 193 |
+
gap: var(--s-2);
|
| 194 |
+
font-family: var(--font-mono);
|
| 195 |
+
font-size: 12px;
|
| 196 |
+
}
|
| 197 |
+
.compare-delta-section {
|
| 198 |
+
color: var(--ink-tertiary);
|
| 199 |
+
text-transform: uppercase;
|
| 200 |
+
letter-spacing: 0.08em;
|
| 201 |
+
font-size: 10px;
|
| 202 |
+
flex-shrink: 0;
|
| 203 |
+
}
|
| 204 |
+
.compare-delta-claim {
|
| 205 |
+
color: var(--ink);
|
| 206 |
+
display: inline-flex;
|
| 207 |
+
align-items: baseline;
|
| 208 |
+
gap: 3px;
|
| 209 |
+
}
|
| 210 |
+
.compare-delta-ctx {
|
| 211 |
+
color: var(--ink-secondary);
|
| 212 |
+
margin-right: 2px;
|
| 213 |
+
}
|
| 214 |
+
.compare-delta-a,
|
| 215 |
+
.compare-delta-b {
|
| 216 |
+
color: var(--accent);
|
| 217 |
+
font-weight: 600;
|
| 218 |
+
}
|
| 219 |
+
.compare-delta-vs {
|
| 220 |
+
color: var(--ink-tertiary);
|
| 221 |
+
font-style: italic;
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
/* Two-column layout on desktop */
|
| 225 |
+
.compare-cols {
|
| 226 |
+
display: grid;
|
| 227 |
+
grid-template-columns: 1fr 1px 1fr;
|
| 228 |
+
gap: 0 var(--s-5);
|
| 229 |
+
align-items: start;
|
| 230 |
+
}
|
| 231 |
+
.compare-col {
|
| 232 |
+
min-width: 0;
|
| 233 |
+
}
|
| 234 |
+
/* Vertical rule between the two columns */
|
| 235 |
+
.compare-divider {
|
| 236 |
+
background: var(--rule-soft);
|
| 237 |
+
align-self: stretch;
|
| 238 |
+
}
|
| 239 |
+
|
| 240 |
+
/* Address header — same mono treatment as .region-head-meta but larger */
|
| 241 |
+
.compare-address-header {
|
| 242 |
+
font-family: var(--font-mono);
|
| 243 |
+
font-size: 13px;
|
| 244 |
+
font-weight: 600;
|
| 245 |
+
letter-spacing: 0.04em;
|
| 246 |
+
color: var(--ink);
|
| 247 |
+
border-bottom: 1px solid var(--rule-soft);
|
| 248 |
+
padding-bottom: var(--s-2);
|
| 249 |
+
margin-top: 0;
|
| 250 |
+
margin-bottom: var(--s-4);
|
| 251 |
+
line-height: 1.4;
|
| 252 |
+
}
|
| 253 |
+
|
| 254 |
+
/* Narrow viewport (< 900 px): stack columns vertically */
|
| 255 |
+
@media (max-width: 899px) {
|
| 256 |
+
.compare-cols {
|
| 257 |
+
grid-template-columns: 1fr;
|
| 258 |
+
gap: 0;
|
| 259 |
+
}
|
| 260 |
+
.compare-divider {
|
| 261 |
+
width: 100%;
|
| 262 |
+
height: 1px;
|
| 263 |
+
margin: var(--s-5) 0;
|
| 264 |
+
align-self: auto;
|
| 265 |
+
}
|
| 266 |
+
}
|
| 267 |
+
</style>
|
|
@@ -2,6 +2,7 @@
|
|
| 2 |
import { page } from '$app/state';
|
| 3 |
import { onMount } from 'svelte';
|
| 4 |
import Briefing from '$lib/components/briefing/Briefing.svelte';
|
|
|
|
| 5 |
import CitationDrawer from '$lib/components/briefing/CitationDrawer.svelte';
|
| 6 |
import TraceUI from '$lib/components/trace/TraceUI.svelte';
|
| 7 |
import RipMap from '$lib/components/map/RipMap.svelte';
|
|
@@ -640,7 +641,16 @@
|
|
| 640 |
{/if}
|
| 641 |
{/if}
|
| 642 |
|
| 643 |
-
{#if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 644 |
<Briefing {blocks} {citations} streaming={false} />
|
| 645 |
{#if !streamDone}
|
| 646 |
<span class="streaming-caret" aria-hidden="true">▍</span>
|
|
|
|
| 2 |
import { page } from '$app/state';
|
| 3 |
import { onMount } from 'svelte';
|
| 4 |
import Briefing from '$lib/components/briefing/Briefing.svelte';
|
| 5 |
+
import CompareBriefing from '$lib/components/briefing/CompareBriefing.svelte';
|
| 6 |
import CitationDrawer from '$lib/components/briefing/CitationDrawer.svelte';
|
| 7 |
import TraceUI from '$lib/components/trace/TraceUI.svelte';
|
| 8 |
import RipMap from '$lib/components/map/RipMap.svelte';
|
|
|
|
| 641 |
{/if}
|
| 642 |
{/if}
|
| 643 |
|
| 644 |
+
{#if plan?.intent === 'compare' && finalResult?.targets?.length === 2}
|
| 645 |
+
<!-- Compare intent: two-column layout with delta summary row.
|
| 646 |
+
Shown only after the final event lands so the streaming path
|
| 647 |
+
(which renders PLACE A then PLACE B sequentially) stays intact. -->
|
| 648 |
+
<CompareBriefing
|
| 649 |
+
paragraph={finalResult.paragraph}
|
| 650 |
+
{citations}
|
| 651 |
+
targets={finalResult.targets}
|
| 652 |
+
/>
|
| 653 |
+
{:else if blocks.length}
|
| 654 |
<Briefing {blocks} {citations} streaming={false} />
|
| 655 |
{#if !streamDone}
|
| 656 |
<span class="streaming-caret" aria-hidden="true">▍</span>
|
|
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* E2E test for the compare-intent two-column layout.
|
| 3 |
+
*
|
| 4 |
+
* Navigates to a compare query, waits for the SSE pipeline to finish
|
| 5 |
+
* (both single_address sub-runs + Mellea reconcile), then asserts:
|
| 6 |
+
* 1. Two `.address-header` elements are in the DOM — one per target.
|
| 7 |
+
* 2. The comparison delta summary bar is present.
|
| 8 |
+
* 3. No ErrorCard is rendered.
|
| 9 |
+
* 4. No JS console errors.
|
| 10 |
+
*
|
| 11 |
+
* Budget: 360 s (two full single_address pipelines in series).
|
| 12 |
+
*
|
| 13 |
+
* Run: npm run test:e2e -- --grep compare
|
| 14 |
+
*/
|
| 15 |
+
import { test, expect } from '@playwright/test';
|
| 16 |
+
import { mkdirSync } from 'node:fs';
|
| 17 |
+
|
| 18 |
+
const COMPARE_QUERY = 'Compare 80 Pioneer Street Brooklyn to 100 Gold Street Manhattan';
|
| 19 |
+
const SCREENSHOT_DIR = 'test-results/demo-screenshots';
|
| 20 |
+
mkdirSync(SCREENSHOT_DIR, { recursive: true });
|
| 21 |
+
|
| 22 |
+
test.describe('@compare two-column layout', () => {
|
| 23 |
+
test.describe.configure({ mode: 'serial', timeout: 360_000 });
|
| 24 |
+
|
| 25 |
+
test('compare renders two address headers and delta bar', async ({ page }) => {
|
| 26 |
+
await page.setViewportSize({ width: 1440, height: 900 });
|
| 27 |
+
|
| 28 |
+
const consoleErrors: string[] = [];
|
| 29 |
+
page.on('console', (msg) => {
|
| 30 |
+
if (msg.type() === 'error') consoleErrors.push(msg.text());
|
| 31 |
+
});
|
| 32 |
+
|
| 33 |
+
await page.goto(`/q/${encodeURIComponent(COMPARE_QUERY)}`, {
|
| 34 |
+
waitUntil: 'domcontentloaded'
|
| 35 |
+
});
|
| 36 |
+
|
| 37 |
+
// Wait until the compare layout renders (two address headers) or an
|
| 38 |
+
// error card surfaces.
|
| 39 |
+
await page.waitForFunction(
|
| 40 |
+
() => {
|
| 41 |
+
const errCard = document.querySelector('.error-card');
|
| 42 |
+
const headers = document.querySelectorAll('.address-header');
|
| 43 |
+
return Boolean(errCard) || headers.length >= 2;
|
| 44 |
+
},
|
| 45 |
+
undefined,
|
| 46 |
+
{ timeout: 360_000 }
|
| 47 |
+
);
|
| 48 |
+
|
| 49 |
+
// No error card should appear for two valid NYC addresses.
|
| 50 |
+
await expect(page.locator('.error-card'), 'no ErrorCard for valid compare query')
|
| 51 |
+
.toHaveCount(0);
|
| 52 |
+
|
| 53 |
+
// Two address headers — one per compare target.
|
| 54 |
+
const headers = page.locator('.address-header');
|
| 55 |
+
await expect(headers, 'exactly two address-header elements').toHaveCount(2);
|
| 56 |
+
|
| 57 |
+
// Each header should contain non-empty text.
|
| 58 |
+
const textA = (await headers.nth(0).textContent())?.trim();
|
| 59 |
+
const textB = (await headers.nth(1).textContent())?.trim();
|
| 60 |
+
expect(textA, 'PLACE A header has address text').toBeTruthy();
|
| 61 |
+
expect(textB, 'PLACE B header has address text').toBeTruthy();
|
| 62 |
+
expect(textA, 'PLACE A and PLACE B headers differ').not.toBe(textB);
|
| 63 |
+
|
| 64 |
+
// Delta summary bar should be present (if any numbers differ between
|
| 65 |
+
// the two addresses, which is expected for two distinct NYC locations).
|
| 66 |
+
const deltaBar = page.locator('.compare-delta-bar');
|
| 67 |
+
const deltaCount = await deltaBar.count();
|
| 68 |
+
// Delta bar is conditional — present when numbers differ; just log if absent.
|
| 69 |
+
console.log(`[compare] delta bar present: ${deltaCount > 0}`);
|
| 70 |
+
|
| 71 |
+
// Briefing prose sections rendered in both columns.
|
| 72 |
+
const sectionHeads = page.locator('.briefing-section-head');
|
| 73 |
+
const headCount = await sectionHeads.count();
|
| 74 |
+
expect(headCount, 'at least two section heads (one per column)').toBeGreaterThanOrEqual(2);
|
| 75 |
+
|
| 76 |
+
// No console errors.
|
| 77 |
+
const filteredErrors = consoleErrors.filter(
|
| 78 |
+
(e) => !e.includes('favicon') && !e.includes('maplibre-gl')
|
| 79 |
+
);
|
| 80 |
+
expect(filteredErrors, `console errors: ${filteredErrors.join(' | ')}`).toEqual([]);
|
| 81 |
+
|
| 82 |
+
await page.screenshot({
|
| 83 |
+
path: `${SCREENSHOT_DIR}/compare.png`,
|
| 84 |
+
fullPage: true
|
| 85 |
+
});
|
| 86 |
+
|
| 87 |
+
console.log(
|
| 88 |
+
`[compare] headers="${textA}" / "${textB}" · sections=${headCount} · delta=${deltaCount > 0}`
|
| 89 |
+
);
|
| 90 |
+
});
|
| 91 |
+
|
| 92 |
+
test('compare two-column layout stacks on narrow viewport', async ({ page }) => {
|
| 93 |
+
// 800 px < 900 px breakpoint — columns should stack vertically.
|
| 94 |
+
await page.setViewportSize({ width: 800, height: 900 });
|
| 95 |
+
|
| 96 |
+
await page.goto(`/q/${encodeURIComponent(COMPARE_QUERY)}`, {
|
| 97 |
+
waitUntil: 'domcontentloaded'
|
| 98 |
+
});
|
| 99 |
+
|
| 100 |
+
await page.waitForFunction(
|
| 101 |
+
() => document.querySelectorAll('.address-header').length >= 2 ||
|
| 102 |
+
Boolean(document.querySelector('.error-card')),
|
| 103 |
+
undefined,
|
| 104 |
+
{ timeout: 360_000 }
|
| 105 |
+
);
|
| 106 |
+
|
| 107 |
+
// On narrow viewport the two columns exist in the DOM but stack.
|
| 108 |
+
const headers = page.locator('.address-header');
|
| 109 |
+
await expect(headers).toHaveCount(2);
|
| 110 |
+
|
| 111 |
+
// Verify the compare-cols grid is single-column (stacked).
|
| 112 |
+
const cols = page.locator('.compare-cols');
|
| 113 |
+
if (await cols.count() > 0) {
|
| 114 |
+
const gridCols = await cols.evaluate(
|
| 115 |
+
(el) => window.getComputedStyle(el).gridTemplateColumns
|
| 116 |
+
);
|
| 117 |
+
// On single-column, gridTemplateColumns is a single track value.
|
| 118 |
+
expect(gridCols, 'stacked: single grid column track').not.toContain('1px');
|
| 119 |
+
}
|
| 120 |
+
});
|
| 121 |
+
});
|