ocean-brain 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/package.json +5 -5
  2. package/scripts/postinstall-prisma.mjs +3 -2
  3. package/server/client/dist/assets/Calendar-CSXEuWmQ.js +25 -0
  4. package/server/client/dist/assets/Callout-Ap1OcxWN.js +1 -0
  5. package/server/client/dist/assets/Graph-C0Ax9qjI.js +1 -0
  6. package/server/client/dist/assets/{Image-ZxF459sC.js → Image-CSbcG-5a.js} +1 -1
  7. package/server/client/dist/assets/{Image.es-BQfyKc2-.js → Image.es-Fbe7aDDo.js} +1 -1
  8. package/server/client/dist/assets/{ModalActionRow-DyOb58KJ.js → ModalActionRow-DjI5b4bl.js} +1 -1
  9. package/server/client/dist/assets/Note-BY6WgYLq.js +1 -0
  10. package/server/client/dist/assets/Note-W4f6H9K0.css +1 -0
  11. package/server/client/dist/assets/Reminders-vRksvSQE.js +1 -0
  12. package/server/client/dist/assets/Search-Cq4tuiJO.js +1 -0
  13. package/server/client/dist/assets/{SurfaceCard-nZNf9lyE.js → SurfaceCard-Br6TjX5W.js} +1 -1
  14. package/server/client/dist/assets/Tag-ARDLA-Pb.js +1 -0
  15. package/server/client/dist/assets/TagNotes-CDGVrCJU.js +1 -0
  16. package/server/client/dist/assets/{Trash.es-BGoN5q9L.js → Trash.es-BfCEiL3-.js} +1 -1
  17. package/server/client/dist/assets/ViewNotes-ZBOQ1adH.js +1 -0
  18. package/server/client/dist/assets/Views-DQHPfdwM.js +1 -0
  19. package/server/client/dist/assets/{image.api-0mMkElZk.js → image.api-DGXlQ_Ca.js} +1 -1
  20. package/server/client/dist/assets/index-B28TO4FC.js +1 -0
  21. package/server/client/dist/assets/{index-DL7pUwq2.css → index-Bm9l_L20.css} +1 -1
  22. package/server/client/dist/assets/index-Bsx4P7EA.js +210 -0
  23. package/server/client/dist/assets/manage-image-Dg297A_h.js +1 -0
  24. package/server/client/dist/assets/manage-image-detail-hk6jWyiB.js +1 -0
  25. package/server/client/dist/assets/mcp-CSjmBjFR.js +1 -0
  26. package/server/client/dist/assets/{note-core-BCgMq5QA.js → note-core-GgFcksAF.js} +1 -1
  27. package/server/client/dist/assets/{note-vendor-BofYbzmZ.js → note-vendor-5N5mRkIT.js} +3 -3
  28. package/server/client/dist/assets/{placeholder-i-uNe71U.js → placeholder-Bmiowo28.js} +4 -4
  29. package/server/client/dist/assets/trash-CM7SbVtW.js +1 -0
  30. package/server/client/dist/assets/{useReminderMutate-tNMwwRnx.js → useReminderMutate-DsIvVpCQ.js} +2 -2
  31. package/server/client/dist/assets/view-dashboard-CP8nhfxQ.js +90 -0
  32. package/server/client/dist/index.html +4 -4
  33. package/server/dist/app.js +8 -84
  34. package/server/dist/app.js.map +1 -1
  35. package/server/dist/features/auth/http/api.js +43 -0
  36. package/server/dist/features/auth/http/api.js.map +1 -0
  37. package/server/dist/features/auth/http/login-page.js +28 -0
  38. package/server/dist/features/auth/http/login-page.js.map +1 -0
  39. package/server/dist/features/auth/http/pages.js +50 -0
  40. package/server/dist/features/auth/http/pages.js.map +1 -0
  41. package/server/dist/features/auth/service.js +94 -0
  42. package/server/dist/features/auth/service.js.map +1 -0
  43. package/server/dist/features/cache/graphql/cache.field.resolver.js +5 -0
  44. package/server/dist/features/cache/graphql/cache.field.resolver.js.map +1 -0
  45. package/server/dist/features/cache/graphql/cache.mutation.resolver.js +49 -0
  46. package/server/dist/features/cache/graphql/cache.mutation.resolver.js.map +1 -0
  47. package/server/dist/features/cache/graphql/cache.query.resolver.js +21 -0
  48. package/server/dist/features/cache/graphql/cache.query.resolver.js.map +1 -0
  49. package/server/dist/features/cache/graphql/cache.resolver.js +12 -0
  50. package/server/dist/features/cache/graphql/cache.resolver.js.map +1 -0
  51. package/server/dist/features/cache/graphql/cache.type-defs.js +32 -0
  52. package/server/dist/features/cache/graphql/cache.type-defs.js.map +1 -0
  53. package/server/dist/features/cache/graphql/index.js +21 -0
  54. package/server/dist/features/cache/graphql/index.js.map +1 -0
  55. package/server/dist/features/image/graphql/image.field.resolver.js +14 -0
  56. package/server/dist/features/image/graphql/image.field.resolver.js.map +1 -0
  57. package/server/dist/features/image/graphql/image.mutation.resolver.js +21 -0
  58. package/server/dist/features/image/graphql/image.mutation.resolver.js.map +1 -0
  59. package/server/dist/features/image/graphql/image.query.resolver.js +40 -0
  60. package/server/dist/features/image/graphql/image.query.resolver.js.map +1 -0
  61. package/server/dist/features/image/graphql/image.resolver.js +12 -0
  62. package/server/dist/features/image/graphql/image.resolver.js.map +1 -0
  63. package/server/dist/features/image/graphql/image.type-defs.js +31 -0
  64. package/server/dist/features/image/graphql/image.type-defs.js.map +1 -0
  65. package/server/dist/features/image/graphql/index.js +16 -0
  66. package/server/dist/features/image/graphql/index.js.map +1 -0
  67. package/server/dist/features/image/http/upload.js +48 -0
  68. package/server/dist/features/image/http/upload.js.map +1 -0
  69. package/server/dist/features/image/services/delete.js +52 -0
  70. package/server/dist/features/image/services/delete.js.map +1 -0
  71. package/server/dist/{modules/remote-image.js → features/image/services/remote-fetch.js} +1 -1
  72. package/server/dist/features/image/services/remote-fetch.js.map +1 -0
  73. package/server/dist/{modules/image-upload.js → features/image/services/upload.js} +4 -8
  74. package/server/dist/features/image/services/upload.js.map +1 -0
  75. package/server/dist/{views/mcp-admin.js → features/mcp-admin/http/handlers.js} +3 -3
  76. package/server/dist/features/mcp-admin/http/handlers.js.map +1 -0
  77. package/server/dist/{modules/mcp-admin.js → features/mcp-admin/service.js} +3 -3
  78. package/server/dist/features/mcp-admin/service.js.map +1 -0
  79. package/server/dist/features/note/graphql/index.js +8 -0
  80. package/server/dist/features/note/graphql/index.js.map +1 -0
  81. package/server/dist/features/note/graphql/note.field.resolver.js +12 -0
  82. package/server/dist/features/note/graphql/note.field.resolver.js.map +1 -0
  83. package/server/dist/features/note/graphql/note.graphql.shared.js +23 -0
  84. package/server/dist/features/note/graphql/note.graphql.shared.js.map +1 -0
  85. package/server/dist/features/note/graphql/note.mutation.resolver.js +140 -0
  86. package/server/dist/features/note/graphql/note.mutation.resolver.js.map +1 -0
  87. package/server/dist/features/note/graphql/note.query.resolver.js +382 -0
  88. package/server/dist/features/note/graphql/note.query.resolver.js.map +1 -0
  89. package/server/dist/features/note/graphql/note.resolver.js +14 -0
  90. package/server/dist/features/note/graphql/note.resolver.js.map +1 -0
  91. package/server/dist/features/note/graphql/note.type-defs.js +184 -0
  92. package/server/dist/features/note/graphql/note.type-defs.js.map +1 -0
  93. package/server/dist/{views/note.js → features/note/http/mcp.js} +27 -15
  94. package/server/dist/features/note/http/mcp.js.map +1 -0
  95. package/server/dist/{modules/note-authoring.js → features/note/services/authoring.js} +25 -7
  96. package/server/dist/features/note/services/authoring.js.map +1 -0
  97. package/server/dist/{modules/note-cleanup.js → features/note/services/cleanup.js} +14 -23
  98. package/server/dist/features/note/services/cleanup.js.map +1 -0
  99. package/server/dist/features/note/services/search-backfill.js +84 -0
  100. package/server/dist/features/note/services/search-backfill.js.map +1 -0
  101. package/server/dist/features/note/services/search.js +197 -0
  102. package/server/dist/features/note/services/search.js.map +1 -0
  103. package/server/dist/{modules/note-snapshot.js → features/note/services/snapshot.js} +51 -49
  104. package/server/dist/features/note/services/snapshot.js.map +1 -0
  105. package/server/dist/{modules/note-tag-filter.js → features/note/services/tag-filter.js} +2 -6
  106. package/server/dist/features/note/services/tag-filter.js.map +1 -0
  107. package/server/dist/{modules/note-trash.js → features/note/services/trash.js} +28 -23
  108. package/server/dist/features/note/services/trash.js.map +1 -0
  109. package/server/dist/features/placeholder/graphql/index.js +27 -0
  110. package/server/dist/features/placeholder/graphql/index.js.map +1 -0
  111. package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js +5 -0
  112. package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js.map +1 -0
  113. package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js +72 -0
  114. package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js.map +1 -0
  115. package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js +36 -0
  116. package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js.map +1 -0
  117. package/server/dist/features/placeholder/graphql/placeholder.resolver.js +12 -0
  118. package/server/dist/features/placeholder/graphql/placeholder.resolver.js.map +1 -0
  119. package/server/dist/features/placeholder/graphql/placeholder.type-defs.js +50 -0
  120. package/server/dist/features/placeholder/graphql/placeholder.type-defs.js.map +1 -0
  121. package/server/dist/features/reminder/graphql/index.js +27 -0
  122. package/server/dist/features/reminder/graphql/index.js.map +1 -0
  123. package/server/dist/features/reminder/graphql/reminder.field.resolver.js +10 -0
  124. package/server/dist/features/reminder/graphql/reminder.field.resolver.js.map +1 -0
  125. package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js +59 -0
  126. package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js.map +1 -0
  127. package/server/dist/features/reminder/graphql/reminder.query.resolver.js +79 -0
  128. package/server/dist/features/reminder/graphql/reminder.query.resolver.js.map +1 -0
  129. package/server/dist/features/reminder/graphql/reminder.resolver.js +12 -0
  130. package/server/dist/features/reminder/graphql/reminder.resolver.js.map +1 -0
  131. package/server/dist/features/reminder/graphql/reminder.type-defs.js +51 -0
  132. package/server/dist/features/reminder/graphql/reminder.type-defs.js.map +1 -0
  133. package/server/dist/features/tag/graphql/index.js +14 -0
  134. package/server/dist/features/tag/graphql/index.js.map +1 -0
  135. package/server/dist/features/tag/graphql/tag.field.resolver.js +10 -0
  136. package/server/dist/features/tag/graphql/tag.field.resolver.js.map +1 -0
  137. package/server/dist/features/tag/graphql/tag.mutation.resolver.js +15 -0
  138. package/server/dist/features/tag/graphql/tag.mutation.resolver.js.map +1 -0
  139. package/server/dist/features/tag/graphql/tag.query.resolver.js +26 -0
  140. package/server/dist/features/tag/graphql/tag.query.resolver.js.map +1 -0
  141. package/server/dist/features/tag/graphql/tag.resolver.js +12 -0
  142. package/server/dist/features/tag/graphql/tag.resolver.js.map +1 -0
  143. package/server/dist/features/tag/graphql/tag.type-defs.js +46 -0
  144. package/server/dist/features/tag/graphql/tag.type-defs.js.map +1 -0
  145. package/server/dist/{views/tag.js → features/tag/http/mcp.js} +3 -3
  146. package/server/dist/features/tag/http/mcp.js.map +1 -0
  147. package/server/dist/{modules/tag-organization.js → features/tag/services/organization.js} +38 -8
  148. package/server/dist/features/tag/services/organization.js.map +1 -0
  149. package/server/dist/features/view/graphql/index.js +11 -0
  150. package/server/dist/features/view/graphql/index.js.map +1 -0
  151. package/server/dist/features/view/graphql/view.mutation.resolver.js +53 -0
  152. package/server/dist/features/view/graphql/view.mutation.resolver.js.map +1 -0
  153. package/server/dist/features/view/graphql/view.query.resolver.js +29 -0
  154. package/server/dist/features/view/graphql/view.query.resolver.js.map +1 -0
  155. package/server/dist/features/view/graphql/view.resolver.js +10 -0
  156. package/server/dist/features/view/graphql/view.resolver.js.map +1 -0
  157. package/server/dist/features/view/graphql/view.type-defs.js +63 -0
  158. package/server/dist/features/view/graphql/view.type-defs.js.map +1 -0
  159. package/server/dist/features/view/services/workspace.js +432 -0
  160. package/server/dist/features/view/services/workspace.js.map +1 -0
  161. package/server/dist/main.js +14 -0
  162. package/server/dist/main.js.map +1 -1
  163. package/server/dist/modules/auth-guard.js +10 -9
  164. package/server/dist/modules/auth-guard.js.map +1 -1
  165. package/server/dist/modules/auth-mode.js +1 -3
  166. package/server/dist/modules/auth-mode.js.map +1 -1
  167. package/server/dist/modules/blocknote.js +8 -17
  168. package/server/dist/modules/blocknote.js.map +1 -1
  169. package/server/dist/modules/data-maintenance.js +75 -0
  170. package/server/dist/modules/data-maintenance.js.map +1 -0
  171. package/server/dist/modules/error-handler.js.map +1 -1
  172. package/server/dist/modules/logger.js +5 -23
  173. package/server/dist/modules/logger.js.map +1 -1
  174. package/server/dist/modules/mcp-auth.js +4 -5
  175. package/server/dist/modules/mcp-auth.js.map +1 -1
  176. package/server/dist/modules/mcp-token.js.map +1 -1
  177. package/server/dist/modules/prisma-runtime.js +2 -7
  178. package/server/dist/modules/prisma-runtime.js.map +1 -1
  179. package/server/dist/modules/recovery-retention.js +1 -1
  180. package/server/dist/modules/recovery-retention.js.map +1 -1
  181. package/server/dist/modules/server-events-handler.js +34 -0
  182. package/server/dist/modules/server-events-handler.js.map +1 -0
  183. package/server/dist/modules/server-events.js +32 -0
  184. package/server/dist/modules/server-events.js.map +1 -0
  185. package/server/dist/modules/use-async.js.map +1 -1
  186. package/server/dist/paths.js.map +1 -1
  187. package/server/dist/routes/api.js +34 -0
  188. package/server/dist/routes/api.js.map +1 -0
  189. package/server/dist/routes/auth-pages.js +11 -0
  190. package/server/dist/routes/auth-pages.js.map +1 -0
  191. package/server/dist/routes/client.js +27 -0
  192. package/server/dist/routes/client.js.map +1 -0
  193. package/server/dist/routes/graphql.js +33 -0
  194. package/server/dist/routes/graphql.js.map +1 -0
  195. package/server/dist/routes/index.js +11 -0
  196. package/server/dist/routes/index.js.map +1 -0
  197. package/server/dist/routes/mcp.js +30 -0
  198. package/server/dist/routes/mcp.js.map +1 -0
  199. package/server/dist/schema/index.js +11 -8
  200. package/server/dist/schema/index.js.map +1 -1
  201. package/server/dist/types/index.js.map +1 -1
  202. package/server/prisma/migrations/20260413143000_0014_tag_name_unique/migration.sql +32 -0
  203. package/server/prisma/migrations/20260414143000_0015_note_searchable_text/migration.sql +5 -0
  204. package/server/prisma/migrations/20260416090000_0016_view_workspace/migration.sql +50 -0
  205. package/server/prisma/schema.prisma +66 -12
  206. package/server/client/dist/assets/Calendar-Kjy1PX6L.js +0 -25
  207. package/server/client/dist/assets/Graph-Bl5K2qUw.js +0 -1
  208. package/server/client/dist/assets/Note-BfGma2Qc.css +0 -1
  209. package/server/client/dist/assets/Note-DN_ko2M3.js +0 -1
  210. package/server/client/dist/assets/Reminders-BK-Uv9Ps.js +0 -1
  211. package/server/client/dist/assets/Search-ClHeWvmI.js +0 -1
  212. package/server/client/dist/assets/Tag-Dph4V_kl.js +0 -1
  213. package/server/client/dist/assets/TagNotes-CxP5qHZj.js +0 -1
  214. package/server/client/dist/assets/index-6lIw6jYW.js +0 -1
  215. package/server/client/dist/assets/index-Ba2XPRI8.js +0 -205
  216. package/server/client/dist/assets/manage-image-Br_kKxbb.js +0 -1
  217. package/server/client/dist/assets/manage-image-detail-9DzqbiqI.js +0 -1
  218. package/server/client/dist/assets/mcp-C_So91eX.js +0 -1
  219. package/server/client/dist/assets/trash-Cg3nJ1m5.js +0 -1
  220. package/server/dist/modules/auth.js +0 -25
  221. package/server/dist/modules/auth.js.map +0 -1
  222. package/server/dist/modules/image-upload.js.map +0 -1
  223. package/server/dist/modules/mcp-admin.js.map +0 -1
  224. package/server/dist/modules/note-authoring.js.map +0 -1
  225. package/server/dist/modules/note-cleanup.js.map +0 -1
  226. package/server/dist/modules/note-snapshot.js.map +0 -1
  227. package/server/dist/modules/note-tag-filter.js.map +0 -1
  228. package/server/dist/modules/note-trash.js.map +0 -1
  229. package/server/dist/modules/remote-image.js.map +0 -1
  230. package/server/dist/modules/tag-organization.js.map +0 -1
  231. package/server/dist/schema/cache/index.js +0 -58
  232. package/server/dist/schema/cache/index.js.map +0 -1
  233. package/server/dist/schema/image/index.js +0 -88
  234. package/server/dist/schema/image/index.js.map +0 -1
  235. package/server/dist/schema/note/index.js +0 -582
  236. package/server/dist/schema/note/index.js.map +0 -1
  237. package/server/dist/schema/placeholder/index.js +0 -105
  238. package/server/dist/schema/placeholder/index.js.map +0 -1
  239. package/server/dist/schema/reminder/index.js +0 -161
  240. package/server/dist/schema/reminder/index.js.map +0 -1
  241. package/server/dist/schema/tag/index.js +0 -81
  242. package/server/dist/schema/tag/index.js.map +0 -1
  243. package/server/dist/urls.js +0 -9
  244. package/server/dist/urls.js.map +0 -1
  245. package/server/dist/views/auth.js +0 -305
  246. package/server/dist/views/auth.js.map +0 -1
  247. package/server/dist/views/image.js +0 -44
  248. package/server/dist/views/image.js.map +0 -1
  249. package/server/dist/views/index.js +0 -6
  250. package/server/dist/views/index.js.map +0 -1
  251. package/server/dist/views/mcp-admin.js.map +0 -1
  252. package/server/dist/views/note.js.map +0 -1
  253. package/server/dist/views/tag.js.map +0 -1
@@ -1,582 +0,0 @@
1
- import models from "../../models.js";
2
- import { gql } from "../../modules/graphql.js";
3
- import {
4
- getNoteCleanupPreview,
5
- listNoteCleanupCandidates
6
- } from "../../modules/note-cleanup.js";
7
- import {
8
- captureNoteBaseline,
9
- createSnapshotMetaFromUserAgent,
10
- listNoteSnapshots,
11
- restoreNoteSnapshot
12
- } from "../../modules/note-snapshot.js";
13
- import {
14
- listTrashedNotes,
15
- restoreTrashedNoteById,
16
- trashNoteById
17
- } from "../../modules/note-trash.js";
18
- import { buildNoteTagNamesWhere, normalizeNoteTagNames } from "../../modules/note-tag-filter.js";
19
- const noteType = gql`
20
- input PaginationInput {
21
- limit: Int!
22
- offset: Int!
23
- }
24
-
25
- input SearchFilterInput {
26
- query: String!
27
- sortBy: String
28
- sortOrder: String
29
- pinnedFirst: Boolean
30
- }
31
-
32
- input DateRangeInput {
33
- start: String!
34
- end: String!
35
- }
36
-
37
- enum NoteLayout {
38
- narrow
39
- wide
40
- full
41
- }
42
-
43
- enum TagMatchMode {
44
- and
45
- or
46
- }
47
-
48
- input NoteInput {
49
- title: String
50
- content: String
51
- layout: NoteLayout
52
- }
53
-
54
- input NoteOrderInput {
55
- id: ID!
56
- order: Int!
57
- }
58
-
59
- type Tag {
60
- id: ID!
61
- name: String!
62
- createdAt: String!
63
- updatedAt: String!
64
- }
65
-
66
- type Note {
67
- id: ID!
68
- title: String!
69
- content: String!
70
- contentAsMarkdown: String!
71
- createdAt: String!
72
- updatedAt: String!
73
- pinned: Boolean!
74
- order: Int!
75
- layout: NoteLayout!
76
- tags: [Tag!]!
77
- }
78
-
79
- type Notes {
80
- totalCount: Int!
81
- notes: [Note!]!
82
- }
83
-
84
- type NoteCleanupBackReference {
85
- id: ID!
86
- title: String!
87
- }
88
-
89
- type NoteCleanupCandidate {
90
- id: ID!
91
- title: String!
92
- updatedAt: String!
93
- pinned: Boolean!
94
- tagNames: [String!]!
95
- reminderCount: Int!
96
- backReferenceCount: Int!
97
- matchedTerms: [String!]!
98
- reasons: [String!]!
99
- requiresForce: Boolean!
100
- forceReasons: [String!]!
101
- }
102
-
103
- type NoteCleanupPreview {
104
- id: ID!
105
- title: String!
106
- updatedAt: String!
107
- pinned: Boolean!
108
- tagNames: [String!]!
109
- reminderCount: Int!
110
- backReferences: [NoteCleanupBackReference!]!
111
- orphanedTagNames: [String!]!
112
- requiresForce: Boolean!
113
- forceReasons: [String!]!
114
- }
115
-
116
- type NoteSnapshotMeta {
117
- entrypoint: String
118
- label: String
119
- }
120
-
121
- type NoteSnapshot {
122
- id: ID!
123
- title: String!
124
- createdAt: String!
125
- meta: NoteSnapshotMeta!
126
- }
127
-
128
- type DeletedNote {
129
- id: ID!
130
- title: String!
131
- createdAt: String!
132
- updatedAt: String!
133
- deletedAt: String!
134
- pinned: Boolean!
135
- order: Int!
136
- layout: NoteLayout!
137
- tagNames: [String!]!
138
- }
139
-
140
- type DeletedNotes {
141
- totalCount: Int!
142
- notes: [DeletedNote!]!
143
- }
144
- `;
145
- const noteQuery = gql`
146
- type GraphNode {
147
- id: ID!
148
- title: String!
149
- connections: Int!
150
- }
151
-
152
- type GraphLink {
153
- source: ID!
154
- target: ID!
155
- }
156
-
157
- type NoteGraph {
158
- nodes: [GraphNode!]!
159
- links: [GraphLink!]!
160
- }
161
-
162
- type Query {
163
- allNotes(searchFilter: SearchFilterInput, pagination: PaginationInput): Notes!
164
- tagNotes(searchFilter: SearchFilterInput, pagination: PaginationInput): Notes!
165
- notesByTagNames(tagNames: [String!]!, mode: TagMatchMode!, pagination: PaginationInput): Notes!
166
- notesInDateRange(dateRange: DateRangeInput): [Note!]!
167
- pinnedNotes: [Note!]!
168
- imageNotes(src: String!): [Note!]!
169
- backReferences(id: ID!): [Note]!
170
- note(id: ID!): Note!
171
- noteCleanupCandidates(query: String, pagination: PaginationInput): [NoteCleanupCandidate!]!
172
- noteCleanupPreview(id: ID!): NoteCleanupPreview
173
- noteSnapshots(id: ID!, limit: Int): [NoteSnapshot!]!
174
- trashedNotes(pagination: PaginationInput): DeletedNotes!
175
- noteGraph: NoteGraph!
176
- }
177
- `;
178
- const noteMutation = gql`
179
- type Mutation {
180
- createNote(note: NoteInput!): Note!
181
- updateNote(id: ID!, note: NoteInput!, editSessionId: String): Note!
182
- deleteNote(id: ID!): Boolean!
183
- restoreNoteSnapshot(id: ID!): Note!
184
- restoreTrashedNote(id: ID!): Note!
185
- pinNote(id: ID!, pinned: Boolean!): Note!
186
- reorderNotes(notes: [NoteOrderInput!]!): [Note!]!
187
- }
188
- `;
189
- const noteTypeDefs = `
190
- ${noteType}
191
- ${noteQuery}
192
- ${noteMutation}
193
- `;
194
- const extractBlocksByType = (type, dataArray) => {
195
- let result = [];
196
- for (const data of dataArray) {
197
- if (data.type === type) {
198
- result.push(data);
199
- }
200
- if (data.children && data.children.length > 0) {
201
- result = result.concat(extractBlocksByType(type, data.children));
202
- }
203
- if (data.content && data.content.length > 0) {
204
- for (const contentItem of data.content) {
205
- if (contentItem.type === type) {
206
- result.push(contentItem);
207
- }
208
- }
209
- }
210
- }
211
- return result;
212
- };
213
- const noteResolvers = {
214
- Query: {
215
- allNotes: async (_, {
216
- searchFilter,
217
- pagination
218
- }) => {
219
- const queryItems = searchFilter.query.split(" ");
220
- const included = queryItems.filter((item) => !item.startsWith("-")).map((word) => `%${word}%`);
221
- const excluded = queryItems.filter((item) => item.startsWith("-")).map((item) => item.slice(1)).map((word) => `%${word}%`);
222
- const where = {
223
- AND: [
224
- ...included.map((keyword) => ({
225
- OR: [
226
- { title: { contains: keyword } },
227
- { content: { contains: keyword } }
228
- ]
229
- })),
230
- ...excluded.map((keyword) => ({
231
- NOT: {
232
- OR: [
233
- { title: { contains: keyword } },
234
- { content: { contains: keyword } }
235
- ]
236
- }
237
- }))
238
- ]
239
- };
240
- const sortBy = searchFilter.sortBy || "updatedAt";
241
- const sortOrder = searchFilter.sortOrder || "desc";
242
- const pinnedFirst = searchFilter.pinnedFirst || false;
243
- const orderBy = [];
244
- if (pinnedFirst) {
245
- orderBy.push({ pinned: "desc" });
246
- }
247
- if (sortBy === "createdAt") {
248
- orderBy.push({ createdAt: sortOrder });
249
- } else {
250
- orderBy.push({ updatedAt: sortOrder });
251
- }
252
- const $notes = models.note.findMany({
253
- orderBy,
254
- where,
255
- take: Number(pagination.limit),
256
- skip: Number(pagination.offset)
257
- });
258
- return {
259
- totalCount: models.note.count({ where }),
260
- notes: $notes
261
- };
262
- },
263
- notesInDateRange: async (_, { dateRange }) => {
264
- const where = {
265
- OR: [
266
- {
267
- updatedAt: {
268
- gte: new Date(dateRange.start),
269
- lte: new Date(dateRange.end)
270
- }
271
- },
272
- {
273
- createdAt: {
274
- gte: new Date(dateRange.start),
275
- lte: new Date(dateRange.end)
276
- }
277
- }
278
- ]
279
- };
280
- const $notes = await models.note.findMany({
281
- orderBy: { createdAt: "asc" },
282
- where
283
- });
284
- return $notes;
285
- },
286
- tagNotes: async (_, {
287
- searchFilter,
288
- pagination
289
- }) => {
290
- const where = { tags: { some: { id: Number(searchFilter.query) } } };
291
- const $notes = models.note.findMany({
292
- orderBy: { updatedAt: "desc" },
293
- where,
294
- take: Number(pagination.limit),
295
- skip: Number(pagination.offset)
296
- });
297
- return {
298
- totalCount: models.note.count({ where }),
299
- notes: $notes
300
- };
301
- },
302
- notesByTagNames: async (_, {
303
- tagNames,
304
- mode,
305
- pagination
306
- }) => {
307
- const normalizedTagNames = normalizeNoteTagNames(tagNames);
308
- if (normalizedTagNames.length === 0) {
309
- return {
310
- totalCount: 0,
311
- notes: []
312
- };
313
- }
314
- const where = buildNoteTagNamesWhere(normalizedTagNames, mode);
315
- const $notes = models.note.findMany({
316
- orderBy: { updatedAt: "desc" },
317
- where,
318
- take: Number(pagination.limit),
319
- skip: Number(pagination.offset)
320
- });
321
- return {
322
- totalCount: models.note.count({ where }),
323
- notes: $notes
324
- };
325
- },
326
- pinnedNotes: async () => models.note.findMany({
327
- orderBy: [
328
- { order: "asc" },
329
- { updatedAt: "desc" }
330
- ],
331
- where: { pinned: true }
332
- }),
333
- imageNotes: async (_, { src }) => models.note.findMany({
334
- orderBy: { updatedAt: "desc" },
335
- where: { content: { contains: src } }
336
- }),
337
- backReferences: async (_, { id }) => {
338
- return models.note.findMany({
339
- orderBy: [
340
- { pinned: "desc" },
341
- { updatedAt: "desc" }
342
- ],
343
- where: { content: { contains: `reference","props":{"id":"${id}"` } }
344
- });
345
- },
346
- note: async (_, { id }) => {
347
- const $note = await models.note.findUnique({ where: { id: Number(id) } });
348
- if (!$note) {
349
- throw "NOT FOUND";
350
- }
351
- if ($note.content) {
352
- const blocks = extractBlocksByType("reference", JSON.parse($note.content));
353
- if (blocks.length > 0) {
354
- const referenceIds = blocks.map((block) => Number(block.props.id));
355
- const $references = await models.note.findMany({ where: { id: { in: referenceIds } } });
356
- const newContent = $references.reduce((acc, $reference) => {
357
- const reference = blocks.find((block) => Number(block.props.id) === $reference.id);
358
- if (reference && reference.props.title !== $reference.title) {
359
- return acc.replace(
360
- `reference","props":{"id":"${reference.props.id}","title":"${reference.props.title}"`,
361
- `reference","props":{"id":"${$reference.id}","title":"${$reference.title}"`
362
- );
363
- }
364
- return acc;
365
- }, $note.content);
366
- if (newContent !== $note.content) {
367
- try {
368
- JSON.parse(newContent);
369
- return await models.note.update({
370
- where: { id: $note.id },
371
- data: { content: newContent }
372
- });
373
- } catch {
374
- }
375
- }
376
- }
377
- }
378
- return $note;
379
- },
380
- noteCleanupCandidates: async (_, {
381
- query,
382
- pagination = {
383
- limit: 20,
384
- offset: 0
385
- }
386
- }) => {
387
- const result = await listNoteCleanupCandidates({
388
- keywords: query ? query.split(/[,\s]+/).map((keyword) => keyword.trim()).filter(Boolean) : void 0,
389
- limit: Number(pagination.limit),
390
- offset: Number(pagination.offset)
391
- });
392
- return result.notes;
393
- },
394
- noteCleanupPreview: async (_, { id }) => {
395
- return getNoteCleanupPreview(Number(id));
396
- },
397
- noteSnapshots: async (_, {
398
- id,
399
- limit = 5
400
- }) => {
401
- return listNoteSnapshots(Number(id), Number(limit));
402
- },
403
- trashedNotes: async (_, {
404
- pagination = {
405
- limit: 25,
406
- offset: 0
407
- }
408
- }) => {
409
- return listTrashedNotes({
410
- limit: Number(pagination.limit),
411
- offset: Number(pagination.offset)
412
- });
413
- },
414
- noteGraph: async () => {
415
- const $notes = await models.note.findMany({
416
- select: {
417
- id: true,
418
- title: true,
419
- content: true
420
- }
421
- });
422
- const nodes = [];
423
- const links = [];
424
- const connectionCount = {};
425
- const linkSet = /* @__PURE__ */ new Set();
426
- for (const $note of $notes) {
427
- if ($note.content) {
428
- try {
429
- const blocks = extractBlocksByType("reference", JSON.parse($note.content));
430
- for (const block of blocks) {
431
- const targetId = block.props.id;
432
- if (targetId && String($note.id) !== targetId) {
433
- const linkKey = `${$note.id}-${targetId}`;
434
- const reverseLinkKey = `${targetId}-${$note.id}`;
435
- if (!linkSet.has(linkKey) && !linkSet.has(reverseLinkKey)) {
436
- linkSet.add(linkKey);
437
- links.push({
438
- source: String($note.id),
439
- target: targetId
440
- });
441
- connectionCount[String($note.id)] = (connectionCount[String($note.id)] || 0) + 1;
442
- connectionCount[targetId] = (connectionCount[targetId] || 0) + 1;
443
- }
444
- }
445
- }
446
- } catch {
447
- }
448
- }
449
- }
450
- for (const $note of $notes) {
451
- nodes.push({
452
- id: String($note.id),
453
- title: $note.title || "Untitled",
454
- connections: connectionCount[String($note.id)] || 0
455
- });
456
- }
457
- return {
458
- nodes,
459
- links
460
- };
461
- }
462
- },
463
- Mutation: {
464
- createNote: async (_, { note }) => {
465
- const PLACEHOLDER_PREFIX = "{%";
466
- const PLACEHOLDER_SUFFIX = "%}";
467
- const replacePlaceholder = async (content) => {
468
- const placeholders = content.matchAll(new RegExp(`${PLACEHOLDER_PREFIX}([^}]+)${PLACEHOLDER_SUFFIX}`, "g"));
469
- const $placeholders = await models.placeholder.findMany({
470
- select: {
471
- template: true,
472
- replacement: true
473
- },
474
- where: { template: { in: Array.from(new Set(Array.from(placeholders, (p) => p[1]))) } }
475
- });
476
- for (const $placeholder of $placeholders) {
477
- content = content.replace(new RegExp(`${PLACEHOLDER_PREFIX}${$placeholder.template}${PLACEHOLDER_SUFFIX}`, "g"), $placeholder.replacement);
478
- }
479
- return content;
480
- };
481
- const replacedTitle = await replacePlaceholder(note.title);
482
- const replacedContent = await replacePlaceholder(note.content);
483
- const $note = await models.note.create({
484
- data: {
485
- title: replacedTitle,
486
- content: replacedContent,
487
- ...note.layout && { layout: note.layout }
488
- }
489
- });
490
- if (note.content) {
491
- const blocks = extractBlocksByType(
492
- "tag",
493
- JSON.parse(note.content)
494
- );
495
- return await models.note.update({
496
- where: { id: $note.id },
497
- data: { tags: { set: blocks.map((block) => ({ id: Number(block.props.id) })) } }
498
- });
499
- }
500
- return $note;
501
- },
502
- updateNote: async (_, {
503
- id,
504
- note,
505
- editSessionId
506
- }, context) => {
507
- const userAgentHeader = context.req?.headers["user-agent"];
508
- const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;
509
- let blocks = [];
510
- if (note.content) {
511
- blocks = extractBlocksByType(
512
- "tag",
513
- JSON.parse(note.content)
514
- );
515
- }
516
- await captureNoteBaseline({
517
- noteId: Number(id),
518
- ...editSessionId ? { editSessionId } : {},
519
- meta: createSnapshotMetaFromUserAgent(userAgent)
520
- });
521
- const $note = await models.note.update({
522
- where: { id: Number(id) },
523
- data: {
524
- ...note,
525
- ...note.content ? { tags: { set: blocks.map((block) => ({ id: Number(block.props.id) })) } } : {}
526
- }
527
- });
528
- return $note;
529
- },
530
- deleteNote: async (_, { id }) => {
531
- const trashedNote = await trashNoteById(Number(id));
532
- if (!trashedNote) {
533
- throw "NOT FOUND";
534
- }
535
- return true;
536
- },
537
- restoreNoteSnapshot: async (_, { id }, context) => {
538
- const userAgentHeader = context.req?.headers["user-agent"];
539
- const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;
540
- const note = await restoreNoteSnapshot(Number(id), { meta: createSnapshotMetaFromUserAgent(userAgent) });
541
- if (!note) {
542
- throw "NOT FOUND";
543
- }
544
- return note;
545
- },
546
- restoreTrashedNote: async (_, { id }) => {
547
- const note = await restoreTrashedNoteById(Number(id));
548
- if (!note) {
549
- throw "NOT FOUND";
550
- }
551
- return note;
552
- },
553
- pinNote: (_, { id, pinned }) => models.note.update({
554
- where: { id: Number(id) },
555
- data: { pinned: Boolean(pinned) }
556
- }),
557
- reorderNotes: async (_, { notes }) => {
558
- const updatePromises = notes.map(
559
- ({ id, order }) => models.note.update({
560
- where: { id: Number(id) },
561
- data: { order }
562
- })
563
- );
564
- return await Promise.all(updatePromises);
565
- }
566
- },
567
- Note: {
568
- tags: async (note) => await models.tag.findMany({ where: { notes: { some: { id: note.id } } } }),
569
- contentAsMarkdown: async (note) => {
570
- const { blocksToMarkdown } = await import("../../modules/blocknote.js");
571
- return blocksToMarkdown(note.content);
572
- }
573
- }
574
- };
575
- export {
576
- noteMutation,
577
- noteQuery,
578
- noteResolvers,
579
- noteType,
580
- noteTypeDefs
581
- };
582
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/schema/note/index.ts"],"sourcesContent":["import type { IResolvers } from '@graphql-tools/utils';\nimport type { Request } from 'express';\n\nimport models from '~/models.js';\nimport { gql } from '~/modules/graphql.js';\nimport {\n getNoteCleanupPreview,\n listNoteCleanupCandidates\n} from '~/modules/note-cleanup.js';\nimport {\n captureNoteBaseline,\n createSnapshotMetaFromUserAgent,\n listNoteSnapshots,\n restoreNoteSnapshot\n} from '~/modules/note-snapshot.js';\nimport {\n listTrashedNotes,\n restoreTrashedNoteById,\n trashNoteById\n} from '~/modules/note-trash.js';\nimport { buildNoteTagNamesWhere, normalizeNoteTagNames, type NoteTagMatchMode } from '~/modules/note-tag-filter.js';\n\nimport type { Note, Prisma } from '~/models.js';\nimport type { Pagination, SearchFilter, NoteInput } from '~/types/index.js';\n\nexport const noteType = gql`\n input PaginationInput {\n limit: Int!\n offset: Int!\n }\n\n input SearchFilterInput {\n query: String!\n sortBy: String\n sortOrder: String\n pinnedFirst: Boolean\n }\n\n input DateRangeInput {\n start: String!\n end: String!\n }\n\n enum NoteLayout {\n narrow\n wide\n full\n }\n\n enum TagMatchMode {\n and\n or\n }\n\n input NoteInput {\n title: String\n content: String\n layout: NoteLayout\n }\n\n input NoteOrderInput {\n id: ID!\n order: Int!\n }\n\n type Tag {\n id: ID!\n name: String!\n createdAt: String!\n updatedAt: String!\n }\n\n type Note {\n id: ID!\n title: String!\n content: String!\n contentAsMarkdown: String!\n createdAt: String!\n updatedAt: String!\n pinned: Boolean!\n order: Int!\n layout: NoteLayout!\n tags: [Tag!]!\n }\n\n type Notes {\n totalCount: Int!\n notes: [Note!]!\n }\n\n type NoteCleanupBackReference {\n id: ID!\n title: String!\n }\n\n type NoteCleanupCandidate {\n id: ID!\n title: String!\n updatedAt: String!\n pinned: Boolean!\n tagNames: [String!]!\n reminderCount: Int!\n backReferenceCount: Int!\n matchedTerms: [String!]!\n reasons: [String!]!\n requiresForce: Boolean!\n forceReasons: [String!]!\n }\n\n type NoteCleanupPreview {\n id: ID!\n title: String!\n updatedAt: String!\n pinned: Boolean!\n tagNames: [String!]!\n reminderCount: Int!\n backReferences: [NoteCleanupBackReference!]!\n orphanedTagNames: [String!]!\n requiresForce: Boolean!\n forceReasons: [String!]!\n }\n\n type NoteSnapshotMeta {\n entrypoint: String\n label: String\n }\n\n type NoteSnapshot {\n id: ID!\n title: String!\n createdAt: String!\n meta: NoteSnapshotMeta!\n }\n\n type DeletedNote {\n id: ID!\n title: String!\n createdAt: String!\n updatedAt: String!\n deletedAt: String!\n pinned: Boolean!\n order: Int!\n layout: NoteLayout!\n tagNames: [String!]!\n }\n\n type DeletedNotes {\n totalCount: Int!\n notes: [DeletedNote!]!\n }\n`;\n\nexport const noteQuery = gql`\n type GraphNode {\n id: ID!\n title: String!\n connections: Int!\n }\n\n type GraphLink {\n source: ID!\n target: ID!\n }\n\n type NoteGraph {\n nodes: [GraphNode!]!\n links: [GraphLink!]!\n }\n\n type Query {\n allNotes(searchFilter: SearchFilterInput, pagination: PaginationInput): Notes!\n tagNotes(searchFilter: SearchFilterInput, pagination: PaginationInput): Notes!\n notesByTagNames(tagNames: [String!]!, mode: TagMatchMode!, pagination: PaginationInput): Notes!\n notesInDateRange(dateRange: DateRangeInput): [Note!]!\n pinnedNotes: [Note!]!\n imageNotes(src: String!): [Note!]!\n backReferences(id: ID!): [Note]!\n note(id: ID!): Note!\n noteCleanupCandidates(query: String, pagination: PaginationInput): [NoteCleanupCandidate!]!\n noteCleanupPreview(id: ID!): NoteCleanupPreview\n noteSnapshots(id: ID!, limit: Int): [NoteSnapshot!]!\n trashedNotes(pagination: PaginationInput): DeletedNotes!\n noteGraph: NoteGraph!\n }\n`;\n\nexport const noteMutation = gql`\n type Mutation {\n createNote(note: NoteInput!): Note!\n updateNote(id: ID!, note: NoteInput!, editSessionId: String): Note!\n deleteNote(id: ID!): Boolean!\n restoreNoteSnapshot(id: ID!): Note!\n restoreTrashedNote(id: ID!): Note!\n pinNote(id: ID!, pinned: Boolean!): Note!\n reorderNotes(notes: [NoteOrderInput!]!): [Note!]!\n }\n`;\n\nexport const noteTypeDefs = `\n ${noteType}\n ${noteQuery}\n ${noteMutation}\n`;\n\ninterface BlockNote<T = unknown> {\n id: string;\n type: string;\n props: T;\n content?: BlockNote<T>[];\n children?: BlockNote<T>[];\n}\n\nconst extractBlocksByType = <T>(type: string, dataArray: BlockNote[]): BlockNote<T>[] => {\n let result: BlockNote[] = [];\n\n for (const data of dataArray) {\n if (data.type === type) {\n result.push(data);\n }\n\n if (data.children && data.children.length > 0) {\n result = result.concat(extractBlocksByType(type, data.children));\n }\n\n if (data.content && data.content.length > 0) {\n for (const contentItem of data.content) {\n if (contentItem.type === type) {\n result.push(contentItem);\n }\n }\n }\n }\n\n return result as unknown as BlockNote<T>[];\n};\n\nexport const noteResolvers: IResolvers = {\n Query: {\n allNotes: async (_, {\n searchFilter,\n pagination\n }: {\n searchFilter: SearchFilter;\n pagination: Pagination;\n }) => {\n const queryItems = searchFilter.query.split(' ');\n const included = queryItems\n .filter((item: string) => !item.startsWith('-'))\n .map((word: string) => `%${word}%`);\n const excluded = queryItems\n .filter((item: string) => item.startsWith('-'))\n .map((item: string) => item.slice(1))\n .map((word: string) => `%${word}%`);\n\n const where: Prisma.NoteWhereInput = {\n AND: [\n ...included.map((keyword: string) => ({\n OR: [\n { title: { contains: keyword } },\n { content: { contains: keyword } }\n ]\n })),\n ...excluded.map((keyword: string) => ({\n NOT: {\n OR: [\n { title: { contains: keyword } },\n { content: { contains: keyword } }\n ]\n }\n }))\n ]\n };\n\n const sortBy = searchFilter.sortBy || 'updatedAt';\n const sortOrder = searchFilter.sortOrder || 'desc';\n const pinnedFirst = searchFilter.pinnedFirst || false;\n\n const orderBy: Prisma.NoteOrderByWithRelationInput[] = [];\n\n if (pinnedFirst) {\n orderBy.push({ pinned: 'desc' });\n }\n\n if (sortBy === 'createdAt') {\n orderBy.push({ createdAt: sortOrder as 'asc' | 'desc' });\n } else {\n orderBy.push({ updatedAt: sortOrder as 'asc' | 'desc' });\n }\n\n const $notes = models.note.findMany({\n orderBy,\n where,\n take: Number(pagination.limit),\n skip: Number(pagination.offset)\n });\n return {\n totalCount: models.note.count({ where }),\n notes: $notes\n };\n },\n notesInDateRange: async (_, { dateRange }: {\n dateRange: {\n start: string;\n end: string;\n };\n }) => {\n const where: Prisma.NoteWhereInput = {\n OR: [\n {\n updatedAt: {\n gte: new Date(dateRange.start),\n lte: new Date(dateRange.end)\n }\n },\n {\n createdAt: {\n gte: new Date(dateRange.start),\n lte: new Date(dateRange.end)\n }\n }\n ]\n };\n\n const $notes = await models.note.findMany({\n orderBy: { createdAt: 'asc' },\n where\n });\n\n return $notes;\n },\n tagNotes: async (_, {\n searchFilter,\n pagination\n }: {\n searchFilter: SearchFilter;\n pagination: Pagination;\n }) => {\n const where: Prisma.NoteWhereInput = { tags: { some: { id: Number(searchFilter.query) } } };\n\n const $notes = models.note.findMany({\n orderBy: { updatedAt: 'desc' },\n where,\n take: Number(pagination.limit),\n skip: Number(pagination.offset)\n });\n return {\n totalCount: models.note.count({ where }),\n notes: $notes\n };\n },\n notesByTagNames: async (_, {\n tagNames,\n mode,\n pagination\n }: {\n tagNames: string[];\n mode: NoteTagMatchMode;\n pagination: Pagination;\n }) => {\n const normalizedTagNames = normalizeNoteTagNames(tagNames);\n\n if (normalizedTagNames.length === 0) {\n return {\n totalCount: 0,\n notes: []\n };\n }\n\n const where = buildNoteTagNamesWhere(normalizedTagNames, mode);\n\n const $notes = models.note.findMany({\n orderBy: { updatedAt: 'desc' },\n where,\n take: Number(pagination.limit),\n skip: Number(pagination.offset)\n });\n\n return {\n totalCount: models.note.count({ where }),\n notes: $notes\n };\n },\n pinnedNotes: async () => models.note.findMany({\n orderBy: [\n { order: 'asc' },\n { updatedAt: 'desc' }\n ],\n where: { pinned: true }\n }),\n imageNotes: async (_, { src }) => models.note.findMany({\n orderBy: { updatedAt: 'desc' },\n where: { content: { contains: src } }\n }),\n backReferences: async (_, { id }: Note) => {\n return models.note.findMany({\n orderBy: [\n { pinned: 'desc' },\n { updatedAt: 'desc' }\n ],\n where: { content: { contains: `reference\",\"props\":{\"id\":\"${id}\"` } }\n });\n },\n note: async (_, { id }: Note) => {\n const $note = await models.note.findUnique({ where: { id: Number(id) } });\n if (!$note) {\n throw 'NOT FOUND';\n }\n if ($note.content) {\n const blocks = extractBlocksByType<{\n id: string;\n title: string;\n }>('reference', JSON.parse($note.content));\n if (blocks.length > 0) {\n const referenceIds = blocks.map(block => Number(block.props.id));\n const $references = await models.note.findMany({ where: { id: { in: referenceIds } } });\n const newContent = $references.reduce<string>((acc: string, $reference: Note) => {\n const reference = blocks.find(block => Number(block.props.id) === $reference.id);\n if (reference && reference.props.title !== $reference.title) {\n return acc.replace(\n `reference\",\"props\":{\"id\":\"${reference.props.id}\",\"title\":\"${reference.props.title}\"`,\n `reference\",\"props\":{\"id\":\"${$reference.id}\",\"title\":\"${$reference.title}\"`\n );\n }\n return acc;\n }, $note.content);\n if (newContent !== $note.content) {\n try {\n JSON.parse(newContent);\n return await models.note.update({\n where: { id: $note.id },\n data: { content: newContent }\n });\n } catch {\n // Keep the stored content unchanged if the synchronized payload becomes invalid.\n }\n }\n }\n }\n return $note;\n },\n noteCleanupCandidates: async (_, {\n query,\n pagination = {\n limit: 20,\n offset: 0\n }\n }: {\n query?: string;\n pagination: Pagination;\n }) => {\n const result = await listNoteCleanupCandidates({\n keywords: query\n ? query.split(/[,\\s]+/).map((keyword) => keyword.trim()).filter(Boolean)\n : undefined,\n limit: Number(pagination.limit),\n offset: Number(pagination.offset)\n });\n\n return result.notes;\n },\n noteCleanupPreview: async (_, { id }: { id: string }) => {\n return getNoteCleanupPreview(Number(id));\n },\n noteSnapshots: async (_, {\n id,\n limit = 5\n }: {\n id: string;\n limit?: number;\n }) => {\n return listNoteSnapshots(Number(id), Number(limit));\n },\n trashedNotes: async (_, {\n pagination = {\n limit: 25,\n offset: 0\n }\n }: {\n pagination: Pagination;\n }) => {\n return listTrashedNotes({\n limit: Number(pagination.limit),\n offset: Number(pagination.offset)\n });\n },\n noteGraph: async () => {\n const $notes = await models.note.findMany({\n select: {\n id: true,\n title: true,\n content: true\n }\n });\n\n const nodes: Array<{ id: string; title: string; connections: number }> = [];\n const links: Array<{ source: string; target: string }> = [];\n const connectionCount: Record<string, number> = {};\n const linkSet = new Set<string>();\n\n // Extract all references from each note\n for (const $note of $notes) {\n if ($note.content) {\n try {\n const blocks = extractBlocksByType<{ id: string }>('reference', JSON.parse($note.content));\n for (const block of blocks) {\n const targetId = block.props.id;\n // Avoid self-references and duplicate links\n if (targetId && String($note.id) !== targetId) {\n const linkKey = `${$note.id}-${targetId}`;\n const reverseLinkKey = `${targetId}-${$note.id}`;\n if (!linkSet.has(linkKey) && !linkSet.has(reverseLinkKey)) {\n linkSet.add(linkKey);\n links.push({\n source: String($note.id),\n target: targetId\n });\n // Count connections for both nodes\n connectionCount[String($note.id)] = (connectionCount[String($note.id)] || 0) + 1;\n connectionCount[targetId] = (connectionCount[targetId] || 0) + 1;\n }\n }\n }\n } catch {\n // Skip notes with invalid JSON content\n }\n }\n }\n\n // Build nodes array with connection counts\n for (const $note of $notes) {\n nodes.push({\n id: String($note.id),\n title: $note.title || 'Untitled',\n connections: connectionCount[String($note.id)] || 0\n });\n }\n\n return {\n nodes,\n links\n };\n }\n },\n Mutation: {\n createNote: async (_, { note }: { note: NoteInput }) => {\n const PLACEHOLDER_PREFIX = '{%';\n const PLACEHOLDER_SUFFIX = '%}';\n\n const replacePlaceholder = async (content: string) => {\n const placeholders = content.matchAll(new RegExp(`${PLACEHOLDER_PREFIX}([^}]+)${PLACEHOLDER_SUFFIX}`, 'g'));\n const $placeholders = await models.placeholder.findMany({\n select: {\n template: true,\n replacement: true\n },\n where: { template: { in: Array.from(new Set(Array.from(placeholders, p => p[1]))) } }\n });\n\n for (const $placeholder of $placeholders) {\n content = content.replace(new RegExp(`${PLACEHOLDER_PREFIX}${$placeholder.template}${PLACEHOLDER_SUFFIX}`, 'g'), $placeholder.replacement);\n }\n return content;\n };\n\n const replacedTitle = await replacePlaceholder(note.title);\n const replacedContent = await replacePlaceholder(note.content);\n\n const $note = await models.note.create({\n data: {\n title: replacedTitle,\n content: replacedContent,\n ...(note.layout && { layout: note.layout })\n }\n });\n if (note.content) {\n const blocks = extractBlocksByType<{ id: string }>(\n 'tag',\n JSON.parse(note.content)\n );\n\n return await models.note.update({\n where: { id: $note.id },\n data: { tags: { set: blocks.map(block => ({ id: Number(block.props.id) })) } }\n });\n }\n\n return $note;\n },\n updateNote: async (_, {\n id,\n note,\n editSessionId\n }: {\n id: number;\n note: NoteInput;\n editSessionId?: string;\n }, context: {\n req?: Request;\n }) => {\n const userAgentHeader = context.req?.headers['user-agent'];\n const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;\n let blocks: BlockNote<{ id: string }>[] = [];\n\n if (note.content) {\n blocks = extractBlocksByType<{ id: string }>(\n 'tag',\n JSON.parse(note.content)\n );\n }\n\n await captureNoteBaseline({\n noteId: Number(id),\n ...(editSessionId ? { editSessionId } : {}),\n meta: createSnapshotMetaFromUserAgent(userAgent)\n });\n\n const $note = await models.note.update({\n where: { id: Number(id) },\n data: {\n ...note,\n ...(note.content ? { tags: { set: blocks.map(block => ({ id: Number(block.props.id) })) } } : {})\n }\n });\n return $note;\n },\n deleteNote: async (_, { id }: Note) => {\n const trashedNote = await trashNoteById(Number(id));\n\n if (!trashedNote) {\n throw 'NOT FOUND';\n }\n\n return true;\n },\n restoreNoteSnapshot: async (_, { id }: { id: string }, context: {\n req?: Request;\n }) => {\n const userAgentHeader = context.req?.headers['user-agent'];\n const userAgent = Array.isArray(userAgentHeader) ? userAgentHeader[0] : userAgentHeader;\n const note = await restoreNoteSnapshot(Number(id), { meta: createSnapshotMetaFromUserAgent(userAgent) });\n\n if (!note) {\n throw 'NOT FOUND';\n }\n\n return note;\n },\n restoreTrashedNote: async (_, { id }: { id: string }) => {\n const note = await restoreTrashedNoteById(Number(id));\n\n if (!note) {\n throw 'NOT FOUND';\n }\n\n return note;\n },\n pinNote: (_, { id, pinned }: Note) => models.note.update({\n where: { id: Number(id) },\n data: { pinned: Boolean(pinned) }\n }),\n reorderNotes: async (_, { notes }: { notes: Array<{ id: string; order: number }> }) => {\n const updatePromises = notes.map(({ id, order }) =>\n models.note.update({\n where: { id: Number(id) },\n data: { order }\n })\n );\n return await Promise.all(updatePromises);\n }\n },\n Note: {\n tags: async (note: Note) => await models.tag.findMany({ where: { notes: { some: { id: note.id } } } }),\n contentAsMarkdown: async (note: Note) => {\n const { blocksToMarkdown } = await import('~/modules/blocknote.js');\n return blocksToMarkdown(note.content);\n }\n }\n};\n"],"mappings":"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","names":[]}