@hiai-gg/docsmint 0.5.0 → 0.5.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.
Files changed (75) hide show
  1. package/dist/backend/index.js +47 -8
  2. package/dist/backend-account-runtime-cleanup.js +20 -3
  3. package/dist/backend-api-key-facade.js +20 -3
  4. package/dist/backend-pipeline-cancellation.js +20 -3
  5. package/dist/frontend/{CategoryDialog-DyytjQn6.js → CategoryDialog-DmlX0Z97.js} +1 -1
  6. package/dist/frontend/DatePicker-D6E-EEtZ.js +340 -0
  7. package/dist/frontend/{FolderNode-DAGPgi-M.js → FolderNode-D3rN3yLV.js} +1 -1
  8. package/dist/frontend/{HiaiDocsExtensionProvider-CMiTXi2J.js → HiaiDocsExtensionProvider-OSn96BBw.js} +1 -1
  9. package/dist/frontend/{SettingsDialog-DEx1eEZm.js → SettingsDialog-Bd_S2RKW.js} +104 -96
  10. package/dist/frontend/ShareDialog-BC-Jl6v1.js +257 -0
  11. package/dist/frontend/{Sidebar-BdB8CfXS.js → Sidebar-BnZgNl_8.js} +679 -657
  12. package/dist/frontend/api/attachments.js +1 -1
  13. package/dist/frontend/app-shell.js +3 -3
  14. package/dist/frontend/{attachments-C2DBzU-r.js → attachments-B8AuDjno.js} +8 -5
  15. package/dist/frontend/components/category-dialog.js +1 -1
  16. package/dist/frontend/components/editor/document-editor.js +240 -228
  17. package/dist/frontend/components/folder-node.js +1 -1
  18. package/dist/frontend/components/save-as-dialog.js +1 -1
  19. package/dist/frontend/components/settings.js +1 -1
  20. package/dist/frontend/components/share-dialog.js +1 -1
  21. package/dist/frontend/components/sidebar.js +1 -1
  22. package/dist/frontend/{context-KLiM3QQ0.js → context-D0zPFXZ4.js} +2 -0
  23. package/dist/frontend/dashboard.js +1106 -1068
  24. package/dist/frontend/{dropdown-menu-Cre80-CJ.js → dropdown-menu-CJ_7V3N0.js} +43 -43
  25. package/dist/frontend/extension.d.ts +3 -2
  26. package/dist/frontend/extension.js +1 -1
  27. package/dist/frontend/{floating-layer-anchor-BDs7vO-M.js → floating-layer-anchor-S5RSefGN.js} +1 -1
  28. package/dist/frontend/frontend.css +1 -1
  29. package/dist/frontend/search.js +421 -405
  30. package/dist/frontend/{select-value-GXwx90Pr.js → select-value-JCAp2PmU.js} +466 -466
  31. package/dist/frontend/shared-document.js +1 -1
  32. package/dist/frontend-ssr/api/attachments.js +1 -1
  33. package/dist/frontend-ssr/app-shell.js +4 -4
  34. package/dist/frontend-ssr/assets/{CategoryDialog-CLAGMZPz.js → CategoryDialog-Cnlmr1sz.js} +2 -2
  35. package/dist/frontend-ssr/assets/{CreateSnapshotDialog-DNAjd4eD.js → CreateSnapshotDialog-b6O0nUVp.js} +1 -1
  36. package/dist/frontend-ssr/assets/{DatePicker-Cp6Qmgdb.js → DatePicker-D84cJ-Eq.js} +1 -1
  37. package/dist/frontend-ssr/assets/{FolderNode-Ty6fMbDu.js → FolderNode-CnFVWuQi.js} +2 -2
  38. package/dist/frontend-ssr/assets/{HiaiDocsExtensionProvider-B_MrN08c.js → HiaiDocsExtensionProvider-BRKWmcDd.js} +1 -1
  39. package/dist/frontend-ssr/assets/{SettingsDialog-BymUxBgg.js → SettingsDialog-BPdUl6pd.js} +23 -9
  40. package/dist/frontend-ssr/assets/ShareDialog-BZd28sg-.js +45 -0
  41. package/dist/frontend-ssr/assets/{Sidebar-DzbIUZFc.js → Sidebar-DwYZH0Tr.js} +49 -14
  42. package/dist/frontend-ssr/assets/{TagCreateDialog-B7wDbVqG.js → TagCreateDialog-DUPMitlL.js} +1 -1
  43. package/dist/frontend-ssr/assets/{attachments-CXgatN0B.js → attachments-Cj3fQyUp.js} +11 -4
  44. package/dist/frontend-ssr/assets/{confirm-dialog-B3C0WeMn.js → confirm-dialog-XuyaL8sr.js} +1 -1
  45. package/dist/frontend-ssr/assets/{context-BtCMqdVe.js → context-Bi_mO-NS.js} +2 -0
  46. package/dist/frontend-ssr/assets/{dropdown-menu-CGkf8-rb.js → dropdown-menu-Dn_vQq9b.js} +1 -1
  47. package/dist/frontend-ssr/assets/{floating-layer-anchor-CYIE8Oj6.js → floating-layer-anchor-BIAu-252.js} +1 -1
  48. package/dist/frontend-ssr/assets/{messages-D-auzk9H.js → messages-BAQzILs4.js} +1 -1
  49. package/dist/frontend-ssr/assets/{select-value-6Lk0ToYd.js → select-value-DBhbkNcc.js} +1 -1
  50. package/dist/frontend-ssr/components/category-dialog.js +1 -1
  51. package/dist/frontend-ssr/components/create-snapshot-dialog.js +1 -1
  52. package/dist/frontend-ssr/components/editor/document-editor.js +37 -23
  53. package/dist/frontend-ssr/components/editor/document-title.js +1 -1
  54. package/dist/frontend-ssr/components/editor/markdown-toggle.js +1 -1
  55. package/dist/frontend-ssr/components/folder-node.js +1 -1
  56. package/dist/frontend-ssr/components/save-as-dialog.js +2 -2
  57. package/dist/frontend-ssr/components/settings.js +1 -1
  58. package/dist/frontend-ssr/components/share-dialog.js +1 -1
  59. package/dist/frontend-ssr/components/sidebar.js +1 -1
  60. package/dist/frontend-ssr/components/tag-create-dialog.js +1 -1
  61. package/dist/frontend-ssr/components/version-history.js +2 -2
  62. package/dist/frontend-ssr/dashboard.js +280 -81
  63. package/dist/frontend-ssr/extension.js +1 -1
  64. package/dist/frontend-ssr/i18n.js +1 -1
  65. package/dist/frontend-ssr/search.js +4 -4
  66. package/dist/frontend-ssr/shared-document.js +1 -1
  67. package/dist/lifecycle-runtime.js +18 -3
  68. package/dist/types.d.ts +5 -0
  69. package/package.json +1 -1
  70. package/packages/cli/src/index.ts +1 -1
  71. package/packages/db/src/schema.ts +17 -2
  72. package/packages/mcp-server/src/index.ts +1 -1
  73. package/dist/frontend/DatePicker-BkaaNS1l.js +0 -256
  74. package/dist/frontend/ShareDialog-ChZogJtW.js +0 -166
  75. package/dist/frontend-ssr/assets/ShareDialog-C-9VDKSz.js +0 -56
@@ -42724,6 +42724,8 @@ __export(exports_schema, {
42724
42724
  shareRoleEnum: () => shareRoleEnum,
42725
42725
  shareLinks: () => shareLinks,
42726
42726
  shareLinkRelations: () => shareLinkRelations,
42727
+ shareGrantStatusEnum: () => shareGrantStatusEnum,
42728
+ shareAccessModeEnum: () => shareAccessModeEnum,
42727
42729
  sessions: () => sessions,
42728
42730
  pipelineStatusEnum: () => pipelineStatusEnum,
42729
42731
  pipelineStageEnum: () => pipelineStageEnum,
@@ -42754,7 +42756,7 @@ __export(exports_schema, {
42754
42756
  apiKeyRelations: () => apiKeyRelations,
42755
42757
  accounts: () => accounts
42756
42758
  });
42757
- var vector4, tsvector, documentVisibilityEnum, shareRoleEnum, embeddingStatusEnum, pipelineStageEnum, pipelineStatusEnum, lifecycleOperationKindEnum, lifecycleOperationStatusEnum, users, sessions, accounts, verifications, folders, folderRelations, documents, documentRelations, documentPipelineRuns, documentPipelineBatches, tags, tagRelations, categories, categoryRelations, documentTags, documentTagRelations, shareLinks, shareLinkRelations, guestAccess, guestAccessRelations, attachments, attachmentRelations, versions, documentEmbeddings, documentEmbeddingRelations, apiKeys, apiKeyRelations, auditLog, lifecycleOperations, documentCreateOperations, versionRelations;
42759
+ var vector4, tsvector, documentVisibilityEnum, shareRoleEnum, shareAccessModeEnum, shareGrantStatusEnum, embeddingStatusEnum, pipelineStageEnum, pipelineStatusEnum, lifecycleOperationKindEnum, lifecycleOperationStatusEnum, users, sessions, accounts, verifications, folders, folderRelations, documents, documentRelations, documentPipelineRuns, documentPipelineBatches, tags, tagRelations, categories, categoryRelations, documentTags, documentTagRelations, shareLinks, shareLinkRelations, guestAccess, guestAccessRelations, attachments, attachmentRelations, versions, documentEmbeddings, documentEmbeddingRelations, apiKeys, apiKeyRelations, auditLog, lifecycleOperations, documentCreateOperations, versionRelations;
42758
42760
  var init_schema2 = __esm(() => {
42759
42761
  init_pg_core();
42760
42762
  init_drizzle_orm();
@@ -42778,6 +42780,8 @@ var init_schema2 = __esm(() => {
42778
42780
  });
42779
42781
  documentVisibilityEnum = pgEnum("document_visibility", ["private", "shared", "public"]);
42780
42782
  shareRoleEnum = pgEnum("share_role", ["viewer", "commenter", "editor"]);
42783
+ shareAccessModeEnum = pgEnum("share_access_mode", ["public", "restricted"]);
42784
+ shareGrantStatusEnum = pgEnum("share_grant_status", ["pending", "accepted", "revoked"]);
42781
42785
  embeddingStatusEnum = pgEnum("embedding_status", [
42782
42786
  "pending",
42783
42787
  "processing",
@@ -43069,6 +43073,9 @@ var init_schema2 = __esm(() => {
43069
43073
  token: text("token").notNull().unique(),
43070
43074
  passwordHash: text("password_hash"),
43071
43075
  role: shareRoleEnum("role").notNull().default("viewer"),
43076
+ accessMode: shareAccessModeEnum("access_mode").notNull().default("public"),
43077
+ allowPasswordFallback: boolean("allow_password_fallback").notNull().default(false),
43078
+ policyVersion: integer("policy_version").notNull().default(1),
43072
43079
  expiresAt: timestamp("expires_at"),
43073
43080
  createdBy: uuid("created_by").notNull().references(() => users.id, { onDelete: "cascade" }),
43074
43081
  workspaceId: text("workspace_id"),
@@ -43104,8 +43111,15 @@ var init_schema2 = __esm(() => {
43104
43111
  shareLinkId: uuid("share_link_id").notNull().references(() => shareLinks.id, { onDelete: "cascade" }),
43105
43112
  workspaceId: text("workspace_id"),
43106
43113
  guestEmail: text("guest_email").notNull(),
43107
- grantedAt: timestamp("granted_at").defaultNow().notNull()
43108
- }, (table3) => [index("guest_access_share_link_idx").on(table3.shareLinkId)]);
43114
+ role: shareRoleEnum("role").notNull().default("viewer"),
43115
+ status: shareGrantStatusEnum("status").notNull().default("pending"),
43116
+ grantedAt: timestamp("granted_at").defaultNow().notNull(),
43117
+ acceptedAt: timestamp("accepted_at"),
43118
+ revokedAt: timestamp("revoked_at")
43119
+ }, (table3) => [
43120
+ index("guest_access_share_link_idx").on(table3.shareLinkId),
43121
+ uniqueIndex("guest_access_share_link_email_unique_idx").on(table3.shareLinkId, table3.guestEmail)
43122
+ ]);
43109
43123
  guestAccessRelations = relations(guestAccess, ({ one }) => ({
43110
43124
  shareLink: one(shareLinks, {
43111
43125
  fields: [guestAccess.shareLinkId],
@@ -43121,7 +43135,10 @@ var init_schema2 = __esm(() => {
43121
43135
  size: bigint("size", { mode: "number" }).notNull(),
43122
43136
  storageKey: text("storage_key").notNull(),
43123
43137
  createdAt: timestamp("created_at").defaultNow().notNull()
43124
- }, (table3) => [index("attachments_document_id_idx").on(table3.documentId)]);
43138
+ }, (table3) => [
43139
+ index("attachments_document_id_idx").on(table3.documentId),
43140
+ uniqueIndex("attachments_storage_key_unique").on(table3.storageKey)
43141
+ ]);
43125
43142
  attachmentRelations = relations(attachments, ({ one }) => ({
43126
43143
  document: one(documents, {
43127
43144
  fields: [attachments.documentId],
@@ -194084,7 +194101,7 @@ function contentAccessForExternalContext(ctx) {
194084
194101
  userId: ctx.userId,
194085
194102
  categoryId: null,
194086
194103
  permissions,
194087
- restricted: true,
194104
+ restricted: false,
194088
194105
  externalRole: ctx.actorRole
194089
194106
  };
194090
194107
  }
@@ -195878,6 +195895,20 @@ var attachmentRoutes = new Elysia({ prefix: "/api" }).post("/documents/:id/attac
195878
195895
  set2.status = 400;
195879
195896
  return { error: "quotaReservationId is required" };
195880
195897
  }
195898
+ const existing = await withTenant(ctx, async (tx) => {
195899
+ const [row] = await tx.select().from(attachments).where(and(eq(attachments.documentId, documentId), eq(attachments.storageKey, key))).limit(1);
195900
+ return row ?? null;
195901
+ });
195902
+ if (existing) {
195903
+ set2.status = 201;
195904
+ return {
195905
+ id: existing.id,
195906
+ filename: existing.filename,
195907
+ mimeType: existing.mimeType,
195908
+ size: existing.size,
195909
+ url: `/api/attachments/${existing.id}/raw`
195910
+ };
195911
+ }
195881
195912
  let headOutput;
195882
195913
  try {
195883
195914
  headOutput = await storage.send(new HeadObjectCommand({ Bucket: BUCKET, Key: key }));
@@ -195909,14 +195940,21 @@ var attachmentRoutes = new Elysia({ prefix: "/api" }).post("/documents/:id/attac
195909
195940
  }
195910
195941
  try {
195911
195942
  const created = await withTenant(ctx, async (tx) => {
195943
+ await tx.execute(sql`SELECT pg_advisory_xact_lock(hashtextextended(${key}, 0))`);
195944
+ const [raced] = await tx.select().from(attachments).where(and(eq(attachments.documentId, documentId), eq(attachments.storageKey, key))).limit(1);
195945
+ if (raced)
195946
+ return raced;
195912
195947
  const [row] = await tx.insert(attachments).values({
195913
195948
  documentId,
195914
195949
  filename,
195915
195950
  mimeType: contentType,
195916
195951
  size: storedSize,
195917
195952
  storageKey: key
195918
- }).returning();
195919
- return row ?? null;
195953
+ }).onConflictDoNothing({ target: attachments.storageKey }).returning();
195954
+ if (row)
195955
+ return row;
195956
+ const [winner] = await tx.select().from(attachments).where(and(eq(attachments.documentId, documentId), eq(attachments.storageKey, key))).limit(1);
195957
+ return winner ?? null;
195920
195958
  });
195921
195959
  if (!created) {
195922
195960
  if (admission && quotaContext && quotaReservationId) {
@@ -230457,6 +230495,7 @@ async function searchDocuments(ctx, request, adapters = {}) {
230457
230495
  ...expansionModel ? { expansionModel } : {},
230458
230496
  graphAttempted,
230459
230497
  graphFailed,
230498
+ graphContribution,
230460
230499
  confidenceReasons: confidence.reasons
230461
230500
  };
230462
230501
  return {
@@ -234240,7 +234279,7 @@ var swaggerConfig = {
234240
234279
  },
234241
234280
  info: {
234242
234281
  title: "DocsMint API",
234243
- version: "0.5.0",
234282
+ version: "0.5.2",
234244
234283
  description: "Self-hosted AI-first documentation platform. Full-text + semantic search, version history, sharing, and folder organization.",
234245
234284
  contact: { name: "HiAi-gg", url: "https://github.com/HiAi-gg/docsmint" },
234246
234285
  license: {
@@ -26,6 +26,8 @@ __export(exports_schema, {
26
26
  shareRoleEnum: () => shareRoleEnum,
27
27
  shareLinks: () => shareLinks,
28
28
  shareLinkRelations: () => shareLinkRelations,
29
+ shareGrantStatusEnum: () => shareGrantStatusEnum,
30
+ shareAccessModeEnum: () => shareAccessModeEnum,
29
31
  sessions: () => sessions,
30
32
  pipelineStatusEnum: () => pipelineStatusEnum,
31
33
  pipelineStageEnum: () => pipelineStageEnum,
@@ -78,6 +80,8 @@ var tsvector = customType({
78
80
  });
79
81
  var documentVisibilityEnum = pgEnum("document_visibility", ["private", "shared", "public"]);
80
82
  var shareRoleEnum = pgEnum("share_role", ["viewer", "commenter", "editor"]);
83
+ var shareAccessModeEnum = pgEnum("share_access_mode", ["public", "restricted"]);
84
+ var shareGrantStatusEnum = pgEnum("share_grant_status", ["pending", "accepted", "revoked"]);
81
85
  var embeddingStatusEnum = pgEnum("embedding_status", [
82
86
  "pending",
83
87
  "processing",
@@ -369,6 +373,9 @@ var shareLinks = pgTable("share_links", {
369
373
  token: text("token").notNull().unique(),
370
374
  passwordHash: text("password_hash"),
371
375
  role: shareRoleEnum("role").notNull().default("viewer"),
376
+ accessMode: shareAccessModeEnum("access_mode").notNull().default("public"),
377
+ allowPasswordFallback: boolean("allow_password_fallback").notNull().default(false),
378
+ policyVersion: integer("policy_version").notNull().default(1),
372
379
  expiresAt: timestamp("expires_at"),
373
380
  createdBy: uuid("created_by").notNull().references(() => users.id, { onDelete: "cascade" }),
374
381
  workspaceId: text("workspace_id"),
@@ -404,8 +411,15 @@ var guestAccess = pgTable("guest_access", {
404
411
  shareLinkId: uuid("share_link_id").notNull().references(() => shareLinks.id, { onDelete: "cascade" }),
405
412
  workspaceId: text("workspace_id"),
406
413
  guestEmail: text("guest_email").notNull(),
407
- grantedAt: timestamp("granted_at").defaultNow().notNull()
408
- }, (table) => [index("guest_access_share_link_idx").on(table.shareLinkId)]);
414
+ role: shareRoleEnum("role").notNull().default("viewer"),
415
+ status: shareGrantStatusEnum("status").notNull().default("pending"),
416
+ grantedAt: timestamp("granted_at").defaultNow().notNull(),
417
+ acceptedAt: timestamp("accepted_at"),
418
+ revokedAt: timestamp("revoked_at")
419
+ }, (table) => [
420
+ index("guest_access_share_link_idx").on(table.shareLinkId),
421
+ uniqueIndex("guest_access_share_link_email_unique_idx").on(table.shareLinkId, table.guestEmail)
422
+ ]);
409
423
  var guestAccessRelations = relations(guestAccess, ({ one }) => ({
410
424
  shareLink: one(shareLinks, {
411
425
  fields: [guestAccess.shareLinkId],
@@ -421,7 +435,10 @@ var attachments = pgTable("attachments", {
421
435
  size: bigint("size", { mode: "number" }).notNull(),
422
436
  storageKey: text("storage_key").notNull(),
423
437
  createdAt: timestamp("created_at").defaultNow().notNull()
424
- }, (table) => [index("attachments_document_id_idx").on(table.documentId)]);
438
+ }, (table) => [
439
+ index("attachments_document_id_idx").on(table.documentId),
440
+ uniqueIndex("attachments_storage_key_unique").on(table.storageKey)
441
+ ]);
425
442
  var attachmentRelations = relations(attachments, ({ one }) => ({
426
443
  document: one(documents, {
427
444
  fields: [attachments.documentId],
@@ -26,6 +26,8 @@ __export(exports_schema, {
26
26
  shareRoleEnum: () => shareRoleEnum,
27
27
  shareLinks: () => shareLinks,
28
28
  shareLinkRelations: () => shareLinkRelations,
29
+ shareGrantStatusEnum: () => shareGrantStatusEnum,
30
+ shareAccessModeEnum: () => shareAccessModeEnum,
29
31
  sessions: () => sessions,
30
32
  pipelineStatusEnum: () => pipelineStatusEnum,
31
33
  pipelineStageEnum: () => pipelineStageEnum,
@@ -78,6 +80,8 @@ var tsvector = customType({
78
80
  });
79
81
  var documentVisibilityEnum = pgEnum("document_visibility", ["private", "shared", "public"]);
80
82
  var shareRoleEnum = pgEnum("share_role", ["viewer", "commenter", "editor"]);
83
+ var shareAccessModeEnum = pgEnum("share_access_mode", ["public", "restricted"]);
84
+ var shareGrantStatusEnum = pgEnum("share_grant_status", ["pending", "accepted", "revoked"]);
81
85
  var embeddingStatusEnum = pgEnum("embedding_status", [
82
86
  "pending",
83
87
  "processing",
@@ -369,6 +373,9 @@ var shareLinks = pgTable("share_links", {
369
373
  token: text("token").notNull().unique(),
370
374
  passwordHash: text("password_hash"),
371
375
  role: shareRoleEnum("role").notNull().default("viewer"),
376
+ accessMode: shareAccessModeEnum("access_mode").notNull().default("public"),
377
+ allowPasswordFallback: boolean("allow_password_fallback").notNull().default(false),
378
+ policyVersion: integer("policy_version").notNull().default(1),
372
379
  expiresAt: timestamp("expires_at"),
373
380
  createdBy: uuid("created_by").notNull().references(() => users.id, { onDelete: "cascade" }),
374
381
  workspaceId: text("workspace_id"),
@@ -404,8 +411,15 @@ var guestAccess = pgTable("guest_access", {
404
411
  shareLinkId: uuid("share_link_id").notNull().references(() => shareLinks.id, { onDelete: "cascade" }),
405
412
  workspaceId: text("workspace_id"),
406
413
  guestEmail: text("guest_email").notNull(),
407
- grantedAt: timestamp("granted_at").defaultNow().notNull()
408
- }, (table) => [index("guest_access_share_link_idx").on(table.shareLinkId)]);
414
+ role: shareRoleEnum("role").notNull().default("viewer"),
415
+ status: shareGrantStatusEnum("status").notNull().default("pending"),
416
+ grantedAt: timestamp("granted_at").defaultNow().notNull(),
417
+ acceptedAt: timestamp("accepted_at"),
418
+ revokedAt: timestamp("revoked_at")
419
+ }, (table) => [
420
+ index("guest_access_share_link_idx").on(table.shareLinkId),
421
+ uniqueIndex("guest_access_share_link_email_unique_idx").on(table.shareLinkId, table.guestEmail)
422
+ ]);
409
423
  var guestAccessRelations = relations(guestAccess, ({ one }) => ({
410
424
  shareLink: one(shareLinks, {
411
425
  fields: [guestAccess.shareLinkId],
@@ -421,7 +435,10 @@ var attachments = pgTable("attachments", {
421
435
  size: bigint("size", { mode: "number" }).notNull(),
422
436
  storageKey: text("storage_key").notNull(),
423
437
  createdAt: timestamp("created_at").defaultNow().notNull()
424
- }, (table) => [index("attachments_document_id_idx").on(table.documentId)]);
438
+ }, (table) => [
439
+ index("attachments_document_id_idx").on(table.documentId),
440
+ uniqueIndex("attachments_storage_key_unique").on(table.storageKey)
441
+ ]);
425
442
  var attachmentRelations = relations(attachments, ({ one }) => ({
426
443
  document: one(documents, {
427
444
  fields: [attachments.documentId],
@@ -26,6 +26,8 @@ __export(exports_schema, {
26
26
  shareRoleEnum: () => shareRoleEnum,
27
27
  shareLinks: () => shareLinks,
28
28
  shareLinkRelations: () => shareLinkRelations,
29
+ shareGrantStatusEnum: () => shareGrantStatusEnum,
30
+ shareAccessModeEnum: () => shareAccessModeEnum,
29
31
  sessions: () => sessions,
30
32
  pipelineStatusEnum: () => pipelineStatusEnum,
31
33
  pipelineStageEnum: () => pipelineStageEnum,
@@ -78,6 +80,8 @@ var tsvector = customType({
78
80
  });
79
81
  var documentVisibilityEnum = pgEnum("document_visibility", ["private", "shared", "public"]);
80
82
  var shareRoleEnum = pgEnum("share_role", ["viewer", "commenter", "editor"]);
83
+ var shareAccessModeEnum = pgEnum("share_access_mode", ["public", "restricted"]);
84
+ var shareGrantStatusEnum = pgEnum("share_grant_status", ["pending", "accepted", "revoked"]);
81
85
  var embeddingStatusEnum = pgEnum("embedding_status", [
82
86
  "pending",
83
87
  "processing",
@@ -369,6 +373,9 @@ var shareLinks = pgTable("share_links", {
369
373
  token: text("token").notNull().unique(),
370
374
  passwordHash: text("password_hash"),
371
375
  role: shareRoleEnum("role").notNull().default("viewer"),
376
+ accessMode: shareAccessModeEnum("access_mode").notNull().default("public"),
377
+ allowPasswordFallback: boolean("allow_password_fallback").notNull().default(false),
378
+ policyVersion: integer("policy_version").notNull().default(1),
372
379
  expiresAt: timestamp("expires_at"),
373
380
  createdBy: uuid("created_by").notNull().references(() => users.id, { onDelete: "cascade" }),
374
381
  workspaceId: text("workspace_id"),
@@ -404,8 +411,15 @@ var guestAccess = pgTable("guest_access", {
404
411
  shareLinkId: uuid("share_link_id").notNull().references(() => shareLinks.id, { onDelete: "cascade" }),
405
412
  workspaceId: text("workspace_id"),
406
413
  guestEmail: text("guest_email").notNull(),
407
- grantedAt: timestamp("granted_at").defaultNow().notNull()
408
- }, (table) => [index("guest_access_share_link_idx").on(table.shareLinkId)]);
414
+ role: shareRoleEnum("role").notNull().default("viewer"),
415
+ status: shareGrantStatusEnum("status").notNull().default("pending"),
416
+ grantedAt: timestamp("granted_at").defaultNow().notNull(),
417
+ acceptedAt: timestamp("accepted_at"),
418
+ revokedAt: timestamp("revoked_at")
419
+ }, (table) => [
420
+ index("guest_access_share_link_idx").on(table.shareLinkId),
421
+ uniqueIndex("guest_access_share_link_email_unique_idx").on(table.shareLinkId, table.guestEmail)
422
+ ]);
409
423
  var guestAccessRelations = relations(guestAccess, ({ one }) => ({
410
424
  shareLink: one(shareLinks, {
411
425
  fields: [guestAccess.shareLinkId],
@@ -421,7 +435,10 @@ var attachments = pgTable("attachments", {
421
435
  size: bigint("size", { mode: "number" }).notNull(),
422
436
  storageKey: text("storage_key").notNull(),
423
437
  createdAt: timestamp("created_at").defaultNow().notNull()
424
- }, (table) => [index("attachments_document_id_idx").on(table.documentId)]);
438
+ }, (table) => [
439
+ index("attachments_document_id_idx").on(table.documentId),
440
+ uniqueIndex("attachments_storage_key_unique").on(table.storageKey)
441
+ ]);
425
442
  var attachmentRelations = relations(attachments, ({ one }) => ({
426
443
  document: one(documents, {
427
444
  fields: [attachments.documentId],
@@ -7,7 +7,7 @@ import { a as te, i as _, n as ne, o as v, r as re, t as ie } from "./dialog-Ce7
7
7
  import { t as ae } from "./input-BWlOML_m.js";
8
8
  import { t as y } from "./label-C2HfJNQ2.js";
9
9
  import { a as oe, n as se, o as ce, r as b, s as le, t as ue } from "./api-keys-DIwAdYkg.js";
10
- import { a as de, i as fe, n as pe, r as me, t as he } from "./select-value-GXwx90Pr.js";
10
+ import { a as de, i as fe, n as pe, r as me, t as he } from "./select-value-JCAp2PmU.js";
11
11
  import "svelte/internal/disclose-version";
12
12
  import * as x from "svelte/internal/client";
13
13
  //#region src/lib/components/sidebar/category-dialog-feedback.ts
@@ -0,0 +1,340 @@
1
+ import { t as e } from "./Icon-Db-o32_E.js";
2
+ import { n as t } from "./folder-Cx60MRpi.js";
3
+ import { t as n } from "./dist-DQa_OHOa.js";
4
+ import { $ as r, G as i, H as a, J as o, K as s, Q as c, U as l, W as u, X as d, Y as f, Z as p, at as m, ct as h, dt as g, et as _, it as v, lt as ee, nt as te, ot as y, q as ne, rt as b, st as x, tt as S, ut as C } from "./messages-DIovIZrK.js";
5
+ import { t as w } from "./utils-BPDRytUU.js";
6
+ import { A as T, K as E, et as D, q as O } from "./floating-layer-anchor-S5RSefGN.js";
7
+ import "svelte/internal/disclose-version";
8
+ import * as k from "svelte/internal/client";
9
+ import { getAllContexts as A, mount as j, unmount as M } from "svelte";
10
+ import "svelte/internal/flags/legacy";
11
+ //#region ../node_modules/.bun/lucide-svelte@0.577.0+ff5f301bb2db9a0d/node_modules/lucide-svelte/dist/icons/calendar.svelte
12
+ function N(t, n) {
13
+ let r = k.legacy_rest_props(n, [
14
+ "children",
15
+ "$$slots",
16
+ "$$events",
17
+ "$$legacy"
18
+ ]), i = [
19
+ ["path", { d: "M8 2v4" }],
20
+ ["path", { d: "M16 2v4" }],
21
+ ["rect", {
22
+ width: "18",
23
+ height: "18",
24
+ x: "3",
25
+ y: "4",
26
+ rx: "2"
27
+ }],
28
+ ["path", { d: "M3 10h18" }]
29
+ ];
30
+ e(t, k.spread_props({ name: "calendar" }, () => r, {
31
+ get iconNode() {
32
+ return i;
33
+ },
34
+ children: (e, t) => {
35
+ var r = k.comment(), i = k.first_child(r);
36
+ k.slot(i, n, "default", {}, null), k.append(e, r);
37
+ },
38
+ $$slots: { default: !0 }
39
+ }));
40
+ }
41
+ //#endregion
42
+ //#region ../node_modules/.bun/lucide-svelte@0.577.0+ff5f301bb2db9a0d/node_modules/lucide-svelte/dist/icons/chevron-left.svelte
43
+ function P(t, n) {
44
+ let r = k.legacy_rest_props(n, [
45
+ "children",
46
+ "$$slots",
47
+ "$$events",
48
+ "$$legacy"
49
+ ]), i = [["path", { d: "m15 18-6-6 6-6" }]];
50
+ e(t, k.spread_props({ name: "chevron-left" }, () => r, {
51
+ get iconNode() {
52
+ return i;
53
+ },
54
+ children: (e, t) => {
55
+ var r = k.comment(), i = k.first_child(r);
56
+ k.slot(i, n, "default", {}, null), k.append(e, r);
57
+ },
58
+ $$slots: { default: !0 }
59
+ }));
60
+ }
61
+ //#endregion
62
+ //#region ../node_modules/.bun/lucide-svelte@0.577.0+ff5f301bb2db9a0d/node_modules/lucide-svelte/dist/icons/folder-kanban.svelte
63
+ function F(t, n) {
64
+ let r = k.legacy_rest_props(n, [
65
+ "children",
66
+ "$$slots",
67
+ "$$events",
68
+ "$$legacy"
69
+ ]), i = [
70
+ ["path", { d: "M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z" }],
71
+ ["path", { d: "M8 10v4" }],
72
+ ["path", { d: "M12 10v2" }],
73
+ ["path", { d: "M16 10v6" }]
74
+ ];
75
+ e(t, k.spread_props({ name: "folder-kanban" }, () => r, {
76
+ get iconNode() {
77
+ return i;
78
+ },
79
+ children: (e, t) => {
80
+ var r = k.comment(), i = k.first_child(r);
81
+ k.slot(i, n, "default", {}, null), k.append(e, r);
82
+ },
83
+ $$slots: { default: !0 }
84
+ }));
85
+ }
86
+ //#endregion
87
+ //#region ../node_modules/.bun/bits-ui@2.18.1+203cd734255b50e4/node_modules/bits-ui/dist/bits/utilities/portal/portal-consumer.svelte
88
+ function I(e, t) {
89
+ var n = k.comment(), r = k.first_child(n);
90
+ k.key(r, () => t.children, (e) => {
91
+ var n = k.comment(), r = k.first_child(n);
92
+ k.snippet(r, () => t.children ?? k.noop), k.append(e, n);
93
+ }), k.append(e, n);
94
+ }
95
+ //#endregion
96
+ //#region ../node_modules/.bun/bits-ui@2.18.1+203cd734255b50e4/node_modules/bits-ui/dist/bits/utilities/config/bits-config.js
97
+ var L = new O("BitsConfig");
98
+ function R() {
99
+ let e = new z(null, {});
100
+ return L.getOr(e).opts;
101
+ }
102
+ var z = class {
103
+ opts;
104
+ constructor(e, t) {
105
+ let n = B(e, t);
106
+ this.opts = {
107
+ defaultPortalTo: n((e) => e.defaultPortalTo),
108
+ defaultLocale: n((e) => e.defaultLocale)
109
+ };
110
+ }
111
+ };
112
+ function B(e, t) {
113
+ return (n) => D(() => {
114
+ let r = n(t)?.current;
115
+ if (r !== void 0) return r;
116
+ if (e !== null) return n(e.opts)?.current;
117
+ });
118
+ }
119
+ //#endregion
120
+ //#region ../node_modules/.bun/bits-ui@2.18.1+203cd734255b50e4/node_modules/bits-ui/dist/bits/utilities/config/prop-resolvers.js
121
+ function V(e, t) {
122
+ return (n) => {
123
+ let r = R();
124
+ return D(() => {
125
+ let i = n();
126
+ if (i !== void 0) return i;
127
+ let a = e(r).current;
128
+ return a === void 0 ? t : a;
129
+ });
130
+ };
131
+ }
132
+ var H = V((e) => e.defaultPortalTo, "body");
133
+ //#endregion
134
+ //#region ../node_modules/.bun/bits-ui@2.18.1+203cd734255b50e4/node_modules/bits-ui/dist/bits/utilities/portal/portal.svelte
135
+ function U(e, t) {
136
+ k.push(t, !0);
137
+ let n = H(() => t.to), r = A(), i = k.derived(a);
138
+ function a() {
139
+ if (!T || t.disabled) return null;
140
+ let e = null;
141
+ return e = typeof n.current == "string" ? document.querySelector(n.current) : n.current, e;
142
+ }
143
+ let o;
144
+ function s() {
145
+ o &&= (M(o), null);
146
+ }
147
+ E([() => k.get(i), () => t.disabled], ([e, n]) => {
148
+ if (!e || n) {
149
+ s();
150
+ return;
151
+ }
152
+ return o = j(I, {
153
+ target: e,
154
+ props: { children: t.children },
155
+ context: r
156
+ }), () => {
157
+ s();
158
+ };
159
+ });
160
+ var c = k.comment(), l = k.first_child(c), u = (e) => {
161
+ var n = k.comment(), r = k.first_child(n);
162
+ k.snippet(r, () => t.children ?? k.noop), k.append(e, n);
163
+ };
164
+ k.if(l, (e) => {
165
+ t.disabled && e(u);
166
+ }), k.append(e, c), k.pop();
167
+ }
168
+ //#endregion
169
+ //#region ../node_modules/.bun/@hiai-gg+hiai-ui@0.0.8+3149ccaa93f654b8/node_modules/@hiai-gg/hiai-ui/dist/components/ui/badge/badge.svelte
170
+ var W = /* @__PURE__ */ new Set([
171
+ "$$slots",
172
+ "$$events",
173
+ "$$legacy",
174
+ "ref",
175
+ "class",
176
+ "variant",
177
+ "children"
178
+ ]), G = k.from_html("<div><!></div>");
179
+ function K(e, t) {
180
+ k.push(t, !0);
181
+ let n = k.prop(t, "ref", 15, null), r = k.prop(t, "variant", 3, "default"), i = k.rest_props(t, W);
182
+ var a = G();
183
+ k.attribute_effect(a, (e) => ({
184
+ class: e,
185
+ ...i
186
+ }), [() => w(q({ variant: r() }), t.class)]);
187
+ var o = k.child(a), s = (e) => {
188
+ var n = k.comment(), r = k.first_child(n);
189
+ k.snippet(r, () => t.children), k.append(e, n);
190
+ };
191
+ k.if(o, (e) => {
192
+ t.children && e(s);
193
+ }), k.reset(a), k.bind_this(a, (e) => n(e), () => n()), k.append(e, a), k.pop();
194
+ }
195
+ //#endregion
196
+ //#region ../node_modules/.bun/@hiai-gg+hiai-ui@0.0.8+3149ccaa93f654b8/node_modules/@hiai-gg/hiai-ui/dist/components/ui/badge/index.js
197
+ var q = n({
198
+ base: "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
199
+ variants: { variant: {
200
+ default: "border-transparent bg-primary text-primary-foreground shadow",
201
+ secondary: "border-transparent bg-secondary text-secondary-foreground",
202
+ destructive: "border-transparent bg-destructive text-destructive-foreground shadow",
203
+ outline: "text-foreground"
204
+ } },
205
+ defaultVariants: { variant: "default" }
206
+ }), J = k.from_html("<span class=\"dp-weekday svelte-zmry26\"> </span>"), Y = k.from_html("<span class=\"dp-empty svelte-zmry26\"></span>"), X = k.from_html("<button type=\"button\"> </button>"), re = k.from_html("<button type=\"button\" class=\"dp-clear svelte-zmry26\"> </button>"), ie = k.from_html("<div class=\"dp-popover svelte-zmry26\" role=\"dialog\"><div class=\"dp-header svelte-zmry26\"><button type=\"button\" class=\"dp-nav svelte-zmry26\"><!></button> <span class=\"dp-title svelte-zmry26\"> </span> <button type=\"button\" class=\"dp-nav svelte-zmry26\"><!></button></div> <div class=\"dp-weekdays svelte-zmry26\"></div> <div class=\"dp-grid svelte-zmry26\"></div> <!></div>"), ae = k.from_html("<div class=\"datepicker svelte-zmry26\"><button type=\"button\" aria-haspopup=\"dialog\" class=\"dp-trigger svelte-zmry26\"><!> <span> </span></button> <!></div>");
207
+ function Z(e, n) {
208
+ k.push(n, !0);
209
+ let w = k.prop(n, "value", 15, ""), T = k.prop(n, "ariaLabel", 19, () => u()), E = k.prop(n, "placeholder", 19, () => s()), D = k.state(!1), O = k.state(null), A = [
210
+ r(),
211
+ c(),
212
+ p(),
213
+ d(),
214
+ f(),
215
+ o(),
216
+ ne()
217
+ ], j = [
218
+ g(),
219
+ C(),
220
+ ee(),
221
+ h(),
222
+ x(),
223
+ y(),
224
+ m(),
225
+ v(),
226
+ b(),
227
+ te(),
228
+ S(),
229
+ _()
230
+ ];
231
+ function M(e) {
232
+ return String(e).padStart(2, "0");
233
+ }
234
+ function F(e) {
235
+ let t = /^(\d{4})-(\d{2})-(\d{2})$/.exec(e);
236
+ return t ? {
237
+ y: Number(t[1]),
238
+ m: Number(t[2]) - 1,
239
+ d: Number(t[3])
240
+ } : null;
241
+ }
242
+ let I = /* @__PURE__ */ new Date(), L = k.state(k.proxy(I.getFullYear())), R = k.state(k.proxy(I.getMonth()));
243
+ k.user_effect(() => {
244
+ if (k.get(D)) {
245
+ let e = F(w());
246
+ e && (k.set(L, e.y, !0), k.set(R, e.m, !0));
247
+ }
248
+ });
249
+ let z = k.derived(() => F(w()));
250
+ function B() {
251
+ let e = (new Date(k.get(L), k.get(R), 1).getDay() + 6) % 7, t = new Date(k.get(L), k.get(R) + 1, 0).getDate(), n = [];
252
+ for (let t = 0; t < e; t++) n.push(null);
253
+ for (let e = 1; e <= t; e++) n.push(e);
254
+ return n;
255
+ }
256
+ function V(e) {
257
+ return e === I.getDate() && k.get(R) === I.getMonth() && k.get(L) === I.getFullYear();
258
+ }
259
+ function H(e) {
260
+ return k.get(z) !== null && k.get(z).y === k.get(L) && k.get(z).m === k.get(R) && k.get(z).d === e;
261
+ }
262
+ function U(e) {
263
+ w(`${k.get(L)}-${M(k.get(R) + 1)}-${M(e)}`), k.set(D, !1), n.onchange?.();
264
+ }
265
+ function W() {
266
+ w(""), k.set(D, !1), n.onchange?.();
267
+ }
268
+ function G() {
269
+ k.get(R) === 0 ? (k.set(R, 11), k.set(L, k.get(L) - 1)) : k.set(R, k.get(R) - 1);
270
+ }
271
+ function K() {
272
+ k.get(R) === 11 ? (k.set(R, 0), k.set(L, k.get(L) + 1)) : k.set(R, k.get(R) + 1);
273
+ }
274
+ k.user_effect(() => {
275
+ if (!k.get(D)) return;
276
+ function e(e) {
277
+ k.get(O) && !k.get(O).contains(e.target) && k.set(D, !1);
278
+ }
279
+ function t(e) {
280
+ e.key === "Escape" && k.set(D, !1);
281
+ }
282
+ return document.addEventListener("pointerdown", e), document.addEventListener("keydown", t), () => {
283
+ document.removeEventListener("pointerdown", e), document.removeEventListener("keydown", t);
284
+ };
285
+ });
286
+ var q = ae(), Z = k.child(q), Q = k.child(Z);
287
+ N(Q, { class: "size-3.5 shrink-0 opacity-70" });
288
+ var $ = k.sibling(Q, 2), oe = k.child($, !0);
289
+ k.reset($), k.reset(Z);
290
+ var se = k.sibling(Z, 2), ce = (e) => {
291
+ var n = ie(), r = k.child(n), o = k.child(r);
292
+ P(k.child(o), { class: "size-4" }), k.reset(o);
293
+ var s = k.sibling(o, 2), c = k.child(s);
294
+ k.reset(s);
295
+ var u = k.sibling(s, 2);
296
+ t(k.child(u), { class: "size-4" }), k.reset(u), k.reset(r);
297
+ var d = k.sibling(r, 2);
298
+ k.each(d, 20, () => A, (e) => e, (e, t) => {
299
+ var n = J(), r = k.child(n, !0);
300
+ k.reset(n), k.template_effect(() => k.set_text(r, t)), k.append(e, n);
301
+ }), k.reset(d);
302
+ var f = k.sibling(d, 2);
303
+ k.each(f, 21, B, k.index, (e, t) => {
304
+ var n = k.comment(), r = k.first_child(n), i = (e) => {
305
+ var t = Y();
306
+ k.append(e, t);
307
+ }, a = (e) => {
308
+ var n = X();
309
+ let r;
310
+ var i = k.child(n, !0);
311
+ k.reset(n), k.template_effect((e) => {
312
+ r = k.set_class(n, 1, "dp-day svelte-zmry26", null, r, e), k.set_text(i, k.get(t));
313
+ }, [() => ({
314
+ selected: H(k.get(t)),
315
+ today: V(k.get(t))
316
+ })]), k.delegated("click", n, () => U(k.get(t))), k.append(e, n);
317
+ };
318
+ k.if(r, (e) => {
319
+ k.get(t) === null ? e(i) : e(a, -1);
320
+ }), k.append(e, n);
321
+ }), k.reset(f);
322
+ var p = k.sibling(f, 2), m = (e) => {
323
+ var t = re(), n = k.child(t, !0);
324
+ k.reset(t), k.template_effect((e) => k.set_text(n, e), [() => i()]), k.delegated("click", t, W), k.append(e, t);
325
+ };
326
+ k.if(p, (e) => {
327
+ w() && e(m);
328
+ }), k.reset(n), k.template_effect((e, t) => {
329
+ k.set_attribute(n, "aria-label", T()), k.set_attribute(o, "aria-label", e), k.set_text(c, `${j[k.get(R)] ?? ""} ${k.get(L) ?? ""}`), k.set_attribute(u, "aria-label", t);
330
+ }, [() => l(), () => a()]), k.delegated("click", o, G), k.delegated("click", u, K), k.append(e, n);
331
+ };
332
+ k.if(se, (e) => {
333
+ k.get(D) && e(ce);
334
+ }), k.reset(q), k.bind_this(q, (e) => k.set(O, e), () => k.get(O)), k.template_effect(() => {
335
+ k.set_attribute(Z, "id", n.id), k.set_attribute(Z, "aria-label", T()), k.set_attribute(Z, "aria-expanded", k.get(D)), k.set_class($, 1, k.clsx(w() ? "" : "dp-placeholder"), "svelte-zmry26"), k.set_text(oe, w() || E());
336
+ }), k.delegated("click", Z, () => k.set(D, !k.get(D))), k.append(e, q), k.pop();
337
+ }
338
+ k.delegate(["click"]);
339
+ //#endregion
340
+ export { P as a, F as i, K as n, N as o, U as r, Z as t };
@@ -1,5 +1,5 @@
1
1
  import { n as e, t } from "./folder-Cx60MRpi.js";
2
- import { a as n, i as r, o as i, r as a, t as o } from "./dropdown-menu-Cre80-CJ.js";
2
+ import { a as n, i as r, o as i, r as a, t as o } from "./dropdown-menu-CJ_7V3N0.js";
3
3
  import { Kt as s, Pi as c, Ti as l, Xn as u, hi as ee, mi as te, vi as d } from "./messages-DIovIZrK.js";
4
4
  import { a as f, n as p, t as m } from "./route-context-DYQlUfzL.js";
5
5
  import { t as h } from "./utils-DrfHTcei.js";