@fonderie/react-admin-screens 0.6.0 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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":["export type {\n\tAdminPage,\n\tIAdminLogScreenProps,\n\tIAdminShellProps,\n\tIAttentionScreenProps,\n\tIConfigScreenProps,\n\tIDoctorScreenProps,\n\tIModulesScreenProps,\n\tIRoutesScreenProps,\n\tITokensScreenProps,\n\tIUsersScreenProps,\n\tICatalogScreenProps,\n\tISubscriberScreenProps,\n\tIAuditScreenProps,\n} from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tAuditScreen,\n} from './screens';\n","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":["import_react","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../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":["export type {\n\tAdminPage,\n\tIAdminLogScreenProps,\n\tIAdminShellProps,\n\tIAttentionScreenProps,\n\tIConfigScreenProps,\n\tIDoctorScreenProps,\n\tIModulesScreenProps,\n\tIRoutesScreenProps,\n\tITokensScreenProps,\n\tIMigrationsScreenProps,\n\tIUsersScreenProps,\n\tICatalogScreenProps,\n\tISubscriberScreenProps,\n\tIAuditScreenProps,\n} from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n\tMigrationsScreen,\n\tUsersScreen,\n\tCatalogScreen,\n\tSubscriberScreen,\n\tAuditScreen,\n} from './screens';\n","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.\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, 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: '#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":["import_react","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_react_admin","import_react","import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { AdminClient, ConfigAdminClient, CourierAdminClient, AuthAdminClient, BillingAdminClient, AuditAdminClient } from '@fonderie/client';
3
3
 
4
- type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'tokens' | 'log' | 'settings' | 'templates' | 'users' | 'catalog' | 'subscriber' | 'audit';
4
+ type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'migrations' | 'tokens' | 'log' | 'settings' | 'templates' | 'users' | 'catalog' | 'subscriber' | 'audit';
5
5
  interface IAdminShellProps {
6
6
  client: AdminClient;
7
7
  configClient?: ConfigAdminClient;
@@ -45,6 +45,11 @@ interface ITokensScreenProps {
45
45
  }
46
46
  declare function TokensScreen({ client }: ITokensScreenProps): react.JSX.Element;
47
47
 
48
+ interface IMigrationsScreenProps {
49
+ client: AdminClient;
50
+ }
51
+ declare function MigrationsScreen({ client }: IMigrationsScreenProps): react.JSX.Element;
52
+
48
53
  interface IAdminLogScreenProps {
49
54
  client: AdminClient;
50
55
  pageSize?: number;
@@ -74,4 +79,4 @@ interface IAuditScreenProps {
74
79
  }
75
80
  declare function AuditScreen({ client, pageSize }: IAuditScreenProps): react.JSX.Element;
76
81
 
77
- export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, AuditScreen, CatalogScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IAuditScreenProps, type ICatalogScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ISubscriberScreenProps, type ITokensScreenProps, type IUsersScreenProps, ModulesScreen, RoutesScreen, SubscriberScreen, TokensScreen, UsersScreen };
82
+ export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, AuditScreen, CatalogScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IAuditScreenProps, type ICatalogScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IMigrationsScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ISubscriberScreenProps, type ITokensScreenProps, type IUsersScreenProps, MigrationsScreen, ModulesScreen, RoutesScreen, SubscriberScreen, TokensScreen, UsersScreen };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { AdminClient, ConfigAdminClient, CourierAdminClient, AuthAdminClient, BillingAdminClient, AuditAdminClient } from '@fonderie/client';
3
3
 
4
- type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'tokens' | 'log' | 'settings' | 'templates' | 'users' | 'catalog' | 'subscriber' | 'audit';
4
+ type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'migrations' | 'tokens' | 'log' | 'settings' | 'templates' | 'users' | 'catalog' | 'subscriber' | 'audit';
5
5
  interface IAdminShellProps {
6
6
  client: AdminClient;
7
7
  configClient?: ConfigAdminClient;
@@ -45,6 +45,11 @@ interface ITokensScreenProps {
45
45
  }
46
46
  declare function TokensScreen({ client }: ITokensScreenProps): react.JSX.Element;
47
47
 
48
+ interface IMigrationsScreenProps {
49
+ client: AdminClient;
50
+ }
51
+ declare function MigrationsScreen({ client }: IMigrationsScreenProps): react.JSX.Element;
52
+
48
53
  interface IAdminLogScreenProps {
49
54
  client: AdminClient;
50
55
  pageSize?: number;
@@ -74,4 +79,4 @@ interface IAuditScreenProps {
74
79
  }
75
80
  declare function AuditScreen({ client, pageSize }: IAuditScreenProps): react.JSX.Element;
76
81
 
77
- export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, AuditScreen, CatalogScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IAuditScreenProps, type ICatalogScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ISubscriberScreenProps, type ITokensScreenProps, type IUsersScreenProps, ModulesScreen, RoutesScreen, SubscriberScreen, TokensScreen, UsersScreen };
82
+ export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, AuditScreen, CatalogScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IAuditScreenProps, type ICatalogScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IMigrationsScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ISubscriberScreenProps, type ITokensScreenProps, type IUsersScreenProps, MigrationsScreen, ModulesScreen, RoutesScreen, SubscriberScreen, TokensScreen, UsersScreen };