@fonderie/react-admin-screens 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +435 -308
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +420 -294
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/screens/AdminShell.tsx","../src/styles.ts","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/ConfigScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'config'\n\t| 'routes'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\tauthClient?: AuthAdminClient;\n\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\tbillingClient?: BillingAdminClient;\n\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\tauditClient?: AuditAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tauthClient,\n\tbillingClient,\n\tauditClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n}: IAdminShellProps) {\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = {\n\t\tconfig: Boolean(configClient),\n\t\tcourier: Boolean(courierClient),\n\t\tauth: Boolean(authClient),\n\t\tbilling: Boolean(billingClient),\n\t\taudit: Boolean(auditClient),\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'config':\n\t\t\tbody = <ConfigScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to see the catalog here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'subscriber':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<SubscriberScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to look up subscribers here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'audit':\n\t\t\tbody = auditClient ? (\n\t\t\t\t<AuditScreen client={auditClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuditAdminClient to see the audit trail here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'users':\n\t\t\tbody = authClient ? (\n\t\t\t\t<UsersScreen client={authClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuthAdminClient to look up users here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={styles.status}>Pass a ConfigAdminClient to manage config and secrets here.</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={styles.status}>Pass a CourierAdminClient to manage templates here.</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div style={styles.shell}>\n\t\t\t<nav style={styles.nav} aria-label=\"Admin\">\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, ...(current === i.page ? styles.navItemActive : {}) }}\n\t\t\t\t\t\t\t\t\taria-current={current === i.page ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\tgo(i.page);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{i.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t\t<main style={styles.main}>{body}</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: 'system-ui, sans-serif',\n\t\tcolor: '#111',\n\t},\n\tnav: { width: 220, borderRight: '1px solid #eee', padding: 16, flexShrink: 0 },\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: '#888',\n\t\tmargin: '16px 0 6px',\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: 6,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: '#111',\n\t},\n\tnavItemActive: { background: '#f3f4f6', fontWeight: 600 },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: { fontSize: 20, fontWeight: 700, marginTop: 0, marginBottom: 12 },\n\tsubtitle: { fontSize: 15, fontWeight: 600, marginTop: 24, marginBottom: 8 },\n\tstatus: { padding: 12, color: '#666' },\n\terror: { color: '#e11d48', marginBottom: 12, fontSize: 14 },\n\tok: { color: '#15803d', fontWeight: 600 },\n\tbad: { color: '#e11d48', fontWeight: 600 },\n\tadvice: { color: '#b45309' },\n\tmuted: { color: '#666', fontSize: 13 },\n\tmono: { fontFamily: 'ui-monospace, monospace', fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: '1px solid #ddd',\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: '#444',\n\t},\n\ttd: { borderBottom: '1px solid #eee', padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: '1px solid #eee', padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: '#f3f4f6',\n\t},\n\tbutton: {\n\t\tbackground: 'none',\n\t\tborder: '1px solid #ddd',\n\t\tborderRadius: 8,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Admin log</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{e.method} {e.path}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<span style={e.status >= 400 ? styles.bad : styles.ok}>{e.status}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\n\n// What needs the operator today. Empty is green.\nexport function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Attention</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : attention?.items.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\tNothing needs you. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{attention?.items.map((item) => (\n\t\t\t\t\t\t<li key={`${item.source}:${item.message}`} style={styles.row}>\n\t\t\t\t\t\t\t<span style={item.severity === 'error' ? styles.bad : styles.advice}>\n\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span> — {item.message}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IConfigScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function ConfigScreen({ client }: IConfigScreenProps) {\n\tconst { report, isLoading, error } = useAdminConfig(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Configuration</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>{' '}\n\t\t\t\t\t\t\t\t{m.problems.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tm.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t\t<h2 style={styles.subtitle}>Environment</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.name} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t{e.set ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>set</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>missing</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Doctor</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRun again\n\t\t\t\t</button>\n\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t<span style={report.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t<li key={c.name} style={styles.row}>\n\t\t\t\t\t\t\t<span style={c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t\t\t{c.skipped ? 'skipped' : c.ok ? 'ok' : 'failed'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t{c.module} · {c.durationMs} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{c.skipped ? <div style={styles.muted}>{c.skipped}</div> : null}\n\t\t\t\t\t\t\t{c.findings.map((f) => (\n\t\t\t\t\t\t\t\t<div key={f} style={c.ok ? styles.advice : styles.bad}>\n\t\t\t\t\t\t\t\t\t{f}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Modules</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<>\n\t\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\t\t{manifest.env} · admin {manifest.admin.version} · admin log{' '}\n\t\t\t\t\t\t{manifest.admin.log ? 'on' : 'off'} · {manifest.routes.length} routes\n\t\t\t\t\t</p>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Describes admin</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{m.name}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>error</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.describesAdmin ? 'yes' : <span style={styles.muted}>no</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Routes</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.method}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<span style={styles.badge}>{r.guard}</span>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(client);\n\tconst [name, setName] = useState('');\n\tconst [scopes, setScopes] = useState<AdminScope[]>(['read']);\n\tconst [days, setDays] = useState('');\n\tconst [minted, setMinted] = useState<{ name: string; token: string } | null>(null);\n\n\tconst toggle = (s: AdminScope) =>\n\t\tsetScopes((prev) => (prev.includes(s) ? prev.filter((x) => x !== s) : [...prev, s]));\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</h1>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 401\n\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Root token</h2>\n\t\t\t{report ? (\n\t\t\t\t<p>\n\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\n\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Issued tokens</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\tIssuing is off — give AdminModule a store and run its migrations.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{minted ? (\n\t\t\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\t\t\tCopy this now — it is never shown again.{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{minted.token}</span> ({minted.name})\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<form\n\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = Number(days);\n\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\tname: name.trim(),\n\t\t\t\t\t\t\t\tscopes,\n\t\t\t\t\t\t\t\t...(days && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\tsetMinted({ name: t.name, token: t.token });\n\t\t\t\t\t\t\t\t\tsetName('');\n\t\t\t\t\t\t\t\t\tsetDays('');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"name\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\taria-label=\"Name\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ALL.map((s) => (\n\t\t\t\t\t\t\t<label key={s} style={{ ...styles.badge, cursor: 'pointer' }}>\n\t\t\t\t\t\t\t\t<input type=\"checkbox\" checked={scopes.includes(s)} onChange={() => toggle(s)} />{' '}\n\t\t\t\t\t\t\t\t{s}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={days}\n\t\t\t\t\t\t\tonChange={(e) => setDays(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"days (optional)\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', width: 140 }}\n\t\t\t\t\t\t\taria-label=\"Days\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tdisabled={!name.trim() || scopes.length === 0 || isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tIssue\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t\t{report?.issued && report.issued.length > 0 ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Scopes</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Expires</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Last used</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{report.issued.map((t) => (\n\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.name}\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? <span style={styles.badge}> revoked</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.scopes.join(', ')}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleDateString()} · {t.createdBy}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tRevoke\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>None issued.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.legacy.map((l) => (\n\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AuthAdminClient } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n\tpageSize?: number;\n}\n\n// Who is signed up, and why can't this one log in. Lists on arrival — an\n// operator who must know an address before they can see anything cannot find\n// the account they are being asked about. Picking a row, or an exact email,\n// opens the account: live sessions, recent sign-ins, suspend and sign-out.\nexport function UsersScreen({ client, pageSize = 50 }: IUsersScreenProps) {\n\tconst [input, setInput] = useState('');\n\tconst [selected, setSelected] = useState<{ id?: string; email?: string } | null>(null);\n\n\tconst list = useAdminUsers(client, { limit: pageSize });\n\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\tclient,\n\t\tselected ?? {},\n\t);\n\tconst userId = user?.id ?? null;\n\tconst sessions = useAdminUserSessions(client, userId);\n\tconst history = useAdminLoginHistory(client, userId, { limit: 20 });\n\n\tconst yesNo = (v: boolean) =>\n\t\tv ? <span style={styles.ok}>yes</span> : <span style={styles.muted}>no</span>;\n\n\tconst clear = () => {\n\t\tsetSelected(null);\n\t\tsetInput('');\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Users</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst email = input.trim();\n\t\t\t\t\tsetSelected(email ? { email } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"email address\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Email\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{selected ? (\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={clear}>\n\t\t\t\t\t\t← All users\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? 'No user with that email.' : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!selected ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.users.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>No users yet.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Email</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.users.map((u) => (\n\t\t\t\t\t\t\t\t\t<tr key={u.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, padding: 0 }}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setSelected({ id: u.id })}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{u.email}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{`${u.firstName ?? ''} ${u.lastName ?? ''}`.trim() || (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(u.createdAt).toLocaleDateString()}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{u.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t{u.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t{!u.suspended && !u.deletedAt ? <span style={styles.muted}>active</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{user ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t{user.firstName || user.lastName\n\t\t\t\t\t\t\t? `${user.firstName} ${user.lastName}`.trim()\n\t\t\t\t\t\t\t: user.email}{' '}\n\t\t\t\t\t\t{user.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t{user.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>id</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{user.id}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>email</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.email} · verified {yesNo(user.isEmailVerified)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>MFA</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{yesNo(user.mfaEnabled)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.provider || 'password'}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ' · no password set'}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>last login</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.lastLogin ? (\n\t\t\t\t\t\t\t\t\t\tnew Date(user.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>never</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>created</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(user.createdAt).toLocaleString()}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t{user.suspended ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tUnsuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tonClick={() => void revokeSessions().then(() => sessions.refresh())}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign out everywhere\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Live sessions</h2>\n\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\t\t\t\t\t\t<li key={s.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{s.userAgent ?? ''}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>since {new Date(s.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Recent sign-ins</h2>\n\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>None recorded.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={e.outcome === 'success' ? styles.ok : styles.bad}>{e.outcome}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{new Date(e.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{history.hasMore && !history.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void history.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ICatalogScreenProps {\n\tclient: BillingAdminClient;\n}\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport function CatalogScreen({ client }: ICatalogScreenProps) {\n\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(client);\n\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Catalog</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{isLoading && !catalog ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{catalog ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Configured (code)</h2>\n\t\t\t\t\t<pre style={{ ...styles.mono, background: '#f9fafb', padding: 12, overflowX: 'auto' }}>\n\t\t\t\t\t\t{JSON.stringify(catalog.configured, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t\t<h2 style={styles.subtitle}>Stored (database)</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No stored plans.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Tier</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Seats</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Monthly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Yearly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Trial</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{catalog.stored.map((p) => (\n\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{p.name}</strong>\n\t\t\t\t\t\t\t\t\t\t\t{p.description ? <div style={styles.muted}>{p.description}</div> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.tier}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.seats ?? '∞'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{money(p.pricing?.monthly)} {p.pricing?.currency ?? ''}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{money(p.pricing?.yearly)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.trialDays ? `${p.trialDays} d` : '—'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n\tpageSize?: number;\n}\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport function SubscriberScreen({ client, pageSize = 50 }: ISubscriberScreenProps) {\n\tconst [type, setType] = useState<SubscriberType>('user');\n\tconst [idInput, setIdInput] = useState('');\n\tconst [subscriber, setSubscriber] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst list = useAdminSubscribers(client, { limit: pageSize });\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20 });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\tconst open = (t: SubscriberType, id: string) => {\n\t\tsetGranted(null);\n\t\tsetType(t);\n\t\tsetIdInput(id);\n\t\tsetSubscriber({ type: t, id });\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Subscriber</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetGranted(null);\n\t\t\t\t\tsetSubscriber(idInput.trim() ? { type, id: idInput.trim() } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<select\n\t\t\t\t\tvalue={type}\n\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\taria-label=\"Type\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"user\">user</option>\n\t\t\t\t\t<option value=\"workspace\">workspace</option>\n\t\t\t\t</select>\n\t\t\t\t<input\n\t\t\t\t\tvalue={idInput}\n\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"subscriber id\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Subscriber id\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{subscriber ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetSubscriber(null);\n\t\t\t\t\t\t\tsetIdInput('');\n\t\t\t\t\t\t\tsetGranted(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t← All subscribers\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!subscriber ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.subscriptions.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>No subscribers yet.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Subscriber</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Renews</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.subscriptions.map((s) => (\n\t\t\t\t\t\t\t\t\t<tr key={s.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, padding: 0, ...styles.mono }}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => open(s.subscriberType, s.subscriberId)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{s.subscriberType}/{s.subscriberId}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{s.plan}</strong> · {s.interval}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.status}\n\t\t\t\t\t\t\t\t\t\t\t{s.cancelAtPeriodEnd ? <span style={styles.badge}>cancels</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.currentPeriodEnd ? (\n\t\t\t\t\t\t\t\t\t\t\t\tnew Date(s.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{subscriber && !isLoading ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Subscription</h2>\n\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>plan</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<strong>{subscription.plan}</strong> · {subscription.interval}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>status</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.status}\n\t\t\t\t\t\t\t\t\t\t{subscription.cancelAtPeriodEnd ? ' · cancels at period end' : ''}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>period</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodStart\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodStart).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}{' '}\n\t\t\t\t\t\t\t\t\t\t→{' '}\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{subscription.providerSubscriptionId ?? '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No subscription.</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Wallet</h2>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t<strong>{wallet.balance}</strong> {wallet.currency}{' '}\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t(granted {wallet.granted ?? '0'} · purchased {wallet.purchased ?? '0'}) · minor\n\t\t\t\t\t\t\t\t\tunits, precision {wallet.precision}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t\t\t\t...(note ? { description: note } : {}),\n\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\tsetGranted(`Granted ${amount.trim()} ${wallet.currency}.`);\n\t\t\t\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\t\t\t\tsetNote('');\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"amount (minor units)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\t\t\taria-label=\"Amount\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"reason (optional)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 220 }}\n\t\t\t\t\t\t\t\t\taria-label=\"Reason\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!/^\\d+$/.test(amount.trim())}>\n\t\t\t\t\t\t\t\t\tGrant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>Ledger</h2>\n\t\t\t\t\t\t\t{ledger.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>Nothing moved yet.</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Kind</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Amount</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Note</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t{ledger.map((t) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{t.type}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.amount}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{t.description ?? ''}</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasMoreLedger ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No wallet — billing has no wallet configuration.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuditAdminClient } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IAuditScreenProps {\n\tclient: AuditAdminClient;\n\tpageSize?: number;\n}\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport function AuditScreen({ client, pageSize = 50 }: IAuditScreenProps) {\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '' });\n\tconst [filter, setFilter] = useState<{ workspaceId?: string; type?: string; actorId?: string }>(\n\t\t{},\n\t);\n\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(client, {\n\t\t...filter,\n\t\tlimit: pageSize,\n\t});\n\tconst field = (key: keyof typeof draft, placeholder: string) => (\n\t\t<input\n\t\t\tvalue={draft[key]}\n\t\t\tonChange={(e) => setDraft({ ...draft, [key]: e.target.value })}\n\t\t\tplaceholder={placeholder}\n\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\taria-label={placeholder}\n\t\t/>\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Audit</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetFilter({\n\t\t\t\t\t\t...(draft.workspaceId.trim() ? { workspaceId: draft.workspaceId.trim() } : {}),\n\t\t\t\t\t\t...(draft.type.trim() ? { type: draft.type.trim() } : {}),\n\t\t\t\t\t\t...(draft.actorId.trim() ? { actorId: draft.actorId.trim() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', 'workspace id (all if empty)')}\n\t\t\t\t{field('type', 'event type')}\n\t\t\t\t{field('actorId', 'actor id')}\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tFilter\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{events.length === 0 && !isLoading ? (\n\t\t\t\t<p style={styles.muted}>Nothing recorded for this filter.</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Type</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Workspace</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{events.map((e) => (\n\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t{new Date(e.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.type}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{String(e.payload['workspaceId'] ?? '—')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.actorId ?? '—'}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.requestId ?? ''}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t>\n\t\t\t\t\tLoad more\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState"]}
|
|
1
|
+
{"version":3,"sources":["../src/screens/AdminShell.tsx","../src/styles.ts","../src/screens/AdminLogScreen.tsx","../src/screens/AttentionScreen.tsx","../src/screens/ConfigScreen.tsx","../src/screens/DoctorScreen.tsx","../src/screens/ModulesScreen.tsx","../src/screens/RoutesScreen.tsx","../src/screens/MigrationsScreen.tsx","../src/screens/TokensScreen.tsx","../src/screens/UsersScreen.tsx","../src/screens/CatalogScreen.tsx","../src/screens/SubscriberScreen.tsx","../src/screens/AuditScreen.tsx"],"sourcesContent":["import type {\n\tAdminClient,\n\tAuditAdminClient,\n\tAuthAdminClient,\n\tBillingAdminClient,\n\tConfigAdminClient,\n\tCourierAdminClient,\n} from '@fonderie/client';\nimport { ConfigEditorScreen, ConfigListScreen } from '@fonderie/react-config-admin-screens';\nimport { TemplateEditorScreen, TemplateListScreen } from '@fonderie/react-courier-admin-screens';\nimport { useState } from 'react';\nimport { styles } from '../styles';\nimport { AdminLogScreen } from './AdminLogScreen';\nimport { AttentionScreen } from './AttentionScreen';\nimport { ConfigScreen } from './ConfigScreen';\nimport { DoctorScreen } from './DoctorScreen';\nimport { ModulesScreen } from './ModulesScreen';\nimport { RoutesScreen } from './RoutesScreen';\nimport { MigrationsScreen } from './MigrationsScreen';\nimport { TokensScreen } from './TokensScreen';\nimport { UsersScreen } from './UsersScreen';\nimport { CatalogScreen } from './CatalogScreen';\nimport { SubscriberScreen } from './SubscriberScreen';\nimport { AuditScreen } from './AuditScreen';\n\nexport type AdminPage =\n\t| 'attention'\n\t| 'modules'\n\t| 'doctor'\n\t| 'config'\n\t| 'routes'\n\t| 'migrations'\n\t| 'tokens'\n\t| 'log'\n\t| 'settings'\n\t| 'templates'\n\t| 'users'\n\t| 'catalog'\n\t| 'subscriber'\n\t| 'audit';\n\nexport interface IAdminShellProps {\n\tclient: AdminClient;\n\t// Given ⇒ the Settings (config + secrets) and Messaging (templates) pages\n\t// appear. Construct them with `prefix: '/_admin'` to go through the one token.\n\tconfigClient?: ConfigAdminClient;\n\tcourierClient?: CourierAdminClient;\n\t// Given ⇒ the People page (users) appears; needs @fonderie/auth ≥ 7.8.\n\tauthClient?: AuthAdminClient;\n\t// Given ⇒ the Money pages (catalog, subscriber) appear; needs @fonderie/billing ≥ 9.10.\n\tbillingClient?: BillingAdminClient;\n\t// Given ⇒ the Audit page appears; needs @fonderie/audit ≥ 5.2.\n\tauditClient?: AuditAdminClient;\n\tenvironment?: string;\n\t// Controlled navigation: pass both to own the URL. Omit both and the shell\n\t// keeps the page itself.\n\tpage?: AdminPage;\n\tonNavigate?: (page: AdminPage) => void;\n}\n\nconst NAV: Array<{\n\tgroup: string;\n\titems: Array<{\n\t\tpage: AdminPage;\n\t\tlabel: string;\n\t\tneeds?: 'config' | 'courier' | 'auth' | 'billing' | 'audit';\n\t}>;\n}> = [\n\t{ group: 'Today', items: [{ page: 'attention', label: 'Attention' }] },\n\t{\n\t\tgroup: 'System',\n\t\titems: [\n\t\t\t{ page: 'modules', label: 'Modules' },\n\t\t\t{ page: 'config', label: 'Configuration' },\n\t\t\t{ page: 'doctor', label: 'Doctor' },\n\t\t\t{ page: 'routes', label: 'Routes' },\n\t\t],\n\t},\n\t{ group: 'People', items: [{ page: 'users', label: 'Users', needs: 'auth' }] },\n\t{\n\t\tgroup: 'Money',\n\t\titems: [\n\t\t\t{ page: 'catalog', label: 'Catalog', needs: 'billing' },\n\t\t\t{ page: 'subscriber', label: 'Subscriber', needs: 'billing' },\n\t\t],\n\t},\n\t{ group: 'Settings', items: [{ page: 'settings', label: 'Config & secrets', needs: 'config' }] },\n\t{ group: 'Messaging', items: [{ page: 'templates', label: 'Templates', needs: 'courier' }] },\n\t{\n\t\tgroup: 'Activity',\n\t\titems: [\n\t\t\t{ page: 'audit', label: 'Audit', needs: 'audit' },\n\t\t\t{ page: 'log', label: 'Admin log' },\n\t\t\t{ page: 'tokens', label: 'Access' },\n\t\t\t{ page: 'migrations', label: 'Migrations' },\n\t\t],\n\t},\n];\n\nexport function AdminShell({\n\tclient,\n\tconfigClient,\n\tcourierClient,\n\tauthClient,\n\tbillingClient,\n\tauditClient,\n\tenvironment,\n\tpage,\n\tonNavigate,\n}: IAdminShellProps) {\n\tconst [own, setOwn] = useState<AdminPage>('attention');\n\tconst current = page ?? own;\n\tconst go = (p: AdminPage) => {\n\t\tif (onNavigate) onNavigate(p);\n\t\tif (page === undefined) setOwn(p);\n\t};\n\tconst [editing, setEditing] = useState<\n\t\t{ kind: 'config' | 'secret'; key: string } | { kind: 'template'; type: string } | null\n\t>(null);\n\n\tconst has = {\n\t\tconfig: Boolean(configClient),\n\t\tcourier: Boolean(courierClient),\n\t\tauth: Boolean(authClient),\n\t\tbilling: Boolean(billingClient),\n\t\taudit: Boolean(auditClient),\n\t};\n\n\tlet body: React.ReactNode;\n\tswitch (current) {\n\t\tcase 'attention':\n\t\t\tbody = <AttentionScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'modules':\n\t\t\tbody = <ModulesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'doctor':\n\t\t\tbody = <DoctorScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'config':\n\t\t\tbody = <ConfigScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'routes':\n\t\t\tbody = <RoutesScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'tokens':\n\t\t\tbody = <TokensScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'migrations':\n\t\t\tbody = <MigrationsScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'log':\n\t\t\tbody = <AdminLogScreen client={client} />;\n\t\t\tbreak;\n\t\tcase 'catalog':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<CatalogScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to see the catalog here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'subscriber':\n\t\t\tbody = billingClient ? (\n\t\t\t\t<SubscriberScreen client={billingClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass a BillingAdminClient to look up subscribers here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'audit':\n\t\t\tbody = auditClient ? (\n\t\t\t\t<AuditScreen client={auditClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuditAdminClient to see the audit trail here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'users':\n\t\t\tbody = authClient ? (\n\t\t\t\t<UsersScreen client={authClient} />\n\t\t\t) : (\n\t\t\t\t<p style={styles.status}>Pass an AuthAdminClient to look up users here.</p>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'settings':\n\t\t\tbody = !configClient ? (\n\t\t\t\t<p style={styles.status}>Pass a ConfigAdminClient to manage config and secrets here.</p>\n\t\t\t) : editing && editing.kind !== 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<ConfigEditorScreen\n\t\t\t\t\t\tclient={configClient}\n\t\t\t\t\t\tkind={editing.kind}\n\t\t\t\t\t\tconfigKey={editing.key}\n\t\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<ConfigListScreen\n\t\t\t\t\tclient={configClient}\n\t\t\t\t\t{...(environment !== undefined ? { environment } : {})}\n\t\t\t\t\tonSelectConfig={(key) => setEditing({ kind: 'config', key })}\n\t\t\t\t\tonSelectSecret={(key) => setEditing({ kind: 'secret', key })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'templates':\n\t\t\tbody = !courierClient ? (\n\t\t\t\t<p style={styles.status}>Pass a CourierAdminClient to manage templates here.</p>\n\t\t\t) : editing?.kind === 'template' ? (\n\t\t\t\t<>\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => setEditing(null)}>\n\t\t\t\t\t\t← Back\n\t\t\t\t\t</button>\n\t\t\t\t\t<TemplateEditorScreen\n\t\t\t\t\t\tclient={courierClient}\n\t\t\t\t\t\ttype={editing.type}\n\t\t\t\t\t\tonSaved={() => setEditing(null)}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<TemplateListScreen\n\t\t\t\t\tclient={courierClient}\n\t\t\t\t\tonSelectTemplate={(t) => setEditing({ kind: 'template', type: t.type })}\n\t\t\t\t/>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<div style={styles.shell}>\n\t\t\t<nav style={styles.nav} aria-label=\"Admin\">\n\t\t\t\t{NAV.map((g) => {\n\t\t\t\t\tconst items = g.items.filter((i) => !i.needs || has[i.needs]);\n\t\t\t\t\tif (items.length === 0) return null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={g.group}>\n\t\t\t\t\t\t\t<div style={styles.navGroup}>{g.group}</div>\n\t\t\t\t\t\t\t{items.map((i) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={i.page}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, ...(current === i.page ? styles.navItemActive : {}) }}\n\t\t\t\t\t\t\t\t\taria-current={current === i.page ? 'page' : undefined}\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tsetEditing(null);\n\t\t\t\t\t\t\t\t\t\tgo(i.page);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{i.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</nav>\n\t\t\t<main style={styles.main}>{body}</main>\n\t\t</div>\n\t);\n}\n","import type { CSSProperties } from 'react';\n\n// One palette for every admin page; the same values as the config and courier\n// admin screens so the shell reads as one surface.\n//\n// Colours, type and radii come from `var(--fonderie-*)`, the organisation's\n// design tokens, declared once in the served shell (@fonderie/admin's\n// ui/html.ts). Inline styles take CSS variables, so this needs no stylesheet,\n// no build step and no class plumbing — and light/dark follow the tokens\n// without a single conditional here.\n//\n// Every var carries a FALLBACK. These screens are published packages: a\n// consumer importing them into their own app has no Fonderie shell and\n// therefore none of these variables, and `color: var(--fonderie-text)` with\n// nothing behind it resolves to nothing — black text on black, or invisible\n// borders. The fallbacks are the light palette, so an embedded screen still\n// renders correctly and simply is not themed.\nconst t = {\n\ttext: 'var(--fonderie-text,#171717)',\n\tmuted: 'var(--fonderie-text-muted,#5c5c5c)',\n\tbg: 'var(--fonderie-bg,#fafafa)',\n\tsurface: 'var(--fonderie-surface,#fff)',\n\tsurfaceAlt: 'var(--fonderie-surface-alt,#fafafa)',\n\tborder: 'var(--fonderie-border,#e0e0e0)',\n\tborderLight: 'var(--fonderie-border-light,#f5f5f5)',\n\taccent: 'var(--fonderie-accent,#00d294)',\n\taccentStrong: 'var(--fonderie-accent-strong,#009767)',\n\twarning: 'var(--fonderie-warning,#f5a623)',\n\tdanger: 'var(--fonderie-danger,#e00)',\n\tfont: 'var(--fonderie-font,Inter,\"Inter Fallback\",-apple-system,BlinkMacSystemFont,\"Helvetica Neue\",system-ui,sans-serif)',\n\tmono: 'var(--fonderie-mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace)',\n\tradius: 'var(--fonderie-radius,4px)',\n\tradiusLg: 'var(--fonderie-radius-lg,8px)',\n\ttrackingDisplay: 'var(--fonderie-tracking-display,-0.05em)',\n\tshadowCard: 'var(--fonderie-shadow-card,0 2px 3px 0 rgba(0,0,0,.05))',\n} as const;\n\nexport const styles: Record<string, CSSProperties> = {\n\tshell: {\n\t\tdisplay: 'flex',\n\t\tminHeight: '100vh',\n\t\tfontFamily: t.font,\n\t\tcolor: t.text,\n\t\tbackground: t.bg,\n\t},\n\t// The sidebar sits on the raised surface against the page canvas, which is\n\t// what separates the two without a heavy rule between them.\n\tnav: {\n\t\twidth: 220,\n\t\tborderRight: `1px solid ${t.border}`,\n\t\tpadding: 16,\n\t\tflexShrink: 0,\n\t\tbackground: t.surface,\n\t},\n\tnavGroup: {\n\t\tfontSize: 11,\n\t\ttextTransform: 'uppercase',\n\t\tletterSpacing: 0.6,\n\t\tcolor: t.muted,\n\t\tmargin: '16px 0 6px',\n\t\tfontWeight: 600,\n\t},\n\tnavItem: {\n\t\tdisplay: 'block',\n\t\twidth: '100%',\n\t\ttextAlign: 'left',\n\t\tbackground: 'none',\n\t\tborder: 'none',\n\t\tborderRadius: t.radius,\n\t\tpadding: '6px 8px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 14,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t},\n\tnavItemActive: { background: t.surfaceAlt, fontWeight: 600, color: t.accentStrong },\n\tmain: { flex: 1, padding: 24, maxWidth: 960 },\n\tcontainer: { padding: 24, maxWidth: 960 },\n\ttitle: {\n\t\tfontSize: 20,\n\t\tfontWeight: 600,\n\t\tmarginTop: 0,\n\t\tmarginBottom: 12,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tsubtitle: {\n\t\tfontSize: 15,\n\t\tfontWeight: 600,\n\t\tmarginTop: 24,\n\t\tmarginBottom: 8,\n\t\tletterSpacing: t.trackingDisplay,\n\t},\n\tstatus: { padding: 12, color: t.muted },\n\terror: { color: t.danger, marginBottom: 12, fontSize: 14 },\n\tok: { color: t.accentStrong, fontWeight: 600 },\n\tbad: { color: t.danger, fontWeight: 600 },\n\tadvice: { color: t.warning },\n\tmuted: { color: t.muted, fontSize: 13 },\n\tmono: { fontFamily: t.mono, fontSize: 13 },\n\ttable: { width: '100%', borderCollapse: 'collapse', fontSize: 14 },\n\tth: {\n\t\ttextAlign: 'left',\n\t\tborderBottom: `1px solid ${t.border}`,\n\t\tpadding: '6px 8px',\n\t\tfontWeight: 600,\n\t\tcolor: t.muted,\n\t},\n\ttd: { borderBottom: `1px solid ${t.borderLight}`, padding: '6px 8px', verticalAlign: 'top' },\n\tlist: { listStyle: 'none', padding: 0, margin: 0 },\n\trow: { borderBottom: `1px solid ${t.borderLight}`, padding: '8px 0' },\n\tbadge: {\n\t\tdisplay: 'inline-block',\n\t\tborderRadius: 999,\n\t\tpadding: '1px 8px',\n\t\tfontSize: 12,\n\t\tbackground: t.surfaceAlt,\n\t\tborder: `1px solid ${t.border}`,\n\t\tcolor: t.muted,\n\t},\n\tbutton: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radius,\n\t\tpadding: '4px 10px',\n\t\tcursor: 'pointer',\n\t\tfontSize: 13,\n\t\tcolor: t.text,\n\t\tfontFamily: 'inherit',\n\t\tboxShadow: t.shadowCard,\n\t},\n\ttoolbar: { display: 'flex', gap: 8, alignItems: 'center', marginBottom: 12 },\n\t// Surfaces the screens compose themselves, kept here so a card looks the\n\t// same on every page rather than being re-invented per screen.\n\tcard: {\n\t\tbackground: t.surface,\n\t\tborder: `1px solid ${t.border}`,\n\t\tborderRadius: t.radiusLg,\n\t\tpadding: 16,\n\t\tboxShadow: t.shadowCard,\n\t},\n\taccent: { color: t.accent },\n};\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminLog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAdminLogScreenProps {\n\tclient: AdminClient;\n\tpageSize?: number;\n}\n\n// Who did what through the surface, newest first — refused requests included.\nexport function AdminLogScreen({ client, pageSize = 50 }: IAdminLogScreenProps) {\n\tconst { entries, hasMore, isLoading, error, refresh, loadMore } = useAdminLog(client, {\n\t\tlimit: pageSize,\n\t});\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Admin log</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404\n\t\t\t\t\t\t? 'The admin log is off — give AdminModule a store.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{entries.map((e) => (\n\t\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t{new Date(e.at).toLocaleString()}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>{e.actor}</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{e.method} {e.path}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<span style={e.status >= 400 ? styles.bad : styles.ok}>{e.status}</span>{' '}\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.durationMs} ms</span>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.module}</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 12 }}\n\t\t\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAttention } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IAttentionScreenProps {\n\tclient: AdminClient;\n}\n\n// What needs the operator today. Empty is green.\nexport function AttentionScreen({ client }: IAttentionScreenProps) {\n\tconst { attention, isLoading, error, refresh } = useAttention(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Attention</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{isLoading && !attention ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : attention?.items.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\tNothing needs you. Checked {new Date(attention.generatedAt).toLocaleString()}.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{attention?.items.map((item) => (\n\t\t\t\t\t\t<li key={`${item.source}:${item.message}`} style={styles.row}>\n\t\t\t\t\t\t\t<span style={item.severity === 'error' ? styles.bad : styles.advice}>\n\t\t\t\t\t\t\t\t{item.severity === 'error' ? 'error' : 'advice'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{item.source}</span> — {item.message}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminConfig } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IConfigScreenProps {\n\tclient: AdminClient;\n}\n\n// Declared vs held: readiness per module, and whether each environment\n// variable the app reads is set. Values are never shown.\nexport function ConfigScreen({ client }: IConfigScreenProps) {\n\tconst { report, isLoading, error } = useAdminConfig(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Configuration</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : report ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Readiness</h2>\n\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t{report.modules.map((m) => (\n\t\t\t\t\t\t\t<li key={m.name} style={styles.row}>\n\t\t\t\t\t\t\t\t<span style={styles.mono}>{m.name}</span>{' '}\n\t\t\t\t\t\t\t\t{m.problems.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tm.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t\t<h2 style={styles.subtitle}>Environment</h2>\n\t\t\t\t\t{report.env.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No variables declared — pass `env` to AdminModule.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{report.env.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.name} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{e.name}</span>{' '}\n\t\t\t\t\t\t\t\t\t{e.set ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>set</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>missing</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useDoctor } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IDoctorScreenProps {\n\tclient: AdminClient;\n}\n\n// Every reconciliation check, on demand. ok is false only for a hard failure;\n// findings on a passing check are advice.\nexport function DoctorScreen({ client }: IDoctorScreenProps) {\n\tconst { report, isLoading, error, refresh } = useDoctor(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Doctor</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRun again\n\t\t\t\t</button>\n\t\t\t\t{report && !isLoading ? (\n\t\t\t\t\t<span style={report.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t{report.ok ? 'all checks pass' : 'a check failed'}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t{isLoading && !report ? (\n\t\t\t\t<p style={styles.status}>Running the checks…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.checks.map((c) => (\n\t\t\t\t\t\t<li key={c.name} style={styles.row}>\n\t\t\t\t\t\t\t<span style={c.skipped ? styles.muted : c.ok ? styles.ok : styles.bad}>\n\t\t\t\t\t\t\t\t{c.skipped ? 'skipped' : c.ok ? 'ok' : 'failed'}\n\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{c.name}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t{c.module} · {c.durationMs} ms\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{c.skipped ? <div style={styles.muted}>{c.skipped}</div> : null}\n\t\t\t\t\t\t\t{c.findings.map((f) => (\n\t\t\t\t\t\t\t\t<div key={f} style={c.ok ? styles.advice : styles.bad}>\n\t\t\t\t\t\t\t\t\t{f}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useManifest } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IModulesScreenProps {\n\tclient: AdminClient;\n}\n\n// What is deployed: every module, its version, readiness, and whether it\n// offers anything to this surface.\nexport function ModulesScreen({ client }: IModulesScreenProps) {\n\tconst { manifest, isLoading, error } = useManifest(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Modules</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : manifest ? (\n\t\t\t\t<>\n\t\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\t\t{manifest.env} · admin {manifest.admin.version} · admin log{' '}\n\t\t\t\t\t\t{manifest.admin.log ? 'on' : 'off'} · {manifest.routes.length} routes\n\t\t\t\t\t</p>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Version</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Readiness</th>\n\t\t\t\t\t\t\t\t<th style={styles.th}>Describes admin</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{manifest.modules.map((m) => (\n\t\t\t\t\t\t\t\t<tr key={m.name}>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{m.name}</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.version ?? <span style={styles.muted}>not reported</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.readiness.ok ? (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.ok}>ok</span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>error</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{m.readiness.problems.map((p) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={p.message}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={p.severity === 'error' ? styles.bad : styles.advice}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{m.describesAdmin ? 'yes' : <span style={styles.muted}>no</span>}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AdminClient } from '@fonderie/client';\nimport { useAdminRoutes } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IRoutesScreenProps {\n\tclient: AdminClient;\n}\n\nexport function RoutesScreen({ client }: IRoutesScreenProps) {\n\tconst { report, isLoading, error } = useAdminRoutes(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Routes</h1>\n\t\t\t{isLoading ? (\n\t\t\t\t<p style={styles.status}>Loading…</p>\n\t\t\t) : error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>Method</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Path</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Guard</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Module</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{report?.routes.map((r) => (\n\t\t\t\t\t\t\t<tr key={`${r.method} ${r.path}`}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.method}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{r.path}</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t<span style={styles.badge}>{r.guard}</span>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{r.module ?? 'application'}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, IAdminMigrationModule } from '@fonderie/client';\nimport { useAdminMigrations } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface IMigrationsScreenProps {\n\tclient: AdminClient;\n}\n\n// Why a module might not be appliable, in the operator's terms. Order matters:\n// being blocked by an earlier module is the more actionable answer, so it is\n// reported before the destructive one even when both are true.\nfunction why(m: IAdminMigrationModule, everApplied: boolean): string | null {\n\tif (m.pending.length === 0) return null;\n\tif (m.blockedBy) return `Apply \"${m.blockedBy}\" first — it runs before this one and is behind.`;\n\tif (everApplied && m.pending.some((p) => p.impact === 'destructive'))\n\t\treturn 'Contains a migration that deletes data. No down-migration brings it back — apply this one through CI or `npm run migrate`.';\n\treturn null;\n}\n\nexport function MigrationsScreen({ client }: IMigrationsScreenProps) {\n\tconst { report, isLoading, error, refresh, apply } = useAdminMigrations(client);\n\n\tconst behind = report?.modules.filter((m) => m.pending.length > 0) ?? [];\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Migrations</h1>\n\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 403\n\t\t\t\t\t\t? 'Applying migrations needs a token with the write scope.'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<p>\n\t\t\t\t<button type=\"button\" style={styles.button} onClick={() => void refresh()} disabled={isLoading}>\n\t\t\t\t\t{isLoading ? 'Checking…' : 'Refresh'}\n\t\t\t\t</button>{' '}\n\t\t\t\t{report && !report.everApplied ? (\n\t\t\t\t\t<span style={styles.advice}>\n\t\t\t\t\t\tThis database has never been migrated — treating it as a first install, so nothing is\n\t\t\t\t\t\theld back.\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</p>\n\n\t\t\t{report && behind.length === 0 ? (\n\t\t\t\t<p style={styles.ok}>Every module is up to date.</p>\n\t\t\t) : null}\n\n\t\t\t{behind.map((m) => {\n\t\t\t\tconst blocked = why(m, report?.everApplied ?? false);\n\t\t\t\tconst files = m.pending.map((p) => p.file);\n\t\t\t\treturn (\n\t\t\t\t\t<section key={m.name} style={{ marginBottom: 24 }}>\n\t\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t\t{m.name} — {m.pending.length} pending\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t{m.pending.map((p) => (\n\t\t\t\t\t\t\t\t<li key={p.file}>\n\t\t\t\t\t\t\t\t\t<code>{p.file}</code>{' '}\n\t\t\t\t\t\t\t\t\t{p.impact === 'destructive' ? (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.bad}>destructive</span>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.advice}>additive</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{p.destructive.length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t\t{p.destructive.map((s) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<li key={s}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<code>{s.slice(0, 120)}</code>\n\t\t\t\t\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t{blocked ? (\n\t\t\t\t\t\t\t<p style={styles.advice}>{blocked}</p>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tdisabled={isLoading || !m.appliable}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t`Apply ${m.pending.length} migration(s) to \"${m.name}\"? This changes the database schema.`,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t// The hook already put any failure in `error` and re-read\n\t\t\t\t\t\t\t\t\t\t// the real state; nothing useful is left to do here.\n\t\t\t\t\t\t\t\t\t\tvoid apply(m.name, files).catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tApply {m.pending.length} migration{m.pending.length === 1 ? '' : 's'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","import type { AdminClient, AdminScope } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\n\nconst ALL: AdminScope[] = ['read', 'write', 'secrets'];\n\n// Who can be here. Issuing and revoking need the ROOT token — the one in the\n// deployment's config; a scoped token gets 401 on these and the page says so.\nexport function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error, issue, revoke } = useAdminTokens(client);\n\tconst [name, setName] = useState('');\n\tconst [scopes, setScopes] = useState<AdminScope[]>(['read']);\n\tconst [days, setDays] = useState('');\n\tconst [minted, setMinted] = useState<{ name: string; token: string } | null>(null);\n\n\tconst toggle = (s: AdminScope) =>\n\t\tsetScopes((prev) => (prev.includes(s) ? prev.filter((x) => x !== s) : [...prev, s]));\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</h1>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 401\n\t\t\t\t\t\t? 'Issuing and revoking need the root token (the one in your deployment config).'\n\t\t\t\t\t\t: error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Root token</h2>\n\t\t\t{report ? (\n\t\t\t\t<p>\n\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\n\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</p>\n\t\t\t) : null}\n\n\t\t\t<h2 style={styles.subtitle}>Issued tokens</h2>\n\t\t\t{report?.issued === null ? (\n\t\t\t\t<p style={styles.muted}>\n\t\t\t\t\tIssuing is off — give AdminModule a store and run its migrations.\n\t\t\t\t</p>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t{minted ? (\n\t\t\t\t\t\t<p style={styles.ok}>\n\t\t\t\t\t\t\tCopy this now — it is never shown again.{' '}\n\t\t\t\t\t\t\t<span style={styles.mono}>{minted.token}</span> ({minted.name})\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<form\n\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tconst d = Number(days);\n\t\t\t\t\t\t\tvoid issue({\n\t\t\t\t\t\t\t\tname: name.trim(),\n\t\t\t\t\t\t\t\tscopes,\n\t\t\t\t\t\t\t\t...(days && Number.isInteger(d) && d > 0 ? { expiresInDays: d } : {}),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.then((t) => {\n\t\t\t\t\t\t\t\t\tsetMinted({ name: t.name, token: t.token });\n\t\t\t\t\t\t\t\t\tsetName('');\n\t\t\t\t\t\t\t\t\tsetDays('');\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"name\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\taria-label=\"Name\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ALL.map((s) => (\n\t\t\t\t\t\t\t<label key={s} style={{ ...styles.badge, cursor: 'pointer' }}>\n\t\t\t\t\t\t\t\t<input type=\"checkbox\" checked={scopes.includes(s)} onChange={() => toggle(s)} />{' '}\n\t\t\t\t\t\t\t\t{s}\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tvalue={days}\n\t\t\t\t\t\t\tonChange={(e) => setDays(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"days (optional)\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', width: 140 }}\n\t\t\t\t\t\t\taria-label=\"Days\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tdisabled={!name.trim() || scopes.length === 0 || isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tIssue\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t\t{report?.issued && report.issued.length > 0 ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Scopes</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Expires</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Last used</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{report.issued.map((t) => (\n\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.name}\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? <span style={styles.badge}> revoked</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.scopes.join(', ')}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleDateString()} · {t.createdBy}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.expiresAt ? new Date(t.expiresAt).toLocaleDateString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t{t.lastUsedAt ? new Date(t.lastUsedAt).toLocaleString() : 'never'}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{t.revokedAt ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Revoke \"${t.name}\"? Anything using it stops working immediately.`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid revoke(t.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\tRevoke\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>None issued.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t{report && report.legacy.length === 0 ? (\n\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</p>\n\t\t\t) : (\n\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t{report?.legacy.map((l) => (\n\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\tstill registers its standalone routes with its own token (deprecated)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { AuthAdminClient } from '@fonderie/client';\nimport {\n\tuseAdminLoginHistory,\n\tuseAdminUser,\n\tuseAdminUserSessions,\n\tuseAdminUsers,\n} from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IUsersScreenProps {\n\tclient: AuthAdminClient;\n\tpageSize?: number;\n}\n\n// Who is signed up, and why can't this one log in. Lists on arrival — an\n// operator who must know an address before they can see anything cannot find\n// the account they are being asked about. Picking a row, or an exact email,\n// opens the account: live sessions, recent sign-ins, suspend and sign-out.\nexport function UsersScreen({ client, pageSize = 50 }: IUsersScreenProps) {\n\tconst [input, setInput] = useState('');\n\tconst [selected, setSelected] = useState<{ id?: string; email?: string } | null>(null);\n\n\tconst list = useAdminUsers(client, { limit: pageSize });\n\tconst { user, isLoading, error, suspend, unsuspend, revokeSessions } = useAdminUser(\n\t\tclient,\n\t\tselected ?? {},\n\t);\n\tconst userId = user?.id ?? null;\n\tconst sessions = useAdminUserSessions(client, userId);\n\tconst history = useAdminLoginHistory(client, userId, { limit: 20 });\n\n\tconst yesNo = (v: boolean) =>\n\t\tv ? <span style={styles.ok}>yes</span> : <span style={styles.muted}>no</span>;\n\n\tconst clear = () => {\n\t\tsetSelected(null);\n\t\tsetInput('');\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Users</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst email = input.trim();\n\t\t\t\t\tsetSelected(email ? { email } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"email\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"email address\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Email\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{selected ? (\n\t\t\t\t\t<button type=\"button\" style={styles.button} onClick={clear}>\n\t\t\t\t\t\t← All users\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.status === 404 ? 'No user with that email.' : error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!selected ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.users.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>No users yet.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Email</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Name</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Created</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.users.map((u) => (\n\t\t\t\t\t\t\t\t\t<tr key={u.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, padding: 0 }}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setSelected({ id: u.id })}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{u.email}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{`${u.firstName ?? ''} ${u.lastName ?? ''}`.trim() || (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(u.createdAt).toLocaleDateString()}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{u.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t{u.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t\t\t\t\t\t\t{!u.suspended && !u.deletedAt ? <span style={styles.muted}>active</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{user ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>\n\t\t\t\t\t\t{user.firstName || user.lastName\n\t\t\t\t\t\t\t? `${user.firstName} ${user.lastName}`.trim()\n\t\t\t\t\t\t\t: user.email}{' '}\n\t\t\t\t\t\t{user.suspended ? <span style={styles.badge}>suspended</span> : null}\n\t\t\t\t\t\t{user.deletedAt ? <span style={styles.badge}>deleted</span> : null}\n\t\t\t\t\t</h2>\n\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>id</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{user.id}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>email</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.email} · verified {yesNo(user.isEmailVerified)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>MFA</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{yesNo(user.mfaEnabled)}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.provider || 'password'}\n\t\t\t\t\t\t\t\t\t{user.hasPassword ? '' : ' · no password set'}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>last login</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t{user.lastLogin ? (\n\t\t\t\t\t\t\t\t\t\tnew Date(user.lastLogin).toLocaleString()\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>never</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style={styles.td}>created</td>\n\t\t\t\t\t\t\t\t<td style={styles.td}>{new Date(user.createdAt).toLocaleString()}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<div style={{ ...styles.toolbar, marginTop: 12 }}>\n\t\t\t\t\t\t{user.suspended ? (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void unsuspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tUnsuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\tonClick={() => void suspend()}\n\t\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tSuspend\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\tonClick={() => void revokeSessions().then(() => sessions.refresh())}\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSign out everywhere\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Live sessions</h2>\n\t\t\t\t\t{sessions.sessions.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{sessions.sessions.map((s) => (\n\t\t\t\t\t\t\t\t<li key={s.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{s.ipAddress ?? '—'}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{s.userAgent ?? ''}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>since {new Date(s.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<h2 style={styles.subtitle}>Recent sign-ins</h2>\n\t\t\t\t\t{history.events.length === 0 && !history.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>None recorded.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ul style={styles.list}>\n\t\t\t\t\t\t\t{history.events.map((e) => (\n\t\t\t\t\t\t\t\t<li key={e.id} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={e.outcome === 'success' ? styles.ok : styles.bad}>{e.outcome}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{e.method}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>{new Date(e.createdAt).toLocaleString()}</span>\n\t\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t)}\n\t\t\t\t\t{history.hasMore && !history.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void history.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient } from '@fonderie/client';\nimport { useAdminCatalog } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ICatalogScreenProps {\n\tclient: BillingAdminClient;\n}\n\n// What am I selling: the plans as configured in code, and as stored in the\n// database — side by side, so a divergence is visible. Report, do not repair.\nexport function CatalogScreen({ client }: ICatalogScreenProps) {\n\tconst { catalog, isLoading, error, refresh, deletePlan } = useAdminCatalog(client);\n\tconst money = (v: number | null | undefined) => (v == null ? '—' : (v / 100).toFixed(2));\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<div style={styles.toolbar}>\n\t\t\t\t<h1 style={{ ...styles.title, marginBottom: 0 }}>Catalog</h1>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{isLoading && !catalog ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{catalog ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Configured (code)</h2>\n\t\t\t\t\t<pre style={{ ...styles.mono, background: 'var(--fonderie-surface-alt,#fafafa)', padding: 12, overflowX: 'auto' }}>\n\t\t\t\t\t\t{JSON.stringify(catalog.configured, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t\t<h2 style={styles.subtitle}>Stored (database)</h2>\n\t\t\t\t\t{catalog.stored.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>No stored plans.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Tier</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Seats</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Monthly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Yearly</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Trial</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th} />\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{catalog.stored.map((p) => (\n\t\t\t\t\t\t\t\t\t<tr key={p.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{p.name}</strong>\n\t\t\t\t\t\t\t\t\t\t\t{p.description ? <div style={styles.muted}>{p.description}</div> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.tier}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.seats ?? '∞'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{money(p.pricing?.monthly)} {p.pricing?.currency ?? ''}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{money(p.pricing?.yearly)}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{p.trialDays ? `${p.trialDays} d` : '—'}</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.confirm(`Delete stored plan \"${p.name}\"?`))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvoid deletePlan(p.id).catch(() => {});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { BillingAdminClient, SubscriberType } from '@fonderie/client';\nimport { useAdminSubscriber, useAdminSubscribers } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface ISubscriberScreenProps {\n\tclient: BillingAdminClient;\n\tpageSize?: number;\n}\n\n// Who is subscribed, and then: what is this one on, what does their wallet\n// hold, what moved — and the one write, a manual grant, idempotency-keyed.\n// Lists on arrival; typing a type and an id was only possible if you already\n// knew both, which is not how anyone arrives at this page.\nexport function SubscriberScreen({ client, pageSize = 50 }: ISubscriberScreenProps) {\n\tconst [type, setType] = useState<SubscriberType>('user');\n\tconst [idInput, setIdInput] = useState('');\n\tconst [subscriber, setSubscriber] = useState<{ type: SubscriberType; id: string } | null>(null);\n\tconst list = useAdminSubscribers(client, { limit: pageSize });\n\tconst { subscription, wallet, ledger, hasMoreLedger, isLoading, error, loadMoreLedger, grant } =\n\t\tuseAdminSubscriber(client, subscriber, { limit: 20 });\n\tconst [amount, setAmount] = useState('');\n\tconst [note, setNote] = useState('');\n\tconst [granted, setGranted] = useState<string | null>(null);\n\n\tconst open = (t: SubscriberType, id: string) => {\n\t\tsetGranted(null);\n\t\tsetType(t);\n\t\tsetIdInput(id);\n\t\tsetSubscriber({ type: t, id });\n\t};\n\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Subscriber</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetGranted(null);\n\t\t\t\t\tsetSubscriber(idInput.trim() ? { type, id: idInput.trim() } : null);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<select\n\t\t\t\t\tvalue={type}\n\t\t\t\t\tonChange={(e) => setType(e.target.value as SubscriberType)}\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\taria-label=\"Type\"\n\t\t\t\t>\n\t\t\t\t\t<option value=\"user\">user</option>\n\t\t\t\t\t<option value=\"workspace\">workspace</option>\n\t\t\t\t</select>\n\t\t\t\t<input\n\t\t\t\t\tvalue={idInput}\n\t\t\t\t\tonChange={(e) => setIdInput(e.target.value)}\n\t\t\t\t\tplaceholder=\"subscriber id\"\n\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 280 }}\n\t\t\t\t\taria-label=\"Subscriber id\"\n\t\t\t\t/>\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tLook up\n\t\t\t\t</button>\n\t\t\t\t{subscriber ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsetSubscriber(null);\n\t\t\t\t\t\t\tsetIdInput('');\n\t\t\t\t\t\t\tsetGranted(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t← All subscribers\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\t\tonClick={() => void list.refresh()}\n\t\t\t\t\t\tdisabled={list.isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\tRefresh\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{!subscriber ? (\n\t\t\t\t<>\n\t\t\t\t\t{list.error ? (\n\t\t\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t\t\t{list.error.explanation}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{list.subscriptions.length === 0 && !list.isLoading ? (\n\t\t\t\t\t\t<p style={styles.muted}>No subscribers yet.</p>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Subscriber</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Plan</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Status</th>\n\t\t\t\t\t\t\t\t\t<th style={styles.th}>Renews</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{list.subscriptions.map((s) => (\n\t\t\t\t\t\t\t\t\t<tr key={s.id}>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ ...styles.navItem, padding: 0, ...styles.mono }}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => open(s.subscriberType, s.subscriberId)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{s.subscriberType}/{s.subscriberId}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t<strong>{s.plan}</strong> · {s.interval}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.status}\n\t\t\t\t\t\t\t\t\t\t\t{s.cancelAtPeriodEnd ? <span style={styles.badge}>cancels</span> : null}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t\t{s.currentPeriodEnd ? (\n\t\t\t\t\t\t\t\t\t\t\t\tnew Date(s.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<span style={styles.muted}>—</span>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t)}\n\t\t\t\t\t{list.isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t\t\t{list.hasMore && !list.isLoading ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\tonClick={() => void list.loadMore()}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : null}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t\t{subscriber && !isLoading ? (\n\t\t\t\t<>\n\t\t\t\t\t<h2 style={styles.subtitle}>Subscription</h2>\n\t\t\t\t\t{subscription ? (\n\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>plan</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t<strong>{subscription.plan}</strong> · {subscription.interval}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>status</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.status}\n\t\t\t\t\t\t\t\t\t\t{subscription.cancelAtPeriodEnd ? ' · cancels at period end' : ''}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>period</td>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodStart\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodStart).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}{' '}\n\t\t\t\t\t\t\t\t\t\t→{' '}\n\t\t\t\t\t\t\t\t\t\t{subscription.currentPeriodEnd\n\t\t\t\t\t\t\t\t\t\t\t? new Date(subscription.currentPeriodEnd).toLocaleDateString()\n\t\t\t\t\t\t\t\t\t\t\t: '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<td style={styles.td}>provider</td>\n\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t\t{subscription.providerSubscriptionId ?? '—'}\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No subscription.</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<h2 style={styles.subtitle}>Wallet</h2>\n\t\t\t\t\t{wallet ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t<strong>{wallet.balance}</strong> {wallet.currency}{' '}\n\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\t\t\t\t\t\t\t(granted {wallet.granted ?? '0'} · purchased {wallet.purchased ?? '0'}) · minor\n\t\t\t\t\t\t\t\t\tunits, precision {wallet.precision}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\tstyle={styles.toolbar}\n\t\t\t\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tconst key = `admin-grant-${subscriber.type}-${subscriber.id}-${Date.now()}`;\n\t\t\t\t\t\t\t\t\tvoid grant({\n\t\t\t\t\t\t\t\t\t\tamount: amount.trim(),\n\t\t\t\t\t\t\t\t\t\t...(note ? { description: note } : {}),\n\t\t\t\t\t\t\t\t\t\tidempotencyKey: key,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t\t\t\t\tsetGranted(`Granted ${amount.trim()} ${wallet.currency}.`);\n\t\t\t\t\t\t\t\t\t\t\tsetAmount('');\n\t\t\t\t\t\t\t\t\t\t\tsetNote('');\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={amount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setAmount(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"amount (minor units)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\t\t\t\t\t\t\taria-label=\"Amount\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\tvalue={note}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setNote(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"reason (optional)\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, cursor: 'text', minWidth: 220 }}\n\t\t\t\t\t\t\t\t\taria-label=\"Reason\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button type=\"submit\" style={styles.button} disabled={!/^\\d+$/.test(amount.trim())}>\n\t\t\t\t\t\t\t\t\tGrant\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{granted ? <span style={styles.ok}>{granted}</span> : null}\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t<h2 style={styles.subtitle}>Ledger</h2>\n\t\t\t\t\t\t\t{ledger.length === 0 ? (\n\t\t\t\t\t\t\t\t<p style={styles.muted}>Nothing moved yet.</p>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Kind</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Amount</th>\n\t\t\t\t\t\t\t\t\t\t\t<th style={styles.th}>Note</th>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t{ledger.map((t) => (\n\t\t\t\t\t\t\t\t\t\t\t<tr key={t.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{new Date(t.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={styles.td}>{t.type}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{t.amount}</td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{t.description ?? ''}</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{hasMoreLedger ? (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\t\t\t\t\tonClick={() => void loadMoreLedger()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoad more\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p style={styles.muted}>No wallet — billing has no wallet configuration.</p>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n","import type { AuditAdminClient } from '@fonderie/client';\nimport { useAdminAudit } from '@fonderie/react-admin';\nimport { useState } from 'react';\nimport { styles } from '../styles';\n\nexport interface IAuditScreenProps {\n\tclient: AuditAdminClient;\n\tpageSize?: number;\n}\n\n// What happened — every workspace unless one is named. The chain's integrity\n// verdict is on the Doctor page (events.integrity).\nexport function AuditScreen({ client, pageSize = 50 }: IAuditScreenProps) {\n\tconst [draft, setDraft] = useState({ workspaceId: '', type: '', actorId: '' });\n\tconst [filter, setFilter] = useState<{ workspaceId?: string; type?: string; actorId?: string }>(\n\t\t{},\n\t);\n\tconst { events, hasMore, isLoading, error, refresh, loadMore } = useAdminAudit(client, {\n\t\t...filter,\n\t\tlimit: pageSize,\n\t});\n\tconst field = (key: keyof typeof draft, placeholder: string) => (\n\t\t<input\n\t\t\tvalue={draft[key]}\n\t\t\tonChange={(e) => setDraft({ ...draft, [key]: e.target.value })}\n\t\t\tplaceholder={placeholder}\n\t\t\tstyle={{ ...styles.button, cursor: 'text' }}\n\t\t\taria-label={placeholder}\n\t\t/>\n\t);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Audit</h1>\n\t\t\t<form\n\t\t\t\tstyle={styles.toolbar}\n\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsetFilter({\n\t\t\t\t\t\t...(draft.workspaceId.trim() ? { workspaceId: draft.workspaceId.trim() } : {}),\n\t\t\t\t\t\t...(draft.type.trim() ? { type: draft.type.trim() } : {}),\n\t\t\t\t\t\t...(draft.actorId.trim() ? { actorId: draft.actorId.trim() } : {}),\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{field('workspaceId', 'workspace id (all if empty)')}\n\t\t\t\t{field('type', 'event type')}\n\t\t\t\t{field('actorId', 'actor id')}\n\t\t\t\t<button type=\"submit\" style={styles.button} disabled={isLoading}>\n\t\t\t\t\tFilter\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={styles.button}\n\t\t\t\t\tonClick={() => void refresh()}\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t>\n\t\t\t\t\tRefresh\n\t\t\t\t</button>\n\t\t\t</form>\n\t\t\t{error ? (\n\t\t\t\t<p style={styles.error} role=\"alert\">\n\t\t\t\t\t{error.explanation}\n\t\t\t\t</p>\n\t\t\t) : null}\n\t\t\t{events.length === 0 && !isLoading ? (\n\t\t\t\t<p style={styles.muted}>Nothing recorded for this filter.</p>\n\t\t\t) : (\n\t\t\t\t<table style={styles.table}>\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th style={styles.th}>When</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Type</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Workspace</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Actor</th>\n\t\t\t\t\t\t\t<th style={styles.th}>Request</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{events.map((e) => (\n\t\t\t\t\t\t\t<tr key={e.id}>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>\n\t\t\t\t\t\t\t\t\t{new Date(e.createdAt).toLocaleString()}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.type}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>\n\t\t\t\t\t\t\t\t\t{String(e.payload['workspaceId'] ?? '—')}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.mono }}>{e.actorId ?? '—'}</td>\n\t\t\t\t\t\t\t\t<td style={{ ...styles.td, ...styles.muted }}>{e.requestId ?? ''}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t)}\n\t\t\t{isLoading ? <p style={styles.status}>Loading…</p> : null}\n\t\t\t{hasMore && !isLoading ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tstyle={{ ...styles.button, marginTop: 8 }}\n\t\t\t\t\tonClick={() => void loadMore()}\n\t\t\t\t>\n\t\t\t\t\tLoad more\n\t\t\t\t</button>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","t","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useState","t"]}
|