@everscribe/components-react 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.
- package/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/index.cjs +1935 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +39 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +1933 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useNLP.ts","../src/components/FiltersPanel.tsx","../src/components/ActiveFilterChips.tsx","../src/components/ColumnPicker.tsx","../src/components/EventDetail.tsx","../src/hooks/useRelativeTimeTick.ts","../src/components/EventRow.tsx","../src/components/EventTable.tsx","../src/components/ExportModal.tsx","../src/components/FiltersToggle.tsx","../src/components/LiveIndicator.tsx","../src/hooks/useClaims.ts","../src/hooks/useDistinctValues.ts","../src/hooks/useEvents.ts","../src/AuditTrail.tsx"],"names":["useState","useRef","useCallback","generateNLPFilters","EmbedError","fetchTokenViaOpts","jsxs","jsx","useEffect","Fragment","COLUMN_LABELS","hasParseableDiff","useMemo","renderDiff","createPortal","RELATIVE_TIME_TICK_MS","formatTimeCell","parseClaims","createDistinctValuesStore","EMPTY_DISTINCT_VALUES","useSyncExternalStore","NOOP_UNSUB","createEventsStore","ALL_COLUMNS","exportEvents"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport { useCallback, useRef, useState } from 'react'\nimport {\n EmbedError,\n fetchTokenViaOpts,\n generateNLPFilters,\n type GenerateNLPFiltersResponse,\n} from '@everscribe/components-core'\n\nexport interface UseNLPOptions {\n apiBase: string\n token: string | null\n tokenEndpoint?: string\n onTokenExpired?: () => Promise<string>\n}\n\nexport type NLPState =\n | { phase: 'idle' }\n | { phase: 'loading' }\n | { phase: 'ready'; query: string; result: GenerateNLPFiltersResponse }\n | { phase: 'error'; query: string; error: NLPErrorReason }\n\nexport type NLPErrorReason =\n | 'not_configured'\n | 'not_allowed'\n | 'rate_limited'\n | 'provider_busy'\n | 'bad_request'\n | 'unknown'\n\nexport interface UseNLPResult {\n state: NLPState\n submit: (query: string) => Promise<void>\n reset: () => void\n}\n\n// useNLP wraps the embed NLP endpoint with a simple state machine\n// the AI tab consumes. Submitting clears any prior result; the\n// caller renders state.phase to drive button label + spinner + error\n// banner. Network/auth failures fold into the error phase so the\n// component doesn't have to try/catch around submit.\nexport function useNLP(opts: UseNLPOptions): UseNLPResult {\n const [state, setState] = useState<NLPState>({ phase: 'idle' })\n const ctrlRef = useRef<AbortController | null>(null)\n\n const submit = useCallback(\n async (query: string) => {\n const trimmed = query.trim()\n if (!trimmed) return\n if (!opts.token) {\n setState({ phase: 'error', query: trimmed, error: 'not_configured' })\n return\n }\n ctrlRef.current?.abort()\n const ctrl = new AbortController()\n ctrlRef.current = ctrl\n setState({ phase: 'loading' })\n\n try {\n const result = await generateNLPFilters({\n apiBase: opts.apiBase,\n token: opts.token,\n query: trimmed,\n signal: ctrl.signal,\n })\n if (ctrl.signal.aborted) return\n setState({ phase: 'ready', query: trimmed, result })\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return\n // Try a token refresh on 401, otherwise map the EmbedError\n // kind to the user-facing reason. Anything else folds to\n // \"unknown\" so the UI can fall back to a generic message.\n if (err instanceof EmbedError && err.kind === 'unauthorized') {\n const refreshed = await fetchTokenViaOpts({\n tokenEndpoint: opts.tokenEndpoint,\n onTokenExpired: opts.onTokenExpired,\n })\n if (refreshed && !ctrl.signal.aborted) {\n try {\n const retry = await generateNLPFilters({\n apiBase: opts.apiBase,\n token: refreshed,\n query: trimmed,\n signal: ctrl.signal,\n })\n setState({ phase: 'ready', query: trimmed, result: retry })\n return\n } catch (retryErr) {\n setState({\n phase: 'error',\n query: trimmed,\n error: classifyNLPError(retryErr),\n })\n return\n }\n }\n }\n setState({ phase: 'error', query: trimmed, error: classifyNLPError(err) })\n }\n },\n [opts.apiBase, opts.token, opts.tokenEndpoint, opts.onTokenExpired],\n )\n\n const reset = useCallback(() => {\n ctrlRef.current?.abort()\n setState({ phase: 'idle' })\n }, [])\n\n return { state, submit, reset }\n}\n\n// classifyNLPError folds an EmbedError into the small set of reasons\n// the AI tab actually distinguishes. 403 + \"nlp_not_allowed\" message\n// is the AllowNLP claim refusal; everything else falls through to\n// generic buckets.\nfunction classifyNLPError(err: unknown): NLPErrorReason {\n if (!(err instanceof EmbedError)) return 'unknown'\n if (err.status === 503) {\n if (err.message?.includes('busy')) return 'provider_busy'\n return 'not_configured'\n }\n if (err.status === 429) return 'rate_limited'\n if (err.status === 403) return 'not_allowed'\n if (err.kind === 'bad_request') return 'bad_request'\n return 'unknown'\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { FormEvent } from 'react'\nimport type { DistinctValues } from '../hooks/useDistinctValues.js'\nimport { useNLP, type NLPErrorReason } from '../hooks/useNLP.js'\nimport type { EmbedClaims } from '@everscribe/components-core'\n\nexport type TimeRangePreset = '24h' | '7d' | '30d' | 'custom' | 'all'\nexport type FilterTab = 'ai' | 'filters' | 'query'\n\nexport interface FilterValues {\n range: TimeRangePreset\n // since / before are only meaningful when range === 'custom'.\n // Stored as datetime-local strings (YYYY-MM-DDTHH:mm) - the parent\n // converts to ISO before sending to the API.\n since?: string\n before?: string\n action?: string\n actor?: string\n actorType?: string\n tenantId?: string\n targetType?: string\n targetId?: string\n resultStatus?: string\n originIP?: string\n // q is the DSL query - set from the Query tab (user input) or\n // the AI tab (model-translated). Active filter chips parse this.\n q?: string\n // NLP echo fields - set when the AI tab produced the current q.\n // Render the \"Translated to:\" banner from these.\n nlpQ?: string\n nlpExplanation?: string\n nlpUnsupported?: string[]\n}\n\nexport interface FiltersPanelProps {\n value: FilterValues\n onChange: (next: FilterValues) => void\n distinct: DistinctValues\n claims: EmbedClaims | null\n apiBase: string\n token: string | null\n tokenEndpoint?: string\n onTokenExpired?: () => Promise<string>\n // Fired when the user commits a Filters-tab action (\"Add filters\",\n // \"Add filter\"). AuditTrail uses this to roll the panel up so the\n // newly applied filters and resulting table are immediately visible.\n onApplied?: () => void\n}\n\nconst TIME_PRESETS: ReadonlyArray<{ key: TimeRangePreset; label: string }> = [\n { key: '24h', label: '24h' },\n { key: '7d', label: '7d' },\n { key: '30d', label: '30d' },\n { key: 'custom', label: 'Custom' },\n { key: 'all', label: 'All' },\n]\n\n// pickInitialTab figures out which tab to show on first render. NLP\n// echo wins (the user just submitted a NL query); then DSL (they\n// were composing one); then column filters; else AI when available.\nfunction pickInitialTab(v: FilterValues, claims: EmbedClaims | null): FilterTab {\n if (v.nlpQ && claims?.allow_nlp) return 'ai'\n if (v.q && claims?.allow_dsl_input) return 'query'\n if (hasAnyColumnFilter(v)) return 'filters'\n if (claims?.allow_nlp) return 'ai'\n return 'filters'\n}\n\nexport function FiltersPanel({\n value,\n onChange,\n distinct,\n claims,\n apiBase,\n token,\n tokenEndpoint,\n onTokenExpired,\n onApplied,\n}: FiltersPanelProps) {\n const allowNLP = !!claims?.allow_nlp\n const allowDSL = !!claims?.allow_dsl_input\n\n const [activeTab, setActiveTab] = useState<FilterTab>(() =>\n pickInitialTab(value, claims),\n )\n\n return (\n <div className=\"audit-trail-filter-panel\">\n <div className=\"audit-trail-filter-modes\" role=\"tablist\" aria-label=\"Filter mode\">\n {allowNLP && (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === 'ai'}\n className={tabClass(activeTab === 'ai')}\n onClick={() => setActiveTab('ai')}\n >\n Prompt\n </button>\n )}\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === 'filters'}\n className={tabClass(activeTab === 'filters')}\n onClick={() => setActiveTab('filters')}\n >\n Filters\n </button>\n {allowDSL && (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === 'query'}\n className={tabClass(activeTab === 'query')}\n onClick={() => setActiveTab('query')}\n >\n Query\n </button>\n )}\n </div>\n\n {activeTab === 'ai' && allowNLP && (\n <AITabPanel\n value={value}\n onChange={onChange}\n apiBase={apiBase}\n token={token}\n tokenEndpoint={tokenEndpoint}\n onTokenExpired={onTokenExpired}\n />\n )}\n {activeTab === 'filters' && (\n <FiltersTabPanel\n value={value}\n onChange={onChange}\n distinct={distinct}\n onApplied={onApplied}\n />\n )}\n {activeTab === 'query' && allowDSL && (\n <QueryTabPanel value={value} onChange={onChange} />\n )}\n </div>\n )\n}\n\nfunction tabClass(active: boolean): string {\n return active\n ? 'audit-trail-filter-mode audit-trail-filter-mode-selected'\n : 'audit-trail-filter-mode'\n}\n\n// AI tab\n\ninterface AITabProps {\n value: FilterValues\n onChange: (next: FilterValues) => void\n apiBase: string\n token: string | null\n tokenEndpoint?: string\n onTokenExpired?: () => Promise<string>\n}\n\nfunction AITabPanel({\n value,\n onChange,\n apiBase,\n token,\n tokenEndpoint,\n onTokenExpired,\n}: AITabProps) {\n const [draft, setDraft] = useState(value.nlpQ ?? '')\n const nlp = useNLP({ apiBase, token, tokenEndpoint, onTokenExpired })\n\n // When the NLP call lands successfully, fold the translated DSL\n // into the FilterValues so the parent refetches with it applied.\n // Track which result we last applied so we don't re-apply on\n // unrelated re-renders.\n const lastAppliedRef = useRef<string | null>(null)\n useEffect(() => {\n if (nlp.state.phase !== 'ready') return\n const sig = nlp.state.query + '|' + (nlp.state.result.dsl ?? '')\n if (lastAppliedRef.current === sig) return\n lastAppliedRef.current = sig\n onChange({\n ...value,\n q: nlp.state.result.dsl || undefined,\n nlpQ: nlp.state.query,\n nlpExplanation: nlp.state.result.explanation,\n nlpUnsupported: nlp.state.result.unsupported,\n })\n }, [nlp.state, onChange, value])\n\n const isBusy = nlp.state.phase === 'loading'\n const handleSubmit = useCallback(\n (e: FormEvent) => {\n e.preventDefault()\n void nlp.submit(draft)\n },\n [draft, nlp],\n )\n\n return (\n <form className=\"audit-trail-nlp-form\" onSubmit={handleSubmit}>\n <label className=\"audit-trail-nlp-label\" htmlFor=\"audit-trail-nlp-input\">\n Ask in plain English\n <span className=\"audit-trail-badge audit-trail-badge-info\" title=\"Beta\">\n Beta\n </span>\n </label>\n <input\n id=\"audit-trail-nlp-input\"\n type=\"text\"\n className=\"audit-trail-nlp-input\"\n placeholder=\"e.g. failed logins last 24 hours\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n maxLength={500}\n aria-label=\"Natural-language filter query\"\n disabled={isBusy}\n />\n\n {value.q && value.nlpQ && (\n <div className=\"audit-trail-nlp-banner\">\n <p>\n <strong>Translated to:</strong>{' '}\n <code className=\"audit-trail-nlp-translated\">{value.q}</code>\n </p>\n </div>\n )}\n\n {nlp.state.phase === 'error' && (\n <div className=\"audit-trail-error\">{nlpErrorMessage(nlp.state.error)}</div>\n )}\n\n {value.nlpUnsupported && value.nlpUnsupported.length > 0 && (\n <div className=\"audit-trail-error audit-trail-nlp-unsupported\">\n <ul>\n {value.nlpUnsupported.map((u, i) => (\n <li key={i}>Couldn't apply: {u}</li>\n ))}\n </ul>\n </div>\n )}\n\n <div className=\"audit-trail-filter-actions\">\n <button\n type=\"submit\"\n className=\"audit-trail-button audit-trail-button-secondary\"\n disabled={!draft.trim() || isBusy}\n >\n {isBusy ? (\n <>\n <span className=\"audit-trail-button-spinner\" /> Translating…\n </>\n ) : (\n 'Search'\n )}\n </button>\n </div>\n </form>\n )\n}\n\nfunction nlpErrorMessage(reason: NLPErrorReason): string {\n switch (reason) {\n case 'not_configured':\n return \"Natural-language filtering isn't configured on this server.\"\n case 'not_allowed':\n return 'This embed token does not permit natural-language queries.'\n case 'rate_limited':\n return \"You've hit the per-hour limit. Try again in a few minutes.\"\n case 'provider_busy':\n return 'The natural-language service is busy right now. Try again in a moment.'\n case 'bad_request':\n return \"That query couldn't be processed. Try rephrasing.\"\n default:\n return \"Couldn't process that query. Try simpler terms.\"\n }\n}\n\n// Filters tab\n\ninterface FiltersTabProps {\n value: FilterValues\n onChange: (next: FilterValues) => void\n distinct: DistinctValues\n onApplied?: () => void\n}\n\nfunction FiltersTabPanel({ value, onChange, distinct, onApplied }: FiltersTabProps) {\n // Local draft state for every column filter. Nothing commits until\n // the user clicks \"Add filters\" - mirroring the dashboard's\n // explicit-submit UX. Time-range presets are the one exception:\n // they apply immediately because they're a view selector, not a\n // filter.\n const [draftSince, setDraftSince] = useState(value.since ?? '')\n const [draftBefore, setDraftBefore] = useState(value.before ?? '')\n const [draftAction, setDraftAction] = useState(value.action ?? '')\n const [draftActorType, setDraftActorType] = useState(value.actorType ?? '')\n const [draftTenantID, setDraftTenantID] = useState(value.tenantId ?? '')\n const [draftTargetType, setDraftTargetType] = useState(value.targetType ?? '')\n const [draftResultStatus, setDraftResultStatus] = useState(value.resultStatus ?? '')\n const [draftActor, setDraftActor] = useState(value.actor ?? '')\n const [draftTargetID, setDraftTargetID] = useState(value.targetId ?? '')\n const [draftOriginIP, setDraftOriginIP] = useState(value.originIP ?? '')\n\n // Re-sync drafts when the applied state changes externally (chip\n // removal, AI-tab clearing, parent reset).\n useEffect(() => {\n setDraftSince(value.since ?? '')\n setDraftBefore(value.before ?? '')\n setDraftAction(value.action ?? '')\n setDraftActorType(value.actorType ?? '')\n setDraftTenantID(value.tenantId ?? '')\n setDraftTargetType(value.targetType ?? '')\n setDraftResultStatus(value.resultStatus ?? '')\n setDraftActor(value.actor ?? '')\n setDraftTargetID(value.targetId ?? '')\n setDraftOriginIP(value.originIP ?? '')\n }, [\n value.since,\n value.before,\n value.action,\n value.actorType,\n value.tenantId,\n value.targetType,\n value.resultStatus,\n value.actor,\n value.targetId,\n value.originIP,\n ])\n\n // Add-filters button is enabled only when the live drafts differ\n // from what's already applied. Compare each draft's normalized\n // value (empty string → undefined) to the applied value.\n const norm = (s: string) => (s === '' ? undefined : s)\n const dirty =\n norm(draftAction) !== value.action ||\n norm(draftActorType) !== value.actorType ||\n norm(draftTenantID) !== value.tenantId ||\n norm(draftTargetType) !== value.targetType ||\n norm(draftResultStatus) !== value.resultStatus ||\n norm(draftActor) !== value.actor ||\n norm(draftTargetID) !== value.targetId ||\n norm(draftOriginIP) !== value.originIP ||\n (value.range === 'custom' &&\n (norm(draftSince) !== value.since ||\n norm(draftBefore) !== value.before))\n\n const handleApply = () => {\n // Filters-tab actions start clean: commit the column drafts and\n // strip any AI carry-over or DSL query the user might have\n // started in the AI / Query tabs.\n onChange({\n ...value,\n action: norm(draftAction),\n actorType: norm(draftActorType),\n tenantId: norm(draftTenantID),\n targetType: norm(draftTargetType),\n resultStatus: norm(draftResultStatus),\n actor: norm(draftActor),\n targetId: norm(draftTargetID),\n originIP: norm(draftOriginIP),\n since: value.range === 'custom' ? norm(draftSince) : value.since,\n before: value.range === 'custom' ? norm(draftBefore) : value.before,\n q: undefined,\n nlpQ: undefined,\n nlpExplanation: undefined,\n nlpUnsupported: undefined,\n })\n onApplied?.()\n }\n\n const handlePresetClick = (range: TimeRangePreset) => {\n // Time-range presets apply immediately. They don't clear NLP /\n // DSL state because they're a view selector, not a filter.\n if (range === 'custom') {\n onChange({ ...value, range })\n return\n }\n onChange({ ...value, range, since: undefined, before: undefined })\n }\n\n return (\n <div className=\"audit-trail-filter-tab-panel\">\n <div\n className=\"audit-trail-filter-tabs\"\n role=\"tablist\"\n aria-label=\"Time range\"\n >\n {TIME_PRESETS.map((p) => (\n <button\n key={p.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={value.range === p.key}\n className={\n value.range === p.key\n ? 'audit-trail-filter-tab audit-trail-filter-tab-selected'\n : 'audit-trail-filter-tab'\n }\n onClick={() => handlePresetClick(p.key)}\n >\n {p.label}\n </button>\n ))}\n </div>\n\n {value.range === 'custom' && (\n <div className=\"audit-trail-filter-row\">\n <label className=\"audit-trail-filter-field\">\n <span className=\"audit-trail-filter-field-label\">From</span>\n <input\n type=\"datetime-local\"\n className=\"audit-trail-filter-input\"\n value={draftSince}\n onChange={(e) => setDraftSince(e.target.value)}\n />\n </label>\n <label className=\"audit-trail-filter-field\">\n <span className=\"audit-trail-filter-field-label\">To</span>\n <input\n type=\"datetime-local\"\n className=\"audit-trail-filter-input\"\n value={draftBefore}\n onChange={(e) => setDraftBefore(e.target.value)}\n />\n </label>\n </div>\n )}\n\n <div className=\"audit-trail-filter-row\">\n <select\n className=\"audit-trail-filter-select\"\n aria-label=\"Action\"\n value={draftAction}\n onChange={(e) => setDraftAction(e.target.value)}\n >\n <option value=\"\">All actions</option>\n {distinct.actions.map((a) => (\n <option key={a} value={a}>\n {a}\n </option>\n ))}\n </select>\n\n <select\n className=\"audit-trail-filter-select\"\n aria-label=\"Actor type\"\n value={draftActorType}\n onChange={(e) => setDraftActorType(e.target.value)}\n >\n <option value=\"\">All actor types</option>\n {distinct.actorTypes.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n\n <select\n className=\"audit-trail-filter-select\"\n aria-label=\"Target type\"\n value={draftTargetType}\n onChange={(e) => setDraftTargetType(e.target.value)}\n >\n <option value=\"\">All target types</option>\n {distinct.targetTypes.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n\n {distinct.tenants.length > 0 && (\n <select\n className=\"audit-trail-filter-select\"\n aria-label=\"Tenant\"\n value={draftTenantID}\n onChange={(e) => setDraftTenantID(e.target.value)}\n >\n <option value=\"\">All tenants</option>\n {distinct.tenants.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n )}\n\n {distinct.resultStatuses.length > 0 && (\n <select\n className=\"audit-trail-filter-select\"\n aria-label=\"Result\"\n value={draftResultStatus}\n onChange={(e) => setDraftResultStatus(e.target.value)}\n >\n <option value=\"\">All results</option>\n {distinct.resultStatuses.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n )}\n </div>\n\n {/* Free-text filters each on their own row - three inputs side-\n by-side wrapped awkwardly on narrow embed widths. Stacked\n they breathe and read naturally. */}\n <div className=\"audit-trail-filter-row\">\n <input\n type=\"text\"\n className=\"audit-trail-filter-input audit-trail-filter-actor-input\"\n placeholder=\"Actor (id, name, email)\"\n value={draftActor}\n onChange={(e) => setDraftActor(e.target.value)}\n />\n </div>\n <div className=\"audit-trail-filter-row\">\n <input\n type=\"text\"\n className=\"audit-trail-filter-input audit-trail-filter-wide-input\"\n placeholder=\"Target ID\"\n value={draftTargetID}\n onChange={(e) => setDraftTargetID(e.target.value)}\n />\n </div>\n <div className=\"audit-trail-filter-row\">\n <input\n type=\"text\"\n className=\"audit-trail-filter-input audit-trail-filter-wide-input\"\n placeholder=\"Origin IP\"\n value={draftOriginIP}\n onChange={(e) => setDraftOriginIP(e.target.value)}\n />\n </div>\n\n <div className=\"audit-trail-filter-actions\">\n <button\n type=\"button\"\n className=\"audit-trail-button audit-trail-button-secondary\"\n disabled={!dirty}\n onClick={handleApply}\n >\n Add filters\n </button>\n </div>\n\n <MetadataFilterSection\n value={value}\n onChange={onChange}\n distinct={distinct}\n onApplied={onApplied}\n />\n </div>\n )\n}\n\n// Metadata / changed-field filter section. Lives inside the\n// Filters tab. The user composes a single DSL clause via picker\n// inputs and clicks Add filter to apply - which replaces q\n// (and strips any AI carry-over), mirroring the dashboard's\n// \"Filters tab starts clean\" behavior.\n\ntype AddFilterVariant = 'metadata' | 'change-field' | 'change-before' | 'change-after'\ntype MetadataOperator =\n | 'eq'\n | 'neq'\n | 'contains'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'between'\n\ninterface MetadataFilterSectionProps {\n value: FilterValues\n onChange: (next: FilterValues) => void\n distinct: DistinctValues\n onApplied?: () => void\n}\n\nfunction MetadataFilterSection({\n value,\n onChange,\n distinct,\n onApplied,\n}: MetadataFilterSectionProps) {\n const [variant, setVariant] = useState<AddFilterVariant>('metadata')\n const [mdKey, setMdKey] = useState('')\n const [mdOp, setMdOp] = useState<MetadataOperator>('eq')\n const [mdValue, setMdValue] = useState('')\n const [mdValue2, setMdValue2] = useState('')\n const [cfField, setCfField] = useState('')\n const [cbField, setCbField] = useState('')\n const [cbValue, setCbValue] = useState('')\n const [caField, setCaField] = useState('')\n const [caValue, setCaValue] = useState('')\n\n const compiled = compileMetaClause({\n variant,\n mdKey,\n mdOp,\n mdValue,\n mdValue2,\n cfField,\n cbField,\n cbValue,\n caField,\n caValue,\n })\n\n const submittable = compiled.dsl !== null\n // Surface only the \"between\" hint while composing - other compile\n // errors (missing field, etc.) are just \"you haven't filled in X yet\"\n // and would be noisy while typing.\n const showError =\n !submittable && compiled.error && /Both bounds/.test(compiled.error)\n\n const handleAdd = () => {\n if (!compiled.dsl) return\n // Filters-tab actions start clean: replace q with just this\n // clause and strip any AI echo.\n onChange({\n ...value,\n q: compiled.dsl,\n nlpQ: undefined,\n nlpExplanation: undefined,\n nlpUnsupported: undefined,\n })\n onApplied?.()\n }\n\n return (\n <div className=\"audit-trail-add-filter-inline\">\n <h3 className=\"audit-trail-add-filter-heading\">Metadata and Changed Fields</h3>\n\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Filter type</span>\n <select\n value={variant}\n onChange={(e) => setVariant(e.target.value as AddFilterVariant)}\n >\n <option value=\"metadata\">Metadata key/value</option>\n <option value=\"change-field\">Change: a field changed</option>\n <option value=\"change-before\">Change: previous value (before)</option>\n <option value=\"change-after\">Change: new value (after)</option>\n </select>\n </label>\n\n {variant === 'metadata' && (\n <>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Key</span>\n <input\n type=\"text\"\n list=\"audit-trail-mdk-key-list\"\n placeholder=\"e.g. environment\"\n value={mdKey}\n onChange={(e) => setMdKey(e.target.value)}\n />\n <datalist id=\"audit-trail-mdk-key-list\">\n {distinct.metadataKeys.map((k) => (\n <option key={k.key} value={k.key}>\n {k.observed_type} · {k.event_count}\n </option>\n ))}\n </datalist>\n </label>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Operator</span>\n <select\n value={mdOp}\n onChange={(e) => setMdOp(e.target.value as MetadataOperator)}\n >\n <option value=\"eq\">equals</option>\n <option value=\"neq\">not equal</option>\n <option value=\"contains\">contains</option>\n <option value=\"gt\">greater than</option>\n <option value=\"gte\">greater or equal</option>\n <option value=\"lt\">less than</option>\n <option value=\"lte\">less or equal</option>\n <option value=\"between\">between</option>\n </select>\n </label>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Value</span>\n <input\n type=\"text\"\n placeholder=\"e.g. prod\"\n value={mdValue}\n onChange={(e) => setMdValue(e.target.value)}\n />\n </label>\n {mdOp === 'between' && (\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Upper bound</span>\n <input\n type=\"text\"\n placeholder=\"e.g. 1000\"\n value={mdValue2}\n onChange={(e) => setMdValue2(e.target.value)}\n />\n </label>\n )}\n </>\n )}\n\n {variant === 'change-field' && (\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Field</span>\n <input\n type=\"text\"\n list=\"audit-trail-cf-field-list\"\n placeholder=\"e.g. email\"\n value={cfField}\n onChange={(e) => setCfField(e.target.value)}\n />\n <datalist id=\"audit-trail-cf-field-list\">\n {distinct.changeFields.map((c) => (\n <option key={c.field} value={c.field}>\n {c.event_count} events\n </option>\n ))}\n </datalist>\n </label>\n )}\n\n {variant === 'change-before' && (\n <>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Field</span>\n <input\n type=\"text\"\n list=\"audit-trail-cf-field-list\"\n placeholder=\"e.g. role\"\n value={cbField}\n onChange={(e) => setCbField(e.target.value)}\n />\n </label>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Previous value</span>\n <input\n type=\"text\"\n placeholder=\"e.g. user\"\n value={cbValue}\n onChange={(e) => setCbValue(e.target.value)}\n />\n </label>\n </>\n )}\n\n {variant === 'change-after' && (\n <>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">Field</span>\n <input\n type=\"text\"\n list=\"audit-trail-cf-field-list\"\n placeholder=\"e.g. role\"\n value={caField}\n onChange={(e) => setCaField(e.target.value)}\n />\n </label>\n <label className=\"audit-trail-add-filter-row\">\n <span className=\"audit-trail-add-filter-label\">New value</span>\n <input\n type=\"text\"\n placeholder=\"e.g. admin\"\n value={caValue}\n onChange={(e) => setCaValue(e.target.value)}\n />\n </label>\n </>\n )}\n\n {showError && (\n <p className=\"audit-trail-add-filter-error\">{compiled.error}</p>\n )}\n\n <div className=\"audit-trail-filter-actions audit-trail-add-filter-actions\">\n <button\n type=\"button\"\n className=\"audit-trail-button audit-trail-button-secondary\"\n disabled={!submittable}\n onClick={handleAdd}\n >\n Add filter\n </button>\n </div>\n </div>\n )\n}\n\ninterface MetaCompileInput {\n variant: AddFilterVariant\n mdKey: string\n mdOp: MetadataOperator\n mdValue: string\n mdValue2: string\n cfField: string\n cbField: string\n cbValue: string\n caField: string\n caValue: string\n}\n\ninterface MetaCompileResult {\n dsl: string | null\n error?: string\n}\n\n// compileMetaClause mirrors the dashboard's app.js DSL builder. Returns\n// `{ dsl: null, error }` while required fields are empty so the Add\n// button stays disabled; only `between` surfaces its error inline\n// because it's the one rule where a partially-filled state is a real\n// composition mistake rather than \"still typing\".\nfunction compileMetaClause(i: MetaCompileInput): MetaCompileResult {\n switch (i.variant) {\n case 'metadata': {\n const key = i.mdKey.trim()\n if (!key) return { dsl: null, error: 'Key is required' }\n const path = 'metadata.' + quoteKeyIfNeeded(key)\n const v1 = i.mdValue\n const v2 = i.mdValue2\n switch (i.mdOp) {\n case 'eq':\n return { dsl: `${path}:${quoteIfNeeded(v1)}` }\n case 'neq':\n return { dsl: `${path}:!${quoteIfNeeded(v1)}` }\n case 'contains':\n return { dsl: `${path}:~${quoteIfNeeded(v1)}` }\n case 'gt':\n return { dsl: `${path}:>${quoteIfNeeded(v1)}` }\n case 'gte':\n return { dsl: `${path}:>=${quoteIfNeeded(v1)}` }\n case 'lt':\n return { dsl: `${path}:<${quoteIfNeeded(v1)}` }\n case 'lte':\n return { dsl: `${path}:<=${quoteIfNeeded(v1)}` }\n case 'between':\n if (v1 === '' || v2 === '') {\n return { dsl: null, error: 'Both bounds required for between' }\n }\n return {\n dsl: `${path}:[${quoteIfNeeded(v1)} TO ${quoteIfNeeded(v2)}]`,\n }\n }\n return { dsl: null, error: 'Unknown operator' }\n }\n case 'change-field': {\n const f = i.cfField.trim()\n if (!f) return { dsl: null, error: 'Field is required' }\n return { dsl: `change.field:${quoteIfNeeded(f)}` }\n }\n case 'change-before': {\n const f = i.cbField.trim()\n if (!f) return { dsl: null, error: 'Field is required' }\n return {\n dsl: `change.${quoteKeyIfNeeded(f)}.before:${quoteIfNeeded(i.cbValue)}`,\n }\n }\n case 'change-after': {\n const f = i.caField.trim()\n if (!f) return { dsl: null, error: 'Field is required' }\n return {\n dsl: `change.${quoteKeyIfNeeded(f)}.after:${quoteIfNeeded(i.caValue)}`,\n }\n }\n }\n}\n\n// quoteIfNeeded wraps a value in double quotes when it contains\n// whitespace, parens, brackets, or quotes - characters the DSL parser\n// would otherwise terminate on. Mirrors filter.valueNeedsQuoting on\n// the server. Escapes backslash and double-quote inside quoted values.\nfunction quoteIfNeeded(raw: string): string {\n if (raw === '') return '\"\"'\n if (/[\\s\"\\(\\)\\[\\]]/.test(raw)) {\n return '\"' + raw.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') + '\"'\n }\n return raw\n}\n\n// quoteKeyIfNeeded mirrors quoteIfNeeded but for dynamic keys\n// (metadata.<key>, change.<key>.before). The dynamic-key grammar is\n// stricter than IDENT, so dotted keys like \"feature.flag\" must be\n// quoted to round-trip cleanly.\nfunction quoteKeyIfNeeded(raw: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_-]*$/.test(raw)) return raw\n return '\"' + raw + '\"'\n}\n\n// Query tab\n\ninterface QueryTabProps {\n value: FilterValues\n onChange: (next: FilterValues) => void\n}\n\nfunction QueryTabPanel({ value, onChange }: QueryTabProps) {\n const [draft, setDraft] = useState(value.q ?? '')\n\n // Re-sync the draft when q changes externally (e.g., AI tab\n // applied a translation; chip-row × cleared a clause).\n useEffect(() => {\n setDraft(value.q ?? '')\n }, [value.q])\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n const next = draft.trim() || undefined\n if (next === value.q) return\n // Submitting the Query tab strips any NLP echo - the user is\n // editing the DSL directly now.\n onChange({\n ...value,\n q: next,\n nlpQ: undefined,\n nlpExplanation: undefined,\n nlpUnsupported: undefined,\n })\n }\n\n return (\n <form className=\"audit-trail-query-form\" onSubmit={handleSubmit}>\n <label className=\"audit-trail-query-label\" htmlFor=\"audit-trail-query-input\">\n Query{' '}\n <a href=\"https://everscribe.io/docs\" target=\"_blank\" rel=\"noopener noreferrer\">\n (see docs)\n </a>\n </label>\n <input\n id=\"audit-trail-query-input\"\n type=\"text\"\n className=\"audit-trail-query-input\"\n placeholder=\"e.g. action:user.login AND result.status:!ok\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n aria-label=\"Advanced query (DSL)\"\n spellCheck={false}\n />\n <div className=\"audit-trail-filter-actions\">\n <button\n type=\"submit\"\n className=\"audit-trail-button audit-trail-button-secondary\"\n disabled={(draft.trim() || '') === (value.q ?? '')}\n >\n Search\n </button>\n </div>\n </form>\n )\n}\n\n// Active filter counters\n\n// hasAnyColumnFilter is the predicate the initial-tab logic uses.\nfunction hasAnyColumnFilter(v: FilterValues): boolean {\n return !!(\n v.action ||\n v.actor ||\n v.actorType ||\n v.tenantId ||\n v.targetType ||\n v.targetId ||\n v.resultStatus ||\n v.originIP\n )\n}\n\n// countActiveColumnFilters reports how many column filters are active.\n// Time range and the DSL q are excluded; q gets its own per-clause\n// chip count via parseQClauses below.\nexport function countActiveColumnFilters(v: FilterValues): number {\n let n = 0\n if (v.action) n++\n if (v.actor) n++\n if (v.actorType) n++\n if (v.tenantId) n++\n if (v.targetType) n++\n if (v.targetId) n++\n if (v.resultStatus) n++\n if (v.originIP) n++\n return n\n}\n\n// parseQClauses splits a top-level `field:value AND field:value`\n// query into individual chips. Lightweight tokenizer - it doesn't\n// validate the DSL syntax (the server does that) and bails to\n// \"single chip with the full string\" for queries it can't split\n// cleanly (parens, nested expressions). Matches the dashboard's\n// chip-per-clause behavior at a sane level of fidelity.\nexport interface ParsedClause {\n label: string\n // raw is the DSL slice for this clause. Removing the chip rebuilds\n // q with this clause excised, joining the rest with \" AND \".\n raw: string\n}\n\nexport function parseQClauses(q: string): ParsedClause[] {\n const trimmed = q.trim()\n if (!trimmed) return []\n // If the query contains parens (within-field OR, range syntax),\n // we can't trivially split - fall back to one chip for the whole\n // expression so the chip × still works as a clear-all.\n if (/[()]/.test(trimmed)) return [{ label: trimmed, raw: trimmed }]\n return trimmed\n .split(/\\s+AND\\s+/i)\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => ({ label: s, raw: s }))\n}\n\nexport function removeClauseFromQ(q: string, raw: string): string | undefined {\n const remaining = parseQClauses(q).filter((c) => c.raw !== raw)\n if (remaining.length === 0) return undefined\n return remaining.map((c) => c.raw).join(' AND ')\n}\n","import type { FilterValues } from './FiltersPanel.js'\nimport { parseQClauses, removeClauseFromQ } from './FiltersPanel.js'\n\nexport interface ActiveFilterChipsProps {\n value: FilterValues\n onChange: (next: FilterValues) => void\n}\n\ninterface Chip {\n label: string\n onRemove: () => void\n}\n\n// ActiveFilterChips renders one chip per active column filter and\n// one chip per top-level DSL clause in `q`. Clicking × strips that\n// single filter (or rebuilds q without the clause). When nothing is\n// active the component renders nothing - the parent decides whether\n// to leave the row visible at all.\nexport function ActiveFilterChips({ value, onChange }: ActiveFilterChipsProps) {\n const chips: Chip[] = []\n\n const colChip = (\n field: keyof FilterValues,\n label: string,\n raw: string | undefined,\n ) => {\n if (!raw) return\n chips.push({\n label: `${label}: ${raw}`,\n onRemove: () => onChange({ ...value, [field]: undefined }),\n })\n }\n colChip('action', 'Action', value.action)\n colChip('actor', 'Actor', value.actor)\n colChip('actorType', 'Actor type', value.actorType)\n colChip('tenantId', 'Tenant', value.tenantId)\n colChip('targetType', 'Target type', value.targetType)\n colChip('targetId', 'Target ID', value.targetId)\n colChip('resultStatus', 'Result', value.resultStatus)\n colChip('originIP', 'Origin IP', value.originIP)\n\n // DSL clauses get their own chip each - removing one re-serializes\n // q without that clause so the rest stay applied.\n if (value.q) {\n for (const clause of parseQClauses(value.q)) {\n chips.push({\n label: clause.label,\n onRemove: () => {\n const nextQ = removeClauseFromQ(value.q!, clause.raw)\n onChange({\n ...value,\n q: nextQ,\n // If this was the last DSL clause and the q came from an\n // NLP translation, clear the echo fields too - there's\n // nothing left to attribute to \"you asked\".\n nlpQ: nextQ ? value.nlpQ : undefined,\n nlpExplanation: nextQ ? value.nlpExplanation : undefined,\n nlpUnsupported: nextQ ? value.nlpUnsupported : undefined,\n })\n },\n })\n }\n }\n\n if (chips.length === 0) return null\n\n const clearAll = () =>\n onChange({\n range: value.range,\n since: value.since,\n before: value.before,\n })\n\n return (\n <div className=\"audit-trail-filter-chips-row\">\n <div className=\"audit-trail-filter-chips\">\n {chips.map((c, i) => (\n <button\n key={i}\n type=\"button\"\n className=\"audit-trail-filter-chip\"\n onClick={c.onRemove}\n title=\"Remove this filter\"\n aria-label={`Remove filter: ${c.label}`}\n >\n <span>{c.label}</span>\n <span aria-hidden=\"true\" className=\"audit-trail-filter-chip-x\">\n ×\n </span>\n </button>\n ))}\n </div>\n <button\n type=\"button\"\n className=\"audit-trail-button audit-trail-button-text\"\n onClick={clearAll}\n >\n Clear all\n </button>\n </div>\n )\n}\n","import { COLUMN_LABELS } from '@everscribe/components-core'\n\nexport interface ColumnPickerProps {\n available: string[]\n visible: ReadonlySet<string>\n onToggle: (column: string) => void\n}\n\nexport function ColumnPicker({ available, visible, onToggle }: ColumnPickerProps) {\n const visibleCount = available.reduce((n, c) => (visible.has(c) ? n + 1 : n), 0)\n\n return (\n <details className=\"audit-trail-picker\">\n <summary className=\"audit-trail-picker-summary\">\n Columns ({visibleCount}/{available.length})\n </summary>\n <div className=\"audit-trail-picker-content\">\n {available.map((col) => (\n <label key={col} className=\"audit-trail-picker-item\">\n <input\n type=\"checkbox\"\n checked={visible.has(col)}\n onChange={() => onToggle(col)}\n />\n <span>{COLUMN_LABELS[col] ?? col}</span>\n </label>\n ))}\n </div>\n </details>\n )\n}\n","'use client'\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n hasParseableDiff,\n renderDiff,\n type DiffLine,\n type Event,\n} from '@everscribe/components-core'\n\nexport interface EventDetailProps {\n event: Event\n onClose: () => void\n // theme propagates the parent's theme into the portal so the modal's\n // CSS variables (--audit-trail-bg, --audit-trail-fg, --audit-trail-overlay, …) still resolve\n // - the portal target is document.body, which sits outside .audit-trail-root.\n theme?: 'light' | 'dark'\n}\n\ntype Tab = 'raw' | 'diff' | 'metadata'\n\nexport function EventDetail({ event, onClose, theme = 'light' }: EventDetailProps) {\n const [mounted, setMounted] = useState(false)\n const [tab, setTab] = useState<Tab>('raw')\n const [copied, setCopied] = useState(false)\n const closeBtnRef = useRef<HTMLButtonElement>(null)\n\n const showDiff = hasParseableDiff(event.change)\n const diff = useMemo(\n () => (showDiff ? renderDiff(event.change) : { lines: [] }),\n [event.change, showDiff],\n )\n const rawJson = useMemo(() => JSON.stringify(event, null, 2), [event])\n const highlightedJson = useMemo(() => highlightJSON(rawJson), [rawJson])\n const metadataRows = useMemo(() => buildMetadataRows(event.metadata), [event.metadata])\n const showMetadata = metadataRows.length > 0\n\n useEffect(() => setMounted(true), [])\n\n useEffect(() => {\n if (!mounted) return\n closeBtnRef.current?.focus()\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [mounted, onClose])\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(rawJson)\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n } catch {\n // Clipboard permission denied or unsupported - silently no-op.\n // The user can still select the text manually.\n }\n }\n\n if (!mounted) return null\n\n return createPortal(\n <div className={`audit-trail-portal audit-trail-theme-${theme}`}>\n <div className=\"audit-trail-inspect-backdrop\" onMouseDown={onClose}>\n <div\n className=\"audit-trail-inspect-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"audit-trail-inspect-title\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n ref={closeBtnRef}\n className=\"audit-trail-inspect-close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n ×\n </button>\n <h2 id=\"audit-trail-inspect-title\" className=\"audit-trail-inspect-title\">\n Inspect Event\n </h2>\n <p className=\"audit-trail-inspect-subtitle\">\n <span className=\"audit-trail-inspect-subtitle-line\">\n <code>{event.action || '-'}</code>\n </span>\n <span className=\"audit-trail-inspect-subtitle-line\">\n {formatHeaderTimestamp(event.occurred_at)}\n </span>\n <span className=\"audit-trail-inspect-subtitle-line\">\n <code>{event.id}</code>\n </span>\n </p>\n\n {(showDiff || showMetadata) && (\n <div className=\"audit-trail-inspect-tabs\" role=\"tablist\" aria-label=\"View\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'raw'}\n className={inspectTabClass(tab === 'raw')}\n onClick={() => setTab('raw')}\n >\n Raw\n </button>\n {showDiff && (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'diff'}\n className={inspectTabClass(tab === 'diff')}\n onClick={() => setTab('diff')}\n >\n Diff\n </button>\n )}\n {showMetadata && (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'metadata'}\n className={inspectTabClass(tab === 'metadata')}\n onClick={() => setTab('metadata')}\n >\n Metadata\n </button>\n )}\n </div>\n )}\n\n {tab === 'raw' && (\n <div className=\"audit-trail-inspect-panel\">\n <div className=\"audit-trail-code-block-wrap\">\n <pre className=\"audit-trail-code-block\">\n {/* dangerouslySetInnerHTML carries pre-escaped HTML\n from highlightJSON - every value-bearing slot in\n the source string is HTML-escaped before the\n token regex runs, so injected user data renders\n as text. */}\n <code dangerouslySetInnerHTML={{ __html: highlightedJson }} />\n </pre>\n <button\n type=\"button\"\n className=\"audit-trail-copy-button\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy to clipboard'}\n title={copied ? 'Copied' : 'Copy to clipboard'}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </div>\n </div>\n )}\n\n {tab === 'diff' && showDiff && (\n <div className=\"audit-trail-inspect-panel\">\n <DiffTable lines={diff.lines} />\n </div>\n )}\n\n {tab === 'metadata' && showMetadata && (\n <div className=\"audit-trail-inspect-panel\">\n <MetadataTable rows={metadataRows} />\n </div>\n )}\n </div>\n </div>\n </div>,\n document.body,\n )\n}\n\nfunction DiffTable({ lines }: { lines: DiffLine[] }) {\n return (\n <div className=\"audit-trail-diff-wrap\">\n <table className=\"audit-trail-diff-table\">\n <thead>\n <tr>\n <th>Before</th>\n <th>After</th>\n </tr>\n </thead>\n <tbody>\n {lines.map((line, idx) => (\n <tr key={idx}>\n <td\n className={`audit-trail-diff-cell audit-trail-diff-before-${\n line.beforeKind || 'blank'\n }`}\n >\n <pre>{line.before}</pre>\n </td>\n <td\n className={`audit-trail-diff-cell audit-trail-diff-after-${\n line.afterKind || 'blank'\n }`}\n >\n <pre>{line.after}</pre>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction CopyIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// formatHeaderTimestamp renders an ISO timestamp as\n// \"Month D, YYYY HH:MM:SS.mmm UTC\" - matches the upstream events UI\n// header. Always UTC so two readers in different timezones see the\n// same string when comparing notes on an event.\nfunction formatHeaderTimestamp(rfc3339: string | undefined): string {\n if (!rfc3339) return '-'\n const d = new Date(rfc3339)\n if (Number.isNaN(d.getTime())) return rfc3339\n const month = MONTHS[d.getUTCMonth()] ?? ''\n const day = d.getUTCDate()\n const year = d.getUTCFullYear()\n const hh = String(d.getUTCHours()).padStart(2, '0')\n const mm = String(d.getUTCMinutes()).padStart(2, '0')\n const ss = String(d.getUTCSeconds()).padStart(2, '0')\n const ms = String(d.getUTCMilliseconds()).padStart(3, '0')\n return `${month} ${day}, ${year} ${hh}:${mm}:${ss}.${ms} UTC`\n}\n\nconst MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n]\n\nfunction inspectTabClass(active: boolean): string {\n return active\n ? 'audit-trail-inspect-tab audit-trail-inspect-tab-active'\n : 'audit-trail-inspect-tab'\n}\n\n// JSON syntax highlighter for the Raw tab. Walks the pretty-\n// printed source, escapes HTML, and wraps tokens in <span>\n// classes the CSS colors. Punctuation (braces, commas, colons)\n// keeps the default text color.\nfunction highlightJSON(json: string): string {\n const safe = escapeHTML(json)\n return safe.replace(\n /(\"(?:\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(?:\\s*:)?|\\b(?:true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g,\n (match) => {\n let cls = 'audit-trail-json-num'\n if (match.startsWith('\"')) {\n cls = /:$/.test(match)\n ? 'audit-trail-json-key'\n : 'audit-trail-json-str'\n } else if (/true|false/.test(match)) {\n cls = 'audit-trail-json-bool'\n } else if (/null/.test(match)) {\n cls = 'audit-trail-json-null'\n }\n return `<span class=\"${cls}\">${match}</span>`\n },\n )\n}\n\nfunction escapeHTML(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n}\n\n// Metadata tab - flat key/value table. Renders each top-level\n// metadata field as one row with type hint + value. Nested\n// objects / arrays render compactly so the column doesn't blow\n// out; users still get the full picture from the Raw tab.\n\ninterface MetadataRow {\n key: string\n value: string\n type: string\n}\n\nfunction buildMetadataRows(metadata: Record<string, unknown> | undefined): MetadataRow[] {\n if (!metadata) return []\n const keys = Object.keys(metadata)\n if (keys.length === 0) return []\n keys.sort()\n return keys.map((k) => {\n const raw = metadata[k]\n return { key: k, value: renderMetadataValue(raw), type: classifyValue(raw) }\n })\n}\n\nfunction renderMetadataValue(v: unknown): string {\n if (v === null || v === undefined) return ''\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n // Objects/arrays render as compact JSON so the cell stays readable.\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nfunction classifyValue(v: unknown): string {\n if (v === null) return 'null'\n if (Array.isArray(v)) return 'array'\n if (typeof v === 'object') return 'object'\n return typeof v\n}\n\nfunction MetadataTable({ rows }: { rows: MetadataRow[] }) {\n return (\n <table className=\"audit-trail-metadata-kv-table\">\n <thead>\n <tr>\n <th className=\"audit-trail-md-col-key\">Key</th>\n <th className=\"audit-trail-md-col-type\">Type</th>\n <th className=\"audit-trail-md-col-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((r) => (\n <tr key={r.key}>\n <td className=\"audit-trail-md-col-key\">\n <code>{r.key}</code>\n </td>\n <td className=\"audit-trail-md-col-type\">\n <span className=\"audit-trail-muted\">{r.type}</span>\n </td>\n <td className=\"audit-trail-md-col-value\">\n <code>{r.value}</code>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { RELATIVE_TIME_TICK_MS } from '@everscribe/components-core'\n\n// useRelativeTimeTick returns a `now` timestamp that re-renders every\n// RELATIVE_TIME_TICK_MS so consumers of the value (the events table)\n// can recompute \"N ago\" strings without external state. Returning a\n// number rather than a Date keeps the dependency stable across renders\n// when the actual instant hasn't ticked yet.\nexport function useRelativeTimeTick(intervalMs: number = RELATIVE_TIME_TICK_MS): number {\n const [now, setNow] = useState<number>(() => Date.now())\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), intervalMs)\n return () => clearInterval(id)\n }, [intervalMs])\n return now\n}\n","import type { ReactNode } from 'react'\nimport { COLUMN_LABELS, formatTimeCell, type Event } from '@everscribe/components-core'\n\nexport interface EventRowProps {\n event: Event\n columns: string[]\n // `now` is passed in so EventTable controls the tick cadence; rows\n // stay pure renders driven by their props.\n now: number\n onClick?: (event: Event) => void\n}\n\nexport function EventRow({ event, columns, now, onClick }: EventRowProps) {\n const interactive = Boolean(onClick)\n return (\n <tr\n className=\"audit-trail-row\"\n onClick={interactive ? () => onClick!(event) : undefined}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick!(event)\n }\n }\n : undefined\n }\n >\n {columns.map((col) => (\n <td\n key={col}\n className={`audit-trail-cell audit-trail-cell-${col}`}\n data-label={COLUMN_LABELS[col] ?? col}\n >\n {renderCell(col, event, now)}\n </td>\n ))}\n </tr>\n )\n}\n\nfunction renderCell(column: string, event: Event, now: number): ReactNode {\n switch (column) {\n case 'result':\n return renderResult(event.result)\n case 'origin':\n return renderOrigin(event.origin)\n case 'change':\n case 'metadata':\n return renderPresence(getField(event, column))\n default: {\n const value = getField(event, column)\n if (value == null) return null\n if (column === 'occurred_at' && typeof value === 'string') {\n return (\n <time dateTime={value} title={value}>\n {formatTimeCell(value, now)}\n </time>\n )\n }\n if (typeof value === 'string') return value\n if (typeof value === 'object') return summarizeObject(value)\n return String(value)\n }\n }\n}\n\nfunction getField(event: Event, key: string): unknown {\n return (event as unknown as Record<string, unknown>)[key]\n}\n\n// renderResult shows the status as a small pill so the table cell\n// reads at a glance (\"ok\" / \"error\") instead of the generic\n// {N fields} fallback. The numeric code is intentionally omitted -\n// it lives in the Raw tab of the inspect modal for callers who need it.\nfunction renderResult(value: unknown): ReactNode {\n if (value == null || typeof value !== 'object') return '-'\n const obj = value as { status?: unknown }\n const status = typeof obj.status === 'string' ? obj.status : ''\n if (!status) return '-'\n return (\n <span className={`audit-trail-status audit-trail-status-${cssToken(status)}`}>{status}</span>\n )\n}\n\n// renderOrigin prefers the network-identity fields a reader actually\n// scans for (IP, hostname). Falls back to the generic object summary\n// only when none of those are present.\nfunction renderOrigin(value: unknown): ReactNode {\n if (value == null || typeof value !== 'object') return '-'\n const obj = value as Record<string, unknown>\n for (const key of ['ip', 'hostname', 'host']) {\n const v = obj[key]\n if (typeof v === 'string' && v.length > 0) return v\n }\n return summarizeObject(obj)\n}\n\n// renderPresence collapses arbitrary-shape JSON columns (change,\n// metadata) to a single \"View\" affordance when content exists, else\n// \"-\". The full payload is still reachable via the row's detail\n// panel; the cell just signals presence.\nfunction renderPresence(value: unknown): ReactNode {\n if (value == null) return '-'\n if (typeof value === 'object') {\n const keys = Object.keys(value as object)\n if (keys.length === 0) return '-'\n return <span className=\"audit-trail-cell-presence\">View</span>\n }\n if (typeof value === 'string' && value.length > 0) {\n return <span className=\"audit-trail-cell-presence\">View</span>\n }\n return '-'\n}\n\nfunction summarizeObject(value: object): string {\n const obj = value as Record<string, unknown>\n for (const key of ['name', 'email', 'id', 'type']) {\n const v = obj[key]\n if (typeof v === 'string' && v.length > 0) return v\n }\n const keys = Object.keys(obj)\n if (keys.length === 0) return '-'\n return `{${keys.length} ${keys.length === 1 ? 'field' : 'fields'}}`\n}\n\n// cssToken sanitizes a status string (\"ok\", \"ERROR\", \"needs review\")\n// into a token safe to slot into an audit-trail-status-{token} class name.\nfunction cssToken(s: string): string {\n return s.toLowerCase().replace(/[^a-z0-9_-]+/g, '-')\n}\n","import { COLUMN_LABELS, type Event } from '@everscribe/components-core'\nimport { useRelativeTimeTick } from '../hooks/useRelativeTimeTick.js'\nimport { EventRow } from './EventRow.js'\n\nexport interface EventTableProps {\n events: Event[]\n visibleColumns: string[]\n onRowClick?: (event: Event) => void\n}\n\nexport function EventTable({ events, visibleColumns, onRowClick }: EventTableProps) {\n // 30s tick re-renders the table so each row's \"N ago\" string stays\n // current. The absolute half is stable; only the text inside the\n // <time> cell changes per tick.\n const now = useRelativeTimeTick()\n return (\n <div className=\"audit-trail-table-wrap\">\n <table className=\"audit-trail-table\">\n <thead>\n <tr>\n {visibleColumns.map((col) => (\n <th key={col} scope=\"col\" className={`audit-trail-th audit-trail-th-${col}`}>\n {COLUMN_LABELS[col] ?? col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {events.map((event) => (\n <EventRow\n key={event.id}\n event={event}\n columns={visibleColumns}\n now={now}\n onClick={onRowClick}\n />\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport type { ExportFormat } from '@everscribe/components-core'\n\nexport interface ExportModalProps {\n open: boolean\n onClose: () => void\n // onDownload runs the export. The parent owns the API call and the\n // browser download trigger so the modal stays UI-only and the token\n // refresh path can live alongside the rest of useEvents.\n onDownload: (format: ExportFormat) => Promise<void>\n}\n\ntype Status = 'idle' | 'downloading' | 'error'\n\nexport function ExportModal({ open, onClose, onDownload }: ExportModalProps) {\n const [format, setFormat] = useState<ExportFormat | null>(null)\n const [status, setStatus] = useState<Status>('idle')\n const [errMsg, setErrMsg] = useState<string | null>(null)\n\n useEffect(() => {\n if (!open) {\n setFormat(null)\n setStatus('idle')\n setErrMsg(null)\n }\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && status !== 'downloading') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, status, onClose])\n\n if (!open) return null\n\n const handleDownload = async () => {\n if (!format) return\n setStatus('downloading')\n setErrMsg(null)\n try {\n await onDownload(format)\n onClose()\n } catch (err) {\n setStatus('error')\n setErrMsg(err instanceof Error ? err.message : 'Export failed.')\n }\n }\n\n const onBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.target !== e.currentTarget) return\n if (status === 'downloading') return\n onClose()\n }\n\n return (\n <div\n className=\"audit-trail-export-backdrop\"\n role=\"presentation\"\n onClick={onBackdropClick}\n >\n <div\n className=\"audit-trail-export-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"audit-trail-export-title\"\n >\n <h2 id=\"audit-trail-export-title\" className=\"audit-trail-export-title\">\n Export events\n </h2>\n <p className=\"audit-trail-export-blurb\">\n The current filters and time range are applied. Capped at 100,000 rows\n - narrow the filters or time window if you hit it.\n </p>\n\n <div className=\"audit-trail-export-options\">\n <FormatCard\n format=\"csv\"\n selected={format === 'csv'}\n onSelect={() => setFormat('csv')}\n title=\"CSV\"\n body=\"Spreadsheet-friendly. Common fields are columns; nested fields (origin, metadata, change) are JSON in single columns.\"\n />\n <FormatCard\n format=\"json\"\n selected={format === 'json'}\n onSelect={() => setFormat('json')}\n title=\"JSON\"\n body=\"Full event objects preserving nested structure. Same shape the API returns.\"\n />\n </div>\n\n {status === 'error' && errMsg && (\n <div className=\"audit-trail-export-error\" role=\"alert\">\n {errMsg}\n </div>\n )}\n\n <div className=\"audit-trail-export-actions\">\n <button\n type=\"button\"\n className=\"audit-trail-button\"\n onClick={handleDownload}\n disabled={!format || status === 'downloading'}\n >\n {status === 'downloading' ? 'Downloading…' : 'Download'}\n </button>\n <button\n type=\"button\"\n className=\"audit-trail-button audit-trail-button-secondary\"\n onClick={onClose}\n disabled={status === 'downloading'}\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n )\n}\n\ninterface FormatCardProps {\n format: ExportFormat\n selected: boolean\n onSelect: () => void\n title: string\n body: string\n}\n\nfunction FormatCard({ format, selected, onSelect, title, body }: FormatCardProps) {\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n className={\n selected\n ? 'audit-trail-export-card audit-trail-export-card-selected'\n : 'audit-trail-export-card'\n }\n onClick={onSelect}\n data-format={format}\n >\n <span className=\"audit-trail-export-card-title\">{title}</span>\n <span className=\"audit-trail-export-card-body\">{body}</span>\n </button>\n )\n}\n","export interface FiltersToggleProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n activeCount: number\n}\n\nexport function FiltersToggle({ open, onOpenChange, activeCount }: FiltersToggleProps) {\n return (\n <button\n type=\"button\"\n className=\"audit-trail-filter-toggle\"\n aria-expanded={open}\n onClick={() => onOpenChange(!open)}\n >\n Search\n {activeCount > 0 && (\n <span className=\"audit-trail-filter-toggle-badge\">{activeCount}</span>\n )}\n <span className=\"audit-trail-filter-toggle-caret\" aria-hidden=\"true\">\n {open ? '▴' : '▾'}\n </span>\n </button>\n )\n}\n","// LiveIndicator renders the green \"● Live\" badge in the toolbar when\n// the events table is actively polling for updates. Hidden whenever\n// polling is disabled - either because pollInterval was set to 0 or\n// because a closed-upper-bound time filter is in effect.\nexport interface LiveIndicatorProps {\n active: boolean\n}\n\nexport function LiveIndicator({ active }: LiveIndicatorProps) {\n if (!active) return null\n return (\n <span className=\"audit-trail-live\" aria-label=\"Live updates\" title=\"Live updates\">\n <span className=\"audit-trail-live-dot\" aria-hidden=\"true\" />\n <span>Live</span>\n </span>\n )\n}\n","import { useMemo } from 'react'\nimport { parseClaims, type EmbedClaims } from '@everscribe/components-core'\n\nexport function useClaims(token: string | null | undefined): EmbedClaims | null {\n return useMemo(() => parseClaims(token), [token])\n}\n","'use client'\n\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport {\n createDistinctValuesStore,\n EMPTY_DISTINCT_VALUES,\n type DistinctValues,\n type DistinctValuesStore,\n} from '@everscribe/components-core'\n\nexport type { DistinctValues } from '@everscribe/components-core'\n\nexport interface UseDistinctValuesOptions {\n apiBase: string\n token: string | null\n tokenEndpoint?: string\n onTokenExpired?: () => Promise<string>\n}\n\nconst NOOP_UNSUB = () => {}\n\n// useDistinctValues fetches the three filter-dropdown source lists once\n// per token. Failures are swallowed silently - an empty dropdown is\n// strictly better UX than blocking the table render on a 500.\nexport function useDistinctValues(opts: UseDistinctValuesOptions): DistinctValues {\n const [store, setStore] = useState<DistinctValuesStore | null>(null)\n\n useEffect(() => {\n if (!opts.token) {\n setStore(null)\n return\n }\n const s = createDistinctValuesStore({\n apiBase: opts.apiBase,\n token: opts.token,\n tokenEndpoint: opts.tokenEndpoint,\n onTokenExpired: opts.onTokenExpired,\n })\n setStore(s)\n return () => {\n s.dispose()\n }\n }, [opts.token, opts.apiBase])\n\n const subscribe = useMemo(\n () => (listener: () => void) => store?.subscribe(listener) ?? NOOP_UNSUB,\n [store],\n )\n const getSnapshot = () => store?.getSnapshot() ?? EMPTY_DISTINCT_VALUES\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n","'use client'\n\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react'\nimport {\n createEventsStore,\n type EmbedError,\n type Event,\n type EventsStatus,\n type EventsStore,\n type EventsStoreState,\n} from '@everscribe/components-core'\n\nexport type { EventsStatus } from '@everscribe/components-core'\n\nexport interface UseEventsOptions {\n apiBase: string\n token: string | null\n pageSize: number\n pollInterval: number\n tokenEndpoint?: string\n onTokenExpired?: () => Promise<string>\n onError?: (err: Error) => void\n // Server-side filters. Changes to any of these reset pagination and\n // refetch from scratch. When `before` is set the polling loop is\n // disabled - a closed time window can't get newer events.\n since?: string\n before?: string\n action?: string\n actor?: string\n actorType?: string\n tenantId?: string\n targetType?: string\n targetId?: string\n resultStatus?: string\n originIP?: string\n q?: string\n}\n\nexport interface UseEventsResult {\n events: Event[]\n hasMore: boolean\n status: EventsStatus\n error: EmbedError | null\n loadMore: () => void\n refresh: () => void\n}\n\nconst EMPTY_STATE: EventsStoreState = {\n events: [],\n nextCursor: null,\n status: 'loading',\n error: null,\n}\n\nconst NOOP_UNSUB = () => {}\n\nexport function useEvents(opts: UseEventsOptions): UseEventsResult {\n const [store, setStore] = useState<EventsStore | null>(null)\n\n useEffect(() => {\n if (!opts.token) {\n setStore(null)\n return\n }\n const s = createEventsStore({\n apiBase: opts.apiBase,\n token: opts.token,\n pageSize: opts.pageSize,\n pollInterval: opts.pollInterval,\n tokenEndpoint: opts.tokenEndpoint,\n onTokenExpired: opts.onTokenExpired,\n onError: opts.onError,\n since: opts.since,\n before: opts.before,\n action: opts.action,\n actor: opts.actor,\n actorType: opts.actorType,\n tenantId: opts.tenantId,\n targetType: opts.targetType,\n targetId: opts.targetId,\n resultStatus: opts.resultStatus,\n originIP: opts.originIP,\n q: opts.q,\n })\n setStore(s)\n return () => {\n s.dispose()\n }\n }, [\n opts.token,\n opts.apiBase,\n opts.pageSize,\n opts.pollInterval,\n opts.since,\n opts.before,\n opts.action,\n opts.actor,\n opts.actorType,\n opts.tenantId,\n opts.targetType,\n opts.targetId,\n opts.resultStatus,\n opts.originIP,\n opts.q,\n ])\n\n const subscribe = useMemo(\n () => (listener: () => void) => store?.subscribe(listener) ?? NOOP_UNSUB,\n [store],\n )\n const getSnapshot = () => store?.getSnapshot() ?? EMPTY_STATE\n const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n return {\n events: state.events,\n hasMore: state.nextCursor !== null,\n status: state.status,\n error: state.error,\n loadMore: () => store?.loadMore(),\n refresh: () => store?.refresh(),\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport { ActiveFilterChips } from './components/ActiveFilterChips.js'\nimport { ColumnPicker } from './components/ColumnPicker.js'\nimport { EventDetail } from './components/EventDetail.js'\nimport { EventTable } from './components/EventTable.js'\nimport { ExportModal } from './components/ExportModal.js'\nimport {\n FiltersPanel,\n countActiveColumnFilters,\n parseQClauses,\n} from './components/FiltersPanel.js'\nimport type { FilterValues, TimeRangePreset } from './components/FiltersPanel.js'\nimport { FiltersToggle } from './components/FiltersToggle.js'\nimport { LiveIndicator } from './components/LiveIndicator.js'\nimport { useClaims } from './hooks/useClaims.js'\nimport { useDistinctValues } from './hooks/useDistinctValues.js'\nimport { useEvents } from './hooks/useEvents.js'\nimport {\n ALL_COLUMNS,\n EmbedError,\n exportEvents,\n fetchTokenViaOpts,\n type Event,\n type ExportFormat,\n} from '@everscribe/components-core'\n\nconst DEFAULT_API_BASE = 'https://api.everscribe.io/v1/embed'\nconst DEFAULT_PAGE_SIZE = 25\nconst DEFAULT_POLL_INTERVAL_MS = 5000\nconst DEFAULT_VISIBLE_COLUMNS = [\n 'occurred_at',\n 'action',\n 'actor',\n 'target',\n 'tenant_id',\n 'result',\n]\n\nexport type DefaultTimeRange = '24h' | '7d' | '30d' | 'all'\n\nexport interface AuditTrailProps {\n /**\n * Embed JWT. If omitted, the component fetches an initial token via\n * `tokenEndpoint` or `onTokenExpired` on mount.\n */\n token?: string\n apiBase?: string\n pageSize?: number\n pollInterval?: number\n theme?: 'light' | 'dark'\n className?: string\n style?: CSSProperties\n /**\n * URL on your backend that returns `{ token }` JSON. Used both for the\n * initial fetch (when `token` is omitted) and for refresh on 401. Sent\n * with `credentials: 'include'`.\n */\n tokenEndpoint?: string\n /**\n * Custom token-fetch callback. Takes precedence over `tokenEndpoint`\n * for both initial load and refresh.\n */\n onTokenExpired?: () => Promise<string>\n onError?: (err: Error) => void\n /**\n * Initial time-range preset for the filters panel. Defaults to\n * `'all'` to preserve historical embed behavior (no time bound).\n * Set to `'7d'` to match the upstream events UI default.\n */\n defaultTimeRange?: DefaultTimeRange\n}\n\ntype BootstrapState =\n | { phase: 'idle' }\n | { phase: 'loading' }\n | { phase: 'ready'; token: string }\n | { phase: 'error'; reason: 'config' | 'fetch' }\n\nexport function AuditTrail(props: AuditTrailProps) {\n const [bootstrap, setBootstrap] = useState<BootstrapState>(() =>\n props.token ? { phase: 'ready', token: props.token } : { phase: 'idle' },\n )\n const [retryCount, setRetryCount] = useState(0)\n\n // If a token prop is supplied (or changes), use it as the source of truth.\n useEffect(() => {\n if (props.token) setBootstrap({ phase: 'ready', token: props.token })\n }, [props.token])\n\n // Bootstrap fetch when no token prop is supplied. Read endpoint /\n // callback via a ref so inline handlers (`onTokenExpired={() => ...}`)\n // don't retrigger the effect on every render.\n const propsRef = useRef(props)\n propsRef.current = props\n\n useEffect(() => {\n if (propsRef.current.token) return\n if (!propsRef.current.tokenEndpoint && !propsRef.current.onTokenExpired) {\n setBootstrap({ phase: 'error', reason: 'config' })\n return\n }\n setBootstrap({ phase: 'loading' })\n let cancelled = false\n void (async () => {\n const t = await fetchTokenViaOpts({\n tokenEndpoint: propsRef.current.tokenEndpoint,\n onTokenExpired: propsRef.current.onTokenExpired,\n })\n if (cancelled) return\n if (!t) {\n setBootstrap({ phase: 'error', reason: 'fetch' })\n return\n }\n setBootstrap({ phase: 'ready', token: t })\n })()\n return () => {\n cancelled = true\n }\n }, [props.token, retryCount])\n\n const activeToken = bootstrap.phase === 'ready' ? bootstrap.token : null\n const claims = useClaims(activeToken)\n const [selected, setSelected] = useState<Event | null>(null)\n const [filters, setFilters] = useState<FilterValues>(() => ({\n range: (props.defaultTimeRange ?? 'all') as TimeRangePreset,\n }))\n const [filtersOpen, setFiltersOpen] = useState(false)\n const [exportOpen, setExportOpen] = useState(false)\n\n const pollIntervalMs = props.pollInterval ?? DEFAULT_POLL_INTERVAL_MS\n\n const availableColumns = useMemo(() => {\n if (claims?.columns && claims.columns.length > 0) return claims.columns\n return ALL_COLUMNS\n }, [claims])\n\n const [visibleSet, setVisibleSet] = useState<Set<string>>(() => {\n if (claims?.columns && claims.columns.length > 0) return new Set(claims.columns)\n return new Set(DEFAULT_VISIBLE_COLUMNS)\n })\n\n // Tracks which (sub, tenant_id) pair we've already restored from\n // localStorage. Keyed so a token swap to a different project re-runs\n // restore; persist effects skip writes until restore has matched.\n const restoredKeyRef = useRef<string | null>(null)\n const claimsKey = claims?.sub ? `${claims.sub}:${claims.tenant_id || '_'}` : null\n\n // Restore visibleSet + filters from localStorage when claims first\n // resolve for a given project/tenant. Runs once per unique claims\n // pair; subsequent token refreshes (same sub) don't re-restore.\n useEffect(() => {\n if (!claimsKey) return\n if (restoredKeyRef.current === claimsKey) return\n restoredKeyRef.current = claimsKey\n try {\n const raw = globalThis.localStorage?.getItem(`audit-trail:cols:${claimsKey}`)\n if (raw) {\n const hidden = JSON.parse(raw)\n if (Array.isArray(hidden)) {\n setVisibleSet((prev) => {\n const next = new Set(prev)\n for (const c of hidden) {\n if (typeof c === 'string') next.delete(c)\n }\n return next\n })\n }\n }\n } catch {\n // Malformed JSON / storage error - keep defaults.\n }\n try {\n const raw = globalThis.localStorage?.getItem(`audit-trail:filters:${claimsKey}`)\n if (raw) {\n const parsed = JSON.parse(raw)\n if (parsed && typeof parsed === 'object') {\n const range = parsed.range\n if (\n range === '24h' ||\n range === '7d' ||\n range === '30d' ||\n range === 'custom' ||\n range === 'all'\n ) {\n setFilters(parsed as FilterValues)\n }\n }\n }\n } catch {\n // Malformed JSON / storage error - keep defaults.\n }\n }, [claimsKey])\n\n // Persist visibleSet whenever it changes - but only after restore has\n // run for this claims pair, so we don't clobber saved state with the\n // initial defaults during the brief window between mount and restore.\n useEffect(() => {\n if (!claimsKey || restoredKeyRef.current !== claimsKey) return\n try {\n const hidden = availableColumns.filter((c) => !visibleSet.has(c))\n globalThis.localStorage?.setItem(`audit-trail:cols:${claimsKey}`, JSON.stringify(hidden))\n } catch {\n // Private mode, quota - silently ignore.\n }\n }, [visibleSet, claimsKey, availableColumns])\n\n // Persist filters whenever they change - same guard as columns.\n useEffect(() => {\n if (!claimsKey || restoredKeyRef.current !== claimsKey) return\n try {\n globalThis.localStorage?.setItem(`audit-trail:filters:${claimsKey}`, JSON.stringify(filters))\n } catch {\n // Private mode, quota - silently ignore.\n }\n }, [filters, claimsKey])\n\n const visibleColumns = useMemo(\n () => availableColumns.filter((c) => visibleSet.has(c)),\n [availableColumns, visibleSet],\n )\n\n const toggleColumn = (col: string) => {\n setVisibleSet((prev) => {\n const next = new Set(prev)\n if (next.has(col)) next.delete(col)\n else next.add(col)\n return next\n })\n }\n\n const { since: filterSince, before: filterBefore } = useMemo(\n () => resolveTimeBounds(filters),\n [filters],\n )\n\n // Live indicator tracks whether useEvents will actually poll -\n // mirrors the disable condition inside useEvents (pollInterval > 0\n // and no closed upper time bound).\n const livePollActive = pollIntervalMs > 0 && !filterBefore\n\n const distinct = useDistinctValues({\n apiBase: props.apiBase ?? DEFAULT_API_BASE,\n token: activeToken,\n tokenEndpoint: props.tokenEndpoint,\n onTokenExpired: props.onTokenExpired,\n })\n\n const { events, hasMore, status, error, loadMore, refresh } = useEvents({\n apiBase: props.apiBase ?? DEFAULT_API_BASE,\n token: activeToken,\n pageSize: props.pageSize ?? DEFAULT_PAGE_SIZE,\n pollInterval: pollIntervalMs,\n tokenEndpoint: props.tokenEndpoint,\n onTokenExpired: props.onTokenExpired,\n onError: props.onError,\n since: filterSince,\n before: filterBefore,\n action: filters.action,\n actor: filters.actor,\n actorType: filters.actorType,\n tenantId: filters.tenantId,\n targetType: filters.targetType,\n targetId: filters.targetId,\n resultStatus: filters.resultStatus,\n originIP: filters.originIP,\n q: filters.q,\n })\n\n const handleExportDownload = useCallback(\n async (format: ExportFormat) => {\n if (!activeToken) throw new Error('Not authenticated.')\n const apiBase = props.apiBase ?? DEFAULT_API_BASE\n const params = {\n format,\n since: filterSince,\n before: filterBefore,\n action: filters.action,\n actor: filters.actor,\n actorType: filters.actorType,\n tenantId: filters.tenantId,\n targetType: filters.targetType,\n targetId: filters.targetId,\n resultStatus: filters.resultStatus,\n originIP: filters.originIP,\n q: filters.q,\n }\n const run = (token: string) =>\n exportEvents({ apiBase, token, params })\n let result\n try {\n result = await run(activeToken)\n } catch (err) {\n if (err instanceof EmbedError && err.kind === 'unauthorized') {\n const refreshed = await fetchTokenViaOpts({\n tokenEndpoint: props.tokenEndpoint,\n onTokenExpired: props.onTokenExpired,\n })\n if (!refreshed) throw new Error('Authentication failed.')\n result = await run(refreshed)\n } else if (err instanceof EmbedError) {\n throw new Error(exportErrorMessage(err))\n } else {\n throw err\n }\n }\n triggerBrowserDownload(result.blob, result.filename)\n },\n [\n activeToken,\n props.apiBase,\n props.tokenEndpoint,\n props.onTokenExpired,\n filterSince,\n filterBefore,\n filters.action,\n filters.actor,\n filters.actorType,\n filters.tenantId,\n filters.targetType,\n filters.targetId,\n filters.resultStatus,\n filters.originIP,\n filters.q,\n ],\n )\n\n const rootClassName = [\n 'audit-trail-root',\n `audit-trail-theme-${props.theme ?? 'light'}`,\n props.className,\n ]\n .filter(Boolean)\n .join(' ')\n\n if (bootstrap.phase === 'error' && bootstrap.reason === 'config') {\n return (\n <div className={rootClassName} style={props.style}>\n <div className=\"audit-trail-state audit-trail-state-error\">\n Configure <code>token</code>, <code>tokenEndpoint</code>, or{' '}\n <code>onTokenExpired</code>.\n </div>\n </div>\n )\n }\n\n if (bootstrap.phase === 'error' && bootstrap.reason === 'fetch') {\n return (\n <div className={rootClassName} style={props.style}>\n <div className=\"audit-trail-state audit-trail-state-error\">\n <span>Couldn’t fetch token.</span>\n <button\n type=\"button\"\n className=\"audit-trail-button\"\n onClick={() => setRetryCount((c) => c + 1)}\n >\n Retry\n </button>\n </div>\n </div>\n )\n }\n\n if (bootstrap.phase !== 'ready') {\n return (\n <div className={rootClassName} style={props.style}>\n <div className=\"audit-trail-state audit-trail-state-loading\">Loading…</div>\n </div>\n )\n }\n\n if (claims === null) {\n return (\n <div className={rootClassName} style={props.style}>\n <div className=\"audit-trail-state audit-trail-state-error\">Invalid token.</div>\n </div>\n )\n }\n\n return (\n <div className={rootClassName} style={props.style}>\n <div className=\"audit-trail-toolbar\">\n <LiveIndicator active={livePollActive} />\n <span className=\"audit-trail-toolbar-spacer\" />\n <FiltersToggle\n open={filtersOpen}\n onOpenChange={setFiltersOpen}\n activeCount={\n countActiveColumnFilters(filters) +\n (filters.q ? parseQClauses(filters.q).length : 0)\n }\n />\n <button\n type=\"button\"\n className=\"audit-trail-button\"\n onClick={() => setExportOpen(true)}\n >\n Export\n </button>\n <ColumnPicker\n available={availableColumns}\n visible={visibleSet}\n onToggle={toggleColumn}\n />\n </div>\n\n <ActiveFilterChips value={filters} onChange={setFilters} />\n\n {filtersOpen && (\n <FiltersPanel\n value={filters}\n onChange={setFilters}\n distinct={distinct}\n claims={claims}\n apiBase={props.apiBase ?? DEFAULT_API_BASE}\n token={activeToken}\n tokenEndpoint={props.tokenEndpoint}\n onTokenExpired={props.onTokenExpired}\n onApplied={() => setFiltersOpen(false)}\n />\n )}\n\n {status === 'loading' && events.length === 0 && (\n <div className=\"audit-trail-state audit-trail-state-loading\">Loading…</div>\n )}\n {status === 'expired' && (\n <div className=\"audit-trail-state audit-trail-state-error\">Session expired.</div>\n )}\n {status === 'error' && error && (\n <div className=\"audit-trail-state audit-trail-state-error\">\n <span>{errorMessage(error)}</span>\n <button type=\"button\" className=\"audit-trail-button\" onClick={refresh}>\n Retry\n </button>\n </div>\n )}\n {status === 'ok' && events.length === 0 && (\n <div className=\"audit-trail-state audit-trail-state-empty\">No events match.</div>\n )}\n {events.length > 0 && visibleColumns.length === 0 && (\n <div className=\"audit-trail-state audit-trail-state-empty\">No columns selected.</div>\n )}\n {events.length > 0 && visibleColumns.length > 0 && (\n <>\n <EventTable\n events={events}\n visibleColumns={visibleColumns}\n onRowClick={setSelected}\n />\n {hasMore && (\n <button type=\"button\" className=\"audit-trail-button audit-trail-load-more\" onClick={loadMore}>\n Load more\n </button>\n )}\n </>\n )}\n\n <ExportModal\n open={exportOpen}\n onClose={() => setExportOpen(false)}\n onDownload={handleExportDownload}\n />\n\n {selected && (\n <EventDetail\n key={selected.id}\n event={selected}\n onClose={() => setSelected(null)}\n theme={props.theme ?? 'light'}\n />\n )}\n </div>\n )\n}\n\n// resolveTimeBounds turns a FilterValues time-range preset into the\n// concrete (since, before) ISO strings the API expects. 'all' yields\n// no bounds; presets emit a relative `since` from now; 'custom' uses\n// the user's own datetime-local strings (which we promote to ISO).\nfunction resolveTimeBounds(filters: FilterValues): {\n since?: string\n before?: string\n} {\n switch (filters.range) {\n case '24h':\n return { since: relativeIso(24 * 60 * 60 * 1000) }\n case '7d':\n return { since: relativeIso(7 * 24 * 60 * 60 * 1000) }\n case '30d':\n return { since: relativeIso(30 * 24 * 60 * 60 * 1000) }\n case 'custom':\n return {\n since: localToIso(filters.since),\n before: localToIso(filters.before),\n }\n case 'all':\n default:\n return {}\n }\n}\n\nfunction relativeIso(ms: number): string {\n return new Date(Date.now() - ms).toISOString()\n}\n\nfunction localToIso(value: string | undefined): string | undefined {\n if (!value) return undefined\n // datetime-local emits \"YYYY-MM-DDTHH:mm\" without a timezone; the\n // browser interprets that as local time when passed to Date(), and\n // toISOString normalizes to UTC. Round-trip is lossless for the\n // minute-precision the input supports.\n const d = new Date(value)\n if (Number.isNaN(d.getTime())) return undefined\n return d.toISOString()\n}\n\n// triggerBrowserDownload synthesizes an anchor click against a blob\n// URL so the browser saves the export with the server-suggested name.\n// Object URL is revoked on the next tick so the click has time to\n// land in slow / older browsers.\nfunction triggerBrowserDownload(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n\nfunction exportErrorMessage(err: EmbedError): string {\n switch (err.kind) {\n case 'rate_limited':\n return 'Too many requests. Try again in a moment.'\n case 'bad_request':\n return err.message || 'Bad request.'\n case 'server':\n return 'Server error. Please try again.'\n case 'network':\n return 'Network error. Check your connection.'\n case 'not_found':\n return 'Not found.'\n case 'unauthorized':\n return 'Authentication failed.'\n }\n}\n\nfunction errorMessage(err: EmbedError): string {\n switch (err.kind) {\n case 'unauthorized':\n return 'Authentication failed.'\n case 'not_found':\n return 'Not found.'\n case 'rate_limited':\n return 'Too many requests. Please slow down.'\n case 'bad_request':\n return err.message || 'Bad request.'\n case 'server':\n return 'Server error. Please try again.'\n case 'network':\n return 'Network error. Check your connection.'\n }\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
export { EmbedClaims, Event } from '@everscribe/components-core';
|
|
4
|
+
|
|
5
|
+
type DefaultTimeRange = '24h' | '7d' | '30d' | 'all';
|
|
6
|
+
interface AuditTrailProps {
|
|
7
|
+
/**
|
|
8
|
+
* Embed JWT. If omitted, the component fetches an initial token via
|
|
9
|
+
* `tokenEndpoint` or `onTokenExpired` on mount.
|
|
10
|
+
*/
|
|
11
|
+
token?: string;
|
|
12
|
+
apiBase?: string;
|
|
13
|
+
pageSize?: number;
|
|
14
|
+
pollInterval?: number;
|
|
15
|
+
theme?: 'light' | 'dark';
|
|
16
|
+
className?: string;
|
|
17
|
+
style?: CSSProperties;
|
|
18
|
+
/**
|
|
19
|
+
* URL on your backend that returns `{ token }` JSON. Used both for the
|
|
20
|
+
* initial fetch (when `token` is omitted) and for refresh on 401. Sent
|
|
21
|
+
* with `credentials: 'include'`.
|
|
22
|
+
*/
|
|
23
|
+
tokenEndpoint?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Custom token-fetch callback. Takes precedence over `tokenEndpoint`
|
|
26
|
+
* for both initial load and refresh.
|
|
27
|
+
*/
|
|
28
|
+
onTokenExpired?: () => Promise<string>;
|
|
29
|
+
onError?: (err: Error) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Initial time-range preset for the filters panel. Defaults to
|
|
32
|
+
* `'all'` to preserve historical embed behavior (no time bound).
|
|
33
|
+
* Set to `'7d'` to match the upstream events UI default.
|
|
34
|
+
*/
|
|
35
|
+
defaultTimeRange?: DefaultTimeRange;
|
|
36
|
+
}
|
|
37
|
+
declare function AuditTrail(props: AuditTrailProps): react_jsx_runtime.JSX.Element;
|
|
38
|
+
|
|
39
|
+
export { AuditTrail, type AuditTrailProps };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
export { EmbedClaims, Event } from '@everscribe/components-core';
|
|
4
|
+
|
|
5
|
+
type DefaultTimeRange = '24h' | '7d' | '30d' | 'all';
|
|
6
|
+
interface AuditTrailProps {
|
|
7
|
+
/**
|
|
8
|
+
* Embed JWT. If omitted, the component fetches an initial token via
|
|
9
|
+
* `tokenEndpoint` or `onTokenExpired` on mount.
|
|
10
|
+
*/
|
|
11
|
+
token?: string;
|
|
12
|
+
apiBase?: string;
|
|
13
|
+
pageSize?: number;
|
|
14
|
+
pollInterval?: number;
|
|
15
|
+
theme?: 'light' | 'dark';
|
|
16
|
+
className?: string;
|
|
17
|
+
style?: CSSProperties;
|
|
18
|
+
/**
|
|
19
|
+
* URL on your backend that returns `{ token }` JSON. Used both for the
|
|
20
|
+
* initial fetch (when `token` is omitted) and for refresh on 401. Sent
|
|
21
|
+
* with `credentials: 'include'`.
|
|
22
|
+
*/
|
|
23
|
+
tokenEndpoint?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Custom token-fetch callback. Takes precedence over `tokenEndpoint`
|
|
26
|
+
* for both initial load and refresh.
|
|
27
|
+
*/
|
|
28
|
+
onTokenExpired?: () => Promise<string>;
|
|
29
|
+
onError?: (err: Error) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Initial time-range preset for the filters panel. Defaults to
|
|
32
|
+
* `'all'` to preserve historical embed behavior (no time bound).
|
|
33
|
+
* Set to `'7d'` to match the upstream events UI default.
|
|
34
|
+
*/
|
|
35
|
+
defaultTimeRange?: DefaultTimeRange;
|
|
36
|
+
}
|
|
37
|
+
declare function AuditTrail(props: AuditTrailProps): react_jsx_runtime.JSX.Element;
|
|
38
|
+
|
|
39
|
+
export { AuditTrail, type AuditTrailProps };
|