@hiai-gg/docsmint 0.4.5 → 0.4.7

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.
Files changed (30) hide show
  1. package/backend/src/lib/api-key-facade.ts +15 -0
  2. package/backend/src/lib/lifecycle-service.ts +191 -0
  3. package/dist/backend/index.js +1 -1
  4. package/dist/frontend/{HiaiDocsExtensionProvider-DHWLzRUu.js → HiaiDocsExtensionProvider-CMiTXi2J.js} +1 -1
  5. package/dist/frontend/{SettingsDialog-LyZUxxku.js → SettingsDialog-BB7h7GWw.js} +1 -1
  6. package/dist/frontend/{Sidebar-BsJsD1mJ.js → Sidebar-fbtYC3qs.js} +241 -225
  7. package/dist/frontend/app-shell.js +4 -4
  8. package/dist/frontend/components/settings.js +1 -1
  9. package/dist/frontend/components/sidebar.js +1 -1
  10. package/dist/frontend/{context-BMD6XTPe.js → context-KLiM3QQ0.js} +1 -0
  11. package/dist/frontend/dashboard.js +1 -1
  12. package/dist/frontend/extension.d.ts +2 -1
  13. package/dist/frontend/extension.js +1 -1
  14. package/dist/frontend/search.js +1 -1
  15. package/dist/frontend/shared-document.js +1 -1
  16. package/dist/frontend-ssr/app-shell.js +4 -4
  17. package/dist/frontend-ssr/assets/{HiaiDocsExtensionProvider-DAM-lX4R.js → HiaiDocsExtensionProvider-B_MrN08c.js} +1 -1
  18. package/dist/frontend-ssr/assets/{SettingsDialog-Dg97vv83.js → SettingsDialog-C2SMWJL8.js} +1 -1
  19. package/dist/frontend-ssr/assets/{Sidebar-CrDk_HYY.js → Sidebar-DKqmwreh.js} +38 -11
  20. package/dist/frontend-ssr/assets/{context-jz1GGEUi.js → context-BtCMqdVe.js} +1 -0
  21. package/dist/frontend-ssr/components/settings.js +1 -1
  22. package/dist/frontend-ssr/components/sidebar.js +1 -1
  23. package/dist/frontend-ssr/dashboard.js +1 -1
  24. package/dist/frontend-ssr/extension.js +1 -1
  25. package/dist/frontend-ssr/search.js +1 -1
  26. package/dist/frontend-ssr/shared-document.js +1 -1
  27. package/dist/lifecycle-runtime.js +88 -0
  28. package/package.json +6 -1
  29. package/packages/cli/src/index.ts +1 -1
  30. package/packages/mcp-server/src/index.ts +1 -1
@@ -1,9 +1,9 @@
1
1
  import { t as e } from "./Icon-CooFj4Ee.js";
2
- import { n as t, r as n } from "./SettingsDialog-LyZUxxku.js";
3
- import { t as r } from "./Sidebar-BsJsD1mJ.js";
2
+ import { n as t, r as n } from "./SettingsDialog-BB7h7GWw.js";
3
+ import { t as r } from "./Sidebar-fbtYC3qs.js";
4
4
  import { E as i } from "./messages-C5Q890i2.js";
5
5
  import { a, i as o } from "./route-context-BqQQ5c4i.js";
6
- import { t as s } from "./HiaiDocsExtensionProvider-DHWLzRUu.js";
6
+ import { t as s } from "./HiaiDocsExtensionProvider-CMiTXi2J.js";
7
7
  import "svelte/internal/disclose-version";
8
8
  import * as c from "svelte/internal/client";
9
9
  import "svelte/internal/flags/legacy";
@@ -179,7 +179,7 @@ function v(e, t) {
179
179
  c.delegate(["click"]);
180
180
  //#endregion
181
181
  //#region src/lib/hosts/DocsmintAppShellHost.svelte
182
- var y = c.from_html("<button type=\"button\" tabindex=\"-1\" aria-label=\"Close navigation menu\" class=\"fixed inset-0 z-40 bg-black/50\"></button>"), b = c.from_html("<div class=\"flex h-screen\" data-docsmint-app-shell-host=\"\"><!> <main id=\"main-content\" class=\"relative z-0 flex-1 overflow-auto\"><!></main></div> <!> <!>", 1), x = c.from_html("<!> <!>", 1);
182
+ var y = c.from_html("<button type=\"button\" tabindex=\"-1\" aria-label=\"Close navigation menu\" class=\"fixed inset-0 z-40 bg-black/50\"></button>"), b = c.from_html("<div class=\"flex h-screen\" data-docsmint-app-shell-host=\"\"><!> <main id=\"main-content\" class=\"relative flex-1 overflow-auto\"><!></main></div> <!> <!>", 1), x = c.from_html("<!> <!>", 1);
183
183
  function S(e, i) {
184
184
  c.push(i, !0);
185
185
  let l = c.prop(i, "request", 19, () => ({ fetch })), u = c.prop(i, "extensions", 19, () => ({}));
@@ -1,2 +1,2 @@
1
- import { t as e } from "../SettingsDialog-LyZUxxku.js";
1
+ import { t as e } from "../SettingsDialog-BB7h7GWw.js";
2
2
  export { e as SettingsDialog };
@@ -1,2 +1,2 @@
1
- import { t as e } from "../Sidebar-BsJsD1mJ.js";
1
+ import { t as e } from "../Sidebar-fbtYC3qs.js";
2
2
  export { e as Sidebar };
@@ -2,6 +2,7 @@ import { createContext as e } from "svelte";
2
2
  //#region src/lib/extensions/context.ts
3
3
  function t(e = {}) {
4
4
  return {
5
+ sidebarTop: [...e.sidebarTop ?? []],
5
6
  navigation: [...e.navigation ?? []],
6
7
  dashboardWidgets: [...e.dashboardWidgets ?? []],
7
8
  searchWidgets: [...e.searchWidgets ?? []],
@@ -18,7 +18,7 @@ import { a as Ne, i as Pe, n as Fe, o as B, r as Ie, t as Le } from "./dialog-Be
18
18
  import { t as V } from "./label-C2HfJNQ2.js";
19
19
  import { n as Re } from "./client-GbtOH90i.js";
20
20
  import { i as ze } from "./categories-Drnns7N6.js";
21
- import { t as Be } from "./context-BMD6XTPe.js";
21
+ import { t as Be } from "./context-KLiM3QQ0.js";
22
22
  import { t as Ve } from "./resolve-BG4HgzpN.js";
23
23
  import { a as He, i as Ue, n as We, r as Ge, t as Ke } from "./select-value-GXwx90Pr.js";
24
24
  import { c as H, i as qe, o as Je } from "./documents-Bc7b_MSZ.js";
@@ -10,6 +10,7 @@ export type ExtensionIcon = ComponentType<SvelteComponent>;
10
10
  export interface DocTabPanelProps { documentId: string; content: string; contentJson: object | undefined; }
11
11
  export interface DocTabDefinition { id: string; label: string; component: Component<DocTabPanelProps>; order?: number; icon?: ExtensionIcon; disabled?: boolean; }
12
12
  export interface NavigationExtension { id: string; label: string; href?: string; icon?: ExtensionIcon; order?: number; badge?: string | number; disabled?: boolean; visible?: ExtensionVisibility; }
13
+ export interface SidebarTopExtension { id: string; component: Component<{ collapsed: boolean }>; order?: number; visible?: ExtensionVisibility; }
13
14
  export interface DashboardWidgetProps { userId?: string; }
14
15
  export interface DashboardWidgetExtension { id: string; title?: string; component: Component<DashboardWidgetProps>; order?: number; colSpan?: 1 | 2 | 3 | 4 | 6 | 12; visible?: ExtensionVisibility; }
15
16
  export interface SearchWidgetProps { query: string; loading: boolean; total?: number; }
@@ -28,7 +29,7 @@ export interface CommandPaletteActionExtension { id: string; label: string; keyw
28
29
  export interface SharedDocumentExtensionCapability { id: string; expiresAt: string; }
29
30
  export interface SharedDocumentExtensionContext { documentId: string; title: string; content: string; contentJson?: object; role: "viewer" | "commenter" | "editor"; capability: SharedDocumentExtensionCapability; permissions: { read: true; annotate: boolean; edit: boolean; export: boolean; }; }
30
31
  export interface SharedDocumentExtension { id: string; label: string; icon?: ExtensionIcon; order?: number; permission: "annotate" | "edit"; visible?: (context: SharedDocumentExtensionContext) => boolean; component: Component<{ context: SharedDocumentExtensionContext }>; }
31
- export interface DocsmintFrontendExtensions { navigation: readonly NavigationExtension[]; dashboardWidgets: readonly DashboardWidgetExtension[]; searchWidgets: readonly SearchWidgetExtension[]; documentTabs: readonly DocTabDefinition[]; editorActions: readonly EditorActionExtension[]; documentMenuActions: readonly DocumentMenuActionExtension[]; settingsSections: readonly SettingsSectionExtension[]; commandPaletteActions: readonly CommandPaletteActionExtension[]; sharedDocumentHeaderActions: readonly SharedDocumentExtension[]; sharedDocumentTabs: readonly SharedDocumentExtension[]; sharedDocumentNotesModes: readonly SharedDocumentExtension[]; sharedDocumentEditorModes: readonly SharedDocumentExtension[]; }
32
+ export interface DocsmintFrontendExtensions { sidebarTop: readonly SidebarTopExtension[]; navigation: readonly NavigationExtension[]; dashboardWidgets: readonly DashboardWidgetExtension[]; searchWidgets: readonly SearchWidgetExtension[]; documentTabs: readonly DocTabDefinition[]; editorActions: readonly EditorActionExtension[]; documentMenuActions: readonly DocumentMenuActionExtension[]; settingsSections: readonly SettingsSectionExtension[]; commandPaletteActions: readonly CommandPaletteActionExtension[]; sharedDocumentHeaderActions: readonly SharedDocumentExtension[]; sharedDocumentTabs: readonly SharedDocumentExtension[]; sharedDocumentNotesModes: readonly SharedDocumentExtension[]; sharedDocumentEditorModes: readonly SharedDocumentExtension[]; }
32
33
  /** @deprecated Use DocsmintFrontendExtensions. */
33
34
  export type HiaiDocsFrontendExtensions = DocsmintFrontendExtensions;
34
35
  export type FrontendExtensions = DocsmintFrontendExtensions;
@@ -1,2 +1,2 @@
1
- import { t as e } from "./HiaiDocsExtensionProvider-DHWLzRUu.js";
1
+ import { t as e } from "./HiaiDocsExtensionProvider-CMiTXi2J.js";
2
2
  export { e as DocsmintExtensionProvider };
@@ -11,7 +11,7 @@ import { At as m, Ct as h, Dt as g, Et as _, Ft as v, Gr as y, Ii as b, It as x,
11
11
  import { n as Ce, o as we, r as j, t as Te } from "./route-context-BqQQ5c4i.js";
12
12
  import { n as M } from "./client-GbtOH90i.js";
13
13
  import { i as Ee } from "./categories-Drnns7N6.js";
14
- import { t as De } from "./context-BMD6XTPe.js";
14
+ import { t as De } from "./context-KLiM3QQ0.js";
15
15
  import { t as Oe } from "./resolve-BG4HgzpN.js";
16
16
  import { i as ke } from "./search-preferences-B1GdbdUc.js";
17
17
  import { a as Ae, i as je, n as Me, r as Ne, t as Pe } from "./select-value-GXwx90Pr.js";
@@ -1,4 +1,4 @@
1
- import { t as e } from "./context-BMD6XTPe.js";
1
+ import { t as e } from "./context-KLiM3QQ0.js";
2
2
  import "svelte/internal/disclose-version";
3
3
  import * as t from "svelte/internal/client";
4
4
  //#region src/lib/components/editor/shared-document.ts
@@ -1,9 +1,9 @@
1
1
  import { T as scroll_to_top_aria } from "./assets/messages-CvqpZNJe.js";
2
2
  import { t as Icon } from "./assets/Icon-B0Zqppjo.js";
3
- import { n as searchPreferences, r as editorPreferences } from "./assets/SettingsDialog-Dg97vv83.js";
4
- import { t as Sidebar } from "./assets/Sidebar-CrDk_HYY.js";
3
+ import { n as searchPreferences, r as editorPreferences } from "./assets/SettingsDialog-C2SMWJL8.js";
4
+ import { t as Sidebar } from "./assets/Sidebar-DKqmwreh.js";
5
5
  import { a as provideDocsmintRouteAdapter, i as provideDocsmintRequestAdapter } from "./assets/route-context-uca_b2Px.js";
6
- import { t as HiaiDocsExtensionProvider } from "./assets/HiaiDocsExtensionProvider-DAM-lX4R.js";
6
+ import { t as HiaiDocsExtensionProvider } from "./assets/HiaiDocsExtensionProvider-B_MrN08c.js";
7
7
  import * as $ from "svelte/internal/server";
8
8
  import { onDestroy } from "svelte";
9
9
  //#region ../node_modules/.bun/lucide-svelte@1.0.1+ff5f301bb2db9a0d/node_modules/lucide-svelte/dist/icons/arrow-up.svelte
@@ -263,7 +263,7 @@ function DocsmintAppShellHost($$renderer, $$props) {
263
263
  $$settled = false;
264
264
  }
265
265
  });
266
- $$renderer.push(`<!----> <main id="main-content"${$.attr("inert", isMobile, true)} class="relative z-0 flex-1 overflow-auto">`);
266
+ $$renderer.push(`<!----> <main id="main-content"${$.attr("inert", isMobile, true)} class="relative flex-1 overflow-auto">`);
267
267
  children($$renderer);
268
268
  $$renderer.push(`<!----></main></div> `);
269
269
  MobileSidebarToggle($$renderer, {
@@ -1,4 +1,4 @@
1
- import { n as provideFrontendExtensions } from "./context-jz1GGEUi.js";
1
+ import { n as provideFrontendExtensions } from "./context-BtCMqdVe.js";
2
2
  import "svelte/internal/server";
3
3
  //#region src/lib/hosts/HiaiDocsExtensionProvider.svelte
4
4
  function HiaiDocsExtensionProvider($$renderer, $$props) {
@@ -9,7 +9,7 @@ import { r as signOut } from "./auth-client-x26kqY8Z.js";
9
9
  import { r as getProfile } from "./settings-Bk5Hk9Vq.js";
10
10
  import { a as listApiKeys, i as createGlobalApiKey, n as categoryIdFromScopes, o as revealCategoryApiKey, s as revokeApiKey, t as apiKeyClipboardValue } from "./api-keys-DFqX39MT.js";
11
11
  import { i as listCategories } from "./categories-CTCtdv7V.js";
12
- import { t as getFrontendExtensions } from "./context-jz1GGEUi.js";
12
+ import { t as getFrontendExtensions } from "./context-BtCMqdVe.js";
13
13
  import { t as resolveExtensions } from "./resolve-BqHozBXl.js";
14
14
  import { a as resolveOfflineIdentity, t as disableOfflineAccess } from "./identity-B3uHoDtf.js";
15
15
  import { n as getOfflineDB, t as deleteOfflineDB } from "./db-CnxeO66n.js";
@@ -6,7 +6,7 @@ import { t as Chevron_right } from "./chevron-right-B4p7Sk6X.js";
6
6
  import { t as Clock } from "./clock-IL-eX2di.js";
7
7
  import { t as Copy } from "./copy-CjV57nGQ.js";
8
8
  import { t as Folder } from "./folder-DChhG7qN.js";
9
- import { t as SettingsDialog } from "./SettingsDialog-Dg97vv83.js";
9
+ import { t as SettingsDialog } from "./SettingsDialog-C2SMWJL8.js";
10
10
  import { n as Search, t as Tag } from "./tag-GZEuGWk1.js";
11
11
  import { a as Dropdown_menu, i as Dropdown_menu_content, o as Ellipsis_vertical, r as Dropdown_menu_item, t as Dropdown_menu_trigger } from "./dropdown-menu-Bj5rbqbB.js";
12
12
  import { t as Loader_circle } from "./loader-circle-DZsrZ-er.js";
@@ -17,7 +17,7 @@ import { t as Input } from "./input-DezGsU3y.js";
17
17
  import { t as Label } from "./label-Bj8-TfFN.js";
18
18
  import { n as apiFetch } from "./client-DZMkDkDn.js";
19
19
  import { i as listCategories, r as deleteCategory } from "./categories-CTCtdv7V.js";
20
- import { t as getFrontendExtensions } from "./context-jz1GGEUi.js";
20
+ import { t as getFrontendExtensions } from "./context-BtCMqdVe.js";
21
21
  import { t as resolveExtensions } from "./resolve-BqHozBXl.js";
22
22
  import { n as SHADOW_ITEM_MARKER_PROPERTY_NAME } from "./dndzone-DMvTO_Jz.js";
23
23
  import { c as updateDocument, r as deleteDocument, s as listDocuments, t as clearDocumentsCache } from "./documents-PObdTOiT.js";
@@ -1898,6 +1898,7 @@ function Sidebar($$renderer, $$props) {
1898
1898
  let width = 256;
1899
1899
  let isResizing = false;
1900
1900
  const frontendExtensions = getFrontendExtensions();
1901
+ const sidebarTopExtensions = $.derived(() => resolveExtensions(frontendExtensions.sidebarTop, { pathname: page.url.pathname }));
1901
1902
  const navigationExtensions = $.derived(() => resolveExtensions(frontendExtensions.navigation, { pathname: page.url.pathname }));
1902
1903
  let $$settled = true;
1903
1904
  let $$inner_renderer;
@@ -1910,7 +1911,7 @@ function Sidebar($$renderer, $$props) {
1910
1911
  $$renderer.push(`<!--]--> `);
1911
1912
  if (!mobile) {
1912
1913
  $$renderer.push("<!--[0-->");
1913
- $$renderer.push(`<button class="absolute -right-3 top-4 z-40 flex size-6 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent">`);
1914
+ $$renderer.push(`<button class="sidebar-collapse-toggle absolute -right-3 top-4 z-40 flex size-6 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent">`);
1914
1915
  if (isCollapsed()) {
1915
1916
  $$renderer.push("<!--[0-->");
1916
1917
  Panel_left_open($$renderer, { class: "size-3.5" });
@@ -1923,7 +1924,20 @@ function Sidebar($$renderer, $$props) {
1923
1924
  $$renderer.push(`<!--]--> `);
1924
1925
  if (!isCollapsed()) {
1925
1926
  $$renderer.push("<!--[0-->");
1926
- $$renderer.push(`<div class="flex flex-1 flex-col gap-4 overflow-y-auto p-3">`);
1927
+ $$renderer.push(`<div class="flex flex-1 flex-col gap-4 overflow-y-auto p-3"><!--[-->`);
1928
+ const each_array = $.ensure_array_like(sidebarTopExtensions());
1929
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
1930
+ const SidebarTop = each_array[$$index].component;
1931
+ if (SidebarTop) {
1932
+ $$renderer.push("<!--[-->");
1933
+ SidebarTop($$renderer, { collapsed: false });
1934
+ $$renderer.push("<!--]-->");
1935
+ } else {
1936
+ $$renderer.push("<!--[!-->");
1937
+ $$renderer.push("<!--]-->");
1938
+ }
1939
+ }
1940
+ $$renderer.push(`<!--]--> `);
1927
1941
  SearchBar($$renderer, { class: "mr-5" });
1928
1942
  $$renderer.push(`<!----> `);
1929
1943
  $$renderer.push("<!--[0-->");
@@ -1940,9 +1954,9 @@ function Sidebar($$renderer, $$props) {
1940
1954
  if (navigationExtensions().length > 0) {
1941
1955
  $$renderer.push("<!--[0-->");
1942
1956
  $$renderer.push(`<div class="h-px bg-border"></div> <nav class="space-y-1" aria-label="Product navigation"><!--[-->`);
1943
- const each_array = $.ensure_array_like(navigationExtensions());
1944
- for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
1945
- let extension = each_array[$$index];
1957
+ const each_array_1 = $.ensure_array_like(navigationExtensions());
1958
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
1959
+ let extension = each_array_1[$$index_1];
1946
1960
  const Icon = extension.icon;
1947
1961
  $$renderer.push(`<a${$.attr("href", extension.href ? resolveDocsmintRoute(route, extension.href) : "#")}${$.attr("aria-disabled", extension.disabled)} class="flex items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground aria-disabled:pointer-events-none aria-disabled:opacity-50">`);
1948
1962
  if (Icon) {
@@ -1968,7 +1982,20 @@ function Sidebar($$renderer, $$props) {
1968
1982
  $$renderer.push(`<!--]--></div>`);
1969
1983
  } else {
1970
1984
  $$renderer.push("<!--[-1-->");
1971
- $$renderer.push(`<div class="flex flex-1 flex-col items-center gap-1 pt-14"><button class="flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground"${$.attr("title", sidebar_folders())}${$.attr("aria-label", sidebar_folders())}>`);
1985
+ $$renderer.push(`<div class="flex flex-1 flex-col items-center gap-1 pt-14"><!--[-->`);
1986
+ const each_array_2 = $.ensure_array_like(sidebarTopExtensions());
1987
+ for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
1988
+ const SidebarTop = each_array_2[$$index_2].component;
1989
+ if (SidebarTop) {
1990
+ $$renderer.push("<!--[-->");
1991
+ SidebarTop($$renderer, { collapsed: true });
1992
+ $$renderer.push("<!--]-->");
1993
+ } else {
1994
+ $$renderer.push("<!--[!-->");
1995
+ $$renderer.push("<!--]-->");
1996
+ }
1997
+ }
1998
+ $$renderer.push(`<!--]--> <button class="flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground"${$.attr("title", sidebar_folders())}${$.attr("aria-label", sidebar_folders())}>`);
1972
1999
  Folder($$renderer, { class: "size-4" });
1973
2000
  $$renderer.push(`<!----></button> <button class="flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground"${$.attr("title", search_title())}${$.attr("aria-label", search_title())}>`);
1974
2001
  Search($$renderer, { class: "size-4" });
@@ -1977,9 +2004,9 @@ function Sidebar($$renderer, $$props) {
1977
2004
  $$renderer.push(`<!----></button> <button class="flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground"${$.attr("title", doc_tags())}${$.attr("aria-label", doc_tags())}>`);
1978
2005
  Tag($$renderer, { class: "size-4" });
1979
2006
  $$renderer.push(`<!----></button> <!--[-->`);
1980
- const each_array_1 = $.ensure_array_like(navigationExtensions());
1981
- for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
1982
- let extension = each_array_1[$$index_1];
2007
+ const each_array_3 = $.ensure_array_like(navigationExtensions());
2008
+ for (let $$index_3 = 0, $$length = each_array_3.length; $$index_3 < $$length; $$index_3++) {
2009
+ let extension = each_array_3[$$index_3];
1983
2010
  const Icon = extension.icon;
1984
2011
  $$renderer.push(`<a${$.attr("href", extension.href ? resolveDocsmintRoute(route, extension.href) : "#")}${$.attr("aria-disabled", extension.disabled)} class="flex size-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground aria-disabled:pointer-events-none aria-disabled:opacity-50"${$.attr("title", extension.label)}${$.attr("aria-label", extension.label)}>`);
1985
2012
  if (Icon) {
@@ -8,6 +8,7 @@ import { createContext } from "svelte";
8
8
  */
9
9
  function createFrontendExtensions(initial = {}) {
10
10
  return {
11
+ sidebarTop: [...initial.sidebarTop ?? []],
11
12
  navigation: [...initial.navigation ?? []],
12
13
  dashboardWidgets: [...initial.dashboardWidgets ?? []],
13
14
  searchWidgets: [...initial.searchWidgets ?? []],
@@ -1,2 +1,2 @@
1
- import { t as SettingsDialog } from "../assets/SettingsDialog-Dg97vv83.js";
1
+ import { t as SettingsDialog } from "../assets/SettingsDialog-C2SMWJL8.js";
2
2
  export { SettingsDialog };
@@ -1,2 +1,2 @@
1
- import { t as Sidebar } from "../assets/Sidebar-CrDk_HYY.js";
1
+ import { t as Sidebar } from "../assets/Sidebar-DKqmwreh.js";
2
2
  export { Sidebar };
@@ -17,7 +17,7 @@ import { a as Dialog, i as Dialog_description, n as Dialog_header, o as Button,
17
17
  import { t as Label } from "./assets/label-Bj8-TfFN.js";
18
18
  import { n as apiFetch } from "./assets/client-DZMkDkDn.js";
19
19
  import "./assets/categories-CTCtdv7V.js";
20
- import { t as getFrontendExtensions } from "./assets/context-jz1GGEUi.js";
20
+ import { t as getFrontendExtensions } from "./assets/context-BtCMqdVe.js";
21
21
  import { t as resolveExtensions } from "./assets/resolve-BqHozBXl.js";
22
22
  import { a as Select, i as Select_content, n as Select_trigger, r as Select_item, t as Select_value } from "./assets/select-value-6Lk0ToYd.js";
23
23
  import { c as updateDocument, i as getDocument } from "./assets/documents-PObdTOiT.js";
@@ -1,2 +1,2 @@
1
- import { t as HiaiDocsExtensionProvider } from "./assets/HiaiDocsExtensionProvider-DAM-lX4R.js";
1
+ import { t as HiaiDocsExtensionProvider } from "./assets/HiaiDocsExtensionProvider-B_MrN08c.js";
2
2
  export { HiaiDocsExtensionProvider as DocsmintExtensionProvider };
@@ -7,7 +7,7 @@ import { t as Rotate_ccw } from "./assets/rotate-ccw-BlgWwaiq.js";
7
7
  import { n as Search, t as Tag } from "./assets/tag-GZEuGWk1.js";
8
8
  import { n as getDocsmintRouteAdapter, r as navigateDocsmintRoute, t as getDocsmintRequestAdapter } from "./assets/route-context-uca_b2Px.js";
9
9
  import "./assets/categories-CTCtdv7V.js";
10
- import { t as getFrontendExtensions } from "./assets/context-jz1GGEUi.js";
10
+ import { t as getFrontendExtensions } from "./assets/context-BtCMqdVe.js";
11
11
  import { t as resolveExtensions } from "./assets/resolve-BqHozBXl.js";
12
12
  import "./assets/select-value-6Lk0ToYd.js";
13
13
  import "./assets/tag-store.svelte-DvgUduhd.js";
@@ -1,4 +1,4 @@
1
- import { t as getFrontendExtensions } from "./assets/context-jz1GGEUi.js";
1
+ import { t as getFrontendExtensions } from "./assets/context-BtCMqdVe.js";
2
2
  import * as $ from "svelte/internal/server";
3
3
  //#region src/lib/components/editor/shared-document.ts
4
4
  var ATTACHMENT_PATH = /^\/api\/attachments\/[0-9a-f-]+\/raw$/i;
@@ -538,6 +538,10 @@ function tokenHash(token) {
538
538
  function subjectHash(actorUserId) {
539
539
  return new Bun.CryptoHasher("sha256").update(actorUserId).digest("hex");
540
540
  }
541
+ function lifecycleTombstoneEmail(actorUserId) {
542
+ const hash = new Bun.CryptoHasher("sha256").update("docsmint:privacy-tombstone:v1\x00").update(actorUserId).digest("hex");
543
+ return `deleted-${hash}@invalid.local`;
544
+ }
541
545
  function checksumLine(hash, record) {
542
546
  hash.update(`${JSON.stringify(record)}
543
547
  `, "utf8");
@@ -634,6 +638,77 @@ function createPersistentLifecycleService(runtime, database, hostSteps = []) {
634
638
  checksumLine(hash, manifest);
635
639
  recordCount += 1;
636
640
  yield manifest;
641
+ const actor = await withActor(ctx.actorUserId, (tx) => tx.select({
642
+ id: users.id,
643
+ email: users.email,
644
+ name: users.name,
645
+ emailVerified: users.emailVerified,
646
+ image: users.image,
647
+ createdAt: users.createdAt,
648
+ updatedAt: users.updatedAt
649
+ }).from(users).where(eq(users.id, ctx.actorUserId)).limit(1));
650
+ for (const profile of actor) {
651
+ const record = {
652
+ type: "data",
653
+ domain: "account",
654
+ resourceType: "user",
655
+ resourceId: profile.id,
656
+ workspaceId: null,
657
+ payload: {
658
+ email: profile.email,
659
+ name: profile.name,
660
+ emailVerified: profile.emailVerified,
661
+ image: profile.image,
662
+ createdAt: profile.createdAt,
663
+ updatedAt: profile.updatedAt
664
+ }
665
+ };
666
+ checksumLine(hash, record);
667
+ recordCount += 1;
668
+ yield record;
669
+ }
670
+ const actorFolders = await withActor(ctx.actorUserId, (tx) => tx.select().from(folders).where(eq(folders.ownerId, ctx.actorUserId)));
671
+ for (const folder of actorFolders) {
672
+ const record = {
673
+ type: "data",
674
+ domain: "folders",
675
+ resourceType: "folder",
676
+ resourceId: folder.id,
677
+ workspaceId: folder.workspaceId,
678
+ payload: folder
679
+ };
680
+ checksumLine(hash, record);
681
+ recordCount += 1;
682
+ yield record;
683
+ }
684
+ const actorTags = await withActor(ctx.actorUserId, (tx) => tx.select().from(tags).where(eq(tags.ownerId, ctx.actorUserId)));
685
+ for (const tag of actorTags) {
686
+ const record = {
687
+ type: "data",
688
+ domain: "tags",
689
+ resourceType: "tag",
690
+ resourceId: tag.id,
691
+ workspaceId: tag.workspaceId,
692
+ payload: tag
693
+ };
694
+ checksumLine(hash, record);
695
+ recordCount += 1;
696
+ yield record;
697
+ }
698
+ const actorCategories = await withActor(ctx.actorUserId, (tx) => tx.select().from(categories).where(eq(categories.ownerId, ctx.actorUserId)));
699
+ for (const category of actorCategories) {
700
+ const record = {
701
+ type: "data",
702
+ domain: "categories",
703
+ resourceType: "category",
704
+ resourceId: category.id,
705
+ workspaceId: category.workspaceId,
706
+ payload: category
707
+ };
708
+ checksumLine(hash, record);
709
+ recordCount += 1;
710
+ yield record;
711
+ }
637
712
  const ownedDocuments = await withActor(ctx.actorUserId, (tx) => tx.select().from(documents).where(eq(documents.ownerId, ctx.actorUserId)));
638
713
  for (const document of ownedDocuments) {
639
714
  throwIfAborted(ctx.signal);
@@ -733,12 +808,24 @@ function createPersistentLifecycleService(runtime, database, hostSteps = []) {
733
808
  storageKey: attachments.storageKey
734
809
  }).from(attachments).where(inArray(attachments.documentId, documentIds))) : [];
735
810
  await runStep(operation, ctx.actorUserId, leaseOwner, "delete_attachment_objects", deletedByDomain, () => runtime.deleteObjects(objectRows.map((row) => row.storageKey), ctx.signal));
811
+ await runStep(operation, ctx.actorUserId, leaseOwner, "remove_subject_folders", deletedByDomain, () => dbDelete((tx) => tx.delete(folders).where(eq(folders.ownerId, ctx.actorUserId)).returning({ id: folders.id })));
812
+ await runStep(operation, ctx.actorUserId, leaseOwner, "remove_subject_tags", deletedByDomain, () => dbDelete((tx) => tx.delete(tags).where(eq(tags.ownerId, ctx.actorUserId)).returning({ id: tags.id })));
813
+ await runStep(operation, ctx.actorUserId, leaseOwner, "remove_subject_categories", deletedByDomain, () => dbDelete((tx) => tx.delete(categories).where(eq(categories.ownerId, ctx.actorUserId)).returning({ id: categories.id })));
736
814
  await runStep(operation, ctx.actorUserId, leaseOwner, "remove_attachment_rows", deletedByDomain, () => objectRows.length ? dbDelete((tx) => tx.delete(attachments).where(inArray(attachments.id, objectRows.map((row) => row.id))).returning({ id: attachments.id })) : Promise.resolve(0));
737
815
  await runStep(operation, ctx.actorUserId, leaseOwner, "remove_subject_documents", deletedByDomain, () => dbDelete((tx) => tx.delete(documents).where(eq(documents.ownerId, ctx.actorUserId)).returning({ id: documents.id })));
738
816
  await runStep(operation, ctx.actorUserId, leaseOwner, "clear_redis_state", deletedByDomain, () => runtime.clearAccountRedisState(ctx.actorUserId, ctx.signal));
739
817
  for (const step of orderedSteps)
740
818
  if (step.purge)
741
819
  await runStep(operation, ctx.actorUserId, leaseOwner, `host:${step.id}`, deletedByDomain, async () => (await step.purge?.(ctx))?.deletedCount ?? 0);
820
+ await runStep(operation, ctx.actorUserId, leaseOwner, "remove_auth_sessions", deletedByDomain, () => dbDelete((tx) => tx.delete(sessions).where(eq(sessions.userId, ctx.actorUserId)).returning({ id: sessions.id })));
821
+ await runStep(operation, ctx.actorUserId, leaseOwner, "remove_auth_accounts", deletedByDomain, () => dbDelete((tx) => tx.delete(accounts).where(eq(accounts.userId, ctx.actorUserId)).returning({ id: accounts.id })));
822
+ await runStep(operation, ctx.actorUserId, leaseOwner, "tombstone_subject_user", deletedByDomain, () => dbDelete((tx) => tx.update(users).set({
823
+ email: lifecycleTombstoneEmail(ctx.actorUserId),
824
+ name: null,
825
+ image: null,
826
+ emailVerified: false,
827
+ updatedAt: new Date
828
+ }).where(eq(users.id, ctx.actorUserId)).returning({ id: users.id })));
742
829
  await runStep(operation, ctx.actorUserId, leaseOwner, "write_deletion_audit", deletedByDomain, async () => {
743
830
  await withActor(ctx.actorUserId, (tx) => tx.insert(auditLog).values({
744
831
  actorId: ctx.actorUserId,
@@ -803,6 +890,7 @@ function createPersistentLifecycleRuntime(options) {
803
890
  }
804
891
  export {
805
892
  requireLeaseWrite,
893
+ lifecycleTombstoneEmail,
806
894
  createPersistentLifecycleService,
807
895
  createPersistentLifecycleRuntime,
808
896
  bindPersistentLifecycle,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hiai-gg/docsmint",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "type": "module",
5
5
  "browser": {
6
6
  "./dist/backend-launcher.js": false,
@@ -88,6 +88,10 @@
88
88
  "import": "./dist/storage-quota.js",
89
89
  "types": "./dist/storage-quota.d.ts"
90
90
  },
91
+ "./backend/lib/api-key-facade": {
92
+ "import": "./backend/src/lib/api-key-facade.ts",
93
+ "types": "./backend/src/lib/api-key-facade.ts"
94
+ },
91
95
  "./frontend/app-shell": {
92
96
  "node": "./dist/frontend-ssr/app-shell.js",
93
97
  "import": "./dist/frontend/app-shell.js",
@@ -336,6 +340,7 @@
336
340
  "backend/src/lib/redis-factory.ts",
337
341
  "backend/src/lib/storage-factory.ts",
338
342
  "backend/src/lib/logger.ts",
343
+ "backend/src/lib/api-key-facade.ts",
339
344
  "backend/src/lib/lifecycle-service.ts",
340
345
  "README.md",
341
346
  "LICENSE"
@@ -24,7 +24,7 @@ import { registerSearch } from "./commands/search.js";
24
24
  import { registerSnapshot } from "./commands/snapshot.js";
25
25
  import { registerUpdate } from "./commands/update.js";
26
26
 
27
- const VERSION = "0.4.5";
27
+ const VERSION = "0.4.7";
28
28
 
29
29
  const program = new Command();
30
30
  program
@@ -35,7 +35,7 @@ interface McpToolResult {
35
35
 
36
36
  const server = new McpServer({
37
37
  name: "hiai-docs",
38
- version: "0.4.5",
38
+ version: "0.4.7",
39
39
  });
40
40
 
41
41
  /**