@ai-matrx/vault 0.1.1 → 0.1.2
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/CHANGELOG.md +11 -0
- package/dist/index.cjs +28 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +39 -19
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/io/csv-import-worker-client.ts","../src/io/bitwarden-json-worker-client.ts","../src/io/onepux-worker-client.ts","../src/io/proton-pass-worker-client.ts","../src/io/keepass-xml-worker-client.ts","../src/VaultApp.tsx","../src/notice.tsx","../src/activity/HistoryPanel.tsx","../src/auth/IdentityGate.tsx","../src/glyphs.tsx","../src/auth/identity.ts","../src/FieldRows.tsx","../src/hooks.ts","../src/ui.tsx","../src/activity/logic.ts","../src/model.ts","../src/definitions.ts","../src/activity/port.ts","../src/activity/ActivityPanel.tsx","../src/authenticator/AuthenticatorView.tsx","../src/authenticator/AddOtpPanel.tsx","../src/authenticator/CodeParts.tsx","../src/authenticator/otpauth.ts","../src/authenticator/live-code.ts","../src/authenticator/Setup.tsx","../src/authenticator/qr.ts","../src/authenticator/TotpRows.tsx","../src/authenticator/port.ts","../src/fields/SettingsPanels.tsx","../src/fields/rules.ts","../src/generator/PasswordGenerator.tsx","../src/generator/generate.ts","../src/io/csv-import-limits.ts","../src/io/BackupPanel.tsx","../src/io/backup-file.ts","../src/io/lines.tsx","../src/io/ExportPanel.tsx","../src/io/ImportPanel.tsx","../src/io/csv-import.ts","../src/io/loopback.ts","../src/io/import-run.ts","../src/io/structured-import.ts","../src/io/import-review.ts","../src/io/import-source.ts","../src/io/bounded-zip.ts","../src/io/dashlane-csv-archive.ts","../src/io/csv-import-file.ts","../src/io/structured-import-source-registry.ts","../src/io/structured-import-worker-protocol.ts","../src/io/parse-source.ts","../src/ItemList.tsx","../src/ItemIcon.tsx","../src/ItemPane.tsx","../src/activity/FilesSection.tsx","../src/fields/RecoveryCodesRow.tsx","../src/draft-keep.ts","../src/extension/page-logic.ts","../src/extension/UseOnSiteButton.tsx","../src/sharing/SharePanel.tsx","../src/sharing/logic.ts","../src/sharing/parts.tsx","../src/sharing/MovePanel.tsx","../src/lists/TrashView.tsx","../src/lists/logic.ts","../src/lists/RestorePanel.tsx","../src/NewItemFlow.tsx","../src/sharing/SecureLinkPanel.tsx","../src/sharing/secure-link-logic.ts","../src/devices/DevicesPanel.tsx","../src/devices/logic.ts","../src/native/NativeImportPanel.tsx","../src/native/logic.ts","../src/native/use-native-import.ts","../src/extension/PageView.tsx","../src/extension/CaptureCard.tsx","../src/extension/FillSetupCard.tsx","../src/extension/PageGenerator.tsx","../src/Sidebar.tsx","../src/api-port.ts","../src/activity/api.ts","../src/authenticator/api.ts","../src/fields/api.ts","../src/io/api.ts","../src/lists/api.ts","../src/sharing/api.ts","../src/devices/api.ts","../src/native/api.ts","../src/knobs.ts"],"sourcesContent":["/** Kept out of csv-import.ts so the non-worker import path stays testable. */\nexport function createCsvImportWorker(): Worker {\n return new Worker(new URL(\"./csv-import.worker.ts\", import.meta.url), { type: \"module\" });\n}\n","/** Kept out of the dialog module so the non-worker import path stays testable. */\nexport function createBitwardenJsonWorker(): Worker {\n return new Worker(new URL(\"./bitwarden-json.worker.ts\", import.meta.url), { type: \"module\" });\n}\n\nexport function cancelBitwardenJsonWorker(\n worker: Worker,\n requestId: string,\n): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","export function createOnePuxWorker(): Worker {\n return new Worker(new URL(\"./onepux.worker.ts\", import.meta.url), { type: \"module\" });\n}\n\n/** Abort an in-flight parse before the caller terminates or replaces its worker. */\nexport function cancelOnePuxWorker(worker: Worker, requestId: string): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","export function createProtonPassWorker(): Worker {\n return new Worker(new URL(\"./proton-pass.worker.ts\", import.meta.url), { type: \"module\" });\n}\nexport function cancelProtonPassWorker(\n worker: Worker,\n requestId: string,\n): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","/** Kept out of the dialog module so the worker boundary remains independently testable. */\nexport function createKeePassXmlWorker(): Worker {\n return new Worker(new URL(\"./keepass-xml.worker.ts\", import.meta.url), { type: \"module\" });\n}\n\nexport function cancelKeePassXmlWorker(\n worker: Worker,\n requestId: string,\n): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { Button, SearchField, Select } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { ActivityPanel, HistoryPanel } from \"./activity/HistoryPanel\";\nimport type { ItemPanelProps } from \"./area-props\";\nimport { IdentityGate } from \"./auth/IdentityGate\";\nimport { AuthenticatorView } from \"./authenticator/AuthenticatorView\";\nimport { inferFromUrl } from \"./definitions\";\nimport { FieldSettingsPanel, ItemSettingsPanel } from \"./fields/SettingsPanels\";\nimport { GeneratorLimitsProvider, type GeneratorLimitsSource } from \"./generator/PasswordGenerator\";\nimport { importLimitsFrom, type ImportLimits } from \"./io/csv-import-limits\";\nimport type { VaultKnobs } from \"./knobs\";\nimport { Empty, Panel } from \"./ui\";\nimport { useElementWidth } from \"./hooks\";\nimport { BackupPanel, ExportPanel, ImportPanel } from \"./io/IoPanels\";\nimport { ItemList } from \"./ItemList\";\nimport { ItemPane } from \"./ItemPane\";\nimport { TrashView } from \"./lists/TrashView\";\nimport { DEFAULT_LOCATION, inVault, inView, matchesQuery, sortItems, type VaultItem, type VaultLocation } from \"./model\";\nimport { NewItemFlow } from \"./NewItemFlow\";\nimport { NoticeProvider, useNotify, type Notify } from \"./notice\";\nimport type { VaultHostCapabilities, VaultPort, VaultSnapshot } from \"./port\";\nimport { MovePanel, SharePanel } from \"./sharing/SharePanel\";\nimport { SecureLinkPanel } from \"./sharing/SecureLinkPanel\";\nimport { ApprovePanel, approvalFromParams, DevicesPanel } from \"./devices/DevicesPanel\";\nimport { NativeImportPanel } from \"./native/NativeImportPanel\";\nimport { PageView } from \"./extension/PageView\";\nimport { buildViews, itemCategory, Sidebar, vaultChoices, VaultSelect, viewLabel, viewOptions } from \"./Sidebar\";\nimport { ExportGlyph, ImportGlyph, MoreGlyph, SafeGlyph, ShieldGlyph } from \"./glyphs\";\n\nexport type VaultLayout = \"auto\" | \"full\" | \"split\" | \"stack\";\n\nexport interface VaultAppProps {\n port: VaultPort;\n host?: VaultHostCapabilities;\n /** `auto` picks by the room the workspace is given: a side panel stacks, a window shows three panes. */\n layout?: VaultLayout;\n /**\n * Everything the address carries: vault, view, search, sort, the open item, edit/new, the new-item\n * address, the open panel. Controlled when given (the host writes it to the URL); the workspace\n * keeps its own copy when not. `push` = a step the Back button should undo; `replace` = typing.\n */\n location?: VaultLocation;\n onLocationChange?: (next: VaultLocation, how: \"push\" | \"replace\") => void;\n /** The host's own toasts; without it the vault shows its own short notices. */\n notify?: Notify;\n}\n\nconst FULL_AT = 960;\nconst SPLIT_AT = 640;\nconst NO_HOST: VaultHostCapabilities = {};\n\nconst ITEM_PANELS: Record<string, (p: ItemPanelProps) => ReactNode> = {\n share: SharePanel,\n move: MovePanel,\n history: HistoryPanel,\n activity: ActivityPanel,\n settings: ItemSettingsPanel,\n field: FieldSettingsPanel,\n send: SecureLinkPanel,\n};\n\nconst generatorLimitsFrom = (knobs: VaultKnobs | undefined): GeneratorLimitsSource | undefined =>\n knobs\n ? async () => {\n const r = await knobs();\n return { maxPasswordLength: r[\"vault.generator.max_password_length\"], maxPassphraseWords: r[\"vault.generator.max_passphrase_words\"] };\n }\n : undefined;\n\n/** Import opens once the organization's limits are read; until they are set it says so. */\nfunction ImportWithLimits(props: Omit<React.ComponentProps<typeof ImportPanel>, \"limits\"> & { knobs: VaultKnobs | undefined }) {\n const { knobs, ...rest } = props;\n const [state, setState] = useState<{ limits: ImportLimits } | { error: string } | null>(null);\n useEffect(() => {\n if (!knobs) return setState({ error: \"Import is not set up for this organization yet.\" });\n knobs().then(\n (r) => {\n try {\n setState({ limits: importLimitsFrom(r) });\n } catch (e) {\n setState({ error: e instanceof Error ? e.message : \"Import is not set up yet.\" });\n }\n },\n (e: unknown) => setState({ error: e instanceof Error ? e.message : \"The import settings could not be read.\" }),\n );\n }, [knobs]);\n if (state && \"limits\" in state) return <ImportPanel {...rest} limits={state.limits} />;\n return (\n <Panel title=\"Import\" onClose={rest.onClose}>\n <Empty>{state ? state.error : \"Reading this organization’s import settings…\"}</Empty>\n </Panel>\n );\n}\n\n/** THE VAULT WORKSPACE: one component for the web app, the extension side panel and the desktop app. */\nexport function VaultApp(props: VaultAppProps) {\n return (\n <div className=\"relative h-full min-h-0 w-full\">\n <NoticeProvider notify={props.notify}>\n <IdentityGate identity={props.host?.identity}>\n <GeneratorLimitsProvider resolve={generatorLimitsFrom(props.host?.knobs)}>\n <Workspace {...props} />\n </GeneratorLimitsProvider>\n </IdentityGate>\n </NoticeProvider>\n </div>\n );\n}\n\nfunction Workspace({ port, host = NO_HOST, layout = \"auto\", location, onLocationChange }: VaultAppProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const width = useElementWidth(rootRef);\n const mode: Exclude<VaultLayout, \"auto\"> = layout !== \"auto\" ? layout : width >= FULL_AT ? \"full\" : width >= SPLIT_AT ? \"split\" : \"stack\";\n const notify = useNotify();\n\n const [snap, setSnap] = useState<VaultSnapshot | null>(null);\n const [items, setItems] = useState<readonly VaultItem[]>([]);\n const [deleted, setDeleted] = useState<readonly VaultItem[]>([]);\n const [favorites, setFavorites] = useState<ReadonlySet<string> | null>(null);\n const [recents, setRecents] = useState<readonly string[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [inner, setInner] = useState<VaultLocation>(DEFAULT_LOCATION);\n const loc = location ?? inner;\n const dirty = useRef(false);\n const [notice, setNotice] = useState<string | null>(null);\n\n const move = useCallback(\n (next: VaultLocation, how: \"push\" | \"replace\") => {\n if (!location) setInner(next);\n onLocationChange?.(next, how);\n },\n [location, onLocationChange],\n );\n\n const go = useCallback(\n (patch: Partial<VaultLocation>, how: \"push\" | \"replace\" = \"push\") => {\n const leaving = patch.itemId !== undefined || patch.mode !== undefined || patch.vault !== undefined || patch.view !== undefined;\n const next = { ...loc, ...patch };\n const proceed = () => {\n if (leaving) {\n dirty.current = false;\n if (patch.itemId !== undefined) setNotice(null);\n }\n move(next, how);\n };\n if (leaving && dirty.current) {\n void confirm({ title: \"Discard your changes?\", description: \"What you changed in this item is not saved.\", confirmLabel: \"Discard\", cancelLabel: \"Keep editing\", variant: \"destructive\" }).then((ok) => ok && proceed());\n return;\n }\n proceed();\n },\n [loc, move],\n );\n\n // The host object may be rebuilt on every render; reading its knobs through a ref keeps `load` stable.\n const knobsRef = useRef(host.knobs);\n knobsRef.current = host.knobs;\n const load = useCallback(() => {\n setError(null);\n port\n .load()\n .then((s) => {\n setSnap(s);\n setItems(s.items);\n setDeleted(s.deleted);\n // The server's vault list leaves deleted items out; Trash comes from the platform's trash.\n port.lists.trash?.list().then(\n (rows) => setDeleted([...s.deleted, ...rows.filter((r) => !s.deleted.some((d) => d.id === r.id))]),\n () => undefined,\n );\n })\n .catch((e: unknown) => setError(e instanceof Error ? e.message : \"The vault could not be loaded.\"));\n port.lists.favorites?.list().then((ids) => setFavorites(new Set(ids)), () => undefined);\n // Read the organization's settings now, so the generator opens without \"Reading limits…\".\n knobsRef.current?.().catch(() => undefined);\n port.lists.recents?.list().then(setRecents, () => undefined);\n }, [port]);\n useEffect(load, [load]);\n\n // Opening an item records it (Recently opened), when the host gives that door.\n useEffect(() => {\n if (!loc.itemId || !port.lists.recents) return;\n const id = loc.itemId;\n port.lists.recents.record(id).then(() => setRecents((r) => [id, ...(r ?? []).filter((x) => x !== id)]), () => undefined);\n }, [loc.itemId, port]);\n\n const orgs = snap?.organizations ?? [];\n const definitions = snap?.definitions ?? [];\n const inThisVault = useMemo(() => items.filter((i) => inVault(i, loc.vault)), [items, loc.vault]);\n const views = useMemo(() => buildViews(inThisVault, definitions, favorites, recents), [inThisVault, definitions, favorites, recents]);\n const visible = useMemo(() => {\n const filtered = inThisVault.filter((i) => {\n if (!matchesQuery(i, loc.q)) return false;\n if (loc.view === \"favorites\") return favorites?.has(i.id) ?? false;\n if (loc.view === \"recent\") return recents?.includes(i.id) ?? false;\n if (loc.view.startsWith(\"category:\")) return itemCategory(i, definitions) === loc.view.slice(9);\n return inView(i, loc.view);\n });\n if (loc.view === \"recent\" && recents) return [...filtered].sort((a, b) => recents.indexOf(a.id) - recents.indexOf(b.id));\n return sortItems(filtered, loc.sort);\n }, [inThisVault, loc.view, loc.q, loc.sort, favorites, recents, definitions]);\n const choices = useMemo(() => vaultChoices(items, orgs, loc.vault), [items, orgs, loc.vault]);\n const matchingIds = useMemo(() => (host.page ? new Set(host.page.matchingItemIds) : undefined), [host.page]);\n const selected = loc.itemId ? (items.find((i) => i.id === loc.itemId) ?? null) : null;\n\n const replaceItem = (next: VaultItem) => setItems((cur) => (cur.some((i) => i.id === next.id) ? cur.map((i) => (i.id === next.id ? next : i)) : [...cur, next]));\n const toggleFavorite = (id: string) => {\n const fav = port.lists.favorites;\n if (!fav) return;\n const on = !(favorites?.has(id) ?? false);\n setFavorites((cur) => {\n const n = new Set(cur ?? []);\n if (on) n.add(id);\n else n.delete(id);\n return n;\n });\n fav.set(id, on).catch((e: unknown) => {\n setFavorites((cur) => {\n const n = new Set(cur ?? []);\n if (on) n.delete(id);\n else n.add(id);\n return n;\n });\n notify(e instanceof Error ? e.message : \"Favorites could not be saved.\", \"error\");\n });\n };\n\n if (error) {\n return (\n <div ref={rootRef} role=\"alert\" className=\"flex h-full flex-col items-center justify-center gap-3 bg-background p-6 text-center text-sm\">\n <SafeGlyph className=\"size-8 text-muted-foreground\" />\n <div className=\"font-medium\">The vault couldn’t open</div>\n <div className=\"max-w-xs text-muted-foreground\">{plainLoadError(error)}</div>\n <button type=\"button\" className=\"text-primary hover:underline\" onClick={load}>Try again</button>\n </div>\n );\n }\n if (!snap) {\n return (\n <div ref={rootRef} className=\"flex h-full bg-background\" aria-busy=\"true\" aria-label=\"Opening the vault\">\n <div className=\"flex w-full max-w-sm flex-col gap-1 p-3\">\n {[0, 1, 2, 3, 4, 5, 6].map((n) => (\n <div key={n} className=\"flex h-12 items-center gap-3 px-2\">\n <div className=\"size-8 animate-pulse rounded-lg bg-muted\" />\n <div className=\"flex flex-1 flex-col gap-1.5\">\n <div className=\"h-3 w-2/3 animate-pulse rounded bg-muted\" />\n <div className=\"h-2.5 w-1/3 animate-pulse rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n const hasFavorites = port.lists.favorites !== undefined;\n const title = loc.vault === \"all\" && loc.view === \"all\" ? \"All items\" : viewLabel(loc.view, views);\n const compactHeader =\n mode === \"full\" ? undefined : (\n <div className=\"grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] gap-2\">\n <VaultSelect value={loc.vault} choices={choices} onChange={(vault) => go({ vault, itemId: null, panel: null })} />\n <Select value={loc.view} onValueChange={(view) => go({ view, itemId: null, panel: null })} options={viewOptions(views, inThisVault.length, deleted.length, hasFavorites, port.lists.recents !== undefined, host.page !== undefined)} aria-label=\"Show\" />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"Vault actions\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => go({ panel: \"import\" })}><ImportGlyph className=\"size-4\" />Import</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ panel: \"export\" })}><ExportGlyph className=\"size-4\" />Export</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ panel: \"backup\" })}><SafeGlyph className=\"size-4\" />Backup</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ panel: \"devices\" })}><ShieldGlyph className=\"size-4\" />Browsers that fill</DropdownMenuItem>\n {host.nativeImport ? <DropdownMenuItem onSelect={() => go({ panel: \"import-passkeys\" })}><ImportGlyph className=\"size-4\" />Import passkeys</DropdownMenuItem> : null}\n {host.nativeProvider && host.nativeProvider.status !== \"unavailable\" ? <DropdownMenuItem onSelect={host.nativeProvider.openSetup}><ShieldGlyph className=\"size-4\" />System AutoFill</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n\n // Trash and One-time passwords search the same `q` as the list, with their own box to change or clear it.\n const viewHeader = (\n <div className=\"flex flex-col gap-2\">\n {compactHeader}\n <SearchField value={loc.q} onChange={(e) => go({ q: e.target.value }, \"replace\")} placeholder={`Search ${viewLabel(loc.view, views)}`} aria-label={`Search ${viewLabel(loc.view, views)}`} />\n </div>\n );\n const viewProps = { port, host, items: inThisVault, deleted, definitions, query: loc.q, onOpen: (id: string) => go({ view: \"all\", itemId: id, mode: \"view\", panel: null }), onChanged: load, header: viewHeader };\n // The extension's first screen: this tab's site and its logins (`view=page`).\n const pageView =\n loc.view === \"page\" && host.page && !loc.q ? (\n <PageView\n port={port}\n page={host.page}\n fill={host.fill}\n capture={host.capture}\n fillSetup={host.fillSetup}\n newPasswordFields={host.newPasswordFields}\n items={inThisVault}\n definitions={definitions}\n onOpen={(id) => go({ itemId: id, mode: \"view\", panel: null })}\n onNewForPage={(url) => go({ mode: \"new\", kind: null, url, itemId: null, panel: null })}\n onBrowse={() => go({ view: \"all\", itemId: null })}\n onChanged={load}\n {...(compactHeader ? { header: compactHeader } : {})}\n />\n ) : null;\n const specialView = pageView ?? (loc.view === \"authenticator\" ? <AuthenticatorView {...viewProps} /> : loc.view === \"trash\" ? <TrashView {...viewProps} /> : null);\n\n const list = specialView ?? (\n <ItemList\n title={title}\n items={visible}\n definitions={definitions}\n port={port}\n selectedId={loc.itemId}\n onSelect={(id) => go({ itemId: id, mode: \"view\", kind: null, panel: null })}\n query={loc.q}\n onQuery={(q) => go({ q }, \"replace\")}\n sort={loc.sort}\n onSort={(sort) => go({ sort }, \"replace\")}\n onNew={() => go({ itemId: null, mode: \"new\", kind: null, panel: null })}\n {...(matchingIds ? { matchingIds } : {})}\n {...(compactHeader ? { header: compactHeader } : {})}\n />\n );\n\n const showingDetail = loc.mode === \"new\" || loc.itemId !== null;\n const back = mode === \"stack\" ? () => go({ itemId: null, mode: \"view\", kind: null, panel: null }) : null;\n const guess = inferFromUrl(loc.url, definitions);\n const kindDefinition = loc.kind ? (definitions.find((d) => d.key === loc.kind) ?? null) : null;\n const ownerDefault = loc.vault !== \"all\" && loc.vault !== \"mine\" && loc.vault !== \"shared\" ? loc.vault : null;\n const onPanel = (panel: string | null) => go({ panel }, \"push\");\n\n let detail: ReactNode;\n if (loc.mode === \"new\" && !kindDefinition) {\n detail = <NewItemFlow definitions={definitions} url={loc.url} onUrl={(url) => go({ url }, \"replace\")} onChoose={(kind, _name, url) => go({ kind, url }, \"push\")} onCancel={() => go({ mode: \"view\", kind: null, url: \"\", itemId: null })} />;\n } else if (loc.mode === \"new\" && kindDefinition) {\n detail = (\n <ItemPane\n key={`new-${kindDefinition.key}`}\n port={port}\n item={null}\n definition={kindDefinition}\n mode=\"new\"\n host={host}\n organizations={orgs}\n defaultOwner={ownerDefault}\n seed={{ name: guess?.name ?? \"\", url: guess?.url ?? loc.url.trim() }}\n onBack={() => go({ kind: null })}\n onMode={() => undefined}\n onSaved={(item, _wasNew, n) => {\n replaceItem(item);\n dirty.current = false;\n move({ ...loc, itemId: item.id, mode: \"view\", kind: null, url: \"\", panel: null }, \"replace\");\n setNotice(n);\n notify(\"Saved\");\n }}\n onDeleted={() => undefined}\n onDirty={(d) => {\n dirty.current = d;\n }}\n onCancelNew={() => go({ mode: \"view\", kind: null, url: \"\", itemId: null })}\n onPanel={() => undefined}\n onChanged={() => undefined}\n />\n );\n } else if (selected) {\n detail = (\n <ItemPane\n key={selected.id}\n port={port}\n item={selected}\n definition={definitions.find((d) => d.key === selected.definitionKey) ?? null}\n mode={loc.mode === \"edit\" ? \"edit\" : \"view\"}\n host={host}\n organizations={orgs}\n defaultOwner={null}\n onBack={back}\n onMode={(m) => go({ mode: m, panel: null })}\n notice={notice}\n onSaved={(item, _wasNew, n) => {\n replaceItem(item);\n dirty.current = false;\n move({ ...loc, mode: \"view\" }, \"replace\");\n setNotice(n);\n notify(\"Saved\");\n }}\n onDeleted={(id) => {\n setItems((cur) => cur.filter((i) => i.id !== id));\n dirty.current = false;\n move({ ...loc, itemId: null, mode: \"view\", panel: null }, \"push\");\n notify(\"Moved to Trash\");\n load();\n }}\n onDirty={(d) => {\n dirty.current = d;\n }}\n onCancelNew={() => undefined}\n onPanel={onPanel}\n onChanged={(next) => {\n if (next) replaceItem(next);\n else if (next === null) setItems((cur) => cur.filter((i) => i.id !== selected.id));\n else load();\n }}\n refreshKey={loc.panel ?? \"none\"}\n favorite={hasFavorites ? { on: favorites?.has(selected.id) ?? false, toggle: () => toggleFavorite(selected.id) } : undefined}\n />\n );\n } else if (loc.itemId) {\n detail = <Blank>This item is not in your vault, or you cannot see it.</Blank>;\n } else {\n detail = <Blank>{visible.length === 0 ? \"\" : \"Select an item\"}</Blank>;\n }\n\n // The open panel: one about the open item, or one about the whole vault.\n const [panelName, panelArg] = (loc.panel ?? \"\").split(/:(.*)/s) as [string, string | undefined];\n const closePanel = () => go({ panel: null }, \"push\");\n const vaultPanelProps = { port, host, items, definitions, organizations: orgs, onClose: closePanel, onChanged: load };\n let panel: ReactNode = null;\n if (panelName === \"import\") panel = <ImportWithLimits {...vaultPanelProps} knobs={host.knobs} />;\n else if (panelName === \"devices\") panel = <DevicesPanel {...vaultPanelProps} />;\n else if (panelName === \"approve\" && panelArg) panel = <ApprovePanel {...vaultPanelProps} {...approvalFromParams(panelArg, new URLSearchParams(globalThis.location?.search ?? \"\"))} />;\n else if (panelName === \"import-passkeys\" && host.nativeImport) panel = <NativeImportPanel {...vaultPanelProps} bridge={host.nativeImport} readLimits={port.native.limits} activeOrganizationId={orgs[0]?.id ?? null} />;\n else if (panelName === \"export\") panel = <ExportPanel {...vaultPanelProps} />;\n else if (panelName === \"backup\") panel = <BackupPanel {...vaultPanelProps} />;\n else if (panelName && selected && ITEM_PANELS[panelName]) {\n const P = ITEM_PANELS[panelName];\n panel = (\n <P\n item={selected}\n port={port}\n host={host}\n definition={definitions.find((d) => d.key === selected.definitionKey) ?? null}\n organizations={orgs}\n arg={panelArg ?? null}\n onClose={closePanel}\n onPanel={onPanel}\n onChanged={(next) => {\n if (next) replaceItem(next);\n else if (next === null) {\n setItems((cur) => cur.filter((i) => i.id !== selected.id));\n move({ ...loc, itemId: null, panel: null }, \"replace\");\n } else load();\n }}\n />\n );\n }\n\n const grid = mode === \"full\" ? \"grid-cols-[15rem_21rem_minmax(0,1fr)]\" : mode === \"split\" ? \"grid-cols-[19rem_minmax(0,1fr)]\" : \"grid-cols-1\";\n const detailHere = specialView ? false : true;\n return (\n <div ref={rootRef} className=\"flex h-full min-h-0 w-full flex-col bg-background text-foreground\">\n {snap.unavailable.length > 0 ? (\n <div role=\"status\" className=\"flex items-center gap-3 border-b border-border bg-muted px-4 py-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate text-warning\">Couldn’t load {snap.unavailable.join(\", \")}. Showing the rest.</span>\n <button type=\"button\" className=\"shrink-0 text-primary hover:underline\" onClick={load}>Try again</button>\n </div>\n ) : null}\n <div className={`grid min-h-0 w-full flex-1 ${grid} overflow-hidden`}>\n {mode === \"full\" ? (\n <Sidebar\n vault={loc.vault}\n choices={choices}\n onVault={(vault) => go({ vault, itemId: null, panel: null })}\n view={loc.view}\n allCount={inThisVault.length}\n deletedCount={deleted.length}\n views={views}\n hasFavorites={hasFavorites}\n hasRecents={port.lists.recents !== undefined}\n onView={(view) => go({ view, itemId: null, mode: \"view\", panel: null })}\n onPanel={(p) => go({ panel: p })}\n nativeProvider={host.nativeProvider}\n hasNativeImport={host.nativeImport !== undefined}\n hasPage={host.page !== undefined}\n />\n ) : null}\n {mode === \"stack\" && showingDetail ? null : <div className={specialView && mode !== \"stack\" ? \"col-span-2 min-h-0\" : \"min-h-0\"}>{list}</div>}\n {detailHere ? (mode === \"stack\" ? (showingDetail ? detail : null) : detail) : null}\n {panel}\n </div>\n </div>\n );\n}\n\n/** A browser's raw network words (\"Load failed\", \"Failed to fetch\") said the way people read them. */\nfunction plainLoadError(message: string): string {\n return /load failed|failed to fetch|network|timed? ?out/i.test(message) ? \"The connection dropped. Check you’re online, then try again.\" : message;\n}\n\nfunction Blank({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 bg-background text-sm text-muted-foreground\">\n <SafeGlyph className=\"size-10 text-disabled-foreground\" />\n {children}\n </div>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\n\nexport type NoticeKind = \"success\" | \"error\" | \"info\";\nexport type Notify = (message: string, kind?: NoticeKind) => void;\n\nconst Ctx = createContext<Notify>(() => undefined);\n\n/** Say something short to the person (\"Password copied\"). Hosts with their own toasts pass `notify`. */\nexport function useNotify(): Notify {\n return useContext(Ctx);\n}\n\n/** THE copy for every vault screen: writes, then says so (or says why not). */\nexport function useCopy(): (text: string, label: string) => Promise<boolean> {\n const notify = useNotify();\n return useCallback((text, label) => copyText(text, { successMessage: `${label} copied`, failureMessage: `${label} could not be copied`, notify: (m, k) => notify(m, k === \"error\" ? \"error\" : \"success\") }), [notify]);\n}\n\n/**\n * The vault's own notice line, so feedback exists in every host (an extension side panel has no app\n * toaster). A host that has one passes `notify` and this draws nothing.\n */\nexport function NoticeProvider({ notify, children }: { notify?: Notify | undefined; children: ReactNode }) {\n const [shown, setShown] = useState<{ message: string; kind: NoticeKind; n: number } | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const local = useCallback<Notify>((message, kind = \"success\") => {\n if (timer.current) clearTimeout(timer.current);\n setShown((s) => ({ message, kind, n: (s?.n ?? 0) + 1 }));\n timer.current = setTimeout(() => setShown(null), kind === \"error\" ? 5000 : 2200);\n }, []);\n useEffect(() => () => void (timer.current && clearTimeout(timer.current)), []);\n return (\n <Ctx.Provider value={notify ?? local}>\n {children}\n {!notify ? (\n <div aria-live=\"polite\" className=\"pointer-events-none absolute inset-x-0 bottom-4 z-30 flex justify-center px-4\">\n {shown ? (\n <div key={shown.n} role=\"status\" className={cn(\"rounded-full border border-border bg-popover px-4 py-2 text-sm shadow-lg\", shown.kind === \"error\" ? \"text-destructive\" : \"text-foreground\")}>\n {shown.message}\n </div>\n ) : null}\n </div>\n ) : null}\n </Ctx.Provider>\n );\n}\n","import { useCopy } from \"../notice\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button, Badge } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { SecretText } from \"../FieldRows\";\nimport { CopyGlyph, EyeGlyph, EyeOffGlyph, RestoreGlyph } from \"../glyphs\";\nimport { useTransientSecret } from \"../hooks\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { Empty, Panel, Row, Section, formatDate } from \"../ui\";\nimport { canRestore, historyByField, historyEligible, mergePages } from \"./logic\";\nimport { HistoryChangedError, type HistoryEntry, type HistoryPage } from \"./port\";\n\nexport { ActivityPanel } from \"./ActivityPanel\";\n\nconst MASK = \"••••••••••••\";\nconst messageOf = (e: unknown, fallback: string): string | null => (wasCancelled(e) ? null : e instanceof Error ? e.message : fallback);\n\n/**\n * Earlier values of the item's secret fields, newest first, one row each: when, the masked value,\n * show, copy and restore. `arg` = a field id to put first. Values live only in the row that asked,\n * for 20 seconds.\n */\nexport function HistoryPanel({ item, port, arg, onClose, onChanged }: ItemPanelProps) {\n const eligible = historyEligible(item);\n const [page, setPage] = useState<HistoryPage | null>(null);\n const [loading, setLoading] = useState(eligible);\n const [more, setMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n // Every request carries the generation it started in; an answer from an older one is dropped.\n const generation = useRef(0);\n\n const load = useCallback(async () => {\n const g = ++generation.current;\n setLoading(true);\n setError(null);\n try {\n const next = await port.activity.history(item);\n if (generation.current === g) setPage(next);\n } catch (e) {\n if (generation.current === g) setError(messageOf(e, \"History could not be read.\"));\n } finally {\n if (generation.current === g) setLoading(false);\n }\n }, [port, item]);\n\n useEffect(() => {\n if (!eligible) return;\n void load();\n return () => {\n generation.current += 1;\n };\n }, [eligible, load]);\n\n async function loadMore() {\n if (!page?.nextBefore) return;\n const g = ++generation.current;\n setMore(true);\n try {\n const next = await port.activity.history(item, page.nextBefore);\n if (generation.current === g) setPage((cur) => (cur ? mergePages(cur, next) : next));\n } catch (e) {\n if (generation.current === g) setError(messageOf(e, \"Earlier changes could not be read.\"));\n } finally {\n if (generation.current === g) setMore(false);\n }\n }\n\n async function restored(next: VaultItem) {\n setNotice(\"Restored. It is the current value now.\");\n onChanged(next);\n await load();\n }\n\n async function conflicted() {\n setNotice(null);\n setError(\"History changed. Review it again.\");\n await load();\n }\n\n const groups = page ? historyByField(item, page.entries, arg) : [];\n\n return (\n <Panel\n title=\"Password history\"\n onClose={onClose}\n footer={page?.nextBefore ? <Button variant=\"outline\" disabled={more} onClick={() => void loadMore()}>{more ? \"Loading…\" : \"Show earlier\"}</Button> : undefined}\n >\n {!eligible ? (\n <Empty>History is kept only for your own items.</Empty>\n ) : loading && !page ? (\n <Empty>Reading history…</Empty>\n ) : (\n <>\n {error ? <p role=\"alert\" className=\"px-1 text-sm text-destructive\">{error}</p> : null}\n {notice ? <p role=\"status\" className=\"px-1 text-sm text-success\">{notice}</p> : null}\n {page && groups.length === 0 ? <Empty>No earlier values yet.</Empty> : null}\n {page\n ? groups.map((g) => (\n <Section key={g.fieldId} title={g.label}>\n {g.entries.map((entry) => (\n <HistoryRow key={`${item.id}:${entry.fieldId}:${entry.revision}`} item={item} port={port} page={page} entry={entry} label={g.label} onRestored={restored} onConflict={conflicted} onError={setError} />\n ))}\n </Section>\n ))\n : null}\n {page && (page.captureStartedAt || page.incomplete) ? (\n <div className=\"flex flex-wrap gap-x-3 gap-y-1 px-1 text-xs\">\n {page.captureStartedAt ? <span className=\"text-muted-foreground\">Kept since {formatDate(page.captureStartedAt, true)}</span> : null}\n {page.incomplete ? <span className=\"text-warning\">Some changes could not be read</span> : null}\n </div>\n ) : null}\n </>\n )}\n </Panel>\n );\n}\n\nfunction HistoryRow({ item, port, page, entry, label, onRestored, onConflict, onError }: {\n item: VaultItem;\n port: VaultPort;\n page: HistoryPage;\n entry: HistoryEntry;\n label: string;\n onRestored: (next: VaultItem) => Promise<void>;\n onConflict: () => Promise<void>;\n onError: (message: string | null) => void;\n}) {\n const confirmed = useConfirmed();\n const secret = useTransientSecret();\n const copyValue = useCopy();\n const [busy, setBusy] = useState(false);\n const when = formatDate(entry.recordedAt, true);\n\n async function read(): Promise<string | null> {\n if (secret.value !== null) return secret.value;\n setBusy(true);\n onError(null);\n try {\n return await confirmed(() => port.activity.revealHistory(item, entry.fieldId, entry.revision));\n } catch (e) {\n onError(messageOf(e, \"That value could not be read.\"));\n return null;\n } finally {\n setBusy(false);\n }\n }\n\n async function toggle() {\n if (secret.value !== null) return secret.clear();\n const v = await read();\n if (v !== null) secret.show(v);\n }\n\n async function copy() {\n const v = await read();\n if (v !== null) await copyValue(v, `Earlier ${label.toLowerCase()}`);\n }\n\n async function restore() {\n const yes = await confirm({\n title: `Restore this ${label.toLowerCase()}?`,\n description: `The value from ${when} replaces the current one. Anything using the current one needs this one.`,\n confirmLabel: \"Restore\",\n });\n if (!yes) return;\n secret.clear();\n setBusy(true);\n onError(null);\n try {\n const next = await confirmed(() => port.activity.restoreHistory(item, entry.fieldId, entry.revision, page.historyRevision));\n await onRestored(next);\n } catch (e) {\n if (e instanceof HistoryChangedError) await onConflict();\n else onError(messageOf(e, \"That value could not be restored.\"));\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <Row\n label={when}\n actions={\n entry.available ? (\n <>\n <Button variant=\"quiet\" icon={secret.value !== null ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={secret.value !== null ? \"Hide\" : \"Show\"} disabled={busy} onClick={() => void toggle()} />\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label=\"Copy\" disabled={busy} onClick={() => void copy()} />\n {canRestore(page, entry) ? <Button variant=\"quiet\" icon={<RestoreGlyph />} aria-label=\"Restore\" disabled={busy} onClick={() => void restore()} /> : null}\n </>\n ) : null\n }\n >\n {!entry.available ? (\n <Badge>Not kept</Badge>\n ) : secret.value !== null ? (\n <SecretText value={secret.value} multiline={false} />\n ) : (\n <span className=\"block truncate tracking-widest text-muted-foreground\">{MASK}</span>\n )}\n </Row>\n );\n}\n","import { createContext, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"@ai-matrx/design-system\";\nimport { Button, Field } from \"@ai-matrx/design-system/controls\";\nimport { ShieldGlyph } from \"../glyphs\";\nimport { needsRecentSignIn, type IdentityAccount, type VaultIdentity } from \"./identity\";\n\n/**\n * Wrap any call that shows, copies or exports a secret. When the server answers \"sign in again\",\n * the person confirms it is them (Google, password, or an emailed code) and the call runs again —\n * they never see a dead \"Authentication required\" in the row.\n */\nexport type Confirmed = <T>(run: () => Promise<T>) => Promise<T>;\n\nconst CANCELLED = \"Not confirmed.\";\nconst Ctx = createContext<Confirmed>((run) => run());\n\nexport function useConfirmed(): Confirmed {\n return useContext(Ctx);\n}\n\nconst PROVIDER_LABEL: Record<string, string> = { google: \"Google\", github: \"GitHub\", azure: \"Microsoft\", apple: \"Apple\", linkedin_oidc: \"LinkedIn\", slack_oidc: \"Slack\" };\nconst providerLabel = (p: string) => PROVIDER_LABEL[p] ?? p.charAt(0).toUpperCase() + p.slice(1);\n\nexport function IdentityGate({ identity, children }: { identity: VaultIdentity | undefined; children: ReactNode }) {\n const [asking, setAsking] = useState(false);\n const waiters = useRef<{ resolve: () => void; reject: (e: Error) => void }[]>([]);\n\n const confirmed: Confirmed = async (run) => {\n try {\n return await run();\n } catch (e) {\n if (!identity || !needsRecentSignIn(e)) throw e;\n await new Promise<void>((resolve, reject) => {\n waiters.current.push({ resolve, reject });\n setAsking(true);\n });\n return run();\n }\n };\n\n const settle = (ok: boolean) => {\n const w = waiters.current;\n waiters.current = [];\n setAsking(false);\n for (const x of w) (ok ? x.resolve() : x.reject(new Error(CANCELLED)));\n };\n\n return (\n <Ctx.Provider value={confirmed}>\n {children}\n {identity ? <ConfirmIdentityDialog open={asking} identity={identity} onDone={() => settle(true)} onCancel={() => settle(false)} /> : null}\n </Ctx.Provider>\n );\n}\n\n/** True for the rejection a cancelled confirmation produces (callers stay quiet about it). */\nexport const wasCancelled = (e: unknown) => e instanceof Error && e.message === CANCELLED;\n\nfunction ConfirmIdentityDialog({ open, identity, onDone, onCancel }: { open: boolean; identity: VaultIdentity; onDone: () => void; onCancel: () => void }) {\n const [account, setAccount] = useState<IdentityAccount | null>(null);\n const [password, setPassword] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [codeSent, setCodeSent] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) return;\n setPassword(\"\");\n setCode(\"\");\n setCodeSent(false);\n setError(null);\n identity.account().then(setAccount, (e: unknown) => setError(e instanceof Error ? e.message : \"Your account could not be read.\"));\n }, [open, identity]);\n\n const attempt = async (step: () => Promise<void>, done = true) => {\n setBusy(true);\n setError(null);\n try {\n await step();\n if (done) onDone();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"That did not work. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(o) => (o ? undefined : onCancel())}>\n <DialogContent size=\"sm\">\n <DialogHeader>\n <div className=\"flex items-center gap-2\">\n <ShieldGlyph className=\"size-5 text-primary\" />\n <DialogTitle>Confirm it’s you</DialogTitle>\n </div>\n <DialogDescription>This needs a recent sign-in{account?.email ? ` to ${account.email}` : \"\"}.</DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-3\">\n {identity.dev ? (\n <Button variant=\"primary\" disabled={busy} onClick={() => void attempt(() => identity.dev?.() ?? Promise.resolve())}>\n Sign in again (dev)\n </Button>\n ) : null}\n {account?.providers.map((p) => (\n <Button key={p} variant={identity.dev ? \"outline\" : \"primary\"} disabled={busy} onClick={() => void attempt(() => identity.withProvider(p), false)}>\n Continue with {providerLabel(p)}\n </Button>\n ))}\n {account?.hasPassword ? (\n <form className=\"flex gap-2\" onSubmit={(e) => { e.preventDefault(); if (password) void attempt(() => identity.withPassword(password)); }}>\n <Field className=\"min-w-0 flex-1\" type=\"password\" autoComplete=\"current-password\" placeholder=\"Your password\" aria-label=\"Your password\" value={password} onChange={(e) => setPassword(e.target.value)} />\n <Button variant=\"outline\" type=\"submit\" disabled={busy || !password}>Confirm</Button>\n </form>\n ) : null}\n {account?.email ? (\n codeSent ? (\n <form className=\"flex gap-2\" onSubmit={(e) => { e.preventDefault(); if (code.trim()) void attempt(() => identity.withEmailCode(code)); }}>\n <Field className=\"min-w-0 flex-1\" inputMode=\"numeric\" autoComplete=\"one-time-code\" placeholder=\"Code from your email\" aria-label=\"Code from your email\" value={code} onChange={(e) => setCode(e.target.value)} autoFocus />\n <Button variant=\"outline\" type=\"submit\" disabled={busy || !code.trim()}>Confirm</Button>\n </form>\n ) : (\n <Button variant=\"quiet\" disabled={busy} onClick={() => void attempt(async () => { await identity.sendEmailCode(); setCodeSent(true); }, false)}>\n Email me a code instead\n </Button>\n )\n ) : null}\n {error ? <p role=\"alert\" className=\"text-sm text-destructive\">{error}</p> : null}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/** The vault's own inline glyphs (C19: no icon-library dependency). 24-grid, 2px stroke, inherit colour. */\nexport type Glyph = (props: { className?: string }) => ReactNode;\n\nfunction glyph(paths: ReactNode): Glyph {\n return function VaultGlyph({ className }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {paths}\n </svg>\n );\n };\n}\n\nexport const KeyGlyph = glyph(<><circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" /><path d=\"m21 2-9.6 9.6M15.5 7.5l3 3\" /></>);\nexport const GlobeGlyph = glyph(<><circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" /></>);\nexport const NoteGlyph = glyph(<><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4M16 13H8M16 17H8\" /></>);\nexport const CardGlyph = glyph(<><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" /><path d=\"M2 10h20\" /></>);\nexport const PersonGlyph = glyph(<><circle cx=\"12\" cy=\"8\" r=\"5\" /><path d=\"M20 21a8 8 0 0 0-16 0\" /></>);\nexport const DatabaseGlyph = glyph(<><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" /><path d=\"M3 5v14a9 3 0 0 0 18 0V5M3 12a9 3 0 0 0 18 0\" /></>);\nexport const ServerGlyph = glyph(<><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" /><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" /><path d=\"M6 6h.01M6 18h.01\" /></>);\nexport const TerminalGlyph = glyph(<><path d=\"m4 17 6-6-6-6M12 19h8\" /></>);\nexport const FileGlyph = glyph(<><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4\" /></>);\nexport const CodeGlyph = glyph(<><path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" /></>);\nexport const StarGlyph = glyph(<path d=\"M12 2l3.1 6.3 6.9 1-5 4.9 1.2 6.8L12 17.8 5.8 21l1.2-6.8-5-4.9 6.9-1z\" />);\nexport const PlusGlyph = glyph(<path d=\"M12 5v14M5 12h14\" />);\nexport const CopyGlyph = glyph(<><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" /><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" /></>);\nexport const EyeGlyph = glyph(<><path d=\"M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>);\nexport const EyeOffGlyph = glyph(<><path d=\"M10.7 5.1A10.4 10.4 0 0 1 12 5c6.4 0 10 7 10 7a17 17 0 0 1-2.2 3.2M6.6 6.6A17 17 0 0 0 2 12s3.6 7 10 7a9.7 9.7 0 0 0 5.4-1.6M2 2l20 20\" /></>);\nexport const LockGlyph = glyph(<><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" /><path d=\"M7 11V7a5 5 0 0 1 10 0v4\" /></>);\nexport const ExternalGlyph = glyph(<><path d=\"M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" /></>);\nexport const TrashGlyph = glyph(<><path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" /></>);\nexport const ArchiveGlyph = glyph(<><rect x=\"2\" y=\"3\" width=\"20\" height=\"5\" rx=\"1\" /><path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8M10 12h4\" /></>);\nexport const TagGlyph = glyph(<><path d=\"M12.6 2.6A2 2 0 0 0 11.2 2H4a2 2 0 0 0-2 2v7.2a2 2 0 0 0 .6 1.4l8.7 8.7a2.4 2.4 0 0 0 3.4 0l6.6-6.6a2.4 2.4 0 0 0 0-3.4z\" /><circle cx=\"7.5\" cy=\"7.5\" r=\".5\" /></>);\nexport const ShieldGlyph = glyph(<><path d=\"M20 13c0 5-3.5 7.5-7.7 8.9a1 1 0 0 1-.6 0C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.2-2.7a1.2 1.2 0 0 1 1.6 0C14.5 3.8 17 5 19 5a1 1 0 0 1 1 1z\" /></>);\nexport const BuildingGlyph = glyph(<><rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\" /><path d=\"M9 22v-4h6v4M8 6h.01M16 6h.01M12 6h.01M12 10h.01M12 14h.01M16 10h.01M16 14h.01M8 10h.01M8 14h.01\" /></>);\nexport const UsersGlyph = glyph(<><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" /><circle cx=\"9\" cy=\"7\" r=\"4\" /><path d=\"M22 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8\" /></>);\nexport const ChevronLeftGlyph = glyph(<path d=\"m15 18-6-6 6-6\" />);\nexport const GridGlyph = glyph(<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /></>);\nexport const PlugGlyph = glyph(<><path d=\"M12 22v-5M9 8V2M15 8V2M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8z\" /></>);\n\nconst FAMILY_GLYPHS: Record<string, Glyph> = {\n databases: DatabaseGlyph,\n server_network: ServerGlyph,\n hosting_deployment: ServerGlyph,\n source_control: CodeGlyph,\n signing_files: FileGlyph,\n identity_security: ShieldGlyph,\n cloud_infrastructure: ServerGlyph,\n};\n\n/** A type's glyph: logins are a globe, then by family, else a key. */\nexport function definitionGlyph(key: string, family: string): Glyph {\n if (key === \"username_password\" || key === \"website_login\") return GlobeGlyph;\n return FAMILY_GLYPHS[family] ?? KeyGlyph;\n}\nexport const XGlyph = glyph(<path d=\"M18 6 6 18M6 6l12 12\" />);\nexport const PencilGlyph = glyph(<><path d=\"M12 20h9\" /><path d=\"M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z\" /></>);\nexport const ClockGlyph = glyph(<><circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M12 6v6l4 2\" /></>);\n// ── core workspace glyphs ────────────────────────────────────────────────────\nexport const MoreGlyph = glyph(<><circle cx=\"12\" cy=\"12\" r=\"1\" /><circle cx=\"19\" cy=\"12\" r=\"1\" /><circle cx=\"5\" cy=\"12\" r=\"1\" /></>);\nexport const ShareGlyph = glyph(<><path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8M16 6l-4-4-4 4M12 2v13\" /></>);\nexport const HistoryGlyph = glyph(<><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" /><path d=\"M3 3v5h5M12 7v5l4 2\" /></>);\nexport const ListGlyph = glyph(<path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />);\nexport const SettingsGlyph = glyph(<><path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>);\nexport const ImportGlyph = glyph(<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3\" />);\nexport const ExportGlyph = glyph(<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12\" />);\nexport const ChevronDownGlyph = glyph(<path d=\"m6 9 6 6 6-6\" />);\nexport const ChevronRightGlyph = glyph(<path d=\"m9 18 6-6-6-6\" />);\nexport const SortGlyph = glyph(<path d=\"m3 16 4 4 4-4M7 20V4M21 8l-4-4-4 4M17 4v16\" />);\nexport const UserGlyph = glyph(<><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2\" /></>);\nexport const MoveGlyph = glyph(<path d=\"M5 9 2 12l3 3M9 5l3-3 3 3M15 19l-3 3-3-3M19 9l3 3-3 3M2 12h20M12 2v20\" />);\nexport const SafeGlyph = glyph(<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 8v1M12 15v1M8 12h1M15 12h1\" /></>);\nexport const RestoreGlyph = glyph(<><path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" /><path d=\"M3 3v5h5\" /></>);\n// ── one-time passwords ───────────────────────────────────────────────────────\nexport const QrGlyph = glyph(<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /><path d=\"M14 14h3v3h-3zM20 14v.01M14 20h.01M17 20h4v-3\" /></>);\nexport const CameraGlyph = glyph(<><path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3z\" /><circle cx=\"12\" cy=\"13\" r=\"3\" /></>);\nexport const CheckGlyph = glyph(<path d=\"M20 6 9 17l-5-5\" />);\nexport const PowerGlyph = glyph(<><path d=\"M12 2v10\" /><path d=\"M18.4 6.6a9 9 0 1 1-12.77.04\" /></>);\n// ── generator and field settings ─────────────────────────────────────────────\nexport const RefreshGlyph = glyph(<><path d=\"M21 12a9 9 0 0 1-15.5 6.2L3 16\" /><path d=\"M3 12a9 9 0 0 1 15.5-6.2L21 8\" /><path d=\"M21 3v5h-5M3 21v-5h5\" /></>);\nexport const SlidersGlyph = glyph(<><path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" /></>);\nexport const DownloadGlyph = glyph(<><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" /><path d=\"m7 10 5 5 5-5M12 15V3\" /></>);\nexport const UploadGlyph = glyph(<><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" /><path d=\"m17 8-5-5-5 5M12 3v12\" /></>);\n// ── browsers that can fill ───────────────────────────────────────────────────\nexport const FingerprintGlyph = glyph(<><path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" /><path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" /><path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" /><path d=\"M2 12a10 10 0 0 1 18-6\" /><path d=\"M2 16h.01\" /><path d=\"M21.8 16c.2-2 .131-5.354 0-6\" /><path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" /><path d=\"M8.65 22c.21-.66.45-1.32.57-2\" /><path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" /></>);\nexport const SendGlyph = glyph(<path d=\"M14.5 21.7a.5.5 0 0 0 .9 0L22 3a.5.5 0 0 0-.6-.6L2.3 9.1a.5.5 0 0 0 0 .9l7.9 3.2a2 2 0 0 1 1.1 1.1zM21.9 2.1 10.9 13.1\" />);\n","/**\n * CONFIRM IT'S YOU. The server shows or exports a secret only after a sign-in from the last few\n * minutes (`recent_auth_required`). Every host signs people in with Supabase, so the one way to\n * produce a fresh sign-in lives here, over the host's own auth client — whichever way the person\n * signs in: Google (or any connected provider), a password, or a code sent to their email.\n */\n\n/** How a person can prove it is them again. Ordered by what the account actually uses. */\nexport type IdentityMethod = \"provider\" | \"password\" | \"email_code\" | \"dev\";\n\nexport interface IdentityAccount {\n email: string | null;\n /** Connected sign-in providers on the account (`google`, `github`, …), never `email`. */\n providers: readonly string[];\n hasPassword: boolean;\n}\n\nexport interface VaultIdentity {\n account(): Promise<IdentityAccount>;\n /** Leaves the page for the provider and comes back to the same address (the URL carries everything). */\n withProvider(provider: string): Promise<void>;\n withPassword(password: string): Promise<void>;\n sendEmailCode(): Promise<void>;\n withEmailCode(code: string): Promise<void>;\n /** A host-only path with no human step (the playground's dev server). */\n dev?: () => Promise<void>;\n}\n\n/** The slice of supabase-js `auth` this needs, so the package never depends on supabase-js itself. */\nexport interface SupabaseAuthLike {\n getUser(): Promise<{ data: { user: { id: string; email?: string | null; identities?: { provider: string }[] | null; app_metadata?: { providers?: string[] } } | null }; error: unknown }>;\n signInWithPassword(c: { email: string; password: string }): Promise<{ data: { user: { id: string } | null }; error: { message: string } | null }>;\n signInWithOtp(c: { email: string; options?: { shouldCreateUser?: boolean } }): Promise<{ error: { message: string } | null }>;\n verifyOtp(c: { email: string; token: string; type: \"email\" }): Promise<{ data: { user: { id: string } | null }; error: { message: string } | null }>;\n signInWithOAuth(c: { provider: never; options?: { redirectTo?: string } }): Promise<{ error: { message: string } | null }>;\n}\n\nconst SAME_PERSON = \"That signed in a different account. Use the account this vault belongs to.\";\n\n/** THE identity confirmation for every host: give it the host's `supabase.auth`. */\nexport function createSupabaseIdentity(auth: SupabaseAuthLike, options: { redirectTo?: () => string; dev?: () => Promise<void> } = {}): VaultIdentity {\n let me: { id: string; email: string | null } | null = null;\n const who = async () => {\n const { data } = await auth.getUser();\n if (!data.user) throw new Error(\"You are signed out. Sign in again.\");\n me = { id: data.user.id, email: data.user.email ?? null };\n return data.user;\n };\n const sameUser = (id: string | undefined) => {\n if (!me || id !== me.id) throw new Error(SAME_PERSON);\n };\n const identity: VaultIdentity = {\n async account() {\n const u = await who();\n const names = new Set([...(u.identities ?? []).map((i) => i.provider), ...(u.app_metadata?.providers ?? [])]);\n return { email: u.email ?? null, providers: [...names].filter((p) => p !== \"email\" && p !== \"phone\"), hasPassword: names.has(\"email\") };\n },\n async withProvider(provider) {\n await who();\n const redirectTo = options.redirectTo?.() ?? globalThis.location?.href;\n // `provider` is a supabase-js Provider string; the structural type keeps supabase-js out of the package.\n const { error } = await auth.signInWithOAuth({ provider: provider as never, ...(redirectTo ? { options: { redirectTo } } : {}) });\n if (error) throw new Error(error.message);\n },\n async withPassword(password) {\n const u = await who();\n if (!u.email) throw new Error(\"This account has no email to confirm with.\");\n const { data, error } = await auth.signInWithPassword({ email: u.email, password });\n if (error) throw new Error(\"That password was not accepted.\");\n sameUser(data.user?.id);\n },\n async sendEmailCode() {\n const u = await who();\n if (!u.email) throw new Error(\"This account has no email to send a code to.\");\n const { error } = await auth.signInWithOtp({ email: u.email, options: { shouldCreateUser: false } });\n if (error) throw new Error(error.message);\n },\n async withEmailCode(code) {\n const u = me ?? (await who());\n if (!u.email) throw new Error(\"This account has no email.\");\n const { data, error } = await auth.verifyOtp({ email: u.email, token: code.trim(), type: \"email\" });\n if (error) throw new Error(\"That code was not accepted. Check it, or send a new one.\");\n sameUser(data.user?.id);\n },\n };\n if (options.dev) identity.dev = options.dev;\n return identity;\n}\n\n/** True when the server refused because the sign-in is not recent enough. */\nexport function needsRecentSignIn(e: unknown): boolean {\n const err = e as { code?: unknown; status?: unknown; message?: unknown; serverDetail?: unknown } | null;\n if (!err) return false;\n if (err.code === \"recent_auth_required\") return true;\n // Some routes answer with only a sentence (the shown message is a generic \"sign in\"; the server's\n // own words say which): read those too.\n const said = [err.message, JSON.stringify(err.serverDetail ?? \"\")].filter((x): x is string => typeof x === \"string\").join(\" \");\n return /recent auth|recent sign|re-authenticate|authentication within the last/i.test(said);\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { Badge, Button, Field, Textarea } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { useConfirmed, wasCancelled } from \"./auth/IdentityGate\";\nimport { CopyGlyph, EyeGlyph, EyeOffGlyph, ExternalGlyph, LockGlyph, XGlyph } from \"./glyphs\";\nimport { useTransientSecret } from \"./hooks\";\nimport { useCopy } from \"./notice\";\nimport type { VaultField, VaultItem } from \"./model\";\nimport type { VaultPort } from \"./port\";\nimport { Row } from \"./ui\";\n\nexport { Row } from \"./ui\";\n\nconst MASK = \"••••••••••••\";\n\n/** A revealed secret, coloured the way password managers do: digits and symbols stand out from letters. */\nexport function SecretText({ value, multiline }: { value: string; multiline: boolean }) {\n if (multiline || value.length > 200) return <span className=\"whitespace-pre-wrap break-all font-mono text-sm\">{value}</span>;\n return (\n <span className=\"break-all font-mono text-sm tracking-wide\">\n {[...value].map((ch, i) => (\n <span key={i} className={/[0-9]/.test(ch) ? \"text-primary\" : /[^A-Za-z0-9]/.test(ch) ? \"text-warning\" : undefined}>\n {ch}\n </span>\n ))}\n </span>\n );\n}\n\nconst quietError = (e: unknown, fallback: string): string | null => (wasCancelled(e) ? null : e instanceof Error ? e.message : fallback);\n\n/**\n * An encrypted field in view mode: one row with show and copy. A `visible` field (a username) reads\n * its value as soon as the row opens — people should never have to click to see a username.\n */\nexport function SecretRow({ port, item, field, extra }: { port: VaultPort; item: VaultItem; field: VaultField; extra?: ReactNode }) {\n const confirmed = useConfirmed();\n const copyValue = useCopy();\n const secret = useTransientSecret();\n const [plain, setPlain] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const sealed = field.handling === \"sealed\";\n const visible = field.handling === \"visible\";\n // A turned-off field (a restored item comes back with every field off) has no value to read yet.\n const off = field.active === false;\n const canSee = !sealed && !off && (visible ? item.capabilities.canUse : item.capabilities.canReveal);\n\n useEffect(() => {\n if (!visible || !canSee) return;\n let live = true;\n port.reveal(item, field.key).then(\n (v) => live && setPlain(v),\n (e: unknown) => live && setError(quietError(e, \"Could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [port, item, field.key, visible, canSee]);\n\n async function fetchValue(): Promise<string | null> {\n if (plain !== null) return plain;\n if (secret.value !== null) return secret.value;\n setBusy(true);\n setError(null);\n try {\n return await confirmed(() => port.reveal(item, field.key));\n } catch (e) {\n setError(quietError(e, \"Could not be read.\"));\n return null;\n } finally {\n setBusy(false);\n }\n }\n async function toggle() {\n if (secret.value !== null) return secret.clear();\n const v = await fetchValue();\n if (v !== null) secret.show(v);\n }\n async function copy() {\n const v = await fetchValue();\n if (v !== null) await copyValue(v, field.label);\n }\n\n const multiline = field.kind === \"multiline\";\n const shown = visible ? plain : secret.value;\n return (\n <Row\n label={field.label}\n top={multiline && shown !== null}\n actions={\n <>\n {extra}\n {canSee && !visible ? <Button variant=\"quiet\" icon={secret.value !== null ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={secret.value !== null ? `Hide ${field.label}` : `Show ${field.label}`} disabled={busy} onClick={() => void toggle()} /> : null}\n {canSee ? <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label={`Copy ${field.label}`} disabled={busy} onClick={() => void copy()} /> : null}\n </>\n }\n >\n {sealed ? (\n <Badge icon={<LockGlyph />}>Sealed</Badge>\n ) : off ? (\n <span className=\"text-muted-foreground\">Turned off</span>\n ) : error ? (\n <span className=\"truncate text-destructive\" title={error}>{error}</span>\n ) : shown !== null ? (\n visible ? <span className={cn(\"block\", multiline ? \"whitespace-pre-wrap break-words\" : \"truncate\")}>{shown || \"—\"}</span> : <SecretText value={shown} multiline={multiline} />\n ) : (\n <span className={cn(\"block truncate text-muted-foreground\", !visible && \"tracking-widest\")}>{visible ? \"…\" : MASK}</span>\n )}\n </Row>\n );\n}\n\n/** A plaintext value (a website, a custom field): shown, with open and copy on the same row. */\nexport function PlainRow({ label, value, hint, openUrl, extra, multiline = false }: { label: ReactNode; value: string; hint?: ReactNode; openUrl?: ((url: string) => void) | undefined; extra?: ReactNode; multiline?: boolean }) {\n const copyValue = useCopy();\n const isUrl = /^https?:\\/\\//i.test(value);\n return (\n <Row\n label={label}\n hint={hint}\n top={multiline}\n actions={\n <>\n {extra}\n {isUrl && openUrl ? <Button variant=\"quiet\" icon={<ExternalGlyph />} aria-label={`Open ${value}`} onClick={() => openUrl(value)} /> : null}\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label={`Copy ${typeof label === \"string\" ? label : \"value\"}`} onClick={() => void copyValue(value, typeof label === \"string\" && label ? label : \"Value\")} />\n </>\n }\n >\n {isUrl && openUrl ? (\n // A real link (right-click, copy link address, open in a new tab); a click goes through the host's opener.\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block max-w-full truncate text-primary hover:underline\"\n onClick={(e) => {\n e.preventDefault();\n openUrl(value);\n }}\n >\n {value.replace(/^https?:\\/\\//i, \"\").replace(/\\/$/, \"\")}\n </a>\n ) : (\n <div className={multiline ? \"whitespace-pre-wrap break-words\" : \"truncate\"}>{value}</div>\n )}\n </Row>\n );\n}\n\n/** A common field with nothing in it yet: the label, and one quiet way to add it. */\nexport function AddRow({ label, onAdd, children = \"Add\" }: { label: ReactNode; onAdd: (() => void) | null; children?: ReactNode }) {\n return (\n <Row label={label}>\n {onAdd ? (\n <button type=\"button\" className=\"text-sm text-muted-foreground hover:text-primary\" onClick={onAdd}>\n {children}\n </button>\n ) : (\n <span className=\"text-disabled-foreground\">—</span>\n )}\n </Row>\n );\n}\n\n// ── edit ────────────────────────────────────────────────────────────────────\n\nexport function EditRow({ label, hint, value, onChange, placeholder, secret = false, multiline = false, onRemove, removeLabel, actions, autoFocus, onBlur, inputMode }: { label: ReactNode; hint?: ReactNode; value: string; onChange: (v: string) => void; placeholder?: string; secret?: boolean; multiline?: boolean; onRemove?: () => void; removeLabel?: string; actions?: ReactNode; autoFocus?: boolean; onBlur?: () => void; inputMode?: \"url\" | \"email\" | \"text\" }) {\n const [shown, setShown] = useState(false);\n return (\n <Row\n label={label}\n hint={hint}\n top={multiline}\n actions={\n <>\n {secret && value ? <Button variant=\"quiet\" icon={shown ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={shown ? \"Hide\" : \"Show\"} onClick={() => setShown((s) => !s)} /> : null}\n {actions}\n {onRemove ? <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label={removeLabel ?? \"Remove\"} onClick={onRemove} /> : null}\n </>\n }\n >\n {multiline ? (\n <Textarea className=\"w-full\" value={value} onChange={(e) => onChange(e.target.value)} rows={3} placeholder={placeholder} autoComplete=\"off\" spellCheck={!secret} {...(onBlur ? { onBlur } : {})} />\n ) : (\n <Field className={cn(\"w-full\", secret && shown && \"font-mono\")} value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} type={secret && !shown ? \"password\" : \"text\"} autoComplete=\"off\" spellCheck={false} {...(autoFocus ? { autoFocus } : {})} {...(onBlur ? { onBlur } : {})} {...(inputMode ? { inputMode } : {})} aria-label={typeof label === \"string\" && label ? label : (placeholder ?? \"Value\")} />\n )}\n </Row>\n );\n}\n\n/** A custom row whose label is typed too: \"Label | value\". */\nexport function CustomEditRow({ label, value, onLabel, onValue, secret, onRemove }: { label: string; value: string; onLabel: (v: string) => void; onValue: (v: string) => void; secret: boolean; onRemove: () => void }) {\n const [shown, setShown] = useState(false);\n return (\n <Row\n label={<Field className=\"w-full\" value={label} onChange={(e) => onLabel(e.target.value)} placeholder=\"Name\" aria-label=\"Field name\" />}\n actions={\n <>\n {secret && value ? <Button variant=\"quiet\" icon={shown ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={shown ? \"Hide\" : \"Show\"} onClick={() => setShown((x) => !x)} /> : null}\n <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label=\"Remove field\" onClick={onRemove} />\n </>\n }\n >\n <Field className=\"w-full\" value={value} onChange={(e) => onValue(e.target.value)} type={secret && !shown ? \"password\" : \"text\"} placeholder={secret ? \"Secret value\" : \"Value\"} autoComplete=\"off\" spellCheck={false} aria-label=\"Field value\" />\n </Row>\n );\n}\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState, type RefObject } from \"react\";\n\n/** A revealed value, held in this component only and dropped after `ms` (default 20s) or on unmount. */\nexport function useTransientSecret(ms = 20_000) {\n const [value, setValue] = useState<string | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clear = useCallback(() => {\n if (timer.current) clearTimeout(timer.current);\n timer.current = null;\n setValue(null);\n }, []);\n const show = useCallback(\n (next: string) => {\n if (timer.current) clearTimeout(timer.current);\n setValue(next);\n timer.current = setTimeout(clear, ms);\n },\n [clear, ms],\n );\n useEffect(() => clear, [clear]);\n return { value, show, clear };\n}\n\n/** The width of an element, so the workspace can pick full or compact by the room it is given. */\nexport function useElementWidth(ref: RefObject<HTMLElement | null>): number {\n const [width, setWidth] = useState(0);\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n setWidth(el.getBoundingClientRect().width);\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width;\n if (w !== undefined) setWidth(w);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref]);\n return width;\n}\n","/**\n * THE VAULT'S BUILDING BLOCKS. Every screen in this package is made of these, so the whole vault\n * reads as one calm, trustworthy surface:\n *\n * - `Section`: at most ONE card level. Rows inside it are separated by space, never by lines.\n * A card never sits inside another card.\n * - `Row`: label · value · actions on one line, always. Only a multi-line value (notes, a key)\n * grows downward, and its label stays beside it.\n * - `Panel`: anything bigger than a row (share, history, import…) opens in one panel — a window\n * on a desktop, a bottom sheet on a phone — named in the address (`?panel=`).\n * - Words are layout: labels ≤ 3 words, hints ≤ 60 characters, no sentences under titles.\n */\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system\";\n\n/** Inside a panel the panel IS the card: sections there draw no second box. */\nconst InPanel = createContext(false);\n\nexport function Section({ title, actions, children, className }: { title?: ReactNode; actions?: ReactNode; children: ReactNode; className?: string }) {\n const flat = useContext(InPanel);\n return (\n <section className={cn(\"flex flex-col gap-1.5\", className)}>\n {title || actions ? (\n <div className=\"flex min-h-7 items-center justify-between gap-2 px-1\">\n {title ? <h3 className=\"text-xs font-medium text-muted-foreground\">{title}</h3> : <span />}\n {actions ? <div className=\"flex items-center gap-1\">{actions}</div> : null}\n </div>\n ) : null}\n <div className={flat ? \"-mx-3 flex flex-col sm:-mx-4\" : \"flex flex-col rounded-xl border border-border bg-card py-1\"}>{children}</div>\n </section>\n );\n}\n\n/** One line: label, value, actions. The label column is narrower on a phone so the value keeps its room. */\nexport function Row({ label, hint, children, actions, top = false, className }: { label: ReactNode; hint?: ReactNode; children: ReactNode; actions?: ReactNode; top?: boolean; className?: string }) {\n return (\n <div className={cn(\"grid min-h-11 grid-cols-[5.75rem_minmax(0,1fr)_auto] gap-x-2 px-3 py-1 sm:grid-cols-[9rem_minmax(0,1fr)_auto] sm:gap-x-3 sm:px-4\", top ? \"items-start\" : \"items-center\", className)}>\n <div className={cn(\"flex min-w-0 flex-col text-xs leading-tight text-muted-foreground\", top && \"pt-2.5\")}>\n <span className=\"line-clamp-2 break-words sm:truncate\">{label}</span>\n {hint ? <span className=\"line-clamp-2 break-words text-xs text-disabled-foreground\">{hint}</span> : null}\n </div>\n <div className={cn(\"min-w-0 text-sm\", top && \"py-1.5\")}>{children}</div>\n <div className={cn(\"flex items-center gap-0.5\", top && \"pt-1\")}>{actions}</div>\n </div>\n );\n}\n\n/** A quiet line inside a section when it has nothing to list. */\nexport function Empty({ children }: { children: ReactNode }) {\n return <div className=\"px-4 py-3 text-sm text-muted-foreground\">{children}</div>;\n}\n\n/** THE panel: a window on a desktop, a bottom sheet on a phone. `footer` holds its actions. */\nexport function Panel({ title, open = true, onClose, children, footer, size = \"lg\" }: { title: ReactNode; open?: boolean; onClose: () => void; children: ReactNode; footer?: ReactNode; size?: \"sm\" | \"md\" | \"lg\" | \"xl\" }) {\n return (\n <Dialog open={open} onOpenChange={(o) => (o ? undefined : onClose())}>\n <DialogContent size={size}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n <InPanel.Provider value={true}>\n <div className=\"flex min-h-0 flex-col gap-4\">{children}</div>\n </InPanel.Provider>\n {footer ? <DialogFooter>{footer}</DialogFooter> : null}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Bytes as people read them. */\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(n < 10 * 1024 ? 1 : 0)} KB`;\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nexport function formatDate(iso: string | null | undefined, withTime = false): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString(undefined, withTime ? { year: \"numeric\", month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" } : { year: \"numeric\", month: \"short\", day: \"numeric\" });\n}\n","/**\n * The pure half of the activity area: audit rows as sentences people read, day grouping, history\n * grouping, and the rules for what may be restored or downloaded. No React, no network.\n */\nimport { formatRelativeTime } from \"@ai-matrx/kit/format\";\nimport { humanize } from \"../definitions\";\nimport type { VaultAttachment, VaultItem } from \"../model\";\nimport type { AuditEntry, HistoryEntry, HistoryPage } from \"./port\";\n\n/** The server's per-file ceiling (`MAX_VAULT_ATTACHMENT_BYTES`, 25 MiB). */\nexport const MAX_FILE_BYTES = 25 * 1024 * 1024;\n\nexport const fileTooBig = (size: number): boolean => size > MAX_FILE_BYTES;\n\n/** Whether a person may save this file: never sealed; visible needs use, revealable needs reveal. */\nexport function canDownload(item: Pick<VaultItem, \"capabilities\">, file: Pick<VaultAttachment, \"handling\">): boolean {\n if (file.handling === \"sealed\") return false;\n return file.handling === \"visible\" ? item.capabilities.canUse : item.capabilities.canReveal;\n}\n\n/** History is kept only for the person's own items, and only someone who may reveal can read it. */\nexport function historyEligible(item: Pick<VaultItem, \"owner\" | \"capabilities\">): boolean {\n return item.owner.kind === \"me\" && item.capabilities.canReveal;\n}\n\n/** An entry can be restored when its value was kept and it is not already the current value. */\nexport function canRestore(page: Pick<HistoryPage, \"restoreAvailable\" | \"historyRevision\">, entry: HistoryEntry): boolean {\n return page.restoreAvailable && entry.available && entry.revision < page.historyRevision;\n}\n\n/** Two pages joined, newest first, without repeating an entry. */\nexport function mergePages(a: HistoryPage, b: HistoryPage): HistoryPage {\n const seen = new Set(a.entries.map((e) => `${e.fieldId}:${e.revision}`));\n return {\n ...b,\n historyRevision: a.historyRevision,\n restoreAvailable: a.restoreAvailable,\n entries: [...a.entries, ...b.entries.filter((e) => !seen.has(`${e.fieldId}:${e.revision}`))],\n omitted: a.omitted + b.omitted,\n incomplete: a.incomplete || b.incomplete,\n };\n}\n\n/** Entries per field, in the item's field order; fields the item no longer has come last. `focus` goes first. */\nexport function historyByField(item: Pick<VaultItem, \"fields\">, entries: readonly HistoryEntry[], focus: string | null = null): { fieldId: string; label: string; entries: HistoryEntry[] }[] {\n const groups = new Map<string, HistoryEntry[]>();\n for (const e of entries) groups.set(e.fieldId, [...(groups.get(e.fieldId) ?? []), e]);\n const order = item.fields.map((f) => f.id);\n const ids = [...groups.keys()].sort((x, y) => {\n if (x === focus) return -1;\n if (y === focus) return 1;\n const ix = order.indexOf(x), iy = order.indexOf(y);\n return (ix < 0 ? Infinity : ix) - (iy < 0 ? Infinity : iy);\n });\n return ids.map((id) => ({\n fieldId: id,\n label: item.fields.find((f) => f.id === id)?.label ?? \"Removed field\",\n entries: [...(groups.get(id) ?? [])].sort((a, b) => b.revision - a.revision),\n }));\n}\n\n// ── the audit trail as sentences ────────────────────────────────────────────\n\nconst ITEM: Record<string, string> = {\n totp_code_viewed: \"One-time code shown\",\n totp_generated: \"One-time code used\",\n totp_enabled: \"One-time password turned on\",\n totp_disabled: \"One-time password turned off\",\n totp_denied: \"One-time code refused\",\n totp_enrolled: \"One-time password set up\",\n totp_deleted: \"One-time password removed\",\n item_created: \"Item created\",\n item_updated: \"Item edited\",\n item_deleted: \"Moved to trash\",\n item_restored_quarantined: \"Restored from trash\",\n item_shared: \"Shared\",\n item_transferred: \"Moved\",\n item_transferred_out: \"Moved out\",\n item_forked: \"Copied\",\n item_assigned: \"Assigned\",\n grant_changed: \"Access changed\",\n permissions_changed: \"Access changed\",\n revoked: \"Access removed\",\n denied: \"Access refused\",\n exported: \"Exported\",\n synced_from_user: \"Synced\",\n fields_retired_on_transfer: \"Fields retired on move\",\n authenticator: \"One-time password changed\",\n password_history_revealed: \"Old password shown\",\n password_history_restored: \"Old password restored\",\n password_history_reveal_denied: \"Old password refused\",\n browser_materialized: \"Filled in a browser\",\n browser_captured: \"Saved from a browser\",\n browser_capture_denied: \"Browser save refused\",\n browser_capture_context: \"Browser page read\",\n browser_login_url_learned: \"Website learned\",\n browser_login_result: \"Browser sign-in\",\n browser_match_denied: \"Browser fill refused\",\n browser_recipe_proposed: \"Sign-in steps proposed\",\n browser_inventory_listed: \"Listed for a browser\",\n native_password_materialized: \"Filled on a device\",\n native_passkey_created: \"Passkey created\",\n native_passkey_enabled: \"Passkey turned on\",\n native_passkey_imported: \"Passkey imported\",\n native_passkey_exported: \"Passkey exported\",\n native_passkey_materialized: \"Passkey used\",\n native_identity_inventory: \"Listed for a device\",\n action_link_captured: \"Link saved\",\n action_link_capture_denied: \"Link save refused\",\n};\n\n/** `{f}` is the field's name. */\nconst FIELD: Record<string, string> = {\n revealed: \"{f} shown\",\n reveal_denied: \"{f} refused\",\n created: \"{f} added\",\n field_added: \"{f} added\",\n updated: \"{f} changed\",\n rotated: \"{f} changed\",\n field_updated: \"{f} settings changed\",\n deleted: \"{f} removed\",\n field_deleted: \"{f} removed\",\n used: \"{f} used\",\n use: \"{f} used\",\n};\n\n/** A field verb with no field named: the event is about the whole item. */\nconst WHOLE_ITEM: Record<string, string> = {\n revealed: \"Value shown\",\n reveal_denied: \"Showing refused\",\n created: \"Item created\",\n field_added: \"Field added\",\n updated: \"Item edited\",\n rotated: \"Value changed\",\n field_updated: \"Field settings changed\",\n deleted: \"Moved to trash\",\n field_deleted: \"Field removed\",\n used: \"Used\",\n use: \"Used\",\n};\n\n/** `{n}` is the file's name. */\nconst FILE: Record<string, string> = {\n attachment_added: \"File {n} added\",\n attachment_updated: \"File {n} edited\",\n attachment_replaced: \"File {n} replaced\",\n attachment_deleted: \"File {n} deleted\",\n attachment_downloaded: \"File {n} downloaded\",\n attachment_download_denied: \"File {n} refused\",\n};\n\nconst str = (v: unknown): string | null => (typeof v === \"string\" && v.trim() ? v : null);\n\nexport interface AuditSentence {\n /** \"Password shown\". */\n what: string;\n /** \"by you\", \"by someone else\", \"by automation\", or null when the actor is unknown to us. */\n who: string | null;\n /** A refusal reads in the destructive colour. */\n refused: boolean;\n}\n\n/**\n * One audit row as people read it. `me` is the signed-in person's id when the host knows it; without\n * it, nobody is named \"you\" (a guess would be a lie).\n */\nexport function auditSentence(entry: AuditEntry, item: Pick<VaultItem, \"fields\" | \"attachments\">, me: string | null): AuditSentence {\n const m = entry.metadata;\n const field = (entry.fieldId ? item.fields.find((f) => f.id === entry.fieldId) : undefined) ?? item.fields.find((f) => f.key === str(m[\"field_key\"]));\n const keys = Array.isArray(m[\"field_keys\"]) ? (m[\"field_keys\"] as unknown[]).map(str).filter((k): k is string => k !== null) : [];\n const fieldName = (field?.key ?? str(m[\"field_key\"])) === \"totp_seed\" ? \"One-time password\" : field?.label ?? (str(m[\"field_key\"]) ? humanize(str(m[\"field_key\"]) as string) : keys.length ? keys.map((k) => item.fields.find((f) => f.key === k)?.label ?? humanize(k)).join(\", \") : null);\n const fileName = str(m[\"file_name\"]) ?? item.attachments.find((a) => a.id === str(m[\"attachment_id\"]))?.fileName ?? null;\n\n let what: string;\n const fileRule = FILE[entry.action];\n const fieldRule = FIELD[entry.action];\n if (fileRule) what = fileName ? fileRule.replace(\"{n}\", fileName) : fileRule.replace(\" {n}\", \"\");\n else if (entry.action === \"field_updated\" && m[\"metadata_only\"] !== true && fieldName) what = `${fieldName} changed`;\n // A visible field (a username) read by a browser is the vault SHOWING it, not someone using it.\n else if (entry.action === \"used\" && m[\"consumer\"] === \"browser\" && fieldName && field?.handling === \"visible\") what = `${fieldName} shown`;\n else if (fieldRule && fieldName) what = fieldRule.replace(\"{f}\", fieldName);\n else if (fieldRule) what = entry.fieldId ? fieldRule.replace(\"{f}\", \"A field\") : WHOLE_ITEM[entry.action] ?? humanize(entry.action);\n else what = ITEM[entry.action] ?? humanize(entry.action.replace(/^totp_/, \"one_time_password_\"));\n\n const who = entry.actorId === null ? \"by automation\" : me === null ? null : entry.actorId === me ? \"by you\" : \"by someone else\";\n return { what, who, refused: /denied|refused/.test(entry.action) };\n}\n\n// ── days ────────────────────────────────────────────────────────────────────\n\nconst dayKey = (d: Date): string => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n\n/** \"Today\", \"Yesterday\", a weekday within the week, else a date. */\nexport function dayLabel(iso: string, now: Date = new Date()): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"Unknown day\";\n if (dayKey(d) === dayKey(now)) return \"Today\";\n const y = new Date(now);\n y.setDate(now.getDate() - 1);\n if (dayKey(d) === dayKey(y)) return \"Yesterday\";\n const days = (now.getTime() - d.getTime()) / 86_400_000;\n if (days > 0 && days < 7) return d.toLocaleDateString(undefined, { weekday: \"long\" });\n return d.toLocaleDateString(undefined, { year: d.getFullYear() === now.getFullYear() ? undefined : \"numeric\", month: \"short\", day: \"numeric\" });\n}\n\n/** Entries grouped by local day, newest day first, order kept inside a day. */\nexport function groupByDay<T extends { at: string }>(entries: readonly T[], now: Date = new Date()): { label: string; entries: T[] }[] {\n const groups: { key: string; label: string; entries: T[] }[] = [];\n for (const e of entries) {\n const d = new Date(e.at);\n const key = Number.isNaN(d.getTime()) ? \"?\" : dayKey(d);\n const last = groups[groups.length - 1];\n if (last && last.key === key) last.entries.push(e);\n else groups.push({ key, label: dayLabel(e.at, now), entries: [e] });\n }\n return groups.map(({ label, entries: list }) => ({ label, entries: list }));\n}\n\n/** Today: \"2h ago\". Any other day (its date is the heading): the time, \"3:42 PM\". */\nexport function whenInDay(iso: string, now: Date = new Date()): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n if (dayKey(d) === dayKey(now)) return formatRelativeTime(iso, { now: now.getTime() });\n return d.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/**\n * Back-to-back identical lines (a username read each time the item opened, a code read every 30 s)\n * become one line with a count, so the trail shows what happened instead of how often it was looked at.\n */\nexport function collapseRuns<T>(rows: readonly T[], keyOf: (row: T) => string): { row: T; times: number }[] {\n // Within one day: the same line anywhere in it counts on its first (newest) appearance, so a\n // username read and a code read alternating all day are two lines, not two hundred.\n const out: { row: T; times: number }[] = [];\n const at = new Map<string, { row: T; times: number }>();\n for (const row of rows) {\n const k = keyOf(row);\n const seen = at.get(k);\n if (seen) seen.times += 1;\n else {\n const entry = { row, times: 1 };\n at.set(k, entry);\n out.push(entry);\n }\n }\n return out;\n}\n","/**\n * The Vault as the screens see it. Hosts map the wire shape into this once, in their VaultPort\n * (`createApiVaultPort` does it for every host that talks to the server). Plaintext never lives\n * here: an encrypted field carries a masked hint, and a revealed value is held only by\n * `useTransientSecret` in the row showing it.\n */\n\n/** Who may see a field's value. Mirrors the server contract: sealed has no human path, ever. */\nexport type FieldHandling = \"visible\" | \"revealable\" | \"sealed\";\nexport type FieldKind = \"text\" | \"secret\" | \"url\" | \"multiline\";\n\nexport interface VaultField {\n id: string;\n /** Stable key inside the item (`username`, `password`). */\n key: string;\n label: string;\n kind: FieldKind;\n handling: FieldHandling;\n editable: boolean;\n envKey: string | null;\n injectIntoSandbox: boolean;\n /** Plain words about this field (`fields/` edits it). */\n description: string;\n /** Off = kept, but not used by anything. Inactive fields stay on the item so they can be turned back on. */\n active: boolean;\n}\n\n/** A plaintext custom field (the server's `non_secret_fields`): label + value, never encrypted. */\nexport interface VaultCustomField {\n key: string;\n label: string;\n value: string;\n}\n\nexport interface VaultOwner {\n kind: \"me\" | \"organization\" | \"shared\";\n label: string;\n organizationId: string | null;\n}\n\nexport interface VaultItemCapabilities {\n canUse: boolean;\n canEdit: boolean;\n canReveal: boolean;\n canManage: boolean;\n}\n\nexport interface VaultAuthenticator {\n digits: number;\n period: number;\n enabled: boolean;\n}\n\nexport interface VaultAttachment {\n id: string;\n label: string;\n /** What the file is for (\"Signs App Store requests\"); \"\" when none. */\n description: string;\n fileName: string;\n mediaType: string;\n sizeBytes: number;\n handling: FieldHandling;\n createdAt: string;\n updatedAt: string;\n}\n\n/** How the browser decides an item matches a page. */\nexport type UriMatchMode = \"host\" | \"domain\" | \"exact\" | \"never\";\n\nexport interface VaultItem {\n id: string;\n name: string;\n description: string;\n definitionKey: string;\n definitionLabel: string;\n owner: VaultOwner;\n tags: string[];\n loginUrls: string[];\n notes: string;\n fields: VaultField[];\n custom: VaultCustomField[];\n authenticator: VaultAuthenticator | null;\n capabilities: VaultItemCapabilities;\n attachments: VaultAttachment[];\n uriMatchMode: UriMatchMode;\n browserFillEnabled: boolean;\n /** `all_members` / `restricted` for an organization item. */\n accessMode: string | null;\n /** The person who owns the item (`user_id`). For the person's own items this is them. */\n ownerUserId: string | null;\n /** Set when the item is in the trash: what restoring it needs. */\n deletion: { deletionId: string | null; deletedAt: string | null } | null;\n updatedAt: string;\n createdAt: string;\n}\n\nexport interface VaultOrganizationRef {\n id: string;\n name: string;\n}\n\n// ── location: everything the address carries ────────────────────────────────\n\nexport type VaultSort = \"name\" | \"website\" | \"updated\" | \"created\";\n\n/** Which vault to look in. `all` is everything the person can see, shared with them included. */\nexport type VaultSelection = \"all\" | \"mine\" | \"shared\" | (string & {});\n\nexport interface VaultLocation {\n vault: VaultSelection;\n /** `all`, `favorites`, `authenticator`, `trash`, `category:<id>`, `type:<definitionKey>` or `tag:<tag>`. */\n view: string;\n q: string;\n sort: VaultSort;\n /** The open item; null = none. */\n itemId: string | null;\n mode: \"view\" | \"edit\" | \"new\";\n /** New-item flow: the chosen definition, and the URL pasted at the start (kept across steps). */\n kind: string | null;\n url: string;\n /** A panel open over the workspace: `share`, `history`, `activity`, `files`, `move`, `import`, … */\n panel: string | null;\n}\n\nexport const DEFAULT_LOCATION: VaultLocation = { vault: \"all\", view: \"all\", q: \"\", sort: \"name\", itemId: null, mode: \"view\", kind: null, url: \"\", panel: null };\n\nconst SORTS: readonly VaultSort[] = [\"name\", \"website\", \"updated\", \"created\"];\n\n/** Reads a location from query params. The item id is the host's to place (a path or a param). */\nexport function locationFromParams(params: URLSearchParams, itemId: string | null = params.get(\"item\")): VaultLocation {\n const sort = params.get(\"sort\");\n const mode = params.get(\"mode\");\n return {\n vault: params.get(\"vault\") || DEFAULT_LOCATION.vault,\n view: params.get(\"view\") || DEFAULT_LOCATION.view,\n q: params.get(\"q\") ?? \"\",\n sort: SORTS.find((s) => s === sort) ?? DEFAULT_LOCATION.sort,\n itemId,\n mode: mode === \"edit\" || mode === \"new\" ? mode : \"view\",\n kind: params.get(\"kind\"),\n url: params.get(\"url\") ?? \"\",\n panel: params.get(\"panel\"),\n };\n}\n\n/** Writes everything that is not a default (and not the item id, which the host places). */\nexport function locationToParams(loc: VaultLocation): URLSearchParams {\n const q = new URLSearchParams();\n if (loc.vault !== DEFAULT_LOCATION.vault) q.set(\"vault\", loc.vault);\n if (loc.view !== DEFAULT_LOCATION.view) q.set(\"view\", loc.view);\n if (loc.q) q.set(\"q\", loc.q);\n if (loc.sort !== DEFAULT_LOCATION.sort) q.set(\"sort\", loc.sort);\n if (loc.mode !== \"view\") q.set(\"mode\", loc.mode);\n if (loc.kind) q.set(\"kind\", loc.kind);\n if (loc.url) q.set(\"url\", loc.url);\n if (loc.panel) q.set(\"panel\", loc.panel);\n return q;\n}\n\n// ── filtering ───────────────────────────────────────────────────────────────\n\nexport function inVault(item: VaultItem, vault: VaultSelection): boolean {\n if (vault === \"all\") return true;\n if (vault === \"mine\") return item.owner.kind === \"me\";\n if (vault === \"shared\") return item.owner.kind === \"shared\";\n return item.owner.organizationId === vault;\n}\n\nexport function inView(item: VaultItem, view: string): boolean {\n if (view === \"all\") return true;\n if (view.startsWith(\"type:\")) return item.definitionKey === view.slice(5);\n if (view.startsWith(\"tag:\")) return item.tags.includes(view.slice(4));\n return true;\n}\n\n/** The one search every list shares: name, type, tags, URLs, then plaintext custom fields. */\nexport function matchesQuery(item: VaultItem, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n return [item.name, item.definitionLabel, ...item.tags, ...item.loginUrls, ...item.custom.map((c) => `${c.label} ${c.value}`)].some((h) => h.toLowerCase().includes(q));\n}\n\n/**\n * The authenticator's own storage on an item (the seed, digits, period, issuer…): shown only as the\n * one \"One-time password\" row, never as loose fields — and always kept when the item is saved.\n */\nexport const isAuthenticatorStorage = (key: string): boolean => key === \"totp_seed\" || key.startsWith(\"totp_\") || key === \"authenticator_last_time_step\";\n\n/** An item's website as people read it: `github.com` (no scheme, no `www.`), or \"\" when it has none. */\nexport function siteOf(item: Pick<VaultItem, \"loginUrls\">): string {\n const raw = item.loginUrls[0];\n if (!raw) return \"\";\n try {\n return new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`).hostname.replace(/^www\\./, \"\");\n } catch {\n return raw.replace(/^https?:\\/\\//, \"\").replace(/^www\\./, \"\").split(\"/\")[0] ?? \"\";\n }\n}\n\nexport function sortItems(items: readonly VaultItem[], sort: VaultSort): VaultItem[] {\n const out = [...items];\n const byName = (a: VaultItem, b: VaultItem) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" });\n if (sort === \"name\") return out.sort(byName);\n // Items with no website sort after every website, by name.\n if (sort === \"website\") return out.sort((a, b) => { const x = siteOf(a), y = siteOf(b); return x && y ? x.localeCompare(y) || byName(a, b) : x ? -1 : y ? 1 : byName(a, b); });\n if (sort === \"updated\") return out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n return out.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\n// ── drafts: what edit and new share ─────────────────────────────────────────\n\nexport interface NewSecretField {\n key: string;\n label: string;\n value: string;\n}\n\nexport interface ItemDraft {\n name: string;\n description: string;\n tags: string[];\n loginUrls: string[];\n notes: string;\n /** New values for encrypted fields the definition declares, by field key. Absent = unchanged. */\n values: Record<string, string>;\n /** Encrypted custom fields added in this edit. */\n secrets: NewSecretField[];\n /** The plaintext custom fields, complete. */\n custom: VaultCustomField[];\n /** Ids of encrypted fields to delete. */\n removed: string[];\n /** A seed or otpauth address to enrol as the item's one-time password; empty = leave alone. */\n authenticator: string;\n}\n\nexport function draftOf(item: VaultItem | null): ItemDraft {\n return {\n name: item?.name ?? \"\",\n description: item?.description ?? \"\",\n tags: item ? [...item.tags] : [],\n loginUrls: item ? [...item.loginUrls] : [],\n notes: item?.notes ?? \"\",\n values: {},\n secrets: [],\n custom: item ? item.custom.map((c) => ({ ...c })) : [],\n removed: [],\n authenticator: \"\",\n };\n}\n\nconst same = (a: readonly string[], b: readonly string[]) => a.length === b.length && a.every((v, i) => v === b[i]);\n\n/** Field values the person changed (a prefilled value left alone is not a change). */\nexport function changedValues(base: ItemDraft, now: ItemDraft): [string, string][] {\n return Object.entries(now.values).filter(([k, v]) => v !== (base.values[k] ?? \"\"));\n}\n\n/** True when saving would change anything. The pane shows this at all times while editing. */\nexport function isDirty(base: ItemDraft, now: ItemDraft): boolean {\n return (\n base.name !== now.name ||\n base.description !== now.description ||\n base.notes !== now.notes ||\n !same(base.tags, now.tags) ||\n !same(base.loginUrls, now.loginUrls) ||\n changedValues(base, now).length > 0 ||\n now.secrets.some((s) => s.value !== \"\" || s.label !== \"\") ||\n now.removed.length > 0 ||\n now.authenticator !== \"\" ||\n JSON.stringify(base.custom) !== JSON.stringify(now.custom)\n );\n}\n\n/** A field key from a label: lowercase snake, starting with a letter. */\nexport function fieldKeyOf(label: string): string {\n const k = label.trim().toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n return /^[a-z]/.test(k) ? k : `f_${k}`;\n}\n\n/**\n * The item changed on the server WHILE it was being edited (a two-factor method saved on its own, a\n * file added, a one-time password set up): start from the new item, and carry over everything the\n * person had changed. Without this, a live change wiped every unsaved edit.\n */\nexport function rebaseDraft(oldBase: ItemDraft, newBase: ItemDraft, draft: ItemDraft): ItemDraft {\n const pick = <K extends keyof ItemDraft>(k: K): ItemDraft[K] => (JSON.stringify(draft[k]) !== JSON.stringify(oldBase[k]) ? draft[k] : newBase[k]);\n const oldCustom = new Map(oldBase.custom.map((c) => [c.key, c]));\n const draftCustom = new Map(draft.custom.map((c) => [c.key, c]));\n const custom = [\n // The server's fields now, each replaced by the person's version where they changed or removed it.\n ...newBase.custom\n .map((c) => {\n const before = oldCustom.get(c.key);\n const mine = draftCustom.get(c.key);\n if (before && !mine) return null; // the person removed it\n return mine && JSON.stringify(mine) !== JSON.stringify(before) ? mine : c;\n })\n .filter((c): c is VaultCustomField => c !== null),\n // Fields the person added in this edit.\n ...draft.custom.filter((c) => !oldCustom.has(c.key) && !newBase.custom.some((n) => n.key === c.key)),\n ];\n return {\n name: pick(\"name\"),\n description: pick(\"description\"),\n tags: pick(\"tags\"),\n loginUrls: pick(\"loginUrls\"),\n notes: pick(\"notes\"),\n values: { ...newBase.values, ...Object.fromEntries(changedValues(oldBase, draft)) },\n secrets: draft.secrets,\n custom,\n removed: draft.removed,\n authenticator: draft.authenticator,\n };\n}\n","import { isAuthenticatorStorage, type FieldHandling, type FieldKind } from \"./model\";\n\n/** One field a credential type declares. */\nexport interface DefinitionField {\n key: string;\n label: string;\n kind: FieldKind;\n handling: FieldHandling;\n /** `metadata` fields are plaintext columns of the item; `encrypted` ones are secrets. */\n storage: \"metadata\" | \"encrypted\";\n required: boolean;\n}\n\n/** A credential type from the platform catalog (e.g. \"GitHub personal access token\"). */\nexport interface VaultDefinition {\n key: string;\n label: string;\n family: string;\n providerKey: string | null;\n description: string;\n fields: readonly DefinitionField[];\n sortOrder: number;\n}\n\nexport const FAMILY_LABELS: Record<string, string> = {\n generic: \"Generic\",\n ai_providers: \"AI & model providers\",\n source_control: \"Source control & dev tools\",\n cloud_infrastructure: \"Cloud & infrastructure\",\n databases: \"Databases & data services\",\n hosting_deployment: \"Hosting & deployment\",\n server_network: \"Server & network access\",\n domains_dns_cdn: \"Domains, DNS & CDN\",\n messaging_communications: \"Messaging & communications\",\n payments_commerce: \"Payments & commerce\",\n business_platforms: \"Business platforms\",\n analytics_marketing: \"Analytics & marketing\",\n cms_content: \"CMS & content\",\n identity_security: \"Identity & security\",\n automation_integrations: \"Automation & integrations\",\n signing_files: \"Signing & files\",\n};\n\n/** The types offered first in \"New item\" (those that exist in the catalog), in this order. */\nexport const COMMON_DEFINITION_KEYS = [\"website_login\", \"username_password\", \"api_key\", \"env_value\", \"database_login\", \"custom\"] as const;\n\nconst MULTILINE = /(json|pem|private_key|certificate|cert|bundle|document|recovery_codes)/;\nconst SECRET = /(password|secret|token|api_key|private|passphrase|credential|seed|key$|_key)/;\nconst URLISH = /(url|uri|endpoint|webhook|hook)/;\n\nexport function humanize(key: string): string {\n const s = key.replace(/_/g, \" \").trim();\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction kindOf(key: string, handling: FieldHandling, format: string | null): FieldKind {\n if (format === \"password\") return \"secret\";\n if (format === \"url\") return \"url\";\n if (format === \"multiline\") return \"multiline\";\n if (MULTILINE.test(key)) return \"multiline\";\n if (handling !== \"visible\" && SECRET.test(key)) return \"secret\";\n if (URLISH.test(key)) return \"url\";\n return handling === \"visible\" ? \"text\" : \"secret\";\n}\n\ntype Json = unknown;\nconst obj = (v: Json): Record<string, Json> | null => (typeof v === \"object\" && v !== null && !Array.isArray(v) ? (v as Record<string, Json>) : null);\nconst str = (v: Json): string | null => (typeof v === \"string\" ? v : null);\n\nfunction parseFields(raw: Json): DefinitionField[] {\n if (!Array.isArray(raw)) return [];\n const out: DefinitionField[] = [];\n for (const f of raw) {\n const o = obj(f);\n const key = o ? str(o[\"field_key\"]) : null;\n if (!o || !key) continue;\n // The address list and the notes are the item's own first-class rows; the one-time-password seed\n // is the authenticator row. A definition declaring them must not draw a second copy.\n const format = str(o[\"format\"]);\n if (key === \"login_urls\" || key === \"notes\" || format === \"totp_secret\" || isAuthenticatorStorage(key)) continue;\n const h = str(o[\"handling\"]);\n const handling: FieldHandling = h === \"visible\" || h === \"sealed\" ? h : \"revealable\";\n const storage = o[\"storage_class\"] === \"metadata\" ? \"metadata\" : \"encrypted\";\n out.push({ key, label: str(o[\"label\"]) ?? humanize(key), kind: kindOf(key, handling, format), handling, storage, required: o[\"required\"] === true });\n }\n return out;\n}\n\n/** Catalog rows -> definitions. A preset's own fields replace its base's; with none it inherits them. */\nexport function parseDefinitions(entries: readonly { key: string; payload: Record<string, unknown>; sort_order?: number }[]): VaultDefinition[] {\n const byKey = new Map(entries.map((e) => [e.key, e.payload]));\n const own = (p: Record<string, unknown>) => parseFields(p[\"fields\"]);\n return entries\n .map((e) => {\n const p = e.payload;\n let fields = own(p);\n const base = str(p[\"base_definition_key\"]);\n if (fields.length === 0 && base) {\n const bp = byKey.get(base);\n if (bp) fields = own(bp);\n }\n return {\n key: e.key,\n label: str(p[\"label\"]) ?? humanize(e.key),\n family: str(p[\"family\"]) ?? \"generic\",\n providerKey: str(p[\"provider_key\"]),\n description: str(p[\"description\"]) ?? \"\",\n fields,\n sortOrder: e.sort_order ?? 0,\n } satisfies VaultDefinition;\n })\n .filter((d) => d.fields.length > 0 || d.key === \"secure_file\");\n}\n\n/** What a pasted address tells us: a name, the address itself, and the best-fitting type. */\nexport interface UrlGuess {\n name: string;\n url: string;\n definitionKey: string | null;\n /** True when the address belongs to a provider the catalog knows. */\n recognised: boolean;\n /** That provider's own types (its tokens, its apps), offered beside the login. */\n alternatives: readonly string[];\n}\n\nexport function inferFromUrl(raw: string, definitions: readonly VaultDefinition[]): UrlGuess | null {\n const text = raw.trim();\n if (!text) return null;\n let url: URL;\n try {\n url = new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(text) ? text : `https://${text}`);\n } catch {\n return null;\n }\n if (!url.hostname.includes(\".\")) return null;\n const labels = url.hostname.replace(/^www\\./, \"\").split(\".\");\n const brand = labels.length > 1 ? (labels[labels.length - 2] ?? labels[0] ?? \"\") : (labels[0] ?? \"\");\n // A pasted address is almost always a sign-in: it becomes a Website login. A provider's own types\n // (its tokens, its apps) are offered beside it, never chosen for the person.\n const login = definitions.find((d) => d.key === \"website_login\") ?? definitions.find((d) => d.key === \"username_password\");\n const alternatives = definitions.filter((d) => d.providerKey !== null && d.providerKey.toLowerCase() === brand.toLowerCase()).map((d) => d.key);\n return {\n name: brandName(brand, definitions),\n url: url.toString().replace(/\\/$/, \"\"),\n definitionKey: login?.key ?? null,\n recognised: alternatives.length > 0,\n alternatives,\n };\n}\n\n/**\n * THE CATEGORIES people browse by (1Password's left list), instead of the catalog's 130 raw types.\n * Every type lands in exactly one, by its key and family; the raw type still shows on each item.\n */\nexport const CATEGORIES = [\n { id: \"logins\", label: \"Logins\" },\n { id: \"passkeys\", label: \"Passkeys\" },\n { id: \"api\", label: \"API keys & tokens\" },\n { id: \"oauth\", label: \"Apps & OAuth\" },\n { id: \"infra\", label: \"Servers & databases\" },\n { id: \"env\", label: \"Environment values\" },\n { id: \"files\", label: \"Files & certificates\" },\n { id: \"other\", label: \"Other\" },\n] as const;\n\nexport type CategoryId = (typeof CATEGORIES)[number][\"id\"];\n\nconst INFRA_FAMILIES = new Set([\"databases\", \"server_network\", \"cloud_infrastructure\", \"hosting_deployment\", \"domains_dns_cdn\"]);\n\nexport function categoryOf(key: string, family: string): CategoryId {\n const k = key.toLowerCase();\n if (k.includes(\"passkey\")) return \"passkeys\";\n if (k === \"website_login\" || k === \"username_password\" || /(^|_)(login|account|seller)(_|$)/.test(k)) return INFRA_FAMILIES.has(family) ? \"infra\" : \"logins\";\n if (k === \"env_value\" || k.startsWith(\"env_\")) return \"env\";\n if (/oauth|oidc|client|application|(^|_)app(_|$)|notifications|mcp/.test(k)) return \"oauth\";\n if (INFRA_FAMILIES.has(family) || /database|server|ssh|host/.test(k)) return \"infra\";\n if (family === \"signing_files\" || /file|cert|pem|signing/.test(k)) return \"files\";\n if (family === \"ai_providers\" || /api|token|pat$|_pat_|secret_key|credentials?$/.test(k)) return \"api\";\n return \"other\";\n}\n\n/** A brand as its own catalog spells it (\"GitHub\", not \"Github\"), else the address's name, capitalised. */\nexport function brandName(brand: string, definitions: readonly VaultDefinition[]): string {\n const b = brand.toLowerCase();\n for (const d of definitions) {\n if (d.providerKey?.toLowerCase() !== b) continue;\n const first = d.label.split(/\\s+/)[0] ?? \"\";\n if (first.toLowerCase() === b) return first;\n }\n return humanize(brand);\n}\n","import type { FieldHandling, VaultAttachment, VaultItem } from \"../model\";\n\n/** One recorded earlier value of a secret field. Value-free: the value comes only from `revealHistory`. */\nexport interface HistoryEntry {\n fieldId: string;\n revision: number;\n recordedAt: string;\n /** False when the server kept the change but not its value (it can be neither shown nor restored). */\n available: boolean;\n}\n\n/** One page of an item's history, newest first. */\nexport interface HistoryPage {\n entries: HistoryEntry[];\n /** The chain head. A restore names it so a change made meanwhile is refused, never overwritten. */\n historyRevision: number;\n /** False when nothing on this item can be restored at all. */\n restoreAvailable: boolean;\n /** When capture began; earlier values were never recorded. */\n captureStartedAt: string | null;\n /** Pass to `history` for the next (older) page; null = no more. */\n nextBefore: number | null;\n /** Entries the server left out (unreadable), so the timeline is incomplete. */\n omitted: number;\n incomplete: boolean;\n}\n\n/** Thrown by `restoreHistory` when the history moved since it was read (server 409). */\nexport class HistoryChangedError extends Error {\n constructor() {\n super(\"History changed. Review it again.\");\n this.name = \"HistoryChangedError\";\n }\n}\n\n/** One audit row: what happened, who did it, when. Never a value. */\nexport interface AuditEntry {\n id: string;\n action: string;\n /** Null when the platform itself acted (automation, a scheduled job). */\n actorId: string | null;\n /** The encrypted field the event is about, when it is about one. */\n fieldId: string | null;\n metadata: Record<string, unknown>;\n at: string;\n}\n\n/** New or changed file details. `description: null` clears it. */\nexport interface FileDetails {\n label?: string;\n description?: string | null;\n fileName?: string;\n handling?: FieldHandling;\n}\n\n/** What happened to an item: password history, the audit trail, and its protected files. */\nexport interface ActivityPort {\n /** Personal items only (the server refuses others). `before` = `nextBefore` of the previous page. */\n history(item: VaultItem, before?: number | null): Promise<HistoryPage>;\n /** Audited; needs a recent sign-in. */\n revealHistory(item: VaultItem, fieldId: string, revision: number): Promise<string>;\n /** Makes an earlier value current again. Rejects with `HistoryChangedError` when the history moved. */\n restoreHistory(item: VaultItem, fieldId: string, revision: number, expectedHistoryRevision: number): Promise<VaultItem>;\n /** Newest first. The server has no cursor, only a limit (1–500). */\n audit(item: VaultItem, limit: number): Promise<AuditEntry[]>;\n /** Each returns the item as the server now has it. */\n addFile(item: VaultItem, file: File, details: { label: string; description: string | null; handling: FieldHandling }): Promise<VaultItem>;\n updateFile(item: VaultItem, attachmentId: string, details: FileDetails): Promise<VaultItem>;\n replaceFile(item: VaultItem, attachmentId: string, file: File): Promise<VaultItem>;\n deleteFile(item: VaultItem, attachmentId: string): Promise<VaultItem>;\n /** The decrypted bytes. Audited; sealed files are always refused. */\n downloadFile(item: VaultItem, attachment: VaultAttachment): Promise<Uint8Array>;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { wasCancelled } from \"../auth/IdentityGate\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { Empty, Panel, Section, formatDate } from \"../ui\";\nimport { auditSentence, collapseRuns, groupByDay, whenInDay } from \"./logic\";\nimport type { AuditEntry } from \"./port\";\n\n/** The server has no cursor, only a limit (1–500), so \"Show more\" asks for a longer list. */\nconst PAGE = 50;\nconst MAX = 500;\n\n/**\n * The item's audit trail as plain sentences (\"Password shown · by you · 2h ago\"), grouped by day.\n * Nothing here is a value. \"you\" is known only for the person's own items: the audit names actors by\n * id, and on an organization's item there is no way to tell which id is the person reading.\n */\nexport function ActivityPanel({ item, port, onClose }: ItemPanelProps) {\n const [limit, setLimit] = useState(PAGE);\n const [entries, setEntries] = useState<AuditEntry[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const generation = useRef(0);\n\n useEffect(() => {\n const g = ++generation.current;\n setLoading(true);\n setError(null);\n port.activity.audit(item, limit).then(\n (list) => generation.current === g && setEntries(list),\n (e: unknown) => generation.current === g && setError(wasCancelled(e) ? null : e instanceof Error ? e.message : \"Activity could not be read.\"),\n ).finally(() => generation.current === g && setLoading(false));\n return () => {\n generation.current += 1;\n };\n }, [port, item, limit]);\n\n const me = item.owner.kind === \"me\" ? item.ownerUserId : null;\n const now = new Date();\n const hasMore = entries !== null && entries.length >= limit && limit < MAX;\n\n return (\n <Panel\n title=\"Activity\"\n onClose={onClose}\n footer={hasMore ? <Button variant=\"outline\" disabled={loading} onClick={() => setLimit((n) => Math.min(MAX, n * 2))}>{loading ? \"Loading…\" : \"Show more\"}</Button> : undefined}\n >\n {error ? <p role=\"alert\" className=\"px-1 text-sm text-destructive\">{error}</p> : null}\n {entries === null ? (\n loading ? <Empty>Reading activity…</Empty> : null\n ) : entries.length === 0 ? (\n <Empty>Nothing has happened yet.</Empty>\n ) : (\n groupByDay(entries, now).map((day) => (\n <Section key={day.label} title={day.label}>\n {collapseRuns(\n day.entries.map((entry) => ({ entry, s: auditSentence(entry, item, me) })),\n (r) => `${r.s.what}|${r.s.who ?? \"\"}`,\n ).map(({ row: { entry, s }, times }) => {\n return (\n <div key={entry.id} className=\"flex min-h-9 items-center gap-1.5 px-3 text-sm sm:px-4\" title={formatDate(entry.at, true)}>\n <span className={cn(\"truncate\", s.refused ? \"text-destructive\" : \"text-foreground\")}>{s.what}</span>\n <span className=\"shrink-0 text-muted-foreground\">\n {times > 1 ? ` · ${times} times` : \"\"}\n {s.who ? ` · ${s.who}` : \"\"} · {whenInDay(entry.at, now)}\n </span>\n </div>\n );\n })}\n </Section>\n ))\n )}\n </Panel>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, TextInputDialog } from \"@ai-matrx/design-system\";\nimport type { VaultViewProps } from \"../area-props\";\nimport { CopyGlyph, definitionGlyph, ExternalGlyph, MoreGlyph, PencilGlyph, PlusGlyph, PowerGlyph, ShieldGlyph, TrashGlyph } from \"../glyphs\";\nimport { matchesQuery, siteOf, type VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Section } from \"../ui\";\nimport { AddOtpPanel } from \"./AddOtpPanel\";\nimport { CodeButton, useCopied } from \"./CodeParts\";\nimport { useLiveCode } from \"./live-code\";\nimport type { AuthenticatorEntry } from \"./port\";\nimport { otpActionError, useOtpActions } from \"./TotpRows\";\n\n/** What the search also reads: the code's service and account (not on the item itself). */\nfunction matchesEntry(entry: AuthenticatorEntry | undefined, q: string): boolean {\n if (!entry || !q) return false;\n return [entry.issuer, entry.account].some((v) => v?.toLowerCase().includes(q));\n}\n\n/** Items that hold a one-time password, filtered by the search and grouped by whose they are. */\nexport function otpGroups(items: readonly VaultItem[], entries: ReadonlyMap<string, AuthenticatorEntry>, query: string, hidden: ReadonlySet<string> = new Set()) {\n const q = query.trim().toLowerCase();\n const withOtp = items\n .filter((i) => i.authenticator && !i.deletion && !hidden.has(i.id))\n .filter((i) => !q || matchesQuery(i, q) || matchesEntry(entries.get(i.id), q))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" }));\n const groups = new Map<string, { label: string; items: VaultItem[] }>();\n for (const i of withOtp) {\n const key = i.owner.kind === \"organization\" ? `org:${i.owner.organizationId}` : i.owner.kind;\n const g = groups.get(key) ?? { label: i.owner.label, items: [] };\n g.items.push(i);\n groups.set(key, g);\n }\n // Personal first, then organizations by name, shared last.\n const rank = (k: string) => (k === \"me\" ? 0 : k === \"shared\" ? 2 : 1);\n return [...groups.entries()].sort(([a, x], [b, y]) => rank(a) - rank(b) || x.label.localeCompare(y.label)).map(([key, g]) => ({ key, ...g }));\n}\n\n/**\n * The sidebar's \"One-time passwords\": every code at a glance, one calm row each — the login, its\n * account, the live code and its ring. Press a code to copy it. Off codes sit quietly with \"Turn on\".\n */\nexport function AuthenticatorView({ port, items, definitions, query, onOpen, onChanged, header }: VaultViewProps) {\n const [entries, setEntries] = useState<ReadonlyMap<string, AuthenticatorEntry>>(new Map());\n const [hidden, setHidden] = useState<ReadonlySet<string>>(new Set());\n const [adding, setAdding] = useState(false);\n const [renaming, setRenaming] = useState<VaultItem | null>(null);\n const [renameError, setRenameError] = useState<string | null>(null);\n const [renameBusy, setRenameBusy] = useState(false);\n\n // The account each code is for lives on the authenticator, not the item: read it once per load.\n useEffect(() => {\n let live = true;\n port.authenticator.list().then(\n (list) => live && setEntries(new Map(list.map((e) => [e.itemId, e]))),\n (e: unknown) => console.error(\"One-time password accounts could not be read\", e),\n );\n return () => {\n live = false;\n };\n }, [port, items]);\n\n const groups = otpGroups(items, entries, query, hidden);\n const total = items.filter((i) => i.authenticator && !i.deletion && !hidden.has(i.id)).length;\n const familyOf = (key: string) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n\n return (\n <section aria-label=\"One-time passwords\" className=\"flex h-full min-h-0 flex-col bg-background\">\n {header}\n <div className=\"flex min-h-12 items-center justify-between gap-2 px-4 pb-1 pt-3\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">One-time passwords</h2>\n {total > 0 ? <span className=\"text-xs tabular-nums text-muted-foreground\">{total}</span> : null}\n </div>\n {total > 0 ? (\n <Button variant=\"outline\" icon={<PlusGlyph />} onClick={() => setAdding(true)}>\n Add\n </Button>\n ) : null}\n </div>\n\n {total === 0 ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 px-6 pb-12 text-center\">\n <span className=\"flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <ShieldGlyph className=\"size-6\" />\n </span>\n <p className=\"text-sm font-medium text-foreground\">No one-time passwords yet</p>\n <Button variant=\"primary\" icon={<PlusGlyph />} onClick={() => setAdding(true)}>\n Add one-time password\n </Button>\n </div>\n ) : groups.length === 0 ? (\n <div className=\"px-4 py-10 text-center text-sm text-muted-foreground\">Nothing matches.</div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-6 pt-1 sm:px-4\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-5\">\n {groups.map((g) => (\n <Section key={g.key} {...(groups.length > 1 ? { title: g.label } : {})} className=\"[&>div]:px-1\">\n {g.items.map((item) => (\n <OtpListRow\n key={item.id}\n port={port}\n item={item}\n family={familyOf(item.definitionKey)}\n entry={entries.get(item.id)}\n onOpen={() => onOpen(item.id)}\n onRename={() => {\n setRenameError(null);\n setRenaming(item);\n }}\n onChanged={onChanged}\n onRemoved={() => {\n setHidden((h) => new Set(h).add(item.id));\n onChanged();\n }}\n />\n ))}\n </Section>\n ))}\n </div>\n </div>\n )}\n\n {adding ? (\n <AddOtpPanel\n port={port}\n items={items}\n definitions={definitions}\n onClose={() => setAdding(false)}\n onChanged={onChanged}\n onDone={(id) => {\n setAdding(false);\n onOpen(id);\n }}\n />\n ) : null}\n\n <TextInputDialog\n open={renaming !== null}\n onOpenChange={(o) => {\n if (!o && !renameBusy) setRenaming(null);\n }}\n title=\"Rename login\"\n {...(renameError ? { description: <span className=\"text-destructive\">{renameError}</span> } : {})}\n placeholder=\"Login name\"\n defaultValue={renaming?.name ?? \"\"}\n confirmLabel=\"Rename\"\n busy={renameBusy}\n onConfirm={async (name) => {\n if (!renaming) return;\n setRenameBusy(true);\n setRenameError(null);\n try {\n await port.authenticator.rename(renaming, name);\n setRenaming(null);\n onChanged();\n } catch (e) {\n setRenameError(otpActionError(e, \"rename it\"));\n } finally {\n setRenameBusy(false);\n }\n }}\n />\n </section>\n );\n}\n\ninterface OtpListRowProps {\n port: VaultPort;\n item: VaultItem;\n family: string;\n entry: AuthenticatorEntry | undefined;\n onOpen: () => void;\n onRename: () => void;\n onChanged: () => void;\n onRemoved: () => void;\n}\n\n/** One code, one line: login · account/site · live code + ring · menu. */\nfunction OtpListRow({ port, item, family, entry, onOpen, onRename, onChanged, onRemoved }: OtpListRowProps) {\n const a = useOtpActions(port, item, (next) => (next && next.authenticator === null ? onRemoved() : onChanged()));\n const live = useLiveCode(port, item, a.enabled && !a.removed);\n const { copy } = useCopied();\n const Icon = definitionGlyph(item.definitionKey, family);\n const canManage = item.capabilities.canManage || item.capabilities.canEdit;\n if (a.removed) return null;\n const sub = a.error ?? [entry?.account, siteOf(item) || entry?.issuer].filter((v, i, all): v is string => Boolean(v) && all.indexOf(v) === i).join(\" · \");\n\n return (\n <div className=\"grid min-h-14 grid-cols-[2rem_minmax(0,1fr)_auto_auto] items-center gap-x-3 rounded-lg px-2 py-1.5 transition-colors hover:bg-accent/50\">\n <button type=\"button\" onClick={onOpen} aria-label={`Open ${item.name}`} tabIndex={-1} className={cn(\"flex size-8 items-center justify-center rounded-lg bg-muted\", a.enabled ? \"text-foreground\" : \"text-disabled-foreground\")}>\n <Icon className=\"size-4\" />\n </button>\n <button type=\"button\" onClick={onOpen} className=\"flex min-w-0 flex-col items-start rounded-md text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n <span className={cn(\"max-w-full truncate text-sm font-medium\", a.enabled ? \"text-foreground\" : \"text-muted-foreground\")}>{item.name}</span>\n {sub ? <span className={cn(\"max-w-full truncate text-xs\", a.error ? \"text-destructive\" : \"text-muted-foreground\")} title={sub}>{sub}</span> : null}\n </button>\n\n <div className=\"flex min-w-0 justify-end\">\n {!a.enabled ? (\n <span className=\"flex items-center gap-1.5\">\n <span className=\"text-sm text-disabled-foreground\">Off</span>\n {canManage ? (\n <Button variant=\"quiet\" disabled={a.busy} onClick={() => void a.setEnabled(true)}>\n Turn on\n </Button>\n ) : null}\n </span>\n ) : live.error ? (\n <span className=\"flex items-center gap-1.5\">\n <span className=\"max-w-40 truncate text-xs text-destructive\" title={live.error}>{live.error}</span>\n <Button variant=\"quiet\" onClick={live.retry}>Retry</Button>\n </span>\n ) : (\n <CodeButton live={live} digits={item.authenticator?.digits ?? 6} label={item.name} />\n )}\n </div>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label={`${item.name} options`} disabled={a.busy} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n <DropdownMenuItem onSelect={onOpen}>\n <ExternalGlyph className=\"size-4\" />\n Open login\n </DropdownMenuItem>\n {live.code ? (\n <DropdownMenuItem onSelect={() => live.code && void copy(live.code)}>\n <CopyGlyph className=\"size-4\" />\n Copy code\n </DropdownMenuItem>\n ) : null}\n {canManage ? (\n <>\n <DropdownMenuItem onSelect={onRename}>\n <PencilGlyph className=\"size-4\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => void a.setEnabled(!a.enabled)}>\n <PowerGlyph className=\"size-4\" />\n {a.enabled ? \"Turn off\" : \"Turn on\"}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"text-destructive focus:text-destructive\" onSelect={() => void a.remove()}>\n <TrashGlyph className=\"size-4\" />\n Remove\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Button, Field, Select } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { VaultDefinition } from \"../definitions\";\nimport { draftOf, siteOf, type VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Panel, Row, Section } from \"../ui\";\nimport { CodeButton } from \"./CodeParts\";\nimport { useLiveCode } from \"./live-code\";\nimport { authenticatorName, matchIssuerToSite, tryParseEnrollment, type ParsedEnrollment } from \"./otpauth\";\nimport { OtpSetupRow } from \"./Setup\";\nimport { otpActionError } from \"./TotpRows\";\n\nconst NEW = \"__new__\";\nconst LOGIN_KEYS = [\"website_login\", \"username_password\"];\n\n/** \"example.com\" → \"https://example.com\"; null when it is not an address. */\nexport function normalizeWebsite(raw: string): string | null {\n const t = raw.trim();\n if (!t) return null;\n const withScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(t) ? t : `https://${t}`;\n try {\n const u = new URL(withScheme);\n if (u.protocol !== \"https:\" && u.protocol !== \"http:\") return null;\n if (!u.hostname.includes(\".\") && u.hostname !== \"localhost\") return null;\n return u.toString().replace(/\\/$/, \"\");\n } catch {\n return null;\n }\n}\n\nexport interface AddOtpPanelProps {\n port: VaultPort;\n items: readonly VaultItem[];\n definitions: readonly VaultDefinition[];\n /** Pre-chooses the login to add it to. */\n itemId?: string | null;\n onClose: () => void;\n /** Something was created or enrolled: reload. */\n onChanged: () => void;\n /** Done, with the login that now has the code. */\n onDone: (itemId: string) => void;\n}\n\n/**\n * Adds a one-time password from the all-codes view: to an existing login (matched by website when the\n * code names its service) or to a new one. After saving it shows the first code at once, because the\n * site asks for it to finish turning two-factor on.\n */\nexport function AddOtpPanel({ port, items, definitions, itemId = null, onClose, onChanged, onDone }: AddOtpPanelProps) {\n const confirmed = useConfirmed();\n const candidates = items\n .filter((i) => !i.authenticator && !i.deletion && (i.capabilities.canEdit || i.capabilities.canManage))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" }));\n const [input, setInput] = useState(\"\");\n const [image, setImage] = useState<File | null>(null);\n const [target, setTarget] = useState<string>(itemId && candidates.some((c) => c.id === itemId) ? itemId : NEW);\n const [targetChosen, setTargetChosen] = useState(Boolean(itemId));\n const [name, setName] = useState(\"\");\n const [nameTouched, setNameTouched] = useState(false);\n const [website, setWebsite] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // A login created by an attempt whose enrolment failed: a retry reuses it instead of making a twin.\n const [created, setCreated] = useState<VaultItem | null>(null);\n const [saved, setSaved] = useState<VaultItem | null>(null);\n\n const { parsed } = tryParseEnrollment(input);\n const isNew = target === NEW;\n const websiteUrl = normalizeWebsite(website);\n const websiteBad = website.trim() !== \"\" && !websiteUrl;\n const ready = Boolean(parsed || image) && (!isNew || name.trim() !== \"\") && !websiteBad && !busy;\n\n const recognise = (p: ParsedEnrollment) => {\n if (!nameTouched) setName((n) => authenticatorName(n, p));\n if (!targetChosen) {\n const match = matchIssuerToSite(p.issuer, candidates, siteOf);\n setTarget(match ? match.id : NEW);\n }\n };\n\n const save = async () => {\n setBusy(true);\n setError(null);\n try {\n let item = isNew ? created : (items.find((i) => i.id === target) ?? null);\n if (!item) {\n const def = LOGIN_KEYS.map((k) => definitions.find((d) => d.key === k)).find((d): d is VaultDefinition => Boolean(d));\n if (!def) throw new Error(\"No login type is available.\");\n const r = await port.create(def, null, { ...draftOf(null), name: name.trim(), loginUrls: websiteUrl ? [websiteUrl] : [] });\n item = r.item;\n setCreated(item);\n onChanged();\n }\n const it = item;\n const entry = await confirmed(() => (image ? port.authenticator.enrolQrImage(it, image, image.name) : port.authenticator.enrol(it, input)));\n let next: VaultItem = { ...it, authenticator: { digits: entry.digits, period: entry.period, enabled: entry.enabled } };\n // An existing login named \"Website login\" takes the service's name, as on a new one.\n const better = authenticatorName(it.name, { issuer: entry.issuer, account: entry.account });\n if (!isNew && better !== it.name) {\n try {\n const renamed = await port.authenticator.rename(it, better);\n next = { ...renamed, authenticator: next.authenticator };\n } catch {\n // The code is saved; the old name stays. Renaming is one menu away.\n }\n }\n setInput(\"\");\n setImage(null);\n setSaved(next);\n onChanged();\n } catch (e) {\n setError(wasCancelled(e) ? \"Not confirmed, so nothing was added.\" : otpActionError(e, \"add it\"));\n } finally {\n setBusy(false);\n }\n };\n\n if (saved) return <AddedPanel port={port} item={saved} onClose={onClose} onDone={() => onDone(saved.id)} />;\n\n return (\n <Panel\n title=\"Add one-time password\"\n size=\"md\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"quiet\" onClick={onClose} disabled={busy}>Cancel</Button>\n <Button variant=\"primary\" disabled={!ready} onClick={() => void save()}>{busy ? \"Adding…\" : \"Add\"}</Button>\n </>\n }\n >\n <Section>\n <OtpSetupRow\n label=\"Setup code\"\n value={input}\n autoFocus\n disabled={busy}\n onChange={(v) => {\n setImage(null);\n setError(null);\n setInput(v);\n }}\n onImage={(f) => {\n setInput(\"\");\n setError(null);\n setImage(f);\n }}\n onRecognized={recognise}\n status={image ? `QR image ready · ${image.name}` : null}\n />\n <Row label=\"Add to\">\n <Select\n value={target}\n disabled={busy || created !== null}\n aria-label=\"Add to\"\n options={[{ value: NEW, label: \"New login\" }, ...candidates.map((c) => ({ value: c.id, label: siteOf(c) ? `${c.name} · ${siteOf(c)}` : c.name }))]}\n onValueChange={(v: string) => {\n setTarget(v);\n setTargetChosen(true);\n }}\n />\n </Row>\n {isNew ? (\n <>\n <Row label=\"Name\">\n <Field\n className=\"w-full\"\n value={name}\n disabled={busy || created !== null}\n onChange={(e) => {\n setNameTouched(true);\n setName(e.target.value);\n }}\n placeholder=\"Filled from the code\"\n aria-label=\"Name\"\n />\n </Row>\n <Row label=\"Website\" hint={websiteBad ? <span className=\"text-destructive\">Not a web address</span> : undefined}>\n <Field className=\"w-full\" type=\"url\" value={website} disabled={busy || created !== null} onChange={(e) => setWebsite(e.target.value)} placeholder=\"example.com\" aria-label=\"Website\" aria-invalid={websiteBad || undefined} />\n </Row>\n </>\n ) : null}\n </Section>\n {error ? (\n <p className=\"px-1 text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </Panel>\n );\n}\n\n/** After adding: the first code, big, because the site is waiting for it. */\nfunction AddedPanel({ port, item, onClose, onDone }: { port: VaultPort; item: VaultItem; onClose: () => void; onDone: () => void }) {\n const live = useLiveCode(port, item, true);\n return (\n <Panel title={item.name} size=\"sm\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onDone}>Done</Button>}>\n <div className=\"flex flex-col items-center gap-2 py-4\">\n {live.error ? (\n <span className=\"text-sm text-destructive\">{live.error}</span>\n ) : (\n <CodeButton live={live} digits={item.authenticator?.digits ?? 6} size=\"lg\" label={item.name} />\n )}\n <p className=\"text-xs text-muted-foreground\">Enter this code on the site to finish.</p>\n </div>\n </Panel>\n );\n}\n","import { useCopy } from \"../notice\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { CheckGlyph, CopyGlyph } from \"../glyphs\";\nimport type { LiveCode } from \"./live-code\";\nimport { groupCode, maskedCode } from \"./otpauth\";\n\n/** The seconds a code has left, as a ring that empties; the last five turn it red. */\nexport function CountdownRing({ remaining, period, loading = false, className }: { remaining: number; period: number; loading?: boolean; className?: string }) {\n const r = 9.5;\n const c = 2 * Math.PI * r;\n const p = loading ? 0 : Math.max(0, Math.min(1, remaining / period));\n const urgent = !loading && remaining <= 5;\n return (\n <span className={cn(\"relative inline-flex size-6 shrink-0 items-center justify-center\", className)} role=\"img\" aria-label={loading ? \"Getting code\" : `${remaining} seconds left`}>\n <svg viewBox=\"0 0 24 24\" className=\"absolute inset-0 size-full -rotate-90\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r={r} fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} className=\"text-muted\" />\n <circle\n cx=\"12\"\n cy=\"12\"\n r={r}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={c * (1 - p)}\n className={urgent ? \"text-destructive\" : \"text-primary\"}\n // A new period refills at once; within a period it drains smoothly between ticks.\n style={{ transition: remaining >= period ? \"none\" : \"stroke-dashoffset 1s linear\" }}\n />\n </svg>\n <span className={cn(\"text-[10px] font-semibold leading-none tabular-nums\", urgent ? \"text-destructive\" : \"text-muted-foreground\")}>{loading ? \"\" : remaining}</span>\n </span>\n );\n}\n\n/** Copies a code and says so on the spot for a moment. */\nexport function useCopied(): { copied: boolean; copy: (code: string) => Promise<void> } {\n const [copied, setCopied] = useState(false);\n const copyValue = useCopy();\n const t = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => void (t.current && clearTimeout(t.current)), []);\n return {\n copied,\n copy: async (code) => {\n const ok = await copyValue(code, \"One-time code\");\n if (!ok) return;\n setCopied(true);\n if (t.current) clearTimeout(t.current);\n t.current = setTimeout(() => setCopied(false), 1600);\n },\n };\n}\n\n/**\n * THE code: grouped digits in tabular numerals with its ring. Pressing it copies. While it loads it\n * shows a masked placeholder of the right length, so nothing jumps when it arrives.\n */\nexport function CodeButton({ live, digits, size = \"md\", label }: { live: LiveCode; digits: number; size?: \"md\" | \"lg\"; label: string }) {\n const { copied, copy } = useCopied();\n const shown = live.code ? groupCode(live.code) : maskedCode(digits);\n return (\n <button\n type=\"button\"\n disabled={!live.code}\n onClick={() => live.code && void copy(live.code)}\n aria-label={live.code ? `Copy ${label} code` : `Getting ${label} code`}\n title={live.code ? \"Copy\" : undefined}\n className={cn(\"group -mx-1.5 inline-flex max-w-full items-center gap-2.5 rounded-md px-1.5 py-1 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\", size === \"lg\" && \"gap-3\")}\n >\n <span className={cn(\"whitespace-nowrap font-mono font-medium tabular-nums tracking-[0.08em]\", size === \"lg\" ? \"text-2xl\" : \"text-[1.0625rem]\", live.code ? \"text-foreground\" : \"text-disabled-foreground\")}>{shown}</span>\n {copied ? (\n <span className=\"inline-flex size-6 items-center justify-center text-success\" role=\"status\" aria-label=\"Copied\">\n <CheckGlyph className=\"size-4\" />\n </span>\n ) : (\n <CountdownRing remaining={live.remaining} period={live.period} loading={!live.code} />\n )}\n </button>\n );\n}\n\n/** The copy button beside a code, for people who look for one. */\nexport function CopyCodeButton({ live, label }: { live: LiveCode; label: string }) {\n const { copied, copy } = useCopied();\n return <Button variant=\"quiet\" icon={copied ? <CheckGlyph /> : <CopyGlyph />} {...(copied ? { glyphTone: \"success\" as const } : {})} aria-label={`Copy ${label} code`} disabled={!live.code} onClick={() => live.code && void copy(live.code)} />;\n}\n","/**\n * What a person pastes, drops or scans, read locally so the screen can say at once whether it is\n * usable and WHICH account it is for — before anything is sent. The server\n * (`aidream/services/authenticator/otpauth.py` + `otp.py`) parses the same string again and is the\n * authority; keep SUPPORTED_DIGITS / SUPPORTED_ALGORITHMS / base32 cleaning in lockstep with it.\n * A preview that accepts what the server refuses is worse than no preview.\n *\n * The secret is never returned, stored, logged or rendered: only `raw` (the input, untouched, for\n * the enrol request) and the metadata leave this module.\n */\n\nexport const TOTP_DEFAULT_DIGITS = 6;\nexport const TOTP_DEFAULT_PERIOD = 30;\nexport const TOTP_DEFAULT_ALGORITHM = \"SHA1\";\n\nconst SUPPORTED_DIGITS = new Set([6, 7, 8]);\nconst SUPPORTED_ALGORITHMS = new Set([\"SHA1\", \"SHA256\", \"SHA512\"]);\nconst BASE32_RE = /^[A-Z2-7]+=*$/;\n\nexport interface ParsedEnrollment {\n /** The exact string to send to enrol — the input, trimmed, otherwise untouched. */\n raw: string;\n digits: number;\n period: number;\n algorithm: string;\n /** The service (`issuer=` or the `Issuer:` label prefix). */\n issuer: string | null;\n /** The account the codes are for — usually an email or username. */\n account: string | null;\n /** True for an otpauth address, false for a bare setup key. */\n fromUri: boolean;\n}\n\n/** Messages are layout: each fits one line (≤ 60 characters). */\nexport class InvalidEnrollmentInputError extends Error {}\n\nfunction assertUsableSecret(secret: string): void {\n const cleaned = secret.trim().replace(/[\\s-]/g, \"\").toUpperCase();\n if (!cleaned) throw new InvalidEnrollmentInputError(\"No setup key in that.\");\n if (!BASE32_RE.test(cleaned)) throw new InvalidEnrollmentInputError(\"Not a setup key. Copy it again from the site.\");\n // base32 carries 5 bits a character; under 8 characters is not a seed.\n if (cleaned.replace(/=+$/, \"\").length < 8) throw new InvalidEnrollmentInputError(\"That setup key is too short.\");\n}\n\nfunction splitLabel(label: string | null): { issuer: string | null; account: string | null } {\n if (!label) return { issuer: null, account: null };\n const idx = label.indexOf(\":\");\n if (idx === -1) return { issuer: null, account: label.trim() || null };\n return { issuer: label.slice(0, idx).trim() || null, account: label.slice(idx + 1).trim() || null };\n}\n\nfunction safeDecode(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\n/** Reads a bare base32 setup key or an `otpauth://totp/…` address. Throws `InvalidEnrollmentInputError`. */\nexport function parseEnrollmentInput(input: string): ParsedEnrollment {\n const text = (input ?? \"\").trim();\n if (!text) throw new InvalidEnrollmentInputError(\"Nothing to read yet.\");\n\n if (!/^otpauth:\\/\\//i.test(text)) {\n if (/^otpauth-migration:/i.test(text)) throw new InvalidEnrollmentInputError(\"That is an export of many accounts. Use one site's code.\");\n if (/^https?:\\/\\//i.test(text)) throw new InvalidEnrollmentInputError(\"That is a web link, not a setup code.\");\n assertUsableSecret(text);\n return { raw: text, digits: TOTP_DEFAULT_DIGITS, period: TOTP_DEFAULT_PERIOD, algorithm: TOTP_DEFAULT_ALGORITHM, issuer: null, account: null, fromUri: false };\n }\n\n // `URL` treats otpauth as an opaque scheme in some engines; read the parts by hand so every host agrees.\n const m = /^otpauth:\\/\\/([^/?#]*)\\/?([^?#]*)(?:\\?([^#]*))?/i.exec(text);\n if (!m) throw new InvalidEnrollmentInputError(\"That setup link is malformed.\");\n const type = (m[1] ?? \"\").toLowerCase();\n if (type === \"hotp\") throw new InvalidEnrollmentInputError(\"Counter codes (HOTP) are not supported.\");\n if (type !== \"totp\") throw new InvalidEnrollmentInputError(\"That setup link is malformed.\");\n const params = new URLSearchParams(m[3] ?? \"\");\n\n const secret = params.get(\"secret\");\n if (!secret) throw new InvalidEnrollmentInputError(\"That setup link has no secret.\");\n assertUsableSecret(secret);\n\n const digits = Number(params.get(\"digits\") ?? TOTP_DEFAULT_DIGITS);\n if (!SUPPORTED_DIGITS.has(digits)) throw new InvalidEnrollmentInputError(`${params.get(\"digits\")}-digit codes are not supported.`);\n const period = Number(params.get(\"period\") ?? TOTP_DEFAULT_PERIOD);\n if (!Number.isInteger(period) || period <= 0) throw new InvalidEnrollmentInputError(\"That setup link has a bad interval.\");\n const algorithm = (params.get(\"algorithm\") || TOTP_DEFAULT_ALGORITHM).trim().toUpperCase();\n if (!SUPPORTED_ALGORITHMS.has(algorithm)) throw new InvalidEnrollmentInputError(`${algorithm} codes are not supported yet.`);\n\n const fromLabel = splitLabel(safeDecode(m[2] ?? \"\") || null);\n const issuer = params.get(\"issuer\")?.trim() || fromLabel.issuer;\n return { raw: text, digits, period, algorithm, issuer: issuer || null, account: fromLabel.account, fromUri: true };\n}\n\n/** Never throws: the parse, or the one-line reason it failed. Empty input is neither. */\nexport function tryParseEnrollment(input: string): { parsed: ParsedEnrollment | null; error: string | null } {\n if (!input.trim()) return { parsed: null, error: null };\n try {\n return { parsed: parseEnrollmentInput(input), error: null };\n } catch (e) {\n return { parsed: null, error: e instanceof Error ? e.message : \"That could not be read.\" };\n }\n}\n\n/** \"GitHub · me@x.com\", \"GitHub\", or \"Setup key\". */\nexport function describeEnrollment(parsed: ParsedEnrollment): string {\n const parts = [parsed.issuer, parsed.account].filter((p): p is string => Boolean(p));\n return parts.length ? parts.join(\" · \") : \"Setup key\";\n}\n\n/** A code as people read it: 6 → \"123 456\", 8 → \"1234 5678\", 7 → \"1234 567\". */\nexport function groupCode(code: string): string {\n const c = code.replace(/\\s/g, \"\");\n if (c.length < 6) return c;\n const head = Math.ceil(c.length / 2);\n return `${c.slice(0, head)} ${c.slice(head)}`;\n}\n\n/** The placeholder a code of `digits` shows while it loads. */\nexport function maskedCode(digits = TOTP_DEFAULT_DIGITS): string {\n return groupCode(\"•\".repeat(Math.max(6, digits)));\n}\n\n/** The server's `label` holds the URI's raw `Issuer:account`; keep the account alone. */\nexport function accountOfLabel(label: string | null | undefined, issuer: string | null | undefined): string | null {\n const l = label?.trim();\n if (!l) return null;\n const idx = l.indexOf(\":\");\n if (idx === -1) return l.toLowerCase() === (issuer ?? \"\").trim().toLowerCase() ? null : l;\n const rest = l.slice(idx + 1).trim();\n return rest || null;\n}\n\nconst PLACEHOLDER_NAMES = [\"website login\", \"login\", \"authenticator\", \"one-time password\", \"new item\", \"untitled\"];\n\n/** Keeps a name a person typed; replaces a blank or placeholder name with what the code says. */\nexport function authenticatorName(current: string, parsed: Pick<ParsedEnrollment, \"issuer\" | \"account\">): string {\n const name = current.trim();\n if (name && !PLACEHOLDER_NAMES.includes(name.toLowerCase())) return name;\n return parsed.issuer || parsed.account || name || \"One-time password\";\n}\n\n/**\n * Which of these items an issuer most likely belongs to, by WEBSITE only (a name match once enrolled\n * a Google seed on an unrelated OAuth client). \"GitHub\" matches github.com and gist.github.com, never githubusercontent.com.\n */\nexport function matchIssuerToSite<T>(issuer: string | null, candidates: readonly T[], siteOf: (c: T) => string): T | null {\n const key = (issuer ?? \"\").toLowerCase().replace(/[^a-z0-9]/g, \"\");\n if (key.length < 2) return null;\n for (const c of candidates) {\n const host = siteOf(c).toLowerCase();\n if (!host) continue;\n const labels = host.split(\".\");\n // A whole label of the host: github in github.com, google in accounts.google.co.uk.\n if (labels.some((l) => l.replace(/[^a-z0-9]/g, \"\") === key)) return c;\n }\n return null;\n}\n","import { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\n\n/**\n * ONE clock for every code on screen, ticking on the second, so every ring in a list moves together\n * (separate per-row timers drift apart and look broken).\n */\nconst listeners = new Set<() => void>();\nlet second = Math.floor(Date.now() / 1000);\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nfunction subscribe(cb: () => void): () => void {\n listeners.add(cb);\n if (!timer) {\n second = Math.floor(Date.now() / 1000);\n timer = setInterval(() => {\n const s = Math.floor(Date.now() / 1000);\n if (s === second) return;\n second = s;\n for (const l of listeners) l();\n }, 200);\n }\n return () => {\n listeners.delete(cb);\n if (listeners.size === 0 && timer) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n\n/** The current whole second (epoch seconds), shared by every caller. */\nexport function useSecond(): number {\n return useSyncExternalStore(subscribe, () => second, () => second);\n}\n\nexport interface LiveCode {\n code: string | null;\n /** Seconds this code still lives. */\n remaining: number;\n period: number;\n error: string | null;\n retry: () => void;\n}\n\n/** A readable reason a code could not be read. */\nexport function codeErrorText(e: unknown): string {\n const status = (e as { status?: unknown } | null)?.status;\n if (status === 404) return \"No one-time password here.\";\n if (status === 401 || status === 403) return \"Not allowed to read this code.\";\n if (status === 409 || status === 423) return \"This one-time password is off.\";\n return e instanceof Error && e.message ? e.message : \"The code could not be read.\";\n}\n\n/**\n * The item's live code: fetched when shown, re-read the moment it expires, never while it is off.\n * Holds the code only in this component; nothing is cached across components.\n */\nexport function useLiveCode(port: VaultPort, item: Pick<VaultItem, \"id\" | \"owner\" | \"authenticator\">, enabled: boolean): LiveCode {\n const confirmed = useConfirmed();\n const now = useSecond();\n const period = item.authenticator?.period && item.authenticator.period > 0 ? item.authenticator.period : 30;\n const [state, setState] = useState<{ code: string; expiresAt: number } | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [round, setRound] = useState(0);\n const inflight = useRef(false);\n // The latest values the fetch needs, without restarting it when the parent re-renders.\n const latest = useRef({ port, item, confirmed });\n latest.current = { port, item, confirmed };\n\n useEffect(() => {\n if (!enabled) {\n setState(null);\n setError(null);\n return;\n }\n let live = true;\n inflight.current = true;\n const { port: p, item: it, confirmed: c } = latest.current;\n c(() => p.authenticator.code(it))\n .then((r) => {\n if (!live) return;\n setError(null);\n setState({ code: r.code, expiresAt: Math.floor(Date.now() / 1000) + r.remainingSeconds });\n })\n .catch((e: unknown) => {\n if (live) setError(wasCancelled(e) ? \"Confirm it's you to see this code.\" : codeErrorText(e));\n })\n .finally(() => {\n if (live) inflight.current = false;\n });\n return () => {\n live = false;\n inflight.current = false;\n };\n }, [enabled, item.id, round]);\n\n const remaining = state ? Math.max(0, state.expiresAt - now) : 0;\n useEffect(() => {\n if (enabled && state && remaining <= 0 && !inflight.current && !error) setRound((n) => n + 1);\n }, [enabled, state, remaining, error]);\n\n return {\n // An expired code is never shown as if it still works.\n code: state && remaining > 0 ? state.code : null,\n remaining,\n period,\n error,\n retry: () => {\n setError(null);\n setRound((n) => n + 1);\n },\n };\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Button, Field } from \"@ai-matrx/design-system/controls\";\nimport { CameraGlyph, CheckGlyph, QrGlyph } from \"../glyphs\";\nimport { Panel, Row } from \"../ui\";\nimport { describeEnrollment, tryParseEnrollment, type ParsedEnrollment } from \"./otpauth\";\nimport { canDecodeQrLocally, decodeQr, decodeQrFile, hasCamera, imageFrom } from \"./qr\";\n\n/** Whether this browser can scan with the camera (local detector + a camera API). */\nfunction useCanScan(): boolean {\n const [ok, setOk] = useState(false);\n useEffect(() => {\n let live = true;\n void canDecodeQrLocally().then((d) => live && setOk(d && hasCamera()));\n return () => {\n live = false;\n };\n }, []);\n return ok;\n}\n\n/** The camera, reading QR codes locally until it finds one. Frames never leave the device. */\nexport function QrScanPanel({ open, onResult, onClose }: { open: boolean; onResult: (text: string) => void; onClose: () => void }) {\n const video = useRef<HTMLVideoElement | null>(null);\n const [error, setError] = useState<string | null>(null);\n const done = useRef(onResult);\n done.current = onResult;\n\n useEffect(() => {\n if (!open) return;\n let stream: MediaStream | null = null;\n let live = true;\n let timer: ReturnType<typeof setTimeout> | null = null;\n setError(null);\n const stop = () => {\n if (timer) clearTimeout(timer);\n stream?.getTracks().forEach((t) => t.stop());\n stream = null;\n };\n const tick = async () => {\n const v = video.current;\n if (!live) return;\n if (v && v.readyState >= 2) {\n try {\n const text = await decodeQr(v);\n if (text && live) {\n live = false;\n stop();\n done.current(text);\n return;\n }\n } catch {\n // A frame that will not decode is a miss, not a failure.\n }\n }\n timer = setTimeout(() => void tick(), 200);\n };\n navigator.mediaDevices\n .getUserMedia({ video: { facingMode: { ideal: \"environment\" } }, audio: false })\n .then((s) => {\n if (!live) {\n s.getTracks().forEach((t) => t.stop());\n return;\n }\n stream = s;\n if (video.current) {\n video.current.srcObject = s;\n void video.current.play().catch(() => undefined);\n }\n void tick();\n })\n .catch((e: unknown) => {\n if (!live) return;\n const name = (e as { name?: string } | null)?.name;\n setError(name === \"NotAllowedError\" ? \"Camera access was not allowed.\" : name === \"NotFoundError\" ? \"No camera found.\" : \"The camera could not start.\");\n });\n return () => {\n live = false;\n stop();\n };\n }, [open]);\n\n return (\n <Panel title=\"Scan QR code\" open={open} onClose={onClose} size=\"sm\" footer={<Button variant=\"quiet\" onClick={onClose}>Cancel</Button>}>\n <div className=\"relative mx-auto aspect-square w-full max-w-sm overflow-hidden rounded-xl bg-muted\">\n <video ref={video} className=\"size-full object-cover\" playsInline muted aria-label=\"Camera\" />\n {error ? (\n <div className=\"absolute inset-0 flex items-center justify-center p-6 text-center text-sm text-destructive\">{error}</div>\n ) : (\n <div className=\"pointer-events-none absolute inset-[18%] rounded-lg border-2 border-primary\" aria-hidden />\n )}\n </div>\n <p className=\"text-center text-xs text-muted-foreground\">Point at the site's QR code</p>\n </Panel>\n );\n}\n\nexport interface OtpSetupRowProps {\n value: string;\n onChange: (value: string) => void;\n /** Row label. */\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n autoFocus?: boolean;\n /**\n * An image this browser cannot read locally. Given → the host sends it to the server's decoder\n * (`enrolQrImage`); absent → the person is asked to paste the key instead.\n */\n onImage?: (file: File) => void;\n /** Called with what a valid input says (issuer, account), e.g. to fill an empty name. */\n onRecognized?: (parsed: ParsedEnrollment) => void;\n /** Shown in place of the recognition line (e.g. \"QR image ready\", \"Adding…\"). */\n status?: ReactNode;\n}\n\n/**\n * ONE row to set up a one-time password: paste a setup key or otpauth address, choose or drop a QR\n * image, or scan with the camera. What it recognised (service · account) shows inside the field\n * before anything is saved; nothing about it leaves the browser until save.\n */\nexport function OtpSetupRow({ value, onChange, label = \"One-time password\", placeholder = \"Setup key or otpauth link\", disabled = false, autoFocus = false, onImage, onRecognized, status }: OtpSetupRowProps) {\n const file = useRef<HTMLInputElement | null>(null);\n const canScan = useCanScan();\n const [scanning, setScanning] = useState(false);\n const [reading, setReading] = useState(false);\n const [imageError, setImageError] = useState<string | null>(null);\n const [dragging, setDragging] = useState(false);\n const { parsed, error } = tryParseEnrollment(value);\n const recognised = useRef(onRecognized);\n recognised.current = onRecognized;\n const parsedKey = parsed ? `${parsed.issuer ?? \"\"}|${parsed.account ?? \"\"}|${parsed.raw.length}` : \"\";\n useEffect(() => {\n if (parsed) recognised.current?.(parsed);\n // Keyed on what it says (parsedKey), so it fires once per new recognition, never per render.\n }, [parsedKey]); // parsed is derived from value, which parsedKey summarises\n\n const takeText = (text: string) => {\n setImageError(null);\n onChange(text.trim());\n };\n\n const takeImage = async (f: File) => {\n setImageError(null);\n setReading(true);\n try {\n const text = await decodeQrFile(f);\n if (text) takeText(text);\n else if (await canDecodeQrLocally()) setImageError(\"No QR code found in that image.\");\n else if (onImage) onImage(f);\n else setImageError(\"Paste the setup key instead.\");\n } catch {\n setImageError(\"That image could not be read.\");\n } finally {\n setReading(false);\n }\n };\n\n const end = status ? (\n <span className=\"max-w-48 truncate text-xs text-muted-foreground\">{status}</span>\n ) : reading ? (\n <span className=\"text-xs text-muted-foreground\">Reading…</span>\n ) : imageError || error ? (\n <span className=\"max-w-56 truncate text-xs text-destructive\" title={imageError ?? error ?? undefined} role=\"alert\">\n {imageError ?? error}\n </span>\n ) : parsed ? (\n <span className=\"flex max-w-56 items-center gap-1 text-xs text-success\">\n <CheckGlyph className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{describeEnrollment(parsed)}</span>\n </span>\n ) : null;\n\n return (\n <div\n onDragOver={(e) => {\n if (disabled || !Array.from(e.dataTransfer.items).some((i) => i.kind === \"file\")) return;\n e.preventDefault();\n setDragging(true);\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(e) => {\n const f = imageFrom(e.dataTransfer);\n setDragging(false);\n if (!f || disabled) return;\n e.preventDefault();\n void takeImage(f);\n }}\n className={dragging ? \"rounded-lg bg-accent\" : undefined}\n >\n <Row\n label={label}\n actions={\n <>\n <Button variant=\"quiet\" icon={<QrGlyph />} aria-label=\"Choose QR image\" title=\"Choose or drop a QR image\" disabled={disabled || reading} onClick={() => file.current?.click()} />\n {canScan ? <Button variant=\"quiet\" icon={<CameraGlyph />} aria-label=\"Scan with camera\" title=\"Scan with camera\" disabled={disabled} onClick={() => setScanning(true)} /> : null}\n </>\n }\n >\n <Field\n className=\"w-full\"\n type=\"password\"\n value={value}\n onChange={(e) => takeText(e.target.value)}\n onPaste={(e) => {\n const f = imageFrom(e.clipboardData);\n if (!f) return;\n e.preventDefault();\n void takeImage(f);\n }}\n placeholder={placeholder}\n autoComplete=\"off\"\n spellCheck={false}\n autoFocus={autoFocus}\n disabled={disabled}\n aria-label=\"Setup key or otpauth link\"\n aria-invalid={Boolean(error || imageError) || undefined}\n end={end}\n />\n <input\n ref={file}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (f) void takeImage(f);\n }}\n />\n </Row>\n {canScan ? (\n <QrScanPanel\n open={scanning}\n onClose={() => setScanning(false)}\n onResult={(text) => {\n setScanning(false);\n takeText(text);\n }}\n />\n ) : null}\n </div>\n );\n}\n","/**\n * Reading a QR code IN THIS BROWSER with the platform's own `BarcodeDetector` (Chrome, Edge, Android,\n * the extension). The image and the camera frames never leave the device. Where the platform has no\n * detector, an image goes to the server's one-request decoder instead (`enrolQrImage`), and there is\n * no camera scan — the control is hidden, never dead.\n */\n\ninterface DetectedBarcode {\n rawValue: string;\n}\ninterface BarcodeDetectorLike {\n detect(source: ImageBitmapSource): Promise<DetectedBarcode[]>;\n}\ninterface BarcodeDetectorCtor {\n new (options?: { formats?: string[] }): BarcodeDetectorLike;\n getSupportedFormats?: () => Promise<string[]>;\n}\n\nfunction detectorCtor(): BarcodeDetectorCtor | null {\n const c = (globalThis as { BarcodeDetector?: BarcodeDetectorCtor }).BarcodeDetector;\n return typeof c === \"function\" ? c : null;\n}\n\nlet support: Promise<boolean> | null = null;\n\n/** True when this browser can read QR codes locally. */\nexport function canDecodeQrLocally(): Promise<boolean> {\n if (!support) {\n const C = detectorCtor();\n support = !C ? Promise.resolve(false) : C.getSupportedFormats ? C.getSupportedFormats().then((f) => f.includes(\"qr_code\"), () => false) : Promise.resolve(true);\n }\n return support;\n}\n\n/** True when a camera can be asked for (it may still be refused). */\nexport function hasCamera(): boolean {\n return typeof navigator !== \"undefined\" && typeof navigator.mediaDevices?.getUserMedia === \"function\";\n}\n\nlet detector: BarcodeDetectorLike | null = null;\nfunction qrDetector(): BarcodeDetectorLike | null {\n const C = detectorCtor();\n if (!C) return null;\n detector ??= new C({ formats: [\"qr_code\"] });\n return detector;\n}\n\n/** The text of the first QR code in the source, or null when there is none (or no local detector). */\nexport async function decodeQr(source: ImageBitmapSource): Promise<string | null> {\n const d = qrDetector();\n if (!d) return null;\n const found = await d.detect(source);\n return found.find((b) => b.rawValue)?.rawValue ?? null;\n}\n\n/** Reads an image file locally. `null` = no detector here or no code in the image. */\nexport async function decodeQrFile(file: Blob): Promise<string | null> {\n if (!(await canDecodeQrLocally())) return null;\n const bitmap = await createImageBitmap(file);\n try {\n return await decodeQr(bitmap);\n } finally {\n bitmap.close();\n }\n}\n\n/** The first image in a paste or drop, if any. */\nexport function imageFrom(data: DataTransfer | null): File | null {\n if (!data) return null;\n for (const f of Array.from(data.files)) if (f.type.startsWith(\"image/\")) return f;\n for (const it of Array.from(data.items)) {\n if (it.kind === \"file\" && it.type.startsWith(\"image/\")) {\n const f = it.getAsFile();\n if (f) return f;\n }\n }\n return null;\n}\n","import { useState } from \"react\";\nimport { Button, Select } from \"@ai-matrx/design-system/controls\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { MoreGlyph, PowerGlyph, TrashGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Row } from \"../ui\";\nimport { CodeButton, CopyCodeButton } from \"./CodeParts\";\nimport { useLiveCode } from \"./live-code\";\nimport { mfaMethodOf, type MfaMethod } from \"./port\";\nimport { OtpSetupRow } from \"./Setup\";\n\n/** The reason an authenticator change failed, in one line. */\nexport function otpActionError(e: unknown, what: string): string {\n const status = (e as { status?: unknown } | null)?.status;\n if (status === 404) return \"There is no one-time password here.\";\n if (status === 403) return `Not allowed to ${what}.`;\n return e instanceof Error && e.message ? e.message : `Could not ${what}.`;\n}\n\n/** The shared enable / disable / remove behaviour, with \"Confirm it's you\" when the server asks. */\nexport function useOtpActions(port: VaultPort, item: VaultItem, onChanged?: (next?: VaultItem | null) => void) {\n const confirmed = useConfirmed();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [enabledNow, setEnabledNow] = useState<boolean | null>(null);\n const [removed, setRemoved] = useState(false);\n const enabled = enabledNow ?? item.authenticator?.enabled ?? false;\n\n const run = async (what: string, op: () => Promise<void>) => {\n setBusy(true);\n setError(null);\n try {\n await op();\n } catch (e) {\n if (!wasCancelled(e)) setError(otpActionError(e, what));\n } finally {\n setBusy(false);\n }\n };\n\n return {\n busy,\n error,\n enabled,\n removed,\n clearError: () => setError(null),\n setEnabled: (on: boolean) =>\n run(on ? \"turn it on\" : \"turn it off\", async () => {\n const entry = await confirmed(() => port.authenticator.setEnabled(item, on));\n setEnabledNow(entry.enabled);\n onChanged?.(item.authenticator ? { ...item, authenticator: { ...item.authenticator, enabled: entry.enabled } } : undefined);\n }),\n remove: async () => {\n const ok = await confirm({\n title: `Remove the one-time password for ${item.name}?`,\n description: \"Codes stop here. Two-factor stays on at the site, and your phone app and backup codes still work.\",\n confirmLabel: \"Remove\",\n variant: \"destructive\",\n });\n if (!ok) return;\n await run(\"remove it\", async () => {\n await confirmed(() => port.authenticator.remove(item));\n setRemoved(true);\n onChanged?.({ ...item, authenticator: null });\n });\n },\n };\n}\n\nexport interface TotpRowProps {\n port: VaultPort;\n /** The item; it must have `authenticator`. */\n item: VaultItem;\n /** After enable / disable / remove: the item as it now is. */\n onChanged?: (next?: VaultItem | null) => void;\n}\n\n/** The item view's one-time password: the live code with its ring, copy, and a menu to turn it off or remove it. */\nexport function TotpRow({ port, item, onChanged }: TotpRowProps) {\n const a = useOtpActions(port, item, onChanged);\n const live = useLiveCode(port, item, a.enabled && !a.removed);\n const canManage = item.capabilities.canManage || item.capabilities.canEdit;\n if (a.removed || !item.authenticator) return null;\n\n const menu = canManage ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"One-time password options\" disabled={a.busy} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n <DropdownMenuItem onSelect={() => void a.setEnabled(!a.enabled)}>\n <PowerGlyph className=\"size-4\" />\n {a.enabled ? \"Turn off\" : \"Turn on\"}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"text-destructive focus:text-destructive\" onSelect={() => void a.remove()}>\n <TrashGlyph className=\"size-4\" />\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null;\n\n return (\n <Row\n label=\"One-time password\"\n actions={\n <>\n {a.enabled ? <CopyCodeButton live={live} label={item.name} /> : null}\n {menu}\n </>\n }\n >\n {a.error ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm text-destructive\" role=\"alert\">{a.error}</span>\n <Button variant=\"quiet\" onClick={a.clearError}>Dismiss</Button>\n </span>\n ) : !a.enabled ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"text-sm text-disabled-foreground\">Off</span>\n {canManage ? <Button variant=\"quiet\" icon={<PowerGlyph />} disabled={a.busy} onClick={() => void a.setEnabled(true)}>Turn on</Button> : null}\n </span>\n ) : live.error ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm text-destructive\" title={live.error}>{live.error}</span>\n <Button variant=\"quiet\" onClick={live.retry}>Retry</Button>\n </span>\n ) : (\n <CodeButton live={live} digits={item.authenticator.digits} label={item.name} />\n )}\n </Row>\n );\n}\n\nexport interface TotpEditRowProps {\n /** The draft's setup key / otpauth link (`ItemDraft.authenticator`). */\n value: string;\n onChange: (value: string) => void;\n /** The item already has a one-time password (a new one replaces it). */\n hasExisting: boolean;\n /**\n * The saved item being edited. With `port`, an image this browser cannot read locally is sent to\n * the server's decoder at once (the draft cannot carry an image). Absent (new item): paste instead.\n */\n item?: VaultItem | null;\n port?: VaultPort;\n /** After an image was enrolled directly: the item as it now is. */\n onEnrolled?: (next?: VaultItem | null) => void;\n /** What a valid input says (service, account) — e.g. to fill an empty name. */\n onRecognized?: (parsed: { issuer: string | null; account: string | null }) => void;\n}\n\n/** Edit and new: ONE row — paste a key or link, choose or drop a QR image, or scan with the camera. */\nexport function TotpEditRow({ value, onChange, hasExisting, item, port, onEnrolled, onRecognized }: TotpEditRowProps) {\n const confirmed = useConfirmed();\n const [status, setStatus] = useState<string | null>(null);\n const uploadImage =\n item && port\n ? async (file: File) => {\n setStatus(\"Adding from image…\");\n try {\n const entry = await confirmed(() => port.authenticator.enrolQrImage(item, file, file.name));\n setStatus(entry.issuer ? `Added · ${entry.issuer}` : \"Added\");\n onChange(\"\");\n onEnrolled?.({ ...item, authenticator: { digits: entry.digits, period: entry.period, enabled: entry.enabled } });\n } catch (e) {\n setStatus(wasCancelled(e) ? null : otpActionError(e, \"read that image\"));\n }\n }\n : undefined;\n return (\n <OtpSetupRow\n value={value}\n onChange={(v) => {\n setStatus(null);\n onChange(v);\n }}\n placeholder={hasExisting ? \"Paste a new key to replace\" : \"Setup key or otpauth link\"}\n status={status}\n {...(uploadImage ? { onImage: (f: File) => void uploadImage(f) } : {})}\n {...(onRecognized ? { onRecognized } : {})}\n />\n );\n}\n\nconst MFA_OPTIONS = [\n { value: \"none\", label: \"Not recorded\" },\n { value: \"sms\", label: \"Text message\" },\n { value: \"push_or_other\", label: \"Other method\" },\n] as const;\n\n/**\n * A login whose site uses two-factor WITHOUT an app code (a text message, a push): recording it tells\n * agents to hand control back at the verification step instead of failing. Show it when the item has\n * no one-time password.\n */\nexport function TwoFactorMethodRow({ port, item, onChanged }: { port: VaultPort; item: VaultItem; onChanged?: (next?: VaultItem | null) => void }) {\n const [value, setValue] = useState<MfaMethod | null>(mfaMethodOf(item));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const canEdit = item.capabilities.canEdit || item.capabilities.canManage;\n return (\n <Row label=\"Two-factor\" hint={error ? <span className=\"text-destructive\">{error}</span> : undefined}>\n <Select\n value={value ?? \"none\"}\n disabled={!canEdit || busy}\n aria-label=\"Two-factor method\"\n options={MFA_OPTIONS.map((o) => ({ value: o.value, label: o.label }))}\n onValueChange={async (v: string) => {\n const next: MfaMethod | null = v === \"sms\" || v === \"push_or_other\" ? v : null;\n const before = value;\n setValue(next);\n setBusy(true);\n setError(null);\n try {\n onChanged?.(await port.authenticator.setMfaMethod(item, next));\n } catch (e) {\n setValue(before);\n setError(otpActionError(e, \"save that\"));\n } finally {\n setBusy(false);\n }\n }}\n />\n </Row>\n );\n}\n","import type { VaultItem } from \"../model\";\nimport type { TotpReading } from \"../port\";\n\n/** One account's one-time password as the server reports it. Metadata only: never a seed. */\nexport interface AuthenticatorEntry {\n itemId: string;\n /** The login's name (the server has no separate authenticator name). */\n name: string;\n issuer: string | null;\n /** The account the codes are for, from the setup address (`me@x.com`). */\n account: string | null;\n digits: number;\n period: number;\n algorithm: string;\n enabled: boolean;\n loginUrls: string[];\n}\n\n/**\n * A two-factor method that is NOT an app code, recorded on the login as the plaintext custom field\n * `mfa_method` so agents know to hand control back at the verification step.\n */\nexport type MfaMethod = \"sms\" | \"push_or_other\";\nexport const MFA_METHOD_KEY = \"mfa_method\";\n\ntype ItemRef = Pick<VaultItem, \"id\" | \"owner\">;\n\n/**\n * One-time passwords: every code, enrol by key / otpauth address / QR image, enable, disable,\n * rename, remove, and the recorded non-app method. Every call may reject; enrol and remove may\n * reject with \"sign in again\" — wrap them in `useConfirmed()`.\n */\nexport interface AuthenticatorPort {\n /** Every account the signed-in person holds a one-time password for. */\n list(): Promise<AuthenticatorEntry[]>;\n /** null when the item has none. */\n get(item: ItemRef): Promise<AuthenticatorEntry | null>;\n /** The current code and how long it lives. */\n code(item: ItemRef & Pick<VaultItem, \"authenticator\">): Promise<TotpReading>;\n /** A base32 setup key or a full `otpauth://totp/…` address. Needs a recent sign-in. */\n enrol(item: ItemRef, input: string): Promise<AuthenticatorEntry>;\n /** A QR image the server decodes in-request and drops. For hosts that cannot decode locally. */\n enrolQrImage(item: ItemRef, image: Blob, fileName?: string): Promise<AuthenticatorEntry>;\n /** On/off. Takes effect on the next code. */\n setEnabled(item: ItemRef, enabled: boolean): Promise<AuthenticatorEntry>;\n /** Deletes the seed. Two-factor stays on at the site; the phone app and backup codes still work. */\n remove(item: ItemRef): Promise<void>;\n /** Renames the login the code belongs to. */\n rename(item: ItemRef, name: string): Promise<VaultItem>;\n /** Records (or clears, with null) a non-app two-factor method on the login. */\n setMfaMethod(item: ItemRef & Pick<VaultItem, \"custom\">, method: MfaMethod | null): Promise<VaultItem>;\n}\n\n/** The recorded non-app method on an item, if any. */\nexport function mfaMethodOf(item: Pick<VaultItem, \"custom\">): MfaMethod | null {\n const v = item.custom.find((c) => c.key === MFA_METHOD_KEY)?.value;\n return v === \"sms\" ? \"sms\" : v ? \"push_or_other\" : null;\n}\n","/**\n * Field settings (`?panel=field:<fieldId>`) and item settings (`?panel=settings`).\n *\n * Ported with no rule lost from matrx-frontend `VaultItemDetail.tsx` (FieldRow metadata,\n * DestinationSection) and `VaultHandlingControl.tsx`: who can see a value (sealing is permanent\n * and confirmed by name), env key, sandbox use (needs an env key), editable, active, description;\n * website matching, browser fill, and moving an encrypted address into the item's websites.\n * Every change saves on its own and the panel shows the item as the server now has it.\n */\nimport { useRef, useState, type ReactNode } from \"react\";\nimport { Badge, Button, DisclosureHeader, Field, SegmentedControl, Select, Switch } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { GlobeGlyph, LockGlyph, SlidersGlyph } from \"../glyphs\";\nimport type { FieldHandling, UriMatchMode, VaultField, VaultItem } from \"../model\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport type { FieldSettingsPatch } from \"./port\";\nimport { HANDLING_WORDS, MATCH_MODES, MATCH_WORDS, envKeyProblem, handlingChoices, normalizeLoginUrl, promotableUrlFields, sandboxBlocker, sealConfirmation } from \"./rules\";\n\nconst say = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\n\n/** One saving action at a time, its failure said in the panel, never swallowed. */\nfunction useSaver(onChanged: (next: VaultItem) => void) {\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const save = async (what: string, step: () => Promise<VaultItem | null>): Promise<boolean> => {\n setBusy(what);\n setError(null);\n try {\n const next = await step();\n if (next) onChanged(next);\n return true;\n } catch (e) {\n if (!wasCancelled(e)) setError(say(e, \"That didn’t save. Try again.\"));\n return false;\n } finally {\n setBusy(null);\n }\n };\n return { busy, error, setError, save };\n}\n\nfunction Problem({ children }: { children: ReactNode }) {\n return (\n <p role=\"alert\" className=\"px-1 text-sm text-destructive\">\n {children}\n </p>\n );\n}\n\nconst quietHint = (text: string, tone: \"muted\" | \"destructive\" = \"muted\") => (\n <span className={tone === \"destructive\" ? \"text-destructive\" : undefined} title={text}>\n {text}\n </span>\n);\n\n// ── field settings ──────────────────────────────────────────────────────────\n\n/** `panel=field:<fieldId>` — `arg` is the field id. */\nexport function FieldSettingsPanel(props: ItemPanelProps) {\n const field = props.item.fields.find((f) => f.id === props.arg);\n if (!field)\n return (\n <Panel title=\"Field settings\" size=\"md\" onClose={props.onClose} footer={<Button variant=\"primary\" onClick={props.onClose}>Done</Button>}>\n <Empty>This field is no longer on the item.</Empty>\n </Panel>\n );\n return <FieldSettings key={field.id} {...props} field={field} />;\n}\n\nfunction FieldSettings({ item, port, field, onClose, onChanged }: ItemPanelProps & { field: VaultField }) {\n const { busy, error, setError, save } = useSaver((next) => onChanged(next));\n const [envDraft, setEnvDraft] = useState(field.envKey ?? \"\");\n const [descDraft, setDescDraft] = useState(field.description);\n const envRef = useRef<HTMLInputElement>(null);\n const canEdit = item.capabilities.canEdit;\n const envProblem = envKeyProblem(envDraft);\n const blocker = sandboxBlocker(envDraft, field.envKey);\n\n const update = (what: string, patch: FieldSettingsPatch) => save(what, () => port.fields.updateField(item, field.id, patch));\n\n const chooseHandling = async (next: FieldHandling) => {\n if (next === field.handling) return;\n if (next === \"sealed\") {\n const words = sealConfirmation(field);\n if (!(await confirm({ ...words, variant: \"destructive\" }))) return;\n }\n await update(\"handling\", { handling: next });\n };\n\n const commitEnvKey = async () => {\n const next = envDraft.trim();\n if (next === (field.envKey ?? \"\") || envProblem) return;\n // Removing the env key would leave sandbox use pointing at nothing: turn that off with it.\n await update(\"envKey\", next ? { envKey: next } : { envKey: null, ...(field.injectIntoSandbox ? { injectIntoSandbox: false } : {}) });\n };\n\n const commitDescription = async () => {\n if (descDraft.trim() === field.description.trim()) return;\n await update(\"description\", { description: descDraft });\n };\n\n const setSandbox = async (on: boolean) => {\n if (on && blocker) {\n setError(blocker === \"Needs an env key\" ? \"Add an env key first: sandboxes see a value by its env key.\" : \"Fix the env key first.\");\n envRef.current?.focus();\n return;\n }\n const envChanged = envDraft.trim() !== (field.envKey ?? \"\");\n await update(\"sandbox\", { injectIntoSandbox: on, ...(on && envChanged ? { envKey: envDraft.trim() } : {}) });\n };\n\n const handling = HANDLING_WORDS[field.handling];\n const locked = !canEdit || busy !== null;\n\n return (\n <Panel title={`${field.label} settings`} size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Done</Button>}>\n {!canEdit ? <p className=\"px-1 text-sm text-muted-foreground\">View only: you can’t change these settings.</p> : null}\n\n <Section title=\"Who can see it\">\n <Row label=\"Value\" hint={quietHint(handling.hint)}>\n {field.handling === \"sealed\" ? (\n <Badge icon={<LockGlyph />}>Sealed for good</Badge>\n ) : (\n <SegmentedControl<FieldHandling>\n aria-label=\"Who can see it\"\n value={field.handling}\n onValueChange={(v) => void chooseHandling(v)}\n data={handlingChoices(field.handling).map((h) => ({ value: h, label: HANDLING_WORDS[h].label, title: HANDLING_WORDS[h].hint, disabled: locked }))}\n />\n )}\n </Row>\n </Section>\n\n <Section title=\"Automation\">\n <Row label=\"Env key\" hint={envProblem ? quietHint(envProblem, \"destructive\") : quietHint(\"The name sandboxes and workflows use\")}>\n <Field\n ref={envRef}\n className=\"w-full font-mono\"\n aria-label=\"Env key\"\n aria-invalid={Boolean(envProblem)}\n placeholder=\"e.g. GITHUB_TOKEN\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={locked}\n value={envDraft}\n onChange={(e) => setEnvDraft(e.target.value)}\n onBlur={() => void commitEnvKey()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n if (e.key === \"Escape\") setEnvDraft(field.envKey ?? \"\");\n }}\n />\n </Row>\n <Row label=\"Use in sandbox\" hint={blocker && !field.injectIntoSandbox ? quietHint(blocker) : quietHint(\"Sandboxes get it as an env variable\")}>\n <Switch aria-label=\"Use in sandbox\" checked={field.injectIntoSandbox} disabled={locked} onCheckedChange={(v) => void setSandbox(v)} />\n </Row>\n </Section>\n\n <Section title=\"Field\">\n <Row label=\"Description\">\n <Field\n className=\"w-full\"\n aria-label=\"Description\"\n placeholder=\"What it’s for\"\n disabled={locked}\n value={descDraft}\n onChange={(e) => setDescDraft(e.target.value)}\n onBlur={() => void commitDescription()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n if (e.key === \"Escape\") setDescDraft(field.description);\n }}\n />\n </Row>\n <Row label=\"Editable\" hint={quietHint(field.editable ? \"The value can be changed\" : \"The value is locked\")}>\n <Switch aria-label=\"Editable\" checked={field.editable} disabled={locked} onCheckedChange={(v) => void update(\"editable\", { editable: v })} />\n </Row>\n <Row label=\"Active\" hint={quietHint(field.active ? \"In use\" : \"Kept, but nothing uses it\")}>\n <Switch aria-label=\"Active\" checked={field.active} disabled={locked} onCheckedChange={(v) => void update(\"active\", { active: v })} />\n </Row>\n </Section>\n\n {error ? <Problem>{error}</Problem> : null}\n </Panel>\n );\n}\n\n// ── item settings ───────────────────────────────────────────────────────────\n\n/** `panel=settings` — how the browser treats this item, plus each field's settings behind Advanced. */\nexport function ItemSettingsPanel({ item, port, onClose, onChanged, onPanel }: ItemPanelProps) {\n const { busy, error, save } = useSaver((next) => onChanged(next));\n const confirmed = useConfirmed();\n const [advanced, setAdvanced] = useState(false);\n const canEdit = item.capabilities.canEdit;\n const hasWebsite = item.loginUrls.length > 0;\n const promotable = canEdit ? promotableUrlFields(item) : [];\n const locked = !canEdit || busy !== null;\n\n const promote = async (field: VaultField) => {\n const ok = await confirm({\n title: `Use ${field.label} as a website?`,\n description: \"The address will be stored unencrypted so the browser can match it.\",\n confirmLabel: \"Use as website\",\n });\n if (!ok) return;\n await save(`promote:${field.id}`, async () => {\n const raw = await confirmed(() => port.reveal(item, field.key));\n const url = normalizeLoginUrl(raw);\n if (!url) throw new Error(`${field.label} doesn’t hold a website.`);\n if (item.loginUrls.includes(url)) throw new Error(\"That address is already one of its websites.\");\n return port.fields.updateItem(item, { loginUrls: [...item.loginUrls, url] });\n });\n };\n\n const fillHint = !hasWebsite ? \"Add a website first\" : item.browserFillEnabled ? \"Offered on matching pages\" : \"Never filled automatically\";\n\n return (\n <Panel title=\"Item settings\" size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Done</Button>}>\n {!canEdit ? <p className=\"px-1 text-sm text-muted-foreground\">View only: you can’t change these settings.</p> : null}\n\n <Section title=\"In the browser\">\n <Row label=\"Website matching\" hint={quietHint(MATCH_WORDS[item.uriMatchMode].hint)}>\n <Select<UriMatchMode>\n aria-label=\"Website matching\"\n disabled={locked}\n value={item.uriMatchMode}\n options={MATCH_MODES.map((m) => ({ value: m, label: MATCH_WORDS[m].label }))}\n onValueChange={(m) => void save(\"match\", () => port.fields.updateItem(item, { uriMatchMode: m }))}\n />\n </Row>\n <Row label=\"Fill in browser\" hint={quietHint(fillHint)}>\n <Switch aria-label=\"Fill in browser\" checked={hasWebsite && item.browserFillEnabled} disabled={locked || !hasWebsite} onCheckedChange={(v) => void save(\"fill\", () => port.fields.updateItem(item, { browserFillEnabled: v }))} />\n </Row>\n {promotable.map((f) => (\n <Row\n key={f.id}\n label={f.label}\n hint={quietHint(\"Encrypted, so the browser can’t match it\")}\n actions={\n <Button variant=\"outline\" icon={<GlobeGlyph />} disabled={locked} onClick={() => void promote(f)}>\n Use as website\n </Button>\n }\n >\n <span className=\"text-muted-foreground\">Not a website yet</span>\n </Row>\n ))}\n </Section>\n\n <div className=\"flex flex-col gap-1.5\">\n <DisclosureHeader open={advanced} title=\"Advanced\" meta={item.fields.length ? `${item.fields.length} fields` : undefined} onClick={() => setAdvanced((a) => !a)} />\n {advanced ? (\n <Section>\n {item.fields.length === 0 ? (\n <Empty>No encrypted fields.</Empty>\n ) : (\n item.fields.map((f) => (\n <Row\n key={f.id}\n label={f.label}\n actions={<Button variant=\"quiet\" icon={<SlidersGlyph />} aria-label={`${f.label} settings`} onClick={() => onPanel(`field:${f.id}`)} />}\n >\n <span className=\"block truncate\">\n <span className={f.handling === \"sealed\" ? \"text-foreground\" : \"text-muted-foreground\"}>{HANDLING_WORDS[f.handling].label}</span>\n {f.envKey ? <span className=\"font-mono text-muted-foreground\"> · {f.envKey}</span> : null}\n {f.injectIntoSandbox ? <span className=\"text-muted-foreground\"> · Sandbox</span> : null}\n {!f.active ? <span className=\"text-disabled-foreground\"> · Off</span> : null}\n </span>\n </Row>\n ))\n )}\n </Section>\n ) : null}\n </div>\n\n {error ? <Problem>{error}</Problem> : null}\n </Panel>\n );\n}\n","/**\n * The fields area's rules in one place, pure, so every screen and every test reads the same words.\n * Ported from matrx-frontend `features/secrets` (types.ts, utils.ts, VaultHandlingControl.tsx,\n * VaultItemDetail.tsx) with no rule dropped.\n */\nimport type { FieldHandling, UriMatchMode, VaultField, VaultItem } from \"../model\";\nimport type { DestinationResult, FieldsPort } from \"./port\";\n\n/** An env key is a shell variable name. */\nexport const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** What is wrong with an env key draft, or null. Empty is fine (it means \"no env key\"). */\nexport function envKeyProblem(draft: string): string | null {\n const v = draft.trim();\n if (!v) return null;\n return ENV_KEY_RE.test(v) ? null : \"Letters, digits and _ only; not a digit first\";\n}\n\n/** A sandbox can only see a field by its env key: turning sandbox use on needs a valid one. */\nexport function sandboxBlocker(envKeyDraft: string, savedEnvKey: string | null): string | null {\n const effective = envKeyDraft.trim() || savedEnvKey || \"\";\n if (!effective) return \"Needs an env key\";\n if (!ENV_KEY_RE.test(effective)) return \"Fix the env key first\";\n return null;\n}\n\n/** Who can see a field's value, in plain words. Every value is encrypted at rest either way. */\nexport const HANDLING_WORDS: Record<FieldHandling, { label: string; hint: string }> = {\n visible: { label: \"Anyone\", hint: \"Anyone who can use it can show or copy it\" },\n revealable: { label: \"On request\", hint: \"Showing or copying it needs reveal access\" },\n sealed: { label: \"Sealed\", hint: \"No one can see it. Automation can still use it.\" },\n};\n\n/** The handlings a field may move to. Sealed is a one-way door: nothing leaves it. */\nexport function handlingChoices(current: FieldHandling): readonly FieldHandling[] {\n return current === \"sealed\" ? [\"sealed\"] : [\"visible\", \"revealable\", \"sealed\"];\n}\n\n/** The words of the permanent-seal confirmation, naming exactly what is lost. */\nexport function sealConfirmation(field: Pick<VaultField, \"label\" | \"envKey\" | \"key\">): { title: string; description: string; confirmLabel: string } {\n const name = field.label || field.envKey || field.key;\n return {\n title: `Seal ${name} permanently?`,\n description: `No one will ever see ${name} again, including you. Automation can still use it.`,\n confirmLabel: \"Seal permanently\",\n };\n}\n\n/** How the browser decides this item matches a page, in plain words. */\nexport const MATCH_WORDS: Record<UriMatchMode, { label: string; hint: string }> = {\n host: { label: \"This site\", hint: \"Any page on this exact site\" },\n domain: { label: \"Whole domain\", hint: \"Also its sister sites, like all of google.com\" },\n exact: { label: \"Exact address\", hint: \"Only this exact address\" },\n never: { label: \"Never\", hint: \"Never suggest or fill it automatically\" },\n};\nexport const MATCH_MODES: readonly UriMatchMode[] = [\"host\", \"domain\", \"exact\", \"never\"];\n\n/** Encrypted fields that older types used for a website; the browser can never match those. */\nexport const PROMOTABLE_URL_FIELD_KEYS = [\"account_url\", \"site_url\", \"panel_url\", \"portal_url\"] as const;\n\nexport function promotableUrlFields(item: VaultItem): VaultField[] {\n return item.fields.filter((f) => (PROMOTABLE_URL_FIELD_KEYS as readonly string[]).includes(f.key) && f.active && f.handling !== \"sealed\");\n}\n\n// ── websites ────────────────────────────────────────────────────────────────\n\n/** A typed website as it is stored: a bare host becomes https; query and fragment are dropped. */\nexport function normalizeLoginUrl(input: string): string | null {\n const candidate = input.trim();\n if (!candidate) return null;\n try {\n const parsed = new URL(/^[a-z][a-z\\d+.-]*:/i.test(candidate) ? candidate : `https://${candidate}`);\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") return null;\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return null;\n }\n}\n\n/** What a website check found, ready for a row under the field. */\nexport interface DestinationCheck {\n /** What to store (normalized); \"\" when the input is not a website at all. */\n url: string;\n tone: \"success\" | \"warning\" | \"destructive\";\n message: string;\n state: DestinationResult[\"state\"] | \"offline\";\n}\n\nexport function describeDestination(r: DestinationResult): DestinationCheck {\n if (r.state === \"reachable\") return { url: r.normalizedUrl, state: r.state, tone: \"success\", message: \"Website confirmed\" };\n if (r.state === \"invalid\") return { url: r.normalizedUrl, state: r.state, tone: \"destructive\", message: \"Not a public website\" };\n if (r.state === \"not_found\") return { url: r.normalizedUrl, state: r.state, tone: \"warning\", message: \"Site answered, but this page was not found\" };\n return { url: r.normalizedUrl, state: r.state, tone: \"warning\", message: \"Couldn’t confirm it. You can still save it.\" };\n}\n\n/**\n * Normalize a typed website and ask the server whether it answers. Advisory only: saving never\n * waits on it. Call on blur; drop the answer if the person typed again since (compare `url`).\n */\nexport async function checkDestination(port: { fields: Pick<FieldsPort, \"checkDestination\"> }, input: string, item?: VaultItem): Promise<DestinationCheck | null> {\n if (!input.trim()) return null;\n const url = normalizeLoginUrl(input);\n if (!url) return { url: \"\", state: \"invalid\", tone: \"destructive\", message: \"Enter a website, like npmjs.com\" };\n try {\n return describeDestination(await port.fields.checkDestination(url, item));\n } catch {\n return { url, state: \"offline\", tone: \"warning\", message: \"Couldn’t check right now. You can still save it.\" };\n }\n}\n\n// ── recovery codes ──────────────────────────────────────────────────────────\n\nexport const RECOVERY_CODES_KEY = \"recovery_codes\";\n\nexport const isRecoveryCodesField = (f: Pick<VaultField, \"key\">) => f.key === RECOVERY_CODES_KEY;\n\n/** The codes stored in one encrypted field: one per line, blanks dropped. */\nexport function parseRecoveryCodes(value: string): string[] {\n return value.split(/\\r?\\n/).map((c) => c.trim()).filter(Boolean);\n}\n\n/**\n * \"Mark used\" removes that one code from the stored set, so it can never be chosen again.\n * `null` means none are left: the field itself goes.\n */\nexport function withoutCode(codes: readonly string[], index: number): string | null {\n const left = codes.filter((_, i) => i !== index);\n return left.length ? left.join(\"\\n\") : null;\n}\n","/**\n * THE password generator — one for every host. `GenerateButton` sits beside a secret field and\n * opens it in a popover; \"Use\" hands the value back. The value is crypto-random (kit engine),\n * masked until revealed, and dropped 30 seconds after it was made if nobody uses it.\n *\n * The organization's ceilings (`vault.generator.*` knobs) come from the host through\n * `GeneratorLimitsProvider` (or the `limits` prop): the knobs are read by the host's own data\n * client. A host with no limits source shows no button — never a dead one.\n */\nimport { createContext, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Popover, PopoverContent, PopoverTrigger, cn } from \"@ai-matrx/design-system\";\nimport { Button, NumberStepper, SegmentedControl, Select, Switch } from \"@ai-matrx/design-system/controls\";\nimport { useCopy } from \"../notice\";\nimport { CopyGlyph, EyeGlyph, EyeOffGlyph, KeyGlyph, RefreshGlyph } from \"../glyphs\";\nimport {\n DEFAULT_SETTINGS,\n GENERATED_VALUE_TTL_MS,\n MIN_PASSPHRASE_WORDS,\n SEPARATORS,\n clampSettings,\n generate,\n minPasswordLength,\n parseGeneratorLimits,\n refusalMessage,\n strengthOf,\n type CredentialGenerationLimits,\n type GeneratorKind,\n type GeneratorSettings,\n type PassphraseSeparator,\n type PasswordSettings,\n} from \"./generate\";\n\n/** Reads the organization's ceilings. Raw knob values are fine: they are validated here. */\nexport type GeneratorLimitsSource = () => Promise<{ maxPasswordLength?: unknown; maxPassphraseWords?: unknown } | null>;\n\nconst LimitsCtx = createContext<GeneratorLimitsSource | null>(null);\n\n/** Hosts wrap the vault once: `<GeneratorLimitsProvider resolve={readKnobs}>`. */\nexport function GeneratorLimitsProvider({ resolve, children }: { resolve: GeneratorLimitsSource | undefined; children: ReactNode }) {\n return <LimitsCtx.Provider value={resolve ?? null}>{children}</LimitsCtx.Provider>;\n}\n\nexport function useGeneratorLimitsSource(): GeneratorLimitsSource | null {\n return useContext(LimitsCtx);\n}\n\ninterface Candidate {\n value: string;\n bits: number;\n}\n\ntype LimitsState = { state: \"loading\" } | { state: \"ready\"; limits: CredentialGenerationLimits } | { state: \"unavailable\"; message: string };\n\nconst MASK = \"••••••••••••••••••••\";\n\n/** The generator body: kind, value, options, Use. Mount it only while it is shown. */\nexport function PasswordGenerator({ limits: source, onUse, useLabel = \"Use\" }: { limits: GeneratorLimitsSource; onUse: (value: string) => void; useLabel?: string }) {\n const [settings, setSettings] = useState<GeneratorSettings>(DEFAULT_SETTINGS);\n const [limits, setLimits] = useState<LimitsState>({ state: \"loading\" });\n const [round, setRound] = useState(0);\n const [candidate, setCandidate] = useState<Candidate | null>(null);\n const [revealed, setRevealed] = useState(false);\n const [note, setNote] = useState<{ tone: \"muted\" | \"destructive\" | \"success\"; text: string } | null>(null);\n const copyValue = useCopy();\n const expiry = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const drop = () => {\n if (expiry.current) clearTimeout(expiry.current);\n expiry.current = null;\n setCandidate(null);\n setRevealed(false);\n };\n\n const make = (next: GeneratorSettings, ceilings: CredentialGenerationLimits) => {\n const bounded = clampSettings(next, ceilings);\n setSettings(bounded);\n drop();\n const result = generate(bounded, ceilings);\n if (!result.ok) {\n setNote({ tone: \"destructive\", text: refusalMessage(result.reason) });\n return;\n }\n setNote(null);\n setCandidate({ value: result.value, bits: result.entropyBitsLowerBound });\n expiry.current = setTimeout(() => {\n expiry.current = null;\n setCandidate(null);\n setRevealed(false);\n setNote({ tone: \"muted\", text: \"Expired. Generate a new one.\" });\n }, GENERATED_VALUE_TTL_MS);\n };\n\n // Read the ceilings, then make the first value. A stale answer (closed, retried) is ignored.\n useEffect(() => {\n let live = true;\n setLimits({ state: \"loading\" });\n source()\n .then((raw) => {\n if (!live) return;\n const parsed = parseGeneratorLimits(raw);\n if (!parsed) {\n setLimits({ state: \"unavailable\", message: \"Generator limits aren’t set up for this organization.\" });\n return;\n }\n setLimits({ state: \"ready\", limits: parsed });\n make(DEFAULT_SETTINGS, parsed);\n })\n .catch((e: unknown) => {\n if (live) setLimits({ state: \"unavailable\", message: e instanceof Error && e.message ? e.message : \"Generator limits could not be read.\" });\n });\n return () => {\n live = false;\n };\n // The source and an explicit retry decide when to re-read; `make` only reads state setters.\n }, [source, round]);\n\n // Plaintext never outlives the generator.\n useEffect(() => () => {\n if (expiry.current) clearTimeout(expiry.current);\n }, []);\n\n if (limits.state === \"loading\") return <p className=\"px-1 py-3 text-sm text-muted-foreground\" aria-live=\"polite\">Reading limits…</p>;\n if (limits.state === \"unavailable\")\n return (\n <div className=\"flex flex-col gap-2 px-1 py-2\">\n <p role=\"alert\" className=\"text-sm text-destructive\">{limits.message}</p>\n <Button variant=\"outline\" icon={<RefreshGlyph />} onClick={() => setRound((n) => n + 1)}>Try again</Button>\n </div>\n );\n\n const ceilings = limits.limits;\n const change = (next: GeneratorSettings) => make(next, ceilings);\n const setPassword = (patch: Partial<PasswordSettings>) => change({ ...settings, password: { ...settings.password, ...patch } });\n const strength = candidate ? strengthOf(candidate.bits) : null;\n\n const copy = async () => {\n if (!candidate) return;\n const ok = await copyValue(candidate.value, \"Generated password\");\n setNote(ok ? { tone: \"success\", text: \"Copied. Your clipboard keeps it.\" } : { tone: \"destructive\", text: \"Couldn’t copy. Reveal it and copy by hand.\" });\n };\n const use = () => {\n if (!candidate) return;\n const value = candidate.value;\n drop();\n onUse(value);\n };\n\n return (\n <div className=\"flex w-full flex-col gap-3\" aria-label=\"Password generator\">\n <SegmentedControl<GeneratorKind>\n fill\n aria-label=\"Kind\"\n value={settings.kind}\n onValueChange={(kind) => change({ ...settings, kind })}\n data={[{ value: \"password\", label: \"Password\" }, { value: \"passphrase\", label: \"Passphrase\" }]}\n />\n\n <div className=\"flex flex-col gap-1 rounded-lg bg-muted px-3 py-2\">\n <div className=\"flex min-h-7 items-start gap-1\">\n <code className={cn(\"min-w-0 flex-1 break-all py-1 font-mono text-sm\", candidate ? \"text-foreground\" : \"text-muted-foreground\")} data-testid=\"generated-value\">\n {candidate ? (revealed ? candidate.value : MASK) : \"—\"}\n </code>\n <Button variant=\"quiet\" icon={revealed ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={revealed ? \"Hide\" : \"Reveal\"} disabled={!candidate} onClick={() => setRevealed((r) => !r)} />\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label=\"Copy\" disabled={!candidate} onClick={() => void copy()} />\n <Button variant=\"quiet\" icon={<RefreshGlyph />} aria-label=\"Generate another\" onClick={() => change(settings)} />\n </div>\n {strength && candidate ? (\n <p className=\"text-xs\">\n <span className={cn(strength.tone === \"success\" && \"text-success\", strength.tone === \"primary\" && \"text-primary\", strength.tone === \"warning\" && \"text-warning\")}>{strength.label}</span>\n <span className=\"text-muted-foreground\"> · {Math.floor(candidate.bits)}-bit</span>\n </p>\n ) : null}\n </div>\n\n {settings.kind === \"password\" ? (\n <div className=\"flex flex-col gap-0.5\">\n <OptionLine label=\"Length\">\n <NumberStepper value={settings.password.length} min={minPasswordLength(settings.password)} max={ceilings.maxPasswordLength} fallback={24} onChange={(length) => setPassword({ length })} />\n </OptionLine>\n {(\n [\n [\"lowercase\", \"Lowercase\"],\n [\"uppercase\", \"Uppercase\"],\n [\"digits\", \"Digits\"],\n [\"symbols\", \"Symbols\"],\n ] as const\n ).map(([key, label]) => {\n const on = settings.password[key];\n const last = on && minPasswordLength(settings.password) === 1;\n return (\n <OptionLine key={key} label={label}>\n <Switch aria-label={label} checked={on} disabled={last} onCheckedChange={(v) => setPassword({ [key]: v })} />\n </OptionLine>\n );\n })}\n <OptionLine label=\"Avoid look-alikes\" hint=\"No 0/O, 1/l/I\">\n <Switch aria-label=\"Avoid look-alikes\" checked={settings.password.excludeAmbiguous} onCheckedChange={(v) => setPassword({ excludeAmbiguous: v })} />\n </OptionLine>\n </div>\n ) : (\n <div className=\"flex flex-col gap-0.5\">\n <OptionLine label=\"Words\">\n <NumberStepper value={settings.passphrase.wordCount} min={MIN_PASSPHRASE_WORDS} max={ceilings.maxPassphraseWords} fallback={MIN_PASSPHRASE_WORDS} onChange={(wordCount) => change({ ...settings, passphrase: { ...settings.passphrase, wordCount } })} />\n </OptionLine>\n <OptionLine label=\"Separator\">\n <Select<PassphraseSeparator> aria-label=\"Separator\" variant=\"inline\" align=\"end\" value={settings.passphrase.separator} options={SEPARATORS} onValueChange={(separator) => change({ ...settings, passphrase: { ...settings.passphrase, separator } })} />\n </OptionLine>\n <OptionLine label=\"Capitalize\">\n <Switch aria-label=\"Capitalize\" checked={settings.passphrase.capitalize} onCheckedChange={(capitalize) => change({ ...settings, passphrase: { ...settings.passphrase, capitalize } })} />\n </OptionLine>\n <OptionLine label=\"Add a digit\">\n <Switch aria-label=\"Add a digit\" checked={settings.passphrase.appendDigit} onCheckedChange={(appendDigit) => change({ ...settings, passphrase: { ...settings.passphrase, appendDigit } })} />\n </OptionLine>\n </div>\n )}\n\n {note ? (\n <p aria-live=\"polite\" className={cn(\"text-xs\", note.tone === \"destructive\" ? \"text-destructive\" : note.tone === \"success\" ? \"text-success\" : \"text-muted-foreground\")}>\n {note.text}\n </p>\n ) : null}\n\n <Button variant=\"primary\" disabled={!candidate} onClick={use}>{useLabel}</Button>\n </div>\n );\n}\n\nfunction OptionLine({ label, hint, children }: { label: string; hint?: string; children: ReactNode }) {\n return (\n <div className=\"flex min-h-9 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm text-foreground\">{label}</span>\n {hint ? <span className=\"truncate text-xs text-muted-foreground\">{hint}</span> : null}\n </div>\n <div className=\"flex shrink-0 items-center\">{children}</div>\n </div>\n );\n}\n\n/**\n * An icon button beside a secret field that opens the generator. \"Use\" hands the value back and\n * closes it; closing without using drops the value.\n */\nexport function GenerateButton({ onUse, label, limits, disabled }: { onUse: (value: string) => void; label?: string; limits?: GeneratorLimitsSource; disabled?: boolean }) {\n const fromHost = useGeneratorLimitsSource();\n const source = limits ?? fromHost;\n const [open, setOpen] = useState(false);\n if (!source) return null;\n const name = label ?? \"Generate password\";\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"quiet\" icon={<KeyGlyph />} aria-label={name} title={name} disabled={disabled} />\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"end\">\n {open ? (\n <PasswordGenerator\n limits={source}\n onUse={(value) => {\n onUse(value);\n setOpen(false);\n }}\n />\n ) : null}\n </PopoverContent>\n </Popover>\n );\n}\n\n","/**\n * THE password generator's pure half, for every host (web app, extension, desktop).\n *\n * Randomness comes ONLY from `@ai-matrx/kit/credential-generator` (rejection-sampled Web Crypto,\n * the EFF large wordlist, a 64-bit floor). This module adds what every screen needs on top: the\n * settings people change, the organization's ceilings, and the words for each outcome. Nothing\n * here keeps a generated value — the screen holds it for `GENERATED_VALUE_TTL_MS` and drops it.\n */\nimport {\n CREDENTIAL_GENERATION_TECHNICAL_LIMITS,\n generateCredentialSecret,\n type CredentialGenerationLimits,\n type CredentialGenerationOptions,\n type CredentialGenerationResult,\n} from \"@ai-matrx/kit/credential-generator\";\n\nexport { CREDENTIAL_GENERATION_TECHNICAL_LIMITS, generateCredentialSecret };\nexport type { CredentialGenerationLimits, CredentialGenerationOptions, CredentialGenerationResult };\n\n/** A generated value lives this long, unused, before it is dropped. */\nexport const GENERATED_VALUE_TTL_MS = 30_000;\n\n/** The knobs the limits come from (`vault.generator.*`), resolved by the host for its organization. */\nexport const GENERATOR_LIMIT_KNOBS = { feature: \"vault.generator\", maxPasswordLength: \"max_password_length\", maxPassphraseWords: \"max_passphrase_words\" } as const;\n\n/** An organization may lower the ceilings, never below the defaults people start from. */\nexport const MIN_PASSWORD_CEILING = 24;\nexport const MIN_PASSPHRASE_CEILING = 6;\nexport const MIN_PASSPHRASE_WORDS = 6;\n\nexport type GeneratorKind = \"password\" | \"passphrase\";\nexport type PassphraseSeparator = \"-\" | \" \" | \".\";\n\nexport interface PasswordSettings {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n excludeAmbiguous: boolean;\n}\n\nexport interface PassphraseSettings {\n wordCount: number;\n separator: PassphraseSeparator;\n capitalize: boolean;\n appendDigit: boolean;\n}\n\nexport interface GeneratorSettings {\n kind: GeneratorKind;\n password: PasswordSettings;\n passphrase: PassphraseSettings;\n}\n\nexport const DEFAULT_PASSWORD: PasswordSettings = { length: 24, lowercase: true, uppercase: true, digits: true, symbols: true, excludeAmbiguous: true };\nexport const DEFAULT_PASSPHRASE: PassphraseSettings = { wordCount: 6, separator: \"-\", capitalize: false, appendDigit: false };\nexport const DEFAULT_SETTINGS: GeneratorSettings = { kind: \"password\", password: DEFAULT_PASSWORD, passphrase: DEFAULT_PASSPHRASE };\n\nexport const SEPARATORS: readonly { value: PassphraseSeparator; label: string }[] = [\n { value: \"-\", label: \"Hyphen\" },\n { value: \" \", label: \"Space\" },\n { value: \".\", label: \"Period\" },\n];\n\n/** The engine's options for the current settings (only the chosen kind's). */\nexport function optionsFor(settings: GeneratorSettings): CredentialGenerationOptions {\n return settings.kind === \"password\" ? { kind: \"password\", ...settings.password } : { kind: \"passphrase\", ...settings.passphrase };\n}\n\nconst isWholeIn = (v: unknown, min: number, max: number): v is number => typeof v === \"number\" && Number.isSafeInteger(v) && v >= min && v <= max;\n\n/**\n * The organization's ceilings, or null when they are missing or malformed. Null is an honest\n * refusal (\"not set up\"), never a quietly invented policy. Accepts numbers or numeric strings\n * (knob values arrive as JSON).\n */\nexport function parseGeneratorLimits(raw: { maxPasswordLength?: unknown; maxPassphraseWords?: unknown } | null | undefined): CredentialGenerationLimits | null {\n if (!raw) return null;\n const num = (v: unknown) => (typeof v === \"string\" && v.trim() !== \"\" ? Number(v) : v);\n const maxPasswordLength = num(raw.maxPasswordLength);\n const maxPassphraseWords = num(raw.maxPassphraseWords);\n if (!isWholeIn(maxPasswordLength, MIN_PASSWORD_CEILING, CREDENTIAL_GENERATION_TECHNICAL_LIMITS.maxPasswordLength)) return null;\n if (!isWholeIn(maxPassphraseWords, MIN_PASSPHRASE_CEILING, CREDENTIAL_GENERATION_TECHNICAL_LIMITS.maxPassphraseWords)) return null;\n return { maxPasswordLength, maxPassphraseWords };\n}\n\n/** The fewest characters the chosen classes allow (one of each). */\nexport function minPasswordLength(p: PasswordSettings): number {\n return Math.max(1, [p.lowercase, p.uppercase, p.digits, p.symbols].filter(Boolean).length);\n}\n\n/** True when at least one character class is on. */\nexport const hasCharacterClass = (p: PasswordSettings) => p.lowercase || p.uppercase || p.digits || p.symbols;\n\n/** Keeps the settings inside the ceilings so a lowered limit never strands a stored choice. */\nexport function clampSettings(settings: GeneratorSettings, limits: CredentialGenerationLimits): GeneratorSettings {\n const clamp = (n: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, Math.round(Number.isFinite(n) ? n : lo)));\n return {\n ...settings,\n password: { ...settings.password, length: clamp(settings.password.length, minPasswordLength(settings.password), limits.maxPasswordLength) },\n passphrase: { ...settings.passphrase, wordCount: clamp(settings.passphrase.wordCount, MIN_PASSPHRASE_WORDS, limits.maxPassphraseWords) },\n };\n}\n\n/** Generate for these settings under these ceilings. One call, crypto-random, never a fallback. */\nexport function generate(settings: GeneratorSettings, limits: CredentialGenerationLimits): CredentialGenerationResult {\n return generateCredentialSecret(optionsFor(settings), limits);\n}\n\n/** What to say when the engine refuses (≤ 60 characters each). */\nexport function refusalMessage(reason: Extract<CredentialGenerationResult, { ok: false }>[\"reason\"]): string {\n if (reason === \"insufficient_strength\") return \"Too weak. Add length or character types.\";\n if (reason === \"random_unavailable\") return \"Secure randomness is unavailable here.\";\n return \"These options can’t make a value.\";\n}\n\n/** Strength as people read it, from the engine's entropy lower bound. */\nexport function strengthOf(bits: number): { label: string; tone: \"success\" | \"primary\" | \"warning\" } {\n // 70+ bits is beyond any online or offline guessing a person faces; a 6-word passphrase (77) is strong.\n if (bits >= 100) return { label: \"Excellent\", tone: \"success\" };\n if (bits >= 70) return { label: \"Strong\", tone: \"primary\" };\n return { label: \"Fair\", tone: \"warning\" };\n}\n","import type { CsvImportLimits } from \"./csv-import\";\n\nexport type ImportLimits = CsvImportLimits & { maxJsonDepth: number; jsonWorkerTimeoutMs: number };\n\nconst KEYS: readonly [keyof ImportLimits, string][] = [\n [\"maxFileBytes\", \"max_file_bytes\"],\n [\"maxRecords\", \"max_records\"],\n [\"maxColumns\", \"max_columns\"],\n [\"maxCellBytes\", \"max_cell_bytes\"],\n [\"maxFields\", \"max_fields\"],\n [\"maxPlaintextFieldBytes\", \"max_plaintext_field_bytes\"],\n [\"maxRequestBodyBytes\", \"max_request_body_bytes\"],\n [\"maxJsonDepth\", \"json_max_depth\"],\n [\"jsonWorkerTimeoutMs\", \"json_worker_timeout_ms\"],\n];\n\n/**\n * How large an import may be: the organization's `vault.import.*` knobs, never numbers in this\n * package. Import is unavailable (and says so) until every one is set.\n */\nexport function importLimitsFrom(resolved: Readonly<Record<string, unknown>>): ImportLimits {\n const out: Partial<Record<keyof ImportLimits, number>> = {};\n for (const [field, key] of KEYS) {\n const v = Number(resolved[`vault.import.${key}`]);\n if (!Number.isSafeInteger(v) || v <= 0) throw new Error(\"Import is not set up for this organization yet.\");\n out[field] = v;\n }\n return out as ImportLimits;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Button, Field, SegmentedControl, Switch } from \"@ai-matrx/design-system/controls\";\nimport { downloadFile } from \"@ai-matrx/kit/download\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed } from \"../auth/IdentityGate\";\nimport { formatBytes, Empty, Panel, Row, Section } from \"../ui\";\nimport { BACKUP_FILENAME, backupErrorMessage, readBackupFile, restoreRunFor, startNewRestoreRun } from \"./backup-file\";\nimport { ErrorLine, PickLine, Windowed, plural } from \"./lines\";\nimport type { BackupOmission, BackupPreview, RestorePreview, RestoreResult } from \"./port\";\n\ntype Mode = \"backup\" | \"restore\";\n\nconst RECORD_STATUS: Record<RestoreResult[\"results\"][number][\"status\"], string> = {\n created: \"Restored\",\n replayed: \"Already restored\",\n refused: \"Refused\",\n retryable_failure: \"Try again\",\n};\n\nfunction omissionText(o: BackupOmission): string {\n const what = o.component.replaceAll(\"_\", \" \");\n return `${o.count ?? \"Some\"} ${what}: ${o.reason.replaceAll(\"_\", \" \")}`;\n}\n\nfunction Summary({ value }: { value: BackupPreview | RestorePreview }) {\n return (\n <Section>\n <Row label=\"Credentials\">{value.record_count}</Row>\n <Row label=\"Protected fields\">{value.field_count}</Row>\n <Row label=\"Files\">{value.attachment_count > 0 ? `${value.attachment_count} · ${formatBytes(value.attachment_bytes)}` : \"0\"}</Row>\n </Section>\n );\n}\n\nfunction Omissions({ omissions, accepted, onAccepted, verb }: { omissions: readonly BackupOmission[]; accepted: boolean; onAccepted: (on: boolean) => void; verb: string }) {\n if (omissions.length === 0) return null;\n return (\n <Section title=\"Left out\">\n {omissions.map((o, i) => (\n <Row key={`${o.component}-${o.source_item_id ?? i}`} label={o.component.replaceAll(\"_\", \" \")}>\n <span className=\"block truncate text-muted-foreground\" title={omissionText(o)}>\n {omissionText(o)}\n </span>\n </Row>\n ))}\n <Row label=\"Accept\" hint={`${verb} without these`}>\n <Switch checked={accepted} onCheckedChange={onAccepted} aria-label={`${verb} without these`} />\n </Row>\n </Section>\n );\n}\n\n/** Encrypted backup of chosen credentials, and restore from a backup file. */\nexport function BackupPanel({ port, items, onClose, onChanged }: VaultPanelProps) {\n const confirmed = useConfirmed();\n const fileInput = useRef<HTMLInputElement | null>(null);\n const abort = useRef<AbortController | null>(null);\n const [mode, setMode] = useState<Mode>(\"backup\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [passphrase, setPassphrase] = useState(\"\");\n const [repeat, setRepeat] = useState(\"\");\n const [accepted, setAccepted] = useState(false);\n\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [backup, setBackup] = useState<BackupPreview | null>(null);\n\n const [file, setFile] = useState<File | null>(null);\n const [restorePreview, setRestorePreview] = useState<RestorePreview | null>(null);\n const [runId, setRunId] = useState<string | null>(null);\n const [result, setResult] = useState<RestoreResult | null>(null);\n\n useEffect(() => () => abort.current?.abort(), []);\n\n const switchMode = (next: Mode) => {\n abort.current?.abort();\n setMode(next);\n setError(null);\n setPassphrase(\"\");\n setRepeat(\"\");\n setAccepted(false);\n setBackup(null);\n setRestorePreview(null);\n setResult(null);\n setBusy(false);\n };\n\n const guarded = async (run: () => Promise<void>) => {\n setBusy(true);\n setError(null);\n try {\n await run();\n } catch (cause) {\n if (!(cause instanceof DOMException && cause.name === \"AbortError\")) setError(backupErrorMessage(cause));\n } finally {\n setBusy(false);\n }\n };\n\n const pick = (id: string, on: boolean) => {\n setBackup(null);\n setAccepted(false);\n setSelected((current) => {\n const next = new Set(current);\n if (on) next.add(id);\n else next.delete(id);\n return next;\n });\n };\n\n const reviewBackup = () => guarded(async () => {\n setBackup(await confirmed(() => port.io.previewBackup([...selected])));\n setAccepted(false);\n });\n\n const downloadBackup = () => guarded(async () => {\n if (!backup) return;\n const bytes = await confirmed(() => port.io.downloadBackup({ itemIds: [...selected], revision: backup.revision, passphrase, acceptOmissions: accepted }));\n downloadFile(BACKUP_FILENAME, bytes, \"application/octet-stream\");\n setPassphrase(\"\");\n setRepeat(\"\");\n onClose();\n });\n\n const reviewRestore = () => guarded(async () => {\n if (!file) return;\n const ctl = new AbortController();\n abort.current = ctl;\n const encoded = await readBackupFile(file, ctl.signal);\n const preview = await confirmed(() => port.io.previewRestore(encoded, passphrase));\n if (ctl.signal.aborted) return;\n setRestorePreview(preview);\n setRunId(restoreRunFor(preview));\n setResult(null);\n setAccepted(false);\n });\n\n const restore = async () => {\n if (!file || !restorePreview || !runId) return;\n const ok = await confirm({\n title: `Restore ${plural(restorePreview.record_count, \"credential\")}?`,\n description: \"They're added to your personal vault, disabled and restricted. Review them before using or sharing.\",\n confirmLabel: \"Restore\",\n });\n if (!ok) return;\n await guarded(async () => {\n const encoded = await readBackupFile(file);\n const done = await confirmed(() => port.io.restoreBackup({ envelopeBase64: encoded, passphrase, preview: restorePreview, restoreRunId: runId, acceptOmissions: accepted }));\n setResult(done);\n if (done.created + done.replayed > 0) onChanged();\n });\n };\n\n const again = async () => {\n if (!restorePreview) return;\n const ok = await confirm({\n title: \"Restore these again?\",\n description: \"Credentials you already restored are added a second time as new copies.\",\n confirmLabel: \"Restore again\",\n });\n if (!ok) return;\n setRunId(startNewRestoreRun(restorePreview));\n setResult(null);\n };\n\n const retryable = (result?.retryable_failure ?? 0) > 0;\n const mismatch = repeat !== \"\" && repeat !== passphrase;\n const names = new Map(restorePreview?.records.map((r) => [r.source_item_id, r.display_name]) ?? []);\n\n const footer =\n mode === \"backup\" ? (\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n {backup ? (\n <Button variant=\"primary\" disabled={busy || !passphrase || passphrase !== repeat || (backup.omissions.length > 0 && !accepted)} onClick={() => void downloadBackup()}>\n Encrypt and download\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy || selected.size === 0} onClick={() => void reviewBackup()}>\n Review {selected.size}\n </Button>\n )}\n </>\n ) : (\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n {result && !retryable ? \"Done\" : \"Close\"}\n </Button>\n {result ? (\n retryable ? (\n <Button variant=\"primary\" disabled={busy} onClick={() => void restore()}>\n Try again\n </Button>\n ) : (\n <Button variant=\"outline\" disabled={busy} onClick={() => void again()}>\n Restore again\n </Button>\n )\n ) : restorePreview ? (\n <Button variant=\"primary\" disabled={busy || (restorePreview.omissions.length > 0 && !accepted)} onClick={() => void restore()}>\n Restore {restorePreview.record_count}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy || !file || !passphrase} onClick={() => void reviewRestore()}>\n Review\n </Button>\n )}\n </>\n );\n\n return (\n <Panel title=\"Backup\" size=\"lg\" onClose={onClose} footer={footer}>\n <SegmentedControl<Mode>\n value={mode}\n onValueChange={switchMode}\n aria-label=\"Backup or restore\"\n fill\n data={[\n { value: \"backup\", label: \"Back up\" },\n { value: \"restore\", label: \"Restore\" },\n ]}\n />\n\n {mode === \"backup\" ? (\n <>\n <Section\n title={`${selected.size} of ${plural(items.length, \"credential\")}`}\n actions={\n <>\n <Button variant=\"quiet\" disabled={busy || items.length === 0} onClick={() => { setBackup(null); setSelected(new Set(items.map((i) => i.id))); }}>\n All\n </Button>\n <Button variant=\"quiet\" disabled={busy || selected.size === 0} onClick={() => { setBackup(null); setSelected(new Set()); }}>\n None\n </Button>\n </>\n }\n >\n {items.length === 0 ? (\n <Empty>Nothing to back up yet.</Empty>\n ) : (\n <Windowed items={items} render={(i) => <PickLine key={i.id} title={i.name} detail={i.definitionLabel} checked={selected.has(i.id)} disabled={busy} onChange={(on) => pick(i.id, on)} />} />\n )}\n </Section>\n {backup ? (\n <>\n <Summary value={backup} />\n <Omissions omissions={backup.omissions} accepted={accepted} onAccepted={setAccepted} verb=\"Back up\" />\n <Section>\n <Row label=\"Passphrase\" hint=\"Not saved. It can't be recovered.\">\n <Field type=\"password\" value={passphrase} autoComplete=\"new-password\" aria-label=\"Backup passphrase\" onChange={(e) => setPassphrase(e.target.value)} />\n </Row>\n <Row label=\"Repeat\" {...(mismatch ? { hint: \"Doesn't match\" } : {})}>\n <Field type=\"password\" value={repeat} autoComplete=\"new-password\" aria-label=\"Repeat the passphrase\" onChange={(e) => setRepeat(e.target.value)} />\n </Row>\n </Section>\n </>\n ) : null}\n </>\n ) : (\n <>\n {!restorePreview ? (\n <Section>\n <Row label=\"File\" {...(file ? { hint: file.name } : {})}>\n <Button variant=\"outline\" disabled={busy} onClick={() => fileInput.current?.click()}>\n Choose a backup\n </Button>\n <input\n ref={fileInput}\n type=\"file\"\n hidden\n accept=\".matrxvault\"\n onChange={(e) => {\n setFile(e.target.files?.[0] ?? null);\n e.target.value = \"\";\n }}\n />\n </Row>\n <Row label=\"Passphrase\">\n <Field type=\"password\" value={passphrase} autoComplete=\"current-password\" aria-label=\"Backup passphrase\" onChange={(e) => setPassphrase(e.target.value)} />\n </Row>\n </Section>\n ) : (\n <>\n <Summary value={restorePreview} />\n {!result ? <Omissions omissions={restorePreview.omissions} accepted={accepted} onAccepted={setAccepted} verb=\"Restore\" /> : null}\n {!result ? (\n <p className=\"px-1 text-xs text-muted-foreground\">Restored items start disabled and restricted.</p>\n ) : (\n <Section title={`${result.created} restored · ${result.replayed} already · ${result.refused} refused · ${result.retryable_failure} to retry`}>\n {result.results.map((r) => (\n <Row key={r.source_item_id} label={names.get(r.source_item_id) ?? \"Credential\"}>\n <span className={r.status === \"refused\" || r.status === \"retryable_failure\" ? \"text-destructive\" : \"text-foreground\"}>\n {RECORD_STATUS[r.status]}\n {r.reason === \"alias_conflict\" ? \" · name in use\" : \"\"}\n </span>\n </Row>\n ))}\n </Section>\n )}\n </>\n )}\n </>\n )}\n <ErrorLine message={error} />\n </Panel>\n );\n}\n","/** What a backup screen needs around the server calls: reading the file, the restore run, plain-words errors. */\nimport { MatrxApiError } from \"@ai-matrx/api\";\nimport type { RestorePreview } from \"./port\";\n\nexport const MAX_BACKUP_UPLOAD_BYTES = 66 * 1024 * 1024;\nexport const BACKUP_FILENAME = \"matrx-vault-backup.matrxvault\";\nconst RESTORE_RUN_KEY = \"matrx:vault-backup-restore:v1\";\n\n/** The file as base64 (what the server takes), without the data-URL prefix. */\nexport function readBackupFile(file: Blob, signal?: AbortSignal): Promise<string> {\n if (file.size > MAX_BACKUP_UPLOAD_BYTES) return Promise.reject(new Error(\"This backup file is too large to restore.\"));\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n const abort = () => reader.abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n const cleanup = () => signal?.removeEventListener(\"abort\", abort);\n reader.onerror = () => {\n cleanup();\n reject(new Error(\"The backup file could not be read.\"));\n };\n reader.onabort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n reader.onload = () => {\n cleanup();\n const result = reader.result;\n if (typeof result !== \"string\" || !result.includes(\",\")) reject(new Error(\"The backup file could not be read.\"));\n else resolve(result.slice(result.indexOf(\",\") + 1));\n };\n reader.readAsDataURL(file);\n });\n}\n\n/** A failed backup or restore call, in words a person can act on. */\nexport function backupErrorMessage(cause: unknown): string {\n if (cause instanceof MatrxApiError) {\n switch (cause.status) {\n case 401:\n return \"Confirm it's you, then try again.\";\n case 403:\n return \"Your account or organization changed. Start again.\";\n case 404:\n return \"A selected credential is gone. Reload the vault and start again.\";\n case 409:\n return \"The backup or account changed. Review it again.\";\n case 413:\n return \"This backup is too large. Choose fewer credentials.\";\n case 429:\n return \"Backup encryption is busy. Wait a moment, then try again.\";\n case 422:\n return \"The file, selection or passphrase was refused.\";\n default:\n if (cause.status >= 500 || cause.status === 408) return \"The result could not be confirmed. Try again; nothing is repeated.\";\n return cause.message;\n }\n }\n return cause instanceof Error ? cause.message : \"The backup could not complete.\";\n}\n\ninterface StoredRestoreRun {\n digest: string;\n actorId: string;\n organizationId: string;\n runId: string;\n}\n\nfunction storage(): Storage | null {\n try {\n return typeof sessionStorage === \"undefined\" ? null : sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction readStoredRun(): StoredRestoreRun | null {\n const store = storage();\n if (!store) return null;\n try {\n const raw = store.getItem(RESTORE_RUN_KEY);\n if (!raw) return null;\n const v: unknown = JSON.parse(raw);\n if (v && typeof v === \"object\" && [\"digest\", \"actorId\", \"organizationId\", \"runId\"].every((k) => typeof (v as Record<string, unknown>)[k] === \"string\")) return v as StoredRestoreRun;\n store.removeItem(RESTORE_RUN_KEY);\n } catch {\n store.removeItem(RESTORE_RUN_KEY);\n }\n return null;\n}\n\nfunction writeRun(preview: RestorePreview, runId: string): string {\n storage()?.setItem(RESTORE_RUN_KEY, JSON.stringify({ digest: preview.envelope_digest, actorId: preview.actor_id, organizationId: preview.organization_id, runId } satisfies StoredRestoreRun));\n return runId;\n}\n\n/**\n * The restore run for this exact backup and account. Reviewing the same file again (even after a\n * reload) reuses it, so a restore that half-landed continues instead of creating duplicates.\n */\nexport function restoreRunFor(preview: RestorePreview): string {\n const stored = readStoredRun();\n if (stored && stored.digest === preview.envelope_digest && stored.actorId === preview.actor_id && stored.organizationId === preview.organization_id) return stored.runId;\n return writeRun(preview, crypto.randomUUID());\n}\n\n/** Restore the same file again as a new run (after the first one finished or was refused). */\nexport function startNewRestoreRun(preview: RestorePreview): string {\n return writeRun(preview, crypto.randomUUID());\n}\n\nexport function clearRestoreRun(): void {\n storage()?.removeItem(RESTORE_RUN_KEY);\n}\n","/** The few pieces the three panels share: a pick-list line, a \"more\" disclosure, an error line. */\nimport { useState, type ReactNode } from \"react\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Badge, Button, DisclosureHeader, type BadgeTone } from \"@ai-matrx/design-system/controls\";\n\n/** One line in a list the person picks from: a checkbox, a name, a quiet detail, an optional badge. */\nexport function PickLine({ checked, onChange, disabled = false, title, detail, badge, tone }: { checked: boolean; onChange: (next: boolean) => void; disabled?: boolean; title: string; detail?: string | undefined; badge?: string | undefined; tone?: BadgeTone | undefined }) {\n return (\n <label className=\"flex min-h-11 items-center gap-3 px-4 py-1\" data-clickable={disabled ? undefined : \"\"}>\n <Checkbox checked={checked} disabled={disabled} onCheckedChange={(v) => onChange(v === true)} aria-label={title} />\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\">{title}</span>\n {detail ? <span className=\"hidden min-w-0 max-w-[45%] truncate text-xs text-muted-foreground sm:block\">{detail}</span> : null}\n {badge ? <Badge tone={tone ?? \"neutral\"}>{badge}</Badge> : null}\n </label>\n );\n}\n\n/** A list that shows its first lines and offers the rest, so a thousand records never fill the panel. */\nexport function Windowed<T>({ items, size = 150, render }: { items: readonly T[]; size?: number; render: (item: T) => ReactNode }) {\n const [all, setAll] = useState(false);\n const shown = all ? items : items.slice(0, size);\n return (\n <>\n {shown.map(render)}\n {items.length > shown.length ? (\n <div className=\"px-4 py-2\">\n <Button variant=\"quiet\" onClick={() => setAll(true)}>\n Show all {items.length}\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\n/** Rare choices stay behind one tap. */\nexport function More({ title = \"More\", children }: { title?: string; children: ReactNode }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"flex flex-col gap-2\">\n <DisclosureHeader open={open} title={title} onClick={() => setOpen((o) => !o)} />\n {open ? children : null}\n </div>\n );\n}\n\n/** A refusal or failure, in the panel it happened in. */\nexport function ErrorLine({ message }: { message: string | null }) {\n return message ? (\n <p role=\"alert\" className=\"px-1 text-sm text-destructive\">\n {message}\n </p>\n ) : null;\n}\n\nexport const plural = (n: number, one: string, many = `${one}s`): string => `${n} ${n === 1 ? one : many}`;\n","import { useMemo, useState } from \"react\";\nimport { Button, Select, type SelectOption } from \"@ai-matrx/design-system/controls\";\nimport { downloadFile } from \"@ai-matrx/kit/download\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed } from \"../auth/IdentityGate\";\nimport { ExportGlyph } from \"../glyphs\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { ErrorLine, PickLine, Windowed, plural } from \"./lines\";\nimport type { LoginCsvPreview, LoginCsvProfile } from \"./port\";\n\n/** Each format and what it leaves out, in the order a person is likely to want them. */\nconst FORMATS: readonly { value: LoginCsvProfile; label: string; hint: string }[] = [\n { value: \"matrx_login_csv_v1\", label: \"Matrx\", hint: \"Website logins, all common fields\" },\n { value: \"firefox_csv_v1\", label: \"Firefox\", hint: \"Address, username and password\" },\n { value: \"roboform_csv_v1\", label: \"RoboForm\", hint: \"Name, address, login, password, note\" },\n { value: \"dashlane_csv_v1\", label: \"Dashlane\", hint: \"Name, address, username, password, note\" },\n { value: \"apple_passwords_csv_v1\", label: \"Apple Passwords\", hint: \"Title, address, username, password, notes\" },\n { value: \"google_password_manager_csv_v1\", label: \"Google Password Manager\", hint: \"No title or notes columns\" },\n { value: \"lastpass_csv_v1\", label: \"LastPass\", hint: \"Title, address, username, password, notes\" },\n { value: \"keeper_csv_v1\", label: \"Keeper\", hint: \"Title, address, username, password, notes\" },\n { value: \"nordpass_csv_v1\", label: \"NordPass\", hint: \"NordPass's import template\" },\n];\nconst FORMAT_OPTIONS: readonly SelectOption<LoginCsvProfile>[] = FORMATS.map((f) => ({ value: f.value, label: f.label }));\nconst FILENAME = \"matrx-login-export.csv\";\nconst WEBSITE_LOGIN = \"website_login\";\n\nfunction omissionText(omissions: Record<string, number> | undefined): string {\n return Object.entries(omissions ?? {})\n .filter(([, n]) => n > 0)\n .map(([why, n]) => `${n} ${why.replaceAll(\"_\", \" \")}`)\n .join(\", \");\n}\n\n/** Take selected website logins out as a CSV another password manager can read. */\nexport function ExportPanel({ port, items, onClose }: VaultPanelProps) {\n const confirmed = useConfirmed();\n const logins = useMemo(() => items.filter((i) => i.definitionKey === WEBSITE_LOGIN), [items]);\n const [profile, setProfile] = useState<LoginCsvProfile>(\"matrx_login_csv_v1\");\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [preview, setPreview] = useState<LoginCsvPreview | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const format = FORMATS.find((f) => f.value === profile);\n const reasons = new Map(preview?.items.map((p) => [p.item_id, p]) ?? []);\n const eligible = preview?.items.filter((p) => p.eligible).length ?? 0;\n\n const changed = () => {\n setPreview(null);\n setError(null);\n };\n const pick = (id: string, on: boolean) => {\n changed();\n setSelected((current) => {\n const next = new Set(current);\n if (on) next.add(id);\n else next.delete(id);\n return next;\n });\n };\n\n const review = async () => {\n setBusy(true);\n setError(null);\n try {\n setPreview(await port.io.previewLoginCsv(profile, [...selected]));\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The selection could not be checked.\");\n } finally {\n setBusy(false);\n }\n };\n\n const download = async () => {\n if (!preview) return;\n const ok = await confirm({\n title: `Download ${plural(eligible, \"password\")} as plain text?`,\n description: \"Anyone who gets this file can read them. Delete it once you've imported it.\",\n confirmLabel: \"Download\",\n variant: \"destructive\",\n });\n if (!ok) return;\n setBusy(true);\n setError(null);\n try {\n const csv = await confirmed(() => port.io.downloadLoginCsv(preview.profile, [...selected], preview.revision));\n downloadFile(FILENAME, csv, \"text/csv;charset=utf-8\");\n onClose();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The file could not be created.\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Panel\n title=\"Export logins\"\n size=\"lg\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n {preview ? (\n <Button variant=\"primary\" icon={<ExportGlyph className=\"size-4\" />} disabled={busy || eligible === 0} onClick={() => void download()}>\n Download {eligible}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy || selected.size === 0} onClick={() => void review()}>\n Review {selected.size}\n </Button>\n )}\n </>\n }\n >\n <Section>\n <Row label=\"Format\" hint={format?.hint}>\n <Select\n value={profile}\n options={FORMAT_OPTIONS}\n aria-label=\"Format\"\n onValueChange={(p) => {\n changed();\n setProfile(p);\n }}\n />\n </Row>\n </Section>\n <Section\n title={`${selected.size} of ${plural(logins.length, \"login\")}`}\n actions={\n <>\n <Button variant=\"quiet\" disabled={busy || logins.length === 0} onClick={() => { changed(); setSelected(new Set(logins.map((l) => l.id))); }}>\n All\n </Button>\n <Button variant=\"quiet\" disabled={busy || selected.size === 0} onClick={() => { changed(); setSelected(new Set()); }}>\n None\n </Button>\n </>\n }\n >\n {logins.length === 0 ? (\n <Empty>No website logins to export.</Empty>\n ) : (\n <Windowed\n items={logins}\n render={(item) => {\n const p = reasons.get(item.id);\n const left = p && !p.eligible;\n const omitted = p ? omissionText(p.omissions) : \"\";\n return (\n <PickLine\n key={item.id}\n title={item.name}\n detail={left ? (p.reason ?? \"Can't be exported\").replaceAll(\"_\", \" \") : omitted ? `Leaves out ${omitted}` : item.owner.label}\n badge={left ? \"Left out\" : undefined}\n tone={left ? \"warning\" : undefined}\n checked={selected.has(item.id)}\n disabled={busy}\n onChange={(on) => pick(item.id, on)}\n />\n );\n }}\n />\n )}\n </Section>\n <ErrorLine message={error} />\n </Panel>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Button, Select, Switch, Textarea, type BadgeTone, type SelectOption } from \"@ai-matrx/design-system/controls\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed } from \"../auth/IdentityGate\";\nimport { ImportGlyph } from \"../glyphs\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { hasAmbiguousCsvMapping, suggestedCsvMapping, type CsvColumnRole } from \"./csv-import\";\nimport type { ImportLimits } from \"./csv-import-limits\";\nimport { runImport, type ImportRunResult } from \"./import-run\";\nimport { countLines, defaultSelection, reviewLines, selectable, type ExistingItem, type ReviewLine, type ReviewState } from \"./import-review\";\nimport { EXPORT_HELP, SOURCE_OPTIONS, acceptFor, detectSource, parseEnvEntries, type ImportSource } from \"./import-source\";\nimport { ErrorLine, More, PickLine, Windowed, plural } from \"./lines\";\nimport { parseImportFile, type ParsedImport } from \"./parse-source\";\nimport type { CreatedItem } from \"./port\";\n\nexport interface ImportPanelProps extends VaultPanelProps {\n /** The organization's import limits (`importLimitsFrom` over the host's knobs). */\n limits: ImportLimits;\n}\n\nconst ROLE_OPTIONS: readonly SelectOption<CsvColumnRole>[] = [\n { value: \"keep\", label: \"Keep encrypted\" },\n { value: \"title\", label: \"Name\" },\n { value: \"username\", label: \"Username\" },\n { value: \"password\", label: \"Password\" },\n { value: \"url\", label: \"Website\" },\n { value: \"notes\", label: \"Notes\" },\n { value: \"otp\", label: \"One-time password\" },\n];\n\nconst STATE_BADGE: Partial<Record<ReviewState, { text: string; tone: BadgeTone }>> = {\n duplicate: { text: \"Duplicate?\", tone: \"warning\" },\n deleted: { text: \"Deleted\", tone: \"neutral\" },\n archived: { text: \"Archived\", tone: \"neutral\" },\n invalid: { text: \"Can't import\", tone: \"destructive\" },\n unsupported: { text: \"Not supported\", tone: \"neutral\" },\n};\n\nconst ME = \"me\";\n\ntype Draft =\n | { kind: \"file\"; parsed: ParsedImport; mapping: CsvColumnRole[] }\n | { kind: \"env\"; entries: ReturnType<typeof parseEnvEntries> };\n\ninterface Done {\n created: CreatedItem[];\n failed: { key: string; title: string; reason: string }[];\n skipped: number;\n withOtp: number;\n /** Lines the run never reached; a retry continues with them. */\n untried: ReviewLine[];\n}\n\n/** Bring items in: pick a source, review what will be created, choose where, import, read the result. */\nexport function ImportPanel({ port, host, items, organizations, onClose, onChanged, limits }: ImportPanelProps) {\n const confirmed = useConfirmed();\n const fileInput = useRef<HTMLInputElement | null>(null);\n const abort = useRef<AbortController | null>(null);\n const stop = useRef(false);\n const keys = useRef(new Map<string, string>());\n\n const [source, setSource] = useState<ImportSource>(\"auto\");\n const [envText, setEnvText] = useState(\"\");\n const [injectSandbox, setInjectSandbox] = useState(false);\n const [fileName, setFileName] = useState<string | null>(null);\n const [reading, setReading] = useState(false);\n const [draft, setDraft] = useState<Draft | null>(null);\n const [destination, setDestination] = useState(ME);\n const [browserFill, setBrowserFill] = useState(false);\n // Structured exports store each website and SSH public key readable (not encrypted); the person approves that once per file.\n const [approvedVisible, setApprovedVisible] = useState(false);\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [running, setRunning] = useState<{ done: number; total: number } | null>(null);\n const [done, setDone] = useState<Done | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(\n () => () => {\n abort.current?.abort();\n stop.current = true;\n },\n [],\n );\n\n const organizationId = destination === ME ? null : destination;\n const existingIn = (org: string | null): ExistingItem[] =>\n items.filter((i) => (org === null ? i.owner.kind === \"me\" : i.owner.organizationId === org)).map((i) => ({ displayName: i.name, loginUrls: i.loginUrls }));\n const existing = useMemo(() => existingIn(organizationId), [items, organizationId]);\n const destinationOptions = useMemo<SelectOption[]>(() => [{ value: ME, label: \"Personal\" }, ...organizations.map((o) => ({ value: o.id, label: o.name }))], [organizations]);\n\n const lines = useMemo<ReviewLine[]>(\n () => (draft?.kind === \"file\" ? reviewLines(draft.parsed, { organizationId, browserFill, existing, limits, mapping: draft.mapping }) : []),\n [draft, organizationId, browserFill, existing, limits],\n );\n const envKeys = draft?.kind === \"env\" ? draft.entries : [];\n const counts = countLines(lines, selected);\n const chosen = draft?.kind === \"env\" ? envKeys.filter((e) => selected.has(e.key + e.text)).length : counts.selected;\n const needsApproval = draft?.kind === \"file\" && draft.parsed.kind === \"structured\" && !approvedVisible;\n const ambiguous = draft?.kind === \"file\" && draft.parsed.kind === \"csv\" && hasAmbiguousCsvMapping(draft.mapping);\n\n const reset = () => {\n abort.current?.abort();\n setDraft(null);\n setDone(null);\n setError(null);\n setReading(false);\n setFileName(null);\n setSelected(new Set());\n setApprovedVisible(false);\n keys.current = new Map();\n };\n\n const reviewEnv = (text: string) => {\n const entries = parseEnvEntries(text);\n if (entries.length === 0) {\n setError(\"No KEY=value lines found.\");\n return;\n }\n setError(null);\n setDraft({ kind: \"env\", entries });\n setSelected(new Set(entries.map((e) => e.key + e.text)));\n };\n\n const chooseFile = async (file: File) => {\n abort.current?.abort();\n const ctl = new AbortController();\n abort.current = ctl;\n setError(null);\n setFileName(file.name);\n setReading(true);\n try {\n const resolved = source === \"auto\" ? await detectSource(file) : source;\n if (ctl.signal.aborted) return;\n if (resolved === \"env\") {\n if (file.size > limits.maxFileBytes) throw new Error(\"The file is larger than an import may be.\");\n const text = await file.text();\n if (ctl.signal.aborted) return;\n setSource(\"env\");\n setEnvText(text);\n reviewEnv(text);\n return;\n }\n const parsed = await parseImportFile(resolved, file, limits, ctl.signal);\n if (ctl.signal.aborted) return;\n const mapping = parsed.kind === \"csv\" ? suggestedCsvMapping(parsed.preview.headers, parsed.vendor) : [];\n const nextDraft: Draft = { kind: \"file\", parsed, mapping };\n setDraft(nextDraft);\n setSelected(defaultSelection(reviewLines(parsed, { organizationId, browserFill, existing, limits, mapping })));\n } catch (cause) {\n if (!ctl.signal.aborted) {\n setFileName(null);\n setError(cause instanceof Error ? cause.message : \"That file could not be read.\");\n }\n } finally {\n if (!ctl.signal.aborted) setReading(false);\n }\n };\n\n /** Anything that changes which lines are importable also resets what is switched on. */\n const restart = (next: { destination?: string; mapping?: CsvColumnRole[]; browserFill?: boolean }) => {\n if (draft?.kind !== \"file\") return;\n const mapping = next.mapping ?? draft.mapping;\n const org = (next.destination ?? destination) === ME ? null : (next.destination ?? destination);\n if (next.mapping) setDraft({ ...draft, mapping });\n if (next.destination !== undefined) setDestination(next.destination);\n if (next.browserFill !== undefined) setBrowserFill(next.browserFill);\n setSelected(defaultSelection(reviewLines(draft.parsed, { organizationId: org, browserFill: next.browserFill ?? browserFill, existing: existingIn(org), limits, mapping })));\n };\n\n const finish = (result: ImportRunResult, skipped: number, previous?: Done | null) => {\n const merged: Done = {\n created: [...(previous?.created ?? []), ...result.created],\n failed: result.failed,\n skipped,\n withOtp: (previous?.withOtp ?? 0) + result.withOtp,\n untried: result.untried,\n };\n setDone(merged);\n if (result.created.length > 0) onChanged();\n };\n\n const importFiles = async (todo: ReviewLine[], skipped: number, previous?: Done | null) => {\n stop.current = false;\n setError(null);\n setRunning({ done: 0, total: todo.length });\n try {\n const result = await runImport({ io: port.io, organizationId, lines: todo, keys: keys.current, confirmed, onProgress: (d, total) => setRunning({ done: d, total }), shouldStop: () => stop.current });\n finish(result, skipped, previous);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The import could not finish.\");\n } finally {\n setRunning(null);\n }\n };\n\n const importEnv = async () => {\n if (draft?.kind !== \"env\") return;\n const text = draft.entries.filter((e) => selected.has(e.key + e.text)).map((e) => e.text).join(\"\\n\");\n setError(null);\n setRunning({ done: 0, total: chosen });\n try {\n const made = await confirmed(() => port.io.importEnv(text, organizationId, injectSandbox));\n setDone({ created: made, failed: [], skipped: draft.entries.length - chosen, withOtp: 0, untried: [] });\n if (made.length > 0) onChanged();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The import could not finish.\");\n } finally {\n setRunning(null);\n }\n };\n\n const start = () => {\n if (draft?.kind === \"env\") return void importEnv();\n if (needsApproval) return setError(\"Approve the visible details first.\");\n const todo = lines.filter((l) => selected.has(l.key) && selectable(l));\n return void importFiles(todo, lines.length - todo.length);\n };\n\n const retry = () => {\n if (!done) return;\n const failedKeys = new Set(done.failed.map((f) => f.key));\n const todo = [...lines.filter((l) => failedKeys.has(l.key)), ...done.untried];\n void importFiles(todo, done.skipped, { ...done, failed: [] });\n };\n\n const help = EXPORT_HELP[source];\n const stage = done ? \"done\" : draft ? \"review\" : \"choose\";\n const busy = running !== null || reading;\n\n const footer =\n stage === \"choose\" ? (\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n {source === \"env\" ? (\n <Button variant=\"primary\" icon={<ImportGlyph className=\"size-4\" />} disabled={!envText.trim()} onClick={() => reviewEnv(envText)}>\n Review\n </Button>\n ) : null}\n </>\n ) : stage === \"review\" ? (\n <>\n {running ? (\n <Button variant=\"outline\" onClick={() => (stop.current = true)}>\n Stop\n </Button>\n ) : (\n <Button variant=\"quiet\" onClick={reset}>\n Back\n </Button>\n )}\n <Button variant=\"primary\" icon={<ImportGlyph className=\"size-4\" />} disabled={busy || chosen === 0 || ambiguous === true || needsApproval} onClick={start}>\n {running ? `Importing ${running.done} of ${running.total}` : `Import ${chosen}`}\n </Button>\n </>\n ) : (\n <>\n {done && done.failed.length + done.untried.length > 0 ? (\n <Button variant=\"outline\" disabled={busy} onClick={retry}>\n {running ? `Importing ${running.done} of ${running.total}` : `Try ${done.failed.length + done.untried.length} again`}\n </Button>\n ) : null}\n <Button variant=\"primary\" onClick={onClose}>\n Done\n </Button>\n </>\n );\n\n return (\n <Panel title=\"Import\" size=\"xl\" onClose={onClose} footer={footer}>\n {stage === \"choose\" ? (\n <Section>\n <Row label=\"Source\" actions={help && host.openUrl ? <Button variant=\"quiet\" onClick={() => host.openUrl?.(help)}>How to export</Button> : undefined}>\n <Select value={source} options={SOURCE_OPTIONS} aria-label=\"Source\" onValueChange={(s) => { setSource(s); setError(null); }} />\n </Row>\n {source === \"env\" ? (\n <Row label=\".env text\" hint=\"Same key updates in place\" top>\n <Textarea mono rows={7} value={envText} autoComplete=\"off\" spellCheck={false} aria-label=\".env text\" placeholder={\"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\"} onChange={(e) => setEnvText(e.target.value)} />\n </Row>\n ) : null}\n <Row label=\"File\" hint={fileName ?? undefined}>\n <Button variant=\"outline\" disabled={reading} onClick={() => fileInput.current?.click()}>\n {reading ? \"Reading…\" : source === \"env\" ? \"Load a file\" : \"Choose a file\"}\n </Button>\n <input\n ref={fileInput}\n type=\"file\"\n hidden\n accept={acceptFor(source)}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) void chooseFile(file);\n e.target.value = \"\";\n }}\n />\n </Row>\n {source === \"env\" ? (\n <Row label=\"Sandboxes\" hint=\"Pass these values to agent sandboxes\">\n <Switch checked={injectSandbox} onCheckedChange={setInjectSandbox} aria-label=\"Use in sandboxes\" />\n </Row>\n ) : null}\n </Section>\n ) : null}\n\n {stage === \"review\" && draft ? (\n <>\n {organizations.length > 0 ? (\n <Section>\n <Row label=\"Save to\">\n <Select value={destination} options={destinationOptions} aria-label=\"Save to\" onValueChange={(v) => (draft.kind === \"file\" ? restart({ destination: v }) : setDestination(v))} />\n </Row>\n </Section>\n ) : null}\n <Section\n title={draft.kind === \"env\" ? plural(envKeys.length, \"value\") : summary(counts, lines.length)}\n actions={\n <>\n <Button variant=\"quiet\" disabled={busy} onClick={() => setSelected(draft.kind === \"env\" ? new Set(envKeys.map((e) => e.key + e.text)) : defaultSelection(lines))}>\n Reset\n </Button>\n <Button variant=\"quiet\" disabled={busy} onClick={() => setSelected(new Set())}>\n None\n </Button>\n </>\n }\n >\n {draft.kind === \"env\" ? (\n <Windowed\n items={envKeys}\n render={(e) => {\n const id = e.key + e.text;\n return <PickLine key={id} title={e.key} detail=\"Value hidden\" checked={selected.has(id)} disabled={busy} onChange={(on) => toggle(setSelected, id, on)} />;\n }}\n />\n ) : lines.length === 0 ? (\n <Empty>Nothing to import in this file.</Empty>\n ) : (\n <Windowed\n items={lines}\n render={(l) => {\n const badge = STATE_BADGE[l.state];\n return <PickLine key={l.key} title={l.title} detail={l.reason ?? l.detail} checked={selected.has(l.key)} disabled={busy || !selectable(l)} badge={badge?.text} tone={badge?.tone} onChange={(on) => toggle(setSelected, l.key, on)} />;\n }}\n />\n )}\n </Section>\n {draft.kind === \"file\" && draft.parsed.kind === \"structured\" ? (\n <Section>\n <Row label=\"Visible details\" hint=\"Approve saving websites and public keys in the clear\">\n <Switch checked={approvedVisible} disabled={busy} onCheckedChange={setApprovedVisible} aria-label=\"Approve visible details\" />\n </Row>\n </Section>\n ) : null}\n {draft.kind === \"file\" ? <Notices draft={draft} /> : null}\n {draft.kind === \"file\" ? (\n <More>\n <Section>\n <Row label=\"Browser fill\" hint=\"Needs username, password and an https address\">\n <Switch checked={browserFill} disabled={busy} onCheckedChange={(on) => restart({ browserFill: on })} aria-label=\"Browser fill\" />\n </Row>\n {draft.parsed.kind === \"csv\"\n ? draft.parsed.preview.headers.map((header, index) => (\n <Row key={`${header}-${index}`} label={header || `Column ${index + 1}`}>\n <Select\n value={draft.mapping[index] ?? \"keep\"}\n options={ROLE_OPTIONS}\n aria-label={`Column ${header || index + 1}`}\n onValueChange={(role) => restart({ mapping: draft.mapping.map((r, i) => (i === index ? role : r)) })}\n />\n </Row>\n ))\n : null}\n </Section>\n </More>\n ) : null}\n {ambiguous ? <ErrorLine message=\"Each of name, username, password, notes and one-time password can be used by one column.\" /> : null}\n </>\n ) : null}\n\n {stage === \"done\" && done ? (\n <Section title=\"Result\">\n <Row label=\"Created\">\n <span className=\"text-foreground\">{done.created.length}</span>\n </Row>\n <Row label=\"Skipped\">\n <span className=\"text-foreground\">{done.skipped}</span>\n </Row>\n <Row label=\"Failed\">\n <span className={done.failed.length > 0 ? \"text-destructive\" : \"text-foreground\"}>{done.failed.length}</span>\n </Row>\n {done.untried.length > 0 ? (\n <Row label=\"Not tried\">\n <span className=\"text-foreground\">{done.untried.length}</span>\n </Row>\n ) : null}\n {done.withOtp > 0 ? (\n <Row label=\"Codes\">\n <span className=\"text-muted-foreground\">{plural(done.withOtp, \"login\")} still need the one-time password added.</span>\n </Row>\n ) : null}\n {done.failed.map((f) => (\n <Row key={f.key} label={f.title}>\n <span className=\"block truncate text-destructive\" title={f.reason}>\n {f.reason}\n </span>\n </Row>\n ))}\n </Section>\n ) : null}\n\n <ErrorLine message={error} />\n </Panel>\n );\n}\n\nfunction toggle(set: React.Dispatch<React.SetStateAction<Set<string>>>, key: string, on: boolean) {\n set((current) => {\n const next = new Set(current);\n if (on) next.add(key);\n else next.delete(key);\n return next;\n });\n}\n\nfunction summary(c: ReturnType<typeof countLines>, total: number): string {\n const parts = [`${c.selected} of ${total} selected`];\n if (c.cannot > 0) parts.push(`${c.cannot} can't be imported`);\n return parts.join(\" · \");\n}\n\nfunction Notices({ draft }: { draft: Extract<Draft, { kind: \"file\" }> }) {\n const notes: string[] = [];\n if (draft.parsed.kind === \"csv\" && draft.parsed.omittedCsvCount > 0) notes.push(`${plural(draft.parsed.omittedCsvCount, \"other CSV file\")} in the archive ${draft.parsed.omittedCsvCount === 1 ? \"is\" : \"are\"} not imported.`);\n if (draft.parsed.kind === \"structured\") {\n for (const n of draft.parsed.notices) {\n if (n.code === \"unsupported_archive_members\") notes.push(`${plural(n.count, \"archive file\")} cannot be imported.`);\n else if (n.code === \"unsupported_binary_definitions\") notes.push(`${plural(n.count, \"unused attachment\")} cannot be imported.`);\n else notes.push(`${plural(n.count, \"deleted item\")} had no saved contents.`);\n }\n }\n if (notes.length === 0) return null;\n return (\n <div className=\"flex flex-col gap-0.5 px-1 text-xs text-muted-foreground\">\n {notes.map((n) => (\n <span key={n}>{n}</span>\n ))}\n </div>\n );\n}\n","/** Local-only CSV normalization for Vault's first password-manager import. */\nimport type { VaultItemCreateRequest } from \"@ai-matrx/api/account\";\nimport { parseDelimited } from \"@ai-matrx/kit/delimited\";\n\nimport { isLoopbackUrl } from \"./loopback\";\n\nexport type CsvImportLimits = {\n maxFileBytes: number;\n maxRecords: number;\n maxColumns: number;\n maxCellBytes: number;\n maxFields: number;\n maxPlaintextFieldBytes: number;\n maxRequestBodyBytes: number;\n maxJsonDepth?: number;\n jsonWorkerTimeoutMs?: number;\n};\nexport type CsvColumnRole =\n \"title\" | \"username\" | \"password\" | \"url\" | \"notes\" | \"otp\" | \"keep\";\nexport type CsvImportRow = {\n rowNumber: number;\n cells: string[];\n issue?: \"invalid\" | \"unsupported\" | undefined;\n};\nexport type CsvImportPreview = {\n headers: string[];\n rows: CsvImportRow[];\n issues: number;\n};\nexport type CsvImportCommand = {\n rowId: string;\n body: VaultItemCreateRequest;\n hasOtp: boolean;\n};\nexport type CsvImportPreparation =\n | { status: \"ready\"; command: CsvImportCommand }\n | {\n status: \"skipped\";\n reason:\n | \"invalid\"\n | \"unsupported\"\n | \"deleted\"\n | \"archived\"\n | \"possible_duplicate\";\n }\n | { status: \"invalid\"; diagnostic: string };\nexport type CsvImportOutcome = {\n imported: number;\n skipped: number;\n failed: number;\n cancelled: boolean;\n definitive: boolean;\n /** The first command that was not confirmed. Reuse it on a same-session retry. */\n progressCursor: number;\n};\n\nexport type CsvImportDispatch = \"committed\" | \"retryable\" | \"definitive\";\n\n/** The request's owner: an organization's vault, or the person's own. */\nexport function principalOf(organizationId: string | null): NonNullable<VaultItemCreateRequest[\"principal\"]> {\n return organizationId ? { type: \"organization\", organization_id: organizationId } : { type: \"user\" };\n}\n\nfunction utf8ByteLength(value: string): number {\n if (typeof TextEncoder !== \"undefined\")\n return new TextEncoder().encode(value).byteLength;\n return unescape(encodeURIComponent(value)).length;\n}\n\nfunction csvParserInput(text: string): string {\n // The parser emits an extra empty record for the final record terminator. Remove\n // exactly that terminator; interior/explicit blank rows retain their numbers.\n return text.replace(/^\\uFEFF/, \"\").replace(/(?:\\r\\n|\\r|\\n)$/, \"\");\n}\n\nexport function parseCsvText(\n text: string,\n limits: CsvImportLimits,\n): CsvImportPreview {\n if (utf8ByteLength(text) > limits.maxFileBytes)\n throw new Error(\"The file exceeds this organization’s import size limit.\");\n const parsed = parseDelimited(csvParserInput(text), {\n delimiter: \",\",\n skipEmptyLines: false,\n });\n if (\n parsed.errors.some(\n (error) =>\n error.code !== \"TooFewFields\" && error.code !== \"TooManyFields\",\n )\n )\n throw new Error(\"The CSV could not be read. Fix the file and try again.\");\n return validateParsedCsv(parsed.data, limits);\n}\n\nfunction validateParsedCsv(\n parsed: string[][],\n limits: CsvImportLimits,\n): CsvImportPreview {\n const [headers, ...data] = parsed;\n if (!headers?.length || headers.length > limits.maxColumns)\n throw new Error(\"The CSV has an unsupported number of columns.\");\n if (data.length > limits.maxRecords)\n throw new Error(\"The CSV has more records than this organization allows.\");\n const nonLoginTypeColumn = headers.findIndex((header) =>\n /^(item )?(type|kind|category)$/i.test(header.trim()),\n );\n const unsupportedValueColumns = headers\n .map((header, index) =>\n /(?:^|[\\s_-])(passkey|webauthn|fido|attachment|file)(?:$|[\\s_-])/i.test(\n header.trim(),\n )\n ? index\n : -1,\n )\n .filter((index) => index >= 0);\n let issues = 0;\n const rows = data.map((cells, index) => {\n const invalid =\n cells.length !== headers.length ||\n cells.some((cell) => utf8ByteLength(cell) > limits.maxCellBytes) ||\n cells.every((cell) => cell.trim().length === 0);\n const type =\n nonLoginTypeColumn >= 0\n ? (cells[nonLoginTypeColumn] ?? \"\").trim().toLowerCase()\n : \"\";\n const unsupported =\n !invalid &&\n (unsupportedValueColumns.some((column) =>\n Boolean(cells[column]?.trim()),\n ) ||\n (Boolean(type) &&\n !/^(login|website|web|password|credential)$/.test(type)));\n if (invalid || unsupported) issues += 1;\n return {\n rowNumber: index + 2,\n cells,\n issue: invalid\n ? (\"invalid\" as const)\n : unsupported\n ? (\"unsupported\" as const)\n : undefined,\n };\n });\n return { headers, rows, issues };\n}\n\nexport function safeDestination(raw: string): {\n metadata: string | null;\n host: string | null;\n} {\n try {\n const parsed = new URL(raw);\n if (!/^https?:$/.test(parsed.protocol))\n return { metadata: null, host: null };\n if (parsed.username || parsed.password)\n return { metadata: null, host: null };\n return { metadata: parsed.origin, host: parsed.host };\n } catch {\n return { metadata: null, host: null };\n }\n}\n\nexport function suggestedCsvMapping(\n headers: string[],\n source?: string,\n): CsvColumnRole[] {\n const aliases: Record<CsvColumnRole, ReadonlySet<string>> = {\n title: new Set([\"name\", \"title\", \"label\"]),\n username: new Set([\n \"username\",\n \"user\",\n \"login\",\n \"email\",\n \"loginusername\",\n \"loginemail\",\n ]),\n password: new Set([\"password\", \"pass\", \"pwd\", \"loginpassword\"]),\n url: new Set([\n \"url\",\n \"uri\",\n \"website\",\n \"websiteaddress\",\n \"loginurl\",\n \"loginuri\",\n ]),\n notes: new Set([\"note\", \"notes\", \"extra\"]),\n otp: new Set([\"otp\", \"totp\", \"otpauth\", \"onetimepassword\", \"onetimecode\"]),\n keep: new Set(),\n };\n let usernameAssigned = false;\n return headers.map((header) => {\n const key = header.trim().toLowerCase().replace(/[ _-]/g, \"\");\n if (source === \"nordpass\" && key === \"email\" && usernameAssigned)\n return \"keep\";\n const role =\n (Object.entries(aliases) as [CsvColumnRole, ReadonlySet<string>][]).find(\n ([, values]) => values.has(key),\n )?.[0] ?? \"keep\";\n if (role === \"username\") usernameAssigned = true;\n return role;\n });\n}\n\nfunction fieldKey(index: number, used: Set<string>): string {\n const base = `import_column_${index + 1}`;\n let key = base;\n let suffix = 2;\n while (used.has(key)) key = `${base}_${suffix++}`;\n used.add(key);\n return key;\n}\n\nfunction roleValue(\n row: CsvImportRow,\n mapping: CsvColumnRole[],\n role: CsvColumnRole,\n): string | null {\n const index = mapping.findIndex((entry) => entry === role);\n return index < 0 ? null : (row.cells[index] ?? \"\");\n}\n\nexport function hasAmbiguousCsvMapping(mapping: CsvColumnRole[]): boolean {\n return ([\"title\", \"username\", \"password\", \"notes\", \"otp\"] as const).some(\n (role) => mapping.filter((entry) => entry === role).length > 1,\n );\n}\n\nexport function isPossibleDuplicateRow(\n row: CsvImportRow,\n _preview: CsvImportPreview,\n mapping: CsvColumnRole[],\n existingItems: { displayName: string; loginUrls: string[] }[],\n): boolean {\n if (row.issue) return false;\n const title =\n roleValue(row, mapping, \"title\") || `Imported credential ${row.rowNumber}`;\n const urls = row.cells\n .filter((_, index) => mapping[index] === \"url\")\n .map(safeDestination)\n .flatMap((destination) =>\n destination.metadata ? [destination.metadata] : [],\n );\n return existingItems.some((item) => {\n if (item.displayName !== title) return false;\n const existingOrigins = item.loginUrls\n .map(safeDestination)\n .flatMap((destination) =>\n destination.metadata ? [destination.metadata] : [],\n );\n return urls.length > 0\n ? existingOrigins.some((origin) => urls.includes(origin))\n : existingOrigins.length === 0;\n });\n}\n\nexport function prepareCsvImportRow(input: {\n source: string;\n preview: CsvImportPreview;\n row: CsvImportRow;\n mapping: CsvColumnRole[];\n /** null = the person's own vault. */\n organizationId: string | null;\n rowId: string;\n limits: CsvImportLimits;\n browserFillEnabled?: boolean;\n existingItems?: { displayName: string; loginUrls: string[] }[];\n skipPossibleDuplicate?: boolean;\n}): CsvImportPreparation {\n if (input.row.issue === \"invalid\")\n return { status: \"skipped\", reason: \"invalid\" };\n if (input.row.issue === \"unsupported\")\n return { status: \"skipped\", reason: \"unsupported\" };\n if (\n input.skipPossibleDuplicate &&\n isPossibleDuplicateRow(\n input.row,\n input.preview,\n input.mapping,\n input.existingItems ?? [],\n )\n )\n return { status: \"skipped\", reason: \"possible_duplicate\" };\n const { headers } = input.preview;\n const { row, mapping } = input;\n const title =\n roleValue(row, mapping, \"title\") || `Imported credential ${row.rowNumber}`;\n const rawUrls = row.cells\n .filter((_, index) => mapping[index] === \"url\")\n .filter(Boolean);\n const urls = rawUrls\n .map(safeDestination)\n .flatMap((url) => (url.metadata ? [url.metadata] : []));\n const fields: NonNullable<VaultItemCreateRequest[\"fields\"]> = [];\n const used = new Set<string>();\n const add = (field_key: string, value: string, editable = true) => {\n if (!value) return;\n used.add(field_key);\n fields.push({\n field_key,\n value,\n handling: \"revealable\",\n editable,\n inject_into_sandbox: false,\n });\n };\n add(\"username\", roleValue(row, mapping, \"username\") ?? \"\");\n add(\"password\", roleValue(row, mapping, \"password\") ?? \"\");\n add(\"import_notes\", roleValue(row, mapping, \"notes\") ?? \"\");\n for (let index = 0; index < row.cells.length; index += 1) {\n if (mapping[index] === \"keep\")\n add(fieldKey(index, used), row.cells[index] ?? \"\");\n }\n // OTP stays only in the encrypted, revealable source representation until explicit enrollment.\n add(\n \"import_source_record\",\n JSON.stringify({\n source_vendor: input.source,\n format: \"csv\",\n cells: row.cells.map((value: string, column_index: number) => ({\n column_index,\n header: headers[column_index] ?? \"\",\n value,\n })),\n }),\n false,\n );\n if (\n fields.length > input.limits.maxFields ||\n fields.some(\n (field) =>\n utf8ByteLength(field.value) > input.limits.maxPlaintextFieldBytes,\n )\n )\n return {\n status: \"invalid\",\n diagnostic: `Row ${row.rowNumber} exceeds this organization’s encrypted field limit.`,\n };\n const command: CsvImportCommand = {\n rowId: input.rowId,\n hasOtp: Boolean(roleValue(row, mapping, \"otp\")),\n body: {\n principal: principalOf(input.organizationId),\n display_name: title,\n definition_key: \"website_login\",\n source: \"system_import\",\n login_urls: urls,\n uri_match_mode: \"never\",\n browser_fill_enabled:\n Boolean(input.browserFillEnabled) &&\n Boolean(roleValue(row, mapping, \"username\")) &&\n Boolean(roleValue(row, mapping, \"password\")) &&\n urls.length > 0 &&\n urls.every(\n (url) => new URL(url).protocol === \"https:\" || isLoopbackUrl(url),\n ),\n fields,\n },\n };\n // The browser matcher treats `never` as an absolute refusal. Keep this pair\n // coherent with the explicit, eligible bulk opt-in rather than advertising a\n // fill capability the canonical matcher will always reject.\n if (command.body.browser_fill_enabled) command.body.uri_match_mode = \"host\";\n if (\n utf8ByteLength(JSON.stringify(command.body)) >\n input.limits.maxRequestBodyBytes\n )\n return {\n status: \"invalid\",\n diagnostic: `Row ${row.rowNumber} exceeds this organization’s request size limit.`,\n };\n return { status: \"ready\", command };\n}\n\n/** Compatibility helper for callers that only need a command after preparation. */\nexport function toCsvImportCommand(\n input: Parameters<typeof prepareCsvImportRow>[0],\n): CsvImportCommand | null {\n const prepared = prepareCsvImportRow(input);\n return prepared.status === \"ready\" ? prepared.command : null;\n}\n\n/** Dispatch only one immutable command at a time; cancellation never rolls back a committed row. */\nexport async function runCsvImportCommands(\n commands: Array<CsvImportCommand | null>,\n dispatch: (command: CsvImportCommand) => Promise<CsvImportDispatch>,\n cancelled: () => boolean,\n progressCursor = 0,\n): Promise<CsvImportOutcome> {\n let imported = 0;\n let skipped = 0;\n let failed = 0;\n for (let index = progressCursor; index < commands.length; index += 1) {\n const command = commands[index];\n if (cancelled())\n return {\n imported,\n skipped,\n failed,\n cancelled: true,\n definitive: false,\n progressCursor: index,\n };\n if (!command) {\n skipped += 1;\n continue;\n }\n const result = await dispatch(command);\n if (result === \"committed\") {\n imported += 1;\n continue;\n }\n failed += 1;\n // A retryable or definitive outcome retains this exact command/UUID for review.\n return {\n imported,\n skipped,\n failed,\n cancelled: result === \"definitive\" || cancelled(),\n definitive: result === \"definitive\",\n progressCursor: index,\n };\n }\n return {\n imported,\n skipped,\n failed,\n cancelled: cancelled(),\n definitive: false,\n progressCursor: commands.length,\n };\n}\n","/** A local development address: the one place a login over plain http is still trusted for browser fill. */\nexport function isLoopbackUrl(value: string | null | undefined): boolean {\n if (!value) return false;\n try {\n const hostname = new URL(value).hostname;\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\";\n } catch {\n return false;\n }\n}\n","/** Creating the chosen records one at a time, so a stop or a failure never loses what already landed. */\nimport type { ReviewLine } from \"./import-review\";\nimport type { CreatedItem, IoPort } from \"./port\";\n\nexport interface ImportFailure {\n key: string;\n title: string;\n reason: string;\n}\n\nexport interface ImportRunResult {\n created: CreatedItem[];\n failed: ImportFailure[];\n /** Created items that came with a one-time password the import could not enrol. */\n withOtp: number;\n /** The run ended before every line was tried (stopped, or too many failures in a row). */\n stoppedEarly: boolean;\n /** Lines never tried; a retry continues from here. */\n untried: ReviewLine[];\n}\n\nexport const MAX_FAILURES_IN_A_ROW = 5;\n\nexport interface ImportRunInput {\n io: IoPort;\n organizationId: string | null;\n lines: readonly ReviewLine[];\n /** One key per line, kept across retries: the server answers a repeated key with the first result. */\n keys: Map<string, string>;\n /** Wraps each call so a \"sign in again\" answer becomes a confirmation, not a failure. */\n confirmed: <T>(run: () => Promise<T>) => Promise<T>;\n onProgress?: (done: number, total: number) => void;\n shouldStop?: () => boolean;\n}\n\nconst failureText = (cause: unknown): string => (cause instanceof Error && cause.message ? cause.message : \"The server refused this one.\");\n\nexport async function runImport(input: ImportRunInput): Promise<ImportRunResult> {\n const { io, organizationId, lines, keys, confirmed } = input;\n const result: ImportRunResult = { created: [], failed: [], withOtp: 0, stoppedEarly: false, untried: [] };\n let streak = 0;\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n if (!line?.command) continue;\n if (input.shouldStop?.()) {\n result.stoppedEarly = true;\n result.untried = lines.slice(i);\n break;\n }\n let key = keys.get(line.key);\n if (!key) {\n key = crypto.randomUUID();\n keys.set(line.key, key);\n }\n const command = line.command;\n try {\n const made = await confirmed(() => io.createImported(command.body, organizationId, key));\n result.created.push(made);\n if (command.hasOtp) result.withOtp += 1;\n streak = 0;\n } catch (cause) {\n const reason = failureText(cause);\n result.failed.push({ key: line.key, title: line.title, reason });\n streak += 1;\n // Declining the sign-in check, or a server that keeps failing, ends the run here.\n if (/not confirmed/i.test(reason) || streak >= MAX_FAILURES_IN_A_ROW) {\n result.stoppedEarly = true;\n result.untried = lines.slice(i + 1);\n break;\n }\n }\n input.onProgress?.(i + 1, lines.length);\n }\n return result;\n}\n","import type { VaultItemCreateRequest } from \"@ai-matrx/api/account\";\nimport { principalOf, safeDestination, type CsvImportCommand, type CsvImportLimits, type CsvImportPreparation } from \"./csv-import\";\nimport { isLoopbackUrl } from \"./loopback\";\n\nexport type RejectedStructuredImportRecord = {\n status: \"invalid\" | \"unsupported\";\n ordinal: number;\n title: string;\n reason: string;\n};\ntype StructuredImportBase = {\n status: \"supported\";\n ordinal: number;\n title: string;\n sourceState: \"active\" | \"deleted\" | \"archived\";\n sourceRecord: string;\n hasOtp: boolean;\n notes?: string | undefined;\n};\nexport type StructuredImportRecord = RejectedStructuredImportRecord | (StructuredImportBase & (\n | { kind: \"website_login\"; urls: string[]; username: string | null; password: string | null }\n | { kind: \"custom\" }\n | { kind: \"ssh_key\"; privateKey: string; publicKey: string }\n));\n\nfunction bytes(value: string): number {\n return typeof TextEncoder !== \"undefined\"\n ? new TextEncoder().encode(value).byteLength\n : unescape(encodeURIComponent(value)).length;\n}\n\nexport function hasVisiblePublicKey(record: StructuredImportRecord): boolean {\n return record.status === \"supported\" && record.kind === \"ssh_key\";\n}\n\nexport function isPossibleStructuredImportDuplicate(\n record: StructuredImportRecord,\n existingItems: { displayName: string; loginUrls: string[] }[],\n): boolean {\n if (record.status !== \"supported\") return false;\n const destination = record.kind === \"website_login\" ? record.urls[0] : undefined;\n return existingItems.some((item) => {\n if (item.displayName !== record.title) return false;\n const existingOrigins = item.loginUrls.map(safeDestination).flatMap((url) => url.metadata ? [url.metadata] : []);\n return destination ? existingOrigins.includes(destination) : existingOrigins.length === 0;\n });\n}\n\nexport function prepareStructuredImportCommand(input: {\n record: StructuredImportRecord; organizationId: string | null;\n rowId: string; browserFillEnabled: boolean; includeDeleted: boolean; includeArchived: boolean;\n limits: CsvImportLimits; existingItems?: { displayName: string; loginUrls: string[] }[]; skipPossibleDuplicate?: boolean;\n}): CsvImportPreparation {\n const { record } = input;\n if (record.status === \"invalid\") return { status: \"invalid\", diagnostic: record.reason };\n if (record.status === \"unsupported\") return { status: \"skipped\", reason: \"unsupported\" };\n if (record.status !== \"supported\") return { status: \"invalid\", diagnostic: \"The record is invalid.\" };\n if (typeof record.sourceRecord !== \"string\" || record.sourceRecord.length === 0)\n return { status: \"invalid\", diagnostic: \"The record has no source representation.\" };\n if (record.sourceState === \"deleted\" && !input.includeDeleted) return { status: \"skipped\", reason: \"deleted\" };\n if (record.sourceState === \"archived\" && !input.includeArchived) return { status: \"skipped\", reason: \"archived\" };\n if (input.skipPossibleDuplicate && isPossibleStructuredImportDuplicate(record, input.existingItems ?? [])) return { status: \"skipped\", reason: \"possible_duplicate\" };\n const fields: NonNullable<VaultItemCreateRequest[\"fields\"]> = [{ field_key: \"import_source_record\", value: record.sourceRecord, handling: \"revealable\", editable: false, inject_into_sandbox: false }];\n const add = (field_key: string, value: string, handling: \"revealable\" | \"visible\" = \"revealable\", editable = true) => fields.push({ field_key, value, handling, editable, inject_into_sandbox: false });\n let browserFillEnabled = false; let uriMatchMode: \"host\" | \"never\" = \"never\";\n const destination = record.kind === \"website_login\" ? record.urls[0] : undefined;\n if (record.kind === \"website_login\") {\n if (record.username) add(\"username\", record.username);\n if (record.password) add(\"password\", record.password);\n browserFillEnabled = Boolean(input.browserFillEnabled && record.username && record.password && destination && (new URL(destination).protocol === \"https:\" || isLoopbackUrl(destination)));\n uriMatchMode = browserFillEnabled ? \"host\" : \"never\";\n }\n if (record.notes) add(\"import_notes\", record.notes);\n if (record.kind === \"ssh_key\") { add(\"private_key\", record.privateKey); add(\"public_key\", record.publicKey, \"visible\"); }\n const body: VaultItemCreateRequest = { principal: principalOf(input.organizationId), display_name: record.title, definition_key: record.kind, source: \"system_import\", login_urls: record.kind === \"website_login\" && destination ? [destination] : [], uri_match_mode: uriMatchMode, browser_fill_enabled: browserFillEnabled, fields };\n if (fields.length > input.limits.maxFields || fields.some((field) => bytes(field.value) > input.limits.maxPlaintextFieldBytes) || bytes(JSON.stringify(body)) > input.limits.maxRequestBodyBytes) return { status: \"invalid\", diagnostic: \"The record exceeds this organization’s encrypted field limit.\" };\n const command: CsvImportCommand = { rowId: input.rowId, hasOtp: record.hasOtp, body };\n return { status: \"ready\", command };\n}\n","/** What the person reviews before anything is created: one line per record, and the request each would send. */\nimport {\n isPossibleDuplicateRow,\n prepareCsvImportRow,\n safeDestination,\n type CsvColumnRole,\n type CsvImportCommand,\n type CsvImportLimits,\n} from \"./csv-import\";\nimport { isPossibleStructuredImportDuplicate, prepareStructuredImportCommand, type StructuredImportRecord } from \"./structured-import\";\nimport type { ParsedImport } from \"./parse-source\";\n\n/**\n * - `ready`: will be created. `duplicate`: looks like something already there (off until chosen).\n * - `deleted` / `archived`: in the old manager's trash or archive (off until chosen).\n * - `invalid` / `unsupported`: cannot be imported; `reason` says why.\n */\nexport type ReviewState = \"ready\" | \"duplicate\" | \"deleted\" | \"archived\" | \"invalid\" | \"unsupported\";\n\nexport interface ReviewLine {\n key: string;\n title: string;\n detail: string;\n state: ReviewState;\n reason: string | null;\n /** Present when the record can be created. Its `rowId` is a placeholder: the run assigns the real key. */\n command: CsvImportCommand | null;\n}\n\nexport interface ExistingItem {\n displayName: string;\n loginUrls: string[];\n}\n\nexport interface ReviewOptions {\n organizationId: string | null;\n browserFill: boolean;\n existing: readonly ExistingItem[];\n limits: CsvImportLimits;\n /** CSV only: what each column is. */\n mapping: readonly CsvColumnRole[];\n}\n\nconst KIND_LABEL: Record<string, string> = { website_login: \"Login\", ssh_key: \"SSH key\", custom: \"Secure note\" };\n\n/** Lines that start switched on. */\nexport function defaultSelection(lines: readonly ReviewLine[]): Set<string> {\n return new Set(lines.filter((l) => l.state === \"ready\").map((l) => l.key));\n}\n\nexport function selectable(line: ReviewLine): boolean {\n return line.command !== null;\n}\n\nexport function reviewLines(parsed: ParsedImport, o: ReviewOptions): ReviewLine[] {\n const existing = [...o.existing];\n if (parsed.kind === \"csv\") {\n const { preview, vendor } = parsed;\n const mapping = [...o.mapping];\n return preview.rows.map((row): ReviewLine => {\n const cell = (role: CsvColumnRole) => row.cells[mapping.indexOf(role)] ?? \"\";\n const title = cell(\"title\") || `Imported credential ${row.rowNumber}`;\n const hosts = row.cells\n .filter((_, i) => mapping[i] === \"url\")\n .map((u) => safeDestination(u).host)\n .filter((h): h is string => Boolean(h));\n const has = [cell(\"username\") && \"username\", cell(\"password\") && \"password\", cell(\"otp\") && \"one-time password\"].filter(Boolean).join(\", \");\n const detail = [hosts.join(\", \"), has].filter(Boolean).join(\" · \");\n const key = `row-${row.rowNumber}`;\n if (row.issue === \"invalid\") return { key, title: `Row ${row.rowNumber}`, detail: \"\", state: \"invalid\", reason: \"This row could not be read.\", command: null };\n if (row.issue === \"unsupported\") return { key, title, detail, state: \"unsupported\", reason: \"Not a login (a passkey, file or other type).\", command: null };\n // Duplicates are not skipped here: that is the person's switch, so the command always exists.\n const prepared = prepareCsvImportRow({ source: vendor, preview, row, mapping, organizationId: o.organizationId, rowId: key, limits: o.limits, browserFillEnabled: o.browserFill });\n if (prepared.status === \"invalid\") return { key, title, detail, state: \"invalid\", reason: prepared.diagnostic, command: null };\n if (prepared.status === \"skipped\") return { key, title, detail, state: \"unsupported\", reason: \"Skipped.\", command: null };\n const command = prepared.command;\n const duplicate = isPossibleDuplicateRow(row, preview, mapping, existing);\n return { key, title, detail, state: duplicate ? \"duplicate\" : \"ready\", reason: duplicate ? \"Looks like one you already have.\" : null, command };\n });\n }\n return parsed.records.map((record): ReviewLine => structuredLine(record, o, existing));\n}\n\nfunction structuredLine(record: StructuredImportRecord, o: ReviewOptions, existing: ExistingItem[]): ReviewLine {\n const key = `record-${record.ordinal}`;\n if (record.status !== \"supported\") {\n return { key, title: record.title, detail: \"\", state: record.status, reason: record.reason, command: null };\n }\n const destination = record.kind === \"website_login\" ? record.urls[0] : undefined;\n let host = \"\";\n try {\n host = destination ? new URL(destination).host : \"\";\n } catch {\n host = \"\";\n }\n const detail = [KIND_LABEL[record.kind] ?? record.kind, host].filter(Boolean).join(\" · \");\n const prepared = prepareStructuredImportCommand({ record, organizationId: o.organizationId, rowId: key, browserFillEnabled: o.browserFill, includeDeleted: true, includeArchived: true, limits: o.limits });\n if (prepared.status === \"invalid\") return { key, title: record.title, detail, state: \"invalid\", reason: prepared.diagnostic, command: null };\n if (prepared.status === \"skipped\") return { key, title: record.title, detail, state: \"unsupported\", reason: \"Skipped.\", command: null };\n const command = prepared.command;\n if (record.sourceState === \"deleted\") return { key, title: record.title, detail, state: \"deleted\", reason: \"Was in the old manager's trash.\", command };\n if (record.sourceState === \"archived\") return { key, title: record.title, detail, state: \"archived\", reason: \"Was archived in the old manager.\", command };\n if (isPossibleStructuredImportDuplicate(record, existing)) return { key, title: record.title, detail, state: \"duplicate\", reason: \"Looks like one you already have.\", command };\n return { key, title: record.title, detail, state: \"ready\", reason: null, command };\n}\n\nexport interface ReviewCounts {\n ready: number;\n selected: number;\n held: number;\n cannot: number;\n}\n\nexport function countLines(lines: readonly ReviewLine[], selected: ReadonlySet<string>): ReviewCounts {\n let ready = 0;\n let held = 0;\n let cannot = 0;\n for (const l of lines) {\n if (!selectable(l)) cannot += 1;\n else if (l.state === \"ready\") ready += 1;\n else held += 1;\n }\n return { ready, selected: lines.filter((l) => selected.has(l.key) && selectable(l)).length, held, cannot };\n}\n","/** Where an import comes from: the choices, how a file is recognised, and `.env` text. */\nimport type { SelectOption } from \"@ai-matrx/design-system/controls\";\n// Static, never `await import()`: the archive readers (bounded-zip) import zip.js statically into\n// the same bundle, and a module reached both ways makes Turbopack's scope hoisting fail the host\n// build (\"ModuleId not found for ident … @zip.js/zip.js/lib/core/util/default-mime-type.js\").\nimport { BlobReader, ZipReader } from \"@zip.js/zip.js\";\n\nexport type CsvVendor =\n | \"generic\"\n | \"chrome\"\n | \"bitwarden\"\n | \"1password\"\n | \"lastpass\"\n | \"apple\"\n | \"edge\"\n | \"firefox\"\n | \"dashlane\"\n | \"nordpass\"\n | \"keeper\"\n | \"proton\"\n | \"roboform\"\n | \"keepass\";\nexport type StructuredSource = \"bitwarden_json\" | \"1password_1pux\" | \"proton_pass\" | \"keepass_xml\";\n/** `auto` means \"look at the file I choose\". */\nexport type ImportSource = \"auto\" | \"env\" | StructuredSource | CsvVendor;\n\nconst CSV_VENDORS: readonly CsvVendor[] = [\"generic\", \"chrome\", \"bitwarden\", \"1password\", \"lastpass\", \"apple\", \"edge\", \"firefox\", \"dashlane\", \"nordpass\", \"keeper\", \"proton\", \"roboform\", \"keepass\"];\nconst STRUCTURED: readonly StructuredSource[] = [\"bitwarden_json\", \"1password_1pux\", \"proton_pass\", \"keepass_xml\"];\n\nexport const isStructuredSource = (s: ImportSource): s is StructuredSource => (STRUCTURED as readonly string[]).includes(s);\nexport const isCsvVendor = (s: ImportSource): s is CsvVendor => (CSV_VENDORS as readonly string[]).includes(s);\n\nexport const SOURCE_OPTIONS: readonly SelectOption<ImportSource>[] = [\n { value: \"auto\", label: \"Detect from the file\" },\n { value: \"env\", label: \".env text\" },\n { value: \"bitwarden_json\", label: \"Bitwarden (JSON)\" },\n { value: \"1password_1pux\", label: \"1Password (1PUX)\" },\n { value: \"proton_pass\", label: \"Proton Pass (JSON or ZIP)\" },\n { value: \"keepass_xml\", label: \"KeePass (XML)\" },\n { value: \"chrome\", label: \"Chrome / Google (CSV)\" },\n { value: \"apple\", label: \"Apple Passwords (CSV)\" },\n { value: \"edge\", label: \"Edge (CSV)\" },\n { value: \"firefox\", label: \"Firefox (CSV)\" },\n { value: \"lastpass\", label: \"LastPass (CSV)\" },\n { value: \"bitwarden\", label: \"Bitwarden (CSV)\" },\n { value: \"1password\", label: \"1Password (CSV)\" },\n { value: \"dashlane\", label: \"Dashlane (CSV or ZIP)\" },\n { value: \"nordpass\", label: \"NordPass (CSV)\" },\n { value: \"keeper\", label: \"Keeper (CSV)\" },\n { value: \"roboform\", label: \"RoboForm (CSV)\" },\n { value: \"proton\", label: \"Proton Pass (CSV)\" },\n { value: \"keepass\", label: \"KeePass (CSV)\" },\n { value: \"generic\", label: \"Other (CSV)\" },\n];\n\n/** What the file picker offers for a source. */\nexport function acceptFor(source: ImportSource): string {\n switch (source) {\n case \"env\":\n return \".env,.txt,text/plain\";\n case \"bitwarden_json\":\n return \".json,application/json\";\n case \"1password_1pux\":\n return \".1pux,application/zip\";\n case \"proton_pass\":\n return \".json,.zip,application/json,application/zip\";\n case \"keepass_xml\":\n return \".xml,application/xml,text/xml\";\n case \"dashlane\":\n return \".csv,text/csv,.zip,application/zip\";\n case \"auto\":\n return \".csv,.json,.zip,.1pux,.xml,.env,.txt\";\n default:\n return \".csv,text/csv\";\n }\n}\n\n/** Each manager's own page on exporting from it. */\nexport const EXPORT_HELP: Partial<Record<ImportSource, string>> = {\n chrome: \"https://support.google.com/chrome/answer/13068232\",\n bitwarden: \"https://bitwarden.com/help/export-your-data/\",\n bitwarden_json: \"https://bitwarden.com/help/export-your-data/\",\n \"1password\": \"https://support.1password.com/export/\",\n \"1password_1pux\": \"https://support.1password.com/export/\",\n proton_pass: \"https://proton.me/support/pass-export\",\n proton: \"https://proton.me/support/pass-export\",\n keepass_xml: \"https://keepass.info/help/base/importexport.html\",\n keepass: \"https://keepassxc.org/docs/KeePassXC_UserGuide\",\n lastpass: \"https://support.lastpass.com/s/document-item?language=en_US&bundleId=lastpass&topicId=LastPass/export-your-vault-data.html\",\n apple: \"https://support.apple.com/en-au/guide/passwords/mchl35b12625/mac\",\n edge: \"https://support.microsoft.com/en-us/edge/export-passwords-in-microsoft-edge\",\n firefox: \"https://support.mozilla.org/en-US/kb/export-login-data-firefox\",\n dashlane: \"https://support.dashlane.com/hc/en-us/articles/32905278138002-Export-your-Dashlane-data-to-a-CSV\",\n nordpass: \"https://support.nordpass.com/hc/en-us/articles/360007646477-How-to-export-passwords-from-NordPass\",\n keeper: \"https://docs.keeper.io/user-guides/web-vault\",\n roboform: \"https://help.roboform.com/hc/en-us/articles/230425008-How-to-export-your-RoboForm-logins-into-a-CSV-file\",\n};\n\n/** The first bytes of a JSON export are enough to tell Bitwarden from Proton Pass. */\nexport function sniffJson(head: string): StructuredSource {\n return /\"vaults\"\\s*:/.test(head) ? \"proton_pass\" : \"bitwarden_json\";\n}\n\n/** A ZIP is Dashlane's when it carries top-level CSV files; otherwise it is Proton Pass's. */\nexport function sniffZip(names: readonly string[]): \"dashlane\" | \"proton_pass\" {\n return names.some((n) => !n.includes(\"/\") && n.toLowerCase().endsWith(\".csv\")) ? \"dashlane\" : \"proton_pass\";\n}\n\nasync function zipNames(file: Blob): Promise<string[]> {\n const reader = new ZipReader(new BlobReader(file));\n try {\n return (await reader.getEntries()).map((e) => e.filename);\n } finally {\n await reader.close();\n }\n}\n\n/** Which source a chosen file is. Unrecognised files are read as CSV. */\nexport async function detectSource(file: File): Promise<Exclude<ImportSource, \"auto\">> {\n const name = file.name.toLowerCase();\n if (name.endsWith(\".1pux\")) return \"1password_1pux\";\n if (name.endsWith(\".xml\")) return \"keepass_xml\";\n if (name.endsWith(\".json\")) return sniffJson(await file.slice(0, 4096).text());\n if (name.endsWith(\".zip\")) return sniffZip(await zipNames(file));\n if (name.endsWith(\".env\") || name === \".env\") return \"env\";\n return \"generic\";\n}\n\n// ── .env text ────────────────────────────────────────────────────────────────\n\nexport interface EnvEntry {\n key: string;\n /** The text of the entry as written (one line, or the lines of a quoted value). */\n text: string;\n}\n\n/**\n * The `KEY=value` entries in some text, so a person can choose which to save. A value that opens a\n * quote and closes it on a later line is one entry. Comments and anything that is not an assignment\n * are ignored; the server parses the text it is sent with its own (authoritative) rules.\n */\nexport function parseEnvEntries(text: string): EnvEntry[] {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const entries: EnvEntry[] = [];\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] ?? \"\";\n const m = /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_.-]*)\\s*=(.*)$/.exec(line);\n if (!m) continue;\n const key = m[1] ?? \"\";\n const rest = (m[2] ?? \"\").trimStart();\n const quote = rest[0] === '\"' || rest[0] === \"'\" ? rest[0] : null;\n let entry = line;\n if (quote && !closesQuote(rest.slice(1), quote)) {\n let j = i + 1;\n while (j < lines.length) {\n entry += `\\n${lines[j] ?? \"\"}`;\n if (closesQuote(lines[j] ?? \"\", quote)) break;\n j += 1;\n }\n if (j < lines.length) i = j;\n }\n entries.push({ key, text: entry });\n }\n return entries;\n}\n\nfunction closesQuote(rest: string, quote: string): boolean {\n for (let i = 0; i < rest.length; i += 1) {\n if (rest[i] === \"\\\\\" && quote === '\"') i += 1;\n else if (rest[i] === quote) return true;\n }\n return false;\n}\n","import { BlobReader, ZipReader, type Entry } from \"@zip.js/zip.js\";\n\nimport type { CsvImportLimits } from \"./csv-import\";\n\nexport type BoundedZip = {\n entries: readonly Entry[];\n readRange: (entry: Entry) => Promise<void>;\n readText: (entry: Entry) => Promise<string>;\n assertActive: () => void;\n close: () => Promise<void>;\n};\n\nconst safe = (value: number) => Number.isSafeInteger(value) && value >= 0;\nconst unsafeName = (name: string) => /[\\\\\\0-\\x1F\\x7F-\\x9F]/.test(name);\n\nfunction stopIfCancelled(signal?: AbortSignal): void {\n if (signal?.aborted) throw new Error(\"The archive import was cancelled.\");\n}\n\nfunction hasWarnings(reader: ZipReader<Blob>, entry: Entry): boolean {\n return Boolean(reader.warnings?.length || entry.warnings?.length);\n}\n\nfunction boundedText(limit: number, used: { value: number }) {\n let size = 0;\n const parts: Uint8Array[] = [];\n return {\n writable: new WritableStream<Uint8Array>({\n write(chunk) {\n if (used.value > limit - chunk.byteLength)\n throw new Error(\"The archive exceeds the organization size limit.\");\n used.value += chunk.byteLength;\n size += chunk.byteLength;\n parts.push(chunk);\n },\n }),\n text: () => {\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const part of parts) {\n bytes.set(part, offset);\n offset += part.byteLength;\n }\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n },\n };\n}\n\n/** zip.js provides directory getData at runtime while omitting it from its Entry type. */\nasync function directoryRange(\n entry: Entry,\n signal?: AbortSignal,\n): Promise<void> {\n if (!(\"getData\" in entry) || typeof entry.getData !== \"function\")\n throw new Error(\"The archive is unsafe.\");\n await entry.getData(new WritableStream<Uint8Array>(), {\n checkOverlappingEntryOnly: true,\n ...(signal ? { signal } : {}),\n });\n}\n\n/**\n * Opens a ZIP under vendor-neutral structural limits. Callers retain ownership of\n * their member grammar and may only read an entry through this object.\n */\nexport async function openBoundedZip(\n file: Blob,\n limits: Pick<CsvImportLimits, \"maxFileBytes\" | \"maxRecords\">,\n signal?: AbortSignal,\n): Promise<BoundedZip> {\n if (file.size > limits.maxFileBytes)\n throw new Error(\"The archive exceeds the organization size limit.\");\n const reader = new ZipReader(new BlobReader(file), {\n strictness: \"strict\",\n filenameValidation: \"strict\",\n checkAmbiguity: true,\n });\n try {\n stopIfCancelled(signal);\n const entries = await reader.getEntries();\n if (reader.warnings?.length || entries.length > limits.maxRecords)\n throw new Error(\"The archive is unsafe.\");\n const names = new Set<string>();\n let declared = 0;\n for (const entry of entries) {\n const unixType = (entry.externalFileAttributes >>> 16) & 0o170000;\n if (\n names.has(entry.filename) ||\n unsafeName(entry.filename) ||\n !safe(entry.compressedSize) ||\n !safe(entry.uncompressedSize) ||\n !safe(entry.offset) ||\n declared > limits.maxFileBytes - entry.uncompressedSize ||\n entry.encrypted ||\n (entry.directory\n ? unixType !== 0 && unixType !== 0o040000\n : unixType !== 0 && unixType !== 0o100000)\n )\n throw new Error(\"The archive is unsafe.\");\n names.add(entry.filename);\n declared += entry.uncompressedSize;\n }\n const used = { value: declared };\n const ownedEntries = new Set(entries);\n const ensureOwnedAndSafe = (entry: Entry) => {\n if (!ownedEntries.has(entry) || hasWarnings(reader, entry))\n throw new Error(\"The archive is unsafe.\");\n };\n const readRange = async (entry: Entry) => {\n ensureOwnedAndSafe(entry);\n stopIfCancelled(signal);\n if (entry.directory) await directoryRange(entry, signal);\n else\n await entry.getData(new WritableStream<Uint8Array>(), {\n checkOverlappingEntryOnly: true,\n ...(signal ? { signal } : {}),\n });\n stopIfCancelled(signal);\n ensureOwnedAndSafe(entry);\n };\n return {\n entries: Object.freeze([...entries]),\n assertActive: () => stopIfCancelled(signal),\n readRange,\n readText: async (entry) => {\n ensureOwnedAndSafe(entry);\n if (entry.directory) throw new Error(\"The archive is unsafe.\");\n await readRange(entry);\n const output = boundedText(limits.maxFileBytes, used);\n try {\n await entry.getData(output.writable, { checkCrc32: true, ...(signal ? { signal } : {}) });\n } catch (error) {\n if (used.value >= limits.maxFileBytes)\n throw new Error(\"The archive exceeds the organization size limit.\");\n throw error;\n }\n stopIfCancelled(signal);\n ensureOwnedAndSafe(entry);\n return output.text();\n },\n close: () => reader.close(),\n };\n } catch (error) {\n await reader.close();\n if (signal?.aborted) throw new Error(\"The archive import was cancelled.\");\n throw error;\n }\n}\n","import type { Entry } from \"@zip.js/zip.js\";\n\nimport type { CsvImportLimits } from \"./csv-import\";\nimport { openBoundedZip } from \"./bounded-zip\";\n\nexport type DashlaneCsvArchive = {\n credentialsText: string;\n omittedCsvCount: number;\n};\n\nfunction invalid(): never {\n throw new Error(\"The Dashlane archive is invalid.\");\n}\n\nfunction isTopLevelCsv(entry: Entry): boolean {\n return (\n !entry.directory &&\n !entry.filename.includes(\"/\") &&\n entry.filename.toLowerCase().endsWith(\".csv\")\n );\n}\n\n/**\n * Reads Dashlane's ZIP container without assuming the undocumented CSV schema.\n * Other Dashlane CSVs are range-validated before they are visibly omitted.\n */\nexport async function readDashlaneCsvArchive(\n file: Blob,\n limits: Pick<CsvImportLimits, \"maxFileBytes\" | \"maxRecords\">,\n signal?: AbortSignal,\n): Promise<DashlaneCsvArchive> {\n let archive: Awaited<ReturnType<typeof openBoundedZip>> | undefined;\n let credentialsText: string | undefined;\n try {\n archive = await openBoundedZip(file, limits, signal);\n let credentials: Entry | undefined;\n let omittedCsvCount = 0;\n\n for (const entry of archive.entries) {\n if (!isTopLevelCsv(entry)) invalid();\n if (entry.filename.toLowerCase() === \"credentials.csv\") {\n if (credentials) invalid();\n credentials = entry;\n } else {\n omittedCsvCount += 1;\n }\n }\n if (!credentials) invalid();\n\n for (const entry of archive.entries) {\n if (entry === credentials) continue;\n await archive.readRange(entry);\n }\n archive.assertActive();\n credentialsText = await archive.readText(credentials);\n archive.assertActive();\n return { credentialsText, omittedCsvCount };\n } catch (error) {\n credentialsText = undefined;\n if (signal?.aborted) throw new Error(\"The Dashlane import was cancelled.\");\n throw error;\n } finally {\n credentialsText = undefined;\n await archive?.close();\n }\n}\n","/**\n * A CSV FILE parses off the main thread. This module STARTS the worker, so the worker must never\n * reach it: `csv-import.worker.ts` imports only `csv-import.ts`, never this file. A worker that\n * reaches the module that starts it makes Turbopack's production compile run forever\n * (`pnpm check:worker-cycles`).\n */\nimport { parseCsvText, type CsvImportLimits, type CsvImportPreview } from \"./csv-import\";\nimport type { CsvWorkerRequest, CsvWorkerResponse } from \"./csv-import.worker\";\n\nexport function parseCsvFile(\n file: File,\n limits: CsvImportLimits,\n): Promise<CsvImportPreview> {\n if (file.size > limits.maxFileBytes)\n return Promise.reject(\n new Error(\"The file exceeds this organization’s import size limit.\"),\n );\n return file.arrayBuffer().then((bytes) => {\n let text: string;\n try {\n text = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n } catch {\n throw new Error(\"The CSV must be valid UTF-8.\");\n }\n // One parser for paste and file (Alchemy's delimited parser). A file can be as large as the\n // organization's limit, so it parses in a worker; with no Worker (tests, SSR) it parses here.\n if (typeof Worker === \"undefined\") return parseCsvText(text, limits);\n return import(\"./csv-import-worker-client\").then(\n ({ createCsvImportWorker }) =>\n new Promise<CsvImportPreview>((resolve, reject) => {\n const worker = createCsvImportWorker();\n const unreadable = () =>\n reject(\n new Error(\n \"The CSV could not be read. Fix the file and try again.\",\n ),\n );\n worker.onmessage = (event: MessageEvent<CsvWorkerResponse>) => {\n worker.terminate();\n if (event.data.ok) resolve(event.data.preview);\n else reject(new Error(event.data.message));\n };\n worker.onerror = () => {\n worker.terminate();\n unreadable();\n };\n worker.postMessage({ text, limits } satisfies CsvWorkerRequest);\n }),\n );\n });\n}\n","export type StructuredImportSource = {\n id: \"bitwarden_json\" | \"1password_1pux\" | \"proton_pass\" | \"keepass_xml\";\n accept: string;\n supportsDeleted: boolean;\n supportsArchived: boolean;\n parseError: string;\n timeoutError: string;\n loadWorker: () => Promise<{\n create: () => Worker;\n cancel: (worker: Worker, requestId: string) => void;\n }>;\n};\n\nconst sources: Record<StructuredImportSource[\"id\"], StructuredImportSource> = {\n bitwarden_json: {\n id: \"bitwarden_json\",\n accept: \".json,application/json\",\n supportsDeleted: true,\n supportsArchived: false,\n parseError: \"The JSON export could not be read.\",\n timeoutError:\n \"The JSON export took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./bitwarden-json-worker-client\");\n return {\n create: client.createBitwardenJsonWorker,\n cancel: client.cancelBitwardenJsonWorker,\n };\n },\n },\n \"1password_1pux\": {\n id: \"1password_1pux\",\n accept: \".1pux,application/zip\",\n supportsDeleted: true,\n supportsArchived: true,\n parseError: \"The 1Password archive could not be read.\",\n timeoutError:\n \"The 1Password archive took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./onepux-worker-client\");\n return {\n create: client.createOnePuxWorker,\n cancel: client.cancelOnePuxWorker,\n };\n },\n },\n proton_pass: {\n id: \"proton_pass\",\n accept: \".json,.zip,application/json,application/zip\",\n supportsDeleted: true,\n supportsArchived: false,\n parseError: \"The Proton Pass export could not be read.\",\n timeoutError:\n \"The Proton Pass export took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./proton-pass-worker-client\");\n return {\n create: client.createProtonPassWorker,\n cancel: client.cancelProtonPassWorker,\n };\n },\n },\n keepass_xml: {\n id: \"keepass_xml\",\n accept: \".xml,application/xml,text/xml\",\n supportsDeleted: true,\n supportsArchived: false,\n parseError: \"The KeePass XML export could not be read.\",\n timeoutError:\n \"The KeePass XML export took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./keepass-xml-worker-client\");\n return {\n create: client.createKeePassXmlWorker,\n cancel: client.cancelKeePassXmlWorker,\n };\n },\n },\n};\n\nexport function structuredImportSource(\n source: string,\n): StructuredImportSource | undefined {\n return source === \"bitwarden_json\" ||\n source === \"1password_1pux\" ||\n source === \"proton_pass\" ||\n source === \"keepass_xml\"\n ? sources[source]\n : undefined;\n}\n","import type { CsvImportLimits } from \"./csv-import\";\nimport type { StructuredImportRecord } from \"./structured-import\";\n\n/** Shared worker envelope for bounded structured-password-manager imports. */\nexport type StructuredImportWorkerLimits = Pick<\n CsvImportLimits,\n \"maxFileBytes\" | \"maxRecords\" | \"maxCellBytes\"\n> & {\n maxJsonDepth: number;\n};\n\nexport type StructuredImportWorkerRequest =\n | {\n type: \"parse\";\n requestId: string;\n file: Blob;\n limits: StructuredImportWorkerLimits;\n }\n | { type: \"cancel\"; requestId: string };\n\nexport const STRUCTURED_IMPORT_FILE_NOTICE_CODES = [\n \"unsupported_archive_members\",\n \"unsupported_binary_definitions\",\n \"deleted_tombstones\",\n] as const;\n\nexport type StructuredImportFileNoticeCode =\n (typeof STRUCTURED_IMPORT_FILE_NOTICE_CODES)[number];\n\nexport type StructuredImportFileNotice = {\n code: StructuredImportFileNoticeCode;\n count: number;\n};\n\n/** Reject untrusted worker messages rather than displaying source-controlled text. */\nexport function hasValidStructuredImportFileNotices(\n value: unknown,\n maxCount: number,\n): value is StructuredImportFileNotice[] {\n if (!Number.isSafeInteger(maxCount) || maxCount <= 0 || !Array.isArray(value) || value.length > 3)\n return false;\n const seen = new Set<string>();\n return value.every((notice) => {\n if (\n !notice ||\n typeof notice !== \"object\" ||\n Array.isArray(notice) ||\n !Object.hasOwn(notice, \"code\") ||\n !Object.hasOwn(notice, \"count\") ||\n Object.keys(notice).length !== 2 ||\n !STRUCTURED_IMPORT_FILE_NOTICE_CODES.includes(\n (notice as { code?: unknown }).code as StructuredImportFileNoticeCode,\n ) ||\n !Number.isSafeInteger((notice as { count?: unknown }).count) ||\n (notice as { count: number }).count <= 0 ||\n (notice as { count: number }).count > maxCount\n )\n return false;\n const code = (notice as { code: string }).code;\n if (seen.has(code)) return false;\n seen.add(code);\n return true;\n });\n}\n\nexport type StructuredImportWorkerSuccess = {\n ok: true;\n requestId: string;\n records: StructuredImportRecord[];\n fileNotices: StructuredImportFileNotice[];\n};\n\nexport type StructuredImportWorkerFailure = {\n ok: false;\n requestId: string;\n error: string;\n};\n\nexport type StructuredImportWorkerResponse =\n StructuredImportWorkerSuccess | StructuredImportWorkerFailure;\n","/** Reading a chosen file into records, off the main thread. Nothing here talks to the server. */\nimport { readDashlaneCsvArchive } from \"./dashlane-csv-archive\";\nimport { parseCsvFile } from \"./csv-import-file\";\nimport type { CsvImportLimits, CsvImportPreview } from \"./csv-import\";\nimport type { ImportLimits } from \"./csv-import-limits\";\nimport { isStructuredSource, type CsvVendor, type ImportSource, type StructuredSource } from \"./import-source\";\nimport { structuredImportSource } from \"./structured-import-source-registry\";\nimport type { StructuredImportRecord } from \"./structured-import\";\nimport { hasValidStructuredImportFileNotices, type StructuredImportFileNotice, type StructuredImportWorkerResponse } from \"./structured-import-worker-protocol\";\n\nexport type ParsedImport =\n | { kind: \"csv\"; vendor: CsvVendor; preview: CsvImportPreview; omittedCsvCount: number }\n | { kind: \"structured\"; source: StructuredSource; records: StructuredImportRecord[]; notices: StructuredImportFileNotice[] };\n\nconst cancelled = () => new Error(\"The import was cancelled.\");\n\nfunction parseStructured(source: StructuredSource, file: File, limits: ImportLimits, signal: AbortSignal): Promise<{ records: StructuredImportRecord[]; notices: StructuredImportFileNotice[] }> {\n const descriptor = structuredImportSource(source);\n if (!descriptor) return Promise.reject(new Error(\"This kind of file cannot be imported.\"));\n if (file.size > limits.maxFileBytes) return Promise.reject(new Error(\"The file is larger than an import may be.\"));\n if (typeof Worker === \"undefined\") return Promise.reject(new Error(\"Importing this kind of file needs a browser that runs background workers.\"));\n return descriptor.loadWorker().then(\n (client) =>\n new Promise((resolve, reject) => {\n if (signal.aborted) return reject(cancelled());\n const worker = client.create();\n const requestId = crypto.randomUUID();\n let settled = false;\n const finish = (run: () => void) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n worker.terminate();\n run();\n };\n const onAbort = () => {\n client.cancel(worker, requestId);\n finish(() => reject(cancelled()));\n };\n const timer = window.setTimeout(() => finish(() => reject(new Error(descriptor.timeoutError))), limits.jsonWorkerTimeoutMs);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n worker.onerror = () => finish(() => reject(new Error(descriptor.parseError)));\n worker.onmessageerror = () => finish(() => reject(new Error(descriptor.parseError)));\n worker.onmessage = (event: MessageEvent<StructuredImportWorkerResponse>) => {\n if (event.data.requestId !== requestId) return;\n const data = event.data;\n if (!data.ok || !hasValidStructuredImportFileNotices(data.fileNotices, limits.maxRecords)) return finish(() => reject(new Error(descriptor.parseError)));\n finish(() => resolve({ records: data.records, notices: data.fileNotices }));\n };\n worker.postMessage({ type: \"parse\", requestId, file, limits: { maxFileBytes: limits.maxFileBytes, maxRecords: limits.maxRecords, maxCellBytes: limits.maxCellBytes, maxJsonDepth: limits.maxJsonDepth } });\n }),\n );\n}\n\n/** Read `file` as `source` (already resolved: never \"auto\" or \"env\"). */\nexport async function parseImportFile(source: Exclude<ImportSource, \"auto\" | \"env\">, file: File, limits: ImportLimits, signal: AbortSignal): Promise<ParsedImport> {\n if (isStructuredSource(source)) {\n const { records, notices } = await parseStructured(source, file, limits, signal);\n return { kind: \"structured\", source, records, notices };\n }\n const csvLimits: CsvImportLimits = limits;\n if (source === \"dashlane\" && file.name.toLowerCase().endsWith(\".zip\")) {\n const archive = await readDashlaneCsvArchive(file, csvLimits, signal);\n const preview = await parseCsvFile(new File([archive.credentialsText], \"credentials.csv\", { type: \"text/csv\" }), csvLimits);\n return { kind: \"csv\", vendor: \"dashlane\", preview, omittedCsvCount: archive.omittedCsvCount };\n }\n return { kind: \"csv\", vendor: source, preview: await parseCsvFile(file, csvLimits), omittedCsvCount: 0 };\n}\n","import { useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Button, SearchField } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"./auth/IdentityGate\";\nimport type { VaultDefinition } from \"./definitions\";\nimport { KeyGlyph, PlusGlyph, SortGlyph, UserGlyph } from \"./glyphs\";\nimport { ItemIcon } from \"./ItemIcon\";\nimport { USERNAME_KEYS } from \"./ItemPane\";\nimport { siteOf, type VaultItem, type VaultSort } from \"./model\";\nimport { useCopy, useNotify } from \"./notice\";\nimport type { VaultPort } from \"./port\";\n\nexport interface ItemListProps {\n title: string;\n items: readonly VaultItem[];\n definitions: readonly VaultDefinition[];\n port: VaultPort;\n selectedId: string | null;\n onSelect: (id: string) => void;\n query: string;\n onQuery: (q: string) => void;\n sort: VaultSort;\n onSort: (s: VaultSort) => void;\n onNew: () => void;\n /** Items that match the page the host is showing (the extension), pinned first. */\n matchingIds?: ReadonlySet<string>;\n /** Slot above the search: the vault and category pickers where there is no sidebar. */\n header?: ReactNode;\n}\n\nconst SORTS: readonly { value: VaultSort; label: string }[] = [\n { value: \"name\", label: \"Name\" },\n { value: \"website\", label: \"Website\" },\n { value: \"updated\", label: \"Recently changed\" },\n { value: \"created\", label: \"Recently added\" },\n];\n\n/** The line under a name: its website, else its type. */\nfunction subtitleOf(item: VaultItem): string {\n return siteOf(item) || item.definitionLabel;\n}\n\nexport function ItemList({ title, items, definitions, port, selectedId, onSelect, query, onQuery, sort, onSort, onNew, matchingIds, header }: ItemListProps) {\n const pinned = matchingIds ? items.filter((i) => matchingIds.has(i.id)) : [];\n const rest = matchingIds ? items.filter((i) => !matchingIds.has(i.id)) : items;\n const ordered = [...pinned, ...rest];\n const listRef = useRef<HTMLUListElement>(null);\n // The open item is always in sight: after a save, a reload, or opening it from the address.\n useEffect(() => {\n if (selectedId) listRef.current?.querySelector<HTMLElement>(`[data-item=\"${selectedId}\"]`)?.scrollIntoView({ block: \"nearest\" });\n }, [selectedId, items.length]);\n const familyOf = (key: string) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n\n // Arrow keys walk the list the way they do in every desktop password manager.\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"ArrowDown\" && e.key !== \"ArrowUp\") return;\n e.preventDefault();\n const at = ordered.findIndex((i) => i.id === selectedId);\n const next = ordered[Math.max(0, Math.min(ordered.length - 1, at + (e.key === \"ArrowDown\" ? 1 : -1)))];\n if (next) {\n onSelect(next.id);\n listRef.current?.querySelector<HTMLElement>(`[data-item=\"${next.id}\"]`)?.scrollIntoView({ block: \"nearest\" });\n }\n };\n\n const row = (i: VaultItem) => <ListRow key={i.id} item={i} family={familyOf(i.definitionKey)} port={port} on={i.id === selectedId} onSelect={onSelect} />;\n const sortLabel = SORTS.find((s) => s.value === sort)?.label ?? \"Name\";\n\n return (\n <section aria-label={title} className=\"flex h-full min-h-0 flex-col border-r border-border bg-background\">\n <div className=\"flex flex-col gap-2 px-3 pb-2 pt-3\">\n {header}\n <div className=\"flex items-center gap-2\">\n <SearchField value={query} onChange={(e) => onQuery(e.target.value)} onKeyDown={onKeyDown} placeholder={`Search ${title}`} className=\"min-w-0 flex-1\" aria-label=\"Search the vault\" />\n <Button variant=\"primary\" icon={<PlusGlyph />} aria-label=\"New item\" onClick={onNew} />\n </div>\n <div className=\"flex items-center justify-between gap-2 px-1\">\n <span className=\"truncate text-xs text-muted-foreground\">\n {items.length} {items.length === 1 ? \"item\" : \"items\"}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<SortGlyph />} aria-label={`Sort: ${sortLabel}`}>\n {sortLabel}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuRadioGroup value={sort} onValueChange={(v) => onSort(SORTS.find((s) => s.value === v)?.value ?? \"name\")}>\n {SORTS.map((s) => (\n <DropdownMenuRadioItem key={s.value} value={s.value}>\n {s.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-2 pb-3\" onKeyDown={onKeyDown}>\n {items.length === 0 ? (\n <div className=\"flex flex-col items-center gap-3 px-4 py-12 text-center\">\n <span className=\"text-sm text-muted-foreground\">{query ? `Nothing matches “${query}”.` : \"Nothing here yet.\"}</span>\n {query ? <Button variant=\"outline\" onClick={() => onQuery(\"\")}>Clear search</Button> : <Button variant=\"outline\" icon={<PlusGlyph />} onClick={onNew}>New item</Button>}\n </div>\n ) : (\n <ul ref={listRef} className=\"flex flex-col gap-px\">\n {pinned.length > 0 ? <li className=\"px-2 pb-1 pt-1 text-xs font-medium text-muted-foreground\">This page</li> : null}\n {pinned.map(row)}\n {pinned.length > 0 && rest.length > 0 ? <li className=\"px-2 pb-1 pt-3 text-xs font-medium text-muted-foreground\">Everything else</li> : null}\n {rest.map(row)}\n </ul>\n )}\n </div>\n </section>\n );\n}\n\n/** One item: a small two-line row. On hover, copy the username or the password without opening it. */\nfunction ListRow({ item, family, port, on, onSelect }: { item: VaultItem; family: string; port: VaultPort; on: boolean; onSelect: (id: string) => void }) {\n const confirmed = useConfirmed();\n const copy = useCopy();\n const notify = useNotify();\n const [busy, setBusy] = useState(false);\n const user = item.fields.find((f) => USERNAME_KEYS.test(f.key) && f.handling !== \"sealed\");\n const secret = item.fields.find((f) => f.key === \"password\" && f.handling === \"revealable\");\n const quick = async (key: string, label: string) => {\n setBusy(true);\n try {\n const v = await confirmed(() => port.reveal(item, key));\n await copy(v, label);\n } catch (e) {\n if (!wasCancelled(e)) notify(e instanceof Error ? e.message : `${label} could not be read`, \"error\");\n } finally {\n setBusy(false);\n }\n };\n return (\n <li className=\"group relative\" data-item={item.id}>\n <button\n type=\"button\"\n aria-current={on ? \"true\" : undefined}\n data-surface={on ? \"primary\" : undefined}\n onClick={() => onSelect(item.id)}\n className={cn(\"flex h-12 w-full items-center gap-3 rounded-lg px-2 text-left\", on ? \"bg-primary text-primary-foreground\" : \"hover:bg-accent\")}\n >\n <ItemIcon definitionKey={item.definitionKey} family={family} site={siteOf(item)} inverted={on} />\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">{item.name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{subtitleOf(item)}</span>\n </span>\n </button>\n {item.capabilities.canUse && (user || (secret && item.capabilities.canReveal)) ? (\n <div className={cn(\"absolute right-1.5 top-1/2 hidden -translate-y-1/2 items-center gap-0.5 rounded-md pl-2 group-hover:flex\", on ? \"bg-primary\" : \"bg-accent\")} data-surface={on ? \"primary\" : undefined}>\n {user ? <Button variant=\"quiet\" icon={<UserGlyph />} aria-label={`Copy ${user.label}`} disabled={busy} onClick={() => void quick(user.key, user.label)} /> : null}\n {secret && item.capabilities.canReveal ? <Button variant=\"quiet\" icon={<KeyGlyph />} aria-label=\"Copy password\" disabled={busy} onClick={() => void quick(secret.key, \"Password\")} /> : null}\n </div>\n ) : null}\n </li>\n );\n}\n","import { cn } from \"@ai-matrx/design-system\";\nimport { definitionGlyph } from \"./glyphs\";\n\n/**\n * An item's face. A login with a website shows the site's initial (people find \"G\" for GitHub faster\n * than a globe); everything else shows its type. No third-party icon service is ever asked: which\n * sites are in a vault is itself private.\n */\nexport function ItemIcon({ definitionKey, family, site, size = \"md\", inverted = false }: { definitionKey: string; family: string; site: string; size?: \"sm\" | \"md\" | \"lg\"; inverted?: boolean }) {\n const box = size === \"lg\" ? \"size-10 rounded-xl text-base\" : size === \"md\" ? \"size-8 rounded-lg text-sm\" : \"size-6 rounded-md text-xs\";\n const tone = inverted ? \"bg-primary-foreground text-primary\" : \"bg-muted text-foreground\";\n const initial = site.replace(/^(app|my|login|accounts|signin|auth|console|portal|admin|www)\\./, \"\").charAt(0).toUpperCase();\n if (initial && /[A-Z0-9]/.test(initial)) {\n return (\n <span aria-hidden className={cn(\"flex shrink-0 items-center justify-center font-semibold\", box, tone)}>\n {initial}\n </span>\n );\n }\n const Glyph = definitionGlyph(definitionKey, family);\n return (\n <span aria-hidden className={cn(\"flex shrink-0 items-center justify-center\", box, tone)}>\n <Glyph className={size === \"lg\" ? \"size-5\" : \"size-4\"} />\n </span>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Button, CONTROLS_CONTAINER_CLASS, Select, Switch } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { FilesSection } from \"./activity/FilesSection\";\nimport { useConfirmed, wasCancelled } from \"./auth/IdentityGate\";\nimport { MFA_METHOD_KEY } from \"./authenticator/port\";\nimport { TotpEditRow, TotpRow, TwoFactorMethodRow } from \"./authenticator/TotpRows\";\nimport type { VaultDefinition } from \"./definitions\";\nimport { AddRow, CustomEditRow, EditRow, PlainRow, SecretRow } from \"./FieldRows\";\nimport { RecoveryCodesRow } from \"./fields/RecoveryCodesRow\";\nimport { checkDestination, isRecoveryCodesField, type DestinationCheck } from \"./fields/rules\";\nimport { GenerateButton } from \"./generator/PasswordGenerator\";\nimport { ChevronLeftGlyph, EyeGlyph, HistoryGlyph, ListGlyph, MoreGlyph, MoveGlyph, PencilGlyph, SendGlyph, PlusGlyph, SettingsGlyph, ShareGlyph, StarGlyph, TrashGlyph } from \"./glyphs\";\nimport { ItemIcon } from \"./ItemIcon\";\nimport { draftKey, dropKeptDraft, keepDraft, readKeptDraft } from \"./draft-keep\";\nimport { FILL_WORDS } from \"./extension/page-logic\";\nimport { canUseOnSite, UseOnSiteButton } from \"./extension/UseOnSiteButton\";\nimport { changedValues, draftOf, isAuthenticatorStorage, isDirty, rebaseDraft, siteOf, type ItemDraft, type VaultItem, type VaultOrganizationRef } from \"./model\";\nimport type { VaultHostCapabilities, VaultPort } from \"./port\";\nimport { useNotify } from \"./notice\";\nimport { SharingSummary } from \"./sharing/SharePanel\";\nimport { formatDate, Row, Section } from \"./ui\";\n\nexport interface ItemPaneProps {\n port: VaultPort;\n /** The open item; null while creating one. */\n item: VaultItem | null;\n /** The item's type (always set when creating). */\n definition: VaultDefinition | null;\n mode: \"view\" | \"edit\" | \"new\";\n host: VaultHostCapabilities;\n organizations: readonly VaultOrganizationRef[];\n /** Where a new item goes by default: an organization id, or null for the person's own vault. */\n defaultOwner: string | null;\n /** New item: what the pasted address gave us. */\n seed?: { name: string; url: string };\n onBack: (() => void) | null;\n onMode: (mode: \"view\" | \"edit\") => void;\n onSaved: (item: VaultItem, wasNew: boolean, notice: string | null) => void;\n onDeleted: (id: string) => void;\n onDirty: (dirty: boolean) => void;\n onCancelNew: () => void;\n /** Open a panel about this item (`share`, `history`, …). */\n onPanel: (panel: string | null) => void;\n /** The item changed outside a save (a file added, a code removed): the pane shows it as it now is. */\n onChanged: (next?: VaultItem | null) => void;\n favorite?: { on: boolean; toggle: () => void } | undefined;\n /** Changes when a panel closes, so \"Shared with…\" re-reads after sharing changed. */\n refreshKey?: string;\n /** Something the last save could not finish; shown until the person moves on. */\n notice?: string | null;\n}\n\n/** Field keys that are a username for list subtitles, copy-username and the like. */\nexport const USERNAME_KEYS = /^(username|user_name|email|login|username_or_email|account_email)$/;\n\nexport function ItemPane(props: ItemPaneProps) {\n const { port, item, definition, mode, host, organizations, defaultOwner, seed, onBack, onMode, onSaved, onDeleted, onDirty, onCancelNew, onPanel, onChanged, favorite, notice, refreshKey } = props;\n const confirmed = useConfirmed();\n const notify = useNotify();\n const editing = mode !== \"view\";\n const seedName = seed?.name ?? \"\";\n const seedUrl = seed?.url ?? \"\";\n // Values read back for editing (a username, a secret the person chose to show): they are the\n // starting point, so leaving them alone is not a change.\n const [loaded, setLoaded] = useState<Record<string, string>>({});\n const base = useMemo(() => {\n const b = draftOf(item);\n if (!item) {\n b.name = seedName;\n b.loginUrls = seedUrl ? [seedUrl] : [];\n }\n b.values = { ...loaded };\n return b;\n }, [item, seedName, seedUrl, loaded]);\n const [draft, setDraft] = useState<ItemDraft>(base);\n const [tagsText, setTagsText] = useState(base.tags.join(\", \"));\n const [showTags, setShowTags] = useState(false);\n const [showDescription, setShowDescription] = useState(false);\n const [owner, setOwner] = useState<string>(defaultOwner ?? \"me\");\n // \"For someone else\": a new item created straight into another person's vault.\n const [recipient, setRecipient] = useState(\"\");\n const [generatePrivately, setGeneratePrivately] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // What the server says about each website typed (unsafe, unreachable…), keyed by its position.\n const [destinations, setDestinations] = useState<Record<number, DestinationCheck>>({});\n const dirty = editing && isDirty(base, draft);\n const declared = definition?.fields ?? [];\n\n // A new item, a different item, or entering/leaving edit starts from the item as it is. A change\n // to the SAME item while editing (a value read back, a two-factor method saved on its own, a file\n // added) is rebased: the person's unsaved edits are carried over onto the item as it now is.\n const prev = useRef<{ base: ItemDraft; id: string | null; mode: string } | null>(null);\n useEffect(() => {\n const was = prev.current;\n const id = item?.id ?? null;\n if (was && was.id === id && was.mode === mode && editing) {\n setDraft((d) => rebaseDraft(was.base, base, d));\n } else {\n // Coming back into an edit after a reload: what the person had typed (minus secrets) returns.\n const kept = editing ? readKeptDraft(keepKey, item?.updatedAt ?? \"new\") : null;\n setDraft(kept ? { ...base, ...kept } : base);\n setTagsText((kept ?? base).tags.join(\", \"));\n setError(null);\n }\n prev.current = { base, id, mode };\n }, [base, mode, item?.id, editing]);\n useEffect(() => {\n setLoaded({});\n setShowTags(false);\n setShowDescription(false);\n }, [item?.id, mode]);\n useEffect(() => onDirty(dirty), [dirty, onDirty]);\n // Keep the unsaved edit (never its secrets) for a reload; leaving edit or saving forgets it.\n const keepKey = draftKey(item?.id ?? null, definition?.key ?? item?.definitionKey ?? null);\n useEffect(() => {\n if (editing && dirty) keepDraft(keepKey, item?.updatedAt ?? \"new\", draft);\n else if (!editing) dropKeptDraft(keepKey);\n }, [editing, dirty, draft, keepKey, item?.updatedAt]);\n\n // Editing shows what is there now: every value anyone may see without a fresh sign-in loads at once.\n useEffect(() => {\n if (!editing || !item) return;\n let live = true;\n for (const f of item.fields) {\n if (f.handling !== \"visible\" || !item.capabilities.canUse) continue;\n port.reveal(item, f.key).then((v) => live && setLoaded((cur) => ({ ...cur, [f.key]: v })), () => undefined);\n }\n return () => {\n live = false;\n };\n }, [editing, item, port]);\n\n const patch = (p: Partial<ItemDraft>) => setDraft((d) => ({ ...d, ...p }));\n const setValue = (key: string, v: string) => setDraft((d) => ({ ...d, values: { ...d.values, [key]: v } }));\n const canEdit = item ? item.capabilities.canEdit || item.capabilities.canManage : true;\n const canManage = item?.capabilities.canManage ?? false;\n\n async function save() {\n if (!definition && !item) return;\n setBusy(true);\n setError(null);\n const out: ItemDraft = { ...draft, values: Object.fromEntries(changedValues(base, draft)) };\n // A one-time password is set up after the item saves, through \"Confirm it's you\" (the server\n // wants a recent sign-in for it); a refusal leaves the item saved and says what is missing.\n const withOtp = async (saved: VaultItem, notice: string | null): Promise<[VaultItem, string | null]> => {\n const setup = out.authenticator.trim();\n if (!setup) return [saved, notice];\n try {\n await confirmed(() => port.authenticator.enrol(saved, setup));\n return [await port.get(saved), notice];\n } catch (e) {\n const why = wasCancelled(e) ? \"it was not confirmed\" : e instanceof Error ? e.message : \"it was refused\";\n return [saved, `Saved, but the one-time password was not set up: ${why}. Add it with Edit.`];\n }\n };\n try {\n if (item) {\n const r = await port.save(item, definition, out);\n const [next, n] = await withOtp(r.item, r.notice);\n dropKeptDraft(keepKey);\n onSaved(next, false, n);\n } else if (definition && owner === \"person\") {\n const secretKey = declared.find((f) => f.storage === \"encrypted\" && f.kind === \"secret\")?.key ?? null;\n const r = await port.sharing.assign({ recipientEmail: recipient.trim(), definition, draft: out, generateFieldKey: generatePrivately ? secretKey : null });\n notify(`Sent to ${r.recipientEmail}`);\n onCancelNew();\n } else if (definition) {\n const r = await port.create(definition, owner === \"me\" ? null : owner, out);\n const [next, n] = await withOtp(r.item, r.notice);\n dropKeptDraft(keepKey);\n onSaved(next, true, n);\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Saving failed. Nothing was changed.\");\n } finally {\n setBusy(false);\n }\n }\n\n async function remove() {\n if (!item) return;\n const ok = await confirm({ title: `Delete “${item.name}”?`, description: \"It moves to Trash. You can restore it from there.\", confirmLabel: \"Delete\", variant: \"destructive\" });\n if (!ok) return;\n setBusy(true);\n try {\n await port.remove(item);\n onDeleted(item.id);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Deleting failed.\");\n } finally {\n setBusy(false);\n }\n }\n\n /** Show a secret's current value inside its edit box (after confirming it's you). */\n async function loadForEdit(key: string) {\n if (!item) return;\n try {\n const v = await confirmed(() => port.reveal(item, key));\n setLoaded((cur) => ({ ...cur, [key]: v }));\n } catch (e) {\n if (!wasCancelled(e)) setError(e instanceof Error ? e.message : \"The value could not be read.\");\n }\n }\n\n const declaredKeys = new Set(declared.map((f) => f.key));\n const extraFields = (item?.fields ?? []).filter((f) => !declaredKeys.has(f.key) && !draft.removed.includes(f.id) && !isAuthenticatorStorage(f.key));\n const metaValue = (key: string) => draft.values[key] ?? item?.custom.find((c) => c.key === key)?.value ?? \"\";\n // The two-factor method has its own row; it is never a loose custom field.\n const extraCustom = draft.custom.filter((c) => !declaredKeys.has(c.key) && c.key !== MFA_METHOD_KEY && !isAuthenticatorStorage(c.key));\n const viewCustom = (item?.custom ?? []).filter((c) => !declaredKeys.has(c.key) && c.key !== MFA_METHOD_KEY && !isAuthenticatorStorage(c.key));\n const isLogin = (item?.definitionKey ?? definition?.key) === \"website_login\" || (item?.definitionKey ?? definition?.key) === \"username_password\";\n const typeLabel = definition?.label ?? item?.definitionLabel ?? \"\";\n const ownerLabel = item && item.owner.kind !== \"me\" ? item.owner.label : null;\n const tagsVisible = showTags || draft.tags.length > 0 || tagsText !== \"\";\n const descriptionVisible = showDescription || draft.description !== \"\";\n\n const header = (\n <header className=\"flex min-h-14 items-center gap-2 border-b border-border px-3 py-2 sm:gap-3 sm:px-5\">\n {onBack ? <Button variant=\"quiet\" icon={<ChevronLeftGlyph />} aria-label=\"Back\" onClick={mode === \"new\" ? onCancelNew : onBack} /> : null}\n <ItemIcon definitionKey={definition?.key ?? item?.definitionKey ?? \"custom\"} family={definition?.family ?? \"generic\"} site={item ? siteOf(item) : siteOf({ loginUrls: draft.loginUrls })} size=\"lg\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <h2 className=\"truncate text-base font-semibold leading-tight\">{editing ? draft.name || (mode === \"new\" ? `New ${typeLabel.toLowerCase()}` : item?.name) : item?.name}</h2>\n <span className=\"flex min-w-0 items-center gap-1 text-xs text-muted-foreground\">\n <span className=\"truncate\">{[typeLabel, ownerLabel].filter(Boolean).join(\" · \")}</span>\n {item && !editing ? <SharingSummary key={`${item.updatedAt}-${refreshKey ?? \"\"}`} item={item} port={port} className=\"hidden truncate before:mr-1 before:content-['·'] sm:inline\" /> : null}\n </span>\n </div>\n {editing ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {dirty ? (\n <span className=\"hidden items-center gap-1.5 text-xs text-muted-foreground sm:flex\" role=\"status\">\n <span className=\"size-1.5 rounded-full bg-warning\" aria-hidden />\n Unsaved\n </span>\n ) : null}\n <Button variant=\"quiet\" disabled={busy} onClick={() => (mode === \"new\" ? onCancelNew() : onMode(\"view\"))}>\n {dirty ? \"Discard\" : \"Cancel\"}\n </Button>\n <Button variant=\"primary\" disabled={busy || draft.name.trim() === \"\" || (mode === \"edit\" && !dirty) || (mode === \"new\" && owner === \"person\" && !/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(recipient.trim()))} onClick={() => void save()}>\n {mode === \"new\" && owner === \"person\" ? \"Send\" : \"Save\"}\n </Button>\n </div>\n ) : item ? (\n <div className=\"flex shrink-0 items-center gap-1\">\n {host.page && canUseOnSite(item, host.page.url) ? <UseOnSiteButton port={port} item={item} pageUrl={host.page.url} onChanged={(next) => onChanged(next)} /> : null}\n {host.fill && item.capabilities.canUse ? (\n <Button\n variant=\"primary\"\n onClick={() =>\n void host.fill?.(item.id).then((outcome) => {\n const said = FILL_WORDS[outcome];\n notify(said.text, said.tone === \"warning\" ? \"error\" : \"success\");\n })\n }\n >\n Fill\n </Button>\n ) : null}\n {favorite ? <span className=\"hidden sm:contents\"><Button variant=\"quiet\" icon={<StarGlyph className={favorite.on ? \"fill-current text-warning\" : \"size-4\"} />} aria-label={favorite.on ? \"Remove from favorites\" : \"Add to favorites\"} pressed={favorite.on} onClick={favorite.toggle} /></span> : null}\n {canManage ? <span className=\"hidden sm:contents\"><Button variant=\"quiet\" icon={<ShareGlyph />} aria-label=\"Share\" onClick={() => onPanel(\"share\")} /></span> : null}\n {canEdit ? <Button variant=\"outline\" icon={<PencilGlyph />} collapse=\"container\" aria-label=\"Edit\" onClick={() => onMode(\"edit\")}>Edit</Button> : null}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"More actions\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {favorite ? <DropdownMenuItem onSelect={favorite.toggle}><StarGlyph className=\"size-4\" />{favorite.on ? \"Remove from favorites\" : \"Add to favorites\"}</DropdownMenuItem> : null}\n {canManage ? <DropdownMenuItem onSelect={() => onPanel(\"share\")}><ShareGlyph className=\"size-4\" />Share</DropdownMenuItem> : null}\n {canManage ? <DropdownMenuItem onSelect={() => onPanel(\"move\")}><MoveGlyph className=\"size-4\" />Move or copy</DropdownMenuItem> : null}\n {item.capabilities.canReveal ? <DropdownMenuItem onSelect={() => onPanel(\"send\")}><SendGlyph className=\"size-4\" />Send securely</DropdownMenuItem> : null}\n <DropdownMenuItem onSelect={() => onPanel(\"history\")}><HistoryGlyph className=\"size-4\" />Password history</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onPanel(\"activity\")}><ListGlyph className=\"size-4\" />Activity</DropdownMenuItem>\n {canEdit ? <DropdownMenuItem onSelect={() => onPanel(\"settings\")}><SettingsGlyph className=\"size-4\" />Settings</DropdownMenuItem> : null}\n {canManage ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"text-destructive\" disabled={busy} onSelect={() => void remove()}><TrashGlyph className=\"size-4\" />Delete</DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n </header>\n );\n\n const filesProps = item ? { item, port, host, definition, organizations, arg: null, onClose: () => undefined, onChanged, onPanel } : null;\n\n return (\n <article aria-label={item?.name ?? \"New item\"} className={cn(CONTROLS_CONTAINER_CLASS, \"flex h-full min-h-0 flex-col bg-background\")}>\n {header}\n {error ? <div role=\"alert\" className=\"border-b border-border bg-muted px-5 py-2 text-sm text-destructive\">{error}</div> : null}\n {notice && !editing ? <div role=\"status\" className=\"border-b border-border bg-muted px-5 py-2 text-sm text-warning\">{notice}</div> : null}\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-5 px-3 py-4 sm:px-6 sm:py-6\">\n {editing ? (\n <>\n <Section>\n <EditRow label=\"Name\" value={draft.name} onChange={(v) => patch({ name: v })} placeholder=\"Name\" autoFocus={mode === \"new\"} />\n {mode === \"new\" ? (\n <Row label=\"Save to\">\n <Select value={owner} onValueChange={setOwner} aria-label=\"Save to\" options={[{ value: \"me\", label: \"Personal\" }, ...organizations.map((o) => ({ value: o.id, label: o.name })), { value: \"person\", label: \"Someone else\" }]} />\n </Row>\n ) : null}\n {mode === \"new\" && owner === \"person\" ? (\n <>\n <EditRow label=\"Their email\" value={recipient} placeholder=\"name@company.com\" inputMode=\"email\" onChange={setRecipient} />\n {declared.some((f) => f.storage === \"encrypted\" && f.kind === \"secret\") ? (\n <Row label=\"Password\" hint=\"You never see it\">\n <Switch checked={generatePrivately} onCheckedChange={setGeneratePrivately} aria-label=\"Generate the password privately\" />\n </Row>\n ) : null}\n </>\n ) : null}\n {declared.map((f) => {\n const existing = item?.fields.find((x) => x.key === f.key);\n const secretKind = f.storage === \"encrypted\" && f.kind === \"secret\";\n const value = f.storage === \"metadata\" ? metaValue(f.key) : (draft.values[f.key] ?? \"\");\n const hidden = existing && existing.handling !== \"visible\" && !(f.key in loaded);\n return (\n <EditRow\n key={f.key}\n label={f.label}\n value={value}\n placeholder={hidden ? \"••••••••\" : f.required ? \"Required\" : \"\"}\n secret={secretKind}\n multiline={f.kind === \"multiline\"}\n inputMode={f.kind === \"url\" ? \"url\" : USERNAME_KEYS.test(f.key) ? \"email\" : \"text\"}\n onChange={(v) => setValue(f.key, v)}\n actions={\n <>\n {hidden && existing?.handling === \"revealable\" && item?.capabilities.canReveal ? <Button variant=\"quiet\" icon={<EyeGlyph />} aria-label={`Show current ${f.label}`} onClick={() => void loadForEdit(f.key)} /> : null}\n {secretKind ? <GenerateButton onUse={(v) => setValue(f.key, v)} /> : null}\n {existing ? <Button variant=\"quiet\" icon={<SettingsGlyph />} aria-label={`${f.label} settings`} onClick={() => onPanel(`field:${existing.id}`)} /> : null}\n </>\n }\n />\n );\n })}\n {extraFields.map((f) => (\n <EditRow\n key={f.id}\n label={f.label}\n value={draft.values[f.key] ?? \"\"}\n placeholder={f.handling === \"visible\" || f.key in loaded ? \"\" : \"••••••••\"}\n secret={f.handling !== \"visible\"}\n onChange={(v) => setValue(f.key, v)}\n onRemove={() => patch({ removed: [...draft.removed, f.id] })}\n removeLabel={`Delete ${f.label}`}\n actions={\n <>\n {f.handling === \"revealable\" && !(f.key in loaded) && item?.capabilities.canReveal ? <Button variant=\"quiet\" icon={<EyeGlyph />} aria-label={`Show current ${f.label}`} onClick={() => void loadForEdit(f.key)} /> : null}\n <Button variant=\"quiet\" icon={<SettingsGlyph />} aria-label={`${f.label} settings`} onClick={() => onPanel(`field:${f.id}`)} />\n </>\n }\n />\n ))}\n {draft.loginUrls.map((u, i) => (\n <EditRow\n key={i}\n label={i === 0 ? \"Website\" : `Website ${i + 1}`}\n hint={destinations[i] && destinations[i].tone !== \"success\" ? <span className={destinations[i].tone === \"destructive\" ? \"text-destructive\" : \"text-warning\"}>{destinations[i].message}</span> : undefined}\n value={u}\n autoFocus={i > 0 && u === \"\" && i === draft.loginUrls.length - 1}\n placeholder=\"https://\"\n inputMode=\"url\"\n onChange={(v) => patch({ loginUrls: draft.loginUrls.map((x, j) => (j === i ? v : x)) })}\n onBlur={() =>\n void checkDestination(port, u, item ?? undefined).then((r) => {\n setDestinations((cur) => {\n const next = { ...cur };\n if (r) next[i] = r;\n else delete next[i];\n return next;\n });\n if (r?.url && r.url !== u) setDraft((d) => ({ ...d, loginUrls: d.loginUrls.map((x, j) => (j === i && x === u ? r.url : x)) }));\n })\n }\n onRemove={() => patch({ loginUrls: draft.loginUrls.filter((_, j) => j !== i) })}\n removeLabel=\"Remove website\"\n />\n ))}\n <AddRow label={draft.loginUrls.length === 0 ? \"Website\" : \"\"} onAdd={() => patch({ loginUrls: [...draft.loginUrls, \"\"] })}>\n {draft.loginUrls.length === 0 ? \"Add website\" : \"Add another website\"}\n </AddRow>\n <TotpEditRow value={draft.authenticator} onChange={(v) => patch({ authenticator: v })} hasExisting={Boolean(item?.authenticator)} item={item} port={port} onEnrolled={onChanged} />\n {item && isLogin && !item.authenticator ? <TwoFactorMethodRow port={port} item={item} onChanged={onChanged} /> : null}\n </Section>\n\n <Section>\n <EditRow label=\"Notes\" value={draft.notes} multiline placeholder=\"Anything worth remembering\" onChange={(v) => patch({ notes: v })} />\n </Section>\n\n <Section\n title=\"More\"\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<PlusGlyph />}>Add</Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => patch({ secrets: [...draft.secrets, { key: \"\", label: \"\", value: \"\" }] })}>Secret field</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => patch({ custom: [...draft.custom, { key: `custom_${draft.custom.length + 1}_${Date.now() % 100000}`, label: \"\", value: \"\" }] })}>Text field</DropdownMenuItem>\n {!tagsVisible ? <DropdownMenuItem onSelect={() => setShowTags(true)}>Tags</DropdownMenuItem> : null}\n {!descriptionVisible ? <DropdownMenuItem onSelect={() => setShowDescription(true)}>Description</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n {descriptionVisible ? <EditRow label=\"Description\" value={draft.description} placeholder=\"What this is for\" onChange={(v) => patch({ description: v })} /> : null}\n {tagsVisible ? (\n <EditRow\n label=\"Tags\"\n value={tagsText}\n placeholder=\"work, finance\"\n onChange={(v) => {\n setTagsText(v);\n patch({ tags: v.split(\",\").map((t) => t.trim()).filter(Boolean) });\n }}\n />\n ) : null}\n {draft.secrets.map((s, i) => (\n <CustomEditRow key={`s${i}`} label={s.label} value={s.value} secret onLabel={(v) => patch({ secrets: draft.secrets.map((x, j) => (j === i ? { ...x, label: v } : x)) })} onValue={(v) => patch({ secrets: draft.secrets.map((x, j) => (j === i ? { ...x, value: v } : x)) })} onRemove={() => patch({ secrets: draft.secrets.filter((_, j) => j !== i) })} />\n ))}\n {extraCustom.map((c) => (\n <CustomEditRow key={c.key} label={c.label} value={c.value} secret={false} onLabel={(v) => patch({ custom: draft.custom.map((x) => (x.key === c.key ? { ...x, label: v } : x)) })} onValue={(v) => patch({ custom: draft.custom.map((x) => (x.key === c.key ? { ...x, value: v } : x)) })} onRemove={() => patch({ custom: draft.custom.filter((x) => x.key !== c.key) })} />\n ))}\n {!descriptionVisible && !tagsVisible && draft.secrets.length === 0 && extraCustom.length === 0 ? <AddRow label=\"Fields, tags\" onAdd={null}>None</AddRow> : null}\n </Section>\n {filesProps ? <FilesSection {...filesProps} editing /> : null}\n </>\n ) : item ? (\n <>\n <Section>\n {declared.map((f) => {\n if (f.storage === \"metadata\") {\n const v = metaValue(f.key);\n return v ? <PlainRow key={f.key} label={f.label} value={v} openUrl={host.openUrl} /> : null;\n }\n const field = item.fields.find((x) => x.key === f.key);\n if (isRecoveryCodesField(f)) return <RecoveryCodesRow key={f.key} item={item} field={field} port={port} onChanged={onChanged} />;\n return field ? <SecretRow key={field.id} port={port} item={item} field={field} /> : null;\n })}\n {extraFields.map((f) => (isRecoveryCodesField(f) ? <RecoveryCodesRow key={f.id} item={item} field={f} port={port} onChanged={onChanged} /> : <SecretRow key={f.id} port={port} item={item} field={f} />))}\n {item.loginUrls.length > 0 ? item.loginUrls.map((u, i) => <PlainRow key={`${u}-${i}`} label={i === 0 ? \"Website\" : `Website ${i + 1}`} value={u} openUrl={host.openUrl} />) : <AddRow label=\"Website\" onAdd={canEdit ? () => onMode(\"edit\") : null}>Add website</AddRow>}\n {item.authenticator ? <TotpRow port={port} item={item} onChanged={onChanged} /> : <AddRow label=\"One-time password\" onAdd={canEdit ? () => onMode(\"edit\") : null}>Set up</AddRow>}\n {!item.authenticator && item.custom.some((c) => c.key === MFA_METHOD_KEY && c.value) ? <TwoFactorMethodRow port={port} item={item} onChanged={onChanged} /> : null}\n </Section>\n <Section>{item.notes ? <PlainRow label=\"Notes\" value={item.notes} multiline /> : <AddRow label=\"Notes\" onAdd={canEdit ? () => onMode(\"edit\") : null}>Add notes</AddRow>}</Section>\n {item.description || item.tags.length > 0 || viewCustom.length > 0 ? (\n <Section title=\"More\">\n {item.description ? <PlainRow label=\"Description\" value={item.description} /> : null}\n {item.tags.length > 0 ? (\n <Row label=\"Tags\">\n <div className=\"flex flex-wrap gap-1\">\n {item.tags.map((t) => (\n <span key={t} className=\"rounded-md bg-muted px-1.5 py-0.5 text-xs\">{t}</span>\n ))}\n </div>\n </Row>\n ) : null}\n {viewCustom.map((c) => <PlainRow key={c.key} label={c.label} value={c.value} openUrl={host.openUrl} />)}\n </Section>\n ) : null}\n {filesProps ? <FilesSection {...filesProps} editing={false} /> : null}\n <p className={cn(\"px-1 text-xs text-muted-foreground\")}>\n Modified {formatDate(item.updatedAt)} · Created {formatDate(item.createdAt)}\n </p>\n </>\n ) : null}\n </div>\n </div>\n </article>\n );\n}\n","import { useRef, useState, type DragEvent } from \"react\";\nimport { Badge, Button, Field, SegmentedControl } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { downloadFile } from \"@ai-matrx/kit/download\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { DownloadGlyph, LockGlyph, PencilGlyph, PlusGlyph, TrashGlyph, UploadGlyph } from \"../glyphs\";\nimport type { FieldHandling, VaultAttachment, VaultItem } from \"../model\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport type { VaultPort } from \"../port\";\nimport { Row, Section, formatBytes } from \"../ui\";\nimport { canDownload, fileTooBig } from \"./logic\";\n\nconst messageOf = (e: unknown, fallback: string): string | null => (wasCancelled(e) ? null : e instanceof Error ? e.message : fallback);\nconst TOO_BIG = \"Files over 25 MB can't be stored.\";\n\nconst PROTECTION: readonly { value: FieldHandling; label: string; title: string }[] = [\n { value: \"visible\", label: \"Open\", title: \"Anyone who can use the item can download it\" },\n { value: \"revealable\", label: \"Protected\", title: \"Downloading needs a recent sign-in\" },\n { value: \"sealed\", label: \"Sealed\", title: \"Only automation can use it, never a person\" },\n];\n\n/**\n * The item's protected files. View: nothing when there are none; else one row per file (name, size,\n * download). Editing: add (pick or drop), rename and describe, protection, replace, delete. Every\n * change lands on the server at once — files are not part of the item's Save.\n */\nexport function FilesSection({ item, port, editing, onChanged }: ItemPanelProps & { editing: boolean }) {\n const confirmed = useConfirmed();\n const canEdit = editing && item.capabilities.canEdit;\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [pending, setPending] = useState<File | null>(null);\n const [dragging, setDragging] = useState(false);\n const picker = useRef<HTMLInputElement>(null);\n\n if (!canEdit && item.attachments.length === 0) return null;\n\n async function run(key: string, work: () => Promise<VaultItem | void>, fallback: string): Promise<boolean> {\n setBusy(key);\n setError(null);\n try {\n const next = await work();\n if (next) onChanged(next);\n return true;\n } catch (e) {\n setError(messageOf(e, fallback));\n return false;\n } finally {\n setBusy(null);\n }\n }\n\n function choose(file: File | undefined | null) {\n if (!file) return;\n if (fileTooBig(file.size)) return setError(TOO_BIG);\n setError(null);\n setPending(file);\n }\n\n function drop(e: DragEvent<HTMLElement>) {\n if (!canEdit) return;\n e.preventDefault();\n setDragging(false);\n choose(e.dataTransfer.files[0]);\n }\n\n const download = (a: VaultAttachment) =>\n run(`download:${a.id}`, async () => {\n const bytes = await confirmed(() => port.activity.downloadFile(item, a));\n downloadFile(a.fileName, new Uint8Array(bytes), a.mediaType || \"application/octet-stream\");\n }, \"The file could not be downloaded.\");\n\n return (\n <div\n className={cn(\"rounded-xl\", dragging && \"outline outline-2 outline-primary\")}\n onDragOver={canEdit ? (e) => { e.preventDefault(); setDragging(true); } : undefined}\n onDragLeave={canEdit ? () => setDragging(false) : undefined}\n onDrop={canEdit ? drop : undefined}\n >\n <Section\n title=\"Files\"\n actions={canEdit ? <Button variant=\"quiet\" icon={<PlusGlyph />} disabled={busy !== null} onClick={() => picker.current?.click()}>Add file</Button> : undefined}\n >\n {canEdit ? <input ref={picker} type=\"file\" hidden onChange={(e) => { choose(e.target.files?.[0]); e.target.value = \"\"; }} /> : null}\n {item.attachments.map((a) =>\n canEdit ? (\n <EditableFile key={a.id} port={port} item={item} file={a} busy={busy} run={run} onDownload={() => void download(a)} onTooBig={() => setError(TOO_BIG)} />\n ) : (\n <Row\n key={a.id}\n label={a.label}\n hint={a.description || undefined}\n actions={\n a.handling === \"sealed\" ? (\n <Badge icon={<LockGlyph />}>Sealed</Badge>\n ) : canDownload(item, a) ? (\n <Button variant=\"quiet\" icon={<DownloadGlyph />} aria-label={`Download ${a.fileName}`} disabled={busy !== null} onClick={() => void download(a)} />\n ) : null\n }\n >\n <FileName file={a} />\n </Row>\n ),\n )}\n {canEdit && pending ? (\n <NewFile file={pending} busy={busy === \"add\"} onCancel={() => setPending(null)} onAdd={async (details) => { if (await run(\"add\", () => port.activity.addFile(item, pending, details), \"The file could not be added.\")) setPending(null); }} />\n ) : null}\n {canEdit && item.attachments.length === 0 && !pending ? (\n <div className=\"px-4 py-3 text-sm text-muted-foreground\">Drop a file here or choose Add file</div>\n ) : null}\n {error ? <p role=\"alert\" className=\"px-4 py-2 text-sm text-destructive\">{error}</p> : null}\n </Section>\n </div>\n );\n}\n\ntype Run = (key: string, work: () => Promise<VaultItem | void>, fallback: string) => Promise<boolean>;\n\n/** A stored file while editing: its row, and its details below it on demand. */\nfunction EditableFile({ port, item: it, file: a, busy: b, run: go, onDownload, onTooBig }: {\n port: VaultPort;\n item: VaultItem;\n file: VaultAttachment;\n busy: string | null;\n run: Run;\n onDownload: () => void;\n onTooBig: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const replacer = useRef<HTMLInputElement>(null);\n\n async function remove() {\n const yes = await confirm({ title: `Delete ${a.label}?`, description: \"The encrypted file is removed from this item.\", confirmLabel: \"Delete\", variant: \"destructive\" });\n if (yes) await go(`delete:${a.id}`, () => port.activity.deleteFile(it, a.id), \"The file could not be deleted.\");\n }\n\n return (\n <>\n <Row\n label={a.label}\n hint={a.description || undefined}\n actions={\n <>\n {canDownload(it, a) ? <Button variant=\"quiet\" icon={<DownloadGlyph />} aria-label={`Download ${a.fileName}`} disabled={b !== null} onClick={onDownload} /> : null}\n <Button variant=\"quiet\" icon={<PencilGlyph />} aria-label={`Edit ${a.label}`} pressed={open} disabled={b !== null} onClick={() => setOpen((o) => !o)} />\n <Button variant=\"quiet\" icon={<UploadGlyph />} aria-label={`Replace ${a.fileName}`} disabled={b !== null} onClick={() => replacer.current?.click()} />\n <Button variant=\"quiet\" icon={<TrashGlyph />} aria-label={`Delete ${a.label}`} disabled={b !== null} onClick={() => void remove()} />\n <input\n ref={replacer}\n type=\"file\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (!f) return;\n if (fileTooBig(f.size)) return onTooBig();\n void go(`replace:${a.id}`, () => port.activity.replaceFile(it, a.id, f), \"The file could not be replaced.\");\n }}\n />\n </>\n }\n >\n <FileName file={a} />\n </Row>\n {open ? <FileDetailsRows file={a} busy={b === `update:${a.id}`} onCancel={() => setOpen(false)} onSave={async (d) => { if (await go(`update:${a.id}`, () => port.activity.updateFile(it, a.id, d), \"The file details could not be saved.\")) setOpen(false); }} /> : null}\n </>\n );\n}\n\nfunction FileName({ file }: { file: VaultAttachment }) {\n return (\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate\">{file.fileName}</span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{formatBytes(file.sizeBytes)}</span>\n </span>\n );\n}\n\nfunction Protection({ value, locked, onChange }: { value: FieldHandling; locked: boolean; onChange: (v: FieldHandling) => void }) {\n return (\n <SegmentedControl\n aria-label=\"Protection\"\n value={value}\n onValueChange={onChange}\n data={PROTECTION.map((p) => ({ value: p.value, label: p.label, title: p.title, disabled: locked && p.value !== \"sealed\" }))}\n />\n );\n}\n\n/** The details a new file needs before it is encrypted and stored. */\nfunction NewFile({ file, busy, onAdd, onCancel }: { file: File; busy: boolean; onAdd: (d: { label: string; description: string | null; handling: FieldHandling }) => Promise<void>; onCancel: () => void }) {\n const [label, setLabel] = useState(file.name);\n const [description, setDescription] = useState(\"\");\n const [handling, setHandling] = useState<FieldHandling>(\"revealable\");\n\n async function add() {\n if (handling === \"sealed\" && !(await confirmSeal(label))) return;\n await onAdd({ label: label.trim(), description: description.trim() || null, handling });\n }\n\n return (\n <>\n <Row label=\"New file\"><span className=\"flex min-w-0 items-center gap-2\"><span className=\"truncate\">{file.name}</span><span className=\"shrink-0 text-xs text-muted-foreground\">{formatBytes(file.size)}</span></span></Row>\n <Row label=\"Name\"><Field aria-label=\"Name\" value={label} onChange={(e) => setLabel(e.target.value)} /></Row>\n <Row label=\"Purpose\"><Field aria-label=\"Purpose\" placeholder=\"What it is for\" value={description} onChange={(e) => setDescription(e.target.value)} /></Row>\n <Row label=\"Protection\"><Protection value={handling} locked={false} onChange={setHandling} /></Row>\n <div className=\"flex justify-end gap-2 px-3 py-1 sm:px-4\">\n <Button variant=\"quiet\" disabled={busy} onClick={onCancel}>Cancel</Button>\n <Button variant=\"primary\" disabled={busy || !label.trim()} onClick={() => void add()}>{busy ? \"Adding…\" : \"Add file\"}</Button>\n </div>\n </>\n );\n}\n\n/** Rename, describe, change the saved file name and the protection of a stored file. */\nfunction FileDetailsRows({ file, busy, onSave, onCancel }: { file: VaultAttachment; busy: boolean; onSave: (d: { label: string; description: string | null; fileName: string; handling: FieldHandling }) => Promise<void>; onCancel: () => void }) {\n const [label, setLabel] = useState(file.label);\n const [description, setDescription] = useState(file.description);\n const [fileName, setFileName] = useState(file.fileName);\n const [handling, setHandling] = useState<FieldHandling>(file.handling);\n const changed = label !== file.label || description !== file.description || fileName !== file.fileName || handling !== file.handling;\n\n async function save() {\n if (handling === \"sealed\" && file.handling !== \"sealed\" && !(await confirmSeal(label))) return;\n await onSave({ label: label.trim(), description: description.trim() || null, fileName: fileName.trim(), handling });\n }\n\n return (\n <>\n <Row label=\"Name\"><Field aria-label=\"Name\" value={label} onChange={(e) => setLabel(e.target.value)} /></Row>\n <Row label=\"Purpose\"><Field aria-label=\"Purpose\" placeholder=\"What it is for\" value={description} onChange={(e) => setDescription(e.target.value)} /></Row>\n <Row label=\"File name\"><Field aria-label=\"File name\" value={fileName} onChange={(e) => setFileName(e.target.value)} /></Row>\n <Row label=\"Protection\"><Protection value={handling} locked={file.handling === \"sealed\"} onChange={setHandling} /></Row>\n <div className=\"flex justify-end gap-2 px-3 py-1 sm:px-4\">\n <Button variant=\"quiet\" disabled={busy} onClick={onCancel}>Cancel</Button>\n <Button variant=\"primary\" disabled={busy || !changed || !label.trim() || !fileName.trim()} onClick={() => void save()}>{busy ? \"Saving…\" : \"Save\"}</Button>\n </div>\n </>\n );\n}\n\n/** Sealing is one-way: no person can ever download the file again. */\nfunction confirmSeal(label: string): Promise<boolean> {\n return confirm({\n title: `Seal ${label || \"this file\"}?`,\n description: \"No one can download it again; only automation can use it. This can't be undone.\",\n confirmLabel: \"Seal\",\n variant: \"destructive\",\n });\n}\n","import { useCopy } from \"../notice\";\nimport { useState } from \"react\";\nimport { Badge, Button, Textarea } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { CheckGlyph, CopyGlyph, EyeGlyph, EyeOffGlyph, LockGlyph, PencilGlyph, PlusGlyph, XGlyph } from \"../glyphs\";\nimport { useTransientSecret } from \"../hooks\";\nimport type { VaultField, VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Row } from \"../ui\";\nimport { RECOVERY_CODES_KEY, parseRecoveryCodes, withoutCode } from \"./rules\";\n\nconst MASK = \"••••••••••••\";\nconst say = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\n\n/**\n * One-time recovery codes, stored as ONE encrypted field (`recovery_codes`, one code per line).\n * Show reveals them for 20 seconds; each code has its own Copy and \"Mark used\". Marking a code\n * used removes it from the stored set so it can never be chosen again; the last one removes the\n * field. With no field yet, a person who can edit adds a set. Replace swaps the whole set.\n */\nexport function RecoveryCodesRow({ item, field, port, onChanged }: { item: VaultItem; field: VaultField | null | undefined; port: VaultPort; onChanged?: (next: VaultItem) => void }) {\n const confirmed = useConfirmed();\n const copyValue = useCopy();\n const secret = useTransientSecret();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [draft, setDraft] = useState<string | null>(null);\n const canEdit = item.capabilities.canEdit;\n\n const run = async (step: () => Promise<VaultItem | void>) => {\n setBusy(true);\n setError(null);\n try {\n const next = await step();\n if (next) onChanged?.(next);\n return true;\n } catch (e) {\n if (!wasCancelled(e)) setError(say(e, \"That didn’t work. Try again.\"));\n return false;\n } finally {\n setBusy(false);\n }\n };\n\n const saveDraft = async () => {\n const value = parseRecoveryCodes(draft ?? \"\").join(\"\\n\");\n if (!value) return;\n const ok = await run(() =>\n confirmed(() =>\n field\n ? port.fields.setValue(item, field.id, value)\n : port.fields.addField(item, { key: RECOVERY_CODES_KEY, value, handling: \"revealable\", description: \"One-time account recovery codes\" }),\n ),\n );\n if (ok) {\n secret.clear();\n setDraft(null);\n }\n };\n\n // Adding or replacing: the box grows down under the label, Save/Cancel stay on the label's line.\n if (draft !== null) {\n return (\n <Row\n label=\"Recovery codes\"\n top\n actions={\n <>\n <Button variant=\"quiet\" icon={<CheckGlyph />} aria-label=\"Save codes\" disabled={busy || !draft.trim()} onClick={() => void saveDraft()} />\n <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label=\"Cancel\" disabled={busy} onClick={() => { setDraft(null); setError(null); }} />\n </>\n }\n >\n <Textarea mono autoGrow rows={4} maxHeight={240} autoComplete=\"off\" spellCheck={false} aria-label=\"Recovery codes, one per line\" placeholder={field ? \"The complete new set, one per line\" : \"One code per line\"} value={draft} onChange={(e) => setDraft(e.target.value)} autoFocus />\n {error ? <p role=\"alert\" className=\"pt-1 text-xs text-destructive\">{error}</p> : null}\n </Row>\n );\n }\n\n if (!field) {\n if (!canEdit) return null;\n return (\n <Row label=\"Recovery codes\" actions={<Button variant=\"quiet\" icon={<PlusGlyph />} aria-label=\"Add recovery codes\" onClick={() => setDraft(\"\")} />}>\n <span className=\"text-muted-foreground\">None</span>\n </Row>\n );\n }\n\n const sealed = field.handling === \"sealed\";\n const canSee = !sealed && item.capabilities.canReveal;\n const codes = secret.value === null ? null : parseRecoveryCodes(secret.value);\n\n const toggle = async () => {\n if (secret.value !== null) return secret.clear();\n await run(async () => {\n secret.show(await confirmed(() => port.reveal(item, field.key)));\n });\n };\n\n const markUsed = async (index: number) => {\n if (!codes) return;\n const next = withoutCode(codes, index);\n await run(async () => {\n const updated = await confirmed(() => (next === null ? port.fields.removeField(item, field.id) : port.fields.setValue(item, field.id, next)));\n if (next === null) secret.clear();\n else secret.show(next);\n return updated;\n });\n };\n\n return (\n <Row\n label=\"Recovery codes\"\n top={codes !== null}\n actions={\n <>\n {canSee ? <Button variant=\"quiet\" icon={codes ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={codes ? \"Hide codes\" : \"Show codes\"} disabled={busy} onClick={() => void toggle()} /> : null}\n {canEdit && !sealed ? <Button variant=\"quiet\" icon={<PencilGlyph />} aria-label=\"Replace all codes\" disabled={busy} onClick={() => setDraft(\"\")} /> : null}\n </>\n }\n >\n {sealed ? (\n <Badge icon={<LockGlyph />}>Sealed</Badge>\n ) : codes ? (\n <ul className=\"flex flex-col gap-0.5\" aria-label=\"Recovery codes\">\n {codes.map((code, i) => (\n <li key={`${i}-${code}`} className=\"flex min-h-7 items-center gap-1\">\n <code className=\"min-w-0 flex-1 break-all font-mono text-sm text-foreground\">{code}</code>\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label={`Copy code ${i + 1}`} onClick={() => void copyValue(code, \"Recovery code\")} />\n {canEdit ? (\n <Button variant=\"quiet\" icon={<CheckGlyph />} disabled={busy} onClick={() => void markUsed(i)}>\n Mark used\n </Button>\n ) : null}\n </li>\n ))}\n {error ? <li role=\"alert\" className=\"text-xs text-destructive\">{error}</li> : null}\n </ul>\n ) : error ? (\n <span className=\"block truncate text-destructive\" title={error}>{error}</span>\n ) : (\n <span className=\"block truncate tracking-widest text-muted-foreground\">{MASK}</span>\n )}\n </Row>\n );\n}\n\n","import type { ItemDraft } from \"./model\";\n\n/**\n * AN UNSAVED EDIT SURVIVES A RELOAD. Only the parts that are not secret are kept, and only in this\n * tab (sessionStorage): name, description, tags, websites, notes, plaintext fields. Typed passwords,\n * secret fields and one-time-password setup keys are never written to the browser; after a reload\n * those boxes are empty again and the person retypes them.\n */\nexport interface KeptDraft {\n /** The item's `updatedAt` when the edit started; a kept edit for an older version is dropped. */\n basedOn: string;\n draft: Pick<ItemDraft, \"name\" | \"description\" | \"tags\" | \"loginUrls\" | \"notes\" | \"custom\">;\n}\n\nconst PREFIX = \"matrx.vault.draft:\";\n\nexport function draftKey(itemId: string | null, definitionKey: string | null): string {\n return `${PREFIX}${itemId ?? `new:${definitionKey ?? \"custom\"}`}`;\n}\n\nexport function keepDraft(key: string, basedOn: string, d: ItemDraft): void {\n const kept: KeptDraft = { basedOn, draft: { name: d.name, description: d.description, tags: d.tags, loginUrls: d.loginUrls, notes: d.notes, custom: d.custom } };\n try {\n globalThis.sessionStorage?.setItem(key, JSON.stringify(kept));\n } catch {\n /* storage blocked: the edit simply does not survive a reload */\n }\n}\n\nexport function readKeptDraft(key: string, basedOn: string): KeptDraft[\"draft\"] | null {\n try {\n const raw = globalThis.sessionStorage?.getItem(key);\n if (!raw) return null;\n const kept = JSON.parse(raw) as KeptDraft;\n return kept.basedOn === basedOn ? kept.draft : null;\n } catch {\n return null;\n }\n}\n\nexport function dropKeptDraft(key: string): void {\n try {\n globalThis.sessionStorage?.removeItem(key);\n } catch {\n /* nothing kept */\n }\n}\n","/**\n * The pure half of the extension screens: what a page address means, and the words for every\n * outcome the host reports. No React, no page access — tested in `page-logic.test.ts`.\n */\nimport type { UriMatchMode } from \"../model\";\nimport type { CaptureResult, FillOutcome, FillSetupResult, NewPasswordFillOutcome, NewPasswordFind, PageBlock, PageMatchError, SignInOutcome } from \"./host\";\n\nconst LOOPBACK = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\nexport function parsePageUrl(raw: string | null | undefined): URL | null {\n if (!raw) return null;\n try {\n return new URL(raw);\n } catch {\n return null;\n }\n}\n\n/** The site as people read it: `github.com` (no `www.`), or \"\" when the address is not one. */\nexport function pageSite(raw: string | null | undefined): string {\n return parsePageUrl(raw)?.hostname.replace(/^www\\./, \"\") ?? \"\";\n}\n\n/** Browser fill only ever targets https (or a loopback http address while developing). */\nexport function isFillablePage(raw: string | null | undefined): boolean {\n const u = parsePageUrl(raw);\n if (!u) return false;\n return u.protocol === \"https:\" || (u.protocol === \"http:\" && LOOPBACK.has(u.hostname));\n}\n\n/** The stored form of a login address: origin + path. Query and hash carry one-time state. */\nexport function normalizeLoginUrl(raw: string | null | undefined): string | null {\n const u = parsePageUrl(raw);\n return u ? `${u.origin}${u.pathname}` : null;\n}\n\n/** True when an item's websites already match this page under its own matching rule. */\nexport function coversPage(loginUrls: readonly string[], mode: UriMatchMode, pageUrl: string | null | undefined): boolean {\n if (mode === \"never\") return false;\n const page = parsePageUrl(pageUrl);\n if (!page) return false;\n return loginUrls.some((entry) => {\n const stored = parsePageUrl(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(entry) ? entry : `https://${entry}`);\n if (!stored) return false;\n if (mode === \"exact\") return stored.origin === page.origin && stored.pathname === page.pathname;\n if (mode === \"domain\") return page.hostname === stored.hostname || page.hostname.endsWith(`.${stored.hostname}`);\n return stored.host === page.host;\n });\n}\n\n/** `loginUrls` with this page added once (normalized). The same array back when nothing changes. */\nexport function withPageAdded(loginUrls: readonly string[], pageUrl: string | null | undefined): readonly string[] {\n const n = normalizeLoginUrl(pageUrl);\n if (!n || loginUrls.some((e) => normalizeLoginUrl(e) === n)) return loginUrls;\n return [...loginUrls, n];\n}\n\n/**\n * Two saved logins with the same name get the shortest id prefix that tells them apart\n * (`ID 3f`), so \"Update\" and \"Fill\" never name an ambiguous target.\n */\nexport function distinguish(target: { itemId: string; name: string }, all: readonly { itemId: string; name: string }[]): string | null {\n const same = all.filter((x) => x.name === target.name);\n if (same.length < 2) return null;\n for (let n = 1; n <= target.itemId.length; n++) {\n const p = target.itemId.slice(0, n);\n if (same.filter((x) => x.itemId.slice(0, n) === p).length === 1) return `ID ${p}`;\n }\n return `ID ${target.itemId}`;\n}\n\n// ── Words (every line ≤ 60 characters) ──────────────────────────────────────\n\nexport type Tone = \"success\" | \"warning\";\nexport interface Said {\n text: string;\n tone: Tone;\n}\n\nexport const BLOCK_WORDS: Record<PageBlock, string> = {\n restricted: \"This page can’t be filled. Open a site’s sign-in page.\",\n unavailable: \"Filling isn’t available on this page right now.\",\n no_field: \"Click the username or password box, then Fill.\",\n matching_off: \"Turn on login matching in extension settings.\",\n checking: \"Checking this page…\",\n};\n\nexport const MATCH_ERROR_WORDS: Record<PageMatchError, string> = {\n sign_in_required: \"Sign in to see logins for this site.\",\n forbidden: \"The vault refused this request.\",\n fill_setup_required: \"Turn on filling in this browser first.\",\n server_error: \"Saved logins couldn’t be checked.\",\n};\n\nexport const FILL_WORDS: Record<FillOutcome, Said> = {\n filled: { text: \"Filled. Check the form, then sign in.\", tone: \"success\" },\n partial: { text: \"Some boxes didn’t fill. Check them first.\", tone: \"warning\" },\n no_field: { text: \"Click the username or password box, then Fill.\", tone: \"warning\" },\n unavailable: { text: \"Filling isn’t available on this page right now.\", tone: \"warning\" },\n not_started: { text: \"Couldn’t start. Click the login box, then Fill.\", tone: \"warning\" },\n};\n\nexport const SIGN_IN_WORDS: Record<SignInOutcome, Said> = {\n signed_in: { text: \"Signed in.\", tone: \"success\" },\n needs_code: { text: \"Signed in. Finish the check on the page.\", tone: \"success\" },\n challenge: { text: \"The site wants a check. Finish it, then retry.\", tone: \"warning\" },\n rejected: { text: \"The site rejected that login.\", tone: \"warning\" },\n several: { text: \"Several logins match. Pick one to fill.\", tone: \"warning\" },\n no_match: { text: \"No login is turned on for this page.\", tone: \"warning\" },\n unsafe: { text: \"Only https pages can be signed in to.\", tone: \"warning\" },\n signed_out: { text: \"Sign in to AI Matrx first.\", tone: \"warning\" },\n unsupported: { text: \"This browser can’t sign in for you yet.\", tone: \"warning\" },\n unknown: { text: \"Couldn’t confirm the sign-in. Check the page.\", tone: \"warning\" },\n};\n\n/** null = say nothing (a dismissal). */\nexport const CAPTURE_WORDS: Record<CaptureResult, Said | null> = {\n saved: { text: \"Saved to your vault.\", tone: \"success\" },\n updated: { text: \"Login updated.\", tone: \"success\" },\n dismissed: null,\n never: { text: \"Won’t ask again for this site.\", tone: \"success\" },\n expired: { text: \"That prompt expired. Save it by hand.\", tone: \"warning\" },\n sign_in_required: { text: \"Sign in to AI Matrx first.\", tone: \"warning\" },\n error: { text: \"That didn’t work. Try again.\", tone: \"warning\" },\n};\n\nexport function fillSetupError(r: Exclude<FillSetupResult, { ok: true }>): string {\n if (r.reason === \"sign_in_required\") return \"Sign in to AI Matrx first.\";\n if (r.reason === \"not_approved\") return \"Not approved yet. Approve it, then come back.\";\n return r.message?.trim() || \"That didn’t work. Try again.\";\n}\n\nexport const FIND_WORDS: Record<Exclude<NewPasswordFind[\"status\"], \"ready\">, string> = {\n none: \"No new-password box on this page. Copy it instead.\",\n stale: \"The page changed. Generate again.\",\n unavailable: \"This page can’t be reached. Copy it instead.\",\n unsafe: \"Only https pages can be filled. Copy it instead.\",\n};\n\nexport const NEW_PASSWORD_WORDS: Record<NewPasswordFillOutcome, Said> = {\n filled: { text: \"Password filled. Save the form on the page.\", tone: \"success\" },\n partial: { text: \"Some boxes didn’t fill. Check them first.\", tone: \"warning\" },\n stale: { text: \"The page changed. Generate again.\", tone: \"warning\" },\n unavailable: { text: \"This page can’t be reached right now.\", tone: \"warning\" },\n refused: { text: \"Those boxes can’t take this password.\", tone: \"warning\" },\n};\n\n/** Where a target's boxes are, in a few words: `github.com` or `github.com (frame)`. */\nexport function targetLabel(t: { origin: string; topFrame: boolean; fieldCount: number }): string {\n const site = pageSite(t.origin) || t.origin;\n return `${site}${t.topFrame ? \"\" : \" (frame)\"} · ${t.fieldCount} ${t.fieldCount === 1 ? \"box\" : \"boxes\"}`;\n}\n","/**\n * \"Use here\": add the tab's page to a login's websites and turn browser fill on, so the next visit\n * matches. Draws nothing when the page already matches, cannot be filled, or the person cannot edit.\n */\nimport { useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { PlusGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport { useNotify } from \"../notice\";\nimport type { VaultPort } from \"../port\";\nimport { coversPage, isFillablePage, pageSite, withPageAdded } from \"./page-logic\";\n\nexport interface UseOnSiteButtonProps {\n port: VaultPort;\n item: VaultItem;\n /** The tab's address (`host.page.url`). */\n pageUrl: string;\n /** The item as the server now has it. */\n onChanged: (next: VaultItem) => void;\n}\n\n/** True when \"Use here\" would change anything for this item on this page. */\nexport function canUseOnSite(item: VaultItem, pageUrl: string): boolean {\n return item.capabilities.canEdit && isFillablePage(pageUrl) && !coversPage(item.loginUrls, item.uriMatchMode, pageUrl);\n}\n\nexport function UseOnSiteButton({ port, item, pageUrl, onChanged }: UseOnSiteButtonProps) {\n const notify = useNotify();\n const [busy, setBusy] = useState(false);\n if (!canUseOnSite(item, pageUrl)) return null;\n const site = pageSite(pageUrl);\n const run = async () => {\n setBusy(true);\n try {\n const next = await port.fields.updateItem(item, { loginUrls: [...withPageAdded(item.loginUrls, pageUrl)], browserFillEnabled: true });\n onChanged(next);\n notify(`Now fills on ${site}`);\n } catch (e) {\n notify(e instanceof Error ? e.message : \"The website couldn’t be added.\", \"error\");\n } finally {\n setBusy(false);\n }\n };\n return (\n <Button variant=\"outline\" icon={<PlusGlyph />} disabled={busy} onClick={() => void run()} title={`Fill this login on ${site}`}>\n Use here\n </Button>\n );\n}\n","/**\n * WHO HAS ACCESS (`?panel=share`). The list LOADS first, then every change touches ONE entry —\n * adding, changing or removing a person never rewrites anybody else (the old \"save the whole list\"\n * panel silently revoked everyone it had not loaded; never bring that back). Common first: the list\n * and \"add a person\". Rare on demand: sharing into an organization and member vault access.\n */\nimport { useEffect, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Button, DisclosureHeader, Field, RegionSkeleton, Select } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { BuildingGlyph, PersonGlyph, UsersGlyph, XGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Empty, Panel, Section } from \"../ui\";\nimport { isEmail, LEVEL_OPTIONS, MEMBER_ACCESS_LABEL, MEMBER_CHOICE_DEFAULT, shareSummary, type MemberChoice } from \"./logic\";\nimport { AccessLine, message, StatusLine, useAction } from \"./parts\";\nimport type { MemberAccessList, ShareGrant, ShareLevel } from \"./port\";\n\nexport { MovePanel } from \"./MovePanel\";\n\nfunction useGrants(port: VaultPort, item: VaultItem) {\n const [grants, setGrants] = useState<ShareGrant[] | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [nonce, setNonce] = useState(0);\n const allowed = item.capabilities.canManage;\n useEffect(() => {\n if (!allowed) return;\n let live = true;\n setLoadError(null);\n port.sharing.grants(item).then(\n (g) => live && setGrants(g),\n (e: unknown) => live && setLoadError(message(e, \"The access list could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [port, item, allowed, nonce]);\n return { grants, setGrants, loadError, reload: () => setNonce((n) => n + 1) };\n}\n\nexport function SharePanel({ item, port, organizations, onClose, onChanged }: ItemPanelProps) {\n const { grants, setGrants, loadError, reload } = useGrants(port, item);\n const { busy, error, notice, run } = useAction();\n const [email, setEmail] = useState(\"\");\n const [level, setLevel] = useState<ShareLevel>(\"use\");\n const [more, setMore] = useState(false);\n const isOrg = item.owner.kind === \"organization\" && item.owner.organizationId !== null;\n const orgName = item.owner.label;\n const people = (grants ?? []).filter((g) => g.kind === \"person\");\n\n const add = async () => {\n const to = email.trim();\n if (!isEmail(to)) return;\n const g = await run(\"add\", () => port.sharing.addPerson(item, to, level), `Shared with ${to}`);\n if (!g) return;\n setGrants((all) => [...(all ?? []).filter((x) => x.id !== g.id), g]);\n setEmail(\"\");\n setLevel(\"use\");\n };\n\n const change = async (g: ShareGrant, next: ShareLevel) => {\n if (next === g.level) return;\n const updated = await run(g.id, () => port.sharing.setLevel(item, g, next));\n if (updated) setGrants((all) => (all ?? []).map((x) => (x.id === g.id ? { ...updated, label: updated.label || g.label } : x)));\n };\n\n const revoke = async (g: ShareGrant) => {\n const ok = await confirm({\n title: g.kind === \"organization\" ? `Remove from ${g.label}?` : \"Remove access?\",\n description: g.kind === \"organization\" ? `${g.label} members can no longer use \"${item.name}\". It stays in your vault.` : `${g.label} can no longer use \"${item.name}\". This takes effect at once.`,\n confirmLabel: \"Remove\",\n variant: \"destructive\",\n });\n if (!ok) return;\n const done = await run(g.id, async () => {\n await port.sharing.revoke(item, g);\n return true;\n }, `${g.label} removed`);\n if (done) setGrants((all) => (all ?? []).filter((x) => x.id !== g.id));\n };\n\n const setMode = async (mode: \"all_members\" | \"restricted\") => {\n if (mode === (item.accessMode === \"restricted\" ? \"restricted\" : \"all_members\")) return;\n if (mode === \"all_members\" && people.length > 0) {\n const ok = await confirm({\n title: \"Open to every member?\",\n description: `Every member of ${orgName} gets it at their own vault access. The ${people.length === 1 ? \"person\" : `${people.length} people`} listed here lose their own access.`,\n confirmLabel: \"Open to members\",\n variant: \"destructive\",\n });\n if (!ok) return;\n }\n const next = await run(\"mode\", () => port.sharing.setAccessMode(item, mode, people), mode === \"restricted\" ? \"Only the people listed\" : \"Every member has access\");\n if (next) {\n onChanged(next);\n reload();\n }\n };\n\n if (!item.capabilities.canManage) {\n return (\n <Panel title=\"Share\" size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Done</Button>}>\n <Section>\n <Empty>Only the owner can change who has access.</Empty>\n </Section>\n </Panel>\n );\n }\n\n return (\n <Panel\n title=\"Share\"\n size=\"md\"\n onClose={onClose}\n footer={\n <div className=\"flex w-full items-center gap-2\">\n <StatusLine error={error} notice={notice} />\n <Button variant=\"primary\" className=\"ml-auto\" onClick={onClose}>Done</Button>\n </div>\n }\n >\n <Section title=\"Who has access\">\n {isOrg ? <AccessLine glyph={BuildingGlyph} who={`${orgName} admins`}><span className=\"px-2 text-sm text-muted-foreground\">Full access</span></AccessLine> : <AccessLine glyph={PersonGlyph} who=\"You\" meta=\"Owner\"><span className=\"px-2 text-sm text-muted-foreground\">Full access</span></AccessLine>}\n {isOrg ? (\n <AccessLine glyph={UsersGlyph} who={`${orgName} members`}>\n <Select\n variant=\"inline\"\n align=\"end\"\n aria-label=\"Which members can use it\"\n disabled={busy !== null}\n value={item.accessMode === \"restricted\" ? \"restricted\" : \"all_members\"}\n onValueChange={(v) => void setMode(v)}\n options={[\n { value: \"all_members\", label: \"Everyone\", meta: \"At their own vault access\" },\n { value: \"restricted\", label: \"Only listed\", meta: \"Only the people below\" },\n ]}\n />\n </AccessLine>\n ) : null}\n {loadError ? (\n <AccessLine glyph={XGlyph} who={<span className=\"text-destructive\">{loadError}</span>}>\n <Button variant=\"quiet\" onClick={reload}>Retry</Button>\n </AccessLine>\n ) : grants === null ? (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading who has access\" className=\"px-3 sm:px-4\" />\n ) : (\n grants.map((g) => (\n <AccessLine key={g.id} glyph={g.kind === \"organization\" ? BuildingGlyph : PersonGlyph} who={g.label} {...(g.kind === \"organization\" ? { meta: \"Organization vault\" } : {})}>\n <Select variant=\"inline\" align=\"end\" aria-label={`What ${g.label} can do`} disabled={busy !== null} value={g.level} onValueChange={(v) => void change(g, v)} options={LEVEL_OPTIONS} />\n <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label={`Remove ${g.label}`} disabled={busy !== null} onClick={() => void revoke(g)} />\n </AccessLine>\n ))\n )}\n <div className=\"flex min-h-11 items-center gap-2 px-3 sm:px-4\">\n <PersonGlyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <Field\n className=\"min-w-0 flex-1\"\n type=\"email\"\n inputMode=\"email\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"Email address\"\n aria-label=\"Their exact email\"\n value={email}\n disabled={busy === \"add\"}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void add();\n }\n }}\n />\n <Select variant=\"inline\" align=\"end\" aria-label=\"What they can do\" value={level} onValueChange={setLevel} options={LEVEL_OPTIONS} />\n <Button variant=\"primary\" disabled={busy !== null || !isEmail(email)} onClick={() => void add()}>Share</Button>\n </div>\n </Section>\n\n <div className=\"flex flex-col gap-3\">\n <DisclosureHeader open={more} title=\"More options\" onClick={() => setMore((o) => !o)} />\n {more ? (\n isOrg && item.owner.organizationId ? (\n <MemberAccess port={port} organizationId={item.owner.organizationId} organizationName={orgName} />\n ) : (\n <IntoOrganization item={item} port={port} organizations={organizations} grants={grants ?? []} onShared={(g) => setGrants((all) => [...(all ?? []).filter((x) => x.id !== g.id), g])} />\n )\n ) : null}\n </div>\n </Panel>\n );\n}\n\n/** Share a personal item into one of the owner's organizations; it then lives in both vaults. */\nfunction IntoOrganization({ item, port, organizations, grants, onShared }: { item: VaultItem; port: VaultPort; organizations: ItemPanelProps[\"organizations\"]; grants: readonly ShareGrant[]; onShared: (g: ShareGrant) => void }) {\n const { busy, error, notice, run } = useAction();\n const open = organizations.filter((o) => !grants.some((g) => g.organizationId === o.id));\n const [target, setTarget] = useState<string>(\"\");\n const [level, setLevel] = useState<ShareLevel>(\"use\");\n const chosen = open.find((o) => o.id === target);\n\n if (item.owner.kind !== \"me\") return null;\n return (\n <Section title=\"Share into organization\">\n {open.length > 0 ? (\n <>\n <div className=\"flex min-h-11 items-center gap-2 px-3 sm:px-4\">\n <BuildingGlyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <Select className=\"min-w-0 flex-1\" aria-label=\"Organization\" value={target || \"__none__\"} onValueChange={(v) => setTarget(v === \"__none__\" ? \"\" : v)} options={[{ value: \"__none__\", label: \"Choose an organization\" }, ...open.map((o) => ({ value: o.id, label: o.name }))]} />\n <Select variant=\"inline\" align=\"end\" aria-label=\"What its members can do\" value={level} onValueChange={setLevel} options={LEVEL_OPTIONS} />\n <Button\n variant=\"outline\"\n disabled={busy !== null || !chosen}\n onClick={async () => {\n if (!chosen) return;\n const g = await run(\"org\", () => port.sharing.addOrganization(item, chosen.id, level), `Shared into ${chosen.name}`);\n if (g) {\n onShared({ ...g, label: g.label === \"Organization\" ? chosen.name : g.label });\n setTarget(\"\");\n }\n }}\n >\n Share\n </Button>\n </div>\n <p className=\"truncate px-3 pb-1 text-xs text-muted-foreground sm:px-4\">{error ? <span className=\"text-destructive\">{error}</span> : notice ? <span className=\"text-success\">{notice}</span> : \"It stays yours; its members can use it too\"}</p>\n </>\n ) : (\n <Empty>{organizations.length ? \"Already in every organization you belong to.\" : \"You are not in any organization.\"}</Empty>\n )}\n </Section>\n );\n}\n\nconst CHOICES: readonly { value: MemberChoice; label: string; meta?: string }[] = [\n { value: MEMBER_CHOICE_DEFAULT, label: \"Default\" },\n { value: \"none\", label: \"No access\" },\n { value: \"use\", label: \"Can use\", meta: \"Sign in, never see passwords\" },\n { value: \"editor\", label: \"Can edit\", meta: \"See and change\" },\n];\n\n/** Each member's access to the organization's WHOLE vault (owners and admins set it). */\nfunction MemberAccess({ port, organizationId, organizationName }: { port: VaultPort; organizationId: string; organizationName: string }) {\n const [list, setList] = useState<MemberAccessList | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const { busy, error, run } = useAction();\n\n useEffect(() => {\n let live = true;\n port.sharing.memberAccess(organizationId).then(\n (l) => live && setList(l),\n (e: unknown) => live && setLoadError((e as { status?: number } | null)?.status === 403 ? \"Only owners and admins see member access.\" : message(e, \"Member access could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [port, organizationId]);\n\n const set = async (userId: string, choice: MemberChoice) => {\n const access = choice === MEMBER_CHOICE_DEFAULT ? null : choice;\n const effective = await run(userId, () => port.sharing.setMemberAccess(organizationId, userId, access));\n if (effective) setList((l) => (l ? { ...l, members: l.members.map((m) => (m.userId === userId ? { ...m, access, effective } : m)) } : l));\n };\n\n return (\n <Section title={`${organizationName} vault access`}>\n {loadError ? (\n <Empty>{loadError}</Empty>\n ) : list === null ? (\n <RegionSkeleton shape=\"rows\" count={3} aria-label=\"Loading member access\" className=\"px-3 sm:px-4\" />\n ) : list.members.length === 0 ? (\n <Empty>No members yet.</Empty>\n ) : (\n list.members.map((m) => (\n <AccessLine key={m.userId} glyph={PersonGlyph} who={m.email || m.userId} meta={m.role}>\n {m.effective === \"admin\" ? (\n <span className=\"px-2 text-sm text-muted-foreground\">{MEMBER_ACCESS_LABEL.admin}</span>\n ) : (\n <Select\n variant=\"inline\"\n align=\"end\"\n aria-label={`${m.email || \"Member\"}'s vault access`}\n disabled={busy !== null}\n value={m.access ?? MEMBER_CHOICE_DEFAULT}\n onValueChange={(v) => void set(m.userId, v)}\n options={CHOICES.map((c) => (c.value === MEMBER_CHOICE_DEFAULT ? { value: c.value, label: `Default (${MEMBER_ACCESS_LABEL[list.defaultAccess]})` } : c.meta ? { value: c.value, label: c.label, meta: c.meta } : { value: c.value, label: c.label }))}\n />\n )}\n </AccessLine>\n ))\n )}\n <p className=\"truncate px-3 pb-1 text-xs text-muted-foreground sm:px-4\">{error ? <span className=\"text-destructive\">{error}</span> : \"Applies to every item in this organization\"}</p>\n </Section>\n );\n}\n\n/**\n * A one-line \"Shared with 3 people\" for the item header. Renders nothing when the person cannot\n * manage the item (the list is owner information) or nobody else has access.\n */\nexport function SharingSummary({ item, port, className }: { item: VaultItem; port: VaultPort; className?: string }) {\n const [text, setText] = useState(\"\");\n const allowed = item.capabilities.canManage;\n useEffect(() => {\n if (!allowed) return;\n let live = true;\n port.sharing.grants(item).then(\n (g) => live && setText(shareSummary(g)),\n () => live && setText(\"\"),\n );\n return () => {\n live = false;\n };\n }, [port, item, allowed]);\n if (!allowed || !text) return null;\n return <span className={cn(\"truncate text-xs text-muted-foreground\", className)}>{text}</span>;\n}\n","/** The sharing area's pure rules: levels, labels, destinations and the consequence of each move. */\nimport type { VaultItem, VaultOrganizationRef } from \"../model\";\nimport type { EffectiveVaultAccess, MemberVaultAccess, ShareLevel, VaultDestination } from \"./port\";\n\nexport const LEVEL_LABEL: Record<ShareLevel, string> = { use: \"Can use\", edit: \"Can edit\" };\nexport const LEVEL_OPTIONS: readonly { value: ShareLevel; label: string; meta: string }[] = [\n { value: \"use\", label: \"Can use\", meta: \"Sign in, never see the password\" },\n { value: \"edit\", label: \"Can edit\", meta: \"Show and change values\" },\n];\n\nexport const MEMBER_ACCESS_LABEL: Record<EffectiveVaultAccess, string> = { none: \"No access\", use: \"Can use\", editor: \"Can edit\", admin: \"Full access\" };\n\n/** A grant's level from the server's two flags. `can_manage` on a grant is reveal + edit, never manage. */\nexport function levelOf(flags: { can_use?: boolean | null; can_manage?: boolean | null }): ShareLevel {\n return flags.can_manage ? \"edit\" : \"use\";\n}\n\nexport function flagsOf(level: ShareLevel): { can_use: true; can_manage: boolean } {\n return { can_use: true, can_manage: level === \"edit\" };\n}\n\n/** Exact email only: the server resolves it; there is no directory search. */\nexport function isEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value.trim());\n}\n\n/** Key for a destination in a Select (`personal` or the organization id). */\nexport const PERSONAL = \"personal\";\nexport const destinationOf = (key: string): VaultDestination => (key === PERSONAL ? null : key);\nexport const keyOf = (d: VaultDestination): string => d ?? PERSONAL;\n\n/** Where an item can MOVE: anywhere it is not already. Shared-with-me items move nowhere. */\nexport function moveDestinations(item: VaultItem, orgs: readonly VaultOrganizationRef[]): { value: string; label: string }[] {\n if (item.owner.kind === \"shared\") return [];\n const here = item.owner.organizationId;\n return [...(here ? [{ value: PERSONAL, label: \"Personal\" }] : []), ...orgs.filter((o) => o.id !== here).map((o) => ({ value: o.id, label: o.name }))];\n}\n\n/**\n * Where an item can be COPIED: the person's own vault or any organization — except the vault it is\n * already in, where the server refuses a second active copy.\n */\nexport function copyDestinations(orgs: readonly VaultOrganizationRef[], item?: Pick<VaultItem, \"owner\">): { value: string; label: string }[] {\n const here = item ? (item.owner.kind === \"me\" ? PERSONAL : item.owner.organizationId) : undefined;\n return [{ value: PERSONAL, label: \"Personal\" }, ...orgs.map((o) => ({ value: o.id, label: o.name }))].filter((d) => d.value !== here);\n}\n\n/** The server's words for a refused copy, said plainly. */\nexport function copyRefusal(message: string): string | null {\n return /duplicate/i.test(message) ? \"There is already a copy of this item there.\" : null;\n}\n\n/** Native passkeys never change hands: the server refuses to move, give or copy them. */\nexport const isPasskey = (item: Pick<VaultItem, \"definitionKey\">) => item.definitionKey === \"native_passkey\" || item.definitionKey === \"passkey_private\";\n\n/** What moving does, said before the click (≤ 60 characters). */\nexport function moveConsequence(item: VaultItem, to: VaultDestination): string {\n if (item.authenticator) return \"One-time password stays behind; set it up again\";\n return to ? \"Its members get access; people you shared with lose it\" : \"Only you; organization members lose access\";\n}\n\n/** What giving ownership does, in full, for the confirmation. */\nexport function giveDescription(item: VaultItem, email: string): string {\n const otp = item.authenticator ? \" Its one-time password does not move; they set it up again.\" : \"\";\n return `\"${item.name}\" moves to ${email}'s vault. You lose all access at once and everyone you shared it with loses theirs. A password you have already seen stays known; change it afterwards if that matters.${otp}`;\n}\n\n/** Field keys as people read them (\"totp_secret\" → \"Totp secret\"). */\nexport function fieldNames(keys: readonly string[]): string {\n return keys.map((k) => k.replace(/[_-]+/g, \" \").replace(/^\\w/, (c) => c.toUpperCase())).join(\", \");\n}\n\n/** A short count for the item header: \"Shared with 3 people\", \"Shared with 1 person and Acme\". */\nexport function shareSummary(grants: readonly { kind: \"person\" | \"organization\"; label: string }[]): string {\n const people = grants.filter((g) => g.kind === \"person\").length;\n const orgs = grants.filter((g) => g.kind === \"organization\").map((g) => g.label);\n if (people === 0 && orgs.length === 0) return \"\";\n const p = people ? `${people} ${people === 1 ? \"person\" : \"people\"}` : \"\";\n const o = orgs.length === 1 ? orgs[0] ?? \"\" : orgs.length > 1 ? `${orgs.length} organizations` : \"\";\n return `Shared with ${[p, o].filter(Boolean).join(\" and \")}`;\n}\n\nexport const MEMBER_CHOICE_DEFAULT = \"default\";\nexport type MemberChoice = MemberVaultAccess | typeof MEMBER_CHOICE_DEFAULT;\n","import { copyRefusal } from \"./logic\";\n/** The sharing area's shared pieces: one-change-at-a-time actions, the access line, the status line. */\nimport { useState, type ReactNode } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { Glyph } from \"../glyphs\";\n\nexport const message = (e: unknown, fallback: string) => {\n const m = e instanceof Error && e.message ? e.message : fallback;\n return copyRefusal(m) ?? m;\n};\n\n/** Runs one change at a time: shows it busy, reports failure in the panel, stays quiet on a cancelled confirmation. */\nexport function useAction() {\n const confirmed = useConfirmed();\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n async function run<T>(key: string, fn: () => Promise<T>, done?: string): Promise<T | undefined> {\n setBusy(key);\n setError(null);\n setNotice(null);\n try {\n const out = await confirmed(fn);\n if (done) setNotice(done);\n return out;\n } catch (e) {\n if (!wasCancelled(e)) setError(message(e, \"That did not go through.\"));\n return undefined;\n } finally {\n setBusy(null);\n }\n }\n return { busy, error, notice, run, setNotice };\n}\n\n/** One line on an access list: glyph · who · (muted meta) · controls. Space between lines, never rules. */\nexport function AccessLine({ glyph: G, who, meta, children }: { glyph: Glyph; who: ReactNode; meta?: ReactNode; children?: ReactNode }) {\n return (\n <div className=\"flex min-h-11 items-center gap-2 px-3 sm:px-4\">\n <G className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"flex min-w-0 flex-1 items-baseline gap-2\">\n <span className=\"truncate text-sm text-foreground\">{who}</span>\n {meta ? <span className=\"shrink-0 text-xs text-muted-foreground\">{meta}</span> : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5\">{children}</div>\n </div>\n );\n}\n\n/** The panel's one status line: what failed, or what just happened. */\nexport function StatusLine({ error, notice }: { error: string | null; notice: string | null }) {\n if (!error && !notice) return null;\n return <p className={cn(\"min-w-0 flex-1 line-clamp-2 text-sm\", error ? \"text-destructive\" : \"text-success\")} title={error ?? notice ?? undefined}>{error ?? notice}</p>;\n}\n","/**\n * MOVE, GIVE, COPY (`?panel=move`). Three different things, each saying what it does before the\n * click: Move keeps the same item (every reference keeps working) in another of YOUR vaults; Give\n * hands it to another person and you lose it; Copy makes a separate item whose values can drift.\n */\nimport { useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Button, Field, Select } from \"@ai-matrx/design-system/controls\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { copyDestinations, destinationOf, fieldNames, giveDescription, isEmail, isPasskey, moveConsequence, moveDestinations } from \"./logic\";\nimport { StatusLine, useAction } from \"./parts\";\n\n/** \"Nothing chosen yet\": a move or copy never starts pointed at a destination. */\nconst NONE = \"__none__\";\n\nexport function MovePanel({ item, port, organizations, onClose, onChanged }: ItemPanelProps) {\n const { busy, error, notice, run, setNotice } = useAction();\n const moves = moveDestinations(item, organizations);\n const copies = copyDestinations(organizations, item);\n const [moveTo, setMoveTo] = useState(\"\");\n const [copyTo, setCopyTo] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n\n const passkey = isPasskey(item);\n const canMove = item.capabilities.canManage && !passkey && moves.length > 0;\n // Giving away is for an item the person owns outright; an organization's item is moved, not given.\n const canGive = item.capabilities.canManage && item.owner.kind === \"me\" && !passkey;\n const canCopy = item.capabilities.canEdit && !passkey;\n const moveChoice = moves.find((d) => d.value === moveTo);\n const copyChoice = copies.find((d) => d.value === copyTo);\n\n const move = async () => {\n if (!moveChoice) return;\n const to = destinationOf(moveChoice.value);\n const ok = await confirm({\n title: `Move to ${moveChoice.label}?`,\n description: `\"${item.name}\" stays the same item, so everything using it keeps working. ${moveConsequence(item, to)}.`,\n confirmLabel: \"Move\",\n });\n if (!ok) return;\n const out = await run(\"move\", () => port.sharing.move(item, to));\n if (!out) return;\n onChanged(out.item);\n // Something left behind (the one-time-password seed) is said here; otherwise the move is done.\n if (out.notMoved.length > 0) setNotice(`Moved to ${moveChoice.label}. Not moved: ${fieldNames(out.notMoved)}`);\n else onClose();\n };\n\n const give = async () => {\n const to = email.trim();\n if (!isEmail(to)) return;\n const ok = await confirm({ title: \"Give ownership away?\", description: giveDescription(item, to), confirmLabel: \"Give ownership\", variant: \"destructive\" });\n if (!ok) return;\n const out = await run(\"give\", () => port.sharing.giveOwnership(item, to));\n if (!out) return;\n onClose();\n onChanged(null);\n };\n\n const copy = async () => {\n if (!copyChoice) return;\n const made = await run(\"copy\", () => port.sharing.copy(item, destinationOf(copyChoice.value)), `Copy made in ${copyChoice.label}`);\n if (made) onChanged();\n };\n\n const nothing = !canMove && !canGive && !canCopy;\n\n return (\n <Panel\n title=\"Move or copy\"\n size=\"md\"\n onClose={onClose}\n footer={\n <div className=\"flex w-full items-center gap-2\">\n <StatusLine error={error} notice={notice} />\n <Button variant=\"outline\" className=\"ml-auto\" onClick={onClose}>Close</Button>\n </div>\n }\n >\n {nothing ? (\n <Section>\n <Empty>{passkey ? \"A passkey stays where it was created.\" : \"Only the owner can move or give this item.\"}</Empty>\n </Section>\n ) : (\n <Section>\n {canMove && moves.length > 0 ? (\n <Row\n label=\"Move to\"\n hint={moveChoice ? moveConsequence(item, destinationOf(moveChoice.value)) : undefined}\n actions={<Button variant=\"outline\" disabled={busy !== null || !moveChoice} onClick={() => void move()}>Move</Button>}\n >\n <Select className=\"w-full\" aria-label=\"Move to\" value={moveTo || NONE} onValueChange={(v) => setMoveTo(v === NONE ? \"\" : v)} options={[{ value: NONE, label: \"Choose where\" }, ...moves]} />\n </Row>\n ) : null}\n {canGive ? (\n <Row label=\"Give to\" hint=\"You lose all access; your shares end\" actions={<Button variant=\"danger\" disabled={busy !== null || !isEmail(email)} onClick={() => void give()}>Give</Button>}>\n <Field\n className=\"w-full\"\n type=\"email\"\n inputMode=\"email\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"Their exact email\"\n aria-label=\"Give ownership to\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </Row>\n ) : null}\n {canCopy && copies.length > 0 ? (\n <Row label=\"Copy to\" hint=\"A separate item; edits no longer sync\" actions={<Button variant=\"outline\" disabled={busy !== null || !copyChoice} onClick={() => void copy()}>Copy</Button>}>\n <Select className=\"w-full\" aria-label=\"Copy to\" value={copyTo || NONE} onValueChange={(v) => setCopyTo(v === NONE ? \"\" : v)} options={[{ value: NONE, label: \"Choose where\" }, ...copies]} />\n </Row>\n ) : null}\n </Section>\n )}\n </Panel>\n );\n}\n","import { useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport type { VaultViewProps } from \"../area-props\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { RestoreGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport { Empty, Section, formatDate } from \"../ui\";\nimport { matchesQuery, restoreFailure } from \"./logic\";\nimport type { RestoreResult } from \"./port\";\nimport { RestorePanel } from \"./RestorePanel\";\n\n/** Deleted items, with Restore. The server keeps them until they are recovered. */\nexport function TrashView({ port, deleted, query, header, onChanged }: VaultViewProps) {\n const confirmed = useConfirmed();\n const [busyId, setBusyId] = useState<string | null>(null);\n const [message, setMessage] = useState<{ tone: \"ok\" | \"error\"; text: string } | null>(null);\n const shown = deleted.filter((i) => matchesQuery(i, query));\n\n const [restoring, setRestoring] = useState<VaultItem | null>(null);\n\n /** Runs inside the restore panel, which shows a failure itself; the trash line only says what landed. */\n const restore = async (item: VaultItem, deletionId?: string): Promise<RestoreResult | null> => {\n setBusyId(item.id);\n setMessage(null);\n try {\n const r = await confirmed(() => port.lists.restore(item, deletionId));\n setMessage({ tone: \"ok\", text: r.alreadyRestored ? `\"${item.name}\" was already restored.` : `Restored \"${item.name}\" with ${r.restoredFields} fields and ${r.restoredAttachments} files. It is turned off.` });\n onChanged();\n return r;\n } catch (e) {\n if (wasCancelled(e)) return null;\n throw new Error(restoreFailure(e));\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-3\">\n {header}\n <Section title=\"Trash\">\n {shown.length === 0 ? (\n <Empty>{deleted.length === 0 ? \"The trash is empty.\" : \"Nothing matches.\"}</Empty>\n ) : (\n shown.map((item) => (\n // A list row, not a field row: the name gets the whole width (on a phone a label column\n // left \"Vau…\" for every row), the deletion date sits under it.\n <div key={item.id} className=\"flex min-h-12 items-center gap-3 px-3 py-1.5 sm:px-4\">\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm text-foreground\">{item.name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{[item.deletion?.deletedAt ? `Deleted ${formatDate(item.deletion.deletedAt)}` : null, item.owner.kind !== \"me\" ? item.owner.label : null].filter(Boolean).join(\" · \")}</span>\n </span>\n <Button variant=\"outline\" icon={<RestoreGlyph />} disabled={busyId !== null || !item.deletion} onClick={() => setRestoring(item)}>\n Restore\n </Button>\n </div>\n ))\n )}\n </Section>\n {restoring ? <RestorePanel lists={port.lists} item={restoring} restore={(deletionId) => restore(restoring, deletionId)} onClose={() => setRestoring(null)} /> : null}\n {message ? <p role=\"status\" className={message.tone === \"error\" ? \"px-1 text-sm text-destructive\" : \"px-1 text-sm text-muted-foreground\"}>{message.text}</p> : null}\n </div>\n );\n}\n","import type { VaultItem } from \"../model\";\nimport type { RecoveryPreview, RecoveryRefusal } from \"./port\";\n\n/** The `credential_item` token the per-person state ledger files vault items under. */\nexport const ENTITY_TYPE = \"credential_item\";\n\nexport interface StateRow {\n entity_type?: string | null;\n entity_id?: string | null;\n is_favorite?: boolean | null;\n last_viewed_at?: string | null;\n}\n\nconst rowsOf = (data: unknown): StateRow[] => (Array.isArray(data) ? (data as StateRow[]) : []).filter((r) => r && r.entity_type === ENTITY_TYPE && typeof r.entity_id === \"string\");\n\nexport function favoriteIds(data: unknown): string[] {\n return rowsOf(data).filter((r) => r.is_favorite === true).map((r) => r.entity_id as string);\n}\n\n/** Opened items, newest first. */\nexport function recentIds(data: unknown, limit = 50): string[] {\n return rowsOf(data)\n .filter((r) => typeof r.last_viewed_at === \"string\" && r.last_viewed_at !== \"\")\n .sort((a, b) => Date.parse(b.last_viewed_at as string) - Date.parse(a.last_viewed_at as string))\n .slice(0, limit)\n .map((r) => r.entity_id as string);\n}\n\n/** Trash search: name, type, owner, tags. */\nexport function matchesQuery(item: VaultItem, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n return [item.name, item.definitionLabel, item.owner.label, ...item.tags].some((s) => s.toLowerCase().includes(q));\n}\n\n/** A server refusal in words a person can act on. */\nexport function restoreFailure(e: unknown): string {\n const err = e as { status?: unknown; message?: unknown } | null;\n if (err?.status === 422) return \"This item can't be restored automatically. Its recovery data is kept.\";\n if (err?.status === 409) return \"This item changed since it was deleted. Reload the trash.\";\n return typeof err?.message === \"string\" && err.message ? err.message : \"Restore did not complete. Try again.\";\n}\n\nconst REFUSALS: readonly RecoveryRefusal[] = [\n \"recovery_tracking_unavailable\",\n \"recovery_manifest_unsupported\",\n \"protected_component_requires_native_recovery\",\n \"linked_component_requires_native_recovery\",\n \"native_recovery_unavailable\",\n \"native_components_missing\",\n \"native_components_conflict\",\n \"native_manifest_invalid\",\n];\nconst isRefusal = (v: unknown): v is RecoveryRefusal => (REFUSALS as readonly unknown[]).includes(v);\nconst isUuid = (v: unknown): v is string => typeof v === \"string\" && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v);\nconst isCount = (v: unknown): v is number => typeof v === \"number\" && Number.isInteger(v) && v >= 0;\nconst INCOMPLETE = \"Recovery details were incomplete. Reload Trash and try again.\";\n\n/** The `vault_recovery_preview` answer, checked field by field. A shape that doesn't hold is an error, never a guess. */\nexport function parseRecoveryPreview(raw: unknown): RecoveryPreview {\n if (!raw || typeof raw !== \"object\") throw new Error(\"Recovery details were unavailable. Reload Trash and try again.\");\n const r = raw as Record<string, unknown>;\n if (typeof r.supported !== \"boolean\") throw new Error(INCOMPLETE);\n const prior = r.prior_was_disabled;\n if (r.supported) {\n // Version 1 had no passkey count: absent means none, never \"unknown\".\n const passkeys = r.native_passkeys_count === undefined ? 0 : r.native_passkeys_count;\n if (!isCount(r.fields_count) || !isCount(r.attachments_count) || (passkeys !== 0 && passkeys !== 1) || (passkeys === 1 && r.fields_count < 1) || typeof prior !== \"boolean\" || !isUuid(r.deletion_id) || (r.reason ?? null) !== null) throw new Error(INCOMPLETE);\n return { supported: true, deletionId: r.deletion_id, fields: r.fields_count, attachments: r.attachments_count, passkeys, priorWasDisabled: prior };\n }\n const deletionId = r.deletion_id ?? null;\n if ((deletionId !== null && !isUuid(deletionId)) || (prior != null && typeof prior !== \"boolean\") || (r.fields_count ?? null) !== null || (r.attachments_count ?? null) !== null || !isRefusal(r.reason)) throw new Error(INCOMPLETE);\n return { supported: false, deletionId, reason: r.reason, priorWasDisabled: typeof prior === \"boolean\" ? prior : null };\n}\n\n/** Why this one can't be restored here. Its retained recovery data is never touched. */\nexport function refusalText(reason: RecoveryRefusal): string {\n switch (reason) {\n case \"recovery_tracking_unavailable\":\n return \"Deleted before recovery tracking began, so it can't be restored automatically. Its recovery data is kept.\";\n case \"recovery_manifest_unsupported\":\n return \"Its recovery record can't be restored automatically yet. Its recovery data is kept.\";\n case \"protected_component_requires_native_recovery\":\n return \"It holds protected material that can't be restored automatically yet. Its recovery data is kept.\";\n case \"linked_component_requires_native_recovery\":\n return \"It is linked to a provider or integration, so it can't be restored automatically yet. Its recovery data is kept.\";\n case \"native_recovery_unavailable\":\n return \"Passkey recovery is unavailable for now. Reload Trash and try again; nothing was changed.\";\n case \"native_components_missing\":\n return \"Its passkey recovery parts are no longer complete. Nothing was changed; reload Trash and look again.\";\n case \"native_components_conflict\":\n return \"Its passkey recovery parts no longer match. Nothing was changed; reload Trash and look again.\";\n case \"native_manifest_invalid\":\n return \"Its passkey recovery record is invalid. Nothing was changed; reload Trash and look again.\";\n }\n}\n","import { useEffect, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { RestoreGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { refusalText } from \"./logic\";\nimport type { ListsPort, RecoveryPreview, RestoreResult } from \"./port\";\n\nconst count = (n: number, one: string) => `${n} ${one}${n === 1 ? \"\" : \"s\"}`;\n\n/**\n * Restore, with the answer to \"what comes back?\" first: the counts, what stays off, or why it\n * can't be restored here. Nothing changes until the Restore button.\n */\nexport function RestorePanel({ lists, item, restore, onClose }: { lists: ListsPort; item: VaultItem; restore: (deletionId?: string) => Promise<RestoreResult | null>; onClose: () => void }) {\n const [preview, setPreview] = useState<RecoveryPreview | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n // Without a preview door there is nothing to read; the restore itself still asks the server.\n const [loading, setLoading] = useState(Boolean(lists.preview));\n\n useEffect(() => {\n if (!lists.preview) return;\n let live = true;\n lists.preview(item).then(\n (p) => {\n if (!live) return;\n setPreview(p);\n setLoading(false);\n },\n (e: unknown) => {\n if (!live) return;\n setError(e instanceof Error && e.message ? e.message : \"Recovery could not be reviewed. Reload Trash and try again.\");\n setLoading(false);\n },\n );\n return () => {\n live = false;\n };\n }, [lists, item]);\n\n const refused = preview !== null && !preview.supported;\n const run = async () => {\n setBusy(true);\n setError(null);\n try {\n const result = await restore(preview?.supported ? preview.deletionId : undefined);\n if (result) onClose();\n } catch (e) {\n setError(e instanceof Error && e.message ? e.message : \"Restore did not complete. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Panel\n title={`Restore \"${item.name}\"`}\n size=\"md\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n {refused ? \"Close\" : \"Cancel\"}\n </Button>\n {refused ? null : (\n <Button variant=\"primary\" icon={<RestoreGlyph />} disabled={busy || loading || (lists.preview !== undefined && preview === null)} onClick={() => void run()}>\n {busy ? \"Restoring…\" : \"Restore\"}\n </Button>\n )}\n </>\n }\n >\n {loading ? (\n <Section>\n <Empty>Checking what comes back…</Empty>\n </Section>\n ) : preview?.supported ? (\n <Section title=\"Comes back\">\n <Row label=\"Fields\">\n <span className=\"text-foreground\">{count(preview.fields, \"field\")}</span>\n </Row>\n <Row label=\"Files\">\n <span className=\"text-foreground\">{count(preview.attachments, \"file\")}</span>\n </Row>\n {preview.passkeys === 1 ? (\n <Row label=\"Passkey\" hint=\"Not turned on; the site may not accept it\">\n <span className=\"text-foreground\">1 passkey</span>\n </Row>\n ) : null}\n <Row label=\"Stays off\" hint=\"Turn each back on yourself\">\n <span className=\"text-muted-foreground\">Sharing, browser fill, codes, sandboxes, agents</span>\n </Row>\n {preview.priorWasDisabled ? (\n <Row label=\"Before\">\n <span className=\"text-muted-foreground\">It was already off before it was deleted.</span>\n </Row>\n ) : null}\n </Section>\n ) : preview ? (\n <Section>\n <Empty>{refusalText(preview.reason)}</Empty>\n </Section>\n ) : (\n <Section>\n <Empty>It comes back turned off: sharing, browser fill, codes and sandbox use stay off.</Empty>\n </Section>\n )}\n {error ? (\n <p role=\"alert\" className=\"px-1 text-sm text-destructive\">\n {error}\n </p>\n ) : null}\n </Panel>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Button, Field, SearchField } from \"@ai-matrx/design-system/controls\";\nimport { COMMON_DEFINITION_KEYS, FAMILY_LABELS, inferFromUrl, type VaultDefinition } from \"./definitions\";\nimport { ChevronLeftGlyph, definitionGlyph, GlobeGlyph } from \"./glyphs\";\n\nexport interface NewItemFlowProps {\n definitions: readonly VaultDefinition[];\n /** The address typed or pasted so far. It lives in the page address, so it survives every step. */\n url: string;\n onUrl: (url: string) => void;\n /** A type was chosen (by hand or from the address). The address goes with it, recognised or not. */\n onChoose: (definitionKey: string, name: string, url: string) => void;\n onCancel: () => void;\n}\n\n/** Step one of \"New item\": paste an address and we work out what it is, or pick the kind by hand. */\nexport function NewItemFlow({ definitions, url, onUrl, onChoose, onCancel }: NewItemFlowProps) {\n const [search, setSearch] = useState(\"\");\n const guess = useMemo(() => inferFromUrl(url, definitions), [url, definitions]);\n const common = COMMON_DEFINITION_KEYS.map((k) => definitions.find((d) => d.key === k)).filter((d): d is VaultDefinition => d !== undefined);\n const matches = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return [];\n return definitions.filter((d) => `${d.label} ${d.key} ${d.providerKey ?? \"\"} ${FAMILY_LABELS[d.family] ?? \"\"}`.toLowerCase().includes(q)).slice(0, 60);\n }, [definitions, search]);\n\n const login = guess?.definitionKey ? definitions.find((d) => d.key === guess.definitionKey) : undefined;\n const alternatives = (guess?.alternatives ?? []).map((k) => definitions.find((d) => d.key === k)).filter((d): d is VaultDefinition => d !== undefined).slice(0, 4);\n // Whatever is chosen, the address typed so far goes with it — recognised or not.\n const use = (d: VaultDefinition) => onChoose(d.key, guess?.name ?? \"\", guess?.url ?? url.trim());\n const shown = search.trim() ? matches : common;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <header className=\"flex min-h-14 items-center gap-2 border-b border-border px-3 sm:px-5\">\n <Button variant=\"quiet\" icon={<ChevronLeftGlyph />} aria-label=\"Cancel\" onClick={onCancel} />\n <h2 className=\"text-base font-semibold\">New item</h2>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex w-full max-w-2xl flex-col gap-8 px-4 py-8 sm:px-6 sm:py-12\">\n <div className=\"flex flex-col gap-3\">\n <Field\n hero\n value={url}\n onChange={(e) => onUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && login) use(login);\n }}\n placeholder=\"Paste a website address\"\n aria-label=\"Website address\"\n inputMode=\"url\"\n autoFocus\n icon={<GlobeGlyph />}\n />\n {guess && login ? (\n <div className=\"flex flex-col gap-2 rounded-xl border border-border bg-card p-3\">\n <div className=\"flex items-center gap-3\">\n <span aria-hidden className=\"flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-sm font-semibold\">{guess.name.charAt(0).toUpperCase()}</span>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{guess.name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{guess.url.replace(/^https?:\\/\\//, \"\")}</span>\n </div>\n <Button variant=\"primary\" onClick={() => use(login)}>Save login</Button>\n </div>\n {alternatives.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1.5 pl-12\">\n <span className=\"text-xs text-muted-foreground\">Or</span>\n {alternatives.map((d) => (\n <Button key={d.key} variant=\"outline\" onClick={() => use(d)}>\n {d.label}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n ) : url.trim() ? (\n <p className=\"px-1 text-sm text-muted-foreground\">Not a website address. Pick a type below; it is kept.</p>\n ) : null}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">{search.trim() ? \"Matching types\" : \"Or choose a type\"}</h3>\n </div>\n <ul className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {shown.map((d) => {\n const Icon = definitionGlyph(d.key, d.family);\n return (\n <li key={d.key}>\n <button type=\"button\" onClick={() => use(d)} className={cn(\"flex h-12 w-full items-center gap-3 rounded-xl border border-border bg-card px-3 text-left hover:bg-accent\")}>\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted\">\n <Icon className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{d.label}</span>\n </button>\n </li>\n );\n })}\n </ul>\n {search.trim() && matches.length === 0 ? <p className=\"px-1 text-sm text-muted-foreground\">No type matches.</p> : null}\n <SearchField value={search} onChange={(e) => setSearch(e.target.value)} placeholder={`Search all ${definitions.length} types`} aria-label=\"Search types\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * SEND BY SECURE LINK (`?panel=send`) — the sender's half, for someone with no account (the\n * accountant, the contractor). Ported from the web app's `features/sharing/secure/SecureLinkPanel`.\n *\n * The recipient gets a single-use link on one channel and a code on the other; it opens once, then\n * what it carried is wiped (aidream `services/secure_delivery/FEATURE.md`). The recipient page is the\n * web app's `/secure/<token>`; the server builds and sends that link itself.\n *\n * WHAT THIS PANEL NEVER HOLDS: a protected value or the link. It asks the server which protected\n * fields may go, sends names and addresses, and shows the receipt the server writes. Sending a\n * password is a reveal, so it runs through `useConfirmed()` (a fresh sign-in when the server asks).\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Badge, Button, Field, RegionSkeleton, SegmentedControl, Textarea } from \"@ai-matrx/design-system/controls\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { ClockGlyph, LockGlyph, ShareGlyph } from \"../glyphs\";\nimport { Empty, formatDate, Panel, Row, Section } from \"../ui\";\nimport { isEmail } from \"./logic\";\nimport { AccessLine, message, StatusLine, useAction } from \"./parts\";\nimport type { SecureChannel, SecureLinkOptions, SentSecureLink } from \"./port\";\nimport { carriedWords, channelPlan, lifetimeWords, NOTE_MAX, planWords, recipientOf, remedyOf, sortSent, STATUS_TONE, statusWord } from \"./secure-link-logic\";\n\n/** Export name for the lead's wiring: `panel=send` renders this. */\nexport const SECURE_LINK_PANEL = \"send\";\n\nexport function SecureLinkPanel({ item, port, onClose }: ItemPanelProps) {\n const sharing = port.sharing;\n const { busy, error, notice, run, setNotice } = useAction();\n const [remedy, setRemedy] = useState<string | null>(null);\n const [options, setOptions] = useState<SecureLinkOptions | null>(null);\n const [optionsError, setOptionsError] = useState<string | null>(null);\n const [sent, setSent] = useState<SentSecureLink[] | null>(null);\n const [sentError, setSentError] = useState<string | null>(null);\n const [nonce, setNonce] = useState(0);\n\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [linkBy, setLinkBy] = useState<SecureChannel>(\"email\");\n const [fields, setFields] = useState<string[]>([]);\n const [note, setNote] = useState(\"\");\n const [sameChannelSent, setSameChannelSent] = useState(false);\n\n useEffect(() => {\n let live = true;\n setOptionsError(null);\n sharing.secureLinkOptions(item).then(\n (o) => live && setOptions(o),\n (e: unknown) => {\n if (!live) return;\n setOptionsError(message(e, \"What can be sent could not be read.\"));\n setRemedy(remedyOf(e));\n },\n );\n return () => {\n live = false;\n };\n }, [sharing, item]);\n\n useEffect(() => {\n const list = sharing.sentSecureLinks;\n if (!list) return;\n let live = true;\n setSentError(null);\n list(item).then(\n (rows) => live && setSent(sortSent(rows)),\n (e: unknown) => live && setSentError(message(e, \"Sent links could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [sharing, item, nonce]);\n\n // Pre-fill the mobile when the email is an existing user whose phone agreed to texts. Never over\n // a number the sender typed; a pre-filled number clears when the email stops matching, so the\n // both-by-email warning stays honest.\n const [phoneTyped, setPhoneTyped] = useState(false);\n const prefilled = useRef(false);\n useEffect(() => {\n const lookup = sharing.phoneOnFile;\n if (!lookup || phoneTyped) return;\n const clear = () => {\n if (prefilled.current) {\n setPhone(\"\");\n prefilled.current = false;\n }\n };\n if (!isEmail(email)) {\n clear();\n return;\n }\n let live = true;\n const timer = setTimeout(() => {\n lookup(email).then(\n (onFile) => {\n if (!live) return;\n if (onFile) {\n setPhone(onFile);\n prefilled.current = true;\n } else clear();\n },\n () => live && clear(),\n );\n }, 400);\n return () => {\n live = false;\n clearTimeout(timer);\n };\n }, [sharing, email, phoneTyped]);\n\n const plan = channelPlan(email, phone, linkBy);\n const canSend = isEmail(email) && options !== null && busy === null;\n\n const send = async () => {\n if (!canSend) return;\n setRemedy(null);\n setSameChannelSent(false);\n let refusal: unknown = null;\n const receipt = await run(\"send\", async () => {\n try {\n return await sharing.sendSecureLink(item, { email, phone: phone || null, name: name || null, fieldKeys: fields, linkBy, note: note || null });\n } catch (e) {\n refusal = e;\n throw e;\n }\n });\n if (!receipt) {\n setRemedy(remedyOf(refusal));\n return;\n }\n setNotice(receipt.sentence);\n setSameChannelSent(receipt.sameChannel);\n setEmail(\"\");\n setPhone(\"\");\n setName(\"\");\n setNote(\"\");\n setFields([]);\n setPhoneTyped(false);\n prefilled.current = false;\n setNonce((n) => n + 1);\n };\n\n const turnOff = async (row: SentSecureLink) => {\n const ok = await confirm({\n title: \"Turn off this link?\",\n description: `The link to ${recipientOf(row)} stops working at once and what it carries is deleted. They will need a new one.`,\n confirmLabel: \"Turn off\",\n variant: \"destructive\",\n });\n if (!ok) return;\n setRemedy(null);\n const sentence = await run(row.id, () => sharing.revokeSecureLink(item, row.id));\n if (sentence) setNotice(sentence);\n setNonce((n) => n + 1);\n };\n\n const toggle = (key: string, on: boolean) => setFields((cur) => (on ? [...cur.filter((k) => k !== key), key] : cur.filter((k) => k !== key)));\n\n return (\n <Panel\n title=\"Send securely\"\n size=\"md\"\n onClose={onClose}\n footer={\n <div className=\"flex w-full flex-wrap items-center gap-2\">\n <div className=\"w-full sm:w-auto sm:min-w-0 sm:flex-1\"><StatusLine error={error} notice={notice} /></div>\n {sameChannelSent && !error ? <Badge tone=\"warning\">Both by email</Badge> : null}\n <Button variant=\"quiet\" className=\"ml-auto\" onClick={onClose}>\n Close\n </Button>\n <Button variant=\"primary\" disabled={!canSend} onClick={() => void send()}>\n {busy === \"send\" ? \"Sending…\" : \"Send link\"}\n </Button>\n </div>\n }\n >\n {remedy ? <p className=\"px-1 text-xs text-muted-foreground\">{remedy}</p> : null}\n\n <Section title=\"Recipient\">\n <Row label=\"Email\">\n <Field type=\"email\" autoComplete=\"off\" placeholder=\"name@example.com\" aria-label=\"Their email\" value={email} onChange={(e) => setEmail(e.target.value)} className=\"w-full\" />\n </Row>\n <Row label=\"Mobile\" hint=\"For the code\">\n <Field\n type=\"tel\"\n autoComplete=\"off\"\n placeholder=\"+1 310 555 0123\"\n aria-label=\"Their mobile, for the code\"\n value={phone}\n onChange={(e) => {\n setPhone(e.target.value);\n setPhoneTyped(true);\n prefilled.current = false;\n }}\n className=\"w-full\"\n />\n </Row>\n <Row label=\"Name\" hint=\"Optional\">\n <Field autoComplete=\"off\" placeholder=\"Their name\" aria-label=\"Their name\" value={name} onChange={(e) => setName(e.target.value)} className=\"w-full\" />\n </Row>\n {plan && !plan.same ? (\n <Row label=\"Link by\">\n <SegmentedControl\n aria-label=\"Send the link by\"\n value={linkBy}\n onValueChange={setLinkBy}\n data={[\n { value: \"email\", label: \"Email\" },\n { value: \"sms\", label: \"Text\" },\n ]}\n />\n </Row>\n ) : null}\n {email.trim() ? (\n <Row label=\"Delivery\">\n <span className={plan?.same ? \"text-warning\" : \"text-foreground\"}>{planWords(plan)}</span>\n </Row>\n ) : null}\n </Section>\n\n <Section title=\"Include\">\n {optionsError ? (\n <Empty>\n <span className=\"text-destructive\">{optionsError}</span>\n </Empty>\n ) : !options ? (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading what can be sent\" className=\"px-3 sm:px-4\" />\n ) : options.fields.length === 0 ? (\n <Empty>Name and details only</Empty>\n ) : (\n options.fields.map((f) => (\n <label key={f.key} className=\"flex min-h-11 items-center gap-3 px-3 py-1 sm:px-4\" data-clickable={f.available ? \"\" : undefined}>\n <Checkbox checked={fields.includes(f.key)} disabled={!f.available} onCheckedChange={(v) => toggle(f.key, v === true)} aria-label={f.label} />\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\">{f.label}</span>\n {!f.available && f.reason ? (\n <span className=\"min-w-0 max-w-[55%] truncate text-xs text-muted-foreground\" title={f.reason}>\n {f.reason}\n </span>\n ) : null}\n </label>\n ))\n )}\n </Section>\n\n <Section title=\"Message\">\n <div className=\"px-3 py-1 sm:px-4\">\n <Textarea className=\"w-full\" rows={2} maxLength={NOTE_MAX} placeholder=\"Shown once, with it\" aria-label=\"Message\" value={note} onChange={(e) => setNote(e.target.value)} />\n </div>\n </Section>\n\n {options ? (\n <Section title=\"Link\">\n <Row label=\"Opens\">\n <span className=\"text-foreground\">Once</span>\n </Row>\n <Row label=\"Link expires\">\n <span className=\"text-foreground\">After {lifetimeWords(options.linkMinutes)}</span>\n </Row>\n <Row label=\"Code expires\">\n <span className=\"text-foreground\">After {lifetimeWords(options.codeMinutes)}</span>\n </Row>\n </Section>\n ) : null}\n\n {sharing.sentSecureLinks ? (\n <Section title=\"Sent links\">\n {sentError ? (\n <Empty>\n <span className=\"text-destructive\">{sentError}</span>\n </Empty>\n ) : !sent ? (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading sent links\" className=\"px-3 sm:px-4\" />\n ) : sent.length === 0 ? (\n <Empty>None yet</Empty>\n ) : (\n sent.map((row) => (\n <AccessLine key={row.id} glyph={row.status === \"pending\" ? ClockGlyph : row.fieldKeys.length ? LockGlyph : ShareGlyph} who={recipientOf(row)} meta={sentMeta(row, options)}>\n <Badge tone={STATUS_TONE[row.status] ?? \"neutral\"}>{statusWord(row.status)}</Badge>\n {row.status === \"pending\" ? (\n <Button variant=\"quiet\" disabled={busy !== null} onClick={() => void turnOff(row)}>\n Turn off\n </Button>\n ) : null}\n </AccessLine>\n ))\n )}\n </Section>\n ) : null}\n </Panel>\n );\n}\n\n/** \"Until Oct 17 · Password\", \"Oct 16 · Password\". */\nfunction sentMeta(row: SentSecureLink, options: SecureLinkOptions | null): string {\n const when = row.status === \"pending\" ? `Until ${formatDate(row.expiresAt, true)}` : row.status === \"viewed\" && row.viewedAt ? formatDate(row.viewedAt, true) : formatDate(row.createdAt);\n const carried = row.fieldKeys.length ? carriedWords(row.fieldKeys, options?.fields ?? []) : \"\";\n return [when, carried].filter(Boolean).join(\" · \");\n}\n","/** Send by secure link — the pure rules: channel plan, status words, refusal remedy, row shapes. */\nimport { formatDurationMinutes } from \"@ai-matrx/kit/format\";\nimport { fieldNames } from \"./logic\";\nimport type { SecureChannel, SecureLinkField, SentSecureLink } from \"./port\";\n\n/** What the vault calls a credential item on the secure-delivery API. */\nexport const SECURE_RESOURCE_TYPE = \"credential_item\";\n\n/** The server's note limit (`CreateBody.note`). */\nexport const NOTE_MAX = 1000;\n\nconst CHANNEL_WORD: Record<SecureChannel, string> = { email: \"email\", sms: \"text\" };\n\n/**\n * How the link and the code will travel, mirroring the server's `plan_channels`: with both an email\n * and a mobile they go on different channels; email alone carries both; a phone alone is refused.\n */\nexport function channelPlan(email: string, phone: string, linkBy: SecureChannel): { link: SecureChannel; code: SecureChannel; same: boolean } | null {\n const e = email.trim() !== \"\";\n const p = phone.trim() !== \"\";\n if (e && p) return { link: linkBy, code: linkBy === \"email\" ? \"sms\" : \"email\", same: false };\n if (e) return { link: \"email\", code: \"email\", same: true };\n return null;\n}\n\n/** The plan in ≤ 60 characters, for the row under the recipient. */\nexport function planWords(plan: { link: SecureChannel; code: SecureChannel; same: boolean } | null): string {\n if (!plan) return \"Add their email\";\n if (plan.same) return \"Link and code both go by email\";\n return `Link by ${CHANNEL_WORD[plan.link]}, code by ${CHANNEL_WORD[plan.code]}`;\n}\n\nexport const STATUS_WORDS: Record<string, string> = {\n pending: \"Not opened yet\",\n viewed: \"Opened\",\n revoked: \"Turned off\",\n expired: \"Expired\",\n undeliverable: \"Not delivered\",\n locked: \"Locked\",\n};\n\nexport const statusWord = (status: string): string => STATUS_WORDS[status] ?? status.replace(/[_-]+/g, \" \").replace(/^\\w/, (c) => c.toUpperCase());\n\nexport const STATUS_TONE: Record<string, \"neutral\" | \"success\" | \"warning\" | \"destructive\"> = {\n pending: \"neutral\",\n viewed: \"success\",\n revoked: \"neutral\",\n expired: \"neutral\",\n undeliverable: \"destructive\",\n locked: \"warning\",\n};\n\n/** Who a sent link went to, as people read it. */\nexport const recipientOf = (row: Pick<SentSecureLink, \"name\" | \"email\" | \"phone\">): string => row.name?.trim() || row.email || row.phone || \"Someone\";\n\n/** The field keys a sent link carried, by the labels the options gave (else humanized keys). */\nexport function carriedWords(keys: readonly string[], fields: readonly Pick<SecureLinkField, \"key\" | \"label\">[]): string {\n const known = new Map(fields.map((f) => [f.key, f.label]));\n return keys.map((k) => known.get(k) ?? fieldNames([k])).join(\", \");\n}\n\n/** \"1 day\", \"12 hours\". */\nexport const lifetimeWords = (minutes: number): string => formatDurationMinutes(minutes, { style: \"long\" });\n\n/** The remedy the server attached to a refusal (`detail.remedy`), if any. */\nexport function remedyOf(e: unknown): string | null {\n const body = (e as { serverDetail?: unknown } | null)?.serverDetail;\n if (!body || typeof body !== \"object\") return null;\n const inner = (body as { detail?: unknown }).detail;\n const src = inner && typeof inner === \"object\" ? inner : body;\n const r = (src as { remedy?: unknown }).remedy;\n return typeof r === \"string\" && r.trim() ? r : null;\n}\n\nconst str = (v: unknown): string | null => (typeof v === \"string\" && v !== \"\" ? v : null);\n\n/** One row of `platform.secure_delivery_sent` in the screens' shape; null for anything unreadable. */\nexport function sentRowOf(r: unknown): SentSecureLink | null {\n if (!r || typeof r !== \"object\") return null;\n const w = r as Record<string, unknown>;\n const id = str(w[\"id\"]);\n if (!id) return null;\n return {\n id,\n name: str(w[\"recipient_name\"]),\n email: str(w[\"recipient_email\"]),\n phone: str(w[\"recipient_phone\"]),\n linkBy: str(w[\"link_channel\"]) ?? \"email\",\n codeBy: str(w[\"code_channel\"]) ?? \"email\",\n fieldKeys: Array.isArray(w[\"field_keys\"]) ? (w[\"field_keys\"] as unknown[]).filter((k): k is string => typeof k === \"string\") : [],\n status: str(w[\"status\"]) ?? \"pending\",\n createdAt: str(w[\"created_at\"]) ?? \"\",\n expiresAt: str(w[\"expires_at\"]) ?? \"\",\n viewedAt: str(w[\"viewed_at\"]),\n };\n}\n\n/** Newest first; pending links lead because they are the ones a person can still act on. */\nexport function sortSent(rows: readonly SentSecureLink[]): SentSecureLink[] {\n return [...rows].sort((a, b) => Number(b.status === \"pending\") - Number(a.status === \"pending\") || b.createdAt.localeCompare(a.createdAt));\n}\n","/**\n * Browsers that can fill saved passwords (`?panel=devices`), and the approval of a new one\n * (`?panel=approve:<key>`). Every extension install (or the macOS password app) that may fill has its\n * own key; turned-off ones stay listed so the person sees what could fill and when it stopped.\n */\nimport { useCallback, useEffect, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Button, RegionSkeleton } from \"@ai-matrx/design-system/controls\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { CheckGlyph, ExternalGlyph, FingerprintGlyph, PowerGlyph } from \"../glyphs\";\nimport { useNotify } from \"../notice\";\nimport { Empty, Panel, Row, Section, formatDate } from \"../ui\";\nimport { approvalKeyOf, approvalLabelOf, deviceKindOf, isRevoked, passkeyDomainUrl, shortFingerprint } from \"./logic\";\nimport type { FillDevice, FillDeviceKind, FillStepUpMethods } from \"./port\";\n\nconst messageOf = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\n\nfunction ErrorLine({ text }: { text: string | null }) {\n return text ? <p role=\"alert\" className=\"px-1 text-sm text-destructive\">{text}</p> : null;\n}\n\n/** Every browser allowed to fill, when it was added, when it last filled, and Revoke. */\nexport function DevicesPanel({ port, onClose }: VaultPanelProps) {\n const confirmed = useConfirmed();\n const notify = useNotify();\n const [devices, setDevices] = useState<FillDevice[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busyId, setBusyId] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setError(null);\n try {\n setDevices(await port.devices.list());\n } catch (e) {\n setError(messageOf(e, \"Your browsers could not be read.\"));\n }\n }, [port]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const revoke = async (device: FillDevice) => {\n const yes = await confirm({\n title: `Revoke ${device.label}?`,\n description: \"It stops filling now and the extension there signs out. It fills again only after you sign in there and confirm.\",\n confirmLabel: \"Revoke\",\n variant: \"destructive\",\n });\n if (!yes) return;\n setBusyId(device.id);\n setError(null);\n try {\n const updated = await confirmed(() => port.devices.revoke(device.id));\n setDevices((current) => (current ?? []).map((d) => (d.id === updated.id ? updated : d)));\n notify(`${device.label} revoked`);\n } catch (e) {\n if (!wasCancelled(e)) setError(messageOf(e, \"That browser could not be revoked.\"));\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <Panel title=\"Browsers that can fill\" onClose={onClose} size=\"md\">\n <ErrorLine text={error} />\n <Section>\n {devices === null ? (\n error ? (\n <Empty>\n <Button variant=\"outline\" onClick={() => void load()}>Try again</Button>\n </Empty>\n ) : (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading your browsers\" className=\"px-3 sm:px-4\" />\n )\n ) : devices.length === 0 ? (\n <Empty>No browser can fill yet. Turn it on in the extension.</Empty>\n ) : (\n devices.map((device) => {\n const off = isRevoked(device);\n return (\n <Row\n key={device.id}\n label={off ? \"Turned off\" : \"Can fill\"}\n hint={off ? formatDate(device.revokedAt) : undefined}\n actions={\n off ? null : (\n <Button variant=\"outline\" icon={<PowerGlyph />} disabled={busyId !== null} onClick={() => void revoke(device)}>\n Revoke\n </Button>\n )\n }\n >\n <span className=\"flex min-w-0 flex-col\">\n <span className={off ? \"truncate text-muted-foreground\" : \"truncate text-foreground\"}>{device.label}</span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {device.lastUsedAt ? `Last used ${formatDate(device.lastUsedAt, true)}` : \"Never used\"}\n {device.addedAt ? ` · added ${formatDate(device.addedAt)}` : \"\"}\n </span>\n </span>\n </Row>\n );\n })\n )}\n </Section>\n </Panel>\n );\n}\n\n/** What the approval link names, read from the address (`panel=approve:<key>&label=…&kind=mac`). */\nexport function approvalFromParams(arg: string | null, params: URLSearchParams): { approvalKey: string; label: string | null; kind: FillDeviceKind } {\n return { approvalKey: arg ?? params.get(\"key\") ?? \"\", label: approvalLabelOf(params.get(\"label\")), kind: deviceKindOf(params.get(\"kind\")) };\n}\n\n/**\n * A browser (or the Mac app) asks to fill: show what is asking and the code it shows, then approve\n * with the step-up the server requires (a passkey here; a password is typed in the extension), or refuse.\n */\nexport function ApprovePanel({ port, host, onClose, approvalKey, label, kind = \"browser\" }: VaultPanelProps & { approvalKey: string; label: string | null; kind?: FillDeviceKind }) {\n const notify = useNotify();\n const key = approvalKeyOf(approvalKey);\n const name = approvalLabelOf(label);\n const isMac = kind === \"mac\";\n const asker = isMac ? \"AI Matrx Mac app\" : \"AI Matrx extension\";\n const where = isMac ? \"the Mac app\" : \"the extension\";\n const passkeys = port.devices.passkeys;\n const here = passkeys?.available() ?? false;\n\n const [methods, setMethods] = useState<FillStepUpMethods | null>(null);\n const [busy, setBusy] = useState<\"approve\" | \"add\" | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [approvedUntil, setApprovedUntil] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setError(null);\n try {\n setMethods(await port.devices.stepUpMethods());\n } catch (e) {\n setError(messageOf(e, \"Your account could not be checked.\"));\n }\n }, [port]);\n\n useEffect(() => {\n // Off the passkey domain no ceremony can run, so there is nothing to check.\n if (key && here) void load();\n }, [key, here, load]);\n\n const approve = async () => {\n if (!key || !passkeys) return;\n setBusy(\"approve\");\n setError(null);\n try {\n const { expiresAt } = await passkeys.approve({ keyThumbprint: key, label: name, kind });\n setApprovedUntil(expiresAt);\n } catch (e) {\n setError(messageOf(e, \"It was not approved. Try again.\"));\n } finally {\n setBusy(null);\n }\n };\n\n const addPasskey = async () => {\n if (!passkeys) return;\n setBusy(\"add\");\n setError(null);\n try {\n await passkeys.add();\n notify(\"Passkey added\");\n await load();\n } catch (e) {\n setError(messageOf(e, \"A passkey could not be added.\"));\n } finally {\n setBusy(null);\n }\n };\n\n const refuse = () => {\n if (!approvedUntil) notify(\"Not approved\", \"info\");\n onClose();\n };\n\n const openOnDomain = () => {\n if (!passkeys || typeof window === \"undefined\") return;\n const url = passkeyDomainUrl(window.location.pathname, window.location.search, passkeys.rpId);\n if (host.openUrl) host.openUrl(url);\n else window.location.assign(url);\n };\n\n const canApprove = Boolean(key && passkeys && here && methods?.passkey && !approvedUntil);\n const title = isMac ? \"Approve this Mac\" : name ? `Approve ${name}` : \"Approve this browser\";\n\n const footer = approvedUntil ? (\n <Button variant=\"primary\" onClick={onClose}>Done</Button>\n ) : (\n <>\n <Button variant=\"quiet\" disabled={busy !== null} onClick={refuse}>{key ? \"Refuse\" : \"Close\"}</Button>\n {canApprove ? (\n <Button variant=\"primary\" icon={<FingerprintGlyph />} disabled={busy !== null} onClick={() => void approve()}>\n {busy === \"approve\" ? \"Approving…\" : \"Approve with passkey\"}\n </Button>\n ) : null}\n </>\n );\n\n return (\n <Panel title={title} onClose={refuse} size=\"sm\" footer={footer}>\n {!key ? (\n <Section>\n <Empty>This link names no key. Start again from {where}.</Empty>\n </Section>\n ) : (\n <>\n <Section title=\"What is asking\">\n <Row label=\"Asking\" hint=\"Approve only if you just asked\">{asker}</Row>\n {name ? <Row label=\"Name\"><span className=\"block truncate\">{name}</span></Row> : null}\n <Row label=\"Code\" hint={`Must match ${where}`}>\n <span className=\"font-mono tracking-wider text-foreground\">{shortFingerprint(key)}</span>\n </Row>\n </Section>\n <ErrorLine text={error} />\n <Section title=\"Confirm it’s you\">\n {approvedUntil ? (\n <Row label=\"Approved\" actions={<CheckGlyph className=\"size-4 text-primary\" />}>\n <span className=\"text-foreground\">Return to {where} by {formatDate(approvedUntil, true)}.</span>\n </Row>\n ) : !passkeys ? (\n <Empty>Approve with your password in {where}.</Empty>\n ) : !here ? (\n <Row\n label=\"Passkey\"\n hint={`Passkeys work only on ${passkeys.rpId}`}\n actions={<Button variant=\"outline\" icon={<ExternalGlyph />} onClick={openOnDomain}>Open there</Button>}\n >\n <span className=\"text-muted-foreground\">Not on this page</span>\n </Row>\n ) : methods === null ? (\n error ? (\n <Empty>\n <Button variant=\"outline\" onClick={() => void load()}>Try again</Button>\n </Empty>\n ) : (\n <RegionSkeleton shape=\"rows\" count={1} aria-label=\"Checking your account\" className=\"px-3 sm:px-4\" />\n )\n ) : !methods.passkey ? (\n <Row\n label=\"Passkey\"\n hint={methods.password ? `Or type your password in ${where}` : \"Add one to approve\"}\n actions={\n <Button variant=\"primary\" icon={<FingerprintGlyph />} disabled={busy !== null} onClick={() => void addPasskey()}>\n {busy === \"add\" ? \"Adding…\" : \"Add passkey\"}\n </Button>\n }\n >\n <span className=\"text-muted-foreground\">{methods.password ? \"None yet\" : \"No password or passkey\"}</span>\n </Row>\n ) : (\n <Row label=\"Passkey\" hint=\"Your device asks for it next\">\n <span className=\"text-foreground\">Ready</span>\n </Row>\n )}\n </Section>\n </>\n )}\n </Panel>\n );\n}\n","/** Pure pieces of the devices area: no React, no network, no browser globals (tested). */\nimport type { FillDevice, FillDeviceKind } from \"./port\";\n\n/** The passkey relying party. A passkey ceremony only works on this domain and its subdomains. */\nexport const PASSKEY_RP_ID = \"aimatrx.com\";\n\nconst THUMBPRINT = /^[0-9a-f]{64}$/;\n\n/** A key from an approval link, normalised; null when it is not a thumbprint. */\nexport function approvalKeyOf(raw: string | null | undefined): string | null {\n const key = (raw ?? \"\").trim().toLowerCase();\n return THUMBPRINT.test(key) ? key : null;\n}\n\n/** The label the link carried, capped like the server's column. */\nexport function approvalLabelOf(raw: string | null | undefined): string | null {\n const label = (raw ?? \"\").trim().slice(0, 200);\n return label || null;\n}\n\n/** `kind=mac` is the macOS password app; anything else reads as a browser. */\nexport function deviceKindOf(raw: string | null | undefined): FillDeviceKind {\n return raw === \"mac\" ? \"mac\" : \"browser\";\n}\n\n/** First 16 hex characters in groups of four — the extension and Mac app show the same. */\nexport function shortFingerprint(thumbprint: string): string {\n return (thumbprint.slice(0, 16).match(/.{1,4}/g) ?? []).join(\" \").toUpperCase();\n}\n\n/** True when a passkey ceremony can run on a page at this host. */\nexport function passkeysWorkOn(hostname: string, hasWebAuthn: boolean, rpId = PASSKEY_RP_ID): boolean {\n return hasWebAuthn && (hostname === rpId || hostname.endsWith(`.${rpId}`));\n}\n\n/** The same page on the passkey domain, for a page opened anywhere else. */\nexport function passkeyDomainUrl(pathname: string, search: string, rpId = PASSKEY_RP_ID): string {\n return `https://www.${rpId}${pathname}${search}`;\n}\n\nexport function fromB64url(value: string): ArrayBuffer {\n const b64 = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(b64 + \"=\".repeat((4 - (b64.length % 4)) % 4));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport function toB64url(buffer: ArrayBuffer | null | undefined): string | undefined {\n if (!buffer) return undefined;\n let binary = \"\";\n for (const b of new Uint8Array(buffer)) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** The auth server's request options as JSON (base64url strings where WebAuthn wants bytes). */\nexport interface RequestOptionsJSON {\n challenge: string;\n rpId?: string;\n timeout?: number;\n userVerification?: UserVerificationRequirement;\n allowCredentials?: { id: string; type: \"public-key\"; transports?: string[] }[];\n}\n\nexport function requestOptions(json: RequestOptionsJSON): PublicKeyCredentialRequestOptions {\n const out: PublicKeyCredentialRequestOptions = {\n challenge: fromB64url(json.challenge),\n userVerification: json.userVerification ?? \"required\",\n };\n if (json.rpId !== undefined) out.rpId = json.rpId;\n if (json.timeout !== undefined) out.timeout = json.timeout;\n if (json.allowCredentials) {\n out.allowCredentials = json.allowCredentials.map((c) => {\n const d: PublicKeyCredentialDescriptor = { id: fromB64url(c.id), type: c.type };\n if (c.transports) d.transports = c.transports as AuthenticatorTransport[];\n return d;\n });\n }\n return out;\n}\n\n/** The pieces of a signed assertion the server's verifier reads. */\nexport interface AssertionLike {\n id: string;\n rawId: ArrayBuffer;\n type: string;\n response: { clientDataJSON: ArrayBuffer; authenticatorData: ArrayBuffer; signature: ArrayBuffer; userHandle: ArrayBuffer | null };\n authenticatorAttachment?: string | null;\n getClientExtensionResults(): unknown;\n}\n\nexport function serializeAssertion(credential: AssertionLike): Record<string, unknown> {\n const r = credential.response;\n return {\n id: credential.id,\n rawId: toB64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: toB64url(r.clientDataJSON),\n authenticatorData: toB64url(r.authenticatorData),\n signature: toB64url(r.signature),\n userHandle: toB64url(r.userHandle),\n },\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: credential.authenticatorAttachment ?? undefined,\n };\n}\n\n/** The browser's WebAuthn refusal, in plain words. */\nexport function passkeyFailure(name: string): string {\n return name === \"NotAllowedError\" ? \"The passkey prompt closed early. Try again.\" : \"Your passkey could not be used here. Try again.\";\n}\n\n/** The auth server's add-a-passkey refusal, in plain words. */\nexport function addPasskeyFailure(message: string | undefined): string {\n const m = (message ?? \"\").toLowerCase();\n return m.includes(\"abort\") || m.includes(\"notallowed\") ? \"The passkey prompt closed early. Try again.\" : \"A passkey could not be added now. Try again.\";\n}\n\nexport const isRevoked = (d: Pick<FillDevice, \"revokedAt\">): boolean => d.revokedAt !== null;\n\n","import { useEffect, useMemo, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Badge, Button, Select, type BadgeTone, type SelectOption } from \"@ai-matrx/design-system/controls\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { ImportGlyph } from \"../glyphs\";\nimport { ErrorLine, Windowed } from \"../io/lines\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport type { NativeImportLimits } from \"./api\";\nimport { TERMINAL_PHASES, accounted, dispositionLabel, plural } from \"./logic\";\nimport type { NativeImportBridge, NativeImportDisposition } from \"./types\";\nimport { useNativeImport } from \"./use-native-import\";\n\nexport interface NativeImportPanelProps extends VaultPanelProps {\n /** The desktop shell's importer. Without it the panel says so; a host without one never opens it. */\n bridge: NativeImportBridge | undefined;\n /** The generated client, to read the server's passkey-import limits. Optional: without it no limit is shown. */\n /** The server's limits for an organization (`port.native.limits`). */\n readLimits?: ((organizationId: string) => Promise<NativeImportLimits>) | undefined;\n /** The organization to preselect (the one active on this device). */\n activeOrganizationId?: string | null | undefined;\n}\n\nconst TONE: Record<NativeImportDisposition, BadgeTone> = {\n eligible: \"success\",\n committed: \"success\",\n unsupported: \"neutral\",\n not_attempted: \"neutral\",\n failed: \"destructive\",\n uncertain: \"warning\",\n};\n\n/** Passkeys from a file, imported by the desktop app: choose an organization, review every passkey, import, recover, cancel. */\nexport function NativeImportPanel({ bridge, readLimits, activeOrganizationId, organizations, onClose, onChanged }: NativeImportPanelProps) {\n if (!bridge) {\n return (\n <Panel title=\"Import passkeys\" size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Close</Button>}>\n <Section>\n <Empty>Passkey import needs the desktop app.</Empty>\n </Section>\n </Panel>\n );\n }\n return <Importer bridge={bridge} readLimits={readLimits} activeOrganizationId={activeOrganizationId} organizations={organizations} onClose={onClose} onChanged={onChanged} />;\n}\n\nfunction Importer({ bridge, readLimits, activeOrganizationId, organizations, onClose, onChanged }: Pick<NativeImportPanelProps, \"readLimits\" | \"activeOrganizationId\" | \"organizations\" | \"onClose\" | \"onChanged\"> & { bridge: NativeImportBridge }) {\n const options = useMemo<SelectOption[]>(() => organizations.map((o) => ({ value: o.id, label: o.name })), [organizations]);\n const [organizationId, setOrganizationId] = useState<string>(() => (organizations.some((o) => o.id === activeOrganizationId) ? (activeOrganizationId as string) : (organizations[0]?.id ?? \"\")));\n const [limits, setLimits] = useState<NativeImportLimits | null>(null);\n const [limitError, setLimitError] = useState<string | null>(null);\n const flow = useNativeImport(bridge, (id) => organizations.some((o) => o.id === id), onChanged);\n const { screen, busy } = flow;\n const orgName = organizations.find((o) => o.id === organizationId)?.name ?? \"this organization\";\n\n useEffect(() => {\n if (!readLimits || !organizationId) return;\n let live = true;\n setLimits(null);\n setLimitError(null);\n readLimits(organizationId).then(\n (l) => live && setLimits(l),\n (e: unknown) => live && setLimitError(e instanceof Error && e.message ? e.message : \"Passkey import is not available here.\"),\n );\n return () => {\n live = false;\n };\n }, [readLimits, organizationId]);\n\n const status = screen.kind === \"idle\" ? null : screen.status;\n const preview = screen.kind === \"preview\" ? screen.preview : null;\n const active = status !== null && !TERMINAL_PHASES.has(status.phase);\n const ready = preview?.slots.filter((s) => s.disposition === \"eligible\").length ?? 0;\n\n const importNow = async () => {\n const yes = await confirm({ title: `Add ${plural(ready, \"passkey\")} to ${orgName}?`, description: \"Passkeys already there are skipped.\", confirmLabel: \"Import\" });\n if (yes) await flow.confirm();\n };\n\n const footer = preview ? (\n <>\n <Button variant=\"quiet\" disabled={busy} onClick={() => void flow.cancel()}>\n Cancel\n </Button>\n <Button variant=\"primary\" icon={<ImportGlyph className=\"size-4\" />} disabled={busy || ready === 0} onClick={() => void importNow()}>\n Import {ready}\n </Button>\n </>\n ) : status ? (\n active ? (\n <>\n <Button variant=\"outline\" disabled={busy} onClick={() => void flow.refresh()}>\n Refresh\n </Button>\n <Button variant=\"outline\" disabled={busy} onClick={() => void flow.cancel()}>\n Cancel import\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"quiet\" onClick={flow.reset}>\n New file\n </Button>\n <Button variant=\"primary\" onClick={onClose}>\n Done\n </Button>\n </>\n )\n ) : (\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n );\n\n return (\n <Panel title=\"Import passkeys\" size=\"lg\" onClose={onClose} footer={footer}>\n {screen.kind === \"idle\" ? (\n <Section>\n <Row label=\"Save to\">\n <Select value={organizationId} options={options} aria-label=\"Save to\" disabled={busy} onValueChange={setOrganizationId} />\n </Row>\n <Row label=\"File\" hint={limits ? `Up to ${plural(limits.maxItems, \"passkey\")}` : \"A passkey exchange file\"}>\n <Button variant=\"outline\" icon={<ImportGlyph className=\"size-4\" />} disabled={busy || !organizationId || limitError !== null} onClick={() => void flow.begin(organizationId)}>\n {busy ? \"Opening…\" : \"Choose file\"}\n </Button>\n </Row>\n <Row label=\"Interrupted\" hint=\"Finish or clear an earlier import\">\n <Button variant=\"quiet\" disabled={busy} onClick={() => void flow.recover()}>\n Recover\n </Button>\n </Row>\n </Section>\n ) : null}\n\n {preview ? (\n <Section title={`${ready} of ${preview.total} ready`}>\n <Windowed\n items={preview.slots}\n render={(slot) => (\n <Row key={slot.slot_id} label={<Badge tone={TONE[slot.disposition]}>{dispositionLabel(slot.disposition)}</Badge>} hint={undefined}>\n <span className=\"block truncate text-foreground\" title={slot.reason ?? undefined}>\n {slot.title ?? \"Unnamed passkey\"}\n </span>\n </Row>\n )}\n />\n </Section>\n ) : null}\n\n {status && !preview ? (\n <Section title={`${accounted(status)} of ${status.total} done`}>\n <Row label=\"Imported\">\n <span className=\"text-foreground\">{status.committed}</span>\n </Row>\n <Row label=\"Already there\">\n <span className=\"text-foreground\">{status.already_present}</span>\n </Row>\n <Row label=\"Can't import\">\n <span className=\"text-foreground\">{status.unsupported}</span>\n </Row>\n <Row label=\"Failed\">\n <span className={status.failed > 0 ? \"text-destructive\" : \"text-foreground\"}>{status.failed}</span>\n </Row>\n {status.uncertain > 0 ? (\n <Row label=\"Needs recovery\">\n <span className=\"text-foreground\">{status.uncertain}</span>\n </Row>\n ) : null}\n {status.not_attempted > 0 ? (\n <Row label=\"Not tried\">\n <span className=\"text-foreground\">{status.not_attempted}</span>\n </Row>\n ) : null}\n </Section>\n ) : null}\n\n {screen.message ? (\n <p role=\"status\" className=\"px-1 text-sm text-muted-foreground\">\n {screen.message}\n </p>\n ) : null}\n <ErrorLine message={limitError} />\n </Panel>\n );\n}\n","import type { NativeImportBridge, NativeImportDisposition, NativeImportPhase, NativeImportPreview, NativeImportStatus } from \"./types\";\n\nexport const ACTIVE_PHASES: ReadonlySet<NativeImportPhase> = new Set([\"authorizing\", \"importing\"]);\nexport const TERMINAL_PHASES: ReadonlySet<NativeImportPhase> = new Set([\"completed\", \"partial\", \"cancelled\", \"failed\", \"unavailable\"]);\nexport const POLL_DELAY_MS = 1000;\nexport const MAX_POLLS = 30;\n\nexport const isPreview = (v: NativeImportStatus | NativeImportPreview): v is NativeImportPreview => \"preview_digest\" in v;\n\nexport function dispositionLabel(d: NativeImportDisposition): string {\n switch (d) {\n case \"eligible\": return \"Ready\";\n case \"unsupported\": return \"Can't import\";\n case \"committed\": return \"Imported\";\n case \"failed\": return \"Failed\";\n case \"uncertain\": return \"Needs recovery\";\n case \"not_attempted\": return \"Not imported\";\n }\n}\n\nexport const plural = (n: number, one: string): string => `${n} ${one}${n === 1 ? \"\" : \"s\"}`;\n\nexport function terminalMessage(s: NativeImportStatus): string {\n if (s.phase === \"completed\") return `Imported ${plural(s.committed, \"passkey\")}.`;\n if (s.phase === \"partial\") return `${s.committed} imported; ${s.unsupported + s.failed + s.uncertain + s.not_attempted} need attention.`;\n if (s.phase === \"cancelled\") return \"Import cancelled. Nothing else will be imported.\";\n if (s.phase === \"unavailable\") return \"Passkey import is unavailable here.\";\n if (s.phase === \"failed\") return \"The import did not finish. Recover it before using a new file.\";\n return s.message;\n}\n\n/** How many of the file's passkeys have an outcome. */\nexport function accounted(s: NativeImportStatus): number {\n return s.committed + s.already_present + s.unsupported + s.failed + s.uncertain + s.not_attempted;\n}\n\n/** Every page of the file preview, checked for order, digest and duplicates. `current` stops the read when the screen moved on. */\nexport async function loadFullPreview(bridge: NativeImportBridge, operationId: string, current: () => boolean): Promise<NativeImportPreview | null> {\n let offset = 0;\n let full: NativeImportPreview | null = null;\n const seen = new Set<string>();\n for (;;) {\n if (!current()) return null;\n const page = await bridge.request({ action: \"preview\", operation_id: operationId, offset });\n if (!current()) return null;\n if (!isPreview(page)) throw new Error(\"The importer did not return the file preview.\");\n if (page.offset !== offset) throw new Error(\"The importer returned the preview out of order.\");\n if (!full) full = { ...page, slots: [...page.slots] };\n else if (page.operation_id !== full.operation_id || page.preview_digest !== full.preview_digest || page.total !== full.total) throw new Error(\"The importer returned an inconsistent preview.\");\n else full.slots.push(...page.slots);\n for (const slot of page.slots) {\n if (seen.has(slot.slot_id)) throw new Error(\"The importer returned a passkey twice.\");\n seen.add(slot.slot_id);\n }\n if (full.slots.length === full.total) return full;\n if (full.slots.length > full.total) throw new Error(\"The importer returned too many passkeys.\");\n if (page.slots.length === 0) throw new Error(\"The importer returned an incomplete preview.\");\n offset += page.slots.length;\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { ACTIVE_PHASES, MAX_POLLS, POLL_DELAY_MS, TERMINAL_PHASES, isPreview, loadFullPreview, terminalMessage } from \"./logic\";\nimport type { NativeImportBridge, NativeImportPreview, NativeImportStatus } from \"./types\";\n\nexport type NativeScreen =\n | { kind: \"idle\"; message: string | null }\n | { kind: \"status\"; status: NativeImportStatus; message: string | null }\n | { kind: \"preview\"; status: NativeImportStatus; preview: NativeImportPreview; message: string | null };\n\nconst fail = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\nconst RESTART = \"Your account changed. The import was stopped; start it again.\";\n\n/**\n * The importer's state machine: begin → preview → confirm → progress, plus cancel and recover.\n * A generation counter drops every answer that arrives after the screen moved on, so a slow reply\n * can never overwrite a newer one. A preview is never authority to write: confirm re-binds the\n * organization first, and the whole import stops if the host says the account changed.\n */\nexport function useNativeImport(bridge: NativeImportBridge, stillAllowed: (organizationId: string) => boolean, onImported: () => void) {\n const [screen, setScreen] = useState<NativeScreen>({ kind: \"idle\", message: null });\n const [busy, setBusy] = useState(false);\n const generation = useRef(0);\n const mounted = useRef(false);\n const op = useRef<{ id: string; organizationId: string | null } | null>(null);\n const last = useRef<NativeImportStatus | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const polls = useRef(0);\n const refreshRef = useRef<(auto: boolean) => Promise<void>>(async () => undefined);\n\n const current = (g: number) => mounted.current && g === generation.current;\n const stopPolling = () => {\n if (timer.current !== null) clearTimeout(timer.current);\n timer.current = null;\n polls.current = 0;\n };\n const present = (g: number, next: NativeScreen) => {\n if (current(g)) setScreen(next);\n };\n const keepOperation = (g: number, message: string) => {\n if (op.current && last.current) present(g, { kind: \"status\", status: last.current, message });\n else present(g, { kind: \"idle\", message });\n };\n const finishIf = (s: NativeImportStatus) => {\n if (!TERMINAL_PHASES.has(s.phase)) return false;\n op.current = null;\n last.current = null;\n stopPolling();\n if (s.committed > 0) onImported();\n return true;\n };\n const schedulePoll = (id: string) => {\n if (timer.current !== null || op.current?.id !== id) return;\n if (polls.current >= MAX_POLLS) {\n setScreen((s) => (s.kind === \"idle\" ? s : { ...s, message: \"Still running. Refresh to keep checking.\" }));\n return;\n }\n polls.current += 1;\n timer.current = setTimeout(() => {\n timer.current = null;\n if (op.current?.id === id) void refreshRef.current(true);\n }, POLL_DELAY_MS);\n };\n\n const invalidate = (message: string) => {\n generation.current += 1;\n const active = op.current;\n op.current = null;\n last.current = null;\n stopPolling();\n setBusy(false);\n setScreen({ kind: \"idle\", message });\n if (active) void bridge.request({ action: \"cancel\", operation_id: active.id }).catch(() => undefined);\n };\n\n const begin = async (organizationId: string) => {\n const g = ++generation.current;\n stopPolling();\n setBusy(true);\n setScreen({ kind: \"idle\", message: null });\n try {\n const result = await bridge.request({ action: \"begin_file_import\", organization_id: organizationId });\n if (isPreview(result)) throw new Error(\"The importer answered before it opened an import.\");\n if (!current(g)) {\n void bridge.request({ action: \"cancel\", operation_id: result.operation_id }).catch(() => undefined);\n return;\n }\n op.current = { id: result.operation_id, organizationId };\n last.current = result;\n if (result.phase === \"preview\" || result.phase === \"awaiting_confirmation\") {\n const preview = await loadFullPreview(bridge, result.operation_id, () => current(g));\n if (preview) present(g, { kind: \"preview\", status: result, preview, message: null });\n } else {\n present(g, { kind: \"status\", status: result, message: finishIf(result) ? terminalMessage(result) : null });\n if (ACTIVE_PHASES.has(result.phase)) schedulePoll(result.operation_id);\n }\n } catch (e) {\n if (current(g)) {\n if (op.current) keepOperation(g, fail(e, \"The importer could not open.\"));\n else setScreen({ kind: \"idle\", message: fail(e, \"The importer could not open.\") });\n }\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n const refresh = async (auto = false) => {\n const active = op.current;\n if (!active) return;\n if (!auto) stopPolling();\n const g = ++generation.current;\n if (!auto) setBusy(true);\n try {\n const result = await bridge.request({ action: \"status\", operation_id: active.id });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid update.\");\n last.current = result;\n if ((result.phase === \"preview\" || result.phase === \"awaiting_confirmation\") && active.organizationId) {\n const preview = await loadFullPreview(bridge, active.id, () => current(g));\n if (preview) present(g, { kind: \"preview\", status: result, preview, message: null });\n } else {\n const message = active.organizationId ? null : \"An interrupted import was found. Choose the file again before confirming.\";\n const done = finishIf(result);\n present(g, { kind: \"status\", status: result, message: done ? terminalMessage(result) : message });\n }\n if (ACTIVE_PHASES.has(result.phase) && op.current) schedulePoll(active.id);\n } catch (e) {\n keepOperation(g, fail(e, \"Progress could not be read.\"));\n } finally {\n if (!auto && current(g)) setBusy(false);\n }\n };\n refreshRef.current = refresh;\n\n const confirm = async () => {\n if (screen.kind !== \"preview\") return;\n const active = op.current;\n if (!active?.organizationId || active.id !== screen.preview.operation_id) return;\n if (!stillAllowed(active.organizationId)) return invalidate(\"That organization is no longer available. Choose the file again.\");\n const g = ++generation.current;\n stopPolling();\n setBusy(true);\n try {\n const scoped = await bridge.request({ action: \"choose_scope\", operation_id: active.id, organization_id: active.organizationId });\n if (!current(g)) return;\n if (isPreview(scoped)) throw new Error(\"The importer sent an invalid destination.\");\n const result = await bridge.request({ action: \"confirm\", operation_id: active.id, preview_digest: screen.preview.preview_digest });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid result.\");\n last.current = result;\n const done = finishIf(result);\n present(g, { kind: \"status\", status: result, message: done ? terminalMessage(result) : null });\n if (ACTIVE_PHASES.has(result.phase) && op.current) schedulePoll(active.id);\n } catch (e) {\n keepOperation(g, fail(e, \"The import could not be confirmed.\"));\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n const cancel = async () => {\n const active = op.current;\n if (!active) return;\n const g = ++generation.current;\n setBusy(true);\n try {\n const result = await bridge.request({ action: \"cancel\", operation_id: active.id });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid answer.\");\n last.current = result;\n const done = finishIf(result);\n present(g, { kind: \"status\", status: result, message: terminalMessage(result) });\n if (!done && ACTIVE_PHASES.has(result.phase)) schedulePoll(active.id);\n } catch (e) {\n keepOperation(g, fail(e, \"The import could not be cancelled.\"));\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n const recover = async () => {\n const g = ++generation.current;\n stopPolling();\n setBusy(true);\n try {\n const result = await bridge.request({ action: \"recover\" });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid recovery.\");\n last.current = result;\n op.current = TERMINAL_PHASES.has(result.phase) ? null : { id: result.operation_id, organizationId: null };\n present(g, { kind: \"status\", status: result, message: op.current ? \"An interrupted import was found. Choose the file again before confirming.\" : terminalMessage(result) });\n if (op.current && ACTIVE_PHASES.has(result.phase)) schedulePoll(result.operation_id);\n } catch (e) {\n keepOperation(g, fail(e, \"Recovery could not run.\"));\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n /** Back to the start (after a finished import). */\n const reset = () => {\n generation.current += 1;\n stopPolling();\n setBusy(false);\n setScreen({ kind: \"idle\", message: null });\n };\n\n const invalidateRef = useRef(invalidate);\n invalidateRef.current = invalidate;\n useEffect(() => {\n mounted.current = true;\n const off = bridge.subscribe?.(() => {\n if (op.current) invalidateRef.current(RESTART);\n });\n return () => {\n mounted.current = false;\n generation.current += 1;\n stopPolling();\n off?.();\n };\n }, [bridge]);\n\n return { screen, busy, begin, refresh: () => refresh(false), confirm, cancel, recover, reset };\n}\n","/**\n * THE SIDE PANEL'S FIRST SCREEN when the host is beside a tab (`host.page`): the site, the logins\n * the server says may fill it — each one row with one-click Fill, copy username, copy password and\n * the one-time code — \"Save a login\" prefilled with the page, a generator aimed at the page, and\n * the extension's two prompts (turn on filling, save this login). Everything that touches the page\n * is the host's (`host.ts`); this screen only asks.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { VaultDefinition } from \"../definitions\";\nimport { CheckGlyph, ClockGlyph, GlobeGlyph, KeyGlyph, ListGlyph, MoreGlyph, PlusGlyph, RefreshGlyph, ShieldGlyph, UserGlyph, XGlyph } from \"../glyphs\";\nimport { ItemIcon } from \"../ItemIcon\";\nimport { USERNAME_KEYS } from \"../ItemPane\";\nimport { siteOf, type VaultItem } from \"../model\";\nimport { useCopy, useNotify } from \"../notice\";\nimport type { VaultPort } from \"../port\";\nimport { Empty, Section } from \"../ui\";\nimport { CaptureCard } from \"./CaptureCard\";\nimport { FillSetupCard } from \"./FillSetupCard\";\nimport type { CaptureHost, ExtensionFill, ExtensionPage, FillSetupHost, NewPasswordFieldsHost } from \"./host\";\nimport { PageGenerator } from \"./PageGenerator\";\nimport { BLOCK_WORDS, distinguish, FILL_WORDS, isFillablePage, MATCH_ERROR_WORDS, normalizeLoginUrl, pageSite, SIGN_IN_WORDS, type Said } from \"./page-logic\";\n\nexport interface PageViewProps {\n port: VaultPort;\n /** `host.page` — the tab beside the panel. */\n page: ExtensionPage;\n /** `host.fill`. Absent = no Fill buttons. */\n fill?: ExtensionFill | undefined;\n capture?: CaptureHost | undefined;\n fillSetup?: FillSetupHost | undefined;\n newPasswordFields?: NewPasswordFieldsHost | undefined;\n /** The loaded vault (rows read their icon, fields and one-time password from it). */\n items: readonly VaultItem[];\n definitions: readonly VaultDefinition[];\n onOpen: (itemId: string) => void;\n /** \"Save a login\": the new-item flow with this address filled in (origin + path; no query). */\n onNewForPage: (url: string) => void;\n /** \"All items\": the whole vault list. */\n onBrowse?: (() => void) | undefined;\n /** Something changed on the server (a capture saved): reload. */\n onChanged: () => void;\n /** Slot above the site: the vault / view pickers where there is no sidebar. */\n header?: ReactNode;\n}\n\nexport function PageView({ port, page, fill, capture, fillSetup, newPasswordFields, items, definitions, onOpen, onNewForPage, onBrowse, onChanged, header }: PageViewProps) {\n const [running, setRunning] = useState<string | null>(null);\n const [said, setSaid] = useState<Said | null>(null);\n const site = pageSite(page.url);\n const state = page.matchState ?? { status: \"ready\" as const };\n const fillable = new Set(page.fillableItemIds ?? page.matchingItemIds);\n const matches = page.matchingItemIds.map((id) => ({ itemId: id, item: items.find((i) => i.id === id) ?? null }));\n const named = matches.map((m) => ({ itemId: m.itemId, name: m.item?.name ?? \"Saved login\" }));\n const familyOf = (key: string) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n const canSave = isFillablePage(page.url);\n const signIn = page.signIn;\n\n const act = async (itemId: string, run: () => Promise<Said>, failed: Said) => {\n setRunning(itemId);\n setSaid(null);\n try {\n setSaid(await run());\n } catch {\n setSaid(failed);\n } finally {\n setRunning(null);\n }\n };\n\n let body: ReactNode;\n if (!page.url) body = <Empty>No page is open in this tab.</Empty>;\n else if (state.status === \"error\") {\n body = (\n <div className=\"flex items-center gap-2 px-3 py-2 sm:px-4\">\n <span role=\"alert\" className=\"min-w-0 flex-1 text-sm text-muted-foreground\">{MATCH_ERROR_WORDS[state.reason]}</span>\n <Button variant=\"outline\" icon={<RefreshGlyph />} onClick={state.retry}>Retry</Button>\n </div>\n );\n } else if (state.status === \"loading\") {\n body = (\n <div aria-busy=\"true\" aria-label=\"Checking saved logins\" className=\"flex flex-col\">\n {[0, 1].map((n) => (\n <div key={n} className=\"flex h-12 items-center gap-3 px-3\">\n <div className=\"size-8 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-3 w-1/2 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n );\n } else if (matches.length === 0) body = <Empty>No saved login for this site.</Empty>;\n else {\n body = (\n <ul className=\"flex flex-col\">\n {matches.map(({ itemId, item }) => (\n <MatchRow\n key={itemId}\n itemId={itemId}\n item={item}\n tag={distinguish({ itemId, name: item?.name ?? \"Saved login\" }, named)}\n family={item ? familyOf(item.definitionKey) : \"generic\"}\n port={port}\n busy={running !== null}\n running={running === itemId}\n onOpen={onOpen}\n onFill={fill && !page.blocked && fillable.has(itemId) && item?.capabilities.canUse !== false ? () => void act(itemId, async () => FILL_WORDS[await fill(itemId)], FILL_WORDS.unavailable) : null}\n onSignIn={signIn ? () => void act(itemId, async () => SIGN_IN_WORDS[await signIn(itemId)], SIGN_IN_WORDS.unknown) : null}\n />\n ))}\n </ul>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-y-auto bg-background text-foreground\">\n <div className=\"flex flex-col gap-3 px-3 pb-4 pt-3\">\n {header}\n <div className=\"flex min-h-7 items-center gap-2 px-1\">\n <GlobeGlyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\" title={page.url}>{site || \"No page open\"}</span>\n {page.refresh ? <Button variant=\"quiet\" icon={<RefreshGlyph />} aria-label=\"Check again\" onClick={page.refresh} /> : null}\n {onBrowse ? <Button variant=\"quiet\" icon={<ListGlyph />} onClick={onBrowse}>All items</Button> : null}\n </div>\n\n {fillSetup ? <FillSetupCard fillSetup={fillSetup} /> : null}\n {capture ? <CaptureCard capture={capture} onChanged={onChanged} /> : null}\n\n <Section\n title=\"This site\"\n actions={canSave ? <Button variant=\"quiet\" icon={<PlusGlyph />} onClick={() => onNewForPage(normalizeLoginUrl(page.url) ?? page.url)}>Save a login</Button> : null}\n >\n {body}\n </Section>\n\n {said ? <Outcome said={said} onDismiss={() => setSaid(null)} /> : page.blocked && page.url && state.status === \"ready\" ? <p className=\"px-1 text-xs text-muted-foreground\">{BLOCK_WORDS[page.blocked]}</p> : null}\n\n {newPasswordFields && canSave ? (\n <Section>\n <PageGenerator fields={newPasswordFields} />\n </Section>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction Outcome({ said, onDismiss }: { said: Said; onDismiss: () => void }) {\n return (\n <div role=\"status\" className=\"flex items-center gap-2 px-1\">\n {said.tone === \"success\" ? <CheckGlyph className=\"size-4 shrink-0 text-primary\" /> : <ShieldGlyph className=\"size-4 shrink-0 text-destructive\" />}\n <span className=\"min-w-0 flex-1 text-xs text-foreground\">{said.text}</span>\n <Button variant=\"quiet\" icon={<XGlyph />} aria-label=\"Dismiss\" onClick={onDismiss} />\n </div>\n );\n}\n\ninterface MatchRowProps {\n itemId: string;\n item: VaultItem | null;\n tag: string | null;\n family: string;\n port: VaultPort;\n busy: boolean;\n running: boolean;\n onOpen: (id: string) => void;\n onFill: (() => void) | null;\n onSignIn: (() => void) | null;\n}\n\n/** One login: icon · name / site · [Fill] [copy username] [copy password] [code] [⋯]. */\nfunction MatchRow({ itemId, item, tag, family, port, busy, running, onOpen, onFill, onSignIn }: MatchRowProps) {\n const confirmed = useConfirmed();\n const copy = useCopy();\n const notify = useNotify();\n const [reading, setReading] = useState(false);\n const usable = item?.capabilities.canUse ?? false;\n const user = usable ? item?.fields.find((f) => USERNAME_KEYS.test(f.key) && f.handling !== \"sealed\" && f.active) : undefined;\n const secret = usable && item?.capabilities.canReveal ? item?.fields.find((f) => f.key === \"password\" && f.handling === \"revealable\" && f.active) : undefined;\n const otp = usable && item?.authenticator?.enabled ? item : null;\n\n const read = async (label: string, run: () => Promise<string>) => {\n setReading(true);\n try {\n await copy(await confirmed(run), label);\n } catch (e) {\n if (!wasCancelled(e)) notify(e instanceof Error ? e.message : `${label} couldn’t be read`, \"error\");\n } finally {\n setReading(false);\n }\n };\n\n const subtitle = [item ? siteOf(item) || item.definitionLabel : \"\", tag].filter(Boolean).join(\" · \");\n return (\n <li className=\"flex h-12 items-center gap-1 pl-1 pr-2\" data-item={itemId}>\n <button type=\"button\" onClick={() => onOpen(itemId)} className=\"flex h-11 min-w-0 flex-1 items-center gap-3 rounded-lg px-2 text-left hover:bg-accent\">\n <ItemIcon definitionKey={item?.definitionKey ?? \"website_login\"} family={family} site={item ? siteOf(item) : \"\"} />\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">{item?.name ?? \"Saved login\"}</span>\n {subtitle ? <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span> : null}\n </span>\n </button>\n {onFill ? (\n <Button variant=\"primary\" disabled={busy} aria-busy={running || undefined} onClick={onFill} aria-label={`Fill ${item?.name ?? \"this login\"}`}>\n {running ? \"Filling…\" : \"Fill\"}\n </Button>\n ) : null}\n {user && item ? <Button variant=\"quiet\" icon={<UserGlyph />} aria-label={`Copy ${user.label}`} title={`Copy ${user.label}`} disabled={reading} onClick={() => void read(user.label, () => port.reveal(item, user.key))} /> : null}\n {secret && item ? <Button variant=\"quiet\" icon={<KeyGlyph />} aria-label=\"Copy password\" title=\"Copy password\" disabled={reading} onClick={() => void read(\"Password\", () => port.reveal(item, secret.key))} /> : null}\n {otp ? <Button variant=\"quiet\" icon={<ClockGlyph />} aria-label=\"Copy one-time code\" title=\"Copy one-time code\" disabled={reading} onClick={() => void read(\"One-time code\", async () => (await port.authenticator.code(otp)).code)} /> : null}\n {onSignIn ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"More\" disabled={busy} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={onSignIn}><ShieldGlyph className=\"size-4\" />Sign me in</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onOpen(itemId)}><ListGlyph className=\"size-4\" />Open item</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </li>\n );\n}\n","/**\n * \"Save this login?\" — the side panel's twin of the in-page prompt after a login is submitted.\n * Shows only metadata (site, username, saved logins to update); the password stays in the host,\n * which writes it to the vault itself. One card, no inner boxes.\n */\nimport { useState, useSyncExternalStore } from \"react\";\nimport { Button, SearchField } from \"@ai-matrx/design-system/controls\";\nimport { ShieldGlyph, XGlyph } from \"../glyphs\";\nimport { useNotify } from \"../notice\";\nimport type { CaptureDecision, CaptureHost } from \"./host\";\nimport { CAPTURE_WORDS, distinguish } from \"./page-logic\";\n\nexport interface CaptureCardProps {\n capture: CaptureHost;\n /** After a save or an update: reload the vault so the login shows. */\n onChanged?: () => void;\n}\n\nconst SEARCH_FROM = 4;\n\nexport function CaptureCard({ capture, onChanged }: CaptureCardProps) {\n const prompt = useSyncExternalStore(capture.subscribe, capture.get, capture.get);\n const notify = useNotify();\n const [busy, setBusy] = useState(false);\n const [q, setQ] = useState(\"\");\n if (!prompt) return null;\n\n const decide = async (d: CaptureDecision) => {\n setBusy(true);\n try {\n const r = await capture.decide(prompt.id, d);\n const said = CAPTURE_WORDS[r];\n if (said) notify(said.text, said.tone === \"success\" ? \"success\" : \"error\");\n if (r === \"saved\" || r === \"updated\") onChanged?.();\n } catch {\n notify(\"Matrx didn’t answer. Try again.\", \"error\");\n } finally {\n setBusy(false);\n }\n };\n\n const existing = prompt.existing;\n const needle = q.trim().toLocaleLowerCase();\n const shown = needle ? existing.filter((x) => x.name.toLocaleLowerCase().includes(needle)) : existing;\n\n return (\n <section aria-label=\"Save this login\" className=\"flex flex-col gap-2 rounded-xl border border-border bg-card px-3 py-2.5\">\n <div className=\"flex items-center gap-2.5\">\n <ShieldGlyph className=\"size-5 shrink-0 text-primary\" />\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">{prompt.unavailable ? \"Couldn’t hold this login\" : \"Save this login?\"}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{prompt.username ? `${prompt.host} · ${prompt.username}` : prompt.host}</span>\n </div>\n <Button variant=\"quiet\" icon={<XGlyph />} aria-label=\"Not now\" disabled={busy} onClick={() => void decide({ action: \"dismiss\" })} />\n </div>\n\n {prompt.unavailable ? (\n <p className=\"text-xs text-muted-foreground\">Save it by hand with Save a login.</p>\n ) : (\n <>\n {existing.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n {existing.length >= SEARCH_FROM ? <SearchField value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Search logins\" aria-label=\"Search logins to update\" /> : null}\n <ul className=\"flex max-h-36 flex-col gap-px overflow-y-auto\">\n {shown.map((x) => {\n const tag = distinguish(x, existing);\n return (\n <li key={x.itemId} className=\"flex h-9 items-center gap-2 px-1\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n {x.name}\n {tag ? <span className=\"text-muted-foreground\"> · {tag}</span> : null}\n </span>\n <Button variant=\"primary\" disabled={busy} onClick={() => void decide({ action: \"update\", itemId: x.itemId })} aria-label={`Update ${x.name}`}>\n Update\n </Button>\n </li>\n );\n })}\n {shown.length === 0 ? <li className=\"px-1 py-2 text-xs text-muted-foreground\">No saved login matches.</li> : null}\n </ul>\n </div>\n ) : null}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant={existing.length > 0 ? \"outline\" : \"primary\"} disabled={busy} onClick={() => void decide({ action: \"save\" })}>\n {existing.length > 0 ? \"Save as new\" : \"Save\"}\n </Button>\n <Button variant=\"quiet\" disabled={busy} onClick={() => void decide({ action: \"never\" })}>\n Never here\n </Button>\n </div>\n </>\n )}\n </section>\n );\n}\n","/**\n * \"Turn on filling\" — this browser has no fill key yet. Registering one needs the person to\n * confirm it's them once (the bar 1Password and Bitwarden set for every new browser), two ways:\n * - their AI Matrx password, typed here: it stays in the uncontrolled box for one request and\n * is cleared at once — never in state, never kept;\n * - their passkey, on the AI Matrx web page the host opens (passkeys belong to the web app's\n * domain). Back in the panel, \"I approved\" claims it.\n * An account with neither is sent to add a passkey on the web.\n */\nimport { useNotify } from \"../notice\";\nimport { useRef, useState, useSyncExternalStore } from \"react\";\nimport { Button, Field } from \"@ai-matrx/design-system/controls\";\nimport { ExternalGlyph, KeyGlyph } from \"../glyphs\";\nimport type { FillSetupHost, FillSetupResult } from \"./host\";\nimport { fillSetupError } from \"./page-logic\";\n\nexport interface FillSetupCardProps {\n fillSetup: FillSetupHost;\n}\n\nexport function FillSetupCard({ fillSetup }: FillSetupCardProps) {\n const notify = useNotify();\n const state = useSyncExternalStore(fillSetup.subscribe, fillSetup.get, fillSetup.get);\n const box = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n if (state.status !== \"off\") return null;\n\n const finish = async (run: () => Promise<FillSetupResult>) => {\n setBusy(true);\n setError(null);\n try {\n const r = await run();\n if (!r.ok) setError(fillSetupError(r));\n else notify(\"Filling is on in this browser.\", \"success\");\n } catch {\n setError(\"That didn’t work. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n const withPassword = () => {\n const field = box.current;\n const password = field?.value ?? \"\";\n if (field) field.value = \"\";\n if (!password) return setError(\"Enter your AI Matrx password.\");\n void finish(() => fillSetup.turnOnWithPassword(password));\n };\n\n const m = state.methods;\n const neither = m !== null && !m.password && !m.passkey;\n const showPassword = !neither && (m === null || m.password);\n const showPasskey = state.passkey !== null && (neither || m === null || m.passkey);\n\n return (\n <section aria-label=\"Turn on filling\" data-testid=\"fill-setup\" className=\"flex flex-col gap-2 rounded-xl border border-border bg-card px-3 py-2.5\">\n <div className=\"flex items-center gap-2.5\">\n <KeyGlyph className=\"size-5 shrink-0 text-primary\" />\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">Turn on filling</span>\n <span className=\"truncate text-xs text-muted-foreground\">{neither ? \"Add a passkey on the web first.\" : \"Confirm it’s you once in this browser.\"}</span>\n </div>\n </div>\n\n {showPassword ? (\n <form\n className=\"flex items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n withPassword();\n }}\n >\n <Field ref={box} className=\"min-w-0 flex-1\" type=\"password\" autoComplete=\"current-password\" placeholder=\"AI Matrx password\" aria-label=\"Your AI Matrx password\" disabled={busy} />\n <Button variant=\"primary\" type=\"submit\" disabled={busy}>Turn on</Button>\n </form>\n ) : null}\n\n {showPasskey ? (\n <Button variant=\"outline\" iconEnd={<ExternalGlyph />} disabled={busy} onClick={() => { setError(null); fillSetup.openPasskey(); }}>\n {neither ? \"Add a passkey\" : \"Use a passkey\"}\n </Button>\n ) : null}\n {showPasskey && state.awaitingPasskey && state.passkey ? (\n <div className=\"flex items-center gap-2\" data-testid=\"fill-setup-waiting\">\n <span className=\"min-w-0 flex-1 text-xs text-muted-foreground\">\n Approve code <span className=\"font-mono text-foreground\">{state.passkey.code}</span> on that page.\n </span>\n <Button variant=\"primary\" disabled={busy} onClick={() => void finish(() => fillSetup.finishPasskey())}>I approved</Button>\n </div>\n ) : null}\n\n {error ? <p role=\"alert\" className=\"text-xs text-destructive\">{error}</p> : null}\n </section>\n );\n}\n","/**\n * The generator, aimed at the page: generate, then \"Fill page\" puts it into the page's\n * new-password boxes (the host finds and fills them). Several sets of boxes → the person picks one.\n * No boxes → the value stays here for a moment so it can still be copied.\n */\nimport { useState } from \"react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@ai-matrx/design-system\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { CheckGlyph, CopyGlyph, KeyGlyph } from \"../glyphs\";\nimport { PasswordGenerator, useGeneratorLimitsSource } from \"../generator/PasswordGenerator\";\nimport { useTransientSecret } from \"../hooks\";\nimport { useCopy } from \"../notice\";\nimport { Row } from \"../ui\";\nimport type { NewPasswordFieldsHost, NewPasswordTarget } from \"./host\";\nimport { FIND_WORDS, NEW_PASSWORD_WORDS, targetLabel, type Said } from \"./page-logic\";\n\nconst HOLD_MS = 60_000;\n\nexport function PageGenerator({ fields }: { fields: NewPasswordFieldsHost }) {\n const limits = useGeneratorLimitsSource();\n const copy = useCopy();\n const held = useTransientSecret(HOLD_MS);\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [targets, setTargets] = useState<readonly NewPasswordTarget[]>([]);\n const [said, setSaid] = useState<Said | null>(null);\n if (!limits) return null;\n\n const say = setSaid;\n\n const put = async (targetId: string, value: string) => {\n setBusy(true);\n try {\n const r = await fields.use(targetId, value);\n say(NEW_PASSWORD_WORDS[r]);\n setTargets([]);\n if (r === \"filled\") held.clear();\n } catch {\n say(NEW_PASSWORD_WORDS.unavailable);\n } finally {\n setBusy(false);\n }\n };\n\n const onUse = async (value: string) => {\n setOpen(false);\n held.show(value);\n setSaid(null);\n setTargets([]);\n setBusy(true);\n try {\n const found = await fields.find();\n if (found.status !== \"ready\" || found.targets.length === 0) {\n setSaid({ text: FIND_WORDS[found.status === \"ready\" ? \"none\" : found.status], tone: \"warning\" });\n return;\n }\n const only = found.targets.length === 1 ? found.targets[0] : undefined;\n if (only && only.topFrame) {\n setBusy(false);\n await put(only.id, value);\n return;\n }\n setTargets(found.targets);\n } catch {\n setSaid({ text: FIND_WORDS.unavailable, tone: \"warning\" });\n } finally {\n setBusy(false);\n }\n };\n\n const value = held.value;\n return (\n <>\n <Row\n label=\"New password\"\n actions={\n <>\n {value ? <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label=\"Copy password\" onClick={() => void copy(value, \"Password\")} /> : null}\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" icon={<KeyGlyph />} disabled={busy}>Generate</Button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"end\">\n {open ? <PasswordGenerator limits={limits} useLabel=\"Fill page\" onUse={(v) => void onUse(v)} /> : null}\n </PopoverContent>\n </Popover>\n </>\n }\n >\n {said ? (\n <span role=\"status\" className={said.tone === \"success\" ? \"line-clamp-2 text-xs text-foreground\" : \"line-clamp-2 text-xs text-muted-foreground\"}>{said.text}</span>\n ) : targets.length > 0 ? (\n <span className=\"text-xs text-muted-foreground\">Choose the boxes to fill.</span>\n ) : (\n <span className=\"text-xs text-disabled-foreground\">Fills the page’s new-password box</span>\n )}\n </Row>\n {value && targets.length > 0\n ? targets.map((t) => (\n <Row key={t.id} label={t.topFrame ? \"This page\" : \"In a frame\"} actions={<Button variant=\"primary\" icon={<CheckGlyph />} disabled={busy} onClick={() => void put(t.id, value)}>Fill</Button>}>\n <span className=\"block truncate text-sm\">{targetLabel(t)}</span>\n </Row>\n ))\n : null}\n </>\n );\n}\n","import { useState } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Select } from \"@ai-matrx/design-system/controls\";\nimport { CATEGORIES, categoryOf, type CategoryId, type VaultDefinition } from \"./definitions\";\nimport { ChevronDownGlyph, ChevronRightGlyph, ClockGlyph, DatabaseGlyph, ExportGlyph, FileGlyph, GlobeGlyph, GridGlyph, ImportGlyph, KeyGlyph, LockGlyph, NoteGlyph, PlugGlyph, SafeGlyph, ShieldGlyph, StarGlyph, TagGlyph, TerminalGlyph, TrashGlyph, type Glyph } from \"./glyphs\";\nimport type { VaultItem, VaultSelection } from \"./model\";\n\nexport interface VaultChoice {\n value: VaultSelection;\n label: string;\n count: number;\n}\n\n/** The vault dropdown: everything first, then the person's own, shared with them, and each organization. */\nexport function vaultChoices(items: readonly VaultItem[], organizations: readonly { id: string; name: string }[], current?: VaultSelection): VaultChoice[] {\n const n = (f: (i: VaultItem) => boolean) => items.filter(f).length;\n const shared = n((i) => i.owner.kind === \"shared\");\n return [\n { value: \"all\", label: \"All items\", count: items.length },\n { value: \"mine\", label: \"Personal\", count: n((i) => i.owner.kind === \"me\") },\n ...(shared > 0 ? [{ value: \"shared\", label: \"Shared with me\", count: shared }] : []),\n // Only organizations that hold something; an empty one is a dead end in a vault list.\n ...organizations.map((o) => ({ value: o.id, label: o.name, count: n((i) => i.owner.organizationId === o.id) })).filter((c) => c.count > 0 || c.value === current),\n ];\n}\n\nexport function VaultSelect({ value, choices, onChange }: { value: VaultSelection; choices: readonly VaultChoice[]; onChange: (v: VaultSelection) => void }) {\n return <Select value={value} onValueChange={onChange} aria-label=\"Vault\" options={choices.map((c) => ({ value: c.value, label: c.label, meta: String(c.count) }))} />;\n}\n\nconst CATEGORY_GLYPHS: Record<CategoryId, Glyph> = { logins: GlobeGlyph, passkeys: ShieldGlyph, api: KeyGlyph, oauth: PlugGlyph, infra: DatabaseGlyph, env: TerminalGlyph, files: FileGlyph, other: NoteGlyph };\n\nexport interface ViewEntry {\n view: string;\n label: string;\n count: number;\n glyph: Glyph;\n}\n\nexport interface Views {\n categories: ViewEntry[];\n tags: ViewEntry[];\n /** Undefined until read: a count is never shown as 0 before it is known. */\n favorites: number | undefined;\n authenticator: number;\n recent: number | undefined;\n}\n\nconst familyOf = (key: string, definitions: readonly VaultDefinition[]) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n\nexport function itemCategory(item: VaultItem, definitions: readonly VaultDefinition[]): CategoryId {\n return categoryOf(item.definitionKey, familyOf(item.definitionKey, definitions));\n}\n\n/** What the chosen vault holds, by category and tag, with counts. */\nexport function buildViews(items: readonly VaultItem[], definitions: readonly VaultDefinition[], favoriteIds: ReadonlySet<string> | null, recentIds: readonly string[] | null): Views {\n const byCat = new Map<CategoryId, number>();\n const byTag = new Map<string, number>();\n for (const i of items) {\n const c = itemCategory(i, definitions);\n byCat.set(c, (byCat.get(c) ?? 0) + 1);\n for (const t of i.tags) byTag.set(t, (byTag.get(t) ?? 0) + 1);\n }\n const ids = new Set(items.map((i) => i.id));\n return {\n categories: CATEGORIES.filter((c) => byCat.has(c.id)).map((c) => ({ view: `category:${c.id}`, label: c.label, count: byCat.get(c.id) ?? 0, glyph: CATEGORY_GLYPHS[c.id] })),\n tags: [...byTag.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([t, count]) => ({ view: `tag:${t}`, label: t, count, glyph: TagGlyph })),\n favorites: favoriteIds ? [...favoriteIds].filter((id) => ids.has(id)).length : undefined,\n authenticator: items.filter((i) => i.authenticator).length,\n recent: recentIds ? recentIds.filter((id) => ids.has(id)).length : undefined,\n };\n}\n\n/** Every view a list can show, in words (the list title and the phone's view picker). */\nexport function viewLabel(view: string, views: Views): string {\n if (view === \"favorites\") return \"Favorites\";\n if (view === \"recent\") return \"Recently opened\";\n if (view === \"authenticator\") return \"One-time passwords\";\n if (view === \"trash\") return \"Trash\";\n if (view === \"page\") return \"This page\";\n return [...views.categories, ...views.tags].find((v) => v.view === view)?.label ?? \"All items\";\n}\n\n/** The phone / side-panel picker: the same choices as the sidebar, in one dropdown. */\nexport function viewOptions(views: Views, allCount: number, deletedCount: number, hasFavorites: boolean, hasRecents: boolean, hasPage = false) {\n return [\n ...(hasPage ? [{ value: \"page\", label: \"This page\" }] : []),\n { value: \"all\", label: \"Every category\", meta: String(allCount) },\n ...(hasFavorites ? [{ value: \"favorites\", label: \"Favorites\", meta: views.favorites === undefined ? \"\" : String(views.favorites) }] : []),\n ...(hasRecents ? [{ value: \"recent\", label: \"Recently opened\", meta: views.recent === undefined ? \"\" : String(views.recent) }] : []),\n { value: \"authenticator\", label: \"One-time passwords\", meta: String(views.authenticator) },\n ...views.categories.map((v) => ({ value: v.view, label: v.label, meta: String(v.count) })),\n ...views.tags.map((v) => ({ value: v.view, label: `#${v.label}`, meta: String(v.count) })),\n { value: \"trash\", label: \"Trash\", meta: String(deletedCount) },\n ];\n}\n\nexport interface SidebarProps {\n vault: VaultSelection;\n choices: readonly VaultChoice[];\n onVault: (v: VaultSelection) => void;\n view: string;\n allCount: number;\n deletedCount: number;\n views: Views;\n hasFavorites: boolean;\n hasRecents: boolean;\n onView: (view: string) => void;\n onPanel: (panel: string) => void;\n /** Desktop only: the system's own password AutoFill (macOS), its state and its setup. */\n nativeProvider?: { status: \"ready\" | \"needs_setup\" | \"unavailable\"; openSetup: () => void } | undefined;\n hasNativeImport?: boolean;\n hasPage?: boolean;\n}\n\nfunction Entry({ on, glyph: Icon, label, count, onClick }: { on: boolean; glyph: Glyph; label: string; count?: number | undefined; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n aria-current={on ? \"page\" : undefined}\n onClick={onClick}\n className={cn(\"flex h-8 w-full items-center gap-2.5 rounded-lg px-2.5 text-left text-sm\", on ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\" : \"text-sidebar-foreground hover:bg-sidebar-accent\")}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {count !== undefined ? <span className=\"text-xs tabular-nums text-muted-foreground\">{count}</span> : null}\n </button>\n );\n}\n\nfunction Group({ title, children }: { title: string; children: React.ReactNode }) {\n return (\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"px-2.5 pb-1 text-xs font-medium text-muted-foreground\">{title}</div>\n {children}\n </div>\n );\n}\n\nexport function Sidebar({ vault, choices, onVault, view, allCount, deletedCount, views, hasFavorites, hasRecents, onView, onPanel, nativeProvider, hasNativeImport = false, hasPage = false }: SidebarProps) {\n const [tagsOpen, setTagsOpen] = useState(view.startsWith(\"tag:\"));\n return (\n <nav aria-label=\"Vault\" className=\"flex h-full min-h-0 flex-col border-r border-sidebar-border bg-sidebar-background text-sidebar-foreground\">\n <div className=\"flex items-center gap-2 px-3 pb-2 pt-3\">\n <SafeGlyph className=\"size-5 shrink-0 text-primary\" />\n <div className=\"min-w-0 flex-1\">\n <VaultSelect value={vault} choices={choices} onChange={onVault} />\n </div>\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-2 pb-3 pt-1\">\n <div className=\"flex flex-col gap-0.5\">\n {hasPage ? <Entry on={view === \"page\"} glyph={GlobeGlyph} label=\"This page\" onClick={() => onView(\"page\")} /> : null}\n <Entry on={view === \"all\"} glyph={GridGlyph} label=\"All items\" count={allCount} onClick={() => onView(\"all\")} />\n {hasFavorites ? <Entry on={view === \"favorites\"} glyph={StarGlyph} label=\"Favorites\" count={views.favorites} onClick={() => onView(\"favorites\")} /> : null}\n {hasRecents ? <Entry on={view === \"recent\"} glyph={ClockGlyph} label=\"Recently opened\" count={views.recent} onClick={() => onView(\"recent\")} /> : null}\n <Entry on={view === \"authenticator\"} glyph={LockGlyph} label=\"One-time passwords\" count={views.authenticator} onClick={() => onView(\"authenticator\")} />\n </div>\n {views.categories.length > 0 ? (\n <Group title=\"Categories\">\n {views.categories.map((e) => <Entry key={e.view} on={view === e.view} glyph={e.glyph} label={e.label} count={e.count} onClick={() => onView(e.view)} />)}\n </Group>\n ) : null}\n {views.tags.length > 0 ? (\n <div className=\"flex flex-col gap-0.5\">\n <button type=\"button\" aria-expanded={tagsOpen} onClick={() => setTagsOpen((o) => !o)} className=\"flex h-7 items-center gap-1 rounded-md px-2.5 text-left text-xs font-medium text-muted-foreground hover:text-foreground\">\n {tagsOpen ? <ChevronDownGlyph className=\"size-3.5\" /> : <ChevronRightGlyph className=\"size-3.5\" />}\n Tags\n <span className=\"ml-auto tabular-nums\">{views.tags.length}</span>\n </button>\n {tagsOpen ? views.tags.map((e) => <Entry key={e.view} on={view === e.view} glyph={e.glyph} label={e.label} count={e.count} onClick={() => onView(e.view)} />) : null}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-col gap-0.5 border-t border-sidebar-border p-2\">\n <Entry on={view === \"trash\"} glyph={TrashGlyph} label=\"Trash\" count={deletedCount} onClick={() => onView(\"trash\")} />\n <Entry on={false} glyph={ImportGlyph} label=\"Import\" onClick={() => onPanel(\"import\")} />\n <Entry on={false} glyph={ExportGlyph} label=\"Export\" onClick={() => onPanel(\"export\")} />\n <Entry on={false} glyph={SafeGlyph} label=\"Backup\" onClick={() => onPanel(\"backup\")} />\n <Entry on={false} glyph={ShieldGlyph} label=\"Browsers that fill\" onClick={() => onPanel(\"devices\")} />\n {hasNativeImport ? <Entry on={false} glyph={ImportGlyph} label=\"Import passkeys\" onClick={() => onPanel(\"import-passkeys\")} /> : null}\n {nativeProvider && nativeProvider.status !== \"unavailable\" ? (\n <button type=\"button\" onClick={nativeProvider.openSetup} className=\"flex h-8 w-full items-center gap-2.5 rounded-lg px-2.5 text-left text-sm hover:bg-sidebar-accent\">\n <ShieldGlyph className=\"size-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">System AutoFill</span>\n <span className={cn(\"text-xs\", nativeProvider.status === \"ready\" ? \"text-success\" : \"text-warning\")}>{nativeProvider.status === \"ready\" ? \"On\" : \"Set up\"}</span>\n </button>\n ) : null}\n </div>\n </nav>\n );\n}\n","/**\n * THE vault client for every host: a VaultPort over the generated `@ai-matrx/api`. The web app, the\n * extension and the desktop app hand it their own `Api` (their own sign-in and organization) and get\n * identical behaviour; none of them keeps a hand-written vault client.\n */\nimport type { Api } from \"@ai-matrx/api\";\nimport * as account from \"@ai-matrx/api/account\";\nimport * as apps from \"@ai-matrx/api/apps\";\nimport * as platform from \"@ai-matrx/api/platform\";\nimport { humanize, parseDefinitions, type VaultDefinition } from \"./definitions\";\nimport { createActivityPort } from \"./activity/api\";\nimport { createAuthenticatorPort } from \"./authenticator/api\";\nimport { createFieldsPort } from \"./fields/api\";\nimport { createIoPort } from \"./io/api\";\nimport { createListsPort } from \"./lists/api\";\nimport type { VaultUserStateDoor } from \"./lists/port\";\nimport { fieldKeyOf, type FieldHandling, type UriMatchMode, type VaultField, type VaultItem, type VaultOrganizationRef, type VaultOwner } from \"./model\";\nimport type { SaveResult, VaultPort, VaultSnapshot } from \"./port\";\nimport type { PortContext } from \"./port-context\";\nimport { createSharingPort, type SharingPortOptions } from \"./sharing/api\";\nimport { createDevicesPort } from \"./devices/api\";\nimport type { PasskeyAuthLike } from \"./devices/port\";\nimport { readNativeImportLimits } from \"./native/api\";\n\ntype Wire = account.VaultItemOut;\n\ntype Recovery = { state?: unknown; deletion_id?: unknown; deleted_at?: unknown };\nconst recoveryOf = (w: Wire): Recovery | undefined => (w.lifecycle as { vault_recovery?: Recovery } | undefined)?.vault_recovery;\nconst isDeleted = (w: Wire): boolean => recoveryOf(w)?.state === \"deleted\";\nconst MATCH_MODES: readonly UriMatchMode[] = [\"host\", \"domain\", \"exact\", \"never\"];\n\nconst handlingOf = (v: unknown): FieldHandling => (v === \"visible\" || v === \"sealed\" ? v : \"revealable\");\n\nfunction fieldOf(w: account.VaultFieldOut, def: VaultDefinition | undefined): VaultField {\n const declared = def?.fields.find((f) => f.key === w.field_key);\n const handling = handlingOf(w.handling);\n return {\n id: w.id,\n key: w.field_key,\n label: declared?.label ?? humanize(w.field_key),\n kind: declared?.kind ?? (handling === \"visible\" ? \"text\" : \"secret\"),\n handling,\n editable: w.editable ?? true,\n envKey: w.env_key ?? null,\n injectIntoSandbox: w.inject_into_sandbox ?? false,\n description: w.description ?? \"\",\n active: w.is_active ?? true,\n };\n}\n\nfunction itemOf(w: Wire, owner: VaultOwner, defs: ReadonlyMap<string, VaultDefinition>, auth: ReadonlyMap<string, apps.AuthenticatorEntryOut>): VaultItem {\n const def = defs.get(w.definition_key ?? \"\");\n const a = auth.get(w.id);\n const cap = w.capabilities ?? {};\n const recovery = recoveryOf(w);\n return {\n id: w.id,\n name: w.display_name,\n description: w.description ?? \"\",\n definitionKey: w.definition_key ?? \"custom\",\n definitionLabel: def?.label ?? humanize(w.definition_key ?? \"custom\"),\n owner,\n tags: w.tags ?? [],\n loginUrls: w.login_urls ?? [],\n notes: w.notes ?? \"\",\n fields: (w.fields ?? []).filter((f) => f.execution_purpose !== \"passkey_private\").map((f) => fieldOf(f, def)),\n custom: (w.non_secret_fields ?? []).map((c) => ({ key: c[\"key\"] ?? \"\", label: c[\"label\"] ?? humanize(c[\"key\"] ?? \"\"), value: c[\"value\"] ?? \"\" })),\n authenticator: a ? { digits: a.digits, period: a.period, enabled: a.enabled } : null,\n capabilities: { canUse: cap.can_use ?? false, canEdit: cap.can_edit ?? false, canReveal: cap.can_reveal ?? false, canManage: cap.can_manage ?? false },\n attachments: (w.attachments ?? []).map((a) => ({ id: a.id, label: a.label, description: a.description ?? \"\", fileName: a.file_name, mediaType: a.media_type ?? \"application/octet-stream\", sizeBytes: a.size_bytes, handling: handlingOf(a.handling), createdAt: a.created_at, updatedAt: a.updated_at })),\n uriMatchMode: MATCH_MODES.find((m) => m === w.uri_match_mode) ?? \"host\",\n browserFillEnabled: w.browser_fill_enabled ?? true,\n accessMode: w.access_mode ?? null,\n ownerUserId: w.user_id ?? null,\n deletion: recovery?.state === \"deleted\" ? { deletionId: typeof recovery.deletion_id === \"string\" ? recovery.deletion_id : null, deletedAt: typeof recovery.deleted_at === \"string\" ? recovery.deleted_at : null } : null,\n updatedAt: w.updated_at,\n createdAt: w.created_at,\n };\n}\n\nexport interface ApiVaultPortOptions {\n /** Overrides the organizations the vault lists (default: the signed-in person's own). */\n organizations?: readonly VaultOrganizationRef[];\n /** The host's per-person state door (its supabase client): turns on Favorites and Recently opened. */\n userState?: VaultUserStateDoor;\n /** The host's `supabase.schema(\"platform\")`: turns on \"Sent links\" and the recipient's mobile in Send. */\n platformDoor?: SharingPortOptions[\"platformDoor\"];\n /** The host's `supabase.auth`: turns on approving a browser with a passkey. */\n passkeys?: PasskeyAuthLike;\n}\n\nconst VISIBLE_TTL_MS = 5 * 60_000;\n\n/** A dropped connection or a server hiccup (5xx) is tried again, twice, before it counts. A refusal (4xx) never is. */\nasync function retrying<T>(run: () => Promise<T>, tries = 3): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await run();\n } catch (e) {\n const status = (e as { status?: unknown } | null)?.status;\n const transient = typeof status !== \"number\" || status >= 500;\n if (!transient || attempt >= tries) throw e;\n await new Promise((r) => setTimeout(r, 400 * attempt));\n }\n }\n}\n\nexport function createApiVaultPort(api: Api, options: ApiVaultPortOptions = {}): VaultPort {\n let defs: ReadonlyMap<string, VaultDefinition> = new Map();\n let auth: ReadonlyMap<string, apps.AuthenticatorEntryOut> = new Map();\n let orgs: readonly VaultOrganizationRef[] = [];\n const orgOf = (id: string | null | undefined, userId: string | null | undefined, mine: boolean): VaultOwner => {\n if (id) return { kind: \"organization\", label: orgs.find((o) => o.id === id)?.name ?? \"Organization\", organizationId: id };\n return mine || userId ? { kind: \"me\", label: \"Personal\", organizationId: null } : { kind: \"shared\", label: \"Shared with me\", organizationId: null };\n };\n\n async function refetch(id: string, owner: VaultOwner): Promise<VaultItem> {\n const w = await account.getItem(api, { path: { item_id: id } });\n return itemOf(w, owner, defs, auth);\n }\n\n const visibleCache = new Map<string, { at: number; value: string }>();\n const ctx: PortContext = {\n api,\n optsFor: (item) => (item.owner.organizationId ? { organizationId: item.owner.organizationId } : undefined),\n refetch,\n definition: (key) => defs.get(key),\n organizations: () => orgs,\n setAuthenticator: (itemId, entry) => {\n const next = new Map(auth);\n if (entry) next.set(itemId, entry);\n else next.delete(itemId);\n auth = next;\n },\n };\n\n return {\n authenticator: createAuthenticatorPort(ctx),\n sharing: createSharingPort(ctx, options.platformDoor ? { platformDoor: options.platformDoor } : {}),\n devices: createDevicesPort(ctx, options.passkeys),\n native: { limits: (organizationId) => readNativeImportLimits(api, organizationId) },\n activity: createActivityPort(ctx),\n io: createIoPort(ctx),\n fields: createFieldsPort(ctx),\n lists: createListsPort(ctx, options.userState),\n\n async load(): Promise<VaultSnapshot> {\n // Everything that does not need the organization list starts at once; the per-organization\n // lists start the moment it answers, while the rest is still in flight.\n const catalogP = retrying(() => apps.getAppCatalogKind(api, { path: { app: \"matrx\", kind: \"credential_definition\" } }));\n const authP = retrying(() => apps.listAuthenticators(api));\n const userP = retrying(() => account.listItems(api, { query: { principal_type: \"user\" } }));\n const sharedP = retrying(() => account.sharedWithMe(api));\n const org = options.organizations ? null : await retrying(() => platform.listMyOrganizations(api));\n // One row per organization: the server's list can name the same one twice.\n orgs = [...new Map((options.organizations ?? (org?.organizations ?? []).filter((o) => !o.archived_at).map((o) => ({ id: o.id, name: o.name }))).map((o) => [o.id, o])).values()];\n const orgListsP = orgs.map((o) => retrying(() => account.listItems(api, { query: { principal_type: \"organization\", organization_id: o.id } }, { organizationId: o.id })));\n // The person's own vault and the type catalog are the vault; without them it cannot open. Every\n // other part (an organization, shared items, one-time codes) that fails is named and skipped.\n const [catalog, mine] = await Promise.all([catalogP, userP]);\n const [authSettled, sharedSettled, ...orgSettled] = await Promise.allSettled([authP, sharedP, ...orgListsP]);\n const unavailable: string[] = [];\n const authList = authSettled.status === \"fulfilled\" ? authSettled.value : (unavailable.push(\"One-time codes\"), { entries: [] });\n const orgLists = orgSettled.map((r, i) => (r.status === \"fulfilled\" ? r.value : (unavailable.push(orgs[i]?.name ?? \"An organization\"), { items: [], count: 0 })));\n const shared = sharedSettled.status === \"fulfilled\" ? sharedSettled.value : (unavailable.push(\"Shared with me\"), { items: [], count: 0 });\n const lists = [mine, ...orgLists, shared];\n defs = new Map(parseDefinitions(catalog.filter((e) => e.is_active).map((e) => ({ key: e.key, payload: e.payload, sort_order: e.sort_order }))).map((d) => [d.key, d]));\n auth = new Map((authList.entries ?? []).map((a) => [a.credential_item_id, a]));\n\n const seen = new Map<string, VaultItem>();\n const deleted = new Map<string, VaultItem>();\n lists.forEach((l, i) => {\n const sharedList = i === lists.length - 1;\n for (const w of l.items) {\n if (seen.has(w.id) || deleted.has(w.id)) continue;\n const owner = sharedList ? orgOf(w.organization_id, null, false) : orgOf(w.organization_id, w.user_id, i === 0);\n const item = itemOf(w, sharedList && !w.organization_id ? { kind: \"shared\", label: \"Shared with me\", organizationId: null } : owner, defs, auth);\n // The server's list also returns deleted items (kept for recovery): they are the Trash, never the vault.\n (isDeleted(w) ? deleted : seen).set(w.id, item);\n }\n });\n return { unavailable, items: [...seen.values()], deleted: [...deleted.values()], organizations: orgs, definitions: [...defs.values()].sort((a, b) => a.sortOrder - b.sortOrder || a.label.localeCompare(b.label)) };\n },\n\n async reveal(item, fieldKey): Promise<string> {\n const field = item.fields.find((f) => f.key === fieldKey);\n const opts = item.owner.organizationId ? { organizationId: item.owner.organizationId } : undefined;\n if (field?.handling === \"visible\") {\n // A visible value (a username) shows every time an item opens; each read is an audited \"use\",\n // so one read per field is kept a few minutes instead of one per open.\n const key = `${item.id}/${fieldKey}/${field.id}`;\n const kept = visibleCache.get(key);\n if (kept && Date.now() - kept.at < VISIBLE_TTL_MS) return kept.value;\n const r = await account.resolve(api, { body: { refs: [{ item_id: item.id, field_key: fieldKey }] } }, opts);\n const value = r.values[`${item.id}/${fieldKey}`] ?? r.values[`${item.id}:${fieldKey}`] ?? \"\";\n visibleCache.set(key, { at: Date.now(), value });\n return value;\n }\n const r = await account.reveal(api, { path: { item_id: item.id }, body: { field_key: fieldKey } }, opts);\n return r.value;\n },\n\n async create(definition, organizationId, draft): Promise<SaveResult> {\n const declared = definition.fields;\n const encrypted = declared.filter((f) => f.storage === \"encrypted\" && (draft.values[f.key] ?? \"\") !== \"\");\n const meta = declared.filter((f) => f.storage === \"metadata\" && (draft.values[f.key] ?? \"\") !== \"\");\n const w = await account.createItem(api, {\n body: {\n display_name: draft.name.trim(),\n ...(draft.description.trim() ? { description: draft.description.trim() } : {}),\n definition_key: definition.key,\n provider_key: definition.providerKey,\n tags: draft.tags,\n login_urls: draft.loginUrls,\n notes: draft.notes || null,\n principal: organizationId ? { type: \"organization\", organization_id: organizationId } : { type: \"user\" },\n initiation: \"user\",\n non_secret_fields: [...meta.map((f) => ({ key: f.key, label: f.label, value: draft.values[f.key] ?? \"\" })), ...draft.custom.filter((c) => c.label.trim() !== \"\").map((c) => ({ key: c.key || fieldKeyOf(c.label), label: c.label, value: c.value }))],\n fields: [\n ...encrypted.map((f) => ({ field_key: f.key, value: draft.values[f.key] ?? \"\", handling: f.handling })),\n ...draft.secrets.filter((s) => s.label.trim() !== \"\" && s.value !== \"\").map((s) => ({ field_key: fieldKeyOf(s.label), value: s.value, handling: \"revealable\" as const })),\n ],\n },\n }, organizationId ? { organizationId } : undefined);\n // A one-time password is set up by the screen after this (it needs \"Confirm it's you\").\n const notice = null;\n return { item: itemOf(w, orgOf(w.organization_id, w.user_id, true), defs, auth), notice };\n },\n\n async save(item, definition, draft): Promise<SaveResult> {\n for (const k of [...visibleCache.keys()]) if (k.startsWith(`${item.id}/`)) visibleCache.delete(k);\n const opts = item.owner.organizationId ? { organizationId: item.owner.organizationId } : undefined;\n const meta = (definition?.fields ?? []).filter((f) => f.storage === \"metadata\");\n const body: account.VaultItemUpdateRequest = { initiation: \"user\" };\n if (draft.name !== item.name) body.display_name = draft.name.trim();\n if (draft.description !== item.description) {\n if (draft.description.trim() === \"\") body.clear_description = true;\n else body.description = draft.description.trim();\n }\n if (JSON.stringify(draft.tags) !== JSON.stringify(item.tags)) body.tags = draft.tags;\n if (JSON.stringify(draft.loginUrls) !== JSON.stringify(item.loginUrls)) body.login_urls = draft.loginUrls;\n if (draft.notes !== item.notes) {\n if (draft.notes === \"\") body.clear_notes = true;\n else body.notes = draft.notes;\n }\n const metaNow = meta.map((f) => ({ key: f.key, label: f.label, value: draft.values[f.key] ?? item.custom.find((c) => c.key === f.key)?.value ?? \"\" })).filter((m) => m.value !== \"\");\n const extras = draft.custom.filter((c) => !meta.some((f) => f.key === c.key) && c.label.trim() !== \"\").map((c) => ({ key: c.key || fieldKeyOf(c.label), label: c.label, value: c.value }));\n if (JSON.stringify(draft.custom) !== JSON.stringify(item.custom) || meta.some((f) => draft.values[f.key] !== undefined)) body.non_secret_fields = [...metaNow, ...extras];\n if (Object.keys(body).length > 1) await account.updateItem(api, { path: { item_id: item.id }, body }, opts);\n\n for (const [key, value] of Object.entries(draft.values)) {\n if (meta.some((f) => f.key === key) || value === \"\") continue;\n const existing = item.fields.find((f) => f.key === key);\n if (existing) await account.updateFieldValue(api, { path: { item_id: item.id, field_id: existing.id }, body: { value } }, opts);\n else {\n const declared = definition?.fields.find((f) => f.key === key);\n await account.addField(api, { path: { item_id: item.id }, body: { field_key: key, value, handling: declared?.handling ?? \"revealable\" } }, opts);\n }\n }\n for (const s of draft.secrets) {\n if (s.label.trim() === \"\" || s.value === \"\") continue;\n await account.addField(api, { path: { item_id: item.id }, body: { field_key: fieldKeyOf(s.label), value: s.value, handling: \"revealable\" } }, opts);\n }\n for (const id of draft.removed) await account.deleteField(api, { path: { item_id: item.id, field_id: id } }, opts);\n return { item: await refetch(item.id, item.owner), notice: null };\n },\n\n get: (item) => refetch(item.id, item.owner),\n\n async remove(item): Promise<void> {\n await account.deleteItem(api, { path: { item_id: item.id } }, ctx.optsFor(item));\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { PortContext } from \"../port-context\";\nimport { HistoryChangedError, type ActivityPort, type AuditEntry, type HistoryPage } from \"./port\";\n\nconst statusOf = (e: unknown): number | undefined => {\n const s = (e as { status?: unknown } | null)?.status;\n return typeof s === \"number\" ? s : undefined;\n};\n\nexport function historyPageOf(r: account.VaultPasswordHistoryResponse): HistoryPage {\n const valuesGone = r.value_availability === \"unavailable\";\n return {\n entries: [...r.entries]\n .sort((a, b) => b.revision - a.revision)\n .map((e) => ({ fieldId: e.field_id, revision: e.revision, recordedAt: e.recorded_at, available: !valuesGone && e.value_availability !== \"unavailable\" })),\n historyRevision: r.history_revision,\n restoreAvailable: r.restore_available === true,\n captureStartedAt: r.capture_cutoff_at ?? null,\n nextBefore: r.next_before_revision ?? null,\n omitted: r.omitted_count,\n incomplete: r.incomplete || r.omitted_count > 0,\n };\n}\n\nexport function auditEntryOf(e: account.VaultAuditEntry): AuditEntry {\n return { id: e.id, action: e.action, actorId: e.actor_id ?? null, fieldId: e.user_secret_id ?? null, metadata: { ...(e.metadata ?? {}) }, at: e.created_at };\n}\n\nexport function createActivityPort(ctx: PortContext): ActivityPort {\n return {\n async history(item, before) {\n const r = await account.listPasswordHistory(ctx.api, { path: { item_id: item.id }, query: { limit: 50, before_revision: before ?? null } }, ctx.optsFor(item));\n return historyPageOf(r);\n },\n async revealHistory(item, fieldId, revision) {\n const r = await account.revealPasswordHistory(ctx.api, { path: { item_id: item.id }, body: { field_id: fieldId, revision } }, ctx.optsFor(item));\n // Never show a value the server says belongs to a different field or revision.\n if (r.item_id !== item.id || r.field_id !== fieldId || r.revision !== revision) throw new Error(\"The server answered for a different value.\");\n return r.value;\n },\n async restoreHistory(item, fieldId, revision, expectedHistoryRevision) {\n try {\n await account.restorePasswordHistory(ctx.api, { path: { item_id: item.id }, body: { field_id: fieldId, revision, expected_history_revision: expectedHistoryRevision } }, ctx.optsFor(item));\n } catch (e) {\n if (statusOf(e) === 409) throw new HistoryChangedError();\n throw e;\n }\n return ctx.refetch(item.id, item.owner);\n },\n async audit(item, limit) {\n const r = await account.listAudit(ctx.api, { path: { item_id: item.id }, query: { limit: Math.min(500, Math.max(1, limit)) } }, ctx.optsFor(item));\n return r.entries.map(auditEntryOf).sort((a, b) => b.at.localeCompare(a.at));\n },\n async addFile(item, file, details) {\n const body = new FormData();\n body.append(\"file\", file, file.name);\n body.append(\"label\", details.label);\n if (details.description) body.append(\"description\", details.description);\n body.append(\"handling\", details.handling);\n await account.addAttachment(ctx.api, { path: { item_id: item.id }, body }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async updateFile(item, attachmentId, details) {\n const body: account.VaultAttachmentUpdateRequest = {};\n if (details.label !== undefined) body[\"label\"] = details.label;\n if (details.fileName !== undefined) body[\"file_name\"] = details.fileName;\n if (details.handling !== undefined) body[\"handling\"] = details.handling;\n if (details.description !== undefined) {\n if (details.description) body[\"description\"] = details.description;\n else body[\"clear_description\"] = true;\n }\n await account.updateAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachmentId }, body }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async replaceFile(item, attachmentId, file) {\n const body = new FormData();\n body.append(\"file\", file, file.name);\n await account.replaceAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachmentId }, body }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async deleteFile(item, attachmentId) {\n await account.deleteAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachmentId } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async downloadFile(item, attachment) {\n if (attachment.handling === \"sealed\") throw new Error(\"Sealed files never download.\");\n const r = await account.downloadAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachment.id } }, ctx.optsFor(item));\n if (r instanceof Uint8Array) return r;\n if (r instanceof ArrayBuffer) return new Uint8Array(r);\n if (typeof r === \"string\") return new TextEncoder().encode(r);\n throw new Error(\"The file could not be read.\");\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport * as apps from \"@ai-matrx/api/apps\";\nimport type { PortContext } from \"../port-context\";\nimport { accountOfLabel } from \"./otpauth\";\nimport { MFA_METHOD_KEY, type AuthenticatorEntry, type AuthenticatorPort } from \"./port\";\n\nexport function entryOf(w: apps.AuthenticatorEntryOut): AuthenticatorEntry {\n return {\n itemId: w.credential_item_id,\n name: w.display_name,\n issuer: w.issuer?.trim() || null,\n account: accountOfLabel(w.label, w.issuer),\n digits: w.digits,\n period: w.period > 0 ? w.period : 30,\n algorithm: w.algorithm,\n enabled: w.enabled,\n loginUrls: w.login_urls ?? [],\n };\n}\n\nconst statusOf = (e: unknown): number | undefined => (e as { status?: unknown } | null)?.status as number | undefined;\n\nexport function createAuthenticatorPort(ctx: PortContext): AuthenticatorPort {\n const { api } = ctx;\n return {\n async list() {\n const r = await apps.listAuthenticators(api);\n return (r.entries ?? []).map(entryOf);\n },\n\n async get(item) {\n try {\n return entryOf(await apps.getAuthenticator(api, { path: { credential_item_id: item.id } }, ctx.optsFor(item)));\n } catch (e) {\n if (statusOf(e) === 404) return null;\n throw e;\n }\n },\n\n async code(item) {\n const r = await apps.getAuthenticatorCode(api, { path: { credential_item_id: item.id } }, ctx.optsFor(item));\n const period = item.authenticator?.period && item.authenticator.period > 0 ? item.authenticator.period : 30;\n return { code: r.code, periodSeconds: period, remainingSeconds: Math.max(1, Math.min(period, r.valid_for_seconds)) };\n },\n\n async enrol(item, input) {\n const raw = await apps.enroll(api, { body: { credential_item_id: item.id, enrollment_input: input.trim() } }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, raw);\n return entryOf(raw);\n },\n\n async enrolQrImage(item, image, fileName = \"qr.png\") {\n const body = new FormData();\n body.append(\"image\", image, fileName);\n const raw = await apps.enrollQr(api, { query: { credential_item_id: item.id }, body }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, raw);\n return entryOf(raw);\n },\n\n async setEnabled(item, enabled) {\n const raw = await apps.setEnabled(api, { path: { credential_item_id: item.id }, body: { enabled } }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, raw);\n return entryOf(raw);\n },\n\n async remove(item) {\n await apps.deleteAuthenticator(api, { path: { credential_item_id: item.id } }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, null);\n },\n\n async rename(item, name) {\n await account.updateItem(api, { path: { item_id: item.id }, body: { initiation: \"user\", display_name: name.trim() } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n\n async setMfaMethod(item, method) {\n const rest = item.custom.filter((c) => c.key !== MFA_METHOD_KEY).map((c) => ({ key: c.key, label: c.label, value: c.value }));\n const next = method ? [...rest, { key: MFA_METHOD_KEY, label: \"Two-factor method\", value: method }] : rest;\n await account.updateItem(api, { path: { item_id: item.id }, body: { initiation: \"user\", non_secret_fields: next } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { VaultItem } from \"../model\";\nimport type { PortContext } from \"../port-context\";\nimport type { DestinationResult, FieldsPort } from \"./port\";\n\n/** The fields client over the generated `@ai-matrx/api` only; each item's own organization header. */\nexport function createFieldsPort(ctx: PortContext): FieldsPort {\n const { api } = ctx;\n const reread = (item: VaultItem) => ctx.refetch(item.id, item.owner);\n\n return {\n async updateField(item, fieldId, patch) {\n const body: account.VaultFieldMetadataRequest = { initiation: \"user\" };\n if (patch.handling !== undefined) body.handling = patch.handling;\n if (patch.envKey !== undefined) {\n if (patch.envKey === null || patch.envKey.trim() === \"\") body.clear_env_key = true;\n else body.env_key = patch.envKey.trim();\n }\n if (patch.injectIntoSandbox !== undefined) body.inject_into_sandbox = patch.injectIntoSandbox;\n if (patch.editable !== undefined) body.editable = patch.editable;\n if (patch.description !== undefined) body.description = patch.description.trim();\n if (patch.active !== undefined) body.is_active = patch.active;\n await account.updateFieldMetadata(api, { path: { item_id: item.id, field_id: fieldId }, body }, ctx.optsFor(item));\n return reread(item);\n },\n\n async setValue(item, fieldId, value) {\n await account.updateFieldValue(api, { path: { item_id: item.id, field_id: fieldId }, body: { initiation: \"user\", value } }, ctx.optsFor(item));\n return reread(item);\n },\n\n async addField(item, input) {\n const envKey = input.envKey?.trim() || null;\n await account.addField(\n api,\n {\n path: { item_id: item.id },\n body: {\n field_key: input.key,\n value: input.value,\n handling: input.handling,\n env_key: envKey,\n // Never an impossible combination: without an env key a sandbox could never see it.\n inject_into_sandbox: Boolean(input.injectIntoSandbox && envKey),\n ...(input.description ? { description: input.description } : {}),\n },\n },\n ctx.optsFor(item),\n );\n return reread(item);\n },\n\n async removeField(item, fieldId) {\n await account.deleteField(api, { path: { item_id: item.id, field_id: fieldId } }, ctx.optsFor(item));\n return reread(item);\n },\n\n async rotate(item, values) {\n await account.rotate(api, { path: { item_id: item.id }, body: { initiation: \"user\", values } }, ctx.optsFor(item));\n return reread(item);\n },\n\n async updateItem(item, patch) {\n const body: account.VaultItemUpdateRequest = { initiation: \"user\" };\n if (patch.uriMatchMode !== undefined) body.uri_match_mode = patch.uriMatchMode;\n if (patch.browserFillEnabled !== undefined) body.browser_fill_enabled = patch.browserFillEnabled;\n if (patch.loginUrls !== undefined) body.login_urls = patch.loginUrls;\n await account.updateItem(api, { path: { item_id: item.id }, body }, ctx.optsFor(item));\n return reread(item);\n },\n\n async checkDestination(url, item): Promise<DestinationResult> {\n const r = await account.checkDestination(api, { body: { initiation: \"user\", url } }, item ? ctx.optsFor(item) : undefined);\n return { normalizedUrl: r.normalized_url, state: r.state, httpStatus: r.http_status ?? null };\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { PortContext } from \"../port-context\";\nimport type { IoPort } from \"./port\";\n\nconst orgOpts = (organizationId: string | null) => (organizationId ? { organizationId } : undefined);\n\n/** A download the server answered with text (the CSV) or bytes (the backup). */\nfunction asText(answer: unknown): string {\n if (typeof answer === \"string\") return answer;\n if (answer instanceof Uint8Array) return new TextDecoder().decode(answer);\n throw new Error(\"The server's answer could not be read as a file.\");\n}\n\nfunction asBytes(answer: unknown): Uint8Array<ArrayBuffer> {\n if (answer instanceof Uint8Array) return new Uint8Array(answer);\n throw new Error(\"The server's answer could not be read as a file.\");\n}\n\nexport function createIoPort(ctx: PortContext): IoPort {\n const { api } = ctx;\n return {\n async createImported(body, organizationId, idempotencyKey) {\n const w = await account.createItem(api, { body: { ...body, initiation: \"user\" } }, { ...orgOpts(organizationId), headers: { \"Idempotency-Key\": idempotencyKey } });\n return { id: w.id, name: w.display_name };\n },\n\n async importEnv(envText, organizationId, injectIntoSandbox) {\n const principal = organizationId ? ({ type: \"organization\", organization_id: organizationId } as const) : ({ type: \"user\" } as const);\n const list = await account.importEnv(api, { body: { env_text: envText, inject_into_sandbox: injectIntoSandbox, principal, initiation: \"user\" } }, orgOpts(organizationId));\n return list.items.map((w) => ({ id: w.id, name: w.display_name }));\n },\n\n previewLoginCsv: (profile, itemIds) => account.previewLoginCsv(api, { body: { profile, item_ids: [...itemIds] } }),\n\n async downloadLoginCsv(profile, itemIds, revision) {\n return asText(await account.downloadLoginCsv(api, { body: { profile, item_ids: [...itemIds], revision } }));\n },\n\n previewBackup: (itemIds) => account.previewVaultBackup(api, { body: { item_ids: [...itemIds] } }),\n\n async downloadBackup({ itemIds, revision, passphrase, acceptOmissions }) {\n return asBytes(await account.downloadVaultBackup(api, { body: { item_ids: [...itemIds], revision, passphrase, accept_omissions: acceptOmissions } }));\n },\n\n previewRestore: (envelopeBase64, passphrase) => account.previewVaultRestore(api, { body: { envelope_base64: envelopeBase64, passphrase } }),\n\n restoreBackup: ({ envelopeBase64, passphrase, preview, restoreRunId, acceptOmissions }) =>\n account.restoreVaultBackup(api, {\n body: {\n envelope_base64: envelopeBase64,\n passphrase,\n expected_digest: preview.envelope_digest,\n preview_actor_id: preview.actor_id,\n preview_organization_id: preview.organization_id,\n restore_run_id: restoreRunId,\n accept_omissions: acceptOmissions,\n },\n }),\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { VaultItem } from \"../model\";\nimport type { PortContext } from \"../port-context\";\nimport { ENTITY_TYPE, favoriteIds, parseRecoveryPreview, recentIds, refusalText } from \"./logic\";\nimport type { ListsPort, VaultUserStateDoor } from \"./port\";\n\nasync function call(door: VaultUserStateDoor, fn: string, args?: Record<string, unknown>): Promise<unknown> {\n const { data, error } = await door.rpc(fn, args);\n if (error) throw new Error(error.message || `${fn} failed`);\n return data;\n}\n\n/** `door` is the host's per-person state door; without it favorites and recents are absent. */\ntype TrashRow = { entity_token?: unknown; id?: unknown; title?: unknown; label?: unknown; deleted_at?: unknown; organization_id?: unknown; is_mine?: unknown };\n\n/** A Trash row in the screens' shape: enough to list, search and restore it — nothing secret. */\nfunction trashItem(r: TrashRow, ctx: PortContext): VaultItem | null {\n if (r.entity_token !== \"credential_item\" || typeof r.id !== \"string\") return null;\n const org = typeof r.organization_id === \"string\" ? r.organization_id : null;\n return {\n id: r.id,\n name: typeof r.title === \"string\" && r.title ? r.title : \"Untitled\",\n description: \"\",\n definitionKey: \"custom\",\n definitionLabel: \"Credential\",\n owner: org ? { kind: \"organization\", label: ctx.organizations().find((o) => o.id === org)?.name ?? \"Organization\", organizationId: org } : { kind: r.is_mine === false ? \"shared\" : \"me\", label: r.is_mine === false ? \"Shared with me\" : \"Personal\", organizationId: null },\n tags: [],\n loginUrls: [],\n notes: \"\",\n fields: [],\n custom: [],\n authenticator: null,\n capabilities: { canUse: false, canEdit: false, canReveal: false, canManage: true },\n attachments: [],\n uriMatchMode: \"host\",\n browserFillEnabled: false,\n accessMode: null,\n ownerUserId: null,\n deletion: { deletionId: null, deletedAt: typeof r.deleted_at === \"string\" ? r.deleted_at : null },\n updatedAt: typeof r.deleted_at === \"string\" ? r.deleted_at : \"\",\n createdAt: \"\",\n };\n}\n\nconst previewOf = async (door: VaultUserStateDoor, id: string) => parseRecoveryPreview(await call(door, \"vault_recovery_preview\", { p_id: id }));\n\nexport function createListsPort(ctx: PortContext, door?: VaultUserStateDoor): ListsPort {\n return {\n async restore(item, knownDeletionId) {\n // A Trash row carries no recovery id; the recovery preview names it (metadata only, never values).\n let deletionId = knownDeletionId ?? item.deletion?.deletionId ?? null;\n if (!deletionId && door) {\n const p = await previewOf(door, item.id);\n if (!p.supported) throw new Error(refusalText(p.reason));\n deletionId = p.deletionId;\n }\n if (!deletionId) throw new Error(\"This item has no recovery record, so it can't be restored.\");\n const r = await account.restoreItem(ctx.api, { path: { item_id: item.id }, body: { deletion_id: deletionId, initiation: \"user\" } }, ctx.optsFor(item));\n return {\n item: await ctx.refetch(item.id, item.owner),\n restoredFields: r.restored_fields,\n restoredAttachments: r.restored_attachments,\n restoredPasskeys: r.restored_native_passkeys,\n alreadyRestored: r.already_restored,\n };\n },\n ...(door\n ? {\n preview: (item: VaultItem) => previewOf(door, item.id),\n trash: {\n list: async () => {\n // Every page: a list treated as complete is never read as one capped page.\n const PAGE = 500;\n const all: TrashRow[] = [];\n for (let offset = 0; ; offset += PAGE) {\n const rows = ((await call(door, \"trash_list\", { p_kinds: [\"credential_item\"], p_limit: PAGE, p_offset: offset })) as TrashRow[] | null) ?? [];\n all.push(...rows);\n if (rows.length < PAGE) break;\n }\n const items = all.map((r) => trashItem(r, ctx)).filter((i): i is VaultItem => i !== null);\n return [...new Map(items.map((i) => [i.id, i])).values()];\n },\n },\n favorites: {\n list: async () => favoriteIds(await call(door, \"ues_list\", { p_kind: \"favorite\" })),\n set: async (itemId: string, on: boolean) => {\n await call(door, \"ues_set\", { p_entity_type: ENTITY_TYPE, p_entity_id: itemId, p_is_favorite: on });\n },\n },\n recents: {\n list: async () => recentIds(await call(door, \"ues_list\")),\n record: async (itemId: string) => {\n await call(door, \"ues_touch\", { p_entity_type: ENTITY_TYPE, p_entity_id: itemId });\n },\n },\n }\n : {}),\n };\n}\n","import { isAuthenticatorStorage } from \"../model\";\n/** The sharing client: every call is the generated `@ai-matrx/api` one, with the item's own org header. */\nimport * as account from \"@ai-matrx/api/account\";\nimport { fieldKeyOf, type VaultOwner } from \"../model\";\nimport type { PortContext } from \"../port-context\";\nimport type { VaultUserStateDoor } from \"../lists/port\";\nimport { flagsOf, levelOf } from \"./logic\";\nimport type { EffectiveVaultAccess, MemberVaultAccess, SecureChannel, SharingPort, ShareGrant, VaultDestination } from \"./port\";\nimport { NOTE_MAX, SECURE_RESOURCE_TYPE, sentRowOf } from \"./secure-link-logic\";\n\nfunction grantOf(w: account.VaultGrantOut): ShareGrant {\n const org = Boolean(w.organization_id);\n return {\n id: w.id,\n kind: org ? \"organization\" : \"person\",\n label: org ? w.organization_name || \"Organization\" : w.email || w.user_id || \"Someone\",\n userId: w.user_id ?? null,\n organizationId: w.organization_id ?? null,\n level: levelOf(w),\n createdAt: w.created_at,\n };\n}\n\nconst MEMBER_ACCESS: readonly MemberVaultAccess[] = [\"none\", \"use\", \"editor\"];\nconst memberAccessOf = (v: unknown): MemberVaultAccess | null => MEMBER_ACCESS.find((a) => a === v) ?? null;\nconst effectiveOf = (v: unknown): EffectiveVaultAccess => (v === \"admin\" ? \"admin\" : memberAccessOf(v) ?? \"none\");\n\nconst notMovedOf = (w: unknown): string[] => {\n const v = (w as { fields_not_transferred?: unknown } | null)?.fields_not_transferred;\n return Array.isArray(v) ? v.filter((k): k is string => typeof k === \"string\") : [];\n};\n\nexport interface SharingPortOptions {\n /**\n * The host's database door on the `platform` schema (`supabase.schema(\"platform\")`). It is the only\n * way to read the links a person sent (`secure_delivery_sent`, their own rows) and the recipient's\n * texting-consented mobile (`secure_delivery_recipient_phone`); the API has no route for either.\n * Without it the \"Sent\" list and the mobile pre-fill are absent; sending and turning off still work.\n */\n platformDoor?: VaultUserStateDoor;\n}\n\nconst channelOf = (v: unknown): SecureChannel => (v === \"sms\" ? \"sms\" : \"email\");\n\nasync function rpc(door: VaultUserStateDoor, fn: string, args: Record<string, unknown>): Promise<unknown> {\n const { data, error } = await door.rpc(fn, args);\n if (error) throw new Error(error.message || `${fn} failed`);\n return data;\n}\n\nexport function createSharingPort(ctx: PortContext, options: SharingPortOptions = {}): SharingPort {\n const { api } = ctx;\n const door = options.platformDoor;\n const ownerAt = (to: VaultDestination): VaultOwner =>\n to ? { kind: \"organization\", label: ctx.organizations().find((o) => o.id === to)?.name ?? \"Organization\", organizationId: to } : { kind: \"me\", label: \"Personal\", organizationId: null };\n const principal = (to: VaultDestination) => (to ? { type: \"organization\" as const, organization_id: to } : { type: \"user\" as const });\n\n return {\n async grants(item) {\n const r = await account.listGrants(api, { path: { item_id: item.id } }, ctx.optsFor(item));\n return r.grants.map(grantOf);\n },\n\n async addPerson(item, email, level) {\n const w = await account.addGrant(api, { path: { item_id: item.id }, body: { recipient_email: email.trim(), ...flagsOf(level), initiation: \"user\" } }, ctx.optsFor(item));\n return grantOf(w);\n },\n\n async addOrganization(item, organizationId, level) {\n const w = await account.addOrganizationGrant(api, { path: { item_id: item.id }, body: { organization_id: organizationId, can_manage: level === \"edit\", initiation: \"user\" } }, ctx.optsFor(item));\n return grantOf(w);\n },\n\n async setLevel(item, grant, level) {\n const w = await account.updateGrant(api, { path: { item_id: item.id, grant_id: grant.id }, body: { ...flagsOf(level), initiation: \"user\" } }, ctx.optsFor(item));\n return grantOf(w);\n },\n\n async revoke(item, grant) {\n await account.removeGrant(api, { path: { item_id: item.id, grant_id: grant.id } }, ctx.optsFor(item));\n },\n\n async setAccessMode(item, mode, people) {\n const grantees = mode === \"restricted\" ? people.filter((g) => g.kind === \"person\" && g.userId).map((g) => ({ user_id: g.userId as string, ...flagsOf(g.level) })) : [];\n await account.share(api, { path: { item_id: item.id }, body: { access_mode: mode, grantees, initiation: \"user\" } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n\n async memberAccess(organizationId) {\n const r = await account.listMemberAccess(api, { path: { organization_id: organizationId } }, { organizationId });\n return {\n organizationId: r.organization_id,\n defaultAccess: memberAccessOf(r.default_access) ?? \"none\",\n members: r.members.map((m) => ({ userId: m.user_id, email: m.email ?? \"\", role: m.role, access: memberAccessOf(m.vault_access), effective: effectiveOf(m.effective_access) })),\n };\n },\n\n async setMemberAccess(organizationId, userId, access) {\n const r = await account.setMemberAccess(api, { path: { organization_id: organizationId, member_user_id: userId }, body: { access, initiation: \"user\" } }, { organizationId });\n return effectiveOf(r.effective_access);\n },\n\n async move(item, to) {\n const w = await account.transfer(api, { path: { item_id: item.id }, body: { to_principal: principal(to), initiation: \"user\" } }, ctx.optsFor(item));\n const owner = ownerAt(to);\n return { item: await ctx.refetch(item.id, owner), notMoved: notMovedOf(w) };\n },\n\n async giveOwnership(item, email) {\n const w = await account.transfer(api, { path: { item_id: item.id }, body: { recipient_email: email.trim(), initiation: \"user\" } }, ctx.optsFor(item));\n const to = (w as account.VaultTransferResponse).transferred_to;\n return { recipientEmail: to?.[\"email\"] ?? email.trim(), notMoved: notMovedOf(w) };\n },\n\n async copy(item, to) {\n const w = await account.fork(api, { path: { item_id: item.id }, body: { to_principal: principal(to), initiation: \"user\" } }, ctx.optsFor(item));\n return ctx.refetch(w.id, ownerAt(to));\n },\n\n async assign({ recipientEmail, definition, draft, generateFieldKey }) {\n const encrypted = definition.fields.filter((f) => f.storage === \"encrypted\" && f.key !== generateFieldKey && (draft.values[f.key] ?? \"\") !== \"\");\n const meta = definition.fields.filter((f) => f.storage === \"metadata\" && (draft.values[f.key] ?? \"\") !== \"\");\n const r = await account.assignToRecipient(api, {\n body: {\n recipient_email: recipientEmail.trim(),\n display_name: draft.name.trim(),\n ...(draft.description.trim() ? { description: draft.description.trim() } : {}),\n definition_key: definition.key,\n provider_key: definition.providerKey,\n tags: draft.tags,\n login_urls: draft.loginUrls,\n notes: draft.notes || null,\n generate_field_key: generateFieldKey,\n initiation: \"user\",\n non_secret_fields: [...meta.map((f) => ({ key: f.key, label: f.label, value: draft.values[f.key] ?? \"\" })), ...draft.custom.filter((c) => c.label.trim() !== \"\").map((c) => ({ key: c.key || fieldKeyOf(c.label), label: c.label, value: c.value }))],\n fields: [\n ...encrypted.map((f) => ({ field_key: f.key, value: draft.values[f.key] ?? \"\", handling: f.handling })),\n ...draft.secrets.filter((s) => s.label.trim() !== \"\" && s.value !== \"\").map((s) => ({ field_key: fieldKeyOf(s.label), value: s.value, handling: \"revealable\" as const })),\n ],\n },\n });\n return { id: r.id, name: r.display_name, recipientEmail: r.assigned_to?.[\"email\"] ?? recipientEmail.trim(), generated: r.generated === true };\n },\n\n async secureLinkOptions(item) {\n const r = await account.secureDeliveryOptions(api, { query: { resource_type: SECURE_RESOURCE_TYPE, resource_id: item.id } }, ctx.optsFor(item));\n return {\n // The authenticator's own storage is the one-time password, never a field to send.\n fields: r.protected_fields.filter((f) => !isAuthenticatorStorage(f.key)).map((f) => ({ key: f.key, label: f.label, available: f.available, reason: f.reason ?? null })),\n linkMinutes: r.link_ttl_minutes,\n codeMinutes: r.code_ttl_minutes,\n };\n },\n\n async sendSecureLink(item, input) {\n const email = input.email.trim();\n const phone = input.phone?.trim() || null;\n const name = input.name?.trim() || null;\n const note = input.note?.trim().slice(0, NOTE_MAX) || null;\n const r = await account.createSecureDelivery(api, {\n body: {\n resource_type: SECURE_RESOURCE_TYPE,\n resource_id: item.id,\n recipient_email: email || null,\n recipient_phone: phone,\n recipient_name: name,\n field_keys: [...input.fieldKeys],\n link_channel: email && phone ? input.linkBy : null,\n note,\n initiation: \"user\",\n },\n }, ctx.optsFor(item));\n return { id: r.delivery_id, linkBy: channelOf(r.link_channel), codeBy: channelOf(r.code_channel), sameChannel: r.same_channel, expiresAt: r.expires_at, fieldKeys: r.field_keys, sentence: r.sentence };\n },\n\n async revokeSecureLink(item, deliveryId) {\n const r = await account.revokeSecureDelivery(api, { path: { delivery_id: deliveryId } }, ctx.optsFor(item));\n return r.sentence;\n },\n\n ...(door\n ? {\n async sentSecureLinks(item) {\n const rows = await rpc(door, \"secure_delivery_sent\", { p_resource_type: SECURE_RESOURCE_TYPE, p_resource_id: item.id });\n return (Array.isArray(rows) ? rows : []).map(sentRowOf).filter((r): r is NonNullable<typeof r> => r !== null);\n },\n async phoneOnFile(email) {\n const v = await rpc(door, \"secure_delivery_recipient_phone\", { p_email: email.trim() });\n return typeof v === \"string\" && v !== \"\" ? v : null;\n },\n }\n : {}),\n };\n}\n\n","/**\n * The devices client over generated `@ai-matrx/api`, plus the browser half of ONE passkey ceremony:\n * ask the auth server for a challenge (the host's `auth`), have the browser's authenticator sign it,\n * and hand the signed assertion to aidream, which gives it to the auth server's verifier. The\n * assertion never goes to the auth server from here, so no new sign-in is created in this tab.\n */\nimport * as account from \"@ai-matrx/api/account\";\nimport type { PortContext } from \"../port-context\";\nimport { PASSKEY_RP_ID, addPasskeyFailure, passkeyFailure, passkeysWorkOn, requestOptions, serializeAssertion, type RequestOptionsJSON } from \"./logic\";\nimport type { DevicesPort, FillApprovalRequest, FillDevice, FillPasskeys, PasskeyAuthLike } from \"./port\";\n\nconst deviceOf = (w: account.VaultFillDeviceOut): FillDevice => ({\n id: w.id,\n label: w.label,\n origin: w.extension_origin ?? null,\n addedAt: w.registered_at ?? null,\n lastUsedAt: w.last_used_at ?? null,\n revokedAt: w.revoked_at ?? null,\n revokeReason: w.revoke_reason ?? null,\n keyThumbprint: w.key_thumbprint,\n});\n\nfunction createPasskeys(ctx: PortContext, auth: PasskeyAuthLike, rpId: string): FillPasskeys {\n return {\n rpId,\n available: () => typeof window !== \"undefined\" && passkeysWorkOn(window.location.hostname, typeof window.PublicKeyCredential !== \"undefined\", rpId),\n\n async approve(request: FillApprovalRequest) {\n const { data, error } = await auth.passkey.startAuthentication();\n if (error || !data) throw new Error(\"Your passkey could not start. Try again in a moment.\");\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.get({ publicKey: requestOptions(data.options as RequestOptionsJSON) });\n } catch (e) {\n throw new Error(passkeyFailure(e instanceof DOMException ? e.name : \"\"));\n }\n if (!credential || !(credential instanceof PublicKeyCredential)) throw new Error(\"No passkey was chosen, so nothing was approved.\");\n const r = await account.approveFillDevice(ctx.api, {\n body: {\n key_thumbprint: request.keyThumbprint,\n label: request.label,\n device_kind: request.kind,\n challenge_id: data.challenge_id,\n credential: serializeAssertion(credential as PublicKeyCredential & { response: AuthenticatorAssertionResponse }),\n initiation: \"user\",\n },\n });\n return { expiresAt: r.expires_at };\n },\n\n async add() {\n const { error } = await auth.registerPasskey();\n if (error) throw new Error(addPasskeyFailure(error.message));\n },\n };\n}\n\n/** `auth` is the host's `supabase.auth`; without it the passkey half is absent and its controls hide. */\nexport function createDevicesPort(ctx: PortContext, auth?: PasskeyAuthLike, rpId = PASSKEY_RP_ID): DevicesPort {\n const port: DevicesPort = {\n async list() {\n const r = await account.listFillDevices(ctx.api);\n return r.devices.map(deviceOf);\n },\n async revoke(deviceId) {\n return deviceOf(await account.revokeFillDevice(ctx.api, { path: { device_id: deviceId } }));\n },\n stepUpMethods: () => account.fillDeviceStepUpMethods(ctx.api),\n async register(reg) {\n const w = await account.registerFillDevice(ctx.api, {\n body: { public_key_jwk: reg.publicKeyJwk, label: reg.label, extension_origin: reg.origin, password: reg.password, initiation: \"user\" },\n });\n return deviceOf(w);\n },\n };\n if (auth) port.passkeys = createPasskeys(ctx, auth, rpId);\n return port;\n}\n","import type { Api } from \"@ai-matrx/api\";\nimport * as account from \"@ai-matrx/api/account\";\n\n/** What the server will take from a passkey exchange file. */\nexport interface NativeImportLimits {\n maxFileBytes: number;\n maxItems: number;\n}\n\n/** The server's passkey-import limits. It also proves the person's organization can import at all. */\nexport async function readNativeImportLimits(api: Api, organizationId: string): Promise<NativeImportLimits> {\n const c = await account.importCapabilities(api, undefined, { organizationId });\n return { maxFileBytes: c.max_file_bytes, maxItems: c.max_transfer_items };\n}\n","import { createKnobReader, type KnobClient } from \"@ai-matrx/data/knobs\";\n\n/**\n * THE organization settings the vault obeys (`vault.generator.*`, `vault.import.*`): every limit is\n * a knob an organization sets, never a number in this package. Hosts build it once over their own\n * Supabase client; one round trip, then lookups.\n */\nexport type VaultKnobs = () => Promise<Readonly<Record<string, unknown>>>;\n\nconst FRESH_MS = 60_000;\n\nexport function createVaultKnobs(client: KnobClient, address: { organizationId: string; userId: string }): VaultKnobs {\n const reader = createKnobReader(client);\n let kept: { at: number; resolved: Readonly<Record<string, unknown>> } | null = null;\n return async () => {\n if (kept && Date.now() - kept.at < FRESH_MS) return kept.resolved;\n const snap = await reader.snapshot(address);\n kept = { at: Date.now(), resolved: snap.resolved };\n return snap.resolved;\n };\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","Button","SearchField","Select","confirm","timer","message","useCallback","useEffect","useRef","useState","Button","Badge","createContext","useContext","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","Ctx","createContext","useContext","useState","useRef","resolve","account","useEffect","useEffect","useState","Button","Field","cn","useCallback","useEffect","useRef","useState","timer","createContext","useContext","Dialog","DialogContent","DialogHeader","DialogTitle","cn","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","toggle","Button","cn","Field","storage","str","useEffect","useRef","useState","Button","cn","jsx","jsxs","useState","useRef","useEffect","Button","cn","Fragment","jsx","jsxs","MASK","useState","useRef","useCallback","useEffect","Button","toggle","Badge","useEffect","useState","Button","cn","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","useState","Button","Field","Select","useEffect","useRef","useState","Button","cn","siteOf","jsx","jsxs","cn","useState","useRef","useEffect","Button","useEffect","useRef","useState","useState","useRef","useEffect","useEffect","useRef","useState","Button","Field","Fragment","jsx","jsxs","useState","useEffect","useRef","timer","Button","Field","useState","Button","confirm","Fragment","jsx","jsxs","useState","confirm","Button","Fragment","jsx","jsxs","useState","Button","Select","Field","Fragment","jsx","jsxs","useState","useEffect","familyOf","Button","cn","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","useRef","useState","Badge","Button","Field","Select","confirm","jsx","jsxs","useState","Button","useRef","confirm","Badge","Field","Select","createContext","useContext","useEffect","useRef","useState","cn","Button","SegmentedControl","Select","Switch","jsx","jsxs","createContext","resolve","useContext","MASK","useState","useRef","ceilings","useEffect","Button","SegmentedControl","cn","Switch","Select","useEffect","useRef","useState","Button","Field","SegmentedControl","Switch","confirm","resolve","useState","Badge","Button","DisclosureHeader","Fragment","jsx","jsxs","message","Fragment","jsx","jsxs","Switch","useRef","useState","useEffect","bytes","confirm","Button","SegmentedControl","Field","useState","Button","Select","downloadFile","confirm","Fragment","jsx","jsxs","omissionText","useState","confirm","downloadFile","Button","Select","useEffect","useMemo","useRef","useState","Button","Select","Switch","Textarea","invalid","BlobReader","ZipReader","bytes","bytes","createCsvImportWorker","resolve","resolve","timer","Fragment","jsx","jsxs","useRef","useState","useEffect","useMemo","importEnv","Button","Select","Textarea","Switch","useEffect","useRef","useState","DropdownMenu","DropdownMenuContent","DropdownMenuTrigger","cn","Button","cn","jsx","cn","useEffect","useMemo","useRef","useState","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","cn","Button","Select","Switch","confirm","useRef","useState","Badge","Button","Field","SegmentedControl","cn","confirm","downloadFile","Fragment","jsx","jsxs","messageOf","useState","useRef","bytes","downloadFile","cn","Button","Badge","confirm","SegmentedControl","Field","useState","Badge","Button","Textarea","Fragment","jsx","jsxs","MASK","say","useState","Button","Textarea","toggle","Badge","normalizeLoginUrl","same","useState","Button","jsx","useState","Button","useEffect","useState","confirm","Button","DisclosureHeader","Field","Select","cn","message","useState","cn","jsx","jsxs","useState","cn","useState","confirm","Button","Field","Select","jsx","jsxs","useState","confirm","Button","Select","Field","Fragment","jsx","jsxs","useState","useEffect","confirm","Button","Select","Field","DisclosureHeader","cn","Fragment","jsx","jsxs","useState","useMemo","useRef","useEffect","notice","confirm","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","cn","Select","Switch","jsx","jsxs","SORTS","useRef","useEffect","familyOf","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","useState","cn","useState","Button","matchesQuery","useEffect","useState","Button","Fragment","jsx","jsxs","useState","useEffect","Button","jsx","jsxs","useState","message","matchesQuery","Button","useMemo","useState","cn","Button","Field","SearchField","jsx","jsxs","useState","useMemo","Button","Field","cn","SearchField","useEffect","useRef","useState","confirm","Checkbox","Badge","Button","Field","RegionSkeleton","SegmentedControl","Textarea","str","jsx","jsxs","useState","useEffect","useRef","timer","confirm","toggle","jsxs","jsx","Badge","Button","Field","SegmentedControl","RegionSkeleton","Checkbox","Textarea","useCallback","useEffect","useState","confirm","Button","RegionSkeleton","bytes","message","Fragment","jsx","jsxs","messageOf","ErrorLine","useState","useCallback","useEffect","confirm","Button","RegionSkeleton","useEffect","useMemo","useState","confirm","Badge","Button","Select","plural","useEffect","useRef","useState","useState","useRef","timer","message","confirm","useEffect","Fragment","jsx","jsxs","Button","useMemo","useState","useEffect","confirm","plural","Select","Badge","useState","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","Button","useState","useSyncExternalStore","Button","SearchField","Fragment","jsx","jsxs","useSyncExternalStore","useState","Button","SearchField","useRef","useState","useSyncExternalStore","Button","Field","jsx","jsxs","useSyncExternalStore","useRef","useState","Field","Button","useState","Popover","PopoverContent","PopoverTrigger","Button","Fragment","jsx","jsxs","useState","say","value","Button","Popover","PopoverTrigger","PopoverContent","jsx","jsxs","useState","familyOf","Button","normalizeLoginUrl","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","useState","cn","Select","jsx","jsxs","Select","favoriteIds","recentIds","count","cn","useState","jsx","jsxs","useState","useEffect","useRef","useCallback","confirm","useMemo","Select","DropdownMenu","DropdownMenuTrigger","Button","DropdownMenuContent","DropdownMenuItem","SearchField","panel","message","account","apps","account","statusOf","account","account","account","PAGE","account","account","account","MATCH_MODES","a","fieldKey","r"]}
|
|
1
|
+
{"version":3,"sources":["../src/io/csv-import-worker-client.ts","../src/io/bitwarden-json-worker-client.ts","../src/io/onepux-worker-client.ts","../src/io/proton-pass-worker-client.ts","../src/io/keepass-xml-worker-client.ts","../src/VaultApp.tsx","../src/notice.tsx","../src/activity/HistoryPanel.tsx","../src/auth/IdentityGate.tsx","../src/glyphs.tsx","../src/auth/identity.ts","../src/FieldRows.tsx","../src/hooks.ts","../src/ui.tsx","../src/activity/logic.ts","../src/model.ts","../src/definitions.ts","../src/activity/port.ts","../src/activity/ActivityPanel.tsx","../src/authenticator/AuthenticatorView.tsx","../src/authenticator/AddOtpPanel.tsx","../src/authenticator/CodeParts.tsx","../src/authenticator/otpauth.ts","../src/authenticator/live-code.ts","../src/authenticator/Setup.tsx","../src/authenticator/qr.ts","../src/authenticator/TotpRows.tsx","../src/authenticator/port.ts","../src/fields/SettingsPanels.tsx","../src/fields/rules.ts","../src/generator/PasswordGenerator.tsx","../src/generator/generate.ts","../src/io/csv-import-limits.ts","../src/io/BackupPanel.tsx","../src/io/backup-file.ts","../src/io/lines.tsx","../src/io/ExportPanel.tsx","../src/io/ImportPanel.tsx","../src/io/csv-import.ts","../src/io/loopback.ts","../src/io/import-run.ts","../src/io/structured-import.ts","../src/io/import-review.ts","../src/io/import-source.ts","../src/io/bounded-zip.ts","../src/io/dashlane-csv-archive.ts","../src/io/csv-import-file.ts","../src/io/structured-import-source-registry.ts","../src/io/structured-import-worker-protocol.ts","../src/io/parse-source.ts","../src/ItemList.tsx","../src/ItemIcon.tsx","../src/ItemPane.tsx","../src/activity/FilesSection.tsx","../src/fields/RecoveryCodesRow.tsx","../src/draft-keep.ts","../src/extension/page-logic.ts","../src/extension/UseOnSiteButton.tsx","../src/sharing/SharePanel.tsx","../src/sharing/logic.ts","../src/sharing/parts.tsx","../src/sharing/MovePanel.tsx","../src/lists/TrashView.tsx","../src/lists/logic.ts","../src/lists/RestorePanel.tsx","../src/NewItemFlow.tsx","../src/sharing/SecureLinkPanel.tsx","../src/sharing/secure-link-logic.ts","../src/devices/DevicesPanel.tsx","../src/devices/logic.ts","../src/native/NativeImportPanel.tsx","../src/native/logic.ts","../src/native/use-native-import.ts","../src/extension/PageView.tsx","../src/extension/CaptureCard.tsx","../src/extension/FillSetupCard.tsx","../src/extension/PageGenerator.tsx","../src/Sidebar.tsx","../src/api-port.ts","../src/activity/api.ts","../src/authenticator/api.ts","../src/fields/api.ts","../src/io/api.ts","../src/lists/api.ts","../src/sharing/api.ts","../src/devices/api.ts","../src/native/api.ts","../src/knobs.ts"],"sourcesContent":["/** Kept out of csv-import.ts so the non-worker import path stays testable. */\nexport function createCsvImportWorker(): Worker {\n return new Worker(new URL(\"./csv-import.worker.ts\", import.meta.url), { type: \"module\" });\n}\n","/** Kept out of the dialog module so the non-worker import path stays testable. */\nexport function createBitwardenJsonWorker(): Worker {\n return new Worker(new URL(\"./bitwarden-json.worker.ts\", import.meta.url), { type: \"module\" });\n}\n\nexport function cancelBitwardenJsonWorker(\n worker: Worker,\n requestId: string,\n): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","export function createOnePuxWorker(): Worker {\n return new Worker(new URL(\"./onepux.worker.ts\", import.meta.url), { type: \"module\" });\n}\n\n/** Abort an in-flight parse before the caller terminates or replaces its worker. */\nexport function cancelOnePuxWorker(worker: Worker, requestId: string): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","export function createProtonPassWorker(): Worker {\n return new Worker(new URL(\"./proton-pass.worker.ts\", import.meta.url), { type: \"module\" });\n}\nexport function cancelProtonPassWorker(\n worker: Worker,\n requestId: string,\n): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","/** Kept out of the dialog module so the worker boundary remains independently testable. */\nexport function createKeePassXmlWorker(): Worker {\n return new Worker(new URL(\"./keepass-xml.worker.ts\", import.meta.url), { type: \"module\" });\n}\n\nexport function cancelKeePassXmlWorker(\n worker: Worker,\n requestId: string,\n): void {\n worker.postMessage({ type: \"cancel\", requestId });\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { Button, SearchField, Select } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { ActivityPanel, HistoryPanel } from \"./activity/HistoryPanel\";\nimport type { ItemPanelProps } from \"./area-props\";\nimport { IdentityGate } from \"./auth/IdentityGate\";\nimport { AuthenticatorView } from \"./authenticator/AuthenticatorView\";\nimport { inferFromUrl } from \"./definitions\";\nimport { FieldSettingsPanel, ItemSettingsPanel } from \"./fields/SettingsPanels\";\nimport { GeneratorLimitsProvider, type GeneratorLimitsSource } from \"./generator/PasswordGenerator\";\nimport { importLimitsFrom, type ImportLimits } from \"./io/csv-import-limits\";\nimport type { VaultKnobs } from \"./knobs\";\nimport { Empty, Panel } from \"./ui\";\nimport { useElementWidth } from \"./hooks\";\nimport { BackupPanel, ExportPanel, ImportPanel } from \"./io/IoPanels\";\nimport { ItemList } from \"./ItemList\";\nimport { ItemPane } from \"./ItemPane\";\nimport { TrashView } from \"./lists/TrashView\";\nimport { DEFAULT_LOCATION, inVault, inView, matchesQuery, sortItems, type VaultItem, type VaultLocation } from \"./model\";\nimport { NewItemFlow } from \"./NewItemFlow\";\nimport { NoticeProvider, useNotify, type Notify } from \"./notice\";\nimport type { VaultHostCapabilities, VaultPort, VaultSnapshot } from \"./port\";\nimport { MovePanel, SharePanel } from \"./sharing/SharePanel\";\nimport { SecureLinkPanel } from \"./sharing/SecureLinkPanel\";\nimport { ApprovePanel, approvalFromParams, DevicesPanel } from \"./devices/DevicesPanel\";\nimport { NativeImportPanel } from \"./native/NativeImportPanel\";\nimport { PageView } from \"./extension/PageView\";\nimport { buildViews, itemCategory, Sidebar, vaultChoices, VaultSelect, viewLabel, viewOptions } from \"./Sidebar\";\nimport { ExportGlyph, ImportGlyph, MoreGlyph, SafeGlyph, ShieldGlyph } from \"./glyphs\";\n\nexport type VaultLayout = \"auto\" | \"full\" | \"split\" | \"stack\";\n\nexport interface VaultAppProps {\n port: VaultPort;\n host?: VaultHostCapabilities;\n /** `auto` picks by the room the workspace is given: a side panel stacks, a window shows three panes. */\n layout?: VaultLayout;\n /**\n * Everything the address carries: vault, view, search, sort, the open item, edit/new, the new-item\n * address, the open panel. Controlled when given (the host writes it to the URL); the workspace\n * keeps its own copy when not. `push` = a step the Back button should undo; `replace` = typing.\n */\n location?: VaultLocation;\n onLocationChange?: (next: VaultLocation, how: \"push\" | \"replace\") => void;\n /** The host's own toasts; without it the vault shows its own short notices. */\n notify?: Notify;\n}\n\nconst FULL_AT = 960;\nconst SPLIT_AT = 640;\nconst NO_HOST: VaultHostCapabilities = {};\n\nconst ITEM_PANELS: Record<string, (p: ItemPanelProps) => ReactNode> = {\n share: SharePanel,\n move: MovePanel,\n history: HistoryPanel,\n activity: ActivityPanel,\n settings: ItemSettingsPanel,\n field: FieldSettingsPanel,\n send: SecureLinkPanel,\n};\n\nconst generatorLimitsFrom = (knobs: VaultKnobs | undefined): GeneratorLimitsSource | undefined =>\n knobs\n ? async () => {\n const r = await knobs();\n return { maxPasswordLength: r[\"vault.generator.max_password_length\"], maxPassphraseWords: r[\"vault.generator.max_passphrase_words\"] };\n }\n : undefined;\n\n/** Import opens once the organization's limits are read; until they are set it says so. */\nfunction ImportWithLimits(props: Omit<React.ComponentProps<typeof ImportPanel>, \"limits\"> & { knobs: VaultKnobs | undefined }) {\n const { knobs, ...rest } = props;\n const [state, setState] = useState<{ limits: ImportLimits } | { error: string } | null>(null);\n useEffect(() => {\n if (!knobs) return setState({ error: \"Import is not set up for this organization yet.\" });\n knobs().then(\n (r) => {\n try {\n setState({ limits: importLimitsFrom(r) });\n } catch (e) {\n setState({ error: e instanceof Error ? e.message : \"Import is not set up yet.\" });\n }\n },\n (e: unknown) => setState({ error: e instanceof Error ? e.message : \"The import settings could not be read.\" }),\n );\n }, [knobs]);\n if (state && \"limits\" in state) return <ImportPanel {...rest} limits={state.limits} />;\n return (\n <Panel title=\"Import\" onClose={rest.onClose}>\n <Empty>{state ? state.error : \"Reading this organization’s import settings…\"}</Empty>\n </Panel>\n );\n}\n\n/** THE VAULT WORKSPACE: one component for the web app, the extension side panel and the desktop app. */\nexport function VaultApp(props: VaultAppProps) {\n return (\n <div className=\"relative h-full min-h-0 w-full\">\n <NoticeProvider notify={props.notify}>\n <IdentityGate identity={props.host?.identity}>\n <GeneratorLimitsProvider resolve={generatorLimitsFrom(props.host?.knobs)}>\n <Workspace {...props} />\n </GeneratorLimitsProvider>\n </IdentityGate>\n </NoticeProvider>\n </div>\n );\n}\n\nfunction Workspace({ port, host = NO_HOST, layout = \"auto\", location, onLocationChange }: VaultAppProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const width = useElementWidth(rootRef);\n const mode: Exclude<VaultLayout, \"auto\"> = layout !== \"auto\" ? layout : width >= FULL_AT ? \"full\" : width >= SPLIT_AT ? \"split\" : \"stack\";\n const notify = useNotify();\n\n const [snap, setSnap] = useState<VaultSnapshot | null>(null);\n const [items, setItems] = useState<readonly VaultItem[]>([]);\n const [deleted, setDeleted] = useState<readonly VaultItem[]>([]);\n const [favorites, setFavorites] = useState<ReadonlySet<string> | null>(null);\n const [recents, setRecents] = useState<readonly string[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [inner, setInner] = useState<VaultLocation>(DEFAULT_LOCATION);\n const loc = location ?? inner;\n const dirty = useRef(false);\n const [notice, setNotice] = useState<string | null>(null);\n\n const move = useCallback(\n (next: VaultLocation, how: \"push\" | \"replace\") => {\n if (!location) setInner(next);\n onLocationChange?.(next, how);\n },\n [location, onLocationChange],\n );\n\n const go = useCallback(\n (patch: Partial<VaultLocation>, how: \"push\" | \"replace\" = \"push\") => {\n const leaving = patch.itemId !== undefined || patch.mode !== undefined || patch.vault !== undefined || patch.view !== undefined;\n const next = { ...loc, ...patch };\n const proceed = () => {\n if (leaving) {\n dirty.current = false;\n if (patch.itemId !== undefined) setNotice(null);\n }\n move(next, how);\n };\n if (leaving && dirty.current) {\n void confirm({ title: \"Discard your changes?\", description: \"What you changed in this item is not saved.\", confirmLabel: \"Discard\", cancelLabel: \"Keep editing\", variant: \"destructive\" }).then((ok) => ok && proceed());\n return;\n }\n proceed();\n },\n [loc, move],\n );\n\n // The host object may be rebuilt on every render; reading its knobs through a ref keeps `load` stable.\n const knobsRef = useRef(host.knobs);\n knobsRef.current = host.knobs;\n const load = useCallback(() => {\n setError(null);\n port\n .load()\n .then((s) => {\n setSnap(s);\n setItems(s.items);\n setDeleted(s.deleted);\n // The server's vault list leaves deleted items out; Trash comes from the platform's trash.\n port.lists.trash?.list().then(\n (rows) => setDeleted([...s.deleted, ...rows.filter((r) => !s.deleted.some((d) => d.id === r.id))]),\n () => undefined,\n );\n })\n .catch((e: unknown) => setError(e instanceof Error ? e.message : \"The vault could not be loaded.\"));\n port.lists.favorites?.list().then((ids) => setFavorites(new Set(ids)), () => undefined);\n // Read the organization's settings now, so the generator opens without \"Reading limits…\".\n knobsRef.current?.().catch(() => undefined);\n port.lists.recents?.list().then(setRecents, () => undefined);\n }, [port]);\n useEffect(load, [load]);\n\n // Opening an item records it (Recently opened), when the host gives that door.\n useEffect(() => {\n if (!loc.itemId || !port.lists.recents) return;\n const id = loc.itemId;\n port.lists.recents.record(id).then(() => setRecents((r) => [id, ...(r ?? []).filter((x) => x !== id)]), () => undefined);\n }, [loc.itemId, port]);\n\n const orgs = snap?.organizations ?? [];\n const definitions = snap?.definitions ?? [];\n const inThisVault = useMemo(() => items.filter((i) => inVault(i, loc.vault)), [items, loc.vault]);\n const views = useMemo(() => buildViews(inThisVault, definitions, favorites, recents), [inThisVault, definitions, favorites, recents]);\n const visible = useMemo(() => {\n const filtered = inThisVault.filter((i) => {\n if (!matchesQuery(i, loc.q)) return false;\n if (loc.view === \"favorites\") return favorites?.has(i.id) ?? false;\n if (loc.view === \"recent\") return recents?.includes(i.id) ?? false;\n if (loc.view.startsWith(\"category:\")) return itemCategory(i, definitions) === loc.view.slice(9);\n return inView(i, loc.view);\n });\n if (loc.view === \"recent\" && recents) return [...filtered].sort((a, b) => recents.indexOf(a.id) - recents.indexOf(b.id));\n return sortItems(filtered, loc.sort);\n }, [inThisVault, loc.view, loc.q, loc.sort, favorites, recents, definitions]);\n const choices = useMemo(() => vaultChoices(items, orgs, loc.vault), [items, orgs, loc.vault]);\n const matchingIds = useMemo(() => (host.page ? new Set(host.page.matchingItemIds) : undefined), [host.page]);\n const selected = loc.itemId ? (items.find((i) => i.id === loc.itemId) ?? null) : null;\n\n const replaceItem = (next: VaultItem) => setItems((cur) => (cur.some((i) => i.id === next.id) ? cur.map((i) => (i.id === next.id ? next : i)) : [...cur, next]));\n const toggleFavorite = (id: string) => {\n const fav = port.lists.favorites;\n if (!fav) return;\n const on = !(favorites?.has(id) ?? false);\n setFavorites((cur) => {\n const n = new Set(cur ?? []);\n if (on) n.add(id);\n else n.delete(id);\n return n;\n });\n fav.set(id, on).catch((e: unknown) => {\n setFavorites((cur) => {\n const n = new Set(cur ?? []);\n if (on) n.delete(id);\n else n.add(id);\n return n;\n });\n notify(e instanceof Error ? e.message : \"Favorites could not be saved.\", \"error\");\n });\n };\n\n if (error) {\n return (\n <div ref={rootRef} role=\"alert\" className=\"flex h-full flex-col items-center justify-center gap-3 bg-background p-6 text-center text-sm\">\n <SafeGlyph className=\"size-8 text-muted-foreground\" />\n <div className=\"font-medium\">The vault couldn’t open</div>\n <div className=\"max-w-xs text-muted-foreground\">{plainLoadError(error)}</div>\n <button type=\"button\" className=\"text-primary hover:underline\" onClick={load}>Try again</button>\n </div>\n );\n }\n if (!snap) {\n return (\n <div ref={rootRef} className=\"flex h-full bg-background\" aria-busy=\"true\" aria-label=\"Opening the vault\">\n <div className=\"flex w-full max-w-sm flex-col gap-1 p-3\">\n {[0, 1, 2, 3, 4, 5, 6].map((n) => (\n <div key={n} className=\"flex h-12 items-center gap-3 px-2\">\n <div className=\"size-8 animate-pulse rounded-lg bg-muted\" />\n <div className=\"flex flex-1 flex-col gap-1.5\">\n <div className=\"h-3 w-2/3 animate-pulse rounded bg-muted\" />\n <div className=\"h-2.5 w-1/3 animate-pulse rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n const hasFavorites = port.lists.favorites !== undefined;\n const title = loc.vault === \"all\" && loc.view === \"all\" ? \"All items\" : viewLabel(loc.view, views);\n const compactHeader =\n mode === \"full\" ? undefined : (\n <div className=\"grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] gap-2\">\n <VaultSelect value={loc.vault} choices={choices} onChange={(vault) => go({ vault, itemId: null, panel: null })} />\n <Select value={loc.view} onValueChange={(view) => go({ view, itemId: null, panel: null })} options={viewOptions(views, inThisVault.length, deleted.length, hasFavorites, port.lists.recents !== undefined, host.page !== undefined)} aria-label=\"Show\" />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"Vault actions\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => go({ panel: \"import\" })}><ImportGlyph className=\"size-4\" />Import</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ panel: \"export\" })}><ExportGlyph className=\"size-4\" />Export</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ panel: \"backup\" })}><SafeGlyph className=\"size-4\" />Backup</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => go({ panel: \"devices\" })}><ShieldGlyph className=\"size-4\" />Browsers that fill</DropdownMenuItem>\n {host.nativeImport ? <DropdownMenuItem onSelect={() => go({ panel: \"import-passkeys\" })}><ImportGlyph className=\"size-4\" />Import passkeys</DropdownMenuItem> : null}\n {host.nativeProvider && host.nativeProvider.status !== \"unavailable\" ? <DropdownMenuItem onSelect={host.nativeProvider.openSetup}><ShieldGlyph className=\"size-4\" />System AutoFill</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n\n // Trash and One-time passwords search the same `q` as the list, with their own box to change or clear it.\n const viewHeader = (\n <div className=\"flex flex-col gap-2\">\n {compactHeader}\n <SearchField value={loc.q} onChange={(e) => go({ q: e.target.value }, \"replace\")} placeholder={`Search ${viewLabel(loc.view, views)}`} aria-label={`Search ${viewLabel(loc.view, views)}`} />\n </div>\n );\n const viewProps = { port, host, items: inThisVault, deleted, definitions, query: loc.q, onOpen: (id: string) => go({ view: \"all\", itemId: id, mode: \"view\", panel: null }), onChanged: load, header: viewHeader };\n // The extension's first screen: this tab's site and its logins (`view=page`).\n const pageView =\n loc.view === \"page\" && host.page && !loc.q ? (\n <PageView\n port={port}\n page={host.page}\n fill={host.fill}\n capture={host.capture}\n fillSetup={host.fillSetup}\n newPasswordFields={host.newPasswordFields}\n items={inThisVault}\n definitions={definitions}\n onOpen={(id) => go({ itemId: id, mode: \"view\", panel: null })}\n onNewForPage={(url) => go({ mode: \"new\", kind: null, url, itemId: null, panel: null })}\n onBrowse={() => go({ view: \"all\", itemId: null })}\n onChanged={load}\n {...(compactHeader ? { header: compactHeader } : {})}\n />\n ) : null;\n const specialView = pageView ?? (loc.view === \"authenticator\" ? <AuthenticatorView {...viewProps} /> : loc.view === \"trash\" ? <TrashView {...viewProps} /> : null);\n\n const list = specialView ?? (\n <ItemList\n title={title}\n items={visible}\n definitions={definitions}\n port={port}\n selectedId={loc.itemId}\n onSelect={(id) => go({ itemId: id, mode: \"view\", kind: null, panel: null })}\n query={loc.q}\n onQuery={(q) => go({ q }, \"replace\")}\n sort={loc.sort}\n onSort={(sort) => go({ sort }, \"replace\")}\n onNew={() => go({ itemId: null, mode: \"new\", kind: null, panel: null })}\n {...(matchingIds ? { matchingIds } : {})}\n {...(compactHeader ? { header: compactHeader } : {})}\n />\n );\n\n const showingDetail = loc.mode === \"new\" || loc.itemId !== null;\n const back = mode === \"stack\" ? () => go({ itemId: null, mode: \"view\", kind: null, panel: null }) : null;\n const guess = inferFromUrl(loc.url, definitions);\n const kindDefinition = loc.kind ? (definitions.find((d) => d.key === loc.kind) ?? null) : null;\n const ownerDefault = loc.vault !== \"all\" && loc.vault !== \"mine\" && loc.vault !== \"shared\" ? loc.vault : null;\n const onPanel = (panel: string | null) => go({ panel }, \"push\");\n\n let detail: ReactNode;\n if (loc.mode === \"new\" && !kindDefinition) {\n detail = <NewItemFlow definitions={definitions} url={loc.url} onUrl={(url) => go({ url }, \"replace\")} onChoose={(kind, _name, url) => go({ kind, url }, \"push\")} onCancel={() => go({ mode: \"view\", kind: null, url: \"\", itemId: null })} />;\n } else if (loc.mode === \"new\" && kindDefinition) {\n detail = (\n <ItemPane\n key={`new-${kindDefinition.key}`}\n port={port}\n item={null}\n definition={kindDefinition}\n mode=\"new\"\n host={host}\n organizations={orgs}\n defaultOwner={ownerDefault}\n seed={{ name: guess?.name ?? \"\", url: guess?.url ?? loc.url.trim() }}\n onBack={() => go({ kind: null })}\n onMode={() => undefined}\n onSaved={(item, _wasNew, n) => {\n replaceItem(item);\n dirty.current = false;\n move({ ...loc, itemId: item.id, mode: \"view\", kind: null, url: \"\", panel: null }, \"replace\");\n setNotice(n);\n notify(\"Saved\");\n }}\n onDeleted={() => undefined}\n onDirty={(d) => {\n dirty.current = d;\n }}\n onCancelNew={() => go({ mode: \"view\", kind: null, url: \"\", itemId: null })}\n onPanel={() => undefined}\n onChanged={() => undefined}\n />\n );\n } else if (selected) {\n detail = (\n <ItemPane\n key={selected.id}\n port={port}\n item={selected}\n definition={definitions.find((d) => d.key === selected.definitionKey) ?? null}\n mode={loc.mode === \"edit\" ? \"edit\" : \"view\"}\n host={host}\n organizations={orgs}\n defaultOwner={null}\n onBack={back}\n onMode={(m) => go({ mode: m, panel: null })}\n notice={notice}\n onSaved={(item, _wasNew, n) => {\n replaceItem(item);\n dirty.current = false;\n move({ ...loc, mode: \"view\" }, \"replace\");\n setNotice(n);\n notify(\"Saved\");\n }}\n onDeleted={(id) => {\n setItems((cur) => cur.filter((i) => i.id !== id));\n dirty.current = false;\n move({ ...loc, itemId: null, mode: \"view\", panel: null }, \"push\");\n notify(\"Moved to Trash\");\n load();\n }}\n onDirty={(d) => {\n dirty.current = d;\n }}\n onCancelNew={() => undefined}\n onPanel={onPanel}\n onChanged={(next) => {\n if (next) replaceItem(next);\n else if (next === null) setItems((cur) => cur.filter((i) => i.id !== selected.id));\n else load();\n }}\n refreshKey={loc.panel ?? \"none\"}\n favorite={hasFavorites ? { on: favorites?.has(selected.id) ?? false, toggle: () => toggleFavorite(selected.id) } : undefined}\n />\n );\n } else if (loc.itemId) {\n detail = <Blank>This item is not in your vault, or you cannot see it.</Blank>;\n } else {\n detail = <Blank>{visible.length === 0 ? \"\" : \"Select an item\"}</Blank>;\n }\n\n // The open panel: one about the open item, or one about the whole vault.\n const [panelName, panelArg] = (loc.panel ?? \"\").split(/:(.*)/s) as [string, string | undefined];\n const closePanel = () => go({ panel: null }, \"push\");\n const vaultPanelProps = { port, host, items, definitions, organizations: orgs, onClose: closePanel, onChanged: load };\n let panel: ReactNode = null;\n if (panelName === \"import\") panel = <ImportWithLimits {...vaultPanelProps} knobs={host.knobs} />;\n else if (panelName === \"devices\") panel = <DevicesPanel {...vaultPanelProps} />;\n else if (panelName === \"approve\" && panelArg) panel = <ApprovePanel {...vaultPanelProps} {...approvalFromParams(panelArg, new URLSearchParams(globalThis.location?.search ?? \"\"))} />;\n else if (panelName === \"import-passkeys\" && host.nativeImport) panel = <NativeImportPanel {...vaultPanelProps} bridge={host.nativeImport} readLimits={port.native.limits} activeOrganizationId={orgs[0]?.id ?? null} />;\n else if (panelName === \"export\") panel = <ExportPanel {...vaultPanelProps} />;\n else if (panelName === \"backup\") panel = <BackupPanel {...vaultPanelProps} />;\n else if (panelName && selected && ITEM_PANELS[panelName]) {\n const P = ITEM_PANELS[panelName];\n panel = (\n <P\n item={selected}\n port={port}\n host={host}\n definition={definitions.find((d) => d.key === selected.definitionKey) ?? null}\n organizations={orgs}\n arg={panelArg ?? null}\n onClose={closePanel}\n onPanel={onPanel}\n onChanged={(next) => {\n if (next) replaceItem(next);\n else if (next === null) {\n setItems((cur) => cur.filter((i) => i.id !== selected.id));\n move({ ...loc, itemId: null, panel: null }, \"replace\");\n } else load();\n }}\n />\n );\n }\n\n const grid = mode === \"full\" ? \"grid-cols-[15rem_21rem_minmax(0,1fr)]\" : mode === \"split\" ? \"grid-cols-[19rem_minmax(0,1fr)]\" : \"grid-cols-1\";\n const detailHere = specialView ? false : true;\n return (\n <div ref={rootRef} className=\"flex h-full min-h-0 w-full flex-col bg-background text-foreground\">\n {snap.unavailable.length > 0 ? (\n <div role=\"status\" className=\"flex items-center gap-3 border-b border-border bg-muted px-4 py-2 text-sm\">\n <span className=\"min-w-0 flex-1 truncate text-warning\">Couldn’t load {snap.unavailable.join(\", \")}. Showing the rest.</span>\n <button type=\"button\" className=\"shrink-0 text-primary hover:underline\" onClick={load}>Try again</button>\n </div>\n ) : null}\n <div className={`grid min-h-0 w-full flex-1 ${grid} overflow-hidden`}>\n {mode === \"full\" ? (\n <Sidebar\n vault={loc.vault}\n choices={choices}\n onVault={(vault) => go({ vault, itemId: null, panel: null })}\n view={loc.view}\n allCount={inThisVault.length}\n deletedCount={deleted.length}\n views={views}\n hasFavorites={hasFavorites}\n hasRecents={port.lists.recents !== undefined}\n onView={(view) => go({ view, itemId: null, mode: \"view\", panel: null })}\n onPanel={(p) => go({ panel: p })}\n nativeProvider={host.nativeProvider}\n hasNativeImport={host.nativeImport !== undefined}\n hasPage={host.page !== undefined}\n />\n ) : null}\n {mode === \"stack\" && showingDetail ? null : <div className={specialView && mode !== \"stack\" ? \"col-span-2 min-h-0\" : \"min-h-0\"}>{list}</div>}\n {detailHere ? (mode === \"stack\" ? (showingDetail ? detail : null) : detail) : null}\n {panel}\n </div>\n </div>\n );\n}\n\n/** A browser's raw network words (\"Load failed\", \"Failed to fetch\") said the way people read them. */\nfunction plainLoadError(message: string): string {\n return /load failed|failed to fetch|network|timed? ?out/i.test(message) ? \"The connection dropped. Check you’re online, then try again.\" : message;\n}\n\nfunction Blank({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-full flex-col items-center justify-center gap-3 bg-background text-sm text-muted-foreground\">\n <SafeGlyph className=\"size-10 text-disabled-foreground\" />\n {children}\n </div>\n );\n}\n","import { createContext, useCallback, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\n\nexport type NoticeKind = \"success\" | \"error\" | \"info\";\nexport type Notify = (message: string, kind?: NoticeKind) => void;\n\nconst Ctx = createContext<Notify>(() => undefined);\n\n/** Say something short to the person (\"Password copied\"). Hosts with their own toasts pass `notify`. */\nexport function useNotify(): Notify {\n return useContext(Ctx);\n}\n\n/** THE copy for every vault screen: writes, then says so (or says why not). */\nexport function useCopy(): (text: string, label: string) => Promise<boolean> {\n const notify = useNotify();\n return useCallback((text, label) => copyText(text, { successMessage: `${label} copied`, failureMessage: `${label} could not be copied`, notify: (m, k) => notify(m, k === \"error\" ? \"error\" : \"success\") }), [notify]);\n}\n\n/**\n * The vault's own notice line, so feedback exists in every host (an extension side panel has no app\n * toaster). A host that has one passes `notify` and this draws nothing.\n */\nexport function NoticeProvider({ notify, children }: { notify?: Notify | undefined; children: ReactNode }) {\n const [shown, setShown] = useState<{ message: string; kind: NoticeKind; n: number } | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const local = useCallback<Notify>((message, kind = \"success\") => {\n if (timer.current) clearTimeout(timer.current);\n setShown((s) => ({ message, kind, n: (s?.n ?? 0) + 1 }));\n timer.current = setTimeout(() => setShown(null), kind === \"error\" ? 5000 : 2200);\n }, []);\n useEffect(() => () => void (timer.current && clearTimeout(timer.current)), []);\n return (\n <Ctx.Provider value={notify ?? local}>\n {children}\n {!notify ? (\n <div aria-live=\"polite\" className=\"pointer-events-none absolute inset-x-0 bottom-4 z-30 flex justify-center px-4\">\n {shown ? (\n <div key={shown.n} role=\"status\" className={cn(\"rounded-full border border-border bg-popover px-4 py-2 text-sm shadow-lg\", shown.kind === \"error\" ? \"text-destructive\" : \"text-foreground\")}>\n {shown.message}\n </div>\n ) : null}\n </div>\n ) : null}\n </Ctx.Provider>\n );\n}\n","import { useCopy } from \"../notice\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button, Badge } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { SecretText } from \"../FieldRows\";\nimport { CopyGlyph, EyeGlyph, EyeOffGlyph, RestoreGlyph } from \"../glyphs\";\nimport { useTransientSecret } from \"../hooks\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { Empty, Panel, Row, Section, formatDate } from \"../ui\";\nimport { canRestore, historyByField, historyEligible, mergePages } from \"./logic\";\nimport { HistoryChangedError, type HistoryEntry, type HistoryPage } from \"./port\";\n\nexport { ActivityPanel } from \"./ActivityPanel\";\n\nconst MASK = \"••••••••••••\";\nconst messageOf = (e: unknown, fallback: string): string | null => (wasCancelled(e) ? null : e instanceof Error ? e.message : fallback);\n\n/**\n * Earlier values of the item's secret fields, newest first, one row each: when, the masked value,\n * show, copy and restore. `arg` = a field id to put first. Values live only in the row that asked,\n * for 20 seconds.\n */\nexport function HistoryPanel({ item, port, arg, onClose, onChanged }: ItemPanelProps) {\n const eligible = historyEligible(item);\n const [page, setPage] = useState<HistoryPage | null>(null);\n const [loading, setLoading] = useState(eligible);\n const [more, setMore] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n // Every request carries the generation it started in; an answer from an older one is dropped.\n const generation = useRef(0);\n\n const load = useCallback(async () => {\n const g = ++generation.current;\n setLoading(true);\n setError(null);\n try {\n const next = await port.activity.history(item);\n if (generation.current === g) setPage(next);\n } catch (e) {\n if (generation.current === g) setError(messageOf(e, \"History could not be read.\"));\n } finally {\n if (generation.current === g) setLoading(false);\n }\n }, [port, item]);\n\n useEffect(() => {\n if (!eligible) return;\n void load();\n return () => {\n generation.current += 1;\n };\n }, [eligible, load]);\n\n async function loadMore() {\n if (!page?.nextBefore) return;\n const g = ++generation.current;\n setMore(true);\n try {\n const next = await port.activity.history(item, page.nextBefore);\n if (generation.current === g) setPage((cur) => (cur ? mergePages(cur, next) : next));\n } catch (e) {\n if (generation.current === g) setError(messageOf(e, \"Earlier changes could not be read.\"));\n } finally {\n if (generation.current === g) setMore(false);\n }\n }\n\n async function restored(next: VaultItem) {\n setNotice(\"Restored. It is the current value now.\");\n onChanged(next);\n await load();\n }\n\n async function conflicted() {\n setNotice(null);\n setError(\"History changed. Review it again.\");\n await load();\n }\n\n const groups = page ? historyByField(item, page.entries, arg) : [];\n\n return (\n <Panel\n title=\"Password history\"\n onClose={onClose}\n footer={page?.nextBefore ? <Button variant=\"outline\" disabled={more} onClick={() => void loadMore()}>{more ? \"Loading…\" : \"Show earlier\"}</Button> : undefined}\n >\n {!eligible ? (\n <Empty>History is kept only for your own items.</Empty>\n ) : loading && !page ? (\n <Empty>Reading history…</Empty>\n ) : (\n <>\n {error ? <p role=\"alert\" className=\"px-1 text-sm text-destructive\">{error}</p> : null}\n {notice ? <p role=\"status\" className=\"px-1 text-sm text-success\">{notice}</p> : null}\n {page && groups.length === 0 ? <Empty>No earlier values yet.</Empty> : null}\n {page\n ? groups.map((g) => (\n <Section key={g.fieldId} title={g.label}>\n {g.entries.map((entry) => (\n <HistoryRow key={`${item.id}:${entry.fieldId}:${entry.revision}`} item={item} port={port} page={page} entry={entry} label={g.label} onRestored={restored} onConflict={conflicted} onError={setError} />\n ))}\n </Section>\n ))\n : null}\n {page && (page.captureStartedAt || page.incomplete) ? (\n <div className=\"flex flex-wrap gap-x-3 gap-y-1 px-1 text-xs\">\n {page.captureStartedAt ? <span className=\"text-muted-foreground\">Kept since {formatDate(page.captureStartedAt, true)}</span> : null}\n {page.incomplete ? <span className=\"text-warning\">Some changes could not be read</span> : null}\n </div>\n ) : null}\n </>\n )}\n </Panel>\n );\n}\n\nfunction HistoryRow({ item, port, page, entry, label, onRestored, onConflict, onError }: {\n item: VaultItem;\n port: VaultPort;\n page: HistoryPage;\n entry: HistoryEntry;\n label: string;\n onRestored: (next: VaultItem) => Promise<void>;\n onConflict: () => Promise<void>;\n onError: (message: string | null) => void;\n}) {\n const confirmed = useConfirmed();\n const secret = useTransientSecret();\n const copyValue = useCopy();\n const [busy, setBusy] = useState(false);\n const when = formatDate(entry.recordedAt, true);\n\n async function read(): Promise<string | null> {\n if (secret.value !== null) return secret.value;\n setBusy(true);\n onError(null);\n try {\n return await confirmed(() => port.activity.revealHistory(item, entry.fieldId, entry.revision));\n } catch (e) {\n onError(messageOf(e, \"That value could not be read.\"));\n return null;\n } finally {\n setBusy(false);\n }\n }\n\n async function toggle() {\n if (secret.value !== null) return secret.clear();\n const v = await read();\n if (v !== null) secret.show(v);\n }\n\n async function copy() {\n const v = await read();\n if (v !== null) await copyValue(v, `Earlier ${label.toLowerCase()}`);\n }\n\n async function restore() {\n const yes = await confirm({\n title: `Restore this ${label.toLowerCase()}?`,\n description: `The value from ${when} replaces the current one. Anything using the current one needs this one.`,\n confirmLabel: \"Restore\",\n });\n if (!yes) return;\n secret.clear();\n setBusy(true);\n onError(null);\n try {\n const next = await confirmed(() => port.activity.restoreHistory(item, entry.fieldId, entry.revision, page.historyRevision));\n await onRestored(next);\n } catch (e) {\n if (e instanceof HistoryChangedError) await onConflict();\n else onError(messageOf(e, \"That value could not be restored.\"));\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <Row\n label={when}\n actions={\n entry.available ? (\n <>\n <Button variant=\"quiet\" icon={secret.value !== null ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={secret.value !== null ? \"Hide\" : \"Show\"} disabled={busy} onClick={() => void toggle()} />\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label=\"Copy\" disabled={busy} onClick={() => void copy()} />\n {canRestore(page, entry) ? <Button variant=\"quiet\" icon={<RestoreGlyph />} aria-label=\"Restore\" disabled={busy} onClick={() => void restore()} /> : null}\n </>\n ) : null\n }\n >\n {!entry.available ? (\n <Badge>Not kept</Badge>\n ) : secret.value !== null ? (\n <SecretText value={secret.value} multiline={false} />\n ) : (\n <span className=\"block truncate tracking-widest text-muted-foreground\">{MASK}</span>\n )}\n </Row>\n );\n}\n","import { createContext, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"@ai-matrx/design-system\";\nimport { Button, Field } from \"@ai-matrx/design-system/controls\";\nimport { ShieldGlyph } from \"../glyphs\";\nimport { needsRecentSignIn, type IdentityAccount, type VaultIdentity } from \"./identity\";\n\n/**\n * Wrap any call that shows, copies or exports a secret. When the server answers \"sign in again\",\n * the person confirms it is them (Google, password, or an emailed code) and the call runs again —\n * they never see a dead \"Authentication required\" in the row.\n */\nexport type Confirmed = <T>(run: () => Promise<T>) => Promise<T>;\n\nconst CANCELLED = \"Not confirmed.\";\nconst Ctx = createContext<Confirmed>((run) => run());\n\nexport function useConfirmed(): Confirmed {\n return useContext(Ctx);\n}\n\nconst PROVIDER_LABEL: Record<string, string> = { google: \"Google\", github: \"GitHub\", azure: \"Microsoft\", apple: \"Apple\", linkedin_oidc: \"LinkedIn\", slack_oidc: \"Slack\" };\nconst providerLabel = (p: string) => PROVIDER_LABEL[p] ?? p.charAt(0).toUpperCase() + p.slice(1);\n\nexport function IdentityGate({ identity, children }: { identity: VaultIdentity | undefined; children: ReactNode }) {\n const [asking, setAsking] = useState(false);\n const waiters = useRef<{ resolve: () => void; reject: (e: Error) => void }[]>([]);\n\n const confirmed: Confirmed = async (run) => {\n try {\n return await run();\n } catch (e) {\n if (!identity || !needsRecentSignIn(e)) throw e;\n await new Promise<void>((resolve, reject) => {\n waiters.current.push({ resolve, reject });\n setAsking(true);\n });\n return run();\n }\n };\n\n const settle = (ok: boolean) => {\n const w = waiters.current;\n waiters.current = [];\n setAsking(false);\n for (const x of w) (ok ? x.resolve() : x.reject(new Error(CANCELLED)));\n };\n\n return (\n <Ctx.Provider value={confirmed}>\n {children}\n {identity ? <ConfirmIdentityDialog open={asking} identity={identity} onDone={() => settle(true)} onCancel={() => settle(false)} /> : null}\n </Ctx.Provider>\n );\n}\n\n/** True for the rejection a cancelled confirmation produces (callers stay quiet about it). */\nexport const wasCancelled = (e: unknown) => e instanceof Error && e.message === CANCELLED;\n\nfunction ConfirmIdentityDialog({ open, identity, onDone, onCancel }: { open: boolean; identity: VaultIdentity; onDone: () => void; onCancel: () => void }) {\n const [account, setAccount] = useState<IdentityAccount | null>(null);\n const [password, setPassword] = useState(\"\");\n const [code, setCode] = useState(\"\");\n const [codeSent, setCodeSent] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!open) return;\n setPassword(\"\");\n setCode(\"\");\n setCodeSent(false);\n setError(null);\n identity.account().then(setAccount, (e: unknown) => setError(e instanceof Error ? e.message : \"Your account could not be read.\"));\n }, [open, identity]);\n\n const attempt = async (step: () => Promise<void>, done = true) => {\n setBusy(true);\n setError(null);\n try {\n await step();\n if (done) onDone();\n } catch (e) {\n setError(e instanceof Error ? e.message : \"That did not work. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={(o) => (o ? undefined : onCancel())}>\n <DialogContent size=\"sm\">\n <DialogHeader>\n <div className=\"flex items-center gap-2\">\n <ShieldGlyph className=\"size-5 text-primary\" />\n <DialogTitle>Confirm it’s you</DialogTitle>\n </div>\n <DialogDescription>This needs a recent sign-in{account?.email ? ` to ${account.email}` : \"\"}.</DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-3\">\n {identity.dev ? (\n <Button variant=\"primary\" disabled={busy} onClick={() => void attempt(() => identity.dev?.() ?? Promise.resolve())}>\n Sign in again (dev)\n </Button>\n ) : null}\n {account?.providers.map((p) => (\n <Button key={p} variant={identity.dev ? \"outline\" : \"primary\"} disabled={busy} onClick={() => void attempt(() => identity.withProvider(p), false)}>\n Continue with {providerLabel(p)}\n </Button>\n ))}\n {account?.hasPassword ? (\n <form className=\"flex gap-2\" onSubmit={(e) => { e.preventDefault(); if (password) void attempt(() => identity.withPassword(password)); }}>\n <Field className=\"min-w-0 flex-1\" type=\"password\" autoComplete=\"current-password\" placeholder=\"Your password\" aria-label=\"Your password\" value={password} onChange={(e) => setPassword(e.target.value)} />\n <Button variant=\"outline\" type=\"submit\" disabled={busy || !password}>Confirm</Button>\n </form>\n ) : null}\n {account?.email ? (\n codeSent ? (\n <form className=\"flex gap-2\" onSubmit={(e) => { e.preventDefault(); if (code.trim()) void attempt(() => identity.withEmailCode(code)); }}>\n <Field className=\"min-w-0 flex-1\" inputMode=\"numeric\" autoComplete=\"one-time-code\" placeholder=\"Code from your email\" aria-label=\"Code from your email\" value={code} onChange={(e) => setCode(e.target.value)} autoFocus />\n <Button variant=\"outline\" type=\"submit\" disabled={busy || !code.trim()}>Confirm</Button>\n </form>\n ) : (\n <Button variant=\"quiet\" disabled={busy} onClick={() => void attempt(async () => { await identity.sendEmailCode(); setCodeSent(true); }, false)}>\n Email me a code instead\n </Button>\n )\n ) : null}\n {error ? <p role=\"alert\" className=\"text-sm text-destructive\">{error}</p> : null}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/** The vault's own inline glyphs (C19: no icon-library dependency). 24-grid, 2px stroke, inherit colour. */\nexport type Glyph = (props: { className?: string }) => ReactNode;\n\nfunction glyph(paths: ReactNode): Glyph {\n return function VaultGlyph({ className }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {paths}\n </svg>\n );\n };\n}\n\nexport const KeyGlyph = glyph(<><circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" /><path d=\"m21 2-9.6 9.6M15.5 7.5l3 3\" /></>);\nexport const GlobeGlyph = glyph(<><circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" /></>);\nexport const NoteGlyph = glyph(<><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4M16 13H8M16 17H8\" /></>);\nexport const CardGlyph = glyph(<><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" /><path d=\"M2 10h20\" /></>);\nexport const PersonGlyph = glyph(<><circle cx=\"12\" cy=\"8\" r=\"5\" /><path d=\"M20 21a8 8 0 0 0-16 0\" /></>);\nexport const DatabaseGlyph = glyph(<><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" /><path d=\"M3 5v14a9 3 0 0 0 18 0V5M3 12a9 3 0 0 0 18 0\" /></>);\nexport const ServerGlyph = glyph(<><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" /><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" /><path d=\"M6 6h.01M6 18h.01\" /></>);\nexport const TerminalGlyph = glyph(<><path d=\"m4 17 6-6-6-6M12 19h8\" /></>);\nexport const FileGlyph = glyph(<><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4\" /></>);\nexport const CodeGlyph = glyph(<><path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" /></>);\nexport const StarGlyph = glyph(<path d=\"M12 2l3.1 6.3 6.9 1-5 4.9 1.2 6.8L12 17.8 5.8 21l1.2-6.8-5-4.9 6.9-1z\" />);\nexport const PlusGlyph = glyph(<path d=\"M12 5v14M5 12h14\" />);\nexport const CopyGlyph = glyph(<><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" /><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" /></>);\nexport const EyeGlyph = glyph(<><path d=\"M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>);\nexport const EyeOffGlyph = glyph(<><path d=\"M10.7 5.1A10.4 10.4 0 0 1 12 5c6.4 0 10 7 10 7a17 17 0 0 1-2.2 3.2M6.6 6.6A17 17 0 0 0 2 12s3.6 7 10 7a9.7 9.7 0 0 0 5.4-1.6M2 2l20 20\" /></>);\nexport const LockGlyph = glyph(<><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" /><path d=\"M7 11V7a5 5 0 0 1 10 0v4\" /></>);\nexport const ExternalGlyph = glyph(<><path d=\"M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" /></>);\nexport const TrashGlyph = glyph(<><path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\" /></>);\nexport const ArchiveGlyph = glyph(<><rect x=\"2\" y=\"3\" width=\"20\" height=\"5\" rx=\"1\" /><path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8M10 12h4\" /></>);\nexport const TagGlyph = glyph(<><path d=\"M12.6 2.6A2 2 0 0 0 11.2 2H4a2 2 0 0 0-2 2v7.2a2 2 0 0 0 .6 1.4l8.7 8.7a2.4 2.4 0 0 0 3.4 0l6.6-6.6a2.4 2.4 0 0 0 0-3.4z\" /><circle cx=\"7.5\" cy=\"7.5\" r=\".5\" /></>);\nexport const ShieldGlyph = glyph(<><path d=\"M20 13c0 5-3.5 7.5-7.7 8.9a1 1 0 0 1-.6 0C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.2-2.7a1.2 1.2 0 0 1 1.6 0C14.5 3.8 17 5 19 5a1 1 0 0 1 1 1z\" /></>);\nexport const BuildingGlyph = glyph(<><rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\" /><path d=\"M9 22v-4h6v4M8 6h.01M16 6h.01M12 6h.01M12 10h.01M12 14h.01M16 10h.01M16 14h.01M8 10h.01M8 14h.01\" /></>);\nexport const UsersGlyph = glyph(<><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" /><circle cx=\"9\" cy=\"7\" r=\"4\" /><path d=\"M22 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8\" /></>);\nexport const ChevronLeftGlyph = glyph(<path d=\"m15 18-6-6 6-6\" />);\nexport const GridGlyph = glyph(<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /></>);\nexport const PlugGlyph = glyph(<><path d=\"M12 22v-5M9 8V2M15 8V2M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8z\" /></>);\n\nconst FAMILY_GLYPHS: Record<string, Glyph> = {\n databases: DatabaseGlyph,\n server_network: ServerGlyph,\n hosting_deployment: ServerGlyph,\n source_control: CodeGlyph,\n signing_files: FileGlyph,\n identity_security: ShieldGlyph,\n cloud_infrastructure: ServerGlyph,\n};\n\n/** A type's glyph: logins are a globe, then by family, else a key. */\nexport function definitionGlyph(key: string, family: string): Glyph {\n if (key === \"username_password\" || key === \"website_login\") return GlobeGlyph;\n return FAMILY_GLYPHS[family] ?? KeyGlyph;\n}\nexport const XGlyph = glyph(<path d=\"M18 6 6 18M6 6l12 12\" />);\nexport const PencilGlyph = glyph(<><path d=\"M12 20h9\" /><path d=\"M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z\" /></>);\nexport const ClockGlyph = glyph(<><circle cx=\"12\" cy=\"12\" r=\"10\" /><path d=\"M12 6v6l4 2\" /></>);\n// ── core workspace glyphs ────────────────────────────────────────────────────\nexport const MoreGlyph = glyph(<><circle cx=\"12\" cy=\"12\" r=\"1\" /><circle cx=\"19\" cy=\"12\" r=\"1\" /><circle cx=\"5\" cy=\"12\" r=\"1\" /></>);\nexport const ShareGlyph = glyph(<><path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8M16 6l-4-4-4 4M12 2v13\" /></>);\nexport const HistoryGlyph = glyph(<><path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" /><path d=\"M3 3v5h5M12 7v5l4 2\" /></>);\nexport const ListGlyph = glyph(<path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />);\nexport const SettingsGlyph = glyph(<><path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>);\nexport const ImportGlyph = glyph(<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3\" />);\nexport const ExportGlyph = glyph(<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M17 8l-5-5-5 5M12 3v12\" />);\nexport const ChevronDownGlyph = glyph(<path d=\"m6 9 6 6 6-6\" />);\nexport const ChevronRightGlyph = glyph(<path d=\"m9 18 6-6-6-6\" />);\nexport const SortGlyph = glyph(<path d=\"m3 16 4 4 4-4M7 20V4M21 8l-4-4-4 4M17 4v16\" />);\nexport const UserGlyph = glyph(<><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2\" /></>);\nexport const MoveGlyph = glyph(<path d=\"M5 9 2 12l3 3M9 5l3-3 3 3M15 19l-3 3-3-3M19 9l3 3-3 3M2 12h20M12 2v20\" />);\nexport const SafeGlyph = glyph(<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" /><circle cx=\"12\" cy=\"12\" r=\"4\" /><path d=\"M12 8v1M12 15v1M8 12h1M15 12h1\" /></>);\nexport const RestoreGlyph = glyph(<><path d=\"M3 12a9 9 0 1 0 3-6.7L3 8\" /><path d=\"M3 3v5h5\" /></>);\n// ── one-time passwords ───────────────────────────────────────────────────────\nexport const QrGlyph = glyph(<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" /><path d=\"M14 14h3v3h-3zM20 14v.01M14 20h.01M17 20h4v-3\" /></>);\nexport const CameraGlyph = glyph(<><path d=\"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3z\" /><circle cx=\"12\" cy=\"13\" r=\"3\" /></>);\nexport const CheckGlyph = glyph(<path d=\"M20 6 9 17l-5-5\" />);\nexport const PowerGlyph = glyph(<><path d=\"M12 2v10\" /><path d=\"M18.4 6.6a9 9 0 1 1-12.77.04\" /></>);\n// ── generator and field settings ─────────────────────────────────────────────\nexport const RefreshGlyph = glyph(<><path d=\"M21 12a9 9 0 0 1-15.5 6.2L3 16\" /><path d=\"M3 12a9 9 0 0 1 15.5-6.2L21 8\" /><path d=\"M21 3v5h-5M3 21v-5h5\" /></>);\nexport const SlidersGlyph = glyph(<><path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" /></>);\nexport const DownloadGlyph = glyph(<><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" /><path d=\"m7 10 5 5 5-5M12 15V3\" /></>);\nexport const UploadGlyph = glyph(<><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" /><path d=\"m17 8-5-5-5 5M12 3v12\" /></>);\n// ── browsers that can fill ───────────────────────────────────────────────────\nexport const FingerprintGlyph = glyph(<><path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" /><path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" /><path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" /><path d=\"M2 12a10 10 0 0 1 18-6\" /><path d=\"M2 16h.01\" /><path d=\"M21.8 16c.2-2 .131-5.354 0-6\" /><path d=\"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2\" /><path d=\"M8.65 22c.21-.66.45-1.32.57-2\" /><path d=\"M9 6.8a6 6 0 0 1 9 5.2v2\" /></>);\nexport const SendGlyph = glyph(<path d=\"M14.5 21.7a.5.5 0 0 0 .9 0L22 3a.5.5 0 0 0-.6-.6L2.3 9.1a.5.5 0 0 0 0 .9l7.9 3.2a2 2 0 0 1 1.1 1.1zM21.9 2.1 10.9 13.1\" />);\n","/**\n * CONFIRM IT'S YOU. The server shows or exports a secret only after a sign-in from the last few\n * minutes (`recent_auth_required`). Every host signs people in with Supabase, so the one way to\n * produce a fresh sign-in lives here, over the host's own auth client — whichever way the person\n * signs in: Google (or any connected provider), a password, or a code sent to their email.\n */\n\n/** How a person can prove it is them again. Ordered by what the account actually uses. */\nexport type IdentityMethod = \"provider\" | \"password\" | \"email_code\" | \"dev\";\n\nexport interface IdentityAccount {\n email: string | null;\n /** Connected sign-in providers on the account (`google`, `github`, …), never `email`. */\n providers: readonly string[];\n hasPassword: boolean;\n}\n\nexport interface VaultIdentity {\n account(): Promise<IdentityAccount>;\n /** Leaves the page for the provider and comes back to the same address (the URL carries everything). */\n withProvider(provider: string): Promise<void>;\n withPassword(password: string): Promise<void>;\n sendEmailCode(): Promise<void>;\n withEmailCode(code: string): Promise<void>;\n /** A host-only path with no human step (the playground's dev server). */\n dev?: () => Promise<void>;\n}\n\n/** The slice of supabase-js `auth` this needs, so the package never depends on supabase-js itself. */\nexport interface SupabaseAuthLike {\n getUser(): Promise<{ data: { user: { id: string; email?: string | null; identities?: { provider: string }[] | null; app_metadata?: { providers?: string[] } } | null }; error: unknown }>;\n signInWithPassword(c: { email: string; password: string }): Promise<{ data: { user: { id: string } | null }; error: { message: string } | null }>;\n signInWithOtp(c: { email: string; options?: { shouldCreateUser?: boolean } }): Promise<{ error: { message: string } | null }>;\n verifyOtp(c: { email: string; token: string; type: \"email\" }): Promise<{ data: { user: { id: string } | null }; error: { message: string } | null }>;\n signInWithOAuth(c: { provider: never; options?: { redirectTo?: string } }): Promise<{ error: { message: string } | null }>;\n}\n\nconst SAME_PERSON = \"That signed in a different account. Use the account this vault belongs to.\";\n\n/** THE identity confirmation for every host: give it the host's `supabase.auth`. */\nexport function createSupabaseIdentity(auth: SupabaseAuthLike, options: { redirectTo?: () => string; dev?: () => Promise<void> } = {}): VaultIdentity {\n let me: { id: string; email: string | null } | null = null;\n const who = async () => {\n const { data } = await auth.getUser();\n if (!data.user) throw new Error(\"You are signed out. Sign in again.\");\n me = { id: data.user.id, email: data.user.email ?? null };\n return data.user;\n };\n const sameUser = (id: string | undefined) => {\n if (!me || id !== me.id) throw new Error(SAME_PERSON);\n };\n const identity: VaultIdentity = {\n async account() {\n const u = await who();\n const names = new Set([...(u.identities ?? []).map((i) => i.provider), ...(u.app_metadata?.providers ?? [])]);\n return { email: u.email ?? null, providers: [...names].filter((p) => p !== \"email\" && p !== \"phone\"), hasPassword: names.has(\"email\") };\n },\n async withProvider(provider) {\n await who();\n const redirectTo = options.redirectTo?.() ?? globalThis.location?.href;\n // `provider` is a supabase-js Provider string; the structural type keeps supabase-js out of the package.\n const { error } = await auth.signInWithOAuth({ provider: provider as never, ...(redirectTo ? { options: { redirectTo } } : {}) });\n if (error) throw new Error(error.message);\n },\n async withPassword(password) {\n const u = await who();\n if (!u.email) throw new Error(\"This account has no email to confirm with.\");\n const { data, error } = await auth.signInWithPassword({ email: u.email, password });\n if (error) throw new Error(\"That password was not accepted.\");\n sameUser(data.user?.id);\n },\n async sendEmailCode() {\n const u = await who();\n if (!u.email) throw new Error(\"This account has no email to send a code to.\");\n const { error } = await auth.signInWithOtp({ email: u.email, options: { shouldCreateUser: false } });\n if (error) throw new Error(error.message);\n },\n async withEmailCode(code) {\n const u = me ?? (await who());\n if (!u.email) throw new Error(\"This account has no email.\");\n const { data, error } = await auth.verifyOtp({ email: u.email, token: code.trim(), type: \"email\" });\n if (error) throw new Error(\"That code was not accepted. Check it, or send a new one.\");\n sameUser(data.user?.id);\n },\n };\n if (options.dev) identity.dev = options.dev;\n return identity;\n}\n\n/** True when the server refused because the sign-in is not recent enough. */\nexport function needsRecentSignIn(e: unknown): boolean {\n const err = e as { code?: unknown; status?: unknown; message?: unknown; serverDetail?: unknown } | null;\n if (!err) return false;\n if (err.code === \"recent_auth_required\") return true;\n // Some routes answer with only a sentence (the shown message is a generic \"sign in\"; the server's\n // own words say which): read those too.\n const said = [err.message, JSON.stringify(err.serverDetail ?? \"\")].filter((x): x is string => typeof x === \"string\").join(\" \");\n return /recent auth|recent sign|re-authenticate|authentication within the last/i.test(said);\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { Badge, Button, Field, Textarea } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { useConfirmed, wasCancelled } from \"./auth/IdentityGate\";\nimport { CopyGlyph, EyeGlyph, EyeOffGlyph, ExternalGlyph, LockGlyph, XGlyph } from \"./glyphs\";\nimport { useTransientSecret } from \"./hooks\";\nimport { useCopy } from \"./notice\";\nimport type { VaultField, VaultItem } from \"./model\";\nimport type { VaultPort } from \"./port\";\nimport { Row } from \"./ui\";\n\nexport { Row } from \"./ui\";\n\nconst MASK = \"••••••••••••\";\n\n/** A revealed secret, coloured the way password managers do: digits and symbols stand out from letters. */\nexport function SecretText({ value, multiline }: { value: string; multiline: boolean }) {\n if (multiline || value.length > 200) return <span className=\"whitespace-pre-wrap break-all font-mono text-sm\">{value}</span>;\n return (\n <span className=\"break-all font-mono text-sm tracking-wide\">\n {[...value].map((ch, i) => (\n <span key={i} className={/[0-9]/.test(ch) ? \"text-primary\" : /[^A-Za-z0-9]/.test(ch) ? \"text-warning\" : undefined}>\n {ch}\n </span>\n ))}\n </span>\n );\n}\n\nconst quietError = (e: unknown, fallback: string): string | null => (wasCancelled(e) ? null : e instanceof Error ? e.message : fallback);\n\n/**\n * An encrypted field in view mode: one row with show and copy. A `visible` field (a username) reads\n * its value as soon as the row opens — people should never have to click to see a username.\n */\nexport function SecretRow({ port, item, field, extra }: { port: VaultPort; item: VaultItem; field: VaultField; extra?: ReactNode }) {\n const confirmed = useConfirmed();\n const copyValue = useCopy();\n const secret = useTransientSecret();\n const [plain, setPlain] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const sealed = field.handling === \"sealed\";\n const visible = field.handling === \"visible\";\n // A turned-off field (a restored item comes back with every field off) has no value to read yet.\n const off = field.active === false;\n const canSee = !sealed && !off && (visible ? item.capabilities.canUse : item.capabilities.canReveal);\n\n useEffect(() => {\n if (!visible || !canSee) return;\n let live = true;\n port.reveal(item, field.key).then(\n (v) => live && setPlain(v),\n (e: unknown) => live && setError(quietError(e, \"Could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [port, item, field.key, visible, canSee]);\n\n async function fetchValue(): Promise<string | null> {\n if (plain !== null) return plain;\n if (secret.value !== null) return secret.value;\n setBusy(true);\n setError(null);\n try {\n return await confirmed(() => port.reveal(item, field.key));\n } catch (e) {\n setError(quietError(e, \"Could not be read.\"));\n return null;\n } finally {\n setBusy(false);\n }\n }\n async function toggle() {\n if (secret.value !== null) return secret.clear();\n const v = await fetchValue();\n if (v !== null) secret.show(v);\n }\n async function copy() {\n const v = await fetchValue();\n if (v !== null) await copyValue(v, field.label);\n }\n\n const multiline = field.kind === \"multiline\";\n const shown = visible ? plain : secret.value;\n return (\n <Row\n label={field.label}\n top={multiline && shown !== null}\n actions={\n <>\n {extra}\n {canSee && !visible ? <Button variant=\"quiet\" icon={secret.value !== null ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={secret.value !== null ? `Hide ${field.label}` : `Show ${field.label}`} disabled={busy} onClick={() => void toggle()} /> : null}\n {canSee ? <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label={`Copy ${field.label}`} disabled={busy} onClick={() => void copy()} /> : null}\n </>\n }\n >\n {sealed ? (\n <Badge icon={<LockGlyph />}>Sealed</Badge>\n ) : off ? (\n <span className=\"text-muted-foreground\">Turned off</span>\n ) : error ? (\n <span className=\"truncate text-destructive\" title={error}>{error}</span>\n ) : shown !== null ? (\n visible ? <span className={cn(\"block\", multiline ? \"whitespace-pre-wrap break-words\" : \"truncate\")}>{shown || \"—\"}</span> : <SecretText value={shown} multiline={multiline} />\n ) : (\n <span className={cn(\"block truncate text-muted-foreground\", !visible && \"tracking-widest\")}>{visible ? \"…\" : MASK}</span>\n )}\n </Row>\n );\n}\n\n/** A plaintext value (a website, a custom field): shown, with open and copy on the same row. */\nexport function PlainRow({ label, value, hint, openUrl, extra, multiline = false }: { label: ReactNode; value: string; hint?: ReactNode; openUrl?: ((url: string) => void) | undefined; extra?: ReactNode; multiline?: boolean }) {\n const copyValue = useCopy();\n const isUrl = /^https?:\\/\\//i.test(value);\n return (\n <Row\n label={label}\n hint={hint}\n top={multiline}\n actions={\n <>\n {extra}\n {isUrl && openUrl ? <Button variant=\"quiet\" icon={<ExternalGlyph />} aria-label={`Open ${value}`} onClick={() => openUrl(value)} /> : null}\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label={`Copy ${typeof label === \"string\" ? label : \"value\"}`} onClick={() => void copyValue(value, typeof label === \"string\" && label ? label : \"Value\")} />\n </>\n }\n >\n {isUrl && openUrl ? (\n // A real link (right-click, copy link address, open in a new tab); a click goes through the host's opener.\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block max-w-full truncate text-primary hover:underline\"\n onClick={(e) => {\n e.preventDefault();\n openUrl(value);\n }}\n >\n {value.replace(/^https?:\\/\\//i, \"\").replace(/\\/$/, \"\")}\n </a>\n ) : (\n <div className={multiline ? \"whitespace-pre-wrap break-words\" : \"truncate\"}>{value}</div>\n )}\n </Row>\n );\n}\n\n/** A common field with nothing in it yet: the label, and one quiet way to add it. */\nexport function AddRow({ label, onAdd, children = \"Add\" }: { label: ReactNode; onAdd: (() => void) | null; children?: ReactNode }) {\n return (\n <Row label={label}>\n {onAdd ? (\n <button type=\"button\" className=\"text-sm text-muted-foreground hover:text-primary\" onClick={onAdd}>\n {children}\n </button>\n ) : (\n <span className=\"text-disabled-foreground\">—</span>\n )}\n </Row>\n );\n}\n\n// ── edit ────────────────────────────────────────────────────────────────────\n\nexport function EditRow({ label, hint, value, onChange, placeholder, secret = false, multiline = false, onRemove, removeLabel, actions, autoFocus, onBlur, inputMode }: { label: ReactNode; hint?: ReactNode; value: string; onChange: (v: string) => void; placeholder?: string; secret?: boolean; multiline?: boolean; onRemove?: () => void; removeLabel?: string; actions?: ReactNode; autoFocus?: boolean; onBlur?: () => void; inputMode?: \"url\" | \"email\" | \"text\" }) {\n const [shown, setShown] = useState(false);\n return (\n <Row\n label={label}\n hint={hint}\n top={multiline}\n actions={\n <>\n {secret && value ? <Button variant=\"quiet\" icon={shown ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={shown ? \"Hide\" : \"Show\"} onClick={() => setShown((s) => !s)} /> : null}\n {actions}\n {onRemove ? <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label={removeLabel ?? \"Remove\"} onClick={onRemove} /> : null}\n </>\n }\n >\n {multiline ? (\n <Textarea className=\"w-full\" value={value} onChange={(e) => onChange(e.target.value)} rows={3} placeholder={placeholder} autoComplete=\"off\" spellCheck={!secret} {...(onBlur ? { onBlur } : {})} />\n ) : (\n <Field className={cn(\"w-full\", secret && shown && \"font-mono\")} value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} type={secret && !shown ? \"password\" : \"text\"} autoComplete=\"off\" spellCheck={false} {...(autoFocus ? { autoFocus } : {})} {...(onBlur ? { onBlur } : {})} {...(inputMode ? { inputMode } : {})} aria-label={typeof label === \"string\" && label ? label : (placeholder ?? \"Value\")} />\n )}\n </Row>\n );\n}\n\n/** A custom row whose label is typed too: \"Label | value\". */\nexport function CustomEditRow({ label, value, onLabel, onValue, secret, onRemove }: { label: string; value: string; onLabel: (v: string) => void; onValue: (v: string) => void; secret: boolean; onRemove: () => void }) {\n const [shown, setShown] = useState(false);\n return (\n <Row\n label={<Field className=\"w-full\" value={label} onChange={(e) => onLabel(e.target.value)} placeholder=\"Name\" aria-label=\"Field name\" />}\n actions={\n <>\n {secret && value ? <Button variant=\"quiet\" icon={shown ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={shown ? \"Hide\" : \"Show\"} onClick={() => setShown((x) => !x)} /> : null}\n <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label=\"Remove field\" onClick={onRemove} />\n </>\n }\n >\n <Field className=\"w-full\" value={value} onChange={(e) => onValue(e.target.value)} type={secret && !shown ? \"password\" : \"text\"} placeholder={secret ? \"Secret value\" : \"Value\"} autoComplete=\"off\" spellCheck={false} aria-label=\"Field value\" />\n </Row>\n );\n}\n","import { useCallback, useEffect, useLayoutEffect, useRef, useState, type RefObject } from \"react\";\n\n/** A revealed value, held in this component only and dropped after `ms` (default 20s) or on unmount. */\nexport function useTransientSecret(ms = 20_000) {\n const [value, setValue] = useState<string | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const clear = useCallback(() => {\n if (timer.current) clearTimeout(timer.current);\n timer.current = null;\n setValue(null);\n }, []);\n const show = useCallback(\n (next: string) => {\n if (timer.current) clearTimeout(timer.current);\n setValue(next);\n timer.current = setTimeout(clear, ms);\n },\n [clear, ms],\n );\n useEffect(() => clear, [clear]);\n return { value, show, clear };\n}\n\n/** The width of an element, so the workspace can pick full or compact by the room it is given. */\nexport function useElementWidth(ref: RefObject<HTMLElement | null>): number {\n const [width, setWidth] = useState(0);\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n setWidth(el.getBoundingClientRect().width);\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width;\n if (w !== undefined) setWidth(w);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref]);\n return width;\n}\n","/**\n * THE VAULT'S BUILDING BLOCKS. Every screen in this package is made of these, so the whole vault\n * reads as one calm, trustworthy surface:\n *\n * - `Section`: at most ONE card level. Rows inside it are separated by space, never by lines.\n * A card never sits inside another card.\n * - `Row`: label · value · actions on one line, always. Only a multi-line value (notes, a key)\n * grows downward, and its label stays beside it.\n * - `Panel`: anything bigger than a row (share, history, import…) opens in one panel — a window\n * on a desktop, a bottom sheet on a phone — named in the address (`?panel=`).\n * - Words are layout: labels ≤ 3 words, hints ≤ 60 characters, no sentences under titles.\n */\nimport { createContext, useContext, type ReactNode } from \"react\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system\";\n\n/** Inside a panel the panel IS the card: sections there draw no second box. */\nconst InPanel = createContext(false);\n\nexport function Section({ title, actions, children, className }: { title?: ReactNode; actions?: ReactNode; children: ReactNode; className?: string }) {\n const flat = useContext(InPanel);\n return (\n <section className={cn(\"flex flex-col gap-1.5\", className)}>\n {title || actions ? (\n <div className=\"flex min-h-7 items-center justify-between gap-2 px-1\">\n {title ? <h3 className=\"text-xs font-medium text-muted-foreground\">{title}</h3> : <span />}\n {actions ? <div className=\"flex items-center gap-1\">{actions}</div> : null}\n </div>\n ) : null}\n <div className={flat ? \"-mx-3 flex flex-col sm:-mx-4\" : \"flex flex-col rounded-xl border border-border bg-card py-1\"}>{children}</div>\n </section>\n );\n}\n\n/** One line: label, value, actions. The label column is narrower on a phone so the value keeps its room. */\nexport function Row({ label, hint, children, actions, top = false, className }: { label: ReactNode; hint?: ReactNode; children: ReactNode; actions?: ReactNode; top?: boolean; className?: string }) {\n return (\n <div className={cn(\"grid min-h-11 grid-cols-[5.75rem_minmax(0,1fr)_auto] gap-x-2 px-3 py-1 sm:grid-cols-[9rem_minmax(0,1fr)_auto] sm:gap-x-3 sm:px-4\", top ? \"items-start\" : \"items-center\", className)}>\n <div className={cn(\"flex min-w-0 flex-col text-xs leading-tight text-muted-foreground\", top && \"pt-2.5\")}>\n <span className=\"line-clamp-2 break-words sm:truncate\">{label}</span>\n {hint ? <span className=\"line-clamp-2 break-words text-xs text-disabled-foreground\">{hint}</span> : null}\n </div>\n <div className={cn(\"min-w-0 text-sm\", top && \"py-1.5\")}>{children}</div>\n <div className={cn(\"flex items-center gap-0.5\", top && \"pt-1\")}>{actions}</div>\n </div>\n );\n}\n\n/** A quiet line inside a section when it has nothing to list. */\nexport function Empty({ children }: { children: ReactNode }) {\n return <div className=\"px-4 py-3 text-sm text-muted-foreground\">{children}</div>;\n}\n\n/** THE panel: a window on a desktop, a bottom sheet on a phone. `footer` holds its actions. */\nexport function Panel({ title, open = true, onClose, children, footer, size = \"lg\" }: { title: ReactNode; open?: boolean; onClose: () => void; children: ReactNode; footer?: ReactNode; size?: \"sm\" | \"md\" | \"lg\" | \"xl\" }) {\n return (\n <Dialog open={open} onOpenChange={(o) => (o ? undefined : onClose())}>\n <DialogContent size={size}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n <InPanel.Provider value={true}>\n <div className=\"flex min-h-0 flex-col gap-4\">{children}</div>\n </InPanel.Provider>\n {footer ? <DialogFooter>{footer}</DialogFooter> : null}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Bytes as people read them. */\nexport function formatBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(n < 10 * 1024 ? 1 : 0)} KB`;\n return `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n\nexport function formatDate(iso: string | null | undefined, withTime = false): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toLocaleString(undefined, withTime ? { year: \"numeric\", month: \"short\", day: \"numeric\", hour: \"numeric\", minute: \"2-digit\" } : { year: \"numeric\", month: \"short\", day: \"numeric\" });\n}\n","/**\n * The pure half of the activity area: audit rows as sentences people read, day grouping, history\n * grouping, and the rules for what may be restored or downloaded. No React, no network.\n */\nimport { formatRelativeTime } from \"@ai-matrx/kit/format\";\nimport { humanize } from \"../definitions\";\nimport type { VaultAttachment, VaultItem } from \"../model\";\nimport type { AuditEntry, HistoryEntry, HistoryPage } from \"./port\";\n\n/** The server's per-file ceiling (`MAX_VAULT_ATTACHMENT_BYTES`, 25 MiB). */\nexport const MAX_FILE_BYTES = 25 * 1024 * 1024;\n\nexport const fileTooBig = (size: number): boolean => size > MAX_FILE_BYTES;\n\n/** Whether a person may save this file: never sealed; visible needs use, revealable needs reveal. */\nexport function canDownload(item: Pick<VaultItem, \"capabilities\">, file: Pick<VaultAttachment, \"handling\">): boolean {\n if (file.handling === \"sealed\") return false;\n return file.handling === \"visible\" ? item.capabilities.canUse : item.capabilities.canReveal;\n}\n\n/** History is kept only for the person's own items, and only someone who may reveal can read it. */\nexport function historyEligible(item: Pick<VaultItem, \"owner\" | \"capabilities\">): boolean {\n return item.owner.kind === \"me\" && item.capabilities.canReveal;\n}\n\n/** An entry can be restored when its value was kept and it is not already the current value. */\nexport function canRestore(page: Pick<HistoryPage, \"restoreAvailable\" | \"historyRevision\">, entry: HistoryEntry): boolean {\n return page.restoreAvailable && entry.available && entry.revision < page.historyRevision;\n}\n\n/** Two pages joined, newest first, without repeating an entry. */\nexport function mergePages(a: HistoryPage, b: HistoryPage): HistoryPage {\n const seen = new Set(a.entries.map((e) => `${e.fieldId}:${e.revision}`));\n return {\n ...b,\n historyRevision: a.historyRevision,\n restoreAvailable: a.restoreAvailable,\n entries: [...a.entries, ...b.entries.filter((e) => !seen.has(`${e.fieldId}:${e.revision}`))],\n omitted: a.omitted + b.omitted,\n incomplete: a.incomplete || b.incomplete,\n };\n}\n\n/** Entries per field, in the item's field order; fields the item no longer has come last. `focus` goes first. */\nexport function historyByField(item: Pick<VaultItem, \"fields\">, entries: readonly HistoryEntry[], focus: string | null = null): { fieldId: string; label: string; entries: HistoryEntry[] }[] {\n const groups = new Map<string, HistoryEntry[]>();\n for (const e of entries) groups.set(e.fieldId, [...(groups.get(e.fieldId) ?? []), e]);\n const order = item.fields.map((f) => f.id);\n const ids = [...groups.keys()].sort((x, y) => {\n if (x === focus) return -1;\n if (y === focus) return 1;\n const ix = order.indexOf(x), iy = order.indexOf(y);\n return (ix < 0 ? Infinity : ix) - (iy < 0 ? Infinity : iy);\n });\n return ids.map((id) => ({\n fieldId: id,\n label: item.fields.find((f) => f.id === id)?.label ?? \"Removed field\",\n entries: [...(groups.get(id) ?? [])].sort((a, b) => b.revision - a.revision),\n }));\n}\n\n// ── the audit trail as sentences ────────────────────────────────────────────\n\nconst ITEM: Record<string, string> = {\n totp_code_viewed: \"One-time code shown\",\n totp_generated: \"One-time code used\",\n totp_enabled: \"One-time password turned on\",\n totp_disabled: \"One-time password turned off\",\n totp_denied: \"One-time code refused\",\n totp_enrolled: \"One-time password set up\",\n totp_deleted: \"One-time password removed\",\n item_created: \"Item created\",\n item_updated: \"Item edited\",\n item_deleted: \"Moved to trash\",\n item_restored_quarantined: \"Restored from trash\",\n item_shared: \"Shared\",\n item_transferred: \"Moved\",\n item_transferred_out: \"Moved out\",\n item_forked: \"Copied\",\n item_assigned: \"Assigned\",\n grant_changed: \"Access changed\",\n permissions_changed: \"Access changed\",\n revoked: \"Access removed\",\n denied: \"Access refused\",\n exported: \"Exported\",\n synced_from_user: \"Synced\",\n fields_retired_on_transfer: \"Fields retired on move\",\n authenticator: \"One-time password changed\",\n password_history_revealed: \"Old password shown\",\n password_history_restored: \"Old password restored\",\n password_history_reveal_denied: \"Old password refused\",\n browser_materialized: \"Filled in a browser\",\n browser_captured: \"Saved from a browser\",\n browser_capture_denied: \"Browser save refused\",\n browser_capture_context: \"Browser page read\",\n browser_login_url_learned: \"Website learned\",\n browser_login_result: \"Browser sign-in\",\n browser_match_denied: \"Browser fill refused\",\n browser_recipe_proposed: \"Sign-in steps proposed\",\n browser_inventory_listed: \"Listed for a browser\",\n native_password_materialized: \"Filled on a device\",\n native_passkey_created: \"Passkey created\",\n native_passkey_enabled: \"Passkey turned on\",\n native_passkey_imported: \"Passkey imported\",\n native_passkey_exported: \"Passkey exported\",\n native_passkey_materialized: \"Passkey used\",\n native_identity_inventory: \"Listed for a device\",\n action_link_captured: \"Link saved\",\n action_link_capture_denied: \"Link save refused\",\n};\n\n/** `{f}` is the field's name. */\nconst FIELD: Record<string, string> = {\n revealed: \"{f} shown\",\n reveal_denied: \"{f} refused\",\n created: \"{f} added\",\n field_added: \"{f} added\",\n updated: \"{f} changed\",\n rotated: \"{f} changed\",\n field_updated: \"{f} settings changed\",\n deleted: \"{f} removed\",\n field_deleted: \"{f} removed\",\n used: \"{f} used\",\n use: \"{f} used\",\n};\n\n/** A field verb with no field named: the event is about the whole item. */\nconst WHOLE_ITEM: Record<string, string> = {\n revealed: \"Value shown\",\n reveal_denied: \"Showing refused\",\n created: \"Item created\",\n field_added: \"Field added\",\n updated: \"Item edited\",\n rotated: \"Value changed\",\n field_updated: \"Field settings changed\",\n deleted: \"Moved to trash\",\n field_deleted: \"Field removed\",\n used: \"Used\",\n use: \"Used\",\n};\n\n/** `{n}` is the file's name. */\nconst FILE: Record<string, string> = {\n attachment_added: \"File {n} added\",\n attachment_updated: \"File {n} edited\",\n attachment_replaced: \"File {n} replaced\",\n attachment_deleted: \"File {n} deleted\",\n attachment_downloaded: \"File {n} downloaded\",\n attachment_download_denied: \"File {n} refused\",\n};\n\nconst str = (v: unknown): string | null => (typeof v === \"string\" && v.trim() ? v : null);\n\nexport interface AuditSentence {\n /** \"Password shown\". */\n what: string;\n /** \"by you\", \"by someone else\", \"by automation\", or null when the actor is unknown to us. */\n who: string | null;\n /** A refusal reads in the destructive colour. */\n refused: boolean;\n}\n\n/**\n * One audit row as people read it. `me` is the signed-in person's id when the host knows it; without\n * it, nobody is named \"you\" (a guess would be a lie).\n */\nexport function auditSentence(entry: AuditEntry, item: Pick<VaultItem, \"fields\" | \"attachments\">, me: string | null): AuditSentence {\n const m = entry.metadata;\n const field = (entry.fieldId ? item.fields.find((f) => f.id === entry.fieldId) : undefined) ?? item.fields.find((f) => f.key === str(m[\"field_key\"]));\n const keys = Array.isArray(m[\"field_keys\"]) ? (m[\"field_keys\"] as unknown[]).map(str).filter((k): k is string => k !== null) : [];\n const fieldName = (field?.key ?? str(m[\"field_key\"])) === \"totp_seed\" ? \"One-time password\" : field?.label ?? (str(m[\"field_key\"]) ? humanize(str(m[\"field_key\"]) as string) : keys.length ? keys.map((k) => item.fields.find((f) => f.key === k)?.label ?? humanize(k)).join(\", \") : null);\n const fileName = str(m[\"file_name\"]) ?? item.attachments.find((a) => a.id === str(m[\"attachment_id\"]))?.fileName ?? null;\n\n let what: string;\n const fileRule = FILE[entry.action];\n const fieldRule = FIELD[entry.action];\n if (fileRule) what = fileName ? fileRule.replace(\"{n}\", fileName) : fileRule.replace(\" {n}\", \"\");\n else if (entry.action === \"field_updated\" && m[\"metadata_only\"] !== true && fieldName) what = `${fieldName} changed`;\n // A visible field (a username) read by a browser is the vault SHOWING it, not someone using it.\n else if (entry.action === \"used\" && m[\"consumer\"] === \"browser\" && fieldName && field?.handling === \"visible\") what = `${fieldName} shown`;\n else if (fieldRule && fieldName) what = fieldRule.replace(\"{f}\", fieldName);\n else if (fieldRule) what = entry.fieldId ? fieldRule.replace(\"{f}\", \"A field\") : WHOLE_ITEM[entry.action] ?? humanize(entry.action);\n else what = ITEM[entry.action] ?? humanize(entry.action.replace(/^totp_/, \"one_time_password_\"));\n\n const who = entry.actorId === null ? \"by automation\" : me === null ? null : entry.actorId === me ? \"by you\" : \"by someone else\";\n return { what, who, refused: /denied|refused/.test(entry.action) };\n}\n\n// ── days ────────────────────────────────────────────────────────────────────\n\nconst dayKey = (d: Date): string => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n\n/** \"Today\", \"Yesterday\", a weekday within the week, else a date. */\nexport function dayLabel(iso: string, now: Date = new Date()): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"Unknown day\";\n if (dayKey(d) === dayKey(now)) return \"Today\";\n const y = new Date(now);\n y.setDate(now.getDate() - 1);\n if (dayKey(d) === dayKey(y)) return \"Yesterday\";\n const days = (now.getTime() - d.getTime()) / 86_400_000;\n if (days > 0 && days < 7) return d.toLocaleDateString(undefined, { weekday: \"long\" });\n return d.toLocaleDateString(undefined, { year: d.getFullYear() === now.getFullYear() ? undefined : \"numeric\", month: \"short\", day: \"numeric\" });\n}\n\n/** Entries grouped by local day, newest day first, order kept inside a day. */\nexport function groupByDay<T extends { at: string }>(entries: readonly T[], now: Date = new Date()): { label: string; entries: T[] }[] {\n const groups: { key: string; label: string; entries: T[] }[] = [];\n for (const e of entries) {\n const d = new Date(e.at);\n const key = Number.isNaN(d.getTime()) ? \"?\" : dayKey(d);\n const last = groups[groups.length - 1];\n if (last && last.key === key) last.entries.push(e);\n else groups.push({ key, label: dayLabel(e.at, now), entries: [e] });\n }\n return groups.map(({ label, entries: list }) => ({ label, entries: list }));\n}\n\n/** Today: \"2h ago\". Any other day (its date is the heading): the time, \"3:42 PM\". */\nexport function whenInDay(iso: string, now: Date = new Date()): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n if (dayKey(d) === dayKey(now)) return formatRelativeTime(iso, { now: now.getTime() });\n return d.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/**\n * Back-to-back identical lines (a username read each time the item opened, a code read every 30 s)\n * become one line with a count, so the trail shows what happened instead of how often it was looked at.\n */\nexport function collapseRuns<T>(rows: readonly T[], keyOf: (row: T) => string): { row: T; times: number }[] {\n // Within one day: the same line anywhere in it counts on its first (newest) appearance, so a\n // username read and a code read alternating all day are two lines, not two hundred.\n const out: { row: T; times: number }[] = [];\n const at = new Map<string, { row: T; times: number }>();\n for (const row of rows) {\n const k = keyOf(row);\n const seen = at.get(k);\n if (seen) seen.times += 1;\n else {\n const entry = { row, times: 1 };\n at.set(k, entry);\n out.push(entry);\n }\n }\n return out;\n}\n","/**\n * The Vault as the screens see it. Hosts map the wire shape into this once, in their VaultPort\n * (`createApiVaultPort` does it for every host that talks to the server). Plaintext never lives\n * here: an encrypted field carries a masked hint, and a revealed value is held only by\n * `useTransientSecret` in the row showing it.\n */\n\n/** Who may see a field's value. Mirrors the server contract: sealed has no human path, ever. */\nexport type FieldHandling = \"visible\" | \"revealable\" | \"sealed\";\nexport type FieldKind = \"text\" | \"secret\" | \"url\" | \"multiline\";\n\nexport interface VaultField {\n id: string;\n /** Stable key inside the item (`username`, `password`). */\n key: string;\n label: string;\n kind: FieldKind;\n handling: FieldHandling;\n editable: boolean;\n envKey: string | null;\n injectIntoSandbox: boolean;\n /** Plain words about this field (`fields/` edits it). */\n description: string;\n /** Off = kept, but not used by anything. Inactive fields stay on the item so they can be turned back on. */\n active: boolean;\n}\n\n/** A plaintext custom field (the server's `non_secret_fields`): label + value, never encrypted. */\nexport interface VaultCustomField {\n key: string;\n label: string;\n value: string;\n}\n\nexport interface VaultOwner {\n kind: \"me\" | \"organization\" | \"shared\";\n label: string;\n organizationId: string | null;\n}\n\nexport interface VaultItemCapabilities {\n canUse: boolean;\n canEdit: boolean;\n canReveal: boolean;\n canManage: boolean;\n}\n\nexport interface VaultAuthenticator {\n digits: number;\n period: number;\n enabled: boolean;\n}\n\nexport interface VaultAttachment {\n id: string;\n label: string;\n /** What the file is for (\"Signs App Store requests\"); \"\" when none. */\n description: string;\n fileName: string;\n mediaType: string;\n sizeBytes: number;\n handling: FieldHandling;\n createdAt: string;\n updatedAt: string;\n}\n\n/** How the browser decides an item matches a page. */\nexport type UriMatchMode = \"host\" | \"domain\" | \"exact\" | \"never\";\n\nexport interface VaultItem {\n id: string;\n name: string;\n description: string;\n definitionKey: string;\n definitionLabel: string;\n owner: VaultOwner;\n tags: string[];\n loginUrls: string[];\n notes: string;\n fields: VaultField[];\n custom: VaultCustomField[];\n authenticator: VaultAuthenticator | null;\n capabilities: VaultItemCapabilities;\n attachments: VaultAttachment[];\n uriMatchMode: UriMatchMode;\n browserFillEnabled: boolean;\n /** `all_members` / `restricted` for an organization item. */\n accessMode: string | null;\n /** The person who owns the item (`user_id`). For the person's own items this is them. */\n ownerUserId: string | null;\n /** Set when the item is in the trash: what restoring it needs. */\n deletion: { deletionId: string | null; deletedAt: string | null } | null;\n updatedAt: string;\n createdAt: string;\n}\n\nexport interface VaultOrganizationRef {\n id: string;\n name: string;\n}\n\n// ── location: everything the address carries ────────────────────────────────\n\nexport type VaultSort = \"name\" | \"website\" | \"updated\" | \"created\";\n\n/** Which vault to look in. `all` is everything the person can see, shared with them included. */\nexport type VaultSelection = \"all\" | \"mine\" | \"shared\" | (string & {});\n\nexport interface VaultLocation {\n vault: VaultSelection;\n /** `all`, `favorites`, `authenticator`, `trash`, `category:<id>`, `type:<definitionKey>` or `tag:<tag>`. */\n view: string;\n q: string;\n sort: VaultSort;\n /** The open item; null = none. */\n itemId: string | null;\n mode: \"view\" | \"edit\" | \"new\";\n /** New-item flow: the chosen definition, and the URL pasted at the start (kept across steps). */\n kind: string | null;\n url: string;\n /** A panel open over the workspace: `share`, `history`, `activity`, `files`, `move`, `import`, … */\n panel: string | null;\n}\n\nexport const DEFAULT_LOCATION: VaultLocation = { vault: \"all\", view: \"all\", q: \"\", sort: \"name\", itemId: null, mode: \"view\", kind: null, url: \"\", panel: null };\n\nconst SORTS: readonly VaultSort[] = [\"name\", \"website\", \"updated\", \"created\"];\n\n/** Reads a location from query params. The item id is the host's to place (a path or a param). */\nexport function locationFromParams(params: URLSearchParams, itemId: string | null = params.get(\"item\")): VaultLocation {\n const sort = params.get(\"sort\");\n const mode = params.get(\"mode\");\n return {\n vault: params.get(\"vault\") || DEFAULT_LOCATION.vault,\n view: params.get(\"view\") || DEFAULT_LOCATION.view,\n q: params.get(\"q\") ?? \"\",\n sort: SORTS.find((s) => s === sort) ?? DEFAULT_LOCATION.sort,\n itemId,\n mode: mode === \"edit\" || mode === \"new\" ? mode : \"view\",\n kind: params.get(\"kind\"),\n url: params.get(\"url\") ?? \"\",\n panel: params.get(\"panel\"),\n };\n}\n\n/** Writes everything that is not a default (and not the item id, which the host places). */\nexport function locationToParams(loc: VaultLocation): URLSearchParams {\n const q = new URLSearchParams();\n if (loc.vault !== DEFAULT_LOCATION.vault) q.set(\"vault\", loc.vault);\n if (loc.view !== DEFAULT_LOCATION.view) q.set(\"view\", loc.view);\n if (loc.q) q.set(\"q\", loc.q);\n if (loc.sort !== DEFAULT_LOCATION.sort) q.set(\"sort\", loc.sort);\n if (loc.mode !== \"view\") q.set(\"mode\", loc.mode);\n if (loc.kind) q.set(\"kind\", loc.kind);\n if (loc.url) q.set(\"url\", loc.url);\n if (loc.panel) q.set(\"panel\", loc.panel);\n return q;\n}\n\n// ── filtering ───────────────────────────────────────────────────────────────\n\nexport function inVault(item: VaultItem, vault: VaultSelection): boolean {\n if (vault === \"all\") return true;\n if (vault === \"mine\") return item.owner.kind === \"me\";\n if (vault === \"shared\") return item.owner.kind === \"shared\";\n return item.owner.organizationId === vault;\n}\n\nexport function inView(item: VaultItem, view: string): boolean {\n if (view === \"all\") return true;\n if (view.startsWith(\"type:\")) return item.definitionKey === view.slice(5);\n if (view.startsWith(\"tag:\")) return item.tags.includes(view.slice(4));\n return true;\n}\n\n/** The one search every list shares: name, type, tags, URLs, then plaintext custom fields. */\nexport function matchesQuery(item: VaultItem, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n return [item.name, item.definitionLabel, ...item.tags, ...item.loginUrls, ...item.custom.map((c) => `${c.label} ${c.value}`)].some((h) => h.toLowerCase().includes(q));\n}\n\n/**\n * The authenticator's own storage on an item (the seed, digits, period, issuer…): shown only as the\n * one \"One-time password\" row, never as loose fields — and always kept when the item is saved.\n */\nexport const isAuthenticatorStorage = (key: string): boolean => key === \"totp_seed\" || key.startsWith(\"totp_\") || key === \"authenticator_last_time_step\";\n\n/** An item's website as people read it: `github.com` (no scheme, no `www.`), or \"\" when it has none. */\nexport function siteOf(item: Pick<VaultItem, \"loginUrls\">): string {\n const raw = item.loginUrls[0];\n if (!raw) return \"\";\n try {\n return new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`).hostname.replace(/^www\\./, \"\");\n } catch {\n return raw.replace(/^https?:\\/\\//, \"\").replace(/^www\\./, \"\").split(\"/\")[0] ?? \"\";\n }\n}\n\nexport function sortItems(items: readonly VaultItem[], sort: VaultSort): VaultItem[] {\n const out = [...items];\n const byName = (a: VaultItem, b: VaultItem) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" });\n if (sort === \"name\") return out.sort(byName);\n // Items with no website sort after every website, by name.\n if (sort === \"website\") return out.sort((a, b) => { const x = siteOf(a), y = siteOf(b); return x && y ? x.localeCompare(y) || byName(a, b) : x ? -1 : y ? 1 : byName(a, b); });\n if (sort === \"updated\") return out.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));\n return out.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\n// ── drafts: what edit and new share ─────────────────────────────────────────\n\nexport interface NewSecretField {\n key: string;\n label: string;\n value: string;\n}\n\nexport interface ItemDraft {\n name: string;\n description: string;\n tags: string[];\n loginUrls: string[];\n notes: string;\n /** New values for encrypted fields the definition declares, by field key. Absent = unchanged. */\n values: Record<string, string>;\n /** Encrypted custom fields added in this edit. */\n secrets: NewSecretField[];\n /** The plaintext custom fields, complete. */\n custom: VaultCustomField[];\n /** Ids of encrypted fields to delete. */\n removed: string[];\n /** A seed or otpauth address to enrol as the item's one-time password; empty = leave alone. */\n authenticator: string;\n}\n\nexport function draftOf(item: VaultItem | null): ItemDraft {\n return {\n name: item?.name ?? \"\",\n description: item?.description ?? \"\",\n tags: item ? [...item.tags] : [],\n loginUrls: item ? [...item.loginUrls] : [],\n notes: item?.notes ?? \"\",\n values: {},\n secrets: [],\n custom: item ? item.custom.map((c) => ({ ...c })) : [],\n removed: [],\n authenticator: \"\",\n };\n}\n\nconst same = (a: readonly string[], b: readonly string[]) => a.length === b.length && a.every((v, i) => v === b[i]);\n\n/** Field values the person changed (a prefilled value left alone is not a change). */\nexport function changedValues(base: ItemDraft, now: ItemDraft): [string, string][] {\n return Object.entries(now.values).filter(([k, v]) => v !== (base.values[k] ?? \"\"));\n}\n\n/** True when saving would change anything. The pane shows this at all times while editing. */\nexport function isDirty(base: ItemDraft, now: ItemDraft): boolean {\n return (\n base.name !== now.name ||\n base.description !== now.description ||\n base.notes !== now.notes ||\n !same(base.tags, now.tags) ||\n !same(base.loginUrls, now.loginUrls) ||\n changedValues(base, now).length > 0 ||\n now.secrets.some((s) => s.value !== \"\" || s.label !== \"\") ||\n now.removed.length > 0 ||\n now.authenticator !== \"\" ||\n JSON.stringify(base.custom) !== JSON.stringify(now.custom)\n );\n}\n\n/** A field key from a label: lowercase snake, starting with a letter. */\nexport function fieldKeyOf(label: string): string {\n const k = label.trim().toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n return /^[a-z]/.test(k) ? k : `f_${k}`;\n}\n\n/**\n * The item changed on the server WHILE it was being edited (a two-factor method saved on its own, a\n * file added, a one-time password set up): start from the new item, and carry over everything the\n * person had changed. Without this, a live change wiped every unsaved edit.\n */\nexport function rebaseDraft(oldBase: ItemDraft, newBase: ItemDraft, draft: ItemDraft): ItemDraft {\n const pick = <K extends keyof ItemDraft>(k: K): ItemDraft[K] => (JSON.stringify(draft[k]) !== JSON.stringify(oldBase[k]) ? draft[k] : newBase[k]);\n const oldCustom = new Map(oldBase.custom.map((c) => [c.key, c]));\n const draftCustom = new Map(draft.custom.map((c) => [c.key, c]));\n const custom = [\n // The server's fields now, each replaced by the person's version where they changed or removed it.\n ...newBase.custom\n .map((c) => {\n const before = oldCustom.get(c.key);\n const mine = draftCustom.get(c.key);\n if (before && !mine) return null; // the person removed it\n return mine && JSON.stringify(mine) !== JSON.stringify(before) ? mine : c;\n })\n .filter((c): c is VaultCustomField => c !== null),\n // Fields the person added in this edit.\n ...draft.custom.filter((c) => !oldCustom.has(c.key) && !newBase.custom.some((n) => n.key === c.key)),\n ];\n return {\n name: pick(\"name\"),\n description: pick(\"description\"),\n tags: pick(\"tags\"),\n loginUrls: pick(\"loginUrls\"),\n notes: pick(\"notes\"),\n values: { ...newBase.values, ...Object.fromEntries(changedValues(oldBase, draft)) },\n secrets: draft.secrets,\n custom,\n removed: draft.removed,\n authenticator: draft.authenticator,\n };\n}\n","import { isAuthenticatorStorage, type FieldHandling, type FieldKind } from \"./model\";\n\n/** One field a credential type declares. */\nexport interface DefinitionField {\n key: string;\n label: string;\n kind: FieldKind;\n handling: FieldHandling;\n /** `metadata` fields are plaintext columns of the item; `encrypted` ones are secrets. */\n storage: \"metadata\" | \"encrypted\";\n required: boolean;\n}\n\n/** A credential type from the platform catalog (e.g. \"GitHub personal access token\"). */\nexport interface VaultDefinition {\n key: string;\n label: string;\n family: string;\n providerKey: string | null;\n description: string;\n fields: readonly DefinitionField[];\n sortOrder: number;\n}\n\nexport const FAMILY_LABELS: Record<string, string> = {\n generic: \"Generic\",\n ai_providers: \"AI & model providers\",\n source_control: \"Source control & dev tools\",\n cloud_infrastructure: \"Cloud & infrastructure\",\n databases: \"Databases & data services\",\n hosting_deployment: \"Hosting & deployment\",\n server_network: \"Server & network access\",\n domains_dns_cdn: \"Domains, DNS & CDN\",\n messaging_communications: \"Messaging & communications\",\n payments_commerce: \"Payments & commerce\",\n business_platforms: \"Business platforms\",\n analytics_marketing: \"Analytics & marketing\",\n cms_content: \"CMS & content\",\n identity_security: \"Identity & security\",\n automation_integrations: \"Automation & integrations\",\n signing_files: \"Signing & files\",\n};\n\n/** The types offered first in \"New item\" (those that exist in the catalog), in this order. */\nexport const COMMON_DEFINITION_KEYS = [\"website_login\", \"username_password\", \"api_key\", \"env_value\", \"database_login\", \"custom\"] as const;\n\nconst MULTILINE = /(json|pem|private_key|certificate|cert|bundle|document|recovery_codes)/;\nconst SECRET = /(password|secret|token|api_key|private|passphrase|credential|seed|key$|_key)/;\nconst URLISH = /(url|uri|endpoint|webhook|hook)/;\n\nexport function humanize(key: string): string {\n const s = key.replace(/_/g, \" \").trim();\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction kindOf(key: string, handling: FieldHandling, format: string | null): FieldKind {\n if (format === \"password\") return \"secret\";\n if (format === \"url\") return \"url\";\n if (format === \"multiline\") return \"multiline\";\n if (MULTILINE.test(key)) return \"multiline\";\n if (handling !== \"visible\" && SECRET.test(key)) return \"secret\";\n if (URLISH.test(key)) return \"url\";\n return handling === \"visible\" ? \"text\" : \"secret\";\n}\n\ntype Json = unknown;\nconst obj = (v: Json): Record<string, Json> | null => (typeof v === \"object\" && v !== null && !Array.isArray(v) ? (v as Record<string, Json>) : null);\nconst str = (v: Json): string | null => (typeof v === \"string\" ? v : null);\n\nfunction parseFields(raw: Json): DefinitionField[] {\n if (!Array.isArray(raw)) return [];\n const out: DefinitionField[] = [];\n for (const f of raw) {\n const o = obj(f);\n const key = o ? str(o[\"field_key\"]) : null;\n if (!o || !key) continue;\n // The address list and the notes are the item's own first-class rows; the one-time-password seed\n // is the authenticator row. A definition declaring them must not draw a second copy.\n const format = str(o[\"format\"]);\n if (key === \"login_urls\" || key === \"notes\" || format === \"totp_secret\" || isAuthenticatorStorage(key)) continue;\n const h = str(o[\"handling\"]);\n const handling: FieldHandling = h === \"visible\" || h === \"sealed\" ? h : \"revealable\";\n const storage = o[\"storage_class\"] === \"metadata\" ? \"metadata\" : \"encrypted\";\n out.push({ key, label: str(o[\"label\"]) ?? humanize(key), kind: kindOf(key, handling, format), handling, storage, required: o[\"required\"] === true });\n }\n return out;\n}\n\n/** Catalog rows -> definitions. A preset's own fields replace its base's; with none it inherits them. */\nexport function parseDefinitions(entries: readonly { key: string; payload: Record<string, unknown>; sort_order?: number }[]): VaultDefinition[] {\n const byKey = new Map(entries.map((e) => [e.key, e.payload]));\n const own = (p: Record<string, unknown>) => parseFields(p[\"fields\"]);\n return entries\n .map((e) => {\n const p = e.payload;\n let fields = own(p);\n const base = str(p[\"base_definition_key\"]);\n if (fields.length === 0 && base) {\n const bp = byKey.get(base);\n if (bp) fields = own(bp);\n }\n return {\n key: e.key,\n label: str(p[\"label\"]) ?? humanize(e.key),\n family: str(p[\"family\"]) ?? \"generic\",\n providerKey: str(p[\"provider_key\"]),\n description: str(p[\"description\"]) ?? \"\",\n fields,\n sortOrder: e.sort_order ?? 0,\n } satisfies VaultDefinition;\n })\n .filter((d) => d.fields.length > 0 || d.key === \"secure_file\");\n}\n\n/** What a pasted address tells us: a name, the address itself, and the best-fitting type. */\nexport interface UrlGuess {\n name: string;\n url: string;\n definitionKey: string | null;\n /** True when the address belongs to a provider the catalog knows. */\n recognised: boolean;\n /** That provider's own types (its tokens, its apps), offered beside the login. */\n alternatives: readonly string[];\n}\n\nexport function inferFromUrl(raw: string, definitions: readonly VaultDefinition[]): UrlGuess | null {\n const text = raw.trim();\n if (!text) return null;\n let url: URL;\n try {\n url = new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(text) ? text : `https://${text}`);\n } catch {\n return null;\n }\n if (!url.hostname.includes(\".\")) return null;\n const labels = url.hostname.replace(/^www\\./, \"\").split(\".\");\n const brand = labels.length > 1 ? (labels[labels.length - 2] ?? labels[0] ?? \"\") : (labels[0] ?? \"\");\n // A pasted address is almost always a sign-in: it becomes a Website login. A provider's own types\n // (its tokens, its apps) are offered beside it, never chosen for the person.\n const login = definitions.find((d) => d.key === \"website_login\") ?? definitions.find((d) => d.key === \"username_password\");\n const alternatives = definitions.filter((d) => d.providerKey !== null && d.providerKey.toLowerCase() === brand.toLowerCase()).map((d) => d.key);\n return {\n name: brandName(brand, definitions),\n url: url.toString().replace(/\\/$/, \"\"),\n definitionKey: login?.key ?? null,\n recognised: alternatives.length > 0,\n alternatives,\n };\n}\n\n/**\n * THE CATEGORIES people browse by (1Password's left list), instead of the catalog's 130 raw types.\n * Every type lands in exactly one, by its key and family; the raw type still shows on each item.\n */\nexport const CATEGORIES = [\n { id: \"logins\", label: \"Logins\" },\n { id: \"passkeys\", label: \"Passkeys\" },\n { id: \"api\", label: \"API keys & tokens\" },\n { id: \"oauth\", label: \"Apps & OAuth\" },\n { id: \"infra\", label: \"Servers & databases\" },\n { id: \"env\", label: \"Environment values\" },\n { id: \"files\", label: \"Files & certificates\" },\n { id: \"other\", label: \"Other\" },\n] as const;\n\nexport type CategoryId = (typeof CATEGORIES)[number][\"id\"];\n\nconst INFRA_FAMILIES = new Set([\"databases\", \"server_network\", \"cloud_infrastructure\", \"hosting_deployment\", \"domains_dns_cdn\"]);\n\nexport function categoryOf(key: string, family: string): CategoryId {\n const k = key.toLowerCase();\n if (k.includes(\"passkey\")) return \"passkeys\";\n if (k === \"website_login\" || k === \"username_password\" || /(^|_)(login|account|seller)(_|$)/.test(k)) return INFRA_FAMILIES.has(family) ? \"infra\" : \"logins\";\n if (k === \"env_value\" || k.startsWith(\"env_\")) return \"env\";\n if (/oauth|oidc|client|application|(^|_)app(_|$)|notifications|mcp/.test(k)) return \"oauth\";\n if (INFRA_FAMILIES.has(family) || /database|server|ssh|host/.test(k)) return \"infra\";\n if (family === \"signing_files\" || /file|cert|pem|signing/.test(k)) return \"files\";\n if (family === \"ai_providers\" || /api|token|pat$|_pat_|secret_key|credentials?$/.test(k)) return \"api\";\n return \"other\";\n}\n\n/** A brand as its own catalog spells it (\"GitHub\", not \"Github\"), else the address's name, capitalised. */\nexport function brandName(brand: string, definitions: readonly VaultDefinition[]): string {\n const b = brand.toLowerCase();\n for (const d of definitions) {\n if (d.providerKey?.toLowerCase() !== b) continue;\n const first = d.label.split(/\\s+/)[0] ?? \"\";\n if (first.toLowerCase() === b) return first;\n }\n return humanize(brand);\n}\n","import type { FieldHandling, VaultAttachment, VaultItem } from \"../model\";\n\n/** One recorded earlier value of a secret field. Value-free: the value comes only from `revealHistory`. */\nexport interface HistoryEntry {\n fieldId: string;\n revision: number;\n recordedAt: string;\n /** False when the server kept the change but not its value (it can be neither shown nor restored). */\n available: boolean;\n}\n\n/** One page of an item's history, newest first. */\nexport interface HistoryPage {\n entries: HistoryEntry[];\n /** The chain head. A restore names it so a change made meanwhile is refused, never overwritten. */\n historyRevision: number;\n /** False when nothing on this item can be restored at all. */\n restoreAvailable: boolean;\n /** When capture began; earlier values were never recorded. */\n captureStartedAt: string | null;\n /** Pass to `history` for the next (older) page; null = no more. */\n nextBefore: number | null;\n /** Entries the server left out (unreadable), so the timeline is incomplete. */\n omitted: number;\n incomplete: boolean;\n}\n\n/** Thrown by `restoreHistory` when the history moved since it was read (server 409). */\nexport class HistoryChangedError extends Error {\n constructor() {\n super(\"History changed. Review it again.\");\n this.name = \"HistoryChangedError\";\n }\n}\n\n/** One audit row: what happened, who did it, when. Never a value. */\nexport interface AuditEntry {\n id: string;\n action: string;\n /** Null when the platform itself acted (automation, a scheduled job). */\n actorId: string | null;\n /** The encrypted field the event is about, when it is about one. */\n fieldId: string | null;\n metadata: Record<string, unknown>;\n at: string;\n}\n\n/** New or changed file details. `description: null` clears it. */\nexport interface FileDetails {\n label?: string;\n description?: string | null;\n fileName?: string;\n handling?: FieldHandling;\n}\n\n/** What happened to an item: password history, the audit trail, and its protected files. */\nexport interface ActivityPort {\n /** Personal items only (the server refuses others). `before` = `nextBefore` of the previous page. */\n history(item: VaultItem, before?: number | null): Promise<HistoryPage>;\n /** Audited; needs a recent sign-in. */\n revealHistory(item: VaultItem, fieldId: string, revision: number): Promise<string>;\n /** Makes an earlier value current again. Rejects with `HistoryChangedError` when the history moved. */\n restoreHistory(item: VaultItem, fieldId: string, revision: number, expectedHistoryRevision: number): Promise<VaultItem>;\n /** Newest first. The server has no cursor, only a limit (1–500). */\n audit(item: VaultItem, limit: number): Promise<AuditEntry[]>;\n /** Each returns the item as the server now has it. */\n addFile(item: VaultItem, file: File, details: { label: string; description: string | null; handling: FieldHandling }): Promise<VaultItem>;\n updateFile(item: VaultItem, attachmentId: string, details: FileDetails): Promise<VaultItem>;\n replaceFile(item: VaultItem, attachmentId: string, file: File): Promise<VaultItem>;\n deleteFile(item: VaultItem, attachmentId: string): Promise<VaultItem>;\n /** The decrypted bytes. Audited; sealed files are always refused. */\n downloadFile(item: VaultItem, attachment: VaultAttachment): Promise<Uint8Array>;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { wasCancelled } from \"../auth/IdentityGate\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { Empty, Panel, Section, formatDate } from \"../ui\";\nimport { auditSentence, collapseRuns, groupByDay, whenInDay } from \"./logic\";\nimport type { AuditEntry } from \"./port\";\n\n/** The server has no cursor, only a limit (1–500), so \"Show more\" asks for a longer list. */\nconst PAGE = 50;\nconst MAX = 500;\n\n/**\n * The item's audit trail as plain sentences (\"Password shown · by you · 2h ago\"), grouped by day.\n * Nothing here is a value. \"you\" is known only for the person's own items: the audit names actors by\n * id, and on an organization's item there is no way to tell which id is the person reading.\n */\nexport function ActivityPanel({ item, port, onClose }: ItemPanelProps) {\n const [limit, setLimit] = useState(PAGE);\n const [entries, setEntries] = useState<AuditEntry[] | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const generation = useRef(0);\n\n useEffect(() => {\n const g = ++generation.current;\n setLoading(true);\n setError(null);\n port.activity.audit(item, limit).then(\n (list) => generation.current === g && setEntries(list),\n (e: unknown) => generation.current === g && setError(wasCancelled(e) ? null : e instanceof Error ? e.message : \"Activity could not be read.\"),\n ).finally(() => generation.current === g && setLoading(false));\n return () => {\n generation.current += 1;\n };\n }, [port, item, limit]);\n\n const me = item.owner.kind === \"me\" ? item.ownerUserId : null;\n const now = new Date();\n const hasMore = entries !== null && entries.length >= limit && limit < MAX;\n\n return (\n <Panel\n title=\"Activity\"\n onClose={onClose}\n footer={hasMore ? <Button variant=\"outline\" disabled={loading} onClick={() => setLimit((n) => Math.min(MAX, n * 2))}>{loading ? \"Loading…\" : \"Show more\"}</Button> : undefined}\n >\n {error ? <p role=\"alert\" className=\"px-1 text-sm text-destructive\">{error}</p> : null}\n {entries === null ? (\n loading ? <Empty>Reading activity…</Empty> : null\n ) : entries.length === 0 ? (\n <Empty>Nothing has happened yet.</Empty>\n ) : (\n groupByDay(entries, now).map((day) => (\n <Section key={day.label} title={day.label}>\n {collapseRuns(\n day.entries.map((entry) => ({ entry, s: auditSentence(entry, item, me) })),\n (r) => `${r.s.what}|${r.s.who ?? \"\"}`,\n ).map(({ row: { entry, s }, times }) => {\n return (\n <div key={entry.id} className=\"flex min-h-9 items-center gap-1.5 px-3 text-sm sm:px-4\" title={formatDate(entry.at, true)}>\n <span className={cn(\"truncate\", s.refused ? \"text-destructive\" : \"text-foreground\")}>{s.what}</span>\n <span className=\"shrink-0 text-muted-foreground\">\n {times > 1 ? ` · ${times} times` : \"\"}\n {s.who ? ` · ${s.who}` : \"\"} · {whenInDay(entry.at, now)}\n </span>\n </div>\n );\n })}\n </Section>\n ))\n )}\n </Panel>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, TextInputDialog } from \"@ai-matrx/design-system\";\nimport type { VaultViewProps } from \"../area-props\";\nimport { CopyGlyph, definitionGlyph, ExternalGlyph, MoreGlyph, PencilGlyph, PlusGlyph, PowerGlyph, ShieldGlyph, TrashGlyph } from \"../glyphs\";\nimport { matchesQuery, siteOf, type VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Section } from \"../ui\";\nimport { AddOtpPanel } from \"./AddOtpPanel\";\nimport { CodeButton, useCopied } from \"./CodeParts\";\nimport { useLiveCode } from \"./live-code\";\nimport type { AuthenticatorEntry } from \"./port\";\nimport { otpActionError, useOtpActions } from \"./TotpRows\";\n\n/** What the search also reads: the code's service and account (not on the item itself). */\nfunction matchesEntry(entry: AuthenticatorEntry | undefined, q: string): boolean {\n if (!entry || !q) return false;\n return [entry.issuer, entry.account].some((v) => v?.toLowerCase().includes(q));\n}\n\n/** Items that hold a one-time password, filtered by the search and grouped by whose they are. */\nexport function otpGroups(items: readonly VaultItem[], entries: ReadonlyMap<string, AuthenticatorEntry>, query: string, hidden: ReadonlySet<string> = new Set()) {\n const q = query.trim().toLowerCase();\n const withOtp = items\n .filter((i) => i.authenticator && !i.deletion && !hidden.has(i.id))\n .filter((i) => !q || matchesQuery(i, q) || matchesEntry(entries.get(i.id), q))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" }));\n const groups = new Map<string, { label: string; items: VaultItem[] }>();\n for (const i of withOtp) {\n const key = i.owner.kind === \"organization\" ? `org:${i.owner.organizationId}` : i.owner.kind;\n const g = groups.get(key) ?? { label: i.owner.label, items: [] };\n g.items.push(i);\n groups.set(key, g);\n }\n // Personal first, then organizations by name, shared last.\n const rank = (k: string) => (k === \"me\" ? 0 : k === \"shared\" ? 2 : 1);\n return [...groups.entries()].sort(([a, x], [b, y]) => rank(a) - rank(b) || x.label.localeCompare(y.label)).map(([key, g]) => ({ key, ...g }));\n}\n\n/**\n * The sidebar's \"One-time passwords\": every code at a glance, one calm row each — the login, its\n * account, the live code and its ring. Press a code to copy it. Off codes sit quietly with \"Turn on\".\n */\nexport function AuthenticatorView({ port, items, definitions, query, onOpen, onChanged, header }: VaultViewProps) {\n const [entries, setEntries] = useState<ReadonlyMap<string, AuthenticatorEntry>>(new Map());\n const [hidden, setHidden] = useState<ReadonlySet<string>>(new Set());\n const [adding, setAdding] = useState(false);\n const [renaming, setRenaming] = useState<VaultItem | null>(null);\n const [renameError, setRenameError] = useState<string | null>(null);\n const [renameBusy, setRenameBusy] = useState(false);\n\n // The account each code is for lives on the authenticator, not the item: read it once per load.\n useEffect(() => {\n let live = true;\n port.authenticator.list().then(\n (list) => live && setEntries(new Map(list.map((e) => [e.itemId, e]))),\n (e: unknown) => console.error(\"One-time password accounts could not be read\", e),\n );\n return () => {\n live = false;\n };\n }, [port, items]);\n\n const groups = otpGroups(items, entries, query, hidden);\n const total = items.filter((i) => i.authenticator && !i.deletion && !hidden.has(i.id)).length;\n const familyOf = (key: string) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n\n return (\n <section aria-label=\"One-time passwords\" className=\"flex h-full min-h-0 flex-col bg-background\">\n {header}\n <div className=\"flex min-h-12 items-center justify-between gap-2 px-4 pb-1 pt-3\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <h2 className=\"truncate text-sm font-semibold text-foreground\">One-time passwords</h2>\n {total > 0 ? <span className=\"text-xs tabular-nums text-muted-foreground\">{total}</span> : null}\n </div>\n {total > 0 ? (\n <Button variant=\"outline\" icon={<PlusGlyph />} onClick={() => setAdding(true)}>\n Add\n </Button>\n ) : null}\n </div>\n\n {total === 0 ? (\n <div className=\"flex flex-1 flex-col items-center justify-center gap-3 px-6 pb-12 text-center\">\n <span className=\"flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <ShieldGlyph className=\"size-6\" />\n </span>\n <p className=\"text-sm font-medium text-foreground\">No one-time passwords yet</p>\n <Button variant=\"primary\" icon={<PlusGlyph />} onClick={() => setAdding(true)}>\n Add one-time password\n </Button>\n </div>\n ) : groups.length === 0 ? (\n <div className=\"px-4 py-10 text-center text-sm text-muted-foreground\">Nothing matches.</div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto px-3 pb-6 pt-1 sm:px-4\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-5\">\n {groups.map((g) => (\n <Section key={g.key} {...(groups.length > 1 ? { title: g.label } : {})} className=\"[&>div]:px-1\">\n {g.items.map((item) => (\n <OtpListRow\n key={item.id}\n port={port}\n item={item}\n family={familyOf(item.definitionKey)}\n entry={entries.get(item.id)}\n onOpen={() => onOpen(item.id)}\n onRename={() => {\n setRenameError(null);\n setRenaming(item);\n }}\n onChanged={onChanged}\n onRemoved={() => {\n setHidden((h) => new Set(h).add(item.id));\n onChanged();\n }}\n />\n ))}\n </Section>\n ))}\n </div>\n </div>\n )}\n\n {adding ? (\n <AddOtpPanel\n port={port}\n items={items}\n definitions={definitions}\n onClose={() => setAdding(false)}\n onChanged={onChanged}\n onDone={(id) => {\n setAdding(false);\n onOpen(id);\n }}\n />\n ) : null}\n\n <TextInputDialog\n open={renaming !== null}\n onOpenChange={(o) => {\n if (!o && !renameBusy) setRenaming(null);\n }}\n title=\"Rename login\"\n {...(renameError ? { description: <span className=\"text-destructive\">{renameError}</span> } : {})}\n placeholder=\"Login name\"\n defaultValue={renaming?.name ?? \"\"}\n confirmLabel=\"Rename\"\n busy={renameBusy}\n onConfirm={async (name) => {\n if (!renaming) return;\n setRenameBusy(true);\n setRenameError(null);\n try {\n await port.authenticator.rename(renaming, name);\n setRenaming(null);\n onChanged();\n } catch (e) {\n setRenameError(otpActionError(e, \"rename it\"));\n } finally {\n setRenameBusy(false);\n }\n }}\n />\n </section>\n );\n}\n\ninterface OtpListRowProps {\n port: VaultPort;\n item: VaultItem;\n family: string;\n entry: AuthenticatorEntry | undefined;\n onOpen: () => void;\n onRename: () => void;\n onChanged: () => void;\n onRemoved: () => void;\n}\n\n/** One code, one line: login · account/site · live code + ring · menu. */\nfunction OtpListRow({ port, item, family, entry, onOpen, onRename, onChanged, onRemoved }: OtpListRowProps) {\n const a = useOtpActions(port, item, (next) => (next && next.authenticator === null ? onRemoved() : onChanged()));\n const live = useLiveCode(port, item, a.enabled && !a.removed);\n const { copy } = useCopied();\n const Icon = definitionGlyph(item.definitionKey, family);\n const canManage = item.capabilities.canManage || item.capabilities.canEdit;\n if (a.removed) return null;\n const sub = a.error ?? [entry?.account, siteOf(item) || entry?.issuer].filter((v, i, all): v is string => Boolean(v) && all.indexOf(v) === i).join(\" · \");\n\n return (\n <div className=\"grid min-h-14 grid-cols-[2rem_minmax(0,1fr)_auto_auto] items-center gap-x-3 rounded-lg px-2 py-1.5 transition-colors hover:bg-accent/50\">\n <button type=\"button\" onClick={onOpen} aria-label={`Open ${item.name}`} tabIndex={-1} className={cn(\"flex size-8 items-center justify-center rounded-lg bg-muted\", a.enabled ? \"text-foreground\" : \"text-disabled-foreground\")}>\n <Icon className=\"size-4\" />\n </button>\n <button type=\"button\" onClick={onOpen} className=\"flex min-w-0 flex-col items-start rounded-md text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n <span className={cn(\"max-w-full truncate text-sm font-medium\", a.enabled ? \"text-foreground\" : \"text-muted-foreground\")}>{item.name}</span>\n {sub ? <span className={cn(\"max-w-full truncate text-xs\", a.error ? \"text-destructive\" : \"text-muted-foreground\")} title={sub}>{sub}</span> : null}\n </button>\n\n <div className=\"flex min-w-0 justify-end\">\n {!a.enabled ? (\n <span className=\"flex items-center gap-1.5\">\n <span className=\"text-sm text-disabled-foreground\">Off</span>\n {canManage ? (\n <Button variant=\"quiet\" disabled={a.busy} onClick={() => void a.setEnabled(true)}>\n Turn on\n </Button>\n ) : null}\n </span>\n ) : live.error ? (\n <span className=\"flex items-center gap-1.5\">\n <span className=\"max-w-40 truncate text-xs text-destructive\" title={live.error}>{live.error}</span>\n <Button variant=\"quiet\" onClick={live.retry}>Retry</Button>\n </span>\n ) : (\n <CodeButton live={live} digits={item.authenticator?.digits ?? 6} label={item.name} />\n )}\n </div>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label={`${item.name} options`} disabled={a.busy} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n <DropdownMenuItem onSelect={onOpen}>\n <ExternalGlyph className=\"size-4\" />\n Open login\n </DropdownMenuItem>\n {live.code ? (\n <DropdownMenuItem onSelect={() => live.code && void copy(live.code)}>\n <CopyGlyph className=\"size-4\" />\n Copy code\n </DropdownMenuItem>\n ) : null}\n {canManage ? (\n <>\n <DropdownMenuItem onSelect={onRename}>\n <PencilGlyph className=\"size-4\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => void a.setEnabled(!a.enabled)}>\n <PowerGlyph className=\"size-4\" />\n {a.enabled ? \"Turn off\" : \"Turn on\"}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"text-destructive focus:text-destructive\" onSelect={() => void a.remove()}>\n <TrashGlyph className=\"size-4\" />\n Remove\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Button, Field, Select } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { VaultDefinition } from \"../definitions\";\nimport { draftOf, siteOf, type VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Panel, Row, Section } from \"../ui\";\nimport { CodeButton } from \"./CodeParts\";\nimport { useLiveCode } from \"./live-code\";\nimport { authenticatorName, matchIssuerToSite, tryParseEnrollment, type ParsedEnrollment } from \"./otpauth\";\nimport { OtpSetupRow } from \"./Setup\";\nimport { otpActionError } from \"./TotpRows\";\n\nconst NEW = \"__new__\";\nconst LOGIN_KEYS = [\"website_login\", \"username_password\"];\n\n/** \"example.com\" → \"https://example.com\"; null when it is not an address. */\nexport function normalizeWebsite(raw: string): string | null {\n const t = raw.trim();\n if (!t) return null;\n const withScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(t) ? t : `https://${t}`;\n try {\n const u = new URL(withScheme);\n if (u.protocol !== \"https:\" && u.protocol !== \"http:\") return null;\n if (!u.hostname.includes(\".\") && u.hostname !== \"localhost\") return null;\n return u.toString().replace(/\\/$/, \"\");\n } catch {\n return null;\n }\n}\n\nexport interface AddOtpPanelProps {\n port: VaultPort;\n items: readonly VaultItem[];\n definitions: readonly VaultDefinition[];\n /** Pre-chooses the login to add it to. */\n itemId?: string | null;\n onClose: () => void;\n /** Something was created or enrolled: reload. */\n onChanged: () => void;\n /** Done, with the login that now has the code. */\n onDone: (itemId: string) => void;\n}\n\n/**\n * Adds a one-time password from the all-codes view: to an existing login (matched by website when the\n * code names its service) or to a new one. After saving it shows the first code at once, because the\n * site asks for it to finish turning two-factor on.\n */\nexport function AddOtpPanel({ port, items, definitions, itemId = null, onClose, onChanged, onDone }: AddOtpPanelProps) {\n const confirmed = useConfirmed();\n const candidates = items\n .filter((i) => !i.authenticator && !i.deletion && (i.capabilities.canEdit || i.capabilities.canManage))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: \"base\" }));\n const [input, setInput] = useState(\"\");\n const [image, setImage] = useState<File | null>(null);\n const [target, setTarget] = useState<string>(itemId && candidates.some((c) => c.id === itemId) ? itemId : NEW);\n const [targetChosen, setTargetChosen] = useState(Boolean(itemId));\n const [name, setName] = useState(\"\");\n const [nameTouched, setNameTouched] = useState(false);\n const [website, setWebsite] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // A login created by an attempt whose enrolment failed: a retry reuses it instead of making a twin.\n const [created, setCreated] = useState<VaultItem | null>(null);\n const [saved, setSaved] = useState<VaultItem | null>(null);\n\n const { parsed } = tryParseEnrollment(input);\n const isNew = target === NEW;\n const websiteUrl = normalizeWebsite(website);\n const websiteBad = website.trim() !== \"\" && !websiteUrl;\n const ready = Boolean(parsed || image) && (!isNew || name.trim() !== \"\") && !websiteBad && !busy;\n\n const recognise = (p: ParsedEnrollment) => {\n if (!nameTouched) setName((n) => authenticatorName(n, p));\n if (!targetChosen) {\n const match = matchIssuerToSite(p.issuer, candidates, siteOf);\n setTarget(match ? match.id : NEW);\n }\n };\n\n const save = async () => {\n setBusy(true);\n setError(null);\n try {\n let item = isNew ? created : (items.find((i) => i.id === target) ?? null);\n if (!item) {\n const def = LOGIN_KEYS.map((k) => definitions.find((d) => d.key === k)).find((d): d is VaultDefinition => Boolean(d));\n if (!def) throw new Error(\"No login type is available.\");\n const r = await port.create(def, null, { ...draftOf(null), name: name.trim(), loginUrls: websiteUrl ? [websiteUrl] : [] });\n item = r.item;\n setCreated(item);\n onChanged();\n }\n const it = item;\n const entry = await confirmed(() => (image ? port.authenticator.enrolQrImage(it, image, image.name) : port.authenticator.enrol(it, input)));\n let next: VaultItem = { ...it, authenticator: { digits: entry.digits, period: entry.period, enabled: entry.enabled } };\n // An existing login named \"Website login\" takes the service's name, as on a new one.\n const better = authenticatorName(it.name, { issuer: entry.issuer, account: entry.account });\n if (!isNew && better !== it.name) {\n try {\n const renamed = await port.authenticator.rename(it, better);\n next = { ...renamed, authenticator: next.authenticator };\n } catch {\n // The code is saved; the old name stays. Renaming is one menu away.\n }\n }\n setInput(\"\");\n setImage(null);\n setSaved(next);\n onChanged();\n } catch (e) {\n setError(wasCancelled(e) ? \"Not confirmed, so nothing was added.\" : otpActionError(e, \"add it\"));\n } finally {\n setBusy(false);\n }\n };\n\n if (saved) return <AddedPanel port={port} item={saved} onClose={onClose} onDone={() => onDone(saved.id)} />;\n\n return (\n <Panel\n title=\"Add one-time password\"\n size=\"md\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"quiet\" onClick={onClose} disabled={busy}>Cancel</Button>\n <Button variant=\"primary\" disabled={!ready} onClick={() => void save()}>{busy ? \"Adding…\" : \"Add\"}</Button>\n </>\n }\n >\n <Section>\n <OtpSetupRow\n label=\"Setup code\"\n value={input}\n autoFocus\n disabled={busy}\n onChange={(v) => {\n setImage(null);\n setError(null);\n setInput(v);\n }}\n onImage={(f) => {\n setInput(\"\");\n setError(null);\n setImage(f);\n }}\n onRecognized={recognise}\n status={image ? `QR image ready · ${image.name}` : null}\n />\n <Row label=\"Add to\">\n <Select\n value={target}\n disabled={busy || created !== null}\n aria-label=\"Add to\"\n options={[{ value: NEW, label: \"New login\" }, ...candidates.map((c) => ({ value: c.id, label: siteOf(c) ? `${c.name} · ${siteOf(c)}` : c.name }))]}\n onValueChange={(v: string) => {\n setTarget(v);\n setTargetChosen(true);\n }}\n />\n </Row>\n {isNew ? (\n <>\n <Row label=\"Name\">\n <Field\n className=\"w-full\"\n value={name}\n disabled={busy || created !== null}\n onChange={(e) => {\n setNameTouched(true);\n setName(e.target.value);\n }}\n placeholder=\"Filled from the code\"\n aria-label=\"Name\"\n />\n </Row>\n <Row label=\"Website\" hint={websiteBad ? <span className=\"text-destructive\">Not a web address</span> : undefined}>\n <Field className=\"w-full\" type=\"url\" value={website} disabled={busy || created !== null} onChange={(e) => setWebsite(e.target.value)} placeholder=\"example.com\" aria-label=\"Website\" aria-invalid={websiteBad || undefined} />\n </Row>\n </>\n ) : null}\n </Section>\n {error ? (\n <p className=\"px-1 text-sm text-destructive\" role=\"alert\">\n {error}\n </p>\n ) : null}\n </Panel>\n );\n}\n\n/** After adding: the first code, big, because the site is waiting for it. */\nfunction AddedPanel({ port, item, onClose, onDone }: { port: VaultPort; item: VaultItem; onClose: () => void; onDone: () => void }) {\n const live = useLiveCode(port, item, true);\n return (\n <Panel title={item.name} size=\"sm\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onDone}>Done</Button>}>\n <div className=\"flex flex-col items-center gap-2 py-4\">\n {live.error ? (\n <span className=\"text-sm text-destructive\">{live.error}</span>\n ) : (\n <CodeButton live={live} digits={item.authenticator?.digits ?? 6} size=\"lg\" label={item.name} />\n )}\n <p className=\"text-xs text-muted-foreground\">Enter this code on the site to finish.</p>\n </div>\n </Panel>\n );\n}\n","import { useCopy } from \"../notice\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { CheckGlyph, CopyGlyph } from \"../glyphs\";\nimport type { LiveCode } from \"./live-code\";\nimport { groupCode, maskedCode } from \"./otpauth\";\n\n/** The seconds a code has left, as a ring that empties; the last five turn it red. */\nexport function CountdownRing({ remaining, period, loading = false, className }: { remaining: number; period: number; loading?: boolean; className?: string }) {\n const r = 9.5;\n const c = 2 * Math.PI * r;\n const p = loading ? 0 : Math.max(0, Math.min(1, remaining / period));\n const urgent = !loading && remaining <= 5;\n return (\n <span className={cn(\"relative inline-flex size-6 shrink-0 items-center justify-center\", className)} role=\"img\" aria-label={loading ? \"Getting code\" : `${remaining} seconds left`}>\n <svg viewBox=\"0 0 24 24\" className=\"absolute inset-0 size-full -rotate-90\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r={r} fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} className=\"text-muted\" />\n <circle\n cx=\"12\"\n cy=\"12\"\n r={r}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={c * (1 - p)}\n className={urgent ? \"text-destructive\" : \"text-primary\"}\n // A new period refills at once; within a period it drains smoothly between ticks.\n style={{ transition: remaining >= period ? \"none\" : \"stroke-dashoffset 1s linear\" }}\n />\n </svg>\n <span className={cn(\"text-[10px] font-semibold leading-none tabular-nums\", urgent ? \"text-destructive\" : \"text-muted-foreground\")}>{loading ? \"\" : remaining}</span>\n </span>\n );\n}\n\n/** Copies a code and says so on the spot for a moment. */\nexport function useCopied(): { copied: boolean; copy: (code: string) => Promise<void> } {\n const [copied, setCopied] = useState(false);\n const copyValue = useCopy();\n const t = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => void (t.current && clearTimeout(t.current)), []);\n return {\n copied,\n copy: async (code) => {\n const ok = await copyValue(code, \"One-time code\");\n if (!ok) return;\n setCopied(true);\n if (t.current) clearTimeout(t.current);\n t.current = setTimeout(() => setCopied(false), 1600);\n },\n };\n}\n\n/**\n * THE code: grouped digits in tabular numerals with its ring. Pressing it copies. While it loads it\n * shows a masked placeholder of the right length, so nothing jumps when it arrives.\n */\nexport function CodeButton({ live, digits, size = \"md\", label }: { live: LiveCode; digits: number; size?: \"md\" | \"lg\"; label: string }) {\n const { copied, copy } = useCopied();\n const shown = live.code ? groupCode(live.code) : maskedCode(digits);\n return (\n <button\n type=\"button\"\n disabled={!live.code}\n onClick={() => live.code && void copy(live.code)}\n aria-label={live.code ? `Copy ${label} code` : `Getting ${label} code`}\n title={live.code ? \"Copy\" : undefined}\n className={cn(\"group -mx-1.5 inline-flex max-w-full items-center gap-2.5 rounded-md px-1.5 py-1 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\", size === \"lg\" && \"gap-3\")}\n >\n <span className={cn(\"whitespace-nowrap font-mono font-medium tabular-nums tracking-[0.08em]\", size === \"lg\" ? \"text-2xl\" : \"text-[1.0625rem]\", live.code ? \"text-foreground\" : \"text-disabled-foreground\")}>{shown}</span>\n {copied ? (\n <span className=\"inline-flex size-6 items-center justify-center text-success\" role=\"status\" aria-label=\"Copied\">\n <CheckGlyph className=\"size-4\" />\n </span>\n ) : (\n <CountdownRing remaining={live.remaining} period={live.period} loading={!live.code} />\n )}\n </button>\n );\n}\n\n/** The copy button beside a code, for people who look for one. */\nexport function CopyCodeButton({ live, label }: { live: LiveCode; label: string }) {\n const { copied, copy } = useCopied();\n return <Button variant=\"quiet\" icon={copied ? <CheckGlyph /> : <CopyGlyph />} {...(copied ? { glyphTone: \"success\" as const } : {})} aria-label={`Copy ${label} code`} disabled={!live.code} onClick={() => live.code && void copy(live.code)} />;\n}\n","/**\n * What a person pastes, drops or scans, read locally so the screen can say at once whether it is\n * usable and WHICH account it is for — before anything is sent. The server\n * (`aidream/services/authenticator/otpauth.py` + `otp.py`) parses the same string again and is the\n * authority; keep SUPPORTED_DIGITS / SUPPORTED_ALGORITHMS / base32 cleaning in lockstep with it.\n * A preview that accepts what the server refuses is worse than no preview.\n *\n * The secret is never returned, stored, logged or rendered: only `raw` (the input, untouched, for\n * the enrol request) and the metadata leave this module.\n */\n\nexport const TOTP_DEFAULT_DIGITS = 6;\nexport const TOTP_DEFAULT_PERIOD = 30;\nexport const TOTP_DEFAULT_ALGORITHM = \"SHA1\";\n\nconst SUPPORTED_DIGITS = new Set([6, 7, 8]);\nconst SUPPORTED_ALGORITHMS = new Set([\"SHA1\", \"SHA256\", \"SHA512\"]);\nconst BASE32_RE = /^[A-Z2-7]+=*$/;\n\nexport interface ParsedEnrollment {\n /** The exact string to send to enrol — the input, trimmed, otherwise untouched. */\n raw: string;\n digits: number;\n period: number;\n algorithm: string;\n /** The service (`issuer=` or the `Issuer:` label prefix). */\n issuer: string | null;\n /** The account the codes are for — usually an email or username. */\n account: string | null;\n /** True for an otpauth address, false for a bare setup key. */\n fromUri: boolean;\n}\n\n/** Messages are layout: each fits one line (≤ 60 characters). */\nexport class InvalidEnrollmentInputError extends Error {}\n\nfunction assertUsableSecret(secret: string): void {\n const cleaned = secret.trim().replace(/[\\s-]/g, \"\").toUpperCase();\n if (!cleaned) throw new InvalidEnrollmentInputError(\"No setup key in that.\");\n if (!BASE32_RE.test(cleaned)) throw new InvalidEnrollmentInputError(\"Not a setup key. Copy it again from the site.\");\n // base32 carries 5 bits a character; under 8 characters is not a seed.\n if (cleaned.replace(/=+$/, \"\").length < 8) throw new InvalidEnrollmentInputError(\"That setup key is too short.\");\n}\n\nfunction splitLabel(label: string | null): { issuer: string | null; account: string | null } {\n if (!label) return { issuer: null, account: null };\n const idx = label.indexOf(\":\");\n if (idx === -1) return { issuer: null, account: label.trim() || null };\n return { issuer: label.slice(0, idx).trim() || null, account: label.slice(idx + 1).trim() || null };\n}\n\nfunction safeDecode(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\n/** Reads a bare base32 setup key or an `otpauth://totp/…` address. Throws `InvalidEnrollmentInputError`. */\nexport function parseEnrollmentInput(input: string): ParsedEnrollment {\n const text = (input ?? \"\").trim();\n if (!text) throw new InvalidEnrollmentInputError(\"Nothing to read yet.\");\n\n if (!/^otpauth:\\/\\//i.test(text)) {\n if (/^otpauth-migration:/i.test(text)) throw new InvalidEnrollmentInputError(\"That is an export of many accounts. Use one site's code.\");\n if (/^https?:\\/\\//i.test(text)) throw new InvalidEnrollmentInputError(\"That is a web link, not a setup code.\");\n assertUsableSecret(text);\n return { raw: text, digits: TOTP_DEFAULT_DIGITS, period: TOTP_DEFAULT_PERIOD, algorithm: TOTP_DEFAULT_ALGORITHM, issuer: null, account: null, fromUri: false };\n }\n\n // `URL` treats otpauth as an opaque scheme in some engines; read the parts by hand so every host agrees.\n const m = /^otpauth:\\/\\/([^/?#]*)\\/?([^?#]*)(?:\\?([^#]*))?/i.exec(text);\n if (!m) throw new InvalidEnrollmentInputError(\"That setup link is malformed.\");\n const type = (m[1] ?? \"\").toLowerCase();\n if (type === \"hotp\") throw new InvalidEnrollmentInputError(\"Counter codes (HOTP) are not supported.\");\n if (type !== \"totp\") throw new InvalidEnrollmentInputError(\"That setup link is malformed.\");\n const params = new URLSearchParams(m[3] ?? \"\");\n\n const secret = params.get(\"secret\");\n if (!secret) throw new InvalidEnrollmentInputError(\"That setup link has no secret.\");\n assertUsableSecret(secret);\n\n const digits = Number(params.get(\"digits\") ?? TOTP_DEFAULT_DIGITS);\n if (!SUPPORTED_DIGITS.has(digits)) throw new InvalidEnrollmentInputError(`${params.get(\"digits\")}-digit codes are not supported.`);\n const period = Number(params.get(\"period\") ?? TOTP_DEFAULT_PERIOD);\n if (!Number.isInteger(period) || period <= 0) throw new InvalidEnrollmentInputError(\"That setup link has a bad interval.\");\n const algorithm = (params.get(\"algorithm\") || TOTP_DEFAULT_ALGORITHM).trim().toUpperCase();\n if (!SUPPORTED_ALGORITHMS.has(algorithm)) throw new InvalidEnrollmentInputError(`${algorithm} codes are not supported yet.`);\n\n const fromLabel = splitLabel(safeDecode(m[2] ?? \"\") || null);\n const issuer = params.get(\"issuer\")?.trim() || fromLabel.issuer;\n return { raw: text, digits, period, algorithm, issuer: issuer || null, account: fromLabel.account, fromUri: true };\n}\n\n/** Never throws: the parse, or the one-line reason it failed. Empty input is neither. */\nexport function tryParseEnrollment(input: string): { parsed: ParsedEnrollment | null; error: string | null } {\n if (!input.trim()) return { parsed: null, error: null };\n try {\n return { parsed: parseEnrollmentInput(input), error: null };\n } catch (e) {\n return { parsed: null, error: e instanceof Error ? e.message : \"That could not be read.\" };\n }\n}\n\n/** \"GitHub · me@x.com\", \"GitHub\", or \"Setup key\". */\nexport function describeEnrollment(parsed: ParsedEnrollment): string {\n const parts = [parsed.issuer, parsed.account].filter((p): p is string => Boolean(p));\n return parts.length ? parts.join(\" · \") : \"Setup key\";\n}\n\n/** A code as people read it: 6 → \"123 456\", 8 → \"1234 5678\", 7 → \"1234 567\". */\nexport function groupCode(code: string): string {\n const c = code.replace(/\\s/g, \"\");\n if (c.length < 6) return c;\n const head = Math.ceil(c.length / 2);\n return `${c.slice(0, head)} ${c.slice(head)}`;\n}\n\n/** The placeholder a code of `digits` shows while it loads. */\nexport function maskedCode(digits = TOTP_DEFAULT_DIGITS): string {\n return groupCode(\"•\".repeat(Math.max(6, digits)));\n}\n\n/** The server's `label` holds the URI's raw `Issuer:account`; keep the account alone. */\nexport function accountOfLabel(label: string | null | undefined, issuer: string | null | undefined): string | null {\n const l = label?.trim();\n if (!l) return null;\n const idx = l.indexOf(\":\");\n if (idx === -1) return l.toLowerCase() === (issuer ?? \"\").trim().toLowerCase() ? null : l;\n const rest = l.slice(idx + 1).trim();\n return rest || null;\n}\n\nconst PLACEHOLDER_NAMES = [\"website login\", \"login\", \"authenticator\", \"one-time password\", \"new item\", \"untitled\"];\n\n/** Keeps a name a person typed; replaces a blank or placeholder name with what the code says. */\nexport function authenticatorName(current: string, parsed: Pick<ParsedEnrollment, \"issuer\" | \"account\">): string {\n const name = current.trim();\n if (name && !PLACEHOLDER_NAMES.includes(name.toLowerCase())) return name;\n return parsed.issuer || parsed.account || name || \"One-time password\";\n}\n\n/**\n * Which of these items an issuer most likely belongs to, by WEBSITE only (a name match once enrolled\n * a Google seed on an unrelated OAuth client). \"GitHub\" matches github.com and gist.github.com, never githubusercontent.com.\n */\nexport function matchIssuerToSite<T>(issuer: string | null, candidates: readonly T[], siteOf: (c: T) => string): T | null {\n const key = (issuer ?? \"\").toLowerCase().replace(/[^a-z0-9]/g, \"\");\n if (key.length < 2) return null;\n for (const c of candidates) {\n const host = siteOf(c).toLowerCase();\n if (!host) continue;\n const labels = host.split(\".\");\n // A whole label of the host: github in github.com, google in accounts.google.co.uk.\n if (labels.some((l) => l.replace(/[^a-z0-9]/g, \"\") === key)) return c;\n }\n return null;\n}\n","import { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\n\n/**\n * ONE clock for every code on screen, ticking on the second, so every ring in a list moves together\n * (separate per-row timers drift apart and look broken).\n */\nconst listeners = new Set<() => void>();\nlet second = Math.floor(Date.now() / 1000);\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nfunction subscribe(cb: () => void): () => void {\n listeners.add(cb);\n if (!timer) {\n second = Math.floor(Date.now() / 1000);\n timer = setInterval(() => {\n const s = Math.floor(Date.now() / 1000);\n if (s === second) return;\n second = s;\n for (const l of listeners) l();\n }, 200);\n }\n return () => {\n listeners.delete(cb);\n if (listeners.size === 0 && timer) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n\n/** The current whole second (epoch seconds), shared by every caller. */\nexport function useSecond(): number {\n return useSyncExternalStore(subscribe, () => second, () => second);\n}\n\nexport interface LiveCode {\n code: string | null;\n /** Seconds this code still lives. */\n remaining: number;\n period: number;\n error: string | null;\n retry: () => void;\n}\n\n/** A readable reason a code could not be read. */\nexport function codeErrorText(e: unknown): string {\n const status = (e as { status?: unknown } | null)?.status;\n if (status === 404) return \"No one-time password here.\";\n if (status === 401 || status === 403) return \"Not allowed to read this code.\";\n if (status === 409 || status === 423) return \"This one-time password is off.\";\n return e instanceof Error && e.message ? e.message : \"The code could not be read.\";\n}\n\n/**\n * The item's live code: fetched when shown, re-read the moment it expires, never while it is off.\n * Holds the code only in this component; nothing is cached across components.\n */\nexport function useLiveCode(port: VaultPort, item: Pick<VaultItem, \"id\" | \"owner\" | \"authenticator\">, enabled: boolean): LiveCode {\n const confirmed = useConfirmed();\n const now = useSecond();\n const period = item.authenticator?.period && item.authenticator.period > 0 ? item.authenticator.period : 30;\n const [state, setState] = useState<{ code: string; expiresAt: number } | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [round, setRound] = useState(0);\n const inflight = useRef(false);\n // The latest values the fetch needs, without restarting it when the parent re-renders.\n const latest = useRef({ port, item, confirmed });\n latest.current = { port, item, confirmed };\n\n useEffect(() => {\n if (!enabled) {\n setState(null);\n setError(null);\n return;\n }\n let live = true;\n inflight.current = true;\n const { port: p, item: it, confirmed: c } = latest.current;\n c(() => p.authenticator.code(it))\n .then((r) => {\n if (!live) return;\n setError(null);\n setState({ code: r.code, expiresAt: Math.floor(Date.now() / 1000) + r.remainingSeconds });\n })\n .catch((e: unknown) => {\n if (live) setError(wasCancelled(e) ? \"Confirm it's you to see this code.\" : codeErrorText(e));\n })\n .finally(() => {\n if (live) inflight.current = false;\n });\n return () => {\n live = false;\n inflight.current = false;\n };\n }, [enabled, item.id, round]);\n\n const remaining = state ? Math.max(0, state.expiresAt - now) : 0;\n useEffect(() => {\n if (enabled && state && remaining <= 0 && !inflight.current && !error) setRound((n) => n + 1);\n }, [enabled, state, remaining, error]);\n\n return {\n // An expired code is never shown as if it still works.\n code: state && remaining > 0 ? state.code : null,\n remaining,\n period,\n error,\n retry: () => {\n setError(null);\n setRound((n) => n + 1);\n },\n };\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Button, Field } from \"@ai-matrx/design-system/controls\";\nimport { CameraGlyph, CheckGlyph, QrGlyph } from \"../glyphs\";\nimport { Panel, Row } from \"../ui\";\nimport { describeEnrollment, tryParseEnrollment, type ParsedEnrollment } from \"./otpauth\";\nimport { canDecodeQrLocally, decodeQr, decodeQrFile, hasCamera, imageFrom } from \"./qr\";\n\n/** Whether this browser can scan with the camera (local detector + a camera API). */\nfunction useCanScan(): boolean {\n const [ok, setOk] = useState(false);\n useEffect(() => {\n let live = true;\n void canDecodeQrLocally().then((d) => live && setOk(d && hasCamera()));\n return () => {\n live = false;\n };\n }, []);\n return ok;\n}\n\n/** The camera, reading QR codes locally until it finds one. Frames never leave the device. */\nexport function QrScanPanel({ open, onResult, onClose }: { open: boolean; onResult: (text: string) => void; onClose: () => void }) {\n const video = useRef<HTMLVideoElement | null>(null);\n const [error, setError] = useState<string | null>(null);\n const done = useRef(onResult);\n done.current = onResult;\n\n useEffect(() => {\n if (!open) return;\n let stream: MediaStream | null = null;\n let live = true;\n let timer: ReturnType<typeof setTimeout> | null = null;\n setError(null);\n const stop = () => {\n if (timer) clearTimeout(timer);\n stream?.getTracks().forEach((t) => t.stop());\n stream = null;\n };\n const tick = async () => {\n const v = video.current;\n if (!live) return;\n if (v && v.readyState >= 2) {\n try {\n const text = await decodeQr(v);\n if (text && live) {\n live = false;\n stop();\n done.current(text);\n return;\n }\n } catch {\n // A frame that will not decode is a miss, not a failure.\n }\n }\n timer = setTimeout(() => void tick(), 200);\n };\n navigator.mediaDevices\n .getUserMedia({ video: { facingMode: { ideal: \"environment\" } }, audio: false })\n .then((s) => {\n if (!live) {\n s.getTracks().forEach((t) => t.stop());\n return;\n }\n stream = s;\n if (video.current) {\n video.current.srcObject = s;\n void video.current.play().catch(() => undefined);\n }\n void tick();\n })\n .catch((e: unknown) => {\n if (!live) return;\n const name = (e as { name?: string } | null)?.name;\n setError(name === \"NotAllowedError\" ? \"Camera access was not allowed.\" : name === \"NotFoundError\" ? \"No camera found.\" : \"The camera could not start.\");\n });\n return () => {\n live = false;\n stop();\n };\n }, [open]);\n\n return (\n <Panel title=\"Scan QR code\" open={open} onClose={onClose} size=\"sm\" footer={<Button variant=\"quiet\" onClick={onClose}>Cancel</Button>}>\n <div className=\"relative mx-auto aspect-square w-full max-w-sm overflow-hidden rounded-xl bg-muted\">\n <video ref={video} className=\"size-full object-cover\" playsInline muted aria-label=\"Camera\" />\n {error ? (\n <div className=\"absolute inset-0 flex items-center justify-center p-6 text-center text-sm text-destructive\">{error}</div>\n ) : (\n <div className=\"pointer-events-none absolute inset-[18%] rounded-lg border-2 border-primary\" aria-hidden />\n )}\n </div>\n <p className=\"text-center text-xs text-muted-foreground\">Point at the site's QR code</p>\n </Panel>\n );\n}\n\nexport interface OtpSetupRowProps {\n value: string;\n onChange: (value: string) => void;\n /** Row label. */\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n autoFocus?: boolean;\n /**\n * An image this browser cannot read locally. Given → the host sends it to the server's decoder\n * (`enrolQrImage`); absent → the person is asked to paste the key instead.\n */\n onImage?: (file: File) => void;\n /** Called with what a valid input says (issuer, account), e.g. to fill an empty name. */\n onRecognized?: (parsed: ParsedEnrollment) => void;\n /** Shown in place of the recognition line (e.g. \"QR image ready\", \"Adding…\"). */\n status?: ReactNode;\n}\n\n/**\n * ONE row to set up a one-time password: paste a setup key or otpauth address, choose or drop a QR\n * image, or scan with the camera. What it recognised (service · account) shows inside the field\n * before anything is saved; nothing about it leaves the browser until save.\n */\nexport function OtpSetupRow({ value, onChange, label = \"One-time password\", placeholder = \"Setup key or otpauth link\", disabled = false, autoFocus = false, onImage, onRecognized, status }: OtpSetupRowProps) {\n const file = useRef<HTMLInputElement | null>(null);\n const canScan = useCanScan();\n const [scanning, setScanning] = useState(false);\n const [reading, setReading] = useState(false);\n const [imageError, setImageError] = useState<string | null>(null);\n const [dragging, setDragging] = useState(false);\n const { parsed, error } = tryParseEnrollment(value);\n const recognised = useRef(onRecognized);\n recognised.current = onRecognized;\n const parsedKey = parsed ? `${parsed.issuer ?? \"\"}|${parsed.account ?? \"\"}|${parsed.raw.length}` : \"\";\n useEffect(() => {\n if (parsed) recognised.current?.(parsed);\n // Keyed on what it says (parsedKey), so it fires once per new recognition, never per render.\n }, [parsedKey]); // parsed is derived from value, which parsedKey summarises\n\n const takeText = (text: string) => {\n setImageError(null);\n onChange(text.trim());\n };\n\n const takeImage = async (f: File) => {\n setImageError(null);\n setReading(true);\n try {\n const text = await decodeQrFile(f);\n if (text) takeText(text);\n else if (await canDecodeQrLocally()) setImageError(\"No QR code found in that image.\");\n else if (onImage) onImage(f);\n else setImageError(\"Paste the setup key instead.\");\n } catch {\n setImageError(\"That image could not be read.\");\n } finally {\n setReading(false);\n }\n };\n\n const end = status ? (\n <span className=\"max-w-48 truncate text-xs text-muted-foreground\">{status}</span>\n ) : reading ? (\n <span className=\"text-xs text-muted-foreground\">Reading…</span>\n ) : imageError || error ? (\n <span className=\"max-w-56 truncate text-xs text-destructive\" title={imageError ?? error ?? undefined} role=\"alert\">\n {imageError ?? error}\n </span>\n ) : parsed ? (\n <span className=\"flex max-w-56 items-center gap-1 text-xs text-success\">\n <CheckGlyph className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">{describeEnrollment(parsed)}</span>\n </span>\n ) : null;\n\n return (\n <div\n onDragOver={(e) => {\n if (disabled || !Array.from(e.dataTransfer.items).some((i) => i.kind === \"file\")) return;\n e.preventDefault();\n setDragging(true);\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(e) => {\n const f = imageFrom(e.dataTransfer);\n setDragging(false);\n if (!f || disabled) return;\n e.preventDefault();\n void takeImage(f);\n }}\n className={dragging ? \"rounded-lg bg-accent\" : undefined}\n >\n <Row\n label={label}\n actions={\n <>\n <Button variant=\"quiet\" icon={<QrGlyph />} aria-label=\"Choose QR image\" title=\"Choose or drop a QR image\" disabled={disabled || reading} onClick={() => file.current?.click()} />\n {canScan ? <Button variant=\"quiet\" icon={<CameraGlyph />} aria-label=\"Scan with camera\" title=\"Scan with camera\" disabled={disabled} onClick={() => setScanning(true)} /> : null}\n </>\n }\n >\n <Field\n className=\"w-full\"\n type=\"password\"\n value={value}\n onChange={(e) => takeText(e.target.value)}\n onPaste={(e) => {\n const f = imageFrom(e.clipboardData);\n if (!f) return;\n e.preventDefault();\n void takeImage(f);\n }}\n placeholder={placeholder}\n autoComplete=\"off\"\n spellCheck={false}\n autoFocus={autoFocus}\n disabled={disabled}\n aria-label=\"Setup key or otpauth link\"\n aria-invalid={Boolean(error || imageError) || undefined}\n end={end}\n />\n <input\n ref={file}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (f) void takeImage(f);\n }}\n />\n </Row>\n {canScan ? (\n <QrScanPanel\n open={scanning}\n onClose={() => setScanning(false)}\n onResult={(text) => {\n setScanning(false);\n takeText(text);\n }}\n />\n ) : null}\n </div>\n );\n}\n","/**\n * Reading a QR code IN THIS BROWSER with the platform's own `BarcodeDetector` (Chrome, Edge, Android,\n * the extension). The image and the camera frames never leave the device. Where the platform has no\n * detector, an image goes to the server's one-request decoder instead (`enrolQrImage`), and there is\n * no camera scan — the control is hidden, never dead.\n */\n\ninterface DetectedBarcode {\n rawValue: string;\n}\ninterface BarcodeDetectorLike {\n detect(source: ImageBitmapSource): Promise<DetectedBarcode[]>;\n}\ninterface BarcodeDetectorCtor {\n new (options?: { formats?: string[] }): BarcodeDetectorLike;\n getSupportedFormats?: () => Promise<string[]>;\n}\n\nfunction detectorCtor(): BarcodeDetectorCtor | null {\n const c = (globalThis as { BarcodeDetector?: BarcodeDetectorCtor }).BarcodeDetector;\n return typeof c === \"function\" ? c : null;\n}\n\nlet support: Promise<boolean> | null = null;\n\n/** True when this browser can read QR codes locally. */\nexport function canDecodeQrLocally(): Promise<boolean> {\n if (!support) {\n const C = detectorCtor();\n support = !C ? Promise.resolve(false) : C.getSupportedFormats ? C.getSupportedFormats().then((f) => f.includes(\"qr_code\"), () => false) : Promise.resolve(true);\n }\n return support;\n}\n\n/** True when a camera can be asked for (it may still be refused). */\nexport function hasCamera(): boolean {\n return typeof navigator !== \"undefined\" && typeof navigator.mediaDevices?.getUserMedia === \"function\";\n}\n\nlet detector: BarcodeDetectorLike | null = null;\nfunction qrDetector(): BarcodeDetectorLike | null {\n const C = detectorCtor();\n if (!C) return null;\n detector ??= new C({ formats: [\"qr_code\"] });\n return detector;\n}\n\n/** The text of the first QR code in the source, or null when there is none (or no local detector). */\nexport async function decodeQr(source: ImageBitmapSource): Promise<string | null> {\n const d = qrDetector();\n if (!d) return null;\n const found = await d.detect(source);\n return found.find((b) => b.rawValue)?.rawValue ?? null;\n}\n\n/** Reads an image file locally. `null` = no detector here or no code in the image. */\nexport async function decodeQrFile(file: Blob): Promise<string | null> {\n if (!(await canDecodeQrLocally())) return null;\n const bitmap = await createImageBitmap(file);\n try {\n return await decodeQr(bitmap);\n } finally {\n bitmap.close();\n }\n}\n\n/** The first image in a paste or drop, if any. */\nexport function imageFrom(data: DataTransfer | null): File | null {\n if (!data) return null;\n for (const f of Array.from(data.files)) if (f.type.startsWith(\"image/\")) return f;\n for (const it of Array.from(data.items)) {\n if (it.kind === \"file\" && it.type.startsWith(\"image/\")) {\n const f = it.getAsFile();\n if (f) return f;\n }\n }\n return null;\n}\n","import { useState } from \"react\";\nimport { Button, Select } from \"@ai-matrx/design-system/controls\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { MoreGlyph, PowerGlyph, TrashGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Row } from \"../ui\";\nimport { CodeButton, CopyCodeButton } from \"./CodeParts\";\nimport { useLiveCode } from \"./live-code\";\nimport { mfaMethodOf, type MfaMethod } from \"./port\";\nimport { OtpSetupRow } from \"./Setup\";\n\n/** The reason an authenticator change failed, in one line. */\nexport function otpActionError(e: unknown, what: string): string {\n const status = (e as { status?: unknown } | null)?.status;\n if (status === 404) return \"There is no one-time password here.\";\n if (status === 403) return `Not allowed to ${what}.`;\n return e instanceof Error && e.message ? e.message : `Could not ${what}.`;\n}\n\n/** The shared enable / disable / remove behaviour, with \"Confirm it's you\" when the server asks. */\nexport function useOtpActions(port: VaultPort, item: VaultItem, onChanged?: (next?: VaultItem | null) => void) {\n const confirmed = useConfirmed();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [enabledNow, setEnabledNow] = useState<boolean | null>(null);\n const [removed, setRemoved] = useState(false);\n const enabled = enabledNow ?? item.authenticator?.enabled ?? false;\n\n const run = async (what: string, op: () => Promise<void>) => {\n setBusy(true);\n setError(null);\n try {\n await op();\n } catch (e) {\n if (!wasCancelled(e)) setError(otpActionError(e, what));\n } finally {\n setBusy(false);\n }\n };\n\n return {\n busy,\n error,\n enabled,\n removed,\n clearError: () => setError(null),\n setEnabled: (on: boolean) =>\n run(on ? \"turn it on\" : \"turn it off\", async () => {\n const entry = await confirmed(() => port.authenticator.setEnabled(item, on));\n setEnabledNow(entry.enabled);\n onChanged?.(item.authenticator ? { ...item, authenticator: { ...item.authenticator, enabled: entry.enabled } } : undefined);\n }),\n remove: async () => {\n const ok = await confirm({\n title: `Remove the one-time password for ${item.name}?`,\n description: \"Codes stop here. Two-factor stays on at the site, and your phone app and backup codes still work.\",\n confirmLabel: \"Remove\",\n variant: \"destructive\",\n });\n if (!ok) return;\n await run(\"remove it\", async () => {\n await confirmed(() => port.authenticator.remove(item));\n setRemoved(true);\n onChanged?.({ ...item, authenticator: null });\n });\n },\n };\n}\n\nexport interface TotpRowProps {\n port: VaultPort;\n /** The item; it must have `authenticator`. */\n item: VaultItem;\n /** After enable / disable / remove: the item as it now is. */\n onChanged?: (next?: VaultItem | null) => void;\n}\n\n/** The item view's one-time password: the live code with its ring, copy, and a menu to turn it off or remove it. */\nexport function TotpRow({ port, item, onChanged }: TotpRowProps) {\n const a = useOtpActions(port, item, onChanged);\n const live = useLiveCode(port, item, a.enabled && !a.removed);\n const canManage = item.capabilities.canManage || item.capabilities.canEdit;\n if (a.removed || !item.authenticator) return null;\n\n const menu = canManage ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"One-time password options\" disabled={a.busy} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n <DropdownMenuItem onSelect={() => void a.setEnabled(!a.enabled)}>\n <PowerGlyph className=\"size-4\" />\n {a.enabled ? \"Turn off\" : \"Turn on\"}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"text-destructive focus:text-destructive\" onSelect={() => void a.remove()}>\n <TrashGlyph className=\"size-4\" />\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null;\n\n return (\n <Row\n label=\"One-time password\"\n actions={\n <>\n {a.enabled ? <CopyCodeButton live={live} label={item.name} /> : null}\n {menu}\n </>\n }\n >\n {a.error ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm text-destructive\" role=\"alert\">{a.error}</span>\n <Button variant=\"quiet\" onClick={a.clearError}>Dismiss</Button>\n </span>\n ) : !a.enabled ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"text-sm text-disabled-foreground\">Off</span>\n {canManage ? <Button variant=\"quiet\" icon={<PowerGlyph />} disabled={a.busy} onClick={() => void a.setEnabled(true)}>Turn on</Button> : null}\n </span>\n ) : live.error ? (\n <span className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm text-destructive\" title={live.error}>{live.error}</span>\n <Button variant=\"quiet\" onClick={live.retry}>Retry</Button>\n </span>\n ) : (\n <CodeButton live={live} digits={item.authenticator.digits} label={item.name} />\n )}\n </Row>\n );\n}\n\nexport interface TotpEditRowProps {\n /** The draft's setup key / otpauth link (`ItemDraft.authenticator`). */\n value: string;\n onChange: (value: string) => void;\n /** The item already has a one-time password (a new one replaces it). */\n hasExisting: boolean;\n /**\n * The saved item being edited. With `port`, an image this browser cannot read locally is sent to\n * the server's decoder at once (the draft cannot carry an image). Absent (new item): paste instead.\n */\n item?: VaultItem | null;\n port?: VaultPort;\n /** After an image was enrolled directly: the item as it now is. */\n onEnrolled?: (next?: VaultItem | null) => void;\n /** What a valid input says (service, account) — e.g. to fill an empty name. */\n onRecognized?: (parsed: { issuer: string | null; account: string | null }) => void;\n}\n\n/** Edit and new: ONE row — paste a key or link, choose or drop a QR image, or scan with the camera. */\nexport function TotpEditRow({ value, onChange, hasExisting, item, port, onEnrolled, onRecognized }: TotpEditRowProps) {\n const confirmed = useConfirmed();\n const [status, setStatus] = useState<string | null>(null);\n const uploadImage =\n item && port\n ? async (file: File) => {\n setStatus(\"Adding from image…\");\n try {\n const entry = await confirmed(() => port.authenticator.enrolQrImage(item, file, file.name));\n setStatus(entry.issuer ? `Added · ${entry.issuer}` : \"Added\");\n onChange(\"\");\n onEnrolled?.({ ...item, authenticator: { digits: entry.digits, period: entry.period, enabled: entry.enabled } });\n } catch (e) {\n setStatus(wasCancelled(e) ? null : otpActionError(e, \"read that image\"));\n }\n }\n : undefined;\n return (\n <OtpSetupRow\n value={value}\n onChange={(v) => {\n setStatus(null);\n onChange(v);\n }}\n placeholder={hasExisting ? \"Paste a new key to replace\" : \"Setup key or otpauth link\"}\n status={status}\n {...(uploadImage ? { onImage: (f: File) => void uploadImage(f) } : {})}\n {...(onRecognized ? { onRecognized } : {})}\n />\n );\n}\n\nconst MFA_OPTIONS = [\n { value: \"none\", label: \"Not recorded\" },\n { value: \"sms\", label: \"Text message\" },\n { value: \"push_or_other\", label: \"Other method\" },\n] as const;\n\n/**\n * A login whose site uses two-factor WITHOUT an app code (a text message, a push): recording it tells\n * agents to hand control back at the verification step instead of failing. Show it when the item has\n * no one-time password.\n */\nexport function TwoFactorMethodRow({ port, item, onChanged }: { port: VaultPort; item: VaultItem; onChanged?: (next?: VaultItem | null) => void }) {\n const [value, setValue] = useState<MfaMethod | null>(mfaMethodOf(item));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const canEdit = item.capabilities.canEdit || item.capabilities.canManage;\n return (\n <Row label=\"Two-factor\" hint={error ? <span className=\"text-destructive\">{error}</span> : undefined}>\n <Select\n value={value ?? \"none\"}\n disabled={!canEdit || busy}\n aria-label=\"Two-factor method\"\n options={MFA_OPTIONS.map((o) => ({ value: o.value, label: o.label }))}\n onValueChange={async (v: string) => {\n const next: MfaMethod | null = v === \"sms\" || v === \"push_or_other\" ? v : null;\n const before = value;\n setValue(next);\n setBusy(true);\n setError(null);\n try {\n onChanged?.(await port.authenticator.setMfaMethod(item, next));\n } catch (e) {\n setValue(before);\n setError(otpActionError(e, \"save that\"));\n } finally {\n setBusy(false);\n }\n }}\n />\n </Row>\n );\n}\n","import type { VaultItem } from \"../model\";\nimport type { TotpReading } from \"../port\";\n\n/** One account's one-time password as the server reports it. Metadata only: never a seed. */\nexport interface AuthenticatorEntry {\n itemId: string;\n /** The login's name (the server has no separate authenticator name). */\n name: string;\n issuer: string | null;\n /** The account the codes are for, from the setup address (`me@x.com`). */\n account: string | null;\n digits: number;\n period: number;\n algorithm: string;\n enabled: boolean;\n loginUrls: string[];\n}\n\n/**\n * A two-factor method that is NOT an app code, recorded on the login as the plaintext custom field\n * `mfa_method` so agents know to hand control back at the verification step.\n */\nexport type MfaMethod = \"sms\" | \"push_or_other\";\nexport const MFA_METHOD_KEY = \"mfa_method\";\n\ntype ItemRef = Pick<VaultItem, \"id\" | \"owner\">;\n\n/**\n * One-time passwords: every code, enrol by key / otpauth address / QR image, enable, disable,\n * rename, remove, and the recorded non-app method. Every call may reject; enrol and remove may\n * reject with \"sign in again\" — wrap them in `useConfirmed()`.\n */\nexport interface AuthenticatorPort {\n /** Every account the signed-in person holds a one-time password for. */\n list(): Promise<AuthenticatorEntry[]>;\n /** null when the item has none. */\n get(item: ItemRef): Promise<AuthenticatorEntry | null>;\n /** The current code and how long it lives. */\n code(item: ItemRef & Pick<VaultItem, \"authenticator\">): Promise<TotpReading>;\n /** A base32 setup key or a full `otpauth://totp/…` address. Needs a recent sign-in. */\n enrol(item: ItemRef, input: string): Promise<AuthenticatorEntry>;\n /** A QR image the server decodes in-request and drops. For hosts that cannot decode locally. */\n enrolQrImage(item: ItemRef, image: Blob, fileName?: string): Promise<AuthenticatorEntry>;\n /** On/off. Takes effect on the next code. */\n setEnabled(item: ItemRef, enabled: boolean): Promise<AuthenticatorEntry>;\n /** Deletes the seed. Two-factor stays on at the site; the phone app and backup codes still work. */\n remove(item: ItemRef): Promise<void>;\n /** Renames the login the code belongs to. */\n rename(item: ItemRef, name: string): Promise<VaultItem>;\n /** Records (or clears, with null) a non-app two-factor method on the login. */\n setMfaMethod(item: ItemRef & Pick<VaultItem, \"custom\">, method: MfaMethod | null): Promise<VaultItem>;\n}\n\n/** The recorded non-app method on an item, if any. */\nexport function mfaMethodOf(item: Pick<VaultItem, \"custom\">): MfaMethod | null {\n const v = item.custom.find((c) => c.key === MFA_METHOD_KEY)?.value;\n return v === \"sms\" ? \"sms\" : v ? \"push_or_other\" : null;\n}\n","/**\n * Field settings (`?panel=field:<fieldId>`) and item settings (`?panel=settings`).\n *\n * Ported with no rule lost from matrx-frontend `VaultItemDetail.tsx` (FieldRow metadata,\n * DestinationSection) and `VaultHandlingControl.tsx`: who can see a value (sealing is permanent\n * and confirmed by name), env key, sandbox use (needs an env key), editable, active, description;\n * website matching, browser fill, and moving an encrypted address into the item's websites.\n * Every change saves on its own and the panel shows the item as the server now has it.\n */\nimport { useRef, useState, type ReactNode } from \"react\";\nimport { Badge, Button, DisclosureHeader, Field, SegmentedControl, Select, Switch } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { GlobeGlyph, LockGlyph, SlidersGlyph } from \"../glyphs\";\nimport type { FieldHandling, UriMatchMode, VaultField, VaultItem } from \"../model\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport type { FieldSettingsPatch } from \"./port\";\nimport { HANDLING_WORDS, MATCH_MODES, MATCH_WORDS, envKeyProblem, handlingChoices, normalizeLoginUrl, promotableUrlFields, sandboxBlocker, sealConfirmation } from \"./rules\";\n\nconst say = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\n\n/** One saving action at a time, its failure said in the panel, never swallowed. */\nfunction useSaver(onChanged: (next: VaultItem) => void) {\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const save = async (what: string, step: () => Promise<VaultItem | null>): Promise<boolean> => {\n setBusy(what);\n setError(null);\n try {\n const next = await step();\n if (next) onChanged(next);\n return true;\n } catch (e) {\n if (!wasCancelled(e)) setError(say(e, \"That didn’t save. Try again.\"));\n return false;\n } finally {\n setBusy(null);\n }\n };\n return { busy, error, setError, save };\n}\n\nfunction Problem({ children }: { children: ReactNode }) {\n return (\n <p role=\"alert\" className=\"px-1 text-sm text-destructive\">\n {children}\n </p>\n );\n}\n\nconst quietHint = (text: string, tone: \"muted\" | \"destructive\" = \"muted\") => (\n <span className={tone === \"destructive\" ? \"text-destructive\" : undefined} title={text}>\n {text}\n </span>\n);\n\n// ── field settings ──────────────────────────────────────────────────────────\n\n/** `panel=field:<fieldId>` — `arg` is the field id. */\nexport function FieldSettingsPanel(props: ItemPanelProps) {\n const field = props.item.fields.find((f) => f.id === props.arg);\n if (!field)\n return (\n <Panel title=\"Field settings\" size=\"md\" onClose={props.onClose} footer={<Button variant=\"primary\" onClick={props.onClose}>Done</Button>}>\n <Empty>This field is no longer on the item.</Empty>\n </Panel>\n );\n return <FieldSettings key={field.id} {...props} field={field} />;\n}\n\nfunction FieldSettings({ item, port, field, onClose, onChanged }: ItemPanelProps & { field: VaultField }) {\n const { busy, error, setError, save } = useSaver((next) => onChanged(next));\n const [envDraft, setEnvDraft] = useState(field.envKey ?? \"\");\n const [descDraft, setDescDraft] = useState(field.description);\n const envRef = useRef<HTMLInputElement>(null);\n const canEdit = item.capabilities.canEdit;\n const envProblem = envKeyProblem(envDraft);\n const blocker = sandboxBlocker(envDraft, field.envKey);\n\n const update = (what: string, patch: FieldSettingsPatch) => save(what, () => port.fields.updateField(item, field.id, patch));\n\n const chooseHandling = async (next: FieldHandling) => {\n if (next === field.handling) return;\n if (next === \"sealed\") {\n const words = sealConfirmation(field);\n if (!(await confirm({ ...words, variant: \"destructive\" }))) return;\n }\n await update(\"handling\", { handling: next });\n };\n\n const commitEnvKey = async () => {\n const next = envDraft.trim();\n if (next === (field.envKey ?? \"\") || envProblem) return;\n // Removing the env key would leave sandbox use pointing at nothing: turn that off with it.\n await update(\"envKey\", next ? { envKey: next } : { envKey: null, ...(field.injectIntoSandbox ? { injectIntoSandbox: false } : {}) });\n };\n\n const commitDescription = async () => {\n if (descDraft.trim() === field.description.trim()) return;\n await update(\"description\", { description: descDraft });\n };\n\n const setSandbox = async (on: boolean) => {\n if (on && blocker) {\n setError(blocker === \"Needs an env key\" ? \"Add an env key first: sandboxes see a value by its env key.\" : \"Fix the env key first.\");\n envRef.current?.focus();\n return;\n }\n const envChanged = envDraft.trim() !== (field.envKey ?? \"\");\n await update(\"sandbox\", { injectIntoSandbox: on, ...(on && envChanged ? { envKey: envDraft.trim() } : {}) });\n };\n\n const handling = HANDLING_WORDS[field.handling];\n const locked = !canEdit || busy !== null;\n\n return (\n <Panel title={`${field.label} settings`} size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Done</Button>}>\n {!canEdit ? <p className=\"px-1 text-sm text-muted-foreground\">View only: you can’t change these settings.</p> : null}\n\n <Section title=\"Who can see it\">\n <Row label=\"Value\" hint={quietHint(handling.hint)}>\n {field.handling === \"sealed\" ? (\n <Badge icon={<LockGlyph />}>Sealed for good</Badge>\n ) : (\n <SegmentedControl<FieldHandling>\n aria-label=\"Who can see it\"\n value={field.handling}\n onValueChange={(v) => void chooseHandling(v)}\n data={handlingChoices(field.handling).map((h) => ({ value: h, label: HANDLING_WORDS[h].label, title: HANDLING_WORDS[h].hint, disabled: locked }))}\n />\n )}\n </Row>\n </Section>\n\n <Section title=\"Automation\">\n <Row label=\"Env key\" hint={envProblem ? quietHint(envProblem, \"destructive\") : quietHint(\"The name sandboxes and workflows use\")}>\n <Field\n ref={envRef}\n className=\"w-full font-mono\"\n aria-label=\"Env key\"\n aria-invalid={Boolean(envProblem)}\n placeholder=\"e.g. GITHUB_TOKEN\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={locked}\n value={envDraft}\n onChange={(e) => setEnvDraft(e.target.value)}\n onBlur={() => void commitEnvKey()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n if (e.key === \"Escape\") setEnvDraft(field.envKey ?? \"\");\n }}\n />\n </Row>\n <Row label=\"Use in sandbox\" hint={blocker && !field.injectIntoSandbox ? quietHint(blocker) : quietHint(\"Sandboxes get it as an env variable\")}>\n <Switch aria-label=\"Use in sandbox\" checked={field.injectIntoSandbox} disabled={locked} onCheckedChange={(v) => void setSandbox(v)} />\n </Row>\n </Section>\n\n <Section title=\"Field\">\n <Row label=\"Description\">\n <Field\n className=\"w-full\"\n aria-label=\"Description\"\n placeholder=\"What it’s for\"\n disabled={locked}\n value={descDraft}\n onChange={(e) => setDescDraft(e.target.value)}\n onBlur={() => void commitDescription()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") e.currentTarget.blur();\n if (e.key === \"Escape\") setDescDraft(field.description);\n }}\n />\n </Row>\n <Row label=\"Editable\" hint={quietHint(field.editable ? \"The value can be changed\" : \"The value is locked\")}>\n <Switch aria-label=\"Editable\" checked={field.editable} disabled={locked} onCheckedChange={(v) => void update(\"editable\", { editable: v })} />\n </Row>\n <Row label=\"Active\" hint={quietHint(field.active ? \"In use\" : \"Kept, but nothing uses it\")}>\n <Switch aria-label=\"Active\" checked={field.active} disabled={locked} onCheckedChange={(v) => void update(\"active\", { active: v })} />\n </Row>\n </Section>\n\n {error ? <Problem>{error}</Problem> : null}\n </Panel>\n );\n}\n\n// ── item settings ───────────────────────────────────────────────────────────\n\n/** `panel=settings` — how the browser treats this item, plus each field's settings behind Advanced. */\nexport function ItemSettingsPanel({ item, port, onClose, onChanged, onPanel }: ItemPanelProps) {\n const { busy, error, save } = useSaver((next) => onChanged(next));\n const confirmed = useConfirmed();\n const [advanced, setAdvanced] = useState(false);\n const canEdit = item.capabilities.canEdit;\n const hasWebsite = item.loginUrls.length > 0;\n const promotable = canEdit ? promotableUrlFields(item) : [];\n const locked = !canEdit || busy !== null;\n\n const promote = async (field: VaultField) => {\n const ok = await confirm({\n title: `Use ${field.label} as a website?`,\n description: \"The address will be stored unencrypted so the browser can match it.\",\n confirmLabel: \"Use as website\",\n });\n if (!ok) return;\n await save(`promote:${field.id}`, async () => {\n const raw = await confirmed(() => port.reveal(item, field.key));\n const url = normalizeLoginUrl(raw);\n if (!url) throw new Error(`${field.label} doesn’t hold a website.`);\n if (item.loginUrls.includes(url)) throw new Error(\"That address is already one of its websites.\");\n return port.fields.updateItem(item, { loginUrls: [...item.loginUrls, url] });\n });\n };\n\n const fillHint = !hasWebsite ? \"Add a website first\" : item.browserFillEnabled ? \"Offered on matching pages\" : \"Never filled automatically\";\n\n return (\n <Panel title=\"Item settings\" size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Done</Button>}>\n {!canEdit ? <p className=\"px-1 text-sm text-muted-foreground\">View only: you can’t change these settings.</p> : null}\n\n <Section title=\"In the browser\">\n <Row label=\"Website matching\" hint={quietHint(MATCH_WORDS[item.uriMatchMode].hint)}>\n <Select<UriMatchMode>\n aria-label=\"Website matching\"\n disabled={locked}\n value={item.uriMatchMode}\n options={MATCH_MODES.map((m) => ({ value: m, label: MATCH_WORDS[m].label }))}\n onValueChange={(m) => void save(\"match\", () => port.fields.updateItem(item, { uriMatchMode: m }))}\n />\n </Row>\n <Row label=\"Fill in browser\" hint={quietHint(fillHint)}>\n <Switch aria-label=\"Fill in browser\" checked={hasWebsite && item.browserFillEnabled} disabled={locked || !hasWebsite} onCheckedChange={(v) => void save(\"fill\", () => port.fields.updateItem(item, { browserFillEnabled: v }))} />\n </Row>\n {promotable.map((f) => (\n <Row\n key={f.id}\n label={f.label}\n hint={quietHint(\"Encrypted, so the browser can’t match it\")}\n actions={\n <Button variant=\"outline\" icon={<GlobeGlyph />} disabled={locked} onClick={() => void promote(f)}>\n Use as website\n </Button>\n }\n >\n <span className=\"text-muted-foreground\">Not a website yet</span>\n </Row>\n ))}\n </Section>\n\n <div className=\"flex flex-col gap-1.5\">\n <DisclosureHeader open={advanced} title=\"Advanced\" meta={item.fields.length ? `${item.fields.length} fields` : undefined} onClick={() => setAdvanced((a) => !a)} />\n {advanced ? (\n <Section>\n {item.fields.length === 0 ? (\n <Empty>No encrypted fields.</Empty>\n ) : (\n item.fields.map((f) => (\n <Row\n key={f.id}\n label={f.label}\n actions={<Button variant=\"quiet\" icon={<SlidersGlyph />} aria-label={`${f.label} settings`} onClick={() => onPanel(`field:${f.id}`)} />}\n >\n <span className=\"block truncate\">\n <span className={f.handling === \"sealed\" ? \"text-foreground\" : \"text-muted-foreground\"}>{HANDLING_WORDS[f.handling].label}</span>\n {f.envKey ? <span className=\"font-mono text-muted-foreground\"> · {f.envKey}</span> : null}\n {f.injectIntoSandbox ? <span className=\"text-muted-foreground\"> · Sandbox</span> : null}\n {!f.active ? <span className=\"text-disabled-foreground\"> · Off</span> : null}\n </span>\n </Row>\n ))\n )}\n </Section>\n ) : null}\n </div>\n\n {error ? <Problem>{error}</Problem> : null}\n </Panel>\n );\n}\n","/**\n * The fields area's rules in one place, pure, so every screen and every test reads the same words.\n * Ported from matrx-frontend `features/secrets` (types.ts, utils.ts, VaultHandlingControl.tsx,\n * VaultItemDetail.tsx) with no rule dropped.\n */\nimport type { FieldHandling, UriMatchMode, VaultField, VaultItem } from \"../model\";\nimport type { DestinationResult, FieldsPort } from \"./port\";\n\n/** An env key is a shell variable name. */\nexport const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** What is wrong with an env key draft, or null. Empty is fine (it means \"no env key\"). */\nexport function envKeyProblem(draft: string): string | null {\n const v = draft.trim();\n if (!v) return null;\n return ENV_KEY_RE.test(v) ? null : \"Letters, digits and _ only; not a digit first\";\n}\n\n/** A sandbox can only see a field by its env key: turning sandbox use on needs a valid one. */\nexport function sandboxBlocker(envKeyDraft: string, savedEnvKey: string | null): string | null {\n const effective = envKeyDraft.trim() || savedEnvKey || \"\";\n if (!effective) return \"Needs an env key\";\n if (!ENV_KEY_RE.test(effective)) return \"Fix the env key first\";\n return null;\n}\n\n/** Who can see a field's value, in plain words. Every value is encrypted at rest either way. */\nexport const HANDLING_WORDS: Record<FieldHandling, { label: string; hint: string }> = {\n visible: { label: \"Anyone\", hint: \"Anyone who can use it can show or copy it\" },\n revealable: { label: \"On request\", hint: \"Showing or copying it needs reveal access\" },\n sealed: { label: \"Sealed\", hint: \"No one can see it. Automation can still use it.\" },\n};\n\n/** The handlings a field may move to. Sealed is a one-way door: nothing leaves it. */\nexport function handlingChoices(current: FieldHandling): readonly FieldHandling[] {\n return current === \"sealed\" ? [\"sealed\"] : [\"visible\", \"revealable\", \"sealed\"];\n}\n\n/** The words of the permanent-seal confirmation, naming exactly what is lost. */\nexport function sealConfirmation(field: Pick<VaultField, \"label\" | \"envKey\" | \"key\">): { title: string; description: string; confirmLabel: string } {\n const name = field.label || field.envKey || field.key;\n return {\n title: `Seal ${name} permanently?`,\n description: `No one will ever see ${name} again, including you. Automation can still use it.`,\n confirmLabel: \"Seal permanently\",\n };\n}\n\n/** How the browser decides this item matches a page, in plain words. */\nexport const MATCH_WORDS: Record<UriMatchMode, { label: string; hint: string }> = {\n host: { label: \"This site\", hint: \"Any page on this exact site\" },\n domain: { label: \"Whole domain\", hint: \"Also its sister sites, like all of google.com\" },\n exact: { label: \"Exact address\", hint: \"Only this exact address\" },\n never: { label: \"Never\", hint: \"Never suggest or fill it automatically\" },\n};\nexport const MATCH_MODES: readonly UriMatchMode[] = [\"host\", \"domain\", \"exact\", \"never\"];\n\n/** Encrypted fields that older types used for a website; the browser can never match those. */\nexport const PROMOTABLE_URL_FIELD_KEYS = [\"account_url\", \"site_url\", \"panel_url\", \"portal_url\"] as const;\n\nexport function promotableUrlFields(item: VaultItem): VaultField[] {\n return item.fields.filter((f) => (PROMOTABLE_URL_FIELD_KEYS as readonly string[]).includes(f.key) && f.active && f.handling !== \"sealed\");\n}\n\n// ── websites ────────────────────────────────────────────────────────────────\n\n/** A typed website as it is stored: a bare host becomes https; query and fragment are dropped. */\nexport function normalizeLoginUrl(input: string): string | null {\n const candidate = input.trim();\n if (!candidate) return null;\n try {\n const parsed = new URL(/^[a-z][a-z\\d+.-]*:/i.test(candidate) ? candidate : `https://${candidate}`);\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") return null;\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return null;\n }\n}\n\n/** What a website check found, ready for a row under the field. */\nexport interface DestinationCheck {\n /** What to store (normalized); \"\" when the input is not a website at all. */\n url: string;\n tone: \"success\" | \"warning\" | \"destructive\";\n message: string;\n state: DestinationResult[\"state\"] | \"offline\";\n}\n\nexport function describeDestination(r: DestinationResult): DestinationCheck {\n if (r.state === \"reachable\") return { url: r.normalizedUrl, state: r.state, tone: \"success\", message: \"Website confirmed\" };\n if (r.state === \"invalid\") return { url: r.normalizedUrl, state: r.state, tone: \"destructive\", message: \"Not a public website\" };\n if (r.state === \"not_found\") return { url: r.normalizedUrl, state: r.state, tone: \"warning\", message: \"Site answered, but this page was not found\" };\n return { url: r.normalizedUrl, state: r.state, tone: \"warning\", message: \"Couldn’t confirm it. You can still save it.\" };\n}\n\n/**\n * Normalize a typed website and ask the server whether it answers. Advisory only: saving never\n * waits on it. Call on blur; drop the answer if the person typed again since (compare `url`).\n */\nexport async function checkDestination(port: { fields: Pick<FieldsPort, \"checkDestination\"> }, input: string, item?: VaultItem): Promise<DestinationCheck | null> {\n if (!input.trim()) return null;\n const url = normalizeLoginUrl(input);\n if (!url) return { url: \"\", state: \"invalid\", tone: \"destructive\", message: \"Enter a website, like npmjs.com\" };\n try {\n return describeDestination(await port.fields.checkDestination(url, item));\n } catch {\n return { url, state: \"offline\", tone: \"warning\", message: \"Couldn’t check right now. You can still save it.\" };\n }\n}\n\n// ── recovery codes ──────────────────────────────────────────────────────────\n\nexport const RECOVERY_CODES_KEY = \"recovery_codes\";\n\nexport const isRecoveryCodesField = (f: Pick<VaultField, \"key\">) => f.key === RECOVERY_CODES_KEY;\n\n/** The codes stored in one encrypted field: one per line, blanks dropped. */\nexport function parseRecoveryCodes(value: string): string[] {\n return value.split(/\\r?\\n/).map((c) => c.trim()).filter(Boolean);\n}\n\n/**\n * \"Mark used\" removes that one code from the stored set, so it can never be chosen again.\n * `null` means none are left: the field itself goes.\n */\nexport function withoutCode(codes: readonly string[], index: number): string | null {\n const left = codes.filter((_, i) => i !== index);\n return left.length ? left.join(\"\\n\") : null;\n}\n","/**\n * THE password generator — one for every host. `GenerateButton` sits beside a secret field and\n * opens it in a popover; \"Use\" hands the value back. The value is crypto-random (kit engine),\n * masked until revealed, and dropped 30 seconds after it was made if nobody uses it.\n *\n * The organization's ceilings (`vault.generator.*` knobs) come from the host through\n * `GeneratorLimitsProvider` (or the `limits` prop): the knobs are read by the host's own data\n * client. A host with no limits source shows no button — never a dead one.\n */\nimport { createContext, useContext, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Popover, PopoverContent, PopoverTrigger, cn } from \"@ai-matrx/design-system\";\nimport { Button, NumberStepper, SegmentedControl, Select, Switch } from \"@ai-matrx/design-system/controls\";\nimport { useCopy } from \"../notice\";\nimport { CopyGlyph, EyeGlyph, EyeOffGlyph, KeyGlyph, RefreshGlyph } from \"../glyphs\";\nimport {\n DEFAULT_SETTINGS,\n GENERATED_VALUE_TTL_MS,\n MIN_PASSPHRASE_WORDS,\n SEPARATORS,\n clampSettings,\n generate,\n minPasswordLength,\n parseGeneratorLimits,\n refusalMessage,\n strengthOf,\n type CredentialGenerationLimits,\n type GeneratorKind,\n type GeneratorSettings,\n type PassphraseSeparator,\n type PasswordSettings,\n} from \"./generate\";\n\n/** Reads the organization's ceilings. Raw knob values are fine: they are validated here. */\nexport type GeneratorLimitsSource = () => Promise<{ maxPasswordLength?: unknown; maxPassphraseWords?: unknown } | null>;\n\nconst LimitsCtx = createContext<GeneratorLimitsSource | null>(null);\n\n/** Hosts wrap the vault once: `<GeneratorLimitsProvider resolve={readKnobs}>`. */\nexport function GeneratorLimitsProvider({ resolve, children }: { resolve: GeneratorLimitsSource | undefined; children: ReactNode }) {\n return <LimitsCtx.Provider value={resolve ?? null}>{children}</LimitsCtx.Provider>;\n}\n\nexport function useGeneratorLimitsSource(): GeneratorLimitsSource | null {\n return useContext(LimitsCtx);\n}\n\ninterface Candidate {\n value: string;\n bits: number;\n}\n\ntype LimitsState = { state: \"loading\" } | { state: \"ready\"; limits: CredentialGenerationLimits } | { state: \"unavailable\"; message: string };\n\nconst MASK = \"••••••••••••••••••••\";\n\n/** The generator body: kind, value, options, Use. Mount it only while it is shown. */\nexport function PasswordGenerator({ limits: source, onUse, useLabel = \"Use\" }: { limits: GeneratorLimitsSource; onUse: (value: string) => void; useLabel?: string }) {\n const [settings, setSettings] = useState<GeneratorSettings>(DEFAULT_SETTINGS);\n const [limits, setLimits] = useState<LimitsState>({ state: \"loading\" });\n const [round, setRound] = useState(0);\n const [candidate, setCandidate] = useState<Candidate | null>(null);\n const [revealed, setRevealed] = useState(false);\n const [note, setNote] = useState<{ tone: \"muted\" | \"destructive\" | \"success\"; text: string } | null>(null);\n const copyValue = useCopy();\n const expiry = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const drop = () => {\n if (expiry.current) clearTimeout(expiry.current);\n expiry.current = null;\n setCandidate(null);\n setRevealed(false);\n };\n\n const make = (next: GeneratorSettings, ceilings: CredentialGenerationLimits) => {\n const bounded = clampSettings(next, ceilings);\n setSettings(bounded);\n drop();\n const result = generate(bounded, ceilings);\n if (!result.ok) {\n setNote({ tone: \"destructive\", text: refusalMessage(result.reason) });\n return;\n }\n setNote(null);\n setCandidate({ value: result.value, bits: result.entropyBitsLowerBound });\n expiry.current = setTimeout(() => {\n expiry.current = null;\n setCandidate(null);\n setRevealed(false);\n setNote({ tone: \"muted\", text: \"Expired. Generate a new one.\" });\n }, GENERATED_VALUE_TTL_MS);\n };\n\n // Read the ceilings, then make the first value. A stale answer (closed, retried) is ignored.\n useEffect(() => {\n let live = true;\n setLimits({ state: \"loading\" });\n source()\n .then((raw) => {\n if (!live) return;\n const parsed = parseGeneratorLimits(raw);\n if (!parsed) {\n setLimits({ state: \"unavailable\", message: \"Generator limits aren’t set up for this organization.\" });\n return;\n }\n setLimits({ state: \"ready\", limits: parsed });\n make(DEFAULT_SETTINGS, parsed);\n })\n .catch((e: unknown) => {\n if (live) setLimits({ state: \"unavailable\", message: e instanceof Error && e.message ? e.message : \"Generator limits could not be read.\" });\n });\n return () => {\n live = false;\n };\n // The source and an explicit retry decide when to re-read; `make` only reads state setters.\n }, [source, round]);\n\n // Plaintext never outlives the generator.\n useEffect(() => () => {\n if (expiry.current) clearTimeout(expiry.current);\n }, []);\n\n if (limits.state === \"loading\") return <p className=\"px-1 py-3 text-sm text-muted-foreground\" aria-live=\"polite\">Reading limits…</p>;\n if (limits.state === \"unavailable\")\n return (\n <div className=\"flex flex-col gap-2 px-1 py-2\">\n <p role=\"alert\" className=\"text-sm text-destructive\">{limits.message}</p>\n <Button variant=\"outline\" icon={<RefreshGlyph />} onClick={() => setRound((n) => n + 1)}>Try again</Button>\n </div>\n );\n\n const ceilings = limits.limits;\n const change = (next: GeneratorSettings) => make(next, ceilings);\n const setPassword = (patch: Partial<PasswordSettings>) => change({ ...settings, password: { ...settings.password, ...patch } });\n const strength = candidate ? strengthOf(candidate.bits) : null;\n\n const copy = async () => {\n if (!candidate) return;\n const ok = await copyValue(candidate.value, \"Generated password\");\n setNote(ok ? { tone: \"success\", text: \"Copied. Your clipboard keeps it.\" } : { tone: \"destructive\", text: \"Couldn’t copy. Reveal it and copy by hand.\" });\n };\n const use = () => {\n if (!candidate) return;\n const value = candidate.value;\n drop();\n onUse(value);\n };\n\n return (\n <div className=\"flex w-full flex-col gap-3\" aria-label=\"Password generator\">\n <SegmentedControl<GeneratorKind>\n fill\n aria-label=\"Kind\"\n value={settings.kind}\n onValueChange={(kind) => change({ ...settings, kind })}\n data={[{ value: \"password\", label: \"Password\" }, { value: \"passphrase\", label: \"Passphrase\" }]}\n />\n\n <div className=\"flex flex-col gap-1 rounded-lg bg-muted px-3 py-2\">\n <div className=\"flex min-h-7 items-start gap-1\">\n <code className={cn(\"min-w-0 flex-1 break-all py-1 font-mono text-sm\", candidate ? \"text-foreground\" : \"text-muted-foreground\")} data-testid=\"generated-value\">\n {candidate ? (revealed ? candidate.value : MASK) : \"—\"}\n </code>\n <Button variant=\"quiet\" icon={revealed ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={revealed ? \"Hide\" : \"Reveal\"} disabled={!candidate} onClick={() => setRevealed((r) => !r)} />\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label=\"Copy\" disabled={!candidate} onClick={() => void copy()} />\n <Button variant=\"quiet\" icon={<RefreshGlyph />} aria-label=\"Generate another\" onClick={() => change(settings)} />\n </div>\n {strength && candidate ? (\n <p className=\"text-xs\">\n <span className={cn(strength.tone === \"success\" && \"text-success\", strength.tone === \"primary\" && \"text-primary\", strength.tone === \"warning\" && \"text-warning\")}>{strength.label}</span>\n <span className=\"text-muted-foreground\"> · {Math.floor(candidate.bits)}-bit</span>\n </p>\n ) : null}\n </div>\n\n {settings.kind === \"password\" ? (\n <div className=\"flex flex-col gap-0.5\">\n <OptionLine label=\"Length\">\n <NumberStepper value={settings.password.length} min={minPasswordLength(settings.password)} max={ceilings.maxPasswordLength} fallback={24} onChange={(length) => setPassword({ length })} />\n </OptionLine>\n {(\n [\n [\"lowercase\", \"Lowercase\"],\n [\"uppercase\", \"Uppercase\"],\n [\"digits\", \"Digits\"],\n [\"symbols\", \"Symbols\"],\n ] as const\n ).map(([key, label]) => {\n const on = settings.password[key];\n const last = on && minPasswordLength(settings.password) === 1;\n return (\n <OptionLine key={key} label={label}>\n <Switch aria-label={label} checked={on} disabled={last} onCheckedChange={(v) => setPassword({ [key]: v })} />\n </OptionLine>\n );\n })}\n <OptionLine label=\"Avoid look-alikes\" hint=\"No 0/O, 1/l/I\">\n <Switch aria-label=\"Avoid look-alikes\" checked={settings.password.excludeAmbiguous} onCheckedChange={(v) => setPassword({ excludeAmbiguous: v })} />\n </OptionLine>\n </div>\n ) : (\n <div className=\"flex flex-col gap-0.5\">\n <OptionLine label=\"Words\">\n <NumberStepper value={settings.passphrase.wordCount} min={MIN_PASSPHRASE_WORDS} max={ceilings.maxPassphraseWords} fallback={MIN_PASSPHRASE_WORDS} onChange={(wordCount) => change({ ...settings, passphrase: { ...settings.passphrase, wordCount } })} />\n </OptionLine>\n <OptionLine label=\"Separator\">\n <Select<PassphraseSeparator> aria-label=\"Separator\" variant=\"inline\" align=\"end\" value={settings.passphrase.separator} options={SEPARATORS} onValueChange={(separator) => change({ ...settings, passphrase: { ...settings.passphrase, separator } })} />\n </OptionLine>\n <OptionLine label=\"Capitalize\">\n <Switch aria-label=\"Capitalize\" checked={settings.passphrase.capitalize} onCheckedChange={(capitalize) => change({ ...settings, passphrase: { ...settings.passphrase, capitalize } })} />\n </OptionLine>\n <OptionLine label=\"Add a digit\">\n <Switch aria-label=\"Add a digit\" checked={settings.passphrase.appendDigit} onCheckedChange={(appendDigit) => change({ ...settings, passphrase: { ...settings.passphrase, appendDigit } })} />\n </OptionLine>\n </div>\n )}\n\n {note ? (\n <p aria-live=\"polite\" className={cn(\"text-xs\", note.tone === \"destructive\" ? \"text-destructive\" : note.tone === \"success\" ? \"text-success\" : \"text-muted-foreground\")}>\n {note.text}\n </p>\n ) : null}\n\n <Button variant=\"primary\" disabled={!candidate} onClick={use}>{useLabel}</Button>\n </div>\n );\n}\n\nfunction OptionLine({ label, hint, children }: { label: string; hint?: string; children: ReactNode }) {\n return (\n <div className=\"flex min-h-9 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm text-foreground\">{label}</span>\n {hint ? <span className=\"truncate text-xs text-muted-foreground\">{hint}</span> : null}\n </div>\n <div className=\"flex shrink-0 items-center\">{children}</div>\n </div>\n );\n}\n\n/**\n * An icon button beside a secret field that opens the generator. \"Use\" hands the value back and\n * closes it; closing without using drops the value.\n */\nexport function GenerateButton({ onUse, label, limits, disabled }: { onUse: (value: string) => void; label?: string; limits?: GeneratorLimitsSource; disabled?: boolean }) {\n const fromHost = useGeneratorLimitsSource();\n const source = limits ?? fromHost;\n const [open, setOpen] = useState(false);\n if (!source) return null;\n const name = label ?? \"Generate password\";\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"quiet\" icon={<KeyGlyph />} aria-label={name} title={name} disabled={disabled} />\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"end\">\n {open ? (\n <PasswordGenerator\n limits={source}\n onUse={(value) => {\n onUse(value);\n setOpen(false);\n }}\n />\n ) : null}\n </PopoverContent>\n </Popover>\n );\n}\n\n","/**\n * THE password generator's pure half, for every host (web app, extension, desktop).\n *\n * Randomness comes ONLY from `@ai-matrx/kit/credential-generator` (rejection-sampled Web Crypto,\n * the EFF large wordlist, a 64-bit floor). This module adds what every screen needs on top: the\n * settings people change, the organization's ceilings, and the words for each outcome. Nothing\n * here keeps a generated value — the screen holds it for `GENERATED_VALUE_TTL_MS` and drops it.\n */\nimport {\n CREDENTIAL_GENERATION_TECHNICAL_LIMITS,\n generateCredentialSecret,\n type CredentialGenerationLimits,\n type CredentialGenerationOptions,\n type CredentialGenerationResult,\n} from \"@ai-matrx/kit/credential-generator\";\n\nexport { CREDENTIAL_GENERATION_TECHNICAL_LIMITS, generateCredentialSecret };\nexport type { CredentialGenerationLimits, CredentialGenerationOptions, CredentialGenerationResult };\n\n/** A generated value lives this long, unused, before it is dropped. */\nexport const GENERATED_VALUE_TTL_MS = 30_000;\n\n/** The knobs the limits come from (`vault.generator.*`), resolved by the host for its organization. */\nexport const GENERATOR_LIMIT_KNOBS = { feature: \"vault.generator\", maxPasswordLength: \"max_password_length\", maxPassphraseWords: \"max_passphrase_words\" } as const;\n\n/** An organization may lower the ceilings, never below the defaults people start from. */\nexport const MIN_PASSWORD_CEILING = 24;\nexport const MIN_PASSPHRASE_CEILING = 6;\nexport const MIN_PASSPHRASE_WORDS = 6;\n\nexport type GeneratorKind = \"password\" | \"passphrase\";\nexport type PassphraseSeparator = \"-\" | \" \" | \".\";\n\nexport interface PasswordSettings {\n length: number;\n lowercase: boolean;\n uppercase: boolean;\n digits: boolean;\n symbols: boolean;\n excludeAmbiguous: boolean;\n}\n\nexport interface PassphraseSettings {\n wordCount: number;\n separator: PassphraseSeparator;\n capitalize: boolean;\n appendDigit: boolean;\n}\n\nexport interface GeneratorSettings {\n kind: GeneratorKind;\n password: PasswordSettings;\n passphrase: PassphraseSettings;\n}\n\nexport const DEFAULT_PASSWORD: PasswordSettings = { length: 24, lowercase: true, uppercase: true, digits: true, symbols: true, excludeAmbiguous: true };\nexport const DEFAULT_PASSPHRASE: PassphraseSettings = { wordCount: 6, separator: \"-\", capitalize: false, appendDigit: false };\nexport const DEFAULT_SETTINGS: GeneratorSettings = { kind: \"password\", password: DEFAULT_PASSWORD, passphrase: DEFAULT_PASSPHRASE };\n\nexport const SEPARATORS: readonly { value: PassphraseSeparator; label: string }[] = [\n { value: \"-\", label: \"Hyphen\" },\n { value: \" \", label: \"Space\" },\n { value: \".\", label: \"Period\" },\n];\n\n/** The engine's options for the current settings (only the chosen kind's). */\nexport function optionsFor(settings: GeneratorSettings): CredentialGenerationOptions {\n return settings.kind === \"password\" ? { kind: \"password\", ...settings.password } : { kind: \"passphrase\", ...settings.passphrase };\n}\n\nconst isWholeIn = (v: unknown, min: number, max: number): v is number => typeof v === \"number\" && Number.isSafeInteger(v) && v >= min && v <= max;\n\n/**\n * The organization's ceilings, or null when they are missing or malformed. Null is an honest\n * refusal (\"not set up\"), never a quietly invented policy. Accepts numbers or numeric strings\n * (knob values arrive as JSON).\n */\nexport function parseGeneratorLimits(raw: { maxPasswordLength?: unknown; maxPassphraseWords?: unknown } | null | undefined): CredentialGenerationLimits | null {\n if (!raw) return null;\n const num = (v: unknown) => (typeof v === \"string\" && v.trim() !== \"\" ? Number(v) : v);\n const maxPasswordLength = num(raw.maxPasswordLength);\n const maxPassphraseWords = num(raw.maxPassphraseWords);\n if (!isWholeIn(maxPasswordLength, MIN_PASSWORD_CEILING, CREDENTIAL_GENERATION_TECHNICAL_LIMITS.maxPasswordLength)) return null;\n if (!isWholeIn(maxPassphraseWords, MIN_PASSPHRASE_CEILING, CREDENTIAL_GENERATION_TECHNICAL_LIMITS.maxPassphraseWords)) return null;\n return { maxPasswordLength, maxPassphraseWords };\n}\n\n/** The fewest characters the chosen classes allow (one of each). */\nexport function minPasswordLength(p: PasswordSettings): number {\n return Math.max(1, [p.lowercase, p.uppercase, p.digits, p.symbols].filter(Boolean).length);\n}\n\n/** True when at least one character class is on. */\nexport const hasCharacterClass = (p: PasswordSettings) => p.lowercase || p.uppercase || p.digits || p.symbols;\n\n/** Keeps the settings inside the ceilings so a lowered limit never strands a stored choice. */\nexport function clampSettings(settings: GeneratorSettings, limits: CredentialGenerationLimits): GeneratorSettings {\n const clamp = (n: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, Math.round(Number.isFinite(n) ? n : lo)));\n return {\n ...settings,\n password: { ...settings.password, length: clamp(settings.password.length, minPasswordLength(settings.password), limits.maxPasswordLength) },\n passphrase: { ...settings.passphrase, wordCount: clamp(settings.passphrase.wordCount, MIN_PASSPHRASE_WORDS, limits.maxPassphraseWords) },\n };\n}\n\n/** Generate for these settings under these ceilings. One call, crypto-random, never a fallback. */\nexport function generate(settings: GeneratorSettings, limits: CredentialGenerationLimits): CredentialGenerationResult {\n return generateCredentialSecret(optionsFor(settings), limits);\n}\n\n/** What to say when the engine refuses (≤ 60 characters each). */\nexport function refusalMessage(reason: Extract<CredentialGenerationResult, { ok: false }>[\"reason\"]): string {\n if (reason === \"insufficient_strength\") return \"Too weak. Add length or character types.\";\n if (reason === \"random_unavailable\") return \"Secure randomness is unavailable here.\";\n return \"These options can’t make a value.\";\n}\n\n/** Strength as people read it, from the engine's entropy lower bound. */\nexport function strengthOf(bits: number): { label: string; tone: \"success\" | \"primary\" | \"warning\" } {\n // 70+ bits is beyond any online or offline guessing a person faces; a 6-word passphrase (77) is strong.\n if (bits >= 100) return { label: \"Excellent\", tone: \"success\" };\n if (bits >= 70) return { label: \"Strong\", tone: \"primary\" };\n return { label: \"Fair\", tone: \"warning\" };\n}\n","import type { CsvImportLimits } from \"./csv-import\";\n\nexport type ImportLimits = CsvImportLimits & { maxJsonDepth: number; jsonWorkerTimeoutMs: number };\n\nconst KEYS: readonly [keyof ImportLimits, string][] = [\n [\"maxFileBytes\", \"max_file_bytes\"],\n [\"maxRecords\", \"max_records\"],\n [\"maxColumns\", \"max_columns\"],\n [\"maxCellBytes\", \"max_cell_bytes\"],\n [\"maxFields\", \"max_fields\"],\n [\"maxPlaintextFieldBytes\", \"max_plaintext_field_bytes\"],\n [\"maxRequestBodyBytes\", \"max_request_body_bytes\"],\n [\"maxJsonDepth\", \"json_max_depth\"],\n [\"jsonWorkerTimeoutMs\", \"json_worker_timeout_ms\"],\n];\n\n/**\n * How large an import may be: the organization's `vault.import.*` knobs, never numbers in this\n * package. Import is unavailable (and says so) until every one is set.\n */\nexport function importLimitsFrom(resolved: Readonly<Record<string, unknown>>): ImportLimits {\n const out: Partial<Record<keyof ImportLimits, number>> = {};\n for (const [field, key] of KEYS) {\n const v = Number(resolved[`vault.import.${key}`]);\n if (!Number.isSafeInteger(v) || v <= 0) throw new Error(\"Import is not set up for this organization yet.\");\n out[field] = v;\n }\n return out as ImportLimits;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { Button, Field, SegmentedControl, Switch } from \"@ai-matrx/design-system/controls\";\nimport { downloadFile } from \"@ai-matrx/kit/download\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed } from \"../auth/IdentityGate\";\nimport { formatBytes, Empty, Panel, Row, Section } from \"../ui\";\nimport { BACKUP_FILENAME, backupErrorMessage, readBackupFile, restoreRunFor, startNewRestoreRun } from \"./backup-file\";\nimport { ErrorLine, PickLine, Windowed, plural } from \"./lines\";\nimport type { BackupOmission, BackupPreview, RestorePreview, RestoreResult } from \"./port\";\n\ntype Mode = \"backup\" | \"restore\";\n\nconst RECORD_STATUS: Record<RestoreResult[\"results\"][number][\"status\"], string> = {\n created: \"Restored\",\n replayed: \"Already restored\",\n refused: \"Refused\",\n retryable_failure: \"Try again\",\n};\n\nfunction omissionText(o: BackupOmission): string {\n const what = o.component.replaceAll(\"_\", \" \");\n return `${o.count ?? \"Some\"} ${what}: ${o.reason.replaceAll(\"_\", \" \")}`;\n}\n\nfunction Summary({ value }: { value: BackupPreview | RestorePreview }) {\n return (\n <Section>\n <Row label=\"Credentials\">{value.record_count}</Row>\n <Row label=\"Protected fields\">{value.field_count}</Row>\n <Row label=\"Files\">{value.attachment_count > 0 ? `${value.attachment_count} · ${formatBytes(value.attachment_bytes)}` : \"0\"}</Row>\n </Section>\n );\n}\n\nfunction Omissions({ omissions, accepted, onAccepted, verb }: { omissions: readonly BackupOmission[]; accepted: boolean; onAccepted: (on: boolean) => void; verb: string }) {\n if (omissions.length === 0) return null;\n return (\n <Section title=\"Left out\">\n {omissions.map((o, i) => (\n <Row key={`${o.component}-${o.source_item_id ?? i}`} label={o.component.replaceAll(\"_\", \" \")}>\n <span className=\"block truncate text-muted-foreground\" title={omissionText(o)}>\n {omissionText(o)}\n </span>\n </Row>\n ))}\n <Row label=\"Accept\" hint={`${verb} without these`}>\n <Switch checked={accepted} onCheckedChange={onAccepted} aria-label={`${verb} without these`} />\n </Row>\n </Section>\n );\n}\n\n/** Encrypted backup of chosen credentials, and restore from a backup file. */\nexport function BackupPanel({ port, items, onClose, onChanged }: VaultPanelProps) {\n const confirmed = useConfirmed();\n const fileInput = useRef<HTMLInputElement | null>(null);\n const abort = useRef<AbortController | null>(null);\n const [mode, setMode] = useState<Mode>(\"backup\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [passphrase, setPassphrase] = useState(\"\");\n const [repeat, setRepeat] = useState(\"\");\n const [accepted, setAccepted] = useState(false);\n\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [backup, setBackup] = useState<BackupPreview | null>(null);\n\n const [file, setFile] = useState<File | null>(null);\n const [restorePreview, setRestorePreview] = useState<RestorePreview | null>(null);\n const [runId, setRunId] = useState<string | null>(null);\n const [result, setResult] = useState<RestoreResult | null>(null);\n\n useEffect(() => () => abort.current?.abort(), []);\n\n const switchMode = (next: Mode) => {\n abort.current?.abort();\n setMode(next);\n setError(null);\n setPassphrase(\"\");\n setRepeat(\"\");\n setAccepted(false);\n setBackup(null);\n setRestorePreview(null);\n setResult(null);\n setBusy(false);\n };\n\n const guarded = async (run: () => Promise<void>) => {\n setBusy(true);\n setError(null);\n try {\n await run();\n } catch (cause) {\n if (!(cause instanceof DOMException && cause.name === \"AbortError\")) setError(backupErrorMessage(cause));\n } finally {\n setBusy(false);\n }\n };\n\n const pick = (id: string, on: boolean) => {\n setBackup(null);\n setAccepted(false);\n setSelected((current) => {\n const next = new Set(current);\n if (on) next.add(id);\n else next.delete(id);\n return next;\n });\n };\n\n const reviewBackup = () => guarded(async () => {\n setBackup(await confirmed(() => port.io.previewBackup([...selected])));\n setAccepted(false);\n });\n\n const downloadBackup = () => guarded(async () => {\n if (!backup) return;\n const bytes = await confirmed(() => port.io.downloadBackup({ itemIds: [...selected], revision: backup.revision, passphrase, acceptOmissions: accepted }));\n downloadFile(BACKUP_FILENAME, bytes, \"application/octet-stream\");\n setPassphrase(\"\");\n setRepeat(\"\");\n onClose();\n });\n\n const reviewRestore = () => guarded(async () => {\n if (!file) return;\n const ctl = new AbortController();\n abort.current = ctl;\n const encoded = await readBackupFile(file, ctl.signal);\n const preview = await confirmed(() => port.io.previewRestore(encoded, passphrase));\n if (ctl.signal.aborted) return;\n setRestorePreview(preview);\n setRunId(restoreRunFor(preview));\n setResult(null);\n setAccepted(false);\n });\n\n const restore = async () => {\n if (!file || !restorePreview || !runId) return;\n const ok = await confirm({\n title: `Restore ${plural(restorePreview.record_count, \"credential\")}?`,\n description: \"They're added to your personal vault, disabled and restricted. Review them before using or sharing.\",\n confirmLabel: \"Restore\",\n });\n if (!ok) return;\n await guarded(async () => {\n const encoded = await readBackupFile(file);\n const done = await confirmed(() => port.io.restoreBackup({ envelopeBase64: encoded, passphrase, preview: restorePreview, restoreRunId: runId, acceptOmissions: accepted }));\n setResult(done);\n if (done.created + done.replayed > 0) onChanged();\n });\n };\n\n const again = async () => {\n if (!restorePreview) return;\n const ok = await confirm({\n title: \"Restore these again?\",\n description: \"Credentials you already restored are added a second time as new copies.\",\n confirmLabel: \"Restore again\",\n });\n if (!ok) return;\n setRunId(startNewRestoreRun(restorePreview));\n setResult(null);\n };\n\n const retryable = (result?.retryable_failure ?? 0) > 0;\n const mismatch = repeat !== \"\" && repeat !== passphrase;\n const names = new Map(restorePreview?.records.map((r) => [r.source_item_id, r.display_name]) ?? []);\n\n const footer =\n mode === \"backup\" ? (\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n {backup ? (\n <Button variant=\"primary\" disabled={busy || !passphrase || passphrase !== repeat || (backup.omissions.length > 0 && !accepted)} onClick={() => void downloadBackup()}>\n Encrypt and download\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy || selected.size === 0} onClick={() => void reviewBackup()}>\n Review {selected.size}\n </Button>\n )}\n </>\n ) : (\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n {result && !retryable ? \"Done\" : \"Close\"}\n </Button>\n {result ? (\n retryable ? (\n <Button variant=\"primary\" disabled={busy} onClick={() => void restore()}>\n Try again\n </Button>\n ) : (\n <Button variant=\"outline\" disabled={busy} onClick={() => void again()}>\n Restore again\n </Button>\n )\n ) : restorePreview ? (\n <Button variant=\"primary\" disabled={busy || (restorePreview.omissions.length > 0 && !accepted)} onClick={() => void restore()}>\n Restore {restorePreview.record_count}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy || !file || !passphrase} onClick={() => void reviewRestore()}>\n Review\n </Button>\n )}\n </>\n );\n\n return (\n <Panel title=\"Backup\" size=\"lg\" onClose={onClose} footer={footer}>\n <SegmentedControl<Mode>\n value={mode}\n onValueChange={switchMode}\n aria-label=\"Backup or restore\"\n fill\n data={[\n { value: \"backup\", label: \"Back up\" },\n { value: \"restore\", label: \"Restore\" },\n ]}\n />\n\n {mode === \"backup\" ? (\n <>\n <Section\n title={`${selected.size} of ${plural(items.length, \"credential\")}`}\n actions={\n <>\n <Button variant=\"quiet\" disabled={busy || items.length === 0} onClick={() => { setBackup(null); setSelected(new Set(items.map((i) => i.id))); }}>\n All\n </Button>\n <Button variant=\"quiet\" disabled={busy || selected.size === 0} onClick={() => { setBackup(null); setSelected(new Set()); }}>\n None\n </Button>\n </>\n }\n >\n {items.length === 0 ? (\n <Empty>Nothing to back up yet.</Empty>\n ) : (\n <Windowed items={items} render={(i) => <PickLine key={i.id} title={i.name} detail={i.definitionLabel} checked={selected.has(i.id)} disabled={busy} onChange={(on) => pick(i.id, on)} />} />\n )}\n </Section>\n {backup ? (\n <>\n <Summary value={backup} />\n <Omissions omissions={backup.omissions} accepted={accepted} onAccepted={setAccepted} verb=\"Back up\" />\n <Section>\n <Row label=\"Passphrase\" hint=\"Not saved. It can't be recovered.\">\n <Field type=\"password\" value={passphrase} autoComplete=\"new-password\" aria-label=\"Backup passphrase\" onChange={(e) => setPassphrase(e.target.value)} />\n </Row>\n <Row label=\"Repeat\" {...(mismatch ? { hint: \"Doesn't match\" } : {})}>\n <Field type=\"password\" value={repeat} autoComplete=\"new-password\" aria-label=\"Repeat the passphrase\" onChange={(e) => setRepeat(e.target.value)} />\n </Row>\n </Section>\n </>\n ) : null}\n </>\n ) : (\n <>\n {!restorePreview ? (\n <Section>\n <Row label=\"File\" {...(file ? { hint: file.name } : {})}>\n <Button variant=\"outline\" disabled={busy} onClick={() => fileInput.current?.click()}>\n Choose a backup\n </Button>\n <input\n ref={fileInput}\n type=\"file\"\n hidden\n accept=\".matrxvault\"\n onChange={(e) => {\n setFile(e.target.files?.[0] ?? null);\n e.target.value = \"\";\n }}\n />\n </Row>\n <Row label=\"Passphrase\">\n <Field type=\"password\" value={passphrase} autoComplete=\"current-password\" aria-label=\"Backup passphrase\" onChange={(e) => setPassphrase(e.target.value)} />\n </Row>\n </Section>\n ) : (\n <>\n <Summary value={restorePreview} />\n {!result ? <Omissions omissions={restorePreview.omissions} accepted={accepted} onAccepted={setAccepted} verb=\"Restore\" /> : null}\n {!result ? (\n <p className=\"px-1 text-xs text-muted-foreground\">Restored items start disabled and restricted.</p>\n ) : (\n <Section title={`${result.created} restored · ${result.replayed} already · ${result.refused} refused · ${result.retryable_failure} to retry`}>\n {result.results.map((r) => (\n <Row key={r.source_item_id} label={names.get(r.source_item_id) ?? \"Credential\"}>\n <span className={r.status === \"refused\" || r.status === \"retryable_failure\" ? \"text-destructive\" : \"text-foreground\"}>\n {RECORD_STATUS[r.status]}\n {r.reason === \"alias_conflict\" ? \" · name in use\" : \"\"}\n </span>\n </Row>\n ))}\n </Section>\n )}\n </>\n )}\n </>\n )}\n <ErrorLine message={error} />\n </Panel>\n );\n}\n","/** What a backup screen needs around the server calls: reading the file, the restore run, plain-words errors. */\nimport { MatrxApiError } from \"@ai-matrx/api\";\nimport type { RestorePreview } from \"./port\";\n\nexport const MAX_BACKUP_UPLOAD_BYTES = 66 * 1024 * 1024;\nexport const BACKUP_FILENAME = \"matrx-vault-backup.matrxvault\";\nconst RESTORE_RUN_KEY = \"matrx:vault-backup-restore:v1\";\n\n/** The file as base64 (what the server takes), without the data-URL prefix. */\nexport function readBackupFile(file: Blob, signal?: AbortSignal): Promise<string> {\n if (file.size > MAX_BACKUP_UPLOAD_BYTES) return Promise.reject(new Error(\"This backup file is too large to restore.\"));\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n const abort = () => reader.abort();\n signal?.addEventListener(\"abort\", abort, { once: true });\n const cleanup = () => signal?.removeEventListener(\"abort\", abort);\n reader.onerror = () => {\n cleanup();\n reject(new Error(\"The backup file could not be read.\"));\n };\n reader.onabort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n reader.onload = () => {\n cleanup();\n const result = reader.result;\n if (typeof result !== \"string\" || !result.includes(\",\")) reject(new Error(\"The backup file could not be read.\"));\n else resolve(result.slice(result.indexOf(\",\") + 1));\n };\n reader.readAsDataURL(file);\n });\n}\n\n/** A failed backup or restore call, in words a person can act on. */\nexport function backupErrorMessage(cause: unknown): string {\n if (cause instanceof MatrxApiError) {\n switch (cause.status) {\n case 401:\n return \"Confirm it's you, then try again.\";\n case 403:\n return \"Your account or organization changed. Start again.\";\n case 404:\n return \"A selected credential is gone. Reload the vault and start again.\";\n case 409:\n return \"The backup or account changed. Review it again.\";\n case 413:\n return \"This backup is too large. Choose fewer credentials.\";\n case 429:\n return \"Backup encryption is busy. Wait a moment, then try again.\";\n case 422:\n return \"The file, selection or passphrase was refused.\";\n default:\n if (cause.status >= 500 || cause.status === 408) return \"The result could not be confirmed. Try again; nothing is repeated.\";\n return cause.message;\n }\n }\n return cause instanceof Error ? cause.message : \"The backup could not complete.\";\n}\n\ninterface StoredRestoreRun {\n digest: string;\n actorId: string;\n organizationId: string;\n runId: string;\n}\n\nfunction storage(): Storage | null {\n try {\n return typeof sessionStorage === \"undefined\" ? null : sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction readStoredRun(): StoredRestoreRun | null {\n const store = storage();\n if (!store) return null;\n try {\n const raw = store.getItem(RESTORE_RUN_KEY);\n if (!raw) return null;\n const v: unknown = JSON.parse(raw);\n if (v && typeof v === \"object\" && [\"digest\", \"actorId\", \"organizationId\", \"runId\"].every((k) => typeof (v as Record<string, unknown>)[k] === \"string\")) return v as StoredRestoreRun;\n store.removeItem(RESTORE_RUN_KEY);\n } catch {\n store.removeItem(RESTORE_RUN_KEY);\n }\n return null;\n}\n\nfunction writeRun(preview: RestorePreview, runId: string): string {\n storage()?.setItem(RESTORE_RUN_KEY, JSON.stringify({ digest: preview.envelope_digest, actorId: preview.actor_id, organizationId: preview.organization_id, runId } satisfies StoredRestoreRun));\n return runId;\n}\n\n/**\n * The restore run for this exact backup and account. Reviewing the same file again (even after a\n * reload) reuses it, so a restore that half-landed continues instead of creating duplicates.\n */\nexport function restoreRunFor(preview: RestorePreview): string {\n const stored = readStoredRun();\n if (stored && stored.digest === preview.envelope_digest && stored.actorId === preview.actor_id && stored.organizationId === preview.organization_id) return stored.runId;\n return writeRun(preview, crypto.randomUUID());\n}\n\n/** Restore the same file again as a new run (after the first one finished or was refused). */\nexport function startNewRestoreRun(preview: RestorePreview): string {\n return writeRun(preview, crypto.randomUUID());\n}\n\nexport function clearRestoreRun(): void {\n storage()?.removeItem(RESTORE_RUN_KEY);\n}\n","/** The few pieces the three panels share: a pick-list line, a \"more\" disclosure, an error line. */\nimport { useState, type ReactNode } from \"react\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Badge, Button, DisclosureHeader, type BadgeTone } from \"@ai-matrx/design-system/controls\";\n\n/** One line in a list the person picks from: a checkbox, a name, a quiet detail, an optional badge. */\nexport function PickLine({ checked, onChange, disabled = false, title, detail, badge, tone }: { checked: boolean; onChange: (next: boolean) => void; disabled?: boolean; title: string; detail?: string | undefined; badge?: string | undefined; tone?: BadgeTone | undefined }) {\n return (\n <label className=\"flex min-h-11 items-center gap-3 px-4 py-1\" data-clickable={disabled ? undefined : \"\"}>\n <Checkbox checked={checked} disabled={disabled} onCheckedChange={(v) => onChange(v === true)} aria-label={title} />\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\">{title}</span>\n {detail ? <span className=\"hidden min-w-0 max-w-[45%] truncate text-xs text-muted-foreground sm:block\">{detail}</span> : null}\n {badge ? <Badge tone={tone ?? \"neutral\"}>{badge}</Badge> : null}\n </label>\n );\n}\n\n/** A list that shows its first lines and offers the rest, so a thousand records never fill the panel. */\nexport function Windowed<T>({ items, size = 150, render }: { items: readonly T[]; size?: number; render: (item: T) => ReactNode }) {\n const [all, setAll] = useState(false);\n const shown = all ? items : items.slice(0, size);\n return (\n <>\n {shown.map(render)}\n {items.length > shown.length ? (\n <div className=\"px-4 py-2\">\n <Button variant=\"quiet\" onClick={() => setAll(true)}>\n Show all {items.length}\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\n/** Rare choices stay behind one tap. */\nexport function More({ title = \"More\", children }: { title?: string; children: ReactNode }) {\n const [open, setOpen] = useState(false);\n return (\n <div className=\"flex flex-col gap-2\">\n <DisclosureHeader open={open} title={title} onClick={() => setOpen((o) => !o)} />\n {open ? children : null}\n </div>\n );\n}\n\n/** A refusal or failure, in the panel it happened in. */\nexport function ErrorLine({ message }: { message: string | null }) {\n return message ? (\n <p role=\"alert\" className=\"px-1 text-sm text-destructive\">\n {message}\n </p>\n ) : null;\n}\n\nexport const plural = (n: number, one: string, many = `${one}s`): string => `${n} ${n === 1 ? one : many}`;\n","import { useMemo, useState } from \"react\";\nimport { Button, Select, type SelectOption } from \"@ai-matrx/design-system/controls\";\nimport { downloadFile } from \"@ai-matrx/kit/download\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed } from \"../auth/IdentityGate\";\nimport { ExportGlyph } from \"../glyphs\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { ErrorLine, PickLine, Windowed, plural } from \"./lines\";\nimport type { LoginCsvPreview, LoginCsvProfile } from \"./port\";\n\n/** Each format and what it leaves out, in the order a person is likely to want them. */\nconst FORMATS: readonly { value: LoginCsvProfile; label: string; hint: string }[] = [\n { value: \"matrx_login_csv_v1\", label: \"Matrx\", hint: \"Website logins, all common fields\" },\n { value: \"firefox_csv_v1\", label: \"Firefox\", hint: \"Address, username and password\" },\n { value: \"roboform_csv_v1\", label: \"RoboForm\", hint: \"Name, address, login, password, note\" },\n { value: \"dashlane_csv_v1\", label: \"Dashlane\", hint: \"Name, address, username, password, note\" },\n { value: \"apple_passwords_csv_v1\", label: \"Apple Passwords\", hint: \"Title, address, username, password, notes\" },\n { value: \"google_password_manager_csv_v1\", label: \"Google Password Manager\", hint: \"No title or notes columns\" },\n { value: \"lastpass_csv_v1\", label: \"LastPass\", hint: \"Title, address, username, password, notes\" },\n { value: \"keeper_csv_v1\", label: \"Keeper\", hint: \"Title, address, username, password, notes\" },\n { value: \"nordpass_csv_v1\", label: \"NordPass\", hint: \"NordPass's import template\" },\n];\nconst FORMAT_OPTIONS: readonly SelectOption<LoginCsvProfile>[] = FORMATS.map((f) => ({ value: f.value, label: f.label }));\nconst FILENAME = \"matrx-login-export.csv\";\nconst WEBSITE_LOGIN = \"website_login\";\n\nfunction omissionText(omissions: Record<string, number> | undefined): string {\n return Object.entries(omissions ?? {})\n .filter(([, n]) => n > 0)\n .map(([why, n]) => `${n} ${why.replaceAll(\"_\", \" \")}`)\n .join(\", \");\n}\n\n/** Take selected website logins out as a CSV another password manager can read. */\nexport function ExportPanel({ port, items, onClose }: VaultPanelProps) {\n const confirmed = useConfirmed();\n const logins = useMemo(() => items.filter((i) => i.definitionKey === WEBSITE_LOGIN), [items]);\n const [profile, setProfile] = useState<LoginCsvProfile>(\"matrx_login_csv_v1\");\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [preview, setPreview] = useState<LoginCsvPreview | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const format = FORMATS.find((f) => f.value === profile);\n const reasons = new Map(preview?.items.map((p) => [p.item_id, p]) ?? []);\n const eligible = preview?.items.filter((p) => p.eligible).length ?? 0;\n\n const changed = () => {\n setPreview(null);\n setError(null);\n };\n const pick = (id: string, on: boolean) => {\n changed();\n setSelected((current) => {\n const next = new Set(current);\n if (on) next.add(id);\n else next.delete(id);\n return next;\n });\n };\n\n const review = async () => {\n setBusy(true);\n setError(null);\n try {\n setPreview(await port.io.previewLoginCsv(profile, [...selected]));\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The selection could not be checked.\");\n } finally {\n setBusy(false);\n }\n };\n\n const download = async () => {\n if (!preview) return;\n const ok = await confirm({\n title: `Download ${plural(eligible, \"password\")} as plain text?`,\n description: \"Anyone who gets this file can read them. Delete it once you've imported it.\",\n confirmLabel: \"Download\",\n variant: \"destructive\",\n });\n if (!ok) return;\n setBusy(true);\n setError(null);\n try {\n const csv = await confirmed(() => port.io.downloadLoginCsv(preview.profile, [...selected], preview.revision));\n downloadFile(FILENAME, csv, \"text/csv;charset=utf-8\");\n onClose();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The file could not be created.\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Panel\n title=\"Export logins\"\n size=\"lg\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n {preview ? (\n <Button variant=\"primary\" icon={<ExportGlyph className=\"size-4\" />} disabled={busy || eligible === 0} onClick={() => void download()}>\n Download {eligible}\n </Button>\n ) : (\n <Button variant=\"primary\" disabled={busy || selected.size === 0} onClick={() => void review()}>\n Review {selected.size}\n </Button>\n )}\n </>\n }\n >\n <Section>\n <Row label=\"Format\" hint={format?.hint}>\n <Select\n value={profile}\n options={FORMAT_OPTIONS}\n aria-label=\"Format\"\n onValueChange={(p) => {\n changed();\n setProfile(p);\n }}\n />\n </Row>\n </Section>\n <Section\n title={`${selected.size} of ${plural(logins.length, \"login\")}`}\n actions={\n <>\n <Button variant=\"quiet\" disabled={busy || logins.length === 0} onClick={() => { changed(); setSelected(new Set(logins.map((l) => l.id))); }}>\n All\n </Button>\n <Button variant=\"quiet\" disabled={busy || selected.size === 0} onClick={() => { changed(); setSelected(new Set()); }}>\n None\n </Button>\n </>\n }\n >\n {logins.length === 0 ? (\n <Empty>No website logins to export.</Empty>\n ) : (\n <Windowed\n items={logins}\n render={(item) => {\n const p = reasons.get(item.id);\n const left = p && !p.eligible;\n const omitted = p ? omissionText(p.omissions) : \"\";\n return (\n <PickLine\n key={item.id}\n title={item.name}\n detail={left ? (p.reason ?? \"Can't be exported\").replaceAll(\"_\", \" \") : omitted ? `Leaves out ${omitted}` : item.owner.label}\n badge={left ? \"Left out\" : undefined}\n tone={left ? \"warning\" : undefined}\n checked={selected.has(item.id)}\n disabled={busy}\n onChange={(on) => pick(item.id, on)}\n />\n );\n }}\n />\n )}\n </Section>\n <ErrorLine message={error} />\n </Panel>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Button, Select, Switch, Textarea, type BadgeTone, type SelectOption } from \"@ai-matrx/design-system/controls\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed } from \"../auth/IdentityGate\";\nimport { ImportGlyph } from \"../glyphs\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { hasAmbiguousCsvMapping, suggestedCsvMapping, type CsvColumnRole } from \"./csv-import\";\nimport type { ImportLimits } from \"./csv-import-limits\";\nimport { runImport, type ImportRunResult } from \"./import-run\";\nimport { countLines, defaultSelection, reviewLines, selectable, type ExistingItem, type ReviewLine, type ReviewState } from \"./import-review\";\nimport { EXPORT_HELP, SOURCE_OPTIONS, acceptFor, detectSource, parseEnvEntries, type ImportSource } from \"./import-source\";\nimport { ErrorLine, More, PickLine, Windowed, plural } from \"./lines\";\nimport { parseImportFile, type ParsedImport } from \"./parse-source\";\nimport type { CreatedItem } from \"./port\";\n\nexport interface ImportPanelProps extends VaultPanelProps {\n /** The organization's import limits (`importLimitsFrom` over the host's knobs). */\n limits: ImportLimits;\n}\n\nconst ROLE_OPTIONS: readonly SelectOption<CsvColumnRole>[] = [\n { value: \"keep\", label: \"Keep encrypted\" },\n { value: \"title\", label: \"Name\" },\n { value: \"username\", label: \"Username\" },\n { value: \"password\", label: \"Password\" },\n { value: \"url\", label: \"Website\" },\n { value: \"notes\", label: \"Notes\" },\n { value: \"otp\", label: \"One-time password\" },\n];\n\nconst STATE_BADGE: Partial<Record<ReviewState, { text: string; tone: BadgeTone }>> = {\n duplicate: { text: \"Duplicate?\", tone: \"warning\" },\n deleted: { text: \"Deleted\", tone: \"neutral\" },\n archived: { text: \"Archived\", tone: \"neutral\" },\n invalid: { text: \"Can't import\", tone: \"destructive\" },\n unsupported: { text: \"Not supported\", tone: \"neutral\" },\n};\n\nconst ME = \"me\";\n\ntype Draft =\n | { kind: \"file\"; parsed: ParsedImport; mapping: CsvColumnRole[] }\n | { kind: \"env\"; entries: ReturnType<typeof parseEnvEntries> };\n\ninterface Done {\n created: CreatedItem[];\n failed: { key: string; title: string; reason: string }[];\n skipped: number;\n withOtp: number;\n /** Lines the run never reached; a retry continues with them. */\n untried: ReviewLine[];\n}\n\n/** Bring items in: pick a source, review what will be created, choose where, import, read the result. */\nexport function ImportPanel({ port, host, items, organizations, onClose, onChanged, limits }: ImportPanelProps) {\n const confirmed = useConfirmed();\n const fileInput = useRef<HTMLInputElement | null>(null);\n const abort = useRef<AbortController | null>(null);\n const stop = useRef(false);\n const keys = useRef(new Map<string, string>());\n\n const [source, setSource] = useState<ImportSource>(\"auto\");\n const [envText, setEnvText] = useState(\"\");\n const [injectSandbox, setInjectSandbox] = useState(false);\n const [fileName, setFileName] = useState<string | null>(null);\n const [reading, setReading] = useState(false);\n const [draft, setDraft] = useState<Draft | null>(null);\n const [destination, setDestination] = useState(ME);\n const [browserFill, setBrowserFill] = useState(false);\n // Structured exports store each website and SSH public key readable (not encrypted); the person approves that once per file.\n const [approvedVisible, setApprovedVisible] = useState(false);\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [running, setRunning] = useState<{ done: number; total: number } | null>(null);\n const [done, setDone] = useState<Done | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(\n () => () => {\n abort.current?.abort();\n stop.current = true;\n },\n [],\n );\n\n const organizationId = destination === ME ? null : destination;\n const existingIn = (org: string | null): ExistingItem[] =>\n items.filter((i) => (org === null ? i.owner.kind === \"me\" : i.owner.organizationId === org)).map((i) => ({ displayName: i.name, loginUrls: i.loginUrls }));\n const existing = useMemo(() => existingIn(organizationId), [items, organizationId]);\n const destinationOptions = useMemo<SelectOption[]>(() => [{ value: ME, label: \"Personal\" }, ...organizations.map((o) => ({ value: o.id, label: o.name }))], [organizations]);\n\n const lines = useMemo<ReviewLine[]>(\n () => (draft?.kind === \"file\" ? reviewLines(draft.parsed, { organizationId, browserFill, existing, limits, mapping: draft.mapping }) : []),\n [draft, organizationId, browserFill, existing, limits],\n );\n const envKeys = draft?.kind === \"env\" ? draft.entries : [];\n const counts = countLines(lines, selected);\n const chosen = draft?.kind === \"env\" ? envKeys.filter((e) => selected.has(e.key + e.text)).length : counts.selected;\n const needsApproval = draft?.kind === \"file\" && draft.parsed.kind === \"structured\" && !approvedVisible;\n const ambiguous = draft?.kind === \"file\" && draft.parsed.kind === \"csv\" && hasAmbiguousCsvMapping(draft.mapping);\n\n const reset = () => {\n abort.current?.abort();\n setDraft(null);\n setDone(null);\n setError(null);\n setReading(false);\n setFileName(null);\n setSelected(new Set());\n setApprovedVisible(false);\n keys.current = new Map();\n };\n\n const reviewEnv = (text: string) => {\n const entries = parseEnvEntries(text);\n if (entries.length === 0) {\n setError(\"No KEY=value lines found.\");\n return;\n }\n setError(null);\n setDraft({ kind: \"env\", entries });\n setSelected(new Set(entries.map((e) => e.key + e.text)));\n };\n\n const chooseFile = async (file: File) => {\n abort.current?.abort();\n const ctl = new AbortController();\n abort.current = ctl;\n setError(null);\n setFileName(file.name);\n setReading(true);\n try {\n const resolved = source === \"auto\" ? await detectSource(file) : source;\n if (ctl.signal.aborted) return;\n if (resolved === \"env\") {\n if (file.size > limits.maxFileBytes) throw new Error(\"The file is larger than an import may be.\");\n const text = await file.text();\n if (ctl.signal.aborted) return;\n setSource(\"env\");\n setEnvText(text);\n reviewEnv(text);\n return;\n }\n const parsed = await parseImportFile(resolved, file, limits, ctl.signal);\n if (ctl.signal.aborted) return;\n const mapping = parsed.kind === \"csv\" ? suggestedCsvMapping(parsed.preview.headers, parsed.vendor) : [];\n const nextDraft: Draft = { kind: \"file\", parsed, mapping };\n setDraft(nextDraft);\n setSelected(defaultSelection(reviewLines(parsed, { organizationId, browserFill, existing, limits, mapping })));\n } catch (cause) {\n if (!ctl.signal.aborted) {\n setFileName(null);\n setError(cause instanceof Error ? cause.message : \"That file could not be read.\");\n }\n } finally {\n if (!ctl.signal.aborted) setReading(false);\n }\n };\n\n /** Anything that changes which lines are importable also resets what is switched on. */\n const restart = (next: { destination?: string; mapping?: CsvColumnRole[]; browserFill?: boolean }) => {\n if (draft?.kind !== \"file\") return;\n const mapping = next.mapping ?? draft.mapping;\n const org = (next.destination ?? destination) === ME ? null : (next.destination ?? destination);\n if (next.mapping) setDraft({ ...draft, mapping });\n if (next.destination !== undefined) setDestination(next.destination);\n if (next.browserFill !== undefined) setBrowserFill(next.browserFill);\n setSelected(defaultSelection(reviewLines(draft.parsed, { organizationId: org, browserFill: next.browserFill ?? browserFill, existing: existingIn(org), limits, mapping })));\n };\n\n const finish = (result: ImportRunResult, skipped: number, previous?: Done | null) => {\n const merged: Done = {\n created: [...(previous?.created ?? []), ...result.created],\n failed: result.failed,\n skipped,\n withOtp: (previous?.withOtp ?? 0) + result.withOtp,\n untried: result.untried,\n };\n setDone(merged);\n if (result.created.length > 0) onChanged();\n };\n\n const importFiles = async (todo: ReviewLine[], skipped: number, previous?: Done | null) => {\n stop.current = false;\n setError(null);\n setRunning({ done: 0, total: todo.length });\n try {\n const result = await runImport({ io: port.io, organizationId, lines: todo, keys: keys.current, confirmed, onProgress: (d, total) => setRunning({ done: d, total }), shouldStop: () => stop.current });\n finish(result, skipped, previous);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The import could not finish.\");\n } finally {\n setRunning(null);\n }\n };\n\n const importEnv = async () => {\n if (draft?.kind !== \"env\") return;\n const text = draft.entries.filter((e) => selected.has(e.key + e.text)).map((e) => e.text).join(\"\\n\");\n setError(null);\n setRunning({ done: 0, total: chosen });\n try {\n const made = await confirmed(() => port.io.importEnv(text, organizationId, injectSandbox));\n setDone({ created: made, failed: [], skipped: draft.entries.length - chosen, withOtp: 0, untried: [] });\n if (made.length > 0) onChanged();\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : \"The import could not finish.\");\n } finally {\n setRunning(null);\n }\n };\n\n const start = () => {\n if (draft?.kind === \"env\") return void importEnv();\n if (needsApproval) return setError(\"Approve the visible details first.\");\n const todo = lines.filter((l) => selected.has(l.key) && selectable(l));\n return void importFiles(todo, lines.length - todo.length);\n };\n\n const retry = () => {\n if (!done) return;\n const failedKeys = new Set(done.failed.map((f) => f.key));\n const todo = [...lines.filter((l) => failedKeys.has(l.key)), ...done.untried];\n void importFiles(todo, done.skipped, { ...done, failed: [] });\n };\n\n const help = EXPORT_HELP[source];\n const stage = done ? \"done\" : draft ? \"review\" : \"choose\";\n const busy = running !== null || reading;\n\n const footer =\n stage === \"choose\" ? (\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n {source === \"env\" ? (\n <Button variant=\"primary\" icon={<ImportGlyph className=\"size-4\" />} disabled={!envText.trim()} onClick={() => reviewEnv(envText)}>\n Review\n </Button>\n ) : null}\n </>\n ) : stage === \"review\" ? (\n <>\n {running ? (\n <Button variant=\"outline\" onClick={() => (stop.current = true)}>\n Stop\n </Button>\n ) : (\n <Button variant=\"quiet\" onClick={reset}>\n Back\n </Button>\n )}\n <Button variant=\"primary\" icon={<ImportGlyph className=\"size-4\" />} disabled={busy || chosen === 0 || ambiguous === true || needsApproval} onClick={start}>\n {running ? `Importing ${running.done} of ${running.total}` : `Import ${chosen}`}\n </Button>\n </>\n ) : (\n <>\n {done && done.failed.length + done.untried.length > 0 ? (\n <Button variant=\"outline\" disabled={busy} onClick={retry}>\n {running ? `Importing ${running.done} of ${running.total}` : `Try ${done.failed.length + done.untried.length} again`}\n </Button>\n ) : null}\n <Button variant=\"primary\" onClick={onClose}>\n Done\n </Button>\n </>\n );\n\n return (\n <Panel title=\"Import\" size=\"xl\" onClose={onClose} footer={footer}>\n {stage === \"choose\" ? (\n <Section>\n <Row label=\"Source\" actions={help && host.openUrl ? <Button variant=\"quiet\" onClick={() => host.openUrl?.(help)}>How to export</Button> : undefined}>\n <Select value={source} options={SOURCE_OPTIONS} aria-label=\"Source\" onValueChange={(s) => { setSource(s); setError(null); }} />\n </Row>\n {source === \"env\" ? (\n <Row label=\".env text\" hint=\"Same key updates in place\" top>\n <Textarea mono rows={7} value={envText} autoComplete=\"off\" spellCheck={false} aria-label=\".env text\" placeholder={\"OPENAI_API_KEY=sk-...\\nDATABASE_URL=postgres://...\"} onChange={(e) => setEnvText(e.target.value)} />\n </Row>\n ) : null}\n <Row label=\"File\" hint={fileName ?? undefined}>\n <Button variant=\"outline\" disabled={reading} onClick={() => fileInput.current?.click()}>\n {reading ? \"Reading…\" : source === \"env\" ? \"Load a file\" : \"Choose a file\"}\n </Button>\n <input\n ref={fileInput}\n type=\"file\"\n hidden\n accept={acceptFor(source)}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) void chooseFile(file);\n e.target.value = \"\";\n }}\n />\n </Row>\n {source === \"env\" ? (\n <Row label=\"Sandboxes\" hint=\"Pass these values to agent sandboxes\">\n <Switch checked={injectSandbox} onCheckedChange={setInjectSandbox} aria-label=\"Use in sandboxes\" />\n </Row>\n ) : null}\n </Section>\n ) : null}\n\n {stage === \"review\" && draft ? (\n <>\n {organizations.length > 0 ? (\n <Section>\n <Row label=\"Save to\">\n <Select value={destination} options={destinationOptions} aria-label=\"Save to\" onValueChange={(v) => (draft.kind === \"file\" ? restart({ destination: v }) : setDestination(v))} />\n </Row>\n </Section>\n ) : null}\n <Section\n title={draft.kind === \"env\" ? plural(envKeys.length, \"value\") : summary(counts, lines.length)}\n actions={\n <>\n <Button variant=\"quiet\" disabled={busy} onClick={() => setSelected(draft.kind === \"env\" ? new Set(envKeys.map((e) => e.key + e.text)) : defaultSelection(lines))}>\n Reset\n </Button>\n <Button variant=\"quiet\" disabled={busy} onClick={() => setSelected(new Set())}>\n None\n </Button>\n </>\n }\n >\n {draft.kind === \"env\" ? (\n <Windowed\n items={envKeys}\n render={(e) => {\n const id = e.key + e.text;\n return <PickLine key={id} title={e.key} detail=\"Value hidden\" checked={selected.has(id)} disabled={busy} onChange={(on) => toggle(setSelected, id, on)} />;\n }}\n />\n ) : lines.length === 0 ? (\n <Empty>Nothing to import in this file.</Empty>\n ) : (\n <Windowed\n items={lines}\n render={(l) => {\n const badge = STATE_BADGE[l.state];\n return <PickLine key={l.key} title={l.title} detail={l.reason ?? l.detail} checked={selected.has(l.key)} disabled={busy || !selectable(l)} badge={badge?.text} tone={badge?.tone} onChange={(on) => toggle(setSelected, l.key, on)} />;\n }}\n />\n )}\n </Section>\n {draft.kind === \"file\" && draft.parsed.kind === \"structured\" ? (\n <Section>\n <Row label=\"Visible details\" hint=\"Approve saving websites and public keys in the clear\">\n <Switch checked={approvedVisible} disabled={busy} onCheckedChange={setApprovedVisible} aria-label=\"Approve visible details\" />\n </Row>\n </Section>\n ) : null}\n {draft.kind === \"file\" ? <Notices draft={draft} /> : null}\n {draft.kind === \"file\" ? (\n <More>\n <Section>\n <Row label=\"Browser fill\" hint=\"Needs username, password and an https address\">\n <Switch checked={browserFill} disabled={busy} onCheckedChange={(on) => restart({ browserFill: on })} aria-label=\"Browser fill\" />\n </Row>\n {draft.parsed.kind === \"csv\"\n ? draft.parsed.preview.headers.map((header, index) => (\n <Row key={`${header}-${index}`} label={header || `Column ${index + 1}`}>\n <Select\n value={draft.mapping[index] ?? \"keep\"}\n options={ROLE_OPTIONS}\n aria-label={`Column ${header || index + 1}`}\n onValueChange={(role) => restart({ mapping: draft.mapping.map((r, i) => (i === index ? role : r)) })}\n />\n </Row>\n ))\n : null}\n </Section>\n </More>\n ) : null}\n {ambiguous ? <ErrorLine message=\"Each of name, username, password, notes and one-time password can be used by one column.\" /> : null}\n </>\n ) : null}\n\n {stage === \"done\" && done ? (\n <Section title=\"Result\">\n <Row label=\"Created\">\n <span className=\"text-foreground\">{done.created.length}</span>\n </Row>\n <Row label=\"Skipped\">\n <span className=\"text-foreground\">{done.skipped}</span>\n </Row>\n <Row label=\"Failed\">\n <span className={done.failed.length > 0 ? \"text-destructive\" : \"text-foreground\"}>{done.failed.length}</span>\n </Row>\n {done.untried.length > 0 ? (\n <Row label=\"Not tried\">\n <span className=\"text-foreground\">{done.untried.length}</span>\n </Row>\n ) : null}\n {done.withOtp > 0 ? (\n <Row label=\"Codes\">\n <span className=\"text-muted-foreground\">{plural(done.withOtp, \"login\")} still need the one-time password added.</span>\n </Row>\n ) : null}\n {done.failed.map((f) => (\n <Row key={f.key} label={f.title}>\n <span className=\"block truncate text-destructive\" title={f.reason}>\n {f.reason}\n </span>\n </Row>\n ))}\n </Section>\n ) : null}\n\n <ErrorLine message={error} />\n </Panel>\n );\n}\n\nfunction toggle(set: React.Dispatch<React.SetStateAction<Set<string>>>, key: string, on: boolean) {\n set((current) => {\n const next = new Set(current);\n if (on) next.add(key);\n else next.delete(key);\n return next;\n });\n}\n\nfunction summary(c: ReturnType<typeof countLines>, total: number): string {\n const parts = [`${c.selected} of ${total} selected`];\n if (c.cannot > 0) parts.push(`${c.cannot} can't be imported`);\n return parts.join(\" · \");\n}\n\nfunction Notices({ draft }: { draft: Extract<Draft, { kind: \"file\" }> }) {\n const notes: string[] = [];\n if (draft.parsed.kind === \"csv\" && draft.parsed.omittedCsvCount > 0) notes.push(`${plural(draft.parsed.omittedCsvCount, \"other CSV file\")} in the archive ${draft.parsed.omittedCsvCount === 1 ? \"is\" : \"are\"} not imported.`);\n if (draft.parsed.kind === \"structured\") {\n for (const n of draft.parsed.notices) {\n if (n.code === \"unsupported_archive_members\") notes.push(`${plural(n.count, \"archive file\")} cannot be imported.`);\n else if (n.code === \"unsupported_binary_definitions\") notes.push(`${plural(n.count, \"unused attachment\")} cannot be imported.`);\n else notes.push(`${plural(n.count, \"deleted item\")} had no saved contents.`);\n }\n }\n if (notes.length === 0) return null;\n return (\n <div className=\"flex flex-col gap-0.5 px-1 text-xs text-muted-foreground\">\n {notes.map((n) => (\n <span key={n}>{n}</span>\n ))}\n </div>\n );\n}\n","/** Local-only CSV normalization for Vault's first password-manager import. */\nimport type { VaultItemCreateRequest } from \"@ai-matrx/api/account\";\nimport { parseDelimited } from \"@ai-matrx/kit/delimited\";\n\nimport { isLoopbackUrl } from \"./loopback\";\n\nexport type CsvImportLimits = {\n maxFileBytes: number;\n maxRecords: number;\n maxColumns: number;\n maxCellBytes: number;\n maxFields: number;\n maxPlaintextFieldBytes: number;\n maxRequestBodyBytes: number;\n maxJsonDepth?: number;\n jsonWorkerTimeoutMs?: number;\n};\nexport type CsvColumnRole =\n \"title\" | \"username\" | \"password\" | \"url\" | \"notes\" | \"otp\" | \"keep\";\nexport type CsvImportRow = {\n rowNumber: number;\n cells: string[];\n issue?: \"invalid\" | \"unsupported\" | undefined;\n};\nexport type CsvImportPreview = {\n headers: string[];\n rows: CsvImportRow[];\n issues: number;\n};\nexport type CsvImportCommand = {\n rowId: string;\n body: VaultItemCreateRequest;\n hasOtp: boolean;\n};\nexport type CsvImportPreparation =\n | { status: \"ready\"; command: CsvImportCommand }\n | {\n status: \"skipped\";\n reason:\n | \"invalid\"\n | \"unsupported\"\n | \"deleted\"\n | \"archived\"\n | \"possible_duplicate\";\n }\n | { status: \"invalid\"; diagnostic: string };\nexport type CsvImportOutcome = {\n imported: number;\n skipped: number;\n failed: number;\n cancelled: boolean;\n definitive: boolean;\n /** The first command that was not confirmed. Reuse it on a same-session retry. */\n progressCursor: number;\n};\n\nexport type CsvImportDispatch = \"committed\" | \"retryable\" | \"definitive\";\n\n/** The request's owner: an organization's vault, or the person's own. */\nexport function principalOf(organizationId: string | null): NonNullable<VaultItemCreateRequest[\"principal\"]> {\n return organizationId ? { type: \"organization\", organization_id: organizationId } : { type: \"user\" };\n}\n\nfunction utf8ByteLength(value: string): number {\n if (typeof TextEncoder !== \"undefined\")\n return new TextEncoder().encode(value).byteLength;\n return unescape(encodeURIComponent(value)).length;\n}\n\nfunction csvParserInput(text: string): string {\n // The parser emits an extra empty record for the final record terminator. Remove\n // exactly that terminator; interior/explicit blank rows retain their numbers.\n return text.replace(/^\\uFEFF/, \"\").replace(/(?:\\r\\n|\\r|\\n)$/, \"\");\n}\n\nexport function parseCsvText(\n text: string,\n limits: CsvImportLimits,\n): CsvImportPreview {\n if (utf8ByteLength(text) > limits.maxFileBytes)\n throw new Error(\"The file exceeds this organization’s import size limit.\");\n const parsed = parseDelimited(csvParserInput(text), {\n delimiter: \",\",\n skipEmptyLines: false,\n });\n if (\n parsed.errors.some(\n (error) =>\n error.code !== \"TooFewFields\" && error.code !== \"TooManyFields\",\n )\n )\n throw new Error(\"The CSV could not be read. Fix the file and try again.\");\n return validateParsedCsv(parsed.data, limits);\n}\n\nfunction validateParsedCsv(\n parsed: string[][],\n limits: CsvImportLimits,\n): CsvImportPreview {\n const [headers, ...data] = parsed;\n if (!headers?.length || headers.length > limits.maxColumns)\n throw new Error(\"The CSV has an unsupported number of columns.\");\n if (data.length > limits.maxRecords)\n throw new Error(\"The CSV has more records than this organization allows.\");\n const nonLoginTypeColumn = headers.findIndex((header) =>\n /^(item )?(type|kind|category)$/i.test(header.trim()),\n );\n const unsupportedValueColumns = headers\n .map((header, index) =>\n /(?:^|[\\s_-])(passkey|webauthn|fido|attachment|file)(?:$|[\\s_-])/i.test(\n header.trim(),\n )\n ? index\n : -1,\n )\n .filter((index) => index >= 0);\n let issues = 0;\n const rows = data.map((cells, index) => {\n const invalid =\n cells.length !== headers.length ||\n cells.some((cell) => utf8ByteLength(cell) > limits.maxCellBytes) ||\n cells.every((cell) => cell.trim().length === 0);\n const type =\n nonLoginTypeColumn >= 0\n ? (cells[nonLoginTypeColumn] ?? \"\").trim().toLowerCase()\n : \"\";\n const unsupported =\n !invalid &&\n (unsupportedValueColumns.some((column) =>\n Boolean(cells[column]?.trim()),\n ) ||\n (Boolean(type) &&\n !/^(login|website|web|password|credential)$/.test(type)));\n if (invalid || unsupported) issues += 1;\n return {\n rowNumber: index + 2,\n cells,\n issue: invalid\n ? (\"invalid\" as const)\n : unsupported\n ? (\"unsupported\" as const)\n : undefined,\n };\n });\n return { headers, rows, issues };\n}\n\nexport function safeDestination(raw: string): {\n metadata: string | null;\n host: string | null;\n} {\n try {\n const parsed = new URL(raw);\n if (!/^https?:$/.test(parsed.protocol))\n return { metadata: null, host: null };\n if (parsed.username || parsed.password)\n return { metadata: null, host: null };\n return { metadata: parsed.origin, host: parsed.host };\n } catch {\n return { metadata: null, host: null };\n }\n}\n\nexport function suggestedCsvMapping(\n headers: string[],\n source?: string,\n): CsvColumnRole[] {\n const aliases: Record<CsvColumnRole, ReadonlySet<string>> = {\n title: new Set([\"name\", \"title\", \"label\"]),\n username: new Set([\n \"username\",\n \"user\",\n \"login\",\n \"email\",\n \"loginusername\",\n \"loginemail\",\n ]),\n password: new Set([\"password\", \"pass\", \"pwd\", \"loginpassword\"]),\n url: new Set([\n \"url\",\n \"uri\",\n \"website\",\n \"websiteaddress\",\n \"loginurl\",\n \"loginuri\",\n ]),\n notes: new Set([\"note\", \"notes\", \"extra\"]),\n otp: new Set([\"otp\", \"totp\", \"otpauth\", \"onetimepassword\", \"onetimecode\"]),\n keep: new Set(),\n };\n let usernameAssigned = false;\n return headers.map((header) => {\n const key = header.trim().toLowerCase().replace(/[ _-]/g, \"\");\n if (source === \"nordpass\" && key === \"email\" && usernameAssigned)\n return \"keep\";\n const role =\n (Object.entries(aliases) as [CsvColumnRole, ReadonlySet<string>][]).find(\n ([, values]) => values.has(key),\n )?.[0] ?? \"keep\";\n if (role === \"username\") usernameAssigned = true;\n return role;\n });\n}\n\nfunction fieldKey(index: number, used: Set<string>): string {\n const base = `import_column_${index + 1}`;\n let key = base;\n let suffix = 2;\n while (used.has(key)) key = `${base}_${suffix++}`;\n used.add(key);\n return key;\n}\n\nfunction roleValue(\n row: CsvImportRow,\n mapping: CsvColumnRole[],\n role: CsvColumnRole,\n): string | null {\n const index = mapping.findIndex((entry) => entry === role);\n return index < 0 ? null : (row.cells[index] ?? \"\");\n}\n\nexport function hasAmbiguousCsvMapping(mapping: CsvColumnRole[]): boolean {\n return ([\"title\", \"username\", \"password\", \"notes\", \"otp\"] as const).some(\n (role) => mapping.filter((entry) => entry === role).length > 1,\n );\n}\n\nexport function isPossibleDuplicateRow(\n row: CsvImportRow,\n _preview: CsvImportPreview,\n mapping: CsvColumnRole[],\n existingItems: { displayName: string; loginUrls: string[] }[],\n): boolean {\n if (row.issue) return false;\n const title =\n roleValue(row, mapping, \"title\") || `Imported credential ${row.rowNumber}`;\n const urls = row.cells\n .filter((_, index) => mapping[index] === \"url\")\n .map(safeDestination)\n .flatMap((destination) =>\n destination.metadata ? [destination.metadata] : [],\n );\n return existingItems.some((item) => {\n if (item.displayName !== title) return false;\n const existingOrigins = item.loginUrls\n .map(safeDestination)\n .flatMap((destination) =>\n destination.metadata ? [destination.metadata] : [],\n );\n return urls.length > 0\n ? existingOrigins.some((origin) => urls.includes(origin))\n : existingOrigins.length === 0;\n });\n}\n\nexport function prepareCsvImportRow(input: {\n source: string;\n preview: CsvImportPreview;\n row: CsvImportRow;\n mapping: CsvColumnRole[];\n /** null = the person's own vault. */\n organizationId: string | null;\n rowId: string;\n limits: CsvImportLimits;\n browserFillEnabled?: boolean;\n existingItems?: { displayName: string; loginUrls: string[] }[];\n skipPossibleDuplicate?: boolean;\n}): CsvImportPreparation {\n if (input.row.issue === \"invalid\")\n return { status: \"skipped\", reason: \"invalid\" };\n if (input.row.issue === \"unsupported\")\n return { status: \"skipped\", reason: \"unsupported\" };\n if (\n input.skipPossibleDuplicate &&\n isPossibleDuplicateRow(\n input.row,\n input.preview,\n input.mapping,\n input.existingItems ?? [],\n )\n )\n return { status: \"skipped\", reason: \"possible_duplicate\" };\n const { headers } = input.preview;\n const { row, mapping } = input;\n const title =\n roleValue(row, mapping, \"title\") || `Imported credential ${row.rowNumber}`;\n const rawUrls = row.cells\n .filter((_, index) => mapping[index] === \"url\")\n .filter(Boolean);\n const urls = rawUrls\n .map(safeDestination)\n .flatMap((url) => (url.metadata ? [url.metadata] : []));\n const fields: NonNullable<VaultItemCreateRequest[\"fields\"]> = [];\n const used = new Set<string>();\n const add = (field_key: string, value: string, editable = true) => {\n if (!value) return;\n used.add(field_key);\n fields.push({\n field_key,\n value,\n handling: \"revealable\",\n editable,\n inject_into_sandbox: false,\n });\n };\n add(\"username\", roleValue(row, mapping, \"username\") ?? \"\");\n add(\"password\", roleValue(row, mapping, \"password\") ?? \"\");\n add(\"import_notes\", roleValue(row, mapping, \"notes\") ?? \"\");\n for (let index = 0; index < row.cells.length; index += 1) {\n if (mapping[index] === \"keep\")\n add(fieldKey(index, used), row.cells[index] ?? \"\");\n }\n // OTP stays only in the encrypted, revealable source representation until explicit enrollment.\n add(\n \"import_source_record\",\n JSON.stringify({\n source_vendor: input.source,\n format: \"csv\",\n cells: row.cells.map((value: string, column_index: number) => ({\n column_index,\n header: headers[column_index] ?? \"\",\n value,\n })),\n }),\n false,\n );\n if (\n fields.length > input.limits.maxFields ||\n fields.some(\n (field) =>\n utf8ByteLength(field.value) > input.limits.maxPlaintextFieldBytes,\n )\n )\n return {\n status: \"invalid\",\n diagnostic: `Row ${row.rowNumber} exceeds this organization’s encrypted field limit.`,\n };\n const command: CsvImportCommand = {\n rowId: input.rowId,\n hasOtp: Boolean(roleValue(row, mapping, \"otp\")),\n body: {\n principal: principalOf(input.organizationId),\n display_name: title,\n definition_key: \"website_login\",\n source: \"system_import\",\n login_urls: urls,\n uri_match_mode: \"never\",\n browser_fill_enabled:\n Boolean(input.browserFillEnabled) &&\n Boolean(roleValue(row, mapping, \"username\")) &&\n Boolean(roleValue(row, mapping, \"password\")) &&\n urls.length > 0 &&\n urls.every(\n (url) => new URL(url).protocol === \"https:\" || isLoopbackUrl(url),\n ),\n fields,\n },\n };\n // The browser matcher treats `never` as an absolute refusal. Keep this pair\n // coherent with the explicit, eligible bulk opt-in rather than advertising a\n // fill capability the canonical matcher will always reject.\n if (command.body.browser_fill_enabled) command.body.uri_match_mode = \"host\";\n if (\n utf8ByteLength(JSON.stringify(command.body)) >\n input.limits.maxRequestBodyBytes\n )\n return {\n status: \"invalid\",\n diagnostic: `Row ${row.rowNumber} exceeds this organization’s request size limit.`,\n };\n return { status: \"ready\", command };\n}\n\n/** Compatibility helper for callers that only need a command after preparation. */\nexport function toCsvImportCommand(\n input: Parameters<typeof prepareCsvImportRow>[0],\n): CsvImportCommand | null {\n const prepared = prepareCsvImportRow(input);\n return prepared.status === \"ready\" ? prepared.command : null;\n}\n\n/** Dispatch only one immutable command at a time; cancellation never rolls back a committed row. */\nexport async function runCsvImportCommands(\n commands: Array<CsvImportCommand | null>,\n dispatch: (command: CsvImportCommand) => Promise<CsvImportDispatch>,\n cancelled: () => boolean,\n progressCursor = 0,\n): Promise<CsvImportOutcome> {\n let imported = 0;\n let skipped = 0;\n let failed = 0;\n for (let index = progressCursor; index < commands.length; index += 1) {\n const command = commands[index];\n if (cancelled())\n return {\n imported,\n skipped,\n failed,\n cancelled: true,\n definitive: false,\n progressCursor: index,\n };\n if (!command) {\n skipped += 1;\n continue;\n }\n const result = await dispatch(command);\n if (result === \"committed\") {\n imported += 1;\n continue;\n }\n failed += 1;\n // A retryable or definitive outcome retains this exact command/UUID for review.\n return {\n imported,\n skipped,\n failed,\n cancelled: result === \"definitive\" || cancelled(),\n definitive: result === \"definitive\",\n progressCursor: index,\n };\n }\n return {\n imported,\n skipped,\n failed,\n cancelled: cancelled(),\n definitive: false,\n progressCursor: commands.length,\n };\n}\n","/** A local development address: the one place a login over plain http is still trusted for browser fill. */\nexport function isLoopbackUrl(value: string | null | undefined): boolean {\n if (!value) return false;\n try {\n const hostname = new URL(value).hostname;\n return hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"[::1]\";\n } catch {\n return false;\n }\n}\n","/** Creating the chosen records one at a time, so a stop or a failure never loses what already landed. */\nimport type { ReviewLine } from \"./import-review\";\nimport type { CreatedItem, IoPort } from \"./port\";\n\nexport interface ImportFailure {\n key: string;\n title: string;\n reason: string;\n}\n\nexport interface ImportRunResult {\n created: CreatedItem[];\n failed: ImportFailure[];\n /** Created items that came with a one-time password the import could not enrol. */\n withOtp: number;\n /** The run ended before every line was tried (stopped, or too many failures in a row). */\n stoppedEarly: boolean;\n /** Lines never tried; a retry continues from here. */\n untried: ReviewLine[];\n}\n\nexport const MAX_FAILURES_IN_A_ROW = 5;\n\nexport interface ImportRunInput {\n io: IoPort;\n organizationId: string | null;\n lines: readonly ReviewLine[];\n /** One key per line, kept across retries: the server answers a repeated key with the first result. */\n keys: Map<string, string>;\n /** Wraps each call so a \"sign in again\" answer becomes a confirmation, not a failure. */\n confirmed: <T>(run: () => Promise<T>) => Promise<T>;\n onProgress?: (done: number, total: number) => void;\n shouldStop?: () => boolean;\n}\n\nconst failureText = (cause: unknown): string => (cause instanceof Error && cause.message ? cause.message : \"The server refused this one.\");\n\nexport async function runImport(input: ImportRunInput): Promise<ImportRunResult> {\n const { io, organizationId, lines, keys, confirmed } = input;\n const result: ImportRunResult = { created: [], failed: [], withOtp: 0, stoppedEarly: false, untried: [] };\n let streak = 0;\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n if (!line?.command) continue;\n if (input.shouldStop?.()) {\n result.stoppedEarly = true;\n result.untried = lines.slice(i);\n break;\n }\n let key = keys.get(line.key);\n if (!key) {\n key = crypto.randomUUID();\n keys.set(line.key, key);\n }\n const command = line.command;\n try {\n const made = await confirmed(() => io.createImported(command.body, organizationId, key));\n result.created.push(made);\n if (command.hasOtp) result.withOtp += 1;\n streak = 0;\n } catch (cause) {\n const reason = failureText(cause);\n result.failed.push({ key: line.key, title: line.title, reason });\n streak += 1;\n // Declining the sign-in check, or a server that keeps failing, ends the run here.\n if (/not confirmed/i.test(reason) || streak >= MAX_FAILURES_IN_A_ROW) {\n result.stoppedEarly = true;\n result.untried = lines.slice(i + 1);\n break;\n }\n }\n input.onProgress?.(i + 1, lines.length);\n }\n return result;\n}\n","import type { VaultItemCreateRequest } from \"@ai-matrx/api/account\";\nimport { principalOf, safeDestination, type CsvImportCommand, type CsvImportLimits, type CsvImportPreparation } from \"./csv-import\";\nimport { isLoopbackUrl } from \"./loopback\";\n\nexport type RejectedStructuredImportRecord = {\n status: \"invalid\" | \"unsupported\";\n ordinal: number;\n title: string;\n reason: string;\n};\ntype StructuredImportBase = {\n status: \"supported\";\n ordinal: number;\n title: string;\n sourceState: \"active\" | \"deleted\" | \"archived\";\n sourceRecord: string;\n hasOtp: boolean;\n notes?: string | undefined;\n};\nexport type StructuredImportRecord = RejectedStructuredImportRecord | (StructuredImportBase & (\n | { kind: \"website_login\"; urls: string[]; username: string | null; password: string | null }\n | { kind: \"custom\" }\n | { kind: \"ssh_key\"; privateKey: string; publicKey: string }\n));\n\nfunction bytes(value: string): number {\n return typeof TextEncoder !== \"undefined\"\n ? new TextEncoder().encode(value).byteLength\n : unescape(encodeURIComponent(value)).length;\n}\n\nexport function hasVisiblePublicKey(record: StructuredImportRecord): boolean {\n return record.status === \"supported\" && record.kind === \"ssh_key\";\n}\n\nexport function isPossibleStructuredImportDuplicate(\n record: StructuredImportRecord,\n existingItems: { displayName: string; loginUrls: string[] }[],\n): boolean {\n if (record.status !== \"supported\") return false;\n const destination = record.kind === \"website_login\" ? record.urls[0] : undefined;\n return existingItems.some((item) => {\n if (item.displayName !== record.title) return false;\n const existingOrigins = item.loginUrls.map(safeDestination).flatMap((url) => url.metadata ? [url.metadata] : []);\n return destination ? existingOrigins.includes(destination) : existingOrigins.length === 0;\n });\n}\n\nexport function prepareStructuredImportCommand(input: {\n record: StructuredImportRecord; organizationId: string | null;\n rowId: string; browserFillEnabled: boolean; includeDeleted: boolean; includeArchived: boolean;\n limits: CsvImportLimits; existingItems?: { displayName: string; loginUrls: string[] }[]; skipPossibleDuplicate?: boolean;\n}): CsvImportPreparation {\n const { record } = input;\n if (record.status === \"invalid\") return { status: \"invalid\", diagnostic: record.reason };\n if (record.status === \"unsupported\") return { status: \"skipped\", reason: \"unsupported\" };\n if (record.status !== \"supported\") return { status: \"invalid\", diagnostic: \"The record is invalid.\" };\n if (typeof record.sourceRecord !== \"string\" || record.sourceRecord.length === 0)\n return { status: \"invalid\", diagnostic: \"The record has no source representation.\" };\n if (record.sourceState === \"deleted\" && !input.includeDeleted) return { status: \"skipped\", reason: \"deleted\" };\n if (record.sourceState === \"archived\" && !input.includeArchived) return { status: \"skipped\", reason: \"archived\" };\n if (input.skipPossibleDuplicate && isPossibleStructuredImportDuplicate(record, input.existingItems ?? [])) return { status: \"skipped\", reason: \"possible_duplicate\" };\n const fields: NonNullable<VaultItemCreateRequest[\"fields\"]> = [{ field_key: \"import_source_record\", value: record.sourceRecord, handling: \"revealable\", editable: false, inject_into_sandbox: false }];\n const add = (field_key: string, value: string, handling: \"revealable\" | \"visible\" = \"revealable\", editable = true) => fields.push({ field_key, value, handling, editable, inject_into_sandbox: false });\n let browserFillEnabled = false; let uriMatchMode: \"host\" | \"never\" = \"never\";\n const destination = record.kind === \"website_login\" ? record.urls[0] : undefined;\n if (record.kind === \"website_login\") {\n if (record.username) add(\"username\", record.username);\n if (record.password) add(\"password\", record.password);\n browserFillEnabled = Boolean(input.browserFillEnabled && record.username && record.password && destination && (new URL(destination).protocol === \"https:\" || isLoopbackUrl(destination)));\n uriMatchMode = browserFillEnabled ? \"host\" : \"never\";\n }\n if (record.notes) add(\"import_notes\", record.notes);\n if (record.kind === \"ssh_key\") { add(\"private_key\", record.privateKey); add(\"public_key\", record.publicKey, \"visible\"); }\n const body: VaultItemCreateRequest = { principal: principalOf(input.organizationId), display_name: record.title, definition_key: record.kind, source: \"system_import\", login_urls: record.kind === \"website_login\" && destination ? [destination] : [], uri_match_mode: uriMatchMode, browser_fill_enabled: browserFillEnabled, fields };\n if (fields.length > input.limits.maxFields || fields.some((field) => bytes(field.value) > input.limits.maxPlaintextFieldBytes) || bytes(JSON.stringify(body)) > input.limits.maxRequestBodyBytes) return { status: \"invalid\", diagnostic: \"The record exceeds this organization’s encrypted field limit.\" };\n const command: CsvImportCommand = { rowId: input.rowId, hasOtp: record.hasOtp, body };\n return { status: \"ready\", command };\n}\n","/** What the person reviews before anything is created: one line per record, and the request each would send. */\nimport {\n isPossibleDuplicateRow,\n prepareCsvImportRow,\n safeDestination,\n type CsvColumnRole,\n type CsvImportCommand,\n type CsvImportLimits,\n} from \"./csv-import\";\nimport { isPossibleStructuredImportDuplicate, prepareStructuredImportCommand, type StructuredImportRecord } from \"./structured-import\";\nimport type { ParsedImport } from \"./parse-source\";\n\n/**\n * - `ready`: will be created. `duplicate`: looks like something already there (off until chosen).\n * - `deleted` / `archived`: in the old manager's trash or archive (off until chosen).\n * - `invalid` / `unsupported`: cannot be imported; `reason` says why.\n */\nexport type ReviewState = \"ready\" | \"duplicate\" | \"deleted\" | \"archived\" | \"invalid\" | \"unsupported\";\n\nexport interface ReviewLine {\n key: string;\n title: string;\n detail: string;\n state: ReviewState;\n reason: string | null;\n /** Present when the record can be created. Its `rowId` is a placeholder: the run assigns the real key. */\n command: CsvImportCommand | null;\n}\n\nexport interface ExistingItem {\n displayName: string;\n loginUrls: string[];\n}\n\nexport interface ReviewOptions {\n organizationId: string | null;\n browserFill: boolean;\n existing: readonly ExistingItem[];\n limits: CsvImportLimits;\n /** CSV only: what each column is. */\n mapping: readonly CsvColumnRole[];\n}\n\nconst KIND_LABEL: Record<string, string> = { website_login: \"Login\", ssh_key: \"SSH key\", custom: \"Secure note\" };\n\n/** Lines that start switched on. */\nexport function defaultSelection(lines: readonly ReviewLine[]): Set<string> {\n return new Set(lines.filter((l) => l.state === \"ready\").map((l) => l.key));\n}\n\nexport function selectable(line: ReviewLine): boolean {\n return line.command !== null;\n}\n\nexport function reviewLines(parsed: ParsedImport, o: ReviewOptions): ReviewLine[] {\n const existing = [...o.existing];\n if (parsed.kind === \"csv\") {\n const { preview, vendor } = parsed;\n const mapping = [...o.mapping];\n return preview.rows.map((row): ReviewLine => {\n const cell = (role: CsvColumnRole) => row.cells[mapping.indexOf(role)] ?? \"\";\n const title = cell(\"title\") || `Imported credential ${row.rowNumber}`;\n const hosts = row.cells\n .filter((_, i) => mapping[i] === \"url\")\n .map((u) => safeDestination(u).host)\n .filter((h): h is string => Boolean(h));\n const has = [cell(\"username\") && \"username\", cell(\"password\") && \"password\", cell(\"otp\") && \"one-time password\"].filter(Boolean).join(\", \");\n const detail = [hosts.join(\", \"), has].filter(Boolean).join(\" · \");\n const key = `row-${row.rowNumber}`;\n if (row.issue === \"invalid\") return { key, title: `Row ${row.rowNumber}`, detail: \"\", state: \"invalid\", reason: \"This row could not be read.\", command: null };\n if (row.issue === \"unsupported\") return { key, title, detail, state: \"unsupported\", reason: \"Not a login (a passkey, file or other type).\", command: null };\n // Duplicates are not skipped here: that is the person's switch, so the command always exists.\n const prepared = prepareCsvImportRow({ source: vendor, preview, row, mapping, organizationId: o.organizationId, rowId: key, limits: o.limits, browserFillEnabled: o.browserFill });\n if (prepared.status === \"invalid\") return { key, title, detail, state: \"invalid\", reason: prepared.diagnostic, command: null };\n if (prepared.status === \"skipped\") return { key, title, detail, state: \"unsupported\", reason: \"Skipped.\", command: null };\n const command = prepared.command;\n const duplicate = isPossibleDuplicateRow(row, preview, mapping, existing);\n return { key, title, detail, state: duplicate ? \"duplicate\" : \"ready\", reason: duplicate ? \"Looks like one you already have.\" : null, command };\n });\n }\n return parsed.records.map((record): ReviewLine => structuredLine(record, o, existing));\n}\n\nfunction structuredLine(record: StructuredImportRecord, o: ReviewOptions, existing: ExistingItem[]): ReviewLine {\n const key = `record-${record.ordinal}`;\n if (record.status !== \"supported\") {\n return { key, title: record.title, detail: \"\", state: record.status, reason: record.reason, command: null };\n }\n const destination = record.kind === \"website_login\" ? record.urls[0] : undefined;\n let host = \"\";\n try {\n host = destination ? new URL(destination).host : \"\";\n } catch {\n host = \"\";\n }\n const detail = [KIND_LABEL[record.kind] ?? record.kind, host].filter(Boolean).join(\" · \");\n const prepared = prepareStructuredImportCommand({ record, organizationId: o.organizationId, rowId: key, browserFillEnabled: o.browserFill, includeDeleted: true, includeArchived: true, limits: o.limits });\n if (prepared.status === \"invalid\") return { key, title: record.title, detail, state: \"invalid\", reason: prepared.diagnostic, command: null };\n if (prepared.status === \"skipped\") return { key, title: record.title, detail, state: \"unsupported\", reason: \"Skipped.\", command: null };\n const command = prepared.command;\n if (record.sourceState === \"deleted\") return { key, title: record.title, detail, state: \"deleted\", reason: \"Was in the old manager's trash.\", command };\n if (record.sourceState === \"archived\") return { key, title: record.title, detail, state: \"archived\", reason: \"Was archived in the old manager.\", command };\n if (isPossibleStructuredImportDuplicate(record, existing)) return { key, title: record.title, detail, state: \"duplicate\", reason: \"Looks like one you already have.\", command };\n return { key, title: record.title, detail, state: \"ready\", reason: null, command };\n}\n\nexport interface ReviewCounts {\n ready: number;\n selected: number;\n held: number;\n cannot: number;\n}\n\nexport function countLines(lines: readonly ReviewLine[], selected: ReadonlySet<string>): ReviewCounts {\n let ready = 0;\n let held = 0;\n let cannot = 0;\n for (const l of lines) {\n if (!selectable(l)) cannot += 1;\n else if (l.state === \"ready\") ready += 1;\n else held += 1;\n }\n return { ready, selected: lines.filter((l) => selected.has(l.key) && selectable(l)).length, held, cannot };\n}\n","/** Where an import comes from: the choices, how a file is recognised, and `.env` text. */\nimport type { SelectOption } from \"@ai-matrx/design-system/controls\";\n// Static, never `await import()`: the archive readers (bounded-zip) import zip.js statically into\n// the same bundle, and a module reached both ways makes Turbopack's scope hoisting fail the host\n// build (\"ModuleId not found for ident … @zip.js/zip.js/lib/core/util/default-mime-type.js\").\nimport { BlobReader, ZipReader } from \"@zip.js/zip.js\";\n\nexport type CsvVendor =\n | \"generic\"\n | \"chrome\"\n | \"bitwarden\"\n | \"1password\"\n | \"lastpass\"\n | \"apple\"\n | \"edge\"\n | \"firefox\"\n | \"dashlane\"\n | \"nordpass\"\n | \"keeper\"\n | \"proton\"\n | \"roboform\"\n | \"keepass\";\nexport type StructuredSource = \"bitwarden_json\" | \"1password_1pux\" | \"proton_pass\" | \"keepass_xml\";\n/** `auto` means \"look at the file I choose\". */\nexport type ImportSource = \"auto\" | \"env\" | StructuredSource | CsvVendor;\n\nconst CSV_VENDORS: readonly CsvVendor[] = [\"generic\", \"chrome\", \"bitwarden\", \"1password\", \"lastpass\", \"apple\", \"edge\", \"firefox\", \"dashlane\", \"nordpass\", \"keeper\", \"proton\", \"roboform\", \"keepass\"];\nconst STRUCTURED: readonly StructuredSource[] = [\"bitwarden_json\", \"1password_1pux\", \"proton_pass\", \"keepass_xml\"];\n\nexport const isStructuredSource = (s: ImportSource): s is StructuredSource => (STRUCTURED as readonly string[]).includes(s);\nexport const isCsvVendor = (s: ImportSource): s is CsvVendor => (CSV_VENDORS as readonly string[]).includes(s);\n\nexport const SOURCE_OPTIONS: readonly SelectOption<ImportSource>[] = [\n { value: \"auto\", label: \"Detect from the file\" },\n { value: \"env\", label: \".env text\" },\n { value: \"bitwarden_json\", label: \"Bitwarden (JSON)\" },\n { value: \"1password_1pux\", label: \"1Password (1PUX)\" },\n { value: \"proton_pass\", label: \"Proton Pass (JSON or ZIP)\" },\n { value: \"keepass_xml\", label: \"KeePass (XML)\" },\n { value: \"chrome\", label: \"Chrome / Google (CSV)\" },\n { value: \"apple\", label: \"Apple Passwords (CSV)\" },\n { value: \"edge\", label: \"Edge (CSV)\" },\n { value: \"firefox\", label: \"Firefox (CSV)\" },\n { value: \"lastpass\", label: \"LastPass (CSV)\" },\n { value: \"bitwarden\", label: \"Bitwarden (CSV)\" },\n { value: \"1password\", label: \"1Password (CSV)\" },\n { value: \"dashlane\", label: \"Dashlane (CSV or ZIP)\" },\n { value: \"nordpass\", label: \"NordPass (CSV)\" },\n { value: \"keeper\", label: \"Keeper (CSV)\" },\n { value: \"roboform\", label: \"RoboForm (CSV)\" },\n { value: \"proton\", label: \"Proton Pass (CSV)\" },\n { value: \"keepass\", label: \"KeePass (CSV)\" },\n { value: \"generic\", label: \"Other (CSV)\" },\n];\n\n/** What the file picker offers for a source. */\nexport function acceptFor(source: ImportSource): string {\n switch (source) {\n case \"env\":\n return \".env,.txt,text/plain\";\n case \"bitwarden_json\":\n return \".json,application/json\";\n case \"1password_1pux\":\n return \".1pux,application/zip\";\n case \"proton_pass\":\n return \".json,.zip,application/json,application/zip\";\n case \"keepass_xml\":\n return \".xml,application/xml,text/xml\";\n case \"dashlane\":\n return \".csv,text/csv,.zip,application/zip\";\n case \"auto\":\n return \".csv,.json,.zip,.1pux,.xml,.env,.txt\";\n default:\n return \".csv,text/csv\";\n }\n}\n\n/** Each manager's own page on exporting from it. */\nexport const EXPORT_HELP: Partial<Record<ImportSource, string>> = {\n chrome: \"https://support.google.com/chrome/answer/13068232\",\n bitwarden: \"https://bitwarden.com/help/export-your-data/\",\n bitwarden_json: \"https://bitwarden.com/help/export-your-data/\",\n \"1password\": \"https://support.1password.com/export/\",\n \"1password_1pux\": \"https://support.1password.com/export/\",\n proton_pass: \"https://proton.me/support/pass-export\",\n proton: \"https://proton.me/support/pass-export\",\n keepass_xml: \"https://keepass.info/help/base/importexport.html\",\n keepass: \"https://keepassxc.org/docs/KeePassXC_UserGuide\",\n lastpass: \"https://support.lastpass.com/s/document-item?language=en_US&bundleId=lastpass&topicId=LastPass/export-your-vault-data.html\",\n apple: \"https://support.apple.com/en-au/guide/passwords/mchl35b12625/mac\",\n edge: \"https://support.microsoft.com/en-us/edge/export-passwords-in-microsoft-edge\",\n firefox: \"https://support.mozilla.org/en-US/kb/export-login-data-firefox\",\n dashlane: \"https://support.dashlane.com/hc/en-us/articles/32905278138002-Export-your-Dashlane-data-to-a-CSV\",\n nordpass: \"https://support.nordpass.com/hc/en-us/articles/360007646477-How-to-export-passwords-from-NordPass\",\n keeper: \"https://docs.keeper.io/user-guides/web-vault\",\n roboform: \"https://help.roboform.com/hc/en-us/articles/230425008-How-to-export-your-RoboForm-logins-into-a-CSV-file\",\n};\n\n/** The first bytes of a JSON export are enough to tell Bitwarden from Proton Pass. */\nexport function sniffJson(head: string): StructuredSource {\n return /\"vaults\"\\s*:/.test(head) ? \"proton_pass\" : \"bitwarden_json\";\n}\n\n/** A ZIP is Dashlane's when it carries top-level CSV files; otherwise it is Proton Pass's. */\nexport function sniffZip(names: readonly string[]): \"dashlane\" | \"proton_pass\" {\n return names.some((n) => !n.includes(\"/\") && n.toLowerCase().endsWith(\".csv\")) ? \"dashlane\" : \"proton_pass\";\n}\n\nasync function zipNames(file: Blob): Promise<string[]> {\n const reader = new ZipReader(new BlobReader(file));\n try {\n return (await reader.getEntries()).map((e) => e.filename);\n } finally {\n await reader.close();\n }\n}\n\n/** Which source a chosen file is. Unrecognised files are read as CSV. */\nexport async function detectSource(file: File): Promise<Exclude<ImportSource, \"auto\">> {\n const name = file.name.toLowerCase();\n if (name.endsWith(\".1pux\")) return \"1password_1pux\";\n if (name.endsWith(\".xml\")) return \"keepass_xml\";\n if (name.endsWith(\".json\")) return sniffJson(await file.slice(0, 4096).text());\n if (name.endsWith(\".zip\")) return sniffZip(await zipNames(file));\n if (name.endsWith(\".env\") || name === \".env\") return \"env\";\n return \"generic\";\n}\n\n// ── .env text ────────────────────────────────────────────────────────────────\n\nexport interface EnvEntry {\n key: string;\n /** The text of the entry as written (one line, or the lines of a quoted value). */\n text: string;\n}\n\n/**\n * The `KEY=value` entries in some text, so a person can choose which to save. A value that opens a\n * quote and closes it on a later line is one entry. Comments and anything that is not an assignment\n * are ignored; the server parses the text it is sent with its own (authoritative) rules.\n */\nexport function parseEnvEntries(text: string): EnvEntry[] {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const entries: EnvEntry[] = [];\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] ?? \"\";\n const m = /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_.-]*)\\s*=(.*)$/.exec(line);\n if (!m) continue;\n const key = m[1] ?? \"\";\n const rest = (m[2] ?? \"\").trimStart();\n const quote = rest[0] === '\"' || rest[0] === \"'\" ? rest[0] : null;\n let entry = line;\n if (quote && !closesQuote(rest.slice(1), quote)) {\n let j = i + 1;\n while (j < lines.length) {\n entry += `\\n${lines[j] ?? \"\"}`;\n if (closesQuote(lines[j] ?? \"\", quote)) break;\n j += 1;\n }\n if (j < lines.length) i = j;\n }\n entries.push({ key, text: entry });\n }\n return entries;\n}\n\nfunction closesQuote(rest: string, quote: string): boolean {\n for (let i = 0; i < rest.length; i += 1) {\n if (rest[i] === \"\\\\\" && quote === '\"') i += 1;\n else if (rest[i] === quote) return true;\n }\n return false;\n}\n","import { BlobReader, ZipReader, type Entry } from \"@zip.js/zip.js\";\n\nimport type { CsvImportLimits } from \"./csv-import\";\n\nexport type BoundedZip = {\n entries: readonly Entry[];\n readRange: (entry: Entry) => Promise<void>;\n readText: (entry: Entry) => Promise<string>;\n assertActive: () => void;\n close: () => Promise<void>;\n};\n\nconst safe = (value: number) => Number.isSafeInteger(value) && value >= 0;\nconst unsafeName = (name: string) => /[\\\\\\0-\\x1F\\x7F-\\x9F]/.test(name);\n\nfunction stopIfCancelled(signal?: AbortSignal): void {\n if (signal?.aborted) throw new Error(\"The archive import was cancelled.\");\n}\n\nfunction hasWarnings(reader: ZipReader<Blob>, entry: Entry): boolean {\n return Boolean(reader.warnings?.length || entry.warnings?.length);\n}\n\nfunction boundedText(limit: number, used: { value: number }) {\n let size = 0;\n const parts: Uint8Array[] = [];\n return {\n writable: new WritableStream<Uint8Array>({\n write(chunk) {\n if (used.value > limit - chunk.byteLength)\n throw new Error(\"The archive exceeds the organization size limit.\");\n used.value += chunk.byteLength;\n size += chunk.byteLength;\n parts.push(chunk);\n },\n }),\n text: () => {\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const part of parts) {\n bytes.set(part, offset);\n offset += part.byteLength;\n }\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n },\n };\n}\n\n/** zip.js provides directory getData at runtime while omitting it from its Entry type. */\nasync function directoryRange(\n entry: Entry,\n signal?: AbortSignal,\n): Promise<void> {\n if (!(\"getData\" in entry) || typeof entry.getData !== \"function\")\n throw new Error(\"The archive is unsafe.\");\n await entry.getData(new WritableStream<Uint8Array>(), {\n checkOverlappingEntryOnly: true,\n ...(signal ? { signal } : {}),\n });\n}\n\n/**\n * Opens a ZIP under vendor-neutral structural limits. Callers retain ownership of\n * their member grammar and may only read an entry through this object.\n */\nexport async function openBoundedZip(\n file: Blob,\n limits: Pick<CsvImportLimits, \"maxFileBytes\" | \"maxRecords\">,\n signal?: AbortSignal,\n): Promise<BoundedZip> {\n if (file.size > limits.maxFileBytes)\n throw new Error(\"The archive exceeds the organization size limit.\");\n const reader = new ZipReader(new BlobReader(file), {\n strictness: \"strict\",\n filenameValidation: \"strict\",\n checkAmbiguity: true,\n });\n try {\n stopIfCancelled(signal);\n const entries = await reader.getEntries();\n if (reader.warnings?.length || entries.length > limits.maxRecords)\n throw new Error(\"The archive is unsafe.\");\n const names = new Set<string>();\n let declared = 0;\n for (const entry of entries) {\n const unixType = (entry.externalFileAttributes >>> 16) & 0o170000;\n if (\n names.has(entry.filename) ||\n unsafeName(entry.filename) ||\n !safe(entry.compressedSize) ||\n !safe(entry.uncompressedSize) ||\n !safe(entry.offset) ||\n declared > limits.maxFileBytes - entry.uncompressedSize ||\n entry.encrypted ||\n (entry.directory\n ? unixType !== 0 && unixType !== 0o040000\n : unixType !== 0 && unixType !== 0o100000)\n )\n throw new Error(\"The archive is unsafe.\");\n names.add(entry.filename);\n declared += entry.uncompressedSize;\n }\n const used = { value: declared };\n const ownedEntries = new Set(entries);\n const ensureOwnedAndSafe = (entry: Entry) => {\n if (!ownedEntries.has(entry) || hasWarnings(reader, entry))\n throw new Error(\"The archive is unsafe.\");\n };\n const readRange = async (entry: Entry) => {\n ensureOwnedAndSafe(entry);\n stopIfCancelled(signal);\n if (entry.directory) await directoryRange(entry, signal);\n else\n await entry.getData(new WritableStream<Uint8Array>(), {\n checkOverlappingEntryOnly: true,\n ...(signal ? { signal } : {}),\n });\n stopIfCancelled(signal);\n ensureOwnedAndSafe(entry);\n };\n return {\n entries: Object.freeze([...entries]),\n assertActive: () => stopIfCancelled(signal),\n readRange,\n readText: async (entry) => {\n ensureOwnedAndSafe(entry);\n if (entry.directory) throw new Error(\"The archive is unsafe.\");\n await readRange(entry);\n const output = boundedText(limits.maxFileBytes, used);\n try {\n await entry.getData(output.writable, { checkCrc32: true, ...(signal ? { signal } : {}) });\n } catch (error) {\n if (used.value >= limits.maxFileBytes)\n throw new Error(\"The archive exceeds the organization size limit.\");\n throw error;\n }\n stopIfCancelled(signal);\n ensureOwnedAndSafe(entry);\n return output.text();\n },\n close: () => reader.close(),\n };\n } catch (error) {\n await reader.close();\n if (signal?.aborted) throw new Error(\"The archive import was cancelled.\");\n throw error;\n }\n}\n","import type { Entry } from \"@zip.js/zip.js\";\n\nimport type { CsvImportLimits } from \"./csv-import\";\nimport { openBoundedZip } from \"./bounded-zip\";\n\nexport type DashlaneCsvArchive = {\n credentialsText: string;\n omittedCsvCount: number;\n};\n\nfunction invalid(): never {\n throw new Error(\"The Dashlane archive is invalid.\");\n}\n\nfunction isTopLevelCsv(entry: Entry): boolean {\n return (\n !entry.directory &&\n !entry.filename.includes(\"/\") &&\n entry.filename.toLowerCase().endsWith(\".csv\")\n );\n}\n\n/**\n * Reads Dashlane's ZIP container without assuming the undocumented CSV schema.\n * Other Dashlane CSVs are range-validated before they are visibly omitted.\n */\nexport async function readDashlaneCsvArchive(\n file: Blob,\n limits: Pick<CsvImportLimits, \"maxFileBytes\" | \"maxRecords\">,\n signal?: AbortSignal,\n): Promise<DashlaneCsvArchive> {\n let archive: Awaited<ReturnType<typeof openBoundedZip>> | undefined;\n let credentialsText: string | undefined;\n try {\n archive = await openBoundedZip(file, limits, signal);\n let credentials: Entry | undefined;\n let omittedCsvCount = 0;\n\n for (const entry of archive.entries) {\n if (!isTopLevelCsv(entry)) invalid();\n if (entry.filename.toLowerCase() === \"credentials.csv\") {\n if (credentials) invalid();\n credentials = entry;\n } else {\n omittedCsvCount += 1;\n }\n }\n if (!credentials) invalid();\n\n for (const entry of archive.entries) {\n if (entry === credentials) continue;\n await archive.readRange(entry);\n }\n archive.assertActive();\n credentialsText = await archive.readText(credentials);\n archive.assertActive();\n return { credentialsText, omittedCsvCount };\n } catch (error) {\n credentialsText = undefined;\n if (signal?.aborted) throw new Error(\"The Dashlane import was cancelled.\");\n throw error;\n } finally {\n credentialsText = undefined;\n await archive?.close();\n }\n}\n","/**\n * A CSV FILE parses off the main thread. This module STARTS the worker, so the worker must never\n * reach it: `csv-import.worker.ts` imports only `csv-import.ts`, never this file. A worker that\n * reaches the module that starts it makes Turbopack's production compile run forever\n * (`pnpm check:worker-cycles`).\n */\nimport { parseCsvText, type CsvImportLimits, type CsvImportPreview } from \"./csv-import\";\nimport type { CsvWorkerRequest, CsvWorkerResponse } from \"./csv-import.worker\";\n\nexport function parseCsvFile(\n file: File,\n limits: CsvImportLimits,\n): Promise<CsvImportPreview> {\n if (file.size > limits.maxFileBytes)\n return Promise.reject(\n new Error(\"The file exceeds this organization’s import size limit.\"),\n );\n return file.arrayBuffer().then((bytes) => {\n let text: string;\n try {\n text = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n } catch {\n throw new Error(\"The CSV must be valid UTF-8.\");\n }\n // One parser for paste and file (Alchemy's delimited parser). A file can be as large as the\n // organization's limit, so it parses in a worker; with no Worker (tests, SSR) it parses here.\n if (typeof Worker === \"undefined\") return parseCsvText(text, limits);\n return import(\"./csv-import-worker-client\").then(\n ({ createCsvImportWorker }) =>\n new Promise<CsvImportPreview>((resolve, reject) => {\n const worker = createCsvImportWorker();\n const unreadable = () =>\n reject(\n new Error(\n \"The CSV could not be read. Fix the file and try again.\",\n ),\n );\n worker.onmessage = (event: MessageEvent<CsvWorkerResponse>) => {\n worker.terminate();\n if (event.data.ok) resolve(event.data.preview);\n else reject(new Error(event.data.message));\n };\n worker.onerror = () => {\n worker.terminate();\n unreadable();\n };\n worker.postMessage({ text, limits } satisfies CsvWorkerRequest);\n }),\n );\n });\n}\n","export type StructuredImportSource = {\n id: \"bitwarden_json\" | \"1password_1pux\" | \"proton_pass\" | \"keepass_xml\";\n accept: string;\n supportsDeleted: boolean;\n supportsArchived: boolean;\n parseError: string;\n timeoutError: string;\n loadWorker: () => Promise<{\n create: () => Worker;\n cancel: (worker: Worker, requestId: string) => void;\n }>;\n};\n\nconst sources: Record<StructuredImportSource[\"id\"], StructuredImportSource> = {\n bitwarden_json: {\n id: \"bitwarden_json\",\n accept: \".json,application/json\",\n supportsDeleted: true,\n supportsArchived: false,\n parseError: \"The JSON export could not be read.\",\n timeoutError:\n \"The JSON export took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./bitwarden-json-worker-client\");\n return {\n create: client.createBitwardenJsonWorker,\n cancel: client.cancelBitwardenJsonWorker,\n };\n },\n },\n \"1password_1pux\": {\n id: \"1password_1pux\",\n accept: \".1pux,application/zip\",\n supportsDeleted: true,\n supportsArchived: true,\n parseError: \"The 1Password archive could not be read.\",\n timeoutError:\n \"The 1Password archive took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./onepux-worker-client\");\n return {\n create: client.createOnePuxWorker,\n cancel: client.cancelOnePuxWorker,\n };\n },\n },\n proton_pass: {\n id: \"proton_pass\",\n accept: \".json,.zip,application/json,application/zip\",\n supportsDeleted: true,\n supportsArchived: false,\n parseError: \"The Proton Pass export could not be read.\",\n timeoutError:\n \"The Proton Pass export took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./proton-pass-worker-client\");\n return {\n create: client.createProtonPassWorker,\n cancel: client.cancelProtonPassWorker,\n };\n },\n },\n keepass_xml: {\n id: \"keepass_xml\",\n accept: \".xml,application/xml,text/xml\",\n supportsDeleted: true,\n supportsArchived: false,\n parseError: \"The KeePass XML export could not be read.\",\n timeoutError:\n \"The KeePass XML export took too long to parse. Choose a smaller export and try again.\",\n loadWorker: async () => {\n const client = await import(\"./keepass-xml-worker-client\");\n return {\n create: client.createKeePassXmlWorker,\n cancel: client.cancelKeePassXmlWorker,\n };\n },\n },\n};\n\nexport function structuredImportSource(\n source: string,\n): StructuredImportSource | undefined {\n return source === \"bitwarden_json\" ||\n source === \"1password_1pux\" ||\n source === \"proton_pass\" ||\n source === \"keepass_xml\"\n ? sources[source]\n : undefined;\n}\n","import type { CsvImportLimits } from \"./csv-import\";\nimport type { StructuredImportRecord } from \"./structured-import\";\n\n/** Shared worker envelope for bounded structured-password-manager imports. */\nexport type StructuredImportWorkerLimits = Pick<\n CsvImportLimits,\n \"maxFileBytes\" | \"maxRecords\" | \"maxCellBytes\"\n> & {\n maxJsonDepth: number;\n};\n\nexport type StructuredImportWorkerRequest =\n | {\n type: \"parse\";\n requestId: string;\n file: Blob;\n limits: StructuredImportWorkerLimits;\n }\n | { type: \"cancel\"; requestId: string };\n\nexport const STRUCTURED_IMPORT_FILE_NOTICE_CODES = [\n \"unsupported_archive_members\",\n \"unsupported_binary_definitions\",\n \"deleted_tombstones\",\n] as const;\n\nexport type StructuredImportFileNoticeCode =\n (typeof STRUCTURED_IMPORT_FILE_NOTICE_CODES)[number];\n\nexport type StructuredImportFileNotice = {\n code: StructuredImportFileNoticeCode;\n count: number;\n};\n\n/** Reject untrusted worker messages rather than displaying source-controlled text. */\nexport function hasValidStructuredImportFileNotices(\n value: unknown,\n maxCount: number,\n): value is StructuredImportFileNotice[] {\n if (!Number.isSafeInteger(maxCount) || maxCount <= 0 || !Array.isArray(value) || value.length > 3)\n return false;\n const seen = new Set<string>();\n return value.every((notice) => {\n if (\n !notice ||\n typeof notice !== \"object\" ||\n Array.isArray(notice) ||\n !Object.hasOwn(notice, \"code\") ||\n !Object.hasOwn(notice, \"count\") ||\n Object.keys(notice).length !== 2 ||\n !STRUCTURED_IMPORT_FILE_NOTICE_CODES.includes(\n (notice as { code?: unknown }).code as StructuredImportFileNoticeCode,\n ) ||\n !Number.isSafeInteger((notice as { count?: unknown }).count) ||\n (notice as { count: number }).count <= 0 ||\n (notice as { count: number }).count > maxCount\n )\n return false;\n const code = (notice as { code: string }).code;\n if (seen.has(code)) return false;\n seen.add(code);\n return true;\n });\n}\n\nexport type StructuredImportWorkerSuccess = {\n ok: true;\n requestId: string;\n records: StructuredImportRecord[];\n fileNotices: StructuredImportFileNotice[];\n};\n\nexport type StructuredImportWorkerFailure = {\n ok: false;\n requestId: string;\n error: string;\n};\n\nexport type StructuredImportWorkerResponse =\n StructuredImportWorkerSuccess | StructuredImportWorkerFailure;\n","/** Reading a chosen file into records, off the main thread. Nothing here talks to the server. */\nimport { readDashlaneCsvArchive } from \"./dashlane-csv-archive\";\nimport { parseCsvFile } from \"./csv-import-file\";\nimport type { CsvImportLimits, CsvImportPreview } from \"./csv-import\";\nimport type { ImportLimits } from \"./csv-import-limits\";\nimport { isStructuredSource, type CsvVendor, type ImportSource, type StructuredSource } from \"./import-source\";\nimport { structuredImportSource } from \"./structured-import-source-registry\";\nimport type { StructuredImportRecord } from \"./structured-import\";\nimport { hasValidStructuredImportFileNotices, type StructuredImportFileNotice, type StructuredImportWorkerResponse } from \"./structured-import-worker-protocol\";\n\nexport type ParsedImport =\n | { kind: \"csv\"; vendor: CsvVendor; preview: CsvImportPreview; omittedCsvCount: number }\n | { kind: \"structured\"; source: StructuredSource; records: StructuredImportRecord[]; notices: StructuredImportFileNotice[] };\n\nconst cancelled = () => new Error(\"The import was cancelled.\");\n\nfunction parseStructured(source: StructuredSource, file: File, limits: ImportLimits, signal: AbortSignal): Promise<{ records: StructuredImportRecord[]; notices: StructuredImportFileNotice[] }> {\n const descriptor = structuredImportSource(source);\n if (!descriptor) return Promise.reject(new Error(\"This kind of file cannot be imported.\"));\n if (file.size > limits.maxFileBytes) return Promise.reject(new Error(\"The file is larger than an import may be.\"));\n if (typeof Worker === \"undefined\") return Promise.reject(new Error(\"Importing this kind of file needs a browser that runs background workers.\"));\n return descriptor.loadWorker().then(\n (client) =>\n new Promise((resolve, reject) => {\n if (signal.aborted) return reject(cancelled());\n const worker = client.create();\n const requestId = crypto.randomUUID();\n let settled = false;\n const finish = (run: () => void) => {\n if (settled) return;\n settled = true;\n window.clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n worker.terminate();\n run();\n };\n const onAbort = () => {\n client.cancel(worker, requestId);\n finish(() => reject(cancelled()));\n };\n const timer = window.setTimeout(() => finish(() => reject(new Error(descriptor.timeoutError))), limits.jsonWorkerTimeoutMs);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n worker.onerror = () => finish(() => reject(new Error(descriptor.parseError)));\n worker.onmessageerror = () => finish(() => reject(new Error(descriptor.parseError)));\n worker.onmessage = (event: MessageEvent<StructuredImportWorkerResponse>) => {\n if (event.data.requestId !== requestId) return;\n const data = event.data;\n if (!data.ok || !hasValidStructuredImportFileNotices(data.fileNotices, limits.maxRecords)) return finish(() => reject(new Error(descriptor.parseError)));\n finish(() => resolve({ records: data.records, notices: data.fileNotices }));\n };\n worker.postMessage({ type: \"parse\", requestId, file, limits: { maxFileBytes: limits.maxFileBytes, maxRecords: limits.maxRecords, maxCellBytes: limits.maxCellBytes, maxJsonDepth: limits.maxJsonDepth } });\n }),\n );\n}\n\n/** Read `file` as `source` (already resolved: never \"auto\" or \"env\"). */\nexport async function parseImportFile(source: Exclude<ImportSource, \"auto\" | \"env\">, file: File, limits: ImportLimits, signal: AbortSignal): Promise<ParsedImport> {\n if (isStructuredSource(source)) {\n const { records, notices } = await parseStructured(source, file, limits, signal);\n return { kind: \"structured\", source, records, notices };\n }\n const csvLimits: CsvImportLimits = limits;\n if (source === \"dashlane\" && file.name.toLowerCase().endsWith(\".zip\")) {\n const archive = await readDashlaneCsvArchive(file, csvLimits, signal);\n const preview = await parseCsvFile(new File([archive.credentialsText], \"credentials.csv\", { type: \"text/csv\" }), csvLimits);\n return { kind: \"csv\", vendor: \"dashlane\", preview, omittedCsvCount: archive.omittedCsvCount };\n }\n return { kind: \"csv\", vendor: source, preview: await parseCsvFile(file, csvLimits), omittedCsvCount: 0 };\n}\n","import { useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Button, SearchField } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"./auth/IdentityGate\";\nimport type { VaultDefinition } from \"./definitions\";\nimport { KeyGlyph, PlusGlyph, SortGlyph, UserGlyph } from \"./glyphs\";\nimport { ItemIcon } from \"./ItemIcon\";\nimport { USERNAME_KEYS } from \"./ItemPane\";\nimport { siteOf, type VaultItem, type VaultSort } from \"./model\";\nimport { useCopy, useNotify } from \"./notice\";\nimport type { VaultPort } from \"./port\";\n\nexport interface ItemListProps {\n title: string;\n items: readonly VaultItem[];\n definitions: readonly VaultDefinition[];\n port: VaultPort;\n selectedId: string | null;\n onSelect: (id: string) => void;\n query: string;\n onQuery: (q: string) => void;\n sort: VaultSort;\n onSort: (s: VaultSort) => void;\n onNew: () => void;\n /** Items that match the page the host is showing (the extension), pinned first. */\n matchingIds?: ReadonlySet<string>;\n /** Slot above the search: the vault and category pickers where there is no sidebar. */\n header?: ReactNode;\n}\n\nconst SORTS: readonly { value: VaultSort; label: string }[] = [\n { value: \"name\", label: \"Name\" },\n { value: \"website\", label: \"Website\" },\n { value: \"updated\", label: \"Recently changed\" },\n { value: \"created\", label: \"Recently added\" },\n];\n\n/** The line under a name: its website, else its type — and whose it is when the list mixes owners. */\nfunction subtitleOf(item: VaultItem, withOwner: boolean): string {\n const what = siteOf(item) || item.definitionLabel;\n return withOwner ? `${what} · ${item.owner.label}` : what;\n}\n\nexport function ItemList({ title, items, definitions, port, selectedId, onSelect, query, onQuery, sort, onSort, onNew, matchingIds, header }: ItemListProps) {\n const pinned = matchingIds ? items.filter((i) => matchingIds.has(i.id)) : [];\n const rest = matchingIds ? items.filter((i) => !matchingIds.has(i.id)) : items;\n const ordered = [...pinned, ...rest];\n const listRef = useRef<HTMLUListElement>(null);\n // The open item is always in sight: after a save, a reload, or opening it from the address.\n useEffect(() => {\n if (selectedId) listRef.current?.querySelector<HTMLElement>(`[data-item=\"${selectedId}\"]`)?.scrollIntoView({ block: \"nearest\" });\n }, [selectedId, items.length]);\n const familyOf = (key: string) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n\n // Arrow keys walk the list the way they do in every desktop password manager.\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"ArrowDown\" && e.key !== \"ArrowUp\") return;\n e.preventDefault();\n const at = ordered.findIndex((i) => i.id === selectedId);\n const next = ordered[Math.max(0, Math.min(ordered.length - 1, at + (e.key === \"ArrowDown\" ? 1 : -1)))];\n if (next) {\n onSelect(next.id);\n listRef.current?.querySelector<HTMLElement>(`[data-item=\"${next.id}\"]`)?.scrollIntoView({ block: \"nearest\" });\n }\n };\n\n // Whose an item is shows on its row whenever the list holds more than one owner (All items, search).\n const mixedOwners = new Set(items.map((i) => i.owner.organizationId ?? i.owner.kind)).size > 1;\n const row = (i: VaultItem) => <ListRow key={i.id} item={i} family={familyOf(i.definitionKey)} port={port} on={i.id === selectedId} onSelect={onSelect} withOwner={mixedOwners} />;\n const sortLabel = SORTS.find((s) => s.value === sort)?.label ?? \"Name\";\n\n return (\n <section aria-label={title} className=\"flex h-full min-h-0 flex-col border-r border-border bg-background\">\n <div className=\"flex flex-col gap-2 px-3 pb-2 pt-3\">\n {header}\n <div className=\"flex items-center gap-2\">\n <SearchField value={query} onChange={(e) => onQuery(e.target.value)} onKeyDown={onKeyDown} placeholder={`Search ${title}`} className=\"min-w-0 flex-1\" aria-label=\"Search the vault\" />\n <Button variant=\"primary\" icon={<PlusGlyph />} aria-label=\"New item\" onClick={onNew} />\n </div>\n <div className=\"flex items-center justify-between gap-2 px-1\">\n <span className=\"truncate text-xs text-muted-foreground\">\n {items.length} {items.length === 1 ? \"item\" : \"items\"}\n </span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<SortGlyph />} aria-label={`Sort: ${sortLabel}`}>\n {sortLabel}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuRadioGroup value={sort} onValueChange={(v) => onSort(SORTS.find((s) => s.value === v)?.value ?? \"name\")}>\n {SORTS.map((s) => (\n <DropdownMenuRadioItem key={s.value} value={s.value}>\n {s.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto px-2 pb-3\" onKeyDown={onKeyDown}>\n {items.length === 0 ? (\n <div className=\"flex flex-col items-center gap-3 px-4 py-12 text-center\">\n <span className=\"text-sm text-muted-foreground\">{query ? `Nothing matches “${query}”.` : \"Nothing here yet.\"}</span>\n {query ? <Button variant=\"outline\" onClick={() => onQuery(\"\")}>Clear search</Button> : <Button variant=\"outline\" icon={<PlusGlyph />} onClick={onNew}>New item</Button>}\n </div>\n ) : (\n <ul ref={listRef} className=\"flex flex-col gap-px\">\n {pinned.length > 0 ? <li className=\"px-2 pb-1 pt-1 text-xs font-medium text-muted-foreground\">This page</li> : null}\n {pinned.map(row)}\n {pinned.length > 0 && rest.length > 0 ? <li className=\"px-2 pb-1 pt-3 text-xs font-medium text-muted-foreground\">Everything else</li> : null}\n {rest.map(row)}\n </ul>\n )}\n </div>\n </section>\n );\n}\n\n/** One item: a small two-line row. On hover, copy the username or the password without opening it. */\nfunction ListRow({ item, family, port, on, onSelect, withOwner }: { item: VaultItem; family: string; port: VaultPort; on: boolean; onSelect: (id: string) => void; withOwner: boolean }) {\n const confirmed = useConfirmed();\n const copy = useCopy();\n const notify = useNotify();\n const [busy, setBusy] = useState(false);\n const user = item.fields.find((f) => USERNAME_KEYS.test(f.key) && f.handling !== \"sealed\");\n const secret = item.fields.find((f) => f.key === \"password\" && f.handling === \"revealable\");\n const quick = async (key: string, label: string) => {\n setBusy(true);\n try {\n const v = await confirmed(() => port.reveal(item, key));\n await copy(v, label);\n } catch (e) {\n if (!wasCancelled(e)) notify(e instanceof Error ? e.message : `${label} could not be read`, \"error\");\n } finally {\n setBusy(false);\n }\n };\n return (\n <li className=\"group relative\" data-item={item.id}>\n <button\n type=\"button\"\n aria-current={on ? \"true\" : undefined}\n data-surface={on ? \"primary\" : undefined}\n onClick={() => onSelect(item.id)}\n className={cn(\"flex h-12 w-full items-center gap-3 rounded-lg px-2 text-left\", on ? \"bg-primary text-primary-foreground\" : \"hover:bg-accent\")}\n >\n <ItemIcon definitionKey={item.definitionKey} family={family} site={siteOf(item)} inverted={on} />\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">{item.name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{subtitleOf(item, withOwner)}</span>\n </span>\n </button>\n {item.capabilities.canUse && (user || (secret && item.capabilities.canReveal)) ? (\n <div className={cn(\"absolute right-1.5 top-1/2 hidden -translate-y-1/2 items-center gap-0.5 rounded-md pl-2 group-hover:flex\", on ? \"bg-primary\" : \"bg-accent\")} data-surface={on ? \"primary\" : undefined}>\n {user ? <Button variant=\"quiet\" icon={<UserGlyph />} aria-label={`Copy ${user.label}`} disabled={busy} onClick={() => void quick(user.key, user.label)} /> : null}\n {secret && item.capabilities.canReveal ? <Button variant=\"quiet\" icon={<KeyGlyph />} aria-label=\"Copy password\" disabled={busy} onClick={() => void quick(secret.key, \"Password\")} /> : null}\n </div>\n ) : null}\n </li>\n );\n}\n","import { cn } from \"@ai-matrx/design-system\";\nimport { definitionGlyph } from \"./glyphs\";\n\n/**\n * An item's face. A login with a website shows the site's initial (people find \"G\" for GitHub faster\n * than a globe); everything else shows its type. No third-party icon service is ever asked: which\n * sites are in a vault is itself private.\n */\nexport function ItemIcon({ definitionKey, family, site, size = \"md\", inverted = false }: { definitionKey: string; family: string; site: string; size?: \"sm\" | \"md\" | \"lg\"; inverted?: boolean }) {\n const box = size === \"lg\" ? \"size-10 rounded-xl text-base\" : size === \"md\" ? \"size-8 rounded-lg text-sm\" : \"size-6 rounded-md text-xs\";\n const tone = inverted ? \"bg-primary-foreground text-primary\" : \"bg-muted text-foreground\";\n const initial = site.replace(/^(app|my|login|accounts|signin|auth|console|portal|admin|www)\\./, \"\").charAt(0).toUpperCase();\n if (initial && /[A-Z0-9]/.test(initial)) {\n return (\n <span aria-hidden className={cn(\"flex shrink-0 items-center justify-center font-semibold\", box, tone)}>\n {initial}\n </span>\n );\n }\n const Glyph = definitionGlyph(definitionKey, family);\n return (\n <span aria-hidden className={cn(\"flex shrink-0 items-center justify-center\", box, tone)}>\n <Glyph className={size === \"lg\" ? \"size-5\" : \"size-4\"} />\n </span>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Badge, Button, CONTROLS_CONTAINER_CLASS, OptionCombobox, Switch } from \"@ai-matrx/design-system/controls\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { FilesSection } from \"./activity/FilesSection\";\nimport { useConfirmed, wasCancelled } from \"./auth/IdentityGate\";\nimport { MFA_METHOD_KEY } from \"./authenticator/port\";\nimport { TotpEditRow, TotpRow, TwoFactorMethodRow } from \"./authenticator/TotpRows\";\nimport type { VaultDefinition } from \"./definitions\";\nimport { AddRow, CustomEditRow, EditRow, PlainRow, SecretRow } from \"./FieldRows\";\nimport { RecoveryCodesRow } from \"./fields/RecoveryCodesRow\";\nimport { checkDestination, isRecoveryCodesField, type DestinationCheck } from \"./fields/rules\";\nimport { GenerateButton } from \"./generator/PasswordGenerator\";\nimport { BuildingGlyph, ChevronLeftGlyph, EyeGlyph, PersonGlyph, UsersGlyph, HistoryGlyph, ListGlyph, MoreGlyph, MoveGlyph, PencilGlyph, SendGlyph, PlusGlyph, SettingsGlyph, ShareGlyph, StarGlyph, TrashGlyph } from \"./glyphs\";\nimport { ItemIcon } from \"./ItemIcon\";\nimport { draftKey, dropKeptDraft, keepDraft, readKeptDraft } from \"./draft-keep\";\nimport { FILL_WORDS } from \"./extension/page-logic\";\nimport { canUseOnSite, UseOnSiteButton } from \"./extension/UseOnSiteButton\";\nimport { changedValues, draftOf, isAuthenticatorStorage, isDirty, rebaseDraft, siteOf, type ItemDraft, type VaultItem, type VaultOrganizationRef } from \"./model\";\nimport type { VaultHostCapabilities, VaultPort } from \"./port\";\nimport { useNotify } from \"./notice\";\nimport { SharingSummary } from \"./sharing/SharePanel\";\nimport { formatDate, Row, Section } from \"./ui\";\n\nexport interface ItemPaneProps {\n port: VaultPort;\n /** The open item; null while creating one. */\n item: VaultItem | null;\n /** The item's type (always set when creating). */\n definition: VaultDefinition | null;\n mode: \"view\" | \"edit\" | \"new\";\n host: VaultHostCapabilities;\n organizations: readonly VaultOrganizationRef[];\n /** Where a new item goes by default: an organization id, or null for the person's own vault. */\n defaultOwner: string | null;\n /** New item: what the pasted address gave us. */\n seed?: { name: string; url: string };\n onBack: (() => void) | null;\n onMode: (mode: \"view\" | \"edit\") => void;\n onSaved: (item: VaultItem, wasNew: boolean, notice: string | null) => void;\n onDeleted: (id: string) => void;\n onDirty: (dirty: boolean) => void;\n onCancelNew: () => void;\n /** Open a panel about this item (`share`, `history`, …). */\n onPanel: (panel: string | null) => void;\n /** The item changed outside a save (a file added, a code removed): the pane shows it as it now is. */\n onChanged: (next?: VaultItem | null) => void;\n favorite?: { on: boolean; toggle: () => void } | undefined;\n /** Changes when a panel closes, so \"Shared with…\" re-reads after sharing changed. */\n refreshKey?: string;\n /** Something the last save could not finish; shown until the person moves on. */\n notice?: string | null;\n}\n\n/** Field keys that are a username for list subtitles, copy-username and the like. */\nexport const USERNAME_KEYS = /^(username|user_name|email|login|username_or_email|account_email)$/;\n\nexport function ItemPane(props: ItemPaneProps) {\n const { port, item, definition, mode, host, organizations, defaultOwner, seed, onBack, onMode, onSaved, onDeleted, onDirty, onCancelNew, onPanel, onChanged, favorite, notice, refreshKey } = props;\n const confirmed = useConfirmed();\n const notify = useNotify();\n const editing = mode !== \"view\";\n const seedName = seed?.name ?? \"\";\n const seedUrl = seed?.url ?? \"\";\n // Values read back for editing (a username, a secret the person chose to show): they are the\n // starting point, so leaving them alone is not a change.\n const [loaded, setLoaded] = useState<Record<string, string>>({});\n const base = useMemo(() => {\n const b = draftOf(item);\n if (!item) {\n b.name = seedName;\n b.loginUrls = seedUrl ? [seedUrl] : [];\n }\n b.values = { ...loaded };\n return b;\n }, [item, seedName, seedUrl, loaded]);\n const [draft, setDraft] = useState<ItemDraft>(base);\n const [tagsText, setTagsText] = useState(base.tags.join(\", \"));\n const [showTags, setShowTags] = useState(false);\n const [showDescription, setShowDescription] = useState(false);\n const [owner, setOwner] = useState<string>(defaultOwner ?? \"me\");\n // \"For someone else\": a new item created straight into another person's vault.\n const [recipient, setRecipient] = useState(\"\");\n const [generatePrivately, setGeneratePrivately] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // What the server says about each website typed (unsafe, unreachable…), keyed by its position.\n const [destinations, setDestinations] = useState<Record<number, DestinationCheck>>({});\n const dirty = editing && isDirty(base, draft);\n const declared = definition?.fields ?? [];\n\n // A new item, a different item, or entering/leaving edit starts from the item as it is. A change\n // to the SAME item while editing (a value read back, a two-factor method saved on its own, a file\n // added) is rebased: the person's unsaved edits are carried over onto the item as it now is.\n const prev = useRef<{ base: ItemDraft; id: string | null; mode: string } | null>(null);\n useEffect(() => {\n const was = prev.current;\n const id = item?.id ?? null;\n if (was && was.id === id && was.mode === mode && editing) {\n setDraft((d) => rebaseDraft(was.base, base, d));\n } else {\n // Coming back into an edit after a reload: what the person had typed (minus secrets) returns.\n const kept = editing ? readKeptDraft(keepKey, item?.updatedAt ?? \"new\") : null;\n setDraft(kept ? { ...base, ...kept } : base);\n setTagsText((kept ?? base).tags.join(\", \"));\n setError(null);\n }\n prev.current = { base, id, mode };\n }, [base, mode, item?.id, editing]);\n useEffect(() => {\n setLoaded({});\n setShowTags(false);\n setShowDescription(false);\n }, [item?.id, mode]);\n useEffect(() => onDirty(dirty), [dirty, onDirty]);\n // Keep the unsaved edit (never its secrets) for a reload; leaving edit or saving forgets it.\n const keepKey = draftKey(item?.id ?? null, definition?.key ?? item?.definitionKey ?? null);\n useEffect(() => {\n if (editing && dirty) keepDraft(keepKey, item?.updatedAt ?? \"new\", draft);\n else if (!editing) dropKeptDraft(keepKey);\n }, [editing, dirty, draft, keepKey, item?.updatedAt]);\n\n // Editing shows what is there now: every value anyone may see without a fresh sign-in loads at once.\n useEffect(() => {\n if (!editing || !item) return;\n let live = true;\n for (const f of item.fields) {\n if (f.handling !== \"visible\" || !item.capabilities.canUse) continue;\n port.reveal(item, f.key).then((v) => live && setLoaded((cur) => ({ ...cur, [f.key]: v })), () => undefined);\n }\n return () => {\n live = false;\n };\n }, [editing, item, port]);\n\n const patch = (p: Partial<ItemDraft>) => setDraft((d) => ({ ...d, ...p }));\n const setValue = (key: string, v: string) => setDraft((d) => ({ ...d, values: { ...d.values, [key]: v } }));\n const canEdit = item ? item.capabilities.canEdit || item.capabilities.canManage : true;\n const canManage = item?.capabilities.canManage ?? false;\n\n async function save() {\n if (!definition && !item) return;\n setBusy(true);\n setError(null);\n const out: ItemDraft = { ...draft, values: Object.fromEntries(changedValues(base, draft)) };\n // A one-time password is set up after the item saves, through \"Confirm it's you\" (the server\n // wants a recent sign-in for it); a refusal leaves the item saved and says what is missing.\n const withOtp = async (saved: VaultItem, notice: string | null): Promise<[VaultItem, string | null]> => {\n const setup = out.authenticator.trim();\n if (!setup) return [saved, notice];\n try {\n await confirmed(() => port.authenticator.enrol(saved, setup));\n return [await port.get(saved), notice];\n } catch (e) {\n const why = wasCancelled(e) ? \"it was not confirmed\" : e instanceof Error ? e.message : \"it was refused\";\n return [saved, `Saved, but the one-time password was not set up: ${why}. Add it with Edit.`];\n }\n };\n try {\n if (item) {\n const r = await port.save(item, definition, out);\n const [next, n] = await withOtp(r.item, r.notice);\n dropKeptDraft(keepKey);\n onSaved(next, false, n);\n } else if (definition && owner === \"person\") {\n const secretKey = declared.find((f) => f.storage === \"encrypted\" && f.kind === \"secret\")?.key ?? null;\n const r = await port.sharing.assign({ recipientEmail: recipient.trim(), definition, draft: out, generateFieldKey: generatePrivately ? secretKey : null });\n notify(`Sent to ${r.recipientEmail}`);\n onCancelNew();\n } else if (definition) {\n const r = await port.create(definition, owner === \"me\" ? null : owner, out);\n const [next, n] = await withOtp(r.item, r.notice);\n dropKeptDraft(keepKey);\n onSaved(next, true, n);\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Saving failed. Nothing was changed.\");\n } finally {\n setBusy(false);\n }\n }\n\n async function remove() {\n if (!item) return;\n const ok = await confirm({ title: `Delete “${item.name}”?`, description: \"It moves to Trash. You can restore it from there.\", confirmLabel: \"Delete\", variant: \"destructive\" });\n if (!ok) return;\n setBusy(true);\n try {\n await port.remove(item);\n onDeleted(item.id);\n } catch (e) {\n setError(e instanceof Error ? e.message : \"Deleting failed.\");\n } finally {\n setBusy(false);\n }\n }\n\n /** Show a secret's current value inside its edit box (after confirming it's you). */\n async function loadForEdit(key: string) {\n if (!item) return;\n try {\n const v = await confirmed(() => port.reveal(item, key));\n setLoaded((cur) => ({ ...cur, [key]: v }));\n } catch (e) {\n if (!wasCancelled(e)) setError(e instanceof Error ? e.message : \"The value could not be read.\");\n }\n }\n\n const declaredKeys = new Set(declared.map((f) => f.key));\n const extraFields = (item?.fields ?? []).filter((f) => !declaredKeys.has(f.key) && !draft.removed.includes(f.id) && !isAuthenticatorStorage(f.key));\n const metaValue = (key: string) => draft.values[key] ?? item?.custom.find((c) => c.key === key)?.value ?? \"\";\n // The two-factor method has its own row; it is never a loose custom field.\n const extraCustom = draft.custom.filter((c) => !declaredKeys.has(c.key) && c.key !== MFA_METHOD_KEY && !isAuthenticatorStorage(c.key));\n const viewCustom = (item?.custom ?? []).filter((c) => !declaredKeys.has(c.key) && c.key !== MFA_METHOD_KEY && !isAuthenticatorStorage(c.key));\n const isLogin = (item?.definitionKey ?? definition?.key) === \"website_login\" || (item?.definitionKey ?? definition?.key) === \"username_password\";\n const typeLabel = definition?.label ?? item?.definitionLabel ?? \"\";\n // Whose an item is, always in sight: Personal, the organization's name, or Shared with me. A new\n // item shows where it is about to be saved.\n const shownOwner: { label: string; glyph: ReactNode } | null =\n mode === \"new\"\n ? owner === \"me\"\n ? { label: \"Personal\", glyph: <PersonGlyph /> }\n : owner === \"person\"\n ? { label: \"Someone else\", glyph: <SendGlyph /> }\n : { label: organizations.find((o) => o.id === owner)?.name ?? \"Organization\", glyph: <BuildingGlyph /> }\n : item\n ? { label: item.owner.label, glyph: item.owner.kind === \"me\" ? <PersonGlyph /> : item.owner.kind === \"organization\" ? <BuildingGlyph /> : <UsersGlyph /> }\n : null;\n const tagsVisible = showTags || draft.tags.length > 0 || tagsText !== \"\";\n const descriptionVisible = showDescription || draft.description !== \"\";\n\n const header = (\n <header className=\"flex min-h-14 items-center gap-2 border-b border-border px-3 py-2 sm:gap-3 sm:px-5\">\n {onBack ? <Button variant=\"quiet\" icon={<ChevronLeftGlyph />} aria-label=\"Back\" onClick={mode === \"new\" ? onCancelNew : onBack} /> : null}\n <ItemIcon definitionKey={definition?.key ?? item?.definitionKey ?? \"custom\"} family={definition?.family ?? \"generic\"} site={item ? siteOf(item) : siteOf({ loginUrls: draft.loginUrls })} size=\"lg\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <h2 className=\"truncate text-base font-semibold leading-tight\">{editing ? draft.name || (mode === \"new\" ? `New ${typeLabel.toLowerCase()}` : item?.name) : item?.name}</h2>\n <span className=\"flex min-w-0 items-center gap-1 text-xs text-muted-foreground\">\n {typeLabel ? <span className=\"truncate\">{typeLabel}</span> : null}\n {shownOwner ? <Badge className=\"shrink-0\" icon={shownOwner.glyph} aria-label={`Saved in ${shownOwner.label}`}>{shownOwner.label}</Badge> : null}\n {item && !editing ? <SharingSummary key={`${item.updatedAt}-${refreshKey ?? \"\"}`} item={item} port={port} className=\"hidden truncate before:mr-1 before:content-['·'] sm:inline\" /> : null}\n </span>\n </div>\n {editing ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {dirty ? (\n <span className=\"hidden items-center gap-1.5 text-xs text-muted-foreground sm:flex\" role=\"status\">\n <span className=\"size-1.5 rounded-full bg-warning\" aria-hidden />\n Unsaved\n </span>\n ) : null}\n <Button variant=\"quiet\" disabled={busy} onClick={() => (mode === \"new\" ? onCancelNew() : onMode(\"view\"))}>\n {dirty ? \"Discard\" : \"Cancel\"}\n </Button>\n <Button variant=\"primary\" disabled={busy || draft.name.trim() === \"\" || (mode === \"edit\" && !dirty) || (mode === \"new\" && owner === \"person\" && !/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(recipient.trim()))} onClick={() => void save()}>\n {mode === \"new\" && owner === \"person\" ? \"Send\" : \"Save\"}\n </Button>\n </div>\n ) : item ? (\n <div className=\"flex shrink-0 items-center gap-1\">\n {host.page && canUseOnSite(item, host.page.url) ? <UseOnSiteButton port={port} item={item} pageUrl={host.page.url} onChanged={(next) => onChanged(next)} /> : null}\n {host.fill && item.capabilities.canUse ? (\n <Button\n variant=\"primary\"\n onClick={() =>\n void host.fill?.(item.id).then((outcome) => {\n const said = FILL_WORDS[outcome];\n notify(said.text, said.tone === \"warning\" ? \"error\" : \"success\");\n })\n }\n >\n Fill\n </Button>\n ) : null}\n {favorite ? <span className=\"hidden sm:contents\"><Button variant=\"quiet\" icon={<StarGlyph className={favorite.on ? \"fill-current text-warning\" : \"size-4\"} />} aria-label={favorite.on ? \"Remove from favorites\" : \"Add to favorites\"} pressed={favorite.on} onClick={favorite.toggle} /></span> : null}\n {canManage ? <span className=\"hidden sm:contents\"><Button variant=\"quiet\" icon={<ShareGlyph />} aria-label=\"Share\" onClick={() => onPanel(\"share\")} /></span> : null}\n {canEdit ? <Button variant=\"outline\" icon={<PencilGlyph />} collapse=\"container\" aria-label=\"Edit\" onClick={() => onMode(\"edit\")}>Edit</Button> : null}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"More actions\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {favorite ? <DropdownMenuItem onSelect={favorite.toggle}><StarGlyph className=\"size-4\" />{favorite.on ? \"Remove from favorites\" : \"Add to favorites\"}</DropdownMenuItem> : null}\n {canManage ? <DropdownMenuItem onSelect={() => onPanel(\"share\")}><ShareGlyph className=\"size-4\" />Share</DropdownMenuItem> : null}\n {canManage ? <DropdownMenuItem onSelect={() => onPanel(\"move\")}><MoveGlyph className=\"size-4\" />Move or copy</DropdownMenuItem> : null}\n {item.capabilities.canReveal ? <DropdownMenuItem onSelect={() => onPanel(\"send\")}><SendGlyph className=\"size-4\" />Send securely</DropdownMenuItem> : null}\n <DropdownMenuItem onSelect={() => onPanel(\"history\")}><HistoryGlyph className=\"size-4\" />Password history</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onPanel(\"activity\")}><ListGlyph className=\"size-4\" />Activity</DropdownMenuItem>\n {canEdit ? <DropdownMenuItem onSelect={() => onPanel(\"settings\")}><SettingsGlyph className=\"size-4\" />Settings</DropdownMenuItem> : null}\n {canManage ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"text-destructive\" disabled={busy} onSelect={() => void remove()}><TrashGlyph className=\"size-4\" />Delete</DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n </header>\n );\n\n const filesProps = item ? { item, port, host, definition, organizations, arg: null, onClose: () => undefined, onChanged, onPanel } : null;\n\n return (\n <article aria-label={item?.name ?? \"New item\"} className={cn(CONTROLS_CONTAINER_CLASS, \"flex h-full min-h-0 flex-col bg-background\")}>\n {header}\n {error ? <div role=\"alert\" className=\"border-b border-border bg-muted px-5 py-2 text-sm text-destructive\">{error}</div> : null}\n {notice && !editing ? <div role=\"status\" className=\"border-b border-border bg-muted px-5 py-2 text-sm text-warning\">{notice}</div> : null}\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex w-full max-w-3xl flex-col gap-5 px-3 py-4 sm:px-6 sm:py-6\">\n {editing ? (\n <>\n <Section>\n {mode === \"new\" ? (\n <Row label=\"Save to\">\n <OptionCombobox\n value={owner}\n onChange={setOwner}\n ariaLabel=\"Save to\"\n searchable={organizations.length > 6}\n searchPlaceholder=\"Find an organization\"\n groups={[\n { heading: \"Just you\", options: [\"me\"] },\n ...(organizations.length > 0 ? [{ heading: \"Organizations\", options: organizations.map((o) => o.id) }] : []),\n { heading: \"Send\", options: [\"person\"] },\n ]}\n getLabel={(v) => (v === \"me\" ? \"Personal\" : v === \"person\" ? \"Someone else\" : (organizations.find((o) => o.id === v)?.name ?? v))}\n getHint={(v) => (v === \"me\" ? \"Only you\" : v === \"person\" ? \"Sent by email\" : null)}\n renderIcon={(v) => (v === \"me\" ? <PersonGlyph className=\"size-4\" /> : v === \"person\" ? <SendGlyph className=\"size-4\" /> : <BuildingGlyph className=\"size-4\" />)}\n />\n </Row>\n ) : null}\n <EditRow label=\"Name\" value={draft.name} onChange={(v) => patch({ name: v })} placeholder=\"Name\" autoFocus={mode === \"new\"} />\n {mode === \"new\" && owner === \"person\" ? (\n <>\n <EditRow label=\"Their email\" value={recipient} placeholder=\"name@company.com\" inputMode=\"email\" onChange={setRecipient} />\n {declared.some((f) => f.storage === \"encrypted\" && f.kind === \"secret\") ? (\n <Row label=\"Password\" hint=\"You never see it\">\n <Switch checked={generatePrivately} onCheckedChange={setGeneratePrivately} aria-label=\"Generate the password privately\" />\n </Row>\n ) : null}\n </>\n ) : null}\n {declared.map((f) => {\n const existing = item?.fields.find((x) => x.key === f.key);\n const secretKind = f.storage === \"encrypted\" && f.kind === \"secret\";\n const value = f.storage === \"metadata\" ? metaValue(f.key) : (draft.values[f.key] ?? \"\");\n const hidden = existing && existing.handling !== \"visible\" && !(f.key in loaded);\n return (\n <EditRow\n key={f.key}\n label={f.label}\n value={value}\n placeholder={hidden ? \"••••••••\" : f.required ? \"Required\" : \"\"}\n secret={secretKind}\n multiline={f.kind === \"multiline\"}\n inputMode={f.kind === \"url\" ? \"url\" : USERNAME_KEYS.test(f.key) ? \"email\" : \"text\"}\n onChange={(v) => setValue(f.key, v)}\n actions={\n <>\n {hidden && existing?.handling === \"revealable\" && item?.capabilities.canReveal ? <Button variant=\"quiet\" icon={<EyeGlyph />} aria-label={`Show current ${f.label}`} onClick={() => void loadForEdit(f.key)} /> : null}\n {secretKind ? <GenerateButton onUse={(v) => setValue(f.key, v)} /> : null}\n {existing ? <Button variant=\"quiet\" icon={<SettingsGlyph />} aria-label={`${f.label} settings`} onClick={() => onPanel(`field:${existing.id}`)} /> : null}\n </>\n }\n />\n );\n })}\n {extraFields.map((f) => (\n <EditRow\n key={f.id}\n label={f.label}\n value={draft.values[f.key] ?? \"\"}\n placeholder={f.handling === \"visible\" || f.key in loaded ? \"\" : \"••••••••\"}\n secret={f.handling !== \"visible\"}\n onChange={(v) => setValue(f.key, v)}\n onRemove={() => patch({ removed: [...draft.removed, f.id] })}\n removeLabel={`Delete ${f.label}`}\n actions={\n <>\n {f.handling === \"revealable\" && !(f.key in loaded) && item?.capabilities.canReveal ? <Button variant=\"quiet\" icon={<EyeGlyph />} aria-label={`Show current ${f.label}`} onClick={() => void loadForEdit(f.key)} /> : null}\n <Button variant=\"quiet\" icon={<SettingsGlyph />} aria-label={`${f.label} settings`} onClick={() => onPanel(`field:${f.id}`)} />\n </>\n }\n />\n ))}\n {draft.loginUrls.map((u, i) => (\n <EditRow\n key={i}\n label={i === 0 ? \"Website\" : `Website ${i + 1}`}\n hint={destinations[i] && destinations[i].tone !== \"success\" ? <span className={destinations[i].tone === \"destructive\" ? \"text-destructive\" : \"text-warning\"}>{destinations[i].message}</span> : undefined}\n value={u}\n autoFocus={i > 0 && u === \"\" && i === draft.loginUrls.length - 1}\n placeholder=\"https://\"\n inputMode=\"url\"\n onChange={(v) => patch({ loginUrls: draft.loginUrls.map((x, j) => (j === i ? v : x)) })}\n onBlur={() =>\n void checkDestination(port, u, item ?? undefined).then((r) => {\n setDestinations((cur) => {\n const next = { ...cur };\n if (r) next[i] = r;\n else delete next[i];\n return next;\n });\n if (r?.url && r.url !== u) setDraft((d) => ({ ...d, loginUrls: d.loginUrls.map((x, j) => (j === i && x === u ? r.url : x)) }));\n })\n }\n onRemove={() => patch({ loginUrls: draft.loginUrls.filter((_, j) => j !== i) })}\n removeLabel=\"Remove website\"\n />\n ))}\n <AddRow label={draft.loginUrls.length === 0 ? \"Website\" : \"\"} onAdd={() => patch({ loginUrls: [...draft.loginUrls, \"\"] })}>\n {draft.loginUrls.length === 0 ? \"Add website\" : \"Add another website\"}\n </AddRow>\n <TotpEditRow value={draft.authenticator} onChange={(v) => patch({ authenticator: v })} hasExisting={Boolean(item?.authenticator)} item={item} port={port} onEnrolled={onChanged} />\n {item && isLogin && !item.authenticator ? <TwoFactorMethodRow port={port} item={item} onChanged={onChanged} /> : null}\n </Section>\n\n <Section>\n <EditRow label=\"Notes\" value={draft.notes} multiline placeholder=\"Anything worth remembering\" onChange={(v) => patch({ notes: v })} />\n </Section>\n\n <Section\n title=\"More\"\n actions={\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<PlusGlyph />}>Add</Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => patch({ secrets: [...draft.secrets, { key: \"\", label: \"\", value: \"\" }] })}>Secret field</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => patch({ custom: [...draft.custom, { key: `custom_${draft.custom.length + 1}_${Date.now() % 100000}`, label: \"\", value: \"\" }] })}>Text field</DropdownMenuItem>\n {!tagsVisible ? <DropdownMenuItem onSelect={() => setShowTags(true)}>Tags</DropdownMenuItem> : null}\n {!descriptionVisible ? <DropdownMenuItem onSelect={() => setShowDescription(true)}>Description</DropdownMenuItem> : null}\n </DropdownMenuContent>\n </DropdownMenu>\n }\n >\n {descriptionVisible ? <EditRow label=\"Description\" value={draft.description} placeholder=\"What this is for\" onChange={(v) => patch({ description: v })} /> : null}\n {tagsVisible ? (\n <EditRow\n label=\"Tags\"\n value={tagsText}\n placeholder=\"work, finance\"\n onChange={(v) => {\n setTagsText(v);\n patch({ tags: v.split(\",\").map((t) => t.trim()).filter(Boolean) });\n }}\n />\n ) : null}\n {draft.secrets.map((s, i) => (\n <CustomEditRow key={`s${i}`} label={s.label} value={s.value} secret onLabel={(v) => patch({ secrets: draft.secrets.map((x, j) => (j === i ? { ...x, label: v } : x)) })} onValue={(v) => patch({ secrets: draft.secrets.map((x, j) => (j === i ? { ...x, value: v } : x)) })} onRemove={() => patch({ secrets: draft.secrets.filter((_, j) => j !== i) })} />\n ))}\n {extraCustom.map((c) => (\n <CustomEditRow key={c.key} label={c.label} value={c.value} secret={false} onLabel={(v) => patch({ custom: draft.custom.map((x) => (x.key === c.key ? { ...x, label: v } : x)) })} onValue={(v) => patch({ custom: draft.custom.map((x) => (x.key === c.key ? { ...x, value: v } : x)) })} onRemove={() => patch({ custom: draft.custom.filter((x) => x.key !== c.key) })} />\n ))}\n {!descriptionVisible && !tagsVisible && draft.secrets.length === 0 && extraCustom.length === 0 ? <AddRow label=\"Fields, tags\" onAdd={null}>None</AddRow> : null}\n </Section>\n {filesProps ? <FilesSection {...filesProps} editing /> : null}\n </>\n ) : item ? (\n <>\n <Section>\n {declared.map((f) => {\n if (f.storage === \"metadata\") {\n const v = metaValue(f.key);\n return v ? <PlainRow key={f.key} label={f.label} value={v} openUrl={host.openUrl} /> : null;\n }\n const field = item.fields.find((x) => x.key === f.key);\n if (isRecoveryCodesField(f)) return <RecoveryCodesRow key={f.key} item={item} field={field} port={port} onChanged={onChanged} />;\n return field ? <SecretRow key={field.id} port={port} item={item} field={field} /> : null;\n })}\n {extraFields.map((f) => (isRecoveryCodesField(f) ? <RecoveryCodesRow key={f.id} item={item} field={f} port={port} onChanged={onChanged} /> : <SecretRow key={f.id} port={port} item={item} field={f} />))}\n {item.loginUrls.length > 0 ? item.loginUrls.map((u, i) => <PlainRow key={`${u}-${i}`} label={i === 0 ? \"Website\" : `Website ${i + 1}`} value={u} openUrl={host.openUrl} />) : <AddRow label=\"Website\" onAdd={canEdit ? () => onMode(\"edit\") : null}>Add website</AddRow>}\n {item.authenticator ? <TotpRow port={port} item={item} onChanged={onChanged} /> : <AddRow label=\"One-time password\" onAdd={canEdit ? () => onMode(\"edit\") : null}>Set up</AddRow>}\n {!item.authenticator && item.custom.some((c) => c.key === MFA_METHOD_KEY && c.value) ? <TwoFactorMethodRow port={port} item={item} onChanged={onChanged} /> : null}\n </Section>\n <Section>{item.notes ? <PlainRow label=\"Notes\" value={item.notes} multiline /> : <AddRow label=\"Notes\" onAdd={canEdit ? () => onMode(\"edit\") : null}>Add notes</AddRow>}</Section>\n {item.description || item.tags.length > 0 || viewCustom.length > 0 ? (\n <Section title=\"More\">\n {item.description ? <PlainRow label=\"Description\" value={item.description} /> : null}\n {item.tags.length > 0 ? (\n <Row label=\"Tags\">\n <div className=\"flex flex-wrap gap-1\">\n {item.tags.map((t) => (\n <span key={t} className=\"rounded-md bg-muted px-1.5 py-0.5 text-xs\">{t}</span>\n ))}\n </div>\n </Row>\n ) : null}\n {viewCustom.map((c) => <PlainRow key={c.key} label={c.label} value={c.value} openUrl={host.openUrl} />)}\n </Section>\n ) : null}\n {filesProps ? <FilesSection {...filesProps} editing={false} /> : null}\n <p className={cn(\"px-1 text-xs text-muted-foreground\")}>\n Modified {formatDate(item.updatedAt)} · Created {formatDate(item.createdAt)}\n </p>\n </>\n ) : null}\n </div>\n </div>\n </article>\n );\n}\n","import { useRef, useState, type DragEvent } from \"react\";\nimport { Badge, Button, Field, SegmentedControl } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { downloadFile } from \"@ai-matrx/kit/download\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { DownloadGlyph, LockGlyph, PencilGlyph, PlusGlyph, TrashGlyph, UploadGlyph } from \"../glyphs\";\nimport type { FieldHandling, VaultAttachment, VaultItem } from \"../model\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport type { VaultPort } from \"../port\";\nimport { Row, Section, formatBytes } from \"../ui\";\nimport { canDownload, fileTooBig } from \"./logic\";\n\nconst messageOf = (e: unknown, fallback: string): string | null => (wasCancelled(e) ? null : e instanceof Error ? e.message : fallback);\nconst TOO_BIG = \"Files over 25 MB can't be stored.\";\n\nconst PROTECTION: readonly { value: FieldHandling; label: string; title: string }[] = [\n { value: \"visible\", label: \"Open\", title: \"Anyone who can use the item can download it\" },\n { value: \"revealable\", label: \"Protected\", title: \"Downloading needs a recent sign-in\" },\n { value: \"sealed\", label: \"Sealed\", title: \"Only automation can use it, never a person\" },\n];\n\n/**\n * The item's protected files. View: nothing when there are none; else one row per file (name, size,\n * download). Editing: add (pick or drop), rename and describe, protection, replace, delete. Every\n * change lands on the server at once — files are not part of the item's Save.\n */\nexport function FilesSection({ item, port, editing, onChanged }: ItemPanelProps & { editing: boolean }) {\n const confirmed = useConfirmed();\n const canEdit = editing && item.capabilities.canEdit;\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [pending, setPending] = useState<File | null>(null);\n const [dragging, setDragging] = useState(false);\n const picker = useRef<HTMLInputElement>(null);\n\n if (!canEdit && item.attachments.length === 0) return null;\n\n async function run(key: string, work: () => Promise<VaultItem | void>, fallback: string): Promise<boolean> {\n setBusy(key);\n setError(null);\n try {\n const next = await work();\n if (next) onChanged(next);\n return true;\n } catch (e) {\n setError(messageOf(e, fallback));\n return false;\n } finally {\n setBusy(null);\n }\n }\n\n function choose(file: File | undefined | null) {\n if (!file) return;\n if (fileTooBig(file.size)) return setError(TOO_BIG);\n setError(null);\n setPending(file);\n }\n\n function drop(e: DragEvent<HTMLElement>) {\n if (!canEdit) return;\n e.preventDefault();\n setDragging(false);\n choose(e.dataTransfer.files[0]);\n }\n\n const download = (a: VaultAttachment) =>\n run(`download:${a.id}`, async () => {\n const bytes = await confirmed(() => port.activity.downloadFile(item, a));\n downloadFile(a.fileName, new Uint8Array(bytes), a.mediaType || \"application/octet-stream\");\n }, \"The file could not be downloaded.\");\n\n return (\n <div\n className={cn(\"rounded-xl\", dragging && \"outline outline-2 outline-primary\")}\n onDragOver={canEdit ? (e) => { e.preventDefault(); setDragging(true); } : undefined}\n onDragLeave={canEdit ? () => setDragging(false) : undefined}\n onDrop={canEdit ? drop : undefined}\n >\n <Section\n title=\"Files\"\n actions={canEdit ? <Button variant=\"quiet\" icon={<PlusGlyph />} disabled={busy !== null} onClick={() => picker.current?.click()}>Add file</Button> : undefined}\n >\n {canEdit ? <input ref={picker} type=\"file\" hidden onChange={(e) => { choose(e.target.files?.[0]); e.target.value = \"\"; }} /> : null}\n {item.attachments.map((a) =>\n canEdit ? (\n <EditableFile key={a.id} port={port} item={item} file={a} busy={busy} run={run} onDownload={() => void download(a)} onTooBig={() => setError(TOO_BIG)} />\n ) : (\n <Row\n key={a.id}\n label={a.label}\n hint={a.description || undefined}\n actions={\n a.handling === \"sealed\" ? (\n <Badge icon={<LockGlyph />}>Sealed</Badge>\n ) : canDownload(item, a) ? (\n <Button variant=\"quiet\" icon={<DownloadGlyph />} aria-label={`Download ${a.fileName}`} disabled={busy !== null} onClick={() => void download(a)} />\n ) : null\n }\n >\n <FileName file={a} />\n </Row>\n ),\n )}\n {canEdit && pending ? (\n <NewFile file={pending} busy={busy === \"add\"} onCancel={() => setPending(null)} onAdd={async (details) => { if (await run(\"add\", () => port.activity.addFile(item, pending, details), \"The file could not be added.\")) setPending(null); }} />\n ) : null}\n {canEdit && item.attachments.length === 0 && !pending ? (\n <div className=\"px-4 py-3 text-sm text-muted-foreground\">Drop a file here or choose Add file</div>\n ) : null}\n {error ? <p role=\"alert\" className=\"px-4 py-2 text-sm text-destructive\">{error}</p> : null}\n </Section>\n </div>\n );\n}\n\ntype Run = (key: string, work: () => Promise<VaultItem | void>, fallback: string) => Promise<boolean>;\n\n/** A stored file while editing: its row, and its details below it on demand. */\nfunction EditableFile({ port, item: it, file: a, busy: b, run: go, onDownload, onTooBig }: {\n port: VaultPort;\n item: VaultItem;\n file: VaultAttachment;\n busy: string | null;\n run: Run;\n onDownload: () => void;\n onTooBig: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const replacer = useRef<HTMLInputElement>(null);\n\n async function remove() {\n const yes = await confirm({ title: `Delete ${a.label}?`, description: \"The encrypted file is removed from this item.\", confirmLabel: \"Delete\", variant: \"destructive\" });\n if (yes) await go(`delete:${a.id}`, () => port.activity.deleteFile(it, a.id), \"The file could not be deleted.\");\n }\n\n return (\n <>\n <Row\n label={a.label}\n hint={a.description || undefined}\n actions={\n <>\n {canDownload(it, a) ? <Button variant=\"quiet\" icon={<DownloadGlyph />} aria-label={`Download ${a.fileName}`} disabled={b !== null} onClick={onDownload} /> : null}\n <Button variant=\"quiet\" icon={<PencilGlyph />} aria-label={`Edit ${a.label}`} pressed={open} disabled={b !== null} onClick={() => setOpen((o) => !o)} />\n <Button variant=\"quiet\" icon={<UploadGlyph />} aria-label={`Replace ${a.fileName}`} disabled={b !== null} onClick={() => replacer.current?.click()} />\n <Button variant=\"quiet\" icon={<TrashGlyph />} aria-label={`Delete ${a.label}`} disabled={b !== null} onClick={() => void remove()} />\n <input\n ref={replacer}\n type=\"file\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n e.target.value = \"\";\n if (!f) return;\n if (fileTooBig(f.size)) return onTooBig();\n void go(`replace:${a.id}`, () => port.activity.replaceFile(it, a.id, f), \"The file could not be replaced.\");\n }}\n />\n </>\n }\n >\n <FileName file={a} />\n </Row>\n {open ? <FileDetailsRows file={a} busy={b === `update:${a.id}`} onCancel={() => setOpen(false)} onSave={async (d) => { if (await go(`update:${a.id}`, () => port.activity.updateFile(it, a.id, d), \"The file details could not be saved.\")) setOpen(false); }} /> : null}\n </>\n );\n}\n\nfunction FileName({ file }: { file: VaultAttachment }) {\n return (\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate\">{file.fileName}</span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{formatBytes(file.sizeBytes)}</span>\n </span>\n );\n}\n\nfunction Protection({ value, locked, onChange }: { value: FieldHandling; locked: boolean; onChange: (v: FieldHandling) => void }) {\n return (\n <SegmentedControl\n aria-label=\"Protection\"\n value={value}\n onValueChange={onChange}\n data={PROTECTION.map((p) => ({ value: p.value, label: p.label, title: p.title, disabled: locked && p.value !== \"sealed\" }))}\n />\n );\n}\n\n/** The details a new file needs before it is encrypted and stored. */\nfunction NewFile({ file, busy, onAdd, onCancel }: { file: File; busy: boolean; onAdd: (d: { label: string; description: string | null; handling: FieldHandling }) => Promise<void>; onCancel: () => void }) {\n const [label, setLabel] = useState(file.name);\n const [description, setDescription] = useState(\"\");\n const [handling, setHandling] = useState<FieldHandling>(\"revealable\");\n\n async function add() {\n if (handling === \"sealed\" && !(await confirmSeal(label))) return;\n await onAdd({ label: label.trim(), description: description.trim() || null, handling });\n }\n\n return (\n <>\n <Row label=\"New file\"><span className=\"flex min-w-0 items-center gap-2\"><span className=\"truncate\">{file.name}</span><span className=\"shrink-0 text-xs text-muted-foreground\">{formatBytes(file.size)}</span></span></Row>\n <Row label=\"Name\"><Field aria-label=\"Name\" value={label} onChange={(e) => setLabel(e.target.value)} /></Row>\n <Row label=\"Purpose\"><Field aria-label=\"Purpose\" placeholder=\"What it is for\" value={description} onChange={(e) => setDescription(e.target.value)} /></Row>\n <Row label=\"Protection\"><Protection value={handling} locked={false} onChange={setHandling} /></Row>\n <div className=\"flex justify-end gap-2 px-3 py-1 sm:px-4\">\n <Button variant=\"quiet\" disabled={busy} onClick={onCancel}>Cancel</Button>\n <Button variant=\"primary\" disabled={busy || !label.trim()} onClick={() => void add()}>{busy ? \"Adding…\" : \"Add file\"}</Button>\n </div>\n </>\n );\n}\n\n/** Rename, describe, change the saved file name and the protection of a stored file. */\nfunction FileDetailsRows({ file, busy, onSave, onCancel }: { file: VaultAttachment; busy: boolean; onSave: (d: { label: string; description: string | null; fileName: string; handling: FieldHandling }) => Promise<void>; onCancel: () => void }) {\n const [label, setLabel] = useState(file.label);\n const [description, setDescription] = useState(file.description);\n const [fileName, setFileName] = useState(file.fileName);\n const [handling, setHandling] = useState<FieldHandling>(file.handling);\n const changed = label !== file.label || description !== file.description || fileName !== file.fileName || handling !== file.handling;\n\n async function save() {\n if (handling === \"sealed\" && file.handling !== \"sealed\" && !(await confirmSeal(label))) return;\n await onSave({ label: label.trim(), description: description.trim() || null, fileName: fileName.trim(), handling });\n }\n\n return (\n <>\n <Row label=\"Name\"><Field aria-label=\"Name\" value={label} onChange={(e) => setLabel(e.target.value)} /></Row>\n <Row label=\"Purpose\"><Field aria-label=\"Purpose\" placeholder=\"What it is for\" value={description} onChange={(e) => setDescription(e.target.value)} /></Row>\n <Row label=\"File name\"><Field aria-label=\"File name\" value={fileName} onChange={(e) => setFileName(e.target.value)} /></Row>\n <Row label=\"Protection\"><Protection value={handling} locked={file.handling === \"sealed\"} onChange={setHandling} /></Row>\n <div className=\"flex justify-end gap-2 px-3 py-1 sm:px-4\">\n <Button variant=\"quiet\" disabled={busy} onClick={onCancel}>Cancel</Button>\n <Button variant=\"primary\" disabled={busy || !changed || !label.trim() || !fileName.trim()} onClick={() => void save()}>{busy ? \"Saving…\" : \"Save\"}</Button>\n </div>\n </>\n );\n}\n\n/** Sealing is one-way: no person can ever download the file again. */\nfunction confirmSeal(label: string): Promise<boolean> {\n return confirm({\n title: `Seal ${label || \"this file\"}?`,\n description: \"No one can download it again; only automation can use it. This can't be undone.\",\n confirmLabel: \"Seal\",\n variant: \"destructive\",\n });\n}\n","import { useCopy } from \"../notice\";\nimport { useState } from \"react\";\nimport { Badge, Button, Textarea } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { CheckGlyph, CopyGlyph, EyeGlyph, EyeOffGlyph, LockGlyph, PencilGlyph, PlusGlyph, XGlyph } from \"../glyphs\";\nimport { useTransientSecret } from \"../hooks\";\nimport type { VaultField, VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Row } from \"../ui\";\nimport { RECOVERY_CODES_KEY, parseRecoveryCodes, withoutCode } from \"./rules\";\n\nconst MASK = \"••••••••••••\";\nconst say = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\n\n/**\n * One-time recovery codes, stored as ONE encrypted field (`recovery_codes`, one code per line).\n * Show reveals them for 20 seconds; each code has its own Copy and \"Mark used\". Marking a code\n * used removes it from the stored set so it can never be chosen again; the last one removes the\n * field. With no field yet, a person who can edit adds a set. Replace swaps the whole set.\n */\nexport function RecoveryCodesRow({ item, field, port, onChanged }: { item: VaultItem; field: VaultField | null | undefined; port: VaultPort; onChanged?: (next: VaultItem) => void }) {\n const confirmed = useConfirmed();\n const copyValue = useCopy();\n const secret = useTransientSecret();\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [draft, setDraft] = useState<string | null>(null);\n const canEdit = item.capabilities.canEdit;\n\n const run = async (step: () => Promise<VaultItem | void>) => {\n setBusy(true);\n setError(null);\n try {\n const next = await step();\n if (next) onChanged?.(next);\n return true;\n } catch (e) {\n if (!wasCancelled(e)) setError(say(e, \"That didn’t work. Try again.\"));\n return false;\n } finally {\n setBusy(false);\n }\n };\n\n const saveDraft = async () => {\n const value = parseRecoveryCodes(draft ?? \"\").join(\"\\n\");\n if (!value) return;\n const ok = await run(() =>\n confirmed(() =>\n field\n ? port.fields.setValue(item, field.id, value)\n : port.fields.addField(item, { key: RECOVERY_CODES_KEY, value, handling: \"revealable\", description: \"One-time account recovery codes\" }),\n ),\n );\n if (ok) {\n secret.clear();\n setDraft(null);\n }\n };\n\n // Adding or replacing: the box grows down under the label, Save/Cancel stay on the label's line.\n if (draft !== null) {\n return (\n <Row\n label=\"Recovery codes\"\n top\n actions={\n <>\n <Button variant=\"quiet\" icon={<CheckGlyph />} aria-label=\"Save codes\" disabled={busy || !draft.trim()} onClick={() => void saveDraft()} />\n <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label=\"Cancel\" disabled={busy} onClick={() => { setDraft(null); setError(null); }} />\n </>\n }\n >\n <Textarea mono autoGrow rows={4} maxHeight={240} autoComplete=\"off\" spellCheck={false} aria-label=\"Recovery codes, one per line\" placeholder={field ? \"The complete new set, one per line\" : \"One code per line\"} value={draft} onChange={(e) => setDraft(e.target.value)} autoFocus />\n {error ? <p role=\"alert\" className=\"pt-1 text-xs text-destructive\">{error}</p> : null}\n </Row>\n );\n }\n\n if (!field) {\n if (!canEdit) return null;\n return (\n <Row label=\"Recovery codes\" actions={<Button variant=\"quiet\" icon={<PlusGlyph />} aria-label=\"Add recovery codes\" onClick={() => setDraft(\"\")} />}>\n <span className=\"text-muted-foreground\">None</span>\n </Row>\n );\n }\n\n const sealed = field.handling === \"sealed\";\n const canSee = !sealed && item.capabilities.canReveal;\n const codes = secret.value === null ? null : parseRecoveryCodes(secret.value);\n\n const toggle = async () => {\n if (secret.value !== null) return secret.clear();\n await run(async () => {\n secret.show(await confirmed(() => port.reveal(item, field.key)));\n });\n };\n\n const markUsed = async (index: number) => {\n if (!codes) return;\n const next = withoutCode(codes, index);\n await run(async () => {\n const updated = await confirmed(() => (next === null ? port.fields.removeField(item, field.id) : port.fields.setValue(item, field.id, next)));\n if (next === null) secret.clear();\n else secret.show(next);\n return updated;\n });\n };\n\n return (\n <Row\n label=\"Recovery codes\"\n top={codes !== null}\n actions={\n <>\n {canSee ? <Button variant=\"quiet\" icon={codes ? <EyeOffGlyph /> : <EyeGlyph />} aria-label={codes ? \"Hide codes\" : \"Show codes\"} disabled={busy} onClick={() => void toggle()} /> : null}\n {canEdit && !sealed ? <Button variant=\"quiet\" icon={<PencilGlyph />} aria-label=\"Replace all codes\" disabled={busy} onClick={() => setDraft(\"\")} /> : null}\n </>\n }\n >\n {sealed ? (\n <Badge icon={<LockGlyph />}>Sealed</Badge>\n ) : codes ? (\n <ul className=\"flex flex-col gap-0.5\" aria-label=\"Recovery codes\">\n {codes.map((code, i) => (\n <li key={`${i}-${code}`} className=\"flex min-h-7 items-center gap-1\">\n <code className=\"min-w-0 flex-1 break-all font-mono text-sm text-foreground\">{code}</code>\n <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label={`Copy code ${i + 1}`} onClick={() => void copyValue(code, \"Recovery code\")} />\n {canEdit ? (\n <Button variant=\"quiet\" icon={<CheckGlyph />} disabled={busy} onClick={() => void markUsed(i)}>\n Mark used\n </Button>\n ) : null}\n </li>\n ))}\n {error ? <li role=\"alert\" className=\"text-xs text-destructive\">{error}</li> : null}\n </ul>\n ) : error ? (\n <span className=\"block truncate text-destructive\" title={error}>{error}</span>\n ) : (\n <span className=\"block truncate tracking-widest text-muted-foreground\">{MASK}</span>\n )}\n </Row>\n );\n}\n\n","import type { ItemDraft } from \"./model\";\n\n/**\n * AN UNSAVED EDIT SURVIVES A RELOAD. Only the parts that are not secret are kept, and only in this\n * tab (sessionStorage): name, description, tags, websites, notes, plaintext fields. Typed passwords,\n * secret fields and one-time-password setup keys are never written to the browser; after a reload\n * those boxes are empty again and the person retypes them.\n */\nexport interface KeptDraft {\n /** The item's `updatedAt` when the edit started; a kept edit for an older version is dropped. */\n basedOn: string;\n draft: Pick<ItemDraft, \"name\" | \"description\" | \"tags\" | \"loginUrls\" | \"notes\" | \"custom\">;\n}\n\nconst PREFIX = \"matrx.vault.draft:\";\n\nexport function draftKey(itemId: string | null, definitionKey: string | null): string {\n return `${PREFIX}${itemId ?? `new:${definitionKey ?? \"custom\"}`}`;\n}\n\nexport function keepDraft(key: string, basedOn: string, d: ItemDraft): void {\n const kept: KeptDraft = { basedOn, draft: { name: d.name, description: d.description, tags: d.tags, loginUrls: d.loginUrls, notes: d.notes, custom: d.custom } };\n try {\n globalThis.sessionStorage?.setItem(key, JSON.stringify(kept));\n } catch {\n /* storage blocked: the edit simply does not survive a reload */\n }\n}\n\nexport function readKeptDraft(key: string, basedOn: string): KeptDraft[\"draft\"] | null {\n try {\n const raw = globalThis.sessionStorage?.getItem(key);\n if (!raw) return null;\n const kept = JSON.parse(raw) as KeptDraft;\n return kept.basedOn === basedOn ? kept.draft : null;\n } catch {\n return null;\n }\n}\n\nexport function dropKeptDraft(key: string): void {\n try {\n globalThis.sessionStorage?.removeItem(key);\n } catch {\n /* nothing kept */\n }\n}\n","/**\n * The pure half of the extension screens: what a page address means, and the words for every\n * outcome the host reports. No React, no page access — tested in `page-logic.test.ts`.\n */\nimport type { UriMatchMode } from \"../model\";\nimport type { CaptureResult, FillOutcome, FillSetupResult, NewPasswordFillOutcome, NewPasswordFind, PageBlock, PageMatchError, SignInOutcome } from \"./host\";\n\nconst LOOPBACK = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\nexport function parsePageUrl(raw: string | null | undefined): URL | null {\n if (!raw) return null;\n try {\n return new URL(raw);\n } catch {\n return null;\n }\n}\n\n/** The site as people read it: `github.com` (no `www.`), or \"\" when the address is not one. */\nexport function pageSite(raw: string | null | undefined): string {\n return parsePageUrl(raw)?.hostname.replace(/^www\\./, \"\") ?? \"\";\n}\n\n/** Browser fill only ever targets https (or a loopback http address while developing). */\nexport function isFillablePage(raw: string | null | undefined): boolean {\n const u = parsePageUrl(raw);\n if (!u) return false;\n return u.protocol === \"https:\" || (u.protocol === \"http:\" && LOOPBACK.has(u.hostname));\n}\n\n/** The stored form of a login address: origin + path. Query and hash carry one-time state. */\nexport function normalizeLoginUrl(raw: string | null | undefined): string | null {\n const u = parsePageUrl(raw);\n return u ? `${u.origin}${u.pathname}` : null;\n}\n\n/** True when an item's websites already match this page under its own matching rule. */\nexport function coversPage(loginUrls: readonly string[], mode: UriMatchMode, pageUrl: string | null | undefined): boolean {\n if (mode === \"never\") return false;\n const page = parsePageUrl(pageUrl);\n if (!page) return false;\n return loginUrls.some((entry) => {\n const stored = parsePageUrl(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(entry) ? entry : `https://${entry}`);\n if (!stored) return false;\n if (mode === \"exact\") return stored.origin === page.origin && stored.pathname === page.pathname;\n if (mode === \"domain\") return page.hostname === stored.hostname || page.hostname.endsWith(`.${stored.hostname}`);\n return stored.host === page.host;\n });\n}\n\n/** `loginUrls` with this page added once (normalized). The same array back when nothing changes. */\nexport function withPageAdded(loginUrls: readonly string[], pageUrl: string | null | undefined): readonly string[] {\n const n = normalizeLoginUrl(pageUrl);\n if (!n || loginUrls.some((e) => normalizeLoginUrl(e) === n)) return loginUrls;\n return [...loginUrls, n];\n}\n\n/**\n * Two saved logins with the same name get the shortest id prefix that tells them apart\n * (`ID 3f`), so \"Update\" and \"Fill\" never name an ambiguous target.\n */\nexport function distinguish(target: { itemId: string; name: string }, all: readonly { itemId: string; name: string }[]): string | null {\n const same = all.filter((x) => x.name === target.name);\n if (same.length < 2) return null;\n for (let n = 1; n <= target.itemId.length; n++) {\n const p = target.itemId.slice(0, n);\n if (same.filter((x) => x.itemId.slice(0, n) === p).length === 1) return `ID ${p}`;\n }\n return `ID ${target.itemId}`;\n}\n\n// ── Words (every line ≤ 60 characters) ──────────────────────────────────────\n\nexport type Tone = \"success\" | \"warning\";\nexport interface Said {\n text: string;\n tone: Tone;\n}\n\nexport const BLOCK_WORDS: Record<PageBlock, string> = {\n restricted: \"This page can’t be filled. Open a site’s sign-in page.\",\n unavailable: \"Filling isn’t available on this page right now.\",\n no_field: \"Click the username or password box, then Fill.\",\n matching_off: \"Turn on login matching in extension settings.\",\n checking: \"Checking this page…\",\n};\n\nexport const MATCH_ERROR_WORDS: Record<PageMatchError, string> = {\n sign_in_required: \"Sign in to see logins for this site.\",\n forbidden: \"The vault refused this request.\",\n fill_setup_required: \"Turn on filling in this browser first.\",\n server_error: \"Saved logins couldn’t be checked.\",\n};\n\nexport const FILL_WORDS: Record<FillOutcome, Said> = {\n filled: { text: \"Filled. Check the form, then sign in.\", tone: \"success\" },\n partial: { text: \"Some boxes didn’t fill. Check them first.\", tone: \"warning\" },\n no_field: { text: \"Click the username or password box, then Fill.\", tone: \"warning\" },\n unavailable: { text: \"Filling isn’t available on this page right now.\", tone: \"warning\" },\n not_started: { text: \"Couldn’t start. Click the login box, then Fill.\", tone: \"warning\" },\n};\n\nexport const SIGN_IN_WORDS: Record<SignInOutcome, Said> = {\n signed_in: { text: \"Signed in.\", tone: \"success\" },\n needs_code: { text: \"Signed in. Finish the check on the page.\", tone: \"success\" },\n challenge: { text: \"The site wants a check. Finish it, then retry.\", tone: \"warning\" },\n rejected: { text: \"The site rejected that login.\", tone: \"warning\" },\n several: { text: \"Several logins match. Pick one to fill.\", tone: \"warning\" },\n no_match: { text: \"No login is turned on for this page.\", tone: \"warning\" },\n unsafe: { text: \"Only https pages can be signed in to.\", tone: \"warning\" },\n signed_out: { text: \"Sign in to AI Matrx first.\", tone: \"warning\" },\n unsupported: { text: \"This browser can’t sign in for you yet.\", tone: \"warning\" },\n unknown: { text: \"Couldn’t confirm the sign-in. Check the page.\", tone: \"warning\" },\n};\n\n/** null = say nothing (a dismissal). */\nexport const CAPTURE_WORDS: Record<CaptureResult, Said | null> = {\n saved: { text: \"Saved to your vault.\", tone: \"success\" },\n updated: { text: \"Login updated.\", tone: \"success\" },\n dismissed: null,\n never: { text: \"Won’t ask again for this site.\", tone: \"success\" },\n expired: { text: \"That prompt expired. Save it by hand.\", tone: \"warning\" },\n sign_in_required: { text: \"Sign in to AI Matrx first.\", tone: \"warning\" },\n error: { text: \"That didn’t work. Try again.\", tone: \"warning\" },\n};\n\nexport function fillSetupError(r: Exclude<FillSetupResult, { ok: true }>): string {\n if (r.reason === \"sign_in_required\") return \"Sign in to AI Matrx first.\";\n if (r.reason === \"not_approved\") return \"Not approved yet. Approve it, then come back.\";\n return r.message?.trim() || \"That didn’t work. Try again.\";\n}\n\nexport const FIND_WORDS: Record<Exclude<NewPasswordFind[\"status\"], \"ready\">, string> = {\n none: \"No new-password box on this page. Copy it instead.\",\n stale: \"The page changed. Generate again.\",\n unavailable: \"This page can’t be reached. Copy it instead.\",\n unsafe: \"Only https pages can be filled. Copy it instead.\",\n};\n\nexport const NEW_PASSWORD_WORDS: Record<NewPasswordFillOutcome, Said> = {\n filled: { text: \"Password filled. Save the form on the page.\", tone: \"success\" },\n partial: { text: \"Some boxes didn’t fill. Check them first.\", tone: \"warning\" },\n stale: { text: \"The page changed. Generate again.\", tone: \"warning\" },\n unavailable: { text: \"This page can’t be reached right now.\", tone: \"warning\" },\n refused: { text: \"Those boxes can’t take this password.\", tone: \"warning\" },\n};\n\n/** Where a target's boxes are, in a few words: `github.com` or `github.com (frame)`. */\nexport function targetLabel(t: { origin: string; topFrame: boolean; fieldCount: number }): string {\n const site = pageSite(t.origin) || t.origin;\n return `${site}${t.topFrame ? \"\" : \" (frame)\"} · ${t.fieldCount} ${t.fieldCount === 1 ? \"box\" : \"boxes\"}`;\n}\n","/**\n * \"Use here\": add the tab's page to a login's websites and turn browser fill on, so the next visit\n * matches. Draws nothing when the page already matches, cannot be filled, or the person cannot edit.\n */\nimport { useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { PlusGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport { useNotify } from \"../notice\";\nimport type { VaultPort } from \"../port\";\nimport { coversPage, isFillablePage, pageSite, withPageAdded } from \"./page-logic\";\n\nexport interface UseOnSiteButtonProps {\n port: VaultPort;\n item: VaultItem;\n /** The tab's address (`host.page.url`). */\n pageUrl: string;\n /** The item as the server now has it. */\n onChanged: (next: VaultItem) => void;\n}\n\n/** True when \"Use here\" would change anything for this item on this page. */\nexport function canUseOnSite(item: VaultItem, pageUrl: string): boolean {\n return item.capabilities.canEdit && isFillablePage(pageUrl) && !coversPage(item.loginUrls, item.uriMatchMode, pageUrl);\n}\n\nexport function UseOnSiteButton({ port, item, pageUrl, onChanged }: UseOnSiteButtonProps) {\n const notify = useNotify();\n const [busy, setBusy] = useState(false);\n if (!canUseOnSite(item, pageUrl)) return null;\n const site = pageSite(pageUrl);\n const run = async () => {\n setBusy(true);\n try {\n const next = await port.fields.updateItem(item, { loginUrls: [...withPageAdded(item.loginUrls, pageUrl)], browserFillEnabled: true });\n onChanged(next);\n notify(`Now fills on ${site}`);\n } catch (e) {\n notify(e instanceof Error ? e.message : \"The website couldn’t be added.\", \"error\");\n } finally {\n setBusy(false);\n }\n };\n return (\n <Button variant=\"outline\" icon={<PlusGlyph />} disabled={busy} onClick={() => void run()} title={`Fill this login on ${site}`}>\n Use here\n </Button>\n );\n}\n","/**\n * WHO HAS ACCESS (`?panel=share`). The list LOADS first, then every change touches ONE entry —\n * adding, changing or removing a person never rewrites anybody else (the old \"save the whole list\"\n * panel silently revoked everyone it had not loaded; never bring that back). Common first: the list\n * and \"add a person\". Rare on demand: sharing into an organization and member vault access.\n */\nimport { useEffect, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Button, DisclosureHeader, Field, RegionSkeleton, Select } from \"@ai-matrx/design-system/controls\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { BuildingGlyph, PersonGlyph, UsersGlyph, XGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport type { VaultPort } from \"../port\";\nimport { Empty, Panel, Section } from \"../ui\";\nimport { isEmail, LEVEL_OPTIONS, MEMBER_ACCESS_LABEL, MEMBER_CHOICE_DEFAULT, shareSummary, type MemberChoice } from \"./logic\";\nimport { AccessLine, message, StatusLine, useAction } from \"./parts\";\nimport type { MemberAccessList, ShareGrant, ShareLevel } from \"./port\";\n\nexport { MovePanel } from \"./MovePanel\";\n\nfunction useGrants(port: VaultPort, item: VaultItem) {\n const [grants, setGrants] = useState<ShareGrant[] | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const [nonce, setNonce] = useState(0);\n const allowed = item.capabilities.canManage;\n useEffect(() => {\n if (!allowed) return;\n let live = true;\n setLoadError(null);\n port.sharing.grants(item).then(\n (g) => live && setGrants(g),\n (e: unknown) => live && setLoadError(message(e, \"The access list could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [port, item, allowed, nonce]);\n return { grants, setGrants, loadError, reload: () => setNonce((n) => n + 1) };\n}\n\nexport function SharePanel({ item, port, organizations, onClose, onChanged }: ItemPanelProps) {\n const { grants, setGrants, loadError, reload } = useGrants(port, item);\n const { busy, error, notice, run } = useAction();\n const [email, setEmail] = useState(\"\");\n const [level, setLevel] = useState<ShareLevel>(\"use\");\n const [more, setMore] = useState(false);\n const isOrg = item.owner.kind === \"organization\" && item.owner.organizationId !== null;\n const orgName = item.owner.label;\n const people = (grants ?? []).filter((g) => g.kind === \"person\");\n\n const add = async () => {\n const to = email.trim();\n if (!isEmail(to)) return;\n const g = await run(\"add\", () => port.sharing.addPerson(item, to, level), `Shared with ${to}`);\n if (!g) return;\n setGrants((all) => [...(all ?? []).filter((x) => x.id !== g.id), g]);\n setEmail(\"\");\n setLevel(\"use\");\n };\n\n const change = async (g: ShareGrant, next: ShareLevel) => {\n if (next === g.level) return;\n const updated = await run(g.id, () => port.sharing.setLevel(item, g, next));\n if (updated) setGrants((all) => (all ?? []).map((x) => (x.id === g.id ? { ...updated, label: updated.label || g.label } : x)));\n };\n\n const revoke = async (g: ShareGrant) => {\n const ok = await confirm({\n title: g.kind === \"organization\" ? `Remove from ${g.label}?` : \"Remove access?\",\n description: g.kind === \"organization\" ? `${g.label} members can no longer use \"${item.name}\". It stays in your vault.` : `${g.label} can no longer use \"${item.name}\". This takes effect at once.`,\n confirmLabel: \"Remove\",\n variant: \"destructive\",\n });\n if (!ok) return;\n const done = await run(g.id, async () => {\n await port.sharing.revoke(item, g);\n return true;\n }, `${g.label} removed`);\n if (done) setGrants((all) => (all ?? []).filter((x) => x.id !== g.id));\n };\n\n const setMode = async (mode: \"all_members\" | \"restricted\") => {\n if (mode === (item.accessMode === \"restricted\" ? \"restricted\" : \"all_members\")) return;\n if (mode === \"all_members\" && people.length > 0) {\n const ok = await confirm({\n title: \"Open to every member?\",\n description: `Every member of ${orgName} gets it at their own vault access. The ${people.length === 1 ? \"person\" : `${people.length} people`} listed here lose their own access.`,\n confirmLabel: \"Open to members\",\n variant: \"destructive\",\n });\n if (!ok) return;\n }\n const next = await run(\"mode\", () => port.sharing.setAccessMode(item, mode, people), mode === \"restricted\" ? \"Only the people listed\" : \"Every member has access\");\n if (next) {\n onChanged(next);\n reload();\n }\n };\n\n if (!item.capabilities.canManage) {\n return (\n <Panel title=\"Share\" size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Done</Button>}>\n <Section>\n <Empty>Only the owner can change who has access.</Empty>\n </Section>\n </Panel>\n );\n }\n\n return (\n <Panel\n title=\"Share\"\n size=\"md\"\n onClose={onClose}\n footer={\n <div className=\"flex w-full items-center gap-2\">\n <StatusLine error={error} notice={notice} />\n <Button variant=\"primary\" className=\"ml-auto\" onClick={onClose}>Done</Button>\n </div>\n }\n >\n <Section title=\"Who has access\">\n {isOrg ? <AccessLine glyph={BuildingGlyph} who={`${orgName} admins`}><span className=\"px-2 text-sm text-muted-foreground\">Full access</span></AccessLine> : <AccessLine glyph={PersonGlyph} who=\"You\" meta=\"Owner\"><span className=\"px-2 text-sm text-muted-foreground\">Full access</span></AccessLine>}\n {isOrg ? (\n <AccessLine glyph={UsersGlyph} who={`${orgName} members`}>\n <Select\n variant=\"inline\"\n align=\"end\"\n aria-label=\"Which members can use it\"\n disabled={busy !== null}\n value={item.accessMode === \"restricted\" ? \"restricted\" : \"all_members\"}\n onValueChange={(v) => void setMode(v)}\n options={[\n { value: \"all_members\", label: \"Everyone\", meta: \"At their own vault access\" },\n { value: \"restricted\", label: \"Only listed\", meta: \"Only the people below\" },\n ]}\n />\n </AccessLine>\n ) : null}\n {loadError ? (\n <AccessLine glyph={XGlyph} who={<span className=\"text-destructive\">{loadError}</span>}>\n <Button variant=\"quiet\" onClick={reload}>Retry</Button>\n </AccessLine>\n ) : grants === null ? (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading who has access\" className=\"px-3 sm:px-4\" />\n ) : (\n grants.map((g) => (\n <AccessLine key={g.id} glyph={g.kind === \"organization\" ? BuildingGlyph : PersonGlyph} who={g.label} {...(g.kind === \"organization\" ? { meta: \"Organization vault\" } : {})}>\n <Select variant=\"inline\" align=\"end\" aria-label={`What ${g.label} can do`} disabled={busy !== null} value={g.level} onValueChange={(v) => void change(g, v)} options={LEVEL_OPTIONS} />\n <Button variant=\"quiet\" removes icon={<XGlyph />} aria-label={`Remove ${g.label}`} disabled={busy !== null} onClick={() => void revoke(g)} />\n </AccessLine>\n ))\n )}\n <div className=\"flex min-h-11 items-center gap-2 px-3 sm:px-4\">\n <PersonGlyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <Field\n className=\"min-w-0 flex-1\"\n type=\"email\"\n inputMode=\"email\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"Email address\"\n aria-label=\"Their exact email\"\n value={email}\n disabled={busy === \"add\"}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void add();\n }\n }}\n />\n <Select variant=\"inline\" align=\"end\" aria-label=\"What they can do\" value={level} onValueChange={setLevel} options={LEVEL_OPTIONS} />\n <Button variant=\"primary\" disabled={busy !== null || !isEmail(email)} onClick={() => void add()}>Share</Button>\n </div>\n </Section>\n\n <div className=\"flex flex-col gap-3\">\n <DisclosureHeader open={more} title=\"More options\" onClick={() => setMore((o) => !o)} />\n {more ? (\n isOrg && item.owner.organizationId ? (\n <MemberAccess port={port} organizationId={item.owner.organizationId} organizationName={orgName} />\n ) : (\n <IntoOrganization item={item} port={port} organizations={organizations} grants={grants ?? []} onShared={(g) => setGrants((all) => [...(all ?? []).filter((x) => x.id !== g.id), g])} />\n )\n ) : null}\n </div>\n </Panel>\n );\n}\n\n/** Share a personal item into one of the owner's organizations; it then lives in both vaults. */\nfunction IntoOrganization({ item, port, organizations, grants, onShared }: { item: VaultItem; port: VaultPort; organizations: ItemPanelProps[\"organizations\"]; grants: readonly ShareGrant[]; onShared: (g: ShareGrant) => void }) {\n const { busy, error, notice, run } = useAction();\n const open = organizations.filter((o) => !grants.some((g) => g.organizationId === o.id));\n const [target, setTarget] = useState<string>(\"\");\n const [level, setLevel] = useState<ShareLevel>(\"use\");\n const chosen = open.find((o) => o.id === target);\n\n if (item.owner.kind !== \"me\") return null;\n return (\n <Section title=\"Share into organization\">\n {open.length > 0 ? (\n <>\n <div className=\"flex min-h-11 items-center gap-2 px-3 sm:px-4\">\n <BuildingGlyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <Select className=\"min-w-0 flex-1\" aria-label=\"Organization\" value={target || \"__none__\"} onValueChange={(v) => setTarget(v === \"__none__\" ? \"\" : v)} options={[{ value: \"__none__\", label: \"Choose an organization\" }, ...open.map((o) => ({ value: o.id, label: o.name }))]} />\n <Select variant=\"inline\" align=\"end\" aria-label=\"What its members can do\" value={level} onValueChange={setLevel} options={LEVEL_OPTIONS} />\n <Button\n variant=\"outline\"\n disabled={busy !== null || !chosen}\n onClick={async () => {\n if (!chosen) return;\n const g = await run(\"org\", () => port.sharing.addOrganization(item, chosen.id, level), `Shared into ${chosen.name}`);\n if (g) {\n onShared({ ...g, label: g.label === \"Organization\" ? chosen.name : g.label });\n setTarget(\"\");\n }\n }}\n >\n Share\n </Button>\n </div>\n <p className=\"truncate px-3 pb-1 text-xs text-muted-foreground sm:px-4\">{error ? <span className=\"text-destructive\">{error}</span> : notice ? <span className=\"text-success\">{notice}</span> : \"It stays yours; its members can use it too\"}</p>\n </>\n ) : (\n <Empty>{organizations.length ? \"Already in every organization you belong to.\" : \"You are not in any organization.\"}</Empty>\n )}\n </Section>\n );\n}\n\nconst CHOICES: readonly { value: MemberChoice; label: string; meta?: string }[] = [\n { value: MEMBER_CHOICE_DEFAULT, label: \"Default\" },\n { value: \"none\", label: \"No access\" },\n { value: \"use\", label: \"Can use\", meta: \"Sign in, never see passwords\" },\n { value: \"editor\", label: \"Can edit\", meta: \"See and change\" },\n];\n\n/** Each member's access to the organization's WHOLE vault (owners and admins set it). */\nfunction MemberAccess({ port, organizationId, organizationName }: { port: VaultPort; organizationId: string; organizationName: string }) {\n const [list, setList] = useState<MemberAccessList | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n const { busy, error, run } = useAction();\n\n useEffect(() => {\n let live = true;\n port.sharing.memberAccess(organizationId).then(\n (l) => live && setList(l),\n (e: unknown) => live && setLoadError((e as { status?: number } | null)?.status === 403 ? \"Only owners and admins see member access.\" : message(e, \"Member access could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [port, organizationId]);\n\n const set = async (userId: string, choice: MemberChoice) => {\n const access = choice === MEMBER_CHOICE_DEFAULT ? null : choice;\n const effective = await run(userId, () => port.sharing.setMemberAccess(organizationId, userId, access));\n if (effective) setList((l) => (l ? { ...l, members: l.members.map((m) => (m.userId === userId ? { ...m, access, effective } : m)) } : l));\n };\n\n return (\n <Section title={`${organizationName} vault access`}>\n {loadError ? (\n <Empty>{loadError}</Empty>\n ) : list === null ? (\n <RegionSkeleton shape=\"rows\" count={3} aria-label=\"Loading member access\" className=\"px-3 sm:px-4\" />\n ) : list.members.length === 0 ? (\n <Empty>No members yet.</Empty>\n ) : (\n list.members.map((m) => (\n <AccessLine key={m.userId} glyph={PersonGlyph} who={m.email || m.userId} meta={m.role}>\n {m.effective === \"admin\" ? (\n <span className=\"px-2 text-sm text-muted-foreground\">{MEMBER_ACCESS_LABEL.admin}</span>\n ) : (\n <Select\n variant=\"inline\"\n align=\"end\"\n aria-label={`${m.email || \"Member\"}'s vault access`}\n disabled={busy !== null}\n value={m.access ?? MEMBER_CHOICE_DEFAULT}\n onValueChange={(v) => void set(m.userId, v)}\n options={CHOICES.map((c) => (c.value === MEMBER_CHOICE_DEFAULT ? { value: c.value, label: `Default (${MEMBER_ACCESS_LABEL[list.defaultAccess]})` } : c.meta ? { value: c.value, label: c.label, meta: c.meta } : { value: c.value, label: c.label }))}\n />\n )}\n </AccessLine>\n ))\n )}\n <p className=\"truncate px-3 pb-1 text-xs text-muted-foreground sm:px-4\">{error ? <span className=\"text-destructive\">{error}</span> : \"Applies to every item in this organization\"}</p>\n </Section>\n );\n}\n\n/**\n * A one-line \"Shared with 3 people\" for the item header. Renders nothing when the person cannot\n * manage the item (the list is owner information) or nobody else has access.\n */\nexport function SharingSummary({ item, port, className }: { item: VaultItem; port: VaultPort; className?: string }) {\n const [text, setText] = useState(\"\");\n const allowed = item.capabilities.canManage;\n useEffect(() => {\n if (!allowed) return;\n let live = true;\n port.sharing.grants(item).then(\n (g) => live && setText(shareSummary(g)),\n () => live && setText(\"\"),\n );\n return () => {\n live = false;\n };\n }, [port, item, allowed]);\n if (!allowed || !text) return null;\n return <span className={cn(\"truncate text-xs text-muted-foreground\", className)}>{text}</span>;\n}\n","/** The sharing area's pure rules: levels, labels, destinations and the consequence of each move. */\nimport type { VaultItem, VaultOrganizationRef } from \"../model\";\nimport type { EffectiveVaultAccess, MemberVaultAccess, ShareLevel, VaultDestination } from \"./port\";\n\nexport const LEVEL_LABEL: Record<ShareLevel, string> = { use: \"Can use\", edit: \"Can edit\" };\nexport const LEVEL_OPTIONS: readonly { value: ShareLevel; label: string; meta: string }[] = [\n { value: \"use\", label: \"Can use\", meta: \"Sign in, never see the password\" },\n { value: \"edit\", label: \"Can edit\", meta: \"Show and change values\" },\n];\n\nexport const MEMBER_ACCESS_LABEL: Record<EffectiveVaultAccess, string> = { none: \"No access\", use: \"Can use\", editor: \"Can edit\", admin: \"Full access\" };\n\n/** A grant's level from the server's two flags. `can_manage` on a grant is reveal + edit, never manage. */\nexport function levelOf(flags: { can_use?: boolean | null; can_manage?: boolean | null }): ShareLevel {\n return flags.can_manage ? \"edit\" : \"use\";\n}\n\nexport function flagsOf(level: ShareLevel): { can_use: true; can_manage: boolean } {\n return { can_use: true, can_manage: level === \"edit\" };\n}\n\n/** Exact email only: the server resolves it; there is no directory search. */\nexport function isEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value.trim());\n}\n\n/** Key for a destination in a Select (`personal` or the organization id). */\nexport const PERSONAL = \"personal\";\nexport const destinationOf = (key: string): VaultDestination => (key === PERSONAL ? null : key);\nexport const keyOf = (d: VaultDestination): string => d ?? PERSONAL;\n\n/** Where an item can MOVE: anywhere it is not already. Shared-with-me items move nowhere. */\nexport function moveDestinations(item: VaultItem, orgs: readonly VaultOrganizationRef[]): { value: string; label: string }[] {\n if (item.owner.kind === \"shared\") return [];\n const here = item.owner.organizationId;\n return [...(here ? [{ value: PERSONAL, label: \"Personal\" }] : []), ...orgs.filter((o) => o.id !== here).map((o) => ({ value: o.id, label: o.name }))];\n}\n\n/**\n * Where an item can be COPIED: the person's own vault or any organization — except the vault it is\n * already in, where the server refuses a second active copy.\n */\nexport function copyDestinations(orgs: readonly VaultOrganizationRef[], item?: Pick<VaultItem, \"owner\">): { value: string; label: string }[] {\n const here = item ? (item.owner.kind === \"me\" ? PERSONAL : item.owner.organizationId) : undefined;\n return [{ value: PERSONAL, label: \"Personal\" }, ...orgs.map((o) => ({ value: o.id, label: o.name }))].filter((d) => d.value !== here);\n}\n\n/** The server's words for a refused copy, said plainly. */\nexport function copyRefusal(message: string): string | null {\n return /duplicate/i.test(message) ? \"There is already a copy of this item there.\" : null;\n}\n\n/** Native passkeys never change hands: the server refuses to move, give or copy them. */\nexport const isPasskey = (item: Pick<VaultItem, \"definitionKey\">) => item.definitionKey === \"native_passkey\" || item.definitionKey === \"passkey_private\";\n\n/** What moving does, said before the click (≤ 60 characters). */\nexport function moveConsequence(item: VaultItem, to: VaultDestination): string {\n if (item.authenticator) return \"One-time password stays behind; set it up again\";\n return to ? \"Its members get access; people you shared with lose it\" : \"Only you; organization members lose access\";\n}\n\n/** What giving ownership does, in full, for the confirmation. */\nexport function giveDescription(item: VaultItem, email: string): string {\n const otp = item.authenticator ? \" Its one-time password does not move; they set it up again.\" : \"\";\n return `\"${item.name}\" moves to ${email}'s vault. You lose all access at once and everyone you shared it with loses theirs. A password you have already seen stays known; change it afterwards if that matters.${otp}`;\n}\n\n/** Field keys as people read them (\"totp_secret\" → \"Totp secret\"). */\nexport function fieldNames(keys: readonly string[]): string {\n return keys.map((k) => k.replace(/[_-]+/g, \" \").replace(/^\\w/, (c) => c.toUpperCase())).join(\", \");\n}\n\n/** A short count for the item header: \"Shared with 3 people\", \"Shared with 1 person and Acme\". */\nexport function shareSummary(grants: readonly { kind: \"person\" | \"organization\"; label: string }[]): string {\n const people = grants.filter((g) => g.kind === \"person\").length;\n const orgs = grants.filter((g) => g.kind === \"organization\").map((g) => g.label);\n if (people === 0 && orgs.length === 0) return \"\";\n const p = people ? `${people} ${people === 1 ? \"person\" : \"people\"}` : \"\";\n const o = orgs.length === 1 ? orgs[0] ?? \"\" : orgs.length > 1 ? `${orgs.length} organizations` : \"\";\n return `Shared with ${[p, o].filter(Boolean).join(\" and \")}`;\n}\n\nexport const MEMBER_CHOICE_DEFAULT = \"default\";\nexport type MemberChoice = MemberVaultAccess | typeof MEMBER_CHOICE_DEFAULT;\n","import { copyRefusal } from \"./logic\";\n/** The sharing area's shared pieces: one-change-at-a-time actions, the access line, the status line. */\nimport { useState, type ReactNode } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { Glyph } from \"../glyphs\";\n\nexport const message = (e: unknown, fallback: string) => {\n const m = e instanceof Error && e.message ? e.message : fallback;\n return copyRefusal(m) ?? m;\n};\n\n/** Runs one change at a time: shows it busy, reports failure in the panel, stays quiet on a cancelled confirmation. */\nexport function useAction() {\n const confirmed = useConfirmed();\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n async function run<T>(key: string, fn: () => Promise<T>, done?: string): Promise<T | undefined> {\n setBusy(key);\n setError(null);\n setNotice(null);\n try {\n const out = await confirmed(fn);\n if (done) setNotice(done);\n return out;\n } catch (e) {\n if (!wasCancelled(e)) setError(message(e, \"That did not go through.\"));\n return undefined;\n } finally {\n setBusy(null);\n }\n }\n return { busy, error, notice, run, setNotice };\n}\n\n/** One line on an access list: glyph · who · (muted meta) · controls. Space between lines, never rules. */\nexport function AccessLine({ glyph: G, who, meta, children }: { glyph: Glyph; who: ReactNode; meta?: ReactNode; children?: ReactNode }) {\n return (\n <div className=\"flex min-h-11 items-center gap-2 px-3 sm:px-4\">\n <G className=\"size-4 shrink-0 text-muted-foreground\" />\n <div className=\"flex min-w-0 flex-1 items-baseline gap-2\">\n <span className=\"truncate text-sm text-foreground\">{who}</span>\n {meta ? <span className=\"shrink-0 text-xs text-muted-foreground\">{meta}</span> : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-0.5\">{children}</div>\n </div>\n );\n}\n\n/** The panel's one status line: what failed, or what just happened. */\nexport function StatusLine({ error, notice }: { error: string | null; notice: string | null }) {\n if (!error && !notice) return null;\n return <p className={cn(\"min-w-0 flex-1 line-clamp-2 text-sm\", error ? \"text-destructive\" : \"text-success\")} title={error ?? notice ?? undefined}>{error ?? notice}</p>;\n}\n","/**\n * MOVE, GIVE, COPY (`?panel=move`). Three different things, each saying what it does before the\n * click: Move keeps the same item (every reference keeps working) in another of YOUR vaults; Give\n * hands it to another person and you lose it; Copy makes a separate item whose values can drift.\n */\nimport { useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Button, Field, Select } from \"@ai-matrx/design-system/controls\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { copyDestinations, destinationOf, fieldNames, giveDescription, isEmail, isPasskey, moveConsequence, moveDestinations } from \"./logic\";\nimport { StatusLine, useAction } from \"./parts\";\n\n/** \"Nothing chosen yet\": a move or copy never starts pointed at a destination. */\nconst NONE = \"__none__\";\n\nexport function MovePanel({ item, port, organizations, onClose, onChanged }: ItemPanelProps) {\n const { busy, error, notice, run, setNotice } = useAction();\n const moves = moveDestinations(item, organizations);\n const copies = copyDestinations(organizations, item);\n const [moveTo, setMoveTo] = useState(\"\");\n const [copyTo, setCopyTo] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n\n const passkey = isPasskey(item);\n const canMove = item.capabilities.canManage && !passkey && moves.length > 0;\n // Giving away is for an item the person owns outright; an organization's item is moved, not given.\n const canGive = item.capabilities.canManage && item.owner.kind === \"me\" && !passkey;\n const canCopy = item.capabilities.canEdit && !passkey;\n const moveChoice = moves.find((d) => d.value === moveTo);\n const copyChoice = copies.find((d) => d.value === copyTo);\n\n const move = async () => {\n if (!moveChoice) return;\n const to = destinationOf(moveChoice.value);\n const ok = await confirm({\n title: `Move to ${moveChoice.label}?`,\n description: `\"${item.name}\" stays the same item, so everything using it keeps working. ${moveConsequence(item, to)}.`,\n confirmLabel: \"Move\",\n });\n if (!ok) return;\n const out = await run(\"move\", () => port.sharing.move(item, to));\n if (!out) return;\n onChanged(out.item);\n // Something left behind (the one-time-password seed) is said here; otherwise the move is done.\n if (out.notMoved.length > 0) setNotice(`Moved to ${moveChoice.label}. Not moved: ${fieldNames(out.notMoved)}`);\n else onClose();\n };\n\n const give = async () => {\n const to = email.trim();\n if (!isEmail(to)) return;\n const ok = await confirm({ title: \"Give ownership away?\", description: giveDescription(item, to), confirmLabel: \"Give ownership\", variant: \"destructive\" });\n if (!ok) return;\n const out = await run(\"give\", () => port.sharing.giveOwnership(item, to));\n if (!out) return;\n onClose();\n onChanged(null);\n };\n\n const copy = async () => {\n if (!copyChoice) return;\n const made = await run(\"copy\", () => port.sharing.copy(item, destinationOf(copyChoice.value)), `Copy made in ${copyChoice.label}`);\n if (made) onChanged();\n };\n\n const nothing = !canMove && !canGive && !canCopy;\n\n return (\n <Panel\n title=\"Move or copy\"\n size=\"md\"\n onClose={onClose}\n footer={\n <div className=\"flex w-full items-center gap-2\">\n <StatusLine error={error} notice={notice} />\n <Button variant=\"outline\" className=\"ml-auto\" onClick={onClose}>Close</Button>\n </div>\n }\n >\n {nothing ? (\n <Section>\n <Empty>{passkey ? \"A passkey stays where it was created.\" : \"Only the owner can move or give this item.\"}</Empty>\n </Section>\n ) : (\n <Section>\n {canMove && moves.length > 0 ? (\n <Row\n label=\"Move to\"\n hint={moveChoice ? moveConsequence(item, destinationOf(moveChoice.value)) : undefined}\n actions={<Button variant=\"outline\" disabled={busy !== null || !moveChoice} onClick={() => void move()}>Move</Button>}\n >\n <Select className=\"w-full\" aria-label=\"Move to\" value={moveTo || NONE} onValueChange={(v) => setMoveTo(v === NONE ? \"\" : v)} options={[{ value: NONE, label: \"Choose where\" }, ...moves]} />\n </Row>\n ) : null}\n {canGive ? (\n <Row label=\"Give to\" hint=\"You lose all access; your shares end\" actions={<Button variant=\"danger\" disabled={busy !== null || !isEmail(email)} onClick={() => void give()}>Give</Button>}>\n <Field\n className=\"w-full\"\n type=\"email\"\n inputMode=\"email\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"Their exact email\"\n aria-label=\"Give ownership to\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </Row>\n ) : null}\n {canCopy && copies.length > 0 ? (\n <Row label=\"Copy to\" hint=\"A separate item; edits no longer sync\" actions={<Button variant=\"outline\" disabled={busy !== null || !copyChoice} onClick={() => void copy()}>Copy</Button>}>\n <Select className=\"w-full\" aria-label=\"Copy to\" value={copyTo || NONE} onValueChange={(v) => setCopyTo(v === NONE ? \"\" : v)} options={[{ value: NONE, label: \"Choose where\" }, ...copies]} />\n </Row>\n ) : null}\n </Section>\n )}\n </Panel>\n );\n}\n","import { useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport type { VaultViewProps } from \"../area-props\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { RestoreGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport { Empty, Section, formatDate } from \"../ui\";\nimport { matchesQuery, restoreFailure } from \"./logic\";\nimport type { RestoreResult } from \"./port\";\nimport { RestorePanel } from \"./RestorePanel\";\n\n/** Deleted items, with Restore. The server keeps them until they are recovered. */\nexport function TrashView({ port, deleted, query, header, onChanged }: VaultViewProps) {\n const confirmed = useConfirmed();\n const [busyId, setBusyId] = useState<string | null>(null);\n const [message, setMessage] = useState<{ tone: \"ok\" | \"error\"; text: string } | null>(null);\n const shown = deleted.filter((i) => matchesQuery(i, query));\n\n const [restoring, setRestoring] = useState<VaultItem | null>(null);\n\n /** Runs inside the restore panel, which shows a failure itself; the trash line only says what landed. */\n const restore = async (item: VaultItem, deletionId?: string): Promise<RestoreResult | null> => {\n setBusyId(item.id);\n setMessage(null);\n try {\n const r = await confirmed(() => port.lists.restore(item, deletionId));\n setMessage({ tone: \"ok\", text: r.alreadyRestored ? `\"${item.name}\" was already restored.` : `Restored \"${item.name}\" with ${r.restoredFields} fields and ${r.restoredAttachments} files. It is turned off.` });\n onChanged();\n return r;\n } catch (e) {\n if (wasCancelled(e)) return null;\n throw new Error(restoreFailure(e));\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto p-3\">\n {header}\n <Section title=\"Trash\">\n {shown.length === 0 ? (\n <Empty>{deleted.length === 0 ? \"The trash is empty.\" : \"Nothing matches.\"}</Empty>\n ) : (\n shown.map((item) => (\n // A list row, not a field row: the name gets the whole width (on a phone a label column\n // left \"Vau…\" for every row), the deletion date sits under it.\n <div key={item.id} className=\"flex min-h-12 items-center gap-3 px-3 py-1.5 sm:px-4\">\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm text-foreground\">{item.name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{[item.deletion?.deletedAt ? `Deleted ${formatDate(item.deletion.deletedAt)}` : null, item.owner.kind !== \"me\" ? item.owner.label : null].filter(Boolean).join(\" · \")}</span>\n </span>\n <Button variant=\"outline\" icon={<RestoreGlyph />} disabled={busyId !== null || !item.deletion} onClick={() => setRestoring(item)}>\n Restore\n </Button>\n </div>\n ))\n )}\n </Section>\n {restoring ? <RestorePanel lists={port.lists} item={restoring} restore={(deletionId) => restore(restoring, deletionId)} onClose={() => setRestoring(null)} /> : null}\n {message ? <p role=\"status\" className={message.tone === \"error\" ? \"px-1 text-sm text-destructive\" : \"px-1 text-sm text-muted-foreground\"}>{message.text}</p> : null}\n </div>\n );\n}\n","import type { VaultItem } from \"../model\";\nimport type { RecoveryPreview, RecoveryRefusal } from \"./port\";\n\n/** The `credential_item` token the per-person state ledger files vault items under. */\nexport const ENTITY_TYPE = \"credential_item\";\n\nexport interface StateRow {\n entity_type?: string | null;\n entity_id?: string | null;\n is_favorite?: boolean | null;\n last_viewed_at?: string | null;\n}\n\nconst rowsOf = (data: unknown): StateRow[] => (Array.isArray(data) ? (data as StateRow[]) : []).filter((r) => r && r.entity_type === ENTITY_TYPE && typeof r.entity_id === \"string\");\n\nexport function favoriteIds(data: unknown): string[] {\n return rowsOf(data).filter((r) => r.is_favorite === true).map((r) => r.entity_id as string);\n}\n\n/** Opened items, newest first. */\nexport function recentIds(data: unknown, limit = 50): string[] {\n return rowsOf(data)\n .filter((r) => typeof r.last_viewed_at === \"string\" && r.last_viewed_at !== \"\")\n .sort((a, b) => Date.parse(b.last_viewed_at as string) - Date.parse(a.last_viewed_at as string))\n .slice(0, limit)\n .map((r) => r.entity_id as string);\n}\n\n/** Trash search: name, type, owner, tags. */\nexport function matchesQuery(item: VaultItem, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n return [item.name, item.definitionLabel, item.owner.label, ...item.tags].some((s) => s.toLowerCase().includes(q));\n}\n\n/** A server refusal in words a person can act on. */\nexport function restoreFailure(e: unknown): string {\n const err = e as { status?: unknown; message?: unknown } | null;\n if (err?.status === 422) return \"This item can't be restored automatically. Its recovery data is kept.\";\n if (err?.status === 409) return \"This item changed since it was deleted. Reload the trash.\";\n return typeof err?.message === \"string\" && err.message ? err.message : \"Restore did not complete. Try again.\";\n}\n\nconst REFUSALS: readonly RecoveryRefusal[] = [\n \"recovery_tracking_unavailable\",\n \"recovery_manifest_unsupported\",\n \"protected_component_requires_native_recovery\",\n \"linked_component_requires_native_recovery\",\n \"native_recovery_unavailable\",\n \"native_components_missing\",\n \"native_components_conflict\",\n \"native_manifest_invalid\",\n];\nconst isRefusal = (v: unknown): v is RecoveryRefusal => (REFUSALS as readonly unknown[]).includes(v);\nconst isUuid = (v: unknown): v is string => typeof v === \"string\" && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(v);\nconst isCount = (v: unknown): v is number => typeof v === \"number\" && Number.isInteger(v) && v >= 0;\nconst INCOMPLETE = \"Recovery details were incomplete. Reload Trash and try again.\";\n\n/** The `vault_recovery_preview` answer, checked field by field. A shape that doesn't hold is an error, never a guess. */\nexport function parseRecoveryPreview(raw: unknown): RecoveryPreview {\n if (!raw || typeof raw !== \"object\") throw new Error(\"Recovery details were unavailable. Reload Trash and try again.\");\n const r = raw as Record<string, unknown>;\n if (typeof r.supported !== \"boolean\") throw new Error(INCOMPLETE);\n const prior = r.prior_was_disabled;\n if (r.supported) {\n // Version 1 had no passkey count: absent means none, never \"unknown\".\n const passkeys = r.native_passkeys_count === undefined ? 0 : r.native_passkeys_count;\n if (!isCount(r.fields_count) || !isCount(r.attachments_count) || (passkeys !== 0 && passkeys !== 1) || (passkeys === 1 && r.fields_count < 1) || typeof prior !== \"boolean\" || !isUuid(r.deletion_id) || (r.reason ?? null) !== null) throw new Error(INCOMPLETE);\n return { supported: true, deletionId: r.deletion_id, fields: r.fields_count, attachments: r.attachments_count, passkeys, priorWasDisabled: prior };\n }\n const deletionId = r.deletion_id ?? null;\n if ((deletionId !== null && !isUuid(deletionId)) || (prior != null && typeof prior !== \"boolean\") || (r.fields_count ?? null) !== null || (r.attachments_count ?? null) !== null || !isRefusal(r.reason)) throw new Error(INCOMPLETE);\n return { supported: false, deletionId, reason: r.reason, priorWasDisabled: typeof prior === \"boolean\" ? prior : null };\n}\n\n/** Why this one can't be restored here. Its retained recovery data is never touched. */\nexport function refusalText(reason: RecoveryRefusal): string {\n switch (reason) {\n case \"recovery_tracking_unavailable\":\n return \"Deleted before recovery tracking began, so it can't be restored automatically. Its recovery data is kept.\";\n case \"recovery_manifest_unsupported\":\n return \"Its recovery record can't be restored automatically yet. Its recovery data is kept.\";\n case \"protected_component_requires_native_recovery\":\n return \"It holds protected material that can't be restored automatically yet. Its recovery data is kept.\";\n case \"linked_component_requires_native_recovery\":\n return \"It is linked to a provider or integration, so it can't be restored automatically yet. Its recovery data is kept.\";\n case \"native_recovery_unavailable\":\n return \"Passkey recovery is unavailable for now. Reload Trash and try again; nothing was changed.\";\n case \"native_components_missing\":\n return \"Its passkey recovery parts are no longer complete. Nothing was changed; reload Trash and look again.\";\n case \"native_components_conflict\":\n return \"Its passkey recovery parts no longer match. Nothing was changed; reload Trash and look again.\";\n case \"native_manifest_invalid\":\n return \"Its passkey recovery record is invalid. Nothing was changed; reload Trash and look again.\";\n }\n}\n","import { useEffect, useState } from \"react\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { RestoreGlyph } from \"../glyphs\";\nimport type { VaultItem } from \"../model\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport { refusalText } from \"./logic\";\nimport type { ListsPort, RecoveryPreview, RestoreResult } from \"./port\";\n\nconst count = (n: number, one: string) => `${n} ${one}${n === 1 ? \"\" : \"s\"}`;\n\n/**\n * Restore, with the answer to \"what comes back?\" first: the counts, what stays off, or why it\n * can't be restored here. Nothing changes until the Restore button.\n */\nexport function RestorePanel({ lists, item, restore, onClose }: { lists: ListsPort; item: VaultItem; restore: (deletionId?: string) => Promise<RestoreResult | null>; onClose: () => void }) {\n const [preview, setPreview] = useState<RecoveryPreview | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n // Without a preview door there is nothing to read; the restore itself still asks the server.\n const [loading, setLoading] = useState(Boolean(lists.preview));\n\n useEffect(() => {\n if (!lists.preview) return;\n let live = true;\n lists.preview(item).then(\n (p) => {\n if (!live) return;\n setPreview(p);\n setLoading(false);\n },\n (e: unknown) => {\n if (!live) return;\n setError(e instanceof Error && e.message ? e.message : \"Recovery could not be reviewed. Reload Trash and try again.\");\n setLoading(false);\n },\n );\n return () => {\n live = false;\n };\n }, [lists, item]);\n\n const refused = preview !== null && !preview.supported;\n const run = async () => {\n setBusy(true);\n setError(null);\n try {\n const result = await restore(preview?.supported ? preview.deletionId : undefined);\n if (result) onClose();\n } catch (e) {\n setError(e instanceof Error && e.message ? e.message : \"Restore did not complete. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Panel\n title={`Restore \"${item.name}\"`}\n size=\"md\"\n onClose={onClose}\n footer={\n <>\n <Button variant=\"quiet\" onClick={onClose}>\n {refused ? \"Close\" : \"Cancel\"}\n </Button>\n {refused ? null : (\n <Button variant=\"primary\" icon={<RestoreGlyph />} disabled={busy || loading || (lists.preview !== undefined && preview === null)} onClick={() => void run()}>\n {busy ? \"Restoring…\" : \"Restore\"}\n </Button>\n )}\n </>\n }\n >\n {loading ? (\n <Section>\n <Empty>Checking what comes back…</Empty>\n </Section>\n ) : preview?.supported ? (\n <Section title=\"Comes back\">\n <Row label=\"Fields\">\n <span className=\"text-foreground\">{count(preview.fields, \"field\")}</span>\n </Row>\n <Row label=\"Files\">\n <span className=\"text-foreground\">{count(preview.attachments, \"file\")}</span>\n </Row>\n {preview.passkeys === 1 ? (\n <Row label=\"Passkey\" hint=\"Not turned on; the site may not accept it\">\n <span className=\"text-foreground\">1 passkey</span>\n </Row>\n ) : null}\n <Row label=\"Stays off\" hint=\"Turn each back on yourself\">\n <span className=\"text-muted-foreground\">Sharing, browser fill, codes, sandboxes, agents</span>\n </Row>\n {preview.priorWasDisabled ? (\n <Row label=\"Before\">\n <span className=\"text-muted-foreground\">It was already off before it was deleted.</span>\n </Row>\n ) : null}\n </Section>\n ) : preview ? (\n <Section>\n <Empty>{refusalText(preview.reason)}</Empty>\n </Section>\n ) : (\n <Section>\n <Empty>It comes back turned off: sharing, browser fill, codes and sandbox use stay off.</Empty>\n </Section>\n )}\n {error ? (\n <p role=\"alert\" className=\"px-1 text-sm text-destructive\">\n {error}\n </p>\n ) : null}\n </Panel>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Button, Field, SearchField } from \"@ai-matrx/design-system/controls\";\nimport { COMMON_DEFINITION_KEYS, FAMILY_LABELS, inferFromUrl, type VaultDefinition } from \"./definitions\";\nimport { ChevronLeftGlyph, definitionGlyph, GlobeGlyph } from \"./glyphs\";\n\nexport interface NewItemFlowProps {\n definitions: readonly VaultDefinition[];\n /** The address typed or pasted so far. It lives in the page address, so it survives every step. */\n url: string;\n onUrl: (url: string) => void;\n /** A type was chosen (by hand or from the address). The address goes with it, recognised or not. */\n onChoose: (definitionKey: string, name: string, url: string) => void;\n onCancel: () => void;\n}\n\n/** Step one of \"New item\": paste an address and we work out what it is, or pick the kind by hand. */\nexport function NewItemFlow({ definitions, url, onUrl, onChoose, onCancel }: NewItemFlowProps) {\n const [search, setSearch] = useState(\"\");\n const guess = useMemo(() => inferFromUrl(url, definitions), [url, definitions]);\n const common = COMMON_DEFINITION_KEYS.map((k) => definitions.find((d) => d.key === k)).filter((d): d is VaultDefinition => d !== undefined);\n const matches = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return [];\n return definitions.filter((d) => `${d.label} ${d.key} ${d.providerKey ?? \"\"} ${FAMILY_LABELS[d.family] ?? \"\"}`.toLowerCase().includes(q)).slice(0, 60);\n }, [definitions, search]);\n\n const login = guess?.definitionKey ? definitions.find((d) => d.key === guess.definitionKey) : undefined;\n const alternatives = (guess?.alternatives ?? []).map((k) => definitions.find((d) => d.key === k)).filter((d): d is VaultDefinition => d !== undefined).slice(0, 4);\n // Whatever is chosen, the address typed so far goes with it — recognised or not.\n const use = (d: VaultDefinition) => onChoose(d.key, guess?.name ?? \"\", guess?.url ?? url.trim());\n const shown = search.trim() ? matches : common;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <header className=\"flex min-h-14 items-center gap-2 border-b border-border px-3 sm:px-5\">\n <Button variant=\"quiet\" icon={<ChevronLeftGlyph />} aria-label=\"Cancel\" onClick={onCancel} />\n <h2 className=\"text-base font-semibold\">New item</h2>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n <div className=\"mx-auto flex w-full max-w-2xl flex-col gap-8 px-4 py-8 sm:px-6 sm:py-12\">\n <div className=\"flex flex-col gap-3\">\n <Field\n hero\n value={url}\n onChange={(e) => onUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && login) use(login);\n }}\n placeholder=\"Paste a website address\"\n aria-label=\"Website address\"\n inputMode=\"url\"\n autoFocus\n icon={<GlobeGlyph />}\n />\n {guess && login ? (\n <div className=\"flex flex-col gap-2 rounded-xl border border-border bg-card p-3\">\n <div className=\"flex items-center gap-3\">\n <span aria-hidden className=\"flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-sm font-semibold\">{guess.name.charAt(0).toUpperCase()}</span>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{guess.name}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{guess.url.replace(/^https?:\\/\\//, \"\")}</span>\n </div>\n <Button variant=\"primary\" onClick={() => use(login)}>Save login</Button>\n </div>\n {alternatives.length > 0 ? (\n <div className=\"flex flex-wrap items-center gap-1.5 pl-12\">\n <span className=\"text-xs text-muted-foreground\">Or</span>\n {alternatives.map((d) => (\n <Button key={d.key} variant=\"outline\" onClick={() => use(d)}>\n {d.label}\n </Button>\n ))}\n </div>\n ) : null}\n </div>\n ) : url.trim() ? (\n <p className=\"px-1 text-sm text-muted-foreground\">Not a website address. Pick a type below; it is kept.</p>\n ) : null}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">{search.trim() ? \"Matching types\" : \"Or choose a type\"}</h3>\n </div>\n <ul className=\"grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {shown.map((d) => {\n const Icon = definitionGlyph(d.key, d.family);\n return (\n <li key={d.key}>\n <button type=\"button\" onClick={() => use(d)} className={cn(\"flex h-12 w-full items-center gap-3 rounded-xl border border-border bg-card px-3 text-left hover:bg-accent\")}>\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted\">\n <Icon className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\">{d.label}</span>\n </button>\n </li>\n );\n })}\n </ul>\n {search.trim() && matches.length === 0 ? <p className=\"px-1 text-sm text-muted-foreground\">No type matches.</p> : null}\n <SearchField value={search} onChange={(e) => setSearch(e.target.value)} placeholder={`Search all ${definitions.length} types`} aria-label=\"Search types\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * SEND BY SECURE LINK (`?panel=send`) — the sender's half, for someone with no account (the\n * accountant, the contractor). Ported from the web app's `features/sharing/secure/SecureLinkPanel`.\n *\n * The recipient gets a single-use link on one channel and a code on the other; it opens once, then\n * what it carried is wiped (aidream `services/secure_delivery/FEATURE.md`). The recipient page is the\n * web app's `/secure/<token>`; the server builds and sends that link itself.\n *\n * WHAT THIS PANEL NEVER HOLDS: a protected value or the link. It asks the server which protected\n * fields may go, sends names and addresses, and shows the receipt the server writes. Sending a\n * password is a reveal, so it runs through `useConfirmed()` (a fresh sign-in when the server asks).\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Checkbox } from \"@ai-matrx/design-system\";\nimport { Badge, Button, Field, RegionSkeleton, SegmentedControl, Textarea } from \"@ai-matrx/design-system/controls\";\nimport type { ItemPanelProps } from \"../area-props\";\nimport { ClockGlyph, LockGlyph, ShareGlyph } from \"../glyphs\";\nimport { Empty, formatDate, Panel, Row, Section } from \"../ui\";\nimport { isEmail } from \"./logic\";\nimport { AccessLine, message, StatusLine, useAction } from \"./parts\";\nimport type { SecureChannel, SecureLinkOptions, SentSecureLink } from \"./port\";\nimport { carriedWords, channelPlan, lifetimeWords, NOTE_MAX, planWords, recipientOf, remedyOf, sortSent, STATUS_TONE, statusWord } from \"./secure-link-logic\";\n\n/** Export name for the lead's wiring: `panel=send` renders this. */\nexport const SECURE_LINK_PANEL = \"send\";\n\nexport function SecureLinkPanel({ item, port, onClose }: ItemPanelProps) {\n const sharing = port.sharing;\n const { busy, error, notice, run, setNotice } = useAction();\n const [remedy, setRemedy] = useState<string | null>(null);\n const [options, setOptions] = useState<SecureLinkOptions | null>(null);\n const [optionsError, setOptionsError] = useState<string | null>(null);\n const [sent, setSent] = useState<SentSecureLink[] | null>(null);\n const [sentError, setSentError] = useState<string | null>(null);\n const [nonce, setNonce] = useState(0);\n\n const [email, setEmail] = useState(\"\");\n const [phone, setPhone] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [linkBy, setLinkBy] = useState<SecureChannel>(\"email\");\n const [fields, setFields] = useState<string[]>([]);\n const [note, setNote] = useState(\"\");\n const [sameChannelSent, setSameChannelSent] = useState(false);\n\n useEffect(() => {\n let live = true;\n setOptionsError(null);\n sharing.secureLinkOptions(item).then(\n (o) => live && setOptions(o),\n (e: unknown) => {\n if (!live) return;\n setOptionsError(message(e, \"What can be sent could not be read.\"));\n setRemedy(remedyOf(e));\n },\n );\n return () => {\n live = false;\n };\n }, [sharing, item]);\n\n useEffect(() => {\n const list = sharing.sentSecureLinks;\n if (!list) return;\n let live = true;\n setSentError(null);\n list(item).then(\n (rows) => live && setSent(sortSent(rows)),\n (e: unknown) => live && setSentError(message(e, \"Sent links could not be read.\")),\n );\n return () => {\n live = false;\n };\n }, [sharing, item, nonce]);\n\n // Pre-fill the mobile when the email is an existing user whose phone agreed to texts. Never over\n // a number the sender typed; a pre-filled number clears when the email stops matching, so the\n // both-by-email warning stays honest.\n const [phoneTyped, setPhoneTyped] = useState(false);\n const prefilled = useRef(false);\n useEffect(() => {\n const lookup = sharing.phoneOnFile;\n if (!lookup || phoneTyped) return;\n const clear = () => {\n if (prefilled.current) {\n setPhone(\"\");\n prefilled.current = false;\n }\n };\n if (!isEmail(email)) {\n clear();\n return;\n }\n let live = true;\n const timer = setTimeout(() => {\n lookup(email).then(\n (onFile) => {\n if (!live) return;\n if (onFile) {\n setPhone(onFile);\n prefilled.current = true;\n } else clear();\n },\n () => live && clear(),\n );\n }, 400);\n return () => {\n live = false;\n clearTimeout(timer);\n };\n }, [sharing, email, phoneTyped]);\n\n const plan = channelPlan(email, phone, linkBy);\n const canSend = isEmail(email) && options !== null && busy === null;\n\n const send = async () => {\n if (!canSend) return;\n setRemedy(null);\n setSameChannelSent(false);\n let refusal: unknown = null;\n const receipt = await run(\"send\", async () => {\n try {\n return await sharing.sendSecureLink(item, { email, phone: phone || null, name: name || null, fieldKeys: fields, linkBy, note: note || null });\n } catch (e) {\n refusal = e;\n throw e;\n }\n });\n if (!receipt) {\n setRemedy(remedyOf(refusal));\n return;\n }\n setNotice(receipt.sentence);\n setSameChannelSent(receipt.sameChannel);\n setEmail(\"\");\n setPhone(\"\");\n setName(\"\");\n setNote(\"\");\n setFields([]);\n setPhoneTyped(false);\n prefilled.current = false;\n setNonce((n) => n + 1);\n };\n\n const turnOff = async (row: SentSecureLink) => {\n const ok = await confirm({\n title: \"Turn off this link?\",\n description: `The link to ${recipientOf(row)} stops working at once and what it carries is deleted. They will need a new one.`,\n confirmLabel: \"Turn off\",\n variant: \"destructive\",\n });\n if (!ok) return;\n setRemedy(null);\n const sentence = await run(row.id, () => sharing.revokeSecureLink(item, row.id));\n if (sentence) setNotice(sentence);\n setNonce((n) => n + 1);\n };\n\n const toggle = (key: string, on: boolean) => setFields((cur) => (on ? [...cur.filter((k) => k !== key), key] : cur.filter((k) => k !== key)));\n\n return (\n <Panel\n title=\"Send securely\"\n size=\"md\"\n onClose={onClose}\n footer={\n <div className=\"flex w-full flex-wrap items-center gap-2\">\n <div className=\"w-full sm:w-auto sm:min-w-0 sm:flex-1\"><StatusLine error={error} notice={notice} /></div>\n {sameChannelSent && !error ? <Badge tone=\"warning\">Both by email</Badge> : null}\n <Button variant=\"quiet\" className=\"ml-auto\" onClick={onClose}>\n Close\n </Button>\n <Button variant=\"primary\" disabled={!canSend} onClick={() => void send()}>\n {busy === \"send\" ? \"Sending…\" : \"Send link\"}\n </Button>\n </div>\n }\n >\n {remedy ? <p className=\"px-1 text-xs text-muted-foreground\">{remedy}</p> : null}\n\n <Section title=\"Recipient\">\n <Row label=\"Email\">\n <Field type=\"email\" autoComplete=\"off\" placeholder=\"name@example.com\" aria-label=\"Their email\" value={email} onChange={(e) => setEmail(e.target.value)} className=\"w-full\" />\n </Row>\n <Row label=\"Mobile\" hint=\"For the code\">\n <Field\n type=\"tel\"\n autoComplete=\"off\"\n placeholder=\"+1 310 555 0123\"\n aria-label=\"Their mobile, for the code\"\n value={phone}\n onChange={(e) => {\n setPhone(e.target.value);\n setPhoneTyped(true);\n prefilled.current = false;\n }}\n className=\"w-full\"\n />\n </Row>\n <Row label=\"Name\" hint=\"Optional\">\n <Field autoComplete=\"off\" placeholder=\"Their name\" aria-label=\"Their name\" value={name} onChange={(e) => setName(e.target.value)} className=\"w-full\" />\n </Row>\n {plan && !plan.same ? (\n <Row label=\"Link by\">\n <SegmentedControl\n aria-label=\"Send the link by\"\n value={linkBy}\n onValueChange={setLinkBy}\n data={[\n { value: \"email\", label: \"Email\" },\n { value: \"sms\", label: \"Text\" },\n ]}\n />\n </Row>\n ) : null}\n {email.trim() ? (\n <Row label=\"Delivery\">\n <span className={plan?.same ? \"text-warning\" : \"text-foreground\"}>{planWords(plan)}</span>\n </Row>\n ) : null}\n </Section>\n\n <Section title=\"Include\">\n {optionsError ? (\n <Empty>\n <span className=\"text-destructive\">{optionsError}</span>\n </Empty>\n ) : !options ? (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading what can be sent\" className=\"px-3 sm:px-4\" />\n ) : options.fields.length === 0 ? (\n <Empty>Name and details only</Empty>\n ) : (\n options.fields.map((f) => (\n <label key={f.key} className=\"flex min-h-11 items-center gap-3 px-3 py-1 sm:px-4\" data-clickable={f.available ? \"\" : undefined}>\n <Checkbox checked={fields.includes(f.key)} disabled={!f.available} onCheckedChange={(v) => toggle(f.key, v === true)} aria-label={f.label} />\n <span className=\"min-w-0 flex-1 truncate text-sm text-foreground\">{f.label}</span>\n {!f.available && f.reason ? (\n <span className=\"min-w-0 max-w-[55%] truncate text-xs text-muted-foreground\" title={f.reason}>\n {f.reason}\n </span>\n ) : null}\n </label>\n ))\n )}\n </Section>\n\n <Section title=\"Message\">\n <div className=\"px-3 py-1 sm:px-4\">\n <Textarea className=\"w-full\" rows={2} maxLength={NOTE_MAX} placeholder=\"Shown once, with it\" aria-label=\"Message\" value={note} onChange={(e) => setNote(e.target.value)} />\n </div>\n </Section>\n\n {options ? (\n <Section title=\"Link\">\n <Row label=\"Opens\">\n <span className=\"text-foreground\">Once</span>\n </Row>\n <Row label=\"Link expires\">\n <span className=\"text-foreground\">After {lifetimeWords(options.linkMinutes)}</span>\n </Row>\n <Row label=\"Code expires\">\n <span className=\"text-foreground\">After {lifetimeWords(options.codeMinutes)}</span>\n </Row>\n </Section>\n ) : null}\n\n {sharing.sentSecureLinks ? (\n <Section title=\"Sent links\">\n {sentError ? (\n <Empty>\n <span className=\"text-destructive\">{sentError}</span>\n </Empty>\n ) : !sent ? (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading sent links\" className=\"px-3 sm:px-4\" />\n ) : sent.length === 0 ? (\n <Empty>None yet</Empty>\n ) : (\n sent.map((row) => (\n <AccessLine key={row.id} glyph={row.status === \"pending\" ? ClockGlyph : row.fieldKeys.length ? LockGlyph : ShareGlyph} who={recipientOf(row)} meta={sentMeta(row, options)}>\n <Badge tone={STATUS_TONE[row.status] ?? \"neutral\"}>{statusWord(row.status)}</Badge>\n {row.status === \"pending\" ? (\n <Button variant=\"quiet\" disabled={busy !== null} onClick={() => void turnOff(row)}>\n Turn off\n </Button>\n ) : null}\n </AccessLine>\n ))\n )}\n </Section>\n ) : null}\n </Panel>\n );\n}\n\n/** \"Until Oct 17 · Password\", \"Oct 16 · Password\". */\nfunction sentMeta(row: SentSecureLink, options: SecureLinkOptions | null): string {\n const when = row.status === \"pending\" ? `Until ${formatDate(row.expiresAt, true)}` : row.status === \"viewed\" && row.viewedAt ? formatDate(row.viewedAt, true) : formatDate(row.createdAt);\n const carried = row.fieldKeys.length ? carriedWords(row.fieldKeys, options?.fields ?? []) : \"\";\n return [when, carried].filter(Boolean).join(\" · \");\n}\n","/** Send by secure link — the pure rules: channel plan, status words, refusal remedy, row shapes. */\nimport { formatDurationMinutes } from \"@ai-matrx/kit/format\";\nimport { fieldNames } from \"./logic\";\nimport type { SecureChannel, SecureLinkField, SentSecureLink } from \"./port\";\n\n/** What the vault calls a credential item on the secure-delivery API. */\nexport const SECURE_RESOURCE_TYPE = \"credential_item\";\n\n/** The server's note limit (`CreateBody.note`). */\nexport const NOTE_MAX = 1000;\n\nconst CHANNEL_WORD: Record<SecureChannel, string> = { email: \"email\", sms: \"text\" };\n\n/**\n * How the link and the code will travel, mirroring the server's `plan_channels`: with both an email\n * and a mobile they go on different channels; email alone carries both; a phone alone is refused.\n */\nexport function channelPlan(email: string, phone: string, linkBy: SecureChannel): { link: SecureChannel; code: SecureChannel; same: boolean } | null {\n const e = email.trim() !== \"\";\n const p = phone.trim() !== \"\";\n if (e && p) return { link: linkBy, code: linkBy === \"email\" ? \"sms\" : \"email\", same: false };\n if (e) return { link: \"email\", code: \"email\", same: true };\n return null;\n}\n\n/** The plan in ≤ 60 characters, for the row under the recipient. */\nexport function planWords(plan: { link: SecureChannel; code: SecureChannel; same: boolean } | null): string {\n if (!plan) return \"Add their email\";\n if (plan.same) return \"Link and code both go by email\";\n return `Link by ${CHANNEL_WORD[plan.link]}, code by ${CHANNEL_WORD[plan.code]}`;\n}\n\nexport const STATUS_WORDS: Record<string, string> = {\n pending: \"Not opened yet\",\n viewed: \"Opened\",\n revoked: \"Turned off\",\n expired: \"Expired\",\n undeliverable: \"Not delivered\",\n locked: \"Locked\",\n};\n\nexport const statusWord = (status: string): string => STATUS_WORDS[status] ?? status.replace(/[_-]+/g, \" \").replace(/^\\w/, (c) => c.toUpperCase());\n\nexport const STATUS_TONE: Record<string, \"neutral\" | \"success\" | \"warning\" | \"destructive\"> = {\n pending: \"neutral\",\n viewed: \"success\",\n revoked: \"neutral\",\n expired: \"neutral\",\n undeliverable: \"destructive\",\n locked: \"warning\",\n};\n\n/** Who a sent link went to, as people read it. */\nexport const recipientOf = (row: Pick<SentSecureLink, \"name\" | \"email\" | \"phone\">): string => row.name?.trim() || row.email || row.phone || \"Someone\";\n\n/** The field keys a sent link carried, by the labels the options gave (else humanized keys). */\nexport function carriedWords(keys: readonly string[], fields: readonly Pick<SecureLinkField, \"key\" | \"label\">[]): string {\n const known = new Map(fields.map((f) => [f.key, f.label]));\n return keys.map((k) => known.get(k) ?? fieldNames([k])).join(\", \");\n}\n\n/** \"1 day\", \"12 hours\". */\nexport const lifetimeWords = (minutes: number): string => formatDurationMinutes(minutes, { style: \"long\" });\n\n/** The remedy the server attached to a refusal (`detail.remedy`), if any. */\nexport function remedyOf(e: unknown): string | null {\n const body = (e as { serverDetail?: unknown } | null)?.serverDetail;\n if (!body || typeof body !== \"object\") return null;\n const inner = (body as { detail?: unknown }).detail;\n const src = inner && typeof inner === \"object\" ? inner : body;\n const r = (src as { remedy?: unknown }).remedy;\n return typeof r === \"string\" && r.trim() ? r : null;\n}\n\nconst str = (v: unknown): string | null => (typeof v === \"string\" && v !== \"\" ? v : null);\n\n/** One row of `platform.secure_delivery_sent` in the screens' shape; null for anything unreadable. */\nexport function sentRowOf(r: unknown): SentSecureLink | null {\n if (!r || typeof r !== \"object\") return null;\n const w = r as Record<string, unknown>;\n const id = str(w[\"id\"]);\n if (!id) return null;\n return {\n id,\n name: str(w[\"recipient_name\"]),\n email: str(w[\"recipient_email\"]),\n phone: str(w[\"recipient_phone\"]),\n linkBy: str(w[\"link_channel\"]) ?? \"email\",\n codeBy: str(w[\"code_channel\"]) ?? \"email\",\n fieldKeys: Array.isArray(w[\"field_keys\"]) ? (w[\"field_keys\"] as unknown[]).filter((k): k is string => typeof k === \"string\") : [],\n status: str(w[\"status\"]) ?? \"pending\",\n createdAt: str(w[\"created_at\"]) ?? \"\",\n expiresAt: str(w[\"expires_at\"]) ?? \"\",\n viewedAt: str(w[\"viewed_at\"]),\n };\n}\n\n/** Newest first; pending links lead because they are the ones a person can still act on. */\nexport function sortSent(rows: readonly SentSecureLink[]): SentSecureLink[] {\n return [...rows].sort((a, b) => Number(b.status === \"pending\") - Number(a.status === \"pending\") || b.createdAt.localeCompare(a.createdAt));\n}\n","/**\n * Browsers that can fill saved passwords (`?panel=devices`), and the approval of a new one\n * (`?panel=approve:<key>`). Every extension install (or the macOS password app) that may fill has its\n * own key; turned-off ones stay listed so the person sees what could fill and when it stopped.\n */\nimport { useCallback, useEffect, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Button, RegionSkeleton } from \"@ai-matrx/design-system/controls\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport { CheckGlyph, ExternalGlyph, FingerprintGlyph, PowerGlyph } from \"../glyphs\";\nimport { useNotify } from \"../notice\";\nimport { Empty, Panel, Row, Section, formatDate } from \"../ui\";\nimport { approvalKeyOf, approvalLabelOf, deviceKindOf, isRevoked, passkeyDomainUrl, shortFingerprint } from \"./logic\";\nimport type { FillDevice, FillDeviceKind, FillStepUpMethods } from \"./port\";\n\nconst messageOf = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\n\nfunction ErrorLine({ text }: { text: string | null }) {\n return text ? <p role=\"alert\" className=\"px-1 text-sm text-destructive\">{text}</p> : null;\n}\n\n/** Every browser allowed to fill, when it was added, when it last filled, and Revoke. */\nexport function DevicesPanel({ port, onClose }: VaultPanelProps) {\n const confirmed = useConfirmed();\n const notify = useNotify();\n const [devices, setDevices] = useState<FillDevice[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busyId, setBusyId] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setError(null);\n try {\n setDevices(await port.devices.list());\n } catch (e) {\n setError(messageOf(e, \"Your browsers could not be read.\"));\n }\n }, [port]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const revoke = async (device: FillDevice) => {\n const yes = await confirm({\n title: `Revoke ${device.label}?`,\n description: \"It stops filling now and the extension there signs out. It fills again only after you sign in there and confirm.\",\n confirmLabel: \"Revoke\",\n variant: \"destructive\",\n });\n if (!yes) return;\n setBusyId(device.id);\n setError(null);\n try {\n const updated = await confirmed(() => port.devices.revoke(device.id));\n setDevices((current) => (current ?? []).map((d) => (d.id === updated.id ? updated : d)));\n notify(`${device.label} revoked`);\n } catch (e) {\n if (!wasCancelled(e)) setError(messageOf(e, \"That browser could not be revoked.\"));\n } finally {\n setBusyId(null);\n }\n };\n\n return (\n <Panel title=\"Browsers that can fill\" onClose={onClose} size=\"md\">\n <ErrorLine text={error} />\n <Section>\n {devices === null ? (\n error ? (\n <Empty>\n <Button variant=\"outline\" onClick={() => void load()}>Try again</Button>\n </Empty>\n ) : (\n <RegionSkeleton shape=\"rows\" count={2} aria-label=\"Loading your browsers\" className=\"px-3 sm:px-4\" />\n )\n ) : devices.length === 0 ? (\n <Empty>No browser can fill yet. Turn it on in the extension.</Empty>\n ) : (\n devices.map((device) => {\n const off = isRevoked(device);\n return (\n <Row\n key={device.id}\n label={off ? \"Turned off\" : \"Can fill\"}\n hint={off ? formatDate(device.revokedAt) : undefined}\n actions={\n off ? null : (\n <Button variant=\"outline\" icon={<PowerGlyph />} disabled={busyId !== null} onClick={() => void revoke(device)}>\n Revoke\n </Button>\n )\n }\n >\n <span className=\"flex min-w-0 flex-col\">\n <span className={off ? \"truncate text-muted-foreground\" : \"truncate text-foreground\"}>{device.label}</span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {device.lastUsedAt ? `Last used ${formatDate(device.lastUsedAt, true)}` : \"Never used\"}\n {device.addedAt ? ` · added ${formatDate(device.addedAt)}` : \"\"}\n </span>\n </span>\n </Row>\n );\n })\n )}\n </Section>\n </Panel>\n );\n}\n\n/** What the approval link names, read from the address (`panel=approve:<key>&label=…&kind=mac`). */\nexport function approvalFromParams(arg: string | null, params: URLSearchParams): { approvalKey: string; label: string | null; kind: FillDeviceKind } {\n return { approvalKey: arg ?? params.get(\"key\") ?? \"\", label: approvalLabelOf(params.get(\"label\")), kind: deviceKindOf(params.get(\"kind\")) };\n}\n\n/**\n * A browser (or the Mac app) asks to fill: show what is asking and the code it shows, then approve\n * with the step-up the server requires (a passkey here; a password is typed in the extension), or refuse.\n */\nexport function ApprovePanel({ port, host, onClose, approvalKey, label, kind = \"browser\" }: VaultPanelProps & { approvalKey: string; label: string | null; kind?: FillDeviceKind }) {\n const notify = useNotify();\n const key = approvalKeyOf(approvalKey);\n const name = approvalLabelOf(label);\n const isMac = kind === \"mac\";\n const asker = isMac ? \"AI Matrx Mac app\" : \"AI Matrx extension\";\n const where = isMac ? \"the Mac app\" : \"the extension\";\n const passkeys = port.devices.passkeys;\n const here = passkeys?.available() ?? false;\n\n const [methods, setMethods] = useState<FillStepUpMethods | null>(null);\n const [busy, setBusy] = useState<\"approve\" | \"add\" | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [approvedUntil, setApprovedUntil] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setError(null);\n try {\n setMethods(await port.devices.stepUpMethods());\n } catch (e) {\n setError(messageOf(e, \"Your account could not be checked.\"));\n }\n }, [port]);\n\n useEffect(() => {\n // Off the passkey domain no ceremony can run, so there is nothing to check.\n if (key && here) void load();\n }, [key, here, load]);\n\n const approve = async () => {\n if (!key || !passkeys) return;\n setBusy(\"approve\");\n setError(null);\n try {\n const { expiresAt } = await passkeys.approve({ keyThumbprint: key, label: name, kind });\n setApprovedUntil(expiresAt);\n } catch (e) {\n setError(messageOf(e, \"It was not approved. Try again.\"));\n } finally {\n setBusy(null);\n }\n };\n\n const addPasskey = async () => {\n if (!passkeys) return;\n setBusy(\"add\");\n setError(null);\n try {\n await passkeys.add();\n notify(\"Passkey added\");\n await load();\n } catch (e) {\n setError(messageOf(e, \"A passkey could not be added.\"));\n } finally {\n setBusy(null);\n }\n };\n\n const refuse = () => {\n if (!approvedUntil) notify(\"Not approved\", \"info\");\n onClose();\n };\n\n const openOnDomain = () => {\n if (!passkeys || typeof window === \"undefined\") return;\n const url = passkeyDomainUrl(window.location.pathname, window.location.search, passkeys.rpId);\n if (host.openUrl) host.openUrl(url);\n else window.location.assign(url);\n };\n\n const canApprove = Boolean(key && passkeys && here && methods?.passkey && !approvedUntil);\n const title = isMac ? \"Approve this Mac\" : name ? `Approve ${name}` : \"Approve this browser\";\n\n const footer = approvedUntil ? (\n <Button variant=\"primary\" onClick={onClose}>Done</Button>\n ) : (\n <>\n <Button variant=\"quiet\" disabled={busy !== null} onClick={refuse}>{key ? \"Refuse\" : \"Close\"}</Button>\n {canApprove ? (\n <Button variant=\"primary\" icon={<FingerprintGlyph />} disabled={busy !== null} onClick={() => void approve()}>\n {busy === \"approve\" ? \"Approving…\" : \"Approve with passkey\"}\n </Button>\n ) : null}\n </>\n );\n\n return (\n <Panel title={title} onClose={refuse} size=\"sm\" footer={footer}>\n {!key ? (\n <Section>\n <Empty>This link names no key. Start again from {where}.</Empty>\n </Section>\n ) : (\n <>\n <Section title=\"What is asking\">\n <Row label=\"Asking\" hint=\"Approve only if you just asked\">{asker}</Row>\n {name ? <Row label=\"Name\"><span className=\"block truncate\">{name}</span></Row> : null}\n <Row label=\"Code\" hint={`Must match ${where}`}>\n <span className=\"font-mono tracking-wider text-foreground\">{shortFingerprint(key)}</span>\n </Row>\n </Section>\n <ErrorLine text={error} />\n <Section title=\"Confirm it’s you\">\n {approvedUntil ? (\n <Row label=\"Approved\" actions={<CheckGlyph className=\"size-4 text-primary\" />}>\n <span className=\"text-foreground\">Return to {where} by {formatDate(approvedUntil, true)}.</span>\n </Row>\n ) : !passkeys ? (\n <Empty>Approve with your password in {where}.</Empty>\n ) : !here ? (\n <Row\n label=\"Passkey\"\n hint={`Passkeys work only on ${passkeys.rpId}`}\n actions={<Button variant=\"outline\" icon={<ExternalGlyph />} onClick={openOnDomain}>Open there</Button>}\n >\n <span className=\"text-muted-foreground\">Not on this page</span>\n </Row>\n ) : methods === null ? (\n error ? (\n <Empty>\n <Button variant=\"outline\" onClick={() => void load()}>Try again</Button>\n </Empty>\n ) : (\n <RegionSkeleton shape=\"rows\" count={1} aria-label=\"Checking your account\" className=\"px-3 sm:px-4\" />\n )\n ) : !methods.passkey ? (\n <Row\n label=\"Passkey\"\n hint={methods.password ? `Or type your password in ${where}` : \"Add one to approve\"}\n actions={\n <Button variant=\"primary\" icon={<FingerprintGlyph />} disabled={busy !== null} onClick={() => void addPasskey()}>\n {busy === \"add\" ? \"Adding…\" : \"Add passkey\"}\n </Button>\n }\n >\n <span className=\"text-muted-foreground\">{methods.password ? \"None yet\" : \"No password or passkey\"}</span>\n </Row>\n ) : (\n <Row label=\"Passkey\" hint=\"Your device asks for it next\">\n <span className=\"text-foreground\">Ready</span>\n </Row>\n )}\n </Section>\n </>\n )}\n </Panel>\n );\n}\n","/** Pure pieces of the devices area: no React, no network, no browser globals (tested). */\nimport type { FillDevice, FillDeviceKind } from \"./port\";\n\n/** The passkey relying party. A passkey ceremony only works on this domain and its subdomains. */\nexport const PASSKEY_RP_ID = \"aimatrx.com\";\n\nconst THUMBPRINT = /^[0-9a-f]{64}$/;\n\n/** A key from an approval link, normalised; null when it is not a thumbprint. */\nexport function approvalKeyOf(raw: string | null | undefined): string | null {\n const key = (raw ?? \"\").trim().toLowerCase();\n return THUMBPRINT.test(key) ? key : null;\n}\n\n/** The label the link carried, capped like the server's column. */\nexport function approvalLabelOf(raw: string | null | undefined): string | null {\n const label = (raw ?? \"\").trim().slice(0, 200);\n return label || null;\n}\n\n/** `kind=mac` is the macOS password app; anything else reads as a browser. */\nexport function deviceKindOf(raw: string | null | undefined): FillDeviceKind {\n return raw === \"mac\" ? \"mac\" : \"browser\";\n}\n\n/** First 16 hex characters in groups of four — the extension and Mac app show the same. */\nexport function shortFingerprint(thumbprint: string): string {\n return (thumbprint.slice(0, 16).match(/.{1,4}/g) ?? []).join(\" \").toUpperCase();\n}\n\n/** True when a passkey ceremony can run on a page at this host. */\nexport function passkeysWorkOn(hostname: string, hasWebAuthn: boolean, rpId = PASSKEY_RP_ID): boolean {\n return hasWebAuthn && (hostname === rpId || hostname.endsWith(`.${rpId}`));\n}\n\n/** The same page on the passkey domain, for a page opened anywhere else. */\nexport function passkeyDomainUrl(pathname: string, search: string, rpId = PASSKEY_RP_ID): string {\n return `https://www.${rpId}${pathname}${search}`;\n}\n\nexport function fromB64url(value: string): ArrayBuffer {\n const b64 = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(b64 + \"=\".repeat((4 - (b64.length % 4)) % 4));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport function toB64url(buffer: ArrayBuffer | null | undefined): string | undefined {\n if (!buffer) return undefined;\n let binary = \"\";\n for (const b of new Uint8Array(buffer)) binary += String.fromCharCode(b);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** The auth server's request options as JSON (base64url strings where WebAuthn wants bytes). */\nexport interface RequestOptionsJSON {\n challenge: string;\n rpId?: string;\n timeout?: number;\n userVerification?: UserVerificationRequirement;\n allowCredentials?: { id: string; type: \"public-key\"; transports?: string[] }[];\n}\n\nexport function requestOptions(json: RequestOptionsJSON): PublicKeyCredentialRequestOptions {\n const out: PublicKeyCredentialRequestOptions = {\n challenge: fromB64url(json.challenge),\n userVerification: json.userVerification ?? \"required\",\n };\n if (json.rpId !== undefined) out.rpId = json.rpId;\n if (json.timeout !== undefined) out.timeout = json.timeout;\n if (json.allowCredentials) {\n out.allowCredentials = json.allowCredentials.map((c) => {\n const d: PublicKeyCredentialDescriptor = { id: fromB64url(c.id), type: c.type };\n if (c.transports) d.transports = c.transports as AuthenticatorTransport[];\n return d;\n });\n }\n return out;\n}\n\n/** The pieces of a signed assertion the server's verifier reads. */\nexport interface AssertionLike {\n id: string;\n rawId: ArrayBuffer;\n type: string;\n response: { clientDataJSON: ArrayBuffer; authenticatorData: ArrayBuffer; signature: ArrayBuffer; userHandle: ArrayBuffer | null };\n authenticatorAttachment?: string | null;\n getClientExtensionResults(): unknown;\n}\n\nexport function serializeAssertion(credential: AssertionLike): Record<string, unknown> {\n const r = credential.response;\n return {\n id: credential.id,\n rawId: toB64url(credential.rawId),\n type: credential.type,\n response: {\n clientDataJSON: toB64url(r.clientDataJSON),\n authenticatorData: toB64url(r.authenticatorData),\n signature: toB64url(r.signature),\n userHandle: toB64url(r.userHandle),\n },\n clientExtensionResults: credential.getClientExtensionResults(),\n authenticatorAttachment: credential.authenticatorAttachment ?? undefined,\n };\n}\n\n/** The browser's WebAuthn refusal, in plain words. */\nexport function passkeyFailure(name: string): string {\n return name === \"NotAllowedError\" ? \"The passkey prompt closed early. Try again.\" : \"Your passkey could not be used here. Try again.\";\n}\n\n/** The auth server's add-a-passkey refusal, in plain words. */\nexport function addPasskeyFailure(message: string | undefined): string {\n const m = (message ?? \"\").toLowerCase();\n return m.includes(\"abort\") || m.includes(\"notallowed\") ? \"The passkey prompt closed early. Try again.\" : \"A passkey could not be added now. Try again.\";\n}\n\nexport const isRevoked = (d: Pick<FillDevice, \"revokedAt\">): boolean => d.revokedAt !== null;\n\n","import { useEffect, useMemo, useState } from \"react\";\nimport { confirm } from \"@ai-matrx/kit/confirm-opener\";\nimport { Badge, Button, Select, type BadgeTone, type SelectOption } from \"@ai-matrx/design-system/controls\";\nimport type { VaultPanelProps } from \"../area-props\";\nimport { ImportGlyph } from \"../glyphs\";\nimport { ErrorLine, Windowed } from \"../io/lines\";\nimport { Empty, Panel, Row, Section } from \"../ui\";\nimport type { NativeImportLimits } from \"./api\";\nimport { TERMINAL_PHASES, accounted, dispositionLabel, plural } from \"./logic\";\nimport type { NativeImportBridge, NativeImportDisposition } from \"./types\";\nimport { useNativeImport } from \"./use-native-import\";\n\nexport interface NativeImportPanelProps extends VaultPanelProps {\n /** The desktop shell's importer. Without it the panel says so; a host without one never opens it. */\n bridge: NativeImportBridge | undefined;\n /** The generated client, to read the server's passkey-import limits. Optional: without it no limit is shown. */\n /** The server's limits for an organization (`port.native.limits`). */\n readLimits?: ((organizationId: string) => Promise<NativeImportLimits>) | undefined;\n /** The organization to preselect (the one active on this device). */\n activeOrganizationId?: string | null | undefined;\n}\n\nconst TONE: Record<NativeImportDisposition, BadgeTone> = {\n eligible: \"success\",\n committed: \"success\",\n unsupported: \"neutral\",\n not_attempted: \"neutral\",\n failed: \"destructive\",\n uncertain: \"warning\",\n};\n\n/** Passkeys from a file, imported by the desktop app: choose an organization, review every passkey, import, recover, cancel. */\nexport function NativeImportPanel({ bridge, readLimits, activeOrganizationId, organizations, onClose, onChanged }: NativeImportPanelProps) {\n if (!bridge) {\n return (\n <Panel title=\"Import passkeys\" size=\"md\" onClose={onClose} footer={<Button variant=\"primary\" onClick={onClose}>Close</Button>}>\n <Section>\n <Empty>Passkey import needs the desktop app.</Empty>\n </Section>\n </Panel>\n );\n }\n return <Importer bridge={bridge} readLimits={readLimits} activeOrganizationId={activeOrganizationId} organizations={organizations} onClose={onClose} onChanged={onChanged} />;\n}\n\nfunction Importer({ bridge, readLimits, activeOrganizationId, organizations, onClose, onChanged }: Pick<NativeImportPanelProps, \"readLimits\" | \"activeOrganizationId\" | \"organizations\" | \"onClose\" | \"onChanged\"> & { bridge: NativeImportBridge }) {\n const options = useMemo<SelectOption[]>(() => organizations.map((o) => ({ value: o.id, label: o.name })), [organizations]);\n const [organizationId, setOrganizationId] = useState<string>(() => (organizations.some((o) => o.id === activeOrganizationId) ? (activeOrganizationId as string) : (organizations[0]?.id ?? \"\")));\n const [limits, setLimits] = useState<NativeImportLimits | null>(null);\n const [limitError, setLimitError] = useState<string | null>(null);\n const flow = useNativeImport(bridge, (id) => organizations.some((o) => o.id === id), onChanged);\n const { screen, busy } = flow;\n const orgName = organizations.find((o) => o.id === organizationId)?.name ?? \"this organization\";\n\n useEffect(() => {\n if (!readLimits || !organizationId) return;\n let live = true;\n setLimits(null);\n setLimitError(null);\n readLimits(organizationId).then(\n (l) => live && setLimits(l),\n (e: unknown) => live && setLimitError(e instanceof Error && e.message ? e.message : \"Passkey import is not available here.\"),\n );\n return () => {\n live = false;\n };\n }, [readLimits, organizationId]);\n\n const status = screen.kind === \"idle\" ? null : screen.status;\n const preview = screen.kind === \"preview\" ? screen.preview : null;\n const active = status !== null && !TERMINAL_PHASES.has(status.phase);\n const ready = preview?.slots.filter((s) => s.disposition === \"eligible\").length ?? 0;\n\n const importNow = async () => {\n const yes = await confirm({ title: `Add ${plural(ready, \"passkey\")} to ${orgName}?`, description: \"Passkeys already there are skipped.\", confirmLabel: \"Import\" });\n if (yes) await flow.confirm();\n };\n\n const footer = preview ? (\n <>\n <Button variant=\"quiet\" disabled={busy} onClick={() => void flow.cancel()}>\n Cancel\n </Button>\n <Button variant=\"primary\" icon={<ImportGlyph className=\"size-4\" />} disabled={busy || ready === 0} onClick={() => void importNow()}>\n Import {ready}\n </Button>\n </>\n ) : status ? (\n active ? (\n <>\n <Button variant=\"outline\" disabled={busy} onClick={() => void flow.refresh()}>\n Refresh\n </Button>\n <Button variant=\"outline\" disabled={busy} onClick={() => void flow.cancel()}>\n Cancel import\n </Button>\n </>\n ) : (\n <>\n <Button variant=\"quiet\" onClick={flow.reset}>\n New file\n </Button>\n <Button variant=\"primary\" onClick={onClose}>\n Done\n </Button>\n </>\n )\n ) : (\n <Button variant=\"quiet\" onClick={onClose}>\n Close\n </Button>\n );\n\n return (\n <Panel title=\"Import passkeys\" size=\"lg\" onClose={onClose} footer={footer}>\n {screen.kind === \"idle\" ? (\n <Section>\n <Row label=\"Save to\">\n <Select value={organizationId} options={options} aria-label=\"Save to\" disabled={busy} onValueChange={setOrganizationId} />\n </Row>\n <Row label=\"File\" hint={limits ? `Up to ${plural(limits.maxItems, \"passkey\")}` : \"A passkey exchange file\"}>\n <Button variant=\"outline\" icon={<ImportGlyph className=\"size-4\" />} disabled={busy || !organizationId || limitError !== null} onClick={() => void flow.begin(organizationId)}>\n {busy ? \"Opening…\" : \"Choose file\"}\n </Button>\n </Row>\n <Row label=\"Interrupted\" hint=\"Finish or clear an earlier import\">\n <Button variant=\"quiet\" disabled={busy} onClick={() => void flow.recover()}>\n Recover\n </Button>\n </Row>\n </Section>\n ) : null}\n\n {preview ? (\n <Section title={`${ready} of ${preview.total} ready`}>\n <Windowed\n items={preview.slots}\n render={(slot) => (\n <Row key={slot.slot_id} label={<Badge tone={TONE[slot.disposition]}>{dispositionLabel(slot.disposition)}</Badge>} hint={undefined}>\n <span className=\"block truncate text-foreground\" title={slot.reason ?? undefined}>\n {slot.title ?? \"Unnamed passkey\"}\n </span>\n </Row>\n )}\n />\n </Section>\n ) : null}\n\n {status && !preview ? (\n <Section title={`${accounted(status)} of ${status.total} done`}>\n <Row label=\"Imported\">\n <span className=\"text-foreground\">{status.committed}</span>\n </Row>\n <Row label=\"Already there\">\n <span className=\"text-foreground\">{status.already_present}</span>\n </Row>\n <Row label=\"Can't import\">\n <span className=\"text-foreground\">{status.unsupported}</span>\n </Row>\n <Row label=\"Failed\">\n <span className={status.failed > 0 ? \"text-destructive\" : \"text-foreground\"}>{status.failed}</span>\n </Row>\n {status.uncertain > 0 ? (\n <Row label=\"Needs recovery\">\n <span className=\"text-foreground\">{status.uncertain}</span>\n </Row>\n ) : null}\n {status.not_attempted > 0 ? (\n <Row label=\"Not tried\">\n <span className=\"text-foreground\">{status.not_attempted}</span>\n </Row>\n ) : null}\n </Section>\n ) : null}\n\n {screen.message ? (\n <p role=\"status\" className=\"px-1 text-sm text-muted-foreground\">\n {screen.message}\n </p>\n ) : null}\n <ErrorLine message={limitError} />\n </Panel>\n );\n}\n","import type { NativeImportBridge, NativeImportDisposition, NativeImportPhase, NativeImportPreview, NativeImportStatus } from \"./types\";\n\nexport const ACTIVE_PHASES: ReadonlySet<NativeImportPhase> = new Set([\"authorizing\", \"importing\"]);\nexport const TERMINAL_PHASES: ReadonlySet<NativeImportPhase> = new Set([\"completed\", \"partial\", \"cancelled\", \"failed\", \"unavailable\"]);\nexport const POLL_DELAY_MS = 1000;\nexport const MAX_POLLS = 30;\n\nexport const isPreview = (v: NativeImportStatus | NativeImportPreview): v is NativeImportPreview => \"preview_digest\" in v;\n\nexport function dispositionLabel(d: NativeImportDisposition): string {\n switch (d) {\n case \"eligible\": return \"Ready\";\n case \"unsupported\": return \"Can't import\";\n case \"committed\": return \"Imported\";\n case \"failed\": return \"Failed\";\n case \"uncertain\": return \"Needs recovery\";\n case \"not_attempted\": return \"Not imported\";\n }\n}\n\nexport const plural = (n: number, one: string): string => `${n} ${one}${n === 1 ? \"\" : \"s\"}`;\n\nexport function terminalMessage(s: NativeImportStatus): string {\n if (s.phase === \"completed\") return `Imported ${plural(s.committed, \"passkey\")}.`;\n if (s.phase === \"partial\") return `${s.committed} imported; ${s.unsupported + s.failed + s.uncertain + s.not_attempted} need attention.`;\n if (s.phase === \"cancelled\") return \"Import cancelled. Nothing else will be imported.\";\n if (s.phase === \"unavailable\") return \"Passkey import is unavailable here.\";\n if (s.phase === \"failed\") return \"The import did not finish. Recover it before using a new file.\";\n return s.message;\n}\n\n/** How many of the file's passkeys have an outcome. */\nexport function accounted(s: NativeImportStatus): number {\n return s.committed + s.already_present + s.unsupported + s.failed + s.uncertain + s.not_attempted;\n}\n\n/** Every page of the file preview, checked for order, digest and duplicates. `current` stops the read when the screen moved on. */\nexport async function loadFullPreview(bridge: NativeImportBridge, operationId: string, current: () => boolean): Promise<NativeImportPreview | null> {\n let offset = 0;\n let full: NativeImportPreview | null = null;\n const seen = new Set<string>();\n for (;;) {\n if (!current()) return null;\n const page = await bridge.request({ action: \"preview\", operation_id: operationId, offset });\n if (!current()) return null;\n if (!isPreview(page)) throw new Error(\"The importer did not return the file preview.\");\n if (page.offset !== offset) throw new Error(\"The importer returned the preview out of order.\");\n if (!full) full = { ...page, slots: [...page.slots] };\n else if (page.operation_id !== full.operation_id || page.preview_digest !== full.preview_digest || page.total !== full.total) throw new Error(\"The importer returned an inconsistent preview.\");\n else full.slots.push(...page.slots);\n for (const slot of page.slots) {\n if (seen.has(slot.slot_id)) throw new Error(\"The importer returned a passkey twice.\");\n seen.add(slot.slot_id);\n }\n if (full.slots.length === full.total) return full;\n if (full.slots.length > full.total) throw new Error(\"The importer returned too many passkeys.\");\n if (page.slots.length === 0) throw new Error(\"The importer returned an incomplete preview.\");\n offset += page.slots.length;\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { ACTIVE_PHASES, MAX_POLLS, POLL_DELAY_MS, TERMINAL_PHASES, isPreview, loadFullPreview, terminalMessage } from \"./logic\";\nimport type { NativeImportBridge, NativeImportPreview, NativeImportStatus } from \"./types\";\n\nexport type NativeScreen =\n | { kind: \"idle\"; message: string | null }\n | { kind: \"status\"; status: NativeImportStatus; message: string | null }\n | { kind: \"preview\"; status: NativeImportStatus; preview: NativeImportPreview; message: string | null };\n\nconst fail = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback);\nconst RESTART = \"Your account changed. The import was stopped; start it again.\";\n\n/**\n * The importer's state machine: begin → preview → confirm → progress, plus cancel and recover.\n * A generation counter drops every answer that arrives after the screen moved on, so a slow reply\n * can never overwrite a newer one. A preview is never authority to write: confirm re-binds the\n * organization first, and the whole import stops if the host says the account changed.\n */\nexport function useNativeImport(bridge: NativeImportBridge, stillAllowed: (organizationId: string) => boolean, onImported: () => void) {\n const [screen, setScreen] = useState<NativeScreen>({ kind: \"idle\", message: null });\n const [busy, setBusy] = useState(false);\n const generation = useRef(0);\n const mounted = useRef(false);\n const op = useRef<{ id: string; organizationId: string | null } | null>(null);\n const last = useRef<NativeImportStatus | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const polls = useRef(0);\n const refreshRef = useRef<(auto: boolean) => Promise<void>>(async () => undefined);\n\n const current = (g: number) => mounted.current && g === generation.current;\n const stopPolling = () => {\n if (timer.current !== null) clearTimeout(timer.current);\n timer.current = null;\n polls.current = 0;\n };\n const present = (g: number, next: NativeScreen) => {\n if (current(g)) setScreen(next);\n };\n const keepOperation = (g: number, message: string) => {\n if (op.current && last.current) present(g, { kind: \"status\", status: last.current, message });\n else present(g, { kind: \"idle\", message });\n };\n const finishIf = (s: NativeImportStatus) => {\n if (!TERMINAL_PHASES.has(s.phase)) return false;\n op.current = null;\n last.current = null;\n stopPolling();\n if (s.committed > 0) onImported();\n return true;\n };\n const schedulePoll = (id: string) => {\n if (timer.current !== null || op.current?.id !== id) return;\n if (polls.current >= MAX_POLLS) {\n setScreen((s) => (s.kind === \"idle\" ? s : { ...s, message: \"Still running. Refresh to keep checking.\" }));\n return;\n }\n polls.current += 1;\n timer.current = setTimeout(() => {\n timer.current = null;\n if (op.current?.id === id) void refreshRef.current(true);\n }, POLL_DELAY_MS);\n };\n\n const invalidate = (message: string) => {\n generation.current += 1;\n const active = op.current;\n op.current = null;\n last.current = null;\n stopPolling();\n setBusy(false);\n setScreen({ kind: \"idle\", message });\n if (active) void bridge.request({ action: \"cancel\", operation_id: active.id }).catch(() => undefined);\n };\n\n const begin = async (organizationId: string) => {\n const g = ++generation.current;\n stopPolling();\n setBusy(true);\n setScreen({ kind: \"idle\", message: null });\n try {\n const result = await bridge.request({ action: \"begin_file_import\", organization_id: organizationId });\n if (isPreview(result)) throw new Error(\"The importer answered before it opened an import.\");\n if (!current(g)) {\n void bridge.request({ action: \"cancel\", operation_id: result.operation_id }).catch(() => undefined);\n return;\n }\n op.current = { id: result.operation_id, organizationId };\n last.current = result;\n if (result.phase === \"preview\" || result.phase === \"awaiting_confirmation\") {\n const preview = await loadFullPreview(bridge, result.operation_id, () => current(g));\n if (preview) present(g, { kind: \"preview\", status: result, preview, message: null });\n } else {\n present(g, { kind: \"status\", status: result, message: finishIf(result) ? terminalMessage(result) : null });\n if (ACTIVE_PHASES.has(result.phase)) schedulePoll(result.operation_id);\n }\n } catch (e) {\n if (current(g)) {\n if (op.current) keepOperation(g, fail(e, \"The importer could not open.\"));\n else setScreen({ kind: \"idle\", message: fail(e, \"The importer could not open.\") });\n }\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n const refresh = async (auto = false) => {\n const active = op.current;\n if (!active) return;\n if (!auto) stopPolling();\n const g = ++generation.current;\n if (!auto) setBusy(true);\n try {\n const result = await bridge.request({ action: \"status\", operation_id: active.id });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid update.\");\n last.current = result;\n if ((result.phase === \"preview\" || result.phase === \"awaiting_confirmation\") && active.organizationId) {\n const preview = await loadFullPreview(bridge, active.id, () => current(g));\n if (preview) present(g, { kind: \"preview\", status: result, preview, message: null });\n } else {\n const message = active.organizationId ? null : \"An interrupted import was found. Choose the file again before confirming.\";\n const done = finishIf(result);\n present(g, { kind: \"status\", status: result, message: done ? terminalMessage(result) : message });\n }\n if (ACTIVE_PHASES.has(result.phase) && op.current) schedulePoll(active.id);\n } catch (e) {\n keepOperation(g, fail(e, \"Progress could not be read.\"));\n } finally {\n if (!auto && current(g)) setBusy(false);\n }\n };\n refreshRef.current = refresh;\n\n const confirm = async () => {\n if (screen.kind !== \"preview\") return;\n const active = op.current;\n if (!active?.organizationId || active.id !== screen.preview.operation_id) return;\n if (!stillAllowed(active.organizationId)) return invalidate(\"That organization is no longer available. Choose the file again.\");\n const g = ++generation.current;\n stopPolling();\n setBusy(true);\n try {\n const scoped = await bridge.request({ action: \"choose_scope\", operation_id: active.id, organization_id: active.organizationId });\n if (!current(g)) return;\n if (isPreview(scoped)) throw new Error(\"The importer sent an invalid destination.\");\n const result = await bridge.request({ action: \"confirm\", operation_id: active.id, preview_digest: screen.preview.preview_digest });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid result.\");\n last.current = result;\n const done = finishIf(result);\n present(g, { kind: \"status\", status: result, message: done ? terminalMessage(result) : null });\n if (ACTIVE_PHASES.has(result.phase) && op.current) schedulePoll(active.id);\n } catch (e) {\n keepOperation(g, fail(e, \"The import could not be confirmed.\"));\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n const cancel = async () => {\n const active = op.current;\n if (!active) return;\n const g = ++generation.current;\n setBusy(true);\n try {\n const result = await bridge.request({ action: \"cancel\", operation_id: active.id });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid answer.\");\n last.current = result;\n const done = finishIf(result);\n present(g, { kind: \"status\", status: result, message: terminalMessage(result) });\n if (!done && ACTIVE_PHASES.has(result.phase)) schedulePoll(active.id);\n } catch (e) {\n keepOperation(g, fail(e, \"The import could not be cancelled.\"));\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n const recover = async () => {\n const g = ++generation.current;\n stopPolling();\n setBusy(true);\n try {\n const result = await bridge.request({ action: \"recover\" });\n if (!current(g)) return;\n if (isPreview(result)) throw new Error(\"The importer sent an invalid recovery.\");\n last.current = result;\n op.current = TERMINAL_PHASES.has(result.phase) ? null : { id: result.operation_id, organizationId: null };\n present(g, { kind: \"status\", status: result, message: op.current ? \"An interrupted import was found. Choose the file again before confirming.\" : terminalMessage(result) });\n if (op.current && ACTIVE_PHASES.has(result.phase)) schedulePoll(result.operation_id);\n } catch (e) {\n keepOperation(g, fail(e, \"Recovery could not run.\"));\n } finally {\n if (current(g)) setBusy(false);\n }\n };\n\n /** Back to the start (after a finished import). */\n const reset = () => {\n generation.current += 1;\n stopPolling();\n setBusy(false);\n setScreen({ kind: \"idle\", message: null });\n };\n\n const invalidateRef = useRef(invalidate);\n invalidateRef.current = invalidate;\n useEffect(() => {\n mounted.current = true;\n const off = bridge.subscribe?.(() => {\n if (op.current) invalidateRef.current(RESTART);\n });\n return () => {\n mounted.current = false;\n generation.current += 1;\n stopPolling();\n off?.();\n };\n }, [bridge]);\n\n return { screen, busy, begin, refresh: () => refresh(false), confirm, cancel, recover, reset };\n}\n","/**\n * THE SIDE PANEL'S FIRST SCREEN when the host is beside a tab (`host.page`): the site, the logins\n * the server says may fill it — each one row with one-click Fill, copy username, copy password and\n * the one-time code — \"Save a login\" prefilled with the page, a generator aimed at the page, and\n * the extension's two prompts (turn on filling, save this login). Everything that touches the page\n * is the host's (`host.ts`); this screen only asks.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"@ai-matrx/design-system\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { useConfirmed, wasCancelled } from \"../auth/IdentityGate\";\nimport type { VaultDefinition } from \"../definitions\";\nimport { CheckGlyph, ClockGlyph, GlobeGlyph, KeyGlyph, ListGlyph, MoreGlyph, PlusGlyph, RefreshGlyph, ShieldGlyph, UserGlyph, XGlyph } from \"../glyphs\";\nimport { ItemIcon } from \"../ItemIcon\";\nimport { USERNAME_KEYS } from \"../ItemPane\";\nimport { siteOf, type VaultItem } from \"../model\";\nimport { useCopy, useNotify } from \"../notice\";\nimport type { VaultPort } from \"../port\";\nimport { Empty, Section } from \"../ui\";\nimport { CaptureCard } from \"./CaptureCard\";\nimport { FillSetupCard } from \"./FillSetupCard\";\nimport type { CaptureHost, ExtensionFill, ExtensionPage, FillSetupHost, NewPasswordFieldsHost } from \"./host\";\nimport { PageGenerator } from \"./PageGenerator\";\nimport { BLOCK_WORDS, distinguish, FILL_WORDS, isFillablePage, MATCH_ERROR_WORDS, normalizeLoginUrl, pageSite, SIGN_IN_WORDS, type Said } from \"./page-logic\";\n\nexport interface PageViewProps {\n port: VaultPort;\n /** `host.page` — the tab beside the panel. */\n page: ExtensionPage;\n /** `host.fill`. Absent = no Fill buttons. */\n fill?: ExtensionFill | undefined;\n capture?: CaptureHost | undefined;\n fillSetup?: FillSetupHost | undefined;\n newPasswordFields?: NewPasswordFieldsHost | undefined;\n /** The loaded vault (rows read their icon, fields and one-time password from it). */\n items: readonly VaultItem[];\n definitions: readonly VaultDefinition[];\n onOpen: (itemId: string) => void;\n /** \"Save a login\": the new-item flow with this address filled in (origin + path; no query). */\n onNewForPage: (url: string) => void;\n /** \"All items\": the whole vault list. */\n onBrowse?: (() => void) | undefined;\n /** Something changed on the server (a capture saved): reload. */\n onChanged: () => void;\n /** Slot above the site: the vault / view pickers where there is no sidebar. */\n header?: ReactNode;\n}\n\nexport function PageView({ port, page, fill, capture, fillSetup, newPasswordFields, items, definitions, onOpen, onNewForPage, onBrowse, onChanged, header }: PageViewProps) {\n const [running, setRunning] = useState<string | null>(null);\n const [said, setSaid] = useState<Said | null>(null);\n const site = pageSite(page.url);\n const state = page.matchState ?? { status: \"ready\" as const };\n const fillable = new Set(page.fillableItemIds ?? page.matchingItemIds);\n const matches = page.matchingItemIds.map((id) => ({ itemId: id, item: items.find((i) => i.id === id) ?? null }));\n const named = matches.map((m) => ({ itemId: m.itemId, name: m.item?.name ?? \"Saved login\" }));\n const familyOf = (key: string) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n const canSave = isFillablePage(page.url);\n const signIn = page.signIn;\n\n const act = async (itemId: string, run: () => Promise<Said>, failed: Said) => {\n setRunning(itemId);\n setSaid(null);\n try {\n setSaid(await run());\n } catch {\n setSaid(failed);\n } finally {\n setRunning(null);\n }\n };\n\n let body: ReactNode;\n if (!page.url) body = <Empty>No page is open in this tab.</Empty>;\n else if (state.status === \"error\") {\n body = (\n <div className=\"flex items-center gap-2 px-3 py-2 sm:px-4\">\n <span role=\"alert\" className=\"min-w-0 flex-1 text-sm text-muted-foreground\">{MATCH_ERROR_WORDS[state.reason]}</span>\n <Button variant=\"outline\" icon={<RefreshGlyph />} onClick={state.retry}>Retry</Button>\n </div>\n );\n } else if (state.status === \"loading\") {\n body = (\n <div aria-busy=\"true\" aria-label=\"Checking saved logins\" className=\"flex flex-col\">\n {[0, 1].map((n) => (\n <div key={n} className=\"flex h-12 items-center gap-3 px-3\">\n <div className=\"size-8 animate-pulse rounded-lg bg-muted\" />\n <div className=\"h-3 w-1/2 animate-pulse rounded bg-muted\" />\n </div>\n ))}\n </div>\n );\n } else if (matches.length === 0) body = <Empty>No saved login for this site.</Empty>;\n else {\n body = (\n <ul className=\"flex flex-col\">\n {matches.map(({ itemId, item }) => (\n <MatchRow\n key={itemId}\n itemId={itemId}\n item={item}\n tag={distinguish({ itemId, name: item?.name ?? \"Saved login\" }, named)}\n family={item ? familyOf(item.definitionKey) : \"generic\"}\n port={port}\n busy={running !== null}\n running={running === itemId}\n onOpen={onOpen}\n onFill={fill && !page.blocked && fillable.has(itemId) && item?.capabilities.canUse !== false ? () => void act(itemId, async () => FILL_WORDS[await fill(itemId)], FILL_WORDS.unavailable) : null}\n onSignIn={signIn ? () => void act(itemId, async () => SIGN_IN_WORDS[await signIn(itemId)], SIGN_IN_WORDS.unknown) : null}\n />\n ))}\n </ul>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-y-auto bg-background text-foreground\">\n <div className=\"flex flex-col gap-3 px-3 pb-4 pt-3\">\n {header}\n <div className=\"flex min-h-7 items-center gap-2 px-1\">\n <GlobeGlyph className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\" title={page.url}>{site || \"No page open\"}</span>\n {page.refresh ? <Button variant=\"quiet\" icon={<RefreshGlyph />} aria-label=\"Check again\" onClick={page.refresh} /> : null}\n {onBrowse ? <Button variant=\"quiet\" icon={<ListGlyph />} onClick={onBrowse}>All items</Button> : null}\n </div>\n\n {fillSetup ? <FillSetupCard fillSetup={fillSetup} /> : null}\n {capture ? <CaptureCard capture={capture} onChanged={onChanged} /> : null}\n\n <Section\n title=\"This site\"\n actions={canSave ? <Button variant=\"quiet\" icon={<PlusGlyph />} onClick={() => onNewForPage(normalizeLoginUrl(page.url) ?? page.url)}>Save a login</Button> : null}\n >\n {body}\n </Section>\n\n {said ? <Outcome said={said} onDismiss={() => setSaid(null)} /> : page.blocked && page.url && state.status === \"ready\" ? <p className=\"px-1 text-xs text-muted-foreground\">{BLOCK_WORDS[page.blocked]}</p> : null}\n\n {newPasswordFields && canSave ? (\n <Section>\n <PageGenerator fields={newPasswordFields} />\n </Section>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction Outcome({ said, onDismiss }: { said: Said; onDismiss: () => void }) {\n return (\n <div role=\"status\" className=\"flex items-center gap-2 px-1\">\n {said.tone === \"success\" ? <CheckGlyph className=\"size-4 shrink-0 text-primary\" /> : <ShieldGlyph className=\"size-4 shrink-0 text-destructive\" />}\n <span className=\"min-w-0 flex-1 text-xs text-foreground\">{said.text}</span>\n <Button variant=\"quiet\" icon={<XGlyph />} aria-label=\"Dismiss\" onClick={onDismiss} />\n </div>\n );\n}\n\ninterface MatchRowProps {\n itemId: string;\n item: VaultItem | null;\n tag: string | null;\n family: string;\n port: VaultPort;\n busy: boolean;\n running: boolean;\n onOpen: (id: string) => void;\n onFill: (() => void) | null;\n onSignIn: (() => void) | null;\n}\n\n/** One login: icon · name / site · [Fill] [copy username] [copy password] [code] [⋯]. */\nfunction MatchRow({ itemId, item, tag, family, port, busy, running, onOpen, onFill, onSignIn }: MatchRowProps) {\n const confirmed = useConfirmed();\n const copy = useCopy();\n const notify = useNotify();\n const [reading, setReading] = useState(false);\n const usable = item?.capabilities.canUse ?? false;\n const user = usable ? item?.fields.find((f) => USERNAME_KEYS.test(f.key) && f.handling !== \"sealed\" && f.active) : undefined;\n const secret = usable && item?.capabilities.canReveal ? item?.fields.find((f) => f.key === \"password\" && f.handling === \"revealable\" && f.active) : undefined;\n const otp = usable && item?.authenticator?.enabled ? item : null;\n\n const read = async (label: string, run: () => Promise<string>) => {\n setReading(true);\n try {\n await copy(await confirmed(run), label);\n } catch (e) {\n if (!wasCancelled(e)) notify(e instanceof Error ? e.message : `${label} couldn’t be read`, \"error\");\n } finally {\n setReading(false);\n }\n };\n\n const subtitle = [item ? siteOf(item) || item.definitionLabel : \"\", tag].filter(Boolean).join(\" · \");\n return (\n <li className=\"flex h-12 items-center gap-1 pl-1 pr-2\" data-item={itemId}>\n <button type=\"button\" onClick={() => onOpen(itemId)} className=\"flex h-11 min-w-0 flex-1 items-center gap-3 rounded-lg px-2 text-left hover:bg-accent\">\n <ItemIcon definitionKey={item?.definitionKey ?? \"website_login\"} family={family} site={item ? siteOf(item) : \"\"} />\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">{item?.name ?? \"Saved login\"}</span>\n {subtitle ? <span className=\"truncate text-xs text-muted-foreground\">{subtitle}</span> : null}\n </span>\n </button>\n {onFill ? (\n <Button variant=\"primary\" disabled={busy} aria-busy={running || undefined} onClick={onFill} aria-label={`Fill ${item?.name ?? \"this login\"}`}>\n {running ? \"Filling…\" : \"Fill\"}\n </Button>\n ) : null}\n {user && item ? <Button variant=\"quiet\" icon={<UserGlyph />} aria-label={`Copy ${user.label}`} title={`Copy ${user.label}`} disabled={reading} onClick={() => void read(user.label, () => port.reveal(item, user.key))} /> : null}\n {secret && item ? <Button variant=\"quiet\" icon={<KeyGlyph />} aria-label=\"Copy password\" title=\"Copy password\" disabled={reading} onClick={() => void read(\"Password\", () => port.reveal(item, secret.key))} /> : null}\n {otp ? <Button variant=\"quiet\" icon={<ClockGlyph />} aria-label=\"Copy one-time code\" title=\"Copy one-time code\" disabled={reading} onClick={() => void read(\"One-time code\", async () => (await port.authenticator.code(otp)).code)} /> : null}\n {onSignIn ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"quiet\" icon={<MoreGlyph />} aria-label=\"More\" disabled={busy} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={onSignIn}><ShieldGlyph className=\"size-4\" />Sign me in</DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onOpen(itemId)}><ListGlyph className=\"size-4\" />Open item</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </li>\n );\n}\n","/**\n * \"Save this login?\" — the side panel's twin of the in-page prompt after a login is submitted.\n * Shows only metadata (site, username, saved logins to update); the password stays in the host,\n * which writes it to the vault itself. One card, no inner boxes.\n */\nimport { useState, useSyncExternalStore } from \"react\";\nimport { Button, SearchField } from \"@ai-matrx/design-system/controls\";\nimport { ShieldGlyph, XGlyph } from \"../glyphs\";\nimport { useNotify } from \"../notice\";\nimport type { CaptureDecision, CaptureHost } from \"./host\";\nimport { CAPTURE_WORDS, distinguish } from \"./page-logic\";\n\nexport interface CaptureCardProps {\n capture: CaptureHost;\n /** After a save or an update: reload the vault so the login shows. */\n onChanged?: () => void;\n}\n\nconst SEARCH_FROM = 4;\n\nexport function CaptureCard({ capture, onChanged }: CaptureCardProps) {\n const prompt = useSyncExternalStore(capture.subscribe, capture.get, capture.get);\n const notify = useNotify();\n const [busy, setBusy] = useState(false);\n const [q, setQ] = useState(\"\");\n if (!prompt) return null;\n\n const decide = async (d: CaptureDecision) => {\n setBusy(true);\n try {\n const r = await capture.decide(prompt.id, d);\n const said = CAPTURE_WORDS[r];\n if (said) notify(said.text, said.tone === \"success\" ? \"success\" : \"error\");\n if (r === \"saved\" || r === \"updated\") onChanged?.();\n } catch {\n notify(\"Matrx didn’t answer. Try again.\", \"error\");\n } finally {\n setBusy(false);\n }\n };\n\n const existing = prompt.existing;\n const needle = q.trim().toLocaleLowerCase();\n const shown = needle ? existing.filter((x) => x.name.toLocaleLowerCase().includes(needle)) : existing;\n\n return (\n <section aria-label=\"Save this login\" className=\"flex flex-col gap-2 rounded-xl border border-border bg-card px-3 py-2.5\">\n <div className=\"flex items-center gap-2.5\">\n <ShieldGlyph className=\"size-5 shrink-0 text-primary\" />\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">{prompt.unavailable ? \"Couldn’t hold this login\" : \"Save this login?\"}</span>\n <span className=\"truncate text-xs text-muted-foreground\">{prompt.username ? `${prompt.host} · ${prompt.username}` : prompt.host}</span>\n </div>\n <Button variant=\"quiet\" icon={<XGlyph />} aria-label=\"Not now\" disabled={busy} onClick={() => void decide({ action: \"dismiss\" })} />\n </div>\n\n {prompt.unavailable ? (\n <p className=\"text-xs text-muted-foreground\">Save it by hand with Save a login.</p>\n ) : (\n <>\n {existing.length > 0 ? (\n <div className=\"flex flex-col gap-1\">\n {existing.length >= SEARCH_FROM ? <SearchField value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Search logins\" aria-label=\"Search logins to update\" /> : null}\n <ul className=\"flex max-h-36 flex-col gap-px overflow-y-auto\">\n {shown.map((x) => {\n const tag = distinguish(x, existing);\n return (\n <li key={x.itemId} className=\"flex h-9 items-center gap-2 px-1\">\n <span className=\"min-w-0 flex-1 truncate text-sm\">\n {x.name}\n {tag ? <span className=\"text-muted-foreground\"> · {tag}</span> : null}\n </span>\n <Button variant=\"primary\" disabled={busy} onClick={() => void decide({ action: \"update\", itemId: x.itemId })} aria-label={`Update ${x.name}`}>\n Update\n </Button>\n </li>\n );\n })}\n {shown.length === 0 ? <li className=\"px-1 py-2 text-xs text-muted-foreground\">No saved login matches.</li> : null}\n </ul>\n </div>\n ) : null}\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant={existing.length > 0 ? \"outline\" : \"primary\"} disabled={busy} onClick={() => void decide({ action: \"save\" })}>\n {existing.length > 0 ? \"Save as new\" : \"Save\"}\n </Button>\n <Button variant=\"quiet\" disabled={busy} onClick={() => void decide({ action: \"never\" })}>\n Never here\n </Button>\n </div>\n </>\n )}\n </section>\n );\n}\n","/**\n * \"Turn on filling\" — this browser has no fill key yet. Registering one needs the person to\n * confirm it's them once (the bar 1Password and Bitwarden set for every new browser), two ways:\n * - their AI Matrx password, typed here: it stays in the uncontrolled box for one request and\n * is cleared at once — never in state, never kept;\n * - their passkey, on the AI Matrx web page the host opens (passkeys belong to the web app's\n * domain). Back in the panel, \"I approved\" claims it.\n * An account with neither is sent to add a passkey on the web.\n */\nimport { useNotify } from \"../notice\";\nimport { useRef, useState, useSyncExternalStore } from \"react\";\nimport { Button, Field } from \"@ai-matrx/design-system/controls\";\nimport { ExternalGlyph, KeyGlyph } from \"../glyphs\";\nimport type { FillSetupHost, FillSetupResult } from \"./host\";\nimport { fillSetupError } from \"./page-logic\";\n\nexport interface FillSetupCardProps {\n fillSetup: FillSetupHost;\n}\n\nexport function FillSetupCard({ fillSetup }: FillSetupCardProps) {\n const notify = useNotify();\n const state = useSyncExternalStore(fillSetup.subscribe, fillSetup.get, fillSetup.get);\n const box = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n if (state.status !== \"off\") return null;\n\n const finish = async (run: () => Promise<FillSetupResult>) => {\n setBusy(true);\n setError(null);\n try {\n const r = await run();\n if (!r.ok) setError(fillSetupError(r));\n else notify(\"Filling is on in this browser.\", \"success\");\n } catch {\n setError(\"That didn’t work. Try again.\");\n } finally {\n setBusy(false);\n }\n };\n\n const withPassword = () => {\n const field = box.current;\n const password = field?.value ?? \"\";\n if (field) field.value = \"\";\n if (!password) return setError(\"Enter your AI Matrx password.\");\n void finish(() => fillSetup.turnOnWithPassword(password));\n };\n\n const m = state.methods;\n const neither = m !== null && !m.password && !m.passkey;\n const showPassword = !neither && (m === null || m.password);\n const showPasskey = state.passkey !== null && (neither || m === null || m.passkey);\n\n return (\n <section aria-label=\"Turn on filling\" data-testid=\"fill-setup\" className=\"flex flex-col gap-2 rounded-xl border border-border bg-card px-3 py-2.5\">\n <div className=\"flex items-center gap-2.5\">\n <KeyGlyph className=\"size-5 shrink-0 text-primary\" />\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-sm font-medium\">Turn on filling</span>\n <span className=\"truncate text-xs text-muted-foreground\">{neither ? \"Add a passkey on the web first.\" : \"Confirm it’s you once in this browser.\"}</span>\n </div>\n </div>\n\n {showPassword ? (\n <form\n className=\"flex items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n withPassword();\n }}\n >\n <Field ref={box} className=\"min-w-0 flex-1\" type=\"password\" autoComplete=\"current-password\" placeholder=\"AI Matrx password\" aria-label=\"Your AI Matrx password\" disabled={busy} />\n <Button variant=\"primary\" type=\"submit\" disabled={busy}>Turn on</Button>\n </form>\n ) : null}\n\n {showPasskey ? (\n <Button variant=\"outline\" iconEnd={<ExternalGlyph />} disabled={busy} onClick={() => { setError(null); fillSetup.openPasskey(); }}>\n {neither ? \"Add a passkey\" : \"Use a passkey\"}\n </Button>\n ) : null}\n {showPasskey && state.awaitingPasskey && state.passkey ? (\n <div className=\"flex items-center gap-2\" data-testid=\"fill-setup-waiting\">\n <span className=\"min-w-0 flex-1 text-xs text-muted-foreground\">\n Approve code <span className=\"font-mono text-foreground\">{state.passkey.code}</span> on that page.\n </span>\n <Button variant=\"primary\" disabled={busy} onClick={() => void finish(() => fillSetup.finishPasskey())}>I approved</Button>\n </div>\n ) : null}\n\n {error ? <p role=\"alert\" className=\"text-xs text-destructive\">{error}</p> : null}\n </section>\n );\n}\n","/**\n * The generator, aimed at the page: generate, then \"Fill page\" puts it into the page's\n * new-password boxes (the host finds and fills them). Several sets of boxes → the person picks one.\n * No boxes → the value stays here for a moment so it can still be copied.\n */\nimport { useState } from \"react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@ai-matrx/design-system\";\nimport { Button } from \"@ai-matrx/design-system/controls\";\nimport { CheckGlyph, CopyGlyph, KeyGlyph } from \"../glyphs\";\nimport { PasswordGenerator, useGeneratorLimitsSource } from \"../generator/PasswordGenerator\";\nimport { useTransientSecret } from \"../hooks\";\nimport { useCopy } from \"../notice\";\nimport { Row } from \"../ui\";\nimport type { NewPasswordFieldsHost, NewPasswordTarget } from \"./host\";\nimport { FIND_WORDS, NEW_PASSWORD_WORDS, targetLabel, type Said } from \"./page-logic\";\n\nconst HOLD_MS = 60_000;\n\nexport function PageGenerator({ fields }: { fields: NewPasswordFieldsHost }) {\n const limits = useGeneratorLimitsSource();\n const copy = useCopy();\n const held = useTransientSecret(HOLD_MS);\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const [targets, setTargets] = useState<readonly NewPasswordTarget[]>([]);\n const [said, setSaid] = useState<Said | null>(null);\n if (!limits) return null;\n\n const say = setSaid;\n\n const put = async (targetId: string, value: string) => {\n setBusy(true);\n try {\n const r = await fields.use(targetId, value);\n say(NEW_PASSWORD_WORDS[r]);\n setTargets([]);\n if (r === \"filled\") held.clear();\n } catch {\n say(NEW_PASSWORD_WORDS.unavailable);\n } finally {\n setBusy(false);\n }\n };\n\n const onUse = async (value: string) => {\n setOpen(false);\n held.show(value);\n setSaid(null);\n setTargets([]);\n setBusy(true);\n try {\n const found = await fields.find();\n if (found.status !== \"ready\" || found.targets.length === 0) {\n setSaid({ text: FIND_WORDS[found.status === \"ready\" ? \"none\" : found.status], tone: \"warning\" });\n return;\n }\n const only = found.targets.length === 1 ? found.targets[0] : undefined;\n if (only && only.topFrame) {\n setBusy(false);\n await put(only.id, value);\n return;\n }\n setTargets(found.targets);\n } catch {\n setSaid({ text: FIND_WORDS.unavailable, tone: \"warning\" });\n } finally {\n setBusy(false);\n }\n };\n\n const value = held.value;\n return (\n <>\n <Row\n label=\"New password\"\n actions={\n <>\n {value ? <Button variant=\"quiet\" icon={<CopyGlyph />} aria-label=\"Copy password\" onClick={() => void copy(value, \"Password\")} /> : null}\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" icon={<KeyGlyph />} disabled={busy}>Generate</Button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"end\">\n {open ? <PasswordGenerator limits={limits} useLabel=\"Fill page\" onUse={(v) => void onUse(v)} /> : null}\n </PopoverContent>\n </Popover>\n </>\n }\n >\n {said ? (\n <span role=\"status\" className={said.tone === \"success\" ? \"line-clamp-2 text-xs text-foreground\" : \"line-clamp-2 text-xs text-muted-foreground\"}>{said.text}</span>\n ) : targets.length > 0 ? (\n <span className=\"text-xs text-muted-foreground\">Choose the boxes to fill.</span>\n ) : (\n <span className=\"text-xs text-disabled-foreground\">Fills the page’s new-password box</span>\n )}\n </Row>\n {value && targets.length > 0\n ? targets.map((t) => (\n <Row key={t.id} label={t.topFrame ? \"This page\" : \"In a frame\"} actions={<Button variant=\"primary\" icon={<CheckGlyph />} disabled={busy} onClick={() => void put(t.id, value)}>Fill</Button>}>\n <span className=\"block truncate text-sm\">{targetLabel(t)}</span>\n </Row>\n ))\n : null}\n </>\n );\n}\n","import { useState } from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { Select } from \"@ai-matrx/design-system/controls\";\nimport { CATEGORIES, categoryOf, type CategoryId, type VaultDefinition } from \"./definitions\";\nimport { ChevronDownGlyph, ChevronRightGlyph, ClockGlyph, DatabaseGlyph, ExportGlyph, FileGlyph, GlobeGlyph, GridGlyph, ImportGlyph, KeyGlyph, LockGlyph, NoteGlyph, PlugGlyph, SafeGlyph, ShieldGlyph, StarGlyph, TagGlyph, TerminalGlyph, TrashGlyph, type Glyph } from \"./glyphs\";\nimport type { VaultItem, VaultSelection } from \"./model\";\n\nexport interface VaultChoice {\n value: VaultSelection;\n label: string;\n count: number;\n}\n\n/** The vault dropdown: everything first, then the person's own, shared with them, and each organization. */\nexport function vaultChoices(items: readonly VaultItem[], organizations: readonly { id: string; name: string }[], current?: VaultSelection): VaultChoice[] {\n const n = (f: (i: VaultItem) => boolean) => items.filter(f).length;\n const shared = n((i) => i.owner.kind === \"shared\");\n return [\n { value: \"all\", label: \"All items\", count: items.length },\n { value: \"mine\", label: \"Personal\", count: n((i) => i.owner.kind === \"me\") },\n ...(shared > 0 ? [{ value: \"shared\", label: \"Shared with me\", count: shared }] : []),\n // Only organizations that hold something; an empty one is a dead end in a vault list.\n ...organizations.map((o) => ({ value: o.id, label: o.name, count: n((i) => i.owner.organizationId === o.id) })).filter((c) => c.count > 0 || c.value === current),\n ];\n}\n\nexport function VaultSelect({ value, choices, onChange }: { value: VaultSelection; choices: readonly VaultChoice[]; onChange: (v: VaultSelection) => void }) {\n return <Select value={value} onValueChange={onChange} aria-label=\"Vault\" options={choices.map((c) => ({ value: c.value, label: c.label, meta: String(c.count) }))} />;\n}\n\nconst CATEGORY_GLYPHS: Record<CategoryId, Glyph> = { logins: GlobeGlyph, passkeys: ShieldGlyph, api: KeyGlyph, oauth: PlugGlyph, infra: DatabaseGlyph, env: TerminalGlyph, files: FileGlyph, other: NoteGlyph };\n\nexport interface ViewEntry {\n view: string;\n label: string;\n count: number;\n glyph: Glyph;\n}\n\nexport interface Views {\n categories: ViewEntry[];\n tags: ViewEntry[];\n /** Undefined until read: a count is never shown as 0 before it is known. */\n favorites: number | undefined;\n authenticator: number;\n recent: number | undefined;\n}\n\nconst familyOf = (key: string, definitions: readonly VaultDefinition[]) => definitions.find((d) => d.key === key)?.family ?? \"generic\";\n\nexport function itemCategory(item: VaultItem, definitions: readonly VaultDefinition[]): CategoryId {\n return categoryOf(item.definitionKey, familyOf(item.definitionKey, definitions));\n}\n\n/** What the chosen vault holds, by category and tag, with counts. */\nexport function buildViews(items: readonly VaultItem[], definitions: readonly VaultDefinition[], favoriteIds: ReadonlySet<string> | null, recentIds: readonly string[] | null): Views {\n const byCat = new Map<CategoryId, number>();\n const byTag = new Map<string, number>();\n for (const i of items) {\n const c = itemCategory(i, definitions);\n byCat.set(c, (byCat.get(c) ?? 0) + 1);\n for (const t of i.tags) byTag.set(t, (byTag.get(t) ?? 0) + 1);\n }\n const ids = new Set(items.map((i) => i.id));\n return {\n categories: CATEGORIES.filter((c) => byCat.has(c.id)).map((c) => ({ view: `category:${c.id}`, label: c.label, count: byCat.get(c.id) ?? 0, glyph: CATEGORY_GLYPHS[c.id] })),\n tags: [...byTag.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([t, count]) => ({ view: `tag:${t}`, label: t, count, glyph: TagGlyph })),\n favorites: favoriteIds ? [...favoriteIds].filter((id) => ids.has(id)).length : undefined,\n authenticator: items.filter((i) => i.authenticator).length,\n recent: recentIds ? recentIds.filter((id) => ids.has(id)).length : undefined,\n };\n}\n\n/** Every view a list can show, in words (the list title and the phone's view picker). */\nexport function viewLabel(view: string, views: Views): string {\n if (view === \"favorites\") return \"Favorites\";\n if (view === \"recent\") return \"Recently opened\";\n if (view === \"authenticator\") return \"One-time passwords\";\n if (view === \"trash\") return \"Trash\";\n if (view === \"page\") return \"This page\";\n return [...views.categories, ...views.tags].find((v) => v.view === view)?.label ?? \"All items\";\n}\n\n/** The phone / side-panel picker: the same choices as the sidebar, in one dropdown. */\nexport function viewOptions(views: Views, allCount: number, deletedCount: number, hasFavorites: boolean, hasRecents: boolean, hasPage = false) {\n return [\n ...(hasPage ? [{ value: \"page\", label: \"This page\" }] : []),\n { value: \"all\", label: \"Every category\", meta: String(allCount) },\n ...(hasFavorites ? [{ value: \"favorites\", label: \"Favorites\", meta: views.favorites === undefined ? \"\" : String(views.favorites) }] : []),\n ...(hasRecents ? [{ value: \"recent\", label: \"Recently opened\", meta: views.recent === undefined ? \"\" : String(views.recent) }] : []),\n { value: \"authenticator\", label: \"One-time passwords\", meta: String(views.authenticator) },\n ...views.categories.map((v) => ({ value: v.view, label: v.label, meta: String(v.count) })),\n ...views.tags.map((v) => ({ value: v.view, label: `#${v.label}`, meta: String(v.count) })),\n { value: \"trash\", label: \"Trash\", meta: String(deletedCount) },\n ];\n}\n\nexport interface SidebarProps {\n vault: VaultSelection;\n choices: readonly VaultChoice[];\n onVault: (v: VaultSelection) => void;\n view: string;\n allCount: number;\n deletedCount: number;\n views: Views;\n hasFavorites: boolean;\n hasRecents: boolean;\n onView: (view: string) => void;\n onPanel: (panel: string) => void;\n /** Desktop only: the system's own password AutoFill (macOS), its state and its setup. */\n nativeProvider?: { status: \"ready\" | \"needs_setup\" | \"unavailable\"; openSetup: () => void } | undefined;\n hasNativeImport?: boolean;\n hasPage?: boolean;\n}\n\nfunction Entry({ on, glyph: Icon, label, count, onClick }: { on: boolean; glyph: Glyph; label: string; count?: number | undefined; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n aria-current={on ? \"page\" : undefined}\n onClick={onClick}\n className={cn(\"flex h-8 w-full items-center gap-2.5 rounded-lg px-2.5 text-left text-sm\", on ? \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\" : \"text-sidebar-foreground hover:bg-sidebar-accent\")}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {count !== undefined ? <span className=\"text-xs tabular-nums text-muted-foreground\">{count}</span> : null}\n </button>\n );\n}\n\nfunction Group({ title, children }: { title: string; children: React.ReactNode }) {\n return (\n <div className=\"flex flex-col gap-0.5\">\n <div className=\"px-2.5 pb-1 text-xs font-medium text-muted-foreground\">{title}</div>\n {children}\n </div>\n );\n}\n\nexport function Sidebar({ vault, choices, onVault, view, allCount, deletedCount, views, hasFavorites, hasRecents, onView, onPanel, nativeProvider, hasNativeImport = false, hasPage = false }: SidebarProps) {\n const [tagsOpen, setTagsOpen] = useState(view.startsWith(\"tag:\"));\n return (\n <nav aria-label=\"Vault\" className=\"flex h-full min-h-0 flex-col border-r border-sidebar-border bg-sidebar-background text-sidebar-foreground\">\n <div className=\"flex items-center gap-2 px-3 pb-2 pt-3\">\n <SafeGlyph className=\"size-5 shrink-0 text-primary\" />\n <div className=\"min-w-0 flex-1\">\n <VaultSelect value={vault} choices={choices} onChange={onVault} />\n </div>\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-2 pb-3 pt-1\">\n <div className=\"flex flex-col gap-0.5\">\n {hasPage ? <Entry on={view === \"page\"} glyph={GlobeGlyph} label=\"This page\" onClick={() => onView(\"page\")} /> : null}\n <Entry on={view === \"all\"} glyph={GridGlyph} label=\"All items\" count={allCount} onClick={() => onView(\"all\")} />\n {hasFavorites ? <Entry on={view === \"favorites\"} glyph={StarGlyph} label=\"Favorites\" count={views.favorites} onClick={() => onView(\"favorites\")} /> : null}\n {hasRecents ? <Entry on={view === \"recent\"} glyph={ClockGlyph} label=\"Recently opened\" count={views.recent} onClick={() => onView(\"recent\")} /> : null}\n <Entry on={view === \"authenticator\"} glyph={LockGlyph} label=\"One-time passwords\" count={views.authenticator} onClick={() => onView(\"authenticator\")} />\n </div>\n {views.categories.length > 0 ? (\n <Group title=\"Categories\">\n {views.categories.map((e) => <Entry key={e.view} on={view === e.view} glyph={e.glyph} label={e.label} count={e.count} onClick={() => onView(e.view)} />)}\n </Group>\n ) : null}\n {views.tags.length > 0 ? (\n <div className=\"flex flex-col gap-0.5\">\n <button type=\"button\" aria-expanded={tagsOpen} onClick={() => setTagsOpen((o) => !o)} className=\"flex h-7 items-center gap-1 rounded-md px-2.5 text-left text-xs font-medium text-muted-foreground hover:text-foreground\">\n {tagsOpen ? <ChevronDownGlyph className=\"size-3.5\" /> : <ChevronRightGlyph className=\"size-3.5\" />}\n Tags\n <span className=\"ml-auto tabular-nums\">{views.tags.length}</span>\n </button>\n {tagsOpen ? views.tags.map((e) => <Entry key={e.view} on={view === e.view} glyph={e.glyph} label={e.label} count={e.count} onClick={() => onView(e.view)} />) : null}\n </div>\n ) : null}\n </div>\n <div className=\"flex flex-col gap-0.5 border-t border-sidebar-border p-2\">\n <Entry on={view === \"trash\"} glyph={TrashGlyph} label=\"Trash\" count={deletedCount} onClick={() => onView(\"trash\")} />\n <Entry on={false} glyph={ImportGlyph} label=\"Import\" onClick={() => onPanel(\"import\")} />\n <Entry on={false} glyph={ExportGlyph} label=\"Export\" onClick={() => onPanel(\"export\")} />\n <Entry on={false} glyph={SafeGlyph} label=\"Backup\" onClick={() => onPanel(\"backup\")} />\n <Entry on={false} glyph={ShieldGlyph} label=\"Browsers that fill\" onClick={() => onPanel(\"devices\")} />\n {hasNativeImport ? <Entry on={false} glyph={ImportGlyph} label=\"Import passkeys\" onClick={() => onPanel(\"import-passkeys\")} /> : null}\n {nativeProvider && nativeProvider.status !== \"unavailable\" ? (\n <button type=\"button\" onClick={nativeProvider.openSetup} className=\"flex h-8 w-full items-center gap-2.5 rounded-lg px-2.5 text-left text-sm hover:bg-sidebar-accent\">\n <ShieldGlyph className=\"size-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">System AutoFill</span>\n <span className={cn(\"text-xs\", nativeProvider.status === \"ready\" ? \"text-success\" : \"text-warning\")}>{nativeProvider.status === \"ready\" ? \"On\" : \"Set up\"}</span>\n </button>\n ) : null}\n </div>\n </nav>\n );\n}\n","/**\n * THE vault client for every host: a VaultPort over the generated `@ai-matrx/api`. The web app, the\n * extension and the desktop app hand it their own `Api` (their own sign-in and organization) and get\n * identical behaviour; none of them keeps a hand-written vault client.\n */\nimport type { Api } from \"@ai-matrx/api\";\nimport * as account from \"@ai-matrx/api/account\";\nimport * as apps from \"@ai-matrx/api/apps\";\nimport * as platform from \"@ai-matrx/api/platform\";\nimport { humanize, parseDefinitions, type VaultDefinition } from \"./definitions\";\nimport { createActivityPort } from \"./activity/api\";\nimport { createAuthenticatorPort } from \"./authenticator/api\";\nimport { createFieldsPort } from \"./fields/api\";\nimport { createIoPort } from \"./io/api\";\nimport { createListsPort } from \"./lists/api\";\nimport type { VaultUserStateDoor } from \"./lists/port\";\nimport { fieldKeyOf, type FieldHandling, type UriMatchMode, type VaultField, type VaultItem, type VaultOrganizationRef, type VaultOwner } from \"./model\";\nimport type { SaveResult, VaultPort, VaultSnapshot } from \"./port\";\nimport type { PortContext } from \"./port-context\";\nimport { createSharingPort, type SharingPortOptions } from \"./sharing/api\";\nimport { createDevicesPort } from \"./devices/api\";\nimport type { PasskeyAuthLike } from \"./devices/port\";\nimport { readNativeImportLimits } from \"./native/api\";\n\ntype Wire = account.VaultItemOut;\n\ntype Recovery = { state?: unknown; deletion_id?: unknown; deleted_at?: unknown };\nconst recoveryOf = (w: Wire): Recovery | undefined => (w.lifecycle as { vault_recovery?: Recovery } | undefined)?.vault_recovery;\nconst isDeleted = (w: Wire): boolean => recoveryOf(w)?.state === \"deleted\";\nconst MATCH_MODES: readonly UriMatchMode[] = [\"host\", \"domain\", \"exact\", \"never\"];\n\nconst handlingOf = (v: unknown): FieldHandling => (v === \"visible\" || v === \"sealed\" ? v : \"revealable\");\n\nfunction fieldOf(w: account.VaultFieldOut, def: VaultDefinition | undefined): VaultField {\n const declared = def?.fields.find((f) => f.key === w.field_key);\n const handling = handlingOf(w.handling);\n return {\n id: w.id,\n key: w.field_key,\n label: declared?.label ?? humanize(w.field_key),\n kind: declared?.kind ?? (handling === \"visible\" ? \"text\" : \"secret\"),\n handling,\n editable: w.editable ?? true,\n envKey: w.env_key ?? null,\n injectIntoSandbox: w.inject_into_sandbox ?? false,\n description: w.description ?? \"\",\n active: w.is_active ?? true,\n };\n}\n\nfunction itemOf(w: Wire, owner: VaultOwner, defs: ReadonlyMap<string, VaultDefinition>, auth: ReadonlyMap<string, apps.AuthenticatorEntryOut>): VaultItem {\n const def = defs.get(w.definition_key ?? \"\");\n const a = auth.get(w.id);\n const cap = w.capabilities ?? {};\n const recovery = recoveryOf(w);\n return {\n id: w.id,\n name: w.display_name,\n description: w.description ?? \"\",\n definitionKey: w.definition_key ?? \"custom\",\n definitionLabel: def?.label ?? humanize(w.definition_key ?? \"custom\"),\n owner,\n tags: w.tags ?? [],\n loginUrls: w.login_urls ?? [],\n notes: w.notes ?? \"\",\n fields: (w.fields ?? []).filter((f) => f.execution_purpose !== \"passkey_private\").map((f) => fieldOf(f, def)),\n custom: (w.non_secret_fields ?? []).map((c) => ({ key: c[\"key\"] ?? \"\", label: c[\"label\"] ?? humanize(c[\"key\"] ?? \"\"), value: c[\"value\"] ?? \"\" })),\n authenticator: a ? { digits: a.digits, period: a.period, enabled: a.enabled } : null,\n capabilities: { canUse: cap.can_use ?? false, canEdit: cap.can_edit ?? false, canReveal: cap.can_reveal ?? false, canManage: cap.can_manage ?? false },\n attachments: (w.attachments ?? []).map((a) => ({ id: a.id, label: a.label, description: a.description ?? \"\", fileName: a.file_name, mediaType: a.media_type ?? \"application/octet-stream\", sizeBytes: a.size_bytes, handling: handlingOf(a.handling), createdAt: a.created_at, updatedAt: a.updated_at })),\n uriMatchMode: MATCH_MODES.find((m) => m === w.uri_match_mode) ?? \"host\",\n browserFillEnabled: w.browser_fill_enabled ?? true,\n accessMode: w.access_mode ?? null,\n ownerUserId: w.user_id ?? null,\n deletion: recovery?.state === \"deleted\" ? { deletionId: typeof recovery.deletion_id === \"string\" ? recovery.deletion_id : null, deletedAt: typeof recovery.deleted_at === \"string\" ? recovery.deleted_at : null } : null,\n updatedAt: w.updated_at,\n createdAt: w.created_at,\n };\n}\n\nexport interface ApiVaultPortOptions {\n /** Overrides the organizations the vault lists (default: the signed-in person's own). */\n organizations?: readonly VaultOrganizationRef[];\n /** The host's per-person state door (its supabase client): turns on Favorites and Recently opened. */\n userState?: VaultUserStateDoor;\n /** The host's `supabase.schema(\"platform\")`: turns on \"Sent links\" and the recipient's mobile in Send. */\n platformDoor?: SharingPortOptions[\"platformDoor\"];\n /** The host's `supabase.auth`: turns on approving a browser with a passkey. */\n passkeys?: PasskeyAuthLike;\n}\n\nconst VISIBLE_TTL_MS = 5 * 60_000;\n\n/** A dropped connection or a server hiccup (5xx) is tried again, twice, before it counts. A refusal (4xx) never is. */\nasync function retrying<T>(run: () => Promise<T>, tries = 3): Promise<T> {\n for (let attempt = 1; ; attempt++) {\n try {\n return await run();\n } catch (e) {\n const status = (e as { status?: unknown } | null)?.status;\n const transient = typeof status !== \"number\" || status >= 500;\n if (!transient || attempt >= tries) throw e;\n await new Promise((r) => setTimeout(r, 400 * attempt));\n }\n }\n}\n\nexport function createApiVaultPort(api: Api, options: ApiVaultPortOptions = {}): VaultPort {\n let defs: ReadonlyMap<string, VaultDefinition> = new Map();\n let auth: ReadonlyMap<string, apps.AuthenticatorEntryOut> = new Map();\n let orgs: readonly VaultOrganizationRef[] = [];\n const orgOf = (id: string | null | undefined, userId: string | null | undefined, mine: boolean): VaultOwner => {\n if (id) return { kind: \"organization\", label: orgs.find((o) => o.id === id)?.name ?? \"Organization\", organizationId: id };\n return mine || userId ? { kind: \"me\", label: \"Personal\", organizationId: null } : { kind: \"shared\", label: \"Shared with me\", organizationId: null };\n };\n\n async function refetch(id: string, owner: VaultOwner): Promise<VaultItem> {\n const w = await account.getItem(api, { path: { item_id: id } });\n return itemOf(w, owner, defs, auth);\n }\n\n const visibleCache = new Map<string, { at: number; value: string }>();\n const ctx: PortContext = {\n api,\n optsFor: (item) => (item.owner.organizationId ? { organizationId: item.owner.organizationId } : undefined),\n refetch,\n definition: (key) => defs.get(key),\n organizations: () => orgs,\n setAuthenticator: (itemId, entry) => {\n const next = new Map(auth);\n if (entry) next.set(itemId, entry);\n else next.delete(itemId);\n auth = next;\n },\n };\n\n return {\n authenticator: createAuthenticatorPort(ctx),\n sharing: createSharingPort(ctx, options.platformDoor ? { platformDoor: options.platformDoor } : {}),\n devices: createDevicesPort(ctx, options.passkeys),\n native: { limits: (organizationId) => readNativeImportLimits(api, organizationId) },\n activity: createActivityPort(ctx),\n io: createIoPort(ctx),\n fields: createFieldsPort(ctx),\n lists: createListsPort(ctx, options.userState),\n\n async load(): Promise<VaultSnapshot> {\n // Everything that does not need the organization list starts at once; the per-organization\n // lists start the moment it answers, while the rest is still in flight.\n const catalogP = retrying(() => apps.getAppCatalogKind(api, { path: { app: \"matrx\", kind: \"credential_definition\" } }));\n const authP = retrying(() => apps.listAuthenticators(api));\n const userP = retrying(() => account.listItems(api, { query: { principal_type: \"user\" } }));\n const sharedP = retrying(() => account.sharedWithMe(api));\n const org = options.organizations ? null : await retrying(() => platform.listMyOrganizations(api));\n // One row per organization: the server's list can name the same one twice.\n orgs = [...new Map((options.organizations ?? (org?.organizations ?? []).filter((o) => !o.archived_at).map((o) => ({ id: o.id, name: o.name }))).map((o) => [o.id, o])).values()];\n const orgListsP = orgs.map((o) => retrying(() => account.listItems(api, { query: { principal_type: \"organization\", organization_id: o.id } }, { organizationId: o.id })));\n // The person's own vault and the type catalog are the vault; without them it cannot open. Every\n // other part (an organization, shared items, one-time codes) that fails is named and skipped.\n const [catalog, mine] = await Promise.all([catalogP, userP]);\n const [authSettled, sharedSettled, ...orgSettled] = await Promise.allSettled([authP, sharedP, ...orgListsP]);\n const unavailable: string[] = [];\n const authList = authSettled.status === \"fulfilled\" ? authSettled.value : (unavailable.push(\"One-time codes\"), { entries: [] });\n const orgLists = orgSettled.map((r, i) => (r.status === \"fulfilled\" ? r.value : (unavailable.push(orgs[i]?.name ?? \"An organization\"), { items: [], count: 0 })));\n const shared = sharedSettled.status === \"fulfilled\" ? sharedSettled.value : (unavailable.push(\"Shared with me\"), { items: [], count: 0 });\n const lists = [mine, ...orgLists, shared];\n defs = new Map(parseDefinitions(catalog.filter((e) => e.is_active).map((e) => ({ key: e.key, payload: e.payload, sort_order: e.sort_order }))).map((d) => [d.key, d]));\n auth = new Map((authList.entries ?? []).map((a) => [a.credential_item_id, a]));\n\n const seen = new Map<string, VaultItem>();\n const deleted = new Map<string, VaultItem>();\n lists.forEach((l, i) => {\n const sharedList = i === lists.length - 1;\n for (const w of l.items) {\n if (seen.has(w.id) || deleted.has(w.id)) continue;\n const owner = sharedList ? orgOf(w.organization_id, null, false) : orgOf(w.organization_id, w.user_id, i === 0);\n const item = itemOf(w, sharedList && !w.organization_id ? { kind: \"shared\", label: \"Shared with me\", organizationId: null } : owner, defs, auth);\n // The server's list also returns deleted items (kept for recovery): they are the Trash, never the vault.\n (isDeleted(w) ? deleted : seen).set(w.id, item);\n }\n });\n return { unavailable, items: [...seen.values()], deleted: [...deleted.values()], organizations: orgs, definitions: [...defs.values()].sort((a, b) => a.sortOrder - b.sortOrder || a.label.localeCompare(b.label)) };\n },\n\n async reveal(item, fieldKey): Promise<string> {\n const field = item.fields.find((f) => f.key === fieldKey);\n const opts = item.owner.organizationId ? { organizationId: item.owner.organizationId } : undefined;\n if (field?.handling === \"visible\") {\n // A visible value (a username) shows every time an item opens; each read is an audited \"use\",\n // so one read per field is kept a few minutes instead of one per open.\n const key = `${item.id}/${fieldKey}/${field.id}`;\n const kept = visibleCache.get(key);\n if (kept && Date.now() - kept.at < VISIBLE_TTL_MS) return kept.value;\n const r = await account.resolve(api, { body: { refs: [{ item_id: item.id, field_key: fieldKey }] } }, opts);\n const value = r.values[`${item.id}/${fieldKey}`] ?? r.values[`${item.id}:${fieldKey}`] ?? \"\";\n visibleCache.set(key, { at: Date.now(), value });\n return value;\n }\n const r = await account.reveal(api, { path: { item_id: item.id }, body: { field_key: fieldKey } }, opts);\n return r.value;\n },\n\n async create(definition, organizationId, draft): Promise<SaveResult> {\n const declared = definition.fields;\n const encrypted = declared.filter((f) => f.storage === \"encrypted\" && (draft.values[f.key] ?? \"\") !== \"\");\n const meta = declared.filter((f) => f.storage === \"metadata\" && (draft.values[f.key] ?? \"\") !== \"\");\n const w = await account.createItem(api, {\n body: {\n display_name: draft.name.trim(),\n ...(draft.description.trim() ? { description: draft.description.trim() } : {}),\n definition_key: definition.key,\n provider_key: definition.providerKey,\n tags: draft.tags,\n login_urls: draft.loginUrls,\n notes: draft.notes || null,\n principal: organizationId ? { type: \"organization\", organization_id: organizationId } : { type: \"user\" },\n initiation: \"user\",\n non_secret_fields: [...meta.map((f) => ({ key: f.key, label: f.label, value: draft.values[f.key] ?? \"\" })), ...draft.custom.filter((c) => c.label.trim() !== \"\").map((c) => ({ key: c.key || fieldKeyOf(c.label), label: c.label, value: c.value }))],\n fields: [\n ...encrypted.map((f) => ({ field_key: f.key, value: draft.values[f.key] ?? \"\", handling: f.handling })),\n ...draft.secrets.filter((s) => s.label.trim() !== \"\" && s.value !== \"\").map((s) => ({ field_key: fieldKeyOf(s.label), value: s.value, handling: \"revealable\" as const })),\n ],\n },\n }, organizationId ? { organizationId } : undefined);\n // A one-time password is set up by the screen after this (it needs \"Confirm it's you\").\n const notice = null;\n return { item: itemOf(w, orgOf(w.organization_id, w.user_id, true), defs, auth), notice };\n },\n\n async save(item, definition, draft): Promise<SaveResult> {\n for (const k of [...visibleCache.keys()]) if (k.startsWith(`${item.id}/`)) visibleCache.delete(k);\n const opts = item.owner.organizationId ? { organizationId: item.owner.organizationId } : undefined;\n const meta = (definition?.fields ?? []).filter((f) => f.storage === \"metadata\");\n const body: account.VaultItemUpdateRequest = { initiation: \"user\" };\n if (draft.name !== item.name) body.display_name = draft.name.trim();\n if (draft.description !== item.description) {\n if (draft.description.trim() === \"\") body.clear_description = true;\n else body.description = draft.description.trim();\n }\n if (JSON.stringify(draft.tags) !== JSON.stringify(item.tags)) body.tags = draft.tags;\n if (JSON.stringify(draft.loginUrls) !== JSON.stringify(item.loginUrls)) body.login_urls = draft.loginUrls;\n if (draft.notes !== item.notes) {\n if (draft.notes === \"\") body.clear_notes = true;\n else body.notes = draft.notes;\n }\n const metaNow = meta.map((f) => ({ key: f.key, label: f.label, value: draft.values[f.key] ?? item.custom.find((c) => c.key === f.key)?.value ?? \"\" })).filter((m) => m.value !== \"\");\n const extras = draft.custom.filter((c) => !meta.some((f) => f.key === c.key) && c.label.trim() !== \"\").map((c) => ({ key: c.key || fieldKeyOf(c.label), label: c.label, value: c.value }));\n if (JSON.stringify(draft.custom) !== JSON.stringify(item.custom) || meta.some((f) => draft.values[f.key] !== undefined)) body.non_secret_fields = [...metaNow, ...extras];\n if (Object.keys(body).length > 1) await account.updateItem(api, { path: { item_id: item.id }, body }, opts);\n\n for (const [key, value] of Object.entries(draft.values)) {\n if (meta.some((f) => f.key === key) || value === \"\") continue;\n const existing = item.fields.find((f) => f.key === key);\n if (existing) await account.updateFieldValue(api, { path: { item_id: item.id, field_id: existing.id }, body: { value } }, opts);\n else {\n const declared = definition?.fields.find((f) => f.key === key);\n await account.addField(api, { path: { item_id: item.id }, body: { field_key: key, value, handling: declared?.handling ?? \"revealable\" } }, opts);\n }\n }\n for (const s of draft.secrets) {\n if (s.label.trim() === \"\" || s.value === \"\") continue;\n await account.addField(api, { path: { item_id: item.id }, body: { field_key: fieldKeyOf(s.label), value: s.value, handling: \"revealable\" } }, opts);\n }\n for (const id of draft.removed) await account.deleteField(api, { path: { item_id: item.id, field_id: id } }, opts);\n return { item: await refetch(item.id, item.owner), notice: null };\n },\n\n get: (item) => refetch(item.id, item.owner),\n\n async remove(item): Promise<void> {\n await account.deleteItem(api, { path: { item_id: item.id } }, ctx.optsFor(item));\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { PortContext } from \"../port-context\";\nimport { HistoryChangedError, type ActivityPort, type AuditEntry, type HistoryPage } from \"./port\";\n\nconst statusOf = (e: unknown): number | undefined => {\n const s = (e as { status?: unknown } | null)?.status;\n return typeof s === \"number\" ? s : undefined;\n};\n\nexport function historyPageOf(r: account.VaultPasswordHistoryResponse): HistoryPage {\n const valuesGone = r.value_availability === \"unavailable\";\n return {\n entries: [...r.entries]\n .sort((a, b) => b.revision - a.revision)\n .map((e) => ({ fieldId: e.field_id, revision: e.revision, recordedAt: e.recorded_at, available: !valuesGone && e.value_availability !== \"unavailable\" })),\n historyRevision: r.history_revision,\n restoreAvailable: r.restore_available === true,\n captureStartedAt: r.capture_cutoff_at ?? null,\n nextBefore: r.next_before_revision ?? null,\n omitted: r.omitted_count,\n incomplete: r.incomplete || r.omitted_count > 0,\n };\n}\n\nexport function auditEntryOf(e: account.VaultAuditEntry): AuditEntry {\n return { id: e.id, action: e.action, actorId: e.actor_id ?? null, fieldId: e.user_secret_id ?? null, metadata: { ...(e.metadata ?? {}) }, at: e.created_at };\n}\n\nexport function createActivityPort(ctx: PortContext): ActivityPort {\n return {\n async history(item, before) {\n const r = await account.listPasswordHistory(ctx.api, { path: { item_id: item.id }, query: { limit: 50, before_revision: before ?? null } }, ctx.optsFor(item));\n return historyPageOf(r);\n },\n async revealHistory(item, fieldId, revision) {\n const r = await account.revealPasswordHistory(ctx.api, { path: { item_id: item.id }, body: { field_id: fieldId, revision } }, ctx.optsFor(item));\n // Never show a value the server says belongs to a different field or revision.\n if (r.item_id !== item.id || r.field_id !== fieldId || r.revision !== revision) throw new Error(\"The server answered for a different value.\");\n return r.value;\n },\n async restoreHistory(item, fieldId, revision, expectedHistoryRevision) {\n try {\n await account.restorePasswordHistory(ctx.api, { path: { item_id: item.id }, body: { field_id: fieldId, revision, expected_history_revision: expectedHistoryRevision } }, ctx.optsFor(item));\n } catch (e) {\n if (statusOf(e) === 409) throw new HistoryChangedError();\n throw e;\n }\n return ctx.refetch(item.id, item.owner);\n },\n async audit(item, limit) {\n const r = await account.listAudit(ctx.api, { path: { item_id: item.id }, query: { limit: Math.min(500, Math.max(1, limit)) } }, ctx.optsFor(item));\n return r.entries.map(auditEntryOf).sort((a, b) => b.at.localeCompare(a.at));\n },\n async addFile(item, file, details) {\n const body = new FormData();\n body.append(\"file\", file, file.name);\n body.append(\"label\", details.label);\n if (details.description) body.append(\"description\", details.description);\n body.append(\"handling\", details.handling);\n await account.addAttachment(ctx.api, { path: { item_id: item.id }, body }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async updateFile(item, attachmentId, details) {\n const body: account.VaultAttachmentUpdateRequest = {};\n if (details.label !== undefined) body[\"label\"] = details.label;\n if (details.fileName !== undefined) body[\"file_name\"] = details.fileName;\n if (details.handling !== undefined) body[\"handling\"] = details.handling;\n if (details.description !== undefined) {\n if (details.description) body[\"description\"] = details.description;\n else body[\"clear_description\"] = true;\n }\n await account.updateAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachmentId }, body }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async replaceFile(item, attachmentId, file) {\n const body = new FormData();\n body.append(\"file\", file, file.name);\n await account.replaceAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachmentId }, body }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async deleteFile(item, attachmentId) {\n await account.deleteAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachmentId } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n async downloadFile(item, attachment) {\n if (attachment.handling === \"sealed\") throw new Error(\"Sealed files never download.\");\n const r = await account.downloadAttachment(ctx.api, { path: { item_id: item.id, attachment_id: attachment.id } }, ctx.optsFor(item));\n if (r instanceof Uint8Array) return r;\n if (r instanceof ArrayBuffer) return new Uint8Array(r);\n if (typeof r === \"string\") return new TextEncoder().encode(r);\n throw new Error(\"The file could not be read.\");\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport * as apps from \"@ai-matrx/api/apps\";\nimport type { PortContext } from \"../port-context\";\nimport { accountOfLabel } from \"./otpauth\";\nimport { MFA_METHOD_KEY, type AuthenticatorEntry, type AuthenticatorPort } from \"./port\";\n\nexport function entryOf(w: apps.AuthenticatorEntryOut): AuthenticatorEntry {\n return {\n itemId: w.credential_item_id,\n name: w.display_name,\n issuer: w.issuer?.trim() || null,\n account: accountOfLabel(w.label, w.issuer),\n digits: w.digits,\n period: w.period > 0 ? w.period : 30,\n algorithm: w.algorithm,\n enabled: w.enabled,\n loginUrls: w.login_urls ?? [],\n };\n}\n\nconst statusOf = (e: unknown): number | undefined => (e as { status?: unknown } | null)?.status as number | undefined;\n\nexport function createAuthenticatorPort(ctx: PortContext): AuthenticatorPort {\n const { api } = ctx;\n return {\n async list() {\n const r = await apps.listAuthenticators(api);\n return (r.entries ?? []).map(entryOf);\n },\n\n async get(item) {\n try {\n return entryOf(await apps.getAuthenticator(api, { path: { credential_item_id: item.id } }, ctx.optsFor(item)));\n } catch (e) {\n if (statusOf(e) === 404) return null;\n throw e;\n }\n },\n\n async code(item) {\n const r = await apps.getAuthenticatorCode(api, { path: { credential_item_id: item.id } }, ctx.optsFor(item));\n const period = item.authenticator?.period && item.authenticator.period > 0 ? item.authenticator.period : 30;\n return { code: r.code, periodSeconds: period, remainingSeconds: Math.max(1, Math.min(period, r.valid_for_seconds)) };\n },\n\n async enrol(item, input) {\n const raw = await apps.enroll(api, { body: { credential_item_id: item.id, enrollment_input: input.trim() } }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, raw);\n return entryOf(raw);\n },\n\n async enrolQrImage(item, image, fileName = \"qr.png\") {\n const body = new FormData();\n body.append(\"image\", image, fileName);\n const raw = await apps.enrollQr(api, { query: { credential_item_id: item.id }, body }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, raw);\n return entryOf(raw);\n },\n\n async setEnabled(item, enabled) {\n const raw = await apps.setEnabled(api, { path: { credential_item_id: item.id }, body: { enabled } }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, raw);\n return entryOf(raw);\n },\n\n async remove(item) {\n await apps.deleteAuthenticator(api, { path: { credential_item_id: item.id } }, ctx.optsFor(item));\n ctx.setAuthenticator(item.id, null);\n },\n\n async rename(item, name) {\n await account.updateItem(api, { path: { item_id: item.id }, body: { initiation: \"user\", display_name: name.trim() } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n\n async setMfaMethod(item, method) {\n const rest = item.custom.filter((c) => c.key !== MFA_METHOD_KEY).map((c) => ({ key: c.key, label: c.label, value: c.value }));\n const next = method ? [...rest, { key: MFA_METHOD_KEY, label: \"Two-factor method\", value: method }] : rest;\n await account.updateItem(api, { path: { item_id: item.id }, body: { initiation: \"user\", non_secret_fields: next } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { VaultItem } from \"../model\";\nimport type { PortContext } from \"../port-context\";\nimport type { DestinationResult, FieldsPort } from \"./port\";\n\n/** The fields client over the generated `@ai-matrx/api` only; each item's own organization header. */\nexport function createFieldsPort(ctx: PortContext): FieldsPort {\n const { api } = ctx;\n const reread = (item: VaultItem) => ctx.refetch(item.id, item.owner);\n\n return {\n async updateField(item, fieldId, patch) {\n const body: account.VaultFieldMetadataRequest = { initiation: \"user\" };\n if (patch.handling !== undefined) body.handling = patch.handling;\n if (patch.envKey !== undefined) {\n if (patch.envKey === null || patch.envKey.trim() === \"\") body.clear_env_key = true;\n else body.env_key = patch.envKey.trim();\n }\n if (patch.injectIntoSandbox !== undefined) body.inject_into_sandbox = patch.injectIntoSandbox;\n if (patch.editable !== undefined) body.editable = patch.editable;\n if (patch.description !== undefined) body.description = patch.description.trim();\n if (patch.active !== undefined) body.is_active = patch.active;\n await account.updateFieldMetadata(api, { path: { item_id: item.id, field_id: fieldId }, body }, ctx.optsFor(item));\n return reread(item);\n },\n\n async setValue(item, fieldId, value) {\n await account.updateFieldValue(api, { path: { item_id: item.id, field_id: fieldId }, body: { initiation: \"user\", value } }, ctx.optsFor(item));\n return reread(item);\n },\n\n async addField(item, input) {\n const envKey = input.envKey?.trim() || null;\n await account.addField(\n api,\n {\n path: { item_id: item.id },\n body: {\n field_key: input.key,\n value: input.value,\n handling: input.handling,\n env_key: envKey,\n // Never an impossible combination: without an env key a sandbox could never see it.\n inject_into_sandbox: Boolean(input.injectIntoSandbox && envKey),\n ...(input.description ? { description: input.description } : {}),\n },\n },\n ctx.optsFor(item),\n );\n return reread(item);\n },\n\n async removeField(item, fieldId) {\n await account.deleteField(api, { path: { item_id: item.id, field_id: fieldId } }, ctx.optsFor(item));\n return reread(item);\n },\n\n async rotate(item, values) {\n await account.rotate(api, { path: { item_id: item.id }, body: { initiation: \"user\", values } }, ctx.optsFor(item));\n return reread(item);\n },\n\n async updateItem(item, patch) {\n const body: account.VaultItemUpdateRequest = { initiation: \"user\" };\n if (patch.uriMatchMode !== undefined) body.uri_match_mode = patch.uriMatchMode;\n if (patch.browserFillEnabled !== undefined) body.browser_fill_enabled = patch.browserFillEnabled;\n if (patch.loginUrls !== undefined) body.login_urls = patch.loginUrls;\n await account.updateItem(api, { path: { item_id: item.id }, body }, ctx.optsFor(item));\n return reread(item);\n },\n\n async checkDestination(url, item): Promise<DestinationResult> {\n const r = await account.checkDestination(api, { body: { initiation: \"user\", url } }, item ? ctx.optsFor(item) : undefined);\n return { normalizedUrl: r.normalized_url, state: r.state, httpStatus: r.http_status ?? null };\n },\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { PortContext } from \"../port-context\";\nimport type { IoPort } from \"./port\";\n\nconst orgOpts = (organizationId: string | null) => (organizationId ? { organizationId } : undefined);\n\n/** A download the server answered with text (the CSV) or bytes (the backup). */\nfunction asText(answer: unknown): string {\n if (typeof answer === \"string\") return answer;\n if (answer instanceof Uint8Array) return new TextDecoder().decode(answer);\n throw new Error(\"The server's answer could not be read as a file.\");\n}\n\nfunction asBytes(answer: unknown): Uint8Array<ArrayBuffer> {\n if (answer instanceof Uint8Array) return new Uint8Array(answer);\n throw new Error(\"The server's answer could not be read as a file.\");\n}\n\nexport function createIoPort(ctx: PortContext): IoPort {\n const { api } = ctx;\n return {\n async createImported(body, organizationId, idempotencyKey) {\n const w = await account.createItem(api, { body: { ...body, initiation: \"user\" } }, { ...orgOpts(organizationId), headers: { \"Idempotency-Key\": idempotencyKey } });\n return { id: w.id, name: w.display_name };\n },\n\n async importEnv(envText, organizationId, injectIntoSandbox) {\n const principal = organizationId ? ({ type: \"organization\", organization_id: organizationId } as const) : ({ type: \"user\" } as const);\n const list = await account.importEnv(api, { body: { env_text: envText, inject_into_sandbox: injectIntoSandbox, principal, initiation: \"user\" } }, orgOpts(organizationId));\n return list.items.map((w) => ({ id: w.id, name: w.display_name }));\n },\n\n previewLoginCsv: (profile, itemIds) => account.previewLoginCsv(api, { body: { profile, item_ids: [...itemIds] } }),\n\n async downloadLoginCsv(profile, itemIds, revision) {\n return asText(await account.downloadLoginCsv(api, { body: { profile, item_ids: [...itemIds], revision } }));\n },\n\n previewBackup: (itemIds) => account.previewVaultBackup(api, { body: { item_ids: [...itemIds] } }),\n\n async downloadBackup({ itemIds, revision, passphrase, acceptOmissions }) {\n return asBytes(await account.downloadVaultBackup(api, { body: { item_ids: [...itemIds], revision, passphrase, accept_omissions: acceptOmissions } }));\n },\n\n previewRestore: (envelopeBase64, passphrase) => account.previewVaultRestore(api, { body: { envelope_base64: envelopeBase64, passphrase } }),\n\n restoreBackup: ({ envelopeBase64, passphrase, preview, restoreRunId, acceptOmissions }) =>\n account.restoreVaultBackup(api, {\n body: {\n envelope_base64: envelopeBase64,\n passphrase,\n expected_digest: preview.envelope_digest,\n preview_actor_id: preview.actor_id,\n preview_organization_id: preview.organization_id,\n restore_run_id: restoreRunId,\n accept_omissions: acceptOmissions,\n },\n }),\n };\n}\n","import * as account from \"@ai-matrx/api/account\";\nimport type { VaultItem } from \"../model\";\nimport type { PortContext } from \"../port-context\";\nimport { ENTITY_TYPE, favoriteIds, parseRecoveryPreview, recentIds, refusalText } from \"./logic\";\nimport type { ListsPort, VaultUserStateDoor } from \"./port\";\n\nasync function call(door: VaultUserStateDoor, fn: string, args?: Record<string, unknown>): Promise<unknown> {\n const { data, error } = await door.rpc(fn, args);\n if (error) throw new Error(error.message || `${fn} failed`);\n return data;\n}\n\n/** `door` is the host's per-person state door; without it favorites and recents are absent. */\ntype TrashRow = { entity_token?: unknown; id?: unknown; title?: unknown; label?: unknown; deleted_at?: unknown; organization_id?: unknown; is_mine?: unknown };\n\n/** A Trash row in the screens' shape: enough to list, search and restore it — nothing secret. */\nfunction trashItem(r: TrashRow, ctx: PortContext): VaultItem | null {\n if (r.entity_token !== \"credential_item\" || typeof r.id !== \"string\") return null;\n const org = typeof r.organization_id === \"string\" ? r.organization_id : null;\n return {\n id: r.id,\n name: typeof r.title === \"string\" && r.title ? r.title : \"Untitled\",\n description: \"\",\n definitionKey: \"custom\",\n definitionLabel: \"Credential\",\n owner: org ? { kind: \"organization\", label: ctx.organizations().find((o) => o.id === org)?.name ?? \"Organization\", organizationId: org } : { kind: r.is_mine === false ? \"shared\" : \"me\", label: r.is_mine === false ? \"Shared with me\" : \"Personal\", organizationId: null },\n tags: [],\n loginUrls: [],\n notes: \"\",\n fields: [],\n custom: [],\n authenticator: null,\n capabilities: { canUse: false, canEdit: false, canReveal: false, canManage: true },\n attachments: [],\n uriMatchMode: \"host\",\n browserFillEnabled: false,\n accessMode: null,\n ownerUserId: null,\n deletion: { deletionId: null, deletedAt: typeof r.deleted_at === \"string\" ? r.deleted_at : null },\n updatedAt: typeof r.deleted_at === \"string\" ? r.deleted_at : \"\",\n createdAt: \"\",\n };\n}\n\nconst previewOf = async (door: VaultUserStateDoor, id: string) => parseRecoveryPreview(await call(door, \"vault_recovery_preview\", { p_id: id }));\n\nexport function createListsPort(ctx: PortContext, door?: VaultUserStateDoor): ListsPort {\n return {\n async restore(item, knownDeletionId) {\n // A Trash row carries no recovery id; the recovery preview names it (metadata only, never values).\n let deletionId = knownDeletionId ?? item.deletion?.deletionId ?? null;\n if (!deletionId && door) {\n const p = await previewOf(door, item.id);\n if (!p.supported) throw new Error(refusalText(p.reason));\n deletionId = p.deletionId;\n }\n if (!deletionId) throw new Error(\"This item has no recovery record, so it can't be restored.\");\n const r = await account.restoreItem(ctx.api, { path: { item_id: item.id }, body: { deletion_id: deletionId, initiation: \"user\" } }, ctx.optsFor(item));\n return {\n item: await ctx.refetch(item.id, item.owner),\n restoredFields: r.restored_fields,\n restoredAttachments: r.restored_attachments,\n restoredPasskeys: r.restored_native_passkeys,\n alreadyRestored: r.already_restored,\n };\n },\n ...(door\n ? {\n preview: (item: VaultItem) => previewOf(door, item.id),\n trash: {\n list: async () => {\n // Every page: a list treated as complete is never read as one capped page.\n const PAGE = 500;\n const all: TrashRow[] = [];\n for (let offset = 0; ; offset += PAGE) {\n const rows = ((await call(door, \"trash_list\", { p_kinds: [\"credential_item\"], p_limit: PAGE, p_offset: offset })) as TrashRow[] | null) ?? [];\n all.push(...rows);\n if (rows.length < PAGE) break;\n }\n const items = all.map((r) => trashItem(r, ctx)).filter((i): i is VaultItem => i !== null);\n return [...new Map(items.map((i) => [i.id, i])).values()];\n },\n },\n favorites: {\n list: async () => favoriteIds(await call(door, \"ues_list\", { p_kind: \"favorite\" })),\n set: async (itemId: string, on: boolean) => {\n await call(door, \"ues_set\", { p_entity_type: ENTITY_TYPE, p_entity_id: itemId, p_is_favorite: on });\n },\n },\n recents: {\n list: async () => recentIds(await call(door, \"ues_list\")),\n record: async (itemId: string) => {\n await call(door, \"ues_touch\", { p_entity_type: ENTITY_TYPE, p_entity_id: itemId });\n },\n },\n }\n : {}),\n };\n}\n","import { isAuthenticatorStorage } from \"../model\";\n/** The sharing client: every call is the generated `@ai-matrx/api` one, with the item's own org header. */\nimport * as account from \"@ai-matrx/api/account\";\nimport { fieldKeyOf, type VaultOwner } from \"../model\";\nimport type { PortContext } from \"../port-context\";\nimport type { VaultUserStateDoor } from \"../lists/port\";\nimport { flagsOf, levelOf } from \"./logic\";\nimport type { EffectiveVaultAccess, MemberVaultAccess, SecureChannel, SharingPort, ShareGrant, VaultDestination } from \"./port\";\nimport { NOTE_MAX, SECURE_RESOURCE_TYPE, sentRowOf } from \"./secure-link-logic\";\n\nfunction grantOf(w: account.VaultGrantOut): ShareGrant {\n const org = Boolean(w.organization_id);\n return {\n id: w.id,\n kind: org ? \"organization\" : \"person\",\n label: org ? w.organization_name || \"Organization\" : w.email || w.user_id || \"Someone\",\n userId: w.user_id ?? null,\n organizationId: w.organization_id ?? null,\n level: levelOf(w),\n createdAt: w.created_at,\n };\n}\n\nconst MEMBER_ACCESS: readonly MemberVaultAccess[] = [\"none\", \"use\", \"editor\"];\nconst memberAccessOf = (v: unknown): MemberVaultAccess | null => MEMBER_ACCESS.find((a) => a === v) ?? null;\nconst effectiveOf = (v: unknown): EffectiveVaultAccess => (v === \"admin\" ? \"admin\" : memberAccessOf(v) ?? \"none\");\n\nconst notMovedOf = (w: unknown): string[] => {\n const v = (w as { fields_not_transferred?: unknown } | null)?.fields_not_transferred;\n return Array.isArray(v) ? v.filter((k): k is string => typeof k === \"string\") : [];\n};\n\nexport interface SharingPortOptions {\n /**\n * The host's database door on the `platform` schema (`supabase.schema(\"platform\")`). It is the only\n * way to read the links a person sent (`secure_delivery_sent`, their own rows) and the recipient's\n * texting-consented mobile (`secure_delivery_recipient_phone`); the API has no route for either.\n * Without it the \"Sent\" list and the mobile pre-fill are absent; sending and turning off still work.\n */\n platformDoor?: VaultUserStateDoor;\n}\n\nconst channelOf = (v: unknown): SecureChannel => (v === \"sms\" ? \"sms\" : \"email\");\n\nasync function rpc(door: VaultUserStateDoor, fn: string, args: Record<string, unknown>): Promise<unknown> {\n const { data, error } = await door.rpc(fn, args);\n if (error) throw new Error(error.message || `${fn} failed`);\n return data;\n}\n\nexport function createSharingPort(ctx: PortContext, options: SharingPortOptions = {}): SharingPort {\n const { api } = ctx;\n const door = options.platformDoor;\n const ownerAt = (to: VaultDestination): VaultOwner =>\n to ? { kind: \"organization\", label: ctx.organizations().find((o) => o.id === to)?.name ?? \"Organization\", organizationId: to } : { kind: \"me\", label: \"Personal\", organizationId: null };\n const principal = (to: VaultDestination) => (to ? { type: \"organization\" as const, organization_id: to } : { type: \"user\" as const });\n\n return {\n async grants(item) {\n const r = await account.listGrants(api, { path: { item_id: item.id } }, ctx.optsFor(item));\n return r.grants.map(grantOf);\n },\n\n async addPerson(item, email, level) {\n const w = await account.addGrant(api, { path: { item_id: item.id }, body: { recipient_email: email.trim(), ...flagsOf(level), initiation: \"user\" } }, ctx.optsFor(item));\n return grantOf(w);\n },\n\n async addOrganization(item, organizationId, level) {\n const w = await account.addOrganizationGrant(api, { path: { item_id: item.id }, body: { organization_id: organizationId, can_manage: level === \"edit\", initiation: \"user\" } }, ctx.optsFor(item));\n return grantOf(w);\n },\n\n async setLevel(item, grant, level) {\n const w = await account.updateGrant(api, { path: { item_id: item.id, grant_id: grant.id }, body: { ...flagsOf(level), initiation: \"user\" } }, ctx.optsFor(item));\n return grantOf(w);\n },\n\n async revoke(item, grant) {\n await account.removeGrant(api, { path: { item_id: item.id, grant_id: grant.id } }, ctx.optsFor(item));\n },\n\n async setAccessMode(item, mode, people) {\n const grantees = mode === \"restricted\" ? people.filter((g) => g.kind === \"person\" && g.userId).map((g) => ({ user_id: g.userId as string, ...flagsOf(g.level) })) : [];\n await account.share(api, { path: { item_id: item.id }, body: { access_mode: mode, grantees, initiation: \"user\" } }, ctx.optsFor(item));\n return ctx.refetch(item.id, item.owner);\n },\n\n async memberAccess(organizationId) {\n const r = await account.listMemberAccess(api, { path: { organization_id: organizationId } }, { organizationId });\n return {\n organizationId: r.organization_id,\n defaultAccess: memberAccessOf(r.default_access) ?? \"none\",\n members: r.members.map((m) => ({ userId: m.user_id, email: m.email ?? \"\", role: m.role, access: memberAccessOf(m.vault_access), effective: effectiveOf(m.effective_access) })),\n };\n },\n\n async setMemberAccess(organizationId, userId, access) {\n const r = await account.setMemberAccess(api, { path: { organization_id: organizationId, member_user_id: userId }, body: { access, initiation: \"user\" } }, { organizationId });\n return effectiveOf(r.effective_access);\n },\n\n async move(item, to) {\n const w = await account.transfer(api, { path: { item_id: item.id }, body: { to_principal: principal(to), initiation: \"user\" } }, ctx.optsFor(item));\n const owner = ownerAt(to);\n return { item: await ctx.refetch(item.id, owner), notMoved: notMovedOf(w) };\n },\n\n async giveOwnership(item, email) {\n const w = await account.transfer(api, { path: { item_id: item.id }, body: { recipient_email: email.trim(), initiation: \"user\" } }, ctx.optsFor(item));\n const to = (w as account.VaultTransferResponse).transferred_to;\n return { recipientEmail: to?.[\"email\"] ?? email.trim(), notMoved: notMovedOf(w) };\n },\n\n async copy(item, to) {\n const w = await account.fork(api, { path: { item_id: item.id }, body: { to_principal: principal(to), initiation: \"user\" } }, ctx.optsFor(item));\n return ctx.refetch(w.id, ownerAt(to));\n },\n\n async assign({ recipientEmail, definition, draft, generateFieldKey }) {\n const encrypted = definition.fields.filter((f) => f.storage === \"encrypted\" && f.key !== generateFieldKey && (draft.values[f.key] ?? \"\") !== \"\");\n const meta = definition.fields.filter((f) => f.storage === \"metadata\" && (draft.values[f.key] ?? \"\") !== \"\");\n const r = await account.assignToRecipient(api, {\n body: {\n recipient_email: recipientEmail.trim(),\n display_name: draft.name.trim(),\n ...(draft.description.trim() ? { description: draft.description.trim() } : {}),\n definition_key: definition.key,\n provider_key: definition.providerKey,\n tags: draft.tags,\n login_urls: draft.loginUrls,\n notes: draft.notes || null,\n generate_field_key: generateFieldKey,\n initiation: \"user\",\n non_secret_fields: [...meta.map((f) => ({ key: f.key, label: f.label, value: draft.values[f.key] ?? \"\" })), ...draft.custom.filter((c) => c.label.trim() !== \"\").map((c) => ({ key: c.key || fieldKeyOf(c.label), label: c.label, value: c.value }))],\n fields: [\n ...encrypted.map((f) => ({ field_key: f.key, value: draft.values[f.key] ?? \"\", handling: f.handling })),\n ...draft.secrets.filter((s) => s.label.trim() !== \"\" && s.value !== \"\").map((s) => ({ field_key: fieldKeyOf(s.label), value: s.value, handling: \"revealable\" as const })),\n ],\n },\n });\n return { id: r.id, name: r.display_name, recipientEmail: r.assigned_to?.[\"email\"] ?? recipientEmail.trim(), generated: r.generated === true };\n },\n\n async secureLinkOptions(item) {\n const r = await account.secureDeliveryOptions(api, { query: { resource_type: SECURE_RESOURCE_TYPE, resource_id: item.id } }, ctx.optsFor(item));\n return {\n // The authenticator's own storage is the one-time password, never a field to send.\n fields: r.protected_fields.filter((f) => !isAuthenticatorStorage(f.key)).map((f) => ({ key: f.key, label: f.label, available: f.available, reason: f.reason ?? null })),\n linkMinutes: r.link_ttl_minutes,\n codeMinutes: r.code_ttl_minutes,\n };\n },\n\n async sendSecureLink(item, input) {\n const email = input.email.trim();\n const phone = input.phone?.trim() || null;\n const name = input.name?.trim() || null;\n const note = input.note?.trim().slice(0, NOTE_MAX) || null;\n const r = await account.createSecureDelivery(api, {\n body: {\n resource_type: SECURE_RESOURCE_TYPE,\n resource_id: item.id,\n recipient_email: email || null,\n recipient_phone: phone,\n recipient_name: name,\n field_keys: [...input.fieldKeys],\n link_channel: email && phone ? input.linkBy : null,\n note,\n initiation: \"user\",\n },\n }, ctx.optsFor(item));\n return { id: r.delivery_id, linkBy: channelOf(r.link_channel), codeBy: channelOf(r.code_channel), sameChannel: r.same_channel, expiresAt: r.expires_at, fieldKeys: r.field_keys, sentence: r.sentence };\n },\n\n async revokeSecureLink(item, deliveryId) {\n const r = await account.revokeSecureDelivery(api, { path: { delivery_id: deliveryId } }, ctx.optsFor(item));\n return r.sentence;\n },\n\n ...(door\n ? {\n async sentSecureLinks(item) {\n const rows = await rpc(door, \"secure_delivery_sent\", { p_resource_type: SECURE_RESOURCE_TYPE, p_resource_id: item.id });\n return (Array.isArray(rows) ? rows : []).map(sentRowOf).filter((r): r is NonNullable<typeof r> => r !== null);\n },\n async phoneOnFile(email) {\n const v = await rpc(door, \"secure_delivery_recipient_phone\", { p_email: email.trim() });\n return typeof v === \"string\" && v !== \"\" ? v : null;\n },\n }\n : {}),\n };\n}\n\n","/**\n * The devices client over generated `@ai-matrx/api`, plus the browser half of ONE passkey ceremony:\n * ask the auth server for a challenge (the host's `auth`), have the browser's authenticator sign it,\n * and hand the signed assertion to aidream, which gives it to the auth server's verifier. The\n * assertion never goes to the auth server from here, so no new sign-in is created in this tab.\n */\nimport * as account from \"@ai-matrx/api/account\";\nimport type { PortContext } from \"../port-context\";\nimport { PASSKEY_RP_ID, addPasskeyFailure, passkeyFailure, passkeysWorkOn, requestOptions, serializeAssertion, type RequestOptionsJSON } from \"./logic\";\nimport type { DevicesPort, FillApprovalRequest, FillDevice, FillPasskeys, PasskeyAuthLike } from \"./port\";\n\nconst deviceOf = (w: account.VaultFillDeviceOut): FillDevice => ({\n id: w.id,\n label: w.label,\n origin: w.extension_origin ?? null,\n addedAt: w.registered_at ?? null,\n lastUsedAt: w.last_used_at ?? null,\n revokedAt: w.revoked_at ?? null,\n revokeReason: w.revoke_reason ?? null,\n keyThumbprint: w.key_thumbprint,\n});\n\nfunction createPasskeys(ctx: PortContext, auth: PasskeyAuthLike, rpId: string): FillPasskeys {\n return {\n rpId,\n available: () => typeof window !== \"undefined\" && passkeysWorkOn(window.location.hostname, typeof window.PublicKeyCredential !== \"undefined\", rpId),\n\n async approve(request: FillApprovalRequest) {\n const { data, error } = await auth.passkey.startAuthentication();\n if (error || !data) throw new Error(\"Your passkey could not start. Try again in a moment.\");\n let credential: Credential | null;\n try {\n credential = await navigator.credentials.get({ publicKey: requestOptions(data.options as RequestOptionsJSON) });\n } catch (e) {\n throw new Error(passkeyFailure(e instanceof DOMException ? e.name : \"\"));\n }\n if (!credential || !(credential instanceof PublicKeyCredential)) throw new Error(\"No passkey was chosen, so nothing was approved.\");\n const r = await account.approveFillDevice(ctx.api, {\n body: {\n key_thumbprint: request.keyThumbprint,\n label: request.label,\n device_kind: request.kind,\n challenge_id: data.challenge_id,\n credential: serializeAssertion(credential as PublicKeyCredential & { response: AuthenticatorAssertionResponse }),\n initiation: \"user\",\n },\n });\n return { expiresAt: r.expires_at };\n },\n\n async add() {\n const { error } = await auth.registerPasskey();\n if (error) throw new Error(addPasskeyFailure(error.message));\n },\n };\n}\n\n/** `auth` is the host's `supabase.auth`; without it the passkey half is absent and its controls hide. */\nexport function createDevicesPort(ctx: PortContext, auth?: PasskeyAuthLike, rpId = PASSKEY_RP_ID): DevicesPort {\n const port: DevicesPort = {\n async list() {\n const r = await account.listFillDevices(ctx.api);\n return r.devices.map(deviceOf);\n },\n async revoke(deviceId) {\n return deviceOf(await account.revokeFillDevice(ctx.api, { path: { device_id: deviceId } }));\n },\n stepUpMethods: () => account.fillDeviceStepUpMethods(ctx.api),\n async register(reg) {\n const w = await account.registerFillDevice(ctx.api, {\n body: { public_key_jwk: reg.publicKeyJwk, label: reg.label, extension_origin: reg.origin, password: reg.password, initiation: \"user\" },\n });\n return deviceOf(w);\n },\n };\n if (auth) port.passkeys = createPasskeys(ctx, auth, rpId);\n return port;\n}\n","import type { Api } from \"@ai-matrx/api\";\nimport * as account from \"@ai-matrx/api/account\";\n\n/** What the server will take from a passkey exchange file. */\nexport interface NativeImportLimits {\n maxFileBytes: number;\n maxItems: number;\n}\n\n/** The server's passkey-import limits. It also proves the person's organization can import at all. */\nexport async function readNativeImportLimits(api: Api, organizationId: string): Promise<NativeImportLimits> {\n const c = await account.importCapabilities(api, undefined, { organizationId });\n return { maxFileBytes: c.max_file_bytes, maxItems: c.max_transfer_items };\n}\n","import { createKnobReader, type KnobClient } from \"@ai-matrx/data/knobs\";\n\n/**\n * THE organization settings the vault obeys (`vault.generator.*`, `vault.import.*`): every limit is\n * a knob an organization sets, never a number in this package. Hosts build it once over their own\n * Supabase client; one round trip, then lookups.\n */\nexport type VaultKnobs = () => Promise<Readonly<Record<string, unknown>>>;\n\nconst FRESH_MS = 60_000;\n\nexport function createVaultKnobs(client: KnobClient, address: { organizationId: string; userId: string }): VaultKnobs {\n const reader = createKnobReader(client);\n let kept: { at: number; resolved: Readonly<Record<string, unknown>> } | null = null;\n return async () => {\n if (kept && Date.now() - kept.at < FRESH_MS) return kept.resolved;\n const snap = await reader.snapshot(address);\n kept = { at: Date.now(), resolved: snap.resolved };\n return snap.resolved;\n };\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","Button","SearchField","Select","confirm","timer","message","useCallback","useEffect","useRef","useState","Button","Badge","createContext","useContext","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","Ctx","createContext","useContext","useState","useRef","resolve","account","useEffect","useEffect","useState","Button","Field","cn","useCallback","useEffect","useRef","useState","timer","createContext","useContext","Dialog","DialogContent","DialogHeader","DialogTitle","cn","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","toggle","Button","cn","Field","storage","str","useEffect","useRef","useState","Button","cn","jsx","jsxs","useState","useRef","useEffect","Button","cn","Fragment","jsx","jsxs","MASK","useState","useRef","useCallback","useEffect","Button","toggle","Badge","useEffect","useState","Button","cn","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","useState","Button","Field","Select","useEffect","useRef","useState","Button","cn","siteOf","jsx","jsxs","cn","useState","useRef","useEffect","Button","useEffect","useRef","useState","useState","useRef","useEffect","useEffect","useRef","useState","Button","Field","Fragment","jsx","jsxs","useState","useEffect","useRef","timer","Button","Field","useState","Button","confirm","Fragment","jsx","jsxs","useState","confirm","Button","Fragment","jsx","jsxs","useState","Button","Select","Field","Fragment","jsx","jsxs","useState","useEffect","familyOf","Button","cn","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","useRef","useState","Badge","Button","Field","Select","confirm","jsx","jsxs","useState","Button","useRef","confirm","Badge","Field","Select","createContext","useContext","useEffect","useRef","useState","cn","Button","SegmentedControl","Select","Switch","jsx","jsxs","createContext","resolve","useContext","MASK","useState","useRef","ceilings","useEffect","Button","SegmentedControl","cn","Switch","Select","useEffect","useRef","useState","Button","Field","SegmentedControl","Switch","confirm","resolve","useState","Badge","Button","DisclosureHeader","Fragment","jsx","jsxs","message","Fragment","jsx","jsxs","Switch","useRef","useState","useEffect","bytes","confirm","Button","SegmentedControl","Field","useState","Button","Select","downloadFile","confirm","Fragment","jsx","jsxs","omissionText","useState","confirm","downloadFile","Button","Select","useEffect","useMemo","useRef","useState","Button","Select","Switch","Textarea","invalid","BlobReader","ZipReader","bytes","bytes","createCsvImportWorker","resolve","resolve","timer","Fragment","jsx","jsxs","useRef","useState","useEffect","useMemo","importEnv","Button","Select","Textarea","Switch","useEffect","useRef","useState","DropdownMenu","DropdownMenuContent","DropdownMenuTrigger","cn","Button","cn","jsx","cn","useEffect","useMemo","useRef","useState","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","cn","Badge","Button","Switch","confirm","useRef","useState","Badge","Button","Field","SegmentedControl","cn","confirm","downloadFile","Fragment","jsx","jsxs","messageOf","useState","useRef","bytes","downloadFile","cn","Button","Badge","confirm","SegmentedControl","Field","useState","Badge","Button","Textarea","Fragment","jsx","jsxs","MASK","say","useState","Button","Textarea","toggle","Badge","normalizeLoginUrl","same","useState","Button","jsx","useState","Button","useEffect","useState","confirm","Button","DisclosureHeader","Field","Select","cn","message","useState","cn","jsx","jsxs","useState","cn","useState","confirm","Button","Field","Select","jsx","jsxs","useState","confirm","Button","Select","Field","Fragment","jsx","jsxs","useState","useEffect","confirm","Button","Select","Field","DisclosureHeader","cn","Fragment","jsx","jsxs","useState","useMemo","useRef","useEffect","notice","confirm","Button","Badge","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","cn","Switch","jsx","jsxs","SORTS","useRef","useEffect","familyOf","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","useState","cn","useState","Button","matchesQuery","useEffect","useState","Button","Fragment","jsx","jsxs","useState","useEffect","Button","jsx","jsxs","useState","message","matchesQuery","Button","useMemo","useState","cn","Button","Field","SearchField","jsx","jsxs","useState","useMemo","Button","Field","cn","SearchField","useEffect","useRef","useState","confirm","Checkbox","Badge","Button","Field","RegionSkeleton","SegmentedControl","Textarea","str","jsx","jsxs","useState","useEffect","useRef","timer","confirm","toggle","jsxs","jsx","Badge","Button","Field","SegmentedControl","RegionSkeleton","Checkbox","Textarea","useCallback","useEffect","useState","confirm","Button","RegionSkeleton","bytes","message","Fragment","jsx","jsxs","messageOf","ErrorLine","useState","useCallback","useEffect","confirm","Button","RegionSkeleton","useEffect","useMemo","useState","confirm","Badge","Button","Select","plural","useEffect","useRef","useState","useState","useRef","timer","message","confirm","useEffect","Fragment","jsx","jsxs","Button","useMemo","useState","useEffect","confirm","plural","Select","Badge","useState","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","Button","useState","useSyncExternalStore","Button","SearchField","Fragment","jsx","jsxs","useSyncExternalStore","useState","Button","SearchField","useRef","useState","useSyncExternalStore","Button","Field","jsx","jsxs","useSyncExternalStore","useRef","useState","Field","Button","useState","Popover","PopoverContent","PopoverTrigger","Button","Fragment","jsx","jsxs","useState","say","value","Button","Popover","PopoverTrigger","PopoverContent","jsx","jsxs","useState","familyOf","Button","normalizeLoginUrl","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","useState","cn","Select","jsx","jsxs","Select","favoriteIds","recentIds","count","cn","useState","jsx","jsxs","useState","useEffect","useRef","useCallback","confirm","useMemo","Select","DropdownMenu","DropdownMenuTrigger","Button","DropdownMenuContent","DropdownMenuItem","SearchField","panel","message","account","apps","account","statusOf","account","account","account","PAGE","account","account","account","MATCH_MODES","a","fieldKey","r"]}
|