@fonderie/react-admin-screens 0.1.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.
@@ -0,0 +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"],"sourcesContent":["export type {\n\tAdminPage,\n\tIAdminLogScreenProps,\n\tIAdminShellProps,\n\tIAttentionScreenProps,\n\tIConfigScreenProps,\n\tIDoctorScreenProps,\n\tIModulesScreenProps,\n\tIRoutesScreenProps,\n\tITokensScreenProps,\n} from './screens';\nexport {\n\tAdminLogScreen,\n\tAdminShell,\n\tAttentionScreen,\n\tConfigScreen,\n\tDoctorScreen,\n\tModulesScreen,\n\tRoutesScreen,\n\tTokensScreen,\n} from './screens';\n","import type { AdminClient, ConfigAdminClient, CourierAdminClient } 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';\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\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\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<{ page: AdminPage; label: string; needs?: 'config' | 'courier' }>;\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: '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: '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\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 = { config: Boolean(configClient), courier: Boolean(courierClient) };\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 '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 } from '@fonderie/client';\nimport { useAdminTokens } from '@fonderie/react-admin';\nimport { styles } from '../styles';\n\nexport interface ITokensScreenProps {\n\tclient: AdminClient;\n}\n\nexport function TokensScreen({ client }: ITokensScreenProps) {\n\tconst { report, isLoading, error } = useAdminTokens(client);\n\treturn (\n\t\t<div style={styles.container}>\n\t\t\t<h1 style={styles.title}>Access</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}>Admin token</h2>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t{report.admin.ok ? (\n\t\t\t\t\t\t\t<span style={styles.ok}>strong</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span style={styles.bad}>weak</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{report.admin.problems.map((p) => (\n\t\t\t\t\t\t\t<div key={p.message} style={styles.bad}>\n\t\t\t\t\t\t\t\t{p.message}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</p>\n\t\t\t\t\t<h2 style={styles.subtitle}>Legacy per-brick tokens</h2>\n\t\t\t\t\t{report.legacy.length === 0 ? (\n\t\t\t\t\t\t<p style={styles.muted}>None — every brick's admin surface goes through this token.</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.legacy.map((l) => (\n\t\t\t\t\t\t\t\t<li key={l.module} style={styles.row}>\n\t\t\t\t\t\t\t\t\t<span style={styles.mono}>{l.module}</span>{' '}\n\t\t\t\t\t\t\t\t\t<span style={styles.muted}>\n\t\t\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\t\t</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</>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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","names":["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_jsx_runtime"]}
@@ -0,0 +1,51 @@
1
+ import * as react from 'react';
2
+ import { AdminClient, ConfigAdminClient, CourierAdminClient } from '@fonderie/client';
3
+
4
+ type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'tokens' | 'log' | 'settings' | 'templates';
5
+ interface IAdminShellProps {
6
+ client: AdminClient;
7
+ configClient?: ConfigAdminClient;
8
+ courierClient?: CourierAdminClient;
9
+ environment?: string;
10
+ page?: AdminPage;
11
+ onNavigate?: (page: AdminPage) => void;
12
+ }
13
+ declare function AdminShell({ client, configClient, courierClient, environment, page, onNavigate, }: IAdminShellProps): react.JSX.Element;
14
+
15
+ interface IAttentionScreenProps {
16
+ client: AdminClient;
17
+ }
18
+ declare function AttentionScreen({ client }: IAttentionScreenProps): react.JSX.Element;
19
+
20
+ interface IModulesScreenProps {
21
+ client: AdminClient;
22
+ }
23
+ declare function ModulesScreen({ client }: IModulesScreenProps): react.JSX.Element;
24
+
25
+ interface IDoctorScreenProps {
26
+ client: AdminClient;
27
+ }
28
+ declare function DoctorScreen({ client }: IDoctorScreenProps): react.JSX.Element;
29
+
30
+ interface IConfigScreenProps {
31
+ client: AdminClient;
32
+ }
33
+ declare function ConfigScreen({ client }: IConfigScreenProps): react.JSX.Element;
34
+
35
+ interface IRoutesScreenProps {
36
+ client: AdminClient;
37
+ }
38
+ declare function RoutesScreen({ client }: IRoutesScreenProps): react.JSX.Element;
39
+
40
+ interface ITokensScreenProps {
41
+ client: AdminClient;
42
+ }
43
+ declare function TokensScreen({ client }: ITokensScreenProps): react.JSX.Element;
44
+
45
+ interface IAdminLogScreenProps {
46
+ client: AdminClient;
47
+ pageSize?: number;
48
+ }
49
+ declare function AdminLogScreen({ client, pageSize }: IAdminLogScreenProps): react.JSX.Element;
50
+
51
+ export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ITokensScreenProps, ModulesScreen, RoutesScreen, TokensScreen };
@@ -0,0 +1,51 @@
1
+ import * as react from 'react';
2
+ import { AdminClient, ConfigAdminClient, CourierAdminClient } from '@fonderie/client';
3
+
4
+ type AdminPage = 'attention' | 'modules' | 'doctor' | 'config' | 'routes' | 'tokens' | 'log' | 'settings' | 'templates';
5
+ interface IAdminShellProps {
6
+ client: AdminClient;
7
+ configClient?: ConfigAdminClient;
8
+ courierClient?: CourierAdminClient;
9
+ environment?: string;
10
+ page?: AdminPage;
11
+ onNavigate?: (page: AdminPage) => void;
12
+ }
13
+ declare function AdminShell({ client, configClient, courierClient, environment, page, onNavigate, }: IAdminShellProps): react.JSX.Element;
14
+
15
+ interface IAttentionScreenProps {
16
+ client: AdminClient;
17
+ }
18
+ declare function AttentionScreen({ client }: IAttentionScreenProps): react.JSX.Element;
19
+
20
+ interface IModulesScreenProps {
21
+ client: AdminClient;
22
+ }
23
+ declare function ModulesScreen({ client }: IModulesScreenProps): react.JSX.Element;
24
+
25
+ interface IDoctorScreenProps {
26
+ client: AdminClient;
27
+ }
28
+ declare function DoctorScreen({ client }: IDoctorScreenProps): react.JSX.Element;
29
+
30
+ interface IConfigScreenProps {
31
+ client: AdminClient;
32
+ }
33
+ declare function ConfigScreen({ client }: IConfigScreenProps): react.JSX.Element;
34
+
35
+ interface IRoutesScreenProps {
36
+ client: AdminClient;
37
+ }
38
+ declare function RoutesScreen({ client }: IRoutesScreenProps): react.JSX.Element;
39
+
40
+ interface ITokensScreenProps {
41
+ client: AdminClient;
42
+ }
43
+ declare function TokensScreen({ client }: ITokensScreenProps): react.JSX.Element;
44
+
45
+ interface IAdminLogScreenProps {
46
+ client: AdminClient;
47
+ pageSize?: number;
48
+ }
49
+ declare function AdminLogScreen({ client, pageSize }: IAdminLogScreenProps): react.JSX.Element;
50
+
51
+ export { AdminLogScreen, type AdminPage, AdminShell, AttentionScreen, ConfigScreen, DoctorScreen, type IAdminLogScreenProps, type IAdminShellProps, type IAttentionScreenProps, type IConfigScreenProps, type IDoctorScreenProps, type IModulesScreenProps, type IRoutesScreenProps, type ITokensScreenProps, ModulesScreen, RoutesScreen, TokensScreen };