@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
CHANGED
|
@@ -103,7 +103,7 @@ var init_keepass_xml_worker_client = __esm({
|
|
|
103
103
|
// src/VaultApp.tsx
|
|
104
104
|
import { useCallback as useCallback5, useEffect as useEffect22, useMemo as useMemo6, useRef as useRef19, useState as useState39 } from "react";
|
|
105
105
|
import { DropdownMenu as DropdownMenu6, DropdownMenuContent as DropdownMenuContent6, DropdownMenuItem as DropdownMenuItem5, DropdownMenuTrigger as DropdownMenuTrigger6 } from "@ai-matrx/design-system";
|
|
106
|
-
import { Button as Button33, SearchField as SearchField4, Select as
|
|
106
|
+
import { Button as Button33, SearchField as SearchField4, Select as Select11 } from "@ai-matrx/design-system/controls";
|
|
107
107
|
import { confirm as confirm13 } from "@ai-matrx/kit/confirm-opener";
|
|
108
108
|
|
|
109
109
|
// src/notice.tsx
|
|
@@ -4560,7 +4560,7 @@ function ItemIcon({ definitionKey, family, site, size = "md", inverted = false }
|
|
|
4560
4560
|
import { useEffect as useEffect15, useMemo as useMemo3, useRef as useRef14, useState as useState25 } from "react";
|
|
4561
4561
|
import { DropdownMenu as DropdownMenu3, DropdownMenuContent as DropdownMenuContent3, DropdownMenuItem as DropdownMenuItem3, DropdownMenuSeparator as DropdownMenuSeparator3, DropdownMenuTrigger as DropdownMenuTrigger3 } from "@ai-matrx/design-system";
|
|
4562
4562
|
import { cn as cn12 } from "@ai-matrx/design-system";
|
|
4563
|
-
import { Button as Button21, CONTROLS_CONTAINER_CLASS,
|
|
4563
|
+
import { Badge as Badge7, Button as Button21, CONTROLS_CONTAINER_CLASS, OptionCombobox, Switch as Switch5 } from "@ai-matrx/design-system/controls";
|
|
4564
4564
|
import { confirm as confirm9 } from "@ai-matrx/kit/confirm-opener";
|
|
4565
4565
|
|
|
4566
4566
|
// src/activity/FilesSection.tsx
|
|
@@ -5612,7 +5612,7 @@ function ItemPane(props) {
|
|
|
5612
5612
|
const viewCustom = (item?.custom ?? []).filter((c) => !declaredKeys.has(c.key) && c.key !== MFA_METHOD_KEY && !isAuthenticatorStorage(c.key));
|
|
5613
5613
|
const isLogin = (item?.definitionKey ?? definition?.key) === "website_login" || (item?.definitionKey ?? definition?.key) === "username_password";
|
|
5614
5614
|
const typeLabel = definition?.label ?? item?.definitionLabel ?? "";
|
|
5615
|
-
const
|
|
5615
|
+
const shownOwner = mode === "new" ? owner === "me" ? { label: "Personal", glyph: /* @__PURE__ */ jsx26(PersonGlyph, {}) } : owner === "person" ? { label: "Someone else", glyph: /* @__PURE__ */ jsx26(SendGlyph, {}) } : { label: organizations.find((o) => o.id === owner)?.name ?? "Organization", glyph: /* @__PURE__ */ jsx26(BuildingGlyph, {}) } : item ? { label: item.owner.label, glyph: item.owner.kind === "me" ? /* @__PURE__ */ jsx26(PersonGlyph, {}) : item.owner.kind === "organization" ? /* @__PURE__ */ jsx26(BuildingGlyph, {}) : /* @__PURE__ */ jsx26(UsersGlyph, {}) } : null;
|
|
5616
5616
|
const tagsVisible = showTags || draft.tags.length > 0 || tagsText !== "";
|
|
5617
5617
|
const descriptionVisible = showDescription || draft.description !== "";
|
|
5618
5618
|
const header = /* @__PURE__ */ jsxs24("header", { className: "flex min-h-14 items-center gap-2 border-b border-border px-3 py-2 sm:gap-3 sm:px-5", children: [
|
|
@@ -5621,7 +5621,8 @@ function ItemPane(props) {
|
|
|
5621
5621
|
/* @__PURE__ */ jsxs24("div", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
5622
5622
|
/* @__PURE__ */ jsx26("h2", { className: "truncate text-base font-semibold leading-tight", children: editing ? draft.name || (mode === "new" ? `New ${typeLabel.toLowerCase()}` : item?.name) : item?.name }),
|
|
5623
5623
|
/* @__PURE__ */ jsxs24("span", { className: "flex min-w-0 items-center gap-1 text-xs text-muted-foreground", children: [
|
|
5624
|
-
/* @__PURE__ */ jsx26("span", { className: "truncate", children:
|
|
5624
|
+
typeLabel ? /* @__PURE__ */ jsx26("span", { className: "truncate", children: typeLabel }) : null,
|
|
5625
|
+
shownOwner ? /* @__PURE__ */ jsx26(Badge7, { className: "shrink-0", icon: shownOwner.glyph, "aria-label": `Saved in ${shownOwner.label}`, children: shownOwner.label }) : null,
|
|
5625
5626
|
item && !editing ? /* @__PURE__ */ jsx26(SharingSummary, { item, port, className: "hidden truncate before:mr-1 before:content-['\xB7'] sm:inline" }, `${item.updatedAt}-${refreshKey ?? ""}`) : null
|
|
5626
5627
|
] })
|
|
5627
5628
|
] }),
|
|
@@ -5697,8 +5698,25 @@ function ItemPane(props) {
|
|
|
5697
5698
|
notice && !editing ? /* @__PURE__ */ jsx26("div", { role: "status", className: "border-b border-border bg-muted px-5 py-2 text-sm text-warning", children: notice }) : null,
|
|
5698
5699
|
/* @__PURE__ */ jsx26("div", { className: "min-h-0 flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx26("div", { className: "mx-auto flex w-full max-w-3xl flex-col gap-5 px-3 py-4 sm:px-6 sm:py-6", children: editing ? /* @__PURE__ */ jsxs24(Fragment15, { children: [
|
|
5699
5700
|
/* @__PURE__ */ jsxs24(Section, { children: [
|
|
5701
|
+
mode === "new" ? /* @__PURE__ */ jsx26(Row, { label: "Save to", children: /* @__PURE__ */ jsx26(
|
|
5702
|
+
OptionCombobox,
|
|
5703
|
+
{
|
|
5704
|
+
value: owner,
|
|
5705
|
+
onChange: setOwner,
|
|
5706
|
+
ariaLabel: "Save to",
|
|
5707
|
+
searchable: organizations.length > 6,
|
|
5708
|
+
searchPlaceholder: "Find an organization",
|
|
5709
|
+
groups: [
|
|
5710
|
+
{ heading: "Just you", options: ["me"] },
|
|
5711
|
+
...organizations.length > 0 ? [{ heading: "Organizations", options: organizations.map((o) => o.id) }] : [],
|
|
5712
|
+
{ heading: "Send", options: ["person"] }
|
|
5713
|
+
],
|
|
5714
|
+
getLabel: (v) => v === "me" ? "Personal" : v === "person" ? "Someone else" : organizations.find((o) => o.id === v)?.name ?? v,
|
|
5715
|
+
getHint: (v) => v === "me" ? "Only you" : v === "person" ? "Sent by email" : null,
|
|
5716
|
+
renderIcon: (v) => v === "me" ? /* @__PURE__ */ jsx26(PersonGlyph, { className: "size-4" }) : v === "person" ? /* @__PURE__ */ jsx26(SendGlyph, { className: "size-4" }) : /* @__PURE__ */ jsx26(BuildingGlyph, { className: "size-4" })
|
|
5717
|
+
}
|
|
5718
|
+
) }) : null,
|
|
5700
5719
|
/* @__PURE__ */ jsx26(EditRow, { label: "Name", value: draft.name, onChange: (v) => patch({ name: v }), placeholder: "Name", autoFocus: mode === "new" }),
|
|
5701
|
-
mode === "new" ? /* @__PURE__ */ jsx26(Row, { label: "Save to", children: /* @__PURE__ */ jsx26(Select9, { 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" }] }) }) : null,
|
|
5702
5720
|
mode === "new" && owner === "person" ? /* @__PURE__ */ jsxs24(Fragment15, { children: [
|
|
5703
5721
|
/* @__PURE__ */ jsx26(EditRow, { label: "Their email", value: recipient, placeholder: "name@company.com", inputMode: "email", onChange: setRecipient }),
|
|
5704
5722
|
declared.some((f) => f.storage === "encrypted" && f.kind === "secret") ? /* @__PURE__ */ jsx26(Row, { label: "Password", hint: "You never see it", children: /* @__PURE__ */ jsx26(Switch5, { checked: generatePrivately, onCheckedChange: setGeneratePrivately, "aria-label": "Generate the password privately" }) }) : null
|
|
@@ -5848,8 +5866,9 @@ var SORTS2 = [
|
|
|
5848
5866
|
{ value: "updated", label: "Recently changed" },
|
|
5849
5867
|
{ value: "created", label: "Recently added" }
|
|
5850
5868
|
];
|
|
5851
|
-
function subtitleOf(item) {
|
|
5852
|
-
|
|
5869
|
+
function subtitleOf(item, withOwner) {
|
|
5870
|
+
const what = siteOf(item) || item.definitionLabel;
|
|
5871
|
+
return withOwner ? `${what} \xB7 ${item.owner.label}` : what;
|
|
5853
5872
|
}
|
|
5854
5873
|
function ItemList({ title, items, definitions, port, selectedId, onSelect, query, onQuery, sort, onSort, onNew, matchingIds, header }) {
|
|
5855
5874
|
const pinned = matchingIds ? items.filter((i) => matchingIds.has(i.id)) : [];
|
|
@@ -5870,7 +5889,8 @@ function ItemList({ title, items, definitions, port, selectedId, onSelect, query
|
|
|
5870
5889
|
listRef.current?.querySelector(`[data-item="${next.id}"]`)?.scrollIntoView({ block: "nearest" });
|
|
5871
5890
|
}
|
|
5872
5891
|
};
|
|
5873
|
-
const
|
|
5892
|
+
const mixedOwners = new Set(items.map((i) => i.owner.organizationId ?? i.owner.kind)).size > 1;
|
|
5893
|
+
const row = (i) => /* @__PURE__ */ jsx27(ListRow, { item: i, family: familyOf2(i.definitionKey), port, on: i.id === selectedId, onSelect, withOwner: mixedOwners }, i.id);
|
|
5874
5894
|
const sortLabel = SORTS2.find((s) => s.value === sort)?.label ?? "Name";
|
|
5875
5895
|
return /* @__PURE__ */ jsxs25("section", { "aria-label": title, className: "flex h-full min-h-0 flex-col border-r border-border bg-background", children: [
|
|
5876
5896
|
/* @__PURE__ */ jsxs25("div", { className: "flex flex-col gap-2 px-3 pb-2 pt-3", children: [
|
|
@@ -5902,7 +5922,7 @@ function ItemList({ title, items, definitions, port, selectedId, onSelect, query
|
|
|
5902
5922
|
] }) })
|
|
5903
5923
|
] });
|
|
5904
5924
|
}
|
|
5905
|
-
function ListRow({ item, family, port, on, onSelect }) {
|
|
5925
|
+
function ListRow({ item, family, port, on, onSelect, withOwner }) {
|
|
5906
5926
|
const confirmed = useConfirmed();
|
|
5907
5927
|
const copy = useCopy();
|
|
5908
5928
|
const notify = useNotify();
|
|
@@ -5933,7 +5953,7 @@ function ListRow({ item, family, port, on, onSelect }) {
|
|
|
5933
5953
|
/* @__PURE__ */ jsx27(ItemIcon, { definitionKey: item.definitionKey, family, site: siteOf(item), inverted: on }),
|
|
5934
5954
|
/* @__PURE__ */ jsxs25("span", { className: "flex min-w-0 flex-1 flex-col leading-tight", children: [
|
|
5935
5955
|
/* @__PURE__ */ jsx27("span", { className: "truncate text-sm font-medium", children: item.name }),
|
|
5936
|
-
/* @__PURE__ */ jsx27("span", { className: "truncate text-xs text-muted-foreground", children: subtitleOf(item) })
|
|
5956
|
+
/* @__PURE__ */ jsx27("span", { className: "truncate text-xs text-muted-foreground", children: subtitleOf(item, withOwner) })
|
|
5937
5957
|
] })
|
|
5938
5958
|
]
|
|
5939
5959
|
}
|
|
@@ -6201,7 +6221,7 @@ function NewItemFlow({ definitions, url, onUrl, onChoose, onCancel }) {
|
|
|
6201
6221
|
import { useEffect as useEffect18, useRef as useRef16, useState as useState30 } from "react";
|
|
6202
6222
|
import { confirm as confirm10 } from "@ai-matrx/kit/confirm-opener";
|
|
6203
6223
|
import { Checkbox as Checkbox2 } from "@ai-matrx/design-system";
|
|
6204
|
-
import { Badge as
|
|
6224
|
+
import { Badge as Badge8, Button as Button26, Field as Field11, RegionSkeleton as RegionSkeleton2, SegmentedControl as SegmentedControl5, Textarea as Textarea4 } from "@ai-matrx/design-system/controls";
|
|
6205
6225
|
|
|
6206
6226
|
// src/sharing/secure-link-logic.ts
|
|
6207
6227
|
import { formatDurationMinutes } from "@ai-matrx/kit/format";
|
|
@@ -6406,7 +6426,7 @@ function SecureLinkPanel({ item, port, onClose }) {
|
|
|
6406
6426
|
onClose,
|
|
6407
6427
|
footer: /* @__PURE__ */ jsxs29("div", { className: "flex w-full flex-wrap items-center gap-2", children: [
|
|
6408
6428
|
/* @__PURE__ */ jsx31("div", { className: "w-full sm:w-auto sm:min-w-0 sm:flex-1", children: /* @__PURE__ */ jsx31(StatusLine, { error, notice }) }),
|
|
6409
|
-
sameChannelSent && !error ? /* @__PURE__ */ jsx31(
|
|
6429
|
+
sameChannelSent && !error ? /* @__PURE__ */ jsx31(Badge8, { tone: "warning", children: "Both by email" }) : null,
|
|
6410
6430
|
/* @__PURE__ */ jsx31(Button26, { variant: "quiet", className: "ml-auto", onClick: onClose, children: "Close" }),
|
|
6411
6431
|
/* @__PURE__ */ jsx31(Button26, { variant: "primary", disabled: !canSend, onClick: () => void send(), children: busy === "send" ? "Sending\u2026" : "Send link" })
|
|
6412
6432
|
] }),
|
|
@@ -6463,7 +6483,7 @@ function SecureLinkPanel({ item, port, onClose }) {
|
|
|
6463
6483
|
] }) })
|
|
6464
6484
|
] }) : null,
|
|
6465
6485
|
sharing.sentSecureLinks ? /* @__PURE__ */ jsx31(Section, { title: "Sent links", children: sentError ? /* @__PURE__ */ jsx31(Empty, { children: /* @__PURE__ */ jsx31("span", { className: "text-destructive", children: sentError }) }) : !sent ? /* @__PURE__ */ jsx31(RegionSkeleton2, { shape: "rows", count: 2, "aria-label": "Loading sent links", className: "px-3 sm:px-4" }) : sent.length === 0 ? /* @__PURE__ */ jsx31(Empty, { children: "None yet" }) : sent.map((row) => /* @__PURE__ */ jsxs29(AccessLine, { glyph: row.status === "pending" ? ClockGlyph : row.fieldKeys.length ? LockGlyph : ShareGlyph, who: recipientOf(row), meta: sentMeta(row, options), children: [
|
|
6466
|
-
/* @__PURE__ */ jsx31(
|
|
6486
|
+
/* @__PURE__ */ jsx31(Badge8, { tone: STATUS_TONE[row.status] ?? "neutral", children: statusWord(row.status) }),
|
|
6467
6487
|
row.status === "pending" ? /* @__PURE__ */ jsx31(Button26, { variant: "quiet", disabled: busy !== null, onClick: () => void turnOff(row), children: "Turn off" }) : null
|
|
6468
6488
|
] }, row.id)) }) : null
|
|
6469
6489
|
]
|
|
@@ -6738,7 +6758,7 @@ function ApprovePanel({ port, host, onClose, approvalKey, label, kind = "browser
|
|
|
6738
6758
|
// src/native/NativeImportPanel.tsx
|
|
6739
6759
|
import { useEffect as useEffect21, useMemo as useMemo5, useState as useState33 } from "react";
|
|
6740
6760
|
import { confirm as confirm12 } from "@ai-matrx/kit/confirm-opener";
|
|
6741
|
-
import { Badge as
|
|
6761
|
+
import { Badge as Badge9, Button as Button28, Select as Select9 } from "@ai-matrx/design-system/controls";
|
|
6742
6762
|
|
|
6743
6763
|
// src/native/logic.ts
|
|
6744
6764
|
var ACTIVE_PHASES = /* @__PURE__ */ new Set(["authorizing", "importing"]);
|
|
@@ -7057,7 +7077,7 @@ function Importer({ bridge, readLimits, activeOrganizationId, organizations, onC
|
|
|
7057
7077
|
] }) : /* @__PURE__ */ jsx33(Button28, { variant: "quiet", onClick: onClose, children: "Close" });
|
|
7058
7078
|
return /* @__PURE__ */ jsxs31(Panel, { title: "Import passkeys", size: "lg", onClose, footer, children: [
|
|
7059
7079
|
screen.kind === "idle" ? /* @__PURE__ */ jsxs31(Section, { children: [
|
|
7060
|
-
/* @__PURE__ */ jsx33(Row, { label: "Save to", children: /* @__PURE__ */ jsx33(
|
|
7080
|
+
/* @__PURE__ */ jsx33(Row, { label: "Save to", children: /* @__PURE__ */ jsx33(Select9, { value: organizationId, options, "aria-label": "Save to", disabled: busy, onValueChange: setOrganizationId }) }),
|
|
7061
7081
|
/* @__PURE__ */ jsx33(Row, { label: "File", hint: limits ? `Up to ${plural2(limits.maxItems, "passkey")}` : "A passkey exchange file", children: /* @__PURE__ */ jsx33(Button28, { variant: "outline", icon: /* @__PURE__ */ jsx33(ImportGlyph, { className: "size-4" }), disabled: busy || !organizationId || limitError !== null, onClick: () => void flow.begin(organizationId), children: busy ? "Opening\u2026" : "Choose file" }) }),
|
|
7062
7082
|
/* @__PURE__ */ jsx33(Row, { label: "Interrupted", hint: "Finish or clear an earlier import", children: /* @__PURE__ */ jsx33(Button28, { variant: "quiet", disabled: busy, onClick: () => void flow.recover(), children: "Recover" }) })
|
|
7063
7083
|
] }) : null,
|
|
@@ -7065,7 +7085,7 @@ function Importer({ bridge, readLimits, activeOrganizationId, organizations, onC
|
|
|
7065
7085
|
Windowed,
|
|
7066
7086
|
{
|
|
7067
7087
|
items: preview.slots,
|
|
7068
|
-
render: (slot) => /* @__PURE__ */ jsx33(Row, { label: /* @__PURE__ */ jsx33(
|
|
7088
|
+
render: (slot) => /* @__PURE__ */ jsx33(Row, { label: /* @__PURE__ */ jsx33(Badge9, { tone: TONE[slot.disposition], children: dispositionLabel(slot.disposition) }), hint: void 0, children: /* @__PURE__ */ jsx33("span", { className: "block truncate text-foreground", title: slot.reason ?? void 0, children: slot.title ?? "Unnamed passkey" }) }, slot.slot_id)
|
|
7069
7089
|
}
|
|
7070
7090
|
) }) : null,
|
|
7071
7091
|
status && !preview ? /* @__PURE__ */ jsxs31(Section, { title: `${accounted(status)} of ${status.total} done`, children: [
|
|
@@ -7432,7 +7452,7 @@ function MatchRow({ itemId, item, tag, family, port, busy, running, onOpen, onFi
|
|
|
7432
7452
|
// src/Sidebar.tsx
|
|
7433
7453
|
import { useState as useState38 } from "react";
|
|
7434
7454
|
import { cn as cn15 } from "@ai-matrx/design-system";
|
|
7435
|
-
import { Select as
|
|
7455
|
+
import { Select as Select10 } from "@ai-matrx/design-system/controls";
|
|
7436
7456
|
import { jsx as jsx38, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
7437
7457
|
function vaultChoices(items, organizations, current) {
|
|
7438
7458
|
const n = (f) => items.filter(f).length;
|
|
@@ -7446,7 +7466,7 @@ function vaultChoices(items, organizations, current) {
|
|
|
7446
7466
|
];
|
|
7447
7467
|
}
|
|
7448
7468
|
function VaultSelect({ value, choices, onChange }) {
|
|
7449
|
-
return /* @__PURE__ */ jsx38(
|
|
7469
|
+
return /* @__PURE__ */ jsx38(Select10, { value, onValueChange: onChange, "aria-label": "Vault", options: choices.map((c) => ({ value: c.value, label: c.label, meta: String(c.count) })) });
|
|
7450
7470
|
}
|
|
7451
7471
|
var CATEGORY_GLYPHS = { logins: GlobeGlyph, passkeys: ShieldGlyph, api: KeyGlyph, oauth: PlugGlyph, infra: DatabaseGlyph, env: TerminalGlyph, files: FileGlyph, other: NoteGlyph };
|
|
7452
7472
|
var familyOf = (key, definitions) => definitions.find((d) => d.key === key)?.family ?? "generic";
|
|
@@ -7717,7 +7737,7 @@ function Workspace({ port, host = NO_HOST, layout = "auto", location, onLocation
|
|
|
7717
7737
|
const title = loc.vault === "all" && loc.view === "all" ? "All items" : viewLabel(loc.view, views);
|
|
7718
7738
|
const compactHeader = mode === "full" ? void 0 : /* @__PURE__ */ jsxs37("div", { className: "grid grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto] gap-2", children: [
|
|
7719
7739
|
/* @__PURE__ */ jsx39(VaultSelect, { value: loc.vault, choices, onChange: (vault) => go({ vault, itemId: null, panel: null }) }),
|
|
7720
|
-
/* @__PURE__ */ jsx39(
|
|
7740
|
+
/* @__PURE__ */ jsx39(Select11, { value: loc.view, onValueChange: (view) => go({ view, itemId: null, panel: null }), options: viewOptions(views, inThisVault.length, deleted.length, hasFavorites, port.lists.recents !== void 0, host.page !== void 0), "aria-label": "Show" }),
|
|
7721
7741
|
/* @__PURE__ */ jsxs37(DropdownMenu6, { children: [
|
|
7722
7742
|
/* @__PURE__ */ jsx39(DropdownMenuTrigger6, { asChild: true, children: /* @__PURE__ */ jsx39(Button33, { variant: "quiet", icon: /* @__PURE__ */ jsx39(MoreGlyph, {}), "aria-label": "Vault actions" }) }),
|
|
7723
7743
|
/* @__PURE__ */ jsxs37(DropdownMenuContent6, { align: "end", children: [
|