@suveren/gateway 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,12 +18,24 @@
18
18
  "type": "text",
19
19
  "placeholder": "Leave empty for local SQLite",
20
20
  "optional": true
21
+ },
22
+ {
23
+ "key": "mode",
24
+ "label": "Mode (optional)",
25
+ "type": "text",
26
+ "placeholder": "simulation (default) — live needs an adapter for your CRM",
27
+ "optional": true
21
28
  }
22
29
  ],
23
30
  "envMapping": {
24
- "DATABASE_URL": "databaseUrl"
31
+ "DATABASE_URL": "databaseUrl",
32
+ "CRM_MODE": "mode"
25
33
  }
26
34
  },
35
+ "simulation": {
36
+ "field": "mode",
37
+ "default": "simulation"
38
+ },
27
39
  "personalDefault": true,
28
40
  "oauth": null,
29
41
  "toolGating": {
@@ -118,6 +130,14 @@
118
130
  "category": "read",
119
131
  "boundField": "export_access",
120
132
  "requiredValue": "allowed"
133
+ },
134
+ "load_simulation": {
135
+ "executionMapping": {},
136
+ "staticExecution": {
137
+ "contact_type": "customer",
138
+ "action_type": "setup"
139
+ },
140
+ "actionLabel": "Test data loaded"
121
141
  }
122
142
  }
123
143
  },
@@ -130,7 +150,8 @@
130
150
  "bounds": {
131
151
  "read_access": "unlimited",
132
152
  "write_daily_max": "50",
133
- "delete_daily_max": "0"
153
+ "delete_daily_max": "0",
154
+ "setup_daily_max": "0"
134
155
  },
135
156
  "context": {
136
157
  "contact_type": "customer,lead,partner,vendor"
@@ -150,7 +171,8 @@
150
171
  "bounds": {
151
172
  "read_access": "unlimited",
152
173
  "write_daily_max": "50",
153
- "delete_daily_max": "10"
174
+ "delete_daily_max": "10",
175
+ "setup_daily_max": "0"
154
176
  },
155
177
  "context": {
156
178
  "contact_type": "customer,lead,partner,vendor"
@@ -162,6 +184,28 @@
162
184
  "10 deletes/day",
163
185
  "review mode"
164
186
  ]
187
+ },
188
+ {
189
+ "name": "Load test data (with approval)",
190
+ "description": "Load a simulation package (customers and optional contacts) into the simulated CRM, for setting up a three-week test. No browsing, writing, or deleting — this template grants nothing but the one-time test-data load, and it still requires your approval.",
191
+ "risk": "high",
192
+ "mode": "review",
193
+ "bounds": {
194
+ "read_access": "none",
195
+ "write_daily_max": "0",
196
+ "delete_daily_max": "0",
197
+ "setup_daily_max": "1"
198
+ },
199
+ "context": {
200
+ "contact_type": "customer"
201
+ },
202
+ "intent": "Allow the agent to load one simulation package of test data into the simulated CRM, for my review before it happens. No other CRM action is granted by this mandate — set up test data separately from the mandate the agent uses for its actual work.",
203
+ "ttl": 2592000,
204
+ "tags": [
205
+ "setup only",
206
+ "review mode",
207
+ "1 load"
208
+ ]
165
209
  }
166
210
  ],
167
211
  "setupHint": "No configuration needed — works out of the box.",
@@ -18,12 +18,24 @@
18
18
  "type": "text",
19
19
  "placeholder": "Leave empty for local SQLite",
20
20
  "optional": true
21
+ },
22
+ {
23
+ "key": "mode",
24
+ "label": "Mode (optional)",
25
+ "type": "text",
26
+ "placeholder": "simulation (default) — live needs an adapter for your ERP",
27
+ "optional": true
21
28
  }
22
29
  ],
23
30
  "envMapping": {
24
- "DATABASE_URL": "databaseUrl"
31
+ "DATABASE_URL": "databaseUrl",
32
+ "ERP_MODE": "mode"
25
33
  }
26
34
  },
35
+ "simulation": {
36
+ "field": "mode",
37
+ "default": "simulation"
38
+ },
27
39
  "personalDefault": true,
28
40
  "oauth": null,
29
41
  "toolGating": {
@@ -115,6 +127,13 @@
115
127
  "action_type": "order"
116
128
  },
117
129
  "actionLabel": "Quote converted to order"
130
+ },
131
+ "load_simulation": {
132
+ "executionMapping": {},
133
+ "staticExecution": {
134
+ "action_type": "setup"
135
+ },
136
+ "actionLabel": "Test data loaded"
118
137
  }
119
138
  }
120
139
  },
@@ -131,7 +150,8 @@
131
150
  "order_value_daily_max": "0",
132
151
  "quote_daily_max": "20",
133
152
  "send_daily_max": "0",
134
- "order_daily_max": "0"
153
+ "order_daily_max": "0",
154
+ "setup_daily_max": "0"
135
155
  },
136
156
  "context": {
137
157
  "currency": "EUR"
@@ -156,7 +176,8 @@
156
176
  "order_value_daily_max": "50000",
157
177
  "quote_daily_max": "50",
158
178
  "send_daily_max": "20",
159
- "order_daily_max": "10"
179
+ "order_daily_max": "10",
180
+ "setup_daily_max": "0"
160
181
  },
161
182
  "context": {
162
183
  "currency": "EUR"
@@ -168,6 +189,32 @@
168
189
  "review mode",
169
190
  "10 orders/day"
170
191
  ]
192
+ },
193
+ {
194
+ "name": "Load test data (with approval)",
195
+ "description": "Load a simulation package (customers and products) into the simulated ERP, for setting up a three-week test. No quoting, sending, or ordering — this template grants nothing but the one-time test-data load, and it still requires your approval.",
196
+ "risk": "high",
197
+ "mode": "review",
198
+ "bounds": {
199
+ "read_access": "none",
200
+ "value_max": "0",
201
+ "discount_max": "0",
202
+ "order_value_daily_max": "0",
203
+ "quote_daily_max": "0",
204
+ "send_daily_max": "0",
205
+ "order_daily_max": "0",
206
+ "setup_daily_max": "1"
207
+ },
208
+ "context": {
209
+ "currency": "EUR"
210
+ },
211
+ "intent": "Allow the agent to load one simulation package of test data into the simulated ERP, for my review before it happens. No other ERP action is granted by this mandate — set up test data separately from the mandate the agent uses for its actual work.",
212
+ "ttl": 2592000,
213
+ "tags": [
214
+ "setup only",
215
+ "review mode",
216
+ "1 load"
217
+ ]
171
218
  }
172
219
  ],
173
220
  "setupHint": "No configuration needed — works out of the box.",
@@ -7,6 +7,7 @@
7
7
  "linkedin": "linkedin.json",
8
8
  "calendar": "calendar.json",
9
9
  "deploy-github": "deploy-github.json",
10
- "erp": "erp.json"
10
+ "erp": "erp.json",
11
+ "mail": "mail.json"
11
12
  }
12
13
  }
@@ -0,0 +1,147 @@
1
+ {
2
+ "id": "mail",
3
+ "name": "Email (simulation)",
4
+ "version": "1.0.0",
5
+ "description": "Simulated inbox for testing an agent's email replies — nothing leaves the laptop",
6
+ "icon": "mail",
7
+ "profile": "email",
8
+ "npmPackage": "@humanagencyp/email-mcp",
9
+ "mcp": {
10
+ "command": "email-mcp",
11
+ "args": []
12
+ },
13
+ "credentials": {
14
+ "fields": [
15
+ {
16
+ "key": "mode",
17
+ "label": "Mode (optional)",
18
+ "type": "text",
19
+ "placeholder": "simulation (default) — live needs a mailbox adapter",
20
+ "optional": true
21
+ },
22
+ {
23
+ "key": "databaseUrl",
24
+ "label": "Database URL (optional)",
25
+ "type": "text",
26
+ "placeholder": "Leave empty for local SQLite",
27
+ "optional": true
28
+ }
29
+ ],
30
+ "envMapping": {
31
+ "EMAIL_MODE": "mode",
32
+ "DATABASE_URL": "databaseUrl"
33
+ }
34
+ },
35
+ "simulation": {
36
+ "field": "mode",
37
+ "default": "simulation"
38
+ },
39
+ "personalDefault": false,
40
+ "oauth": null,
41
+ "toolGating": {
42
+ "default": {
43
+ "executionMapping": {},
44
+ "staticExecution": {}
45
+ },
46
+ "overrides": {
47
+ "list_messages": {
48
+ "category": "read",
49
+ "boundField": "read_access",
50
+ "requiredValue": "unlimited"
51
+ },
52
+ "get_message": {
53
+ "category": "read",
54
+ "boundField": "read_access",
55
+ "requiredValue": "unlimited"
56
+ },
57
+ "send_message": {
58
+ "executionMapping": {
59
+ "to": [
60
+ {
61
+ "field": "recipient_count",
62
+ "transform": "length"
63
+ },
64
+ {
65
+ "field": "allowed_recipients",
66
+ "transform": "join"
67
+ },
68
+ {
69
+ "field": "allowed_domains",
70
+ "transform": "join_domains"
71
+ }
72
+ ]
73
+ },
74
+ "staticExecution": {
75
+ "action_type": "send"
76
+ },
77
+ "actionLabel": "Email sent"
78
+ },
79
+ "load_simulation": {
80
+ "executionMapping": {},
81
+ "staticExecution": {
82
+ "action_type": "setup"
83
+ },
84
+ "actionLabel": "Test data loaded"
85
+ }
86
+ }
87
+ },
88
+ "templates": [
89
+ {
90
+ "name": "Work the inbox",
91
+ "description": "Read the simulated inbox and send replies. Cannot load or replace test data.",
92
+ "risk": "low",
93
+ "mode": "automatic",
94
+ "bounds": {
95
+ "read_access": "unlimited",
96
+ "recipient_max": "1",
97
+ "send_daily_max": "50",
98
+ "setup_daily_max": "0"
99
+ },
100
+ "context": {
101
+ "allowed_recipients": "",
102
+ "allowed_domains": ""
103
+ },
104
+ "intent": "Allow the agent to read the simulated inbox and reply to messages on its own. It cannot load or replace the test data the inbox was seeded with.",
105
+ "ttl": 2592000,
106
+ "tags": [
107
+ "read + reply",
108
+ "automatic",
109
+ "no setup"
110
+ ]
111
+ },
112
+ {
113
+ "name": "Load test data (with approval)",
114
+ "description": "Load a simulation package into an empty inbox. No reading or sending — a separate, one-time setup mandate.",
115
+ "risk": "high",
116
+ "mode": "review",
117
+ "bounds": {
118
+ "read_access": "none",
119
+ "recipient_max": "0",
120
+ "send_daily_max": "0",
121
+ "setup_daily_max": "1"
122
+ },
123
+ "context": {
124
+ "allowed_recipients": "",
125
+ "allowed_domains": ""
126
+ },
127
+ "intent": "Allow the agent to load one simulation package into an empty inbox, with my review before it happens. No reading or sending under this mandate — grant it separately from the mandate the agent uses for its daily work.",
128
+ "ttl": 2592000,
129
+ "tags": [
130
+ "setup only",
131
+ "review mode",
132
+ "1 load/day"
133
+ ]
134
+ }
135
+ ],
136
+ "setupHint": "No configuration needed — works out of the box, in simulation mode.",
137
+ "setupGuide": [
138
+ {
139
+ "title": "Ready to use",
140
+ "description": "This connector stores a simulated inbox locally on your machine. Nothing is sent anywhere until you load test data with a separate, reviewed setup mandate."
141
+ },
142
+ {
143
+ "title": "Optional: use a shared database",
144
+ "description": "For team use, provide a PostgreSQL connection string in the Database URL field. Otherwise, leave it empty to use local SQLite storage."
145
+ }
146
+ ]
147
+ }
@@ -831,9 +831,22 @@ function buildPinnedHttpsAgent(getPinning) {
831
831
  ca: effectiveCa()
832
832
  });
833
833
  }
834
+ var DEFAULT_AS_FETCH_TIMEOUT_MS = 15e3;
835
+ function withBoundedSignal(init) {
836
+ const timeout = AbortSignal.timeout(DEFAULT_AS_FETCH_TIMEOUT_MS);
837
+ const signal = init?.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
838
+ return { ...init, signal };
839
+ }
840
+ function closeAfter(dispatcher, pending) {
841
+ pending.catch(() => {
842
+ }).finally(() => {
843
+ void dispatcher.close().catch(() => {
844
+ });
845
+ });
846
+ }
834
847
  async function fetchAs(url, init, pinning) {
835
848
  if (!pinning.enforce && !pinning.capture) {
836
- const res2 = await fetch(url, init);
849
+ const res2 = await fetch(url, withBoundedSignal(init));
837
850
  return { res: res2 };
838
851
  }
839
852
  if (pinning.enforce && !pinning.capture && !pinning.pinnedSpkiHex) {
@@ -843,8 +856,10 @@ async function fetchAs(url, init, pinning) {
843
856
  }
844
857
  if (pinning.pinnedSpkiHex && (pinning.enforce || !pinning.capture)) {
845
858
  const dispatcher2 = buildPinnedDispatcher(pinning.pinnedSpkiHex);
859
+ const pending2 = undiciFetch(url, { ...withBoundedSignal(init), dispatcher: dispatcher2 });
860
+ closeAfter(dispatcher2, pending2);
846
861
  try {
847
- const res2 = await undiciFetch(url, { ...init, dispatcher: dispatcher2 });
862
+ const res2 = await pending2;
848
863
  return { res: res2 };
849
864
  } catch (err) {
850
865
  if (!isPinCheckError(err)) throw err;
@@ -854,9 +869,11 @@ async function fetchAs(url, init, pinning) {
854
869
  }
855
870
  }
856
871
  const { dispatcher, getCapturedCert } = buildCapturingDispatcher();
872
+ const pending = undiciFetch(url, { ...withBoundedSignal(init), dispatcher });
873
+ closeAfter(dispatcher, pending);
857
874
  let res;
858
875
  try {
859
- res = await undiciFetch(url, { ...init, dispatcher });
876
+ res = await pending;
860
877
  } catch (err) {
861
878
  if (!isPinCheckError(err)) throw err;
862
879
  throw new AsTlsMismatchError(
@@ -1208,7 +1225,12 @@ function createAuthRouter(vault2, logoutAuth, loginRateLimit2, onSessionEstablis
1208
1225
  // identifies itself this way; without it, a 24-hour browser
1209
1226
  // session (see doc at the top of this file).
1210
1227
  ...clientVersionHeaders()
1211
- }
1228
+ },
1229
+ // Belt-and-suspenders on top of fetchAs's own default bound
1230
+ // (as-tls-pin.ts): this is the exact call that hung in
1231
+ // production (2026-10-02) with NO timeout at all — a dead
1232
+ // keep-alive socket left the whole login request stuck forever.
1233
+ signal: AbortSignal.timeout(1e4)
1212
1234
  },
1213
1235
  sessionPinning
1214
1236
  );
@@ -1218,7 +1240,11 @@ function createAuthRouter(vault2, logoutAuth, loginRateLimit2, onSessionEstablis
1218
1240
  res.status(409).json({ error: "as_tls_mismatch", message: err.message });
1219
1241
  return;
1220
1242
  }
1221
- throw err;
1243
+ res.status(502).json({
1244
+ error: "as_unreachable",
1245
+ message: `Could not reach the Authority Server at ${SP_URL2} to sign in \u2014 ${err instanceof Error ? err.message : String(err)}. Refusing to sign in.`
1246
+ });
1247
+ return;
1222
1248
  }
1223
1249
  if (!spRes.ok) {
1224
1250
  const err = await spRes.json().catch(() => ({ error: "Invalid API key" }));
@@ -1366,7 +1392,16 @@ function createAuthRouter(vault2, logoutAuth, loginRateLimit2, onSessionEstablis
1366
1392
  unconfigureSession(),
1367
1393
  cookie ? fetchAs(
1368
1394
  `${SP_URL2}/api/auth/logout`,
1369
- { method: "POST", headers: { cookie, ...clientVersionHeaders() }, redirect: "manual" },
1395
+ {
1396
+ method: "POST",
1397
+ headers: { cookie, ...clientVersionHeaders() },
1398
+ redirect: "manual",
1399
+ // Same reasoning as the session call above — this sat with no
1400
+ // timeout of its own before, which would have hung the
1401
+ // `Promise.allSettled` below (and this handler's response)
1402
+ // forever on a dead connection.
1403
+ signal: AbortSignal.timeout(1e4)
1404
+ },
1370
1405
  logoutPinning
1371
1406
  ).catch((err) => {
1372
1407
  if (err instanceof AsTlsMismatchError) {
@@ -324,9 +324,22 @@ function buildCapturingDispatcher() {
324
324
  });
325
325
  return { dispatcher, getCapturedCert: () => captured };
326
326
  }
327
+ var DEFAULT_AS_FETCH_TIMEOUT_MS = 15e3;
328
+ function withBoundedSignal(init) {
329
+ const timeout = AbortSignal.timeout(DEFAULT_AS_FETCH_TIMEOUT_MS);
330
+ const signal = init?.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
331
+ return { ...init, signal };
332
+ }
333
+ function closeAfter(dispatcher, pending) {
334
+ pending.catch(() => {
335
+ }).finally(() => {
336
+ void dispatcher.close().catch(() => {
337
+ });
338
+ });
339
+ }
327
340
  async function fetchAs(url, init, pinning) {
328
341
  if (!pinning.enforce && !pinning.capture) {
329
- const res2 = await fetch(url, init);
342
+ const res2 = await fetch(url, withBoundedSignal(init));
330
343
  return { res: res2 };
331
344
  }
332
345
  if (pinning.enforce && !pinning.capture && !pinning.pinnedSpkiHex) {
@@ -336,8 +349,10 @@ async function fetchAs(url, init, pinning) {
336
349
  }
337
350
  if (pinning.pinnedSpkiHex && (pinning.enforce || !pinning.capture)) {
338
351
  const dispatcher2 = buildPinnedDispatcher(pinning.pinnedSpkiHex);
352
+ const pending2 = undiciFetch(url, { ...withBoundedSignal(init), dispatcher: dispatcher2 });
353
+ closeAfter(dispatcher2, pending2);
339
354
  try {
340
- const res2 = await undiciFetch(url, { ...init, dispatcher: dispatcher2 });
355
+ const res2 = await pending2;
341
356
  return { res: res2 };
342
357
  } catch (err) {
343
358
  if (!isPinCheckError(err)) throw err;
@@ -347,9 +362,11 @@ async function fetchAs(url, init, pinning) {
347
362
  }
348
363
  }
349
364
  const { dispatcher, getCapturedCert } = buildCapturingDispatcher();
365
+ const pending = undiciFetch(url, { ...withBoundedSignal(init), dispatcher });
366
+ closeAfter(dispatcher, pending);
350
367
  let res;
351
368
  try {
352
- res = await undiciFetch(url, { ...init, dispatcher });
369
+ res = await pending;
353
370
  } catch (err) {
354
371
  if (!isPinCheckError(err)) throw err;
355
372
  throw new AsTlsMismatchError(
@@ -0,0 +1 @@
1
+ @font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/Inter-Regular.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/Inter-Medium.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/Inter-SemiBold.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/Inter-Bold.woff2) format("woff2")}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}:root{--text-primary: #111111;--text-secondary: #111111;--text-tertiary: #111111;--text-muted: #888888;--bg-main: #fafafa;--bg-elevated: #ffffff;--bg-input: #ffffff;--accent: #888888;--accent-subtle: #f0f0f0;--accent-hover: #555555;--border: #e5e5e5;--edit-border: #c7c7c7;--danger: #dc2626;--danger-subtle: #fef2f2;--success: #16a34a;--success-subtle: #f0fdf4;--warning: #d97706;--btn-primary-bg: #111111;--btn-primary-fg: #ffffff;--btn-primary-bg-hover: #000000;--btn-primary-bg-active: #2a2a2a;--icon-filter: brightness(0) invert(1);--primary-glow: rgba(0, 0, 0, .2);--primary-focus-ring: rgba(0, 0, 0, .15);--bg-field: #111111;--text-field: #ffffff;--border-field: #111111;--placeholder-field: rgba(255, 255, 255, .55);--field-focus-ring: rgba(0, 0, 0, .18);--nav-height: 3.5rem;--sidebar-width: 15rem;--content-width: 75rem;--content-padding: 2rem}:root[data-theme=dark]{--text-primary: #ffffff;--text-secondary: #ffffff;--text-tertiary: #ffffff;--text-muted: #888888;--bg-main: #0a0a0a;--bg-elevated: #1a1a1a;--bg-input: #141414;--accent: #888888;--accent-subtle: #1f1f1f;--accent-hover: #bbbbbb;--border: #2a2a2a;--edit-border: #4a4a4a;--danger-subtle: #2a0a0a;--success-subtle: #0a2a0a;--btn-primary-bg: #ffffff;--btn-primary-fg: #000000;--btn-primary-bg-hover: #e5e5e5;--btn-primary-bg-active: #c4c4c4;--icon-filter: brightness(0);--primary-glow: rgba(255, 255, 255, .25);--primary-focus-ring: rgba(255, 255, 255, .2);--bg-field: #ffffff;--text-field: #111111;--border-field: #ffffff;--placeholder-field: rgba(0, 0, 0, .5);--field-focus-ring: rgba(255, 255, 255, .25)}html{scroll-behavior:smooth}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:"cv11","ss01","ss03";font-size:16px;line-height:1.6;color:var(--text-primary);background:var(--bg-main);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width: 1900px){body{font-size:17.5px}}@media (min-width: 2800px){body{font-size:19px}}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4{font-weight:700;letter-spacing:-.02em;line-height:1.2;color:var(--text-primary)}code{background:var(--bg-elevated);border:1px solid var(--border);padding:.15rem .4rem;border-radius:.25rem;font-size:.875em;font-family:SF Mono,Monaco,Cascadia Code,Courier New,monospace}.top-nav{position:fixed;top:0;width:100%;height:var(--nav-height);background:#fafafaeb;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-bottom:1px solid var(--border);z-index:1000}[data-theme=dark] .top-nav{background:#0a0a0aeb}.top-nav-inner{max-width:100%;margin:0 auto;padding:0 1.5rem;height:100%;display:flex;align-items:center;gap:1rem}.logo-group{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.logo-group svg{flex-shrink:0}.logo{font-weight:700;font-size:.95rem;color:var(--text-primary);text-decoration:none}.logo:hover{text-decoration:none}.version-badge{font-size:.65rem;font-weight:600;padding:.15rem .4rem;background:var(--btn-primary-bg);color:var(--btn-primary-fg);border-radius:.25rem}.gw-version{font-size:.7rem;padding:.15rem .4rem;border-radius:.25rem;color:var(--text-muted);background:var(--accent-subtle);font-variant-numeric:tabular-nums;white-space:nowrap}.gw-version[data-stale=true]{color:var(--warning);background:transparent;border:1px solid var(--warning)}.nav-spacer{flex:1}.nav-actions{display:flex;align-items:center;gap:.75rem}.user-chip{display:flex;align-items:center;gap:.5rem;font-size:.8rem;color:var(--text-secondary)}.user-chip strong{color:var(--text-primary)}.user-chip .dot{width:3px;height:3px;border-radius:50%;background:var(--text-tertiary)}.theme-toggle{width:2rem;height:2rem;background:none;border:1px solid var(--border);border-radius:.375rem;cursor:pointer;color:var(--text-secondary);font-size:1rem;display:flex;align-items:center;justify-content:center}.theme-toggle:hover{color:var(--accent);border-color:var(--accent)}.nav-logout{font-size:.8rem;color:var(--text-tertiary);cursor:pointer;background:none;border:none;font-family:inherit}.nav-logout:hover{color:var(--text-primary)}.domain-switcher{position:relative}.domain-switcher-btn{background:none;border:none;font-family:inherit;font-size:.8rem;color:var(--text-secondary);cursor:pointer;display:flex;align-items:center;gap:.25rem;padding:.125rem .25rem;border-radius:.25rem}.domain-switcher-btn:hover{color:var(--accent)}.domain-switcher-arrow{font-size:.6rem;color:var(--text-tertiary)}.domain-switcher-menu{position:absolute;top:calc(100% + .375rem);right:0;min-width:10rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;box-shadow:0 4px 12px #0000001a;z-index:200;padding:.25rem}.domain-switcher-item{display:block;width:100%;text-align:left;background:none;border:none;font-family:inherit;font-size:.8rem;color:var(--text-secondary);padding:.5rem .75rem;border-radius:.375rem;cursor:pointer;white-space:nowrap}.domain-switcher-item:hover{background:var(--accent-subtle);color:var(--text-primary)}.domain-switcher-item.active{color:var(--accent);font-weight:600}.sidebar{position:fixed;top:var(--nav-height);left:0;width:var(--sidebar-width);height:calc(100vh - var(--nav-height));background:var(--bg-elevated);border-right:1px solid var(--border);padding:1rem 0;z-index:900;display:flex;flex-direction:column}.sidebar-nav{list-style:none;padding:0 .5rem;flex:1}.sidebar-item{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;margin-bottom:.125rem;border-radius:.5rem;font-size:.85rem;font-weight:500;color:var(--text-secondary);cursor:pointer;transition:background .15s,color .15s;text-decoration:none}.sidebar-item:hover{background:var(--accent-subtle);color:var(--text-primary);text-decoration:none}.sidebar-item.active{background:var(--accent-subtle);color:var(--accent);font-weight:600}.sidebar-item .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}.sidebar-section-label{font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary);padding:1rem .75rem .375rem}.sidebar-context{padding:.75rem 1rem;border-top:1px solid var(--border);font-size:.75rem;color:var(--text-tertiary)}.sidebar-context .ctx-label{font-weight:600;color:var(--text-secondary);margin-bottom:.125rem}.sidebar-context .ctx-value{color:var(--text-primary);font-weight:500}.main-content{margin-left:var(--sidebar-width);margin-top:var(--nav-height);padding:2rem;min-height:calc(100vh - var(--nav-height))}.main-content.no-sidebar{margin-left:0}.page-inner{max-width:56rem;margin:0 auto}.page-inner:has(.intent-layout){max-width:none}.page-header{margin-bottom:1.5rem}.page-title{font-size:1.5rem;margin-bottom:.25rem}.page-subtitle{font-size:.9rem;color:var(--text-secondary)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1.25rem;font-size:.9rem;font-weight:500;font-family:inherit;border-radius:.5rem;border:none;cursor:pointer;transition:all .2s;text-decoration:none;line-height:1.4}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--btn-primary-bg);color:var(--btn-primary-fg);border:2px solid var(--btn-primary-bg)}.btn-primary:hover:not(:disabled){background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover);color:var(--btn-primary-fg);transform:translateY(-1px);box-shadow:0 4px 12px var(--primary-glow)}.btn-primary:active:not(:disabled){background:var(--btn-primary-bg-active);border-color:var(--btn-primary-bg-active)}.btn-secondary{background:transparent;color:var(--text-primary);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){border-color:var(--btn-primary-bg);color:var(--text-primary);background:var(--accent-subtle)}.btn-ghost{background:transparent;color:var(--text-secondary);border:none;padding:.5rem .75rem}.btn-ghost:hover:not(:disabled){color:var(--text-primary);background:var(--accent-subtle)}.btn-full{width:100%}.btn-sm{padding:.375rem .75rem;font-size:.8rem}.btn-lg{padding:.875rem 2rem;font-size:1rem;font-weight:600}.form-group{margin-bottom:1.25rem}.form-label{display:block;font-size:.875rem;font-weight:600;color:var(--text-primary);margin-bottom:.375rem}.form-input,.form-select,.form-textarea{width:100%;padding:.625rem .75rem;font-size:.9rem;font-family:inherit;color:var(--text-field);background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;outline:none;transition:box-shadow .2s,border-color .2s}.form-input::placeholder,.form-textarea::placeholder{color:var(--placeholder-field);opacity:1}.form-input:focus,.form-textarea:focus,.form-select:focus{box-shadow:0 0 0 3px var(--field-focus-ring)}.form-input:disabled,.form-textarea:disabled,.form-select:disabled{opacity:.55;cursor:not-allowed}.form-input-invalid,.form-input-invalid:focus{border-color:var(--danger);box-shadow:0 0 0 3px #dc26262e}.form-textarea{resize:vertical;min-height:120px;line-height:1.5}.form-hint{font-size:.8rem;color:var(--text-tertiary);margin-top:.375rem}.form-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ffffff' d='M6 8L1 3h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2.25rem}[data-theme=dark] .form-select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23111111' d='M6 8L1 3h10z'/%3E%3C/svg%3E")}.card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.5rem}.card+.card{margin-top:1rem}.card-highlight{animation:hap-card-highlight 2.4s ease-out 1}@keyframes hap-card-highlight{0%{box-shadow:0 0 0 2px var(--accent),0 0 24px var(--accent-subtle);border-color:var(--accent)}60%{box-shadow:0 0 0 2px var(--accent),0 0 24px var(--accent-subtle);border-color:var(--accent)}to{box-shadow:0 0 0 0 transparent,0 0 0 transparent;border-color:var(--border)}}@media (prefers-reduced-motion: reduce){.card-highlight{animation:none;border-color:var(--accent)}}.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.card-title{font-size:1rem;font-weight:600;margin:0}.auth-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;transition:opacity .2s,border-color .2s;cursor:pointer}.auth-card:hover{border-color:var(--accent)}.auth-card+.auth-card{margin-top:.75rem}.auth-card.expired{opacity:.5}.auth-card-header{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem;flex-wrap:wrap}.auth-card-path{font-weight:600;font-size:.95rem}.auth-card-time{font-size:.8rem;color:var(--text-tertiary);margin-left:auto}.success-card{background:var(--accent-subtle);border:1px solid var(--accent);border-radius:.75rem;padding:1.5rem;text-align:center}.success-card-title{font-size:1.1rem;font-weight:700;color:var(--accent);margin-bottom:.5rem}.success-card-hash{font-family:SF Mono,Monaco,monospace;font-size:.8rem;color:var(--text-secondary);word-break:break-all;margin-bottom:.5rem}.status-badge{display:inline-block;padding:.2rem .6rem;border-radius:9999px;font-size:.7rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.status-active{background:var(--accent-subtle);color:var(--accent)}.status-pending{background:var(--danger-subtle);color:var(--danger)}.status-expired{background:var(--bg-elevated);color:var(--text-tertiary)}.status-revoked{background:var(--danger-subtle);color:var(--danger)}.int-chip{display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .6rem;border-radius:9999px;font-size:.7rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.int-chip .int-dot{width:6px;height:6px;border-radius:50%;flex:none}.int-chip-ok{background:var(--success-subtle);color:var(--success)}.int-chip-ok .int-dot{background:var(--success)}.int-chip-bad{background:var(--danger-subtle);color:var(--danger)}.int-chip-bad .int-dot{background:var(--danger)}.int-chip-idle{background:var(--accent-subtle);color:var(--accent)}.int-chip-idle .int-dot{background:#bbb}.int-chip-sim{background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning)}.int-chip-sim .int-dot{background:var(--warning)}.int-details{border-top:1px solid var(--border);padding-top:.7rem;margin-top:.25rem}.int-details>summary{cursor:pointer;font-size:.78rem;color:var(--text-muted);list-style:none;display:flex;align-items:center;gap:.35rem;-webkit-user-select:none;user-select:none}.int-details>summary::-webkit-details-marker{display:none}.int-details>summary:before{content:"▸";font-size:.7rem;transition:transform .15s}.int-details[open]>summary:before{transform:rotate(90deg)}.int-meta{display:grid;grid-template-columns:auto 1fr;gap:.4rem 1rem;font-size:.8rem;margin-top:.7rem}.int-meta .int-k{color:var(--text-muted)}.int-account{font-size:.85rem;display:flex;align-items:center;gap:.5rem}.int-account .int-none{color:var(--text-muted);font-style:italic}.domain-badge{display:inline-block;padding:.2rem .5rem;font-size:.8rem;font-family:SF Mono,Monaco,monospace;background:var(--bg-main);border:1px solid var(--border);border-radius:.25rem;color:var(--text-secondary)}.domain-attested{color:var(--accent);border-color:var(--accent)}.domain-missing{color:var(--text-tertiary)}.profile-badge{display:inline-block;padding:.15rem .5rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;background:var(--accent-subtle);color:var(--accent);border-radius:.25rem}.wizard-progress{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:2.5rem}.wizard-steps{list-style:none;margin:0;padding:0;display:flex;flex:1;max-width:28rem}.wizard-step{flex:1;display:flex;flex-direction:column;align-items:center;position:relative;min-width:0}.wizard-step:not(:first-child):before{content:"";position:absolute;top:calc(1rem - 1px);height:2px;left:calc(-50% + 1.4rem);right:calc(50% + 1.4rem);background:var(--border)}.wizard-step.reached:before{background:var(--accent)}.step-circle{width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;font-family:inherit;font-size:.75rem;font-weight:600;border:2px solid var(--border);color:var(--text-tertiary);background:var(--bg-main);flex-shrink:0;transition:all .2s;cursor:default}.step-circle.completed{background:var(--accent);border-color:var(--accent);color:#fff;cursor:pointer}.step-circle:disabled{cursor:default}.step-circle.current{border-color:var(--accent);color:var(--accent);box-shadow:0 0 0 3px var(--primary-focus-ring)}.step-label-text{margin-top:.4rem;font-size:.65rem;line-height:1.2;text-align:center;color:var(--text-tertiary)}.step-label-text.completed{color:var(--text-secondary)}.step-label-text.current{color:var(--accent);font-weight:600}.wizard-cancel{flex-shrink:0;font-size:.8rem;margin-top:.15rem;margin-left:auto}.alert{padding:.75rem 1rem;border-radius:.5rem;font-size:.875rem;margin-bottom:1rem;color:#fff}.alert-error{background:var(--danger)}.alert-info{background:var(--accent)}.alert-success{background:#1a7f37}.nav-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:1.5rem}.nav-tab{padding:.75rem 1.25rem;font-size:.9rem;font-weight:500;color:var(--text-tertiary);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color .2s;margin-bottom:-1px;font-family:inherit}.nav-tab:hover{color:var(--text-primary)}.nav-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.review-grid{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;font-size:.9rem;margin-bottom:1.5rem}.review-grid dt{font-weight:600;color:var(--text-secondary);padding:.25rem 0}.review-grid dd{color:var(--text-primary);padding:.25rem 0}.gate-content-block{background:var(--bg-main);border:1px solid var(--border);border-radius:.5rem;padding:1rem;font-size:.875rem;margin-bottom:1.5rem}.gate-content-item{margin-bottom:.5rem}.gate-content-item:last-child{margin-bottom:0}.gate-content-label{font-weight:600;color:var(--text-secondary);font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;margin-bottom:.125rem}.gate-content-text{color:var(--text-primary);line-height:1.5}.empty-state{text-align:center;padding:3rem 1.5rem;color:var(--text-tertiary)}.empty-state-icon{font-size:2.5rem;margin-bottom:.75rem;opacity:.5}.empty-state-title{font-size:1rem;font-weight:600;color:var(--text-secondary);margin-bottom:.25rem}.empty-state-text{font-size:.875rem;color:var(--text-tertiary);margin-bottom:1rem;max-width:28rem;margin-left:auto;margin-right:auto}.login-split{margin-top:var(--nav-height);display:flex;min-height:calc(100vh - var(--nav-height))}.login-split-left{flex:1;background:var(--bg-main);display:flex;align-items:center;justify-content:center;padding:4rem 3rem}.login-split-right{flex:1;background:var(--bg-elevated);border-left:1px solid var(--border);display:flex;align-items:center;justify-content:center;padding:4rem 3rem}.login-page{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - var(--nav-height));padding:2rem}.login-card{width:100%;max-width:420px}.login-header{text-align:center;margin-bottom:2rem}.login-title{font-size:1.5rem;font-weight:700;margin-bottom:.5rem}.login-subtitle{font-size:.9rem;color:var(--text-secondary);line-height:1.5}.login-divider{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;font-size:.8rem;color:var(--text-tertiary)}.login-divider:before,.login-divider:after{content:"";flex:1;height:1px;background:var(--border)}.onboarding-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:2rem;max-width:32rem;margin:0 auto}.onboarding-step{display:flex;gap:1rem;margin-bottom:1.25rem}.onboarding-step:last-child{margin-bottom:0}.onboarding-num{width:1.75rem;height:1.75rem;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0;margin-top:.1rem}.onboarding-num.done{background:var(--accent)}.onboarding-text h4{font-size:.9rem;margin-bottom:.125rem}.onboarding-text p{font-size:.825rem;color:var(--text-secondary);line-height:1.5}.selection-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));gap:.75rem;margin-bottom:1.5rem}.selection-card{background:var(--bg-elevated);border:2px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .15s}.selection-card:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:0 4px 12px #0000000f}.selection-card.selected{border-color:var(--accent);background:var(--accent-subtle)}.selection-card-title{font-size:1rem;font-weight:600;margin-bottom:.25rem}.selection-card-subtitle{font-size:.8rem;color:var(--text-secondary);margin-bottom:.5rem}.selection-card-id{font-size:.7rem;color:var(--text-tertiary);margin-bottom:.375rem;word-break:break-all}.selection-card-meta{display:flex;gap:.375rem;flex-wrap:wrap}.dashboard-section{margin-bottom:2rem}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.section-title{font-size:1rem;font-weight:600}.section-count{font-size:.8rem;color:var(--text-tertiary)}.ttl-badge{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;font-weight:600;padding:.2rem .5rem;border-radius:.25rem;font-family:SF Mono,Monaco,monospace}.ttl-ok{background:var(--accent-subtle);color:var(--accent)}.ttl-warn{background:var(--danger-subtle);color:var(--danger)}.quick-actions{display:grid;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));gap:.75rem;margin-bottom:2rem}.quick-action-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .15s;display:flex;align-items:flex-start;gap:.875rem;text-decoration:none;color:inherit}.quick-action-card:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:0 4px 12px #0000000f;text-decoration:none}.quick-action-icon{width:2.5rem;height:2.5rem;border-radius:.5rem;background:var(--accent-subtle);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.quick-action-title{font-size:.9rem;font-weight:600;margin-bottom:.125rem}.quick-action-desc{font-size:.8rem;color:var(--text-secondary)}.pr-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:border-color .15s}.pr-card:hover{border-color:var(--accent)}.pr-card+.pr-card{margin-top:.75rem}.pr-card-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.375rem}.pr-card-repo{font-size:.75rem;color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace}.pr-card-title{font-weight:600;font-size:.95rem}.pr-card-footer{display:flex;align-items:center;gap:.75rem;margin-top:.5rem;flex-wrap:wrap}.member-row{display:flex;align-items:center;gap:.75rem;padding:.75rem 0;border-bottom:1px solid var(--border)}.member-row:last-child{border-bottom:none}.member-avatar{width:2rem;height:2rem;border-radius:50%;background:var(--accent-subtle);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.member-info{flex:1}.member-name{font-size:.9rem;font-weight:600}.member-email{font-size:.75rem;color:var(--text-tertiary)}.member-domains{display:flex;gap:.25rem;flex-wrap:wrap}.char-counter{text-align:right;font-size:.75rem;color:var(--text-tertiary);margin-top:.25rem}.invite-input-row{display:flex;gap:.5rem}.invite-input-row .form-input{flex:1}.service-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;display:flex;align-items:center;gap:1rem;transition:border-color .15s}.service-card:hover{border-color:var(--accent)}.service-card+.service-card{margin-top:.75rem}.service-icon{width:2.75rem;height:2.75rem;border-radius:.625rem;display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.service-icon-configured{background:var(--success-subtle);color:var(--success)}.service-icon-missing{background:var(--bg-main);color:var(--text-tertiary);border:1px dashed var(--border)}.service-icon-error{background:var(--danger-subtle);color:var(--danger)}.service-info{flex:1}.service-name{font-size:.95rem;font-weight:600;margin-bottom:.125rem}.service-desc{font-size:.8rem;color:var(--text-secondary);margin-bottom:.375rem}.service-status{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem;font-weight:600}.service-status-dot{width:6px;height:6px;border-radius:50%}.service-status-connected .service-status-dot{background:var(--success)}.service-status-connected{color:var(--success)}.service-status-missing .service-status-dot{background:var(--text-tertiary)}.service-status-missing{color:var(--text-tertiary)}.service-status-error .service-status-dot{background:var(--danger)}.service-status-error{color:var(--danger)}.service-tools{display:flex;gap:.25rem;flex-wrap:wrap;margin-top:.25rem}.service-tool-badge{display:inline-block;padding:.1rem .4rem;font-size:.65rem;font-family:SF Mono,Monaco,monospace;background:var(--bg-main);border:1px solid var(--border);border-radius:.25rem;color:var(--text-tertiary)}.modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;z-index:1500;display:flex;align-items:center;justify-content:center}.modal{background:var(--bg-elevated);border-radius:.75rem;width:100%;max-width:32rem;max-height:calc(100vh - 4rem);overflow-y:auto;box-shadow:0 16px 48px #00000026}.modal-header{padding:1.5rem 1.5rem 0;display:flex;justify-content:space-between;align-items:flex-start}.modal-title{font-size:1.125rem;font-weight:700}.modal-close{width:2rem;height:2rem;background:none;border:none;cursor:pointer;color:var(--text-tertiary);font-size:1.25rem;display:flex;align-items:center;justify-content:center;border-radius:.375rem}.modal-close:hover{background:var(--bg-main);color:var(--text-primary)}.modal-body{padding:1.25rem 1.5rem}.modal-footer{padding:0 1.5rem 1.5rem;display:flex;gap:.5rem;justify-content:flex-end}.status-banner{padding:.625rem 1rem;font-size:.8rem;display:flex;align-items:center;gap:.5rem;border-radius:.5rem;margin-bottom:1rem}.status-banner-warn{background:var(--accent-subtle);color:var(--accent-hover);border:1px solid var(--accent)}.status-banner-error{background:var(--danger-subtle);color:var(--danger);border:1px solid var(--danger)}.status-banner-success{background:var(--success-subtle);color:var(--success);border:1px solid var(--success)}.status-banner-icon{font-size:1rem;flex-shrink:0}.status-banner-text{flex:1}.status-banner a{font-weight:600}.vault-progress{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.5rem 0}.vault-spinner{width:2rem;height:2rem;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.vault-progress-text{font-size:.875rem;color:var(--text-secondary)}.service-health-row{display:flex;align-items:center;gap:.75rem;padding:.625rem 0;border-bottom:1px solid var(--border);font-size:.85rem}.service-health-row:last-child{border-bottom:none}.service-health-indicator{width:8px;height:8px;border-radius:50%;flex-shrink:0}.service-health-indicator.connected{background:var(--success)}.service-health-indicator.missing{background:var(--text-tertiary)}.service-health-indicator.error{background:var(--danger)}.service-health-name{font-weight:600;flex:1}.service-health-detail{font-size:.75rem;color:var(--text-tertiary)}.cred-field{position:relative}.cred-field .form-input{padding-right:3rem}.cred-toggle{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);background:none;border:none;font-size:.75rem;color:var(--text-tertiary);cursor:pointer;padding:.25rem}.cred-toggle:hover{color:var(--accent)}.context-strip{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.625rem 1rem;margin-bottom:1.5rem;display:flex;align-items:center;gap:.75rem;font-size:.8rem}.context-strip-label{font-weight:600;color:var(--text-secondary)}.timeline{position:relative;padding-left:2rem}.timeline:before{content:"";position:absolute;left:.5rem;top:0;bottom:0;width:2px;background:var(--border)}.timeline-event{position:relative;margin-bottom:1.5rem}.timeline-event:before{content:"";position:absolute;left:-1.625rem;top:.5rem;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--bg-main)}.timeline-event.expired:before{background:var(--text-tertiary)}.error-message{padding:.75rem 1rem;background:#dc262614;border:1px solid var(--danger);border-radius:.5rem;color:var(--danger);font-size:.875rem;margin-bottom:1rem}.mobile-menu-btn{display:none;width:2.25rem;height:2.25rem;background:none;border:1px solid var(--border);border-radius:.375rem;cursor:pointer;color:var(--text-secondary);font-size:1.1rem;align-items:center;justify-content:center;font-family:inherit}.mobile-menu-btn:hover{color:var(--accent);border-color:var(--accent)}.mobile-menu-backdrop{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;z-index:2000}.mobile-menu-panel{display:none;position:fixed;top:0;right:0;bottom:0;width:16rem;background:var(--bg-elevated);border-left:1px solid var(--border);z-index:2001;flex-direction:column;overflow-y:auto}.mobile-menu-header{padding:1.25rem 1rem;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:.25rem}.mobile-menu-nav{flex:1;padding:.5rem;display:flex;flex-direction:column}.mobile-menu-item{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;margin-bottom:.125rem;border-radius:.375rem;font-size:.85rem;color:var(--text-secondary);text-decoration:none;transition:background .15s,color .15s}.mobile-menu-item:hover{background:var(--accent-subtle);color:var(--text-primary)}.mobile-menu-item.active{background:var(--accent-subtle);color:var(--accent);font-weight:600}.mobile-menu-item .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}.mobile-menu-footer{padding:.75rem 1rem;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:.25rem}.mobile-menu-action{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;border-radius:.375rem;font-size:.85rem;color:var(--text-secondary);background:none;border:none;cursor:pointer;font-family:inherit;text-align:left}.mobile-menu-action:hover{background:var(--accent-subtle);color:var(--text-primary)}.mobile-menu-action .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}@media (max-width: 768px){.sidebar{display:none}.main-content{margin-left:0}.quick-actions,.selection-grid{grid-template-columns:1fr}.nav-actions-desktop,.step-label-text{display:none}.mobile-menu-btn{display:flex}.mobile-menu-backdrop{display:block}.mobile-menu-panel{display:flex}.login-split{flex-direction:column;min-height:auto}.login-split-left{padding:3rem 1.5rem;align-items:flex-start}.login-split-right{max-width:none;border-left:none;border-top:1px solid var(--border);padding:2.5rem 1.5rem}}.update-banner{position:fixed;top:var(--nav-height);left:0;right:0;z-index:900;background:#c0392b;color:#fff;border-top:1px solid rgba(0,0,0,.2);border-bottom:1px solid rgba(0,0,0,.2);padding:.6rem 1.25rem;display:flex;flex-direction:column;gap:.6rem}body.has-update-banner .sidebar{top:calc(var(--nav-height) + var(--update-banner-h, 0px));height:calc(100vh - var(--nav-height) - var(--update-banner-h, 0px))}body.has-update-banner .main-content{margin-top:calc(var(--nav-height) + var(--update-banner-h, 0px))}.update-banner-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-width:0}.update-banner-cmd-row{flex-wrap:wrap}.update-banner-text{font-size:.9rem;font-weight:600;color:#fff}.update-banner-cmd{display:block;flex:1;min-width:0;font-size:.78rem;padding:.5rem .75rem;word-break:break-all;white-space:pre-wrap;background:#0003;border:1px solid rgba(255,255,255,.65);border-radius:.375rem;font-family:SF Mono,Fira Code,Fira Mono,Menlo,Consolas,monospace;color:#fff;-webkit-user-select:all;user-select:all}.update-banner-hint{margin:0;font-size:.8rem;color:#ffffffe6}.update-banner .btn-secondary{color:#fff;border-color:#ffffffa6;background:transparent}.update-banner .btn-secondary:hover:not(:disabled){background:#ffffff26;color:#fff;border-color:#fff}.update-banner-x{background:transparent;border:none;color:#ffffffd9;cursor:pointer;font-size:1.15rem;line-height:1;padding:0 .25rem}.update-banner-x:hover{color:#fff}.update-banner.is-live{background:var(--success)}body.is-updating .top-nav,body.is-updating .sidebar,body.is-updating .main-content,body.is-updating .update-banner{filter:blur(5px);pointer-events:none;-webkit-user-select:none;user-select:none}.update-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;display:flex;align-items:center;justify-content:center;background:#11111159;padding:1rem}.update-overlay-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:1rem;padding:2rem 2.25rem;max-width:460px;width:100%;text-align:center;box-shadow:0 20px 60px #00000040}.update-overlay-card h2{margin:0 0 .6rem;font-size:1.15rem}.update-overlay-card p{margin:0 0 .5rem;font-size:.88rem;color:var(--text-muted);line-height:1.55}.update-spinner{width:2.25rem;height:2.25rem;border:3px solid var(--border);border-top-color:var(--text-primary);border-radius:50%;margin:0 auto 1.1rem;animation:update-spin 1s linear infinite}@keyframes update-spin{to{transform:rotate(360deg)}}.update-cmd-row{display:flex;gap:.5rem;align-items:flex-start;margin:.9rem 0;text-align:left}.update-cmd{flex:1;min-width:0;font-size:.78rem;padding:.6rem .75rem;background:#111;color:#fff;border-radius:.45rem;font-family:SF Mono,Fira Code,Fira Mono,Menlo,Consolas,monospace;word-break:break-all;white-space:pre-wrap}.update-status{font-size:.8rem;color:var(--text-muted);margin:.4rem 0 1.1rem;display:flex;align-items:center;justify-content:center;gap:.4rem}.update-pulse{width:.55rem;height:.55rem;border-radius:50%;background:var(--success);animation:update-pulse 1.2s ease infinite}@keyframes update-pulse{0%,to{opacity:.3}50%{opacity:1}}.update-overlay-actions{display:flex;gap:.6rem;justify-content:center}.search-filter-bar{display:flex;gap:.5rem;margin-bottom:.75rem}.search-input-wrap{flex:1;position:relative}.search-icon{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);color:var(--text-tertiary);font-size:1rem;pointer-events:none}.search-input{padding-left:2.25rem!important;padding-right:2rem!important}.search-clear{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-tertiary);font-size:1.1rem;cursor:pointer;padding:.25rem;line-height:1}.search-clear:hover{color:var(--text-primary)}.filter-panel{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:1rem;margin-bottom:.75rem;display:flex;flex-direction:column;gap:.75rem}.filter-section{display:flex;align-items:baseline;gap:.75rem}.filter-label{font-size:.75rem;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;min-width:5rem;flex-shrink:0}.filter-chips{display:flex;flex-wrap:wrap;gap:.375rem}.filter-chip{font-family:inherit;font-size:.8rem;padding:.3rem .625rem;border-radius:1rem;border:1px solid var(--border);background:var(--bg-main);color:var(--text-secondary);cursor:pointer;transition:all .15s}.filter-chip:hover{border-color:var(--accent);color:var(--text-primary)}.filter-chip.selected{background:var(--accent-subtle);border-color:var(--accent);color:var(--accent);font-weight:600}.active-filters{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;margin-bottom:.75rem}.active-chip{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;padding:.2rem .5rem;border-radius:1rem;background:var(--accent-subtle);color:var(--accent);cursor:pointer;transition:background .15s}.active-chip:hover{background:var(--accent);color:var(--bg-elevated)}.chip-remove{font-size:.85rem;line-height:1}.clear-filters{font-family:inherit;font-size:.75rem;color:var(--text-tertiary);background:none;border:none;cursor:pointer;padding:.2rem 0}.clear-filters:hover{color:var(--text-primary)}.receipt-action{display:inline-block;font-size:.75rem;font-weight:600;padding:.15rem .5rem;border-radius:1rem;background:var(--bg-main);border:1px solid var(--border);color:var(--text-secondary);font-family:SF Mono,Monaco,monospace}.bounds-section,.context-section{background:var(--bg-elevated);border:2px solid var(--edit-border);border-radius:.75rem;padding:1.25rem;margin-bottom:1.25rem;transition:border-color .15s}.bounds-section:hover,.bounds-section:focus-within,.context-section:hover,.context-section:focus-within{border-color:var(--accent-hover)}.bounds-section-header{display:flex;align-items:flex-start;gap:.625rem;margin-bottom:1rem}.bounds-section-icon{font-size:1.1rem;flex-shrink:0;margin-top:.1rem}.bounds-section-title{font-size:.9rem;font-weight:700;color:var(--text-primary)}.bounds-section-subtitle{font-size:.75rem;color:var(--text-tertiary)}.bounds-fields-grid{display:flex;flex-direction:column;gap:.75rem}.bounds-field-row{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:1rem;width:100%}.bounds-field-label{flex:1;min-width:0}.bounds-field-label .form-label{display:inline;margin-bottom:0}.bounds-field-input{flex-shrink:0;display:flex;flex-direction:column;align-items:flex-end}.bounds-field-input .bounded-input{align-items:flex-end}.bounds-field-input .bounded-input-presets{justify-content:flex-end}.bounds-field-label-inline{display:flex;align-items:center;gap:.375rem;margin-bottom:.375rem}.bounds-field-label-inline .form-label{margin-bottom:0}.field-info-toggle{display:inline-flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border-radius:50%;border:1px solid var(--border);background:var(--bg-main);color:var(--text-tertiary);font-size:.65rem;font-weight:700;cursor:pointer;flex-shrink:0;transition:color .15s,border-color .15s;font-family:inherit;line-height:1;padding:0}.field-info-toggle:hover{color:var(--accent);border-color:var(--accent)}.field-description{margin-top:.25rem;margin-bottom:.25rem}@media (max-width: 768px){.bounds-field-row{flex-direction:column;gap:.375rem}}.bounded-input{display:flex;flex-direction:column;align-items:flex-start;gap:.375rem}.bounded-input-field{display:inline-flex;align-items:stretch;border:1px solid var(--border-field);border-radius:.5rem;overflow:hidden;background:var(--bg-field);color:var(--text-field)}.stepper-btn{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;font-weight:600;color:var(--text-field);font-family:inherit;flex-shrink:0;transition:background .15s}.stepper-btn:hover:not(:disabled){background:var(--placeholder-field)}.stepper-btn:disabled{opacity:.35;cursor:not-allowed}.stepper-input{width:4.5rem;text-align:center;border:none;border-left:1px solid var(--placeholder-field);border-right:1px solid var(--placeholder-field);padding:.5rem .25rem;font-size:.9rem;font-family:inherit;color:var(--text-field);background:var(--bg-field);outline:none;-moz-appearance:textfield}.stepper-input::-webkit-outer-spin-button,.stepper-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.stepper-input:focus{box-shadow:inset 0 0 0 2px var(--field-focus-ring)}.bounded-input-unit{display:inline-flex;align-items:center;padding:0 .75rem;font-size:.8rem;color:var(--text-field);opacity:.7;white-space:nowrap;-webkit-user-select:none;user-select:none;background:transparent}.bounded-input-presets{display:flex;flex-wrap:wrap;gap:.25rem}.preset-chip{font-family:inherit;font-size:.75rem;padding:.2rem .625rem;border:1px solid var(--border);border-radius:999px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.preset-chip:hover{background:var(--accent-subtle);color:var(--accent);border-color:var(--accent)}.preset-chip-selected{background:var(--accent);color:var(--bg-main);border-color:var(--accent)}.bounded-input-echo{font-size:.75rem;color:var(--text-secondary);font-style:italic}.field-label-with-tip{display:inline-flex;align-items:center;gap:.375rem;position:relative}.field-tip-trigger{display:inline-flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border-radius:999px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);font-size:.7rem;font-style:italic;font-family:serif;font-weight:600;line-height:1;cursor:help;padding:0}.field-tip-trigger:hover,.field-tip-trigger[aria-expanded=true]{border-color:var(--accent);color:var(--accent)}.field-tip-bubble{position:absolute;top:calc(100% + .375rem);left:0;z-index:10;width:max-content;max-width:22rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;font-size:.8rem;color:var(--text-primary);line-height:1.45;box-shadow:0 4px 12px #00000040;pointer-events:none}.tag-input{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.375rem .5rem;background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;cursor:text;min-height:2.5rem;transition:box-shadow .2s,border-color .2s;color:var(--text-field)}.tag-input:focus-within{box-shadow:0 0 0 3px var(--field-focus-ring)}.tag-input-invalid{border-color:var(--danger)}.tag-input-invalid:focus-within{box-shadow:0 0 0 3px #dc26262e}.tag-pill{display:inline-flex;align-items:center;gap:.25rem;font-size:.8rem;padding:.2rem .5rem;border-radius:1rem;background:var(--placeholder-field);color:var(--text-field);font-weight:500;white-space:nowrap}.tag-remove{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;font-size:.9rem;line-height:1;color:var(--text-field);cursor:pointer;padding:0;margin-left:.125rem;opacity:.7;transition:opacity .15s}.tag-remove:hover{opacity:1}.tag-input-field{flex:1;min-width:8rem;border:none;outline:none;background:transparent;font-size:.875rem;font-family:inherit;color:var(--text-field);padding:.2rem 0}.tag-input-field::placeholder{color:var(--placeholder-field);opacity:1}.checkbox-group{display:flex;flex-wrap:wrap;gap:.5rem}.checkbox-pill{display:inline-flex;align-items:center;gap:.35rem;font-size:.85rem;padding:.35rem .75rem;border-radius:1rem;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;transition:all .15s;-webkit-user-select:none;user-select:none}.checkbox-pill input[type=checkbox]{display:none}.checkbox-pill:hover{border-color:var(--accent);color:var(--text-primary)}.checkbox-pill-selected{background:var(--btn-primary-bg);border-color:var(--btn-primary-bg);color:var(--btn-primary-fg);font-weight:500}.checkbox-pill-selected:hover{background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover);color:var(--btn-primary-fg)}@keyframes hap-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton{display:block;position:relative;border-radius:.375rem;background-color:var(--bg-main);background-image:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.06) 20%,rgba(255,255,255,.16) 50%,rgba(255,255,255,.06) 80%,transparent 100%);background-size:200% 100%;background-repeat:no-repeat;animation:hap-skeleton-shimmer 1.6s ease-in-out infinite;will-change:background-position}[data-theme=light] .skeleton,:root:not([data-theme=dark]) .skeleton{background-image:linear-gradient(90deg,transparent 0%,rgba(0,0,0,.03) 20%,rgba(0,0,0,.08) 50%,rgba(0,0,0,.03) 80%,transparent 100%)}.skeleton-title{height:1.5rem;width:3rem;margin:0 auto}.skeleton-line{height:.75rem;width:100%}.skeleton-line-sm{height:.65rem;width:60%}.skeleton-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.75rem 1rem;box-shadow:0 1px 2px #0000000a;display:flex;align-items:center;gap:.75rem}.skeleton-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}@media (prefers-reduced-motion: reduce){.skeleton{animation:none;background-image:none}}.intent-layout{display:grid;grid-template-columns:minmax(320px,1fr) minmax(420px,1.4fr);gap:1.25rem;align-items:start}.intent-pane.chat{display:flex;flex-direction:column;gap:.75rem;position:sticky;top:1rem;align-self:start;max-height:calc(100vh - 4rem)}.intent-pane.document{display:flex;flex-direction:column;gap:.875rem}.intent-pane .card-title{font-size:1.25rem;margin:0 0 1rem}.intent-textarea{width:100%;background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;padding:.625rem .75rem;color:var(--text-field);font-size:.9rem;line-height:1.5;resize:vertical;min-height:22rem;outline:none;font-family:inherit;transition:box-shadow .15s}.intent-textarea:focus{box-shadow:0 0 0 3px var(--field-focus-ring)}.intent-textarea::placeholder{color:var(--placeholder-field);opacity:1}.intent-footer{display:flex;align-items:center;gap:.625rem;margin-top:.5rem}.intent-continue-btn{flex:1}.intent-chat{display:flex;flex-direction:column;gap:.75rem;flex:1;min-height:0}.intent-chat .chat-header{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted)}.intent-chat .chat-messages{flex:1;overflow-y:auto;position:relative;display:flex;flex-direction:column;gap:1rem;padding:.25rem 0;min-height:14rem;max-height:32rem}.intent-chat .chat-msg{display:flex;max-width:100%}.intent-chat .chat-msg.assistant{justify-content:flex-start}.intent-chat .chat-msg.assistant .chat-msg-body{max-width:100%;color:var(--text-primary);font-size:.9rem;line-height:1.65;white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg.user{justify-content:flex-end}.intent-chat .chat-msg.user .chat-msg-body{max-width:85%;background:var(--bg-main);border:1px solid var(--border);border-radius:1.125rem;padding:.55rem .875rem;color:var(--text-primary);font-size:.9rem;line-height:1.55;white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg-prose{white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg-thinking{color:var(--text-muted);font-style:italic}.intent-chat .chat-fenced-block{display:block;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.625rem .75rem;margin:.5rem 0;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:.8rem;white-space:pre-wrap;color:var(--text-primary);line-height:1.55}.intent-chat .chat-apply-btn{margin-top:.5rem}.intent-chat .chat-composer{display:flex;flex-direction:column;gap:.375rem}.intent-chat .chat-composer-pill{display:flex;align-items:center;gap:.5rem;background:var(--bg-field);border:1px solid var(--border-field);border-radius:1.5rem;padding:.25rem .25rem .25rem 1rem;transition:box-shadow .15s;color:var(--text-field)}.intent-chat .chat-composer-pill:focus-within{box-shadow:0 0 0 3px var(--field-focus-ring)}.intent-chat .chat-input{flex:1;resize:none;background:transparent;border:none;padding:.5rem 0;color:var(--text-field);font-size:.9rem;line-height:1.4;outline:none;font-family:inherit;max-height:8rem;align-self:stretch}.intent-chat .chat-input::placeholder{color:var(--placeholder-field);opacity:1}.intent-chat .chat-send-btn{flex-shrink:0;width:2rem;height:2rem;border-radius:999px;background:var(--text-field);color:var(--bg-field);border:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;font-weight:700;line-height:1;align-self:center;transition:opacity .15s,transform .1s}.intent-chat .chat-send-btn:hover:not(:disabled){opacity:.85}.intent-chat .chat-send-btn:active:not(:disabled){transform:scale(.95)}.intent-chat .chat-send-btn:disabled{opacity:.35;cursor:not-allowed}.intent-chat .chat-composer-hint{font-size:.72rem;color:var(--text-muted);padding-left:.5rem}.hint-box{display:flex;gap:.625rem;padding:.75rem .875rem;background:var(--bg-main);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:.5rem;font-size:.85rem;color:var(--text-primary);line-height:1.55;margin-top:.25rem}.hint-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:999px;border:1px solid var(--accent);color:var(--accent);font-size:.7rem;font-style:italic;font-family:serif;font-weight:700;line-height:1;margin-top:.125rem}.hint-body{flex:1;min-width:0}.hint-head{font-weight:600;margin-bottom:.25rem}@media (max-width: 1024px){.intent-layout{grid-template-columns:1fr}.intent-pane.chat{position:static;max-height:none}}@media (max-width: 768px){.intent-layout>.intent-pane.chat{display:none}.floating-help{display:inline-flex}}.floating-help{display:none;align-items:center;gap:.5rem;position:fixed;bottom:1rem;right:1rem;z-index:5;background:var(--btn-primary-bg);color:var(--btn-primary-fg);border:2px solid var(--btn-primary-bg);border-radius:999px;padding:.625rem 1.125rem;font-weight:700;font-size:.85rem;cursor:pointer;font-family:inherit;box-shadow:0 6px 18px var(--primary-glow)}.floating-help:hover{background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover)}.bottom-sheet{position:fixed;left:0;right:0;bottom:0;height:88vh;background:var(--bg-elevated);border-top:1px solid var(--border);border-radius:.75rem .75rem 0 0;z-index:11;padding:1rem 1rem 1.25rem;overflow-y:auto;display:flex;flex-direction:column;gap:.75rem;transform:translateY(100%);transition:transform .25s ease-out;box-shadow:0 -8px 32px #0009;outline:none}.bottom-sheet.is-open{transform:translateY(0)}.bottom-sheet-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;z-index:10;opacity:0;pointer-events:none;transition:opacity .2s}.bottom-sheet-backdrop.is-open{opacity:1;pointer-events:auto}.bottom-sheet-handle{width:2.5rem;height:.25rem;background:var(--text-muted);border-radius:999px;margin:0 auto .5rem;flex-shrink:0}.bottom-sheet-close{position:absolute;top:.5rem;right:.875rem;background:transparent;border:none;color:var(--text-primary);cursor:pointer;font-size:1.5rem;line-height:1;font-family:inherit}@media (prefers-reduced-motion: reduce){.bottom-sheet,.bottom-sheet-backdrop{transition:none}}.field-editable{background:var(--bg-elevated);border:2px solid var(--edit-border);border-radius:.5rem;padding:.875rem 1rem;margin-bottom:1rem;transition:border-color .15s}.field-editable:hover,.field-editable:focus-within{border-color:var(--accent-hover)}.field-label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary);margin-bottom:.5rem;display:flex;align-items:center;gap:.35rem}.field-label .pen{opacity:.7;font-size:.75rem}.info-block{background:var(--bg-main);border-left:3px solid var(--border);border-radius:0 .375rem .375rem 0;padding:.75rem 1rem;margin-bottom:.75rem;font-size:.85rem;color:var(--text-secondary)}.info-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.4rem}.info-title{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary)}.info-edit{font-size:.72rem;color:var(--text-tertiary);text-decoration:underline;cursor:pointer;background:none;border:none;font-family:inherit;padding:0}.info-edit:hover{color:var(--accent-hover)}.info-kv{display:grid;grid-template-columns:max-content 1fr;gap:.15rem 1rem;margin:0}.info-kv dt{color:var(--text-tertiary)}.info-kv dd{margin:0;color:var(--text-secondary);word-break:break-word}.info-section-label{margin:1.25rem 0 .5rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary)}.intent-pane.chat.tool{background:var(--bg-main);border:1px dashed var(--border)}.recent-blocks .card-header{margin-bottom:.35rem}.recent-blocks .rb-sub{color:var(--text-muted);font-size:.8rem;margin:0 0 1.1rem;line-height:1.45;max-width:36ch}.recent-blocks .rb-count,.attention .rb-count{flex:none;min-width:1.6rem;height:1.6rem;padding:0 .45rem;display:inline-flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:600;font-variant-numeric:tabular-nums;background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning);border:1px solid color-mix(in srgb,var(--warning) 35%,transparent);border-radius:999px}.recent-blocks .rb-rows{display:flex;flex-direction:column}.recent-blocks .rb-row{display:grid;grid-template-columns:auto 1fr auto;gap:.75rem .85rem;align-items:start;padding:.85rem 0;border-top:1px solid var(--border)}.recent-blocks .rb-row:first-child{border-top:none}.recent-blocks .rb-dot{width:.5rem;height:.5rem;border-radius:999px;margin-top:.35rem;background:var(--warning)}.recent-blocks .rb-dot.act{background:var(--danger)}.recent-blocks .rb-dot.info{background:var(--text-muted)}.recent-blocks .rb-body{min-width:0}.recent-blocks .rb-line{font-size:.86rem;line-height:1.4;color:var(--text-primary)}.recent-blocks .rb-line b{font-weight:600}.recent-blocks .rb-meta{display:flex;align-items:center;gap:.5rem;margin-top:.3rem;flex-wrap:wrap}.recent-blocks .rb-chip{font-size:.64rem;letter-spacing:.06em;text-transform:uppercase;font-weight:600;padding:.12rem .44rem;border-radius:.35rem;background:var(--accent-subtle);color:var(--text-muted)}.recent-blocks .rb-chip.warn{background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning)}.recent-blocks .rb-chip.act{background:var(--danger-subtle);color:var(--danger)}.recent-blocks .rb-via{font-size:.72rem;color:var(--text-muted)}.recent-blocks .rb-when{font-size:.74rem;color:var(--text-muted);font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}.recent-blocks .rb-fix{display:inline-block;margin-top:.4rem;font-size:.76rem;color:var(--text-primary);text-underline-offset:2px}.recent-blocks .rb-foot{margin-top:1rem;padding-top:.9rem;border-top:1px solid var(--border)}.recent-blocks .rb-viewall{font:inherit;font-size:.8rem;color:var(--text-primary);background:none;border:none;padding:0;cursor:pointer;text-decoration:underline;text-underline-offset:3px}.recent-blocks .rb-empty,.all-clear{text-align:center;padding:1.25rem 1rem .25rem}.attention .card-header{margin-bottom:.5rem}.attention-rows{display:flex;flex-direction:column}.attention-row{display:flex;align-items:center;gap:.75rem;padding:.7rem 0;border-top:1px solid var(--border);text-decoration:none;color:inherit}.attention-row:first-child{border-top:none}.attention-row:hover{background:var(--accent-subtle)}.attention-row:focus-visible{outline:2px solid var(--primary-focus-ring);outline-offset:2px}.attention-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}.recent-blocks .rb-mark,.all-clear .rb-mark{width:2.25rem;height:2.25rem;border-radius:999px;background:var(--success-subtle);color:var(--success);display:inline-flex;align-items:center;justify-content:center;margin-bottom:.75rem}.recent-blocks .rb-empty h3,.all-clear h3{font-size:.9rem;margin:0 0 .3rem}.recent-blocks .rb-empty p,.all-clear p{font-size:.8rem;color:var(--text-muted);margin:0 auto;max-width:30ch;line-height:1.45}.receipt-head{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.receipt-what{font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--text-primary)}.receipt-tag{font-size:.68rem;padding:.12rem .4rem;border-radius:4px;border:1px solid var(--border);color:var(--text-muted);white-space:nowrap}.receipt-tag-bound{color:var(--success);border-color:var(--success)}.receipt-scope{font-size:.82rem;color:var(--text-muted);margin-top:.2rem}.receipt-foot{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;margin-top:.55rem;padding-top:.55rem;border-top:1px solid var(--border)}.receipt-link{font-size:.78rem;color:var(--text-secondary);text-decoration:none;border-bottom:1px solid var(--border)}.receipt-link:hover{color:var(--accent-hover);border-color:var(--accent-hover)}.receipt-id{font-family:SF Mono,Monaco,monospace;font-size:.7rem;color:var(--text-muted)}.receipt-more{margin-top:.5rem}.receipt-more summary{cursor:pointer;font-size:.75rem;color:var(--text-muted);list-style:none}.receipt-more summary::-webkit-details-marker{display:none}.receipt-more summary:before{content:"▸"}.receipt-more[open] summary:before{content:"▾"}.receipt-kv{font-size:.72rem;color:var(--text-muted);margin-top:.4rem;line-height:1.7;font-family:SF Mono,Monaco,monospace;word-break:break-all}.receipt-rows{display:grid;grid-template-columns:7.5rem 1fr;row-gap:.35rem;column-gap:1rem;font-size:.8rem;margin:.8rem 0 0;padding-top:.7rem;border-top:1px solid var(--border)}.receipt-row-label{color:var(--text-muted);margin:0}.receipt-row-value{margin:0;overflow-wrap:anywhere}.receipt-num{font-variant-numeric:tabular-nums}.receipt-intent{font-style:italic;line-height:1.55}.receipt-absent{color:var(--text-muted)}@media (max-width: 480px){.receipt-rows{grid-template-columns:1fr;row-gap:.15rem}.receipt-row-label{margin-top:.35rem}}.receipt-evidence-link{font-size:.78rem;font-weight:500;color:var(--text-primary);background:none;border:none;border-bottom:1px solid var(--border);padding:0;cursor:pointer;font-family:inherit}.receipt-evidence-link:hover{border-color:var(--text-primary)}.receipt-public{margin-left:auto;font-size:.76rem;color:var(--text-muted)}.receipt-verified{font-size:.76rem;font-weight:500;color:var(--success)}.receipt-tamper{font-size:.76rem;font-weight:600;color:var(--danger)}