ocean-brain 0.7.5 → 0.8.1

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 (263) hide show
  1. package/dist/index.js +3 -3
  2. package/dist/mcp.js +180 -736
  3. package/package.json +6 -2
  4. package/server/client/dist/assets/ArrowRight.es-CbA8ey6a.js +1 -0
  5. package/server/client/dist/assets/{Calendar-Bc2zJueR.js → Calendar-CgWgr1BV.js} +2 -2
  6. package/server/client/dist/assets/Callout-DKruIT0f.js +1 -0
  7. package/server/client/dist/assets/Copy.es-DFbgpaNJ.js +1 -0
  8. package/server/client/dist/assets/Graph-kCltGRlY.js +1 -0
  9. package/server/client/dist/assets/{Image-DxWhlIDG.js → Image-7W0DZwMo.js} +1 -1
  10. package/server/client/dist/assets/Image.es-5pXLx9TU.js +1 -0
  11. package/server/client/dist/assets/Note-BW6Np_5g.js +20 -0
  12. package/server/client/dist/assets/Plus.es-B0sg64VJ.js +1 -0
  13. package/server/client/dist/assets/Reminders-C10fHQcl.js +1 -0
  14. package/server/client/dist/assets/Search-tf2nV4v0.js +1 -0
  15. package/server/client/dist/assets/{SurfaceCard-CkAVMLPs.js → SurfaceCard-pydtvHfu.js} +1 -1
  16. package/server/client/dist/assets/Tag-uCoYbISy.js +1 -0
  17. package/server/client/dist/assets/TagNotes-CqOcQiRw.js +1 -0
  18. package/server/client/dist/assets/Trash.es-w32Goxfa.js +1 -0
  19. package/server/client/dist/assets/ViewNotes-slPXXoOY.js +1 -0
  20. package/server/client/dist/assets/ViewSectionDialog-brTrsF6G.js +102 -0
  21. package/server/client/dist/assets/Views-B_wsb-XJ.js +1 -0
  22. package/server/client/dist/assets/{graph-vendor-CUxe67Lr.js → graph-vendor-BAF95C0g.js} +2 -2
  23. package/server/client/dist/assets/image.api-CYsjXiMr.js +17 -0
  24. package/server/client/dist/assets/index-BR05aSXr.js +342 -0
  25. package/server/client/dist/assets/{index-D3BfroIT.js → index-D83QbOcw.js} +1 -1
  26. package/server/client/dist/assets/{index-C5BGzDgt.css → index-DPI6YoDt.css} +1 -1
  27. package/server/client/dist/assets/manage-image-BYIhWu56.js +1 -0
  28. package/server/client/dist/assets/{manage-image-detail-C8Q7K7I3.js → manage-image-detail-6KgmQvbN.js} +1 -1
  29. package/server/client/dist/assets/mcp-Dd98N9Hq.js +4 -0
  30. package/server/client/dist/assets/mcp-admin-adapter-DOgBsYpl.js +1 -0
  31. package/server/client/dist/assets/note-core-CMGUaW1v.js +176 -0
  32. package/server/client/dist/assets/note-vendor-Hoz9Q4-4.js +54 -0
  33. package/server/client/dist/assets/{placeholder-Cr_nI8UI.js → placeholder-siHGg9aK.js} +4 -4
  34. package/server/client/dist/assets/{properties-CvYWJWUM.js → properties-CyVRKgcT.js} +1 -1
  35. package/server/client/dist/assets/tag.api-CwmC8crB.js +21 -0
  36. package/server/client/dist/assets/trash-wojQBK9Z.js +1 -0
  37. package/server/client/dist/assets/{useReminderMutate-CDmIEwsw.js → useReminderMutate-DuVKxpBh.js} +1 -1
  38. package/server/client/dist/index.html +5 -5
  39. package/server/dist/app.js +0 -1
  40. package/server/dist/features/auth/http/api.js +0 -1
  41. package/server/dist/features/auth/http/login-page.js +272 -5
  42. package/server/dist/features/auth/http/pages.js +20 -3
  43. package/server/dist/features/auth/service.js +3 -2
  44. package/server/dist/features/cache/graphql/cache.field.resolver.js +0 -1
  45. package/server/dist/features/cache/graphql/cache.mutation.resolver.js +0 -1
  46. package/server/dist/features/cache/graphql/cache.query.resolver.js +0 -1
  47. package/server/dist/features/cache/graphql/cache.resolver.js +0 -1
  48. package/server/dist/features/cache/graphql/cache.type-defs.js +0 -1
  49. package/server/dist/features/cache/graphql/index.js +0 -1
  50. package/server/dist/features/image/graphql/image.field.resolver.js +0 -1
  51. package/server/dist/features/image/graphql/image.mutation.resolver.js +0 -1
  52. package/server/dist/features/image/graphql/image.query.resolver.js +0 -1
  53. package/server/dist/features/image/graphql/image.resolver.js +0 -1
  54. package/server/dist/features/image/graphql/image.type-defs.js +0 -1
  55. package/server/dist/features/image/graphql/index.js +0 -1
  56. package/server/dist/features/image/http/upload.js +34 -24
  57. package/server/dist/features/image/services/delete.js +0 -1
  58. package/server/dist/features/image/services/upload.js +0 -1
  59. package/server/dist/features/image/services/validation.js +110 -0
  60. package/server/dist/features/mcp-admin/http/handlers.js +11 -4
  61. package/server/dist/features/mcp-admin/service.js +0 -1
  62. package/server/dist/features/note/graphql/index.js +0 -1
  63. package/server/dist/features/note/graphql/note.field.resolver.js +0 -1
  64. package/server/dist/features/note/graphql/note.mutation.resolver.js +0 -1
  65. package/server/dist/features/note/graphql/note.query.resolver.js +0 -1
  66. package/server/dist/features/note/graphql/note.resolver.js +0 -1
  67. package/server/dist/features/note/graphql/note.type-defs.js +0 -1
  68. package/server/dist/features/note/http/mcp.js +8 -44
  69. package/server/dist/features/note/services/authoring.js +0 -1
  70. package/server/dist/features/note/services/cleanup.js +2 -3
  71. package/server/dist/features/note/services/content-blocks.js +0 -1
  72. package/server/dist/features/note/services/markdown-intent-write.js +11 -44
  73. package/server/dist/features/note/services/markdown-patch.js +4 -124
  74. package/server/dist/features/note/services/properties.js +0 -1
  75. package/server/dist/features/note/services/search-backfill.js +0 -1
  76. package/server/dist/features/note/services/search.js +0 -1
  77. package/server/dist/features/note/services/snapshot.js +0 -1
  78. package/server/dist/features/note/services/tag-filter.js +0 -1
  79. package/server/dist/features/note/services/trash.js +0 -1
  80. package/server/dist/features/note/services/write-conflict.js +0 -1
  81. package/server/dist/features/note/services/write.js +13 -14
  82. package/server/dist/features/placeholder/graphql/index.js +0 -1
  83. package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js +0 -1
  84. package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js +0 -1
  85. package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js +0 -1
  86. package/server/dist/features/placeholder/graphql/placeholder.resolver.js +0 -1
  87. package/server/dist/features/placeholder/graphql/placeholder.type-defs.js +0 -1
  88. package/server/dist/features/reminder/graphql/index.js +0 -1
  89. package/server/dist/features/reminder/graphql/reminder.field.resolver.js +0 -1
  90. package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js +0 -1
  91. package/server/dist/features/reminder/graphql/reminder.query.resolver.js +0 -1
  92. package/server/dist/features/reminder/graphql/reminder.resolver.js +0 -1
  93. package/server/dist/features/reminder/graphql/reminder.type-defs.js +0 -1
  94. package/server/dist/features/tag/graphql/index.js +0 -1
  95. package/server/dist/features/tag/graphql/tag.field.resolver.js +0 -1
  96. package/server/dist/features/tag/graphql/tag.mutation.resolver.js +0 -1
  97. package/server/dist/features/tag/graphql/tag.query.resolver.js +16 -2
  98. package/server/dist/features/tag/graphql/tag.resolver.js +0 -1
  99. package/server/dist/features/tag/graphql/tag.type-defs.js +2 -1
  100. package/server/dist/features/tag/http/mcp.js +0 -1
  101. package/server/dist/features/tag/services/organization.js +0 -1
  102. package/server/dist/features/view/graphql/index.js +0 -1
  103. package/server/dist/features/view/graphql/view.mutation.resolver.js +0 -1
  104. package/server/dist/features/view/graphql/view.query.resolver.js +0 -1
  105. package/server/dist/features/view/graphql/view.resolver.js +0 -1
  106. package/server/dist/features/view/graphql/view.type-defs.js +0 -1
  107. package/server/dist/features/view/services/workspace.js +0 -1
  108. package/server/dist/main.js +0 -1
  109. package/server/dist/models.js +0 -1
  110. package/server/dist/modules/app-version.js +104 -0
  111. package/server/dist/modules/auth-guard.js +0 -1
  112. package/server/dist/modules/auth-mode.js +0 -1
  113. package/server/dist/modules/auth-redirect.js +0 -1
  114. package/server/dist/modules/blocknote-markdown-editor.js +53 -0
  115. package/server/dist/modules/blocknote-tree.js +0 -1
  116. package/server/dist/modules/blocknote.js +10 -4
  117. package/server/dist/modules/data-maintenance.js +0 -1
  118. package/server/dist/modules/error-handler.js +0 -1
  119. package/server/dist/modules/graphql.js +0 -1
  120. package/server/dist/modules/logger.js +0 -1
  121. package/server/dist/modules/mcp-auth.js +62 -2
  122. package/server/dist/modules/mcp-token.js +0 -1
  123. package/server/dist/modules/prisma-runtime.js +0 -1
  124. package/server/dist/modules/rate-limit.js +0 -1
  125. package/server/dist/modules/recovery-retention.js +0 -1
  126. package/server/dist/modules/server-events-handler.js +0 -1
  127. package/server/dist/modules/server-events.js +0 -1
  128. package/server/dist/modules/session-store.js +0 -1
  129. package/server/dist/modules/use-async.js +0 -1
  130. package/server/dist/paths.js +1 -1
  131. package/server/dist/routes/api.js +2 -9
  132. package/server/dist/routes/auth-pages.js +0 -1
  133. package/server/dist/routes/client.js +51 -2
  134. package/server/dist/routes/graphql.js +0 -1
  135. package/server/dist/routes/index.js +0 -1
  136. package/server/dist/routes/mcp.js +0 -1
  137. package/server/dist/schema/index.js +0 -1
  138. package/server/dist/start.js +0 -1
  139. package/server/dist/types/index.js +0 -1
  140. package/server/dist/types/input.js +0 -1
  141. package/server/client/dist/assets/Callout-B4kA_Cvr.js +0 -1
  142. package/server/client/dist/assets/Graph-uq5jfJgt.js +0 -1
  143. package/server/client/dist/assets/Image.es-BpAOJjJT.js +0 -1
  144. package/server/client/dist/assets/Note-Bo8ZYRP-.js +0 -22
  145. package/server/client/dist/assets/Plus.es-Dc_js8AC.js +0 -1
  146. package/server/client/dist/assets/Reminders-lj7Equld.js +0 -1
  147. package/server/client/dist/assets/Search-1wcRO5--.js +0 -1
  148. package/server/client/dist/assets/Tag-CeygwFfv.js +0 -1
  149. package/server/client/dist/assets/TagNotes-B8DqItxw.js +0 -1
  150. package/server/client/dist/assets/Trash.es-OuQVb_SX.js +0 -1
  151. package/server/client/dist/assets/ViewNotes-BH7PbdOD.js +0 -1
  152. package/server/client/dist/assets/ViewSectionTableRenderer-BJwhd5be.js +0 -102
  153. package/server/client/dist/assets/Views-eYFtsdFj.js +0 -1
  154. package/server/client/dist/assets/image.api-C0eYGCeH.js +0 -17
  155. package/server/client/dist/assets/index-jIfkRdY_.js +0 -361
  156. package/server/client/dist/assets/manage-image-C0YwkLIP.js +0 -1
  157. package/server/client/dist/assets/mcp-DHHhTLC8.js +0 -1
  158. package/server/client/dist/assets/note-core-Z6kqulGB.js +0 -180
  159. package/server/client/dist/assets/note-vendor-i1M2FSI2.js +0 -54
  160. package/server/client/dist/assets/trash-DA27aW7L.js +0 -1
  161. package/server/client/dist/fonts/Pretendard-Bold.woff +0 -0
  162. package/server/client/dist/fonts/Pretendard-Regular.woff +0 -0
  163. package/server/dist/app.js.map +0 -1
  164. package/server/dist/features/auth/http/api.js.map +0 -1
  165. package/server/dist/features/auth/http/login-page.js.map +0 -1
  166. package/server/dist/features/auth/http/pages.js.map +0 -1
  167. package/server/dist/features/auth/service.js.map +0 -1
  168. package/server/dist/features/cache/graphql/cache.field.resolver.js.map +0 -1
  169. package/server/dist/features/cache/graphql/cache.mutation.resolver.js.map +0 -1
  170. package/server/dist/features/cache/graphql/cache.query.resolver.js.map +0 -1
  171. package/server/dist/features/cache/graphql/cache.resolver.js.map +0 -1
  172. package/server/dist/features/cache/graphql/cache.type-defs.js.map +0 -1
  173. package/server/dist/features/cache/graphql/index.js.map +0 -1
  174. package/server/dist/features/image/graphql/image.field.resolver.js.map +0 -1
  175. package/server/dist/features/image/graphql/image.mutation.resolver.js.map +0 -1
  176. package/server/dist/features/image/graphql/image.query.resolver.js.map +0 -1
  177. package/server/dist/features/image/graphql/image.resolver.js.map +0 -1
  178. package/server/dist/features/image/graphql/image.type-defs.js.map +0 -1
  179. package/server/dist/features/image/graphql/index.js.map +0 -1
  180. package/server/dist/features/image/http/upload.js.map +0 -1
  181. package/server/dist/features/image/services/delete.js.map +0 -1
  182. package/server/dist/features/image/services/remote-fetch.js +0 -176
  183. package/server/dist/features/image/services/remote-fetch.js.map +0 -1
  184. package/server/dist/features/image/services/upload.js.map +0 -1
  185. package/server/dist/features/mcp-admin/http/handlers.js.map +0 -1
  186. package/server/dist/features/mcp-admin/service.js.map +0 -1
  187. package/server/dist/features/note/graphql/index.js.map +0 -1
  188. package/server/dist/features/note/graphql/note.field.resolver.js.map +0 -1
  189. package/server/dist/features/note/graphql/note.mutation.resolver.js.map +0 -1
  190. package/server/dist/features/note/graphql/note.query.resolver.js.map +0 -1
  191. package/server/dist/features/note/graphql/note.resolver.js.map +0 -1
  192. package/server/dist/features/note/graphql/note.type-defs.js.map +0 -1
  193. package/server/dist/features/note/http/mcp.js.map +0 -1
  194. package/server/dist/features/note/services/authoring.js.map +0 -1
  195. package/server/dist/features/note/services/cleanup.js.map +0 -1
  196. package/server/dist/features/note/services/content-blocks.js.map +0 -1
  197. package/server/dist/features/note/services/markdown-intent-write.js.map +0 -1
  198. package/server/dist/features/note/services/markdown-patch.js.map +0 -1
  199. package/server/dist/features/note/services/properties.js.map +0 -1
  200. package/server/dist/features/note/services/search-backfill.js.map +0 -1
  201. package/server/dist/features/note/services/search.js.map +0 -1
  202. package/server/dist/features/note/services/snapshot.js.map +0 -1
  203. package/server/dist/features/note/services/tag-filter.js.map +0 -1
  204. package/server/dist/features/note/services/trash.js.map +0 -1
  205. package/server/dist/features/note/services/write-conflict.js.map +0 -1
  206. package/server/dist/features/note/services/write.js.map +0 -1
  207. package/server/dist/features/placeholder/graphql/index.js.map +0 -1
  208. package/server/dist/features/placeholder/graphql/placeholder.field.resolver.js.map +0 -1
  209. package/server/dist/features/placeholder/graphql/placeholder.mutation.resolver.js.map +0 -1
  210. package/server/dist/features/placeholder/graphql/placeholder.query.resolver.js.map +0 -1
  211. package/server/dist/features/placeholder/graphql/placeholder.resolver.js.map +0 -1
  212. package/server/dist/features/placeholder/graphql/placeholder.type-defs.js.map +0 -1
  213. package/server/dist/features/reminder/graphql/index.js.map +0 -1
  214. package/server/dist/features/reminder/graphql/reminder.field.resolver.js.map +0 -1
  215. package/server/dist/features/reminder/graphql/reminder.mutation.resolver.js.map +0 -1
  216. package/server/dist/features/reminder/graphql/reminder.query.resolver.js.map +0 -1
  217. package/server/dist/features/reminder/graphql/reminder.resolver.js.map +0 -1
  218. package/server/dist/features/reminder/graphql/reminder.type-defs.js.map +0 -1
  219. package/server/dist/features/tag/graphql/index.js.map +0 -1
  220. package/server/dist/features/tag/graphql/tag.field.resolver.js.map +0 -1
  221. package/server/dist/features/tag/graphql/tag.mutation.resolver.js.map +0 -1
  222. package/server/dist/features/tag/graphql/tag.query.resolver.js.map +0 -1
  223. package/server/dist/features/tag/graphql/tag.resolver.js.map +0 -1
  224. package/server/dist/features/tag/graphql/tag.type-defs.js.map +0 -1
  225. package/server/dist/features/tag/http/mcp.js.map +0 -1
  226. package/server/dist/features/tag/services/organization.js.map +0 -1
  227. package/server/dist/features/view/graphql/index.js.map +0 -1
  228. package/server/dist/features/view/graphql/view.mutation.resolver.js.map +0 -1
  229. package/server/dist/features/view/graphql/view.query.resolver.js.map +0 -1
  230. package/server/dist/features/view/graphql/view.resolver.js.map +0 -1
  231. package/server/dist/features/view/graphql/view.type-defs.js.map +0 -1
  232. package/server/dist/features/view/services/workspace.js.map +0 -1
  233. package/server/dist/main.js.map +0 -1
  234. package/server/dist/models.js.map +0 -1
  235. package/server/dist/modules/auth-guard.js.map +0 -1
  236. package/server/dist/modules/auth-mode.js.map +0 -1
  237. package/server/dist/modules/auth-redirect.js.map +0 -1
  238. package/server/dist/modules/blocknote-tree.js.map +0 -1
  239. package/server/dist/modules/blocknote.js.map +0 -1
  240. package/server/dist/modules/data-maintenance.js.map +0 -1
  241. package/server/dist/modules/error-handler.js.map +0 -1
  242. package/server/dist/modules/graphql.js.map +0 -1
  243. package/server/dist/modules/logger.js.map +0 -1
  244. package/server/dist/modules/mcp-auth.js.map +0 -1
  245. package/server/dist/modules/mcp-token.js.map +0 -1
  246. package/server/dist/modules/prisma-runtime.js.map +0 -1
  247. package/server/dist/modules/rate-limit.js.map +0 -1
  248. package/server/dist/modules/recovery-retention.js.map +0 -1
  249. package/server/dist/modules/server-events-handler.js.map +0 -1
  250. package/server/dist/modules/server-events.js.map +0 -1
  251. package/server/dist/modules/session-store.js.map +0 -1
  252. package/server/dist/modules/use-async.js.map +0 -1
  253. package/server/dist/paths.js.map +0 -1
  254. package/server/dist/routes/api.js.map +0 -1
  255. package/server/dist/routes/auth-pages.js.map +0 -1
  256. package/server/dist/routes/client.js.map +0 -1
  257. package/server/dist/routes/graphql.js.map +0 -1
  258. package/server/dist/routes/index.js.map +0 -1
  259. package/server/dist/routes/mcp.js.map +0 -1
  260. package/server/dist/schema/index.js.map +0 -1
  261. package/server/dist/start.js.map +0 -1
  262. package/server/dist/types/index.js.map +0 -1
  263. package/server/dist/types/input.js.map +0 -1
@@ -0,0 +1 @@
1
+ import{j as e}from"./note-vendor-Hoz9Q4-4.js";import{a5 as G,q as T,G as L,k as S,ay as C,Y as F,P as N,Q as k,L as q,b6 as B,T as D,B as O,Z as z,i as h,j as K,aZ as Q}from"./index-BR05aSXr.js";import{f as U,d as W}from"./image.api-CYsjXiMr.js";import{a as x}from"./graph-vendor-BAF95C0g.js";import{I as H}from"./Image-7W0DZwMo.js";import{S as A}from"./SurfaceCard-pydtvHfu.js";import{c as $,n as Z}from"./Trash.es-w32Goxfa.js";import"./note-core-CMGUaW1v.js";const V=n=>{const{data:a}=G({queryKey:T.images.list(n.searchParams),async queryFn(){const s=await U({offset:n.searchParams.offset,limit:n.searchParams.limit});if(s.type==="error")throw s;return s.allImages}});return n.render(a)},M=16;function X(n,a,s){return Math.max(Math.floor((Math.max(n,0)+s)/(a+s)),1)}function _(n,a,s){return n*a+(n-1)*s}function Y({minItemWidth:n,gap:a,rows:s,fallback:c,override:g}){const[i,w]=x.useState(null),[v,p]=x.useState(c??s),r=x.useRef(null),o=x.useCallback(t=>{w(t)},[]),d=g==null,y=d?v:g;return x.useLayoutEffect(()=>{if(!d){r.current=null;return}if(!i){r.current=null,p(l=>l===(c??s)?l:c??s);return}let t=null;const I=()=>{const l=i.offsetWidth,E=X(l,n,a),u=r.current;let j=E;if(u!==null&&u!==E)if(E>u){const f=_(u+1,n,a);l<f+M&&(j=u)}else{const f=_(u,n,a);l>f-M&&(j=u)}r.current=j;const b=Math.max(j*s,s);p(f=>f===b?f:b)},m=()=>{t===null&&(t=window.requestAnimationFrame(()=>{t=null,I()}))};if(m(),typeof ResizeObserver<"u"){const l=new ResizeObserver(()=>{m()});return l.observe(i),()=>{l.disconnect(),t!==null&&window.cancelAnimationFrame(t)}}return window.addEventListener("resize",m),window.addEventListener("orientationchange",m),()=>{window.removeEventListener("resize",m),window.removeEventListener("orientationchange",m),t!==null&&window.cancelAnimationFrame(t)}},[i,c,a,d,n,s]),{containerRef:o,limit:y,isAutoLimit:d}}const J=240,ee=20,te=4,R=192,P=K(Q),de=()=>{const n=L(),a=S(),s=P.useNavigate(),{page:c}=P.useSearch(),{containerRef:g,limit:i}=Y({minItemWidth:J,gap:ee,rows:te}),w=C({mutationFn:W,onSuccess:r=>{if(r.type==="error")throw r;a.invalidateQueries({queryKey:T.images.listAll(),exact:!1})}}),v=async r=>{await n("Delete this image? It is not referenced by any notes.")&&w.mutate(r)},p=r=>r===1?"1 reference":`${r} references`;return e.jsx("div",{ref:g,children:e.jsx(F,{fallback:e.jsx(N,{title:"Images",variant:"default",heading:e.jsx(h,{width:136,height:24,className:"rounded-full"}),description:e.jsx(h,{width:232,height:16,className:"rounded-full"}),children:e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx("div",{className:"grid-auto-cards grid gap-4",children:Array.from({length:3},(r,o)=>e.jsxs(A,{flush:!0,children:[e.jsx("div",{className:"flex items-center justify-center bg-muted/25 p-3",style:{height:R},children:e.jsx(h,{width:"100%",height:R-24,className:"rounded-[12px]"})}),e.jsxs("div",{className:"flex items-center justify-between gap-3 border-t border-border-subtle px-3 py-2.5",children:[e.jsx(h,{width:92,height:14,className:"rounded-full"}),e.jsx(h,{width:32,height:32,className:"rounded-[12px]"})]})]},o))})})}),errorTitle:"Failed to load images",errorDescription:"Retry loading uploaded image metadata",resetKeys:[c,i],children:e.jsx(V,{searchParams:{offset:(c-1)*i,limit:i},render:({images:r,totalCount:o})=>{const d=o>0?`Images (${o})`:void 0,y="Review and manage the images you uploaded inside notes";return r.length===0?e.jsx(N,{title:"Images",variant:"default",heading:d,description:y,children:e.jsx(k,{title:"There are no images",description:"Upload an image in any note and it will appear here"})}):e.jsx(N,{title:"Images",variant:"default",heading:d,description:y,children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"grid-auto-cards grid gap-4",children:r.map(t=>e.jsxs(A,{flush:!0,children:[e.jsx(q,{to:B,params:{id:t.id},className:"focus-ring-soft block overflow-hidden rounded-t-[18px] outline-none",children:e.jsx("div",{className:"flex items-center justify-center bg-muted/25 p-3",style:{height:R},children:e.jsx(H,{className:"h-full w-full rounded-[12px] object-contain transition-transform duration-200 hover:scale-[1.02]",src:t.url,alt:t.id})})}),e.jsxs("div",{className:"flex items-center justify-between gap-3 border-t border-border-subtle px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2 text-fg-secondary",children:[e.jsx($,{className:"h-3.5 w-3.5 shrink-0 text-fg-tertiary"}),e.jsx(D,{as:"span",variant:"meta",weight:"medium",tone:"secondary",className:"truncate",children:p(t.referenceCount)})]}),e.jsx(O,{variant:"ghost",size:"icon-sm",disabled:t.referenceCount>0,"aria-label":`Delete image ${t.id}`,onClick:()=>v(t.id),children:e.jsx(Z,{className:"h-4 w-4"})})]})]},t.id))}),o&&i<o&&e.jsx(z,{page:c,last:Math.ceil(o/i),onChange:t=>{s({search:I=>({...I,page:t})})}})]})})}})})})};export{de as default};
@@ -1 +1 @@
1
- import{j as e}from"./note-vendor-i1M2FSI2.js";import{p as D,T as r,t as F,L as p,N as _,ad as R,aZ as Z,aO as E,f as q,a0 as B,j as G,aY as L,y as O,k as z,a6 as b,q as x,a_ as H,ah as v,a$ as K,b0 as P,B as w,i as l,m as Q}from"./index-jIfkRdY_.js";import{a as U,d as $}from"./image.api-C0eYGCeH.js";import{a as t}from"./graph-vendor-CUxe67Lr.js";import{I as V}from"./Image-DxWhlIDG.js";import{S as g}from"./SurfaceCard-CkAVMLPs.js";import{c as W,n as Y}from"./Trash.es-OuQVb_SX.js";import{I as J}from"./Image.es-BpAOJjJT.js";import"./note-core-Z6kqulGB.js";const X=new Map([["bold",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,36c-20.09,0-37.92,7.93-50,21.56C115.92,43.93,98.09,36,78,36a66.08,66.08,0,0,0-66,66c0,72.34,105.81,130.14,110.31,132.57a12,12,0,0,0,11.38,0C138.19,232.14,244,174.34,244,102A66.08,66.08,0,0,0,178,36Zm-5.49,142.36A328.69,328.69,0,0,1,128,210.16a328.69,328.69,0,0,1-44.51-31.8C61.82,159.77,36,131.42,36,102A42,42,0,0,1,78,60c17.8,0,32.7,9.4,38.89,24.54a12,12,0,0,0,22.22,0C145.3,69.4,160.2,60,178,60a42,42,0,0,1,42,42C220,131.42,194.18,159.77,172.51,178.36Z"}))],["duotone",t.createElement(t.Fragment,null,t.createElement("path",{d:"M232,102c0,66-104,122-104,122S24,168,24,102A54,54,0,0,1,78,48c22.59,0,41.94,12.31,50,32,8.06-19.69,27.41-32,50-32A54,54,0,0,1,232,102Z",opacity:"0.2"}),t.createElement("path",{d:"M178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,70,103.79,126.66,108.21,129a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40ZM128,214.8C109.74,204.16,32,155.69,32,102A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46C224,155.61,146.24,204.15,128,214.8Z"}))],["fill",t.createElement(t.Fragment,null,t.createElement("path",{d:"M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0C119.79,228.66,16,172,16,102A62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z"}))],["light",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,42c-21,0-39.26,9.47-50,25.34C117.26,51.47,99,42,78,42a60.07,60.07,0,0,0-60,60c0,29.2,18.2,59.59,54.1,90.31a334.68,334.68,0,0,0,53.06,37,6,6,0,0,0,5.68,0,334.68,334.68,0,0,0,53.06-37C219.8,161.59,238,131.2,238,102A60.07,60.07,0,0,0,178,42ZM128,217.11C111.59,207.64,30,157.72,30,102A48.05,48.05,0,0,1,78,54c20.28,0,37.31,10.83,44.45,28.27a6,6,0,0,0,11.1,0C140.69,64.83,157.72,54,178,54a48.05,48.05,0,0,1,48,48C226,157.72,144.41,207.64,128,217.11Z"}))],["regular",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,70,103.79,126.66,108.21,129a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40ZM128,214.8C109.74,204.16,32,155.69,32,102A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46C224,155.61,146.24,204.15,128,214.8Z"}))],["thin",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,44c-21.44,0-39.92,10.19-50,27.07C117.92,54.19,99.44,44,78,44a58.07,58.07,0,0,0-58,58c0,28.59,18,58.47,53.4,88.79a333.81,333.81,0,0,0,52.7,36.73,4,4,0,0,0,3.8,0,333.81,333.81,0,0,0,52.7-36.73C218,160.47,236,130.59,236,102A58.07,58.07,0,0,0,178,44ZM128,219.42c-14-8-100-59.35-100-117.42A50.06,50.06,0,0,1,78,52c21.11,0,38.85,11.31,46.3,29.51a4,4,0,0,0,7.4,0C139.15,63.31,156.89,52,178,52a50.06,50.06,0,0,1,50,50C228,160,142,211.46,128,219.42Z"}))]]),A=t.forwardRef((a,n)=>t.createElement(D,{ref:n,...a,weights:X}));A.displayName="HeartIcon";const ee=A;function ae({name:a}){return e.jsx(r,{as:"div",variant:"label",weight:"medium",tone:"secondary",className:"inline-flex items-center rounded-full border border-border-subtle bg-hover-subtle px-2.5 py-1",children:a})}function se({id:a,title:n,tags:i,createdAt:u,updatedAt:d}){const o=new Date(Number(u)),m=F(Number(d));return e.jsx("div",{className:"border-b-2 border-dashed border-border-subtle last:border-b-0",children:e.jsxs("div",{className:"py-4 flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(r,{variant:"label",weight:"medium",tone:"tertiary",children:m}),e.jsxs(r,{variant:"label",tone:"placeholder",children:["(",o.toDateString(),")"]})]}),e.jsx(r,{as:"div",variant:"body",weight:"bold",tracking:"tight",children:e.jsx(p,{className:"transition-colors hover:text-accent-primary",to:_,params:{id:a},children:n||"Untitled"})}),i&&i.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1.5",children:i.map(c=>e.jsx(p,{to:R,params:{id:c.id},search:{page:1},children:e.jsx(ae,{name:c.name})},c.id))})]})})}const I=G(L),j=352,te="mb-4 inline-flex items-center gap-1 text-fg-secondary transition-colors hover:text-fg-default",T="flex items-center justify-center bg-muted/25 p-3",re="h-full w-full rounded-[12px] object-contain",M="mb-3 flex flex-wrap items-start justify-between gap-3 border-b border-border-subtle pb-3",S="space-y-1",ne=a=>a===1?"1 reference":`${a} references`,C=(a,n)=>typeof a=="object"&&a!==null&&"errors"in a&&Array.isArray(a.errors)&&typeof a.errors[0]?.message=="string"?a.errors[0].message:a instanceof Error&&a.message?a.message:n,ie=()=>e.jsxs("div",{className:"flex flex-col gap-6 lg:flex-row",children:[e.jsx("div",{className:"w-full lg:w-[400px] lg:flex-shrink-0",children:e.jsxs(g,{flush:!0,children:[e.jsx("div",{className:T,style:{height:j},children:e.jsx(l,{width:"100%",height:j-24,className:"rounded-[12px]"})}),e.jsxs("div",{className:"flex flex-col gap-4 border-t border-border-subtle p-4",children:[e.jsx(l,{width:96,height:14,className:"rounded-full"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(l,{height:32,className:"flex-1 rounded-[12px]"}),e.jsx(l,{height:32,className:"flex-1 rounded-[12px]"})]})]})]})}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs(g,{children:[e.jsxs("div",{className:M,children:[e.jsxs("div",{className:S,children:[e.jsx(l,{width:140,height:18}),e.jsx(l,{width:220,height:14,className:"rounded-full"})]}),e.jsx(l,{width:84,height:14,className:"rounded-full"})]}),e.jsx("div",{className:"flex flex-col gap-3",children:Array.from({length:3},(a,n)=>e.jsx(l,{height:72,className:"rounded-[16px]"},n))})]})})]}),le=({id:a})=>{const n=O(),i=Q(),u=I.useNavigate(),d=z(),{data:o}=b({queryKey:x.images.detail(a),queryFn:async()=>{const s=await U(a);if(s.type==="error")throw s;return s.image}}),{data:m}=b({queryKey:x.images.notes(a),queryFn:async()=>{const s=await H(o.url);if(s.type==="error")throw s;return s.imageNotes}}),c=m.length,y=ne(c),h=c===0,f=v({mutationFn:async()=>{const s=await $(a);if(s.type==="error")throw s;if(!s.deleteImage)throw new Error("Failed to delete image");return s.deleteImage},onSuccess:async()=>{await d.invalidateQueries({queryKey:x.images.listAll(),exact:!1}),i("Image deleted"),u({to:E,search:{page:1}})},onError:s=>{i(C(s,"Failed to delete image"))}}),N=v({mutationFn:async()=>{const s=await K("heroBanner",o.url);if(s.type==="error")throw s},onSuccess:async()=>{await d.invalidateQueries({queryKey:x.ui.heroBanner(),exact:!0}),i("Hero banner updated")},onError:s=>{i(C(s,"Failed to update hero banner"))}}),k=async()=>{!h||f.isPending||await n("Delete this image? It is not referenced by any notes.")&&f.mutate()};return e.jsxs("div",{className:"flex flex-col gap-6 lg:flex-row",children:[e.jsx("div",{className:"w-full lg:w-[400px] lg:flex-shrink-0",children:e.jsxs(g,{flush:!0,children:[e.jsx("div",{className:T,style:{height:j},children:e.jsx(V,{className:re,src:o.url,alt:`Image ${o.id}`})}),e.jsxs("div",{className:"flex flex-col gap-4 border-t border-border-subtle p-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(W,{size:14,className:"text-fg-tertiary"}),e.jsx(r,{as:"span",variant:"meta",weight:"medium",tone:"secondary",children:y})]}),e.jsx(r,{as:"p",variant:"meta",tone:"tertiary",children:h?"Delete is available because no notes reference this image":"Remove this image from notes before deleting it"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{content:h?"Delete this image":"Cannot delete while referenced by notes",side:"bottom",children:e.jsxs(w,{variant:"soft-danger",size:"sm",className:"flex-1",disabled:!h,isLoading:f.isPending,onClick:k,children:[e.jsx(Y,{size:16}),"Delete"]})}),e.jsxs(w,{variant:"primary",size:"sm",className:"flex-1",isLoading:N.isPending,onClick:()=>N.mutate(),children:[e.jsx(ee,{size:16}),"Set hero banner"]})]})]})]})}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs(g,{children:[e.jsxs("div",{className:M,children:[e.jsxs("div",{className:S,children:[e.jsx(r,{as:"h2",variant:"subheading",weight:"medium",tracking:"tight",children:"Referenced Notes"}),e.jsx(r,{as:"p",variant:"meta",tone:"secondary",children:"Notes currently using this image"})]}),e.jsx(r,{as:"span",variant:"meta",weight:"medium",tone:"secondary",children:y})]}),c>0?e.jsx("ul",{className:"flex flex-col",children:m.map(s=>e.jsx("li",{children:e.jsx(se,{...s})},s.id))}):e.jsxs("div",{className:"flex items-start gap-3 py-1",children:[e.jsx("div",{className:"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-[10px] bg-muted/25 text-fg-disabled",children:e.jsx(J,{size:18})}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(r,{as:"p",variant:"body",weight:"medium",tone:"secondary",children:"No notes reference this image"}),e.jsx(r,{as:"p",variant:"meta",tone:"secondary",children:"This image can be deleted or reused in another note"})]})]})]})})]})},pe=()=>{const{id:a}=I.useParams();return e.jsxs(e.Fragment,{children:[e.jsx(Z,{children:e.jsx("title",{children:"Image Detail | Ocean Brain"})}),e.jsxs(p,{to:E,search:{page:1},className:te,children:[e.jsx(q,{size:16}),e.jsx(r,{as:"span",variant:"meta",weight:"medium",className:"text-current",children:"Back to Images"})]}),e.jsx(r,{as:"h1",variant:"heading",weight:"bold",tracking:"tighter",className:"sr-only",children:"Image Detail"}),e.jsx(B,{fallback:e.jsx(ie,{}),errorTitle:"Failed to load image detail",errorDescription:"Retry loading the image preview and its referenced notes",resetKeys:[a],children:e.jsx(le,{id:a})})]})};export{pe as default};
1
+ import{j as e}from"./note-vendor-Hoz9Q4-4.js";import{a7 as D,T as r,t as F,L as p,N as R,ah as Z,b7 as _,aZ as E,f as q,Y as B,j as G,b6 as L,G as z,k as H,a5 as b,q as x,b8 as O,ay as v,b9 as K,am as P,B as w,i as l,m as Q}from"./index-BR05aSXr.js";import{a as U,d as $}from"./image.api-CYsjXiMr.js";import{a as t}from"./graph-vendor-BAF95C0g.js";import{I as V}from"./Image-7W0DZwMo.js";import{S as g}from"./SurfaceCard-pydtvHfu.js";import{c as W,n as Y}from"./Trash.es-w32Goxfa.js";import{I as J}from"./Image.es-5pXLx9TU.js";import"./note-core-CMGUaW1v.js";const X=new Map([["bold",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,36c-20.09,0-37.92,7.93-50,21.56C115.92,43.93,98.09,36,78,36a66.08,66.08,0,0,0-66,66c0,72.34,105.81,130.14,110.31,132.57a12,12,0,0,0,11.38,0C138.19,232.14,244,174.34,244,102A66.08,66.08,0,0,0,178,36Zm-5.49,142.36A328.69,328.69,0,0,1,128,210.16a328.69,328.69,0,0,1-44.51-31.8C61.82,159.77,36,131.42,36,102A42,42,0,0,1,78,60c17.8,0,32.7,9.4,38.89,24.54a12,12,0,0,0,22.22,0C145.3,69.4,160.2,60,178,60a42,42,0,0,1,42,42C220,131.42,194.18,159.77,172.51,178.36Z"}))],["duotone",t.createElement(t.Fragment,null,t.createElement("path",{d:"M232,102c0,66-104,122-104,122S24,168,24,102A54,54,0,0,1,78,48c22.59,0,41.94,12.31,50,32,8.06-19.69,27.41-32,50-32A54,54,0,0,1,232,102Z",opacity:"0.2"}),t.createElement("path",{d:"M178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,70,103.79,126.66,108.21,129a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40ZM128,214.8C109.74,204.16,32,155.69,32,102A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46C224,155.61,146.24,204.15,128,214.8Z"}))],["fill",t.createElement(t.Fragment,null,t.createElement("path",{d:"M240,102c0,70-103.79,126.66-108.21,129a8,8,0,0,1-7.58,0C119.79,228.66,16,172,16,102A62.07,62.07,0,0,1,78,40c20.65,0,38.73,8.88,50,23.89C139.27,48.88,157.35,40,178,40A62.07,62.07,0,0,1,240,102Z"}))],["light",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,42c-21,0-39.26,9.47-50,25.34C117.26,51.47,99,42,78,42a60.07,60.07,0,0,0-60,60c0,29.2,18.2,59.59,54.1,90.31a334.68,334.68,0,0,0,53.06,37,6,6,0,0,0,5.68,0,334.68,334.68,0,0,0,53.06-37C219.8,161.59,238,131.2,238,102A60.07,60.07,0,0,0,178,42ZM128,217.11C111.59,207.64,30,157.72,30,102A48.05,48.05,0,0,1,78,54c20.28,0,37.31,10.83,44.45,28.27a6,6,0,0,0,11.1,0C140.69,64.83,157.72,54,178,54a48.05,48.05,0,0,1,48,48C226,157.72,144.41,207.64,128,217.11Z"}))],["regular",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,40c-20.65,0-38.73,8.88-50,23.89C116.73,48.88,98.65,40,78,40a62.07,62.07,0,0,0-62,62c0,70,103.79,126.66,108.21,129a8,8,0,0,0,7.58,0C136.21,228.66,240,172,240,102A62.07,62.07,0,0,0,178,40ZM128,214.8C109.74,204.16,32,155.69,32,102A46.06,46.06,0,0,1,78,56c19.45,0,35.78,10.36,42.6,27a8,8,0,0,0,14.8,0c6.82-16.67,23.15-27,42.6-27a46.06,46.06,0,0,1,46,46C224,155.61,146.24,204.15,128,214.8Z"}))],["thin",t.createElement(t.Fragment,null,t.createElement("path",{d:"M178,44c-21.44,0-39.92,10.19-50,27.07C117.92,54.19,99.44,44,78,44a58.07,58.07,0,0,0-58,58c0,28.59,18,58.47,53.4,88.79a333.81,333.81,0,0,0,52.7,36.73,4,4,0,0,0,3.8,0,333.81,333.81,0,0,0,52.7-36.73C218,160.47,236,130.59,236,102A58.07,58.07,0,0,0,178,44ZM128,219.42c-14-8-100-59.35-100-117.42A50.06,50.06,0,0,1,78,52c21.11,0,38.85,11.31,46.3,29.51a4,4,0,0,0,7.4,0C139.15,63.31,156.89,52,178,52a50.06,50.06,0,0,1,50,50C228,160,142,211.46,128,219.42Z"}))]]),A=t.forwardRef((a,n)=>t.createElement(D,{ref:n,...a,weights:X}));A.displayName="HeartIcon";const ee=A;function ae({name:a}){return e.jsx(r,{as:"div",variant:"label",weight:"medium",tone:"secondary",className:"inline-flex items-center rounded-full border border-border-subtle bg-hover-subtle px-2.5 py-1",children:a})}function se({id:a,title:n,tags:i,createdAt:u,updatedAt:d}){const o=new Date(Number(u)),m=F(Number(d));return e.jsx("div",{className:"border-b-2 border-dashed border-border-subtle last:border-b-0",children:e.jsxs("div",{className:"py-4 flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(r,{variant:"label",weight:"medium",tone:"tertiary",children:m}),e.jsxs(r,{variant:"label",tone:"placeholder",children:["(",o.toDateString(),")"]})]}),e.jsx(r,{as:"div",variant:"body",weight:"bold",tracking:"tight",children:e.jsx(p,{className:"transition-colors hover:text-accent-primary",to:R,params:{id:a},children:n||"Untitled"})}),i&&i.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1.5",children:i.map(c=>e.jsx(p,{to:Z,params:{id:c.id},search:{page:1},children:e.jsx(ae,{name:c.name})},c.id))})]})})}const I=G(L),j=352,te="mb-4 inline-flex items-center gap-1 text-fg-secondary transition-colors hover:text-fg-default",T="flex items-center justify-center bg-muted/25 p-3",re="h-full w-full rounded-[12px] object-contain",M="mb-3 flex flex-wrap items-start justify-between gap-3 border-b border-border-subtle pb-3",S="space-y-1",ne=a=>a===1?"1 reference":`${a} references`,C=(a,n)=>typeof a=="object"&&a!==null&&"errors"in a&&Array.isArray(a.errors)&&typeof a.errors[0]?.message=="string"?a.errors[0].message:a instanceof Error&&a.message?a.message:n,ie=()=>e.jsxs("div",{className:"flex flex-col gap-6 lg:flex-row",children:[e.jsx("div",{className:"w-full lg:w-[400px] lg:flex-shrink-0",children:e.jsxs(g,{flush:!0,children:[e.jsx("div",{className:T,style:{height:j},children:e.jsx(l,{width:"100%",height:j-24,className:"rounded-[12px]"})}),e.jsxs("div",{className:"flex flex-col gap-4 border-t border-border-subtle p-4",children:[e.jsx(l,{width:96,height:14,className:"rounded-full"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(l,{height:32,className:"flex-1 rounded-[12px]"}),e.jsx(l,{height:32,className:"flex-1 rounded-[12px]"})]})]})]})}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs(g,{children:[e.jsxs("div",{className:M,children:[e.jsxs("div",{className:S,children:[e.jsx(l,{width:140,height:18}),e.jsx(l,{width:220,height:14,className:"rounded-full"})]}),e.jsx(l,{width:84,height:14,className:"rounded-full"})]}),e.jsx("div",{className:"flex flex-col gap-3",children:Array.from({length:3},(a,n)=>e.jsx(l,{height:72,className:"rounded-[16px]"},n))})]})})]}),le=({id:a})=>{const n=z(),i=Q(),u=I.useNavigate(),d=H(),{data:o}=b({queryKey:x.images.detail(a),queryFn:async()=>{const s=await U(a);if(s.type==="error")throw s;return s.image}}),{data:m}=b({queryKey:x.images.notes(a),queryFn:async()=>{const s=await O(o.url);if(s.type==="error")throw s;return s.imageNotes}}),c=m.length,y=ne(c),h=c===0,f=v({mutationFn:async()=>{const s=await $(a);if(s.type==="error")throw s;if(!s.deleteImage)throw new Error("Failed to delete image");return s.deleteImage},onSuccess:async()=>{await d.invalidateQueries({queryKey:x.images.listAll(),exact:!1}),i("Image deleted"),u({to:E,search:{page:1}})},onError:s=>{i(C(s,"Failed to delete image"))}}),N=v({mutationFn:async()=>{const s=await K("heroBanner",o.url);if(s.type==="error")throw s},onSuccess:async()=>{await d.invalidateQueries({queryKey:x.ui.heroBanner(),exact:!0}),i("Hero banner updated")},onError:s=>{i(C(s,"Failed to update hero banner"))}}),k=async()=>{!h||f.isPending||await n("Delete this image? It is not referenced by any notes.")&&f.mutate()};return e.jsxs("div",{className:"flex flex-col gap-6 lg:flex-row",children:[e.jsx("div",{className:"w-full lg:w-[400px] lg:flex-shrink-0",children:e.jsxs(g,{flush:!0,children:[e.jsx("div",{className:T,style:{height:j},children:e.jsx(V,{className:re,src:o.url,alt:`Image ${o.id}`})}),e.jsxs("div",{className:"flex flex-col gap-4 border-t border-border-subtle p-4",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(W,{size:14,className:"text-fg-tertiary"}),e.jsx(r,{as:"span",variant:"meta",weight:"medium",tone:"secondary",children:y})]}),e.jsx(r,{as:"p",variant:"meta",tone:"tertiary",children:h?"Delete is available because no notes reference this image":"Remove this image from notes before deleting it"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(P,{content:h?"Delete this image":"Cannot delete while referenced by notes",side:"bottom",children:e.jsxs(w,{variant:"soft-danger",size:"sm",className:"flex-1",disabled:!h,isLoading:f.isPending,onClick:k,children:[e.jsx(Y,{size:16}),"Delete"]})}),e.jsxs(w,{variant:"primary",size:"sm",className:"flex-1",isLoading:N.isPending,onClick:()=>N.mutate(),children:[e.jsx(ee,{size:16}),"Set hero banner"]})]})]})]})}),e.jsx("div",{className:"flex-1 min-w-0",children:e.jsxs(g,{children:[e.jsxs("div",{className:M,children:[e.jsxs("div",{className:S,children:[e.jsx(r,{as:"h2",variant:"subheading",weight:"medium",tracking:"tight",children:"Referenced Notes"}),e.jsx(r,{as:"p",variant:"meta",tone:"secondary",children:"Notes currently using this image"})]}),e.jsx(r,{as:"span",variant:"meta",weight:"medium",tone:"secondary",children:y})]}),c>0?e.jsx("ul",{className:"flex flex-col",children:m.map(s=>e.jsx("li",{children:e.jsx(se,{...s})},s.id))}):e.jsxs("div",{className:"flex items-start gap-3 py-1",children:[e.jsx("div",{className:"mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-[10px] bg-muted/25 text-fg-disabled",children:e.jsx(J,{size:18})}),e.jsxs("div",{className:"space-y-1",children:[e.jsx(r,{as:"p",variant:"body",weight:"medium",tone:"secondary",children:"No notes reference this image"}),e.jsx(r,{as:"p",variant:"meta",tone:"secondary",children:"This image can be deleted or reused in another note"})]})]})]})})]})},pe=()=>{const{id:a}=I.useParams();return e.jsxs(e.Fragment,{children:[e.jsx(_,{children:e.jsx("title",{children:"Image Detail | Ocean Brain"})}),e.jsxs(p,{to:E,search:{page:1},className:te,children:[e.jsx(q,{size:16}),e.jsx(r,{as:"span",variant:"meta",weight:"medium",className:"text-current",children:"Back to Images"})]}),e.jsx(r,{as:"h1",variant:"heading",weight:"bold",tracking:"tighter",className:"sr-only",children:"Image Detail"}),e.jsx(B,{fallback:e.jsx(ie,{}),errorTitle:"Failed to load image detail",errorDescription:"Retry loading the image preview and its referenced notes",resetKeys:[a],children:e.jsx(le,{id:a})})]})};export{pe as default};
@@ -0,0 +1,4 @@
1
+ import{j as e}from"./note-vendor-Hoz9Q4-4.js";import{G as Z,k as W,u as X,ay as k,P as Y,T as o,aD as ee,aE as j,E as u,B as p,aC as $,aF as te,I as E,a$ as ae,m as ne}from"./index-BR05aSXr.js";import{a as x}from"./graph-vendor-BAF95C0g.js";import{f as se,s as oe,r as ie,a as ce}from"./mcp-admin-adapter-DOgBsYpl.js";import{s as O}from"./Copy.es-DFbgpaNJ.js";import"./note-core-CMGUaW1v.js";const h=["mcp-admin","status"],f=t=>/^[A-Za-z0-9_./:@$-]+$/.test(t)?t:`'${t.replace(/'/g,"'\\''")}'`,R="$HOME/.config/ocean-brain/mcp-token",L=(t,a)=>{const s=f(t);return[`mkdir -p "$(dirname ${s})"`,`printf '%s' ${f(a)} > ${s}`,`chmod 600 ${s}`].join(`
2
+ `)},A=(t,a)=>`npx -y ocean-brain mcp --server ${f(t)} --token-file ${f(a)}`,re=(t,a)=>`codex mcp add ocean-brain -- ${A(t,a)}`,le=(t,a)=>`claude mcp add --transport stdio ocean-brain -- ${A(t,a)}`,de=(t,a)=>JSON.stringify({mcpServers:{"ocean-brain":{command:"npx",args:["-y","ocean-brain","mcp","--server",t,"--token-file",a]}}},null,2),me=(t,a,s,c)=>{const d=t==="codex"?re(a,s):t==="claude"?le(a,s):de(a,s);return t==="json"?["# 1. Create the token file",L(s,c),"","# 2. Add this MCP JSON",d].join(`
3
+ `):["# 1. Create the token file",L(s,c),"",`# 2. Add Ocean Brain to ${t}`,d].join(`
4
+ `)},ue=t=>!t||t==="unknown"?"MCP compatibility":`MCP compatibility ${t}`,pe={codex:"Codex",claude:"Claude",json:"JSON"},je=()=>{const t=Z(),a=ne(),s=W(),[c,d]=x.useState(()=>window.location.origin),[r,C]=x.useState(""),[v,F]=x.useState(R),[i,J]=x.useState("codex"),{data:y,isLoading:z}=X({queryKey:h,queryFn:se}),w=k({mutationFn:oe,onSuccess:n=>{s.setQueryData(h,n),a(n.enabled?"MCP access enabled.":"MCP access disabled.")}}),N=k({mutationFn:ie,onSuccess:async({token:n})=>{C(n),a("New MCP token issued. Previous token is no longer valid."),await s.invalidateQueries({queryKey:h})}}),T=k({mutationFn:ce,onSuccess:n=>{C(""),s.setQueryData(h,n),a("MCP token revoked. Existing client configs will stop working.")}}),b=y?.enabled??!1,l=y?.hasActiveToken??!1,Q=!z&&!w.isPending,B=v.trim()||R,q=ue(y?.server.mcpVersionRequirement),I=l?"1 active token":"No active token",K=i==="json"?"Token file and MCP JSON":`${pe[i]} setup`,M=me(i,c,B,r||"PASTE_TOKEN_HERE"),_="Copy setup",P="text-fg-tertiary",m="font-medium text-fg-tertiary",g="surface-base px-4 py-3.5",S="space-y-2",G="max-w-full overflow-x-auto whitespace-pre font-mono text-xs leading-5 text-fg-secondary",H=async()=>{try{await navigator.clipboard.writeText(r),a("Copied token.")}catch{a("Failed to copy token.")}},V=async()=>{try{await navigator.clipboard.writeText(M),a(i==="json"?"Copied MCP JSON.":"Copied MCP command.")}catch{a(`Could not copy. Select the ${i==="json"?"JSON":"command"} and copy it manually.`)}},D=async()=>{l&&!await t("Rotate the MCP token? Existing MCP clients will stop working until they use the new token.")||N.mutate(void 0)},U=async()=>{await t("Revoke the MCP token? Existing MCP clients will stop working immediately.")&&T.mutate()};return e.jsx(Y,{title:"MCP",variant:"default",description:"Connect this Ocean Brain instance to MCP clients.",headerRight:e.jsxs("div",{className:"inline-flex items-center gap-3 rounded-[14px] border border-border-subtle bg-muted px-3 py-2",children:[e.jsxs(o,{as:"span",variant:"meta",weight:"medium",tone:"secondary",children:["MCP access ",b?"on":"off"]}),e.jsx(ae,{"aria-label":"MCP access",checked:b,disabled:!Q,onCheckedChange:()=>{w.mutate(!b)}})]}),children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("section",{className:"flex flex-col gap-3","aria-labelledby":"mcp-connect-heading",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(o,{id:"mcp-connect-heading",as:"h2",variant:"label",weight:"medium",className:P,children:"Connect a client"}),e.jsx(o,{as:"p",variant:"meta",tone:"secondary",children:"Save your token in a local file, then copy the command for your client."})]}),e.jsx(o,{as:"span",variant:"meta",weight:"medium",tone:"tertiary",className:"rounded-full border border-border-subtle bg-hover-subtle px-2.5 py-1",children:q})]}),e.jsxs("div",{className:`${g} flex flex-col gap-3`,children:[e.jsx("div",{className:"flex flex-wrap items-center gap-3",children:e.jsxs(ee,{type:"single",variant:"quiet",size:"sm",value:i,onValueChange:n=>{(n==="codex"||n==="claude"||n==="json")&&J(n)},children:[e.jsx(j,{value:"codex",children:"Codex"}),e.jsx(j,{value:"claude",children:"Claude"}),e.jsx(j,{value:"json",children:"JSON"})]})}),e.jsxs("div",{className:"min-w-0 space-y-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx(u,{htmlFor:"mcp-connection-output",className:m,children:K}),e.jsxs(p,{type:"button",variant:"subtle",size:"sm",onClick:V,children:[e.jsx(O,{className:"h-4 w-4"}),_]})]}),e.jsx($,{id:"mcp-connection-output",readOnly:!0,rows:i==="json"?13:9,wrap:"off",value:M,className:G}),e.jsx(o,{as:"p",variant:"meta",tone:"tertiary",children:r?"The new token is already included in the token file step.":"Replace PASTE_TOKEN_HERE before running. The MCP client reads the token from that file."})]}),e.jsxs("details",{className:"group rounded-[12px] border border-border-subtle bg-muted",children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between gap-3 px-3 py-2.5 marker:hidden",children:[e.jsx(o,{as:"span",variant:"meta",weight:"medium",tone:"secondary",children:"Connection options"}),e.jsx(te,{className:"h-4 w-4 shrink-0 text-fg-tertiary transition-transform group-open:rotate-180","aria-hidden":"true"})]}),e.jsxs("div",{className:"space-y-3 border-t border-border-subtle px-3 py-3",children:[e.jsxs("div",{className:S,children:[e.jsx(u,{htmlFor:"mcp-server-url",className:m,children:"Ocean Brain URL"}),e.jsx(E,{id:"mcp-server-url",value:c,onChange:n=>d(n.target.value)})]}),e.jsxs("div",{className:S,children:[e.jsx(u,{htmlFor:"mcp-token-file-path",className:m,children:"Token file path"}),e.jsx(E,{id:"mcp-token-file-path",placeholder:"/absolute/path/to/ocean-brain-mcp-token.txt",value:v,onChange:n=>F(n.target.value)})]})]})]})]})]}),e.jsxs("section",{className:"flex flex-col gap-3","aria-labelledby":"mcp-token-heading",children:[e.jsxs("div",{className:`${g} flex flex-wrap items-center justify-between gap-3`,children:[e.jsxs("div",{className:"min-w-0 space-y-1",children:[e.jsx(o,{id:"mcp-token-heading",as:"h2",variant:"label",weight:"medium",className:P,children:"Token"}),e.jsxs(o,{as:"p",variant:"meta",tone:"tertiary",children:[I,". New tokens are shown once."]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(p,{type:"button",size:"sm",variant:l?"subtle":"primary",onClick:D,isLoading:N.isPending,children:l?"Rotate token":"Issue token"}),e.jsx(p,{type:"button",size:"sm",variant:"soft-danger",onClick:U,isLoading:T.isPending,disabled:!l,children:"Revoke token"})]})]}),r&&e.jsxs("div",{className:`${g} border-dashed`,children:[e.jsxs("div",{className:"mb-3 flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{htmlFor:"issued-mcp-token",className:m,children:"New token"}),e.jsx(o,{as:"p",variant:"meta",tone:"secondary",children:"Copy this token now and save it in your token file."})]}),e.jsxs(p,{type:"button",variant:"subtle",size:"sm",onClick:H,children:[e.jsx(O,{className:"h-4 w-4"}),"Copy token"]})]}),e.jsx($,{id:"issued-mcp-token",rows:3,readOnly:!0,value:r})]})]})]})})};export{je as default};
@@ -0,0 +1 @@
1
+ import{b0 as t}from"./index-BR05aSXr.js";const o=async()=>{const{data:a}=await t.get("/api/mcp-admin/status");return a},c=async a=>{const{data:n}=await t.post("/api/mcp-admin/enabled",{enabled:a});return n},e=async()=>{const{data:a}=await t.post("/api/mcp-admin/token/rotate");return a},p=async()=>{const{data:a}=await t.post("/api/mcp-admin/token/revoke");return a};export{p as a,o as f,e as r,c as s};