ocean-brain 0.4.2 → 0.6.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 (102) hide show
  1. package/dist/mcp.js +660 -31
  2. package/package.json +2 -1
  3. package/server/client/dist/assets/{Calendar-DI0PhQTq.js → Calendar-BytW4PeT.js} +1 -1
  4. package/server/client/dist/assets/Callout-9sJgGNRb.js +1 -0
  5. package/server/client/dist/assets/Graph-o5u-NzrA.js +1 -0
  6. package/server/client/dist/assets/{Image-DlJ4MDo3.js → Image-DxWhlIDG.js} +1 -1
  7. package/server/client/dist/assets/{Image.es-COwqkQuh.js → Image.es-B0LL3pb7.js} +1 -1
  8. package/server/client/dist/assets/Note-CYoYzZNu.js +21 -0
  9. package/server/client/dist/assets/{Plus.es-KeV96R_e.js → Plus.es-DpxzgRtY.js} +1 -1
  10. package/server/client/dist/assets/Reminders-DAepTZg1.js +1 -0
  11. package/server/client/dist/assets/Search-6KH7An44.js +1 -0
  12. package/server/client/dist/assets/{SurfaceCard-CHjcCuqZ.js → SurfaceCard-EMs50xSF.js} +1 -1
  13. package/server/client/dist/assets/Tag-C89j8x56.js +1 -0
  14. package/server/client/dist/assets/TagNotes-BTbu-f6v.js +1 -0
  15. package/server/client/dist/assets/{Trash.es-BqRTZPrI.js → Trash.es-C5x35NKF.js} +1 -1
  16. package/server/client/dist/assets/ViewNotes-DPEuki3y.js +1 -0
  17. package/server/client/dist/assets/Views-BGkuNhVd.js +1 -0
  18. package/server/client/dist/assets/{image.api-CMdQbCyN.js → image.api-DRhRQ0Gf.js} +1 -1
  19. package/server/client/dist/assets/{index-D2gRB1ig.css → index-Cd81UxEh.css} +1 -1
  20. package/server/client/dist/assets/index-DYlYUrjH.js +327 -0
  21. package/server/client/dist/assets/index-DswSFFMb.js +1 -0
  22. package/server/client/dist/assets/manage-image-C6sHhWnI.js +1 -0
  23. package/server/client/dist/assets/manage-image-detail-CJkfybR9.js +1 -0
  24. package/server/client/dist/assets/{mcp-DqGLZv90.js → mcp-piouFDNm.js} +1 -1
  25. package/server/client/dist/assets/note-core-Z6kqulGB.js +180 -0
  26. package/server/client/dist/assets/note-vendor-i1M2FSI2.js +54 -0
  27. package/server/client/dist/assets/{placeholder-BXLtvdtN.js → placeholder-DGz3CHej.js} +4 -4
  28. package/server/client/dist/assets/properties-CM4khczg.js +1 -0
  29. package/server/client/dist/assets/trash-C2lItz-b.js +1 -0
  30. package/server/client/dist/assets/{useReminderMutate-v1EXqM90.js → useReminderMutate-DHjDDHKg.js} +1 -1
  31. package/server/client/dist/assets/view-dashboard-C17WsdL7.js +99 -0
  32. package/server/client/dist/index.html +4 -4
  33. package/server/dist/features/note/graphql/note.field.resolver.js +16 -1
  34. package/server/dist/features/note/graphql/note.field.resolver.js.map +1 -1
  35. package/server/dist/features/note/graphql/note.mutation.resolver.js +192 -36
  36. package/server/dist/features/note/graphql/note.mutation.resolver.js.map +1 -1
  37. package/server/dist/features/note/graphql/note.query.resolver.js +88 -76
  38. package/server/dist/features/note/graphql/note.query.resolver.js.map +1 -1
  39. package/server/dist/features/note/graphql/note.resolver.js +3 -2
  40. package/server/dist/features/note/graphql/note.resolver.js.map +1 -1
  41. package/server/dist/features/note/graphql/note.type-defs.js +104 -1
  42. package/server/dist/features/note/graphql/note.type-defs.js.map +1 -1
  43. package/server/dist/features/note/http/mcp.js +394 -1
  44. package/server/dist/features/note/http/mcp.js.map +1 -1
  45. package/server/dist/features/note/services/cleanup.js +4 -3
  46. package/server/dist/features/note/services/cleanup.js.map +1 -1
  47. package/server/dist/features/note/services/content-blocks.js +113 -0
  48. package/server/dist/features/note/services/content-blocks.js.map +1 -0
  49. package/server/dist/features/note/services/markdown-intent-write.js +478 -0
  50. package/server/dist/features/note/services/markdown-intent-write.js.map +1 -0
  51. package/server/dist/features/note/services/markdown-patch.js +601 -0
  52. package/server/dist/features/note/services/markdown-patch.js.map +1 -0
  53. package/server/dist/features/note/services/properties.js +874 -0
  54. package/server/dist/features/note/services/properties.js.map +1 -0
  55. package/server/dist/features/note/services/search.js +10 -29
  56. package/server/dist/features/note/services/search.js.map +1 -1
  57. package/server/dist/features/note/services/snapshot.js +260 -18
  58. package/server/dist/features/note/services/snapshot.js.map +1 -1
  59. package/server/dist/features/note/services/trash.js +70 -2
  60. package/server/dist/features/note/services/trash.js.map +1 -1
  61. package/server/dist/features/note/services/write-conflict.js +87 -0
  62. package/server/dist/features/note/services/write-conflict.js.map +1 -0
  63. package/server/dist/features/note/services/write.js +121 -0
  64. package/server/dist/features/note/services/write.js.map +1 -0
  65. package/server/dist/features/view/graphql/view.query.resolver.js +31 -1
  66. package/server/dist/features/view/graphql/view.query.resolver.js.map +1 -1
  67. package/server/dist/features/view/graphql/view.type-defs.js +57 -1
  68. package/server/dist/features/view/graphql/view.type-defs.js.map +1 -1
  69. package/server/dist/features/view/services/workspace.js +367 -43
  70. package/server/dist/features/view/services/workspace.js.map +1 -1
  71. package/server/dist/modules/blocknote-tree.js +41 -0
  72. package/server/dist/modules/blocknote-tree.js.map +1 -0
  73. package/server/dist/modules/blocknote.js +47 -2
  74. package/server/dist/modules/blocknote.js.map +1 -1
  75. package/server/dist/modules/error-handler.js +7 -4
  76. package/server/dist/modules/error-handler.js.map +1 -1
  77. package/server/dist/modules/recovery-retention.js +2 -2
  78. package/server/dist/modules/recovery-retention.js.map +1 -1
  79. package/server/dist/routes/mcp.js +21 -1
  80. package/server/dist/routes/mcp.js.map +1 -1
  81. package/server/prisma/migrations/20260527073000_0017_note_properties/migration.sql +105 -0
  82. package/server/prisma/migrations/20260531073000_0018_view_query/migration.sql +3 -0
  83. package/server/prisma/schema.prisma +226 -130
  84. package/server/client/dist/assets/Callout-BAqbXI0L.js +0 -1
  85. package/server/client/dist/assets/Graph-Dhuog4tc.js +0 -1
  86. package/server/client/dist/assets/Note-ChUWU3Su.js +0 -21
  87. package/server/client/dist/assets/Reminders-D7MCTNxb.js +0 -1
  88. package/server/client/dist/assets/Search-B-fwTr5y.js +0 -1
  89. package/server/client/dist/assets/Tag-BbV2z-Db.js +0 -1
  90. package/server/client/dist/assets/TagNotes-2HKF09Jm.js +0 -1
  91. package/server/client/dist/assets/ViewNotes-TfM3Uzbp.js +0 -1
  92. package/server/client/dist/assets/Views-CUwtnfa8.js +0 -1
  93. package/server/client/dist/assets/index-B4l2UvuC.js +0 -232
  94. package/server/client/dist/assets/index-zhxZjg7V.js +0 -1
  95. package/server/client/dist/assets/manage-image-DdXb5Bkj.js +0 -1
  96. package/server/client/dist/assets/manage-image-detail-CrrXCQIX.js +0 -1
  97. package/server/client/dist/assets/note-core-GgFcksAF.js +0 -178
  98. package/server/client/dist/assets/note-vendor-B0t5F04o.js +0 -54
  99. package/server/client/dist/assets/trash-3eUAjFRh.js +0 -1
  100. package/server/client/dist/assets/view-dashboard-T6gmohr-.js +0 -90
  101. package/server/dist/features/note/graphql/note.graphql.shared.js +0 -23
  102. package/server/dist/features/note/graphql/note.graphql.shared.js.map +0 -1
@@ -0,0 +1,105 @@
1
+ -- CreateTable
2
+ CREATE TABLE "PropertyDefinition" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "key" TEXT NOT NULL,
5
+ "name" TEXT NOT NULL,
6
+ "valueType" TEXT NOT NULL,
7
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
8
+ "updatedAt" DATETIME NOT NULL
9
+ );
10
+
11
+ -- CreateTable
12
+ CREATE TABLE "PropertyOption" (
13
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
14
+ "propertyDefinitionId" INTEGER NOT NULL,
15
+ "label" TEXT NOT NULL,
16
+ "value" TEXT NOT NULL,
17
+ "color" TEXT,
18
+ "order" INTEGER NOT NULL DEFAULT 0,
19
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
20
+ "updatedAt" DATETIME NOT NULL,
21
+ CONSTRAINT "PropertyOption_propertyDefinitionId_fkey" FOREIGN KEY ("propertyDefinitionId") REFERENCES "PropertyDefinition" ("id") ON DELETE CASCADE ON UPDATE CASCADE
22
+ );
23
+
24
+ -- CreateTable
25
+ CREATE TABLE "NoteProperty" (
26
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
27
+ "noteId" INTEGER NOT NULL,
28
+ "propertyDefinitionId" INTEGER NOT NULL,
29
+ "optionId" INTEGER,
30
+ "textValue" TEXT,
31
+ "textValueNormalized" TEXT,
32
+ "numberValue" REAL,
33
+ "dateValue" DATETIME,
34
+ "boolValue" BOOLEAN,
35
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
36
+ "updatedAt" DATETIME NOT NULL,
37
+ CONSTRAINT "NoteProperty_noteId_fkey" FOREIGN KEY ("noteId") REFERENCES "Note" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
38
+ CONSTRAINT "NoteProperty_propertyDefinitionId_fkey" FOREIGN KEY ("propertyDefinitionId") REFERENCES "PropertyDefinition" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
39
+ CONSTRAINT "NoteProperty_optionId_fkey" FOREIGN KEY ("optionId") REFERENCES "PropertyOption" ("id") ON DELETE SET NULL ON UPDATE CASCADE
40
+ );
41
+
42
+ -- CreateTable
43
+ CREATE TABLE "DeletedNoteProperty" (
44
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
45
+ "deletedNoteId" INTEGER NOT NULL,
46
+ "key" TEXT NOT NULL,
47
+ "name" TEXT NOT NULL,
48
+ "valueType" TEXT NOT NULL,
49
+ "textValue" TEXT,
50
+ "textValueNormalized" TEXT,
51
+ "numberValue" REAL,
52
+ "dateValue" DATETIME,
53
+ "boolValue" BOOLEAN,
54
+ "optionValue" TEXT,
55
+ "optionLabel" TEXT,
56
+ "optionColor" TEXT,
57
+ "createdAt" DATETIME NOT NULL,
58
+ "updatedAt" DATETIME NOT NULL,
59
+ CONSTRAINT "DeletedNoteProperty_deletedNoteId_fkey" FOREIGN KEY ("deletedNoteId") REFERENCES "DeletedNote" ("id") ON DELETE CASCADE ON UPDATE CASCADE
60
+ );
61
+
62
+ -- CreateIndex
63
+ CREATE UNIQUE INDEX "PropertyDefinition_key_key" ON "PropertyDefinition"("key");
64
+
65
+ -- CreateIndex
66
+ CREATE UNIQUE INDEX "PropertyOption_propertyDefinitionId_value_key" ON "PropertyOption"("propertyDefinitionId", "value");
67
+
68
+ -- CreateIndex
69
+ CREATE INDEX "PropertyOption_propertyDefinitionId_order_idx" ON "PropertyOption"("propertyDefinitionId", "order");
70
+
71
+ -- CreateIndex
72
+ CREATE UNIQUE INDEX "NoteProperty_noteId_propertyDefinitionId_key" ON "NoteProperty"("noteId", "propertyDefinitionId");
73
+
74
+ -- CreateIndex
75
+ CREATE INDEX "NoteProperty_propertyDefinitionId_noteId_idx" ON "NoteProperty"("propertyDefinitionId", "noteId");
76
+
77
+ -- CreateIndex
78
+ CREATE INDEX "NoteProperty_propertyDefinitionId_textValueNormalized_noteId_idx" ON "NoteProperty"("propertyDefinitionId", "textValueNormalized", "noteId");
79
+
80
+ -- CreateIndex
81
+ CREATE INDEX "NoteProperty_propertyDefinitionId_numberValue_noteId_idx" ON "NoteProperty"("propertyDefinitionId", "numberValue", "noteId");
82
+
83
+ -- CreateIndex
84
+ CREATE INDEX "NoteProperty_propertyDefinitionId_dateValue_noteId_idx" ON "NoteProperty"("propertyDefinitionId", "dateValue", "noteId");
85
+
86
+ -- CreateIndex
87
+ CREATE INDEX "NoteProperty_propertyDefinitionId_boolValue_noteId_idx" ON "NoteProperty"("propertyDefinitionId", "boolValue", "noteId");
88
+
89
+ -- CreateIndex
90
+ CREATE INDEX "NoteProperty_propertyDefinitionId_optionId_noteId_idx" ON "NoteProperty"("propertyDefinitionId", "optionId", "noteId");
91
+
92
+ -- CreateIndex
93
+ CREATE UNIQUE INDEX "DeletedNoteProperty_deletedNoteId_key_key" ON "DeletedNoteProperty"("deletedNoteId", "key");
94
+
95
+ -- CreateIndex
96
+ CREATE INDEX "DeletedNoteProperty_deletedNoteId_idx" ON "DeletedNoteProperty"("deletedNoteId");
97
+
98
+ -- CreateIndex
99
+ CREATE INDEX "Note_updatedAt_id_idx" ON "Note"("updatedAt", "id");
100
+
101
+ -- CreateIndex
102
+ CREATE INDEX "Note_createdAt_id_idx" ON "Note"("createdAt", "id");
103
+
104
+ -- CreateIndex
105
+ CREATE INDEX "Note_pinned_updatedAt_id_idx" ON "Note"("pinned", "updatedAt", "id");
@@ -0,0 +1,3 @@
1
+ -- Add saved query metadata to existing view sections.
2
+ ALTER TABLE "ViewSection" ADD COLUMN "displayType" TEXT NOT NULL DEFAULT 'list';
3
+ ALTER TABLE "ViewSection" ADD COLUMN "query" TEXT;
@@ -1,197 +1,293 @@
1
1
  generator client {
2
- provider = "prisma-client-js"
2
+ provider = "prisma-client-js"
3
3
  }
4
4
 
5
5
  datasource db {
6
- provider = "sqlite"
7
- url = env("DATABASE_URL")
6
+ provider = "sqlite"
7
+ url = env("DATABASE_URL")
8
8
  }
9
9
 
10
10
  model Cache {
11
- id Int @id @default(autoincrement())
12
- key String @unique
13
- value String
14
- createdAt DateTime @default(now())
15
- updatedAt DateTime @updatedAt
11
+ id Int @id @default(autoincrement())
12
+ key String @unique
13
+ value String
14
+ createdAt DateTime @default(now())
15
+ updatedAt DateTime @updatedAt
16
16
  }
17
17
 
18
18
  model McpToken {
19
- id Int @id @default(autoincrement())
20
- tokenHash String
21
- createdAt DateTime @default(now())
22
- lastUsedAt DateTime?
23
- revokedAt DateTime?
19
+ id Int @id @default(autoincrement())
20
+ tokenHash String
21
+ createdAt DateTime @default(now())
22
+ lastUsedAt DateTime?
23
+ revokedAt DateTime?
24
24
 
25
- @@index([revokedAt, createdAt])
25
+ @@index([revokedAt, createdAt])
26
26
  }
27
27
 
28
28
  model Note {
29
- id Int @id @default(autoincrement())
30
- title String
31
- content String
32
- searchableText String @default("")
33
- searchableTextVersion Int @default(0)
34
- createdAt DateTime @default(now())
35
- updatedAt DateTime @updatedAt
36
- pinned Boolean @default(false)
37
- order Int @default(0)
38
- layout NoteLayout @default(wide)
39
- tags Tag[] @relation("NoteToTag")
40
- reminders Reminder[] @relation("NoteToReminder")
41
- snapshots NoteSnapshot[]
29
+ id Int @id @default(autoincrement())
30
+ title String
31
+ content String
32
+ searchableText String @default("")
33
+ searchableTextVersion Int @default(0)
34
+ createdAt DateTime @default(now())
35
+ updatedAt DateTime @updatedAt
36
+ pinned Boolean @default(false)
37
+ order Int @default(0)
38
+ layout NoteLayout @default(wide)
39
+ tags Tag[] @relation("NoteToTag")
40
+ reminders Reminder[] @relation("NoteToReminder")
41
+ snapshots NoteSnapshot[]
42
+ properties NoteProperty[]
43
+
44
+ @@index([updatedAt, id])
45
+ @@index([createdAt, id])
46
+ @@index([pinned, updatedAt, id])
47
+ }
48
+
49
+ model PropertyDefinition {
50
+ id Int @id @default(autoincrement())
51
+ key String @unique
52
+ name String
53
+ valueType PropertyValueType
54
+ createdAt DateTime @default(now())
55
+ updatedAt DateTime @updatedAt
56
+ options PropertyOption[]
57
+ properties NoteProperty[]
58
+ }
59
+
60
+ model PropertyOption {
61
+ id Int @id @default(autoincrement())
62
+ propertyDefinitionId Int
63
+ definition PropertyDefinition @relation(fields: [propertyDefinitionId], references: [id], onDelete: Cascade)
64
+ label String
65
+ value String
66
+ color String?
67
+ order Int @default(0)
68
+ properties NoteProperty[]
69
+ createdAt DateTime @default(now())
70
+ updatedAt DateTime @updatedAt
71
+
72
+ @@unique([propertyDefinitionId, value])
73
+ @@index([propertyDefinitionId, order])
74
+ }
75
+
76
+ model NoteProperty {
77
+ id Int @id @default(autoincrement())
78
+ noteId Int
79
+ propertyDefinitionId Int
80
+ note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
81
+ definition PropertyDefinition @relation(fields: [propertyDefinitionId], references: [id], onDelete: Cascade)
82
+ optionId Int?
83
+ option PropertyOption? @relation(fields: [optionId], references: [id], onDelete: SetNull)
84
+ textValue String?
85
+ textValueNormalized String?
86
+ numberValue Float?
87
+ dateValue DateTime?
88
+ boolValue Boolean?
89
+ createdAt DateTime @default(now())
90
+ updatedAt DateTime @updatedAt
91
+
92
+ @@unique([noteId, propertyDefinitionId])
93
+ @@index([propertyDefinitionId, noteId])
94
+ @@index([propertyDefinitionId, textValueNormalized, noteId])
95
+ @@index([propertyDefinitionId, numberValue, noteId])
96
+ @@index([propertyDefinitionId, dateValue, noteId])
97
+ @@index([propertyDefinitionId, boolValue, noteId])
98
+ @@index([propertyDefinitionId, optionId, noteId])
42
99
  }
43
100
 
44
101
  model NoteSnapshot {
45
- id Int @id @default(autoincrement())
46
- noteId Int
47
- note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
48
- title String
49
- payload String
50
- editSessionId String?
51
- meta String?
52
- createdAt DateTime @default(now())
102
+ id Int @id @default(autoincrement())
103
+ noteId Int
104
+ note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
105
+ title String
106
+ payload String
107
+ editSessionId String?
108
+ meta String?
109
+ createdAt DateTime @default(now())
53
110
 
54
- @@index([noteId, createdAt])
55
- @@unique([noteId, editSessionId])
111
+ @@unique([noteId, editSessionId])
112
+ @@index([noteId, createdAt])
56
113
  }
57
114
 
58
115
  model DeletedNote {
59
- id Int @id
60
- title String
61
- content String
62
- createdAt DateTime
63
- updatedAt DateTime
64
- deletedAt DateTime @default(now())
65
- pinned Boolean @default(false)
66
- order Int @default(0)
67
- layout NoteLayout @default(wide)
68
- tags DeletedNoteTag[]
69
- reminders DeletedReminder[]
116
+ id Int @id
117
+ title String
118
+ content String
119
+ createdAt DateTime
120
+ updatedAt DateTime
121
+ deletedAt DateTime @default(now())
122
+ pinned Boolean @default(false)
123
+ order Int @default(0)
124
+ layout NoteLayout @default(wide)
125
+ tags DeletedNoteTag[]
126
+ reminders DeletedReminder[]
127
+ properties DeletedNoteProperty[]
128
+
129
+ @@index([deletedAt, updatedAt])
130
+ }
131
+
132
+ model DeletedNoteProperty {
133
+ id Int @id @default(autoincrement())
134
+ deletedNoteId Int
135
+ deletedNote DeletedNote @relation(fields: [deletedNoteId], references: [id], onDelete: Cascade)
136
+ key String
137
+ name String
138
+ valueType PropertyValueType
139
+ textValue String?
140
+ textValueNormalized String?
141
+ numberValue Float?
142
+ dateValue DateTime?
143
+ boolValue Boolean?
144
+ optionValue String?
145
+ optionLabel String?
146
+ optionColor String?
147
+ createdAt DateTime
148
+ updatedAt DateTime
70
149
 
71
- @@index([deletedAt, updatedAt])
150
+ @@unique([deletedNoteId, key])
151
+ @@index([deletedNoteId])
72
152
  }
73
153
 
74
154
  model DeletedNoteTag {
75
- id Int @id @default(autoincrement())
76
- deletedNoteId Int
77
- deletedNote DeletedNote @relation(fields: [deletedNoteId], references: [id], onDelete: Cascade)
78
- name String
155
+ id Int @id @default(autoincrement())
156
+ deletedNoteId Int
157
+ deletedNote DeletedNote @relation(fields: [deletedNoteId], references: [id], onDelete: Cascade)
158
+ name String
79
159
 
80
- @@index([deletedNoteId])
160
+ @@index([deletedNoteId])
81
161
  }
82
162
 
83
163
  model DeletedReminder {
84
- id Int @id @default(autoincrement())
85
- deletedNoteId Int
86
- deletedNote DeletedNote @relation(fields: [deletedNoteId], references: [id], onDelete: Cascade)
87
- originalId Int?
88
- reminderDate DateTime
89
- completed Boolean @default(false)
90
- priority ReminderPriority @default(medium)
91
- content String?
92
- createdAt DateTime
93
- updatedAt DateTime
164
+ id Int @id @default(autoincrement())
165
+ deletedNoteId Int
166
+ deletedNote DeletedNote @relation(fields: [deletedNoteId], references: [id], onDelete: Cascade)
167
+ originalId Int?
168
+ reminderDate DateTime
169
+ completed Boolean @default(false)
170
+ priority ReminderPriority @default(medium)
171
+ content String?
172
+ createdAt DateTime
173
+ updatedAt DateTime
94
174
 
95
- @@index([deletedNoteId])
175
+ @@index([deletedNoteId])
96
176
  }
97
177
 
98
178
  model Image {
99
- id Int @id @default(autoincrement())
100
- url String
101
- hash String @unique
102
- createdAt DateTime @default(now())
103
- updatedAt DateTime @updatedAt
179
+ id Int @id @default(autoincrement())
180
+ url String
181
+ hash String @unique
182
+ createdAt DateTime @default(now())
183
+ updatedAt DateTime @updatedAt
104
184
  }
105
185
 
106
186
  model Tag {
107
- id Int @id @default(autoincrement())
108
- name String @unique
109
- createdAt DateTime @default(now())
110
- updatedAt DateTime @updatedAt
111
- notes Note[] @relation("NoteToTag")
187
+ id Int @id @default(autoincrement())
188
+ name String @unique
189
+ createdAt DateTime @default(now())
190
+ updatedAt DateTime @updatedAt
191
+ notes Note[] @relation("NoteToTag")
112
192
  }
113
193
 
114
194
  enum ReminderPriority {
115
- low
116
- medium
117
- high
195
+ low
196
+ medium
197
+ high
118
198
  }
119
199
 
120
200
  enum NoteLayout {
121
- narrow
122
- wide
123
- full
201
+ narrow
202
+ wide
203
+ full
204
+ }
205
+
206
+ enum PropertyValueType {
207
+ text
208
+ url
209
+ number
210
+ date
211
+ boolean
212
+ select
124
213
  }
125
214
 
126
215
  model Reminder {
127
- id Int @id @default(autoincrement())
128
- noteId Int
129
- note Note @relation("NoteToReminder", fields: [noteId], references: [id], onDelete: Cascade)
130
- reminderDate DateTime
131
- completed Boolean @default(false)
132
- priority ReminderPriority @default(medium)
133
- content String?
134
- createdAt DateTime @default(now())
135
- updatedAt DateTime @updatedAt
216
+ id Int @id @default(autoincrement())
217
+ noteId Int
218
+ note Note @relation("NoteToReminder", fields: [noteId], references: [id], onDelete: Cascade)
219
+ reminderDate DateTime
220
+ completed Boolean @default(false)
221
+ priority ReminderPriority @default(medium)
222
+ content String?
223
+ createdAt DateTime @default(now())
224
+ updatedAt DateTime @updatedAt
136
225
  }
137
226
 
138
227
  model Placeholder {
139
- id Int @id @default(autoincrement())
140
- name String @unique
141
- template String
142
- replacement String
143
- createdAt DateTime @default(now())
144
- updatedAt DateTime @updatedAt
228
+ id Int @id @default(autoincrement())
229
+ name String @unique
230
+ template String
231
+ replacement String
232
+ createdAt DateTime @default(now())
233
+ updatedAt DateTime @updatedAt
145
234
  }
146
235
 
147
236
  model ViewWorkspace {
148
- id Int @id
149
- activeTabId Int?
150
- activeTab ViewTab? @relation("ActiveViewTab", fields: [activeTabId], references: [id], onDelete: SetNull)
151
- createdAt DateTime @default(now())
152
- updatedAt DateTime @updatedAt
237
+ id Int @id
238
+ activeTabId Int?
239
+ activeTab ViewTab? @relation("ActiveViewTab", fields: [activeTabId], references: [id], onDelete: SetNull)
240
+ createdAt DateTime @default(now())
241
+ updatedAt DateTime @updatedAt
153
242
  }
154
243
 
155
244
  model ViewTab {
156
- id Int @id @default(autoincrement())
157
- title String
158
- order Int @default(0)
159
- createdAt DateTime @default(now())
160
- updatedAt DateTime @updatedAt
161
- sections ViewSection[]
162
- activeWorkspaces ViewWorkspace[] @relation("ActiveViewTab")
245
+ id Int @id @default(autoincrement())
246
+ title String
247
+ order Int @default(0)
248
+ createdAt DateTime @default(now())
249
+ updatedAt DateTime @updatedAt
250
+ sections ViewSection[]
251
+ activeWorkspaces ViewWorkspace[] @relation("ActiveViewTab")
163
252
 
164
- @@index([order, createdAt])
253
+ @@index([order, createdAt])
165
254
  }
166
255
 
167
256
  model ViewSection {
168
- id Int @id @default(autoincrement())
169
- tabId Int
170
- tab ViewTab @relation(fields: [tabId], references: [id], onDelete: Cascade)
171
- title String
172
- mode ViewTagMatchMode @default(and)
173
- limit Int @default(5)
174
- order Int @default(0)
175
- createdAt DateTime @default(now())
176
- updatedAt DateTime @updatedAt
177
- tags ViewSectionTag[]
257
+ id Int @id @default(autoincrement())
258
+ tabId Int
259
+ tab ViewTab @relation(fields: [tabId], references: [id], onDelete: Cascade)
260
+ title String
261
+ displayType ViewDisplayType @default(list)
262
+ query String?
263
+ mode ViewTagMatchMode @default(and)
264
+ limit Int @default(5)
265
+ order Int @default(0)
266
+ createdAt DateTime @default(now())
267
+ updatedAt DateTime @updatedAt
268
+ tags ViewSectionTag[]
178
269
 
179
- @@index([tabId, order, createdAt])
270
+ @@index([tabId, order, createdAt])
180
271
  }
181
272
 
182
273
  model ViewSectionTag {
183
- id Int @id @default(autoincrement())
184
- sectionId Int
185
- section ViewSection @relation(fields: [sectionId], references: [id], onDelete: Cascade)
186
- name String
187
- order Int @default(0)
188
- createdAt DateTime @default(now())
189
- updatedAt DateTime @updatedAt
274
+ id Int @id @default(autoincrement())
275
+ sectionId Int
276
+ section ViewSection @relation(fields: [sectionId], references: [id], onDelete: Cascade)
277
+ name String
278
+ order Int @default(0)
279
+ createdAt DateTime @default(now())
280
+ updatedAt DateTime @updatedAt
190
281
 
191
- @@index([sectionId, order, createdAt])
282
+ @@index([sectionId, order, createdAt])
192
283
  }
193
284
 
194
285
  enum ViewTagMatchMode {
195
- and
196
- or
286
+ and
287
+ or
288
+ }
289
+
290
+ enum ViewDisplayType {
291
+ list
292
+ calendar
197
293
  }
@@ -1 +0,0 @@
1
- import{j as r}from"./note-vendor-B0t5F04o.js";import{p as n,T as l}from"./index-B4l2UvuC.js";import{a as e}from"./graph-vendor-CUxe67Lr.js";const o=new Map([["bold",e.createElement(e.Fragment,null,e.createElement("path",{d:"M108,84a16,16,0,1,1,16,16A16,16,0,0,1,108,84Zm128,44A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Zm-72,36.68V132a20,20,0,0,0-20-20,12,12,0,0,0-4,23.32V168a20,20,0,0,0,20,20,12,12,0,0,0,4-23.32Z"}))],["duotone",e.createElement(e.Fragment,null,e.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),e.createElement("path",{d:"M144,176a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176Zm88-48A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128ZM124,96a12,12,0,1,0-12-12A12,12,0,0,0,124,96Z"}))],["fill",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm-4,48a12,12,0,1,1-12,12A12,12,0,0,1,124,72Zm12,112a16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40a8,8,0,0,1,0,16Z"}))],["light",e.createElement(e.Fragment,null,e.createElement("path",{d:"M142,176a6,6,0,0,1-6,6,14,14,0,0,1-14-14V128a2,2,0,0,0-2-2,6,6,0,0,1,0-12,14,14,0,0,1,14,14v40a2,2,0,0,0,2,2A6,6,0,0,1,142,176ZM124,94a10,10,0,1,0-10-10A10,10,0,0,0,124,94Zm106,34A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z"}))],["regular",e.createElement(e.Fragment,null,e.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"}))],["thin",e.createElement(e.Fragment,null,e.createElement("path",{d:"M140,176a4,4,0,0,1-4,4,12,12,0,0,1-12-12V128a4,4,0,0,0-4-4,4,4,0,0,1,0-8,12,12,0,0,1,12,12v40a4,4,0,0,0,4,4A4,4,0,0,1,140,176ZM124,92a8,8,0,1,0-8-8A8,8,0,0,0,124,92Zm104,36A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z"}))]]),m=e.forwardRef((a,t)=>e.createElement(n,{ref:t,...a,weights:o}));m.displayName="InfoIcon";const c=m,d=({children:a,className:t=""})=>r.jsxs("div",{className:`flex items-center gap-2.5 rounded-[12px] border border-border-subtle bg-hover-subtle/50 px-4 py-3 ${t}`,children:[r.jsx(c,{className:"h-4 w-4 shrink-0 text-fg-tertiary"}),r.jsx(l,{as:"div",variant:"meta",weight:"medium",tone:"secondary",children:a})]});export{d as C};
@@ -1 +0,0 @@
1
- import{j as t}from"./note-vendor-B0t5F04o.js";import{$ as _,P as C,a2 as U,i as G,a3 as Y,a4 as J,a5 as X,a6 as ee,q as ne,N as te,F as re,T as N,a7 as oe}from"./index-B4l2UvuC.js";import{a as i,F as se}from"./graph-vendor-CUxe67Lr.js";import"./note-core-GgFcksAF.js";const ae=s=>{let a=0;for(let r=0;r<s.length;r++)a+=s.charCodeAt(r);return a},ie={background:"#f4f6f8",nodeHub:"#2c2f36",nodeSelected:"#111318",nodeConnected:"#636b76",nodeDefault:["#d6dbe1","#c8ced6","#b7bec7","#a7afb9"],nodeDimmed:["rgba(214,219,225,0.28)","rgba(200,206,214,0.24)","rgba(183,190,199,0.24)","rgba(167,175,185,0.2)"],nodeHubDimmed:"rgba(44,47,54,0.16)",nodeStroke:"#eef1f4",nodeSelectedStroke:"#a6b0bc",labelBackground:"rgba(246,248,250,0.92)",labelText:"#222831",labelFontFamily:"Pretendard Variable, Pretendard, system-ui, sans-serif",linkIdle:"rgba(99, 107, 117, 0.34)",linkConnected:"#68717c",linkDimmed:"rgba(127, 136, 146, 0.12)",legendHub:"#2c2f36"},le={background:"#121316",nodeHub:"#d6dce3",nodeSelected:"#eef1f5",nodeConnected:"#9099a4",nodeDefault:["#343a43","#2d333c","#262c35","#20262f"],nodeDimmed:["rgba(52,58,67,0.28)","rgba(45,51,60,0.24)","rgba(38,44,53,0.22)","rgba(32,38,47,0.2)"],nodeHubDimmed:"rgba(214,220,227,0.16)",nodeStroke:"#171c23",nodeSelectedStroke:"#7f8a97",labelBackground:"rgba(16,18,22,0.9)",labelText:"#eef2f6",labelFontFamily:"Pretendard Variable, Pretendard, system-ui, sans-serif",linkIdle:"rgba(118, 127, 138, 0.42)",linkConnected:"#a2abb6",linkDimmed:"rgba(118, 127, 138, 0.1)",legendHub:"#d6dce3"};function D(s){return s==="dark"?le:ie}function de(s,a){const r=D(s),{connections:g,colorIndex:y,selectedNodeId:d,nodeId:b,isConnected:c}=a,h=d===b;return d!==null&&!h&&!c?g>3?r.nodeHubDimmed:r.nodeDimmed[y%r.nodeDimmed.length]:h?r.nodeSelected:c?r.nodeConnected:g>3?r.nodeHub:r.nodeDefault[y%r.nodeDefault.length]}function ce(s,a){const r=D(s);return a.selectedNodeId!==null&&!a.isConnected?r.linkDimmed:a.isConnected?r.linkConnected:r.linkIdle}function ue(s,a){const r=D(s);return`${a.emphasize?"700":"400"} ${a.fontSize}px ${r.labelFontFamily}`}function z(s){return s<=1?3.5:s<=3?4.5:s<=6?5.5:Math.min(7,5.5+Math.sqrt(s)*.5)}const fe=t.jsx(C,{title:"Knowledge Graph",description:t.jsx(G,{width:184,height:16,className:"rounded-full"}),children:t.jsx("div",{className:"flex h-[600px] items-center justify-center",children:t.jsx(G,{width:"100%",height:"100%"})})});function he(){const s=Y(),a=i.useRef(null),r=i.useRef(null),[g,y]=i.useState({width:800,height:600}),[d,b]=i.useState(null),{theme:c}=J(e=>e),h=D(c),v=i.useRef(h);v.current=h;const{data:w}=X({queryKey:ne.notes.graph(),queryFn:async()=>{const e=await ee();if(e.type==="error")throw e;return e.noteGraph}}),l=i.useMemo(()=>{if(w.nodes.length===0)return null;const e=w.nodes.filter(o=>o.connections>0);if(e.length===0)return null;const n=new Set(e.map(o=>o.id));return{nodes:e,links:w.links.filter(o=>n.has(o.source)&&n.has(o.target))}},[w]);i.useEffect(()=>{if(!l)return;const e=()=>{if(!a.current)return;const n=a.current.getBoundingClientRect();y({width:n.width,height:Math.max(600,window.innerHeight-150)})};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[l]),i.useEffect(()=>{if(!l||!r.current)return;const e=window.setTimeout(()=>{r.current?.zoomToFit(400,50)},500);return()=>window.clearTimeout(e)},[l]);const R=i.useRef(d);R.current=d;const B=i.useCallback(e=>{if(R.current===e.id){s({to:te,params:{id:e.id}});return}b(e.id)},[s]),L=i.useCallback(()=>{b(null)},[]),K=i.useCallback(e=>{a.current&&(a.current.style.cursor=e?"pointer":"default")},[]),I=i.useRef(!1),$=i.useCallback(()=>{I.current||(I.current=!0,r.current?.enableZoomInteraction(!1))},[]),q=i.useCallback(()=>{I.current=!1,r.current?.enableZoomInteraction(!0)},[]),H=i.useRef(new Map),A=i.useMemo(()=>{const e=new Map;if(l)for(const n of l.links)e.has(n.source)||e.set(n.source,new Set),e.has(n.target)||e.set(n.target,new Set),e.get(n.source)?.add(n.target),e.get(n.target)?.add(n.source);return e},[l]);H.current=A;const O=i.useCallback((e,n,o)=>{const u=v.current,f=d,p=H.current,m=z(e.connections),x=e.x||0,S=e.y||0,k=f===e.id,T=f?p.get(f)?.has(e.id)??!1:!1,V=f!==null&&!k&&!T,W=ae(e.id);if(n.beginPath(),n.arc(x,S,m,0,Math.PI*2),n.fillStyle=de(c,{connections:e.connections,colorIndex:W,selectedNodeId:f,nodeId:e.id,isConnected:T}),n.fill(),V)return;n.strokeStyle=u.nodeStroke,n.lineWidth=(k?2:1)/o,n.stroke(),k&&(n.beginPath(),n.arc(x,S,m+2/o,0,Math.PI*2),n.strokeStyle=u.nodeSelectedStroke,n.lineWidth=1.5/o,n.stroke());const Q=T&&e.connections>=4;if(k||Q||o>2.5){const P=e.title||"Untitled",E=Math.max(10/o,2.5);n.font=ue(c,{fontSize:E,emphasize:k}),n.textAlign="center",n.textBaseline="top";const M=n.measureText(P).width,j=2/o,F=S+m+3/o;n.fillStyle=u.labelBackground,n.fillRect(x-M/2-j,F,M+j*2,E+j*2),n.fillStyle=u.labelText,n.fillText(P,x,F+j)}},[d,c]),Z=i.useCallback((e,n,o)=>{const u=d,f=e.source,p=e.target,m=u?f.id===u||p.id===u:!1;n.beginPath(),n.moveTo(f.x||0,f.y||0),n.lineTo(p.x||0,p.y||0),n.strokeStyle=ce(c,{selectedNodeId:u,isConnected:m}),n.lineWidth=m?2/o:.5/o,n.stroke()},[d,c]);return l?t.jsx(C,{title:"Knowledge Graph",description:`${l.nodes.length} linked notes, ${l.links.length} connections`,children:t.jsxs("div",{ref:a,className:"surface-base graph-canvas relative overflow-hidden",style:{"--graph-bg":h.background},children:[d&&(()=>{const e=l.nodes.find(n=>n.id===d);return e?t.jsxs("div",{className:"surface-floating absolute top-3 left-3 z-10 flex items-center gap-2 px-3 py-2",children:[t.jsx(N,{as:"span",variant:"meta",weight:"semibold",truncate:!0,className:"max-w-48",children:e.title}),t.jsxs(N,{as:"span",variant:"label",tone:"tertiary",children:[e.connections," links"]}),t.jsx("button",{type:"button",onClick:()=>b(null),className:"focus-ring-soft ml-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-[8px] text-fg-tertiary transition-colors hover:bg-hover-subtle hover:text-fg-default","aria-label":"Deselect node",children:t.jsx(oe,{className:"h-3.5 w-3.5"})})]}):null})(),t.jsxs("div",{className:"surface-floating absolute top-3 right-3 z-10 flex flex-col gap-1.5 px-3 py-2.5",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"legend-dot h-2.5 w-2.5 shrink-0 rounded-full",style:{"--legend-color":h.legendHub}}),t.jsx(N,{as:"span",variant:"label",weight:"medium",tone:"secondary",children:"Hub notes (4+ connections)"})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("span",{className:"legend-dot h-2.5 w-2.5 shrink-0 rounded-full",style:{"--legend-color":h.nodeConnected}}),t.jsx(N,{as:"span",variant:"label",weight:"medium",tone:"secondary",children:"Connected notes"})]})]}),t.jsx(se,{ref:r,graphData:l,width:g.width,height:g.height,nodeId:"id",nodeLabel:"",nodeCanvasObject:O,nodePointerAreaPaint:(e,n,o)=>{o.beginPath(),o.arc(e.x||0,e.y||0,Math.max(z(e.connections)+4,10),0,2*Math.PI),o.fillStyle=n,o.fill()},linkCanvasObject:Z,linkCanvasObjectMode:()=>"replace",linkDirectionalParticles:0,onNodeClick:B,onNodeHover:K,onBackgroundClick:L,onNodeDrag:$,onNodeDragEnd:q,warmupTicks:30,cooldownTicks:80,d3AlphaDecay:.05,d3VelocityDecay:.3,enableZoomInteraction:!0,enablePanInteraction:!0,minZoom:.3,maxZoom:5})]})}):t.jsx(C,{title:"Knowledge Graph",description:"0 linked notes, 0 connections",children:t.jsx(re,{title:"No constellations yet",description:"Link your notes together and watch your own starry sky unfold"})})}function ke(){return t.jsx(_,{fallback:fe,errorTitle:"Failed to load graph",errorDescription:"Retry loading your linked note constellation",renderError:({error:s,retry:a})=>t.jsx(C,{title:"Knowledge Graph",children:t.jsx(U,{title:"Failed to load graph",description:"Retry loading your linked note constellation",error:s,onRetry:a})}),children:t.jsx(he,{})})}export{ke as default};